Skip to content

Commit dff2686

Browse files
authored
perf: reduce Open Graph module bundle size (#150)
* perf: reduce Open Graph module bundle size * refactor: reorder og imports in provider
1 parent 15b4541 commit dff2686

30 files changed

+291
-310
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"commitlint-last": "commitlint --verbose --from HEAD~1",
2424
"generate-prettier-ignore": "cp .gitignore .prettierignore && cat .part.prettierignore >> .prettierignore",
2525
"semantic-release": "semantic-release",
26-
"ng-lint-staged": "ng-lint-staged lint --max-warnings 0 --fix --"
26+
"ng-lint-staged": "ng-lint-staged lint --max-warnings 0 --fix --",
27+
"cache-clean": "ng cache clean"
2728
},
2829
"private": true,
2930
"packageManager": "[email protected]",

projects/ngx-meta/src/core/public-api.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ export * from './src/meta-property'
1717
export * from './src/meta.service'
1818
export * from './src/metadata'
1919
export * from './src/metadata-definition'
20+
export * from './src/metadata-setter'
2021
export * from './src/metadata-values'
2122
export * from './src/metadata.service'
2223
export * from './src/provide-metadata'
24+
export * from './src/provide-metadata-factory'
25+
export * from './src/scoped-metadata-definition'
2326
export * from './src/string-key-of'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export type MetadataSetter<T> = (value: T) => void
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { Metadata } from './metadata'
2+
import { FactoryProvider } from '@angular/core'
3+
import { MetadataDefinition } from './metadata-definition'
4+
import { MetadataSetter } from './metadata-setter'
5+
6+
export type MetadataSetterFactory<T> = (
7+
...deps: Exclude<FactoryProvider['deps'], undefined>
8+
) => MetadataSetter<T>
9+
10+
const makeMetadata = <T>(
11+
definition: MetadataDefinition,
12+
set: MetadataSetter<T>,
13+
): Metadata<T> => {
14+
return {
15+
definition,
16+
set,
17+
}
18+
}
19+
20+
export function provideMetadataFactory<T>(
21+
definition: MetadataDefinition,
22+
setterFactory: MetadataSetterFactory<T>,
23+
deps?: FactoryProvider['deps'],
24+
): FactoryProvider {
25+
return {
26+
provide: Metadata,
27+
multi: true,
28+
useFactory: (...deps: unknown[]) =>
29+
makeMetadata(definition, setterFactory(...deps)),
30+
deps,
31+
}
32+
}

projects/ngx-meta/src/open-graph-profile/src/base-open-graph-profile-metadata.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ import {
55
} from '@davidlj95/ngx-meta/core'
66
import { OpenGraphProfileMetadata } from './open-graph-profile-metadata'
77
import { OpenGraphProfileMetadataRouteData } from './open-graph-profile-metadata-route-data'
8-
import { OpenGraphMetadataRouteData } from '@davidlj95/ngx-meta/open-graph'
98

10-
export const OG_SCOPE: keyof OpenGraphMetadataRouteData['meta'] = 'openGraph'
9+
export const OG_SCOPE = 'openGraph'
1110
export const PROFILE_SCOPE: keyof OpenGraphProfileMetadataRouteData['meta']['openGraph'] =
1211
'profile'
1312

projects/ngx-meta/src/open-graph-profile/src/open-graph-profile-metadata-route-data.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { OpenGraphProfileMetadata } from './open-graph-profile-metadata'
2-
import { OpenGraphMetadataRouteData } from '@davidlj95/ngx-meta/open-graph'
2+
import { MetadataRouteData } from '@davidlj95/ngx-meta/routing'
3+
import { OpenGraph } from '@davidlj95/ngx-meta/open-graph'
34

4-
export interface OpenGraphProfileMetadataRouteData
5-
extends OpenGraphMetadataRouteData {
5+
export interface OpenGraphProfileMetadataRouteData extends MetadataRouteData {
66
meta: {
7-
openGraph: OpenGraphMetadataRouteData['meta']['openGraph'] & {
7+
openGraph: OpenGraph & {
88
profile: OpenGraphProfileMetadata
99
}
1010
}
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
export { OpenGraphModule as NgxMetaOpenGraphModule } from './src/open-graph.module'
22
export { provideOpenGraph as provideNgxMetaOpenGraphMetadata } from './src/provide-open-graph'
3+
export * from './src/open-graph'
34
export * from './src/open-graph-image'
45
export * from './src/open-graph-meta-property'
5-
export * from './src/open-graph-metadata-route-data'
66
export * from './src/open-graph-metadata'
77
export * from './src/open-graph-type'
8-
// Specific metadata
9-
export * from './src/title-open-graph-metadata'
10-
export * from './src/type-open-graph-metadata'
11-
export * from './src/image-open-graph-metadata'
12-
export * from './src/url-open-graph-metadata'
13-
export * from './src/description-open-graph-metadata'
14-
export * from './src/locale-open-graph-metadata'
15-
export * from './src/site-name-open-graph-metadata'
8+
// Providers
9+
export * from './src/open-graph-title-metadata-provider'
10+
export * from './src/open-graph-type-metadata-provider'
11+
export * from './src/open-graph-image-metadata-provider'
12+
export * from './src/open-graph-url-metadata-provider'
13+
export * from './src/open-graph-description-metadata-provider'
14+
export * from './src/open-graph-locale-metadata-provider'
15+
export * from './src/open-graph-site-name-metadata-provider'

projects/ngx-meta/src/open-graph/src/base-open-graph-metadata.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

projects/ngx-meta/src/open-graph/src/description-open-graph-metadata.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

projects/ngx-meta/src/open-graph/src/image-open-graph-metadata.ts

Lines changed: 0 additions & 49 deletions
This file was deleted.

projects/ngx-meta/src/open-graph/src/locale-open-graph-metadata.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import {
2+
GlobalMetadataKey,
3+
MetadataSetterFactory,
4+
MetaService,
5+
provideMetadataFactory,
6+
StringKeyOf,
7+
} from '@davidlj95/ngx-meta/core'
8+
import { OpenGraph } from './open-graph'
9+
import { FactoryProvider } from '@angular/core'
10+
import { OpenGraphMetadataDefinition } from './open-graph-metadata-definition'
11+
import { OpenGraphMetaProperty } from './open-graph-meta-property'
12+
13+
export const makeOpenGraphMetadataProvider = <
14+
Key extends StringKeyOf<OpenGraph>,
15+
>(
16+
key: Key,
17+
opts: {
18+
// Open Graph property name. Defaults to key
19+
p?: string
20+
// Global key. Defaults to nothing
21+
g?: GlobalMetadataKey
22+
// Setter factory. Defaults to setting the property to the given value.
23+
s?: MetadataSetterFactory<OpenGraph[typeof key]>
24+
} = {},
25+
): FactoryProvider =>
26+
provideMetadataFactory(
27+
new OpenGraphMetadataDefinition(key, opts.g),
28+
opts.s ??
29+
((metaService) => (value: OpenGraph[typeof key]) =>
30+
metaService.set(new OpenGraphMetaProperty(opts.p ?? key), value)),
31+
[MetaService],
32+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { makeOpenGraphMetadataProvider } from './make-open-graph-metadata-provider'
2+
import { OpenGraph } from './open-graph'
3+
4+
const KEY: keyof OpenGraph = 'description'
5+
6+
export const OPEN_GRAPH_DESCRIPTION_METADATA_PROVIDER =
7+
makeOpenGraphMetadataProvider(KEY, { g: KEY })

projects/ngx-meta/src/open-graph/src/image-open-graph-metadata.spec.ts renamed to projects/ngx-meta/src/open-graph/src/open-graph-image-metadata-provider.spec.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import { ImageOpenGraphMetadata } from './image-open-graph-metadata'
21
import { TestBed } from '@angular/core/testing'
32
import { MockProviders } from 'ng-mocks'
4-
import { MetaService } from '@davidlj95/ngx-meta/core'
3+
import { MetadataSetter, MetaService } from '@davidlj95/ngx-meta/core'
54
import { enableAutoSpy } from '../../__tests__/enable-auto-spy'
65
import { OpenGraphImage } from './open-graph-image'
6+
import { OpenGraph } from './open-graph'
7+
import { OPEN_GRAPH_IMAGE_SETTER_FACTORY } from './open-graph-image-metadata-provider'
78

8-
describe('Image Open Graph metadata', () => {
9+
describe('Open Graph image metadata', () => {
910
enableAutoSpy()
10-
let sut: ImageOpenGraphMetadata
11+
let sut: MetadataSetter<OpenGraph['image']>
1112
let metaService: jasmine.SpyObj<MetaService>
1213

1314
beforeEach(() => {
@@ -27,7 +28,7 @@ describe('Image Open Graph metadata', () => {
2728
describe('set', () => {
2829
describe('when url is provided', () => {
2930
it('should set all meta properties', () => {
30-
sut.set(image)
31+
sut(image)
3132

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

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

74-
function makeSut(): ImageOpenGraphMetadata {
75+
function makeSut(): MetadataSetter<OpenGraph['image']> {
7576
TestBed.configureTestingModule({
76-
providers: [ImageOpenGraphMetadata, MockProviders(MetaService)],
77+
providers: [MockProviders(MetaService)],
7778
})
78-
return TestBed.inject(ImageOpenGraphMetadata)
79+
return OPEN_GRAPH_IMAGE_SETTER_FACTORY(TestBed.inject(MetaService))
7980
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { OpenGraph } from './open-graph'
2+
import { MetaService } from '@davidlj95/ngx-meta/core'
3+
import { OpenGraphMetaProperty } from './open-graph-meta-property'
4+
import { makeOpenGraphMetadataProvider } from './make-open-graph-metadata-provider'
5+
6+
const KEY: keyof OpenGraph = 'image'
7+
const NO_KEY_VALUE: OpenGraph[typeof KEY] = {
8+
url: undefined,
9+
alt: undefined,
10+
secureUrl: null,
11+
type: null,
12+
width: null,
13+
height: null,
14+
}
15+
16+
export const OPEN_GRAPH_IMAGE_SETTER_FACTORY =
17+
(metaService: MetaService) => (value: OpenGraph[typeof KEY]) => {
18+
const imageUrl = value?.url?.toString()
19+
const effectiveValue: OpenGraph[typeof KEY] =
20+
imageUrl !== undefined && imageUrl !== null ? value : NO_KEY_VALUE
21+
metaService.set(new OpenGraphMetaProperty(KEY), imageUrl)
22+
metaService.set(new OpenGraphMetaProperty(KEY, 'alt'), effectiveValue?.alt)
23+
metaService.set(
24+
new OpenGraphMetaProperty(KEY, 'secure_url'),
25+
effectiveValue?.secureUrl?.toString(),
26+
)
27+
metaService.set(
28+
new OpenGraphMetaProperty(KEY, 'type'),
29+
effectiveValue?.type,
30+
)
31+
metaService.set(
32+
new OpenGraphMetaProperty(KEY, 'width'),
33+
effectiveValue?.width?.toString(),
34+
)
35+
metaService.set(
36+
new OpenGraphMetaProperty(KEY, 'height'),
37+
effectiveValue?.height?.toString(),
38+
)
39+
}
40+
export const OPEN_GRAPH_IMAGE_METADATA_PROVIDER = makeOpenGraphMetadataProvider(
41+
KEY,
42+
{ s: OPEN_GRAPH_IMAGE_SETTER_FACTORY, g: KEY },
43+
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { makeOpenGraphMetadataProvider } from './make-open-graph-metadata-provider'
2+
import { OpenGraph } from './open-graph'
3+
4+
const key: keyof OpenGraph = 'locale'
5+
export const OPEN_GRAPH_LOCALE_METADATA_PROVIDER =
6+
makeOpenGraphMetadataProvider(key, { g: key })
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { ScopedMetadataDefinition } from '@davidlj95/ngx-meta/core'
2+
import { OpenGraphMetadata } from './open-graph-metadata'
3+
4+
const SCOPE: keyof OpenGraphMetadata = 'openGraph'
5+
6+
export class OpenGraphMetadataDefinition extends ScopedMetadataDefinition {
7+
constructor(name: string, global?: string) {
8+
super(SCOPE, name, global)
9+
}
10+
}

projects/ngx-meta/src/open-graph/src/open-graph-metadata-route-data.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)