wacom 21.1.21 → 21.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"wacom.mjs","sources":["../../../projects/wacom/src/interfaces/config.interface.ts","../../../projects/wacom/src/interfaces/http.interface.ts","../../../projects/wacom/src/interfaces/network.interface.ts","../../../projects/wacom/src/meta/meta.const.ts","../../../projects/wacom/src/meta/meta.service.ts","../../../projects/wacom/src/meta/meta.guard.ts","../../../projects/wacom/src/services/core.service.ts","../../../projects/wacom/src/crud/crud.component.ts","../../../projects/wacom/src/directives/click-outside.directive.ts","../../../projects/wacom/src/directives/manual-disabled.directive.ts","../../../projects/wacom/src/directives/manual-name.directive.ts","../../../projects/wacom/src/directives/manual-readonly.directive.ts","../../../projects/wacom/src/directives/manual-type.directive.ts","../../../projects/wacom/src/pipes/arr.pipe.ts","../../../projects/wacom/src/pipes/mongodate.pipe.ts","../../../projects/wacom/src/pipes/number.pipe.ts","../../../projects/wacom/src/pipes/pagination.pipe.ts","../../../projects/wacom/src/pipes/safe.pipe.ts","../../../projects/wacom/src/pipes/search.pipe.ts","../../../projects/wacom/src/pipes/splice.pipe.ts","../../../projects/wacom/src/pipes/split.pipe.ts","../../../projects/wacom/src/services/emitter.service.ts","../../../projects/wacom/src/services/http.service.ts","../../../projects/wacom/src/services/network.service.ts","../../../projects/wacom/src/services/store.service.ts","../../../projects/wacom/src/crud/crud.service.ts","../../../projects/wacom/src/services/dom.service.ts","../../../projects/wacom/src/services/rtc.service.ts","../../../projects/wacom/src/services/socket.service.ts","../../../projects/wacom/src/services/time.service.ts","../../../projects/wacom/src/services/util.service.ts","../../../projects/wacom/src/theme/theme.service.ts","../../../projects/wacom/src/provide-wacom.ts","../../../projects/wacom/src/wacom.module.ts","../../../projects/wacom/public-api.ts","../../../projects/wacom/wacom.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { MetaConfig } from '../meta/meta.interface';\r\nimport { HttpConfig } from './http.interface';\r\nimport { NetworkConfig } from './network.interface';\r\nimport { StoreConfig } from './store.interface';\r\n\r\n/**\r\n * Root configuration object used to initialize the library.\r\n * Each property allows consumers to override the default\r\n * behavior of the corresponding service.\r\n */\r\nexport interface Config {\r\n\t/** Options for the key‑value storage service. */\r\n\tstore?: StoreConfig;\r\n\t/** Defaults applied to page metadata handling. */\r\n\tmeta?: MetaConfig;\r\n\t/** Base HTTP settings such as API URL and headers. */\r\n\thttp?: HttpConfig;\r\n\t/** Optional socket connection configuration. */\r\n\tsocket?: any;\r\n\t/** Raw Socket.IO client instance, if used. */\r\n\tio?: any;\r\n\tnetwork?: NetworkConfig;\r\n}\r\n\r\nexport const CONFIG_TOKEN = new InjectionToken<Config>('config');\r\n\r\nexport const DEFAULT_CONFIG: Config = {\r\n\tstore: {\r\n\t\tprefix: 'waStore',\r\n\t},\r\n\tmeta: {\r\n\t\tuseTitleSuffix: false,\r\n\t\tdefaults: { links: {} },\r\n\t},\r\n\tsocket: false,\r\n\thttp: {\r\n\t\turl: '',\r\n\t\theaders: {},\r\n\t},\r\n};\r\n","export type HttpHeaderType = string | number | (string | number)[];\r\n\r\n/**\r\n * Configuration values used by the HTTP service when\r\n * issuing requests to a backend API.\r\n */\r\nexport interface HttpConfig {\r\n\t/** Map of default headers appended to each request. */\r\n\theaders?: Record<string, HttpHeaderType>;\r\n\t/** Base URL for all HTTP requests. */\r\n\turl?: string;\r\n}\r\n\r\nexport const DEFAULT_HTTP_CONFIG: HttpConfig = {\r\n\theaders: {},\r\n\turl: '',\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport type NetworkStatus = 'good' | 'poor' | 'none';\r\n\r\nexport interface NetworkConfig {\r\n\t/** Ordered list of endpoints to probe (first that succeeds wins). */\r\n\tendpoints: string[];\r\n\t/** Periodic re-check interval (ms). */\r\n\tintervalMs: number;\r\n\t/** Per-request timeout (ms). */\r\n\ttimeoutMs: number;\r\n\t/** Latency threshold (ms) to classify as \"good\". */\r\n\tgoodLatencyMs: number;\r\n\t/** Consecutive failures to flip status to \"none\". */\r\n\tmaxConsecutiveFails: number;\r\n}\r\n\r\nexport const DEFAULT_NETWORK_CONFIG: NetworkConfig = {\r\n\tendpoints: [\r\n\t\t'https://api.webart.work/status',\r\n\t\t// Opaque but useful reachability fallbacks:\r\n\t\t'https://www.google.com/generate_204',\r\n\t\t'https://www.gstatic.com/generate_204',\r\n\t\t'https://www.cloudflare.com/cdn-cgi/trace',\r\n\t],\r\n\tintervalMs: 30_000,\r\n\ttimeoutMs: 2_500,\r\n\tgoodLatencyMs: 300,\r\n\tmaxConsecutiveFails: 3,\r\n};\r\n\r\nexport const NETWORK_CONFIG = new InjectionToken<NetworkConfig>(\r\n\t'NETWORK_CONFIG',\r\n\t{\r\n\t\tfactory: () => DEFAULT_NETWORK_CONFIG,\r\n\t},\r\n);\r\n","/**\r\n * Utility helpers for meta management.\r\n *\r\n * We intentionally treat `undefined` as \"missing\" and everything else as \"provided\".\r\n * This lets callers pass empty strings to intentionally clear a value:\r\n * - isDefined(undefined) -> false (use defaults)\r\n * - isDefined('') -> true (explicitly set empty string)\r\n * - isDefined(null) -> true (explicitly provided, will stringify if used)\r\n */\r\nexport const isDefined = (val: unknown): val is Exclude<unknown, undefined> =>\r\n\ttypeof val !== 'undefined';\r\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n\tinject,\r\n} from '@angular/core';\r\nimport { Meta, Title } from '@angular/platform-browser';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { filter } from 'rxjs/operators';\r\nimport {\r\n\tCONFIG_TOKEN,\r\n\tConfig,\r\n\tDEFAULT_CONFIG,\r\n} from '../interfaces/config.interface';\r\nimport { isDefined } from './meta.const';\r\nimport { MetaConfig, MetaDefaults, MetaPage } from './meta.interface';\r\nimport { TagAttr } from './meta.type';\r\n\r\n/**\r\n * Centralized page meta management for SPA navigation.\r\n *\r\n * Goals:\r\n * - Static SEO pages: route-driven meta via `data.meta`\r\n * - Dynamic/id pages: manual meta via `applyMeta(...)`\r\n * - No stale meta: tags set for one page must not \"leak\" to another page\r\n * - Simple inputs: only title/description/image/index/robots (everything else auto-generated)\r\n * - Links handled separately: `setLink({ canonical: '...' })` updates, never duplicates\r\n *\r\n * Generated tags:\r\n * - Title:\r\n * - <title>\r\n * - <meta itemprop=\"name\" ...>\r\n * - <meta property=\"og:title\" ...>\r\n * - <meta name=\"twitter:title\" ...>\r\n * - Description:\r\n * - <meta name=\"description\" ...>\r\n * - <meta itemprop=\"description\" ...>\r\n * - <meta property=\"og:description\" ...>\r\n * - <meta name=\"twitter:description\" ...>\r\n * - Image:\r\n * - <meta itemprop=\"image\" ...>\r\n * - <meta property=\"og:image\" ...>\r\n * - <meta name=\"twitter:image:src\" ...>\r\n * - Robots:\r\n * - <meta name=\"robots\" ...> (derived from `robots` or `index`)\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class MetaService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\t/**\r\n\t * Effective configuration (from CONFIG_TOKEN + DEFAULT_CONFIG fallback).\r\n\t */\r\n\tprivate _metaConfig: MetaConfig;\r\n\r\n\t/**\r\n\t * Meta tags that are \"owned\" by this service.\r\n\t * We remove these on every `applyMeta()` so stale tags never survive SPA navigation.\r\n\t *\r\n\t * Stored as selectors compatible with Angular Meta.removeTag(), e.g.:\r\n\t * - name=\"description\"\r\n\t * - property=\"og:title\"\r\n\t * - itemprop=\"image\"\r\n\t */\r\n\tprivate _managedTagSelectors = new Set<string>();\r\n\r\n\t/**\r\n\t * Link rels that are managed by this service.\r\n\t * Used to update links without duplicates and optionally remove them via resetLinks().\r\n\t */\r\n\tprivate _managedLinkRels = new Set<string>();\r\n\r\n\tconstructor(\r\n\t\t@Inject(CONFIG_TOKEN) @Optional() private _config: Config,\r\n\t\tprivate _router: Router,\r\n\t\tprivate _activatedRoute: ActivatedRoute,\r\n\t\tprivate _meta: Meta,\r\n\t\tprivate _titleService: Title,\r\n\t) {\r\n\t\tthis._config = this._config || DEFAULT_CONFIG;\r\n\t\tthis._metaConfig = this._config.meta || {};\r\n\r\n\t\t// Recommended default: keep meta in sync with route changes automatically.\r\n\t\tconst applyFromRoutes =\r\n\t\t\t!isDefined(this._metaConfig.applyFromRoutes) ||\r\n\t\t\t!!this._metaConfig.applyFromRoutes;\r\n\r\n\t\tif (applyFromRoutes) {\r\n\t\t\tthis._router.events\r\n\t\t\t\t.pipe(filter((e) => e instanceof NavigationEnd))\r\n\t\t\t\t.subscribe(() => {\r\n\t\t\t\t\tconst page = this._readDeepestRouteMeta();\r\n\t\t\t\t\tif (page) this.applyMeta(page);\r\n\t\t\t\t\telse this.reset();\r\n\t\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Merge and set defaults.\r\n\t *\r\n\t * Defaults are used when a page does not provide a given field.\r\n\t * This affects:\r\n\t * - applyMeta() fallbacks\r\n\t * - reset()\r\n\t */\r\n\tsetDefaults(defaults: MetaDefaults): void {\r\n\t\tthis._metaConfig.defaults = {\r\n\t\t\t...(this._metaConfig.defaults || {}),\r\n\t\t\t...defaults,\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Apply metadata for the current page.\r\n\t *\r\n\t * Use cases:\r\n\t * - Static SEO pages: route data (`data.meta`) when applyFromRoutes = true\r\n\t * - Dynamic / id pages: call manually after loading entity data\r\n\t *\r\n\t * Rules:\r\n\t * 1) remove tags previously managed by this service\r\n\t * 2) start from defaults\r\n\t * 3) override with page values\r\n\t * 4) generate OG/Twitter/itemprop variants\r\n\t */\r\n\tapplyMeta(page: MetaPage = {}): void {\r\n\t\tif (page.disableUpdate) return;\r\n\r\n\t\t// 1) Clean managed tags to prevent leaks between pages.\r\n\t\tthis._removeManagedTags();\r\n\r\n\t\t// 2) Resolve values with defaults.\r\n\t\tconst defaults = this._metaConfig.defaults || {};\r\n\r\n\t\tconst title = this._resolveTitle(page, defaults);\r\n\t\tconst description = this._resolveValue(\r\n\t\t\tpage.description,\r\n\t\t\tdefaults.description,\r\n\t\t);\r\n\t\tconst image = this._resolveValue(page.image, defaults.image);\r\n\t\tconst robots = this._resolveRobots(page, defaults);\r\n\r\n\t\t// 3) Apply generated tags.\r\n\t\tthis._setTitleTriplet(title);\r\n\t\tthis._setDescriptionTriplet(description);\r\n\t\tthis._setImageTriplet(image);\r\n\r\n\t\t// 4) Robots support (index/noindex).\r\n\t\tif (isDefined(robots)) {\r\n\t\t\tthis._updateTag('robots', robots as string, 'name');\r\n\t\t}\r\n\r\n\t\t// Links are intentionally not applied here.\r\n\t\t// Canonical strategy depends on your routing/domain policy, so use setLink(...) explicitly.\r\n\t}\r\n\r\n\t/**\r\n\t * Reset page meta back to defaults.\r\n\t *\r\n\t * Removes all managed tags and re-applies defaults-only meta.\r\n\t */\r\n\treset(): void {\r\n\t\tthis.applyMeta({});\r\n\t}\r\n\r\n\t/**\r\n\t * Sets link tags (canonical, alternate, etc.) without duplicates.\r\n\t *\r\n\t * For each rel:\r\n\t * - if link[rel=rel] exists -> update href\r\n\t * - else -> create it\r\n\t * - if duplicates exist -> remove extras\r\n\t */\r\n\tsetLink(links: Record<string, string>): void {\r\n\t\tif (!this._isBrowser) return;\r\n\t\tif (!links || !Object.keys(links).length) return;\r\n\r\n\t\tfor (const rel of Object.keys(links)) {\r\n\t\t\tconst href = links[rel];\r\n\r\n\t\t\tconst all = Array.from(\r\n\t\t\t\tthis._doc.head.querySelectorAll<HTMLLinkElement>(\r\n\t\t\t\t\t`link[rel=\"${rel}\"]`,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\r\n\t\t\tlet link = all[0];\r\n\t\t\tif (!link) {\r\n\t\t\t\tlink = this._doc.createElement('link');\r\n\t\t\t\tlink.setAttribute('rel', rel);\r\n\t\t\t\tthis._doc.head.appendChild(link);\r\n\t\t\t} else if (all.length > 1) {\r\n\t\t\t\tfor (let i = 1; i < all.length; i++) all[i].remove();\r\n\t\t\t}\r\n\r\n\t\t\tlink.setAttribute('href', href);\r\n\t\t\tthis._managedLinkRels.add(rel);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Removes link tags that were managed by this service via setLink().\r\n\t *\r\n\t * Note:\r\n\t * - Not called by reset() because canonical often should persist for the whole app shell.\r\n\t * - Call explicitly if you want to remove canonical/alternate links.\r\n\t */\r\n\tresetLinks(): void {\r\n\t\tif (!this._isBrowser) return;\r\n\t\tfor (const rel of this._managedLinkRels) {\r\n\t\t\tconst all = Array.from(\r\n\t\t\t\tthis._doc.head.querySelectorAll<HTMLLinkElement>(\r\n\t\t\t\t\t`link[rel=\"${rel}\"]`,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t\tall.forEach((it) => it.remove());\r\n\t\t}\r\n\t\tthis._managedLinkRels.clear();\r\n\t}\r\n\r\n\t// ---------------------------------------------------------------------------\r\n\t// Internals: route meta extraction\r\n\t// ---------------------------------------------------------------------------\r\n\r\n\t/**\r\n\t * Reads `data.meta` from the deepest activated route.\r\n\t * This matches the common Angular pattern where child routes override parent routes.\r\n\t */\r\n\tprivate _readDeepestRouteMeta(): MetaPage | null {\r\n\t\tlet route: ActivatedRoute | null = this._activatedRoute;\r\n\r\n\t\twhile (route?.firstChild) route = route.firstChild;\r\n\r\n\t\tconst data: any = route?.snapshot?.data;\r\n\t\tconst meta = data && data['meta'];\r\n\r\n\t\treturn meta || null;\r\n\t}\r\n\r\n\t// ---------------------------------------------------------------------------\r\n\t// Internals: resolving values\r\n\t// ---------------------------------------------------------------------------\r\n\r\n\t/**\r\n\t * Resolves title with optional suffix behavior.\r\n\t */\r\n\tprivate _resolveTitle(page: MetaPage, defaults: MetaDefaults): string {\r\n\t\tlet titleContent = this._resolveValue(page.title, defaults.title) || '';\r\n\r\n\t\tif (this._metaConfig.useTitleSuffix) {\r\n\t\t\tconst suffix = isDefined(page.titleSuffix)\r\n\t\t\t\t? page.titleSuffix\r\n\t\t\t\t: defaults.titleSuffix;\r\n\t\t\ttitleContent += suffix || '';\r\n\t\t}\r\n\r\n\t\treturn titleContent;\r\n\t}\r\n\r\n\t/**\r\n\t * Resolves robots value.\r\n\t *\r\n\t * Precedence:\r\n\t * - explicit robots (page) > explicit robots (defaults)\r\n\t * - index flag (page/defaults) -> generates \"index, follow\" or \"noindex, follow\"\r\n\t * - undefined -> no robots tag set by this service\r\n\t */\r\n\tprivate _resolveRobots(\r\n\t\tpage: MetaPage,\r\n\t\tdefaults: MetaDefaults,\r\n\t): string | undefined {\r\n\t\tif (isDefined(page.robots)) return (page.robots || '') + '';\r\n\t\tif (isDefined(defaults.robots)) return (defaults.robots || '') + '';\r\n\r\n\t\tconst index = isDefined(page.index) ? page.index : defaults.index;\r\n\t\tif (!isDefined(index)) return undefined;\r\n\r\n\t\treturn index ? 'index, follow' : 'noindex, follow';\r\n\t}\r\n\r\n\t/**\r\n\t * Resolves value with \"undefined means missing\" semantics.\r\n\t * - undefined -> fallback\r\n\t * - empty string -> explicit empty\r\n\t */\r\n\tprivate _resolveValue(val?: string, fallback?: string): string | undefined {\r\n\t\tif (isDefined(val)) return (val || '') + '';\r\n\t\tif (isDefined(fallback)) return (fallback || '') + '';\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t// ---------------------------------------------------------------------------\r\n\t// Internals: generated tag groups\r\n\t// ---------------------------------------------------------------------------\r\n\r\n\t/**\r\n\t * Applies title to:\r\n\t * - document <title>\r\n\t * - itemprop=\"name\"\r\n\t * - og:title\r\n\t * - twitter:title\r\n\t */\r\n\tprivate _setTitleTriplet(title: string): void {\r\n\t\tthis._titleService.setTitle(title);\r\n\r\n\t\tthis._updateTag('og:title', title, 'property');\r\n\t\tthis._updateTag('twitter:title', title, 'name');\r\n\t\tthis._updateTag('name', title, 'itemprop');\r\n\t}\r\n\r\n\t/**\r\n\t * Applies description to:\r\n\t * - name=\"description\"\r\n\t * - itemprop=\"description\"\r\n\t * - og:description\r\n\t * - twitter:description\r\n\t */\r\n\tprivate _setDescriptionTriplet(description?: string): void {\r\n\t\tif (!isDefined(description)) return;\r\n\r\n\t\tconst content = description as string;\r\n\r\n\t\tthis._updateTag('description', content, 'name');\r\n\t\tthis._updateTag('og:description', content, 'property');\r\n\t\tthis._updateTag('twitter:description', content, 'name');\r\n\t\tthis._updateTag('description', content, 'itemprop');\r\n\t}\r\n\r\n\t/**\r\n\t * Applies image to:\r\n\t * - itemprop=\"image\"\r\n\t * - og:image\r\n\t * - twitter:image:src\r\n\t */\r\n\tprivate _setImageTriplet(image?: string): void {\r\n\t\tif (!isDefined(image)) return;\r\n\r\n\t\tconst content = image as string;\r\n\r\n\t\tthis._updateTag('og:image', content, 'property');\r\n\t\tthis._updateTag('twitter:image:src', content, 'name');\r\n\t\tthis._updateTag('image', content, 'itemprop');\r\n\t}\r\n\r\n\t// ---------------------------------------------------------------------------\r\n\t// Internals: tag update + ownership tracking\r\n\t// ---------------------------------------------------------------------------\r\n\r\n\t/**\r\n\t * Update a meta tag with deterministic selector.\r\n\t *\r\n\t * Why selector:\r\n\t * - prevents duplicates\r\n\t * - ensures updates target the correct attribute variant (name/property/itemprop)\r\n\t *\r\n\t * Ownership tracking:\r\n\t * - Every selector we touch is remembered in managedTagSelectors.\r\n\t * - On next apply/reset we remove them to avoid stale meta across pages.\r\n\t */\r\n\tprivate _updateTag(key: string, content: string, attr: TagAttr): void {\r\n\t\tconst selector =\r\n\t\t\tattr === 'itemprop' ? `itemprop=\"${key}\"` : `${attr}=\"${key}\"`;\r\n\r\n\t\tconst tagDef =\r\n\t\t\tattr === 'itemprop'\r\n\t\t\t\t? ({ itemprop: key, content } as any)\r\n\t\t\t\t: ({ [attr]: key, content } as any);\r\n\r\n\t\tthis._meta.updateTag(tagDef, selector);\r\n\t\tthis._managedTagSelectors.add(selector);\r\n\t}\r\n\r\n\t/**\r\n\t * Remove all meta tags managed by this service.\r\n\t * Called on each apply/reset to prevent tags from a previous page persisting.\r\n\t */\r\n\tprivate _removeManagedTags(): void {\r\n\t\tfor (const selector of this._managedTagSelectors) {\r\n\t\t\tthis._meta.removeTag(selector);\r\n\t\t}\r\n\t\tthis._managedTagSelectors.clear();\r\n\t}\r\n\r\n\tprivate _doc = inject(DOCUMENT);\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot } from '@angular/router';\r\nimport { MetaPage } from './meta.interface';\r\nimport { MetaService } from './meta.service';\r\n\r\n/**\r\n * Applies route-level metadata from `route.data.meta`.\r\n *\r\n * Usage:\r\n * - Add this guard to routes that define `data.meta` to ensure meta is applied\r\n * as early as possible during activation.\r\n *\r\n * Note:\r\n * - If `MetaConfig.applyFromRoutes` is enabled (recommended), the service will\r\n * also apply route meta automatically on NavigationEnd — even if this guard\r\n * is missing from some route definitions.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class MetaGuard {\r\n\tconstructor(private _metaService: MetaService) {}\r\n\r\n\tcanActivate(route: ActivatedRouteSnapshot): boolean {\r\n\t\tconst pageMeta =\r\n\t\t\t(route.data && (route.data['meta'] as MetaPage)) || null;\r\n\r\n\t\tif (pageMeta) this._metaService.applyMeta(pageMeta);\r\n\t\telse this._metaService.reset();\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Core utilities and helpers for the Wacom app\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInjectable,\r\n\tPLATFORM_ID,\r\n\tSignal,\r\n\tWritableSignal,\r\n\tinject,\r\n\tsignal,\r\n} from '@angular/core';\r\n\r\n// Add capitalize method to String prototype if it doesn't already exist\r\nif (!String.prototype.capitalize) {\r\n\tString.prototype.capitalize = function (): string {\r\n\t\tif (this.length > 0) {\r\n\t\t\treturn this.charAt(0).toUpperCase() + this.slice(1).toLowerCase();\r\n\t\t}\r\n\t\treturn '';\r\n\t};\r\n}\r\n\r\n// Extend the String interface to include the new method\r\ndeclare global {\r\n\tinterface String {\r\n\t\tcapitalize(): string;\r\n\t}\r\n}\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class CoreService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tdeviceID = '';\r\n\r\n\tconstructor() {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tconst stored = localStorage.getItem('deviceID');\r\n\t\t\tthis.deviceID =\r\n\t\t\t\tstored ||\r\n\t\t\t\t(typeof crypto?.randomUUID === 'function'\r\n\t\t\t\t\t? crypto.randomUUID()\r\n\t\t\t\t\t: this.UUID());\r\n\r\n\t\t\tlocalStorage.setItem('deviceID', this.deviceID);\r\n\r\n\t\t\tthis.detectDevice();\r\n\t\t} else {\r\n\t\t\tthis.deviceID = this.UUID();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Generates a UUID (Universally Unique Identifier) version 4.\r\n\t *\r\n\t * This implementation uses `Math.random()` to generate random values,\r\n\t * making it suitable for general-purpose identifiers, but **not** for\r\n\t * cryptographic or security-sensitive use cases.\r\n\t *\r\n\t * The format follows the UUID v4 standard: `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`\r\n\t * where:\r\n\t * - `x` is a random hexadecimal digit (0–f)\r\n\t * - `4` indicates UUID version 4\r\n\t * - `y` is one of 8, 9, A, or B\r\n\t *\r\n\t * Example: `f47ac10b-58cc-4372-a567-0e02b2c3d479`\r\n\t *\r\n\t * @returns A string containing a UUID v4.\r\n\t */\r\n\tUUID(): string {\r\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\r\n\t\t\t/[xy]/g,\r\n\t\t\t(c: string) => {\r\n\t\t\t\tconst r = (Math.random() * 16) | 0;\r\n\t\t\t\tconst v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n\t\t\t\treturn v.toString(16);\r\n\t\t\t},\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts an object to an array. Optionally holds keys instead of values.\r\n\t *\r\n\t * @param {any} obj - The object to be converted.\r\n\t * @param {boolean} [holder=false] - If true, the keys will be held in the array; otherwise, the values will be held.\r\n\t * @returns {any[]} The resulting array.\r\n\t */\r\n\tota(obj: any, holder: boolean = false): any[] {\r\n\t\tif (Array.isArray(obj)) return obj;\r\n\t\tif (typeof obj !== 'object' || obj === null) return [];\r\n\t\tconst arr = [];\r\n\t\tfor (const each in obj) {\r\n\t\t\tif (\r\n\t\t\t\tobj.hasOwnProperty(each) &&\r\n\t\t\t\t(obj[each] ||\r\n\t\t\t\t\ttypeof obj[each] === 'number' ||\r\n\t\t\t\t\ttypeof obj[each] === 'boolean')\r\n\t\t\t) {\r\n\t\t\t\tif (holder) {\r\n\t\t\t\t\tarr.push(each);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tarr.push(obj[each]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn arr;\r\n\t}\r\n\r\n\t/**\r\n\t * Removes elements from `fromArray` that are present in `removeArray` based on a comparison field.\r\n\t *\r\n\t * @param {any[]} removeArray - The array of elements to remove.\r\n\t * @param {any[]} fromArray - The array from which to remove elements.\r\n\t * @param {string} [compareField='_id'] - The field to use for comparison.\r\n\t * @returns {any[]} The modified `fromArray` with elements removed.\r\n\t */\r\n\tsplice(\r\n\t\tremoveArray: any[],\r\n\t\tfromArray: any[],\r\n\t\tcompareField: string = '_id',\r\n\t): any[] {\r\n\t\tif (!Array.isArray(removeArray) || !Array.isArray(fromArray)) {\r\n\t\t\treturn fromArray;\r\n\t\t}\r\n\r\n\t\tconst removeSet = new Set(\r\n\t\t\tremoveArray.map((item) => item[compareField]),\r\n\t\t);\r\n\t\treturn fromArray.filter((item) => !removeSet.has(item[compareField]));\r\n\t}\r\n\r\n\t/**\r\n\t * Unites multiple _id values into a single unique _id.\r\n\t * The resulting _id is unique regardless of the order of the input _id values.\r\n\t *\r\n\t * @param {...string[]} args - The _id values to be united.\r\n\t * @returns {string} The unique combined _id.\r\n\t */\r\n\tids2id(...args: string[]): string {\r\n\t\targs.sort((a, b) => {\r\n\t\t\tif (\r\n\t\t\t\tNumber(a.toString().substring(0, 8)) >\r\n\t\t\t\tNumber(b.toString().substring(0, 8))\r\n\t\t\t) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\treturn -1;\r\n\t\t});\r\n\r\n\t\treturn args.join();\r\n\t}\r\n\r\n\t// After While\r\n\tprivate _afterWhile: Record<string, number> = {};\r\n\t/**\r\n\t * Delays the execution of a callback function for a specified amount of time.\r\n\t * If called again within that time, the timer resets.\r\n\t *\r\n\t * @param {string | object | (() => void)} doc - A unique identifier for the timer, an object to host the timer, or the callback function.\r\n\t * @param {() => void} [cb] - The callback function to execute after the delay.\r\n\t * @param {number} [time=1000] - The delay time in milliseconds.\r\n\t */\r\n\tafterWhile(\r\n\t\tdoc: string | object | (() => void),\r\n\t\tcb?: () => void,\r\n\t\ttime: number = 1000,\r\n\t): void {\r\n\t\tif (typeof doc === 'function') {\r\n\t\t\tcb = doc as () => void;\r\n\t\t\tdoc = 'common';\r\n\t\t}\r\n\r\n\t\tif (typeof cb === 'function' && typeof time === 'number') {\r\n\t\t\tif (typeof doc === 'string') {\r\n\t\t\t\tclearTimeout(this._afterWhile[doc]);\r\n\t\t\t\tthis._afterWhile[doc] = setTimeout(cb, time);\r\n\t\t\t} else if (typeof doc === 'object') {\r\n\t\t\t\tclearTimeout((doc as { __afterWhile: number }).__afterWhile);\r\n\t\t\t\t(doc as { __afterWhile: number }).__afterWhile = setTimeout(\r\n\t\t\t\t\tcb,\r\n\t\t\t\t\ttime,\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.warn('badly configured after while');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Recursively copies properties from one object to another.\r\n\t * Handles nested objects, arrays, and Date instances appropriately.\r\n\t *\r\n\t * @param from - The source object from which properties are copied.\r\n\t * @param to - The target object to which properties are copied.\r\n\t */\r\n\tcopy(from: any, to: any) {\r\n\t\tfor (const each in from) {\r\n\t\t\tif (\r\n\t\t\t\ttypeof from[each] !== 'object' ||\r\n\t\t\t\tfrom[each] instanceof Date ||\r\n\t\t\t\tArray.isArray(from[each]) ||\r\n\t\t\t\tfrom[each] === null\r\n\t\t\t) {\r\n\t\t\t\tto[each] = from[each];\r\n\t\t\t} else {\r\n\t\t\t\tif (\r\n\t\t\t\t\ttypeof to[each] !== 'object' ||\r\n\t\t\t\t\tto[each] instanceof Date ||\r\n\t\t\t\t\tArray.isArray(to[each]) ||\r\n\t\t\t\t\tto[each] === null\r\n\t\t\t\t) {\r\n\t\t\t\t\tto[each] = {};\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.copy(from[each], to[each]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Device management\r\n\tdevice = '';\r\n\t/**\r\n\t * Detects the device type based on the user agent.\r\n\t */\r\n\tdetectDevice(): void {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tconst userAgent =\r\n\t\t\tnavigator.userAgent || navigator.vendor || (window as any).opera;\r\n\t\tif (/windows phone/i.test(userAgent)) {\r\n\t\t\tthis.device = 'Windows Phone';\r\n\t\t} else if (/android/i.test(userAgent)) {\r\n\t\t\tthis.device = 'Android';\r\n\t\t} else if (\r\n\t\t\t/iPad|iPhone|iPod/.test(userAgent) &&\r\n\t\t\t!(window as any).MSStream\r\n\t\t) {\r\n\t\t\tthis.device = 'iOS';\r\n\t\t} else {\r\n\t\t\tthis.device = 'Web';\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is a mobile device.\r\n\t * @returns {boolean} - Returns true if the device is a mobile device.\r\n\t */\r\n\tisMobile(): boolean {\r\n\t\treturn (\r\n\t\t\tthis.device === 'Windows Phone' ||\r\n\t\t\tthis.device === 'Android' ||\r\n\t\t\tthis.device === 'iOS'\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is a tablet.\r\n\t * @returns {boolean} - Returns true if the device is a tablet.\r\n\t */\r\n\tisTablet(): boolean {\r\n\t\tif (!this._isBrowser) return false;\r\n\r\n\t\treturn this.device === 'iOS' && /iPad/.test(navigator.userAgent);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is a web browser.\r\n\t * @returns {boolean} - Returns true if the device is a web browser.\r\n\t */\r\n\tisWeb(): boolean {\r\n\t\treturn this.device === 'Web';\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is an Android device.\r\n\t * @returns {boolean} - Returns true if the device is an Android device.\r\n\t */\r\n\tisAndroid(): boolean {\r\n\t\treturn this.device === 'Android';\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is an iOS device.\r\n\t * @returns {boolean} - Returns true if the device is an iOS device.\r\n\t */\r\n\tisIos(): boolean {\r\n\t\treturn this.device === 'iOS';\r\n\t}\r\n\r\n\t// Version management\r\n\tversion = '1.0.0';\r\n\r\n\tappVersion = '';\r\n\r\n\tdateVersion = '';\r\n\r\n\t/**\r\n\t * Sets the combined version string based on appVersion and dateVersion.\r\n\t */\r\n\tsetVersion(): void {\r\n\t\tthis.version = this.appVersion || '';\r\n\r\n\t\tthis.version += this.version && this.dateVersion ? ' ' : '';\r\n\r\n\t\tthis.version += this.dateVersion || '';\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the app version and updates the combined version string.\r\n\t *\r\n\t * @param {string} appVersion - The application version to set.\r\n\t */\r\n\tsetAppVersion(appVersion: string): void {\r\n\t\tthis.appVersion = appVersion;\r\n\r\n\t\tthis.setVersion();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the date version and updates the combined version string.\r\n\t *\r\n\t * @param {string} dateVersion - The date version to set.\r\n\t */\r\n\tsetDateVersion(dateVersion: string): void {\r\n\t\tthis.dateVersion = dateVersion;\r\n\r\n\t\tthis.setVersion();\r\n\t}\r\n\r\n\t// Locking management\r\n\tprivate _locked: Record<string, boolean> = {};\r\n\tprivate _unlockResolvers: Record<string, (() => void)[]> = {};\r\n\r\n\t/**\r\n\t * Locks a resource to prevent concurrent access.\r\n\t * @param which - The resource to lock, identified by a string.\r\n\t */\r\n\tlock(which: string): void {\r\n\t\tthis._locked[which] = true;\r\n\r\n\t\tif (!this._unlockResolvers[which]) {\r\n\t\t\tthis._unlockResolvers[which] = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Unlocks a resource, allowing access.\r\n\t * @param which - The resource to unlock, identified by a string.\r\n\t */\r\n\tunlock(which: string): void {\r\n\t\tthis._locked[which] = false;\r\n\r\n\t\tif (this._unlockResolvers[which]) {\r\n\t\t\tthis._unlockResolvers[which].forEach((resolve) => resolve());\r\n\r\n\t\t\tthis._unlockResolvers[which] = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a Promise that resolves when the specified resource is unlocked.\r\n\t * @param which - The resource to watch for unlocking, identified by a string.\r\n\t * @returns A Promise that resolves when the resource is unlocked.\r\n\t */\r\n\tonUnlock(which: string): Promise<void> {\r\n\t\tif (!this._locked[which]) {\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tif (!this._unlockResolvers[which]) {\r\n\t\t\t\tthis._unlockResolvers[which] = [];\r\n\t\t\t}\r\n\r\n\t\t\tthis._unlockResolvers[which].push(resolve);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a resource is locked.\r\n\t * @param which - The resource to check, identified by a string.\r\n\t * @returns True if the resource is locked, false otherwise.\r\n\t */\r\n\tlocked(which: string): boolean {\r\n\t\treturn !!this._locked[which];\r\n\t}\r\n\r\n\t// Angular Signals //\r\n\t/**\r\n\t * Converts a plain object into a signal-wrapped object.\r\n\t * Optionally wraps specific fields of the object as individual signals,\r\n\t * and merges them into the returned signal for fine-grained reactivity.\r\n\t *\r\n\t * @template Document - The type of the object being wrapped.\r\n\t * @param {Document} document - The plain object to wrap into a signal.\r\n\t * @param {Record<string, (doc: Document) => unknown>} [signalFields={}] -\r\n\t * Optional map where each key is a field name and the value is a function\r\n\t * to extract the initial value for that field. These fields will be wrapped\r\n\t * as separate signals and embedded in the returned object.\r\n\t *\r\n\t * @returns {WritableSignal<Document>} A signal-wrapped object, possibly containing\r\n\t * nested field signals for more granular control.\r\n\t *\r\n\t * @example\r\n\t * const user = { _id: '1', name: 'Alice', score: 42 };\r\n\t * const sig = toSignal(user, { score: (u) => u.score });\r\n\t * console.log(sig().name); // 'Alice'\r\n\t * console.log(sig().score()); // 42 — field is now a signal\r\n\t */\r\n\ttoSignal<Document>(\r\n\t\tdocument: Document,\r\n\t\tsignalFields: Record<string, (doc: Document) => unknown> = {},\r\n\t): WritableSignal<Document> {\r\n\t\tif (Object.keys(signalFields).length) {\r\n\t\t\tconst fields: Record<string, Signal<unknown>> = {};\r\n\r\n\t\t\tfor (const key in signalFields) {\r\n\t\t\t\tfields[key] = signal(signalFields[key](document));\r\n\t\t\t}\r\n\r\n\t\t\treturn signal({ ...document, ...fields });\r\n\t\t} else {\r\n\t\t\treturn signal(document);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Converts an array of objects into an array of Angular signals.\r\n\t * Optionally wraps specific fields of each object as individual signals.\r\n\t *\r\n\t * @template Document - The type of each object in the array.\r\n\t * @param {Document[]} arr - Array of plain objects to convert into signals.\r\n\t * @param {Record<string, (doc: Document) => unknown>} [signalFields={}] -\r\n\t * Optional map where keys are field names and values are functions that extract the initial value\r\n\t * from the object. These fields will be turned into separate signals.\r\n\t *\r\n\t * @returns {WritableSignal<Document>[]} An array where each item is a signal-wrapped object,\r\n\t * optionally with individual fields also wrapped in signals.\r\n\t *\r\n\t * @example\r\n\t * toSignalsArray(users, {\r\n\t * name: (u) => u.name,\r\n\t * score: (u) => u.score,\r\n\t * });\r\n\t */\r\n\ttoSignalsArray<Document>(\r\n\t\tarr: Document[],\r\n\t\tsignalFields: Record<string, (doc: Document) => unknown> = {},\r\n\t): WritableSignal<Document>[] {\r\n\t\treturn arr.map((obj) => this.toSignal(obj, signalFields));\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a new object to the signals array.\r\n\t * Optionally wraps specific fields of the object as individual signals before wrapping the whole object.\r\n\t *\r\n\t * @template Document - The type of the object being added.\r\n\t * @param {WritableSignal<Document>[]} signals - The signals array to append to.\r\n\t * @param {Document} item - The object to wrap and push as a signal.\r\n\t * @param {Record<string, (doc: Document) => unknown>} [signalFields={}] -\r\n\t * Optional map of fields to be wrapped as signals within the object.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tpushSignal<Document>(\r\n\t\tsignals: WritableSignal<Document>[],\r\n\t\titem: Document,\r\n\t\tsignalFields: Record<string, (doc: Document) => unknown> = {},\r\n\t): void {\r\n\t\tsignals.push(this.toSignal(item, signalFields));\r\n\t}\r\n\r\n\t/**\r\n\t * Removes the first signal from the array whose object's field matches the provided value.\r\n\t * @template Document\r\n\t * @param {WritableSignal<Document>[]} signals - The signals array to modify.\r\n\t * @param {unknown} value - The value to match.\r\n\t * @param {string} [field='_id'] - The object field to match against.\r\n\t * @returns {void}\r\n\t */\r\n\tremoveSignalByField<Document extends Record<string, unknown>>(\r\n\t\tsignals: WritableSignal<Document>[],\r\n\t\tvalue: unknown,\r\n\t\tfield: string = '_id',\r\n\t): void {\r\n\t\tconst idx = signals.findIndex((sig) => sig()[field] === value);\r\n\r\n\t\tif (idx > -1) signals.splice(idx, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a generic trackBy function for *ngFor, tracking by the specified object field.\r\n\t * @template Document\r\n\t * @param {string} field - The object field to use for tracking (e.g., '_id').\r\n\t * @returns {(index: number, sig: Signal<Document>) => unknown} TrackBy function for Angular.\r\n\t */\r\n\ttrackBySignalField<Document extends Record<string, unknown>>(\r\n\t\tfield: string,\r\n\t) {\r\n\t\treturn (_: number, sig: Signal<Document>) => sig()[field];\r\n\t}\r\n\r\n\t/**\r\n\t * Finds the first signal in the array whose object's field matches the provided value.\r\n\t * @template Document\r\n\t * @param {Signal<Document>[]} signals - Array of signals to search.\r\n\t * @param {unknown} value - The value to match.\r\n\t * @param {string} [field='_id'] - The object field to match against.\r\n\t * @returns {Signal<Document> | undefined} The found signal or undefined if not found.\r\n\t */\r\n\tfindSignalByField<Document extends Record<string, unknown>>(\r\n\t\tsignals: WritableSignal<Document>[],\r\n\t\tvalue: unknown,\r\n\t\tfield = '_id',\r\n\t): WritableSignal<Document> | undefined {\r\n\t\treturn signals.find(\r\n\t\t\t(sig) => sig()[field] === value,\r\n\t\t) as WritableSignal<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the first writable signal in the array whose object's field matches the provided value.\r\n\t * @template Document\r\n\t * @param {WritableSignal<Document>[]} signals - Array of writable signals to search.\r\n\t * @param {unknown} value - The value to match.\r\n\t * @param {(val: Document) => Document} updater - Function to produce the updated object.\r\n\t * @param {string} field - The object field to match against.\r\n\t * @returns {void}\r\n\t */\r\n\tupdateSignalByField<Document extends Record<string, unknown>>(\r\n\t\tsignals: WritableSignal<Document>[],\r\n\t\tvalue: unknown,\r\n\t\tupdater: (val: Document) => Document,\r\n\t\tfield: string,\r\n\t): void {\r\n\t\tconst sig = this.findSignalByField<Document>(\r\n\t\t\tsignals,\r\n\t\t\tvalue,\r\n\t\t\tfield,\r\n\t\t) as WritableSignal<Document>;\r\n\r\n\t\tif (sig) sig.update(updater);\r\n\t}\r\n}\r\n","import {\r\n\tChangeDetectorRef,\r\n\tinject,\r\n\tSignal,\r\n\tsignal,\r\n\tWritableSignal,\r\n} from '@angular/core';\r\nimport { firstValueFrom, take } from 'rxjs';\r\nimport { CoreService } from '../services/core.service';\r\nimport {\r\n\tCrudDocument,\r\n\tCrudOptions,\r\n\tCrudServiceInterface,\r\n\tTableConfig,\r\n} from './crud.interface';\r\n\r\n/**\r\n * Interface representing the shape of a form service used by the CrudComponent.\r\n * The consuming app must provide a service that implements this structure.\r\n */\r\ninterface FormServiceInterface<FormInterface> {\r\n\tmodal: <T>(\r\n\t\tform: FormInterface,\r\n\t\tbuttons?: unknown | unknown[],\r\n\t\tsubmition?: unknown,\r\n\t\tchange?: (update: T) => void | Promise<(update: T) => void>,\r\n\t\tmodalOptions?: unknown,\r\n\t) => Promise<T>;\r\n\tmodalDocs: <T>(docs: T[]) => Promise<T[]>;\r\n\tmodalUnique: <T>(collection: string, key: string, doc: T) => void;\r\n}\r\n\r\n/**\r\n * Abstract reusable base class for CRUD list views.\r\n * It encapsulates pagination, modals, and document handling logic.\r\n *\r\n * @template Service - A service implementing CrudServiceInterface for a specific document type\r\n * @template Document - The data model extending CrudDocument\r\n */\r\nexport abstract class CrudComponent<\r\n\tService extends CrudServiceInterface<Document>,\r\n\tDocument extends CrudDocument<Document>,\r\n\tFormInterface,\r\n> {\r\n\t/** Service responsible for data fetching, creating, updating, deleting */\r\n\tprotected crudService: Service;\r\n\r\n\t/** The array of documents currently loaded and shown */\r\n\tprotected documents = signal<Signal<Document>[]>([]);\r\n\r\n\t/** Form schema/config used by the FormService modals */\r\n\tprotected form: FormInterface;\r\n\r\n\t/** Current pagination page */\r\n\tprotected page = 1;\r\n\r\n\t/** CoreService handles timing and copying helpers */\r\n\tprivate __core = inject(CoreService);\r\n\r\n\t/** ChangeDetectorRef handles on push strategy */\r\n\tprivate __cdr = inject(ChangeDetectorRef);\r\n\r\n\t/** Internal reference to form service matching FormServiceInterface */\r\n\tprivate __form: FormServiceInterface<FormInterface>;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t *\r\n\t * @param formConfig - Object describing form title and its component structure\r\n\t * @param formService - Any service that conforms to FormServiceInterface (usually casted)\r\n\t * @param crudService - CRUD service implementing get/create/update/delete\r\n\t */\r\n\tconstructor(\r\n\t\tformConfig: unknown,\r\n\t\tformService: unknown,\r\n\t\tcrudService: Service,\r\n\t\tmodule = '',\r\n\t) {\r\n\t\tconst form = formConfig as FormInterface;\r\n\r\n\t\tthis.__form = formService as FormServiceInterface<FormInterface>;\r\n\r\n\t\tthis.form = form;\r\n\r\n\t\tthis.crudService = crudService;\r\n\r\n\t\tthis._module = module;\r\n\t}\r\n\r\n\tprotected localDocumentsFilter: (doc: Document) => boolean = () => true;\r\n\r\n\t/**\r\n\t * Loads documents for a given page.\r\n\t */\r\n\tprotected setDocuments(page = this.page, query = ''): Promise<void> {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tif (this.configType === 'server') {\r\n\t\t\t\tthis.page = page;\r\n\r\n\t\t\t\tthis.__core.afterWhile(\r\n\t\t\t\t\tthis,\r\n\t\t\t\t\t() => {\r\n\t\t\t\t\t\tthis.crudService\r\n\t\t\t\t\t\t\t.get({ page, query }, this.getOptions())\r\n\t\t\t\t\t\t\t.subscribe((docs: Document[]) => {\r\n\t\t\t\t\t\t\t\tthis.documents.update(() =>\r\n\t\t\t\t\t\t\t\t\t(docs || []).map((doc) =>\r\n\t\t\t\t\t\t\t\t\t\tthis.crudService.getSignal(doc),\r\n\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\t\tresolve();\r\n\r\n\t\t\t\t\t\t\t\tthis.__cdr.markForCheck();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\t250,\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tthis.documents.update(() =>\r\n\t\t\t\t\tthis.crudService\r\n\t\t\t\t\t\t.getDocs()\r\n\t\t\t\t\t\t.filter(this.localDocumentsFilter)\r\n\t\t\t\t\t\t.map((doc) => this.crudService.getSignal(doc)),\r\n\t\t\t\t);\r\n\r\n\t\t\t\tthis.crudService.loaded.pipe(take(1)).subscribe(() => {\r\n\t\t\t\t\tresolve();\r\n\r\n\t\t\t\t\tthis.__cdr.markForCheck();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/** Fields considered when performing bulk updates. */\r\n\tprotected updatableFields = ['_id', 'name', 'description', 'data'];\r\n\r\n\t/**\r\n\t * Clears temporary metadata before document creation.\r\n\t */\r\n\tprotected preCreate(doc: Document): void {\r\n\t\tdelete doc.__creating;\r\n\t}\r\n\r\n\t/**\r\n\t * Funciton which controls whether the create functionality is available.\r\n\t */\r\n\tprotected allowCreate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Funciton which controls whether the update and delete functionality is available.\r\n\t */\r\n\tprotected allowMutate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Funciton which controls whether the unique url functionality is available.\r\n\t */\r\n\tprotected allowUrl(): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/** Determines whether manual sorting controls are available. */\r\n\tprotected allowSort(): boolean {\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Funciton which prepare get crud options.\r\n\t */\r\n\tprotected getOptions(): CrudOptions<Document> {\r\n\t\treturn {} as CrudOptions<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Handles bulk creation and updating of documents.\r\n\t * In creation mode, adds new documents.\r\n\t * In update mode, syncs changes and deletes removed entries.\r\n\t */\r\n\tprotected bulkManagement(isCreateFlow = true): () => void {\r\n\t\treturn (): void => {\r\n\t\t\tthis.__form\r\n\t\t\t\t.modalDocs<Document>(\r\n\t\t\t\t\tisCreateFlow\r\n\t\t\t\t\t\t? []\r\n\t\t\t\t\t\t: this.documents().map(\r\n\t\t\t\t\t\t\t\t(obj: any) =>\r\n\t\t\t\t\t\t\t\t\tObject.fromEntries(\r\n\t\t\t\t\t\t\t\t\t\tthis.updatableFields.map((key) => [\r\n\t\t\t\t\t\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\t\t\t\t\t\tobj()[key],\r\n\t\t\t\t\t\t\t\t\t\t]),\r\n\t\t\t\t\t\t\t\t\t) as Document,\r\n\t\t\t\t\t\t\t),\r\n\t\t\t\t)\r\n\t\t\t\t.then(async (docs: Document[]) => {\r\n\t\t\t\t\tif (isCreateFlow) {\r\n\t\t\t\t\t\tfor (const doc of docs) {\r\n\t\t\t\t\t\t\tthis.preCreate(doc);\r\n\r\n\t\t\t\t\t\t\tawait firstValueFrom(this.crudService.create(doc));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfor (const document of this.documents()) {\r\n\t\t\t\t\t\t\tif (!docs.find((d) => d._id === document()._id)) {\r\n\t\t\t\t\t\t\t\tawait firstValueFrom(\r\n\t\t\t\t\t\t\t\t\tthis.crudService.delete(document()),\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor (const doc of docs) {\r\n\t\t\t\t\t\t\tconst local = this.documents().find(\r\n\t\t\t\t\t\t\t\t(document) => document()._id === doc._id,\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\tif (local) {\r\n\t\t\t\t\t\t\t\t(local as WritableSignal<Document>).update(\r\n\t\t\t\t\t\t\t\t\t(document) => {\r\n\t\t\t\t\t\t\t\t\t\tthis.__core.copy(doc, document);\r\n\r\n\t\t\t\t\t\t\t\t\t\treturn document;\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\t\tawait firstValueFrom(\r\n\t\t\t\t\t\t\t\t\tthis.crudService.update(local()),\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tthis.preCreate(doc);\r\n\r\n\t\t\t\t\t\t\t\tawait firstValueFrom(\r\n\t\t\t\t\t\t\t\t\tthis.crudService.create(doc),\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.setDocuments();\r\n\t\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\t/** Opens a modal to create a new document. */\r\n\tprotected create() {\r\n\t\tthis.__form.modal<Document>(\r\n\t\t\tthis.form,\r\n\t\t\t{\r\n\t\t\t\tlabel: 'Create',\r\n\t\t\t\tclick: async (created: unknown, close: () => void) => {\r\n\t\t\t\t\tclose();\r\n\r\n\t\t\t\t\tthis.preCreate(created as Document);\r\n\r\n\t\t\t\t\tawait firstValueFrom(\r\n\t\t\t\t\t\tthis.crudService.create(created as Document),\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tthis.setDocuments();\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\t{ data: {} },\r\n\t\t\t() => {},\r\n\t\t\t{\r\n\t\t\t\tresetOnSubmit: true,\r\n\t\t\t},\r\n\t\t);\r\n\t}\r\n\r\n\t/** Displays a modal to edit an existing document. */\r\n\tprotected update(doc: Document) {\r\n\t\tthis.__form.modal<Document>(\r\n\t\t\tthis.form,\r\n\t\t\t{\r\n\t\t\t\tlabel: 'Update',\r\n\t\t\t\tclick: (updated: unknown, close: () => void) => {\r\n\t\t\t\t\tclose();\r\n\r\n\t\t\t\t\tthis.__core.copy(updated, doc);\r\n\r\n\t\t\t\t\tthis.crudService.update(doc);\r\n\r\n\t\t\t\t\tthis.__cdr.markForCheck();\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\tdoc,\r\n\t\t);\r\n\t}\r\n\r\n\t/** Requests confirmation before deleting the provided document. */\r\n\tprotected async delete(doc: Document) {\r\n\t\tthis.crudService.delete(doc).subscribe(() => {\r\n\t\t\tthis.setDocuments();\r\n\t\t});\r\n\t}\r\n\r\n\t/** Opens a modal to edit the document's unique URL. */\r\n\tprotected mutateUrl(doc: Document) {\r\n\t\tthis.__form.modalUnique<Document>(this._module, 'url', doc);\r\n\t}\r\n\r\n\t/** Moves the given document one position up and updates ordering. */\r\n\tprotected moveUp(doc: Document) {\r\n\t\tconst index = this.documents().findIndex(\r\n\t\t\t(document) => document()._id === doc._id,\r\n\t\t);\r\n\r\n\t\tif (index) {\r\n\t\t\tthis.documents.update((documents) => {\r\n\t\t\t\tdocuments.splice(index, 1);\r\n\r\n\t\t\t\tdocuments.splice(index - 1, 0, this.crudService.getSignal(doc));\r\n\r\n\t\t\t\treturn documents;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < this.documents().length; i++) {\r\n\t\t\tif (this.documents()[i]().order !== i) {\r\n\t\t\t\tthis.documents()[i]().order = i;\r\n\r\n\t\t\t\tthis.crudService.update(this.documents()[i]());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.__cdr.markForCheck();\r\n\t}\r\n\r\n\t/** Data source mode used for document retrieval. */\r\n\tprotected configType: 'server' | 'local' = 'server';\r\n\r\n\t/** Number of documents fetched per page when paginating. */\r\n\tprotected perPage = 20;\r\n\r\n\t/**\r\n\t * Configuration object used by the UI for rendering table and handling actions.\r\n\t */\r\n\tprotected getConfig(): TableConfig<Document> {\r\n\t\tconst config: TableConfig<Document> = {\r\n\t\t\tcreate: this.allowCreate()\r\n\t\t\t\t? (): void => {\r\n\t\t\t\t\t\tthis.create();\r\n\t\t\t\t\t}\r\n\t\t\t\t: null,\r\n\r\n\t\t\tupdate: this.allowMutate()\r\n\t\t\t\t? (doc: Document): void => {\r\n\t\t\t\t\t\tthis.update(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t: null,\r\n\r\n\t\t\tdelete: this.allowMutate()\r\n\t\t\t\t? (doc: Document): void => {\r\n\t\t\t\t\t\tthis.delete(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t: null,\r\n\r\n\t\t\tbuttons: [],\r\n\t\t\theaderButtons: [],\r\n\t\t\tallDocs: true,\r\n\t\t};\r\n\r\n\t\tif (this.allowUrl()) {\r\n\t\t\tconfig.buttons.push({\r\n\t\t\t\ticon: 'cloud_download',\r\n\t\t\t\tclick: (doc: Document) => {\r\n\t\t\t\t\tthis.mutateUrl(doc);\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.allowSort()) {\r\n\t\t\tconfig.buttons.push({\r\n\t\t\t\ticon: 'arrow_upward',\r\n\t\t\t\tclick: (doc: Document) => {\r\n\t\t\t\t\tthis.moveUp(doc);\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.allowCreate()) {\r\n\t\t\tconfig.headerButtons.push({\r\n\t\t\t\ticon: 'playlist_add',\r\n\t\t\t\tclick: this.bulkManagement(),\r\n\t\t\t\tclass: 'playlist',\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (this.allowMutate()) {\r\n\t\t\tconfig.headerButtons.push({\r\n\t\t\t\ticon: 'edit_note',\r\n\t\t\t\tclick: this.bulkManagement(false),\r\n\t\t\t\tclass: 'edit',\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this.configType === 'server'\r\n\t\t\t? {\r\n\t\t\t\t\t...config,\r\n\t\t\t\t\tpaginate: this.setDocuments.bind(this),\r\n\t\t\t\t\tperPage: this.perPage,\r\n\t\t\t\t\tsetPerPage: this.crudService.setPerPage?.bind(\r\n\t\t\t\t\t\tthis.crudService,\r\n\t\t\t\t\t),\r\n\t\t\t\t\tallDocs: false,\r\n\t\t\t\t}\r\n\t\t\t: config;\r\n\t}\r\n\r\n\t/** Name of the collection or module used for contextual actions. */\r\n\tprivate _module = '';\r\n}\r\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n\tChangeDetectorRef,\n\tDestroyRef,\n\tDirective,\n\tElementRef,\n\tPLATFORM_ID,\n\tinject,\n\toutput,\n} from '@angular/core';\n\n/**\n * Stand-alone “click outside” directive (zoneless-safe).\n *\n * Usage:\n * <div (clickOutside)=\"close()\">…</div>\n */\n@Directive({\n\tselector: '[clickOutside]',\n})\nexport class ClickOutsideDirective {\n\treadonly clickOutside = output<MouseEvent>();\n\n\tconstructor() {\n\t\tif (this._isBrowser) {\n\t\t\tthis._doc.addEventListener('pointerdown', this._handler, true);\n\t\t}\n\n\t\t// cleanup\n\t\tthis._dref.onDestroy(() =>\n\t\t\tthis._doc.removeEventListener('pointerdown', this._handler, true),\n\t\t);\n\t}\n\n\tprivate _host = inject(ElementRef<HTMLElement>);\n\n\tprivate _cdr = inject(ChangeDetectorRef);\n\n\tprivate _dref = inject(DestroyRef);\n\n\tprivate _doc = inject(DOCUMENT);\n\n\tprivate _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n\tprivate _handler = (e: MouseEvent): void => {\n\t\tif (!this._host.nativeElement.contains(e.target as Node)) {\n\t\t\tthis.clickOutside.emit(e); // notify parent\n\t\t\tthis._cdr.markForCheck(); // trigger CD for OnPush comps\n\t\t}\n\t};\n}\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\n@Directive({\r\n\tselector: 'input[manualDisabled], textarea[manualDisabled]',\r\n})\r\nexport class ManualDisabledDirective {\r\n\tprivate readonly _el = inject(ElementRef) as ElementRef<HTMLInputElement>;\r\n\r\n\t// Bind as: [manualDisabled]=\"isDisabled\"\r\n\treadonly manualDisabled = input<boolean | null>(null, {\r\n\t\talias: 'manualDisabled',\r\n\t});\r\n\r\n\tprivate readonly _syncDisabledEffect = effect(() => {\r\n\t\tconst disabled = this.manualDisabled();\r\n\t\tif (disabled == null) return;\r\n\r\n\t\tconst native = this._el.nativeElement;\r\n\t\tif (!native) return;\r\n\r\n\t\tnative.disabled = !!disabled;\r\n\t});\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\n@Directive({\r\n\tselector: 'input[manualName], textarea[manualName]',\r\n})\r\nexport class ManualNameDirective {\r\n\tprivate readonly _el = inject(ElementRef) as ElementRef<HTMLInputElement>;\r\n\r\n\t// Bind as: manualName=\"email\" or [manualName]=\"expr\"\r\n\treadonly manualName = input<string | null>(null, { alias: 'manualName' });\r\n\r\n\tprivate readonly _syncNameEffect = effect(() => {\r\n\t\tconst name = this.manualName();\r\n\t\tif (name == null) return;\r\n\r\n\t\tconst native = this._el.nativeElement;\r\n\t\tif (!native) return;\r\n\r\n\t\tif (native.name !== name) {\r\n\t\t\tnative.name = name;\r\n\t\t}\r\n\t});\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\n@Directive({\r\n\tselector: 'input[manualReadonly], textarea[manualReadonly]',\r\n})\r\nexport class ManualReadonlyDirective {\r\n\tprivate readonly _el = inject(ElementRef) as ElementRef<HTMLInputElement>;\r\n\r\n\t// Bind as: [manualReadonly]=\"true\"\r\n\treadonly manualReadonly = input<boolean | null>(null, {\r\n\t\talias: 'manualReadonly',\r\n\t});\r\n\r\n\tprivate readonly _syncReadonlyEffect = effect(() => {\r\n\t\tconst readonly = this.manualReadonly();\r\n\t\tif (readonly == null) return;\r\n\r\n\t\tconst native = this._el.nativeElement;\r\n\t\tif (!native) return;\r\n\r\n\t\tnative.readOnly = !!readonly;\r\n\t});\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\n@Directive({\r\n\tselector: 'input[manualType], textarea[manualType]',\r\n})\r\nexport class ManualTypeDirective {\r\n\tprivate readonly _el = inject(ElementRef) as ElementRef<HTMLInputElement>;\r\n\r\n\t// Bind as: manualType=\"password\" or [manualType]=\"expr\"\r\n\treadonly manualType = input<string | null>(null, { alias: 'manualType' });\r\n\r\n\tprivate readonly _syncTypeEffect = effect(() => {\r\n\t\tconst t = this.manualType();\r\n\t\tif (!t) return;\r\n\r\n\t\tconst native = this._el.nativeElement;\r\n\t\tif (!native) return;\r\n\r\n\t\tif (native.type !== t) {\r\n\t\t\tnative.type = t;\r\n\t\t}\r\n\t});\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'arr',\r\n})\r\nexport class ArrPipe implements PipeTransform {\r\n\ttransform(data: any, type?: any, refresh?: any): any {\r\n\t\tif (!data) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tif (typeof data == 'string') return data.split(type || ' ');\r\n\r\n\t\tif (Array.isArray(data)) {\r\n\t\t\treturn data;\r\n\t\t}\r\n\r\n\t\tif (typeof data != 'object') {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tlet arr = [];\r\n\r\n\t\tfor (let each in data) {\r\n\t\t\tif (!data[each]) continue;\r\n\r\n\t\t\tif (type == 'prop') {\r\n\t\t\t\tarr.push(each);\r\n\t\t\t} else if (type == 'value') {\r\n\t\t\t\tarr.push(data[each]);\r\n\t\t\t} else {\r\n\t\t\t\tarr.push({\r\n\t\t\t\t\tprop: each,\r\n\t\t\t\t\tvalue: data[each],\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn arr;\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'mongodate',\r\n})\r\nexport class MongodatePipe implements PipeTransform {\r\n\ttransform(_id: any) {\r\n\t\tif (!_id) return new Date();\r\n\r\n\t\tlet timestamp = _id.toString().substring(0, 8);\r\n\r\n\t\treturn new Date(parseInt(timestamp, 16) * 1000);\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'number',\r\n})\r\nexport class NumberPipe implements PipeTransform {\r\n\ttransform(value: unknown): number {\r\n\t\tconst result = Number(value); // Convert value to a number\r\n\r\n\t\treturn isNaN(result) ? 0 : result; // Return 0 if conversion fails\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'page',\r\n\tpure: false,\r\n})\r\nexport class PaginationPipe implements PipeTransform {\r\n\ttransform(arr: any, config: any, sort: any, search = ''): any {\r\n\t\tif (!Array.isArray(arr)) return [];\r\n\r\n\t\tarr = arr.slice();\r\n\r\n\t\tfor (let i = 0; i < arr.length; i++) {\r\n\t\t\tarr[i].num = i + 1;\r\n\t\t}\r\n\r\n\t\tif (sort.direction) {\r\n\t\t\tarr.sort((a: any, b: any) => {\r\n\t\t\t\tif (a[sort.title] < b[sort.title]) {\r\n\t\t\t\t\treturn sort.direction == 'desc' ? 1 : -1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (a[sort.title] > b[sort.title]) {\r\n\t\t\t\t\treturn sort.direction == 'desc' ? -1 : 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn arr.slice(\r\n\t\t\t(config.page - 1) * config.perPage,\r\n\t\t\tconfig.page * config.perPage,\r\n\t\t);\r\n\t}\r\n}\r\n","import { inject, Pipe } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n@Pipe({\r\n\tname: 'safe',\r\n})\r\nexport class SafePipe {\r\n\ttransform(html: any) {\r\n\t\treturn this._sanitizer.bypassSecurityTrustResourceUrl(html);\r\n\t}\r\n\r\n\tprivate _sanitizer = inject(DomSanitizer);\r\n}\r\n","import { Pipe, PipeTransform, Signal, isSignal } from '@angular/core';\r\n\r\ntype Query =\r\n\t| string\r\n\t| string[]\r\n\t| Record<string, unknown>\r\n\t| Signal<string | string[] | Record<string, unknown> | undefined>;\r\n\r\ntype Field =\r\n\t| string\r\n\t| string[]\r\n\t| number\r\n\t| Signal<string | string[] | number | undefined>;\r\n\r\n@Pipe({ name: 'search', pure: true })\r\nexport class SearchPipe implements PipeTransform {\r\n\ttransform<T>(\r\n\t\titems: T[] | Record<string, T>,\r\n\t\tquery?: Query,\r\n\t\tfields?: Field,\r\n\t\tlimit?: number,\r\n\t\tignore = false,\r\n\t\t_reload?: unknown,\r\n\t): T[] {\r\n\t\t/* unwrap signals */\r\n\t\tconst q = isSignal(query) ? query() : query;\r\n\r\n\t\tlet f = isSignal(fields) ? fields() : fields;\r\n\r\n\t\t/* allow “fields” to be a number (=limit) */\r\n\t\tif (typeof f === 'number') {\r\n\t\t\tlimit = f;\r\n\r\n\t\t\tf = undefined;\r\n\t\t}\r\n\r\n\t\tconst docs = Array.isArray(items) ? items : Object.values(items);\r\n\r\n\t\tif (ignore || !q) return limit ? docs.slice(0, limit) : docs;\r\n\r\n\t\t/* normalise fields */\r\n\t\tconst paths: string[] = !f\r\n\t\t\t? ['name']\r\n\t\t\t: Array.isArray(f)\r\n\t\t\t\t? f\r\n\t\t\t\t: f.trim().split(/\\s+/);\r\n\r\n\t\t/* normalise query */\r\n\t\tconst needles: string[] = Array.isArray(q)\r\n\t\t\t? q.map((s) => s.toLowerCase())\r\n\t\t\t: typeof q === 'object'\r\n\t\t\t\t? Object.keys(q)\r\n\t\t\t\t\t\t.filter((k) => (q as any)[k])\r\n\t\t\t\t\t\t.map((k) => k.toLowerCase())\r\n\t\t\t\t: [q.toLowerCase()];\r\n\r\n\t\tconst txtMatches = (val: any) => {\r\n\t\t\tif (val == null) return false;\r\n\r\n\t\t\tconst hay = val.toString().toLowerCase();\r\n\r\n\t\t\treturn needles.some((n) => hay.includes(n) || n.includes(hay));\r\n\t\t};\r\n\r\n\t\tconst walk = (obj: any, parts: string[]): boolean => {\r\n\t\t\tif (!obj) return false;\r\n\r\n\t\t\tconst [head, ...rest] = parts;\r\n\r\n\t\t\tconst next = obj[head];\r\n\r\n\t\t\tif (Array.isArray(next))\r\n\t\t\t\treturn next.some((v) =>\r\n\t\t\t\t\trest.length ? walk(v, rest) : txtMatches(v),\r\n\t\t\t\t);\r\n\r\n\t\t\treturn rest.length ? walk(next, rest) : txtMatches(next);\r\n\t\t};\r\n\r\n\t\tconst out: T[] = [];\r\n\r\n\t\tconst seen = new Set<number | string>();\r\n\r\n\t\tconst check = (doc: T, key: number | string) => {\r\n\t\t\tfor (const p of paths) {\r\n\t\t\t\tif (walk(doc, p.split('.'))) {\r\n\t\t\t\t\tif (!seen.has(key)) {\r\n\t\t\t\t\t\tout.push(doc);\r\n\r\n\t\t\t\t\t\tseen.add(key);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tArray.isArray(items)\r\n\t\t\t? docs.forEach((d, i) => check(d, i))\r\n\t\t\t: Object.entries(items).forEach(([k, v]) => check(v, k));\r\n\r\n\t\treturn limit ? out.slice(0, limit) : out;\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'splice',\r\n})\r\nexport class SplicePipe implements PipeTransform {\r\n\ttransform(from: any, which: any, refresh?: number): any {\r\n\t\tif (Array.isArray(from)) from = { arr: from, prop: '_id' };\r\n\r\n\t\tlet arr = (which.keep && []) || from.arr.slice();\r\n\r\n\t\tif (Array.isArray(which)) which = { arr: which, prop: '_id' };\r\n\r\n\t\tfor (let i = from.arr.length - 1; i >= 0; i--) {\r\n\t\t\tfor (let j = 0; j < which.arr.length; j++) {\r\n\t\t\t\tif (from.prop && which.prop) {\r\n\t\t\t\t\tif (from.arr[i][from.prop] == which.arr[j][which.prop]) {\r\n\t\t\t\t\t\tif (which.keep) {\r\n\t\t\t\t\t\t\tarr.push(from.arr[i]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tarr.splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (from.prop) {\r\n\t\t\t\t\tif (from.arr[i][from.prop] == which.arr[j]) {\r\n\t\t\t\t\t\tif (which.keep) {\r\n\t\t\t\t\t\t\tarr.push(from.arr[i]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tarr.splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (which.prop) {\r\n\t\t\t\t\tif (from.arr[i] == which.arr[j][which.prop]) {\r\n\t\t\t\t\t\tif (which.keep) {\r\n\t\t\t\t\t\t\tarr.push(from.arr[i]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tarr.splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (from.arr[i] == which.arr[j]) {\r\n\t\t\t\t\tif (which.keep) {\r\n\t\t\t\t\t\tarr.push(from.arr[i]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tarr.splice(i, 1);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn arr;\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'split',\r\n})\r\nexport class SplitPipe implements PipeTransform {\r\n\ttransform(value: string, index = 0, devider = ':'): unknown {\r\n\t\tconst arr = value.split(devider);\r\n\r\n\t\treturn arr.length > index ? arr[index] : '';\r\n\t}\r\n}\r\n","import { Injectable, WritableSignal, signal } from '@angular/core';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport {\r\n\tObservable,\r\n\tSubject,\r\n\tcombineLatest,\r\n\tfilter,\r\n\tmap,\r\n\tmerge,\r\n\tshare,\r\n\tskip,\r\n\ttake,\r\n\ttakeUntil,\r\n\ttimeout,\r\n} from 'rxjs';\r\n\r\ntype Any = unknown;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EmitterService {\r\n\tprivate _signals = new Map<string, WritableSignal<Any>>();\r\n\tprivate _closers = new Map<string, Subject<void>>();\r\n\tprivate _streams = new Map<string, Observable<Any>>();\r\n\r\n\tprivate _getSignal(id: string): WritableSignal<Any> {\r\n\t\tlet s = this._signals.get(id);\r\n\t\tif (!s) {\r\n\t\t\t// emit even if same payload repeats\r\n\t\t\ts = signal<Any>(undefined, { equal: () => false });\r\n\t\t\tthis._signals.set(id, s);\r\n\t\t}\r\n\t\treturn s;\r\n\t}\r\n\r\n\tprivate _getCloser(id: string): Subject<void> {\r\n\t\tlet c = this._closers.get(id);\r\n\t\tif (!c) {\r\n\t\t\tc = new Subject<void>();\r\n\t\t\tthis._closers.set(id, c);\r\n\t\t}\r\n\t\treturn c;\r\n\t}\r\n\r\n\tprivate _getStream(id: string): Observable<Any> {\r\n\t\tlet obs$ = this._streams.get(id);\r\n\t\tif (!obs$) {\r\n\t\t\tconst sig = this._getSignal(id);\r\n\t\t\tconst closed$ = this._getCloser(id);\r\n\t\t\tobs$ = toObservable(sig).pipe(\r\n\t\t\t\t// Subject-like: don't replay the current value on subscribe\r\n\t\t\t\tskip(1),\r\n\t\t\t\ttakeUntil(closed$),\r\n\t\t\t\tshare(),\r\n\t\t\t);\r\n\t\t\tthis._streams.set(id, obs$);\r\n\t\t}\r\n\t\treturn obs$;\r\n\t}\r\n\r\n\t/** Emit an event */\r\n\temit<T = Any>(id: string, data?: T): void {\r\n\t\tthis._getSignal(id).set(data as Any);\r\n\t}\r\n\r\n\t/** Listen for events (hot, completes when off(id) is called) */\r\n\ton<T = Any>(id: string): Observable<T> {\r\n\t\treturn this._getStream(id) as Observable<T>;\r\n\t}\r\n\r\n\t/** Complete and remove a channel */\r\n\toff(id: string): void {\r\n\t\tconst closer = this._closers.get(id);\r\n\t\tif (closer) {\r\n\t\t\tcloser.next();\r\n\t\t\tcloser.complete();\r\n\t\t\tthis._closers.delete(id);\r\n\t\t}\r\n\t\tthis._signals.delete(id);\r\n\t\tthis._streams.delete(id);\r\n\t}\r\n\r\n\toffAll(): void {\r\n\t\tfor (const id of Array.from(this._closers.keys())) this.off(id);\r\n\t}\r\n\r\n\thas(id: string): boolean {\r\n\t\treturn this._signals.has(id);\r\n\t}\r\n\r\n\tprivate _done = new Map<string, WritableSignal<Any | undefined>>();\r\n\r\n\tprivate _getDoneSignal(id: string): WritableSignal<Any | undefined> {\r\n\t\tlet s = this._done.get(id);\r\n\t\tif (!s) {\r\n\t\t\ts = signal<Any | undefined>(undefined);\r\n\t\t\tthis._done.set(id, s);\r\n\t\t}\r\n\t\treturn s;\r\n\t}\r\n\r\n\t/** Mark task as completed with a payload (default: true) */\r\n\tcomplete<T = Any>(task: string, value: T = true as unknown as T): void {\r\n\t\tthis._getDoneSignal(task).set(value as Any);\r\n\t}\r\n\r\n\t/** Clear completion so it can be awaited again */\r\n\tclearCompleted(task: string): void {\r\n\t\tconst s = this._done.get(task) ?? this._getDoneSignal(task);\r\n\t\ts.set(undefined);\r\n\t}\r\n\r\n\t/** Read current completion payload (undefined => not completed) */\r\n\tcompleted(task: string): Any | undefined {\r\n\t\treturn this._getDoneSignal(task)();\r\n\t}\r\n\r\n\tisCompleted(task: string): boolean {\r\n\t\treturn this._getDoneSignal(task)() !== undefined;\r\n\t}\r\n\r\n\tonComplete(\r\n\t\ttasks: string | string[],\r\n\t\topts?: {\r\n\t\t\tmode?: 'all' | 'any';\r\n\t\t\ttimeoutMs?: number;\r\n\t\t\tabort?: AbortSignal;\r\n\t\t},\r\n\t): Observable<Any | Any[]> {\r\n\t\tconst list = (Array.isArray(tasks) ? tasks : [tasks]).filter(Boolean);\r\n\t\tconst streams = list.map((id) =>\r\n\t\t\ttoObservable(this._getDoneSignal(id)).pipe(\r\n\t\t\t\tfilter((v): v is Any => v !== undefined),\r\n\t\t\t\tmap((v) => v as Any),\r\n\t\t\t),\r\n\t\t);\r\n\r\n\t\tlet source$: Observable<Any | Any[]>;\r\n\r\n\t\tif (list.length <= 1) {\r\n\t\t\t// single-task await\r\n\t\t\tsource$ = streams[0]?.pipe(take(1)) ?? new Observable<never>();\r\n\t\t} else if (opts?.mode === 'any') {\r\n\t\t\tsource$ = merge(...streams).pipe(take(1));\r\n\t\t} else {\r\n\t\t\tsource$ = combineLatest(streams).pipe(take(1));\r\n\t\t}\r\n\r\n\t\tif (opts?.timeoutMs && Number.isFinite(opts.timeoutMs)) {\r\n\t\t\tsource$ = source$.pipe(timeout({ first: opts.timeoutMs }));\r\n\t\t}\r\n\r\n\t\tif (opts?.abort) {\r\n\t\t\tconst abort$ = new Observable<void>((sub) => {\r\n\t\t\t\tconst handler = () => {\r\n\t\t\t\t\tsub.next();\r\n\t\t\t\t\tsub.complete();\r\n\t\t\t\t};\r\n\t\t\t\topts.abort!.addEventListener('abort', handler);\r\n\t\t\t\treturn () => opts.abort!.removeEventListener('abort', handler);\r\n\t\t\t});\r\n\t\t\tsource$ = source$.pipe(takeUntil(abort$));\r\n\t\t}\r\n\r\n\t\treturn source$;\r\n\t}\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tHttpClient,\r\n\tHttpErrorResponse,\r\n\tHttpHeaders,\r\n} from '@angular/common/http';\r\nimport {\r\n\tInject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n\tinject,\r\n} from '@angular/core';\r\nimport { EMPTY, Observable, ReplaySubject } from 'rxjs';\r\nimport { catchError, first } from 'rxjs/operators';\r\nimport { CONFIG_TOKEN, Config } from '../interfaces/config.interface';\r\nimport {\r\n\tDEFAULT_HTTP_CONFIG,\r\n\tHttpConfig,\r\n\tHttpHeaderType,\r\n} from '../interfaces/http.interface';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class HttpService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\t// An array of error handling callbacks\r\n\terrors: ((err: HttpErrorResponse, retry?: () => void) => {})[] = [];\r\n\r\n\t// Base URL for HTTP requests\r\n\turl = '';\r\n\r\n\t// Flag to lock the service to prevent multiple requests\r\n\tlocked = false;\r\n\r\n\t// Array to store setTimeout IDs for managing request locks\r\n\tawaitLocked: ReturnType<typeof setTimeout>[] = [];\r\n\r\n\t// Configuration object for HTTP settings\r\n\tprivate _config: HttpConfig;\r\n\r\n\t// Object to store HTTP headers\r\n\tprivate _headers: {\r\n\t\t[name: string]: HttpHeaderType;\r\n\t} = {};\r\n\r\n\t// Instance of HttpHeaders with current headers\r\n\tprivate _http_headers = new HttpHeaders(this._headers);\r\n\r\n\tconstructor(\r\n\t\t@Inject(CONFIG_TOKEN) @Optional() config: Config,\r\n\t\tprivate _http: HttpClient,\r\n\t) {\r\n\t\t// Initialize HTTP configuration and headers from injected config\r\n\t\tthis._config = {\r\n\t\t\t...DEFAULT_HTTP_CONFIG,\r\n\t\t\t...(config.http || {}),\r\n\t\t};\r\n\r\n\t\tif (typeof this._config.url === 'string') {\r\n\t\t\tthis.setUrl(this._config.url);\r\n\t\t}\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis.url = localStorage.getItem('wacom-http.url') || this.url;\r\n\r\n\t\t\tconst raw = localStorage.getItem('wacom-http.headers');\r\n\t\t\tthis._headers = raw ? JSON.parse(raw) : this._headers;\r\n\t\t\tthis._http_headers = new HttpHeaders(this._headers);\r\n\t\t}\r\n\r\n\t\tif (typeof this._config.headers === 'object') {\r\n\t\t\tfor (const header in this._config.headers) {\r\n\t\t\t\tthis._headers[header] = this._config.headers[header];\r\n\t\t\t}\r\n\r\n\t\t\tthis._http_headers = new HttpHeaders(this._headers);\r\n\t\t}\r\n\t}\r\n\r\n\t// Set a new base URL and save it in the store\r\n\tsetUrl(url: string) {\r\n\t\tthis.url = url;\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.setItem('wacom-http.url', url);\r\n\t\t}\r\n\t}\r\n\r\n\t// Remove the base URL and revert to the default or stored one\r\n\tremoveUrl() {\r\n\t\tthis.url = this._config.url || '';\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.removeItem('wacom-http.url');\r\n\t\t}\r\n\t}\r\n\r\n\t// Set a new HTTP header and update the stored headers\r\n\tset(key: any, value: any) {\r\n\t\tthis._headers[key] = value;\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.setItem(\r\n\t\t\t\t'wacom-http.headers',\r\n\t\t\t\tJSON.stringify(this._headers),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tthis._http_headers = new HttpHeaders(this._headers);\r\n\t}\r\n\r\n\t// Get the value of a specific HTTP header\r\n\theader(key: any) {\r\n\t\treturn this._headers[key];\r\n\t}\r\n\r\n\t// Remove a specific HTTP header and update the stored headers\r\n\tremove(key: any) {\r\n\t\tdelete this._headers[key];\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.setItem(\r\n\t\t\t\t'wacom-http.headers',\r\n\t\t\t\tJSON.stringify(this._headers),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tthis._http_headers = new HttpHeaders(this._headers);\r\n\t}\r\n\r\n\t// Internal method to make HTTP requests based on the method type\r\n\tprivate _httpMethod(\r\n\t\tmethod: string,\r\n\t\t_url: string,\r\n\t\tdoc: unknown,\r\n\t\theaders: any,\r\n\t): Observable<any> {\r\n\t\tif (method === 'post') {\r\n\t\t\treturn this._http.post<any>(_url, doc, headers);\r\n\t\t} else if (method === 'put') {\r\n\t\t\treturn this._http.put<any>(_url, doc, headers);\r\n\t\t} else if (method === 'patch') {\r\n\t\t\treturn this._http.patch<any>(_url, doc, headers);\r\n\t\t} else if (method === 'delete') {\r\n\t\t\treturn this._http.delete<any>(_url, headers);\r\n\t\t} else {\r\n\t\t\treturn this._http.get<any>(_url, headers);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Internal method to handle HTTP requests for various methods (POST, PUT, PATCH, DELETE, GET).\r\n\t *\r\n\t * Features:\r\n\t * - **Request Locking**: Manages request locking to prevent simultaneous requests.\r\n\t * - **Acceptance Check**: Validates the server response against a user-defined `acceptance` function.\r\n\t * If the check fails, the response is rejected with an error.\r\n\t * - **Replace Logic**: Allows modification of specific parts of the response object, determined by a user-defined `replace` function.\r\n\t * Can handle both objects and arrays within the response.\r\n\t * - **Field Filtering**: Supports extracting specific fields from response objects or arrays.\r\n\t * - **Legacy Support**: Compatible with callback-based usage alongside Observables.\r\n\t * - **ReplaySubject**: Ensures that the response can be shared across multiple subscribers.\r\n\t *\r\n\t * @param url - The endpoint to send the HTTP request to (relative to the base URL).\r\n\t * @param doc - The request payload for methods like POST, PUT, and PATCH.\r\n\t * @param callback - A legacy callback function to handle the response.\r\n\t * @param opts - Additional options:\r\n\t * - `err`: Error handling callback.\r\n\t * - `acceptance`: Function to validate the server response. Should return `true` for valid responses.\r\n\t * - `replace`: Function to modify specific parts of the response data.\r\n\t * - `fields`: Array of fields to extract from the response object(s).\r\n\t * - `data`: Path in the response where the data resides for `replace` and `fields` operations.\r\n\t * - `skipLock`: If `true`, bypasses request locking.\r\n\t * - `url`: Overrides the base URL for this request.\r\n\t * @param method - The HTTP method (e.g., 'post', 'put', 'patch', 'delete', 'get').\r\n\t * @returns An Observable that emits the processed HTTP response or an error.\r\n\t */\r\n\tprivate _post(\r\n\t\turl: string,\r\n\t\tdoc: unknown,\r\n\t\tcallback = (resp: unknown) => {},\r\n\t\topts: any = {},\r\n\t\tmethod = 'post',\r\n\t): Observable<any> {\r\n\t\tif (typeof opts === 'function') {\r\n\t\t\topts = { err: opts };\r\n\t\t}\r\n\r\n\t\tif (!opts.err) {\r\n\t\t\topts.err = (err: HttpErrorResponse) => {};\r\n\t\t}\r\n\r\n\t\t// Handle request locking to avoid multiple simultaneous requests\r\n\t\tif (this.locked && !opts.skipLock) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tconst wait = setTimeout(() => {\r\n\t\t\t\t\tthis._post(url, doc, callback, opts, method).subscribe(\r\n\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t);\r\n\t\t\t\t}, 100);\r\n\r\n\t\t\t\tthis.awaitLocked.push(wait);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst _url = (opts.url || this.url) + url;\r\n\r\n\t\tthis.prepare_handle(_url, doc);\r\n\r\n\t\t// Using ReplaySubject to allow multiple subscriptions without re-triggering the HTTP request\r\n\t\tconst responseSubject = new ReplaySubject(1);\r\n\r\n\t\tthis._httpMethod(method, _url, doc, { headers: this._http_headers })\r\n\t\t\t.pipe(\r\n\t\t\t\tfirst(),\r\n\t\t\t\tcatchError((error: HttpErrorResponse) => {\r\n\t\t\t\t\tthis.handleError(opts.err, () => {\r\n\t\t\t\t\t\tthis._post(url, doc, callback, opts, method).subscribe(\r\n\t\t\t\t\t\t\tresponseSubject,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t})(error);\r\n\r\n\t\t\t\t\tresponseSubject.error(error);\r\n\r\n\t\t\t\t\treturn EMPTY;\r\n\t\t\t\t}),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\topts.acceptance &&\r\n\t\t\t\t\t\ttypeof opts.acceptance === 'function'\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tif (!opts.acceptance(resp)) {\r\n\t\t\t\t\t\t\tconst error = new HttpErrorResponse({\r\n\t\t\t\t\t\t\t\terror: 'Acceptance failed',\r\n\t\t\t\t\t\t\t\tstatus: 400,\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tthis.handleError(opts.err, () => {})(error);\r\n\r\n\t\t\t\t\t\t\tresponseSubject.error(error);\r\n\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (opts.replace && typeof opts.replace === 'function') {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tArray.isArray(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(resp, opts.data),\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(\r\n\t\t\t\t\t\t\t\t\tresp,\r\n\t\t\t\t\t\t\t\t\topts.data,\r\n\t\t\t\t\t\t\t\t) as Array<unknown>\r\n\t\t\t\t\t\t\t).map((item: unknown) => opts.replace(item));\r\n\t\t\t\t\t\t} else if (this._getObjectToReplace(resp, opts.data)) {\r\n\t\t\t\t\t\t\topts.replace(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(resp, opts.data),\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (Array.isArray(opts.fields)) {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tArray.isArray(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(resp, opts.data),\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(\r\n\t\t\t\t\t\t\t\t\tresp,\r\n\t\t\t\t\t\t\t\t\topts.data,\r\n\t\t\t\t\t\t\t\t) as Array<unknown>\r\n\t\t\t\t\t\t\t).map((item: unknown) => {\r\n\t\t\t\t\t\t\t\treturn this._newDoc(item, opts.fields);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t} else if (this._getObjectToReplace(resp, opts.data)) {\r\n\t\t\t\t\t\t\tconst newDoc = this._newDoc(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(resp, opts.data),\r\n\t\t\t\t\t\t\t\topts.fields,\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\tif (opts.data) {\r\n\t\t\t\t\t\t\t\tthis._setObjectToReplace(\r\n\t\t\t\t\t\t\t\t\tresp,\r\n\t\t\t\t\t\t\t\t\topts.data,\r\n\t\t\t\t\t\t\t\t\tnewDoc,\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tresp = newDoc;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.response_handle(_url, resp, () => callback(resp));\r\n\r\n\t\t\t\t\tresponseSubject.next(resp);\r\n\r\n\t\t\t\t\tresponseSubject.complete();\r\n\t\t\t\t},\r\n\t\t\t\terror: (err) => responseSubject.error(err),\r\n\t\t\t\tcomplete: () => responseSubject.complete(),\r\n\t\t\t});\r\n\r\n\t\treturn responseSubject.asObservable();\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a POST request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tpost(\r\n\t\turl: string,\r\n\t\tdoc: any,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, doc, callback, opts);\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a PUT request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tput(\r\n\t\turl: string,\r\n\t\tdoc: any,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, doc, callback, opts, 'put');\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a PATCH request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tpatch(\r\n\t\turl: string,\r\n\t\tdoc: any,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, doc, callback, opts, 'patch');\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a DELETE request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tdelete(\r\n\t\turl: string,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, null, callback, opts, 'delete');\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a GET request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tget(\r\n\t\turl: string,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, null, callback, opts, 'get');\r\n\t}\r\n\r\n\t// Clear all pending request locks\r\n\tclearLocked() {\r\n\t\tfor (const awaitLocked of this.awaitLocked) {\r\n\t\t\tclearTimeout(awaitLocked);\r\n\t\t}\r\n\t\tthis.awaitLocked = [];\r\n\t}\r\n\r\n\t// Lock the service to prevent multiple simultaneous requests\r\n\tlock() {\r\n\t\tthis.locked = true;\r\n\t}\r\n\r\n\t// Unlock the service to allow new requests\r\n\tunlock() {\r\n\t\tthis.locked = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Handles HTTP errors.\r\n\t * - Calls provided error callback and retries the request if needed.\r\n\t */\r\n\tprivate handleError(callback: any, retry: () => void) {\r\n\t\treturn (error: HttpErrorResponse): Promise<void> => {\r\n\t\t\treturn new Promise((resolve) => {\r\n\t\t\t\tthis.err_handle(error, callback, retry);\r\n\t\t\t\tresolve();\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Internal method to trigger error handling callbacks.\r\n\t */\r\n\tprivate err_handle(\r\n\t\terr: HttpErrorResponse,\r\n\t\tnext: (err: HttpErrorResponse) => void,\r\n\t\tretry: () => void,\r\n\t) {\r\n\t\tif (typeof next === 'function') {\r\n\t\t\tnext(err);\r\n\t\t}\r\n\r\n\t\tfor (const callback of this.errors) {\r\n\t\t\tif (typeof callback === 'function') {\r\n\t\t\t\tcallback(err, retry);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Placeholder method for handling request preparation (can be customized)\r\n\tprivate prepare_handle(url: string, body: unknown) {}\r\n\r\n\t// Placeholder method for handling the response (can be customized)\r\n\tprivate response_handle(url: string, body: unknown, next: () => void) {\r\n\t\tif (typeof next === 'function') {\r\n\t\t\tnext();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves a nested object or property from the response based on a dot-separated path.\r\n\t *\r\n\t * @param resp - The response object to retrieve data from.\r\n\t * @param base - A dot-separated string indicating the path to the desired property within the response.\r\n\t * - Example: `'data.items'` will navigate through `resp.data.items`.\r\n\t * - If empty, the entire response is returned.\r\n\t * @returns The object or property located at the specified path within the response.\r\n\t */\r\n\tprivate _getObjectToReplace(resp: unknown, base = ''): unknown {\r\n\t\tif (base.includes('.')) {\r\n\t\t\tconst newBase = base.split('');\r\n\r\n\t\t\tconst currentBase: string = newBase.pop() || '';\r\n\r\n\t\t\treturn this._getObjectToReplace(\r\n\t\t\t\t(resp as Record<string, unknown>)[currentBase] || {},\r\n\t\t\t\tnewBase.join('.'),\r\n\t\t\t);\r\n\t\t} else if (base) {\r\n\t\t\treturn (resp as Record<string, unknown>)[base];\r\n\t\t} else {\r\n\t\t\treturn resp;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets or replaces a nested object or property in the response based on a dot-separated path.\r\n\t *\r\n\t * @param resp - The response object to modify.\r\n\t * @param base - A dot-separated string indicating the path to the property to replace.\r\n\t * - Example: `'data.items'` will navigate through `resp.data.items`.\r\n\t * @param doc - The new data or object to set at the specified path.\r\n\t * @returns `void`.\r\n\t */\r\n\tprivate _setObjectToReplace(resp: unknown, base = '', doc: unknown): void {\r\n\t\twhile (base.includes('.')) {\r\n\t\t\tconst newBase = base.split('');\r\n\r\n\t\t\tconst currentBase: string = newBase.pop() || '';\r\n\r\n\t\t\tresp = (resp as Record<string, unknown>)[currentBase] || {};\r\n\r\n\t\t\tbase = newBase.join('.');\r\n\t\t}\r\n\r\n\t\t(resp as Record<string, unknown>)[base] = doc;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new object containing only specified fields from the input item.\r\n\t *\r\n\t * @param item - The input object to extract fields from.\r\n\t * @param fields - An array of field names to include in the new object.\r\n\t * - Example: `['id', 'name']` will create a new object with only the `id` and `name` properties from `item`.\r\n\t * @returns A new object containing only the specified fields.\r\n\t */\r\n\tprivate _newDoc(item: unknown, fields: string[]): unknown {\r\n\t\tconst newDoc: Record<string, unknown> = {};\r\n\r\n\t\tfor (const field of fields) {\r\n\t\t\tnewDoc[field] = (item as Record<string, unknown>)[field];\r\n\t\t}\r\n\r\n\t\treturn newDoc;\r\n\t}\r\n}\r\n","// network.service.ts — Angular 20+ (zoneless) signal-based connectivity checker\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInject,\r\n\tinject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n\tsignal,\r\n} from '@angular/core';\r\nimport { Config, CONFIG_TOKEN } from '../interfaces/config.interface';\r\nimport {\r\n\tDEFAULT_NETWORK_CONFIG,\r\n\tNetworkConfig,\r\n\tNetworkStatus,\r\n} from '../interfaces/network.interface';\r\nimport { EmitterService } from './emitter.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NetworkService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\t/** Internal mutable signals. */\r\n\tprivate _status = signal<NetworkStatus>(\r\n\t\tthis._isBrowser && navigator.onLine ? 'poor' : 'none',\r\n\t);\r\n\tprivate _latencyMs = signal<number | null>(null);\r\n\tprivate _isOnline = signal<boolean>(\r\n\t\tthis._isBrowser ? navigator.onLine : false,\r\n\t);\r\n\r\n\t/** Public read-only signals. */\r\n\treadonly status = this._status.asReadonly();\r\n\treadonly latencyMs = this._latencyMs.asReadonly();\r\n\treadonly isOnline = this._isOnline.asReadonly();\r\n\r\n\t/** Failure counter to decide \"none\". */\r\n\tprivate _fails = 0;\r\n\r\n\t/**\r\n\t * Creates the network monitor, binds browser/Capacitor events,\r\n\t * performs an immediate check, and starts periodic polling.\r\n\t */\r\n\tconstructor(@Inject(CONFIG_TOKEN) @Optional() config: Config) {\r\n\t\tthis._config = {\r\n\t\t\t...DEFAULT_NETWORK_CONFIG,\r\n\t\t\t...(config.network || ({} as NetworkConfig)),\r\n\t\t};\r\n\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tthis._bindEvents();\r\n\r\n\t\tthis.recheckNow(); // fire once on start\r\n\r\n\t\twindow.setInterval(() => this.recheckNow(), this._config.intervalMs);\r\n\t}\r\n\r\n\t/**\r\n\t * Manually trigger a connectivity check.\r\n\t * - Measures latency against the first reachable endpoint.\r\n\t * - Updates `isOnline`, `latencyMs`, and `status` accordingly.\r\n\t */\r\n\tasync recheckNow(): Promise<void> {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tconst res = await this._pingAny();\r\n\r\n\t\tif (res.ok && res.latency != null) {\r\n\t\t\tthis._fails = 0;\r\n\r\n\t\t\tthis._latencyMs.set(res.latency);\r\n\r\n\t\t\tthis._isOnline.set(true);\r\n\t\t} else {\r\n\t\t\tthis._fails++;\r\n\r\n\t\t\tthis._latencyMs.set(null);\r\n\t\t\t// `isOnline` may still be true per OS; we let online/offline events keep it in sync.\r\n\t\t}\r\n\r\n\t\tthis._updateClassification();\r\n\t}\r\n\r\n\t// ─────────────────────────── Internals ───────────────────────────\r\n\r\n\t/**\r\n\t * Classifies current state into 'good' | 'poor' | 'none'.\r\n\t * - 'none' if offline or too many consecutive failures.\r\n\t * - 'good' if latency ≤ goodLatencyMs.\r\n\t * - otherwise 'poor'.\r\n\t */\r\n\tprivate _updateClassification(): void {\r\n\t\tif (\r\n\t\t\t!this._isOnline() ||\r\n\t\t\tthis._fails >= this._config.maxConsecutiveFails\r\n\t\t) {\r\n\t\t\tif (this._status() !== 'none') {\r\n\t\t\t\tthis._status.set('none');\r\n\r\n\t\t\t\tthis._emitterService.emit('wacom_offline');\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst l = this._latencyMs();\r\n\r\n\t\tif (l != null && l <= this._config.goodLatencyMs) {\r\n\t\t\tif (this._status() !== 'good') {\r\n\t\t\t\tthis._status.set('good');\r\n\r\n\t\t\t\tthis._emitterService.emit('wacom_online');\r\n\t\t\t}\r\n\t\t} else if (this._status() !== 'poor') {\r\n\t\t\tthis._status.set('poor');\r\n\r\n\t\t\tthis._emitterService.emit('wacom_online');\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Binds browser events that can affect connectivity:\r\n\t * - online/offline (OS connectivity)\r\n\t * - visibilitychange (recheck on focus)\r\n\t * - NetworkInformation 'change' (if supported)\r\n\t */\r\n\tprivate _bindEvents(): void {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\twindow.addEventListener('online', () => {\r\n\t\t\tthis._isOnline.set(true);\r\n\r\n\t\t\tthis.recheckNow();\r\n\t\t});\r\n\r\n\t\twindow.addEventListener('offline', () => {\r\n\t\t\tthis._isOnline.set(false);\r\n\r\n\t\t\tthis._updateClassification();\r\n\t\t});\r\n\r\n\t\t(navigator as any).connection?.addEventListener?.('change', () =>\r\n\t\t\tthis.recheckNow(),\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Tries endpoints in order until one responds (CORS or opaque).\r\n\t * Returns success with measured latency, or a failure result.\r\n\t */\r\n\tprivate async _pingAny(): Promise<{ ok: boolean; latency: number | null }> {\r\n\t\tif (!this._isBrowser) return { ok: false, latency: null };\r\n\r\n\t\tfor (const url of this._config.endpoints) {\r\n\t\t\tconst noCors = !url.includes('api.webart.work'); // treat public fallbacks as opaque checks\r\n\r\n\t\t\tconst r = await this._measure(\r\n\t\t\t\turl,\r\n\t\t\t\tthis._config.timeoutMs,\r\n\t\t\t\tnoCors,\r\n\t\t\t).catch(() => null);\r\n\r\n\t\t\tif (r?.ok) return r;\r\n\t\t}\r\n\r\n\t\treturn { ok: false, latency: null };\r\n\t}\r\n\r\n\t/**\r\n\t * Measures a single fetch:\r\n\t * - Appends a timestamp to bypass caches.\r\n\t * - Uses `no-store` to avoid intermediaries caching.\r\n\t * - When `noCors` is true, uses `mode:'no-cors'` and treats a resolved fetch as reachable.\r\n\t */\r\n\tprivate async _measure(\r\n\t\turl: string,\r\n\t\ttimeoutMs: number,\r\n\t\tnoCors = false,\r\n\t): Promise<{ ok: boolean; latency: number | null }> {\r\n\t\tconst ctrl = new AbortController();\r\n\t\tconst timer = setTimeout(() => ctrl.abort(), timeoutMs);\r\n\t\tconst t0 = performance.now();\r\n\r\n\t\ttry {\r\n\t\t\tconst res = await fetch(\r\n\t\t\t\turl + (url.includes('?') ? '&' : '?') + 't=' + Date.now(),\r\n\t\t\t\t{\r\n\t\t\t\t\tmethod: 'GET',\r\n\t\t\t\t\tcache: 'no-store',\r\n\t\t\t\t\tcredentials: 'omit',\r\n\t\t\t\t\tsignal: ctrl.signal,\r\n\t\t\t\t\tmode: noCors ? 'no-cors' : 'cors',\r\n\t\t\t\t},\r\n\t\t\t);\r\n\r\n\t\t\tclearTimeout(timer);\r\n\r\n\t\t\tconst latency = Math.round(performance.now() - t0);\r\n\r\n\t\t\t// In no-cors, Response is opaque; treat as success if the fetch resolved.\r\n\t\t\tconst ok = noCors ? true : res.ok;\r\n\r\n\t\t\treturn { ok, latency };\r\n\t\t} catch {\r\n\t\t\tclearTimeout(timer);\r\n\r\n\t\t\treturn { ok: false, latency: null };\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _config: NetworkConfig;\r\n\r\n\tprivate _emitterService = inject(EmitterService);\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n\tinject,\r\n} from '@angular/core';\r\nimport {\r\n\tCONFIG_TOKEN,\r\n\tConfig,\r\n\tDEFAULT_CONFIG,\r\n} from '../interfaces/config.interface';\r\nimport { StoreConfig } from '../interfaces/store.interface';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class StoreService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tconstructor(@Inject(CONFIG_TOKEN) @Optional() config: Config) {\r\n\t\tthis._config = {\r\n\t\t\t...DEFAULT_CONFIG,\r\n\t\t\t...(config?.store || {}),\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the prefix for storage keys.\r\n\t *\r\n\t * @param prefix - The prefix to set.\r\n\t */\r\n\tsetPrefix(prefix: string): void {\r\n\t\tthis._prefix = prefix;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a value in storage asynchronously.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @param value - The value to store.\r\n\t * @returns A promise that resolves to a boolean indicating success.\r\n\t */\r\n\tasync set(\r\n\t\tkey: string,\r\n\t\tvalue: string,\r\n\t\tcallback: () => void = () => {},\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<boolean> {\r\n\t\tkey = this._applyPrefix(key);\r\n\r\n\t\ttry {\r\n\t\t\tif (this._config.set) {\r\n\t\t\t\tawait this._config.set(key, value, callback, errCallback);\r\n\t\t\t} else {\r\n\t\t\t\tif (!this._isBrowser) {\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlocalStorage.setItem(key, value);\r\n\r\n\t\t\t\tcallback();\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\terrCallback(err);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a value from storage asynchronously.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @returns A promise that resolves to the retrieved value or `null` if the key is missing.\r\n\t */\r\n\tasync get(\r\n\t\tkey: string,\r\n\t\tcallback?: (value: string | null) => void,\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<string | null> {\r\n\t\tkey = this._applyPrefix(key);\r\n\r\n\t\ttry {\r\n\t\t\tif (this._config.get) {\r\n\t\t\t\tconst value = await this._config.get(\r\n\t\t\t\t\tkey,\r\n\t\t\t\t\t(val: string) => {\r\n\t\t\t\t\t\tcallback?.(val ?? null);\r\n\t\t\t\t\t},\r\n\t\t\t\t\terrCallback,\r\n\t\t\t\t);\r\n\r\n\t\t\t\treturn value ?? null;\r\n\t\t\t} else {\r\n\t\t\t\tif (!this._isBrowser) {\r\n\t\t\t\t\tcallback?.(null);\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst value = localStorage.getItem(key);\r\n\r\n\t\t\t\tcallback?.(value ?? null);\r\n\r\n\t\t\t\treturn value ?? null;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\terrCallback(err);\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a JSON value in storage asynchronously.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @param value - The value to store.\r\n\t * @returns A promise that resolves to a boolean indicating success.\r\n\t */\r\n\tasync setJson<T>(\r\n\t\tkey: string,\r\n\t\tvalue: T,\r\n\t\tcallback: () => void = () => {},\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<boolean> {\r\n\t\treturn await this.set(\r\n\t\t\tkey,\r\n\t\t\tJSON.stringify(value),\r\n\t\t\tcallback,\r\n\t\t\terrCallback,\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a JSON value from storage asynchronously.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @returns A promise that resolves to the retrieved value.\r\n\t */\r\n\tasync getJson<T = any>(\r\n\t\tkey: string,\r\n\t\tcallback?: (value: string | null) => void,\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<T | null> {\r\n\t\tconst value = await this.get(key);\r\n\r\n\t\tif (value === null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst result = JSON.parse(value);\r\n\r\n\t\t\tcallback?.(result);\r\n\r\n\t\t\treturn result;\r\n\t\t} catch (err) {\r\n\t\t\terrCallback?.(err);\r\n\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a value from storage.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @param callback - The callback to execute on success.\r\n\t * @param errCallback - The callback to execute on error.\r\n\t * @returns A promise that resolves to a boolean indicating success.\r\n\t */\r\n\tasync remove(\r\n\t\tkey: string,\r\n\t\tcallback: () => void = () => {},\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<boolean> {\r\n\t\tkey = this._applyPrefix(key);\r\n\r\n\t\ttry {\r\n\t\t\tif (this._config.remove) {\r\n\t\t\t\treturn await this._config.remove(key, callback, errCallback);\r\n\t\t\t} else {\r\n\t\t\t\tif (!this._isBrowser) {\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlocalStorage.removeItem(key);\r\n\r\n\t\t\t\tcallback();\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\terrCallback(err);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Clears all values from storage.\r\n\t *\r\n\t * @param callback - The callback to execute on success.\r\n\t * @param errCallback - The callback to execute on error.\r\n\t * @returns A promise that resolves to a boolean indicating success.\r\n\t */\r\n\tasync clear(\r\n\t\tcallback?: () => void,\r\n\t\terrCallback?: (err: unknown) => void,\r\n\t): Promise<boolean> {\r\n\t\ttry {\r\n\t\t\tif (this._config.clear) {\r\n\t\t\t\tawait this._config.clear();\r\n\t\t\t} else {\r\n\t\t\t\tif (!this._isBrowser) {\r\n\t\t\t\t\tcallback?.();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlocalStorage.clear();\r\n\t\t\t}\r\n\r\n\t\t\tcallback?.();\r\n\r\n\t\t\treturn true;\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\terrCallback?.(err);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _prefix = '';\r\n\r\n\tprivate _config: StoreConfig;\r\n\r\n\t/**\r\n\t * Applies the configured prefix to a storage key.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @returns The prefixed storage key.\r\n\t */\r\n\tprivate _applyPrefix(key: string): string {\r\n\t\tif (this._config.prefix) {\r\n\t\t\tkey = this._config.prefix + key;\r\n\t\t}\r\n\r\n\t\tif (this._prefix) {\r\n\t\t\tkey = this._prefix + key;\r\n\t\t}\r\n\r\n\t\treturn key;\r\n\t}\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport { PLATFORM_ID, WritableSignal, inject, signal } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { CoreService } from '../services/core.service';\r\nimport { EmitterService } from '../services/emitter.service';\r\nimport { HttpService } from '../services/http.service';\r\nimport { NetworkService } from '../services/network.service';\r\nimport { StoreService } from '../services/store.service';\r\nimport { CrudDocument, CrudOptions } from './crud.interface';\r\n\r\ninterface CrudConfig<Document> {\r\n\tsignalFields?: Record<string, (doc: Document) => unknown>;\r\n\tname: string;\r\n\t_id?: string;\r\n\treplace?: (doc: Document) => void;\r\n\tunauthorized?: boolean;\r\n\tappId?: string;\r\n}\r\n\r\ninterface GetConfig {\r\n\tpage?: number;\r\n\tperPage?: number;\r\n\tquery?: string;\r\n}\r\n\r\n/**\r\n * Abstract class representing a CRUD (Create, Read, Update, Delete) service.\r\n *\r\n * This class provides methods for managing documents, interacting with an API,\r\n * and storing/retrieving data from local storage. It is designed to be extended\r\n * for specific document types.\r\n *\r\n * @template Document - The type of the document the service handles.\r\n */\r\nexport abstract class CrudService<Document extends CrudDocument<Document>> {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\t/**\r\n\t * Base URL for the API collection associated with this service.\r\n\t */\r\n\tprivate _url = '/api/';\r\n\r\n\t/**\r\n\t * In-memory cache with all documents currently known by the service.\r\n\t */\r\n\tprivate _docs: Document[] = [];\r\n\r\n\t/**\r\n\t * Number of documents per page for paginated `get()` calls.\r\n\t */\r\n\tprivate _perPage = 20;\r\n\r\n\t/**\r\n\t * Registered callbacks that recompute filtered document views.\r\n\t */\r\n\tprivate _filteredDocumentsCallbacks: (() => void)[] = [];\r\n\r\n\t/**\r\n\t * HTTP client wrapper used for API communication.\r\n\t */\r\n\tprotected __httpService = inject(HttpService);\r\n\r\n\t/**\r\n\t * Key–value storage service used to persist documents locally.\r\n\t */\r\n\tprotected __storeService = inject(StoreService);\r\n\r\n\t/**\r\n\t * Core helper service with utility methods (copy, debounce, toSignal, etc.).\r\n\t */\r\n\tprotected __coreService = inject(CoreService);\r\n\r\n\t/**\r\n\t * Global event bus for cross-service communication.\r\n\t */\r\n\tprotected __emitterService = inject(EmitterService);\r\n\r\n\t/**\r\n\t * Network status service used to queue work while offline.\r\n\t */\r\n\tprotected __networkService = inject(NetworkService);\r\n\r\n\t/**\r\n\t * Emits once when documents are restored from local storage on startup.\r\n\t */\r\n\tloaded: Observable<unknown>;\r\n\r\n\t/**\r\n\t * Emits once when the initial `get()` (without page param) completes.\r\n\t */\r\n\tgetted: Observable<unknown>;\r\n\r\n\tconstructor(private _config: CrudConfig<Document>) {\r\n\t\tthis._config.signalFields = this._config.signalFields || {};\r\n\r\n\t\tthis._url += this._config.name;\r\n\r\n\t\tthis.loaded = this.__emitterService.onComplete(\r\n\t\t\tthis._config.name + '_loaded',\r\n\t\t);\r\n\r\n\t\tthis.getted = this.__emitterService.onComplete(\r\n\t\t\tthis._config.name + '_getted',\r\n\t\t);\r\n\r\n\t\tif (this._config.unauthorized) {\r\n\t\t\tthis.restoreDocs();\r\n\t\t} else if (this._isBrowser && localStorage.getItem('waw_user')) {\r\n\t\t\tconst user = JSON.parse(localStorage.getItem('waw_user') as string);\r\n\r\n\t\t\tif (\r\n\t\t\t\tuser._id ===\r\n\t\t\t\tlocalStorage.getItem(this._config.name + 'waw_user_id')\r\n\t\t\t) {\r\n\t\t\t\tthis.restoreDocs();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.__emitterService.on('wipe').subscribe((): void => {\r\n\t\t\tthis.clearDocs();\r\n\r\n\t\t\tthis._filterDocuments();\r\n\t\t});\r\n\r\n\t\tthis.__emitterService.on('wacom_online').subscribe(() => {\r\n\t\t\tfor (const callback of this._onOnline) {\r\n\t\t\t\tcallback();\r\n\t\t\t}\r\n\r\n\t\t\tthis._onOnline.length = 0;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Cache of per-document signals indexed by document _id.\r\n\t * Prevents creating multiple signals for the same document.\r\n\t */\r\n\tprivate _signal: Record<string, WritableSignal<Document>> = {};\r\n\r\n\t/**\r\n\t * Cache of per (field,value) lists of document signals.\r\n\t * Key format: `${field}_${JSON.stringify(value)}`.\r\n\t */\r\n\tprivate _signals: Record<\r\n\t\tstring,\r\n\t\tWritableSignal<WritableSignal<Document>[]>\r\n\t> = {};\r\n\r\n\t/**\r\n\t * Cache of per-field maps: fieldValue -> array of document signals.\r\n\t */\r\n\tprivate _fieldSignals: Record<\r\n\t\tstring,\r\n\t\tWritableSignal<Record<string, WritableSignal<Document>[]>>\r\n\t> = {};\r\n\r\n\t/**\r\n\t * Returns a WritableSignal for a document by _id, creating it if absent.\r\n\t * Caches the signal to avoid redundant instances and initializes it\r\n\t * with the current snapshot of the document.\r\n\t * Work very carefully with this and localId, better avoid such flows.\r\n\t *\r\n\t * @param _id - Document identifier or a document instance.\r\n\t */\r\n\tgetSignal(_id: string | Document) {\r\n\t\tif (typeof _id !== 'string') {\r\n\t\t\t_id = this._id(_id);\r\n\t\t}\r\n\r\n\t\t// Reuse existing signal if present\r\n\t\tif (this._signal[_id]) {\r\n\t\t\treturn this._signal[_id];\r\n\t\t}\r\n\r\n\t\t// Always base the signal on the current canonical doc()\r\n\t\tconst doc = this.doc(_id);\r\n\r\n\t\tthis._signal[_id] = this.__coreService.toSignal(\r\n\t\t\tdoc,\r\n\t\t\tthis._config.signalFields,\r\n\t\t) as WritableSignal<Document>;\r\n\r\n\t\treturn this._signal[_id];\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a signal with an array of document signals that match\r\n\t * a given field/value pair.\r\n\t *\r\n\t * Example:\r\n\t * const activitiesSig = service.getSignals('userId', currentUserId);\r\n\t */\r\n\tgetSignals(field: string, value: unknown) {\r\n\t\tconst id = field + '_' + JSON.stringify(value);\r\n\r\n\t\tif (!this._signals[id]) {\r\n\t\t\tthis._signals[id] = signal<WritableSignal<Document>[]>(\r\n\t\t\t\tthis._getSignals(id),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\treturn this._signals[id];\r\n\t}\r\n\r\n\t/**\r\n\t * Builds the array of document signals for a given (field,value) key.\r\n\t * Only documents with a real _id are included.\r\n\t */\r\n\tprivate _getSignals(id: string): WritableSignal<Document>[] {\r\n\t\tconst sep = id.indexOf('_');\r\n\t\tif (sep === -1) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tconst field = id.slice(0, sep) as keyof Document;\r\n\t\tconst valueJson = id.slice(sep + 1);\r\n\r\n\t\tconst list: WritableSignal<Document>[] = [];\r\n\r\n\t\tfor (const doc of this.getDocs()) {\r\n\t\t\tif (JSON.stringify(doc[field] as unknown) !== valueJson) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst docId = this._id(doc);\r\n\t\t\tif (!docId) continue;\r\n\r\n\t\t\tlist.push(this.getSignal(docId));\r\n\t\t}\r\n\r\n\t\treturn list;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a signal with a map: fieldValue -> array of document signals.\r\n\t *\r\n\t * Example:\r\n\t * const byStatusSig = service.getFieldSignals('status');\r\n\t * byStatusSig() might be { active: [sig1, sig2], draft: [sig3] }.\r\n\t */\r\n\tgetFieldSignals(field: string) {\r\n\t\tif (!this._fieldSignals[field]) {\r\n\t\t\tthis._fieldSignals[field] = signal<\r\n\t\t\t\tRecord<string, WritableSignal<Document>[]>\r\n\t\t\t>(this._getFieldSignals(field));\r\n\t\t}\r\n\r\n\t\treturn this._fieldSignals[field];\r\n\t}\r\n\r\n\t/**\r\n\t * Builds the map for a given field.\r\n\t * Only documents with a real _id are included.\r\n\t */\r\n\tprivate _getFieldSignals(\r\n\t\tfield: string,\r\n\t): Record<string, WritableSignal<Document>[]> {\r\n\t\tconst byFields: Record<string, WritableSignal<Document>[]> = {};\r\n\r\n\t\tfor (const doc of this.getDocs()) {\r\n\t\t\tconst docId = this._id(doc);\r\n\t\t\tif (!docId) continue;\r\n\r\n\t\t\tconst value = String(doc[field as keyof Document]);\r\n\r\n\t\t\tif (!byFields[value]) {\r\n\t\t\t\tbyFields[value] = [];\r\n\t\t\t}\r\n\r\n\t\t\tbyFields[value].push(this.getSignal(docId));\r\n\t\t}\r\n\r\n\t\treturn byFields;\r\n\t}\r\n\r\n\t/**\r\n\t * Clears cached document signals except those explicitly preserved.\r\n\t * Useful when changing routes or contexts to reduce memory.\r\n\t *\r\n\t * @param exceptIds - List of ids whose signals should be kept.\r\n\t */\r\n\tremoveSignals(exceptIds: string[] = []) {\r\n\t\tfor (const _id in this._signal) {\r\n\t\t\tif (!exceptIds.includes(_id)) {\r\n\t\t\t\tdelete this._signal[_id];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Restores documents from local storage (if present) and syncs\r\n\t * all existing signals with the restored data.\r\n\t */\r\n\tasync restoreDocs() {\r\n\t\tconst docs = await this.__storeService.getJson<Document[]>(\r\n\t\t\t'docs_' + this._config.name,\r\n\t\t);\r\n\r\n\t\tif (docs?.length) {\r\n\t\t\tthis._docs.length = 0;\r\n\r\n\t\t\tthis._docs.push(...docs);\r\n\r\n\t\t\tthis._filterDocuments();\r\n\r\n\t\t\tfor (const doc of this._docs) {\r\n\t\t\t\tif (doc.__deleted) {\r\n\t\t\t\t\tthis.delete(doc, doc.__options?.['delete'] || {});\r\n\t\t\t\t} else if (!doc._id) {\r\n\t\t\t\t\tthis.create(doc, doc.__options?.['create'] || {});\r\n\t\t\t\t} else if (doc.__modified?.length) {\r\n\t\t\t\t\tfor (const id of doc.__modified) {\r\n\t\t\t\t\t\tif (id.startsWith('up')) {\r\n\t\t\t\t\t\t\tthis.update(doc, doc.__options?.[id] || {});\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.unique(doc, doc.__options?.[id] || {});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.__emitterService.complete(\r\n\t\t\t\tthis._config.name + '_loaded',\r\n\t\t\t\tthis._docs,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Saves the current set of documents to local storage.\r\n\t */\r\n\tsetDocs(): void {\r\n\t\tthis.__storeService.setJson<Document[]>(\r\n\t\t\t'docs_' + this._config.name,\r\n\t\t\tthis._docs,\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves the current list of documents.\r\n\t *\r\n\t * @returns The list of documents.\r\n\t */\r\n\tgetDocs(filter: (doc: Document) => boolean = () => true): Document[] {\r\n\t\treturn this._docs.filter(filter);\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves the first document that matches the given predicate.\r\n\t *\r\n\t * @param find - Predicate used to locate a specific document.\r\n\t */\r\n\tgetDoc(find: (doc: Document) => boolean): Document | undefined {\r\n\t\treturn this._docs.find(find);\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the current list of documents, persists the empty state\r\n\t * and recomputes all derived signals.\r\n\t *\r\n\t * Empties the internal documents array and saves the updated state to local storage.\r\n\t */\r\n\tclearDocs(): void {\r\n\t\tthis._docs.splice(0, this._docs.length);\r\n\r\n\t\tthis.setDocs();\r\n\r\n\t\tthis._updateSignals();\r\n\t}\r\n\r\n\t/**\r\n\t * Adds multiple documents to the service and saves them to local storage.\r\n\t *\r\n\t * @param docs - An array of documents to add.\r\n\t */\r\n\taddDocs(docs: Document[]): void {\r\n\t\tif (Array.isArray(docs)) {\r\n\t\t\tfor (const doc of docs) {\r\n\t\t\t\tthis.addDoc(doc);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a single document to the service. If it already exists, it will be updated.\r\n\t *\r\n\t * @param doc - The document to add.\r\n\t */\r\n\taddDoc(doc: Document): void {\r\n\t\tif (this._config.replace) {\r\n\t\t\tthis._config.replace(doc);\r\n\t\t}\r\n\r\n\t\tconst existingDoc = this._docs.find(\r\n\t\t\t(d) =>\r\n\t\t\t\t(this._id(doc) && this._id(d) === this._id(doc)) ||\r\n\t\t\t\t(doc._localId && d._localId === doc._localId),\r\n\t\t);\r\n\r\n\t\tif (existingDoc) {\r\n\t\t\tthis.__coreService.copy(doc, existingDoc);\r\n\t\t\tthis.__coreService.copy(existingDoc, doc);\r\n\t\t\tthis._syncSignalForDoc(existingDoc);\r\n\t\t} else {\r\n\t\t\tthis._docs.push(doc);\r\n\t\t\tthis._syncSignalForDoc(doc);\r\n\t\t}\r\n\r\n\t\tthis.setDocs();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new document with a temporary ID and status flags.\r\n\t *\r\n\t * @param doc - Optional base document to use for the new document.\r\n\t * @returns A new document instance with default properties.\r\n\t */\r\n\tnew(doc: Document = {} as Document): Document {\r\n\t\treturn {\r\n\t\t\t...doc,\r\n\t\t\t_id: undefined,\r\n\t\t\t_localId: this._localId(),\r\n\t\t\t__created: false,\r\n\t\t\t__modified: false,\r\n\t\t} as Document;\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves a document by its unique ID or creates a new one if it doesn't exist.\r\n\t *\r\n\t * @param _id - The document ID to search for.\r\n\t * @returns The found document or a new document if not found.\r\n\t */\r\n\tdoc(_id: string): Document {\r\n\t\t// If we already have a signal for this id, use its current value\r\n\t\tif (this._signal[_id]) {\r\n\t\t\treturn this._signal[_id]();\r\n\t\t}\r\n\r\n\t\tlet doc =\r\n\t\t\tthis._docs.find(\r\n\t\t\t\t(d) =>\r\n\t\t\t\t\tthis._id(d) === _id ||\r\n\t\t\t\t\t(d._localId && d._localId === Number(_id)),\r\n\t\t\t) || null;\r\n\r\n\t\t// If doc not found, create + push into _docs so it is not detached\r\n\t\tif (!doc) {\r\n\t\t\tdoc = this.new({ _id } as Document);\r\n\t\t\tthis._docs.push(doc);\r\n\t\t\tthis.setDocs();\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t!this._docs.find((d) => this._id(d) === _id) &&\r\n\t\t\t!this._fetchingId[_id]\r\n\t\t) {\r\n\t\t\tthis._fetchingId[_id] = true;\r\n\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis.fetch({ _id }).subscribe((_doc: Document) => {\r\n\t\t\t\t\tthis._fetchingId[_id] = false;\r\n\r\n\t\t\t\t\tif (_doc) {\r\n\t\t\t\t\t\tthis.__coreService.copy(_doc, doc as Document);\r\n\t\t\t\t\t\tthis._syncSignalForDoc(doc as Document);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn doc as Document;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the number of documents to display per page.\r\n\t *\r\n\t * @param _perPage - Number of documents per page.\r\n\t */\r\n\tsetPerPage(_perPage: number): void {\r\n\t\tthis._perPage = _perPage;\r\n\t}\r\n\r\n\t/**\r\n\t * Fetches a list of documents from the API with optional pagination.\r\n\t *\r\n\t * @param config - Optional pagination configuration.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the list of documents.\r\n\t */\r\n\tget(\r\n\t\tconfig: GetConfig = {},\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document[]> {\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.get(config, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\tthis._isBrowser &&\r\n\t\t\t!this._config.unauthorized &&\r\n\t\t\tlocalStorage.getItem('waw_user')\r\n\t\t) {\r\n\t\t\tconst user = JSON.parse(localStorage.getItem('waw_user') as string);\r\n\r\n\t\t\tlocalStorage.setItem(this._config.name + 'waw_user_id', user._id);\r\n\t\t}\r\n\r\n\t\tconst url = `${this._url}/get${options.name || ''}`;\r\n\r\n\t\tconst params =\r\n\t\t\t(typeof config.page === 'number' || config.query ? '?' : '') +\r\n\t\t\t(config.query || '') +\r\n\t\t\t(typeof config.page === 'number'\r\n\t\t\t\t? `&skip=${this._perPage * (config.page - 1)}&limit=${this._perPage}`\r\n\t\t\t\t: '');\r\n\r\n\t\tconst obs = this.__httpService.get(`${url}${params}`);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown): void => {\r\n\t\t\t\tresp = resp || [];\r\n\r\n\t\t\t\tif (typeof config.page !== 'number') {\r\n\t\t\t\t\tthis.clearDocs();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t(resp as Document[]).forEach((doc) => this.addDoc(doc));\r\n\r\n\t\t\t\tif (options.callback) {\r\n\t\t\t\t\toptions.callback(resp as Document[]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (typeof config.page !== 'number') {\r\n\t\t\t\t\tthis._filterDocuments();\r\n\r\n\t\t\t\t\tthis.__emitterService.complete(\r\n\t\t\t\t\t\tthis._config.name + '_getted',\r\n\t\t\t\t\t\tthis._docs,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(\r\n\t\t\t\t\t`${this._config.name}_get`,\r\n\t\t\t\t\tthis._docs,\r\n\t\t\t\t);\r\n\r\n\t\t\t\tthis.__emitterService.emit(\r\n\t\t\t\t\t`${this._config.name}_changed`,\r\n\t\t\t\t\tthis._docs,\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown): void => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document[]>;\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a request to the API to create a new document.\r\n\t *\r\n\t * @param doc - The document to create.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the created document, or emits an error if already created.\r\n\t */\r\n\tcreate(\r\n\t\tdoc: Document = {} as Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tif (doc._id) {\r\n\t\t\treturn this.update(doc, options);\r\n\t\t}\r\n\r\n\t\tdoc._localId ||= this._localId();\r\n\r\n\t\tdoc.__options ||= {};\r\n\r\n\t\tdoc.__options['create'] = options;\r\n\r\n\t\tthis.addDoc(doc);\r\n\r\n\t\tthis._filterDocuments();\r\n\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.create(doc, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (doc.__creating) {\r\n\t\t\t// Emit an error observable if the document is already created\r\n\t\t\treturn new Observable<Document>((observer) => {\r\n\t\t\t\tobserver.error(\r\n\t\t\t\t\tnew Error('Document is currently already creating.'),\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this._config.appId) {\r\n\t\t\tdoc.appId = this._config.appId;\r\n\t\t}\r\n\r\n\t\tdoc.__creating = true;\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/create${options.name || ''}`,\r\n\t\t\tdoc,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\tif (resp) {\r\n\t\t\t\t\tthis.__coreService.copy(resp, doc);\r\n\r\n\t\t\t\t\tthis.addDoc(doc);\r\n\r\n\t\t\t\t\tthis._filterDocuments();\r\n\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdoc.__creating = false;\r\n\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(resp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_create`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_list`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_changed`, doc);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tdoc.__creating = false;\r\n\r\n\t\t\t\tif (options.errCallback) options.errCallback(err);\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Fetches a document from the API based on a query.\r\n\t *\r\n\t * @param query - The query object used to filter documents.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the fetched document.\r\n\t */\r\n\tfetch(\r\n\t\tquery: object = {},\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.fetch(query, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/fetch${options.name || ''}`,\r\n\t\t\tquery,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (doc: unknown) => {\r\n\t\t\t\tif (doc) {\r\n\t\t\t\t\tthis.addDoc(doc as Document);\r\n\r\n\t\t\t\t\tthis._filterDocuments();\r\n\r\n\t\t\t\t\tif (options.callback) options.callback(doc as Document);\r\n\r\n\t\t\t\t\tthis.__emitterService.emit(\r\n\t\t\t\t\t\t`${this._config.name}_changed`,\r\n\t\t\t\t\t\tdoc,\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(doc as Document);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates a document after a specified delay and returns an observable.\r\n\t *\r\n\t * @param doc - The document to update.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that emits the updated document.\r\n\t */\r\n\tupdateAfterWhile(\r\n\t\tdoc: Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\treturn new Observable<Document>((observer) => {\r\n\t\t\tthis.__coreService.afterWhile(this._id(doc), () => {\r\n\t\t\t\tthis.update(doc, options).subscribe({\r\n\t\t\t\t\tnext: (updatedDoc) => {\r\n\t\t\t\t\t\tobserver.next(updatedDoc); // Emit the updated document\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror: (err) => {\r\n\t\t\t\t\t\tobserver.error(err); // Forward the error\r\n\t\t\t\t\t},\r\n\t\t\t\t\tcomplete: () => {\r\n\t\t\t\t\t\tobserver.complete(); // Complete the observable\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Updates a document in the API.\r\n\t *\r\n\t * @param doc - The document to update.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the updated document.\r\n\t */\r\n\tupdate(\r\n\t\tdoc: Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tthis._updateModified(doc, 'up' + (options.name || ''), options);\r\n\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.update(doc, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/update${options.name || ''}`,\r\n\t\t\tdoc,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\tif (resp) {\r\n\t\t\t\t\tthis._removeModified(doc, 'up' + (options.name || ''));\r\n\r\n\t\t\t\t\tconst storedDoc = this.doc(doc._id as string);\r\n\r\n\t\t\t\t\tthis.__coreService.copy(resp, storedDoc);\r\n\t\t\t\t\tthis.__coreService.copy(resp, doc);\r\n\r\n\t\t\t\t\tthis._syncSignalForDoc(storedDoc);\r\n\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(resp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_update`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_changed`, doc);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Unique update a document field in the API.\r\n\t *\r\n\t * @param doc - The document to update.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the updated document.\r\n\t */\r\n\tunique(\r\n\t\tdoc: Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tthis._updateModified(doc, 'un' + (options.name || ''), options);\r\n\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.unique(doc, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/unique${options.name || ''}`,\r\n\t\t\tdoc,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\tif (resp) {\r\n\t\t\t\t\tthis._removeModified(doc, 'un' + (options.name || ''));\r\n\r\n\t\t\t\t\t(doc as any)[options.name as string] = resp;\r\n\r\n\t\t\t\t\tthis._syncSignalForDoc(doc);\r\n\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(resp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_unique`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_changed`, doc);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Deletes a document from the API.\r\n\t *\r\n\t * @param doc - The document to delete.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the deleted document.\r\n\t */\r\n\tdelete(\r\n\t\tdoc: Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tdoc.__deleted = true;\r\n\r\n\t\tdoc.__options ||= {};\r\n\t\tdoc.__options['delete'] = options;\r\n\r\n\t\tthis.addDoc(doc);\r\n\t\tthis._filterDocuments();\r\n\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.delete(doc, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/delete${options.name || ''}`,\r\n\t\t\tdoc,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\tif (resp) {\r\n\t\t\t\t\tconst idx = this._docs.findIndex(\r\n\t\t\t\t\t\t(d) => this._id(d) === this._id(doc),\r\n\t\t\t\t\t);\r\n\t\t\t\t\tif (idx !== -1) {\r\n\t\t\t\t\t\tthis._docs.splice(idx, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.setDocs();\r\n\r\n\t\t\t\t\t// We keep signal but mark it deleted and recompute mappings.\r\n\t\t\t\t\tthis._syncSignalForDoc({\r\n\t\t\t\t\t\t...doc,\r\n\t\t\t\t\t\t__deleted: true,\r\n\t\t\t\t\t} as Document);\r\n\r\n\t\t\t\t\tthis._filterDocuments();\r\n\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(resp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_delete`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_changed`, doc);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Registers a filtered view of documents and returns the recompute callback.\r\n\t *\r\n\t * The callback is called automatically whenever `_filterDocuments()` runs.\r\n\t */\r\n\tfilteredDocuments(\r\n\t\tstoreObjectOrArray: Record<string, Document[]> | Document[],\r\n\t\tconfig: {\r\n\t\t\tfield?: string | ((doc: Document) => string);\r\n\t\t\tvalid?: (doc: Document) => boolean;\r\n\t\t\tsort?: (a: Document, b: Document) => number;\r\n\t\t\tfiltered?: (\r\n\t\t\t\tstoreObjectOrArray: Record<string, Document[]> | Document[],\r\n\t\t\t) => void;\r\n\t\t} = {},\r\n\t) {\r\n\t\tconst callback = (): void => {\r\n\t\t\tif (Array.isArray(storeObjectOrArray)) {\r\n\t\t\t\tlet result = this._docs\r\n\t\t\t\t\t.filter((doc) => !doc.__deleted)\r\n\t\t\t\t\t.filter(config.valid ?? (() => true));\r\n\r\n\t\t\t\tstoreObjectOrArray.length = 0;\r\n\r\n\t\t\t\tif (typeof config.sort === 'function') {\r\n\t\t\t\t\tresult = result.sort(config.sort);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tstoreObjectOrArray.push(...result);\r\n\t\t\t} else {\r\n\t\t\t\tconst storeObject = storeObjectOrArray as Record<\r\n\t\t\t\t\tstring,\r\n\t\t\t\t\tDocument[]\r\n\t\t\t\t>;\r\n\r\n\t\t\t\t/* remove docs if they were removed */\r\n\t\t\t\tfor (const parentId in storeObject) {\r\n\t\t\t\t\tfor (\r\n\t\t\t\t\t\tlet i = storeObject[parentId].length - 1;\r\n\t\t\t\t\t\ti >= 0;\r\n\t\t\t\t\t\ti--\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tconst _field =\r\n\t\t\t\t\t\t\ttypeof config.field === 'function'\r\n\t\t\t\t\t\t\t\t? config.field(storeObject[parentId][i])\r\n\t\t\t\t\t\t\t\t: config.field || 'author';\r\n\t\t\t\t\t\tconst _doc: any = storeObject[parentId][i];\r\n\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t!this._docs.find((doc: any) =>\r\n\t\t\t\t\t\t\t\tArray.isArray(doc[_field])\r\n\t\t\t\t\t\t\t\t\t? doc[_field].includes(_doc[this._id(doc)])\r\n\t\t\t\t\t\t\t\t\t: doc[_field] === _doc[this._id(doc)],\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tstoreObject[parentId].splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* add docs if they are not added */\r\n\t\t\t\tfor (const doc of this._docs) {\r\n\t\t\t\t\tif (doc.__deleted) continue;\r\n\r\n\t\t\t\t\tconst _field =\r\n\t\t\t\t\t\ttypeof config.field === 'function'\r\n\t\t\t\t\t\t\t? config.field(doc)\r\n\t\t\t\t\t\t\t: config.field || 'author';\r\n\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\ttypeof config.valid === 'function'\r\n\t\t\t\t\t\t\t? !config.valid(doc)\r\n\t\t\t\t\t\t\t: Array.isArray((doc as any)[_field])\r\n\t\t\t\t\t\t\t\t? !(doc as any)[_field]?.length\r\n\t\t\t\t\t\t\t\t: !(doc as any)[_field]\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (typeof config.field === 'function') {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tconfig.field(doc) &&\r\n\t\t\t\t\t\t\t!storeObject[(doc as any)[_field]].find(\r\n\t\t\t\t\t\t\t\t(c) => c._id === doc._id,\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tstoreObject[(doc as any)[_field]].push(doc);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (Array.isArray((doc as any)[_field])) {\r\n\t\t\t\t\t\t(doc as any)[_field].forEach((_field: string) => {\r\n\t\t\t\t\t\t\tstoreObject[_field] = storeObject[_field] || [];\r\n\r\n\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t!storeObject[_field].find(\r\n\t\t\t\t\t\t\t\t\t(c) => c._id === doc._id,\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\tstoreObject[_field].push(doc);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstoreObject[(doc as any)[_field]] =\r\n\t\t\t\t\t\t\tstoreObject[(doc as any)[_field]] || [];\r\n\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t!storeObject[(doc as any)[_field]].find(\r\n\t\t\t\t\t\t\t\t(c) => c._id === doc._id,\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tstoreObject[(doc as any)[_field]].push(doc);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* sort the array's */\r\n\t\t\t\tif (typeof config.sort === 'function') {\r\n\t\t\t\t\tfor (const parentId in storeObject) {\r\n\t\t\t\t\t\tstoreObject[parentId].sort(config.sort);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconfig.filtered?.(storeObjectOrArray);\r\n\t\t};\r\n\r\n\t\tthis._filteredDocumentsCallbacks.push(callback);\r\n\r\n\t\treturn callback;\r\n\t}\r\n\r\n\t/**\r\n\t * Track pending fetch-by-id requests to avoid duplicate calls.\r\n\t */\r\n\tprivate _fetchingId: Record<string, boolean> = {};\r\n\r\n\t/**\r\n\t * Queue of operations that must be retried when network comes back online.\r\n\t */\r\n\tprivate _onOnline: (() => void)[] = [];\r\n\r\n\t/**\r\n\t * Local counter used to build unique local identifiers together with Date.now().\r\n\t */\r\n\tprivate _randomCount = 0;\r\n\r\n\t/**\r\n\t * Generates a unique ID for a document when using local-only identifiers.\r\n\t *\r\n\t * @returns The unique ID as a number.\r\n\t */\r\n\tprivate _localId() {\r\n\t\treturn Number(Date.now() + '' + this._randomCount++);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the configured identity field for the given document as string.\r\n\t *\r\n\t * @param doc - The document for which to generate the ID.\r\n\t * @returns The unique ID as a string.\r\n\t */\r\n\tprivate _id(doc: Document): string {\r\n\t\treturn (doc as unknown as Record<string, unknown>)[\r\n\t\t\tthis._config._id || '_id'\r\n\t\t]?.toString() as string;\r\n\t}\r\n\r\n\t/**\r\n\t * Executes all registered filter document callbacks and emits a\r\n\t * `<name>_filtered` event.\r\n\t */\r\n\tprivate _filterDocuments(): void {\r\n\t\tfor (const callback of this._filteredDocumentsCallbacks) {\r\n\t\t\tcallback();\r\n\t\t}\r\n\r\n\t\tthis.__emitterService.emit(`${this._config.name}_filtered`);\r\n\t}\r\n\r\n\t/**\r\n\t * Marks a document as modified for a given operation id and\r\n\t * keeps the document in the store until the operation is confirmed.\r\n\t */\r\n\tprivate _updateModified(\r\n\t\tdoc: Document,\r\n\t\tid: string,\r\n\t\toptions: CrudOptions<Document>,\r\n\t) {\r\n\t\tdoc.__modified ||= [];\r\n\r\n\t\tdoc.__options ||= {};\r\n\r\n\t\tdoc.__options[id] = options;\r\n\r\n\t\tif (!doc.__modified.find((m) => m === id)) {\r\n\t\t\tdoc.__modified.push(id);\r\n\r\n\t\t\tthis.addDoc(doc);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a modification mark from the document once the\r\n\t * server operation is confirmed.\r\n\t */\r\n\tprivate _removeModified(doc: Document, id: string) {\r\n\t\tdoc.__modified ||= [];\r\n\r\n\t\tif (doc.__modified.find((m) => m === id)) {\r\n\t\t\tdoc.__modified.splice(\r\n\t\t\t\tdoc.__modified.findIndex((m) => m === id),\r\n\t\t\t\t1,\r\n\t\t\t);\r\n\r\n\t\t\tthis.addDoc(doc);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Syncs a single document's signal (if exists) and refreshes all\r\n\t * derived collections (field/value lists and field maps).\r\n\t */\r\n\tprivate _syncSignalForDoc(doc: Document) {\r\n\t\tconst id = this._id(doc);\r\n\r\n\t\tif (id && this._signal[id]) {\r\n\t\t\tthis._signal[id].set(doc);\r\n\t\t}\r\n\r\n\t\tthis._updateSignals();\r\n\t}\r\n\r\n\t/**\r\n\t * Rebuilds all derived signal collections:\r\n\t * - all per (field,value) lists of document signals\r\n\t * - all per-field maps value -> [signals]\r\n\t *\r\n\t * This keeps `getSignals()` and `getFieldSignals()` in sync after\r\n\t * any mutation that touches `_docs`.\r\n\t */\r\n\tprivate _updateSignals() {\r\n\t\t// refresh all (field,value) collections\r\n\t\tfor (const key in this._signals) {\r\n\t\t\tthis._signals[key].set(this._getSignals(key));\r\n\t\t}\r\n\r\n\t\t// refresh all per-field maps\r\n\t\tfor (const field in this._fieldSignals) {\r\n\t\t\tthis._fieldSignals[field].set(this._getFieldSignals(field));\r\n\t\t}\r\n\t}\r\n}\r\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tApplicationRef,\r\n\tComponentRef,\r\n\tEmbeddedViewRef,\r\n\tEnvironmentInjector,\r\n\tInjectable,\r\n\tPLATFORM_ID,\r\n\tType,\r\n\tcreateComponent,\r\n\tinject,\r\n} from '@angular/core';\r\nimport { DomComponent } from '../interfaces/dom.interface';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\n/**\r\n * Utility service for programmatically creating and interacting with Angular\r\n * components within the DOM.\r\n */\r\nexport class DomService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\t/**\r\n\t * Appends a component to a specified element by ID.\r\n\t *\r\n\t * @param component - The component to append.\r\n\t * @param options - The options to project into the component.\r\n\t * @param id - The ID of the element to append the component to.\r\n\t * @returns An object containing the native element and the component reference.\r\n\t */\r\n\tappendById<T>(\r\n\t\tcomponent: Type<T>,\r\n\t\toptions: Partial<T> = {},\r\n\t\tid: string,\r\n\t): DomComponent<T> {\r\n\t\tconst componentRef = createComponent(component, {\r\n\t\t\tenvironmentInjector: this._injector,\r\n\t\t});\r\n\r\n\t\tthis.projectComponentInputs(componentRef, options);\r\n\r\n\t\tthis._appRef.attachView(componentRef.hostView);\r\n\r\n\t\tconst domElem = (componentRef.hostView as EmbeddedViewRef<T>)\r\n\t\t\t.rootNodes[0] as HTMLElement;\r\n\r\n\t\tconst element = this._doc.getElementById(id);\r\n\r\n\t\tif (\r\n\t\t\tthis._isBrowser &&\r\n\t\t\telement &&\r\n\t\t\ttypeof element.appendChild === 'function'\r\n\t\t) {\r\n\t\t\telement.appendChild(domElem);\r\n\t\t}\r\n\r\n\t\tcomponentRef.changeDetectorRef.detectChanges();\r\n\r\n\t\treturn {\r\n\t\t\tnativeElement: domElem,\r\n\t\t\tcomponentRef: componentRef,\r\n\t\t\tremove: () => this.removeComponent(componentRef),\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Appends a component to a specified element or to the body.\r\n\t *\r\n\t * @param component - The component to append.\r\n\t * @param options - The options to project into the component.\r\n\t * @param element - The element to append the component to. Defaults to body.\r\n\t * @returns An object containing the native element and the component reference.\r\n\t */\r\n\tappendComponent<T>(\r\n\t\tcomponent: Type<T>,\r\n\t\toptions: Partial<T & { providedIn?: string }> = {},\r\n\t\telement?: HTMLElement,\r\n\t): DomComponent<T> | void {\r\n\t\tif (options.providedIn) {\r\n\t\t\tif (this._providedIn[options.providedIn]) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._providedIn[options.providedIn] = true;\r\n\t\t}\r\n\r\n\t\tconst componentRef = createComponent(component, {\r\n\t\t\tenvironmentInjector: this._injector,\r\n\t\t});\r\n\r\n\t\tthis.projectComponentInputs(componentRef, options);\r\n\r\n\t\tthis._appRef.attachView(componentRef.hostView);\r\n\r\n\t\tconst domElem = (componentRef.hostView as EmbeddedViewRef<T>)\r\n\t\t\t.rootNodes[0] as HTMLElement;\r\n\r\n\t\tconst target = element || this._doc.body;\r\n\t\tif (\r\n\t\t\tthis._isBrowser &&\r\n\t\t\ttarget &&\r\n\t\t\ttypeof target.appendChild === 'function'\r\n\t\t) {\r\n\t\t\ttarget.appendChild(domElem);\r\n\t\t}\r\n\r\n\t\tcomponentRef.changeDetectorRef.detectChanges();\r\n\r\n\t\treturn {\r\n\t\t\tnativeElement: domElem,\r\n\t\t\tcomponentRef: componentRef,\r\n\t\t\tremove: () =>\r\n\t\t\t\tthis.removeComponent(componentRef, options.providedIn),\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a reference to a dynamically created component.\r\n\t *\r\n\t * @param component - The component to create.\r\n\t * @param options - The options to project into the component.\r\n\t * @returns The component reference.\r\n\t */\r\n\tgetComponentRef<T>(\r\n\t\tcomponent: Type<T>,\r\n\t\toptions: Partial<T> = {},\r\n\t): ComponentRef<T> {\r\n\t\tconst componentRef = createComponent(component, {\r\n\t\t\tenvironmentInjector: this._injector,\r\n\t\t});\r\n\r\n\t\tthis.projectComponentInputs(componentRef, options);\r\n\r\n\t\tthis._appRef.attachView(componentRef.hostView);\r\n\r\n\t\tcomponentRef.changeDetectorRef.detectChanges();\r\n\r\n\t\treturn componentRef;\r\n\t}\r\n\r\n\t/**\r\n\t * Projects the inputs onto the component.\r\n\t *\r\n\t * @param component - The component reference.\r\n\t * @param options - The options to project into the component.\r\n\t * @returns The component reference with the projected inputs.\r\n\t */\r\n\tprivate projectComponentInputs<T>(\r\n\t\tcomponent: ComponentRef<T>,\r\n\t\toptions: Partial<T>,\r\n\t): ComponentRef<T> {\r\n\t\tif (options) {\r\n\t\t\tconst props = Object.getOwnPropertyNames(options);\r\n\r\n\t\t\tfor (const prop of props) {\r\n\t\t\t\t(component.instance as any)[prop] = (options as any)[prop];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn component;\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a previously attached component and optionally clears its\r\n\t * unique `providedIn` flag.\r\n\t *\r\n\t * @param componentRef - Reference to the component to be removed.\r\n\t * @param providedIn - Optional key used to track unique instances.\r\n\t */\r\n\tremoveComponent<T>(\r\n\t\tcomponentRef: ComponentRef<T>,\r\n\t\tprovidedIn?: string,\r\n\t): void {\r\n\t\tthis._appRef.detachView(componentRef.hostView);\r\n\r\n\t\tcomponentRef.destroy();\r\n\r\n\t\tif (providedIn) {\r\n\t\t\tdelete this._providedIn[providedIn];\r\n\t\t}\r\n\t}\r\n\r\n\t/** Reference to the root application used for view attachment. */\r\n\tprivate _appRef = inject(ApplicationRef);\r\n\r\n\t/** Injector utilized when creating dynamic components. */\r\n\tprivate _injector = inject(EnvironmentInjector);\r\n\r\n\t/** Document reference (browser or SSR shim). */\r\n\tprivate _doc = inject(DOCUMENT);\r\n\r\n\t/**\r\n\t * Flags to ensure components with a specific `providedIn` key are only\r\n\t * instantiated once at a time.\r\n\t */\r\n\tprivate _providedIn: Record<string, boolean> = {};\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\r\n\r\n/**\r\n * RtcService handles WebRTC peer connections and local media stream setup.\r\n * It provides functionality to initialize the user's camera/microphone,\r\n * manage multiple peer connections, and handle offer/answer negotiation.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class RtcService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\t/**\r\n\t * Map of peer connections, keyed by peer ID.\r\n\t */\r\n\tprivate _peers = new Map<string, RTCPeerConnection>();\r\n\r\n\t/**\r\n\t * Local media stream from user's camera and microphone.\r\n\t */\r\n\tprivate _localStream: MediaStream | null = null;\r\n\r\n\t/**\r\n\t * Initializes the local media stream (audio/video).\r\n\t * Requests permissions and stores the stream internally.\r\n\t */\r\n\tasync initLocalStream(): Promise<MediaStream> {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tif (!this._localStream) {\r\n\t\t\tthis._localStream = await navigator.mediaDevices.getUserMedia({\r\n\t\t\t\tvideo: true,\r\n\t\t\t\taudio: true,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this._localStream;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new RTCPeerConnection for the given ID and attaches local tracks.\r\n\t */\r\n\tasync createPeer(id: string): Promise<RTCPeerConnection> {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tconst peer = new RTCPeerConnection();\r\n\r\n\t\tthis._localStream\r\n\t\t\t?.getTracks()\r\n\t\t\t.forEach((track) => peer.addTrack(track, this._localStream!));\r\n\r\n\t\tthis._peers.set(id, peer);\r\n\r\n\t\treturn peer;\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves an existing peer connection by ID.\r\n\t */\r\n\tgetPeer(id: string): RTCPeerConnection | undefined {\r\n\t\treturn this._peers.get(id);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates an SDP offer for the specified peer and sets it as the local description.\r\n\t */\r\n\tasync createOffer(id: string): Promise<RTCSessionDescriptionInit> {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (!peer) throw new Error('Peer not found');\r\n\r\n\t\tconst offer = await peer.createOffer();\r\n\r\n\t\tawait peer.setLocalDescription(offer);\r\n\r\n\t\treturn offer;\r\n\t}\r\n\r\n\t/**\r\n\t * Accepts an SDP offer, creates an answer, and sets it as the local description.\r\n\t */\r\n\tasync createAnswer(\r\n\t\tid: string,\r\n\t\toffer: RTCSessionDescriptionInit,\r\n\t): Promise<RTCSessionDescriptionInit> {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (!peer) throw new Error('Peer not found');\r\n\r\n\t\tawait peer.setRemoteDescription(new RTCSessionDescription(offer));\r\n\r\n\t\tconst answer = await peer.createAnswer();\r\n\r\n\t\tawait peer.setLocalDescription(answer);\r\n\r\n\t\treturn answer;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the remote description with an SDP answer for the given peer.\r\n\t */\r\n\tasync setRemoteAnswer(id: string, answer: RTCSessionDescriptionInit) {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (!peer) throw new Error('Peer not found');\r\n\r\n\t\tawait peer.setRemoteDescription(new RTCSessionDescription(answer));\r\n\t}\r\n\r\n\t/**\r\n\t * Adds an ICE candidate to the specified peer connection.\r\n\t */\r\n\taddIceCandidate(id: string, candidate: RTCIceCandidateInit) {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (peer) peer.addIceCandidate(new RTCIceCandidate(candidate));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the initialized local media stream.\r\n\t */\r\n\tgetLocalStream(): MediaStream | null {\r\n\t\treturn this._localStream;\r\n\t}\r\n\r\n\t/**\r\n\t * Closes a specific peer connection and removes it from the map.\r\n\t */\r\n\tclosePeer(id: string) {\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (peer) {\r\n\t\t\tpeer.close();\r\n\r\n\t\t\tthis._peers.delete(id);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Closes all peer connections and stops the local media stream.\r\n\t */\r\n\tcloseAll() {\r\n\t\tthis._peers.forEach((peer) => peer.close());\r\n\r\n\t\tthis._peers.clear();\r\n\r\n\t\tthis._localStream?.getTracks().forEach((track) => track.stop());\r\n\r\n\t\tthis._localStream = null;\r\n\t}\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInject,\r\n\tinject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n} from '@angular/core';\r\nimport {\r\n\tConfig,\r\n\tCONFIG_TOKEN,\r\n\tDEFAULT_CONFIG,\r\n} from '../interfaces/config.interface';\r\nimport { EmitterService } from './emitter.service';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class SocketService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tprivate _url = '';\r\n\r\n\tprivate _io: any;\r\n\r\n\tprivate _connected = false;\r\n\r\n\tprivate _opts: any = {};\r\n\r\n\tconstructor(@Inject(CONFIG_TOKEN) @Optional() private _config: Config) {\r\n\t\tthis._config = { ...DEFAULT_CONFIG, ...(this._config || {}) };\r\n\r\n\t\tif (!this._isBrowser) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._config.io) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst url = new URL(window.location.origin);\r\n\r\n\t\tif (typeof this._config.socket === 'object') {\r\n\t\t\tif (this._config.socket.port) {\r\n\t\t\t\turl.port = this._config.socket.port;\r\n\t\t\t}\r\n\r\n\t\t\tif (this._config.socket.opts) {\r\n\t\t\t\tthis._opts = this._config.socket.opts;\r\n\t\t\t}\r\n\r\n\t\t\tthis._url = this._config.socket.url ?? url.origin;\r\n\t\t} else {\r\n\t\t\tthis._url = url.origin;\r\n\t\t}\r\n\r\n\t\tif (this._config.socket) {\r\n\t\t\tthis.load();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the URL for the WebSocket connection and reloads the socket.\r\n\t * @param url - The URL of the WebSocket server.\r\n\t */\r\n\tsetUrl(url: string): void {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!this._config.socket) {\r\n\t\t\tthis._config.socket = true;\r\n\t\t}\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis.load();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Loads and initializes the WebSocket connection.\r\n\t */\r\n\tprivate load(): void {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tif (this._config.io) {\r\n\t\t\tconst ioFunc = this._config.io.default\r\n\t\t\t\t? this._config.io.default\r\n\t\t\t\t: this._config.io;\r\n\r\n\t\t\tthis._io = ioFunc(this._url, this._opts);\r\n\r\n\t\t\tthis._io.on('connect', () => {\r\n\t\t\t\tthis._connected = true;\r\n\r\n\t\t\t\tthis._emitterService.complete('socket');\r\n\t\t\t});\r\n\r\n\t\t\tthis._io.on('disconnect', (reason: any) => {\r\n\t\t\t\tthis._connected = false;\r\n\r\n\t\t\t\tthis._emitterService.emit('socket_disconnect', reason);\r\n\r\n\t\t\t\tconsole.warn('Socket disconnected', reason);\r\n\t\t\t});\r\n\r\n\t\t\tthis._io.on('error', (err: any) => {\r\n\t\t\t\tthis._connected = false;\r\n\r\n\t\t\t\tthis._emitterService.emit('socket_error', err);\r\n\r\n\t\t\t\tconsole.warn('Socket error', err);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnects the WebSocket connection and resets the connection state.\r\n\t */\r\n\tdisconnect(): void {\r\n\t\tif (this._io) {\r\n\t\t\tthis._io.disconnect();\r\n\t\t}\r\n\r\n\t\tthis._connected = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Subscribes to a WebSocket event.\r\n\t * @param to - The event to subscribe to.\r\n\t * @param cb - The callback function to execute when the event is received.\r\n\t */\r\n\ton(to: string, cb: (message: any) => void = () => {}): void {\r\n\t\tif (!this._config.socket) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._io) {\r\n\t\t\tconsole.warn('Socket client not loaded.');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._connected) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis.on(to, cb);\r\n\t\t\t}, 100);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._io.on(to, cb);\r\n\t}\r\n\r\n\t/**\r\n\t * Emits a message to a WebSocket event.\r\n\t * @param to - The event to emit the message to.\r\n\t * @param message - The message to emit.\r\n\t * @param room - Optional room to emit the message to.\r\n\t */\r\n\temit(to: string, message: any, room: any = false): void {\r\n\t\tif (!this._config.socket) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._io) {\r\n\t\t\tconsole.warn('Socket client not loaded.');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._connected) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis.emit(to, message, room);\r\n\t\t\t}, 100);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._io.emit(to, message, room);\r\n\t}\r\n\r\n\tprivate _emitterService = inject(EmitterService);\r\n}\r\n","import { DatePipe } from '@angular/common';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class TimeService {\r\n\tprivate _weekDays = [\r\n\t\t'Sunday',\r\n\t\t'Monday',\r\n\t\t'Tuesday',\r\n\t\t'Wednesday',\r\n\t\t'Thursday',\r\n\t\t'Friday',\r\n\t\t'Saturday',\r\n\t];\r\n\r\n\tprivate _monthNames = [\r\n\t\t'January',\r\n\t\t'February',\r\n\t\t'March',\r\n\t\t'April',\r\n\t\t'May',\r\n\t\t'June',\r\n\t\t'July',\r\n\t\t'August',\r\n\t\t'September',\r\n\t\t'October',\r\n\t\t'November',\r\n\t\t'December',\r\n\t];\r\n\r\n\tconstructor(private _datePipe: DatePipe) {}\r\n\r\n\t/**\r\n\t * Returns the name of the day of the week for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the day of the week.\r\n\t * @param format - The format in which to return the day name. Default is 'long'.\r\n\t * @returns The name of the day of the week.\r\n\t */\r\n\tgetDayName(date: Date, format: 'short' | 'long' = 'long'): string {\r\n\t\tconst dayIndex = date.getDay();\r\n\t\treturn format === 'short'\r\n\t\t\t? this._weekDays[dayIndex].substring(0, 3)\r\n\t\t\t: this._weekDays[dayIndex];\r\n\t}\r\n\t/**\r\n\t * Returns the name of the month for a given index.\r\n\t *\r\n\t * @param monthIndex - The month index (0-11).\r\n\t * @param format - The format in which to return the month name. Default is 'long'.\r\n\t * @returns The name of the month.\r\n\t */\r\n\tgetMonthName(\r\n\t\tmonthIndex: number,\r\n\t\tformat: 'short' | 'long' = 'long',\r\n\t): string {\r\n\t\tif (\r\n\t\t\t!Number.isInteger(monthIndex) ||\r\n\t\t\tmonthIndex < 0 ||\r\n\t\t\tmonthIndex > 11\r\n\t\t) {\r\n\t\t\tthrow new RangeError(\r\n\t\t\t\t'monthIndex must be an integer between 0 and 11',\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn format === 'short'\r\n\t\t\t? this._monthNames[monthIndex].substring(0, 3)\r\n\t\t\t: this._monthNames[monthIndex];\r\n\t}\r\n\r\n\t/**\r\n\t * Formats a date according to the specified format and timezone.\r\n\t *\r\n\t * @param date - The date to format.\r\n\t * @param format - The format string (see Angular DatePipe documentation for format options).\r\n\t * @param timezone - The timezone to use for formatting.\r\n\t * @returns The formatted date string.\r\n\t */\r\n\tformatDate(\r\n\t\tdate: Date,\r\n\t\tformat: string = 'mediumDate',\r\n\t\ttimezone: string = 'UTC',\r\n\t): string {\r\n\t\treturn this._datePipe.transform(date, format, timezone) || '';\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a date to a different timezone.\r\n\t *\r\n\t * @param date - The date to convert.\r\n\t * @param timezone - The timezone to convert to.\r\n\t * @returns The date in the new timezone.\r\n\t */\r\n\tconvertToTimezone(date: Date, timezone: string): Date {\r\n\t\treturn new Date(date.toLocaleString('en-US', { timeZone: timezone }));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the start of the day for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the start of the day.\r\n\t * @returns The start of the day (midnight) for the given date.\r\n\t */\r\n\tstartOfDay(date: Date): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setHours(0, 0, 0, 0);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the end of the day for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the end of the day.\r\n\t * @returns The end of the day (one millisecond before midnight) for the given date.\r\n\t */\r\n\tendOfDay(date: Date): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setHours(23, 59, 59, 999);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the start of the week for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the start of the week.\r\n\t * @param locale - A BCP 47 language tag to determine the first day of the week. Defaults to the runtime locale.\r\n\t * @returns The start of the week adjusted for the locale.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.startOfWeek(date); // => Monday May 13 2024 00:00:00 for en-GB\r\n\t */\r\n\tstartOfWeek(date: Date, locale?: string): Date {\r\n\t\tconst newDate = this.startOfDay(date);\r\n\t\tconst dtf = new Intl.DateTimeFormat(locale);\r\n\t\tconst resolved = dtf.resolvedOptions().locale;\r\n\t\tconst region = resolved.split('-')[1]?.toUpperCase();\r\n\t\tconst sundayFirst = ['US', 'CA', 'AU', 'NZ', 'PH', 'BR'];\r\n\t\tconst firstDay = sundayFirst.includes(region) ? 0 : 1;\r\n\t\tconst day = newDate.getDay();\r\n\t\tconst diff = (day - firstDay + 7) % 7;\r\n\t\tnewDate.setDate(newDate.getDate() - diff);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the end of the week for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the end of the week.\r\n\t * @param locale - A BCP 47 language tag to determine the first day of the week. Defaults to the runtime locale.\r\n\t * @returns The end of the week adjusted for the locale.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.endOfWeek(date); // => Sunday May 19 2024 23:59:59.999 for en-GB\r\n\t */\r\n\tendOfWeek(date: Date, locale?: string): Date {\r\n\t\tconst start = this.startOfWeek(date, locale);\r\n\t\tconst end = this.addDays(start, 6);\r\n\t\treturn this.endOfDay(end);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the start of the month for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the start of the month.\r\n\t * @returns The start of the month.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.startOfMonth(date); // => May 1 2024 00:00:00\r\n\t */\r\n\tstartOfMonth(date: Date): Date {\r\n\t\tconst newDate = this.startOfDay(date);\r\n\t\tnewDate.setDate(1);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the end of the month for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the end of the month.\r\n\t * @returns The end of the month.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.endOfMonth(date); // => May 31 2024 23:59:59.999\r\n\t */\r\n\tendOfMonth(date: Date): Date {\r\n\t\tconst start = this.startOfMonth(date);\r\n\t\tconst end = new Date(start);\r\n\t\tend.setMonth(end.getMonth() + 1);\r\n\t\tend.setDate(0);\r\n\t\treturn this.endOfDay(end);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the start of the year for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the start of the year.\r\n\t * @returns The start of the year.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.startOfYear(date); // => Jan 1 2024 00:00:00\r\n\t */\r\n\tstartOfYear(date: Date): Date {\r\n\t\tconst newDate = this.startOfDay(date);\r\n\t\tnewDate.setMonth(0, 1);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the end of the year for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the end of the year.\r\n\t * @returns The end of the year.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.endOfYear(date); // => Dec 31 2024 23:59:59.999\r\n\t */\r\n\tendOfYear(date: Date): Date {\r\n\t\tconst end = new Date(date.getFullYear(), 11, 31);\r\n\t\treturn this.endOfDay(end);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the number of days in a given month and year.\r\n\t *\r\n\t * @param month - The month (0-11).\r\n\t * @param year - The year.\r\n\t * @returns The number of days in the month.\r\n\t */\r\n\tgetDaysInMonth(month: number, year: number): number {\r\n\t\treturn new Date(year, month + 1, 0).getDate();\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a given year is a leap year.\r\n\t *\r\n\t * @param year - The year to check.\r\n\t * @returns True if the year is a leap year, false otherwise.\r\n\t */\r\n\tisLeapYear(year: number): boolean {\r\n\t\treturn (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of days to a date.\r\n\t *\r\n\t * @param date - The date to which to add days.\r\n\t * @param days - The number of days to add.\r\n\t * @returns The new date with the added days.\r\n\t */\r\n\taddDays(date: Date, days: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setDate(newDate.getDate() + days);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of months to a date.\r\n\t *\r\n\t * @param date - The date to which to add months.\r\n\t * @param months - The number of months to add.\r\n\t * @returns The new date with the added months.\r\n\t */\r\n\taddMonths(date: Date, months: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setMonth(newDate.getMonth() + months);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of years to a date.\r\n\t *\r\n\t * @param date - The date to which to add years.\r\n\t * @param years - The number of years to add.\r\n\t * @returns The new date with the added years.\r\n\t */\r\n\taddYears(date: Date, years: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setFullYear(newDate.getFullYear() + years);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of hours to a date.\r\n\t *\r\n\t * @param date - The date to which to add hours.\r\n\t * @param hours - The number of hours to add.\r\n\t * @returns The new date with the added hours.\r\n\t */\r\n\taddHours(date: Date, hours: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setHours(newDate.getHours() + hours);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of minutes to a date.\r\n\t *\r\n\t * @param date - The date to which to add minutes.\r\n\t * @param minutes - The number of minutes to add.\r\n\t * @returns The new date with the added minutes.\r\n\t */\r\n\taddMinutes(date: Date, minutes: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setMinutes(newDate.getMinutes() + minutes);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of seconds to a date.\r\n\t *\r\n\t * @param date - The date to which to add seconds.\r\n\t * @param seconds - The number of seconds to add.\r\n\t * @returns The new date with the added seconds.\r\n\t */\r\n\taddSeconds(date: Date, seconds: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setSeconds(newDate.getSeconds() + seconds);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of days from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract days.\r\n\t * @param days - The number of days to subtract.\r\n\t * @returns The new date with the subtracted days.\r\n\t */\r\n\tsubtractDays(date: Date, days: number): Date {\r\n\t\treturn this.addDays(date, -days);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of months from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract months.\r\n\t * @param months - The number of months to subtract.\r\n\t * @returns The new date with the subtracted months.\r\n\t */\r\n\tsubtractMonths(date: Date, months: number): Date {\r\n\t\treturn this.addMonths(date, -months);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of years from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract years.\r\n\t * @param years - The number of years to subtract.\r\n\t * @returns The new date with the subtracted years.\r\n\t */\r\n\tsubtractYears(date: Date, years: number): Date {\r\n\t\treturn this.addYears(date, -years);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of hours from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract hours.\r\n\t * @param hours - The number of hours to subtract.\r\n\t * @returns The new date with the subtracted hours.\r\n\t */\r\n\tsubtractHours(date: Date, hours: number): Date {\r\n\t\treturn this.addHours(date, -hours);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of minutes from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract minutes.\r\n\t * @param minutes - The number of minutes to subtract.\r\n\t * @returns The new date with the subtracted minutes.\r\n\t */\r\n\tsubtractMinutes(date: Date, minutes: number): Date {\r\n\t\treturn this.addMinutes(date, -minutes);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of seconds from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract seconds.\r\n\t * @param seconds - The number of seconds to subtract.\r\n\t * @returns The new date with the subtracted seconds.\r\n\t */\r\n\tsubtractSeconds(date: Date, seconds: number): Date {\r\n\t\treturn this.addSeconds(date, -seconds);\r\n\t}\r\n\r\n\t/**\r\n\t * Calculates the difference in days between two dates.\r\n\t *\r\n\t * @param date1 - The earlier date.\r\n\t * @param date2 - The later date.\r\n\t * @returns The number of days between the two dates.\r\n\t */\r\n\tdifferenceInDays(date1: Date, date2: Date): number {\r\n\t\tconst diff = date2.getTime() - date1.getTime();\r\n\t\treturn diff / (1000 * 60 * 60 * 24);\r\n\t}\r\n\r\n\t/**\r\n\t * Calculates the difference in hours between two dates.\r\n\t *\r\n\t * @param date1 - The earlier date.\r\n\t * @param date2 - The later date.\r\n\t * @returns The number of hours between the two dates.\r\n\t */\r\n\tdifferenceInHours(date1: Date, date2: Date): number {\r\n\t\tconst diff = date2.getTime() - date1.getTime();\r\n\t\treturn diff / (1000 * 60 * 60);\r\n\t}\r\n\r\n\t/**\r\n\t * Calculates the difference in minutes between two dates.\r\n\t *\r\n\t * @param date1 - The earlier date.\r\n\t * @param date2 - The later date.\r\n\t * @returns The number of minutes between the two dates.\r\n\t */\r\n\tdifferenceInMinutes(date1: Date, date2: Date): number {\r\n\t\tconst diff = date2.getTime() - date1.getTime();\r\n\t\treturn diff / (1000 * 60);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if two dates are on the same day.\r\n\t *\r\n\t * @param date1 - The first date.\r\n\t * @param date2 - The second date.\r\n\t * @returns True if the dates are on the same day, false otherwise.\r\n\t */\r\n\tisSameDay(date1: Date, date2: Date): boolean {\r\n\t\treturn (\r\n\t\t\tdate1.getFullYear() === date2.getFullYear() &&\r\n\t\t\tdate1.getMonth() === date2.getMonth() &&\r\n\t\t\tdate1.getDate() === date2.getDate()\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the ISO week number for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the week number.\r\n\t * @returns The ISO week number (1-53).\r\n\t */\r\n\tgetWeekNumber(date: Date): number {\r\n\t\tconst tempDate = new Date(date.getTime());\r\n\t\ttempDate.setHours(0, 0, 0, 0);\r\n\t\t// Set to nearest Thursday: current date + 4 - current day number, making Thursday day 4\r\n\t\ttempDate.setDate(tempDate.getDate() + 4 - (tempDate.getDay() || 7));\r\n\t\tconst yearStart = new Date(tempDate.getFullYear(), 0, 1);\r\n\t\t// Calculate full weeks to nearest Thursday\r\n\t\treturn Math.ceil(\r\n\t\t\t((tempDate.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the number of weeks in a month for a given month and year.\r\n\t *\r\n\t * @param month - The month (0-11).\r\n\t * @param year - The year.\r\n\t * @returns The number of weeks in the month.\r\n\t */\r\n\tgetWeeksInMonth(month: number, year: number): number {\r\n\t\tconst firstDayOfMonth = new Date(year, month, 1);\r\n\t\tconst lastDayOfMonth = new Date(year, month + 1, 0);\r\n\t\t// Get ISO week numbers for the first and last day of the month\r\n\t\tconst firstWeek = this.getWeekNumber(firstDayOfMonth);\r\n\t\tlet lastWeek = this.getWeekNumber(lastDayOfMonth);\r\n\t\t// Special case: when January 1st is in the last week of the previous year\r\n\t\tif (firstWeek > lastWeek) {\r\n\t\t\tlastWeek = this.getWeekNumber(new Date(year, 11, 31)); // Get week of the last day of the year\r\n\t\t}\r\n\t\treturn lastWeek - firstWeek + 1;\r\n\t}\r\n}\r\n","import { Injectable, WritableSignal, signal } from '@angular/core';\r\n\r\ntype Dict<T = unknown> = Record<string, T>;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UtilService {\r\n\t// --- CSS variables (persisted) ---\r\n\tprivate readonly _storageKey = 'css_variables';\r\n\tprivate _css: Dict<string> = {};\r\n\tprivate _cssSig = signal<Dict<string>>({});\r\n\r\n\t// --- Forms store ---\r\n\tprivate _forms = new Map<string, WritableSignal<any>>();\r\n\r\n\t// --- Global bag for design/debug ---\r\n\tvar: Dict = {};\r\n\r\n\t/**\r\n\t * Initialize service state: load persisted CSS variables from localStorage\r\n\t * and apply them to the document root. Emits the initial CSS snapshot.\r\n\t */\r\n\tconstructor() {\r\n\t\tthis._loadCss();\r\n\t\t// apply on boot\r\n\t\tfor (const k of Object.keys(this._css))\r\n\t\t\tthis._setProperty(k, this._css[k]);\r\n\t\tthis._cssSig.set({ ...this._css });\r\n\t}\r\n\r\n\t// ===== Forms Management =====\r\n\r\n\t/** Get or create a form state as a writable signal */\r\n\tformSignal<T = any>(id: string): WritableSignal<T> {\r\n\t\tlet s = this._forms.get(id);\r\n\t\tif (!s) {\r\n\t\t\ts = signal<T>({} as T);\r\n\t\t\tthis._forms.set(id, s);\r\n\t\t}\r\n\t\treturn s as WritableSignal<T>;\r\n\t}\r\n\r\n\t/** Back-compat: returns the current form object (mutable reference). Prefer formSignal(). */\r\n\tform<T = any>(id: string): T {\r\n\t\tconst s = this.formSignal<T>(id);\r\n\t\tconst v = s();\r\n\t\tif (v && typeof v === 'object') return v;\r\n\t\tconst obj = {} as T;\r\n\t\ts.set(obj);\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * Check whether a form signal has been created for the given id.\r\n\t * @param id Unique form identifier.\r\n\t * @returns True if a signal exists for the id.\r\n\t */\r\n\thasForm(id: string): boolean {\r\n\t\treturn this._forms.has(id);\r\n\t}\r\n\r\n\t/**\r\n\t * Remove form state associated with the given id.\r\n\t * @param id Unique form identifier to clear.\r\n\t */\r\n\tclearForm(id: string): void {\r\n\t\tthis._forms.delete(id);\r\n\t}\r\n\r\n\t// ===== Validation =====\r\n\r\n\t/**\r\n\t * Validate a value against a specific kind.\r\n\t * - email: RFC-light pattern check.\r\n\t * - text: typeof string.\r\n\t * - array: Array.isArray.\r\n\t * - object: non-null plain object.\r\n\t * - number: finite number.\r\n\t * - password: strength tiers (extra 0..4).\r\n\t * @param value Input to validate.\r\n\t * @param kind Validation kind.\r\n\t * @param extra Additional constraint for passwords: 0..4 increasing strength.\r\n\t * @returns True if value passes validation.\r\n\t */\r\n\tvalid(\r\n\t\tvalue: any,\r\n\t\tkind:\r\n\t\t\t| 'email'\r\n\t\t\t| 'text'\r\n\t\t\t| 'array'\r\n\t\t\t| 'object'\r\n\t\t\t| 'number'\r\n\t\t\t| 'password' = 'email',\r\n\t\textra = 0,\r\n\t): boolean {\r\n\t\tswitch (kind) {\r\n\t\t\tcase 'email':\r\n\t\t\t\treturn /^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,10})+$/.test(\r\n\t\t\t\t\tvalue || '',\r\n\t\t\t\t);\r\n\t\t\tcase 'text':\r\n\t\t\t\treturn typeof value === 'string';\r\n\t\t\tcase 'array':\r\n\t\t\t\treturn Array.isArray(value);\r\n\t\t\tcase 'object':\r\n\t\t\t\treturn (\r\n\t\t\t\t\ttypeof value === 'object' &&\r\n\t\t\t\t\t!Array.isArray(value) &&\r\n\t\t\t\t\tvalue !== null\r\n\t\t\t\t);\r\n\t\t\tcase 'number':\r\n\t\t\t\treturn typeof value === 'number' && Number.isFinite(value);\r\n\t\t\tcase 'password':\r\n\t\t\t\tif (!value) return false;\r\n\t\t\t\tswitch (extra) {\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\treturn /^((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9]))/.test(\r\n\t\t\t\t\t\t\tvalue,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\treturn /^(((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{8,})/.test(\r\n\t\t\t\t\t\t\tvalue,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\treturn /^((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]))(?=.{8,})/.test(\r\n\t\t\t\t\t\t\tvalue,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\treturn /^((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@#$%&!\\-_]))(?=.{8,})/.test(\r\n\t\t\t\t\t\t\tvalue,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn !!value;\r\n\t\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/** Password strength: 0..5 */\r\n\tlevel(value = ''): number {\r\n\t\tif (!value) return 0;\r\n\t\tlet lvl = 0;\r\n\t\tif (value.length > 8) lvl++;\r\n\t\tif (/[a-z]/.test(value)) lvl++;\r\n\t\tif (/[A-Z]/.test(value)) lvl++;\r\n\t\tif (/[0-9]/.test(value)) lvl++;\r\n\t\tif (/[`~!@#$%^&*()_\\-+=\\[\\]{};:'\",.<>/?\\\\|]/.test(value)) lvl++;\r\n\t\treturn lvl;\r\n\t}\r\n\r\n\t// ===== CSS Variables Management =====\r\n\r\n\t/** Set multiple CSS vars. opts: { local?: boolean; host?: string } */\r\n\tsetCss(\r\n\t\tvars: Dict<string>,\r\n\t\topts: { local?: boolean; host?: string } | string = {},\r\n\t): void {\r\n\t\tif (typeof opts === 'string') {\r\n\t\t\topts = opts === 'local' ? { local: true } : { host: opts };\r\n\t\t}\r\n\t\tconst { local = false, host } = opts as {\r\n\t\t\tlocal?: boolean;\r\n\t\t\thost?: string;\r\n\t\t};\r\n\t\tif (\r\n\t\t\thost &&\r\n\t\t\ttypeof window !== 'undefined' &&\r\n\t\t\twindow.location.host !== host\r\n\t\t)\r\n\t\t\treturn;\r\n\r\n\t\tfor (const k of Object.keys(vars)) {\r\n\t\t\tconst v = vars[k];\r\n\t\t\tif (local) {\r\n\t\t\t\tthis._css[k] = v;\r\n\t\t\t} else if (this._css[k]) {\r\n\t\t\t\t// keep persisted value unless explicitly local\r\n\t\t\t\tthis._setProperty(k, this._css[k]);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tthis._setProperty(k, v);\r\n\t\t}\r\n\r\n\t\tif (local) {\r\n\t\t\tthis._saveCss();\r\n\t\t\tthis._cssSig.set({ ...this._css });\r\n\t\t}\r\n\t}\r\n\r\n\t/** Current persisted CSS vars snapshot */\r\n\tgetCss(): Dict<string> {\r\n\t\treturn { ...this._css };\r\n\t}\r\n\r\n\t/** Reactive signal with current persisted CSS vars */\r\n\tcssSignal(): WritableSignal<Dict<string>> {\r\n\t\treturn this._cssSig;\r\n\t}\r\n\r\n\t/** Remove persisted vars by key(s) and save */\r\n\tremoveCss(keys: string | string[]): void {\r\n\t\tconst list = Array.isArray(keys) ? keys : keys.split(' ');\r\n\t\tfor (const k of list) delete this._css[k];\r\n\t\tthis._saveCss();\r\n\t\tthis._cssSig.set({ ...this._css });\r\n\t}\r\n\r\n\t// ===== Generators =====\r\n\r\n\t/**\r\n\t * Generate an array of given length filled with sequential numbers (1..n),\r\n\t * random text, dates from today, or a constant value.\r\n\t * @param len Desired array length.\r\n\t * @param type 'number' | 'text' | 'date' | any other constant value to repeat.\r\n\t * @returns Generated array.\r\n\t */\r\n\tarr(len = 10, type: 'number' | 'text' | 'date' | string = 'number'): any[] {\r\n\t\tconst out: any[] = [];\r\n\t\tfor (let i = 0; i < len; i++) {\r\n\t\t\tswitch (type) {\r\n\t\t\t\tcase 'number':\r\n\t\t\t\t\tout.push(i + 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'text':\r\n\t\t\t\t\tout.push(this.text());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'date':\r\n\t\t\t\t\tout.push(new Date(Date.now() + i * 86_400_000));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tout.push(type);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn out;\r\n\t}\r\n\r\n\t/**\r\n\t * Create a random alphanumeric string.\r\n\t * @param length Number of characters to generate.\r\n\t * @returns Random string of requested length.\r\n\t */\r\n\ttext(length = 10): string {\r\n\t\tconst chars =\r\n\t\t\t'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n\t\tlet res = '';\r\n\t\tfor (let i = 0; i < length; i++)\r\n\t\t\tres += chars.charAt(Math.floor(Math.random() * chars.length));\r\n\t\treturn res;\r\n\t}\r\n\r\n\t// ===== Internals =====\r\n\r\n\t/** Persist current CSS variables to localStorage. */\r\n\tprivate _saveCss(): void {\r\n\t\ttry {\r\n\t\t\tif (typeof localStorage !== 'undefined') {\r\n\t\t\t\tlocalStorage.setItem(\r\n\t\t\t\t\tthis._storageKey,\r\n\t\t\t\t\tJSON.stringify(this._css),\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} catch {}\r\n\t}\r\n\r\n\t/** Load CSS variables snapshot from localStorage into memory. */\r\n\tprivate _loadCss(): void {\r\n\t\ttry {\r\n\t\t\tif (typeof localStorage !== 'undefined') {\r\n\t\t\t\tconst raw = localStorage.getItem(this._storageKey);\r\n\t\t\t\tthis._css = raw ? JSON.parse(raw) : {};\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\tthis._css = {};\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Apply a CSS variable to the :root element.\r\n\t * @param key CSS custom property name (e.g., --brand-color).\r\n\t * @param value CSS value to set.\r\n\t */\r\n\tprivate _setProperty(key: string, value: string): void {\r\n\t\ttry {\r\n\t\t\tif (typeof document !== 'undefined') {\r\n\t\t\t\tdocument.documentElement.style.setProperty(key, value);\r\n\t\t\t}\r\n\t\t} catch {}\r\n\t}\r\n}\r\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport { Injectable, PLATFORM_ID, inject, signal } from '@angular/core';\r\nimport { ThemeDensity, ThemeMode, ThemeRadius } from './theme.type';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ThemeService {\r\n\tprivate readonly _doc = inject(DOCUMENT);\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tmode = signal<ThemeMode | undefined>(undefined);\r\n\tmodes = signal<ThemeMode[]>(['light', 'dark']);\r\n\tsetMode(mode: ThemeMode) {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.documentElement.dataset['mode'] = mode;\r\n\t\t\tlocalStorage.setItem('theme.mode', mode);\r\n\t\t}\r\n\t\tthis.mode.set(mode);\r\n\t}\r\n\r\n\tdensity = signal<ThemeDensity | undefined>(undefined);\r\n\tdensities = signal<ThemeDensity[]>(['comfortable', 'compact']);\r\n\tsetDensity(density: ThemeDensity) {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.documentElement.dataset['density'] = density;\r\n\t\t\tlocalStorage.setItem('theme.density', density);\r\n\t\t}\r\n\t\tthis.density.set(density);\r\n\t}\r\n\r\n\tradius = signal<ThemeRadius | undefined>(undefined);\r\n\tradiuses = signal<ThemeRadius[]>(['rounded', 'square']);\r\n\tsetRadius(radius: ThemeRadius) {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.documentElement.dataset['radius'] = radius;\r\n\t\t\tlocalStorage.setItem('theme.radius', radius);\r\n\t\t}\r\n\t\tthis.radius.set(radius);\r\n\t}\r\n\r\n\tthemeIndex = signal<number>(0);\r\n\tnextTheme() {\r\n\t\tconst modes = this.modes().length;\r\n\t\tconst densities = this.densities().length;\r\n\t\tconst radiuses = this.radiuses().length;\r\n\r\n\t\tconst maxIndex = modes * densities * radiuses;\r\n\r\n\t\tconst nextIndex = (this.themeIndex() + 1) % maxIndex;\r\n\t\tthis.themeIndex.set(nextIndex);\r\n\r\n\t\tconst block = densities * radiuses;\r\n\r\n\t\tconst modeIndex = Math.floor(nextIndex / block);\r\n\t\tconst rem = nextIndex % block;\r\n\t\tconst densityIndex = Math.floor(rem / radiuses);\r\n\t\tconst radiusIndex = rem % radiuses;\r\n\r\n\t\tthis.setMode(this.modes()[modeIndex] as ThemeMode);\r\n\t\tthis.setDensity(this.densities()[densityIndex] as ThemeDensity);\r\n\t\tthis.setRadius(this.radiuses()[radiusIndex] as ThemeRadius);\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.setItem('theme.index', String(nextIndex));\r\n\t\t}\r\n\t}\r\n\r\n\tinit() {\r\n\t\tconst mode = this._isBrowser\r\n\t\t\t? (localStorage.getItem('theme.mode') as ThemeMode) || 'light'\r\n\t\t\t: 'light';\r\n\t\tconst density = this._isBrowser\r\n\t\t\t? (localStorage.getItem('theme.density') as ThemeDensity) ||\r\n\t\t\t\t'comfortable'\r\n\t\t\t: 'comfortable';\r\n\t\tconst radius = this._isBrowser\r\n\t\t\t? (localStorage.getItem('theme.radius') as ThemeRadius) || 'rounded'\r\n\t\t\t: 'rounded';\r\n\r\n\t\tthis.mode.set(mode);\r\n\t\tthis.density.set(density);\r\n\t\tthis.radius.set(radius);\r\n\r\n\t\tthis.themeIndex.set(\r\n\t\t\tthis._isBrowser\r\n\t\t\t\t? Number(localStorage.getItem('theme.index')) || 0\r\n\t\t\t\t: 0,\r\n\t\t);\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.documentElement.dataset['mode'] = mode;\r\n\t\t\tthis._doc.documentElement.dataset['density'] = density;\r\n\t\t\tthis._doc.documentElement.dataset['radius'] = radius;\r\n\t\t}\r\n\t}\r\n}\r\n","import {\r\n\tprovideHttpClient,\r\n\twithInterceptorsFromDi,\r\n} from '@angular/common/http';\r\nimport { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport {\r\n\tCONFIG_TOKEN,\r\n\tConfig,\r\n\tDEFAULT_CONFIG,\r\n} from './interfaces/config.interface';\r\n\r\nexport function provideWacom(\r\n\tconfig: Config = DEFAULT_CONFIG,\r\n): EnvironmentProviders {\r\n\treturn makeEnvironmentProviders([\r\n\t\t{ provide: CONFIG_TOKEN, useValue: config },\r\n\t\tprovideHttpClient(withInterceptorsFromDi()),\r\n\t]);\r\n}\r\n","/* initialize */\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n\tprovideHttpClient,\r\n\twithInterceptorsFromDi,\r\n} from '@angular/common/http';\r\nimport { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n\tConfig,\r\n\tCONFIG_TOKEN,\r\n\tDEFAULT_CONFIG,\r\n} from './interfaces/config.interface';\r\n\r\n/* directives */\r\nimport { ClickOutsideDirective } from './directives/click-outside.directive';\r\nconst DIRECTIVES = [ClickOutsideDirective];\r\n\r\n/* pipes */\r\nimport { ArrPipe } from './pipes/arr.pipe';\r\nimport { MongodatePipe } from './pipes/mongodate.pipe';\r\nimport { PaginationPipe } from './pipes/pagination.pipe';\r\nimport { SafePipe } from './pipes/safe.pipe';\r\nimport { SearchPipe } from './pipes/search.pipe';\r\nimport { SplicePipe } from './pipes/splice.pipe';\r\nconst PIPES = [\r\n\tArrPipe,\r\n\tSafePipe,\r\n\tSplicePipe,\r\n\tSearchPipe,\r\n\tMongodatePipe,\r\n\tPaginationPipe,\r\n];\r\n\r\n@NgModule({\r\n\timports: [CommonModule, FormsModule, ...PIPES, ...DIRECTIVES],\r\n\texports: [...PIPES, ...DIRECTIVES],\r\n\tproviders: [\r\n\t\t{ provide: CONFIG_TOKEN, useValue: DEFAULT_CONFIG },\r\n\t\tprovideHttpClient(withInterceptorsFromDi()),\r\n\t],\r\n})\r\n/**\r\n * @deprecated Use provideWacom instead.\r\n */\r\nexport class WacomModule {\r\n\tstatic forRoot(\r\n\t\tconfig: Config = DEFAULT_CONFIG,\r\n\t): ModuleWithProviders<WacomModule> {\r\n\t\treturn {\r\n\t\t\tngModule: WacomModule,\r\n\t\t\tproviders: [\r\n\t\t\t\t{\r\n\t\t\t\t\tprovide: CONFIG_TOKEN,\r\n\t\t\t\t\tuseValue: config,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t};\r\n\t}\r\n}\r\n","/*\r\n *\tInterfaces\r\n */\r\nexport * from './src/crud/crud.interface';\r\nexport * from './src/interfaces/config.interface';\r\nexport * from './src/interfaces/dom.interface';\r\nexport * from './src/interfaces/http.interface';\r\nexport * from './src/interfaces/network.interface';\r\nexport * from './src/interfaces/store.interface';\r\nexport * from './src/meta/meta.interface';\r\n\r\n/*\r\n *\tTypes\r\n */\r\nexport * from './src/theme/theme.type';\r\n\r\n/*\r\n *\tGuard\r\n */\r\nexport * from './src/meta/meta.guard';\r\n\r\n/*\r\n *\tComponents\r\n */\r\nexport * from './src/crud/crud.component';\r\n\r\n/*\r\n *\tDirectives\r\n */\r\nexport * from './src/directives/click-outside.directive';\r\nexport * from './src/directives/manual-disabled.directive';\r\nexport * from './src/directives/manual-name.directive';\r\nexport * from './src/directives/manual-readonly.directive';\r\nexport * from './src/directives/manual-type.directive';\r\n\r\n/*\r\n *\tPipes\r\n */\r\nexport * from './src/pipes/arr.pipe';\r\nexport * from './src/pipes/mongodate.pipe';\r\nexport * from './src/pipes/number.pipe';\r\nexport * from './src/pipes/pagination.pipe';\r\nexport * from './src/pipes/safe.pipe';\r\nexport * from './src/pipes/search.pipe';\r\nexport * from './src/pipes/splice.pipe';\r\nexport * from './src/pipes/split.pipe';\r\n\r\n/*\r\n *\tServices\r\n */\r\nexport * from './src/crud/crud.service';\r\nexport * from './src/meta/meta.service';\r\nexport * from './src/services/core.service';\r\nexport * from './src/services/dom.service';\r\nexport * from './src/services/emitter.service';\r\nexport * from './src/services/http.service';\r\nexport * from './src/services/network.service';\r\nexport * from './src/services/rtc.service';\r\nexport * from './src/services/socket.service';\r\nexport * from './src/services/store.service';\r\nexport * from './src/services/time.service';\r\nexport * from './src/services/util.service';\r\nexport * from './src/theme/theme.service';\r\n\r\n/*\r\n *\tInitial\r\n *\r\n *\tmake different kind of modules, one which import all, other for piece by piece\r\n */\r\nexport * from './src/provide-wacom';\r\nexport * from './src/wacom.module';\r\n/*\r\n *\tEnd of Support\r\n */\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.MetaService","filter","i1"],"mappings":"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"}
1
+ {"version":3,"file":"wacom.mjs","sources":["../../../projects/wacom/src/interfaces/config.interface.ts","../../../projects/wacom/src/interfaces/http.interface.ts","../../../projects/wacom/src/interfaces/network.interface.ts","../../../projects/wacom/src/meta/meta.const.ts","../../../projects/wacom/src/meta/meta.service.ts","../../../projects/wacom/src/meta/meta.guard.ts","../../../projects/wacom/src/services/core.service.ts","../../../projects/wacom/src/crud/crud.component.ts","../../../projects/wacom/src/directives/click-outside.directive.ts","../../../projects/wacom/src/directives/manual-disabled.directive.ts","../../../projects/wacom/src/directives/manual-name.directive.ts","../../../projects/wacom/src/directives/manual-readonly.directive.ts","../../../projects/wacom/src/directives/manual-type.directive.ts","../../../projects/wacom/src/pipes/arr.pipe.ts","../../../projects/wacom/src/pipes/mongodate.pipe.ts","../../../projects/wacom/src/pipes/number.pipe.ts","../../../projects/wacom/src/pipes/pagination.pipe.ts","../../../projects/wacom/src/pipes/safe.pipe.ts","../../../projects/wacom/src/pipes/search.pipe.ts","../../../projects/wacom/src/pipes/splice.pipe.ts","../../../projects/wacom/src/pipes/split.pipe.ts","../../../projects/wacom/src/services/emitter.service.ts","../../../projects/wacom/src/services/http.service.ts","../../../projects/wacom/src/services/network.service.ts","../../../projects/wacom/src/services/store.service.ts","../../../projects/wacom/src/crud/crud.service.ts","../../../projects/wacom/src/services/dom.service.ts","../../../projects/wacom/src/services/rtc.service.ts","../../../projects/wacom/src/services/socket.service.ts","../../../projects/wacom/src/services/time.service.ts","../../../projects/wacom/src/services/util.service.ts","../../../projects/wacom/src/theme/theme.service.ts","../../../projects/wacom/src/provide-wacom.ts","../../../projects/wacom/src/wacom.module.ts","../../../projects/wacom/public-api.ts","../../../projects/wacom/wacom.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { MetaConfig } from '../meta/meta.interface';\r\nimport { HttpConfig } from './http.interface';\r\nimport { NetworkConfig } from './network.interface';\r\nimport { StoreConfig } from './store.interface';\r\n\r\n/**\r\n * Root configuration object used to initialize the library.\r\n * Each property allows consumers to override the default\r\n * behavior of the corresponding service.\r\n */\r\nexport interface Config {\r\n\t/** Options for the key‑value storage service. */\r\n\tstore?: StoreConfig;\r\n\t/** Defaults applied to page metadata handling. */\r\n\tmeta?: MetaConfig;\r\n\t/** Base HTTP settings such as API URL and headers. */\r\n\thttp?: HttpConfig;\r\n\t/** Optional socket connection configuration. */\r\n\tsocket?: any;\r\n\t/** Raw Socket.IO client instance, if used. */\r\n\tio?: any;\r\n\tnetwork?: NetworkConfig;\r\n}\r\n\r\nexport const CONFIG_TOKEN = new InjectionToken<Config>('config');\r\n\r\nexport const DEFAULT_CONFIG: Config = {\r\n\tstore: {\r\n\t\tprefix: 'waStore',\r\n\t},\r\n\tmeta: {\r\n\t\tuseTitleSuffix: false,\r\n\t\tdefaults: { links: {} },\r\n\t},\r\n\tsocket: false,\r\n\thttp: {\r\n\t\turl: '',\r\n\t\theaders: {},\r\n\t},\r\n};\r\n","export type HttpHeaderType = string | number | (string | number)[];\r\n\r\n/**\r\n * Configuration values used by the HTTP service when\r\n * issuing requests to a backend API.\r\n */\r\nexport interface HttpConfig {\r\n\t/** Map of default headers appended to each request. */\r\n\theaders?: Record<string, HttpHeaderType>;\r\n\t/** Base URL for all HTTP requests. */\r\n\turl?: string;\r\n}\r\n\r\nexport const DEFAULT_HTTP_CONFIG: HttpConfig = {\r\n\theaders: {},\r\n\turl: '',\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport type NetworkStatus = 'good' | 'poor' | 'none';\r\n\r\nexport interface NetworkConfig {\r\n\t/** Ordered list of endpoints to probe (first that succeeds wins). */\r\n\tendpoints: string[];\r\n\t/** Periodic re-check interval (ms). */\r\n\tintervalMs: number;\r\n\t/** Per-request timeout (ms). */\r\n\ttimeoutMs: number;\r\n\t/** Latency threshold (ms) to classify as \"good\". */\r\n\tgoodLatencyMs: number;\r\n\t/** Consecutive failures to flip status to \"none\". */\r\n\tmaxConsecutiveFails: number;\r\n}\r\n\r\nexport const DEFAULT_NETWORK_CONFIG: NetworkConfig = {\r\n\tendpoints: [\r\n\t\t'https://api.webart.work/status',\r\n\t\t// Opaque but useful reachability fallbacks:\r\n\t\t'https://www.google.com/generate_204',\r\n\t\t'https://www.gstatic.com/generate_204',\r\n\t\t'https://www.cloudflare.com/cdn-cgi/trace',\r\n\t],\r\n\tintervalMs: 30_000,\r\n\ttimeoutMs: 2_500,\r\n\tgoodLatencyMs: 300,\r\n\tmaxConsecutiveFails: 3,\r\n};\r\n\r\nexport const NETWORK_CONFIG = new InjectionToken<NetworkConfig>(\r\n\t'NETWORK_CONFIG',\r\n\t{\r\n\t\tfactory: () => DEFAULT_NETWORK_CONFIG,\r\n\t},\r\n);\r\n","/**\r\n * Utility helpers for meta management.\r\n *\r\n * We intentionally treat `undefined` as \"missing\" and everything else as \"provided\".\r\n * This lets callers pass empty strings to intentionally clear a value:\r\n * - isDefined(undefined) -> false (use defaults)\r\n * - isDefined('') -> true (explicitly set empty string)\r\n * - isDefined(null) -> true (explicitly provided, will stringify if used)\r\n */\r\nexport const isDefined = (val: unknown): val is Exclude<unknown, undefined> =>\r\n\ttypeof val !== 'undefined';\r\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n\tinject,\r\n} from '@angular/core';\r\nimport { Meta, Title } from '@angular/platform-browser';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { filter } from 'rxjs/operators';\r\nimport {\r\n\tCONFIG_TOKEN,\r\n\tConfig,\r\n\tDEFAULT_CONFIG,\r\n} from '../interfaces/config.interface';\r\nimport { isDefined } from './meta.const';\r\nimport { MetaConfig, MetaDefaults, MetaPage } from './meta.interface';\r\nimport { TagAttr } from './meta.type';\r\n\r\n/**\r\n * Centralized page meta management for SPA navigation.\r\n *\r\n * Goals:\r\n * - Static SEO pages: route-driven meta via `data.meta`\r\n * - Dynamic/id pages: manual meta via `applyMeta(...)`\r\n * - No stale meta: tags set for one page must not \"leak\" to another page\r\n * - Simple inputs: only title/description/image/index/robots (everything else auto-generated)\r\n * - Links handled separately: `setLink({ canonical: '...' })` updates, never duplicates\r\n *\r\n * Generated tags:\r\n * - Title:\r\n * - <title>\r\n * - <meta itemprop=\"name\" ...>\r\n * - <meta property=\"og:title\" ...>\r\n * - <meta name=\"twitter:title\" ...>\r\n * - Description:\r\n * - <meta name=\"description\" ...>\r\n * - <meta itemprop=\"description\" ...>\r\n * - <meta property=\"og:description\" ...>\r\n * - <meta name=\"twitter:description\" ...>\r\n * - Image:\r\n * - <meta itemprop=\"image\" ...>\r\n * - <meta property=\"og:image\" ...>\r\n * - <meta name=\"twitter:image:src\" ...>\r\n * - Robots:\r\n * - <meta name=\"robots\" ...> (derived from `robots` or `index`)\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class MetaService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\t/**\r\n\t * Effective configuration (from CONFIG_TOKEN + DEFAULT_CONFIG fallback).\r\n\t */\r\n\tprivate _metaConfig: MetaConfig;\r\n\r\n\t/**\r\n\t * Meta tags that are \"owned\" by this service.\r\n\t * We remove these on every `applyMeta()` so stale tags never survive SPA navigation.\r\n\t *\r\n\t * Stored as selectors compatible with Angular Meta.removeTag(), e.g.:\r\n\t * - name=\"description\"\r\n\t * - property=\"og:title\"\r\n\t * - itemprop=\"image\"\r\n\t */\r\n\tprivate _managedTagSelectors = new Set<string>();\r\n\r\n\t/**\r\n\t * Link rels that are managed by this service.\r\n\t * Used to update links without duplicates and optionally remove them via resetLinks().\r\n\t */\r\n\tprivate _managedLinkRels = new Set<string>();\r\n\r\n\tconstructor(\r\n\t\t@Inject(CONFIG_TOKEN) @Optional() private _config: Config,\r\n\t\tprivate _router: Router,\r\n\t\tprivate _activatedRoute: ActivatedRoute,\r\n\t\tprivate _meta: Meta,\r\n\t\tprivate _titleService: Title,\r\n\t) {\r\n\t\tthis._config = this._config || DEFAULT_CONFIG;\r\n\t\tthis._metaConfig = this._config.meta || {};\r\n\r\n\t\t// Recommended default: keep meta in sync with route changes automatically.\r\n\t\tconst applyFromRoutes =\r\n\t\t\t!isDefined(this._metaConfig.applyFromRoutes) ||\r\n\t\t\t!!this._metaConfig.applyFromRoutes;\r\n\r\n\t\tif (applyFromRoutes) {\r\n\t\t\tthis._router.events\r\n\t\t\t\t.pipe(filter((e) => e instanceof NavigationEnd))\r\n\t\t\t\t.subscribe(() => {\r\n\t\t\t\t\tconst page = this._readDeepestRouteMeta();\r\n\t\t\t\t\tif (page) this.applyMeta(page);\r\n\t\t\t\t\telse this.reset();\r\n\t\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Merge and set defaults.\r\n\t *\r\n\t * Defaults are used when a page does not provide a given field.\r\n\t * This affects:\r\n\t * - applyMeta() fallbacks\r\n\t * - reset()\r\n\t */\r\n\tsetDefaults(defaults: MetaDefaults): void {\r\n\t\tthis._metaConfig.defaults = {\r\n\t\t\t...(this._metaConfig.defaults || {}),\r\n\t\t\t...defaults,\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Apply metadata for the current page.\r\n\t *\r\n\t * Use cases:\r\n\t * - Static SEO pages: route data (`data.meta`) when applyFromRoutes = true\r\n\t * - Dynamic / id pages: call manually after loading entity data\r\n\t *\r\n\t * Rules:\r\n\t * 1) remove tags previously managed by this service\r\n\t * 2) start from defaults\r\n\t * 3) override with page values\r\n\t * 4) generate OG/Twitter/itemprop variants\r\n\t */\r\n\tapplyMeta(page: MetaPage = {}): void {\r\n\t\tif (page.disableUpdate) return;\r\n\r\n\t\t// 1) Clean managed tags to prevent leaks between pages.\r\n\t\tthis._removeManagedTags();\r\n\r\n\t\t// 2) Resolve values with defaults.\r\n\t\tconst defaults = this._metaConfig.defaults || {};\r\n\r\n\t\tconst title = this._resolveTitle(page, defaults);\r\n\t\tconst description = this._resolveValue(\r\n\t\t\tpage.description,\r\n\t\t\tdefaults.description,\r\n\t\t);\r\n\t\tconst image = this._resolveValue(page.image, defaults.image);\r\n\t\tconst robots = this._resolveRobots(page, defaults);\r\n\r\n\t\t// 3) Apply generated tags.\r\n\t\tthis._setTitleTriplet(title);\r\n\t\tthis._setDescriptionTriplet(description);\r\n\t\tthis._setImageTriplet(image);\r\n\r\n\t\t// 4) Robots support (index/noindex).\r\n\t\tif (isDefined(robots)) {\r\n\t\t\tthis._updateTag('robots', robots as string, 'name');\r\n\t\t}\r\n\r\n\t\t// Links are intentionally not applied here.\r\n\t\t// Canonical strategy depends on your routing/domain policy, so use setLink(...) explicitly.\r\n\t}\r\n\r\n\t/**\r\n\t * Reset page meta back to defaults.\r\n\t *\r\n\t * Removes all managed tags and re-applies defaults-only meta.\r\n\t */\r\n\treset(): void {\r\n\t\tthis.applyMeta({});\r\n\t}\r\n\r\n\t/**\r\n\t * Sets link tags (canonical, alternate, etc.) without duplicates.\r\n\t *\r\n\t * For each rel:\r\n\t * - if link[rel=rel] exists -> update href\r\n\t * - else -> create it\r\n\t * - if duplicates exist -> remove extras\r\n\t */\r\n\tsetLink(links: Record<string, string>): void {\r\n\t\tif (!this._isBrowser) return;\r\n\t\tif (!links || !Object.keys(links).length) return;\r\n\r\n\t\tfor (const rel of Object.keys(links)) {\r\n\t\t\tconst href = links[rel];\r\n\r\n\t\t\tconst all = Array.from(\r\n\t\t\t\tthis._doc.head.querySelectorAll<HTMLLinkElement>(\r\n\t\t\t\t\t`link[rel=\"${rel}\"]`,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\r\n\t\t\tlet link = all[0];\r\n\t\t\tif (!link) {\r\n\t\t\t\tlink = this._doc.createElement('link');\r\n\t\t\t\tlink.setAttribute('rel', rel);\r\n\t\t\t\tthis._doc.head.appendChild(link);\r\n\t\t\t} else if (all.length > 1) {\r\n\t\t\t\tfor (let i = 1; i < all.length; i++) all[i].remove();\r\n\t\t\t}\r\n\r\n\t\t\tlink.setAttribute('href', href);\r\n\t\t\tthis._managedLinkRels.add(rel);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Removes link tags that were managed by this service via setLink().\r\n\t *\r\n\t * Note:\r\n\t * - Not called by reset() because canonical often should persist for the whole app shell.\r\n\t * - Call explicitly if you want to remove canonical/alternate links.\r\n\t */\r\n\tresetLinks(): void {\r\n\t\tif (!this._isBrowser) return;\r\n\t\tfor (const rel of this._managedLinkRels) {\r\n\t\t\tconst all = Array.from(\r\n\t\t\t\tthis._doc.head.querySelectorAll<HTMLLinkElement>(\r\n\t\t\t\t\t`link[rel=\"${rel}\"]`,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t\tall.forEach((it) => it.remove());\r\n\t\t}\r\n\t\tthis._managedLinkRels.clear();\r\n\t}\r\n\r\n\t// ---------------------------------------------------------------------------\r\n\t// Internals: route meta extraction\r\n\t// ---------------------------------------------------------------------------\r\n\r\n\t/**\r\n\t * Reads `data.meta` from the deepest activated route.\r\n\t * This matches the common Angular pattern where child routes override parent routes.\r\n\t */\r\n\tprivate _readDeepestRouteMeta(): MetaPage | null {\r\n\t\tlet route: ActivatedRoute | null = this._activatedRoute;\r\n\r\n\t\twhile (route?.firstChild) route = route.firstChild;\r\n\r\n\t\tconst data: any = route?.snapshot?.data;\r\n\t\tconst meta = data && data['meta'];\r\n\r\n\t\treturn meta || null;\r\n\t}\r\n\r\n\t// ---------------------------------------------------------------------------\r\n\t// Internals: resolving values\r\n\t// ---------------------------------------------------------------------------\r\n\r\n\t/**\r\n\t * Resolves title with optional suffix behavior.\r\n\t */\r\n\tprivate _resolveTitle(page: MetaPage, defaults: MetaDefaults): string {\r\n\t\tlet titleContent = this._resolveValue(page.title, defaults.title) || '';\r\n\r\n\t\tif (this._metaConfig.useTitleSuffix) {\r\n\t\t\tconst suffix = isDefined(page.titleSuffix)\r\n\t\t\t\t? page.titleSuffix\r\n\t\t\t\t: defaults.titleSuffix;\r\n\t\t\ttitleContent += suffix || '';\r\n\t\t}\r\n\r\n\t\treturn titleContent;\r\n\t}\r\n\r\n\t/**\r\n\t * Resolves robots value.\r\n\t *\r\n\t * Precedence:\r\n\t * - explicit robots (page) > explicit robots (defaults)\r\n\t * - index flag (page/defaults) -> generates \"index, follow\" or \"noindex, follow\"\r\n\t * - undefined -> no robots tag set by this service\r\n\t */\r\n\tprivate _resolveRobots(\r\n\t\tpage: MetaPage,\r\n\t\tdefaults: MetaDefaults,\r\n\t): string | undefined {\r\n\t\tif (isDefined(page.robots)) return (page.robots || '') + '';\r\n\t\tif (isDefined(defaults.robots)) return (defaults.robots || '') + '';\r\n\r\n\t\tconst index = isDefined(page.index) ? page.index : defaults.index;\r\n\t\tif (!isDefined(index)) return undefined;\r\n\r\n\t\treturn index ? 'index, follow' : 'noindex, follow';\r\n\t}\r\n\r\n\t/**\r\n\t * Resolves value with \"undefined means missing\" semantics.\r\n\t * - undefined -> fallback\r\n\t * - empty string -> explicit empty\r\n\t */\r\n\tprivate _resolveValue(val?: string, fallback?: string): string | undefined {\r\n\t\tif (isDefined(val)) return (val || '') + '';\r\n\t\tif (isDefined(fallback)) return (fallback || '') + '';\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\t// ---------------------------------------------------------------------------\r\n\t// Internals: generated tag groups\r\n\t// ---------------------------------------------------------------------------\r\n\r\n\t/**\r\n\t * Applies title to:\r\n\t * - document <title>\r\n\t * - itemprop=\"name\"\r\n\t * - og:title\r\n\t * - twitter:title\r\n\t */\r\n\tprivate _setTitleTriplet(title: string): void {\r\n\t\tthis._titleService.setTitle(title);\r\n\r\n\t\tthis._updateTag('og:title', title, 'property');\r\n\t\tthis._updateTag('twitter:title', title, 'name');\r\n\t\tthis._updateTag('name', title, 'itemprop');\r\n\t}\r\n\r\n\t/**\r\n\t * Applies description to:\r\n\t * - name=\"description\"\r\n\t * - itemprop=\"description\"\r\n\t * - og:description\r\n\t * - twitter:description\r\n\t */\r\n\tprivate _setDescriptionTriplet(description?: string): void {\r\n\t\tif (!isDefined(description)) return;\r\n\r\n\t\tconst content = description as string;\r\n\r\n\t\tthis._updateTag('description', content, 'name');\r\n\t\tthis._updateTag('og:description', content, 'property');\r\n\t\tthis._updateTag('twitter:description', content, 'name');\r\n\t\tthis._updateTag('description', content, 'itemprop');\r\n\t}\r\n\r\n\t/**\r\n\t * Applies image to:\r\n\t * - itemprop=\"image\"\r\n\t * - og:image\r\n\t * - twitter:image:src\r\n\t */\r\n\tprivate _setImageTriplet(image?: string): void {\r\n\t\tif (!isDefined(image)) return;\r\n\r\n\t\tconst content = image as string;\r\n\r\n\t\tthis._updateTag('og:image', content, 'property');\r\n\t\tthis._updateTag('twitter:image:src', content, 'name');\r\n\t\tthis._updateTag('image', content, 'itemprop');\r\n\t}\r\n\r\n\t// ---------------------------------------------------------------------------\r\n\t// Internals: tag update + ownership tracking\r\n\t// ---------------------------------------------------------------------------\r\n\r\n\t/**\r\n\t * Update a meta tag with deterministic selector.\r\n\t *\r\n\t * Why selector:\r\n\t * - prevents duplicates\r\n\t * - ensures updates target the correct attribute variant (name/property/itemprop)\r\n\t *\r\n\t * Ownership tracking:\r\n\t * - Every selector we touch is remembered in managedTagSelectors.\r\n\t * - On next apply/reset we remove them to avoid stale meta across pages.\r\n\t */\r\n\tprivate _updateTag(key: string, content: string, attr: TagAttr): void {\r\n\t\tconst selector =\r\n\t\t\tattr === 'itemprop' ? `itemprop=\"${key}\"` : `${attr}=\"${key}\"`;\r\n\r\n\t\tconst tagDef =\r\n\t\t\tattr === 'itemprop'\r\n\t\t\t\t? ({ itemprop: key, content } as any)\r\n\t\t\t\t: ({ [attr]: key, content } as any);\r\n\r\n\t\tthis._meta.updateTag(tagDef, selector);\r\n\t\tthis._managedTagSelectors.add(selector);\r\n\t}\r\n\r\n\t/**\r\n\t * Remove all meta tags managed by this service.\r\n\t * Called on each apply/reset to prevent tags from a previous page persisting.\r\n\t */\r\n\tprivate _removeManagedTags(): void {\r\n\t\tfor (const selector of this._managedTagSelectors) {\r\n\t\t\tthis._meta.removeTag(selector);\r\n\t\t}\r\n\t\tthis._managedTagSelectors.clear();\r\n\t}\r\n\r\n\tprivate _doc = inject(DOCUMENT);\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot } from '@angular/router';\r\nimport { MetaPage } from './meta.interface';\r\nimport { MetaService } from './meta.service';\r\n\r\n/**\r\n * Applies route-level metadata from `route.data.meta`.\r\n *\r\n * Usage:\r\n * - Add this guard to routes that define `data.meta` to ensure meta is applied\r\n * as early as possible during activation.\r\n *\r\n * Note:\r\n * - If `MetaConfig.applyFromRoutes` is enabled (recommended), the service will\r\n * also apply route meta automatically on NavigationEnd — even if this guard\r\n * is missing from some route definitions.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class MetaGuard {\r\n\tconstructor(private _metaService: MetaService) {}\r\n\r\n\tcanActivate(route: ActivatedRouteSnapshot): boolean {\r\n\t\tconst pageMeta =\r\n\t\t\t(route.data && (route.data['meta'] as MetaPage)) || null;\r\n\r\n\t\tif (pageMeta) this._metaService.applyMeta(pageMeta);\r\n\t\telse this._metaService.reset();\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n","// Core utilities and helpers for the Wacom app\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInjectable,\r\n\tPLATFORM_ID,\r\n\tSignal,\r\n\tWritableSignal,\r\n\tinject,\r\n\tsignal,\r\n} from '@angular/core';\r\n\r\n// Add capitalize method to String prototype if it doesn't already exist\r\nif (!String.prototype.capitalize) {\r\n\tString.prototype.capitalize = function (): string {\r\n\t\tif (this.length > 0) {\r\n\t\t\treturn this.charAt(0).toUpperCase() + this.slice(1).toLowerCase();\r\n\t\t}\r\n\t\treturn '';\r\n\t};\r\n}\r\n\r\n// Extend the String interface to include the new method\r\ndeclare global {\r\n\tinterface String {\r\n\t\tcapitalize(): string;\r\n\t}\r\n}\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class CoreService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tdeviceID = '';\r\n\r\n\tconstructor() {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tconst stored = localStorage.getItem('deviceID');\r\n\t\t\tthis.deviceID =\r\n\t\t\t\tstored ||\r\n\t\t\t\t(typeof crypto?.randomUUID === 'function'\r\n\t\t\t\t\t? crypto.randomUUID()\r\n\t\t\t\t\t: this.UUID());\r\n\r\n\t\t\tlocalStorage.setItem('deviceID', this.deviceID);\r\n\r\n\t\t\tthis.detectDevice();\r\n\t\t} else {\r\n\t\t\tthis.deviceID = this.UUID();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Generates a UUID (Universally Unique Identifier) version 4.\r\n\t *\r\n\t * This implementation uses `Math.random()` to generate random values,\r\n\t * making it suitable for general-purpose identifiers, but **not** for\r\n\t * cryptographic or security-sensitive use cases.\r\n\t *\r\n\t * The format follows the UUID v4 standard: `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`\r\n\t * where:\r\n\t * - `x` is a random hexadecimal digit (0–f)\r\n\t * - `4` indicates UUID version 4\r\n\t * - `y` is one of 8, 9, A, or B\r\n\t *\r\n\t * Example: `f47ac10b-58cc-4372-a567-0e02b2c3d479`\r\n\t *\r\n\t * @returns A string containing a UUID v4.\r\n\t */\r\n\tUUID(): string {\r\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\r\n\t\t\t/[xy]/g,\r\n\t\t\t(c: string) => {\r\n\t\t\t\tconst r = (Math.random() * 16) | 0;\r\n\t\t\t\tconst v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n\t\t\t\treturn v.toString(16);\r\n\t\t\t},\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts an object to an array. Optionally holds keys instead of values.\r\n\t *\r\n\t * @param {any} obj - The object to be converted.\r\n\t * @param {boolean} [holder=false] - If true, the keys will be held in the array; otherwise, the values will be held.\r\n\t * @returns {any[]} The resulting array.\r\n\t */\r\n\tota(obj: any, holder: boolean = false): any[] {\r\n\t\tif (Array.isArray(obj)) return obj;\r\n\t\tif (typeof obj !== 'object' || obj === null) return [];\r\n\t\tconst arr = [];\r\n\t\tfor (const each in obj) {\r\n\t\t\tif (\r\n\t\t\t\tobj.hasOwnProperty(each) &&\r\n\t\t\t\t(obj[each] ||\r\n\t\t\t\t\ttypeof obj[each] === 'number' ||\r\n\t\t\t\t\ttypeof obj[each] === 'boolean')\r\n\t\t\t) {\r\n\t\t\t\tif (holder) {\r\n\t\t\t\t\tarr.push(each);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tarr.push(obj[each]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn arr;\r\n\t}\r\n\r\n\t/**\r\n\t * Removes elements from `fromArray` that are present in `removeArray` based on a comparison field.\r\n\t *\r\n\t * @param {any[]} removeArray - The array of elements to remove.\r\n\t * @param {any[]} fromArray - The array from which to remove elements.\r\n\t * @param {string} [compareField='_id'] - The field to use for comparison.\r\n\t * @returns {any[]} The modified `fromArray` with elements removed.\r\n\t */\r\n\tsplice(\r\n\t\tremoveArray: any[],\r\n\t\tfromArray: any[],\r\n\t\tcompareField: string = '_id',\r\n\t): any[] {\r\n\t\tif (!Array.isArray(removeArray) || !Array.isArray(fromArray)) {\r\n\t\t\treturn fromArray;\r\n\t\t}\r\n\r\n\t\tconst removeSet = new Set(\r\n\t\t\tremoveArray.map((item) => item[compareField]),\r\n\t\t);\r\n\t\treturn fromArray.filter((item) => !removeSet.has(item[compareField]));\r\n\t}\r\n\r\n\t/**\r\n\t * Unites multiple _id values into a single unique _id.\r\n\t * The resulting _id is unique regardless of the order of the input _id values.\r\n\t *\r\n\t * @param {...string[]} args - The _id values to be united.\r\n\t * @returns {string} The unique combined _id.\r\n\t */\r\n\tids2id(...args: string[]): string {\r\n\t\targs.sort((a, b) => {\r\n\t\t\tif (\r\n\t\t\t\tNumber(a.toString().substring(0, 8)) >\r\n\t\t\t\tNumber(b.toString().substring(0, 8))\r\n\t\t\t) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\treturn -1;\r\n\t\t});\r\n\r\n\t\treturn args.join();\r\n\t}\r\n\r\n\t// After While\r\n\tprivate _afterWhile: Record<string, number> = {};\r\n\t/**\r\n\t * Delays the execution of a callback function for a specified amount of time.\r\n\t * If called again within that time, the timer resets.\r\n\t *\r\n\t * @param {string | object | (() => void)} doc - A unique identifier for the timer, an object to host the timer, or the callback function.\r\n\t * @param {() => void} [cb] - The callback function to execute after the delay.\r\n\t * @param {number} [time=1000] - The delay time in milliseconds.\r\n\t */\r\n\tafterWhile(\r\n\t\tdoc: string | object | (() => void),\r\n\t\tcb?: () => void,\r\n\t\ttime: number = 1000,\r\n\t): void {\r\n\t\tif (typeof doc === 'function') {\r\n\t\t\tcb = doc as () => void;\r\n\t\t\tdoc = 'common';\r\n\t\t}\r\n\r\n\t\tif (typeof cb === 'function' && typeof time === 'number') {\r\n\t\t\tif (typeof doc === 'string') {\r\n\t\t\t\tclearTimeout(this._afterWhile[doc]);\r\n\t\t\t\tthis._afterWhile[doc] = setTimeout(cb, time);\r\n\t\t\t} else if (typeof doc === 'object') {\r\n\t\t\t\tclearTimeout((doc as { __afterWhile: number }).__afterWhile);\r\n\t\t\t\t(doc as { __afterWhile: number }).__afterWhile = setTimeout(\r\n\t\t\t\t\tcb,\r\n\t\t\t\t\ttime,\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.warn('badly configured after while');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Recursively copies properties from one object to another.\r\n\t * Handles nested objects, arrays, and Date instances appropriately.\r\n\t *\r\n\t * @param from - The source object from which properties are copied.\r\n\t * @param to - The target object to which properties are copied.\r\n\t */\r\n\tcopy(from: any, to: any) {\r\n\t\tfor (const each in from) {\r\n\t\t\tif (\r\n\t\t\t\ttypeof from[each] !== 'object' ||\r\n\t\t\t\tfrom[each] instanceof Date ||\r\n\t\t\t\tArray.isArray(from[each]) ||\r\n\t\t\t\tfrom[each] === null\r\n\t\t\t) {\r\n\t\t\t\tto[each] = from[each];\r\n\t\t\t} else {\r\n\t\t\t\tif (\r\n\t\t\t\t\ttypeof to[each] !== 'object' ||\r\n\t\t\t\t\tto[each] instanceof Date ||\r\n\t\t\t\t\tArray.isArray(to[each]) ||\r\n\t\t\t\t\tto[each] === null\r\n\t\t\t\t) {\r\n\t\t\t\t\tto[each] = {};\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.copy(from[each], to[each]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Device management\r\n\tdevice = '';\r\n\t/**\r\n\t * Detects the device type based on the user agent.\r\n\t */\r\n\tdetectDevice(): void {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tconst userAgent =\r\n\t\t\tnavigator.userAgent || navigator.vendor || (window as any).opera;\r\n\t\tif (/windows phone/i.test(userAgent)) {\r\n\t\t\tthis.device = 'Windows Phone';\r\n\t\t} else if (/android/i.test(userAgent)) {\r\n\t\t\tthis.device = 'Android';\r\n\t\t} else if (\r\n\t\t\t/iPad|iPhone|iPod/.test(userAgent) &&\r\n\t\t\t!(window as any).MSStream\r\n\t\t) {\r\n\t\t\tthis.device = 'iOS';\r\n\t\t} else {\r\n\t\t\tthis.device = 'Web';\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is a mobile device.\r\n\t * @returns {boolean} - Returns true if the device is a mobile device.\r\n\t */\r\n\tisMobile(): boolean {\r\n\t\treturn (\r\n\t\t\tthis.device === 'Windows Phone' ||\r\n\t\t\tthis.device === 'Android' ||\r\n\t\t\tthis.device === 'iOS'\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is a tablet.\r\n\t * @returns {boolean} - Returns true if the device is a tablet.\r\n\t */\r\n\tisTablet(): boolean {\r\n\t\tif (!this._isBrowser) return false;\r\n\r\n\t\treturn this.device === 'iOS' && /iPad/.test(navigator.userAgent);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is a web browser.\r\n\t * @returns {boolean} - Returns true if the device is a web browser.\r\n\t */\r\n\tisWeb(): boolean {\r\n\t\treturn this.device === 'Web';\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is an Android device.\r\n\t * @returns {boolean} - Returns true if the device is an Android device.\r\n\t */\r\n\tisAndroid(): boolean {\r\n\t\treturn this.device === 'Android';\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if the device is an iOS device.\r\n\t * @returns {boolean} - Returns true if the device is an iOS device.\r\n\t */\r\n\tisIos(): boolean {\r\n\t\treturn this.device === 'iOS';\r\n\t}\r\n\r\n\t// Version management\r\n\tversion = '1.0.0';\r\n\r\n\tappVersion = '';\r\n\r\n\tdateVersion = '';\r\n\r\n\t/**\r\n\t * Sets the combined version string based on appVersion and dateVersion.\r\n\t */\r\n\tsetVersion(): void {\r\n\t\tthis.version = this.appVersion || '';\r\n\r\n\t\tthis.version += this.version && this.dateVersion ? ' ' : '';\r\n\r\n\t\tthis.version += this.dateVersion || '';\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the app version and updates the combined version string.\r\n\t *\r\n\t * @param {string} appVersion - The application version to set.\r\n\t */\r\n\tsetAppVersion(appVersion: string): void {\r\n\t\tthis.appVersion = appVersion;\r\n\r\n\t\tthis.setVersion();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the date version and updates the combined version string.\r\n\t *\r\n\t * @param {string} dateVersion - The date version to set.\r\n\t */\r\n\tsetDateVersion(dateVersion: string): void {\r\n\t\tthis.dateVersion = dateVersion;\r\n\r\n\t\tthis.setVersion();\r\n\t}\r\n\r\n\t// Locking management\r\n\tprivate _locked: Record<string, boolean> = {};\r\n\tprivate _unlockResolvers: Record<string, (() => void)[]> = {};\r\n\r\n\t/**\r\n\t * Locks a resource to prevent concurrent access.\r\n\t * @param which - The resource to lock, identified by a string.\r\n\t */\r\n\tlock(which: string): void {\r\n\t\tthis._locked[which] = true;\r\n\r\n\t\tif (!this._unlockResolvers[which]) {\r\n\t\t\tthis._unlockResolvers[which] = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Unlocks a resource, allowing access.\r\n\t * @param which - The resource to unlock, identified by a string.\r\n\t */\r\n\tunlock(which: string): void {\r\n\t\tthis._locked[which] = false;\r\n\r\n\t\tif (this._unlockResolvers[which]) {\r\n\t\t\tthis._unlockResolvers[which].forEach((resolve) => resolve());\r\n\r\n\t\t\tthis._unlockResolvers[which] = [];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a Promise that resolves when the specified resource is unlocked.\r\n\t * @param which - The resource to watch for unlocking, identified by a string.\r\n\t * @returns A Promise that resolves when the resource is unlocked.\r\n\t */\r\n\tonUnlock(which: string): Promise<void> {\r\n\t\tif (!this._locked[which]) {\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tif (!this._unlockResolvers[which]) {\r\n\t\t\t\tthis._unlockResolvers[which] = [];\r\n\t\t\t}\r\n\r\n\t\t\tthis._unlockResolvers[which].push(resolve);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a resource is locked.\r\n\t * @param which - The resource to check, identified by a string.\r\n\t * @returns True if the resource is locked, false otherwise.\r\n\t */\r\n\tlocked(which: string): boolean {\r\n\t\treturn !!this._locked[which];\r\n\t}\r\n\r\n\t// Angular Signals //\r\n\t/**\r\n\t * Converts a plain object into a signal-wrapped object.\r\n\t * Optionally wraps specific fields of the object as individual signals,\r\n\t * and merges them into the returned signal for fine-grained reactivity.\r\n\t *\r\n\t * @template Document - The type of the object being wrapped.\r\n\t * @param {Document} document - The plain object to wrap into a signal.\r\n\t * @param {Record<string, (doc: Document) => unknown>} [signalFields={}] -\r\n\t * Optional map where each key is a field name and the value is a function\r\n\t * to extract the initial value for that field. These fields will be wrapped\r\n\t * as separate signals and embedded in the returned object.\r\n\t *\r\n\t * @returns {WritableSignal<Document>} A signal-wrapped object, possibly containing\r\n\t * nested field signals for more granular control.\r\n\t *\r\n\t * @example\r\n\t * const user = { _id: '1', name: 'Alice', score: 42 };\r\n\t * const sig = toSignal(user, { score: (u) => u.score });\r\n\t * console.log(sig().name); // 'Alice'\r\n\t * console.log(sig().score()); // 42 — field is now a signal\r\n\t */\r\n\ttoSignal<Document>(\r\n\t\tdocument: Document,\r\n\t\tsignalFields: Record<string, (doc: Document) => unknown> = {},\r\n\t): WritableSignal<Document> {\r\n\t\tif (Object.keys(signalFields).length) {\r\n\t\t\tconst fields: Record<string, Signal<unknown>> = {};\r\n\r\n\t\t\tfor (const key in signalFields) {\r\n\t\t\t\tfields[key] = signal(signalFields[key](document));\r\n\t\t\t}\r\n\r\n\t\t\treturn signal({ ...document, ...fields });\r\n\t\t} else {\r\n\t\t\treturn signal(document);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Converts an array of objects into an array of Angular signals.\r\n\t * Optionally wraps specific fields of each object as individual signals.\r\n\t *\r\n\t * @template Document - The type of each object in the array.\r\n\t * @param {Document[]} arr - Array of plain objects to convert into signals.\r\n\t * @param {Record<string, (doc: Document) => unknown>} [signalFields={}] -\r\n\t * Optional map where keys are field names and values are functions that extract the initial value\r\n\t * from the object. These fields will be turned into separate signals.\r\n\t *\r\n\t * @returns {WritableSignal<Document>[]} An array where each item is a signal-wrapped object,\r\n\t * optionally with individual fields also wrapped in signals.\r\n\t *\r\n\t * @example\r\n\t * toSignalsArray(users, {\r\n\t * name: (u) => u.name,\r\n\t * score: (u) => u.score,\r\n\t * });\r\n\t */\r\n\ttoSignalsArray<Document>(\r\n\t\tarr: Document[],\r\n\t\tsignalFields: Record<string, (doc: Document) => unknown> = {},\r\n\t): WritableSignal<Document>[] {\r\n\t\treturn arr.map((obj) => this.toSignal(obj, signalFields));\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a new object to the signals array.\r\n\t * Optionally wraps specific fields of the object as individual signals before wrapping the whole object.\r\n\t *\r\n\t * @template Document - The type of the object being added.\r\n\t * @param {WritableSignal<Document>[]} signals - The signals array to append to.\r\n\t * @param {Document} item - The object to wrap and push as a signal.\r\n\t * @param {Record<string, (doc: Document) => unknown>} [signalFields={}] -\r\n\t * Optional map of fields to be wrapped as signals within the object.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tpushSignal<Document>(\r\n\t\tsignals: WritableSignal<Document>[],\r\n\t\titem: Document,\r\n\t\tsignalFields: Record<string, (doc: Document) => unknown> = {},\r\n\t): void {\r\n\t\tsignals.push(this.toSignal(item, signalFields));\r\n\t}\r\n\r\n\t/**\r\n\t * Removes the first signal from the array whose object's field matches the provided value.\r\n\t * @template Document\r\n\t * @param {WritableSignal<Document>[]} signals - The signals array to modify.\r\n\t * @param {unknown} value - The value to match.\r\n\t * @param {string} [field='_id'] - The object field to match against.\r\n\t * @returns {void}\r\n\t */\r\n\tremoveSignalByField<Document extends Record<string, unknown>>(\r\n\t\tsignals: WritableSignal<Document>[],\r\n\t\tvalue: unknown,\r\n\t\tfield: string = '_id',\r\n\t): void {\r\n\t\tconst idx = signals.findIndex((sig) => sig()[field] === value);\r\n\r\n\t\tif (idx > -1) signals.splice(idx, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a generic trackBy function for *ngFor, tracking by the specified object field.\r\n\t * @template Document\r\n\t * @param {string} field - The object field to use for tracking (e.g., '_id').\r\n\t * @returns {(index: number, sig: Signal<Document>) => unknown} TrackBy function for Angular.\r\n\t */\r\n\ttrackBySignalField<Document extends Record<string, unknown>>(\r\n\t\tfield: string,\r\n\t) {\r\n\t\treturn (_: number, sig: Signal<Document>) => sig()[field];\r\n\t}\r\n\r\n\t/**\r\n\t * Finds the first signal in the array whose object's field matches the provided value.\r\n\t * @template Document\r\n\t * @param {Signal<Document>[]} signals - Array of signals to search.\r\n\t * @param {unknown} value - The value to match.\r\n\t * @param {string} [field='_id'] - The object field to match against.\r\n\t * @returns {Signal<Document> | undefined} The found signal or undefined if not found.\r\n\t */\r\n\tfindSignalByField<Document extends Record<string, unknown>>(\r\n\t\tsignals: WritableSignal<Document>[],\r\n\t\tvalue: unknown,\r\n\t\tfield = '_id',\r\n\t): WritableSignal<Document> | undefined {\r\n\t\treturn signals.find(\r\n\t\t\t(sig) => sig()[field] === value,\r\n\t\t) as WritableSignal<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the first writable signal in the array whose object's field matches the provided value.\r\n\t * @template Document\r\n\t * @param {WritableSignal<Document>[]} signals - Array of writable signals to search.\r\n\t * @param {unknown} value - The value to match.\r\n\t * @param {(val: Document) => Document} updater - Function to produce the updated object.\r\n\t * @param {string} field - The object field to match against.\r\n\t * @returns {void}\r\n\t */\r\n\tupdateSignalByField<Document extends Record<string, unknown>>(\r\n\t\tsignals: WritableSignal<Document>[],\r\n\t\tvalue: unknown,\r\n\t\tupdater: (val: Document) => Document,\r\n\t\tfield: string,\r\n\t): void {\r\n\t\tconst sig = this.findSignalByField<Document>(\r\n\t\t\tsignals,\r\n\t\t\tvalue,\r\n\t\t\tfield,\r\n\t\t) as WritableSignal<Document>;\r\n\r\n\t\tif (sig) sig.update(updater);\r\n\t}\r\n}\r\n","import {\r\n\tChangeDetectorRef,\r\n\tinject,\r\n\tSignal,\r\n\tsignal,\r\n\tWritableSignal,\r\n} from '@angular/core';\r\nimport { firstValueFrom, take } from 'rxjs';\r\nimport { CoreService } from '../services/core.service';\r\nimport {\r\n\tCrudDocument,\r\n\tCrudOptions,\r\n\tCrudServiceInterface,\r\n\tTableConfig,\r\n} from './crud.interface';\r\n\r\n/**\r\n * Interface representing the shape of a form service used by the CrudComponent.\r\n * The consuming app must provide a service that implements this structure.\r\n */\r\ninterface FormServiceInterface<FormInterface> {\r\n\tmodal: <T>(\r\n\t\tform: FormInterface,\r\n\t\tbuttons?: unknown | unknown[],\r\n\t\tsubmition?: unknown,\r\n\t\tchange?: (update: T) => void | Promise<(update: T) => void>,\r\n\t\tmodalOptions?: unknown,\r\n\t) => Promise<T>;\r\n\tmodalDocs: <T>(docs: T[]) => Promise<T[]>;\r\n\tmodalUnique: <T>(collection: string, key: string, doc: T) => void;\r\n}\r\n\r\n/**\r\n * Abstract reusable base class for CRUD list views.\r\n * It encapsulates pagination, modals, and document handling logic.\r\n *\r\n * @template Service - A service implementing CrudServiceInterface for a specific document type\r\n * @template Document - The data model extending CrudDocument\r\n */\r\nexport abstract class CrudComponent<\r\n\tService extends CrudServiceInterface<Document>,\r\n\tDocument extends CrudDocument<Document>,\r\n\tFormInterface,\r\n> {\r\n\t/** Service responsible for data fetching, creating, updating, deleting */\r\n\tprotected crudService: Service;\r\n\r\n\t/** The array of documents currently loaded and shown */\r\n\tprotected documents = signal<Signal<Document>[]>([]);\r\n\r\n\t/** Form schema/config used by the FormService modals */\r\n\tprotected form: FormInterface;\r\n\r\n\t/** Current pagination page */\r\n\tprotected page = 1;\r\n\r\n\t/** CoreService handles timing and copying helpers */\r\n\tprivate __core = inject(CoreService);\r\n\r\n\t/** ChangeDetectorRef handles on push strategy */\r\n\tprivate __cdr = inject(ChangeDetectorRef);\r\n\r\n\t/** Internal reference to form service matching FormServiceInterface */\r\n\tprivate __formService: FormServiceInterface<FormInterface>;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t *\r\n\t * @param formConfig - Object describing form title and its component structure\r\n\t * @param formService - Any service that conforms to FormServiceInterface (usually casted)\r\n\t * @param crudService - CRUD service implementing get/create/update/delete\r\n\t */\r\n\tconstructor(\r\n\t\tformConfig: unknown,\r\n\t\tformService: unknown,\r\n\t\tcrudService: Service,\r\n\t\tmodule = '',\r\n\t) {\r\n\t\tconst form = formConfig as FormInterface;\r\n\r\n\t\tthis.__formService = formService as FormServiceInterface<FormInterface>;\r\n\r\n\t\tthis.form = form;\r\n\r\n\t\tthis.crudService = crudService;\r\n\r\n\t\tthis._module = module;\r\n\t}\r\n\r\n\tprotected localDocumentsFilter: (doc: Document) => boolean = () => true;\r\n\r\n\t/**\r\n\t * Loads documents for a given page.\r\n\t */\r\n\tprotected setDocuments(page = this.page, query = ''): Promise<void> {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tif (this.configType === 'server') {\r\n\t\t\t\tthis.page = page;\r\n\r\n\t\t\t\tthis.__core.afterWhile(\r\n\t\t\t\t\tthis,\r\n\t\t\t\t\t() => {\r\n\t\t\t\t\t\tthis.crudService\r\n\t\t\t\t\t\t\t.get({ page, query }, this.getOptions())\r\n\t\t\t\t\t\t\t.subscribe((docs: Document[]) => {\r\n\t\t\t\t\t\t\t\tthis.documents.update(() =>\r\n\t\t\t\t\t\t\t\t\t(docs || []).map((doc) =>\r\n\t\t\t\t\t\t\t\t\t\tthis.crudService.getSignal(doc),\r\n\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\t\tresolve();\r\n\r\n\t\t\t\t\t\t\t\tthis.__cdr.markForCheck();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\t250,\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tthis.documents.update(() =>\r\n\t\t\t\t\tthis.crudService\r\n\t\t\t\t\t\t.getDocs()\r\n\t\t\t\t\t\t.filter(this.localDocumentsFilter)\r\n\t\t\t\t\t\t.map((doc) => this.crudService.getSignal(doc)),\r\n\t\t\t\t);\r\n\r\n\t\t\t\tthis.crudService.loaded.pipe(take(1)).subscribe(() => {\r\n\t\t\t\t\tresolve();\r\n\r\n\t\t\t\t\tthis.__cdr.markForCheck();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/** Fields considered when performing bulk updates. */\r\n\tprotected updatableFields = ['_id', 'name', 'description', 'data'];\r\n\r\n\t/**\r\n\t * Clears temporary metadata before document creation.\r\n\t */\r\n\tprotected preCreate(doc: Document): void {\r\n\t\tdelete doc.__creating;\r\n\t}\r\n\r\n\t/**\r\n\t * Funciton which controls whether the create functionality is available.\r\n\t */\r\n\tprotected allowCreate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Funciton which controls whether the update and delete functionality is available.\r\n\t */\r\n\tprotected allowMutate(): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Funciton which controls whether the unique url functionality is available.\r\n\t */\r\n\tprotected allowUrl(): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/** Determines whether manual sorting controls are available. */\r\n\tprotected allowSort(): boolean {\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Funciton which prepare get crud options.\r\n\t */\r\n\tprotected getOptions(): CrudOptions<Document> {\r\n\t\treturn {} as CrudOptions<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Handles bulk creation and updating of documents.\r\n\t * In creation mode, adds new documents.\r\n\t * In update mode, syncs changes and deletes removed entries.\r\n\t */\r\n\tprotected bulkManagement(isCreateFlow = true): () => void {\r\n\t\treturn (): void => {\r\n\t\t\tthis.__formService\r\n\t\t\t\t.modalDocs<Document>(\r\n\t\t\t\t\tisCreateFlow\r\n\t\t\t\t\t\t? []\r\n\t\t\t\t\t\t: this.documents().map(\r\n\t\t\t\t\t\t\t\t(obj: any) =>\r\n\t\t\t\t\t\t\t\t\tObject.fromEntries(\r\n\t\t\t\t\t\t\t\t\t\tthis.updatableFields.map((key) => [\r\n\t\t\t\t\t\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\t\t\t\t\t\tobj()[key],\r\n\t\t\t\t\t\t\t\t\t\t]),\r\n\t\t\t\t\t\t\t\t\t) as Document,\r\n\t\t\t\t\t\t\t),\r\n\t\t\t\t)\r\n\t\t\t\t.then(async (docs: Document[]) => {\r\n\t\t\t\t\tif (isCreateFlow) {\r\n\t\t\t\t\t\tfor (const doc of docs) {\r\n\t\t\t\t\t\t\tthis.preCreate(doc);\r\n\r\n\t\t\t\t\t\t\tawait firstValueFrom(this.crudService.create(doc));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfor (const document of this.documents()) {\r\n\t\t\t\t\t\t\tif (!docs.find((d) => d._id === document()._id)) {\r\n\t\t\t\t\t\t\t\tawait firstValueFrom(\r\n\t\t\t\t\t\t\t\t\tthis.crudService.delete(document()),\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor (const doc of docs) {\r\n\t\t\t\t\t\t\tconst local = this.documents().find(\r\n\t\t\t\t\t\t\t\t(document) => document()._id === doc._id,\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\tif (local) {\r\n\t\t\t\t\t\t\t\t(local as WritableSignal<Document>).update(\r\n\t\t\t\t\t\t\t\t\t(document) => {\r\n\t\t\t\t\t\t\t\t\t\tthis.__core.copy(doc, document);\r\n\r\n\t\t\t\t\t\t\t\t\t\treturn document;\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\t\tawait firstValueFrom(\r\n\t\t\t\t\t\t\t\t\tthis.crudService.update(local()),\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tthis.preCreate(doc);\r\n\r\n\t\t\t\t\t\t\t\tawait firstValueFrom(\r\n\t\t\t\t\t\t\t\t\tthis.crudService.create(doc),\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.setDocuments();\r\n\t\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\t/** Opens a modal to create a new document. */\r\n\tprotected create() {\r\n\t\tthis.__formService.modal<Document>(\r\n\t\t\tthis.form,\r\n\t\t\t{\r\n\t\t\t\tlabel: 'Create',\r\n\t\t\t\tclick: async (created: unknown, close: () => void) => {\r\n\t\t\t\t\tclose();\r\n\r\n\t\t\t\t\tthis.preCreate(created as Document);\r\n\r\n\t\t\t\t\tawait firstValueFrom(\r\n\t\t\t\t\t\tthis.crudService.create(created as Document),\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tthis.setDocuments();\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\t{ data: {} },\r\n\t\t\t() => {},\r\n\t\t\t{\r\n\t\t\t\tresetOnSubmit: true,\r\n\t\t\t},\r\n\t\t);\r\n\t}\r\n\r\n\t/** Displays a modal to edit an existing document. */\r\n\tprotected update(doc: Document) {\r\n\t\tthis.__formService.modal<Document>(\r\n\t\t\tthis.form,\r\n\t\t\t{\r\n\t\t\t\tlabel: 'Update',\r\n\t\t\t\tclick: (updated: unknown, close: () => void) => {\r\n\t\t\t\t\tclose();\r\n\r\n\t\t\t\t\tthis.__core.copy(updated, doc);\r\n\r\n\t\t\t\t\tthis.crudService.update(doc);\r\n\r\n\t\t\t\t\tthis.__cdr.markForCheck();\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\tdoc,\r\n\t\t);\r\n\t}\r\n\r\n\t/** Requests confirmation before deleting the provided document. */\r\n\tprotected async delete(doc: Document) {\r\n\t\tthis.crudService.delete(doc).subscribe(() => {\r\n\t\t\tthis.setDocuments();\r\n\t\t});\r\n\t}\r\n\r\n\t/** Opens a modal to edit the document's unique URL. */\r\n\tprotected mutateUrl(doc: Document) {\r\n\t\tthis.__formService.modalUnique<Document>(this._module, 'url', doc);\r\n\t}\r\n\r\n\t/** Moves the given document one position up and updates ordering. */\r\n\tprotected moveUp(doc: Document) {\r\n\t\tconst index = this.documents().findIndex(\r\n\t\t\t(document) => document()._id === doc._id,\r\n\t\t);\r\n\r\n\t\tif (index) {\r\n\t\t\tthis.documents.update((documents) => {\r\n\t\t\t\tdocuments.splice(index, 1);\r\n\r\n\t\t\t\tdocuments.splice(index - 1, 0, this.crudService.getSignal(doc));\r\n\r\n\t\t\t\treturn documents;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < this.documents().length; i++) {\r\n\t\t\tif (this.documents()[i]().order !== i) {\r\n\t\t\t\tthis.documents()[i]().order = i;\r\n\r\n\t\t\t\tthis.crudService.update(this.documents()[i]());\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.__cdr.markForCheck();\r\n\t}\r\n\r\n\t/** Data source mode used for document retrieval. */\r\n\tprotected configType: 'server' | 'local' = 'server';\r\n\r\n\t/** Number of documents fetched per page when paginating. */\r\n\tprotected perPage = 20;\r\n\r\n\t/**\r\n\t * Configuration object used by the UI for rendering table and handling actions.\r\n\t */\r\n\tprotected getConfig(): TableConfig<Document> {\r\n\t\tconst config: TableConfig<Document> = {\r\n\t\t\tcreate: this.allowCreate()\r\n\t\t\t\t? (): void => {\r\n\t\t\t\t\t\tthis.create();\r\n\t\t\t\t\t}\r\n\t\t\t\t: null,\r\n\r\n\t\t\tupdate: this.allowMutate()\r\n\t\t\t\t? (doc: Document): void => {\r\n\t\t\t\t\t\tthis.update(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t: null,\r\n\r\n\t\t\tdelete: this.allowMutate()\r\n\t\t\t\t? (doc: Document): void => {\r\n\t\t\t\t\t\tthis.delete(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t: null,\r\n\r\n\t\t\tbuttons: [],\r\n\t\t\theaderButtons: [],\r\n\t\t\tallDocs: true,\r\n\t\t};\r\n\r\n\t\tif (this.allowUrl()) {\r\n\t\t\tconfig.buttons.push({\r\n\t\t\t\ticon: 'cloud_download',\r\n\t\t\t\tclick: (doc: Document) => {\r\n\t\t\t\t\tthis.mutateUrl(doc);\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.allowSort()) {\r\n\t\t\tconfig.buttons.push({\r\n\t\t\t\ticon: 'arrow_upward',\r\n\t\t\t\tclick: (doc: Document) => {\r\n\t\t\t\t\tthis.moveUp(doc);\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.allowCreate()) {\r\n\t\t\tconfig.headerButtons.push({\r\n\t\t\t\ticon: 'playlist_add',\r\n\t\t\t\tclick: this.bulkManagement(),\r\n\t\t\t\tclass: 'playlist',\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (this.allowMutate()) {\r\n\t\t\tconfig.headerButtons.push({\r\n\t\t\t\ticon: 'edit_note',\r\n\t\t\t\tclick: this.bulkManagement(false),\r\n\t\t\t\tclass: 'edit',\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this.configType === 'server'\r\n\t\t\t? {\r\n\t\t\t\t\t...config,\r\n\t\t\t\t\tpaginate: this.setDocuments.bind(this),\r\n\t\t\t\t\tperPage: this.perPage,\r\n\t\t\t\t\tsetPerPage: this.crudService.setPerPage?.bind(\r\n\t\t\t\t\t\tthis.crudService,\r\n\t\t\t\t\t),\r\n\t\t\t\t\tallDocs: false,\r\n\t\t\t\t}\r\n\t\t\t: config;\r\n\t}\r\n\r\n\t/** Name of the collection or module used for contextual actions. */\r\n\tprivate _module = '';\r\n}\r\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tChangeDetectorRef,\r\n\tDestroyRef,\r\n\tDirective,\r\n\tElementRef,\r\n\tPLATFORM_ID,\r\n\tinject,\r\n\toutput,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Stand-alone “click outside” directive (zoneless-safe).\r\n *\r\n * Usage:\r\n * <div (clickOutside)=\"close()\">…</div>\r\n */\r\n@Directive({\r\n\tselector: '[clickOutside]',\r\n})\r\nexport class ClickOutsideDirective {\r\n\treadonly clickOutside = output<MouseEvent>();\r\n\r\n\tconstructor() {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.addEventListener('pointerdown', this._handler, true);\r\n\t\t}\r\n\r\n\t\t// cleanup\r\n\t\tthis._dref.onDestroy(() =>\r\n\t\t\tthis._doc.removeEventListener('pointerdown', this._handler, true),\r\n\t\t);\r\n\t}\r\n\r\n\tprivate _host = inject(ElementRef<HTMLElement>);\r\n\r\n\tprivate _cdr = inject(ChangeDetectorRef);\r\n\r\n\tprivate _dref = inject(DestroyRef);\r\n\r\n\tprivate _doc = inject(DOCUMENT);\r\n\r\n\tprivate _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tprivate _handler = (e: MouseEvent): void => {\r\n\t\tif (!this._host.nativeElement.contains(e.target as Node)) {\r\n\t\t\tthis.clickOutside.emit(e); // notify parent\r\n\t\t\tthis._cdr.markForCheck(); // trigger CD for OnPush comps\r\n\t\t}\r\n\t};\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\n@Directive({\r\n\tselector: 'input[manualDisabled], textarea[manualDisabled]',\r\n})\r\nexport class ManualDisabledDirective {\r\n\tprivate readonly _el = inject(ElementRef) as ElementRef<HTMLInputElement>;\r\n\r\n\t// Bind as: [manualDisabled]=\"isDisabled\"\r\n\treadonly manualDisabled = input<boolean | null>(null, {\r\n\t\talias: 'manualDisabled',\r\n\t});\r\n\r\n\tprivate readonly _syncDisabledEffect = effect(() => {\r\n\t\tconst disabled = this.manualDisabled();\r\n\t\tif (disabled == null) return;\r\n\r\n\t\tconst native = this._el.nativeElement;\r\n\t\tif (!native) return;\r\n\r\n\t\tnative.disabled = !!disabled;\r\n\t});\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\n@Directive({\r\n\tselector: 'input[manualName], textarea[manualName]',\r\n})\r\nexport class ManualNameDirective {\r\n\tprivate readonly _el = inject(ElementRef) as ElementRef<HTMLInputElement>;\r\n\r\n\t// Bind as: manualName=\"email\" or [manualName]=\"expr\"\r\n\treadonly manualName = input<string | null>(null, { alias: 'manualName' });\r\n\r\n\tprivate readonly _syncNameEffect = effect(() => {\r\n\t\tconst name = this.manualName();\r\n\t\tif (name == null) return;\r\n\r\n\t\tconst native = this._el.nativeElement;\r\n\t\tif (!native) return;\r\n\r\n\t\tif (native.name !== name) {\r\n\t\t\tnative.name = name;\r\n\t\t}\r\n\t});\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\n@Directive({\r\n\tselector: 'input[manualReadonly], textarea[manualReadonly]',\r\n})\r\nexport class ManualReadonlyDirective {\r\n\tprivate readonly _el = inject(ElementRef) as ElementRef<HTMLInputElement>;\r\n\r\n\t// Bind as: [manualReadonly]=\"true\"\r\n\treadonly manualReadonly = input<boolean | null>(null, {\r\n\t\talias: 'manualReadonly',\r\n\t});\r\n\r\n\tprivate readonly _syncReadonlyEffect = effect(() => {\r\n\t\tconst readonly = this.manualReadonly();\r\n\t\tif (readonly == null) return;\r\n\r\n\t\tconst native = this._el.nativeElement;\r\n\t\tif (!native) return;\r\n\r\n\t\tnative.readOnly = !!readonly;\r\n\t});\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\n@Directive({\r\n\tselector: 'input[manualType], textarea[manualType]',\r\n})\r\nexport class ManualTypeDirective {\r\n\tprivate readonly _el = inject(ElementRef) as ElementRef<HTMLInputElement>;\r\n\r\n\t// Bind as: manualType=\"password\" or [manualType]=\"expr\"\r\n\treadonly manualType = input<string | null>(null, { alias: 'manualType' });\r\n\r\n\tprivate readonly _syncTypeEffect = effect(() => {\r\n\t\tconst t = this.manualType();\r\n\t\tif (!t) return;\r\n\r\n\t\tconst native = this._el.nativeElement;\r\n\t\tif (!native) return;\r\n\r\n\t\tif (native.type !== t) {\r\n\t\t\tnative.type = t;\r\n\t\t}\r\n\t});\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'arr',\r\n})\r\nexport class ArrPipe implements PipeTransform {\r\n\ttransform(data: any, type?: any, refresh?: any): any {\r\n\t\tif (!data) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tif (typeof data == 'string') return data.split(type || ' ');\r\n\r\n\t\tif (Array.isArray(data)) {\r\n\t\t\treturn data;\r\n\t\t}\r\n\r\n\t\tif (typeof data != 'object') {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tlet arr = [];\r\n\r\n\t\tfor (let each in data) {\r\n\t\t\tif (!data[each]) continue;\r\n\r\n\t\t\tif (type == 'prop') {\r\n\t\t\t\tarr.push(each);\r\n\t\t\t} else if (type == 'value') {\r\n\t\t\t\tarr.push(data[each]);\r\n\t\t\t} else {\r\n\t\t\t\tarr.push({\r\n\t\t\t\t\tprop: each,\r\n\t\t\t\t\tvalue: data[each],\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn arr;\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'mongodate',\r\n})\r\nexport class MongodatePipe implements PipeTransform {\r\n\ttransform(_id: any) {\r\n\t\tif (!_id) return new Date();\r\n\r\n\t\tlet timestamp = _id.toString().substring(0, 8);\r\n\r\n\t\treturn new Date(parseInt(timestamp, 16) * 1000);\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'number',\r\n})\r\nexport class NumberPipe implements PipeTransform {\r\n\ttransform(value: unknown): number {\r\n\t\tconst result = Number(value); // Convert value to a number\r\n\r\n\t\treturn isNaN(result) ? 0 : result; // Return 0 if conversion fails\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'page',\r\n\tpure: false,\r\n})\r\nexport class PaginationPipe implements PipeTransform {\r\n\ttransform(arr: any, config: any, sort: any, search = ''): any {\r\n\t\tif (!Array.isArray(arr)) return [];\r\n\r\n\t\tarr = arr.slice();\r\n\r\n\t\tfor (let i = 0; i < arr.length; i++) {\r\n\t\t\tarr[i].num = i + 1;\r\n\t\t}\r\n\r\n\t\tif (sort.direction) {\r\n\t\t\tarr.sort((a: any, b: any) => {\r\n\t\t\t\tif (a[sort.title] < b[sort.title]) {\r\n\t\t\t\t\treturn sort.direction == 'desc' ? 1 : -1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (a[sort.title] > b[sort.title]) {\r\n\t\t\t\t\treturn sort.direction == 'desc' ? -1 : 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn arr.slice(\r\n\t\t\t(config.page - 1) * config.perPage,\r\n\t\t\tconfig.page * config.perPage,\r\n\t\t);\r\n\t}\r\n}\r\n","import { inject, Pipe } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n@Pipe({\r\n\tname: 'safe',\r\n})\r\nexport class SafePipe {\r\n\ttransform(html: any) {\r\n\t\treturn this._sanitizer.bypassSecurityTrustResourceUrl(html);\r\n\t}\r\n\r\n\tprivate _sanitizer = inject(DomSanitizer);\r\n}\r\n","import { Pipe, PipeTransform, Signal, isSignal } from '@angular/core';\r\n\r\ntype Query =\r\n\t| string\r\n\t| string[]\r\n\t| Record<string, unknown>\r\n\t| Signal<string | string[] | Record<string, unknown> | undefined>;\r\n\r\ntype Field =\r\n\t| string\r\n\t| string[]\r\n\t| number\r\n\t| Signal<string | string[] | number | undefined>;\r\n\r\n@Pipe({ name: 'search', pure: true })\r\nexport class SearchPipe implements PipeTransform {\r\n\ttransform<T>(\r\n\t\titems: T[] | Record<string, T>,\r\n\t\tquery?: Query,\r\n\t\tfields?: Field,\r\n\t\tlimit?: number,\r\n\t\tignore = false,\r\n\t\t_reload?: unknown,\r\n\t): T[] {\r\n\t\t/* unwrap signals */\r\n\t\tconst q = isSignal(query) ? query() : query;\r\n\r\n\t\tlet f = isSignal(fields) ? fields() : fields;\r\n\r\n\t\t/* allow “fields” to be a number (=limit) */\r\n\t\tif (typeof f === 'number') {\r\n\t\t\tlimit = f;\r\n\r\n\t\t\tf = undefined;\r\n\t\t}\r\n\r\n\t\tconst docs = Array.isArray(items) ? items : Object.values(items);\r\n\r\n\t\tif (ignore || !q) return limit ? docs.slice(0, limit) : docs;\r\n\r\n\t\t/* normalise fields */\r\n\t\tconst paths: string[] = !f\r\n\t\t\t? ['name']\r\n\t\t\t: Array.isArray(f)\r\n\t\t\t\t? f\r\n\t\t\t\t: f.trim().split(/\\s+/);\r\n\r\n\t\t/* normalise query */\r\n\t\tconst needles: string[] = Array.isArray(q)\r\n\t\t\t? q.map((s) => s.toLowerCase())\r\n\t\t\t: typeof q === 'object'\r\n\t\t\t\t? Object.keys(q)\r\n\t\t\t\t\t\t.filter((k) => (q as any)[k])\r\n\t\t\t\t\t\t.map((k) => k.toLowerCase())\r\n\t\t\t\t: [q.toLowerCase()];\r\n\r\n\t\tconst txtMatches = (val: any) => {\r\n\t\t\tif (val == null) return false;\r\n\r\n\t\t\tconst hay = val.toString().toLowerCase();\r\n\r\n\t\t\treturn needles.some((n) => hay.includes(n) || n.includes(hay));\r\n\t\t};\r\n\r\n\t\tconst walk = (obj: any, parts: string[]): boolean => {\r\n\t\t\tif (!obj) return false;\r\n\r\n\t\t\tconst [head, ...rest] = parts;\r\n\r\n\t\t\tconst next = obj[head];\r\n\r\n\t\t\tif (Array.isArray(next))\r\n\t\t\t\treturn next.some((v) =>\r\n\t\t\t\t\trest.length ? walk(v, rest) : txtMatches(v),\r\n\t\t\t\t);\r\n\r\n\t\t\treturn rest.length ? walk(next, rest) : txtMatches(next);\r\n\t\t};\r\n\r\n\t\tconst out: T[] = [];\r\n\r\n\t\tconst seen = new Set<number | string>();\r\n\r\n\t\tconst check = (doc: T, key: number | string) => {\r\n\t\t\tfor (const p of paths) {\r\n\t\t\t\tif (walk(doc, p.split('.'))) {\r\n\t\t\t\t\tif (!seen.has(key)) {\r\n\t\t\t\t\t\tout.push(doc);\r\n\r\n\t\t\t\t\t\tseen.add(key);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tArray.isArray(items)\r\n\t\t\t? docs.forEach((d, i) => check(d, i))\r\n\t\t\t: Object.entries(items).forEach(([k, v]) => check(v, k));\r\n\r\n\t\treturn limit ? out.slice(0, limit) : out;\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'splice',\r\n})\r\nexport class SplicePipe implements PipeTransform {\r\n\ttransform(from: any, which: any, refresh?: number): any {\r\n\t\tif (Array.isArray(from)) from = { arr: from, prop: '_id' };\r\n\r\n\t\tlet arr = (which.keep && []) || from.arr.slice();\r\n\r\n\t\tif (Array.isArray(which)) which = { arr: which, prop: '_id' };\r\n\r\n\t\tfor (let i = from.arr.length - 1; i >= 0; i--) {\r\n\t\t\tfor (let j = 0; j < which.arr.length; j++) {\r\n\t\t\t\tif (from.prop && which.prop) {\r\n\t\t\t\t\tif (from.arr[i][from.prop] == which.arr[j][which.prop]) {\r\n\t\t\t\t\t\tif (which.keep) {\r\n\t\t\t\t\t\t\tarr.push(from.arr[i]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tarr.splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (from.prop) {\r\n\t\t\t\t\tif (from.arr[i][from.prop] == which.arr[j]) {\r\n\t\t\t\t\t\tif (which.keep) {\r\n\t\t\t\t\t\t\tarr.push(from.arr[i]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tarr.splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (which.prop) {\r\n\t\t\t\t\tif (from.arr[i] == which.arr[j][which.prop]) {\r\n\t\t\t\t\t\tif (which.keep) {\r\n\t\t\t\t\t\t\tarr.push(from.arr[i]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tarr.splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (from.arr[i] == which.arr[j]) {\r\n\t\t\t\t\tif (which.keep) {\r\n\t\t\t\t\t\tarr.push(from.arr[i]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tarr.splice(i, 1);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn arr;\r\n\t}\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n\tname: 'split',\r\n})\r\nexport class SplitPipe implements PipeTransform {\r\n\ttransform(value: string, index = 0, devider = ':'): unknown {\r\n\t\tconst arr = value.split(devider);\r\n\r\n\t\treturn arr.length > index ? arr[index] : '';\r\n\t}\r\n}\r\n","import { Injectable, WritableSignal, signal } from '@angular/core';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport {\r\n\tObservable,\r\n\tSubject,\r\n\tcombineLatest,\r\n\tfilter,\r\n\tmap,\r\n\tmerge,\r\n\tshare,\r\n\tskip,\r\n\ttake,\r\n\ttakeUntil,\r\n\ttimeout,\r\n} from 'rxjs';\r\n\r\ntype Any = unknown;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EmitterService {\r\n\tprivate _signals = new Map<string, WritableSignal<Any>>();\r\n\tprivate _closers = new Map<string, Subject<void>>();\r\n\tprivate _streams = new Map<string, Observable<Any>>();\r\n\r\n\tprivate _getSignal(id: string): WritableSignal<Any> {\r\n\t\tlet s = this._signals.get(id);\r\n\t\tif (!s) {\r\n\t\t\t// emit even if same payload repeats\r\n\t\t\ts = signal<Any>(undefined, { equal: () => false });\r\n\t\t\tthis._signals.set(id, s);\r\n\t\t}\r\n\t\treturn s;\r\n\t}\r\n\r\n\tprivate _getCloser(id: string): Subject<void> {\r\n\t\tlet c = this._closers.get(id);\r\n\t\tif (!c) {\r\n\t\t\tc = new Subject<void>();\r\n\t\t\tthis._closers.set(id, c);\r\n\t\t}\r\n\t\treturn c;\r\n\t}\r\n\r\n\tprivate _getStream(id: string): Observable<Any> {\r\n\t\tlet obs$ = this._streams.get(id);\r\n\t\tif (!obs$) {\r\n\t\t\tconst sig = this._getSignal(id);\r\n\t\t\tconst closed$ = this._getCloser(id);\r\n\t\t\tobs$ = toObservable(sig).pipe(\r\n\t\t\t\t// Subject-like: don't replay the current value on subscribe\r\n\t\t\t\tskip(1),\r\n\t\t\t\ttakeUntil(closed$),\r\n\t\t\t\tshare(),\r\n\t\t\t);\r\n\t\t\tthis._streams.set(id, obs$);\r\n\t\t}\r\n\t\treturn obs$;\r\n\t}\r\n\r\n\t/** Emit an event */\r\n\temit<T = Any>(id: string, data?: T): void {\r\n\t\tthis._getSignal(id).set(data as Any);\r\n\t}\r\n\r\n\t/** Listen for events (hot, completes when off(id) is called) */\r\n\ton<T = Any>(id: string): Observable<T> {\r\n\t\treturn this._getStream(id) as Observable<T>;\r\n\t}\r\n\r\n\t/** Complete and remove a channel */\r\n\toff(id: string): void {\r\n\t\tconst closer = this._closers.get(id);\r\n\t\tif (closer) {\r\n\t\t\tcloser.next();\r\n\t\t\tcloser.complete();\r\n\t\t\tthis._closers.delete(id);\r\n\t\t}\r\n\t\tthis._signals.delete(id);\r\n\t\tthis._streams.delete(id);\r\n\t}\r\n\r\n\toffAll(): void {\r\n\t\tfor (const id of Array.from(this._closers.keys())) this.off(id);\r\n\t}\r\n\r\n\thas(id: string): boolean {\r\n\t\treturn this._signals.has(id);\r\n\t}\r\n\r\n\tprivate _done = new Map<string, WritableSignal<Any | undefined>>();\r\n\r\n\tprivate _getDoneSignal(id: string): WritableSignal<Any | undefined> {\r\n\t\tlet s = this._done.get(id);\r\n\t\tif (!s) {\r\n\t\t\ts = signal<Any | undefined>(undefined);\r\n\t\t\tthis._done.set(id, s);\r\n\t\t}\r\n\t\treturn s;\r\n\t}\r\n\r\n\t/** Mark task as completed with a payload (default: true) */\r\n\tcomplete<T = Any>(task: string, value: T = true as unknown as T): void {\r\n\t\tthis._getDoneSignal(task).set(value as Any);\r\n\t}\r\n\r\n\t/** Clear completion so it can be awaited again */\r\n\tclearCompleted(task: string): void {\r\n\t\tconst s = this._done.get(task) ?? this._getDoneSignal(task);\r\n\t\ts.set(undefined);\r\n\t}\r\n\r\n\t/** Read current completion payload (undefined => not completed) */\r\n\tcompleted(task: string): Any | undefined {\r\n\t\treturn this._getDoneSignal(task)();\r\n\t}\r\n\r\n\tisCompleted(task: string): boolean {\r\n\t\treturn this._getDoneSignal(task)() !== undefined;\r\n\t}\r\n\r\n\tonComplete(\r\n\t\ttasks: string | string[],\r\n\t\topts?: {\r\n\t\t\tmode?: 'all' | 'any';\r\n\t\t\ttimeoutMs?: number;\r\n\t\t\tabort?: AbortSignal;\r\n\t\t},\r\n\t): Observable<Any | Any[]> {\r\n\t\tconst list = (Array.isArray(tasks) ? tasks : [tasks]).filter(Boolean);\r\n\t\tconst streams = list.map((id) =>\r\n\t\t\ttoObservable(this._getDoneSignal(id)).pipe(\r\n\t\t\t\tfilter((v): v is Any => v !== undefined),\r\n\t\t\t\tmap((v) => v as Any),\r\n\t\t\t),\r\n\t\t);\r\n\r\n\t\tlet source$: Observable<Any | Any[]>;\r\n\r\n\t\tif (list.length <= 1) {\r\n\t\t\t// single-task await\r\n\t\t\tsource$ = streams[0]?.pipe(take(1)) ?? new Observable<never>();\r\n\t\t} else if (opts?.mode === 'any') {\r\n\t\t\tsource$ = merge(...streams).pipe(take(1));\r\n\t\t} else {\r\n\t\t\tsource$ = combineLatest(streams).pipe(take(1));\r\n\t\t}\r\n\r\n\t\tif (opts?.timeoutMs && Number.isFinite(opts.timeoutMs)) {\r\n\t\t\tsource$ = source$.pipe(timeout({ first: opts.timeoutMs }));\r\n\t\t}\r\n\r\n\t\tif (opts?.abort) {\r\n\t\t\tconst abort$ = new Observable<void>((sub) => {\r\n\t\t\t\tconst handler = () => {\r\n\t\t\t\t\tsub.next();\r\n\t\t\t\t\tsub.complete();\r\n\t\t\t\t};\r\n\t\t\t\topts.abort!.addEventListener('abort', handler);\r\n\t\t\t\treturn () => opts.abort!.removeEventListener('abort', handler);\r\n\t\t\t});\r\n\t\t\tsource$ = source$.pipe(takeUntil(abort$));\r\n\t\t}\r\n\r\n\t\treturn source$;\r\n\t}\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tHttpClient,\r\n\tHttpErrorResponse,\r\n\tHttpHeaders,\r\n} from '@angular/common/http';\r\nimport {\r\n\tInject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n\tinject,\r\n} from '@angular/core';\r\nimport { EMPTY, Observable, ReplaySubject } from 'rxjs';\r\nimport { catchError, first } from 'rxjs/operators';\r\nimport { CONFIG_TOKEN, Config } from '../interfaces/config.interface';\r\nimport {\r\n\tDEFAULT_HTTP_CONFIG,\r\n\tHttpConfig,\r\n\tHttpHeaderType,\r\n} from '../interfaces/http.interface';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class HttpService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\t// An array of error handling callbacks\r\n\terrors: ((err: HttpErrorResponse, retry?: () => void) => {})[] = [];\r\n\r\n\t// Base URL for HTTP requests\r\n\turl = '';\r\n\r\n\t// Flag to lock the service to prevent multiple requests\r\n\tlocked = false;\r\n\r\n\t// Array to store setTimeout IDs for managing request locks\r\n\tawaitLocked: ReturnType<typeof setTimeout>[] = [];\r\n\r\n\t// Configuration object for HTTP settings\r\n\tprivate _config: HttpConfig;\r\n\r\n\t// Object to store HTTP headers\r\n\tprivate _headers: {\r\n\t\t[name: string]: HttpHeaderType;\r\n\t} = {};\r\n\r\n\t// Instance of HttpHeaders with current headers\r\n\tprivate _http_headers = new HttpHeaders(this._headers);\r\n\r\n\tconstructor(\r\n\t\t@Inject(CONFIG_TOKEN) @Optional() config: Config,\r\n\t\tprivate _http: HttpClient,\r\n\t) {\r\n\t\t// Initialize HTTP configuration and headers from injected config\r\n\t\tthis._config = {\r\n\t\t\t...DEFAULT_HTTP_CONFIG,\r\n\t\t\t...(config.http || {}),\r\n\t\t};\r\n\r\n\t\tif (typeof this._config.url === 'string') {\r\n\t\t\tthis.setUrl(this._config.url);\r\n\t\t}\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis.url = localStorage.getItem('wacom-http.url') || this.url;\r\n\r\n\t\t\tconst raw = localStorage.getItem('wacom-http.headers');\r\n\t\t\tthis._headers = raw ? JSON.parse(raw) : this._headers;\r\n\t\t\tthis._http_headers = new HttpHeaders(this._headers);\r\n\t\t}\r\n\r\n\t\tif (typeof this._config.headers === 'object') {\r\n\t\t\tfor (const header in this._config.headers) {\r\n\t\t\t\tthis._headers[header] = this._config.headers[header];\r\n\t\t\t}\r\n\r\n\t\t\tthis._http_headers = new HttpHeaders(this._headers);\r\n\t\t}\r\n\t}\r\n\r\n\t// Set a new base URL and save it in the store\r\n\tsetUrl(url: string) {\r\n\t\tthis.url = url;\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.setItem('wacom-http.url', url);\r\n\t\t}\r\n\t}\r\n\r\n\t// Remove the base URL and revert to the default or stored one\r\n\tremoveUrl() {\r\n\t\tthis.url = this._config.url || '';\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.removeItem('wacom-http.url');\r\n\t\t}\r\n\t}\r\n\r\n\t// Set a new HTTP header and update the stored headers\r\n\tset(key: any, value: any) {\r\n\t\tthis._headers[key] = value;\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.setItem(\r\n\t\t\t\t'wacom-http.headers',\r\n\t\t\t\tJSON.stringify(this._headers),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tthis._http_headers = new HttpHeaders(this._headers);\r\n\t}\r\n\r\n\t// Get the value of a specific HTTP header\r\n\theader(key: any) {\r\n\t\treturn this._headers[key];\r\n\t}\r\n\r\n\t// Remove a specific HTTP header and update the stored headers\r\n\tremove(key: any) {\r\n\t\tdelete this._headers[key];\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.setItem(\r\n\t\t\t\t'wacom-http.headers',\r\n\t\t\t\tJSON.stringify(this._headers),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tthis._http_headers = new HttpHeaders(this._headers);\r\n\t}\r\n\r\n\t// Internal method to make HTTP requests based on the method type\r\n\tprivate _httpMethod(\r\n\t\tmethod: string,\r\n\t\t_url: string,\r\n\t\tdoc: unknown,\r\n\t\theaders: any,\r\n\t): Observable<any> {\r\n\t\tif (method === 'post') {\r\n\t\t\treturn this._http.post<any>(_url, doc, headers);\r\n\t\t} else if (method === 'put') {\r\n\t\t\treturn this._http.put<any>(_url, doc, headers);\r\n\t\t} else if (method === 'patch') {\r\n\t\t\treturn this._http.patch<any>(_url, doc, headers);\r\n\t\t} else if (method === 'delete') {\r\n\t\t\treturn this._http.delete<any>(_url, headers);\r\n\t\t} else {\r\n\t\t\treturn this._http.get<any>(_url, headers);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Internal method to handle HTTP requests for various methods (POST, PUT, PATCH, DELETE, GET).\r\n\t *\r\n\t * Features:\r\n\t * - **Request Locking**: Manages request locking to prevent simultaneous requests.\r\n\t * - **Acceptance Check**: Validates the server response against a user-defined `acceptance` function.\r\n\t * If the check fails, the response is rejected with an error.\r\n\t * - **Replace Logic**: Allows modification of specific parts of the response object, determined by a user-defined `replace` function.\r\n\t * Can handle both objects and arrays within the response.\r\n\t * - **Field Filtering**: Supports extracting specific fields from response objects or arrays.\r\n\t * - **Legacy Support**: Compatible with callback-based usage alongside Observables.\r\n\t * - **ReplaySubject**: Ensures that the response can be shared across multiple subscribers.\r\n\t *\r\n\t * @param url - The endpoint to send the HTTP request to (relative to the base URL).\r\n\t * @param doc - The request payload for methods like POST, PUT, and PATCH.\r\n\t * @param callback - A legacy callback function to handle the response.\r\n\t * @param opts - Additional options:\r\n\t * - `err`: Error handling callback.\r\n\t * - `acceptance`: Function to validate the server response. Should return `true` for valid responses.\r\n\t * - `replace`: Function to modify specific parts of the response data.\r\n\t * - `fields`: Array of fields to extract from the response object(s).\r\n\t * - `data`: Path in the response where the data resides for `replace` and `fields` operations.\r\n\t * - `skipLock`: If `true`, bypasses request locking.\r\n\t * - `url`: Overrides the base URL for this request.\r\n\t * @param method - The HTTP method (e.g., 'post', 'put', 'patch', 'delete', 'get').\r\n\t * @returns An Observable that emits the processed HTTP response or an error.\r\n\t */\r\n\tprivate _post(\r\n\t\turl: string,\r\n\t\tdoc: unknown,\r\n\t\tcallback = (resp: unknown) => {},\r\n\t\topts: any = {},\r\n\t\tmethod = 'post',\r\n\t): Observable<any> {\r\n\t\tif (typeof opts === 'function') {\r\n\t\t\topts = { err: opts };\r\n\t\t}\r\n\r\n\t\tif (!opts.err) {\r\n\t\t\topts.err = (err: HttpErrorResponse) => {};\r\n\t\t}\r\n\r\n\t\t// Handle request locking to avoid multiple simultaneous requests\r\n\t\tif (this.locked && !opts.skipLock) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tconst wait = setTimeout(() => {\r\n\t\t\t\t\tthis._post(url, doc, callback, opts, method).subscribe(\r\n\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t);\r\n\t\t\t\t}, 100);\r\n\r\n\t\t\t\tthis.awaitLocked.push(wait);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst _url = (opts.url || this.url) + url;\r\n\r\n\t\tthis.prepare_handle(_url, doc);\r\n\r\n\t\t// Using ReplaySubject to allow multiple subscriptions without re-triggering the HTTP request\r\n\t\tconst responseSubject = new ReplaySubject(1);\r\n\r\n\t\tthis._httpMethod(method, _url, doc, { headers: this._http_headers })\r\n\t\t\t.pipe(\r\n\t\t\t\tfirst(),\r\n\t\t\t\tcatchError((error: HttpErrorResponse) => {\r\n\t\t\t\t\tthis.handleError(opts.err, () => {\r\n\t\t\t\t\t\tthis._post(url, doc, callback, opts, method).subscribe(\r\n\t\t\t\t\t\t\tresponseSubject,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t})(error);\r\n\r\n\t\t\t\t\tresponseSubject.error(error);\r\n\r\n\t\t\t\t\treturn EMPTY;\r\n\t\t\t\t}),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\topts.acceptance &&\r\n\t\t\t\t\t\ttypeof opts.acceptance === 'function'\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tif (!opts.acceptance(resp)) {\r\n\t\t\t\t\t\t\tconst error = new HttpErrorResponse({\r\n\t\t\t\t\t\t\t\terror: 'Acceptance failed',\r\n\t\t\t\t\t\t\t\tstatus: 400,\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tthis.handleError(opts.err, () => {})(error);\r\n\r\n\t\t\t\t\t\t\tresponseSubject.error(error);\r\n\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (opts.replace && typeof opts.replace === 'function') {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tArray.isArray(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(resp, opts.data),\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(\r\n\t\t\t\t\t\t\t\t\tresp,\r\n\t\t\t\t\t\t\t\t\topts.data,\r\n\t\t\t\t\t\t\t\t) as Array<unknown>\r\n\t\t\t\t\t\t\t).map((item: unknown) => opts.replace(item));\r\n\t\t\t\t\t\t} else if (this._getObjectToReplace(resp, opts.data)) {\r\n\t\t\t\t\t\t\topts.replace(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(resp, opts.data),\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (Array.isArray(opts.fields)) {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tArray.isArray(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(resp, opts.data),\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(\r\n\t\t\t\t\t\t\t\t\tresp,\r\n\t\t\t\t\t\t\t\t\topts.data,\r\n\t\t\t\t\t\t\t\t) as Array<unknown>\r\n\t\t\t\t\t\t\t).map((item: unknown) => {\r\n\t\t\t\t\t\t\t\treturn this._newDoc(item, opts.fields);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t} else if (this._getObjectToReplace(resp, opts.data)) {\r\n\t\t\t\t\t\t\tconst newDoc = this._newDoc(\r\n\t\t\t\t\t\t\t\tthis._getObjectToReplace(resp, opts.data),\r\n\t\t\t\t\t\t\t\topts.fields,\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\tif (opts.data) {\r\n\t\t\t\t\t\t\t\tthis._setObjectToReplace(\r\n\t\t\t\t\t\t\t\t\tresp,\r\n\t\t\t\t\t\t\t\t\topts.data,\r\n\t\t\t\t\t\t\t\t\tnewDoc,\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tresp = newDoc;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.response_handle(_url, resp, () => callback(resp));\r\n\r\n\t\t\t\t\tresponseSubject.next(resp);\r\n\r\n\t\t\t\t\tresponseSubject.complete();\r\n\t\t\t\t},\r\n\t\t\t\terror: (err) => responseSubject.error(err),\r\n\t\t\t\tcomplete: () => responseSubject.complete(),\r\n\t\t\t});\r\n\r\n\t\treturn responseSubject.asObservable();\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a POST request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tpost(\r\n\t\turl: string,\r\n\t\tdoc: any,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, doc, callback, opts);\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a PUT request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tput(\r\n\t\turl: string,\r\n\t\tdoc: any,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, doc, callback, opts, 'put');\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a PATCH request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tpatch(\r\n\t\turl: string,\r\n\t\tdoc: any,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, doc, callback, opts, 'patch');\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a DELETE request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tdelete(\r\n\t\turl: string,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, null, callback, opts, 'delete');\r\n\t}\r\n\r\n\t/**\r\n\t * Public method to perform a GET request.\r\n\t * - Supports legacy callback usage.\r\n\t * - Returns an Observable for reactive programming.\r\n\t */\r\n\tget(\r\n\t\turl: string,\r\n\t\tcallback = (resp: any) => {},\r\n\t\topts: any = {},\r\n\t): Observable<any> {\r\n\t\treturn this._post(url, null, callback, opts, 'get');\r\n\t}\r\n\r\n\t// Clear all pending request locks\r\n\tclearLocked() {\r\n\t\tfor (const awaitLocked of this.awaitLocked) {\r\n\t\t\tclearTimeout(awaitLocked);\r\n\t\t}\r\n\t\tthis.awaitLocked = [];\r\n\t}\r\n\r\n\t// Lock the service to prevent multiple simultaneous requests\r\n\tlock() {\r\n\t\tthis.locked = true;\r\n\t}\r\n\r\n\t// Unlock the service to allow new requests\r\n\tunlock() {\r\n\t\tthis.locked = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Handles HTTP errors.\r\n\t * - Calls provided error callback and retries the request if needed.\r\n\t */\r\n\tprivate handleError(callback: any, retry: () => void) {\r\n\t\treturn (error: HttpErrorResponse): Promise<void> => {\r\n\t\t\treturn new Promise((resolve) => {\r\n\t\t\t\tthis.err_handle(error, callback, retry);\r\n\t\t\t\tresolve();\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Internal method to trigger error handling callbacks.\r\n\t */\r\n\tprivate err_handle(\r\n\t\terr: HttpErrorResponse,\r\n\t\tnext: (err: HttpErrorResponse) => void,\r\n\t\tretry: () => void,\r\n\t) {\r\n\t\tif (typeof next === 'function') {\r\n\t\t\tnext(err);\r\n\t\t}\r\n\r\n\t\tfor (const callback of this.errors) {\r\n\t\t\tif (typeof callback === 'function') {\r\n\t\t\t\tcallback(err, retry);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Placeholder method for handling request preparation (can be customized)\r\n\tprivate prepare_handle(url: string, body: unknown) {}\r\n\r\n\t// Placeholder method for handling the response (can be customized)\r\n\tprivate response_handle(url: string, body: unknown, next: () => void) {\r\n\t\tif (typeof next === 'function') {\r\n\t\t\tnext();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves a nested object or property from the response based on a dot-separated path.\r\n\t *\r\n\t * @param resp - The response object to retrieve data from.\r\n\t * @param base - A dot-separated string indicating the path to the desired property within the response.\r\n\t * - Example: `'data.items'` will navigate through `resp.data.items`.\r\n\t * - If empty, the entire response is returned.\r\n\t * @returns The object or property located at the specified path within the response.\r\n\t */\r\n\tprivate _getObjectToReplace(resp: unknown, base = ''): unknown {\r\n\t\tif (base.includes('.')) {\r\n\t\t\tconst newBase = base.split('');\r\n\r\n\t\t\tconst currentBase: string = newBase.pop() || '';\r\n\r\n\t\t\treturn this._getObjectToReplace(\r\n\t\t\t\t(resp as Record<string, unknown>)[currentBase] || {},\r\n\t\t\t\tnewBase.join('.'),\r\n\t\t\t);\r\n\t\t} else if (base) {\r\n\t\t\treturn (resp as Record<string, unknown>)[base];\r\n\t\t} else {\r\n\t\t\treturn resp;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets or replaces a nested object or property in the response based on a dot-separated path.\r\n\t *\r\n\t * @param resp - The response object to modify.\r\n\t * @param base - A dot-separated string indicating the path to the property to replace.\r\n\t * - Example: `'data.items'` will navigate through `resp.data.items`.\r\n\t * @param doc - The new data or object to set at the specified path.\r\n\t * @returns `void`.\r\n\t */\r\n\tprivate _setObjectToReplace(resp: unknown, base = '', doc: unknown): void {\r\n\t\twhile (base.includes('.')) {\r\n\t\t\tconst newBase = base.split('');\r\n\r\n\t\t\tconst currentBase: string = newBase.pop() || '';\r\n\r\n\t\t\tresp = (resp as Record<string, unknown>)[currentBase] || {};\r\n\r\n\t\t\tbase = newBase.join('.');\r\n\t\t}\r\n\r\n\t\t(resp as Record<string, unknown>)[base] = doc;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new object containing only specified fields from the input item.\r\n\t *\r\n\t * @param item - The input object to extract fields from.\r\n\t * @param fields - An array of field names to include in the new object.\r\n\t * - Example: `['id', 'name']` will create a new object with only the `id` and `name` properties from `item`.\r\n\t * @returns A new object containing only the specified fields.\r\n\t */\r\n\tprivate _newDoc(item: unknown, fields: string[]): unknown {\r\n\t\tconst newDoc: Record<string, unknown> = {};\r\n\r\n\t\tfor (const field of fields) {\r\n\t\t\tnewDoc[field] = (item as Record<string, unknown>)[field];\r\n\t\t}\r\n\r\n\t\treturn newDoc;\r\n\t}\r\n}\r\n","// network.service.ts — Angular 20+ (zoneless) signal-based connectivity checker\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInject,\r\n\tinject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n\tsignal,\r\n} from '@angular/core';\r\nimport { Config, CONFIG_TOKEN } from '../interfaces/config.interface';\r\nimport {\r\n\tDEFAULT_NETWORK_CONFIG,\r\n\tNetworkConfig,\r\n\tNetworkStatus,\r\n} from '../interfaces/network.interface';\r\nimport { EmitterService } from './emitter.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NetworkService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\t/** Internal mutable signals. */\r\n\tprivate _status = signal<NetworkStatus>(\r\n\t\tthis._isBrowser && navigator.onLine ? 'poor' : 'none',\r\n\t);\r\n\tprivate _latencyMs = signal<number | null>(null);\r\n\tprivate _isOnline = signal<boolean>(\r\n\t\tthis._isBrowser ? navigator.onLine : false,\r\n\t);\r\n\r\n\t/** Public read-only signals. */\r\n\treadonly status = this._status.asReadonly();\r\n\treadonly latencyMs = this._latencyMs.asReadonly();\r\n\treadonly isOnline = this._isOnline.asReadonly();\r\n\r\n\t/** Failure counter to decide \"none\". */\r\n\tprivate _fails = 0;\r\n\r\n\t/**\r\n\t * Creates the network monitor, binds browser/Capacitor events,\r\n\t * performs an immediate check, and starts periodic polling.\r\n\t */\r\n\tconstructor(@Inject(CONFIG_TOKEN) @Optional() config: Config) {\r\n\t\tthis._config = {\r\n\t\t\t...DEFAULT_NETWORK_CONFIG,\r\n\t\t\t...(config.network || ({} as NetworkConfig)),\r\n\t\t};\r\n\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tthis._bindEvents();\r\n\r\n\t\tthis.recheckNow(); // fire once on start\r\n\r\n\t\twindow.setInterval(() => this.recheckNow(), this._config.intervalMs);\r\n\t}\r\n\r\n\t/**\r\n\t * Manually trigger a connectivity check.\r\n\t * - Measures latency against the first reachable endpoint.\r\n\t * - Updates `isOnline`, `latencyMs`, and `status` accordingly.\r\n\t */\r\n\tasync recheckNow(): Promise<void> {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tconst res = await this._pingAny();\r\n\r\n\t\tif (res.ok && res.latency != null) {\r\n\t\t\tthis._fails = 0;\r\n\r\n\t\t\tthis._latencyMs.set(res.latency);\r\n\r\n\t\t\tthis._isOnline.set(true);\r\n\t\t} else {\r\n\t\t\tthis._fails++;\r\n\r\n\t\t\tthis._latencyMs.set(null);\r\n\t\t\t// `isOnline` may still be true per OS; we let online/offline events keep it in sync.\r\n\t\t}\r\n\r\n\t\tthis._updateClassification();\r\n\t}\r\n\r\n\t// ─────────────────────────── Internals ───────────────────────────\r\n\r\n\t/**\r\n\t * Classifies current state into 'good' | 'poor' | 'none'.\r\n\t * - 'none' if offline or too many consecutive failures.\r\n\t * - 'good' if latency ≤ goodLatencyMs.\r\n\t * - otherwise 'poor'.\r\n\t */\r\n\tprivate _updateClassification(): void {\r\n\t\tif (\r\n\t\t\t!this._isOnline() ||\r\n\t\t\tthis._fails >= this._config.maxConsecutiveFails\r\n\t\t) {\r\n\t\t\tif (this._status() !== 'none') {\r\n\t\t\t\tthis._status.set('none');\r\n\r\n\t\t\t\tthis._emitterService.emit('wacom_offline');\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst l = this._latencyMs();\r\n\r\n\t\tif (l != null && l <= this._config.goodLatencyMs) {\r\n\t\t\tif (this._status() !== 'good') {\r\n\t\t\t\tthis._status.set('good');\r\n\r\n\t\t\t\tthis._emitterService.emit('wacom_online');\r\n\t\t\t}\r\n\t\t} else if (this._status() !== 'poor') {\r\n\t\t\tthis._status.set('poor');\r\n\r\n\t\t\tthis._emitterService.emit('wacom_online');\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Binds browser events that can affect connectivity:\r\n\t * - online/offline (OS connectivity)\r\n\t * - visibilitychange (recheck on focus)\r\n\t * - NetworkInformation 'change' (if supported)\r\n\t */\r\n\tprivate _bindEvents(): void {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\twindow.addEventListener('online', () => {\r\n\t\t\tthis._isOnline.set(true);\r\n\r\n\t\t\tthis.recheckNow();\r\n\t\t});\r\n\r\n\t\twindow.addEventListener('offline', () => {\r\n\t\t\tthis._isOnline.set(false);\r\n\r\n\t\t\tthis._updateClassification();\r\n\t\t});\r\n\r\n\t\t(navigator as any).connection?.addEventListener?.('change', () =>\r\n\t\t\tthis.recheckNow(),\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Tries endpoints in order until one responds (CORS or opaque).\r\n\t * Returns success with measured latency, or a failure result.\r\n\t */\r\n\tprivate async _pingAny(): Promise<{ ok: boolean; latency: number | null }> {\r\n\t\tif (!this._isBrowser) return { ok: false, latency: null };\r\n\r\n\t\tfor (const url of this._config.endpoints) {\r\n\t\t\tconst noCors = !url.includes('api.webart.work'); // treat public fallbacks as opaque checks\r\n\r\n\t\t\tconst r = await this._measure(\r\n\t\t\t\turl,\r\n\t\t\t\tthis._config.timeoutMs,\r\n\t\t\t\tnoCors,\r\n\t\t\t).catch(() => null);\r\n\r\n\t\t\tif (r?.ok) return r;\r\n\t\t}\r\n\r\n\t\treturn { ok: false, latency: null };\r\n\t}\r\n\r\n\t/**\r\n\t * Measures a single fetch:\r\n\t * - Appends a timestamp to bypass caches.\r\n\t * - Uses `no-store` to avoid intermediaries caching.\r\n\t * - When `noCors` is true, uses `mode:'no-cors'` and treats a resolved fetch as reachable.\r\n\t */\r\n\tprivate async _measure(\r\n\t\turl: string,\r\n\t\ttimeoutMs: number,\r\n\t\tnoCors = false,\r\n\t): Promise<{ ok: boolean; latency: number | null }> {\r\n\t\tconst ctrl = new AbortController();\r\n\t\tconst timer = setTimeout(() => ctrl.abort(), timeoutMs);\r\n\t\tconst t0 = performance.now();\r\n\r\n\t\ttry {\r\n\t\t\tconst res = await fetch(\r\n\t\t\t\turl + (url.includes('?') ? '&' : '?') + 't=' + Date.now(),\r\n\t\t\t\t{\r\n\t\t\t\t\tmethod: 'GET',\r\n\t\t\t\t\tcache: 'no-store',\r\n\t\t\t\t\tcredentials: 'omit',\r\n\t\t\t\t\tsignal: ctrl.signal,\r\n\t\t\t\t\tmode: noCors ? 'no-cors' : 'cors',\r\n\t\t\t\t},\r\n\t\t\t);\r\n\r\n\t\t\tclearTimeout(timer);\r\n\r\n\t\t\tconst latency = Math.round(performance.now() - t0);\r\n\r\n\t\t\t// In no-cors, Response is opaque; treat as success if the fetch resolved.\r\n\t\t\tconst ok = noCors ? true : res.ok;\r\n\r\n\t\t\treturn { ok, latency };\r\n\t\t} catch {\r\n\t\t\tclearTimeout(timer);\r\n\r\n\t\t\treturn { ok: false, latency: null };\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _config: NetworkConfig;\r\n\r\n\tprivate _emitterService = inject(EmitterService);\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n\tinject,\r\n} from '@angular/core';\r\nimport {\r\n\tCONFIG_TOKEN,\r\n\tConfig,\r\n\tDEFAULT_CONFIG,\r\n} from '../interfaces/config.interface';\r\nimport { StoreConfig } from '../interfaces/store.interface';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class StoreService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tconstructor(@Inject(CONFIG_TOKEN) @Optional() config: Config) {\r\n\t\tthis._config = {\r\n\t\t\t...DEFAULT_CONFIG,\r\n\t\t\t...(config?.store || {}),\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the prefix for storage keys.\r\n\t *\r\n\t * @param prefix - The prefix to set.\r\n\t */\r\n\tsetPrefix(prefix: string): void {\r\n\t\tthis._prefix = prefix;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a value in storage asynchronously.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @param value - The value to store.\r\n\t * @returns A promise that resolves to a boolean indicating success.\r\n\t */\r\n\tasync set(\r\n\t\tkey: string,\r\n\t\tvalue: string,\r\n\t\tcallback: () => void = () => {},\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<boolean> {\r\n\t\tkey = this._applyPrefix(key);\r\n\r\n\t\ttry {\r\n\t\t\tif (this._config.set) {\r\n\t\t\t\tawait this._config.set(key, value, callback, errCallback);\r\n\t\t\t} else {\r\n\t\t\t\tif (!this._isBrowser) {\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlocalStorage.setItem(key, value);\r\n\r\n\t\t\t\tcallback();\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\terrCallback(err);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a value from storage asynchronously.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @returns A promise that resolves to the retrieved value or `null` if the key is missing.\r\n\t */\r\n\tasync get(\r\n\t\tkey: string,\r\n\t\tcallback?: (value: string | null) => void,\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<string | null> {\r\n\t\tkey = this._applyPrefix(key);\r\n\r\n\t\ttry {\r\n\t\t\tif (this._config.get) {\r\n\t\t\t\tconst value = await this._config.get(\r\n\t\t\t\t\tkey,\r\n\t\t\t\t\t(val: string) => {\r\n\t\t\t\t\t\tcallback?.(val ?? null);\r\n\t\t\t\t\t},\r\n\t\t\t\t\terrCallback,\r\n\t\t\t\t);\r\n\r\n\t\t\t\treturn value ?? null;\r\n\t\t\t} else {\r\n\t\t\t\tif (!this._isBrowser) {\r\n\t\t\t\t\tcallback?.(null);\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst value = localStorage.getItem(key);\r\n\r\n\t\t\t\tcallback?.(value ?? null);\r\n\r\n\t\t\t\treturn value ?? null;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\terrCallback(err);\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets a JSON value in storage asynchronously.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @param value - The value to store.\r\n\t * @returns A promise that resolves to a boolean indicating success.\r\n\t */\r\n\tasync setJson<T>(\r\n\t\tkey: string,\r\n\t\tvalue: T,\r\n\t\tcallback: () => void = () => {},\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<boolean> {\r\n\t\treturn await this.set(\r\n\t\t\tkey,\r\n\t\t\tJSON.stringify(value),\r\n\t\t\tcallback,\r\n\t\t\terrCallback,\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a JSON value from storage asynchronously.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @returns A promise that resolves to the retrieved value.\r\n\t */\r\n\tasync getJson<T = any>(\r\n\t\tkey: string,\r\n\t\tcallback?: (value: string | null) => void,\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<T | null> {\r\n\t\tconst value = await this.get(key);\r\n\r\n\t\tif (value === null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst result = JSON.parse(value);\r\n\r\n\t\t\tcallback?.(result);\r\n\r\n\t\t\treturn result;\r\n\t\t} catch (err) {\r\n\t\t\terrCallback?.(err);\r\n\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a value from storage.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @param callback - The callback to execute on success.\r\n\t * @param errCallback - The callback to execute on error.\r\n\t * @returns A promise that resolves to a boolean indicating success.\r\n\t */\r\n\tasync remove(\r\n\t\tkey: string,\r\n\t\tcallback: () => void = () => {},\r\n\t\terrCallback: (err: unknown) => void = () => {},\r\n\t): Promise<boolean> {\r\n\t\tkey = this._applyPrefix(key);\r\n\r\n\t\ttry {\r\n\t\t\tif (this._config.remove) {\r\n\t\t\t\treturn await this._config.remove(key, callback, errCallback);\r\n\t\t\t} else {\r\n\t\t\t\tif (!this._isBrowser) {\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlocalStorage.removeItem(key);\r\n\r\n\t\t\t\tcallback();\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\terrCallback(err);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Clears all values from storage.\r\n\t *\r\n\t * @param callback - The callback to execute on success.\r\n\t * @param errCallback - The callback to execute on error.\r\n\t * @returns A promise that resolves to a boolean indicating success.\r\n\t */\r\n\tasync clear(\r\n\t\tcallback?: () => void,\r\n\t\terrCallback?: (err: unknown) => void,\r\n\t): Promise<boolean> {\r\n\t\ttry {\r\n\t\t\tif (this._config.clear) {\r\n\t\t\t\tawait this._config.clear();\r\n\t\t\t} else {\r\n\t\t\t\tif (!this._isBrowser) {\r\n\t\t\t\t\tcallback?.();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlocalStorage.clear();\r\n\t\t\t}\r\n\r\n\t\t\tcallback?.();\r\n\r\n\t\t\treturn true;\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(err);\r\n\r\n\t\t\terrCallback?.(err);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _prefix = '';\r\n\r\n\tprivate _config: StoreConfig;\r\n\r\n\t/**\r\n\t * Applies the configured prefix to a storage key.\r\n\t *\r\n\t * @param key - The storage key.\r\n\t * @returns The prefixed storage key.\r\n\t */\r\n\tprivate _applyPrefix(key: string): string {\r\n\t\tif (this._config.prefix) {\r\n\t\t\tkey = this._config.prefix + key;\r\n\t\t}\r\n\r\n\t\tif (this._prefix) {\r\n\t\t\tkey = this._prefix + key;\r\n\t\t}\r\n\r\n\t\treturn key;\r\n\t}\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport { PLATFORM_ID, WritableSignal, inject, signal } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { CoreService } from '../services/core.service';\r\nimport { EmitterService } from '../services/emitter.service';\r\nimport { HttpService } from '../services/http.service';\r\nimport { NetworkService } from '../services/network.service';\r\nimport { StoreService } from '../services/store.service';\r\nimport { CrudDocument, CrudOptions } from './crud.interface';\r\n\r\ninterface CrudConfig<Document> {\r\n\tsignalFields?: Record<string, (doc: Document) => unknown>;\r\n\tname: string;\r\n\t_id?: string;\r\n\treplace?: (doc: Document) => void;\r\n\tunauthorized?: boolean;\r\n\tappId?: string;\r\n}\r\n\r\ninterface GetConfig {\r\n\tpage?: number;\r\n\tperPage?: number;\r\n\tquery?: string;\r\n}\r\n\r\n/**\r\n * Abstract class representing a CRUD (Create, Read, Update, Delete) service.\r\n *\r\n * This class provides methods for managing documents, interacting with an API,\r\n * and storing/retrieving data from local storage. It is designed to be extended\r\n * for specific document types.\r\n *\r\n * @template Document - The type of the document the service handles.\r\n */\r\nexport abstract class CrudService<Document extends CrudDocument<Document>> {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\t/**\r\n\t * Base URL for the API collection associated with this service.\r\n\t */\r\n\tprivate _url = '/api/';\r\n\r\n\t/**\r\n\t * In-memory cache with all documents currently known by the service.\r\n\t */\r\n\tprivate _docs: Document[] = [];\r\n\r\n\t/**\r\n\t * Number of documents per page for paginated `get()` calls.\r\n\t */\r\n\tprivate _perPage = 20;\r\n\r\n\t/**\r\n\t * Registered callbacks that recompute filtered document views.\r\n\t */\r\n\tprivate _filteredDocumentsCallbacks: (() => void)[] = [];\r\n\r\n\t/**\r\n\t * HTTP client wrapper used for API communication.\r\n\t */\r\n\tprotected __httpService = inject(HttpService);\r\n\r\n\t/**\r\n\t * Key–value storage service used to persist documents locally.\r\n\t */\r\n\tprotected __storeService = inject(StoreService);\r\n\r\n\t/**\r\n\t * Core helper service with utility methods (copy, debounce, toSignal, etc.).\r\n\t */\r\n\tprotected __coreService = inject(CoreService);\r\n\r\n\t/**\r\n\t * Global event bus for cross-service communication.\r\n\t */\r\n\tprotected __emitterService = inject(EmitterService);\r\n\r\n\t/**\r\n\t * Network status service used to queue work while offline.\r\n\t */\r\n\tprotected __networkService = inject(NetworkService);\r\n\r\n\t/**\r\n\t * Emits once when documents are restored from local storage on startup.\r\n\t */\r\n\tloaded: Observable<unknown>;\r\n\r\n\t/**\r\n\t * Emits once when the initial `get()` (without page param) completes.\r\n\t */\r\n\tgetted: Observable<unknown>;\r\n\r\n\tconstructor(private _config: CrudConfig<Document>) {\r\n\t\tthis._config.signalFields = this._config.signalFields || {};\r\n\r\n\t\tthis._url += this._config.name;\r\n\r\n\t\tthis.loaded = this.__emitterService.onComplete(\r\n\t\t\tthis._config.name + '_loaded',\r\n\t\t);\r\n\r\n\t\tthis.getted = this.__emitterService.onComplete(\r\n\t\t\tthis._config.name + '_getted',\r\n\t\t);\r\n\r\n\t\tif (this._config.unauthorized) {\r\n\t\t\tthis.restoreDocs();\r\n\t\t} else if (this._isBrowser && localStorage.getItem('waw_user')) {\r\n\t\t\tconst user = JSON.parse(localStorage.getItem('waw_user') as string);\r\n\r\n\t\t\tif (\r\n\t\t\t\tuser._id ===\r\n\t\t\t\tlocalStorage.getItem(this._config.name + 'waw_user_id')\r\n\t\t\t) {\r\n\t\t\t\tthis.restoreDocs();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.__emitterService.on('wipe').subscribe((): void => {\r\n\t\t\tthis.clearDocs();\r\n\r\n\t\t\tthis._filterDocuments();\r\n\t\t});\r\n\r\n\t\tthis.__emitterService.on('wacom_online').subscribe(() => {\r\n\t\t\tfor (const callback of this._onOnline) {\r\n\t\t\t\tcallback();\r\n\t\t\t}\r\n\r\n\t\t\tthis._onOnline.length = 0;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Cache of per-document signals indexed by document _id.\r\n\t * Prevents creating multiple signals for the same document.\r\n\t */\r\n\tprivate _signal: Record<string, WritableSignal<Document>> = {};\r\n\r\n\t/**\r\n\t * Cache of per (field,value) lists of document signals.\r\n\t * Key format: `${field}_${JSON.stringify(value)}`.\r\n\t */\r\n\tprivate _signals: Record<\r\n\t\tstring,\r\n\t\tWritableSignal<WritableSignal<Document>[]>\r\n\t> = {};\r\n\r\n\t/**\r\n\t * Cache of per-field maps: fieldValue -> array of document signals.\r\n\t */\r\n\tprivate _fieldSignals: Record<\r\n\t\tstring,\r\n\t\tWritableSignal<Record<string, WritableSignal<Document>[]>>\r\n\t> = {};\r\n\r\n\t/**\r\n\t * Returns a WritableSignal for a document by _id, creating it if absent.\r\n\t * Caches the signal to avoid redundant instances and initializes it\r\n\t * with the current snapshot of the document.\r\n\t * Work very carefully with this and localId, better avoid such flows.\r\n\t *\r\n\t * @param _id - Document identifier or a document instance.\r\n\t */\r\n\tgetSignal(_id: string | Document) {\r\n\t\tif (typeof _id !== 'string') {\r\n\t\t\t_id = this._id(_id);\r\n\t\t}\r\n\r\n\t\t// Reuse existing signal if present\r\n\t\tif (this._signal[_id]) {\r\n\t\t\treturn this._signal[_id];\r\n\t\t}\r\n\r\n\t\t// Always base the signal on the current canonical doc()\r\n\t\tconst doc = this.doc(_id);\r\n\r\n\t\tthis._signal[_id] = this.__coreService.toSignal(\r\n\t\t\tdoc,\r\n\t\t\tthis._config.signalFields,\r\n\t\t) as WritableSignal<Document>;\r\n\r\n\t\treturn this._signal[_id];\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a signal with an array of document signals that match\r\n\t * a given field/value pair.\r\n\t *\r\n\t * Example:\r\n\t * const activitiesSig = service.getSignals('userId', currentUserId);\r\n\t */\r\n\tgetSignals(field: string, value: unknown) {\r\n\t\tconst id = field + '_' + JSON.stringify(value);\r\n\r\n\t\tif (!this._signals[id]) {\r\n\t\t\tthis._signals[id] = signal<WritableSignal<Document>[]>(\r\n\t\t\t\tthis._getSignals(id),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\treturn this._signals[id];\r\n\t}\r\n\r\n\t/**\r\n\t * Builds the array of document signals for a given (field,value) key.\r\n\t * Only documents with a real _id are included.\r\n\t */\r\n\tprivate _getSignals(id: string): WritableSignal<Document>[] {\r\n\t\tconst sep = id.indexOf('_');\r\n\t\tif (sep === -1) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tconst field = id.slice(0, sep) as keyof Document;\r\n\t\tconst valueJson = id.slice(sep + 1);\r\n\r\n\t\tconst list: WritableSignal<Document>[] = [];\r\n\r\n\t\tfor (const doc of this.getDocs()) {\r\n\t\t\tif (JSON.stringify(doc[field] as unknown) !== valueJson) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst docId = this._id(doc);\r\n\t\t\tif (!docId) continue;\r\n\r\n\t\t\tlist.push(this.getSignal(docId));\r\n\t\t}\r\n\r\n\t\treturn list;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a signal with a map: fieldValue -> array of document signals.\r\n\t *\r\n\t * Example:\r\n\t * const byStatusSig = service.getFieldSignals('status');\r\n\t * byStatusSig() might be { active: [sig1, sig2], draft: [sig3] }.\r\n\t */\r\n\tgetFieldSignals(field: string) {\r\n\t\tif (!this._fieldSignals[field]) {\r\n\t\t\tthis._fieldSignals[field] = signal<\r\n\t\t\t\tRecord<string, WritableSignal<Document>[]>\r\n\t\t\t>(this._getFieldSignals(field));\r\n\t\t}\r\n\r\n\t\treturn this._fieldSignals[field];\r\n\t}\r\n\r\n\t/**\r\n\t * Builds the map for a given field.\r\n\t * Only documents with a real _id are included.\r\n\t */\r\n\tprivate _getFieldSignals(\r\n\t\tfield: string,\r\n\t): Record<string, WritableSignal<Document>[]> {\r\n\t\tconst byFields: Record<string, WritableSignal<Document>[]> = {};\r\n\r\n\t\tfor (const doc of this.getDocs()) {\r\n\t\t\tconst docId = this._id(doc);\r\n\t\t\tif (!docId) continue;\r\n\r\n\t\t\tconst value = String(doc[field as keyof Document]);\r\n\r\n\t\t\tif (!byFields[value]) {\r\n\t\t\t\tbyFields[value] = [];\r\n\t\t\t}\r\n\r\n\t\t\tbyFields[value].push(this.getSignal(docId));\r\n\t\t}\r\n\r\n\t\treturn byFields;\r\n\t}\r\n\r\n\t/**\r\n\t * Clears cached document signals except those explicitly preserved.\r\n\t * Useful when changing routes or contexts to reduce memory.\r\n\t *\r\n\t * @param exceptIds - List of ids whose signals should be kept.\r\n\t */\r\n\tremoveSignals(exceptIds: string[] = []) {\r\n\t\tfor (const _id in this._signal) {\r\n\t\t\tif (!exceptIds.includes(_id)) {\r\n\t\t\t\tdelete this._signal[_id];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Restores documents from local storage (if present) and syncs\r\n\t * all existing signals with the restored data.\r\n\t */\r\n\tasync restoreDocs() {\r\n\t\tconst docs = await this.__storeService.getJson<Document[]>(\r\n\t\t\t'docs_' + this._config.name,\r\n\t\t);\r\n\r\n\t\tif (docs?.length) {\r\n\t\t\tthis._docs.length = 0;\r\n\r\n\t\t\tthis._docs.push(...docs);\r\n\r\n\t\t\tthis._filterDocuments();\r\n\r\n\t\t\tfor (const doc of this._docs) {\r\n\t\t\t\tif (doc.__deleted) {\r\n\t\t\t\t\tthis.delete(doc, doc.__options?.['delete'] || {});\r\n\t\t\t\t} else if (!doc._id) {\r\n\t\t\t\t\tthis.create(doc, doc.__options?.['create'] || {});\r\n\t\t\t\t} else if (doc.__modified?.length) {\r\n\t\t\t\t\tfor (const id of doc.__modified) {\r\n\t\t\t\t\t\tif (id.startsWith('up')) {\r\n\t\t\t\t\t\t\tthis.update(doc, doc.__options?.[id] || {});\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.unique(doc, doc.__options?.[id] || {});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.__emitterService.complete(\r\n\t\t\t\tthis._config.name + '_loaded',\r\n\t\t\t\tthis._docs,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Saves the current set of documents to local storage.\r\n\t */\r\n\tsetDocs(): void {\r\n\t\tthis.__storeService.setJson<Document[]>(\r\n\t\t\t'docs_' + this._config.name,\r\n\t\t\tthis._docs,\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves the current list of documents.\r\n\t *\r\n\t * @returns The list of documents.\r\n\t */\r\n\tgetDocs(filter: (doc: Document) => boolean = () => true): Document[] {\r\n\t\treturn this._docs.filter(filter);\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves the first document that matches the given predicate.\r\n\t *\r\n\t * @param find - Predicate used to locate a specific document.\r\n\t */\r\n\tgetDoc(find: (doc: Document) => boolean): Document | undefined {\r\n\t\treturn this._docs.find(find);\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the current list of documents, persists the empty state\r\n\t * and recomputes all derived signals.\r\n\t *\r\n\t * Empties the internal documents array and saves the updated state to local storage.\r\n\t */\r\n\tclearDocs(): void {\r\n\t\tthis._docs.splice(0, this._docs.length);\r\n\r\n\t\tthis.setDocs();\r\n\r\n\t\tthis._updateSignals();\r\n\t}\r\n\r\n\t/**\r\n\t * Adds multiple documents to the service and saves them to local storage.\r\n\t *\r\n\t * @param docs - An array of documents to add.\r\n\t */\r\n\taddDocs(docs: Document[]): void {\r\n\t\tif (Array.isArray(docs)) {\r\n\t\t\tfor (const doc of docs) {\r\n\t\t\t\tthis.addDoc(doc);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a single document to the service. If it already exists, it will be updated.\r\n\t *\r\n\t * @param doc - The document to add.\r\n\t */\r\n\taddDoc(doc: Document): void {\r\n\t\tif (this._config.replace) {\r\n\t\t\tthis._config.replace(doc);\r\n\t\t}\r\n\r\n\t\tconst existingDoc = this._docs.find(\r\n\t\t\t(d) =>\r\n\t\t\t\t(this._id(doc) && this._id(d) === this._id(doc)) ||\r\n\t\t\t\t(doc._localId && d._localId === doc._localId),\r\n\t\t);\r\n\r\n\t\tif (existingDoc) {\r\n\t\t\tthis.__coreService.copy(doc, existingDoc);\r\n\t\t\tthis.__coreService.copy(existingDoc, doc);\r\n\t\t\tthis._syncSignalForDoc(existingDoc);\r\n\t\t} else {\r\n\t\t\tthis._docs.push(doc);\r\n\t\t\tthis._syncSignalForDoc(doc);\r\n\t\t}\r\n\r\n\t\tthis.setDocs();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new document with a temporary ID and status flags.\r\n\t *\r\n\t * @param doc - Optional base document to use for the new document.\r\n\t * @returns A new document instance with default properties.\r\n\t */\r\n\tnew(doc: Document = {} as Document): Document {\r\n\t\treturn {\r\n\t\t\t...doc,\r\n\t\t\t_id: undefined,\r\n\t\t\t_localId: this._localId(),\r\n\t\t\t__created: false,\r\n\t\t\t__modified: false,\r\n\t\t} as Document;\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves a document by its unique ID or creates a new one if it doesn't exist.\r\n\t *\r\n\t * @param _id - The document ID to search for.\r\n\t * @returns The found document or a new document if not found.\r\n\t */\r\n\tdoc(_id: string): Document {\r\n\t\t// If we already have a signal for this id, use its current value\r\n\t\tif (this._signal[_id]) {\r\n\t\t\treturn this._signal[_id]();\r\n\t\t}\r\n\r\n\t\tlet doc =\r\n\t\t\tthis._docs.find(\r\n\t\t\t\t(d) =>\r\n\t\t\t\t\tthis._id(d) === _id ||\r\n\t\t\t\t\t(d._localId && d._localId === Number(_id)),\r\n\t\t\t) || null;\r\n\r\n\t\t// If doc not found, create + push into _docs so it is not detached\r\n\t\tif (!doc) {\r\n\t\t\tdoc = this.new({ _id } as Document);\r\n\t\t\tthis._docs.push(doc);\r\n\t\t\tthis.setDocs();\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t!this._docs.find((d) => this._id(d) === _id) &&\r\n\t\t\t!this._fetchingId[_id]\r\n\t\t) {\r\n\t\t\tthis._fetchingId[_id] = true;\r\n\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis.fetch({ _id }).subscribe((_doc: Document) => {\r\n\t\t\t\t\tthis._fetchingId[_id] = false;\r\n\r\n\t\t\t\t\tif (_doc) {\r\n\t\t\t\t\t\tthis.__coreService.copy(_doc, doc as Document);\r\n\t\t\t\t\t\tthis._syncSignalForDoc(doc as Document);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn doc as Document;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the number of documents to display per page.\r\n\t *\r\n\t * @param _perPage - Number of documents per page.\r\n\t */\r\n\tsetPerPage(_perPage: number): void {\r\n\t\tthis._perPage = _perPage;\r\n\t}\r\n\r\n\t/**\r\n\t * Fetches a list of documents from the API with optional pagination.\r\n\t *\r\n\t * @param config - Optional pagination configuration.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the list of documents.\r\n\t */\r\n\tget(\r\n\t\tconfig: GetConfig = {},\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document[]> {\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.get(config, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\tthis._isBrowser &&\r\n\t\t\t!this._config.unauthorized &&\r\n\t\t\tlocalStorage.getItem('waw_user')\r\n\t\t) {\r\n\t\t\tconst user = JSON.parse(localStorage.getItem('waw_user') as string);\r\n\r\n\t\t\tlocalStorage.setItem(this._config.name + 'waw_user_id', user._id);\r\n\t\t}\r\n\r\n\t\tconst url = `${this._url}/get${options.name || ''}`;\r\n\r\n\t\tconst params =\r\n\t\t\t(typeof config.page === 'number' || config.query ? '?' : '') +\r\n\t\t\t(config.query || '') +\r\n\t\t\t(typeof config.page === 'number'\r\n\t\t\t\t? `&skip=${this._perPage * (config.page - 1)}&limit=${this._perPage}`\r\n\t\t\t\t: '');\r\n\r\n\t\tconst obs = this.__httpService.get(`${url}${params}`);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown): void => {\r\n\t\t\t\tresp = resp || [];\r\n\r\n\t\t\t\tif (typeof config.page !== 'number') {\r\n\t\t\t\t\tthis.clearDocs();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t(resp as Document[]).forEach((doc) => this.addDoc(doc));\r\n\r\n\t\t\t\tif (options.callback) {\r\n\t\t\t\t\toptions.callback(resp as Document[]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (typeof config.page !== 'number') {\r\n\t\t\t\t\tthis._filterDocuments();\r\n\r\n\t\t\t\t\tthis.__emitterService.complete(\r\n\t\t\t\t\t\tthis._config.name + '_getted',\r\n\t\t\t\t\t\tthis._docs,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(\r\n\t\t\t\t\t`${this._config.name}_get`,\r\n\t\t\t\t\tthis._docs,\r\n\t\t\t\t);\r\n\r\n\t\t\t\tthis.__emitterService.emit(\r\n\t\t\t\t\t`${this._config.name}_changed`,\r\n\t\t\t\t\tthis._docs,\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown): void => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document[]>;\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a request to the API to create a new document.\r\n\t *\r\n\t * @param doc - The document to create.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the created document, or emits an error if already created.\r\n\t */\r\n\tcreate(\r\n\t\tdoc: Document = {} as Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tif (doc._id) {\r\n\t\t\treturn this.update(doc, options);\r\n\t\t}\r\n\r\n\t\tdoc._localId ||= this._localId();\r\n\r\n\t\tdoc.__options ||= {};\r\n\r\n\t\tdoc.__options['create'] = options;\r\n\r\n\t\tthis.addDoc(doc);\r\n\r\n\t\tthis._filterDocuments();\r\n\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.create(doc, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (doc.__creating) {\r\n\t\t\t// Emit an error observable if the document is already created\r\n\t\t\treturn new Observable<Document>((observer) => {\r\n\t\t\t\tobserver.error(\r\n\t\t\t\t\tnew Error('Document is currently already creating.'),\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this._config.appId) {\r\n\t\t\tdoc.appId = this._config.appId;\r\n\t\t}\r\n\r\n\t\tdoc.__creating = true;\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/create${options.name || ''}`,\r\n\t\t\tdoc,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\tif (resp) {\r\n\t\t\t\t\tthis.__coreService.copy(resp, doc);\r\n\r\n\t\t\t\t\tthis.addDoc(doc);\r\n\r\n\t\t\t\t\tthis._filterDocuments();\r\n\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdoc.__creating = false;\r\n\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(resp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_create`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_list`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_changed`, doc);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tdoc.__creating = false;\r\n\r\n\t\t\t\tif (options.errCallback) options.errCallback(err);\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Fetches a document from the API based on a query.\r\n\t *\r\n\t * @param query - The query object used to filter documents.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the fetched document.\r\n\t */\r\n\tfetch(\r\n\t\tquery: object = {},\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.fetch(query, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/fetch${options.name || ''}`,\r\n\t\t\tquery,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (doc: unknown) => {\r\n\t\t\t\tif (doc) {\r\n\t\t\t\t\tthis.addDoc(doc as Document);\r\n\r\n\t\t\t\t\tthis._filterDocuments();\r\n\r\n\t\t\t\t\tif (options.callback) options.callback(doc as Document);\r\n\r\n\t\t\t\t\tthis.__emitterService.emit(\r\n\t\t\t\t\t\t`${this._config.name}_changed`,\r\n\t\t\t\t\t\tdoc,\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(doc as Document);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates a document after a specified delay and returns an observable.\r\n\t *\r\n\t * @param doc - The document to update.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that emits the updated document.\r\n\t */\r\n\tupdateAfterWhile(\r\n\t\tdoc: Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\treturn new Observable<Document>((observer) => {\r\n\t\t\tthis.__coreService.afterWhile(this._id(doc), () => {\r\n\t\t\t\tthis.update(doc, options).subscribe({\r\n\t\t\t\t\tnext: (updatedDoc) => {\r\n\t\t\t\t\t\tobserver.next(updatedDoc); // Emit the updated document\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror: (err) => {\r\n\t\t\t\t\t\tobserver.error(err); // Forward the error\r\n\t\t\t\t\t},\r\n\t\t\t\t\tcomplete: () => {\r\n\t\t\t\t\t\tobserver.complete(); // Complete the observable\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Updates a document in the API.\r\n\t *\r\n\t * @param doc - The document to update.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the updated document.\r\n\t */\r\n\tupdate(\r\n\t\tdoc: Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tthis._updateModified(doc, 'up' + (options.name || ''), options);\r\n\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.update(doc, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/update${options.name || ''}`,\r\n\t\t\tdoc,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\tif (resp) {\r\n\t\t\t\t\tthis._removeModified(doc, 'up' + (options.name || ''));\r\n\r\n\t\t\t\t\tconst storedDoc = this.doc(doc._id as string);\r\n\r\n\t\t\t\t\tthis.__coreService.copy(resp, storedDoc);\r\n\t\t\t\t\tthis.__coreService.copy(resp, doc);\r\n\r\n\t\t\t\t\tthis._syncSignalForDoc(storedDoc);\r\n\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(resp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_update`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_changed`, doc);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Unique update a document field in the API.\r\n\t *\r\n\t * @param doc - The document to update.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the updated document.\r\n\t */\r\n\tunique(\r\n\t\tdoc: Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tthis._updateModified(doc, 'un' + (options.name || ''), options);\r\n\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.unique(doc, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/unique${options.name || ''}`,\r\n\t\t\tdoc,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\tif (resp) {\r\n\t\t\t\t\tthis._removeModified(doc, 'un' + (options.name || ''));\r\n\r\n\t\t\t\t\t(doc as any)[options.name as string] = resp;\r\n\r\n\t\t\t\t\tthis._syncSignalForDoc(doc);\r\n\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(resp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_unique`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_changed`, doc);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Deletes a document from the API.\r\n\t *\r\n\t * @param doc - The document to delete.\r\n\t * @param options - Optional callback and error handling configuration.\r\n\t * @returns An observable that resolves with the deleted document.\r\n\t */\r\n\tdelete(\r\n\t\tdoc: Document,\r\n\t\toptions: CrudOptions<Document> = {},\r\n\t): Observable<Document> {\r\n\t\tdoc.__deleted = true;\r\n\r\n\t\tdoc.__options ||= {};\r\n\t\tdoc.__options['delete'] = options;\r\n\r\n\t\tthis.addDoc(doc);\r\n\t\tthis._filterDocuments();\r\n\r\n\t\tif (!this.__networkService.isOnline()) {\r\n\t\t\treturn new Observable((observer) => {\r\n\t\t\t\tthis._onOnline.push(() => {\r\n\t\t\t\t\tthis.delete(doc, options).subscribe(observer);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst obs = this.__httpService.post(\r\n\t\t\t`${this._url}/delete${options.name || ''}`,\r\n\t\t\tdoc,\r\n\t\t);\r\n\r\n\t\tobs.subscribe({\r\n\t\t\tnext: (resp: unknown) => {\r\n\t\t\t\tif (resp) {\r\n\t\t\t\t\tconst idx = this._docs.findIndex(\r\n\t\t\t\t\t\t(d) => this._id(d) === this._id(doc),\r\n\t\t\t\t\t);\r\n\t\t\t\t\tif (idx !== -1) {\r\n\t\t\t\t\t\tthis._docs.splice(idx, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.setDocs();\r\n\r\n\t\t\t\t\t// We keep signal but mark it deleted and recompute mappings.\r\n\t\t\t\t\tthis._syncSignalForDoc({\r\n\t\t\t\t\t\t...doc,\r\n\t\t\t\t\t\t__deleted: true,\r\n\t\t\t\t\t} as Document);\r\n\r\n\t\t\t\t\tthis._filterDocuments();\r\n\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(doc);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\t\toptions.errCallback(resp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_delete`, doc);\r\n\r\n\t\t\t\tthis.__emitterService.emit(`${this._config.name}_changed`, doc);\r\n\t\t\t},\r\n\t\t\terror: (err: unknown) => {\r\n\t\t\t\tif (options.errCallback) {\r\n\t\t\t\t\toptions.errCallback(err);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\treturn obs as Observable<Document>;\r\n\t}\r\n\r\n\t/**\r\n\t * Registers a filtered view of documents and returns the recompute callback.\r\n\t *\r\n\t * The callback is called automatically whenever `_filterDocuments()` runs.\r\n\t */\r\n\tfilteredDocuments(\r\n\t\tstoreObjectOrArray: Record<string, Document[]> | Document[],\r\n\t\tconfig: {\r\n\t\t\tfield?: string | ((doc: Document) => string);\r\n\t\t\tvalid?: (doc: Document) => boolean;\r\n\t\t\tsort?: (a: Document, b: Document) => number;\r\n\t\t\tfiltered?: (\r\n\t\t\t\tstoreObjectOrArray: Record<string, Document[]> | Document[],\r\n\t\t\t) => void;\r\n\t\t} = {},\r\n\t) {\r\n\t\tconst callback = (): void => {\r\n\t\t\tif (Array.isArray(storeObjectOrArray)) {\r\n\t\t\t\tlet result = this._docs\r\n\t\t\t\t\t.filter((doc) => !doc.__deleted)\r\n\t\t\t\t\t.filter(config.valid ?? (() => true));\r\n\r\n\t\t\t\tstoreObjectOrArray.length = 0;\r\n\r\n\t\t\t\tif (typeof config.sort === 'function') {\r\n\t\t\t\t\tresult = result.sort(config.sort);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tstoreObjectOrArray.push(...result);\r\n\t\t\t} else {\r\n\t\t\t\tconst storeObject = storeObjectOrArray as Record<\r\n\t\t\t\t\tstring,\r\n\t\t\t\t\tDocument[]\r\n\t\t\t\t>;\r\n\r\n\t\t\t\t/* remove docs if they were removed */\r\n\t\t\t\tfor (const parentId in storeObject) {\r\n\t\t\t\t\tfor (\r\n\t\t\t\t\t\tlet i = storeObject[parentId].length - 1;\r\n\t\t\t\t\t\ti >= 0;\r\n\t\t\t\t\t\ti--\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tconst _field =\r\n\t\t\t\t\t\t\ttypeof config.field === 'function'\r\n\t\t\t\t\t\t\t\t? config.field(storeObject[parentId][i])\r\n\t\t\t\t\t\t\t\t: config.field || 'author';\r\n\t\t\t\t\t\tconst _doc: any = storeObject[parentId][i];\r\n\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t!this._docs.find((doc: any) =>\r\n\t\t\t\t\t\t\t\tArray.isArray(doc[_field])\r\n\t\t\t\t\t\t\t\t\t? doc[_field].includes(_doc[this._id(doc)])\r\n\t\t\t\t\t\t\t\t\t: doc[_field] === _doc[this._id(doc)],\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tstoreObject[parentId].splice(i, 1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* add docs if they are not added */\r\n\t\t\t\tfor (const doc of this._docs) {\r\n\t\t\t\t\tif (doc.__deleted) continue;\r\n\r\n\t\t\t\t\tconst _field =\r\n\t\t\t\t\t\ttypeof config.field === 'function'\r\n\t\t\t\t\t\t\t? config.field(doc)\r\n\t\t\t\t\t\t\t: config.field || 'author';\r\n\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\ttypeof config.valid === 'function'\r\n\t\t\t\t\t\t\t? !config.valid(doc)\r\n\t\t\t\t\t\t\t: Array.isArray((doc as any)[_field])\r\n\t\t\t\t\t\t\t\t? !(doc as any)[_field]?.length\r\n\t\t\t\t\t\t\t\t: !(doc as any)[_field]\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (typeof config.field === 'function') {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tconfig.field(doc) &&\r\n\t\t\t\t\t\t\t!storeObject[(doc as any)[_field]].find(\r\n\t\t\t\t\t\t\t\t(c) => c._id === doc._id,\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tstoreObject[(doc as any)[_field]].push(doc);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (Array.isArray((doc as any)[_field])) {\r\n\t\t\t\t\t\t(doc as any)[_field].forEach((_field: string) => {\r\n\t\t\t\t\t\t\tstoreObject[_field] = storeObject[_field] || [];\r\n\r\n\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t!storeObject[_field].find(\r\n\t\t\t\t\t\t\t\t\t(c) => c._id === doc._id,\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\tstoreObject[_field].push(doc);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstoreObject[(doc as any)[_field]] =\r\n\t\t\t\t\t\t\tstoreObject[(doc as any)[_field]] || [];\r\n\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t!storeObject[(doc as any)[_field]].find(\r\n\t\t\t\t\t\t\t\t(c) => c._id === doc._id,\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tstoreObject[(doc as any)[_field]].push(doc);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/* sort the array's */\r\n\t\t\t\tif (typeof config.sort === 'function') {\r\n\t\t\t\t\tfor (const parentId in storeObject) {\r\n\t\t\t\t\t\tstoreObject[parentId].sort(config.sort);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconfig.filtered?.(storeObjectOrArray);\r\n\t\t};\r\n\r\n\t\tthis._filteredDocumentsCallbacks.push(callback);\r\n\r\n\t\treturn callback;\r\n\t}\r\n\r\n\t/**\r\n\t * Track pending fetch-by-id requests to avoid duplicate calls.\r\n\t */\r\n\tprivate _fetchingId: Record<string, boolean> = {};\r\n\r\n\t/**\r\n\t * Queue of operations that must be retried when network comes back online.\r\n\t */\r\n\tprivate _onOnline: (() => void)[] = [];\r\n\r\n\t/**\r\n\t * Local counter used to build unique local identifiers together with Date.now().\r\n\t */\r\n\tprivate _randomCount = 0;\r\n\r\n\t/**\r\n\t * Generates a unique ID for a document when using local-only identifiers.\r\n\t *\r\n\t * @returns The unique ID as a number.\r\n\t */\r\n\tprivate _localId() {\r\n\t\treturn Number(Date.now() + '' + this._randomCount++);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the configured identity field for the given document as string.\r\n\t *\r\n\t * @param doc - The document for which to generate the ID.\r\n\t * @returns The unique ID as a string.\r\n\t */\r\n\tprivate _id(doc: Document): string {\r\n\t\treturn (doc as unknown as Record<string, unknown>)[\r\n\t\t\tthis._config._id || '_id'\r\n\t\t]?.toString() as string;\r\n\t}\r\n\r\n\t/**\r\n\t * Executes all registered filter document callbacks and emits a\r\n\t * `<name>_filtered` event.\r\n\t */\r\n\tprivate _filterDocuments(): void {\r\n\t\tfor (const callback of this._filteredDocumentsCallbacks) {\r\n\t\t\tcallback();\r\n\t\t}\r\n\r\n\t\tthis.__emitterService.emit(`${this._config.name}_filtered`);\r\n\t}\r\n\r\n\t/**\r\n\t * Marks a document as modified for a given operation id and\r\n\t * keeps the document in the store until the operation is confirmed.\r\n\t */\r\n\tprivate _updateModified(\r\n\t\tdoc: Document,\r\n\t\tid: string,\r\n\t\toptions: CrudOptions<Document>,\r\n\t) {\r\n\t\tdoc.__modified ||= [];\r\n\r\n\t\tdoc.__options ||= {};\r\n\r\n\t\tdoc.__options[id] = options;\r\n\r\n\t\tif (!doc.__modified.find((m) => m === id)) {\r\n\t\t\tdoc.__modified.push(id);\r\n\r\n\t\t\tthis.addDoc(doc);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a modification mark from the document once the\r\n\t * server operation is confirmed.\r\n\t */\r\n\tprivate _removeModified(doc: Document, id: string) {\r\n\t\tdoc.__modified ||= [];\r\n\r\n\t\tif (doc.__modified.find((m) => m === id)) {\r\n\t\t\tdoc.__modified.splice(\r\n\t\t\t\tdoc.__modified.findIndex((m) => m === id),\r\n\t\t\t\t1,\r\n\t\t\t);\r\n\r\n\t\t\tthis.addDoc(doc);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Syncs a single document's signal (if exists) and refreshes all\r\n\t * derived collections (field/value lists and field maps).\r\n\t */\r\n\tprivate _syncSignalForDoc(doc: Document) {\r\n\t\tconst id = this._id(doc);\r\n\r\n\t\tif (id && this._signal[id]) {\r\n\t\t\tthis._signal[id].set({ ...doc });\r\n\t\t}\r\n\r\n\t\tthis._updateSignals();\r\n\t}\r\n\r\n\t/**\r\n\t * Rebuilds all derived signal collections:\r\n\t * - all per (field,value) lists of document signals\r\n\t * - all per-field maps value -> [signals]\r\n\t *\r\n\t * This keeps `getSignals()` and `getFieldSignals()` in sync after\r\n\t * any mutation that touches `_docs`.\r\n\t */\r\n\tprivate _updateSignals() {\r\n\t\t// refresh all (field,value) collections\r\n\t\tfor (const key in this._signals) {\r\n\t\t\tthis._signals[key].set(this._getSignals(key));\r\n\t\t}\r\n\r\n\t\t// refresh all per-field maps\r\n\t\tfor (const field in this._fieldSignals) {\r\n\t\t\tthis._fieldSignals[field].set(this._getFieldSignals(field));\r\n\t\t}\r\n\t}\r\n}\r\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tApplicationRef,\r\n\tComponentRef,\r\n\tEmbeddedViewRef,\r\n\tEnvironmentInjector,\r\n\tInjectable,\r\n\tPLATFORM_ID,\r\n\tType,\r\n\tcreateComponent,\r\n\tinject,\r\n} from '@angular/core';\r\nimport { DomComponent } from '../interfaces/dom.interface';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\n/**\r\n * Utility service for programmatically creating and interacting with Angular\r\n * components within the DOM.\r\n */\r\nexport class DomService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\t/**\r\n\t * Appends a component to a specified element by ID.\r\n\t *\r\n\t * @param component - The component to append.\r\n\t * @param options - The options to project into the component.\r\n\t * @param id - The ID of the element to append the component to.\r\n\t * @returns An object containing the native element and the component reference.\r\n\t */\r\n\tappendById<T>(\r\n\t\tcomponent: Type<T>,\r\n\t\toptions: Partial<T> = {},\r\n\t\tid: string,\r\n\t): DomComponent<T> {\r\n\t\tconst componentRef = createComponent(component, {\r\n\t\t\tenvironmentInjector: this._injector,\r\n\t\t});\r\n\r\n\t\tthis.projectComponentInputs(componentRef, options);\r\n\r\n\t\tthis._appRef.attachView(componentRef.hostView);\r\n\r\n\t\tconst domElem = (componentRef.hostView as EmbeddedViewRef<T>)\r\n\t\t\t.rootNodes[0] as HTMLElement;\r\n\r\n\t\tconst element = this._doc.getElementById(id);\r\n\r\n\t\tif (\r\n\t\t\tthis._isBrowser &&\r\n\t\t\telement &&\r\n\t\t\ttypeof element.appendChild === 'function'\r\n\t\t) {\r\n\t\t\telement.appendChild(domElem);\r\n\t\t}\r\n\r\n\t\tcomponentRef.changeDetectorRef.detectChanges();\r\n\r\n\t\treturn {\r\n\t\t\tnativeElement: domElem,\r\n\t\t\tcomponentRef: componentRef,\r\n\t\t\tremove: () => this.removeComponent(componentRef),\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Appends a component to a specified element or to the body.\r\n\t *\r\n\t * @param component - The component to append.\r\n\t * @param options - The options to project into the component.\r\n\t * @param element - The element to append the component to. Defaults to body.\r\n\t * @returns An object containing the native element and the component reference.\r\n\t */\r\n\tappendComponent<T>(\r\n\t\tcomponent: Type<T>,\r\n\t\toptions: Partial<T & { providedIn?: string }> = {},\r\n\t\telement?: HTMLElement,\r\n\t): DomComponent<T> | void {\r\n\t\tif (options.providedIn) {\r\n\t\t\tif (this._providedIn[options.providedIn]) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._providedIn[options.providedIn] = true;\r\n\t\t}\r\n\r\n\t\tconst componentRef = createComponent(component, {\r\n\t\t\tenvironmentInjector: this._injector,\r\n\t\t});\r\n\r\n\t\tthis.projectComponentInputs(componentRef, options);\r\n\r\n\t\tthis._appRef.attachView(componentRef.hostView);\r\n\r\n\t\tconst domElem = (componentRef.hostView as EmbeddedViewRef<T>)\r\n\t\t\t.rootNodes[0] as HTMLElement;\r\n\r\n\t\tconst target = element || this._doc.body;\r\n\t\tif (\r\n\t\t\tthis._isBrowser &&\r\n\t\t\ttarget &&\r\n\t\t\ttypeof target.appendChild === 'function'\r\n\t\t) {\r\n\t\t\ttarget.appendChild(domElem);\r\n\t\t}\r\n\r\n\t\tcomponentRef.changeDetectorRef.detectChanges();\r\n\r\n\t\treturn {\r\n\t\t\tnativeElement: domElem,\r\n\t\t\tcomponentRef: componentRef,\r\n\t\t\tremove: () =>\r\n\t\t\t\tthis.removeComponent(componentRef, options.providedIn),\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a reference to a dynamically created component.\r\n\t *\r\n\t * @param component - The component to create.\r\n\t * @param options - The options to project into the component.\r\n\t * @returns The component reference.\r\n\t */\r\n\tgetComponentRef<T>(\r\n\t\tcomponent: Type<T>,\r\n\t\toptions: Partial<T> = {},\r\n\t): ComponentRef<T> {\r\n\t\tconst componentRef = createComponent(component, {\r\n\t\t\tenvironmentInjector: this._injector,\r\n\t\t});\r\n\r\n\t\tthis.projectComponentInputs(componentRef, options);\r\n\r\n\t\tthis._appRef.attachView(componentRef.hostView);\r\n\r\n\t\tcomponentRef.changeDetectorRef.detectChanges();\r\n\r\n\t\treturn componentRef;\r\n\t}\r\n\r\n\t/**\r\n\t * Projects the inputs onto the component.\r\n\t *\r\n\t * @param component - The component reference.\r\n\t * @param options - The options to project into the component.\r\n\t * @returns The component reference with the projected inputs.\r\n\t */\r\n\tprivate projectComponentInputs<T>(\r\n\t\tcomponent: ComponentRef<T>,\r\n\t\toptions: Partial<T>,\r\n\t): ComponentRef<T> {\r\n\t\tif (options) {\r\n\t\t\tconst props = Object.getOwnPropertyNames(options);\r\n\r\n\t\t\tfor (const prop of props) {\r\n\t\t\t\t(component.instance as any)[prop] = (options as any)[prop];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn component;\r\n\t}\r\n\r\n\t/**\r\n\t * Removes a previously attached component and optionally clears its\r\n\t * unique `providedIn` flag.\r\n\t *\r\n\t * @param componentRef - Reference to the component to be removed.\r\n\t * @param providedIn - Optional key used to track unique instances.\r\n\t */\r\n\tremoveComponent<T>(\r\n\t\tcomponentRef: ComponentRef<T>,\r\n\t\tprovidedIn?: string,\r\n\t): void {\r\n\t\tthis._appRef.detachView(componentRef.hostView);\r\n\r\n\t\tcomponentRef.destroy();\r\n\r\n\t\tif (providedIn) {\r\n\t\t\tdelete this._providedIn[providedIn];\r\n\t\t}\r\n\t}\r\n\r\n\t/** Reference to the root application used for view attachment. */\r\n\tprivate _appRef = inject(ApplicationRef);\r\n\r\n\t/** Injector utilized when creating dynamic components. */\r\n\tprivate _injector = inject(EnvironmentInjector);\r\n\r\n\t/** Document reference (browser or SSR shim). */\r\n\tprivate _doc = inject(DOCUMENT);\r\n\r\n\t/**\r\n\t * Flags to ensure components with a specific `providedIn` key are only\r\n\t * instantiated once at a time.\r\n\t */\r\n\tprivate _providedIn: Record<string, boolean> = {};\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\r\n\r\n/**\r\n * RtcService handles WebRTC peer connections and local media stream setup.\r\n * It provides functionality to initialize the user's camera/microphone,\r\n * manage multiple peer connections, and handle offer/answer negotiation.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class RtcService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\t/**\r\n\t * Map of peer connections, keyed by peer ID.\r\n\t */\r\n\tprivate _peers = new Map<string, RTCPeerConnection>();\r\n\r\n\t/**\r\n\t * Local media stream from user's camera and microphone.\r\n\t */\r\n\tprivate _localStream: MediaStream | null = null;\r\n\r\n\t/**\r\n\t * Initializes the local media stream (audio/video).\r\n\t * Requests permissions and stores the stream internally.\r\n\t */\r\n\tasync initLocalStream(): Promise<MediaStream> {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tif (!this._localStream) {\r\n\t\t\tthis._localStream = await navigator.mediaDevices.getUserMedia({\r\n\t\t\t\tvideo: true,\r\n\t\t\t\taudio: true,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this._localStream;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new RTCPeerConnection for the given ID and attaches local tracks.\r\n\t */\r\n\tasync createPeer(id: string): Promise<RTCPeerConnection> {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tconst peer = new RTCPeerConnection();\r\n\r\n\t\tthis._localStream\r\n\t\t\t?.getTracks()\r\n\t\t\t.forEach((track) => peer.addTrack(track, this._localStream!));\r\n\r\n\t\tthis._peers.set(id, peer);\r\n\r\n\t\treturn peer;\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves an existing peer connection by ID.\r\n\t */\r\n\tgetPeer(id: string): RTCPeerConnection | undefined {\r\n\t\treturn this._peers.get(id);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates an SDP offer for the specified peer and sets it as the local description.\r\n\t */\r\n\tasync createOffer(id: string): Promise<RTCSessionDescriptionInit> {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (!peer) throw new Error('Peer not found');\r\n\r\n\t\tconst offer = await peer.createOffer();\r\n\r\n\t\tawait peer.setLocalDescription(offer);\r\n\r\n\t\treturn offer;\r\n\t}\r\n\r\n\t/**\r\n\t * Accepts an SDP offer, creates an answer, and sets it as the local description.\r\n\t */\r\n\tasync createAnswer(\r\n\t\tid: string,\r\n\t\toffer: RTCSessionDescriptionInit,\r\n\t): Promise<RTCSessionDescriptionInit> {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (!peer) throw new Error('Peer not found');\r\n\r\n\t\tawait peer.setRemoteDescription(new RTCSessionDescription(offer));\r\n\r\n\t\tconst answer = await peer.createAnswer();\r\n\r\n\t\tawait peer.setLocalDescription(answer);\r\n\r\n\t\treturn answer;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the remote description with an SDP answer for the given peer.\r\n\t */\r\n\tasync setRemoteAnswer(id: string, answer: RTCSessionDescriptionInit) {\r\n\t\tif (!this._isBrowser) {\r\n\t\t\tthrow new Error('RTC is not available during SSR.');\r\n\t\t}\r\n\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (!peer) throw new Error('Peer not found');\r\n\r\n\t\tawait peer.setRemoteDescription(new RTCSessionDescription(answer));\r\n\t}\r\n\r\n\t/**\r\n\t * Adds an ICE candidate to the specified peer connection.\r\n\t */\r\n\taddIceCandidate(id: string, candidate: RTCIceCandidateInit) {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (peer) peer.addIceCandidate(new RTCIceCandidate(candidate));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the initialized local media stream.\r\n\t */\r\n\tgetLocalStream(): MediaStream | null {\r\n\t\treturn this._localStream;\r\n\t}\r\n\r\n\t/**\r\n\t * Closes a specific peer connection and removes it from the map.\r\n\t */\r\n\tclosePeer(id: string) {\r\n\t\tconst peer = this._peers.get(id);\r\n\r\n\t\tif (peer) {\r\n\t\t\tpeer.close();\r\n\r\n\t\t\tthis._peers.delete(id);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Closes all peer connections and stops the local media stream.\r\n\t */\r\n\tcloseAll() {\r\n\t\tthis._peers.forEach((peer) => peer.close());\r\n\r\n\t\tthis._peers.clear();\r\n\r\n\t\tthis._localStream?.getTracks().forEach((track) => track.stop());\r\n\r\n\t\tthis._localStream = null;\r\n\t}\r\n}\r\n","import { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n\tInject,\r\n\tinject,\r\n\tInjectable,\r\n\tOptional,\r\n\tPLATFORM_ID,\r\n} from '@angular/core';\r\nimport {\r\n\tConfig,\r\n\tCONFIG_TOKEN,\r\n\tDEFAULT_CONFIG,\r\n} from '../interfaces/config.interface';\r\nimport { EmitterService } from './emitter.service';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class SocketService {\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tprivate _url = '';\r\n\r\n\tprivate _io: any;\r\n\r\n\tprivate _connected = false;\r\n\r\n\tprivate _opts: any = {};\r\n\r\n\tconstructor(@Inject(CONFIG_TOKEN) @Optional() private _config: Config) {\r\n\t\tthis._config = { ...DEFAULT_CONFIG, ...(this._config || {}) };\r\n\r\n\t\tif (!this._isBrowser) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._config.io) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst url = new URL(window.location.origin);\r\n\r\n\t\tif (typeof this._config.socket === 'object') {\r\n\t\t\tif (this._config.socket.port) {\r\n\t\t\t\turl.port = this._config.socket.port;\r\n\t\t\t}\r\n\r\n\t\t\tif (this._config.socket.opts) {\r\n\t\t\t\tthis._opts = this._config.socket.opts;\r\n\t\t\t}\r\n\r\n\t\t\tthis._url = this._config.socket.url ?? url.origin;\r\n\t\t} else {\r\n\t\t\tthis._url = url.origin;\r\n\t\t}\r\n\r\n\t\tif (this._config.socket) {\r\n\t\t\tthis.load();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the URL for the WebSocket connection and reloads the socket.\r\n\t * @param url - The URL of the WebSocket server.\r\n\t */\r\n\tsetUrl(url: string): void {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!this._config.socket) {\r\n\t\t\tthis._config.socket = true;\r\n\t\t}\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis.load();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Loads and initializes the WebSocket connection.\r\n\t */\r\n\tprivate load(): void {\r\n\t\tif (!this._isBrowser) return;\r\n\r\n\t\tif (this._config.io) {\r\n\t\t\tconst ioFunc = this._config.io.default\r\n\t\t\t\t? this._config.io.default\r\n\t\t\t\t: this._config.io;\r\n\r\n\t\t\tthis._io = ioFunc(this._url, this._opts);\r\n\r\n\t\t\tthis._io.on('connect', () => {\r\n\t\t\t\tthis._connected = true;\r\n\r\n\t\t\t\tthis._emitterService.complete('socket');\r\n\t\t\t});\r\n\r\n\t\t\tthis._io.on('disconnect', (reason: any) => {\r\n\t\t\t\tthis._connected = false;\r\n\r\n\t\t\t\tthis._emitterService.emit('socket_disconnect', reason);\r\n\r\n\t\t\t\tconsole.warn('Socket disconnected', reason);\r\n\t\t\t});\r\n\r\n\t\t\tthis._io.on('error', (err: any) => {\r\n\t\t\t\tthis._connected = false;\r\n\r\n\t\t\t\tthis._emitterService.emit('socket_error', err);\r\n\r\n\t\t\t\tconsole.warn('Socket error', err);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnects the WebSocket connection and resets the connection state.\r\n\t */\r\n\tdisconnect(): void {\r\n\t\tif (this._io) {\r\n\t\t\tthis._io.disconnect();\r\n\t\t}\r\n\r\n\t\tthis._connected = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Subscribes to a WebSocket event.\r\n\t * @param to - The event to subscribe to.\r\n\t * @param cb - The callback function to execute when the event is received.\r\n\t */\r\n\ton(to: string, cb: (message: any) => void = () => {}): void {\r\n\t\tif (!this._config.socket) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._io) {\r\n\t\t\tconsole.warn('Socket client not loaded.');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._connected) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis.on(to, cb);\r\n\t\t\t}, 100);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._io.on(to, cb);\r\n\t}\r\n\r\n\t/**\r\n\t * Emits a message to a WebSocket event.\r\n\t * @param to - The event to emit the message to.\r\n\t * @param message - The message to emit.\r\n\t * @param room - Optional room to emit the message to.\r\n\t */\r\n\temit(to: string, message: any, room: any = false): void {\r\n\t\tif (!this._config.socket) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._io) {\r\n\t\t\tconsole.warn('Socket client not loaded.');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._connected) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis.emit(to, message, room);\r\n\t\t\t}, 100);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._io.emit(to, message, room);\r\n\t}\r\n\r\n\tprivate _emitterService = inject(EmitterService);\r\n}\r\n","import { DatePipe } from '@angular/common';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root',\r\n})\r\nexport class TimeService {\r\n\tprivate _weekDays = [\r\n\t\t'Sunday',\r\n\t\t'Monday',\r\n\t\t'Tuesday',\r\n\t\t'Wednesday',\r\n\t\t'Thursday',\r\n\t\t'Friday',\r\n\t\t'Saturday',\r\n\t];\r\n\r\n\tprivate _monthNames = [\r\n\t\t'January',\r\n\t\t'February',\r\n\t\t'March',\r\n\t\t'April',\r\n\t\t'May',\r\n\t\t'June',\r\n\t\t'July',\r\n\t\t'August',\r\n\t\t'September',\r\n\t\t'October',\r\n\t\t'November',\r\n\t\t'December',\r\n\t];\r\n\r\n\tconstructor(private _datePipe: DatePipe) {}\r\n\r\n\t/**\r\n\t * Returns the name of the day of the week for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the day of the week.\r\n\t * @param format - The format in which to return the day name. Default is 'long'.\r\n\t * @returns The name of the day of the week.\r\n\t */\r\n\tgetDayName(date: Date, format: 'short' | 'long' = 'long'): string {\r\n\t\tconst dayIndex = date.getDay();\r\n\t\treturn format === 'short'\r\n\t\t\t? this._weekDays[dayIndex].substring(0, 3)\r\n\t\t\t: this._weekDays[dayIndex];\r\n\t}\r\n\t/**\r\n\t * Returns the name of the month for a given index.\r\n\t *\r\n\t * @param monthIndex - The month index (0-11).\r\n\t * @param format - The format in which to return the month name. Default is 'long'.\r\n\t * @returns The name of the month.\r\n\t */\r\n\tgetMonthName(\r\n\t\tmonthIndex: number,\r\n\t\tformat: 'short' | 'long' = 'long',\r\n\t): string {\r\n\t\tif (\r\n\t\t\t!Number.isInteger(monthIndex) ||\r\n\t\t\tmonthIndex < 0 ||\r\n\t\t\tmonthIndex > 11\r\n\t\t) {\r\n\t\t\tthrow new RangeError(\r\n\t\t\t\t'monthIndex must be an integer between 0 and 11',\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn format === 'short'\r\n\t\t\t? this._monthNames[monthIndex].substring(0, 3)\r\n\t\t\t: this._monthNames[monthIndex];\r\n\t}\r\n\r\n\t/**\r\n\t * Formats a date according to the specified format and timezone.\r\n\t *\r\n\t * @param date - The date to format.\r\n\t * @param format - The format string (see Angular DatePipe documentation for format options).\r\n\t * @param timezone - The timezone to use for formatting.\r\n\t * @returns The formatted date string.\r\n\t */\r\n\tformatDate(\r\n\t\tdate: Date,\r\n\t\tformat: string = 'mediumDate',\r\n\t\ttimezone: string = 'UTC',\r\n\t): string {\r\n\t\treturn this._datePipe.transform(date, format, timezone) || '';\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a date to a different timezone.\r\n\t *\r\n\t * @param date - The date to convert.\r\n\t * @param timezone - The timezone to convert to.\r\n\t * @returns The date in the new timezone.\r\n\t */\r\n\tconvertToTimezone(date: Date, timezone: string): Date {\r\n\t\treturn new Date(date.toLocaleString('en-US', { timeZone: timezone }));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the start of the day for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the start of the day.\r\n\t * @returns The start of the day (midnight) for the given date.\r\n\t */\r\n\tstartOfDay(date: Date): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setHours(0, 0, 0, 0);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the end of the day for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the end of the day.\r\n\t * @returns The end of the day (one millisecond before midnight) for the given date.\r\n\t */\r\n\tendOfDay(date: Date): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setHours(23, 59, 59, 999);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the start of the week for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the start of the week.\r\n\t * @param locale - A BCP 47 language tag to determine the first day of the week. Defaults to the runtime locale.\r\n\t * @returns The start of the week adjusted for the locale.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.startOfWeek(date); // => Monday May 13 2024 00:00:00 for en-GB\r\n\t */\r\n\tstartOfWeek(date: Date, locale?: string): Date {\r\n\t\tconst newDate = this.startOfDay(date);\r\n\t\tconst dtf = new Intl.DateTimeFormat(locale);\r\n\t\tconst resolved = dtf.resolvedOptions().locale;\r\n\t\tconst region = resolved.split('-')[1]?.toUpperCase();\r\n\t\tconst sundayFirst = ['US', 'CA', 'AU', 'NZ', 'PH', 'BR'];\r\n\t\tconst firstDay = sundayFirst.includes(region) ? 0 : 1;\r\n\t\tconst day = newDate.getDay();\r\n\t\tconst diff = (day - firstDay + 7) % 7;\r\n\t\tnewDate.setDate(newDate.getDate() - diff);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the end of the week for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the end of the week.\r\n\t * @param locale - A BCP 47 language tag to determine the first day of the week. Defaults to the runtime locale.\r\n\t * @returns The end of the week adjusted for the locale.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.endOfWeek(date); // => Sunday May 19 2024 23:59:59.999 for en-GB\r\n\t */\r\n\tendOfWeek(date: Date, locale?: string): Date {\r\n\t\tconst start = this.startOfWeek(date, locale);\r\n\t\tconst end = this.addDays(start, 6);\r\n\t\treturn this.endOfDay(end);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the start of the month for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the start of the month.\r\n\t * @returns The start of the month.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.startOfMonth(date); // => May 1 2024 00:00:00\r\n\t */\r\n\tstartOfMonth(date: Date): Date {\r\n\t\tconst newDate = this.startOfDay(date);\r\n\t\tnewDate.setDate(1);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the end of the month for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the end of the month.\r\n\t * @returns The end of the month.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.endOfMonth(date); // => May 31 2024 23:59:59.999\r\n\t */\r\n\tendOfMonth(date: Date): Date {\r\n\t\tconst start = this.startOfMonth(date);\r\n\t\tconst end = new Date(start);\r\n\t\tend.setMonth(end.getMonth() + 1);\r\n\t\tend.setDate(0);\r\n\t\treturn this.endOfDay(end);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the start of the year for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the start of the year.\r\n\t * @returns The start of the year.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.startOfYear(date); // => Jan 1 2024 00:00:00\r\n\t */\r\n\tstartOfYear(date: Date): Date {\r\n\t\tconst newDate = this.startOfDay(date);\r\n\t\tnewDate.setMonth(0, 1);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the end of the year for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the end of the year.\r\n\t * @returns The end of the year.\r\n\t *\r\n\t * @example\r\n\t * const date = new Date('2024-05-15');\r\n\t * service.endOfYear(date); // => Dec 31 2024 23:59:59.999\r\n\t */\r\n\tendOfYear(date: Date): Date {\r\n\t\tconst end = new Date(date.getFullYear(), 11, 31);\r\n\t\treturn this.endOfDay(end);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the number of days in a given month and year.\r\n\t *\r\n\t * @param month - The month (0-11).\r\n\t * @param year - The year.\r\n\t * @returns The number of days in the month.\r\n\t */\r\n\tgetDaysInMonth(month: number, year: number): number {\r\n\t\treturn new Date(year, month + 1, 0).getDate();\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if a given year is a leap year.\r\n\t *\r\n\t * @param year - The year to check.\r\n\t * @returns True if the year is a leap year, false otherwise.\r\n\t */\r\n\tisLeapYear(year: number): boolean {\r\n\t\treturn (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of days to a date.\r\n\t *\r\n\t * @param date - The date to which to add days.\r\n\t * @param days - The number of days to add.\r\n\t * @returns The new date with the added days.\r\n\t */\r\n\taddDays(date: Date, days: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setDate(newDate.getDate() + days);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of months to a date.\r\n\t *\r\n\t * @param date - The date to which to add months.\r\n\t * @param months - The number of months to add.\r\n\t * @returns The new date with the added months.\r\n\t */\r\n\taddMonths(date: Date, months: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setMonth(newDate.getMonth() + months);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of years to a date.\r\n\t *\r\n\t * @param date - The date to which to add years.\r\n\t * @param years - The number of years to add.\r\n\t * @returns The new date with the added years.\r\n\t */\r\n\taddYears(date: Date, years: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setFullYear(newDate.getFullYear() + years);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of hours to a date.\r\n\t *\r\n\t * @param date - The date to which to add hours.\r\n\t * @param hours - The number of hours to add.\r\n\t * @returns The new date with the added hours.\r\n\t */\r\n\taddHours(date: Date, hours: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setHours(newDate.getHours() + hours);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of minutes to a date.\r\n\t *\r\n\t * @param date - The date to which to add minutes.\r\n\t * @param minutes - The number of minutes to add.\r\n\t * @returns The new date with the added minutes.\r\n\t */\r\n\taddMinutes(date: Date, minutes: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setMinutes(newDate.getMinutes() + minutes);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a specified number of seconds to a date.\r\n\t *\r\n\t * @param date - The date to which to add seconds.\r\n\t * @param seconds - The number of seconds to add.\r\n\t * @returns The new date with the added seconds.\r\n\t */\r\n\taddSeconds(date: Date, seconds: number): Date {\r\n\t\tconst newDate = new Date(date);\r\n\t\tnewDate.setSeconds(newDate.getSeconds() + seconds);\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of days from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract days.\r\n\t * @param days - The number of days to subtract.\r\n\t * @returns The new date with the subtracted days.\r\n\t */\r\n\tsubtractDays(date: Date, days: number): Date {\r\n\t\treturn this.addDays(date, -days);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of months from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract months.\r\n\t * @param months - The number of months to subtract.\r\n\t * @returns The new date with the subtracted months.\r\n\t */\r\n\tsubtractMonths(date: Date, months: number): Date {\r\n\t\treturn this.addMonths(date, -months);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of years from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract years.\r\n\t * @param years - The number of years to subtract.\r\n\t * @returns The new date with the subtracted years.\r\n\t */\r\n\tsubtractYears(date: Date, years: number): Date {\r\n\t\treturn this.addYears(date, -years);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of hours from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract hours.\r\n\t * @param hours - The number of hours to subtract.\r\n\t * @returns The new date with the subtracted hours.\r\n\t */\r\n\tsubtractHours(date: Date, hours: number): Date {\r\n\t\treturn this.addHours(date, -hours);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of minutes from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract minutes.\r\n\t * @param minutes - The number of minutes to subtract.\r\n\t * @returns The new date with the subtracted minutes.\r\n\t */\r\n\tsubtractMinutes(date: Date, minutes: number): Date {\r\n\t\treturn this.addMinutes(date, -minutes);\r\n\t}\r\n\r\n\t/**\r\n\t * Subtracts a specified number of seconds from a date.\r\n\t *\r\n\t * @param date - The date from which to subtract seconds.\r\n\t * @param seconds - The number of seconds to subtract.\r\n\t * @returns The new date with the subtracted seconds.\r\n\t */\r\n\tsubtractSeconds(date: Date, seconds: number): Date {\r\n\t\treturn this.addSeconds(date, -seconds);\r\n\t}\r\n\r\n\t/**\r\n\t * Calculates the difference in days between two dates.\r\n\t *\r\n\t * @param date1 - The earlier date.\r\n\t * @param date2 - The later date.\r\n\t * @returns The number of days between the two dates.\r\n\t */\r\n\tdifferenceInDays(date1: Date, date2: Date): number {\r\n\t\tconst diff = date2.getTime() - date1.getTime();\r\n\t\treturn diff / (1000 * 60 * 60 * 24);\r\n\t}\r\n\r\n\t/**\r\n\t * Calculates the difference in hours between two dates.\r\n\t *\r\n\t * @param date1 - The earlier date.\r\n\t * @param date2 - The later date.\r\n\t * @returns The number of hours between the two dates.\r\n\t */\r\n\tdifferenceInHours(date1: Date, date2: Date): number {\r\n\t\tconst diff = date2.getTime() - date1.getTime();\r\n\t\treturn diff / (1000 * 60 * 60);\r\n\t}\r\n\r\n\t/**\r\n\t * Calculates the difference in minutes between two dates.\r\n\t *\r\n\t * @param date1 - The earlier date.\r\n\t * @param date2 - The later date.\r\n\t * @returns The number of minutes between the two dates.\r\n\t */\r\n\tdifferenceInMinutes(date1: Date, date2: Date): number {\r\n\t\tconst diff = date2.getTime() - date1.getTime();\r\n\t\treturn diff / (1000 * 60);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if two dates are on the same day.\r\n\t *\r\n\t * @param date1 - The first date.\r\n\t * @param date2 - The second date.\r\n\t * @returns True if the dates are on the same day, false otherwise.\r\n\t */\r\n\tisSameDay(date1: Date, date2: Date): boolean {\r\n\t\treturn (\r\n\t\t\tdate1.getFullYear() === date2.getFullYear() &&\r\n\t\t\tdate1.getMonth() === date2.getMonth() &&\r\n\t\t\tdate1.getDate() === date2.getDate()\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the ISO week number for a given date.\r\n\t *\r\n\t * @param date - The date for which to get the week number.\r\n\t * @returns The ISO week number (1-53).\r\n\t */\r\n\tgetWeekNumber(date: Date): number {\r\n\t\tconst tempDate = new Date(date.getTime());\r\n\t\ttempDate.setHours(0, 0, 0, 0);\r\n\t\t// Set to nearest Thursday: current date + 4 - current day number, making Thursday day 4\r\n\t\ttempDate.setDate(tempDate.getDate() + 4 - (tempDate.getDay() || 7));\r\n\t\tconst yearStart = new Date(tempDate.getFullYear(), 0, 1);\r\n\t\t// Calculate full weeks to nearest Thursday\r\n\t\treturn Math.ceil(\r\n\t\t\t((tempDate.getTime() - yearStart.getTime()) / 86400000 + 1) / 7,\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the number of weeks in a month for a given month and year.\r\n\t *\r\n\t * @param month - The month (0-11).\r\n\t * @param year - The year.\r\n\t * @returns The number of weeks in the month.\r\n\t */\r\n\tgetWeeksInMonth(month: number, year: number): number {\r\n\t\tconst firstDayOfMonth = new Date(year, month, 1);\r\n\t\tconst lastDayOfMonth = new Date(year, month + 1, 0);\r\n\t\t// Get ISO week numbers for the first and last day of the month\r\n\t\tconst firstWeek = this.getWeekNumber(firstDayOfMonth);\r\n\t\tlet lastWeek = this.getWeekNumber(lastDayOfMonth);\r\n\t\t// Special case: when January 1st is in the last week of the previous year\r\n\t\tif (firstWeek > lastWeek) {\r\n\t\t\tlastWeek = this.getWeekNumber(new Date(year, 11, 31)); // Get week of the last day of the year\r\n\t\t}\r\n\t\treturn lastWeek - firstWeek + 1;\r\n\t}\r\n}\r\n","import { Injectable, WritableSignal, signal } from '@angular/core';\r\n\r\ntype Dict<T = unknown> = Record<string, T>;\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UtilService {\r\n\t// --- CSS variables (persisted) ---\r\n\tprivate readonly _storageKey = 'css_variables';\r\n\tprivate _css: Dict<string> = {};\r\n\tprivate _cssSig = signal<Dict<string>>({});\r\n\r\n\t// --- Forms store ---\r\n\tprivate _forms = new Map<string, WritableSignal<any>>();\r\n\r\n\t// --- Global bag for design/debug ---\r\n\tvar: Dict = {};\r\n\r\n\t/**\r\n\t * Initialize service state: load persisted CSS variables from localStorage\r\n\t * and apply them to the document root. Emits the initial CSS snapshot.\r\n\t */\r\n\tconstructor() {\r\n\t\tthis._loadCss();\r\n\t\t// apply on boot\r\n\t\tfor (const k of Object.keys(this._css))\r\n\t\t\tthis._setProperty(k, this._css[k]);\r\n\t\tthis._cssSig.set({ ...this._css });\r\n\t}\r\n\r\n\t// ===== Forms Management =====\r\n\r\n\t/** Get or create a form state as a writable signal */\r\n\tformSignal<T = any>(id: string): WritableSignal<T> {\r\n\t\tlet s = this._forms.get(id);\r\n\t\tif (!s) {\r\n\t\t\ts = signal<T>({} as T);\r\n\t\t\tthis._forms.set(id, s);\r\n\t\t}\r\n\t\treturn s as WritableSignal<T>;\r\n\t}\r\n\r\n\t/** Back-compat: returns the current form object (mutable reference). Prefer formSignal(). */\r\n\tform<T = any>(id: string): T {\r\n\t\tconst s = this.formSignal<T>(id);\r\n\t\tconst v = s();\r\n\t\tif (v && typeof v === 'object') return v;\r\n\t\tconst obj = {} as T;\r\n\t\ts.set(obj);\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * Check whether a form signal has been created for the given id.\r\n\t * @param id Unique form identifier.\r\n\t * @returns True if a signal exists for the id.\r\n\t */\r\n\thasForm(id: string): boolean {\r\n\t\treturn this._forms.has(id);\r\n\t}\r\n\r\n\t/**\r\n\t * Remove form state associated with the given id.\r\n\t * @param id Unique form identifier to clear.\r\n\t */\r\n\tclearForm(id: string): void {\r\n\t\tthis._forms.delete(id);\r\n\t}\r\n\r\n\t// ===== Validation =====\r\n\r\n\t/**\r\n\t * Validate a value against a specific kind.\r\n\t * - email: RFC-light pattern check.\r\n\t * - text: typeof string.\r\n\t * - array: Array.isArray.\r\n\t * - object: non-null plain object.\r\n\t * - number: finite number.\r\n\t * - password: strength tiers (extra 0..4).\r\n\t * @param value Input to validate.\r\n\t * @param kind Validation kind.\r\n\t * @param extra Additional constraint for passwords: 0..4 increasing strength.\r\n\t * @returns True if value passes validation.\r\n\t */\r\n\tvalid(\r\n\t\tvalue: any,\r\n\t\tkind:\r\n\t\t\t| 'email'\r\n\t\t\t| 'text'\r\n\t\t\t| 'array'\r\n\t\t\t| 'object'\r\n\t\t\t| 'number'\r\n\t\t\t| 'password' = 'email',\r\n\t\textra = 0,\r\n\t): boolean {\r\n\t\tswitch (kind) {\r\n\t\t\tcase 'email':\r\n\t\t\t\treturn /^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,10})+$/.test(\r\n\t\t\t\t\tvalue || '',\r\n\t\t\t\t);\r\n\t\t\tcase 'text':\r\n\t\t\t\treturn typeof value === 'string';\r\n\t\t\tcase 'array':\r\n\t\t\t\treturn Array.isArray(value);\r\n\t\t\tcase 'object':\r\n\t\t\t\treturn (\r\n\t\t\t\t\ttypeof value === 'object' &&\r\n\t\t\t\t\t!Array.isArray(value) &&\r\n\t\t\t\t\tvalue !== null\r\n\t\t\t\t);\r\n\t\t\tcase 'number':\r\n\t\t\t\treturn typeof value === 'number' && Number.isFinite(value);\r\n\t\t\tcase 'password':\r\n\t\t\t\tif (!value) return false;\r\n\t\t\t\tswitch (extra) {\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\treturn /^((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9]))/.test(\r\n\t\t\t\t\t\t\tvalue,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\treturn /^(((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{8,})/.test(\r\n\t\t\t\t\t\t\tvalue,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\treturn /^((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]))(?=.{8,})/.test(\r\n\t\t\t\t\t\t\tvalue,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\treturn /^((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@#$%&!\\-_]))(?=.{8,})/.test(\r\n\t\t\t\t\t\t\tvalue,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn !!value;\r\n\t\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/** Password strength: 0..5 */\r\n\tlevel(value = ''): number {\r\n\t\tif (!value) return 0;\r\n\t\tlet lvl = 0;\r\n\t\tif (value.length > 8) lvl++;\r\n\t\tif (/[a-z]/.test(value)) lvl++;\r\n\t\tif (/[A-Z]/.test(value)) lvl++;\r\n\t\tif (/[0-9]/.test(value)) lvl++;\r\n\t\tif (/[`~!@#$%^&*()_\\-+=\\[\\]{};:'\",.<>/?\\\\|]/.test(value)) lvl++;\r\n\t\treturn lvl;\r\n\t}\r\n\r\n\t// ===== CSS Variables Management =====\r\n\r\n\t/** Set multiple CSS vars. opts: { local?: boolean; host?: string } */\r\n\tsetCss(\r\n\t\tvars: Dict<string>,\r\n\t\topts: { local?: boolean; host?: string } | string = {},\r\n\t): void {\r\n\t\tif (typeof opts === 'string') {\r\n\t\t\topts = opts === 'local' ? { local: true } : { host: opts };\r\n\t\t}\r\n\t\tconst { local = false, host } = opts as {\r\n\t\t\tlocal?: boolean;\r\n\t\t\thost?: string;\r\n\t\t};\r\n\t\tif (\r\n\t\t\thost &&\r\n\t\t\ttypeof window !== 'undefined' &&\r\n\t\t\twindow.location.host !== host\r\n\t\t)\r\n\t\t\treturn;\r\n\r\n\t\tfor (const k of Object.keys(vars)) {\r\n\t\t\tconst v = vars[k];\r\n\t\t\tif (local) {\r\n\t\t\t\tthis._css[k] = v;\r\n\t\t\t} else if (this._css[k]) {\r\n\t\t\t\t// keep persisted value unless explicitly local\r\n\t\t\t\tthis._setProperty(k, this._css[k]);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tthis._setProperty(k, v);\r\n\t\t}\r\n\r\n\t\tif (local) {\r\n\t\t\tthis._saveCss();\r\n\t\t\tthis._cssSig.set({ ...this._css });\r\n\t\t}\r\n\t}\r\n\r\n\t/** Current persisted CSS vars snapshot */\r\n\tgetCss(): Dict<string> {\r\n\t\treturn { ...this._css };\r\n\t}\r\n\r\n\t/** Reactive signal with current persisted CSS vars */\r\n\tcssSignal(): WritableSignal<Dict<string>> {\r\n\t\treturn this._cssSig;\r\n\t}\r\n\r\n\t/** Remove persisted vars by key(s) and save */\r\n\tremoveCss(keys: string | string[]): void {\r\n\t\tconst list = Array.isArray(keys) ? keys : keys.split(' ');\r\n\t\tfor (const k of list) delete this._css[k];\r\n\t\tthis._saveCss();\r\n\t\tthis._cssSig.set({ ...this._css });\r\n\t}\r\n\r\n\t// ===== Generators =====\r\n\r\n\t/**\r\n\t * Generate an array of given length filled with sequential numbers (1..n),\r\n\t * random text, dates from today, or a constant value.\r\n\t * @param len Desired array length.\r\n\t * @param type 'number' | 'text' | 'date' | any other constant value to repeat.\r\n\t * @returns Generated array.\r\n\t */\r\n\tarr(len = 10, type: 'number' | 'text' | 'date' | string = 'number'): any[] {\r\n\t\tconst out: any[] = [];\r\n\t\tfor (let i = 0; i < len; i++) {\r\n\t\t\tswitch (type) {\r\n\t\t\t\tcase 'number':\r\n\t\t\t\t\tout.push(i + 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'text':\r\n\t\t\t\t\tout.push(this.text());\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'date':\r\n\t\t\t\t\tout.push(new Date(Date.now() + i * 86_400_000));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tout.push(type);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn out;\r\n\t}\r\n\r\n\t/**\r\n\t * Create a random alphanumeric string.\r\n\t * @param length Number of characters to generate.\r\n\t * @returns Random string of requested length.\r\n\t */\r\n\ttext(length = 10): string {\r\n\t\tconst chars =\r\n\t\t\t'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n\t\tlet res = '';\r\n\t\tfor (let i = 0; i < length; i++)\r\n\t\t\tres += chars.charAt(Math.floor(Math.random() * chars.length));\r\n\t\treturn res;\r\n\t}\r\n\r\n\t// ===== Internals =====\r\n\r\n\t/** Persist current CSS variables to localStorage. */\r\n\tprivate _saveCss(): void {\r\n\t\ttry {\r\n\t\t\tif (typeof localStorage !== 'undefined') {\r\n\t\t\t\tlocalStorage.setItem(\r\n\t\t\t\t\tthis._storageKey,\r\n\t\t\t\t\tJSON.stringify(this._css),\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} catch {}\r\n\t}\r\n\r\n\t/** Load CSS variables snapshot from localStorage into memory. */\r\n\tprivate _loadCss(): void {\r\n\t\ttry {\r\n\t\t\tif (typeof localStorage !== 'undefined') {\r\n\t\t\t\tconst raw = localStorage.getItem(this._storageKey);\r\n\t\t\t\tthis._css = raw ? JSON.parse(raw) : {};\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\tthis._css = {};\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Apply a CSS variable to the :root element.\r\n\t * @param key CSS custom property name (e.g., --brand-color).\r\n\t * @param value CSS value to set.\r\n\t */\r\n\tprivate _setProperty(key: string, value: string): void {\r\n\t\ttry {\r\n\t\t\tif (typeof document !== 'undefined') {\r\n\t\t\t\tdocument.documentElement.style.setProperty(key, value);\r\n\t\t\t}\r\n\t\t} catch {}\r\n\t}\r\n}\r\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport { Injectable, PLATFORM_ID, inject, signal } from '@angular/core';\r\nimport { ThemeDensity, ThemeMode, ThemeRadius } from './theme.type';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ThemeService {\r\n\tprivate readonly _doc = inject(DOCUMENT);\r\n\tprivate readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n\tmode = signal<ThemeMode | undefined>(undefined);\r\n\tmodes = signal<ThemeMode[]>(['light', 'dark']);\r\n\tsetMode(mode: ThemeMode) {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.documentElement.dataset['mode'] = mode;\r\n\t\t\tlocalStorage.setItem('theme.mode', mode);\r\n\t\t}\r\n\t\tthis.mode.set(mode);\r\n\t}\r\n\r\n\tdensity = signal<ThemeDensity | undefined>(undefined);\r\n\tdensities = signal<ThemeDensity[]>(['comfortable', 'compact']);\r\n\tsetDensity(density: ThemeDensity) {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.documentElement.dataset['density'] = density;\r\n\t\t\tlocalStorage.setItem('theme.density', density);\r\n\t\t}\r\n\t\tthis.density.set(density);\r\n\t}\r\n\r\n\tradius = signal<ThemeRadius | undefined>(undefined);\r\n\tradiuses = signal<ThemeRadius[]>(['rounded', 'square']);\r\n\tsetRadius(radius: ThemeRadius) {\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.documentElement.dataset['radius'] = radius;\r\n\t\t\tlocalStorage.setItem('theme.radius', radius);\r\n\t\t}\r\n\t\tthis.radius.set(radius);\r\n\t}\r\n\r\n\tthemeIndex = signal<number>(0);\r\n\tnextTheme() {\r\n\t\tconst modes = this.modes().length;\r\n\t\tconst densities = this.densities().length;\r\n\t\tconst radiuses = this.radiuses().length;\r\n\r\n\t\tconst maxIndex = modes * densities * radiuses;\r\n\r\n\t\tconst nextIndex = (this.themeIndex() + 1) % maxIndex;\r\n\t\tthis.themeIndex.set(nextIndex);\r\n\r\n\t\tconst block = densities * radiuses;\r\n\r\n\t\tconst modeIndex = Math.floor(nextIndex / block);\r\n\t\tconst rem = nextIndex % block;\r\n\t\tconst densityIndex = Math.floor(rem / radiuses);\r\n\t\tconst radiusIndex = rem % radiuses;\r\n\r\n\t\tthis.setMode(this.modes()[modeIndex] as ThemeMode);\r\n\t\tthis.setDensity(this.densities()[densityIndex] as ThemeDensity);\r\n\t\tthis.setRadius(this.radiuses()[radiusIndex] as ThemeRadius);\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tlocalStorage.setItem('theme.index', String(nextIndex));\r\n\t\t}\r\n\t}\r\n\r\n\tinit() {\r\n\t\tconst mode = this._isBrowser\r\n\t\t\t? (localStorage.getItem('theme.mode') as ThemeMode) || 'light'\r\n\t\t\t: 'light';\r\n\t\tconst density = this._isBrowser\r\n\t\t\t? (localStorage.getItem('theme.density') as ThemeDensity) ||\r\n\t\t\t\t'comfortable'\r\n\t\t\t: 'comfortable';\r\n\t\tconst radius = this._isBrowser\r\n\t\t\t? (localStorage.getItem('theme.radius') as ThemeRadius) || 'rounded'\r\n\t\t\t: 'rounded';\r\n\r\n\t\tthis.mode.set(mode);\r\n\t\tthis.density.set(density);\r\n\t\tthis.radius.set(radius);\r\n\r\n\t\tthis.themeIndex.set(\r\n\t\t\tthis._isBrowser\r\n\t\t\t\t? Number(localStorage.getItem('theme.index')) || 0\r\n\t\t\t\t: 0,\r\n\t\t);\r\n\r\n\t\tif (this._isBrowser) {\r\n\t\t\tthis._doc.documentElement.dataset['mode'] = mode;\r\n\t\t\tthis._doc.documentElement.dataset['density'] = density;\r\n\t\t\tthis._doc.documentElement.dataset['radius'] = radius;\r\n\t\t}\r\n\t}\r\n}\r\n","import {\r\n\tprovideHttpClient,\r\n\twithInterceptorsFromDi,\r\n} from '@angular/common/http';\r\nimport { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport {\r\n\tCONFIG_TOKEN,\r\n\tConfig,\r\n\tDEFAULT_CONFIG,\r\n} from './interfaces/config.interface';\r\n\r\nexport function provideWacom(\r\n\tconfig: Config = DEFAULT_CONFIG,\r\n): EnvironmentProviders {\r\n\treturn makeEnvironmentProviders([\r\n\t\t{ provide: CONFIG_TOKEN, useValue: config },\r\n\t\tprovideHttpClient(withInterceptorsFromDi()),\r\n\t]);\r\n}\r\n","/* initialize */\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n\tprovideHttpClient,\r\n\twithInterceptorsFromDi,\r\n} from '@angular/common/http';\r\nimport { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n\tConfig,\r\n\tCONFIG_TOKEN,\r\n\tDEFAULT_CONFIG,\r\n} from './interfaces/config.interface';\r\n\r\n/* directives */\r\nimport { ClickOutsideDirective } from './directives/click-outside.directive';\r\nconst DIRECTIVES = [ClickOutsideDirective];\r\n\r\n/* pipes */\r\nimport { ArrPipe } from './pipes/arr.pipe';\r\nimport { MongodatePipe } from './pipes/mongodate.pipe';\r\nimport { PaginationPipe } from './pipes/pagination.pipe';\r\nimport { SafePipe } from './pipes/safe.pipe';\r\nimport { SearchPipe } from './pipes/search.pipe';\r\nimport { SplicePipe } from './pipes/splice.pipe';\r\nconst PIPES = [\r\n\tArrPipe,\r\n\tSafePipe,\r\n\tSplicePipe,\r\n\tSearchPipe,\r\n\tMongodatePipe,\r\n\tPaginationPipe,\r\n];\r\n\r\n@NgModule({\r\n\timports: [CommonModule, FormsModule, ...PIPES, ...DIRECTIVES],\r\n\texports: [...PIPES, ...DIRECTIVES],\r\n\tproviders: [\r\n\t\t{ provide: CONFIG_TOKEN, useValue: DEFAULT_CONFIG },\r\n\t\tprovideHttpClient(withInterceptorsFromDi()),\r\n\t],\r\n})\r\n/**\r\n * @deprecated Use provideWacom instead.\r\n */\r\nexport class WacomModule {\r\n\tstatic forRoot(\r\n\t\tconfig: Config = DEFAULT_CONFIG,\r\n\t): ModuleWithProviders<WacomModule> {\r\n\t\treturn {\r\n\t\t\tngModule: WacomModule,\r\n\t\t\tproviders: [\r\n\t\t\t\t{\r\n\t\t\t\t\tprovide: CONFIG_TOKEN,\r\n\t\t\t\t\tuseValue: config,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t};\r\n\t}\r\n}\r\n","/*\r\n *\tInterfaces\r\n */\r\nexport * from './src/crud/crud.interface';\r\nexport * from './src/interfaces/config.interface';\r\nexport * from './src/interfaces/dom.interface';\r\nexport * from './src/interfaces/http.interface';\r\nexport * from './src/interfaces/network.interface';\r\nexport * from './src/interfaces/store.interface';\r\nexport * from './src/meta/meta.interface';\r\n\r\n/*\r\n *\tTypes\r\n */\r\nexport * from './src/theme/theme.type';\r\n\r\n/*\r\n *\tGuard\r\n */\r\nexport * from './src/meta/meta.guard';\r\n\r\n/*\r\n *\tComponents\r\n */\r\nexport * from './src/crud/crud.component';\r\n\r\n/*\r\n *\tDirectives\r\n */\r\nexport * from './src/directives/click-outside.directive';\r\nexport * from './src/directives/manual-disabled.directive';\r\nexport * from './src/directives/manual-name.directive';\r\nexport * from './src/directives/manual-readonly.directive';\r\nexport * from './src/directives/manual-type.directive';\r\n\r\n/*\r\n *\tPipes\r\n */\r\nexport * from './src/pipes/arr.pipe';\r\nexport * from './src/pipes/mongodate.pipe';\r\nexport * from './src/pipes/number.pipe';\r\nexport * from './src/pipes/pagination.pipe';\r\nexport * from './src/pipes/safe.pipe';\r\nexport * from './src/pipes/search.pipe';\r\nexport * from './src/pipes/splice.pipe';\r\nexport * from './src/pipes/split.pipe';\r\n\r\n/*\r\n *\tServices\r\n */\r\nexport * from './src/crud/crud.service';\r\nexport * from './src/meta/meta.service';\r\nexport * from './src/services/core.service';\r\nexport * from './src/services/dom.service';\r\nexport * from './src/services/emitter.service';\r\nexport * from './src/services/http.service';\r\nexport * from './src/services/network.service';\r\nexport * from './src/services/rtc.service';\r\nexport * from './src/services/socket.service';\r\nexport * from './src/services/store.service';\r\nexport * from './src/services/time.service';\r\nexport * from './src/services/util.service';\r\nexport * from './src/theme/theme.service';\r\n\r\n/*\r\n *\tInitial\r\n *\r\n *\tmake different kind of modules, one which import all, other for piece by piece\r\n */\r\nexport * from './src/provide-wacom';\r\nexport * from './src/wacom.module';\r\n/*\r\n *\tEnd of Support\r\n */\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.MetaService","filter","i1"],"mappings":"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"}