@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
53 lines • 6.16 kB
JavaScript
/**
* © 2025 Visa
*
* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvaWQtZ2VuZXJhdG9yL2lkLWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLGdJQUFnSTtBQUNoSSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNEOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQTJCLEVBQUUsQ0FBQztBQUU1Qzs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUFEeEI7UUFFVSxVQUFLLEdBQWtCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztLQWFuRTtJQVhDOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxTQUFpQixFQUFFO1FBQzlCLHNGQUFzRjtRQUN0RiwrRUFBK0U7UUFDL0UsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSTtZQUFFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxPQUFPLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0MsQ0FBQzsrR0FiVSxXQUFXO21IQUFYLFdBQVcsY0FERSxNQUFNOzs0RkFDbkIsV0FBVztrQkFEdkIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbi8qKiBUaGlzIHdhcyBpbnNwaXJlZCBieSBtYXRlcmlhbHMgaWQtZ2VuZXJhdG9yOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFpbi9zcmMvY2RrL2ExMXkvaWQtZ2VuZXJhdG9yLnRzICovXG5pbXBvcnQgeyBBUFBfSUQsIGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBJRCBjb3VudCBwZXIgcHJlZml4LiBUaGlzIGhlbHBzIHVzIG1ha2UgdGhlIElEcyBhIGJpdCBtb3JlIGRldGVybWluaXN0aWMuXG4gKi9cbmNvbnN0IGNvdW50ZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbi8qKlxuICogU2VydmljZSB0aGF0IGdlbmVyYXRlcyB1bmlxdWUgSURzIGZvciBET00gbm9kZXMuXG4gKiBOb3RlIHRoYXQgdGhpcyBzZXJ2aWNlIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgdGVtcGxhdGVzIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHdpdGhpbiBjbGFzc2VzLlxuICogQGRvY3Mge0BsaW5rIGh0dHBzOi8vZGVzaWduLnZpc2EuY29tL2FuZ3VsYXIvc2VydmljZXMvaWQtZ2VuZXJhdG9yIHwgU2VlIGRvY3N9XG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgSWRHZW5lcmF0b3Ige1xuICBwcml2YXRlIGFwcElkOiBudWxsIHwgc3RyaW5nID0gaW5qZWN0KEFQUF9JRCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElEIHdpdGggYSBzcGVjaWZpYyBwcmVmaXguXG4gICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IHRvIGFkZCB0byB0aGUgSUQuXG4gICAqL1xuICBwdWJsaWMgbmV3SWQocHJlZml4OiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gT21pdCB0aGUgYXBwIElEIGlmIGl0J3MgdGhlIGRlZmF1bHQgYG5nYC4gU2luY2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcGFnZXMgaGF2ZSBvbmVcbiAgICAvLyBBbmd1bGFyIGFwcCBvbiB0aGVtLCB3ZSBjYW4gcmVkdWNlIHRoZSBhbW91bnQgb2YgYnJlYWthZ2VzIGJ5IG5vdCBhZGRpbmcgaXQuXG4gICAgaWYgKHRoaXMuYXBwSWQgJiYgdGhpcy5hcHBJZCAhPT0gJ25nJykgcHJlZml4ID0gYCR7dGhpcy5hcHBJZH0tJHtwcmVmaXh9YDtcbiAgICBpZiAoIWNvdW50ZXJzLmhhc093blByb3BlcnR5KHByZWZpeCkpIGNvdW50ZXJzW3ByZWZpeF0gPSAwO1xuICAgIHJldHVybiBgJHtwcmVmaXh9LSR7Y291bnRlcnNbcHJlZml4XSsrfWA7XG4gIH1cbn1cbiJdfQ==