Skip to content

Commit

Permalink
perf: reduce Open Graph module bundle size (#150)
Browse files Browse the repository at this point in the history
* perf: reduce Open Graph module bundle size

* refactor: reorder og imports in provider
  • Loading branch information
davidlj95 authored Jan 13, 2024
1 parent 15b4541 commit dff2686
Show file tree
Hide file tree
Showing 30 changed files with 291 additions and 310 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
"commitlint-last": "commitlint --verbose --from HEAD~1",
"generate-prettier-ignore": "cp .gitignore .prettierignore && cat .part.prettierignore >> .prettierignore",
"semantic-release": "semantic-release",
"ng-lint-staged": "ng-lint-staged lint --max-warnings 0 --fix --"
"ng-lint-staged": "ng-lint-staged lint --max-warnings 0 --fix --",
"cache-clean": "ng cache clean"
},
"private": true,
"packageManager": "[email protected]",
Expand Down
3 changes: 3 additions & 0 deletions projects/ngx-meta/src/core/public-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ export * from './src/meta-property'
export * from './src/meta.service'
export * from './src/metadata'
export * from './src/metadata-definition'
export * from './src/metadata-setter'
export * from './src/metadata-values'
export * from './src/metadata.service'
export * from './src/provide-metadata'
export * from './src/provide-metadata-factory'
export * from './src/scoped-metadata-definition'
export * from './src/string-key-of'
1 change: 1 addition & 0 deletions projects/ngx-meta/src/core/src/metadata-setter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type MetadataSetter<T> = (value: T) => void
32 changes: 32 additions & 0 deletions projects/ngx-meta/src/core/src/provide-metadata-factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { Metadata } from './metadata'
import { FactoryProvider } from '@angular/core'
import { MetadataDefinition } from './metadata-definition'
import { MetadataSetter } from './metadata-setter'

export type MetadataSetterFactory<T> = (
...deps: Exclude<FactoryProvider['deps'], undefined>
) => MetadataSetter<T>

const makeMetadata = <T>(
definition: MetadataDefinition,
set: MetadataSetter<T>,
): Metadata<T> => {
return {
definition,
set,
}
}

export function provideMetadataFactory<T>(
definition: MetadataDefinition,
setterFactory: MetadataSetterFactory<T>,
deps?: FactoryProvider['deps'],
): FactoryProvider {
return {
provide: Metadata,
multi: true,
useFactory: (...deps: unknown[]) =>
makeMetadata(definition, setterFactory(...deps)),
deps,
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ import {
} from '@davidlj95/ngx-meta/core'
import { OpenGraphProfileMetadata } from './open-graph-profile-metadata'
import { OpenGraphProfileMetadataRouteData } from './open-graph-profile-metadata-route-data'
import { OpenGraphMetadataRouteData } from '@davidlj95/ngx-meta/open-graph'

export const OG_SCOPE: keyof OpenGraphMetadataRouteData['meta'] = 'openGraph'
export const OG_SCOPE = 'openGraph'
export const PROFILE_SCOPE: keyof OpenGraphProfileMetadataRouteData['meta']['openGraph'] =
'profile'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { OpenGraphProfileMetadata } from './open-graph-profile-metadata'
import { OpenGraphMetadataRouteData } from '@davidlj95/ngx-meta/open-graph'
import { MetadataRouteData } from '@davidlj95/ngx-meta/routing'
import { OpenGraph } from '@davidlj95/ngx-meta/open-graph'

export interface OpenGraphProfileMetadataRouteData
extends OpenGraphMetadataRouteData {
export interface OpenGraphProfileMetadataRouteData extends MetadataRouteData {
meta: {
openGraph: OpenGraphMetadataRouteData['meta']['openGraph'] & {
openGraph: OpenGraph & {
profile: OpenGraphProfileMetadata
}
}
Expand Down
18 changes: 9 additions & 9 deletions projects/ngx-meta/src/open-graph/public-api.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
export { OpenGraphModule as NgxMetaOpenGraphModule } from './src/open-graph.module'
export { provideOpenGraph as provideNgxMetaOpenGraphMetadata } from './src/provide-open-graph'
export * from './src/open-graph'
export * from './src/open-graph-image'
export * from './src/open-graph-meta-property'
export * from './src/open-graph-metadata-route-data'
export * from './src/open-graph-metadata'
export * from './src/open-graph-type'
// Specific metadata
export * from './src/title-open-graph-metadata'
export * from './src/type-open-graph-metadata'
export * from './src/image-open-graph-metadata'
export * from './src/url-open-graph-metadata'
export * from './src/description-open-graph-metadata'
export * from './src/locale-open-graph-metadata'
export * from './src/site-name-open-graph-metadata'
// Providers
export * from './src/open-graph-title-metadata-provider'
export * from './src/open-graph-type-metadata-provider'
export * from './src/open-graph-image-metadata-provider'
export * from './src/open-graph-url-metadata-provider'
export * from './src/open-graph-description-metadata-provider'
export * from './src/open-graph-locale-metadata-provider'
export * from './src/open-graph-site-name-metadata-provider'
17 changes: 0 additions & 17 deletions projects/ngx-meta/src/open-graph/src/base-open-graph-metadata.ts

This file was deleted.

This file was deleted.

49 changes: 0 additions & 49 deletions projects/ngx-meta/src/open-graph/src/image-open-graph-metadata.ts

This file was deleted.

18 changes: 0 additions & 18 deletions projects/ngx-meta/src/open-graph/src/locale-open-graph-metadata.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import {
GlobalMetadataKey,
MetadataSetterFactory,
MetaService,
provideMetadataFactory,
StringKeyOf,
} from '@davidlj95/ngx-meta/core'
import { OpenGraph } from './open-graph'
import { FactoryProvider } from '@angular/core'
import { OpenGraphMetadataDefinition } from './open-graph-metadata-definition'
import { OpenGraphMetaProperty } from './open-graph-meta-property'

export const makeOpenGraphMetadataProvider = <
Key extends StringKeyOf<OpenGraph>,
>(
key: Key,
opts: {
// Open Graph property name. Defaults to key
p?: string
// Global key. Defaults to nothing
g?: GlobalMetadataKey
// Setter factory. Defaults to setting the property to the given value.
s?: MetadataSetterFactory<OpenGraph[typeof key]>
} = {},
): FactoryProvider =>
provideMetadataFactory(
new OpenGraphMetadataDefinition(key, opts.g),
opts.s ??
((metaService) => (value: OpenGraph[typeof key]) =>
metaService.set(new OpenGraphMetaProperty(opts.p ?? key), value)),
[MetaService],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { makeOpenGraphMetadataProvider } from './make-open-graph-metadata-provider'
import { OpenGraph } from './open-graph'

const KEY: keyof OpenGraph = 'description'

export const OPEN_GRAPH_DESCRIPTION_METADATA_PROVIDER =
makeOpenGraphMetadataProvider(KEY, { g: KEY })
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import { ImageOpenGraphMetadata } from './image-open-graph-metadata'
import { TestBed } from '@angular/core/testing'
import { MockProviders } from 'ng-mocks'
import { MetaService } from '@davidlj95/ngx-meta/core'
import { MetadataSetter, MetaService } from '@davidlj95/ngx-meta/core'
import { enableAutoSpy } from '../../__tests__/enable-auto-spy'
import { OpenGraphImage } from './open-graph-image'
import { OpenGraph } from './open-graph'
import { OPEN_GRAPH_IMAGE_SETTER_FACTORY } from './open-graph-image-metadata-provider'

describe('Image Open Graph metadata', () => {
describe('Open Graph image metadata', () => {
enableAutoSpy()
let sut: ImageOpenGraphMetadata
let sut: MetadataSetter<OpenGraph['image']>
let metaService: jasmine.SpyObj<MetaService>

beforeEach(() => {
Expand All @@ -27,7 +28,7 @@ describe('Image Open Graph metadata', () => {
describe('set', () => {
describe('when url is provided', () => {
it('should set all meta properties', () => {
sut.set(image)
sut(image)

const props = Object.keys(image).length
expect(metaService.set).toHaveBeenCalledTimes(props)
Expand Down Expand Up @@ -59,7 +60,7 @@ describe('Image Open Graph metadata', () => {
})
describe('when no url is defined', () => {
it('should remove all meta properties', () => {
sut.set({ ...image, url: undefined })
sut({ ...image, url: undefined })

const props = Object.keys(image).length
expect(metaService.set).toHaveBeenCalledTimes(props)
Expand All @@ -71,9 +72,9 @@ describe('Image Open Graph metadata', () => {
})
})

function makeSut(): ImageOpenGraphMetadata {
function makeSut(): MetadataSetter<OpenGraph['image']> {
TestBed.configureTestingModule({
providers: [ImageOpenGraphMetadata, MockProviders(MetaService)],
providers: [MockProviders(MetaService)],
})
return TestBed.inject(ImageOpenGraphMetadata)
return OPEN_GRAPH_IMAGE_SETTER_FACTORY(TestBed.inject(MetaService))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { OpenGraph } from './open-graph'
import { MetaService } from '@davidlj95/ngx-meta/core'
import { OpenGraphMetaProperty } from './open-graph-meta-property'
import { makeOpenGraphMetadataProvider } from './make-open-graph-metadata-provider'

const KEY: keyof OpenGraph = 'image'
const NO_KEY_VALUE: OpenGraph[typeof KEY] = {
url: undefined,
alt: undefined,
secureUrl: null,
type: null,
width: null,
height: null,
}

export const OPEN_GRAPH_IMAGE_SETTER_FACTORY =
(metaService: MetaService) => (value: OpenGraph[typeof KEY]) => {
const imageUrl = value?.url?.toString()
const effectiveValue: OpenGraph[typeof KEY] =
imageUrl !== undefined && imageUrl !== null ? value : NO_KEY_VALUE
metaService.set(new OpenGraphMetaProperty(KEY), imageUrl)
metaService.set(new OpenGraphMetaProperty(KEY, 'alt'), effectiveValue?.alt)
metaService.set(
new OpenGraphMetaProperty(KEY, 'secure_url'),
effectiveValue?.secureUrl?.toString(),
)
metaService.set(
new OpenGraphMetaProperty(KEY, 'type'),
effectiveValue?.type,
)
metaService.set(
new OpenGraphMetaProperty(KEY, 'width'),
effectiveValue?.width?.toString(),
)
metaService.set(
new OpenGraphMetaProperty(KEY, 'height'),
effectiveValue?.height?.toString(),
)
}
export const OPEN_GRAPH_IMAGE_METADATA_PROVIDER = makeOpenGraphMetadataProvider(
KEY,
{ s: OPEN_GRAPH_IMAGE_SETTER_FACTORY, g: KEY },
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { makeOpenGraphMetadataProvider } from './make-open-graph-metadata-provider'
import { OpenGraph } from './open-graph'

const key: keyof OpenGraph = 'locale'
export const OPEN_GRAPH_LOCALE_METADATA_PROVIDER =
makeOpenGraphMetadataProvider(key, { g: key })
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { ScopedMetadataDefinition } from '@davidlj95/ngx-meta/core'
import { OpenGraphMetadata } from './open-graph-metadata'

const SCOPE: keyof OpenGraphMetadata = 'openGraph'

export class OpenGraphMetadataDefinition extends ScopedMetadataDefinition {
constructor(name: string, global?: string) {
super(SCOPE, name, global)
}
}

This file was deleted.

Loading

0 comments on commit dff2686

Please sign in to comment.