@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
53 lines • 6.2 kB
JavaScript
/**
* 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