@davidlj95/ngx-meta
Version:
Set your Angular site's metadata: standard meta tags, Open Graph, Twitter Cards, JSON-LD structured data and more. Supports SSR (and Angular Universal). Use a service. Use routes' data. Set it up in a flash! 🚀
112 lines • 11.1 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { metadataRegistry, } from '../managers/metadata-registry';
import { metadataResolver, } from '../resolvers/metadata-resolver';
import { _formatDevMessage } from '../messaging';
import { MODULE_NAME } from '../module-name';
import * as i0 from "@angular/core";
/**
* Manages the metadata values of the current page.
*
* @public
*/
export class NgxMetaService {
constructor(registry, resolver) {
this.registry = registry;
this.resolver = resolver;
}
/**
* Sets the metadata values of the current page
*
* @remarks
*
* The method is designed as an atomic operation. Subsequent calls to this
* method won't set more metadata, but will instead set the metadata values
* provided when calling it.
*
* For instance,
*
* ```typescript
* ngxMetaService.set({description: 'Description'})
* ngxMetaService.set({title: 'Title'})
* ```
*
* Will result in a page with title <b>but no description</b>
*
* For more information check the {@link https://ngx-meta.dev/guides/set-metadata-using-service/ | service guide docs}
*
* @param values - Metadata values to set, as a JSON object
*/
set(values = {}) {
const allMetadata = this.registry.getAll();
for (const metadata of allMetadata) {
metadata.set(this.resolver(values, metadata.resolverOptions));
}
}
/**
* Sets a metadata value for the page
*
* You can specify which metadata elements will be changed by using the
* global or JSON Path that you would use if using {@link NgxMetaService.set} API
*
* @remarks
* For instance, if you want to just set the title of the page. You'd set it
* with {@link NgxMetaService.set} API like this:
*
* ```typescript
* this.ngxMetaService.set({
* title: 'Global title'
* standard: {
* title: 'Standard title',
* }
* })
* ```
*
* But rest of metadata would be removed.
*
* To only set the `title`, you can use this API:
*
* ```typescript
* this.ngxMetaService.setOne('title', 'Global title')
* this.ngxMetaService.setOne('standard.title', 'Standard title')
* ```
*
* For more information check the {@link https://ngx-meta.dev/guides/set-metadata-using-service/ | service guide docs}
*
* @param globalOrJsonPath - Looks for metadata managers whose global matches
* this argument. Or whose JSON path matches this
* argument.
* @param value - Value to set for matching metadata elements
*/
setOne(globalOrJsonPath, value) {
const managers = this.registry.findByGlobalOrJsonPath(globalOrJsonPath);
/* istanbul ignore next - not unit tested hence no warning test */
if (ngDevMode && [...managers].length === 0) {
console.warn(_formatDevMessage('no metadata managers found for global or JSON Path', {
module: MODULE_NAME,
value: globalOrJsonPath,
}));
}
for (const manager of managers) {
manager.set(value);
}
}
/**
* Clears all managed metadata elements of the current page
*/
clear() {
this.set();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxMetaService, deps: [{ token: metadataRegistry() }, { token: metadataResolver() }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxMetaService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxMetaService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [metadataRegistry()]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [metadataResolver()]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1ldGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb3JlL3NyYy9zZXJ2aWNlL25neC1tZXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUVMLGdCQUFnQixHQUNqQixNQUFNLCtCQUErQixDQUFBO0FBQ3RDLE9BQU8sRUFFTCxnQkFBZ0IsR0FDakIsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFBOztBQUU1Qzs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFDc0MsUUFBMEIsRUFDMUIsUUFBMEI7UUFEMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFDN0QsQ0FBQztJQUVKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FxQkc7SUFDSCxHQUFHLENBQUMsU0FBeUIsRUFBRTtRQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQzFDLEtBQUssTUFBTSxRQUFRLElBQUksV0FBVyxFQUFFLENBQUM7WUFDbkMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTtRQUMvRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0NHO0lBQ0gsTUFBTSxDQUFDLGdCQUF3QixFQUFFLEtBQWM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3ZFLGtFQUFrRTtRQUNsRSxJQUFJLFNBQVMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsaUJBQWlCLENBQ2Ysb0RBQW9ELEVBQ3BEO2dCQUNFLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixLQUFLLEVBQUUsZ0JBQWdCO2FBQ3hCLENBQ0YsQ0FDRixDQUFBO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUNaLENBQUM7K0dBOUZVLGNBQWMsa0JBRWYsZ0JBQWdCLEVBQUUsYUFDbEIsZ0JBQWdCLEVBQUU7bUhBSGpCLGNBQWMsY0FERCxNQUFNOzs0RkFDbkIsY0FBYztrQkFEMUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQUc3QixNQUFNOzJCQUFDLGdCQUFnQixFQUFFOzswQkFDekIsTUFBTTsyQkFBQyxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1ldGFkYXRhVmFsdWVzIH0gZnJvbSAnLi9tZXRhZGF0YS12YWx1ZXMnXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHtcbiAgTWV0YWRhdGFSZWdpc3RyeSxcbiAgbWV0YWRhdGFSZWdpc3RyeSxcbn0gZnJvbSAnLi4vbWFuYWdlcnMvbWV0YWRhdGEtcmVnaXN0cnknXG5pbXBvcnQge1xuICBNZXRhZGF0YVJlc29sdmVyLFxuICBtZXRhZGF0YVJlc29sdmVyLFxufSBmcm9tICcuLi9yZXNvbHZlcnMvbWV0YWRhdGEtcmVzb2x2ZXInXG5pbXBvcnQgeyBfZm9ybWF0RGV2TWVzc2FnZSB9IGZyb20gJy4uL21lc3NhZ2luZydcbmltcG9ydCB7IE1PRFVMRV9OQU1FIH0gZnJvbSAnLi4vbW9kdWxlLW5hbWUnXG5cbi8qKlxuICogTWFuYWdlcyB0aGUgbWV0YWRhdGEgdmFsdWVzIG9mIHRoZSBjdXJyZW50IHBhZ2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE5neE1ldGFTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChtZXRhZGF0YVJlZ2lzdHJ5KCkpIHByaXZhdGUgcmVnaXN0cnk6IE1ldGFkYXRhUmVnaXN0cnksXG4gICAgQEluamVjdChtZXRhZGF0YVJlc29sdmVyKCkpIHByaXZhdGUgcmVzb2x2ZXI6IE1ldGFkYXRhUmVzb2x2ZXIsXG4gICkge31cblxuICAvKipcbiAgICogU2V0cyB0aGUgbWV0YWRhdGEgdmFsdWVzIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICpcbiAgICogVGhlIG1ldGhvZCBpcyBkZXNpZ25lZCBhcyBhbiBhdG9taWMgb3BlcmF0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoaXNcbiAgICogbWV0aG9kIHdvbid0IHNldCBtb3JlIG1ldGFkYXRhLCBidXQgd2lsbCBpbnN0ZWFkIHNldCB0aGUgbWV0YWRhdGEgdmFsdWVzXG4gICAqIHByb3ZpZGVkIHdoZW4gY2FsbGluZyBpdC5cbiAgICpcbiAgICogRm9yIGluc3RhbmNlLFxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5neE1ldGFTZXJ2aWNlLnNldCh7ZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbid9KVxuICAgKiBuZ3hNZXRhU2VydmljZS5zZXQoe3RpdGxlOiAnVGl0bGUnfSlcbiAgICogYGBgXG4gICAqXG4gICAqIFdpbGwgcmVzdWx0IGluIGEgcGFnZSB3aXRoIHRpdGxlIDxiPmJ1dCBubyBkZXNjcmlwdGlvbjwvYj5cbiAgICpcbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gY2hlY2sgdGhlIHtAbGluayBodHRwczovL25neC1tZXRhLmRldi9ndWlkZXMvc2V0LW1ldGFkYXRhLXVzaW5nLXNlcnZpY2UvIHwgc2VydmljZSBndWlkZSBkb2NzfVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVzIC0gTWV0YWRhdGEgdmFsdWVzIHRvIHNldCwgYXMgYSBKU09OIG9iamVjdFxuICAgKi9cbiAgc2V0KHZhbHVlczogTWV0YWRhdGFWYWx1ZXMgPSB7fSk6IHZvaWQge1xuICAgIGNvbnN0IGFsbE1ldGFkYXRhID0gdGhpcy5yZWdpc3RyeS5nZXRBbGwoKVxuICAgIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgYWxsTWV0YWRhdGEpIHtcbiAgICAgIG1ldGFkYXRhLnNldCh0aGlzLnJlc29sdmVyKHZhbHVlcywgbWV0YWRhdGEucmVzb2x2ZXJPcHRpb25zKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcGFnZVxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgd2hpY2ggbWV0YWRhdGEgZWxlbWVudHMgd2lsbCBiZSBjaGFuZ2VkIGJ5IHVzaW5nIHRoZVxuICAgKiBnbG9iYWwgb3IgSlNPTiBQYXRoIHRoYXQgeW91IHdvdWxkIHVzZSBpZiB1c2luZyB7QGxpbmsgTmd4TWV0YVNlcnZpY2Uuc2V0fSBBUElcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIGluc3RhbmNlLCBpZiB5b3Ugd2FudCB0byBqdXN0IHNldCB0aGUgdGl0bGUgb2YgdGhlIHBhZ2UuIFlvdSdkIHNldCBpdFxuICAgKiB3aXRoIHtAbGluayBOZ3hNZXRhU2VydmljZS5zZXR9IEFQSSBsaWtlIHRoaXM6XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5uZ3hNZXRhU2VydmljZS5zZXQoe1xuICAgKiAgdGl0bGU6ICdHbG9iYWwgdGl0bGUnXG4gICAqICBzdGFuZGFyZDoge1xuICAgKiAgICB0aXRsZTogJ1N0YW5kYXJkIHRpdGxlJyxcbiAgICogIH1cbiAgICogfSlcbiAgICogYGBgXG4gICAqXG4gICAqIEJ1dCByZXN0IG9mIG1ldGFkYXRhIHdvdWxkIGJlIHJlbW92ZWQuXG4gICAqXG4gICAqIFRvIG9ubHkgc2V0IHRoZSBgdGl0bGVgLCB5b3UgY2FuIHVzZSB0aGlzIEFQSTpcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLm5neE1ldGFTZXJ2aWNlLnNldE9uZSgndGl0bGUnLCAnR2xvYmFsIHRpdGxlJylcbiAgICogdGhpcy5uZ3hNZXRhU2VydmljZS5zZXRPbmUoJ3N0YW5kYXJkLnRpdGxlJywgJ1N0YW5kYXJkIHRpdGxlJylcbiAgICogYGBgXG4gICAqXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGNoZWNrIHRoZSB7QGxpbmsgaHR0cHM6Ly9uZ3gtbWV0YS5kZXYvZ3VpZGVzL3NldC1tZXRhZGF0YS11c2luZy1zZXJ2aWNlLyB8IHNlcnZpY2UgZ3VpZGUgZG9jc31cbiAgICpcbiAgICogQHBhcmFtIGdsb2JhbE9ySnNvblBhdGggLSBMb29rcyBmb3IgbWV0YWRhdGEgbWFuYWdlcnMgd2hvc2UgZ2xvYmFsIG1hdGNoZXNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGFyZ3VtZW50LiBPciB3aG9zZSBKU09OIHBhdGggbWF0Y2hlcyB0aGlzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHNldCBmb3IgbWF0Y2hpbmcgbWV0YWRhdGEgZWxlbWVudHNcbiAgICovXG4gIHNldE9uZShnbG9iYWxPckpzb25QYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgbWFuYWdlcnMgPSB0aGlzLnJlZ2lzdHJ5LmZpbmRCeUdsb2JhbE9ySnNvblBhdGgoZ2xvYmFsT3JKc29uUGF0aClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIG5vdCB1bml0IHRlc3RlZCBoZW5jZSBubyB3YXJuaW5nIHRlc3QgKi9cbiAgICBpZiAobmdEZXZNb2RlICYmIFsuLi5tYW5hZ2Vyc10ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIF9mb3JtYXREZXZNZXNzYWdlKFxuICAgICAgICAgICdubyBtZXRhZGF0YSBtYW5hZ2VycyBmb3VuZCBmb3IgZ2xvYmFsIG9yIEpTT04gUGF0aCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlOiBNT0RVTEVfTkFNRSxcbiAgICAgICAgICAgIHZhbHVlOiBnbG9iYWxPckpzb25QYXRoLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApXG4gICAgfVxuICAgIGZvciAoY29uc3QgbWFuYWdlciBvZiBtYW5hZ2Vycykge1xuICAgICAgbWFuYWdlci5zZXQodmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgbWFuYWdlZCBtZXRhZGF0YSBlbGVtZW50cyBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldCgpXG4gIH1cbn1cbiJdfQ==