UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

53 lines 6.2 kB
/** * Copyright (c) 2025 Visa, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ /** This was inspired by materials id-generator: https://github.com/angular/components/blob/main/src/cdk/a11y/id-generator.ts */ import { APP_ID, inject, Injectable } from '@angular/core'; import * as i0 from "@angular/core"; /** * Keeps track of the ID count per prefix. This helps us make the IDs a bit more deterministic. */ const counters = {}; /** * Service that generates unique IDs for DOM nodes. * Note that this service should not be used inside templates and should only be used within classes. * @docs {@link https://design.visa.com/angular/services/id-generator | See docs} */ export class IdGenerator { constructor() { this.appId = inject(APP_ID, { optional: true }); } /** * Generates a unique ID with a specific prefix. * @param prefix Prefix to add to the ID. */ newId(prefix = '') { // Omit the app ID if it's the default `ng`. Since the vast majority of pages have one // Angular app on them, we can reduce the amount of breakages by not adding it. if (this.appId && this.appId !== 'ng') prefix = `${this.appId}-${prefix}`; if (!counters.hasOwnProperty(prefix)) counters[prefix] = 0; return `${prefix}-${counters[prefix]++}`; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IdGenerator, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IdGenerator, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IdGenerator, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvaWQtZ2VuZXJhdG9yL2lkLWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLGdJQUFnSTtBQUNoSSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNEOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQTJCLEVBQUUsQ0FBQztBQUU1Qzs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUFEeEI7UUFFVSxVQUFLLEdBQWtCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztLQWFuRTtJQVhDOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxTQUFpQixFQUFFO1FBQzlCLHNGQUFzRjtRQUN0RiwrRUFBK0U7UUFDL0UsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSTtZQUFFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxPQUFPLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0MsQ0FBQzsrR0FiVSxXQUFXO21IQUFYLFdBQVcsY0FERSxNQUFNOzs0RkFDbkIsV0FBVztrQkFEdkIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuLyoqIFRoaXMgd2FzIGluc3BpcmVkIGJ5IG1hdGVyaWFscyBpZC1nZW5lcmF0b3I6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYWluL3NyYy9jZGsvYTExeS9pZC1nZW5lcmF0b3IudHMgKi9cbmltcG9ydCB7IEFQUF9JRCwgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIElEIGNvdW50IHBlciBwcmVmaXguIFRoaXMgaGVscHMgdXMgbWFrZSB0aGUgSURzIGEgYml0IG1vcmUgZGV0ZXJtaW5pc3RpYy5cbiAqL1xuY29uc3QgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuLyoqXG4gKiBTZXJ2aWNlIHRoYXQgZ2VuZXJhdGVzIHVuaXF1ZSBJRHMgZm9yIERPTSBub2Rlcy5cbiAqIE5vdGUgdGhhdCB0aGlzIHNlcnZpY2Ugc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSB0ZW1wbGF0ZXMgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aGluIGNsYXNzZXMuXG4gKiBAZG9jcyB7QGxpbmsgaHR0cHM6Ly9kZXNpZ24udmlzYS5jb20vYW5ndWxhci9zZXJ2aWNlcy9pZC1nZW5lcmF0b3IgfCBTZWUgZG9jc31cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBJZEdlbmVyYXRvciB7XG4gIHByaXZhdGUgYXBwSWQ6IG51bGwgfCBzdHJpbmcgPSBpbmplY3QoQVBQX0lELCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQgd2l0aCBhIHNwZWNpZmljIHByZWZpeC5cbiAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggdG8gYWRkIHRvIHRoZSBJRC5cbiAgICovXG4gIHB1YmxpYyBuZXdJZChwcmVmaXg6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBPbWl0IHRoZSBhcHAgSUQgaWYgaXQncyB0aGUgZGVmYXVsdCBgbmdgLiBTaW5jZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBwYWdlcyBoYXZlIG9uZVxuICAgIC8vIEFuZ3VsYXIgYXBwIG9uIHRoZW0sIHdlIGNhbiByZWR1Y2UgdGhlIGFtb3VudCBvZiBicmVha2FnZXMgYnkgbm90IGFkZGluZyBpdC5cbiAgICBpZiAodGhpcy5hcHBJZCAmJiB0aGlzLmFwcElkICE9PSAnbmcnKSBwcmVmaXggPSBgJHt0aGlzLmFwcElkfS0ke3ByZWZpeH1gO1xuICAgIGlmICghY291bnRlcnMuaGFzT3duUHJvcGVydHkocHJlZml4KSkgY291bnRlcnNbcHJlZml4XSA9IDA7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0tJHtjb3VudGVyc1twcmVmaXhdKyt9YDtcbiAgfVxufVxuIl19