From f9c8bed94083d82c2482a8fd92193ce114b7eff4 Mon Sep 17 00:00:00 2001 From: David LJ Date: Tue, 8 Oct 2024 18:35:54 +0200 Subject: [PATCH] refactor: rename util to lazy injection token --- .../ngx-meta/api-extractor/ngx-meta.api.md | 9 ++++-- projects/ngx-meta/src/core/src/utils/index.ts | 5 +++- ...n.spec.ts => lazy-injection-token.spec.ts} | 30 +++++++++---------- ...ction-token.ts => lazy-injection-token.ts} | 23 ++++++++++++-- 4 files changed, 45 insertions(+), 22 deletions(-) rename projects/ngx-meta/src/core/src/utils/{make-injection-token.spec.ts => lazy-injection-token.spec.ts} (71%) rename projects/ngx-meta/src/core/src/utils/{make-injection-token.ts => lazy-injection-token.ts} (64%) diff --git a/projects/ngx-meta/api-extractor/ngx-meta.api.md b/projects/ngx-meta/api-extractor/ngx-meta.api.md index 8c1bb160..f05099e0 100644 --- a/projects/ngx-meta/api-extractor/ngx-meta.api.md +++ b/projects/ngx-meta/api-extractor/ngx-meta.api.md @@ -113,6 +113,12 @@ export interface JsonLdMetadata { readonly jsonLd?: object | null; } +// @internal +export type _LazyInjectionToken = () => InjectionToken; + +// @internal +export const _lazyInjectionToken: (description: string, factory: () => T) => _LazyInjectionToken; + // @public export const makeComposedKeyValMetaDefinition: (names: ReadonlyArray, options?: MakeComposedKeyValMetaDefinitionOptions) => NgxMetaMetaDefinition; @@ -121,9 +127,6 @@ export interface MakeComposedKeyValMetaDefinitionOptions extends MakeKeyValMetaD separator?: string; } -// @internal -export const _makeInjectionToken: (description: string, factory: () => T) => InjectionToken; - // @public export const makeKeyValMetaDefinition: (keyName: string, options?: MakeKeyValMetaDefinitionOptions) => NgxMetaMetaDefinition; diff --git a/projects/ngx-meta/src/core/src/utils/index.ts b/projects/ngx-meta/src/core/src/utils/index.ts index 76df9473..528ed84c 100644 --- a/projects/ngx-meta/src/core/src/utils/index.ts +++ b/projects/ngx-meta/src/core/src/utils/index.ts @@ -1,2 +1,5 @@ export { _isDefined } from './is-defined' -export { _makeInjectionToken } from './make-injection-token' +export { + _lazyInjectionToken, + _LazyInjectionToken, +} from './lazy-injection-token' diff --git a/projects/ngx-meta/src/core/src/utils/make-injection-token.spec.ts b/projects/ngx-meta/src/core/src/utils/lazy-injection-token.spec.ts similarity index 71% rename from projects/ngx-meta/src/core/src/utils/make-injection-token.spec.ts rename to projects/ngx-meta/src/core/src/utils/lazy-injection-token.spec.ts index 566dbf8f..8d7da0c9 100644 --- a/projects/ngx-meta/src/core/src/utils/make-injection-token.spec.ts +++ b/projects/ngx-meta/src/core/src/utils/lazy-injection-token.spec.ts @@ -1,13 +1,13 @@ import { - _makeInjectionToken, + _lazyInjectionToken, INJECTION_TOKEN_FACTORIES, INJECTION_TOKENS, -} from './make-injection-token' +} from './lazy-injection-token' import { TestBed } from '@angular/core/testing' import { InjectionToken } from '@angular/core' -describe('make injection token', () => { - const sut = _makeInjectionToken +describe('lazy injection token', () => { + const sut = _lazyInjectionToken const description = 'dummy' const factory = () => description @@ -16,25 +16,25 @@ describe('make injection token', () => { INJECTION_TOKEN_FACTORIES.clear() }) - it('should return an injection token using the provided factory', () => { + it('should return a lazy injection token using the provided factory', () => { const factoryOutput = factory() - const injectionToken = sut(description, factory) + const lazyInjectionToken = sut(description, factory) - expect(TestBed.inject(injectionToken)).toEqual(factoryOutput) + expect(TestBed.inject(lazyInjectionToken())).toEqual(factoryOutput) }) - it('should return an injection token with given description prefixed by library name', () => { - const injectionToken = sut(description, factory) + it('should return a lazy injection token with given description prefixed by library name', () => { + const lazyInjectionToken = sut(description, factory) - expect(injectionToken.toString()).toContain(`ngx-meta ${description}`) + expect(lazyInjectionToken().toString()).toContain(`ngx-meta ${description}`) }) - describe('when making an already existing token', () => { + describe('when creating an already existing token', () => { let injectionToken: InjectionToken> beforeEach(() => { spyOn(console, 'warn') - injectionToken = sut(description, factory) + injectionToken = sut(description, factory)() }) const shouldNotLogAnyMessage = () => @@ -46,7 +46,7 @@ describe('make injection token', () => { let secondInjectionToken: InjectionToken> beforeEach(() => { - secondInjectionToken = sut('another-description', factory) + secondInjectionToken = sut('another-description', factory)() }) it('should return another injection token', () => { @@ -60,7 +60,7 @@ describe('make injection token', () => { let secondInjectionToken: InjectionToken> beforeEach(() => { - secondInjectionToken = sut(description, factory) + secondInjectionToken = sut(description, factory)() }) it('should return the same injection token', () => { @@ -77,7 +77,7 @@ describe('make injection token', () => { > beforeEach(() => { - secondInjectionToken = sut(description, anotherFactory) + secondInjectionToken = sut(description, anotherFactory)() }) it('should return the same injection token if providing same description but different factory', () => { diff --git a/projects/ngx-meta/src/core/src/utils/make-injection-token.ts b/projects/ngx-meta/src/core/src/utils/lazy-injection-token.ts similarity index 64% rename from projects/ngx-meta/src/core/src/utils/make-injection-token.ts rename to projects/ngx-meta/src/core/src/utils/lazy-injection-token.ts index 9819cfd4..5a0569eb 100644 --- a/projects/ngx-meta/src/core/src/utils/make-injection-token.ts +++ b/projects/ngx-meta/src/core/src/utils/lazy-injection-token.ts @@ -6,14 +6,16 @@ export const INJECTION_TOKENS = new Map>() export const INJECTION_TOKEN_FACTORIES = new Map unknown>() /** - * See https://github.com/davidlj95/ngx/pull/892 + * A utility function to create lazy injection tokens. + * + * See {@link _LazyInjectionToken} for more information. * * @internal */ -export const _makeInjectionToken: ( +export const _lazyInjectionToken: ( description: string, factory: () => T, -) => InjectionToken = (description, factory) => { +) => _LazyInjectionToken = (description, factory) => () => { const injectionToken = INJECTION_TOKENS.get(description) ?? new InjectionToken(`ngx-meta ${description}`, { factory }) @@ -39,3 +41,18 @@ export const _makeInjectionToken: ( INJECTION_TOKENS.set(description, injectionToken) return injectionToken } + +/** + * Thunk to delay the instantiation of a new injection token. + * This way they can be tree-shaken if unused. + * As their factory functions can bring many unused bytes to the production bundle. + * + * See also: + * + * - {@link https://github.com/davidlj95/ngx/pull/892 | PR where need for this was discovered} + * + * - {@link https://en.wikipedia.org/wiki/Thunk | Thunk definition (computer science)} + * + * @internal + */ +export type _LazyInjectionToken = () => InjectionToken