Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/angular-query-experimental/ng-package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"lib": {
"entryFile": "src/index.ts"
},
"allowedNonPeerDependencies": ["@tanstack/query-core", "ngxtension"],
"allowedNonPeerDependencies": ["@tanstack/query-core"],
"dest": "build",
"deleteDestPath": false
}
1 change: 0 additions & 1 deletion packages/angular-query-experimental/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
},
"dependencies": {
"@tanstack/query-core": "workspace:*",
"ngxtension": "^1.6.2",
"tslib": "^2.6.2"
},
"devDependencies": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DestroyRef, inject, signal } from '@angular/core'
import { type QueryFilters, notifyManager } from '@tanstack/query-core'
import { assertInjector } from 'ngxtension/assert-injector'
import { assertInjector } from './util/assert-injector/assert-injector'
import { injectQueryClient } from './inject-query-client'
import type { Injector, Signal } from '@angular/core'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DestroyRef, inject, signal } from '@angular/core'
import { type MutationFilters, notifyManager } from '@tanstack/query-core'
import { assertInjector } from 'ngxtension/assert-injector'
import { assertInjector } from './util/assert-injector/assert-injector'
import { injectQueryClient } from './inject-query-client'
import type { Injector, Signal } from '@angular/core'

Expand Down
2 changes: 1 addition & 1 deletion packages/angular-query-experimental/src/inject-mutation.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DestroyRef, computed, effect, inject, signal } from '@angular/core'
import { MutationObserver } from '@tanstack/query-core'
import { assertInjector } from 'ngxtension/assert-injector'
import { assertInjector } from './util/assert-injector/assert-injector'
import { signalProxy } from './signal-proxy'
import { injectQueryClient } from './inject-query-client'
import type { DefaultError, QueryClient } from '@tanstack/query-core'
Expand Down
2 changes: 1 addition & 1 deletion packages/angular-query-experimental/src/inject-queries.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { QueriesObserver, notifyManager } from '@tanstack/query-core'
import { DestroyRef, computed, effect, inject, signal } from '@angular/core'
import { assertInjector } from 'ngxtension/assert-injector'
import { assertInjector } from './util/assert-injector/assert-injector'
import { injectQueryClient } from './inject-query-client'
import type { Injector, Signal } from '@angular/core'
import type {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createNoopInjectionToken } from 'ngxtension/create-injection-token'
import { createNoopInjectionToken } from './util/create-injection-token/create-injection-token'
import type { QueryClient } from '@tanstack/query-core'

const [injectQueryClient, provideQueryClient, QUERY_CLIENT] =
Expand Down
2 changes: 1 addition & 1 deletion packages/angular-query-experimental/src/inject-query.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { QueryObserver } from '@tanstack/query-core'
import { assertInjector } from 'ngxtension/assert-injector'
import { assertInjector } from './util/assert-injector/assert-injector'
import { injectQueryClient } from './inject-query-client'
import { createBaseQuery } from './create-base-query'
import type { DefaultError, QueryClient, QueryKey } from '@tanstack/query-core'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/**
* The code in this file is adapted from NG Extension Platform at https://ngxtension.netlify.app.
*
* Original Author: Chau Tran
*
* NG Extension Platform is an open-source project licensed under the MIT license.
*
* For more information about the original code, see
* https://github.com/nartc/ngxtension-platform
*/

import {
InjectionToken,
Injector,
inject,
runInInjectionContext,
} from '@angular/core'
import { TestBed } from '@angular/core/testing'
import { assertInjector } from './assert-injector'

describe(assertInjector.name, () => {
const token = new InjectionToken('token', {
factory: () => 1,
})

function injectDummy(injector?: Injector) {
injector = assertInjector(injectDummy, injector)
return runInInjectionContext(injector, () => inject(token))
}

function injectDummyTwo(injector?: Injector) {
return assertInjector(injectDummyTwo, injector, () => inject(token) + 1)
}

it('given no custom injector, when run in injection context, then return value', () => {
TestBed.runInInjectionContext(() => {
const value = injectDummy()
const valueTwo = injectDummyTwo()
expect(value).toEqual(1)
expect(valueTwo).toEqual(2)
})
})

it('given no custom injector, when run outside injection context, then throw', () => {
expect(() => injectDummy()).toThrowError(
/injectDummy\(\) can only be used within an injection context/i,
)
expect(() => injectDummyTwo()).toThrowError(
/injectDummyTwo\(\) can only be used within an injection context/i,
)
})

it('given a custom injector, when run in that injector context without providing number, then throw', () => {
expect(() => injectDummy(Injector.create({ providers: [] }))).toThrowError(
/No provider for InjectionToken/i,
)
expect(() =>
injectDummyTwo(Injector.create({ providers: [] })),
).toThrowError(/No provider for InjectionToken/i)
})

it('given a custom injector, when run in that injector context and providing number, then return value', () => {
const value = injectDummy(
Injector.create({ providers: [{ provide: token, useValue: 2 }] }),
)
const valueTwo = injectDummyTwo(
Injector.create({ providers: [{ provide: token, useValue: 2 }] }),
)
expect(value).toEqual(2)
expect(valueTwo).toEqual(3)
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/**
* The code in this file is adapted from NG Extension Platform at https://ngxtension.netlify.app.
*
* Original Author: Chau Tran
*
* NG Extension Platform is an open-source project licensed under the MIT license.
*
* For more information about the original code, see
* https://github.com/nartc/ngxtension-platform
*/

import {
Injector,
assertInInjectionContext,
inject,
runInInjectionContext,
} from '@angular/core'

/**
* `assertInjector` extends `assertInInjectionContext` with an optional `Injector`
* After assertion, `assertInjector` runs the `runner` function with the guaranteed `Injector`
* whether it is the default `Injector` within the current **Injection Context**
* or the custom `Injector` that was passed in.
*
* @template {() => any} Runner - Runner is a function that can return anything
* @param {Function} fn - the Function to pass in `assertInInjectionContext`
* @param {Injector | undefined | null} injector - the optional "custom" Injector
* @param {Runner} runner - the runner fn
* @returns {ReturnType<Runner>} result - returns the result of the Runner
*
* @example
* ```ts
* function injectValue(injector?: Injector) {
* return assertInjector(injectValue, injector, () => 'value');
* }
*
* injectValue(); // string
* ```
*/
export function assertInjector<Runner extends () => any>(
fn: Function,
injector: Injector | undefined | null,
runner: Runner,
): ReturnType<Runner>
/**
* `assertInjector` extends `assertInInjectionContext` with an optional `Injector`
* After assertion, `assertInjector` returns a guaranteed `Injector` whether it is the default `Injector`
* within the current **Injection Context** or the custom `Injector` that was passed in.
*
* @param {Function} fn - the Function to pass in `assertInInjectionContext`
* @param {Injector | undefined | null} injector - the optional "custom" Injector
* @returns Injector
*
* @example
* ```ts
* function injectDestroy(injector?: Injector) {
* injector = assertInjector(injectDestroy, injector);
*
* return runInInjectionContext(injector, () => {
* // code
* })
* }
* ```
*/
export function assertInjector(
fn: Function,
injector: Injector | undefined | null,
): Injector
export function assertInjector(
fn: Function,
injector: Injector | undefined | null,
runner?: () => any,
) {
!injector && assertInInjectionContext(fn)
const assertedInjector = injector ?? inject(Injector)

if (!runner) return assertedInjector
return runInInjectionContext(assertedInjector, runner)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/**
* The code in this file is adapted from NG Extension Platform at https://ngxtension.netlify.app.
*
* Original Author: Chau Tran
*
* NG Extension Platform is an open-source project licensed under the MIT license.
*
* For more information about the original code, see
* https://github.com/nartc/ngxtension-platform
*/

import { TestBed } from '@angular/core/testing'
import { createNoopInjectionToken } from './create-injection-token'

describe(createNoopInjectionToken.name, () => {
describe('given an injection token', () => {
const [injectFn, provideFn] = createNoopInjectionToken<number, true>(
'noop',
{ multi: true },
)
it('then work properly', () => {
TestBed.configureTestingModule({
providers: [provideFn(1), provideFn(() => 2)],
}).runInInjectionContext(() => {
const values = injectFn()
expect(values).toEqual([1, 2])
})
})
})
})
Loading