joopjs 2.0.0
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.
- package/CHANGELOG.md +678 -0
- package/README.md +583 -0
- package/dist/a11y.service-C-DQQfgO.d.mts +143 -0
- package/dist/a11y.service-CauEJrJe.d.ts +143 -0
- package/dist/adapters-B6slG6hQ.d.mts +84 -0
- package/dist/adapters-B6slG6hQ.d.ts +84 -0
- package/dist/aes.service-CkoupAww.d.mts +95 -0
- package/dist/aes.service-CkoupAww.d.ts +95 -0
- package/dist/ai/index.d.mts +99 -0
- package/dist/ai/index.d.ts +99 -0
- package/dist/ai/index.js +307 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/index.mjs +304 -0
- package/dist/ai/index.mjs.map +1 -0
- package/dist/analytics/index.d.mts +42 -0
- package/dist/analytics/index.d.ts +42 -0
- package/dist/analytics/index.js +139 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +136 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/angular/index.d.mts +148 -0
- package/dist/angular/index.d.ts +148 -0
- package/dist/angular/index.js +122 -0
- package/dist/angular/index.js.map +1 -0
- package/dist/angular/index.mjs +101 -0
- package/dist/angular/index.mjs.map +1 -0
- package/dist/api/index.d.mts +128 -0
- package/dist/api/index.d.ts +128 -0
- package/dist/api/index.js +1358 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +1332 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +105 -0
- package/dist/auth/index.d.ts +105 -0
- package/dist/auth/index.js +989 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +979 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth.service-DNVB-L4U.d.mts +16 -0
- package/dist/auth.service-PjUUSUIt.d.ts +16 -0
- package/dist/banking/index.d.mts +1530 -0
- package/dist/banking/index.d.ts +1530 -0
- package/dist/banking/index.js +4739 -0
- package/dist/banking/index.js.map +1 -0
- package/dist/banking/index.mjs +4661 -0
- package/dist/banking/index.mjs.map +1 -0
- package/dist/cache/index.d.mts +40 -0
- package/dist/cache/index.d.ts +40 -0
- package/dist/cache/index.js +174 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/index.mjs +172 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/client-profile.service-BuPeXVp5.d.mts +28 -0
- package/dist/client-profile.service-D5bRRYQp.d.ts +28 -0
- package/dist/config.models-Cqg04fAQ.d.mts +84 -0
- package/dist/config.models-Cqg04fAQ.d.ts +84 -0
- package/dist/config.service-CrCvI-JS.d.ts +31 -0
- package/dist/config.service-Cz4QQLlf.d.mts +31 -0
- package/dist/core/index.d.mts +4 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +631 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +619 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/crypto-utils-DriNhLdx.d.mts +30 -0
- package/dist/crypto-utils-DriNhLdx.d.ts +30 -0
- package/dist/data-storage.service-DT6xaTxE.d.ts +51 -0
- package/dist/data-storage.service-LvhGRCmw.d.mts +51 -0
- package/dist/deeplink/index.d.mts +39 -0
- package/dist/deeplink/index.d.ts +39 -0
- package/dist/deeplink/index.js +268 -0
- package/dist/deeplink/index.js.map +1 -0
- package/dist/deeplink/index.mjs +265 -0
- package/dist/deeplink/index.mjs.map +1 -0
- package/dist/deeplink.service-Ctd5u243.d.mts +35 -0
- package/dist/deeplink.service-uUuTnY9_.d.ts +35 -0
- package/dist/dev/index.d.mts +20 -0
- package/dist/dev/index.d.ts +20 -0
- package/dist/dev/index.js +51 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/index.mjs +49 -0
- package/dist/dev/index.mjs.map +1 -0
- package/dist/device/index.d.mts +108 -0
- package/dist/device/index.d.ts +108 -0
- package/dist/device/index.js +960 -0
- package/dist/device/index.js.map +1 -0
- package/dist/device/index.mjs +951 -0
- package/dist/device/index.mjs.map +1 -0
- package/dist/differential-privacy-BcAv1G80.d.mts +210 -0
- package/dist/differential-privacy-C8mAUjZr.d.ts +210 -0
- package/dist/encryption/index.d.mts +75 -0
- package/dist/encryption/index.d.ts +75 -0
- package/dist/encryption/index.js +605 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/encryption/index.mjs +598 -0
- package/dist/encryption/index.mjs.map +1 -0
- package/dist/form-validator-3tkmzr_o.d.mts +72 -0
- package/dist/form-validator-3tkmzr_o.d.ts +72 -0
- package/dist/forms/index.d.mts +59 -0
- package/dist/forms/index.d.ts +59 -0
- package/dist/forms/index.js +446 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/index.mjs +442 -0
- package/dist/forms/index.mjs.map +1 -0
- package/dist/i18n/index.d.mts +37 -0
- package/dist/i18n/index.d.ts +37 -0
- package/dist/i18n/index.js +147 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +145 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/idempotency.service-_6LqhivP.d.mts +372 -0
- package/dist/idempotency.service-eOKoISRD.d.ts +372 -0
- package/dist/index-B_ksKpS1.d.mts +202 -0
- package/dist/index-CqDKWTUP.d.mts +28 -0
- package/dist/index-CqDKWTUP.d.ts +28 -0
- package/dist/index-DFqEoX_l.d.ts +202 -0
- package/dist/index-Dz0gOur2.d.mts +36 -0
- package/dist/index-Dz0gOur2.d.ts +36 -0
- package/dist/index.d.mts +1336 -0
- package/dist/index.d.ts +1336 -0
- package/dist/index.js +19464 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +19155 -0
- package/dist/index.mjs.map +1 -0
- package/dist/india/index.d.mts +75 -0
- package/dist/india/index.d.ts +75 -0
- package/dist/india/index.js +325 -0
- package/dist/india/index.js.map +1 -0
- package/dist/india/index.mjs +303 -0
- package/dist/india/index.mjs.map +1 -0
- package/dist/joop-Bx7Iwj5p.d.mts +155 -0
- package/dist/joop-CA3DMeOO.d.ts +155 -0
- package/dist/native-bridge/index.d.mts +27 -0
- package/dist/native-bridge/index.d.ts +27 -0
- package/dist/native-bridge/index.js +98 -0
- package/dist/native-bridge/index.js.map +1 -0
- package/dist/native-bridge/index.mjs +96 -0
- package/dist/native-bridge/index.mjs.map +1 -0
- package/dist/network/index.d.mts +85 -0
- package/dist/network/index.d.ts +85 -0
- package/dist/network/index.js +454 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/index.mjs +451 -0
- package/dist/network/index.mjs.map +1 -0
- package/dist/network-monitor-BIwPSXme.d.mts +179 -0
- package/dist/network-monitor-Bqp2hvZr.d.ts +179 -0
- package/dist/notification.service-Dm4fvfZf.d.mts +25 -0
- package/dist/notification.service-tEMKatWJ.d.ts +25 -0
- package/dist/observability/index.d.mts +179 -0
- package/dist/observability/index.d.ts +179 -0
- package/dist/observability/index.js +559 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/index.mjs +552 -0
- package/dist/observability/index.mjs.map +1 -0
- package/dist/oidc-client-DIJcClmB.d.mts +190 -0
- package/dist/oidc-client-DxhyE59t.d.ts +190 -0
- package/dist/platform/index.d.mts +73 -0
- package/dist/platform/index.d.ts +73 -0
- package/dist/platform/index.js +127 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/index.mjs +125 -0
- package/dist/platform/index.mjs.map +1 -0
- package/dist/pwa/index.d.mts +31 -0
- package/dist/pwa/index.d.ts +31 -0
- package/dist/pwa/index.js +247 -0
- package/dist/pwa/index.js.map +1 -0
- package/dist/pwa/index.mjs +244 -0
- package/dist/pwa/index.mjs.map +1 -0
- package/dist/react/index.d.mts +133 -0
- package/dist/react/index.d.ts +133 -0
- package/dist/react/index.js +632 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +630 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/router/index.d.mts +39 -0
- package/dist/router/index.d.ts +39 -0
- package/dist/router/index.js +168 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/index.mjs +166 -0
- package/dist/router/index.mjs.map +1 -0
- package/dist/security/index.d.mts +206 -0
- package/dist/security/index.d.ts +206 -0
- package/dist/security/index.js +1297 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/index.mjs +1285 -0
- package/dist/security/index.mjs.map +1 -0
- package/dist/session/index.d.mts +115 -0
- package/dist/session/index.d.ts +115 -0
- package/dist/session/index.js +297 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/index.mjs +292 -0
- package/dist/session/index.mjs.map +1 -0
- package/dist/state/index.d.mts +43 -0
- package/dist/state/index.d.ts +43 -0
- package/dist/state/index.js +156 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/index.mjs +152 -0
- package/dist/state/index.mjs.map +1 -0
- package/dist/statement-parser-BHQtXwCM.d.ts +260 -0
- package/dist/statement-parser-C2qNmb49.d.mts +260 -0
- package/dist/storage/index.d.mts +40 -0
- package/dist/storage/index.d.ts +40 -0
- package/dist/storage/index.js +256 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +252 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/sync/index.d.mts +69 -0
- package/dist/sync/index.d.ts +69 -0
- package/dist/sync/index.js +330 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/index.mjs +323 -0
- package/dist/sync/index.mjs.map +1 -0
- package/dist/sync-engine-DCIMRG5s.d.ts +61 -0
- package/dist/sync-engine-DZqyKHkK.d.mts +61 -0
- package/dist/theme/index.d.mts +53 -0
- package/dist/theme/index.d.ts +53 -0
- package/dist/theme/index.js +169 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/index.mjs +167 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/ui/index.d.mts +66 -0
- package/dist/ui/index.d.ts +66 -0
- package/dist/ui/index.js +811 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.mjs +803 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/utilities/index.d.mts +199 -0
- package/dist/utilities/index.d.ts +199 -0
- package/dist/utilities/index.js +1991 -0
- package/dist/utilities/index.js.map +1 -0
- package/dist/utilities/index.mjs +1923 -0
- package/dist/utilities/index.mjs.map +1 -0
- package/dist/validation/index.d.mts +60 -0
- package/dist/validation/index.d.ts +60 -0
- package/dist/validation/index.js +460 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/index.mjs +455 -0
- package/dist/validation/index.mjs.map +1 -0
- package/dist/vue/index.d.mts +135 -0
- package/dist/vue/index.d.ts +135 -0
- package/dist/vue/index.js +621 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/index.mjs +619 -0
- package/dist/vue/index.mjs.map +1 -0
- package/dist/watermark.service-Detur5tq.d.ts +235 -0
- package/dist/watermark.service-QNegMeQZ.d.mts +235 -0
- package/dist/workers/index.d.mts +42 -0
- package/dist/workers/index.d.ts +42 -0
- package/dist/workers/index.js +359 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/index.mjs +356 -0
- package/dist/workers/index.mjs.map +1 -0
- package/dist/workflow/index.d.mts +99 -0
- package/dist/workflow/index.d.ts +99 -0
- package/dist/workflow/index.js +282 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/index.mjs +279 -0
- package/dist/workflow/index.mjs.map +1 -0
- package/package.json +226 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/constants/index.ts","../../src/utilities/common.utility.ts","../../src/core/config/config.service.ts","../../src/events/index.ts","../../src/core/logger/logger.service.ts","../../src/core/plugin.service.ts","../../src/core/environment.service.ts","../../src/core/health.service.ts","../../src/core/feature-flag.service.ts","../../src/core/rate-limiter.service.ts","../../src/core/consent.service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const DEFAULT_REQUEST_TIMEOUT = 30000;\nexport const DEFAULT_SESSION_TIMEOUT = 300000;\nexport const DEFAULT_SESSION_WAIT_TIMEOUT = 60000;\nexport const PAGE_TOKEN_KEY = 'pageToken';\nexport const DECRYPTION_FAILED = 'Response decryption failed';\nexport const SESSION_STORAGE_KEY = 'joopSession';\n","/** Remove a trailing slash from a URL string. */\nexport function removeTrailingSlash(url: string): string {\n return url?.endsWith('/') ? url.slice(0, -1) : url;\n}\n\n/** Serialize a plain object to a URL-encoded query string. */\nexport function objectToQueryString(obj: Record<string, any>): string {\n return Object.entries(obj)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n}\n\n/** Deep-clone a JSON-serializable object. */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/** Check if a value is a plain object (not an array, not null). */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Generate a random alphanumeric string of a given length. */\nexport function randomString(length: number, charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'): string {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += charset[Math.floor(Math.random() * charset.length)];\n }\n return result;\n}\n\n/** Convert a string to its hex representation. */\nexport function stringToHex(input: string): string {\n let result = '';\n for (let i = 0; i < input.length; i++) {\n result += input.charCodeAt(i).toString(16).slice(-4);\n }\n return result;\n}\n\n/** Convert an ArrayBuffer to a lowercase hex string. */\nexport function bufferToHex(buffer: ArrayBuffer | Uint8Array): string {\n return [...new Uint8Array(buffer)]\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/** Serialize a nested object into flat form-data-style string segments. */\nexport function flattenObject(obj: Record<string, any>, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (isPlainObject(value)) {\n Object.assign(result, flattenObject(value as Record<string, any>, fullKey));\n } else {\n result[fullKey] = String(value);\n }\n }\n return result;\n}\n","import { JoopConfig, JoopApp, JoopTimeout, JoopLocalization, JoopLoggerConfig } from '../../models/config.models';\nimport { DEFAULT_REQUEST_TIMEOUT } from '../../constants';\nimport { removeTrailingSlash } from '../../utilities/common.utility';\n\nexport class JoopConfigService {\n private _config: JoopConfig | null = null;\n\n /**\n * Load config from a remote URL (e.g. config/settings.json) or use an already-resolved object.\n */\n async load(configOrUrl?: JoopConfig | string): Promise<JoopConfig> {\n if (configOrUrl && typeof configOrUrl === 'object') {\n this._config = configOrUrl;\n return this._config;\n }\n\n const url = typeof configOrUrl === 'string' ? configOrUrl : 'config/settings.json';\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to load config from ${url}: ${res.statusText}`);\n this._config = await res.json() as JoopConfig;\n return this._config;\n }\n\n /** Set config directly without fetching. */\n setConfig(config: JoopConfig): void {\n this._config = config;\n }\n\n /** Generic key access. */\n get<T = any>(key: string): T | undefined {\n return (this._raw as any)?.[key];\n }\n\n get app(): JoopApp {\n return this._raw.app;\n }\n\n get timeout(): JoopTimeout | undefined {\n return this._raw.timeout;\n }\n\n get requestTimeout(): number {\n return this._raw.timeout?.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT;\n }\n\n get session() {\n return this._raw.timeout?.session;\n }\n\n get localization(): JoopLocalization | undefined {\n return this._raw.localization;\n }\n\n get loggerConfig(): JoopLoggerConfig | undefined {\n return this._raw.logger;\n }\n\n get isLoggerEnabled(): boolean {\n return this._raw.logger?.enable ?? false;\n }\n\n get isLoggerDateEnabled(): boolean {\n return this._raw.logger?.enableDate ?? false;\n }\n\n get loggerTypeConfig(): Record<string, boolean> {\n return (this._raw.logger?.typeConfig ?? {}) as Record<string, boolean>;\n }\n\n get logoutService(): string {\n return this._raw.app?.logoutService ?? '';\n }\n\n get ignoreServices(): string[] {\n return this._raw.timeout?.session?.ignoreServices ?? [];\n }\n\n get baseUrl(): string {\n return removeTrailingSlash(this._raw.app?.baseUrl ?? '');\n }\n\n get isDevMode(): boolean {\n return this._raw.isDevMode ?? false;\n }\n\n private get _raw(): JoopConfig {\n if (!this._config) throw new Error('JoopConfigService: config not loaded. Call load() first.');\n return this._config;\n }\n}\n\n/** Singleton config instance. */\nexport const configService = new JoopConfigService();\n","export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopSubject } from '../../events';\nimport { JoopLogEntry, JoopLoggerOptions } from '../../models/logger.models';\nimport { JoopLoggerConfig, JoopLoggerTypeConfig } from '../../models/config.models';\n\ntype LogLevel = JoopLogEntry['level'];\n\nexport class JoopLogger {\n private readonly _logSubject = new JoopSubject<JoopLogEntry>();\n private _config: JoopLoggerConfig = { enable: false };\n\n configure(config: JoopLoggerConfig): void {\n this._config = config;\n }\n\n debug(message: any, options?: JoopLoggerOptions): void {\n this._emit('debug', message, options);\n }\n\n log(message: any, options?: JoopLoggerOptions): void {\n this._emit('log', message, options);\n }\n\n info(message: any, options?: JoopLoggerOptions): void {\n this._emit('info', message, options);\n }\n\n warn(message: any, options?: JoopLoggerOptions): void {\n this._emit('warn', message, options);\n }\n\n error(message: any, options?: JoopLoggerOptions): void {\n this._emit('error', message, options);\n }\n\n /** Subscribe to all log entries (useful for remote logging). */\n onLog(listener: (entry: JoopLogEntry) => void): () => void {\n return this._logSubject.subscribe(listener);\n }\n\n private _shouldLog(level: string): boolean {\n if (!this._config.enable) return false;\n const tc: JoopLoggerTypeConfig = this._config.typeConfig ?? {};\n return !!(tc['all'] || tc[level as keyof JoopLoggerTypeConfig]);\n }\n\n private _emit(level: LogLevel, message: any, options?: JoopLoggerOptions): void {\n if (!this._shouldLog(level)) return;\n\n const timestamp = (this._config.enableDate || options?.isDateEnabled) ? new Date().toISOString() : undefined;\n const entry: JoopLogEntry = { level, message, timestamp, component: options?.componentName };\n this._logSubject.next(entry);\n\n const prefix = [timestamp, options?.componentName].filter(Boolean).join(' ');\n const style = options?.color ? `color: ${options.color}` : '';\n const text = prefix ? `${prefix} ${this._serialize(message)}` : this._serialize(message);\n\n switch (level) {\n case 'debug': return void console.debug(`%c${text}`, style);\n case 'log': return void console.log(`%c${text}`, style);\n case 'info': return void console.info(`%c${text}`, style);\n case 'warn': return void console.warn(`%c${text}`, style);\n case 'error': return void console.error(`%c${text}`, style);\n }\n }\n\n private _serialize(message: any): string {\n if (typeof message === 'string') return message;\n try {\n return JSON.stringify(message);\n } catch {\n return String(message);\n }\n }\n}\n\n/** Singleton logger instance exported for direct use. */\nexport const logger = new JoopLogger();\n","export interface JoopPlugin {\n name: string;\n version?: string;\n install(context: Record<string, unknown>): void | Promise<void>;\n uninstall?(): void;\n}\n\nexport class JoopPluginService {\n private _plugins = new Map<string, JoopPlugin>();\n private _context: Record<string, unknown> = {};\n\n setContext(ctx: Record<string, unknown>): void {\n this._context = { ...this._context, ...ctx };\n }\n\n async use(plugin: JoopPlugin): Promise<void> {\n if (this._plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n await plugin.install(this._context);\n this._plugins.set(plugin.name, plugin);\n }\n\n unuse(name: string): void {\n const plugin = this._plugins.get(name);\n if (!plugin) return;\n plugin.uninstall?.();\n this._plugins.delete(name);\n }\n\n has(name: string): boolean { return this._plugins.has(name); }\n getAll(): JoopPlugin[] { return [...this._plugins.values()]; }\n\n unuseAll(): void {\n [...this._plugins.keys()].forEach(n => this.unuse(n));\n }\n}\n","export type JoopEnvironmentName = 'development' | 'staging' | 'production' | string;\n\nexport interface JoopEnvironmentProfile {\n name: JoopEnvironmentName;\n apiBaseUrl: string;\n features?: Record<string, boolean>;\n [key: string]: unknown;\n}\n\nexport class JoopEnvironmentService {\n private _current: JoopEnvironmentProfile | null = null;\n private _profiles = new Map<JoopEnvironmentName, JoopEnvironmentProfile>();\n\n register(profile: JoopEnvironmentProfile): void {\n this._profiles.set(profile.name, profile);\n }\n\n activate(name: JoopEnvironmentName): void {\n const profile = this._profiles.get(name);\n if (!profile) throw new Error(`Environment profile \"${name}\" not registered`);\n this._current = profile;\n }\n\n detect(): JoopEnvironmentName {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nodeEnv = (typeof globalThis !== 'undefined' && (globalThis as any).process?.env?.NODE_ENV) as string | undefined;\n if (nodeEnv) return nodeEnv;\n if (typeof window !== 'undefined') {\n const host = window.location.hostname;\n if (host === 'localhost' || host === '127.0.0.1') return 'development';\n if (host.includes('staging') || host.includes('uat') || host.includes('test')) return 'staging';\n }\n return 'production';\n }\n\n get current(): JoopEnvironmentProfile {\n if (!this._current) throw new Error('No environment activated — call activate() first');\n return this._current;\n }\n\n get name(): JoopEnvironmentName { return this.current.name; }\n get apiBaseUrl(): string { return this.current.apiBaseUrl; }\n isDev(): boolean { return this.current.name === 'development'; }\n isStaging(): boolean { return this.current.name === 'staging'; }\n isProduction(): boolean { return this.current.name === 'production'; }\n isFeatureEnabled(feature: string): boolean { return this.current.features?.[feature] ?? false; }\n get<T>(key: string): T | undefined { return this.current[key] as T; }\n}\n","export interface JoopHealthCheckResult {\n name: string;\n healthy: boolean;\n latencyMs: number;\n error?: string;\n timestamp: number;\n}\n\nexport interface JoopHealthCheck {\n name: string;\n check: () => Promise<boolean>;\n timeoutMs?: number;\n}\n\nexport class JoopHealthService {\n private _checks: JoopHealthCheck[] = [];\n\n register(check: JoopHealthCheck): void { this._checks.push(check); }\n\n async runAll(): Promise<JoopHealthCheckResult[]> {\n return Promise.all(this._checks.map(c => this._run(c)));\n }\n\n async run(name: string): Promise<JoopHealthCheckResult | null> {\n const check = this._checks.find(c => c.name === name);\n return check ? this._run(check) : null;\n }\n\n async pingUrl(url: string, timeoutMs = 5_000): Promise<JoopHealthCheckResult> {\n const start = performance.now();\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n const res = await fetch(url, { method: 'HEAD', signal: controller.signal });\n clearTimeout(timer);\n return { name: url, healthy: res.ok, latencyMs: Math.round(performance.now() - start), timestamp: Date.now() };\n } catch (err) {\n return {\n name: url,\n healthy: false,\n latencyMs: Math.round(performance.now() - start),\n error: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n };\n }\n }\n\n private async _run(check: JoopHealthCheck): Promise<JoopHealthCheckResult> {\n const start = performance.now();\n try {\n const result = await Promise.race([\n check.check(),\n new Promise<boolean>((_, reject) =>\n setTimeout(() => reject(new Error('Health check timeout')), check.timeoutMs ?? 5_000)\n ),\n ]);\n return { name: check.name, healthy: result, latencyMs: Math.round(performance.now() - start), timestamp: Date.now() };\n } catch (err) {\n return {\n name: check.name,\n healthy: false,\n latencyMs: Math.round(performance.now() - start),\n error: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n };\n }\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopFlagDefinition {\n key: string;\n enabled: boolean;\n variant?: string;\n description?: string;\n /** Percentage rollout 0–100 — compared against a stable user hash */\n rolloutPercent?: number;\n /** Only enable for specific user IDs */\n allowedUsers?: string[];\n /** Only enable for specific environments */\n environments?: string[];\n}\n\nexport interface JoopFlagContext {\n userId?: string;\n environment?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport class JoopFeatureFlagService {\n private _flags = new Map<string, JoopFlagDefinition>();\n private _overrides = new Map<string, boolean>();\n private _context: JoopFlagContext = {};\n private _flags$ = new JoopBehaviorSubject<Map<string, JoopFlagDefinition>>(new Map());\n\n /** Register flag definitions */\n define(flags: JoopFlagDefinition[]): void {\n for (const f of flags) this._flags.set(f.key, f);\n this._flags$.next(new Map(this._flags));\n }\n\n /** Load flags from a remote JSON endpoint */\n async loadFromUrl(url: string): Promise<void> {\n const res = await fetch(url);\n const flags: JoopFlagDefinition[] = await res.json();\n this.define(flags);\n }\n\n /** Set user/environment context for targeting */\n setContext(ctx: JoopFlagContext): void { this._context = { ...this._context, ...ctx }; }\n\n /** Check if a feature flag is enabled for the current context */\n isEnabled(key: string, context?: JoopFlagContext): boolean {\n if (this._overrides.has(key)) return this._overrides.get(key)!;\n const flag = this._flags.get(key);\n if (!flag) return false;\n if (!flag.enabled) return false;\n\n const ctx = { ...this._context, ...context };\n\n if (flag.environments?.length && ctx.environment && !flag.environments.includes(ctx.environment)) return false;\n if (flag.allowedUsers?.length && ctx.userId && !flag.allowedUsers.includes(ctx.userId)) return false;\n\n if (flag.rolloutPercent !== undefined && ctx.userId) {\n const hash = this._hash(`${key}:${ctx.userId}`);\n if (hash % 100 >= flag.rolloutPercent) return false;\n }\n\n return true;\n }\n\n /** Get the variant string for a flag */\n getVariant(key: string, context?: JoopFlagContext): string | null {\n if (!this.isEnabled(key, context)) return null;\n return this._flags.get(key)?.variant ?? null;\n }\n\n /** Override a flag locally (for testing) */\n setOverride(key: string, value: boolean): void {\n this._overrides.set(key, value);\n this._flags$.next(new Map(this._flags));\n }\n\n clearOverrides(): void {\n this._overrides.clear();\n this._flags$.next(new Map(this._flags));\n }\n\n getAllFlags(): JoopFlagDefinition[] { return [...this._flags.values()]; }\n getFlag(key: string): JoopFlagDefinition | undefined { return this._flags.get(key); }\n flags$() { return this._flags$.asObservable(); }\n\n /** Simple deterministic hash for percentage rollouts */\n private _hash(str: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = (h * 0x01000193) >>> 0;\n }\n return h;\n }\n}\n","export interface JoopTokenBucketConfig {\n capacity: number; // max tokens\n refillRate: number; // tokens per second\n}\n\nexport class JoopTokenBucket {\n private _tokens: number;\n private _lastRefill: number;\n private readonly _cap: number;\n private readonly _rate: number;\n\n constructor(config: JoopTokenBucketConfig) {\n this._cap = config.capacity;\n this._rate = config.refillRate;\n this._tokens = config.capacity;\n this._lastRefill = Date.now();\n }\n\n private _refill(): void {\n const now = Date.now();\n const elapsed = (now - this._lastRefill) / 1000;\n this._tokens = Math.min(this._cap, this._tokens + elapsed * this._rate);\n this._lastRefill = now;\n }\n\n /** Returns true if tokens were available and consumed */\n consume(tokens = 1): boolean {\n this._refill();\n if (this._tokens < tokens) return false;\n this._tokens -= tokens;\n return true;\n }\n\n /** Waits until enough tokens are available, then consumes */\n tryConsume(tokens = 1): Promise<void> {\n return new Promise(resolve => {\n const attempt = () => {\n if (this.consume(tokens)) { resolve(); return; }\n const wait = Math.ceil((tokens - this._tokens) / this._rate * 1000);\n setTimeout(attempt, wait);\n };\n attempt();\n });\n }\n\n available(): number { this._refill(); return Math.floor(this._tokens); }\n reset(): void { this._tokens = this._cap; this._lastRefill = Date.now(); }\n}\n\nexport class JoopRateLimiter {\n private _buckets = new Map<string, JoopTokenBucket>();\n private _timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n /** Create or get a token bucket by key */\n bucket(key: string, config?: JoopTokenBucketConfig): JoopTokenBucket {\n if (!this._buckets.has(key)) {\n this._buckets.set(key, new JoopTokenBucket(config ?? { capacity: 10, refillRate: 1 }));\n }\n return this._buckets.get(key)!;\n }\n\n deleteBucket(key: string): void { this._buckets.delete(key); }\n\n /** Returns a throttled version — at most once per delayMs */\n throttle<T extends unknown[]>(fn: (...args: T) => void, delayMs: number): (...args: T) => void {\n let lastCall = 0;\n return (...args: T) => {\n const now = Date.now();\n if (now - lastCall >= delayMs) { lastCall = now; fn(...args); }\n };\n }\n\n /** Returns a debounced version — fires after delayMs of silence */\n debounce<T extends unknown[]>(fn: (...args: T) => void, delayMs: number, immediate = false): (...args: T) => void {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return (...args: T) => {\n if (timer) clearTimeout(timer);\n if (immediate && !timer) fn(...args);\n timer = setTimeout(() => { timer = null; if (!immediate) fn(...args); }, delayMs);\n };\n }\n\n /** Promise-based debounce — resolves when the debounced call fires */\n debounceAsync<T>(fn: () => Promise<T>, delayMs: number): () => Promise<T> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let resolve: ((v: T) => void) | null = null;\n let reject: ((e: unknown) => void) | null = null;\n let pending: Promise<T> | null = null;\n return () => {\n if (!pending) pending = new Promise<T>((res, rej) => { resolve = res; reject = rej; });\n if (timer) clearTimeout(timer);\n timer = setTimeout(async () => {\n timer = null; pending = null;\n try { const v = await fn(); resolve?.(v); } catch (e) { reject?.(e); }\n resolve = null; reject = null;\n }, delayMs);\n return pending;\n };\n }\n\n /** Ensure a function is called at most once per key in the given window */\n once(key: string, fn: () => void, windowMs: number): boolean {\n if (this._timers.has(key)) return false;\n fn();\n this._timers.set(key, setTimeout(() => this._timers.delete(key), windowMs));\n return true;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport type JoopConsentCategory = 'necessary' | 'analytics' | 'marketing' | 'functional' | 'personalization';\n\nexport interface JoopConsentState {\n decided: boolean;\n categories: Record<JoopConsentCategory, boolean>;\n timestamp: number | null;\n}\n\nconst STORAGE_KEY = 'joop_consent';\nconst ALL: JoopConsentCategory[] = ['necessary', 'analytics', 'marketing', 'functional', 'personalization'];\n\nconst DEFAULT_STATE: JoopConsentState = {\n decided: false,\n categories: { necessary: true, analytics: false, marketing: false, functional: false, personalization: false },\n timestamp: null,\n};\n\nexport class JoopConsentService {\n private _state$: JoopBehaviorSubject<JoopConsentState>;\n\n constructor(storageKey = STORAGE_KEY) {\n this._state$ = new JoopBehaviorSubject<JoopConsentState>(this._loadFrom(storageKey));\n this._key = storageKey;\n }\n\n private _key: string;\n\n private _loadFrom(key: string): JoopConsentState {\n try {\n const raw = localStorage.getItem(key);\n if (raw) return { ...DEFAULT_STATE, ...JSON.parse(raw) };\n } catch {}\n return { ...DEFAULT_STATE, categories: { ...DEFAULT_STATE.categories } };\n }\n\n /** Grant one or more categories */\n grant(categories: JoopConsentCategory | JoopConsentCategory[]): void {\n const cats = Array.isArray(categories) ? categories : [categories];\n const s = this._state$.getValue();\n const next = { ...s, decided: true, timestamp: Date.now(), categories: { ...s.categories } };\n for (const c of cats) next.categories[c] = true;\n this._state$.next(next);\n this._persist(next);\n }\n\n /** Revoke one or more categories (cannot revoke 'necessary') */\n revoke(categories: JoopConsentCategory | JoopConsentCategory[]): void {\n const cats = (Array.isArray(categories) ? categories : [categories]).filter(c => c !== 'necessary');\n const s = this._state$.getValue();\n const next = { ...s, decided: true, timestamp: Date.now(), categories: { ...s.categories } };\n for (const c of cats) next.categories[c] = false;\n this._state$.next(next);\n this._persist(next);\n }\n\n /** Grant all categories at once */\n acceptAll(): void { this.grant(ALL); }\n\n /** Reject all non-necessary categories */\n rejectAll(): void { this.revoke(ALL.filter(c => c !== 'necessary')); }\n\n isGranted(category: JoopConsentCategory): boolean { return this._state$.getValue().categories[category] ?? false; }\n hasDecided(): boolean { return this._state$.getValue().decided; }\n getAll(): Record<JoopConsentCategory, boolean> { return { ...this._state$.getValue().categories }; }\n getState(): JoopConsentState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n\n reset(): void {\n const fresh = { ...DEFAULT_STATE, categories: { ...DEFAULT_STATE.categories } };\n this._state$.next(fresh);\n try { localStorage.removeItem(this._key); } catch {}\n }\n\n onChange(handler: (state: JoopConsentState) => void): () => void {\n return this._state$.subscribe(handler);\n }\n\n onCategoryChange(category: JoopConsentCategory, handler: (granted: boolean) => void): () => void {\n let prev = this.isGranted(category);\n return this._state$.subscribe(s => {\n const cur = s.categories[category] ?? false;\n if (cur !== prev) { prev = cur; handler(cur); }\n });\n }\n\n private _persist(state: JoopConsentState): void {\n try { localStorage.setItem(this._key, JSON.stringify(state)); } catch {}\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
interface JoopPasswordHash {
|
|
2
|
+
hash: string;
|
|
3
|
+
salt: string;
|
|
4
|
+
iterations: number;
|
|
5
|
+
keyLen: number;
|
|
6
|
+
}
|
|
7
|
+
declare class JoopCryptoUtils {
|
|
8
|
+
sha256(data: string | ArrayBuffer): Promise<string>;
|
|
9
|
+
sha512(data: string | ArrayBuffer): Promise<string>;
|
|
10
|
+
sha1(data: string | ArrayBuffer): Promise<string>;
|
|
11
|
+
hmac(data: string, secret: string, algo?: 'SHA-256' | 'SHA-512' | 'SHA-1'): Promise<string>;
|
|
12
|
+
hmacVerify(data: string, secret: string, signature: string, algo?: 'SHA-256' | 'SHA-512' | 'SHA-1'): Promise<boolean>;
|
|
13
|
+
pbkdf2(password: string, salt: string, iterations?: number, keyLen?: number, hash?: 'SHA-256' | 'SHA-512'): Promise<string>;
|
|
14
|
+
hashPassword(password: string, salt?: string, iterations?: number): Promise<JoopPasswordHash>;
|
|
15
|
+
verifyPassword(password: string, record: JoopPasswordHash): Promise<boolean>;
|
|
16
|
+
generateSalt(bytes?: number): string;
|
|
17
|
+
randomBytes(length: number): Uint8Array<ArrayBuffer>;
|
|
18
|
+
randomHex(bytes?: number): string;
|
|
19
|
+
uuid(): string;
|
|
20
|
+
/** Constant-time string comparison to prevent timing attacks */
|
|
21
|
+
timingSafeEqual(a: string, b: string): boolean;
|
|
22
|
+
hexToBytes(hex: string): Uint8Array<ArrayBuffer>;
|
|
23
|
+
bytesToHex(bytes: Uint8Array): string;
|
|
24
|
+
base64ToHex(b64: string): string;
|
|
25
|
+
hexToBase64(hex: string): string;
|
|
26
|
+
/** Derive an AES-GCM key from a password via PBKDF2 */
|
|
27
|
+
deriveKey(password: string, salt: string, iterations?: number): Promise<CryptoKey>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { JoopCryptoUtils as J, type JoopPasswordHash as a };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
interface JoopPasswordHash {
|
|
2
|
+
hash: string;
|
|
3
|
+
salt: string;
|
|
4
|
+
iterations: number;
|
|
5
|
+
keyLen: number;
|
|
6
|
+
}
|
|
7
|
+
declare class JoopCryptoUtils {
|
|
8
|
+
sha256(data: string | ArrayBuffer): Promise<string>;
|
|
9
|
+
sha512(data: string | ArrayBuffer): Promise<string>;
|
|
10
|
+
sha1(data: string | ArrayBuffer): Promise<string>;
|
|
11
|
+
hmac(data: string, secret: string, algo?: 'SHA-256' | 'SHA-512' | 'SHA-1'): Promise<string>;
|
|
12
|
+
hmacVerify(data: string, secret: string, signature: string, algo?: 'SHA-256' | 'SHA-512' | 'SHA-1'): Promise<boolean>;
|
|
13
|
+
pbkdf2(password: string, salt: string, iterations?: number, keyLen?: number, hash?: 'SHA-256' | 'SHA-512'): Promise<string>;
|
|
14
|
+
hashPassword(password: string, salt?: string, iterations?: number): Promise<JoopPasswordHash>;
|
|
15
|
+
verifyPassword(password: string, record: JoopPasswordHash): Promise<boolean>;
|
|
16
|
+
generateSalt(bytes?: number): string;
|
|
17
|
+
randomBytes(length: number): Uint8Array<ArrayBuffer>;
|
|
18
|
+
randomHex(bytes?: number): string;
|
|
19
|
+
uuid(): string;
|
|
20
|
+
/** Constant-time string comparison to prevent timing attacks */
|
|
21
|
+
timingSafeEqual(a: string, b: string): boolean;
|
|
22
|
+
hexToBytes(hex: string): Uint8Array<ArrayBuffer>;
|
|
23
|
+
bytesToHex(bytes: Uint8Array): string;
|
|
24
|
+
base64ToHex(b64: string): string;
|
|
25
|
+
hexToBase64(hex: string): string;
|
|
26
|
+
/** Derive an AES-GCM key from a password via PBKDF2 */
|
|
27
|
+
deriveKey(password: string, salt: string, iterations?: number): Promise<CryptoKey>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { JoopCryptoUtils as J, type JoopPasswordHash as a };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { J as JoopObservable } from './index-Dz0gOur2.js';
|
|
2
|
+
import { J as JoopScopeType } from './index-CqDKWTUP.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Four-scope in-memory store.
|
|
6
|
+
*
|
|
7
|
+
* | Scope | Lifetime |
|
|
8
|
+
* |---------|--------------------------------|
|
|
9
|
+
* | app | Entire app session |
|
|
10
|
+
* | page | Current page / flow |
|
|
11
|
+
* | screen | Current screen / component |
|
|
12
|
+
* | session | Browser session (survives nav) |
|
|
13
|
+
*/
|
|
14
|
+
declare class JoopScopeMapService {
|
|
15
|
+
private _appMap;
|
|
16
|
+
private _pageMap;
|
|
17
|
+
private _screenMap;
|
|
18
|
+
private _sessionMap;
|
|
19
|
+
getMap(scope: JoopScopeType): Record<string, any>;
|
|
20
|
+
clearScreen(): void;
|
|
21
|
+
clearPage(): void;
|
|
22
|
+
clearSession(): void;
|
|
23
|
+
clearApp(): void;
|
|
24
|
+
clearAll(): void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare class JoopDataStorage {
|
|
28
|
+
private readonly _scopeMap;
|
|
29
|
+
private _menuSubject;
|
|
30
|
+
constructor(_scopeMap: JoopScopeMapService);
|
|
31
|
+
/** Store a value in the given scope under the given key. */
|
|
32
|
+
set(scope: JoopScopeType, key: string, value: any): void;
|
|
33
|
+
/** Retrieve a typed value from the given scope. Returns null if not found. */
|
|
34
|
+
get<T>(scope: JoopScopeType, key: string): T | null;
|
|
35
|
+
/** Remove a single key from the given scope. */
|
|
36
|
+
remove(scope: JoopScopeType, key: string): void;
|
|
37
|
+
/** Retrieve the entire map for a scope (reference, not clone). */
|
|
38
|
+
getScope<T extends Record<string, any>>(scope: JoopScopeType): T;
|
|
39
|
+
setMenuData(data: {
|
|
40
|
+
menuObj: any[];
|
|
41
|
+
}): void;
|
|
42
|
+
clearMenuData(): void;
|
|
43
|
+
menuData$(): JoopObservable<{
|
|
44
|
+
menuObj: any[];
|
|
45
|
+
} | null>;
|
|
46
|
+
getMenuData(): {
|
|
47
|
+
menuObj: any[];
|
|
48
|
+
} | null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { JoopDataStorage as J, JoopScopeMapService as a };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { J as JoopObservable } from './index-Dz0gOur2.mjs';
|
|
2
|
+
import { J as JoopScopeType } from './index-CqDKWTUP.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Four-scope in-memory store.
|
|
6
|
+
*
|
|
7
|
+
* | Scope | Lifetime |
|
|
8
|
+
* |---------|--------------------------------|
|
|
9
|
+
* | app | Entire app session |
|
|
10
|
+
* | page | Current page / flow |
|
|
11
|
+
* | screen | Current screen / component |
|
|
12
|
+
* | session | Browser session (survives nav) |
|
|
13
|
+
*/
|
|
14
|
+
declare class JoopScopeMapService {
|
|
15
|
+
private _appMap;
|
|
16
|
+
private _pageMap;
|
|
17
|
+
private _screenMap;
|
|
18
|
+
private _sessionMap;
|
|
19
|
+
getMap(scope: JoopScopeType): Record<string, any>;
|
|
20
|
+
clearScreen(): void;
|
|
21
|
+
clearPage(): void;
|
|
22
|
+
clearSession(): void;
|
|
23
|
+
clearApp(): void;
|
|
24
|
+
clearAll(): void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare class JoopDataStorage {
|
|
28
|
+
private readonly _scopeMap;
|
|
29
|
+
private _menuSubject;
|
|
30
|
+
constructor(_scopeMap: JoopScopeMapService);
|
|
31
|
+
/** Store a value in the given scope under the given key. */
|
|
32
|
+
set(scope: JoopScopeType, key: string, value: any): void;
|
|
33
|
+
/** Retrieve a typed value from the given scope. Returns null if not found. */
|
|
34
|
+
get<T>(scope: JoopScopeType, key: string): T | null;
|
|
35
|
+
/** Remove a single key from the given scope. */
|
|
36
|
+
remove(scope: JoopScopeType, key: string): void;
|
|
37
|
+
/** Retrieve the entire map for a scope (reference, not clone). */
|
|
38
|
+
getScope<T extends Record<string, any>>(scope: JoopScopeType): T;
|
|
39
|
+
setMenuData(data: {
|
|
40
|
+
menuObj: any[];
|
|
41
|
+
}): void;
|
|
42
|
+
clearMenuData(): void;
|
|
43
|
+
menuData$(): JoopObservable<{
|
|
44
|
+
menuObj: any[];
|
|
45
|
+
} | null>;
|
|
46
|
+
getMenuData(): {
|
|
47
|
+
menuObj: any[];
|
|
48
|
+
} | null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { JoopDataStorage as J, JoopScopeMapService as a };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export { a as JoopDeeplinkData, J as JoopDeeplinkService } from '../deeplink.service-Ctd5u243.mjs';
|
|
2
|
+
import '../index-Dz0gOur2.mjs';
|
|
3
|
+
|
|
4
|
+
interface JoopRouteParams {
|
|
5
|
+
params: Record<string, string>;
|
|
6
|
+
query: Record<string, string>;
|
|
7
|
+
hash: string;
|
|
8
|
+
url: string;
|
|
9
|
+
pattern: string;
|
|
10
|
+
}
|
|
11
|
+
type JoopRouteHandler = (match: JoopRouteParams) => void | Promise<void>;
|
|
12
|
+
declare class JoopDeeplinkRouter {
|
|
13
|
+
private _routes;
|
|
14
|
+
private _fallback;
|
|
15
|
+
private _history;
|
|
16
|
+
private _maxHistory;
|
|
17
|
+
/** Register a URL-pattern handler. Returns an unsubscribe function. */
|
|
18
|
+
on(pattern: string, handler: JoopRouteHandler, priority?: number): () => void;
|
|
19
|
+
/** Register a fallback handler for unmatched URLs. */
|
|
20
|
+
fallback(handler: JoopRouteHandler): void;
|
|
21
|
+
/** Dispatch a URL, return true if a handler matched. */
|
|
22
|
+
dispatch(url: string): Promise<boolean>;
|
|
23
|
+
/** Parse a URL into parts without dispatching. */
|
|
24
|
+
parse(url: string): Omit<JoopRouteParams, 'pattern'> & {
|
|
25
|
+
matchedPattern: string | null;
|
|
26
|
+
};
|
|
27
|
+
/** Build a URL from a pattern and param values. */
|
|
28
|
+
buildUrl(pattern: string, params?: Record<string, string>, query?: Record<string, string>): string;
|
|
29
|
+
/** List all registered patterns. */
|
|
30
|
+
routes(): string[];
|
|
31
|
+
/** Navigation history (last N dispatched URLs). */
|
|
32
|
+
history(): readonly string[];
|
|
33
|
+
/** Remove all registered handlers. */
|
|
34
|
+
clear(): void;
|
|
35
|
+
/** Dispatch the current window.location.href. */
|
|
36
|
+
dispatchCurrent(): Promise<boolean>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { JoopDeeplinkRouter, type JoopRouteHandler, type JoopRouteParams };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export { a as JoopDeeplinkData, J as JoopDeeplinkService } from '../deeplink.service-uUuTnY9_.js';
|
|
2
|
+
import '../index-Dz0gOur2.js';
|
|
3
|
+
|
|
4
|
+
interface JoopRouteParams {
|
|
5
|
+
params: Record<string, string>;
|
|
6
|
+
query: Record<string, string>;
|
|
7
|
+
hash: string;
|
|
8
|
+
url: string;
|
|
9
|
+
pattern: string;
|
|
10
|
+
}
|
|
11
|
+
type JoopRouteHandler = (match: JoopRouteParams) => void | Promise<void>;
|
|
12
|
+
declare class JoopDeeplinkRouter {
|
|
13
|
+
private _routes;
|
|
14
|
+
private _fallback;
|
|
15
|
+
private _history;
|
|
16
|
+
private _maxHistory;
|
|
17
|
+
/** Register a URL-pattern handler. Returns an unsubscribe function. */
|
|
18
|
+
on(pattern: string, handler: JoopRouteHandler, priority?: number): () => void;
|
|
19
|
+
/** Register a fallback handler for unmatched URLs. */
|
|
20
|
+
fallback(handler: JoopRouteHandler): void;
|
|
21
|
+
/** Dispatch a URL, return true if a handler matched. */
|
|
22
|
+
dispatch(url: string): Promise<boolean>;
|
|
23
|
+
/** Parse a URL into parts without dispatching. */
|
|
24
|
+
parse(url: string): Omit<JoopRouteParams, 'pattern'> & {
|
|
25
|
+
matchedPattern: string | null;
|
|
26
|
+
};
|
|
27
|
+
/** Build a URL from a pattern and param values. */
|
|
28
|
+
buildUrl(pattern: string, params?: Record<string, string>, query?: Record<string, string>): string;
|
|
29
|
+
/** List all registered patterns. */
|
|
30
|
+
routes(): string[];
|
|
31
|
+
/** Navigation history (last N dispatched URLs). */
|
|
32
|
+
history(): readonly string[];
|
|
33
|
+
/** Remove all registered handlers. */
|
|
34
|
+
clear(): void;
|
|
35
|
+
/** Dispatch the current window.location.href. */
|
|
36
|
+
dispatchCurrent(): Promise<boolean>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { JoopDeeplinkRouter, type JoopRouteHandler, type JoopRouteParams };
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/events/index.ts
|
|
4
|
+
var JoopSubject = class {
|
|
5
|
+
_listeners = [];
|
|
6
|
+
subscribe(listener) {
|
|
7
|
+
this._listeners.push(listener);
|
|
8
|
+
return () => {
|
|
9
|
+
this._listeners = this._listeners.filter((l) => l !== listener);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
next(value) {
|
|
13
|
+
for (const listener of this._listeners) {
|
|
14
|
+
listener(value);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
asObservable() {
|
|
18
|
+
return new JoopObservable((listener) => this.subscribe(listener));
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
var JoopBehaviorSubject = class extends JoopSubject {
|
|
22
|
+
_value;
|
|
23
|
+
constructor(initialValue) {
|
|
24
|
+
super();
|
|
25
|
+
this._value = initialValue;
|
|
26
|
+
}
|
|
27
|
+
getValue() {
|
|
28
|
+
return this._value;
|
|
29
|
+
}
|
|
30
|
+
next(value) {
|
|
31
|
+
this._value = value;
|
|
32
|
+
super.next(value);
|
|
33
|
+
}
|
|
34
|
+
subscribe(listener) {
|
|
35
|
+
listener(this._value);
|
|
36
|
+
return super.subscribe(listener);
|
|
37
|
+
}
|
|
38
|
+
asObservable() {
|
|
39
|
+
return new JoopObservable((listener) => this.subscribe(listener));
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var JoopObservable = class {
|
|
43
|
+
constructor(_subscribeFn) {
|
|
44
|
+
this._subscribeFn = _subscribeFn;
|
|
45
|
+
}
|
|
46
|
+
_subscribeFn;
|
|
47
|
+
subscribe(listener) {
|
|
48
|
+
return this._subscribeFn(listener);
|
|
49
|
+
}
|
|
50
|
+
/** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */
|
|
51
|
+
getOnce() {
|
|
52
|
+
let result;
|
|
53
|
+
const unsub = this.subscribe((v) => {
|
|
54
|
+
result = v;
|
|
55
|
+
});
|
|
56
|
+
unsub();
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// src/deeplink/deeplink.service.ts
|
|
62
|
+
var STORAGE_KEY = "__joop_deeplink__";
|
|
63
|
+
var JoopDeeplinkService = class {
|
|
64
|
+
_close$ = new JoopSubject();
|
|
65
|
+
_incoming$ = new JoopSubject();
|
|
66
|
+
_module$ = new JoopBehaviorSubject("");
|
|
67
|
+
_unlisten = null;
|
|
68
|
+
getModule() {
|
|
69
|
+
return this._module$.getValue();
|
|
70
|
+
}
|
|
71
|
+
module$() {
|
|
72
|
+
return this._module$.asObservable();
|
|
73
|
+
}
|
|
74
|
+
close$() {
|
|
75
|
+
return this._close$.asObservable();
|
|
76
|
+
}
|
|
77
|
+
incoming$() {
|
|
78
|
+
return this._incoming$.asObservable();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set the deeplink module + data, broadcast via localStorage, then signal tab close.
|
|
82
|
+
* Returns a Promise that resolves when the current tab is done.
|
|
83
|
+
*/
|
|
84
|
+
setModule(module, data) {
|
|
85
|
+
const payload = { module, data, timestamp: Date.now() };
|
|
86
|
+
this._module$.next(module);
|
|
87
|
+
if (typeof localStorage !== "undefined") {
|
|
88
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(payload));
|
|
89
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
90
|
+
}
|
|
91
|
+
this._close$.next(true);
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
const unsub = this._incoming$.subscribe((d) => {
|
|
94
|
+
unsub();
|
|
95
|
+
resolve(d);
|
|
96
|
+
});
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
unsub();
|
|
99
|
+
resolve(payload);
|
|
100
|
+
}, 2e3);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Start listening for deeplink data from another tab via storage events.
|
|
105
|
+
* Returns a cleanup function.
|
|
106
|
+
*/
|
|
107
|
+
startListening(storageKey = STORAGE_KEY) {
|
|
108
|
+
if (typeof window === "undefined") return () => {
|
|
109
|
+
};
|
|
110
|
+
const handler = (event) => {
|
|
111
|
+
if (event.key !== storageKey || !event.newValue) return;
|
|
112
|
+
try {
|
|
113
|
+
const data = JSON.parse(event.newValue);
|
|
114
|
+
this._module$.next(data.module);
|
|
115
|
+
this._incoming$.next(data);
|
|
116
|
+
} catch {
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
window.addEventListener("storage", handler);
|
|
120
|
+
this._unlisten = () => window.removeEventListener("storage", handler);
|
|
121
|
+
return this._unlisten;
|
|
122
|
+
}
|
|
123
|
+
stopListening() {
|
|
124
|
+
this._unlisten?.();
|
|
125
|
+
this._unlisten = null;
|
|
126
|
+
}
|
|
127
|
+
/** Signal this tab should close (without deeplink) */
|
|
128
|
+
requestClose() {
|
|
129
|
+
this._close$.next(false);
|
|
130
|
+
}
|
|
131
|
+
/** Read deeplink payload written by another tab on this page load */
|
|
132
|
+
readIncoming(storageKey = STORAGE_KEY) {
|
|
133
|
+
if (typeof localStorage === "undefined") return null;
|
|
134
|
+
try {
|
|
135
|
+
const raw = localStorage.getItem(storageKey);
|
|
136
|
+
return raw ? JSON.parse(raw) : null;
|
|
137
|
+
} catch {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
clearStored(storageKey = STORAGE_KEY) {
|
|
142
|
+
if (typeof localStorage !== "undefined") localStorage.removeItem(storageKey);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// src/deeplink/deeplink-router.ts
|
|
147
|
+
function _compilePattern(pattern) {
|
|
148
|
+
const keys = [];
|
|
149
|
+
const escaped = pattern.replace(/\//g, "\\/").replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, key) => {
|
|
150
|
+
keys.push(key);
|
|
151
|
+
return "([^/]+)";
|
|
152
|
+
}).replace(/\*/g, "(.*)");
|
|
153
|
+
return { regex: new RegExp(`^${escaped}$`), keys };
|
|
154
|
+
}
|
|
155
|
+
function _parseQuery(search) {
|
|
156
|
+
const params = {};
|
|
157
|
+
if (!search) return params;
|
|
158
|
+
new URLSearchParams(search.startsWith("?") ? search.slice(1) : search).forEach((v, k) => {
|
|
159
|
+
params[k] = v;
|
|
160
|
+
});
|
|
161
|
+
return params;
|
|
162
|
+
}
|
|
163
|
+
var JoopDeeplinkRouter = class {
|
|
164
|
+
_routes = [];
|
|
165
|
+
_fallback = null;
|
|
166
|
+
_history = [];
|
|
167
|
+
_maxHistory = 50;
|
|
168
|
+
/** Register a URL-pattern handler. Returns an unsubscribe function. */
|
|
169
|
+
on(pattern, handler, priority = 0) {
|
|
170
|
+
const { regex, keys } = _compilePattern(pattern);
|
|
171
|
+
const route = { pattern, regex, keys, handler, priority };
|
|
172
|
+
this._routes.push(route);
|
|
173
|
+
this._routes.sort((a, b) => b.priority - a.priority);
|
|
174
|
+
return () => {
|
|
175
|
+
this._routes = this._routes.filter((r) => r !== route);
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/** Register a fallback handler for unmatched URLs. */
|
|
179
|
+
fallback(handler) {
|
|
180
|
+
this._fallback = handler;
|
|
181
|
+
}
|
|
182
|
+
/** Dispatch a URL, return true if a handler matched. */
|
|
183
|
+
async dispatch(url) {
|
|
184
|
+
this._history.push(url);
|
|
185
|
+
if (this._history.length > this._maxHistory) this._history.shift();
|
|
186
|
+
let path, search, hash;
|
|
187
|
+
try {
|
|
188
|
+
const parsed = new URL(url, "http://x");
|
|
189
|
+
path = parsed.pathname;
|
|
190
|
+
search = parsed.search;
|
|
191
|
+
hash = parsed.hash;
|
|
192
|
+
} catch {
|
|
193
|
+
path = url;
|
|
194
|
+
search = "";
|
|
195
|
+
hash = "";
|
|
196
|
+
}
|
|
197
|
+
for (const route of this._routes) {
|
|
198
|
+
const match = route.regex.exec(path);
|
|
199
|
+
if (!match) continue;
|
|
200
|
+
const params = {};
|
|
201
|
+
route.keys.forEach((k, i) => {
|
|
202
|
+
params[k] = decodeURIComponent(match[i + 1] ?? "");
|
|
203
|
+
});
|
|
204
|
+
await route.handler({ params, query: _parseQuery(search), hash, url, pattern: route.pattern });
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
if (this._fallback) {
|
|
208
|
+
await this._fallback({ params: {}, query: _parseQuery(search), hash, url, pattern: "" });
|
|
209
|
+
}
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
/** Parse a URL into parts without dispatching. */
|
|
213
|
+
parse(url) {
|
|
214
|
+
let path, search, hash;
|
|
215
|
+
try {
|
|
216
|
+
const p = new URL(url, "http://x");
|
|
217
|
+
path = p.pathname;
|
|
218
|
+
search = p.search;
|
|
219
|
+
hash = p.hash;
|
|
220
|
+
} catch {
|
|
221
|
+
path = url;
|
|
222
|
+
search = "";
|
|
223
|
+
hash = "";
|
|
224
|
+
}
|
|
225
|
+
for (const route of this._routes) {
|
|
226
|
+
const match = route.regex.exec(path);
|
|
227
|
+
if (!match) continue;
|
|
228
|
+
const params = {};
|
|
229
|
+
route.keys.forEach((k, i) => {
|
|
230
|
+
params[k] = decodeURIComponent(match[i + 1] ?? "");
|
|
231
|
+
});
|
|
232
|
+
return { params, query: _parseQuery(search), hash, url, matchedPattern: route.pattern };
|
|
233
|
+
}
|
|
234
|
+
return { params: {}, query: _parseQuery(search), hash, url, matchedPattern: null };
|
|
235
|
+
}
|
|
236
|
+
/** Build a URL from a pattern and param values. */
|
|
237
|
+
buildUrl(pattern, params = {}, query = {}) {
|
|
238
|
+
let path = pattern;
|
|
239
|
+
for (const [k, v] of Object.entries(params)) {
|
|
240
|
+
path = path.replace(`:${k}`, encodeURIComponent(v));
|
|
241
|
+
}
|
|
242
|
+
const qs = new URLSearchParams(query).toString();
|
|
243
|
+
return qs ? `${path}?${qs}` : path;
|
|
244
|
+
}
|
|
245
|
+
/** List all registered patterns. */
|
|
246
|
+
routes() {
|
|
247
|
+
return this._routes.map((r) => r.pattern);
|
|
248
|
+
}
|
|
249
|
+
/** Navigation history (last N dispatched URLs). */
|
|
250
|
+
history() {
|
|
251
|
+
return this._history;
|
|
252
|
+
}
|
|
253
|
+
/** Remove all registered handlers. */
|
|
254
|
+
clear() {
|
|
255
|
+
this._routes = [];
|
|
256
|
+
this._fallback = null;
|
|
257
|
+
}
|
|
258
|
+
/** Dispatch the current window.location.href. */
|
|
259
|
+
dispatchCurrent() {
|
|
260
|
+
if (typeof window === "undefined") return Promise.resolve(false);
|
|
261
|
+
return this.dispatch(window.location.href);
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
exports.JoopDeeplinkRouter = JoopDeeplinkRouter;
|
|
266
|
+
exports.JoopDeeplinkService = JoopDeeplinkService;
|
|
267
|
+
//# sourceMappingURL=index.js.map
|
|
268
|
+
//# sourceMappingURL=index.js.map
|