UNPKG

@daiso-tech/core

Version:

The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.

136 lines 3.7 kB
/** * @module Namespace */ import {} from "../../namespace/contracts/_module.js"; import {} from "../../serde/contracts/flexible-serde.contract.js"; import { resolveOneOrMoreStr, resolveOneOrMore, UnexpectedError, } from "../../utilities/_module.js"; /** * @internal */ class Key { prefixArr; key; delimiter; /** * * @internal */ constructor(settings) { const { prefixArr, key, delimiter } = settings; this.prefixArr = prefixArr; this.key = key; this.delimiter = delimiter; } get() { return this.key; } toString() { return resolveOneOrMoreStr([...this.prefixArr, this.key], this.delimiter); } equals(value) { return this.toString() === value.toString(); } } /** * The `Namespace` class adds prefixes/suffixes to keys to avoid conflicts and group related items. * * IMPORT_PATH: `"@daiso-tech/core/namespace"` * @group Implementations * * @example * ```ts * import { Namespace } from "@daiso-tech/core/namspace"; * * const namespace = new Namespace("@my-namespace"); * * // Logs "@my-namespace:_rt" * console.log(namespace.toString()); * * const key = namespace.create("my-key"); * * // Logs "my-key" * console.log(key.get()) * * // Logs "@my-namespace:_rt:my-key" * console.log(key.toString()) * * // You can extend the root * const newNamespace = namespace.appendRoot("sub"); * * // Logs "@my-namespace:sub:_rt" * console.log(newNamespace.toString()); * * ``` */ export class Namespace { root; static deserialize(serialized) { return new Namespace(serialized.root, { delimiter: serialized.delimiter, rootIdentifier: serialized.rootIdentifier, }); } delimiter; rootIdentifier; constructor(root, settings = {}) { this.root = root; const { delimiter = ":", rootIdentifier = "_rt" } = settings; this.delimiter = delimiter; this.rootIdentifier = rootIdentifier; } serialize() { return { root: typeof this.root === "string" ? this.root : [...this.root], delimiter: this.delimiter, rootIdentifier: this.rootIdentifier, version: "1", }; } setdelimiter(delimiter) { return new Namespace(this.root, { rootIdentifier: this.rootIdentifier, delimiter, }); } setRootIdentifier(identifier) { return new Namespace(this.root, { rootIdentifier: identifier, delimiter: this.delimiter, }); } appendRoot(str) { return new Namespace([...resolveOneOrMore(this.root), ...resolveOneOrMore(str)], { rootIdentifier: this.rootIdentifier, delimiter: this.delimiter, }); } prependRoot(str) { return new Namespace([...resolveOneOrMore(str), ...resolveOneOrMore(this.root)], { rootIdentifier: this.rootIdentifier, delimiter: this.delimiter, }); } validate(key) { if (key.includes(this.rootIdentifier)) { throw new UnexpectedError(`Key "${key}" cannot not include "${this.rootIdentifier}"`); } } getKeyPrefixArray() { return [ resolveOneOrMoreStr(this.root, this.delimiter), this.rootIdentifier, ]; } toString() { return resolveOneOrMoreStr(this.getKeyPrefixArray(), this.delimiter); } create(key) { this.validate(key); return new Key({ key, delimiter: this.delimiter, prefixArr: this.getKeyPrefixArray(), }); } } //# sourceMappingURL=namespace.js.map