@quietsapa/qsl 0.1.3 → 0.1.4
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 +24 -1
- package/README.md +5 -13
- package/dist/qsl.min.js +1 -1
- package/dist/qsl.min.js.map +1 -1
- package/dist/qsl.mjs +13 -5
- package/dist/qsl.mjs.map +1 -1
- package/dist/qsl.slim.min.js +1 -1
- package/dist/qsl.slim.min.js.map +1 -1
- package/package.json +1 -1
- package/src/core.js +7 -1
- package/src/plugins/events.js +26 -4
- package/src/presets/full.js +2 -0
package/dist/qsl.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qsl.min.js","sources":["../src/core.js","../src/types.js","../src/plugins/triggers.js","../src/presets/full.js","../src/plugins/logger.js","../src/plugins/events.js","../src/plugins/circ.js","../src/plugins/conditions.js"],"sourcesContent":["export default {\n /**\n * Constants\n */\n VERSION: '0.1.3',\n PREFIX: 'qsl-',\n FLOW_TYPE: {\n DEFAULT: 'default',\n ORDERED: 'ordered',\n },\n FLOW_STATE: { \n READY: 'READY',\n RUNNING: 'RUNNING',\n COMPLETED: 'COMPLETED'\n },\n FLOW_OPTIONS: {\n delay: 0,\n priority: 0,\n between: null,\n trigger: null,\n condition: null,\n beforeStart: null,\n onComplete: null,\n group: null,\n paused: false,\n preload: false,\n fireEvents: true,\n depends: []\n },\n EVENTS: {\n STARTED: 'QSL:started',\n COMPLETED: 'QSL:completed',\n ERROR: 'QSL:error',\n FLOW_STARTED: 'QSL:flow:started',\n FLOW_COMPLETED: 'QSL:flow:completed',\n ALL_COMPLETED: 'QSL:all:completed',\n SKIPPED: 'QSL:skipped',\n DOMREADY: 'QSL:domready',\n LOADED: 'QSL:loaded',\n },\n LIFECYCLE: {\n DOMREADY: document.readyState === 'interactive' || document.readyState === 'complete',\n LOADED: false,\n },\n CALLBACK: 'QSLReady',\n /**\n * Properties\n */\n types: new Map(), // Map to store custom resource types\n flows: new Map(), // Map to store flows\n flowOptions: new Map(), // Map to store flow options\n flowGroups: new Map(), // Map to store flow groups\n currentProcessPerFlow: new Map(), // Map to store current process per flow (flowId -> processId)\n\n pendingFlows: new Set(), // Set to store pending flows\n pendingProcesses: new Set(), // Set to store pending processes\n completedProcesses: new Set(), // Set to store completed processes\n loadActions: new Set(), // Set to store before load triggers\n initActions: new Set(), // Set to store init triggers\n addProcessFilters: new Set(), // Set to store add triggers\n completedFlowsActions: new Set(), // Set to store completed flows actions\n flowIdFilters: new Set(), // Set to store flowId filters\n conditionHandlers: new Set(), // Set to store condition handlers\n triggerHandlers: new Set(), // Set to store trigger handlers\n processCompleteActions: new Set(), // Set to store process completion actions\n allCompleteActions: new Set(), // Set to store all flows completion actions\n resetActions: new Set(), // Set to store reset actions\n handlerCallbacksFilters: new Set(), // Set to store handler callbacks filters\n\n onAllComplete: null, // Callback for all flows completion\n globalResolve: null, // Global resolve function\n logger: null, // Logger instance\n\n hasStarted: false, // Flag to check if QSL has started,\n eventsEnabled: false, // Flag to check if events are enabled\n initialized: false, // Flag to check if QSL is initialized\n completing: false, // Flag to check if QSL is completing\n autoReset: true, // Whether reset() runs automatically once every flow completes\n\n globalBetween: 0, // Global delay between processes\n\n /**\n * Initialize the QSL library.\n * @returns {Promise<this>}\n */\n async init() {\n if (this.initialized) return this;\n\n const loaderScript = document.currentScript;\n\n /* Check if QSL is already initialized */\n window.__QSL__ = window.__QSL__ || this;\n\n /* Check DOMContentLoaded state */\n if (document.readyState === 'interactive' || document.readyState === 'complete') {\n this.LIFECYCLE.DOMREADY = true;\n } else {\n document.addEventListener('DOMContentLoaded', () => this.LIFECYCLE.DOMREADY = true, { once: true });\n }\n\n /* Check window load state */\n if (document.readyState === 'complete') {\n this.LIFECYCLE.LOADED = true;\n } else {\n window.addEventListener('load', () => this.LIFECYCLE.LOADED = true, { once: true });\n }\n\n /* Register default type: console */\n this.registerType('console', (process) => {\n return new Promise((resolve) => {\n process.onBeforeStart?.();\n setTimeout(() => {\n if ( process.message ) this.log( process.message, { timestamp: Date.now() } );\n process.onComplete?.();\n resolve();\n }, process.delay || 0);\n });\n });\n\n /**\n * Custom event listeners for logging and error handling\n */\n window.addEventListener('QSL:log', (e) => this.log(e.detail.type, e.detail.config.id));\n window.addEventListener('QSL:error', (e) => this.error(e.detail.type, e.detail.error, e.detail.config.id));\n\n /**\n * Load init triggers\n */\n if ( this.initActions.size ) {\n for ( const cb of this.initActions ) {\n if ( typeof cb === 'function' ) await cb.call(this);\n }\n }\n \n this.initialized = true;\n\n /**\n * Check if async loading is enabled\n */\n const url = loaderScript && loaderScript.src ? new URL(loaderScript.src, document.baseURI) : null;\n if (!url || url.searchParams.get('async') !== 'true') return this;\n\n /**\n * Callback on async loading with default callback name\n */\n const callback = url.searchParams.get('callback') || this.CALLBACK;\n if (typeof window[callback] === 'function') window[callback]();\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n \n },\n \n /**\n * Register a plugin to QSL.\n *\n * @param {Function} plugin - The plugin function to register.\n * @param {...any} args - Additional arguments passed to the plugin.\n * @returns {this}\n */\n use(plugin, ...args) {\n if (typeof plugin === 'function') plugin(this, ...args);\n return this;\n },\n\n /**\n * Add a process config to a flow.\n * Handles process-level dependencies separately from flow-level logic.\n *\n * @param {Object} config - The process configuration object.\n * @param {string|boolean|null} [flowId=null] - The flow ID or true for ordered, or null for default.\n * @returns {this}\n */\n add(config, flowId = null) {\n if (!config || typeof config !== 'object') return this;\n\n /* Generate ID and default to process state */\n config.id = config.id ? this.PREFIX + config.id : this.PREFIX + Math.random().toString(36).slice(2);\n config.skipped = false;\n\n /* Sanitize config and set default type */\n if (!config.type) config.type = 'console';\n\n /* Register process-level dependencies */\n if (Array.isArray(config.depends)) config.depends = [...new Set(config.depends)];\n\n /* Filter flowId and config by addProcessFilters */\n if ( this.addProcessFilters.size ) {\n for ( const cb of this.addProcessFilters ) {\n if ( typeof cb === 'function' ) [flowId, config] = cb.call(this, flowId, config);\n }\n }\n\n /* Store flowId on process for quick lookup */\n const normalizedFlowId = this.normalizeFlowId(flowId);\n config.flowId = normalizedFlowId;\n\n /* Add to flow for flow-level execution */\n this.getOrCreateFlow(normalizedFlowId).push(config);\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Start loading all flows.\n *\n * @param {Object} [options={}]\n * @param {number|boolean} [options.between=false] - Global delay between processes.\n * @returns {Promise<this>}\n */\n async load({ between = false } = {}) {\n if (this.hasStarted) return;\n this.hasStarted = true;\n \n /**\n * Set global between\n */\n this.globalBetween = between;\n\n /**\n * Call load actions\n */\n for ( const cb of this.loadActions ) {\n if (typeof cb === 'function') cb.call(this);\n }\n\n /**\n * Return global promise\n */\n return new Promise((resolve) => {\n if (!this.flows.size) {\n this.reset();\n return resolve();\n }\n\n this.globalResolve = resolve;\n this.processFlows();\n });\n \n },\n\n /**\n * Reset all internal state and clear all flows/options.\n * \n * @returns {void}\n */\n reset() {\n /**\n * Call reset actions before clearing\n */\n if (this.resetActions.size) {\n for (const action of this.resetActions) {\n if (typeof action === 'function') action.call(this);\n }\n }\n\n /**\n * Clear run state only. Plugin registrations (types, condition and\n * trigger handlers, lifecycle hooks) survive, so processes added after\n * a completed run still behave the same way. Use destroy() to tear the\n * whole instance down.\n */\n this.flows.clear();\n this.flowOptions.clear();\n this.flowGroups.clear();\n this.pendingFlows.clear();\n this.pendingProcesses.clear();\n this.completedProcesses.clear();\n this.currentProcessPerFlow.clear();\n this.onAllComplete = null;\n this.globalResolve = null;\n this.hasStarted = false;\n this.globalBetween = 0;\n\n this.log('RESET');\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Tear the instance down completely: run state, plugin registrations and\n * registered types. After this, init() has to run again.\n *\n * @returns {this}\n */\n destroy() {\n this.reset();\n\n this.types.clear();\n this.initActions.clear();\n this.loadActions.clear();\n this.addProcessFilters.clear();\n this.completedFlowsActions.clear();\n this.flowIdFilters.clear();\n this.conditionHandlers.clear();\n this.triggerHandlers.clear();\n this.processCompleteActions.clear();\n this.allCompleteActions.clear();\n this.resetActions.clear();\n this.handlerCallbacksFilters.clear();\n\n this.logger = null;\n this.eventsEnabled = false;\n this.initialized = false;\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Set the logger instance.\n *\n * @param {Object|Function} logger - Logger instance or function.\n * @returns {this}\n */\n setLogger(logger) {\n if (logger && ( typeof logger === 'function' || typeof logger === 'object' ) ) this.logger = logger;\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Set a callback to run when all flows/processes are complete.\n *\n * @param {Function} callback - The callback function.\n * @returns {this}\n */\n setOnAllComplete(callback) {\n this.onAllComplete = typeof callback === 'function' ? callback : null;\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Enable DOM events for process/flow lifecycle.\n * @returns {this}\n */\n useEvents() {\n this.eventsEnabled = true;\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Log a message using the custom logger if set.\n *\n * @param {string} type - Log type.\n * @param {...any} args - Additional log arguments.\n */\n log(type, ...args) {\n if (this.logger && typeof this.logger.log === 'function') this.logger.log(type, ...args);\n },\n\n /**\n * Log an error using the custom logger if set.\n * \n * @param {string} type - Error type.\n * @param {...any} args - Additional error arguments.\n */\n error(type, ...args) {\n if (this.logger && typeof this.logger.error === 'function') this.logger.error(type, ...args);\n },\n\n /**\n * Fire a DOM event if events are enabled.\n * \n * @param {string} event - Event name.\n * @param {Object} detail - Event detail object.\n */\n fire(event, detail) {\n if (this.eventsEnabled && this.EVENTS[event]) {\n window.dispatchEvent(new CustomEvent(this.EVENTS[event], { detail }));\n }\n },\n\n /**\n * Normalize the flow ID.\n * \n * @param {string|boolean|null} flowId - The flow ID or true for ordered, or null for default.\n * @returns {string} Normalized flow ID.\n */\n normalizeFlowId(flowId) {\n if (flowId === true) {\n flowId = this.FLOW_TYPE.ORDERED;\n } else if (typeof flowId !== 'string') {\n flowId = this.FLOW_TYPE.DEFAULT;\n }\n return flowId;\n },\n\n /**\n * Register a custom resource type handler.\n *\n * @param {string} type - Resource type name.\n * @param {Function} handler - Handler function for the type.\n * @returns {this}\n */\n registerType(type, handler) {\n if (typeof type !== 'string' || typeof handler !== 'function') return this;\n this.types.set(type, handler);\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Register multiple custom resource types.\n *\n * @param {Array<{type: string, handler: Function}>|Object} types - Array or object of type definitions.\n * @returns {this}\n */\n registerTypes(types) {\n if (!types || typeof types !== 'object') return this;\n\n /* Accept both [{ type, handler }] and { name: handler } */\n const list = Array.isArray(types)\n ? types\n : Object.entries(types).map(([type, handler]) => (\n typeof handler === 'function' ? { type, handler } : handler\n ));\n\n for (const type of list) {\n if (type) this.registerType(type.type, type.handler);\n }\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Pause all flows in a group.\n * \n * @param {string} group - Group name.\n * @returns {this}\n */\n pauseGroup(group) {\n const flowGroup = this.flowGroups.get(group);\n if (!flowGroup) return this;\n for (const flowId of flowGroup) {\n this.setFlowOptions({ paused: true }, flowId);\n }\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Run all flows in a group.\n * \n * @param {string} group - Group name.\n * @returns {this}\n */\n runGroup(group) {\n const flowGroup = this.flowGroups.get(group);\n if (!flowGroup) return this;\n for (const flowId of flowGroup) {\n this.setFlowOptions({ paused: false }, flowId);\n this.runFlow(flowId);\n }\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Run a specific flow by id.\n *\n * @param {string} flowId - Flow ID.\n * @param {boolean} [withTrigger=false] - Whether to run with trigger logic.\n * @returns {this}\n */\n runFlow(flowId, withTrigger = false) {\n const processes = this.flows.get(flowId);\n const options = this.flowOptions.get(flowId);\n if (!processes || !options || options.status !== this.FLOW_STATE.READY) return this;\n this.processFlows(flowId, withTrigger);\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Get or create a flow.\n * \n * @param {string} flowId - Flow ID.\n * @returns {Array} The flow's process array.\n */\n getOrCreateFlow(flowId) {\n if (!this.flows.has(flowId)) {\n this.flows.set(flowId, []);\n this.flowOptions.set(flowId, { \n ...this.FLOW_OPTIONS, \n ordered: flowId === this.FLOW_TYPE.ORDERED, \n status: this.FLOW_STATE.READY \n });\n }\n return this.flows.get(flowId);\n },\n\n /**\n * Set or update options for a flow.\n * If depends is set, pauses the flow until dependencies are resolved.\n * \n * @param {Object} options - Flow options.\n * @param {string|boolean|null} [flowId=null] - Flow ID.\n * @returns {this}\n */\n setFlowOptions(options = {}, flowId = null) {\n /**\n * Normalize flow ID\n */\n flowId = this.normalizeFlowId(flowId);\n\n /**\n * Get or create flow\n */\n this.getOrCreateFlow(flowId);\n\n if (!options || typeof options !== 'object') return this;\n const prevOptions = this.flowOptions.get(flowId);\n\n /**\n * Pause flow if it has dependencies\n */\n if (Array.isArray(options.depends) && options.depends.length) {\n options.depends = [...new Set(options.depends)];\n options.paused = true;\n this.pendingFlows.add(flowId);\n }\n\n /**\n * Grouping flows\n */\n if (options.group) {\n if (!this.flowGroups.has(options.group)) this.flowGroups.set(options.group, new Set());\n this.flowGroups.get(options.group).add(flowId);\n }\n \n /**\n * Update options partially with fallbacks to previous state\n */\n this.flowOptions.set(flowId, { ...prevOptions, ...options });\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Check all pending flows and run those whose dependencies are now resolved.\n * \n * @returns {void}\n */\n checkPendingFlows() {\n if (!this.pendingFlows.size) return;\n for (const pendingFlowId of this.pendingFlows) {\n const pendingOptions = this.flowOptions.get(pendingFlowId);\n if (\n pendingOptions &&\n pendingOptions.depends &&\n pendingOptions.depends.every(depId => {\n const depOpt = this.flowOptions.get(this.normalizeFlowId(depId));\n return depOpt && depOpt.status === this.FLOW_STATE.COMPLETED;\n })\n ) {\n this.setFlowOptions({ paused: false }, pendingFlowId);\n this.pendingFlows.delete(pendingFlowId);\n this.runFlow(pendingFlowId);\n }\n }\n },\n\n /**\n * Check all pending processes and run those whose dependencies are now resolved.\n * \n * @returns {void}\n */\n checkPendingProcesses() {\n if (!this.pendingProcesses.size) return;\n for (const process of this.pendingProcesses) {\n const missingDeps = process.depends.filter(depId => {\n const hasProcess = Array.from(this.flows.values()).some(flow =>\n flow.some(p => p.id === this.PREFIX + depId)\n );\n return !this.completedProcesses.has(this.PREFIX + depId) && !hasProcess;\n });\n if (missingDeps.length) {\n this.pendingProcesses.delete(process);\n this.log('DEP_NOT_FOUND', process.id, `${missingDeps.join(', ')}`);\n process._depsResolved = true;\n process._triggered = true;\n if (process._waitResolve) process._waitResolve();\n continue;\n }\n const allDepsCompleted = process.depends.every(depId => this.completedProcesses.has(this.PREFIX + depId));\n if (allDepsCompleted) {\n this.pendingProcesses.delete(process);\n process._depsResolved = true;\n if (process._triggered && process._waitResolve) process._waitResolve();\n }\n }\n },\n\n /**\n * Check if all flows/processes are complete and resolve global promise if so.\n * \n * @returns {Promise<void>}\n */\n async maybeComplete() {\n if ( ! this.hasStarted ) return;\n\n /**\n * Check for pending flows missed dependencies \n */\n if ( this.pendingFlows.size ) {\n for (const pendingFlowId of this.pendingFlows) {\n const pendingOptions = this.flowOptions.get(pendingFlowId);\n if (\n pendingOptions &&\n pendingOptions.depends &&\n pendingOptions.depends.some(depId => !this.flowOptions.has(this.normalizeFlowId(depId)))\n ) {\n this.setFlowOptions({ status: this.FLOW_STATE.COMPLETED }, pendingFlowId);\n this.pendingFlows.delete(pendingFlowId);\n this.log('FLOW_DEP_SKIPPED', { flow: pendingFlowId, depends: `${pendingOptions.depends.filter(depId => !this.flowOptions.has(this.normalizeFlowId(depId))).join(', ')}` });\n }\n }\n }\n \n /**\n * Check completed flows\n */\n let flowsDone = this.flowOptions.size ? Array.from(this.flowOptions.values()).every(opt => opt.status === this.FLOW_STATE.COMPLETED) : false;\n\n /**\n * Completion hooks run even when some flow is still outstanding, so a\n * plugin can hold work back and release it here. With no hooks\n * registered this is exactly the old behaviour: done when every flow\n * is done.\n */\n let maybeComplete = flowsDone;\n\n /*\n * Filter maybeComplete by completedFlowsActions\n */\n if ( this.flows.size && this.completedFlowsActions.size ) {\n for ( const cb of this.completedFlowsActions ) {\n maybeComplete = cb.call(this, flowsDone, this.flows, this.flowOptions);\n }\n }\n\n if ( ! maybeComplete ) return;\n\n if (this.completing) return;\n this.completing = true;\n\n this.log('ALL_COMPLETED');\n this.fire('ALL_COMPLETED');\n\n this.onAllComplete?.();\n if (this.globalResolve !== null) this.globalResolve();\n\n /**\n * Call all flows completion actions\n */\n if (this.allCompleteActions.size) {\n for (const action of this.allCompleteActions) {\n if (typeof action === 'function') action.call(this);\n }\n }\n\n /**\n * Reset run state unless the caller opted out (e.g. for debugging)\n */\n if (this.autoReset) this.reset();\n this.completing = false;\n },\n\n /**\n * Process all flows and their dependencies.\n * \n * @param {string|null} [flowId=null] - Specific flow ID or null for all.\n * @param {boolean} [withTrigger=false] - Whether to run with trigger logic.\n * @returns {this}\n */\n processFlows(flowId = null, withTrigger = false) {\n if (!this.flows.size) return;\n\n /**\n * Run all flows if no specific flowId is provided\n */\n let flowIds = flowId ? [flowId] : Array.from(this.flows.keys());\n\n /**\n * Filter flowIds by flowIdFilters\n */\n if ( flowIds.length && this.flowIdFilters.size ) {\n for ( const cb of this.flowIdFilters ) {\n if ( typeof cb === 'function' ) flowIds = cb.call(this, flowIds);\n }\n }\n\n /**\n * Sort flows: flows without triggers first, then by priority\n */\n flowIds.sort((a, b) => {\n const aOpts = this.flowOptions.get(a);\n const bOpts = this.flowOptions.get(b);\n const aHasTrigger = aOpts?.trigger != null;\n const bHasTrigger = bOpts?.trigger != null;\n \n if (aHasTrigger && !bHasTrigger) return 1;\n if (!aHasTrigger && bHasTrigger) return -1;\n \n const aPriority = aOpts?.priority || 0;\n const bPriority = bOpts?.priority || 0;\n return bPriority - aPriority;\n });\n\n for (const fid of flowIds) {\n const options = this.flowOptions.get(fid);\n\n /**\n * Skip if missed options or flow is already completed\n */\n if (!options || options.status === this.FLOW_STATE.COMPLETED) continue;\n\n /**\n * Flow-level conditions\n */\n if ( this.getConditionStatus(options.condition) ) {\n this.setFlowOptions({ status: this.FLOW_STATE.COMPLETED }, fid);\n continue;\n }\n\n /**\n * Only process if not paused\n */\n if (options.paused) continue;\n\n /**\n * Logic for trigger on flow level\n */\n if ( flowId === null || ( flowId && ! withTrigger ) ) {\n if (options.trigger != null) {\n const trigger = this.getTriggerFunction(options.trigger, options);\n if (trigger) {\n this.setFlowOptions({ paused: true }, fid);\n let triggered = false;\n trigger(() => {\n if (triggered) return;\n triggered = true;\n this.setFlowOptions({ paused: false }, fid);\n this.runFlow(fid, true);\n });\n continue;\n }\n }\n }\n\n /**\n * Set flow to running state\n */\n this.setFlowOptions({ status: this.FLOW_STATE.RUNNING }, fid);\n\n /**\n * Run flows in parallel\n */\n (async () => {\n\n options.beforeStart?.();\n\n /**\n * Delay per flow\n */\n if (options.delay && options.delay > 0) {\n await new Promise(res => setTimeout(res, options.delay));\n }\n\n /**\n * Sort processes by priority\n */\n const processes = (this.flows.get(fid) || []).slice();\n processes.sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n /**\n * Preload scripts / styles\n */\n if ( (options.preload || options.prefetch ) && ! options.trigger ) {\n for (const p of processes) {\n if (p.trigger) continue;\n if ((p.type === 'script' && p.src) || (p.type === 'style' && p.href)) {\n try {\n const link = document.createElement('link');\n link.rel = options.preload ? 'preload' : 'prefetch';\n link.href = p.src || p.href;\n link.as = p.type === 'script' ? 'script' : 'style';\n if (p.crossOrigin) link.crossOrigin = p.crossOrigin;\n document.head.appendChild(link);\n } catch (e) {\n this.error('PRELOAD_ERROR', e, p.id);\n }\n }\n }\n }\n\n const between = (options.between !== undefined && options.between !== null)\n ? options.between\n : this.globalBetween;\n \n if (options.ordered) {\n /**\n * Ordered: await previous process\n */\n let prev = Promise.resolve();\n processes.forEach((process, idx) => {\n prev = prev.then(async () => {\n if (idx > 0 && between) await new Promise(res => setTimeout(res, between));\n await this.run(process);\n });\n });\n await prev;\n } else {\n /**\n * Unordered: run all processes in parallel\n */\n const promises = processes.map(async (process, idx) => {\n if (idx > 0 && between) await new Promise(res => setTimeout(res, between));\n return this.run(process);\n });\n await Promise.all(promises);\n }\n\n /**\n * Set flow to completed state\n */\n this.setFlowOptions({ status: this.FLOW_STATE.COMPLETED }, fid);\n options.onComplete?.();\n\n /**\n * Check for pending flows\n */\n this.checkPendingFlows();\n\n /**\n * Maybe complete the loading\n */\n this.maybeComplete();\n\n })();\n }\n\n /**\n * Cover skipped/empty batches that never start an async flow.\n */\n this.checkPendingFlows();\n this.maybeComplete();\n },\n\n /**\n * Execute a process based on its type.\n * \n * @param {Object} process - The process object.\n * @returns {Promise<any>}\n */\n async run(process) {\n /**\n * Skip if already running or completed\n */\n if (process._running || this.getConditionStatus(process.condition)) return;\n process._running = true;\n\n /**\n * Setup state\n */\n if (!process._waitPromise) {\n process._triggered = false;\n process._depsResolved = false;\n process._waitPromise = new Promise(res => process._waitResolve = res);\n }\n\n /**\n * Trigger logic for process\n */\n if (process.trigger != null) {\n const trigger = this.getTriggerFunction(process.trigger, process);\n if (trigger) {\n trigger(() => {\n process._triggered = true;\n if (process._depsResolved) process._waitResolve();\n });\n } else {\n process._triggered = true;\n }\n } else {\n process._triggered = true;\n }\n\n /**\n * Check dependencies\n */\n if (Array.isArray(process.depends) && process.depends.length) {\n const missingDeps = process.depends.filter(depId => {\n const hasProcess = Array.from(this.flows.values()).some(flow =>\n flow.some(p => p.id === this.PREFIX + depId)\n );\n return !this.completedProcesses.has(this.PREFIX + depId) && !hasProcess;\n });\n if (missingDeps.length) {\n this.log('DEP_NOT_FOUND', process.id, `${missingDeps.join(', ')}`);\n process._depsResolved = true;\n process._triggered = true;\n if (process._waitResolve) process._waitResolve();\n } else {\n const allDepsCompleted = process.depends.every(depId => this.completedProcesses.has(this.PREFIX + depId));\n if (!allDepsCompleted) {\n this.pendingProcesses.add(process);\n } else {\n process._depsResolved = true;\n if (process._triggered) process._waitResolve();\n }\n }\n } else {\n process._depsResolved = true;\n if (process._triggered) process._waitResolve();\n }\n\n /**\n * Wait for both trigger and dependencies to be resolved\n */\n await process._waitPromise;\n\n return this.execute(process);\n },\n\n /**\n * Check the condition option and return true if the condition fails.\n * \n * @param {string|Function|boolean} conditionOption - The condition option.\n * @returns {boolean} True if the condition fails, false otherwise.\n */\n getConditionStatus(opt) {\n if (opt == null) return false;\n \n if (Array.isArray(opt)) {\n return opt.some(c => this.getConditionStatus(c));\n }\n \n if (typeof opt === 'object' && opt.operator) {\n const { operator, conditions } = opt;\n if (!Array.isArray(conditions)) return false;\n \n if (operator === 'or') {\n return conditions.every(c => this.getConditionStatus(c));\n } else if (operator === 'and') {\n return conditions.some(c => this.getConditionStatus(c));\n }\n return false;\n }\n \n if (typeof opt === 'function' && !opt()) return true;\n if (typeof opt === 'boolean' && !opt) return true;\n\n if (this.conditionHandlers.size) {\n for (const h of this.conditionHandlers) {\n if (typeof h === 'function') {\n const r = h.call(this, opt);\n if (r === true || r === false) return r;\n }\n }\n }\n\n return false;\n },\n\n /**\n * Parse and return a trigger function based on the trigger option.\n * \n * @param {string|Function|boolean} opt - The trigger option.\n * @param {Object} o - The associated process or flow object.\n * @returns {Function|null} The trigger function or null if no trigger function is found.\n */\n getTriggerFunction(opt, o) {\n if (opt == null) return null;\n \n if (typeof opt === 'function') {\n return (cb) => opt(cb);\n }\n \n /**\n * Return trigger function for array of triggers\n */\n if (Array.isArray(opt)) {\n return (cb) => {\n const vd = opt.map(t => this.getTriggerFunction(t, o)).filter(tF => tF);\n if (vd.length === 0) {\n cb();\n return;\n }\n let f = 0;\n const fCb = () => { if (++f === vd.length) cb(); };\n vd.forEach(tF => tF(fCb));\n };\n }\n \n /**\n * Return trigger function for object with operator and triggers\n */\n if (typeof opt === 'object' && opt.operator) {\n const { operator, triggers } = opt;\n if (!Array.isArray(triggers)) return null;\n \n if (operator === 'or') {\n return (cb) => {\n const vd = triggers.map(t => this.getTriggerFunction(t, o)).filter(tF => tF);\n if (vd.length === 0) {\n cb();\n return;\n }\n let f = false;\n const fCb = () => { if (!f) { f = true; cb(); } };\n vd.forEach(tF => tF(fCb));\n };\n } else if (operator === 'and') {\n return (cb) => {\n const vd = triggers.map(t => this.getTriggerFunction(t, o)).filter(tF => tF);\n if (vd.length === 0) {\n cb();\n return;\n }\n let f = 0;\n const fCb = () => { if (++f === vd.length) cb(); };\n vd.forEach(tF => tF(fCb));\n };\n }\n return null;\n }\n\n /**\n * Return trigger function from trigger handlers\n */\n if (this.triggerHandlers.size) {\n for (const h of this.triggerHandlers) {\n if (typeof h === 'function') {\n const r = h.call(this, opt, o);\n if (r && typeof r === 'function') return r;\n }\n }\n }\n \n /**\n * Return interaction trigger function if opt is true or 'interaction'\n */\n if (opt === true || opt === 'interaction') {\n return (cb) => this.waitForInteraction(cb);\n }\n \n return null;\n },\n\n /**\n * Wait for user interaction before running a callback (for interaction phase).\n * This is the default fallback trigger.\n * \n * @param {Function} cb - The callback to run after user interaction.\n * @returns {void}\n */\n waitForInteraction(cb) {\n ['click', 'keydown', 'wheel', 'mousedown', 'mousemove', 'touchstart'].forEach(e => window.addEventListener(e, () => cb(), { once: true, passive: true }));\n },\n\n /**\n * Execute the process based on its type.\n * \n * @param {Object} process - The process object.\n * @returns {Promise<any>}\n */\n async execute(process) {\n const finishProcess = async () => {\n /**\n * Call process completion actions\n */\n if (this.processCompleteActions.size) {\n for (const action of this.processCompleteActions) {\n if (typeof action === 'function') action.call(this, process);\n }\n }\n this.completedProcesses.add(process.id);\n process._running = false;\n this.checkPendingProcesses();\n };\n if (process.skipped) {\n this.fire('SKIPPED', { ...process, id: process.id });\n finishProcess();\n return;\n }\n const handler = this.types.get(process.type);\n if (!handler) {\n this.log('UNKNOWN_TYPE', process.type, process.id);\n finishProcess();\n return;\n }\n this.fire('STARTED', { ...process, id: process.id });\n \n /**\n * Build handler callbacks from filters\n */\n const callbacks = {};\n if (this.handlerCallbacksFilters.size) {\n for (const filter of this.handlerCallbacksFilters) {\n if (typeof filter === 'function') {\n const pluginCallbacks = filter.call(this, process);\n if (pluginCallbacks && typeof pluginCallbacks === 'object') {\n Object.assign(callbacks, pluginCallbacks);\n }\n }\n }\n }\n \n /**\n * Execute handler and handle completion or error\n */\n return handler(process, callbacks)\n .then(() => {\n this.fire('COMPLETED', { ...process, id: process.id });\n finishProcess();\n })\n .catch(() => {\n this.fire('ERROR', { ...process, id: process.id });\n finishProcess();\n });\n }\n};","/**\n * Get cache-bypass suffix for a URL.\n */\nconst bypassSuffix = (source, bypassCache) =>{\n return bypassCache ? ( ( source.includes('?') ? '&' : '?') + Date.now() ) : '';\n}\n\n/**\n * Log a message.\n */\nconst log = (detail) => {\n window.dispatchEvent(new CustomEvent('QSL:log', { detail }));\n}\n\n/**\n * Log an error.\n */\nconst error = (detail) => {\n window.dispatchEvent(new CustomEvent('QSL:error', { detail }));\n}\n\n/**\n * Render an element.\n */\nconst render = (config, callbacks = {}) => {\n return new Promise(async (resolve) => {\n const { flowId, tag, id, delay, data, onBeforeStart, onComplete, onError, footer, dom, onElement, onCustomResolve } = config;\n if (!flowId || !tag || !id) {\n resolve();\n return;\n }\n try {\n if (onBeforeStart) await onBeforeStart(config);\n log({ tag, type: 'PROCESS_STARTED', config });\n if (delay) await new Promise(res => setTimeout(res, delay));\n let el = document.createElement(tag);\n onElement?.(el, config);\n\n callbacks.registerProcessElement?.(el, config);\n\n if (data && typeof data === 'object') {\n for (const [key, value] of Object.entries(data)) {\n el.setAttribute(`data-${key.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/[^a-z0-9_-]/g, '').replace(/^-/, '')}`, String(value));\n }\n }\n\n if (!onCustomResolve) {\n el.onload = () => {\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n };\n }\n el.onerror = (e) => {\n error({ tag, type: 'PROCESS_FAILED', config });\n onError?.(e);\n resolve(e);\n };\n if (dom) {\n (footer ? document.body : document.head).appendChild(el);\n }\n onCustomResolve?.({ el, config, resolve });\n } catch (e) {\n error({ tag, type: 'PROCESS_FAILED', config, error: e });\n onError?.(e);\n resolve(e);\n }\n });\n}\n\n/**\n * Render an inline script.\n */\nconst InlineScript = {\n type: 'inline-script',\n handler: (config, callbacks) => { \n let storedResolve = null;\n let alreadyFired = false;\n const eventName = `QSL:inline-script:completed:${config.id}`;\n const resolveProcess = () => {\n log({ tag: 'inline-script', type: 'INLINE_SCRIPT_SUCCESS', config });\n log({ tag: 'inline-script', type: 'PROCESS_COMPLETED', config });\n config?.onComplete?.();\n storedResolve?.();\n };\n const normalizedConfig = {\n ...config,\n code: config.code?.replace(/<script.*?>|<\\/script>/gi, '')\n };\n return render({\n ...normalizedConfig,\n tag: 'script',\n dom: true,\n onElement: (el, config) => {\n const { code, module, id, flowId } = config;\n if (code) el.textContent = code;\n if (module) {\n el.type = 'module';\n const originalCode = el.textContent;\n const fid = JSON.stringify(String(flowId));\n const pid = JSON.stringify(String(id));\n const evt = JSON.stringify(String(eventName));\n const wrappedCode = `(function(){window.__QSL__.currentProcessPerFlow.set(${fid},${pid});try{${originalCode}}finally{window.__QSL__.currentProcessPerFlow.delete(${fid});window.dispatchEvent(new Event(${evt}));}})();`;\n el.textContent = wrappedCode;\n const handler = () => {\n window.removeEventListener(eventName, handler);\n if (storedResolve) {\n resolveProcess();\n } else { \n alreadyFired = true;\n }\n };\n window.addEventListener(eventName, handler);\n }\n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { module } = config;\n storedResolve = resolve;\n if (module && alreadyFired) {\n resolveProcess();\n } else if (!module) {\n queueMicrotask(() => {\n if (storedResolve === resolve) resolveProcess();\n });\n }\n }\n }, callbacks);\n }\n};\n\n/**\n * Render a script element.\n */\nconst Script = {\n type: 'script',\n handler: (config, callbacks) => { \n return render({\n ...config,\n tag: 'script',\n dom: true,\n onElement: (el, { src, module, async, defer, crossOrigin, integrity, bypassCache }) => {\n if (module) el.type = 'module';\n if (async) el.async = async;\n if (defer) el.defer = defer;\n if (crossOrigin) el.crossOrigin = crossOrigin;\n if (integrity) el.integrity = integrity;\n if (src) el.src = src + bypassSuffix(src, bypassCache);\n }\n }, callbacks);\n }\n};\n\n/**\n * Render an inline style.\n */\nconst InlineStyle = {\n type: 'style',\n handler: (config, callbacks) => {\n const normalizedConfig = {\n ...config,\n code: config.code?.replace(/<style.*?>|<\\/style>/gi, '')\n };\n return render({\n ...normalizedConfig,\n tag: 'style',\n dom: true,\n onElement: (el, { code }) => {\n if (code) el.textContent = code;\n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { tag, onComplete } = config;\n log({ tag, type: 'INLINE_STYLE_SUCCESS', config });\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n }\n }, callbacks);\n }\n};\n\n/**\n * Render a stylesheet.\n */\nconst Stylesheet = {\n type: 'stylesheet',\n handler: (config, callbacks) => {\n return render({\n ...config,\n tag: 'link',\n dom: true,\n onElement: (el, { href, crossOrigin, bypassCache }) => {\n el.rel = 'stylesheet';\n if (crossOrigin) el.crossOrigin = crossOrigin;\n el.href = href + bypassSuffix(href, bypassCache);\n }\n }, callbacks);\n }\n};\n\n/**\n * Render a pixel.\n */\nconst Pixel = {\n type: 'pixel',\n handler: (config, callbacks) => {\n return render({\n ...config,\n tag: 'img',\n dom: true,\n onElement: (el, { style = { display: 'none' }, dom, src, bypassCache }) => {\n if ( ! dom ) el = new window.Image();\n el.src = src + bypassSuffix(src, bypassCache);\n el.width = 1;\n el.height = 1;\n if ( style && typeof style === 'object' ) {\n for (const [key, value] of Object.entries(style)) {\n el.style.setProperty(key, value);\n }\n }\n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { tag, dom, onComplete } = config;\n const resolver = () => {\n log({ tag, type: 'IMAGE_LOADED', config });\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n };\n ! dom ? resolver() : el.onload = () => resolver();\n }\n }, callbacks);\n }\n};\n\n/**\n * Render a custom element.\n */\nconst Shadow = {\n type: 'shadow',\n handler: (config, callbacks) => {\n return render({\n ...config,\n onBeforeStart: async ({ tag }) => await window.customElements.whenDefined(tag),\n onElement: (el, { shadowData }) => {\n el.data = shadowData || {};\n if (shadowData?.hidden) el.setAttribute('hidden', ''); \n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { tag, shadowData, onComplete, onError } = config;\n const resolver = () => {\n const selector = shadowData?.container;\n let container = null;\n if (selector === 'body') {\n container = document.body;\n } else if (typeof selector === 'string' && selector) {\n try {\n container = document.querySelector(selector);\n } catch (e) {\n container = null;\n }\n }\n if (!container) {\n const err = new Error(`Container not found: ${selector}`);\n error({ tag, type: 'SHADOW_FAILED', config, error: err });\n onError?.(err);\n resolve(err);\n return;\n }\n shadowData?.position === 'top' ? container.insertBefore(el, container.firstChild) : container.appendChild(el);\n log({ tag, type: 'SHADOW_SUCCESS', config });\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n };\n if (document.readyState === 'interactive' || document.readyState === 'complete') {\n resolver();\n } else {\n document.addEventListener('DOMContentLoaded', resolver, { once: true });\n }\n }\n }, callbacks);\n }\n}\n\n/**\n * Render an HTML element.\n */\nconst HTML = {\n type: 'html',\n handler: (config, callbacks) => {\n return render({\n ...config,\n dom: true,\n onElement: (el, { html = '', id = '', className = '', style = {} }) => {\n if (html) el.innerHTML = html;\n if (id) el.id = id;\n if (className) el.className = Array.isArray(className) ? className.join(' ') : className;\n if ( style && typeof style === 'object' ) {\n for (const [key, value] of Object.entries(style)) {\n el.style.setProperty(key, value);\n }\n }\n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { tag, onComplete } = config;\n log({ tag, type: 'HTML_SUCCESS', config });\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n }\n }, callbacks);\n }\n};\n\n/**\n * Default types for QSL.\n */\nexport { Script, Stylesheet, InlineScript, InlineStyle, Pixel, Shadow, HTML };","/**\n * Built-in trigger handlers.\n *\n * A trigger handler receives the raw trigger option and the flow/process it\n * belongs to, and returns a function `(cb) => void` that invokes `cb` once the\n * trigger fires. Returning `null` means \"not my trigger\" and lets the next\n * registered handler try.\n */\n\n/**\n * Read the argument part of a prefixed trigger option.\n *\n * Uses `slice` rather than `split(':')` so that arguments containing colons\n * (CSS pseudo-classes, media queries, URLs) survive intact.\n *\n * @param {string} opt - Full trigger option, e.g. `hover:.btn:first-child`.\n * @param {string} prefix - Prefix including the colon, e.g. `hover:`.\n * @returns {string} The argument, e.g. `.btn:first-child`.\n */\nconst arg = (opt, prefix) => opt.slice(prefix.length);\n\n/**\n * Check whether an option is a string starting with the given prefix.\n *\n * @param {*} opt - Trigger option.\n * @param {string} prefix - Prefix including the colon.\n * @returns {boolean}\n */\nconst isPrefixed = (opt, prefix) => typeof opt === 'string' && opt.startsWith(prefix);\n\n/**\n * Resolve an element now, or once it is inserted into the document.\n *\n * `appears:` and `visible:` may reference elements that are rendered later, so\n * a plain `querySelector` at registration time is not enough.\n *\n * @param {string} selector - CSS selector.\n * @param {Function} cb - Called with the element once it exists.\n * @returns {void}\n */\nconst whenElement = (selector, cb) => {\n let el = null;\n try {\n el = document.querySelector(selector);\n } catch (e) {\n /* Invalid selector: fail open so the flow is never stuck. */\n cb(null);\n return;\n }\n\n if (el) {\n cb(el);\n return;\n }\n\n if (typeof MutationObserver !== 'function') {\n cb(null);\n return;\n }\n\n const root = document.body || document.documentElement;\n if (!root) {\n cb(null);\n return;\n }\n\n const observer = new MutationObserver(() => {\n const found = document.querySelector(selector);\n if (found) {\n observer.disconnect();\n cb(found);\n }\n });\n observer.observe(root, { childList: true, subtree: true });\n};\n\n/**\n * `load` - fires on the window load event.\n * @param {Object} QSL\n */\nexport function loadTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (opt !== 'load') return null;\n return (cb) => {\n if (document.readyState === 'complete') {\n cb();\n } else {\n window.addEventListener('load', () => cb(), { once: true });\n }\n };\n });\n}\n\n/**\n * `idle` - fires when the browser is idle.\n * @param {Object} QSL\n */\nexport function idleTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (opt !== 'idle') return null;\n return (cb) => {\n if (typeof window.requestIdleCallback === 'function') {\n window.requestIdleCallback(() => cb());\n } else {\n setTimeout(() => cb(), 200);\n }\n };\n });\n}\n\n/**\n * `domready` - fires on DOMContentLoaded.\n *\n * `interactive` means DOMContentLoaded has already fired, so a listener added\n * at that point would never run.\n *\n * @param {Object} QSL\n */\nexport function domReadyTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (opt !== 'domready') return null;\n return (cb) => {\n if (document.readyState === 'interactive' || document.readyState === 'complete') {\n cb();\n } else {\n document.addEventListener('DOMContentLoaded', () => cb(), { once: true });\n }\n };\n });\n}\n\n/**\n * `delay:<ms>` - fires after a timeout.\n * @param {Object} QSL\n */\nexport function delayTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (!isPrefixed(opt, 'delay:')) return null;\n const ms = parseInt(arg(opt, 'delay:'), 10);\n return (cb) => setTimeout(cb, Number.isFinite(ms) && ms > 0 ? ms : 0);\n });\n}\n\n/**\n * `hover:<selector>` - fires when the pointer moves over the element.\n * @param {Object} QSL\n */\nexport function hoverTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (!isPrefixed(opt, 'hover:')) return null;\n const selector = arg(opt, 'hover:');\n return (cb) => {\n whenElement(selector, (el) => {\n if (!el) {\n cb();\n return;\n }\n el.addEventListener('mouseover', () => cb(), { once: true, passive: true });\n });\n };\n });\n}\n\n/**\n * `visible:<selector>` - fires when the element intersects the viewport.\n * @param {Object} QSL\n */\nexport function visibleTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (!isPrefixed(opt, 'visible:')) return null;\n const selector = arg(opt, 'visible:');\n return (cb) => {\n whenElement(selector, (el) => {\n if (!el || typeof IntersectionObserver !== 'function') {\n cb();\n return;\n }\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n observer.disconnect();\n cb();\n return;\n }\n }\n });\n observer.observe(el);\n });\n };\n });\n}\n\n/**\n * `appears:<selector>` - fires when the element is inserted into the DOM.\n * @param {Object} QSL\n */\nexport function appearsTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (!isPrefixed(opt, 'appears:')) return null;\n const selector = arg(opt, 'appears:');\n return (cb) => whenElement(selector, () => cb());\n });\n}\n\n/**\n * `media:<query>` - fires when the media query matches, now or later.\n * @param {Object} QSL\n */\nexport function mediaQueryTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt, o) {\n if (!isPrefixed(opt, 'media:')) return null;\n const query = arg(opt, 'media:');\n return (cb) => {\n if (!query.length || typeof window.matchMedia !== 'function') {\n if (o) o.skipped = true;\n cb();\n return;\n }\n const mql = window.matchMedia(query);\n if (mql.matches) {\n cb();\n return;\n }\n const handler = (e) => {\n if (!e.matches) return;\n mql.removeEventListener('change', handler);\n cb();\n };\n mql.addEventListener('change', handler);\n };\n });\n}\n\n/**\n * Register every built-in trigger handler.\n * @param {Object} QSL\n */\nexport default function (QSL) {\n loadTrigger(QSL);\n idleTrigger(QSL);\n domReadyTrigger(QSL);\n delayTrigger(QSL);\n hoverTrigger(QSL);\n visibleTrigger(QSL);\n appearsTrigger(QSL);\n mediaQueryTrigger(QSL);\n}\n","import core from '../core.js';\n\nimport { Script, InlineScript, InlineStyle, Stylesheet, Pixel, Shadow, HTML } from '../types.js';\n\nimport { mediaQueryCondition, languageCondition, timezoneCondition, urlCondition, userAgentCondition } from '../plugins/conditions.js';\nimport { loadTrigger, idleTrigger, domReadyTrigger, delayTrigger, hoverTrigger, visibleTrigger, appearsTrigger, mediaQueryTrigger } from '../plugins/triggers.js';\n\nimport logger from '../plugins/logger.js';\nimport events from '../plugins/events.js';\nimport circ from '../plugins/circ.js';\n\ncore\n .registerTypes([Script, InlineScript, InlineStyle, Stylesheet, Pixel, Shadow, HTML])\n\n .use(logger)\n .use(events)\n .use(circ)\n\n .use(mediaQueryCondition)\n .use(languageCondition)\n .use(timezoneCondition)\n .use(urlCondition)\n .use(userAgentCondition)\n\n .use(loadTrigger)\n .use(idleTrigger)\n .use(domReadyTrigger)\n .use(delayTrigger)\n .use(hoverTrigger)\n .use(visibleTrigger)\n .use(appearsTrigger)\n .use(mediaQueryTrigger)\n\n .init();","export default function(QSL) {\n\n QSL.initActions.add(function() {\n \n QSL.logger = {\n VERSION: 'qsl-logger',\n LOG: {\n LOGGER_LOADED: '[QSL] Logger loaded',\n LOGGER_LOAD_ERROR: '[QSL] Logger load error:',\n UNKNOWN_TYPE: '[QSL] Unknown type:',\n PROCESS_STARTED: '[QSL] Process started:',\n PROCESS_COMPLETED: '[QSL] Process completed:',\n PROCESS_FAILED: '[QSL] Process failed:',\n STYLESHEET_STARTED: '[QSL] Stylesheet loading:',\n STYLESHEET_LOADED: '[QSL] Stylesheet loaded:',\n STYLESHEET_FAILED: '[QSL] Stylesheet failed to load:',\n INLINE_SCRIPT_STARTED: '[QSL] Inline script loading:',\n INLINE_SCRIPT_SUCCESS: '[QSL] Inline script loaded:',\n INLINE_SCRIPT_ERROR: '[QSL] Inline script load error:',\n INLINE_STYLE_STARTED: '[QSL] Inline style loading:',\n INLINE_STYLE_SUCCESS: '[QSL] Inline style loaded:',\n INLINE_STYLE_ERROR: '[QSL] Inline style load error:',\n IMAGE_STARTED: '[QSL] Image pixel loading:',\n IMAGE_LOADED: '[QSL] Image pixel loaded:',\n IMAGE_FAILED: '[QSL] Image pixel failed:',\n SHADOW_STARTED: '[QSL] Shadow element loading:',\n SHADOW_SUCCESS: '[QSL] Shadow element loaded:',\n SHADOW_FAILED: '[QSL] Shadow element failed:',\n HTML_STARTED: '[QSL] HTML element loading:',\n HTML_SUCCESS: '[QSL] HTML element loaded:',\n HTML_FAILED: '[QSL] HTML element failed:',\n PRELOAD_ERROR: '[QSL] Preload error:',\n FLOW_DEP_SKIPPED: '[QSL] Flow dependency missed:',\n DEP_NOT_FOUND: '[QSL] Dependency not found:',\n RESET: '[QSL] Global reset',\n ALL_COMPLETED: '[QSL] Loading is completed',\n },\n log(type, ...args) {\n if (this.LOG[type]) {\n console.log(this.LOG[type], ...args, { timestamp: Date.now() });\n } else {\n console.log('[QSL] ' + type, ...args);\n }\n },\n error(type, ...args) {\n if (this.LOG[type]) {\n console.error(this.LOG[type], ...args);\n } else {\n console.error('[QSL] ' + type, ...args);\n }\n }\n };\n \n });\n\n}","/**\n * Track events when a process completes.\n * @param {*} QSL \n */\nexport default function(QSL) {\n const customEvents = new Map();\n const processElementMap = new WeakMap();\n let documentListener = null;\n let windowListener = null;\n let isIntercepting = false;\n\n /**\n * Normalize script URL for comparison (remove protocol, domain, query params, hash).\n * @param {string} url - Script URL or path\n * @returns {string} - Normalized path\n */\n const normalizeScriptPath = (u) => {\n if (!u) return '';\n try {\n return u.includes('://') ? new URL(u).pathname : u.split('?')[0].split('#')[0];\n } catch (e) {\n return u.split('?')[0].split('#')[0];\n }\n };\n\n /**\n * Initialize event interception when QSL loads.\n */\n QSL.loadActions.add(function() {\n if (isIntercepting) return;\n \n documentListener = document.addEventListener;\n windowListener = window.addEventListener;\n isIntercepting = true;\n\n const iterator = (type, eventType, changeEventName) => {\n let currentScriptId = null;\n let targetFlowId = null;\n \n /**\n * Priority 1: Check document.currentScript for current process ID and flow ID.\n */\n if (document.currentScript) {\n const processElement = processElementMap.get(document.currentScript);\n if (processElement) {\n currentScriptId = processElement.processId;\n targetFlowId = processElement.flowId;\n }\n }\n \n /**\n * Priority 2: Check currentProcessPerFlow map for current process ID and flow ID.\n */\n if (!currentScriptId && this.currentProcessPerFlow.size) {\n for (const [flowId, processId] of this.currentProcessPerFlow) {\n if (processId) {\n currentScriptId = processId;\n targetFlowId = flowId;\n break;\n }\n }\n }\n \n /**\n * Priority 3: Use Error stack trace only when currentScript is null.\n */\n if (!currentScriptId) {\n const stack = new Error().stack;\n if (stack) {\n const lines = stack.split('\\n');\n // Skip first 2 lines (Error and iterator function)\n for (let i = 2; i < lines.length; i++) {\n const match = lines[i].match(/([^()\\s]+\\.js(?:\\?[^:)]*)?):\\d+(?::\\d+)?/);\n if (match) {\n const file = match[1];\n const qIndex = file.indexOf('?');\n const stackFile = qIndex === -1 ? file.trim() : file.slice(0, qIndex).trim();\n \n if (stackFile) {\n // Normalize: remove query/hash, extract pathname from URL\n const qIdx = stackFile.indexOf('?');\n const hIdx = stackFile.indexOf('#');\n const endIdx = qIdx === -1 ? (hIdx === -1 ? stackFile.length : hIdx) : (hIdx === -1 ? qIdx : Math.min(qIdx, hIdx));\n let normalizedFile = stackFile.slice(0, endIdx);\n try {\n if (normalizedFile.includes('://')) {\n normalizedFile = new URL(normalizedFile).pathname;\n }\n } catch (e) {}\n const lastSlash = normalizedFile.lastIndexOf('/');\n const fileName = lastSlash === -1 ? normalizedFile : normalizedFile.slice(lastSlash + 1);\n \n for (const [flowId, processes] of this.flows) {\n for (const process of processes) {\n if (process.src && process.type === 'script') {\n const normalizedSrc = normalizeScriptPath(process.src);\n const srcLastSlash = normalizedSrc.lastIndexOf('/');\n const srcFileName = srcLastSlash === -1 ? normalizedSrc : normalizedSrc.slice(srcLastSlash + 1);\n \n if (normalizedFile === normalizedSrc || (fileName && fileName === srcFileName)) {\n currentScriptId = process.id;\n targetFlowId = flowId;\n break;\n }\n }\n }\n if (currentScriptId) break;\n }\n if (currentScriptId) break;\n }\n }\n }\n }\n }\n \n /**\n * If current script ID and flow ID are found, track event.\n * Only change event name if event already fired (changeEventName = true).\n */\n if (currentScriptId && targetFlowId) {\n const flow = this.flows.get(targetFlowId);\n const process = flow?.find(p => p.id === currentScriptId || p.id === this.PREFIX + currentScriptId);\n \n if (process) {\n const shouldFireEvents = process.fireEvents !== false && (this.flowOptions.get(targetFlowId)?.fireEvents !== false);\n if (shouldFireEvents) {\n const eventName = `${type}:${process.id}`;\n if (!customEvents.has(process.id)) customEvents.set(process.id, []);\n const events = customEvents.get(process.id);\n if (!events.some(e => e.name === eventName)) events.push({ type: eventType, name: eventName });\n if (changeEventName) type = eventName;\n }\n }\n }\n return type;\n };\n\n document.addEventListener = (type, listener, opts) => {\n if (type === 'DOMContentLoaded' && this.LIFECYCLE.DOMREADY) {\n /**\n * Only rename here. The renamed event is dispatched once, when\n * the process completes (see processCompleteActions below).\n * Dispatching here as well would deliver it twice, and a vendor\n * that registers two listeners would see every one of them fire\n * once per registration on top of that.\n */\n type = iterator.call(this, type, this.EVENTS.DOMREADY, true);\n }\n return documentListener.call(document, type, listener, opts);\n };\n\n window.addEventListener = (type, listener, opts) => {\n if (type === 'load' && this.LIFECYCLE.LOADED) {\n /* Same as above: rename now, dispatch once on completion. */\n type = iterator.call(this, type, this.EVENTS.LOADED, true);\n }\n return windowListener.call(window, type, listener, opts);\n };\n });\n\n /**\n * Provide handler callbacks for process execution.\n * Register process elements in processElementMap.\n */\n QSL.handlerCallbacksFilters.add(function(process) {\n return {\n registerProcessElement: (el, config) => {\n processElementMap.set(el, { flowId: config.flowId, processId: config.id });\n }\n };\n });\n\n /**\n * Fire tracked events when a process completes.\n * Use processCompleteActions instead of patching execute.\n */\n QSL.processCompleteActions.add(function(process) {\n const events = customEvents.get(process.id);\n if (events && Array.isArray(events)) {\n for (const event of events) {\n if (event.type === this.EVENTS.DOMREADY) {\n if (this.LIFECYCLE.DOMREADY) {\n document.dispatchEvent(new Event(event.name));\n } else {\n document.addEventListener('DOMContentLoaded', () => {\n document.dispatchEvent(new Event(event.name));\n }, { once: true });\n }\n } else if (event.type === this.EVENTS.LOADED) {\n if (this.LIFECYCLE.LOADED) {\n window.dispatchEvent(new Event(event.name));\n } else {\n window.addEventListener('load', () => {\n window.dispatchEvent(new Event(event.name));\n }, { once: true });\n }\n }\n }\n }\n });\n\n /**\n * Cleanup: restore original addEventListener functions on reset.\n * Use resetActions instead of patching reset.\n */\n QSL.resetActions.add(function() {\n if (isIntercepting && documentListener && windowListener) {\n document.addEventListener = documentListener;\n window.addEventListener = windowListener;\n isIntercepting = false;\n }\n });\n\n /**\n * Store custom events map.\n */\n QSL.customEvents = customEvents;\n}\n","/**\n * Check for circular dependencies in flows and processes.\n * @param {*} QSL \n */\nexport default function(QSL) {\n QSL.loadActions.add(function() {\n /**\n * Helper function to detect circular dependencies\n */\n const detectCircularDependency = (id, getDeps, visited = new Set()) => {\n if (visited.has(id)) return true;\n visited.add(id);\n const deps = getDeps(id) || [];\n for (const depId of deps) {\n if (detectCircularDependency(depId, getDeps, new Set(visited))) return true;\n }\n return false;\n };\n \n /**\n * Check for circular dependencies in flows\n */\n const getFlowDeps = id => (this.flowOptions.get(this.normalizeFlowId(id))?.depends) || [];\n for (const [fid, options] of this.flowOptions.entries()) {\n if (Array.isArray(options.depends) && options.depends.length) {\n if (detectCircularDependency(fid, getFlowDeps)) {\n this.log('CIRC_FLOW_DEP_SKIPPED', fid, options.depends);\n this.setFlowOptions({ status: this.FLOW_STATE.COMPLETED }, fid); /* Mark as completed */\n }\n }\n }\n\n /**\n * Check for circular dependencies in processes\n */\n const getProcDeps = id => {\n for (const flow of this.flows.values()) {\n const proc = flow.find(p => p.id === id);\n if (proc && Array.isArray(proc.depends)) return proc.depends.map(dep => this.PREFIX + dep);\n }\n return [];\n };\n for (const flow of this.flows.values()) {\n for (const process of flow) {\n if (Array.isArray(process.depends) && process.depends.length) {\n if (detectCircularDependency(process.id, getProcDeps)) {\n this.log('CIRC_PROCESS_DEP_SKIPPED', process.id, process.depends);\n process.condition = false; /* Turn off condition */\n }\n }\n }\n }\n });\n\n if ( QSL.logger && QSL.logger.VERSION === 'qsl-logger' ) {\n QSL.logger.LOG.CIRC_FLOW_DEP_SKIPPED = '[QSL] Circular flow dependency skipped:';\n QSL.logger.LOG.CIRC_PROCESS_DEP_SKIPPED = '[QSL] Circular process dependency skipped:';\n }\n}\n","/**\n * Media query condition handler\n * @param {*} QSL \n */\nexport function mediaQueryCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || !opt.startsWith('media:')) {\n return null;\n }\n return !window.matchMedia(opt.slice('media:'.length)).matches;\n });\n}\n\n/**\n * Language condition handler\n * @param {*} QSL \n */\nexport function languageCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || !opt.startsWith('lang:')) {\n return null;\n }\n const p = opt.split(':');\n const t = p[1] || 'equals';\n const v = p.slice(2).join(':');\n const l = navigator.language || navigator.languages?.[0] || '';\n \n switch (t) {\n case 'equals':\n case 'is':\n return l !== v;\n case 'contains':\n return !l.includes(v);\n case 'startsWith':\n return !l.startsWith(v);\n case 'in':\n const ls = v.split(',').map(ll => ll.trim());\n return !ls.includes(l);\n default:\n return true; // Unknown type, fail condition\n }\n });\n}\n\n/**\n * Timezone condition handler\n * @param {*} QSL \n */\nexport function timezoneCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || \n (!opt.startsWith('tz:') && !opt.startsWith('timezone:'))) {\n return null;\n }\n const p = opt.split(':');\n const t = p[1] || 'equals';\n const v = p.slice(2).join(':');\n \n try {\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const o = -new Date().getTimezoneOffset() / 60;\n \n switch (t) {\n case 'equals':\n case 'is':\n return tz !== v;\n case 'contains':\n return !tz.includes(v);\n case 'offset':\n return o !== parseInt(v);\n default:\n return true;\n }\n } catch (e) {\n return true;\n }\n });\n}\n\n/**\n * URL condition handler\n * @param {*} QSL \n */\nexport function urlCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || !opt.startsWith('url:')) {\n return null;\n }\n const lc = window.location;\n const hf = lc.href;\n const pn = lc.pathname;\n const se = lc.search;\n const hn = lc.hostname;\n \n const p = opt.split(':');\n const t = p[1];\n const v = p.slice(2).join(':');\n \n if (!t) return true;\n \n switch (t) {\n case 'contains':\n return !hf.includes(v);\n case 'path':\n return !pn.includes(v);\n case 'pathStartsWith':\n return !pn.startsWith(v);\n case 'pathEndsWith':\n return !pn.endsWith(v);\n case 'query':\n if (se) {\n const q = new URLSearchParams(se);\n if (v.includes('=')) {\n const [key, val] = v.split('=');\n return q.get(key) !== val;\n } else {\n return !q.has(v);\n }\n } else {\n return true;\n }\n case 'hostname':\n return !hn.includes(v);\n case 'matches':\n try {\n return !(new RegExp(v)).test(hf);\n } catch (e) {\n return true;\n }\n case 'pathMatches':\n try {\n return !(new RegExp(v)).test(pn);\n } catch (e) {\n return true; // Error parsing regex, fail condition\n }\n default:\n return true;\n }\n });\n}\n\n/**\n * User agent condition handler\n * @param {*} QSL \n */\nexport function userAgentCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || \n (!opt.startsWith('ua:') && !opt.startsWith('userAgent:'))) {\n return null;\n }\n const p = opt.split(':');\n const t = p[1] || 'contains';\n const v = p.slice(2).join(':');\n const ua = navigator.userAgent || '';\n const uaLower = ua.toLowerCase();\n const vLower = v.toLowerCase();\n\n switch (t) {\n case 'contains':\n if (!uaLower.includes(vLower)) return true;\n break;\n \n case 'equals':\n case 'is':\n if (ua !== v) return true;\n break;\n \n case 'matches':\n // Regex pattern matching\n try {\n if (!(new RegExp(v, 'i')).test(ua)) return true;\n } catch (e) {\n return true; // Error parsing regex, fail condition\n }\n break;\n \n case 'browser':\n // Detect browser\n const bMap = {\n 'chrome': /chrome/i.test(ua) && !/edg|opr/i.test(ua),\n 'firefox': /firefox/i.test(ua),\n 'safari': /safari/i.test(ua) && !/chrome|chromium|edg|opr/i.test(ua),\n 'edge': /edg/i.test(ua),\n 'opera': /opr/i.test(ua),\n 'ie': /msie|trident/i.test(ua),\n 'chromium': /chromium/i.test(ua)\n };\n const bKey = vLower;\n if (!bMap[bKey]) return true;\n break;\n \n case 'device':\n // Detect device type\n const isM = /mobile|android|iphone|ipod|blackberry|iemobile|opera mini/i.test(ua);\n const isT = /tablet|ipad|playbook|silk/i.test(ua) || (isM && /android/i.test(ua) && !/mobile/i.test(ua));\n const isD = !isM && !isT;\n \n switch (vLower) {\n case 'mobile': if (!isM) return true; break;\n case 'tablet': if (!isT) return true; break;\n case 'desktop': if (!isD) return true; break;\n default: return true;\n }\n break;\n \n case 'os':\n case 'platform':\n // Detect operating system\n const oMap = {\n 'windows': /win/i.test(ua),\n 'mac': /mac/i.test(ua),\n 'ios': /iphone|ipad|ipod/i.test(ua),\n 'android': /android/i.test(ua),\n 'linux': /linux/i.test(ua) && !/android/i.test(ua),\n 'unix': /unix/i.test(ua),\n 'chromeos': /cros/i.test(ua)\n };\n if (!oMap[vLower]) return true;\n break;\n \n default:\n return true;\n }\n \n // If we reach here, condition passed (none of the cases returned true)\n return false;\n });\n}\n\nexport default function(QSL) {\n // Media query handler\n mediaQueryCondition(QSL);\n \n // Language handler\n languageCondition(QSL);\n \n // Timezone handler\n timezoneCondition(QSL);\n \n // URL handler\n urlCondition(QSL);\n \n // User agent handler\n userAgentCondition(QSL);\n}\n"],"names":["core","VERSION","PREFIX","FLOW_TYPE","DEFAULT","ORDERED","FLOW_STATE","READY","RUNNING","COMPLETED","FLOW_OPTIONS","delay","priority","between","trigger","condition","beforeStart","onComplete","group","paused","preload","fireEvents","depends","EVENTS","STARTED","ERROR","FLOW_STARTED","FLOW_COMPLETED","ALL_COMPLETED","SKIPPED","DOMREADY","LOADED","LIFECYCLE","document","readyState","CALLBACK","types","Map","flows","flowOptions","flowGroups","currentProcessPerFlow","pendingFlows","Set","pendingProcesses","completedProcesses","loadActions","initActions","addProcessFilters","completedFlowsActions","flowIdFilters","conditionHandlers","triggerHandlers","processCompleteActions","allCompleteActions","resetActions","handlerCallbacksFilters","onAllComplete","globalResolve","logger","hasStarted","eventsEnabled","initialized","completing","autoReset","globalBetween","init","this","loaderScript","currentScript","window","__QSL__","addEventListener","once","registerType","process","Promise","resolve","_a","onBeforeStart","call","setTimeout","message","log","timestamp","Date","now","e","detail","type","config","id","error","size","cb","url","src","URL","baseURI","searchParams","get","callback","use","plugin","args","add","flowId","Math","random","toString","slice","skipped","Array","isArray","normalizedFlowId","normalizeFlowId","getOrCreateFlow","push","load","reset","processFlows","action","clear","destroy","setLogger","setOnAllComplete","useEvents","fire","event","dispatchEvent","CustomEvent","handler","set","registerTypes","list","Object","entries","map","pauseGroup","flowGroup","setFlowOptions","runGroup","runFlow","withTrigger","processes","options","status","has","ordered","prevOptions","length","checkPendingFlows","pendingFlowId","pendingOptions","every","depId","depOpt","delete","checkPendingProcesses","missingDeps","filter","hasProcess","from","values","some","flow","p","join","_depsResolved","_triggered","_waitResolve","maybeComplete","flowsDone","opt","flowIds","keys","sort","a","b","aOpts","bOpts","aHasTrigger","bHasTrigger","aPriority","fid","getConditionStatus","getTriggerFunction","triggered","res","prefetch","href","link","createElement","rel","as","crossOrigin","head","appendChild","prev","forEach","idx","then","async","run","promises","all","_b","_running","_waitPromise","execute","c","operator","conditions","h","r","o","vd","t","tF","f","fCb","triggers","waitForInteraction","passive","finishProcess","callbacks","pluginCallbacks","assign","catch","bypassSuffix","source","bypassCache","includes","render","tag","data","onError","footer","dom","onElement","onCustomResolve","el","registerProcessElement","key","value","setAttribute","replace","toLowerCase","String","onload","onerror","body","InlineScript","storedResolve","alreadyFired","eventName","resolveProcess","normalizedConfig","code","module","textContent","originalCode","JSON","stringify","wrappedCode","removeEventListener","queueMicrotask","Script","defer","integrity","InlineStyle","Stylesheet","Pixel","style","display","Image","width","height","setProperty","resolver","Shadow","customElements","whenDefined","shadowData","hidden","selector","container","querySelector","err","Error","position","insertBefore","firstChild","HTML","html","className","innerHTML","arg","prefix","isPrefixed","startsWith","whenElement","MutationObserver","root","documentElement","observer","found","disconnect","observe","childList","subtree","QSL","LOG","LOGGER_LOADED","LOGGER_LOAD_ERROR","UNKNOWN_TYPE","PROCESS_STARTED","PROCESS_COMPLETED","PROCESS_FAILED","STYLESHEET_STARTED","STYLESHEET_LOADED","STYLESHEET_FAILED","INLINE_SCRIPT_STARTED","INLINE_SCRIPT_SUCCESS","INLINE_SCRIPT_ERROR","INLINE_STYLE_STARTED","INLINE_STYLE_SUCCESS","INLINE_STYLE_ERROR","IMAGE_STARTED","IMAGE_LOADED","IMAGE_FAILED","SHADOW_STARTED","SHADOW_SUCCESS","SHADOW_FAILED","HTML_STARTED","HTML_SUCCESS","HTML_FAILED","PRELOAD_ERROR","FLOW_DEP_SKIPPED","DEP_NOT_FOUND","RESET","console","customEvents","processElementMap","WeakMap","documentListener","windowListener","isIntercepting","normalizeScriptPath","u","pathname","split","iterator","eventType","changeEventName","currentScriptId","targetFlowId","processElement","processId","stack","lines","i","match","file","qIndex","indexOf","stackFile","trim","qIdx","hIdx","endIdx","min","normalizedFile","lastSlash","lastIndexOf","fileName","normalizedSrc","srcLastSlash","srcFileName","find","events","name","listener","opts","Event","detectCircularDependency","getDeps","visited","deps","getFlowDeps","getProcDeps","proc","dep","CIRC_FLOW_DEP_SKIPPED","CIRC_PROCESS_DEP_SKIPPED","matchMedia","matches","v","l","navigator","language","languages","ll","tz","Intl","DateTimeFormat","resolvedOptions","timeZone","getTimezoneOffset","parseInt","lc","location","hf","pn","se","search","hn","hostname","endsWith","q","URLSearchParams","val","RegExp","test","ua","userAgent","uaLower","vLower","chrome","firefox","safari","edge","opera","ie","chromium","isM","isT","isD","windows","mac","ios","android","linux","unix","chromeos","requestIdleCallback","ms","Number","isFinite","IntersectionObserver","entry","isIntersecting","query","mql"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"qsl.min.js","sources":["../src/core.js","../src/types.js","../src/plugins/triggers.js","../src/presets/full.js","../src/plugins/logger.js","../src/plugins/events.js","../src/plugins/circ.js","../src/plugins/dynamic.js","../src/plugins/conditions.js"],"sourcesContent":["export default {\n /**\n * Constants\n */\n VERSION: '0.1.4',\n PREFIX: 'qsl-',\n FLOW_TYPE: {\n DEFAULT: 'default',\n ORDERED: 'ordered',\n },\n FLOW_STATE: { \n READY: 'READY',\n RUNNING: 'RUNNING',\n COMPLETED: 'COMPLETED'\n },\n FLOW_OPTIONS: {\n delay: 0,\n priority: 0,\n between: null,\n trigger: null,\n condition: null,\n beforeStart: null,\n onComplete: null,\n group: null,\n paused: false,\n preload: false,\n fireEvents: true,\n depends: []\n },\n EVENTS: {\n STARTED: 'QSL:started',\n COMPLETED: 'QSL:completed',\n ERROR: 'QSL:error',\n FLOW_STARTED: 'QSL:flow:started',\n FLOW_COMPLETED: 'QSL:flow:completed',\n ALL_COMPLETED: 'QSL:all:completed',\n SKIPPED: 'QSL:skipped',\n DOMREADY: 'QSL:domready',\n LOADED: 'QSL:loaded',\n },\n LIFECYCLE: {\n DOMREADY: document.readyState === 'interactive' || document.readyState === 'complete',\n LOADED: false,\n },\n CALLBACK: 'QSLReady',\n /**\n * Properties\n */\n types: new Map(), // Map to store custom resource types\n flows: new Map(), // Map to store flows\n flowOptions: new Map(), // Map to store flow options\n flowGroups: new Map(), // Map to store flow groups\n currentProcessPerFlow: new Map(), // Map to store current process per flow (flowId -> processId)\n\n pendingFlows: new Set(), // Set to store pending flows\n pendingProcesses: new Set(), // Set to store pending processes\n completedProcesses: new Set(), // Set to store completed processes\n loadActions: new Set(), // Set to store before load triggers\n initActions: new Set(), // Set to store init triggers\n addProcessFilters: new Set(), // Set to store add triggers\n completedFlowsActions: new Set(), // Set to store completed flows actions\n flowIdFilters: new Set(), // Set to store flowId filters\n conditionHandlers: new Set(), // Set to store condition handlers\n triggerHandlers: new Set(), // Set to store trigger handlers\n processCompleteActions: new Set(), // Set to store process completion actions\n allCompleteActions: new Set(), // Set to store all flows completion actions\n resetActions: new Set(), // Set to store reset actions\n handlerCallbacksFilters: new Set(), // Set to store handler callbacks filters\n\n onAllComplete: null, // Callback for all flows completion\n globalResolve: null, // Global resolve function\n logger: null, // Logger instance\n\n hasStarted: false, // Flag to check if QSL has started,\n eventsEnabled: false, // Flag to check if events are enabled\n initialized: false, // Flag to check if QSL is initialized\n completing: false, // Flag to check if QSL is completing\n autoReset: true, // Whether reset() runs automatically once every flow completes\n\n globalBetween: 0, // Global delay between processes\n\n /**\n * Initialize the QSL library.\n * @returns {Promise<this>}\n */\n async init() {\n if (this.initialized) return this;\n\n /**\n * document.currentScript is only set while this script is running\n * synchronously. Capture it before the first await below: an init\n * action that waits on anything real would otherwise leave it null,\n * and the async ready callback would silently never fire.\n */\n const loaderScript = document.currentScript;\n\n /* Check if QSL is already initialized */\n window.__QSL__ = window.__QSL__ || this;\n\n /* Check DOMContentLoaded state */\n if (document.readyState === 'interactive' || document.readyState === 'complete') {\n this.LIFECYCLE.DOMREADY = true;\n } else {\n document.addEventListener('DOMContentLoaded', () => this.LIFECYCLE.DOMREADY = true, { once: true });\n }\n\n /* Check window load state */\n if (document.readyState === 'complete') {\n this.LIFECYCLE.LOADED = true;\n } else {\n window.addEventListener('load', () => this.LIFECYCLE.LOADED = true, { once: true });\n }\n\n /* Register default type: console */\n this.registerType('console', (process) => {\n return new Promise((resolve) => {\n process.onBeforeStart?.();\n setTimeout(() => {\n if ( process.message ) this.log( process.message, { timestamp: Date.now() } );\n process.onComplete?.();\n resolve();\n }, process.delay || 0);\n });\n });\n\n /**\n * Custom event listeners for logging and error handling\n */\n window.addEventListener('QSL:log', (e) => this.log(e.detail.type, e.detail.config.id));\n window.addEventListener('QSL:error', (e) => this.error(e.detail.type, e.detail.error, e.detail.config.id));\n\n /**\n * Load init triggers\n */\n if ( this.initActions.size ) {\n for ( const cb of this.initActions ) {\n if ( typeof cb === 'function' ) await cb.call(this);\n }\n }\n \n this.initialized = true;\n\n /**\n * Check if async loading is enabled\n */\n const url = loaderScript && loaderScript.src ? new URL(loaderScript.src, document.baseURI) : null;\n if (!url || url.searchParams.get('async') !== 'true') return this;\n\n /**\n * Callback on async loading with default callback name\n */\n const callback = url.searchParams.get('callback') || this.CALLBACK;\n if (typeof window[callback] === 'function') window[callback]();\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n \n },\n \n /**\n * Register a plugin to QSL.\n *\n * @param {Function} plugin - The plugin function to register.\n * @param {...any} args - Additional arguments passed to the plugin.\n * @returns {this}\n */\n use(plugin, ...args) {\n if (typeof plugin === 'function') plugin(this, ...args);\n return this;\n },\n\n /**\n * Add a process config to a flow.\n * Handles process-level dependencies separately from flow-level logic.\n *\n * @param {Object} config - The process configuration object.\n * @param {string|boolean|null} [flowId=null] - The flow ID or true for ordered, or null for default.\n * @returns {this}\n */\n add(config, flowId = null) {\n if (!config || typeof config !== 'object') return this;\n\n /* Generate ID and default to process state */\n config.id = config.id ? this.PREFIX + config.id : this.PREFIX + Math.random().toString(36).slice(2);\n config.skipped = false;\n\n /* Sanitize config and set default type */\n if (!config.type) config.type = 'console';\n\n /* Register process-level dependencies */\n if (Array.isArray(config.depends)) config.depends = [...new Set(config.depends)];\n\n /* Filter flowId and config by addProcessFilters */\n if ( this.addProcessFilters.size ) {\n for ( const cb of this.addProcessFilters ) {\n if ( typeof cb === 'function' ) [flowId, config] = cb.call(this, flowId, config);\n }\n }\n\n /* Store flowId on process for quick lookup */\n const normalizedFlowId = this.normalizeFlowId(flowId);\n config.flowId = normalizedFlowId;\n\n /* Add to flow for flow-level execution */\n this.getOrCreateFlow(normalizedFlowId).push(config);\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Start loading all flows.\n *\n * @param {Object} [options={}]\n * @param {number|boolean} [options.between=false] - Global delay between processes.\n * @returns {Promise<this>}\n */\n async load({ between = false } = {}) {\n if (this.hasStarted) return;\n this.hasStarted = true;\n \n /**\n * Set global between\n */\n this.globalBetween = between;\n\n /**\n * Call load actions\n */\n for ( const cb of this.loadActions ) {\n if (typeof cb === 'function') cb.call(this);\n }\n\n /**\n * Return global promise\n */\n return new Promise((resolve) => {\n if (!this.flows.size) {\n this.reset();\n return resolve();\n }\n\n this.globalResolve = resolve;\n this.processFlows();\n });\n \n },\n\n /**\n * Reset all internal state and clear all flows/options.\n * \n * @returns {void}\n */\n reset() {\n /**\n * Call reset actions before clearing\n */\n if (this.resetActions.size) {\n for (const action of this.resetActions) {\n if (typeof action === 'function') action.call(this);\n }\n }\n\n /**\n * Clear run state only. Plugin registrations (types, condition and\n * trigger handlers, lifecycle hooks) survive, so processes added after\n * a completed run still behave the same way. Use destroy() to tear the\n * whole instance down.\n */\n this.flows.clear();\n this.flowOptions.clear();\n this.flowGroups.clear();\n this.pendingFlows.clear();\n this.pendingProcesses.clear();\n this.completedProcesses.clear();\n this.currentProcessPerFlow.clear();\n this.onAllComplete = null;\n this.globalResolve = null;\n this.hasStarted = false;\n this.globalBetween = 0;\n\n this.log('RESET');\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Tear the instance down completely: run state, plugin registrations and\n * registered types. After this, init() has to run again.\n *\n * @returns {this}\n */\n destroy() {\n this.reset();\n\n this.types.clear();\n this.initActions.clear();\n this.loadActions.clear();\n this.addProcessFilters.clear();\n this.completedFlowsActions.clear();\n this.flowIdFilters.clear();\n this.conditionHandlers.clear();\n this.triggerHandlers.clear();\n this.processCompleteActions.clear();\n this.allCompleteActions.clear();\n this.resetActions.clear();\n this.handlerCallbacksFilters.clear();\n\n this.logger = null;\n this.eventsEnabled = false;\n this.initialized = false;\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Set the logger instance.\n *\n * @param {Object|Function} logger - Logger instance or function.\n * @returns {this}\n */\n setLogger(logger) {\n if (logger && ( typeof logger === 'function' || typeof logger === 'object' ) ) this.logger = logger;\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Set a callback to run when all flows/processes are complete.\n *\n * @param {Function} callback - The callback function.\n * @returns {this}\n */\n setOnAllComplete(callback) {\n this.onAllComplete = typeof callback === 'function' ? callback : null;\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Enable DOM events for process/flow lifecycle.\n * @returns {this}\n */\n useEvents() {\n this.eventsEnabled = true;\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Log a message using the custom logger if set.\n *\n * @param {string} type - Log type.\n * @param {...any} args - Additional log arguments.\n */\n log(type, ...args) {\n if (this.logger && typeof this.logger.log === 'function') this.logger.log(type, ...args);\n },\n\n /**\n * Log an error using the custom logger if set.\n * \n * @param {string} type - Error type.\n * @param {...any} args - Additional error arguments.\n */\n error(type, ...args) {\n if (this.logger && typeof this.logger.error === 'function') this.logger.error(type, ...args);\n },\n\n /**\n * Fire a DOM event if events are enabled.\n * \n * @param {string} event - Event name.\n * @param {Object} detail - Event detail object.\n */\n fire(event, detail) {\n if (this.eventsEnabled && this.EVENTS[event]) {\n window.dispatchEvent(new CustomEvent(this.EVENTS[event], { detail }));\n }\n },\n\n /**\n * Normalize the flow ID.\n * \n * @param {string|boolean|null} flowId - The flow ID or true for ordered, or null for default.\n * @returns {string} Normalized flow ID.\n */\n normalizeFlowId(flowId) {\n if (flowId === true) {\n flowId = this.FLOW_TYPE.ORDERED;\n } else if (typeof flowId !== 'string') {\n flowId = this.FLOW_TYPE.DEFAULT;\n }\n return flowId;\n },\n\n /**\n * Register a custom resource type handler.\n *\n * @param {string} type - Resource type name.\n * @param {Function} handler - Handler function for the type.\n * @returns {this}\n */\n registerType(type, handler) {\n if (typeof type !== 'string' || typeof handler !== 'function') return this;\n this.types.set(type, handler);\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Register multiple custom resource types.\n *\n * @param {Array<{type: string, handler: Function}>|Object} types - Array or object of type definitions.\n * @returns {this}\n */\n registerTypes(types) {\n if (!types || typeof types !== 'object') return this;\n\n /* Accept both [{ type, handler }] and { name: handler } */\n const list = Array.isArray(types)\n ? types\n : Object.entries(types).map(([type, handler]) => (\n typeof handler === 'function' ? { type, handler } : handler\n ));\n\n for (const type of list) {\n if (type) this.registerType(type.type, type.handler);\n }\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Pause all flows in a group.\n * \n * @param {string} group - Group name.\n * @returns {this}\n */\n pauseGroup(group) {\n const flowGroup = this.flowGroups.get(group);\n if (!flowGroup) return this;\n for (const flowId of flowGroup) {\n this.setFlowOptions({ paused: true }, flowId);\n }\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Run all flows in a group.\n * \n * @param {string} group - Group name.\n * @returns {this}\n */\n runGroup(group) {\n const flowGroup = this.flowGroups.get(group);\n if (!flowGroup) return this;\n for (const flowId of flowGroup) {\n this.setFlowOptions({ paused: false }, flowId);\n this.runFlow(flowId);\n }\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Run a specific flow by id.\n *\n * @param {string} flowId - Flow ID.\n * @param {boolean} [withTrigger=false] - Whether to run with trigger logic.\n * @returns {this}\n */\n runFlow(flowId, withTrigger = false) {\n const processes = this.flows.get(flowId);\n const options = this.flowOptions.get(flowId);\n if (!processes || !options || options.status !== this.FLOW_STATE.READY) return this;\n this.processFlows(flowId, withTrigger);\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Get or create a flow.\n * \n * @param {string} flowId - Flow ID.\n * @returns {Array} The flow's process array.\n */\n getOrCreateFlow(flowId) {\n if (!this.flows.has(flowId)) {\n this.flows.set(flowId, []);\n this.flowOptions.set(flowId, { \n ...this.FLOW_OPTIONS, \n ordered: flowId === this.FLOW_TYPE.ORDERED, \n status: this.FLOW_STATE.READY \n });\n }\n return this.flows.get(flowId);\n },\n\n /**\n * Set or update options for a flow.\n * If depends is set, pauses the flow until dependencies are resolved.\n * \n * @param {Object} options - Flow options.\n * @param {string|boolean|null} [flowId=null] - Flow ID.\n * @returns {this}\n */\n setFlowOptions(options = {}, flowId = null) {\n /**\n * Normalize flow ID\n */\n flowId = this.normalizeFlowId(flowId);\n\n /**\n * Get or create flow\n */\n this.getOrCreateFlow(flowId);\n\n if (!options || typeof options !== 'object') return this;\n const prevOptions = this.flowOptions.get(flowId);\n\n /**\n * Pause flow if it has dependencies\n */\n if (Array.isArray(options.depends) && options.depends.length) {\n options.depends = [...new Set(options.depends)];\n options.paused = true;\n this.pendingFlows.add(flowId);\n }\n\n /**\n * Grouping flows\n */\n if (options.group) {\n if (!this.flowGroups.has(options.group)) this.flowGroups.set(options.group, new Set());\n this.flowGroups.get(options.group).add(flowId);\n }\n \n /**\n * Update options partially with fallbacks to previous state\n */\n this.flowOptions.set(flowId, { ...prevOptions, ...options });\n\n /**\n * Return QSL instance for chaining\n */\n return this;\n },\n\n /**\n * Check all pending flows and run those whose dependencies are now resolved.\n * \n * @returns {void}\n */\n checkPendingFlows() {\n if (!this.pendingFlows.size) return;\n for (const pendingFlowId of this.pendingFlows) {\n const pendingOptions = this.flowOptions.get(pendingFlowId);\n if (\n pendingOptions &&\n pendingOptions.depends &&\n pendingOptions.depends.every(depId => {\n const depOpt = this.flowOptions.get(this.normalizeFlowId(depId));\n return depOpt && depOpt.status === this.FLOW_STATE.COMPLETED;\n })\n ) {\n this.setFlowOptions({ paused: false }, pendingFlowId);\n this.pendingFlows.delete(pendingFlowId);\n this.runFlow(pendingFlowId);\n }\n }\n },\n\n /**\n * Check all pending processes and run those whose dependencies are now resolved.\n * \n * @returns {void}\n */\n checkPendingProcesses() {\n if (!this.pendingProcesses.size) return;\n for (const process of this.pendingProcesses) {\n const missingDeps = process.depends.filter(depId => {\n const hasProcess = Array.from(this.flows.values()).some(flow =>\n flow.some(p => p.id === this.PREFIX + depId)\n );\n return !this.completedProcesses.has(this.PREFIX + depId) && !hasProcess;\n });\n if (missingDeps.length) {\n this.pendingProcesses.delete(process);\n this.log('DEP_NOT_FOUND', process.id, `${missingDeps.join(', ')}`);\n process._depsResolved = true;\n process._triggered = true;\n if (process._waitResolve) process._waitResolve();\n continue;\n }\n const allDepsCompleted = process.depends.every(depId => this.completedProcesses.has(this.PREFIX + depId));\n if (allDepsCompleted) {\n this.pendingProcesses.delete(process);\n process._depsResolved = true;\n if (process._triggered && process._waitResolve) process._waitResolve();\n }\n }\n },\n\n /**\n * Check if all flows/processes are complete and resolve global promise if so.\n * \n * @returns {Promise<void>}\n */\n async maybeComplete() {\n if ( ! this.hasStarted ) return;\n\n /**\n * Check for pending flows missed dependencies \n */\n if ( this.pendingFlows.size ) {\n for (const pendingFlowId of this.pendingFlows) {\n const pendingOptions = this.flowOptions.get(pendingFlowId);\n if (\n pendingOptions &&\n pendingOptions.depends &&\n pendingOptions.depends.some(depId => !this.flowOptions.has(this.normalizeFlowId(depId)))\n ) {\n this.setFlowOptions({ status: this.FLOW_STATE.COMPLETED }, pendingFlowId);\n this.pendingFlows.delete(pendingFlowId);\n this.log('FLOW_DEP_SKIPPED', { flow: pendingFlowId, depends: `${pendingOptions.depends.filter(depId => !this.flowOptions.has(this.normalizeFlowId(depId))).join(', ')}` });\n }\n }\n }\n \n /**\n * Check completed flows\n */\n let flowsDone = this.flowOptions.size ? Array.from(this.flowOptions.values()).every(opt => opt.status === this.FLOW_STATE.COMPLETED) : false;\n\n /**\n * Completion hooks run even when some flow is still outstanding, so a\n * plugin can hold work back and release it here. With no hooks\n * registered this is exactly the old behaviour: done when every flow\n * is done.\n */\n let maybeComplete = flowsDone;\n\n /*\n * Filter maybeComplete by completedFlowsActions\n */\n if ( this.flows.size && this.completedFlowsActions.size ) {\n for ( const cb of this.completedFlowsActions ) {\n maybeComplete = cb.call(this, flowsDone, this.flows, this.flowOptions);\n }\n }\n\n if ( ! maybeComplete ) return;\n\n if (this.completing) return;\n this.completing = true;\n\n this.log('ALL_COMPLETED');\n this.fire('ALL_COMPLETED');\n\n this.onAllComplete?.();\n if (this.globalResolve !== null) this.globalResolve();\n\n /**\n * Call all flows completion actions\n */\n if (this.allCompleteActions.size) {\n for (const action of this.allCompleteActions) {\n if (typeof action === 'function') action.call(this);\n }\n }\n\n /**\n * Reset run state unless the caller opted out (e.g. for debugging)\n */\n if (this.autoReset) this.reset();\n this.completing = false;\n },\n\n /**\n * Process all flows and their dependencies.\n * \n * @param {string|null} [flowId=null] - Specific flow ID or null for all.\n * @param {boolean} [withTrigger=false] - Whether to run with trigger logic.\n * @returns {this}\n */\n processFlows(flowId = null, withTrigger = false) {\n if (!this.flows.size) return;\n\n /**\n * Run all flows if no specific flowId is provided\n */\n let flowIds = flowId ? [flowId] : Array.from(this.flows.keys());\n\n /**\n * Filter flowIds by flowIdFilters\n */\n if ( flowIds.length && this.flowIdFilters.size ) {\n for ( const cb of this.flowIdFilters ) {\n if ( typeof cb === 'function' ) flowIds = cb.call(this, flowIds);\n }\n }\n\n /**\n * Sort flows: flows without triggers first, then by priority\n */\n flowIds.sort((a, b) => {\n const aOpts = this.flowOptions.get(a);\n const bOpts = this.flowOptions.get(b);\n const aHasTrigger = aOpts?.trigger != null;\n const bHasTrigger = bOpts?.trigger != null;\n \n if (aHasTrigger && !bHasTrigger) return 1;\n if (!aHasTrigger && bHasTrigger) return -1;\n \n const aPriority = aOpts?.priority || 0;\n const bPriority = bOpts?.priority || 0;\n return bPriority - aPriority;\n });\n\n for (const fid of flowIds) {\n const options = this.flowOptions.get(fid);\n\n /**\n * Skip if missed options or flow is already completed\n */\n if (!options || options.status === this.FLOW_STATE.COMPLETED) continue;\n\n /**\n * Flow-level conditions\n */\n if ( this.getConditionStatus(options.condition) ) {\n this.setFlowOptions({ status: this.FLOW_STATE.COMPLETED }, fid);\n continue;\n }\n\n /**\n * Only process if not paused\n */\n if (options.paused) continue;\n\n /**\n * Logic for trigger on flow level\n */\n if ( flowId === null || ( flowId && ! withTrigger ) ) {\n if (options.trigger != null) {\n const trigger = this.getTriggerFunction(options.trigger, options);\n if (trigger) {\n this.setFlowOptions({ paused: true }, fid);\n let triggered = false;\n trigger(() => {\n if (triggered) return;\n triggered = true;\n this.setFlowOptions({ paused: false }, fid);\n this.runFlow(fid, true);\n });\n continue;\n }\n }\n }\n\n /**\n * Set flow to running state\n */\n this.setFlowOptions({ status: this.FLOW_STATE.RUNNING }, fid);\n\n /**\n * Run flows in parallel\n */\n (async () => {\n\n options.beforeStart?.();\n\n /**\n * Delay per flow\n */\n if (options.delay && options.delay > 0) {\n await new Promise(res => setTimeout(res, options.delay));\n }\n\n /**\n * Sort processes by priority\n */\n const processes = (this.flows.get(fid) || []).slice();\n processes.sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n /**\n * Preload scripts / styles\n */\n if ( (options.preload || options.prefetch ) && ! options.trigger ) {\n for (const p of processes) {\n if (p.trigger) continue;\n if ((p.type === 'script' && p.src) || (p.type === 'style' && p.href)) {\n try {\n const link = document.createElement('link');\n link.rel = options.preload ? 'preload' : 'prefetch';\n link.href = p.src || p.href;\n link.as = p.type === 'script' ? 'script' : 'style';\n if (p.crossOrigin) link.crossOrigin = p.crossOrigin;\n document.head.appendChild(link);\n } catch (e) {\n this.error('PRELOAD_ERROR', e, p.id);\n }\n }\n }\n }\n\n const between = (options.between !== undefined && options.between !== null)\n ? options.between\n : this.globalBetween;\n \n if (options.ordered) {\n /**\n * Ordered: await previous process\n */\n let prev = Promise.resolve();\n processes.forEach((process, idx) => {\n prev = prev.then(async () => {\n if (idx > 0 && between) await new Promise(res => setTimeout(res, between));\n await this.run(process);\n });\n });\n await prev;\n } else {\n /**\n * Unordered: run all processes in parallel\n */\n const promises = processes.map(async (process, idx) => {\n if (idx > 0 && between) await new Promise(res => setTimeout(res, between));\n return this.run(process);\n });\n await Promise.all(promises);\n }\n\n /**\n * Set flow to completed state\n */\n this.setFlowOptions({ status: this.FLOW_STATE.COMPLETED }, fid);\n options.onComplete?.();\n\n /**\n * Check for pending flows\n */\n this.checkPendingFlows();\n\n /**\n * Maybe complete the loading\n */\n this.maybeComplete();\n\n })();\n }\n\n /**\n * Cover skipped/empty batches that never start an async flow.\n */\n this.checkPendingFlows();\n this.maybeComplete();\n },\n\n /**\n * Execute a process based on its type.\n * \n * @param {Object} process - The process object.\n * @returns {Promise<any>}\n */\n async run(process) {\n /**\n * Skip if already running or completed\n */\n if (process._running || this.getConditionStatus(process.condition)) return;\n process._running = true;\n\n /**\n * Setup state\n */\n if (!process._waitPromise) {\n process._triggered = false;\n process._depsResolved = false;\n process._waitPromise = new Promise(res => process._waitResolve = res);\n }\n\n /**\n * Trigger logic for process\n */\n if (process.trigger != null) {\n const trigger = this.getTriggerFunction(process.trigger, process);\n if (trigger) {\n trigger(() => {\n process._triggered = true;\n if (process._depsResolved) process._waitResolve();\n });\n } else {\n process._triggered = true;\n }\n } else {\n process._triggered = true;\n }\n\n /**\n * Check dependencies\n */\n if (Array.isArray(process.depends) && process.depends.length) {\n const missingDeps = process.depends.filter(depId => {\n const hasProcess = Array.from(this.flows.values()).some(flow =>\n flow.some(p => p.id === this.PREFIX + depId)\n );\n return !this.completedProcesses.has(this.PREFIX + depId) && !hasProcess;\n });\n if (missingDeps.length) {\n this.log('DEP_NOT_FOUND', process.id, `${missingDeps.join(', ')}`);\n process._depsResolved = true;\n process._triggered = true;\n if (process._waitResolve) process._waitResolve();\n } else {\n const allDepsCompleted = process.depends.every(depId => this.completedProcesses.has(this.PREFIX + depId));\n if (!allDepsCompleted) {\n this.pendingProcesses.add(process);\n } else {\n process._depsResolved = true;\n if (process._triggered) process._waitResolve();\n }\n }\n } else {\n process._depsResolved = true;\n if (process._triggered) process._waitResolve();\n }\n\n /**\n * Wait for both trigger and dependencies to be resolved\n */\n await process._waitPromise;\n\n return this.execute(process);\n },\n\n /**\n * Check the condition option and return true if the condition fails.\n * \n * @param {string|Function|boolean} conditionOption - The condition option.\n * @returns {boolean} True if the condition fails, false otherwise.\n */\n getConditionStatus(opt) {\n if (opt == null) return false;\n \n if (Array.isArray(opt)) {\n return opt.some(c => this.getConditionStatus(c));\n }\n \n if (typeof opt === 'object' && opt.operator) {\n const { operator, conditions } = opt;\n if (!Array.isArray(conditions)) return false;\n \n if (operator === 'or') {\n return conditions.every(c => this.getConditionStatus(c));\n } else if (operator === 'and') {\n return conditions.some(c => this.getConditionStatus(c));\n }\n return false;\n }\n \n if (typeof opt === 'function' && !opt()) return true;\n if (typeof opt === 'boolean' && !opt) return true;\n\n if (this.conditionHandlers.size) {\n for (const h of this.conditionHandlers) {\n if (typeof h === 'function') {\n const r = h.call(this, opt);\n if (r === true || r === false) return r;\n }\n }\n }\n\n return false;\n },\n\n /**\n * Parse and return a trigger function based on the trigger option.\n * \n * @param {string|Function|boolean} opt - The trigger option.\n * @param {Object} o - The associated process or flow object.\n * @returns {Function|null} The trigger function or null if no trigger function is found.\n */\n getTriggerFunction(opt, o) {\n if (opt == null) return null;\n \n if (typeof opt === 'function') {\n return (cb) => opt(cb);\n }\n \n /**\n * Return trigger function for array of triggers\n */\n if (Array.isArray(opt)) {\n return (cb) => {\n const vd = opt.map(t => this.getTriggerFunction(t, o)).filter(tF => tF);\n if (vd.length === 0) {\n cb();\n return;\n }\n let f = 0;\n const fCb = () => { if (++f === vd.length) cb(); };\n vd.forEach(tF => tF(fCb));\n };\n }\n \n /**\n * Return trigger function for object with operator and triggers\n */\n if (typeof opt === 'object' && opt.operator) {\n const { operator, triggers } = opt;\n if (!Array.isArray(triggers)) return null;\n \n if (operator === 'or') {\n return (cb) => {\n const vd = triggers.map(t => this.getTriggerFunction(t, o)).filter(tF => tF);\n if (vd.length === 0) {\n cb();\n return;\n }\n let f = false;\n const fCb = () => { if (!f) { f = true; cb(); } };\n vd.forEach(tF => tF(fCb));\n };\n } else if (operator === 'and') {\n return (cb) => {\n const vd = triggers.map(t => this.getTriggerFunction(t, o)).filter(tF => tF);\n if (vd.length === 0) {\n cb();\n return;\n }\n let f = 0;\n const fCb = () => { if (++f === vd.length) cb(); };\n vd.forEach(tF => tF(fCb));\n };\n }\n return null;\n }\n\n /**\n * Return trigger function from trigger handlers\n */\n if (this.triggerHandlers.size) {\n for (const h of this.triggerHandlers) {\n if (typeof h === 'function') {\n const r = h.call(this, opt, o);\n if (r && typeof r === 'function') return r;\n }\n }\n }\n \n /**\n * Return interaction trigger function if opt is true or 'interaction'\n */\n if (opt === true || opt === 'interaction') {\n return (cb) => this.waitForInteraction(cb);\n }\n \n return null;\n },\n\n /**\n * Wait for user interaction before running a callback (for interaction phase).\n * This is the default fallback trigger.\n * \n * @param {Function} cb - The callback to run after user interaction.\n * @returns {void}\n */\n waitForInteraction(cb) {\n ['click', 'keydown', 'wheel', 'mousedown', 'mousemove', 'touchstart'].forEach(e => window.addEventListener(e, () => cb(), { once: true, passive: true }));\n },\n\n /**\n * Execute the process based on its type.\n * \n * @param {Object} process - The process object.\n * @returns {Promise<any>}\n */\n async execute(process) {\n const finishProcess = async () => {\n /**\n * Call process completion actions\n */\n if (this.processCompleteActions.size) {\n for (const action of this.processCompleteActions) {\n if (typeof action === 'function') action.call(this, process);\n }\n }\n this.completedProcesses.add(process.id);\n process._running = false;\n this.checkPendingProcesses();\n };\n if (process.skipped) {\n this.fire('SKIPPED', { ...process, id: process.id });\n finishProcess();\n return;\n }\n const handler = this.types.get(process.type);\n if (!handler) {\n this.log('UNKNOWN_TYPE', process.type, process.id);\n finishProcess();\n return;\n }\n this.fire('STARTED', { ...process, id: process.id });\n \n /**\n * Build handler callbacks from filters\n */\n const callbacks = {};\n if (this.handlerCallbacksFilters.size) {\n for (const filter of this.handlerCallbacksFilters) {\n if (typeof filter === 'function') {\n const pluginCallbacks = filter.call(this, process);\n if (pluginCallbacks && typeof pluginCallbacks === 'object') {\n Object.assign(callbacks, pluginCallbacks);\n }\n }\n }\n }\n \n /**\n * Execute handler and handle completion or error\n */\n return handler(process, callbacks)\n .then(() => {\n this.fire('COMPLETED', { ...process, id: process.id });\n finishProcess();\n })\n .catch(() => {\n this.fire('ERROR', { ...process, id: process.id });\n finishProcess();\n });\n }\n};","/**\n * Get cache-bypass suffix for a URL.\n */\nconst bypassSuffix = (source, bypassCache) =>{\n return bypassCache ? ( ( source.includes('?') ? '&' : '?') + Date.now() ) : '';\n}\n\n/**\n * Log a message.\n */\nconst log = (detail) => {\n window.dispatchEvent(new CustomEvent('QSL:log', { detail }));\n}\n\n/**\n * Log an error.\n */\nconst error = (detail) => {\n window.dispatchEvent(new CustomEvent('QSL:error', { detail }));\n}\n\n/**\n * Render an element.\n */\nconst render = (config, callbacks = {}) => {\n return new Promise(async (resolve) => {\n const { flowId, tag, id, delay, data, onBeforeStart, onComplete, onError, footer, dom, onElement, onCustomResolve } = config;\n if (!flowId || !tag || !id) {\n resolve();\n return;\n }\n try {\n if (onBeforeStart) await onBeforeStart(config);\n log({ tag, type: 'PROCESS_STARTED', config });\n if (delay) await new Promise(res => setTimeout(res, delay));\n let el = document.createElement(tag);\n onElement?.(el, config);\n\n callbacks.registerProcessElement?.(el, config);\n\n if (data && typeof data === 'object') {\n for (const [key, value] of Object.entries(data)) {\n el.setAttribute(`data-${key.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/[^a-z0-9_-]/g, '').replace(/^-/, '')}`, String(value));\n }\n }\n\n if (!onCustomResolve) {\n el.onload = () => {\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n };\n }\n el.onerror = (e) => {\n error({ tag, type: 'PROCESS_FAILED', config });\n onError?.(e);\n resolve(e);\n };\n if (dom) {\n (footer ? document.body : document.head).appendChild(el);\n }\n onCustomResolve?.({ el, config, resolve });\n } catch (e) {\n error({ tag, type: 'PROCESS_FAILED', config, error: e });\n onError?.(e);\n resolve(e);\n }\n });\n}\n\n/**\n * Render an inline script.\n */\nconst InlineScript = {\n type: 'inline-script',\n handler: (config, callbacks) => { \n let storedResolve = null;\n let alreadyFired = false;\n const eventName = `QSL:inline-script:completed:${config.id}`;\n const resolveProcess = () => {\n log({ tag: 'inline-script', type: 'INLINE_SCRIPT_SUCCESS', config });\n log({ tag: 'inline-script', type: 'PROCESS_COMPLETED', config });\n config?.onComplete?.();\n storedResolve?.();\n };\n const normalizedConfig = {\n ...config,\n code: config.code?.replace(/<script.*?>|<\\/script>/gi, '')\n };\n return render({\n ...normalizedConfig,\n tag: 'script',\n dom: true,\n onElement: (el, config) => {\n const { code, module, id, flowId } = config;\n if (code) el.textContent = code;\n if (module) {\n el.type = 'module';\n const originalCode = el.textContent;\n const fid = JSON.stringify(String(flowId));\n const pid = JSON.stringify(String(id));\n const evt = JSON.stringify(String(eventName));\n const wrappedCode = `(function(){window.__QSL__.currentProcessPerFlow.set(${fid},${pid});try{${originalCode}}finally{window.__QSL__.currentProcessPerFlow.delete(${fid});window.dispatchEvent(new Event(${evt}));}})();`;\n el.textContent = wrappedCode;\n const handler = () => {\n window.removeEventListener(eventName, handler);\n if (storedResolve) {\n resolveProcess();\n } else { \n alreadyFired = true;\n }\n };\n window.addEventListener(eventName, handler);\n }\n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { module } = config;\n storedResolve = resolve;\n if (module && alreadyFired) {\n resolveProcess();\n } else if (!module) {\n queueMicrotask(() => {\n if (storedResolve === resolve) resolveProcess();\n });\n }\n }\n }, callbacks);\n }\n};\n\n/**\n * Render a script element.\n */\nconst Script = {\n type: 'script',\n handler: (config, callbacks) => { \n return render({\n ...config,\n tag: 'script',\n dom: true,\n onElement: (el, { src, module, async, defer, crossOrigin, integrity, bypassCache }) => {\n if (module) el.type = 'module';\n if (async) el.async = async;\n if (defer) el.defer = defer;\n if (crossOrigin) el.crossOrigin = crossOrigin;\n if (integrity) el.integrity = integrity;\n if (src) el.src = src + bypassSuffix(src, bypassCache);\n }\n }, callbacks);\n }\n};\n\n/**\n * Render an inline style.\n */\nconst InlineStyle = {\n type: 'style',\n handler: (config, callbacks) => {\n const normalizedConfig = {\n ...config,\n code: config.code?.replace(/<style.*?>|<\\/style>/gi, '')\n };\n return render({\n ...normalizedConfig,\n tag: 'style',\n dom: true,\n onElement: (el, { code }) => {\n if (code) el.textContent = code;\n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { tag, onComplete } = config;\n log({ tag, type: 'INLINE_STYLE_SUCCESS', config });\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n }\n }, callbacks);\n }\n};\n\n/**\n * Render a stylesheet.\n */\nconst Stylesheet = {\n type: 'stylesheet',\n handler: (config, callbacks) => {\n return render({\n ...config,\n tag: 'link',\n dom: true,\n onElement: (el, { href, crossOrigin, bypassCache }) => {\n el.rel = 'stylesheet';\n if (crossOrigin) el.crossOrigin = crossOrigin;\n el.href = href + bypassSuffix(href, bypassCache);\n }\n }, callbacks);\n }\n};\n\n/**\n * Render a pixel.\n */\nconst Pixel = {\n type: 'pixel',\n handler: (config, callbacks) => {\n return render({\n ...config,\n tag: 'img',\n dom: true,\n onElement: (el, { style = { display: 'none' }, dom, src, bypassCache }) => {\n if ( ! dom ) el = new window.Image();\n el.src = src + bypassSuffix(src, bypassCache);\n el.width = 1;\n el.height = 1;\n if ( style && typeof style === 'object' ) {\n for (const [key, value] of Object.entries(style)) {\n el.style.setProperty(key, value);\n }\n }\n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { tag, dom, onComplete } = config;\n const resolver = () => {\n log({ tag, type: 'IMAGE_LOADED', config });\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n };\n ! dom ? resolver() : el.onload = () => resolver();\n }\n }, callbacks);\n }\n};\n\n/**\n * Render a custom element.\n */\nconst Shadow = {\n type: 'shadow',\n handler: (config, callbacks) => {\n return render({\n ...config,\n onBeforeStart: async ({ tag }) => await window.customElements.whenDefined(tag),\n onElement: (el, { shadowData }) => {\n el.data = shadowData || {};\n if (shadowData?.hidden) el.setAttribute('hidden', ''); \n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { tag, shadowData, onComplete, onError } = config;\n const resolver = () => {\n const selector = shadowData?.container;\n let container = null;\n if (selector === 'body') {\n container = document.body;\n } else if (typeof selector === 'string' && selector) {\n try {\n container = document.querySelector(selector);\n } catch (e) {\n container = null;\n }\n }\n if (!container) {\n const err = new Error(`Container not found: ${selector}`);\n error({ tag, type: 'SHADOW_FAILED', config, error: err });\n onError?.(err);\n resolve(err);\n return;\n }\n shadowData?.position === 'top' ? container.insertBefore(el, container.firstChild) : container.appendChild(el);\n log({ tag, type: 'SHADOW_SUCCESS', config });\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n };\n if (document.readyState === 'interactive' || document.readyState === 'complete') {\n resolver();\n } else {\n document.addEventListener('DOMContentLoaded', resolver, { once: true });\n }\n }\n }, callbacks);\n }\n}\n\n/**\n * Render an HTML element.\n */\nconst HTML = {\n type: 'html',\n handler: (config, callbacks) => {\n return render({\n ...config,\n dom: true,\n onElement: (el, { html = '', id = '', className = '', style = {} }) => {\n if (html) el.innerHTML = html;\n if (id) el.id = id;\n if (className) el.className = Array.isArray(className) ? className.join(' ') : className;\n if ( style && typeof style === 'object' ) {\n for (const [key, value] of Object.entries(style)) {\n el.style.setProperty(key, value);\n }\n }\n },\n onCustomResolve: ({ el, config, resolve }) => {\n const { tag, onComplete } = config;\n log({ tag, type: 'HTML_SUCCESS', config });\n log({ tag, type: 'PROCESS_COMPLETED', config });\n onComplete?.();\n resolve();\n }\n }, callbacks);\n }\n};\n\n/**\n * Default types for QSL.\n */\nexport { Script, Stylesheet, InlineScript, InlineStyle, Pixel, Shadow, HTML };","/**\n * Built-in trigger handlers.\n *\n * A trigger handler receives the raw trigger option and the flow/process it\n * belongs to, and returns a function `(cb) => void` that invokes `cb` once the\n * trigger fires. Returning `null` means \"not my trigger\" and lets the next\n * registered handler try.\n */\n\n/**\n * Read the argument part of a prefixed trigger option.\n *\n * Uses `slice` rather than `split(':')` so that arguments containing colons\n * (CSS pseudo-classes, media queries, URLs) survive intact.\n *\n * @param {string} opt - Full trigger option, e.g. `hover:.btn:first-child`.\n * @param {string} prefix - Prefix including the colon, e.g. `hover:`.\n * @returns {string} The argument, e.g. `.btn:first-child`.\n */\nconst arg = (opt, prefix) => opt.slice(prefix.length);\n\n/**\n * Check whether an option is a string starting with the given prefix.\n *\n * @param {*} opt - Trigger option.\n * @param {string} prefix - Prefix including the colon.\n * @returns {boolean}\n */\nconst isPrefixed = (opt, prefix) => typeof opt === 'string' && opt.startsWith(prefix);\n\n/**\n * Resolve an element now, or once it is inserted into the document.\n *\n * `appears:` and `visible:` may reference elements that are rendered later, so\n * a plain `querySelector` at registration time is not enough.\n *\n * @param {string} selector - CSS selector.\n * @param {Function} cb - Called with the element once it exists.\n * @returns {void}\n */\nconst whenElement = (selector, cb) => {\n let el = null;\n try {\n el = document.querySelector(selector);\n } catch (e) {\n /* Invalid selector: fail open so the flow is never stuck. */\n cb(null);\n return;\n }\n\n if (el) {\n cb(el);\n return;\n }\n\n if (typeof MutationObserver !== 'function') {\n cb(null);\n return;\n }\n\n const root = document.body || document.documentElement;\n if (!root) {\n cb(null);\n return;\n }\n\n const observer = new MutationObserver(() => {\n const found = document.querySelector(selector);\n if (found) {\n observer.disconnect();\n cb(found);\n }\n });\n observer.observe(root, { childList: true, subtree: true });\n};\n\n/**\n * `load` - fires on the window load event.\n * @param {Object} QSL\n */\nexport function loadTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (opt !== 'load') return null;\n return (cb) => {\n if (document.readyState === 'complete') {\n cb();\n } else {\n window.addEventListener('load', () => cb(), { once: true });\n }\n };\n });\n}\n\n/**\n * `idle` - fires when the browser is idle.\n * @param {Object} QSL\n */\nexport function idleTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (opt !== 'idle') return null;\n return (cb) => {\n if (typeof window.requestIdleCallback === 'function') {\n window.requestIdleCallback(() => cb());\n } else {\n setTimeout(() => cb(), 200);\n }\n };\n });\n}\n\n/**\n * `domready` - fires on DOMContentLoaded.\n *\n * `interactive` means DOMContentLoaded has already fired, so a listener added\n * at that point would never run.\n *\n * @param {Object} QSL\n */\nexport function domReadyTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (opt !== 'domready') return null;\n return (cb) => {\n if (document.readyState === 'interactive' || document.readyState === 'complete') {\n cb();\n } else {\n document.addEventListener('DOMContentLoaded', () => cb(), { once: true });\n }\n };\n });\n}\n\n/**\n * `delay:<ms>` - fires after a timeout.\n * @param {Object} QSL\n */\nexport function delayTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (!isPrefixed(opt, 'delay:')) return null;\n const ms = parseInt(arg(opt, 'delay:'), 10);\n return (cb) => setTimeout(cb, Number.isFinite(ms) && ms > 0 ? ms : 0);\n });\n}\n\n/**\n * `hover:<selector>` - fires when the pointer moves over the element.\n * @param {Object} QSL\n */\nexport function hoverTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (!isPrefixed(opt, 'hover:')) return null;\n const selector = arg(opt, 'hover:');\n return (cb) => {\n whenElement(selector, (el) => {\n if (!el) {\n cb();\n return;\n }\n el.addEventListener('mouseover', () => cb(), { once: true, passive: true });\n });\n };\n });\n}\n\n/**\n * `visible:<selector>` - fires when the element intersects the viewport.\n * @param {Object} QSL\n */\nexport function visibleTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (!isPrefixed(opt, 'visible:')) return null;\n const selector = arg(opt, 'visible:');\n return (cb) => {\n whenElement(selector, (el) => {\n if (!el || typeof IntersectionObserver !== 'function') {\n cb();\n return;\n }\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n observer.disconnect();\n cb();\n return;\n }\n }\n });\n observer.observe(el);\n });\n };\n });\n}\n\n/**\n * `appears:<selector>` - fires when the element is inserted into the DOM.\n * @param {Object} QSL\n */\nexport function appearsTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt) {\n if (!isPrefixed(opt, 'appears:')) return null;\n const selector = arg(opt, 'appears:');\n return (cb) => whenElement(selector, () => cb());\n });\n}\n\n/**\n * `media:<query>` - fires when the media query matches, now or later.\n * @param {Object} QSL\n */\nexport function mediaQueryTrigger(QSL) {\n QSL.triggerHandlers.add(function (opt, o) {\n if (!isPrefixed(opt, 'media:')) return null;\n const query = arg(opt, 'media:');\n return (cb) => {\n if (!query.length || typeof window.matchMedia !== 'function') {\n if (o) o.skipped = true;\n cb();\n return;\n }\n const mql = window.matchMedia(query);\n if (mql.matches) {\n cb();\n return;\n }\n const handler = (e) => {\n if (!e.matches) return;\n mql.removeEventListener('change', handler);\n cb();\n };\n mql.addEventListener('change', handler);\n };\n });\n}\n\n/**\n * Register every built-in trigger handler.\n * @param {Object} QSL\n */\nexport default function (QSL) {\n loadTrigger(QSL);\n idleTrigger(QSL);\n domReadyTrigger(QSL);\n delayTrigger(QSL);\n hoverTrigger(QSL);\n visibleTrigger(QSL);\n appearsTrigger(QSL);\n mediaQueryTrigger(QSL);\n}\n","import core from '../core.js';\n\nimport { Script, InlineScript, InlineStyle, Stylesheet, Pixel, Shadow, HTML } from '../types.js';\n\nimport { mediaQueryCondition, languageCondition, timezoneCondition, urlCondition, userAgentCondition } from '../plugins/conditions.js';\nimport { loadTrigger, idleTrigger, domReadyTrigger, delayTrigger, hoverTrigger, visibleTrigger, appearsTrigger, mediaQueryTrigger } from '../plugins/triggers.js';\n\nimport logger from '../plugins/logger.js';\nimport events from '../plugins/events.js';\nimport circ from '../plugins/circ.js';\nimport dynamic from '../plugins/dynamic.js';\n\ncore\n .registerTypes([Script, InlineScript, InlineStyle, Stylesheet, Pixel, Shadow, HTML])\n\n .use(logger)\n .use(events)\n .use(circ)\n .use(dynamic)\n\n .use(mediaQueryCondition)\n .use(languageCondition)\n .use(timezoneCondition)\n .use(urlCondition)\n .use(userAgentCondition)\n\n .use(loadTrigger)\n .use(idleTrigger)\n .use(domReadyTrigger)\n .use(delayTrigger)\n .use(hoverTrigger)\n .use(visibleTrigger)\n .use(appearsTrigger)\n .use(mediaQueryTrigger)\n\n .init();","export default function(QSL) {\n\n QSL.initActions.add(function() {\n \n QSL.logger = {\n VERSION: 'qsl-logger',\n LOG: {\n LOGGER_LOADED: '[QSL] Logger loaded',\n LOGGER_LOAD_ERROR: '[QSL] Logger load error:',\n UNKNOWN_TYPE: '[QSL] Unknown type:',\n PROCESS_STARTED: '[QSL] Process started:',\n PROCESS_COMPLETED: '[QSL] Process completed:',\n PROCESS_FAILED: '[QSL] Process failed:',\n STYLESHEET_STARTED: '[QSL] Stylesheet loading:',\n STYLESHEET_LOADED: '[QSL] Stylesheet loaded:',\n STYLESHEET_FAILED: '[QSL] Stylesheet failed to load:',\n INLINE_SCRIPT_STARTED: '[QSL] Inline script loading:',\n INLINE_SCRIPT_SUCCESS: '[QSL] Inline script loaded:',\n INLINE_SCRIPT_ERROR: '[QSL] Inline script load error:',\n INLINE_STYLE_STARTED: '[QSL] Inline style loading:',\n INLINE_STYLE_SUCCESS: '[QSL] Inline style loaded:',\n INLINE_STYLE_ERROR: '[QSL] Inline style load error:',\n IMAGE_STARTED: '[QSL] Image pixel loading:',\n IMAGE_LOADED: '[QSL] Image pixel loaded:',\n IMAGE_FAILED: '[QSL] Image pixel failed:',\n SHADOW_STARTED: '[QSL] Shadow element loading:',\n SHADOW_SUCCESS: '[QSL] Shadow element loaded:',\n SHADOW_FAILED: '[QSL] Shadow element failed:',\n HTML_STARTED: '[QSL] HTML element loading:',\n HTML_SUCCESS: '[QSL] HTML element loaded:',\n HTML_FAILED: '[QSL] HTML element failed:',\n PRELOAD_ERROR: '[QSL] Preload error:',\n FLOW_DEP_SKIPPED: '[QSL] Flow dependency missed:',\n DEP_NOT_FOUND: '[QSL] Dependency not found:',\n RESET: '[QSL] Global reset',\n ALL_COMPLETED: '[QSL] Loading is completed',\n },\n log(type, ...args) {\n if (this.LOG[type]) {\n console.log(this.LOG[type], ...args, { timestamp: Date.now() });\n } else {\n console.log('[QSL] ' + type, ...args);\n }\n },\n error(type, ...args) {\n if (this.LOG[type]) {\n console.error(this.LOG[type], ...args);\n } else {\n console.error('[QSL] ' + type, ...args);\n }\n }\n };\n \n });\n\n}","/**\n * Track events when a process completes.\n * @param {*} QSL \n */\nexport default function(QSL) {\n const customEvents = new Map();\n const processElementMap = new WeakMap();\n let processCounter = 0;\n let documentListener = null;\n let windowListener = null;\n let isIntercepting = false;\n\n /**\n * Normalize script URL for comparison (remove protocol, domain, query params, hash).\n * @param {string} url - Script URL or path\n * @returns {string} - Normalized path\n */\n const normalizeScriptPath = (u) => {\n if (!u) return '';\n try {\n return u.includes('://') ? new URL(u).pathname : u.split('?')[0].split('#')[0];\n } catch (e) {\n return u.split('?')[0].split('#')[0];\n }\n };\n\n /**\n * A key that is unique to this process OBJECT, not to its id.\n *\n * Ids are not unique: the same explicit id can be used by a process in a\n * later load() cycle, or by a late add that the dynamic plugin puts in its\n * own flow. Keying the private event name on the id alone means the second\n * process dispatches an event the first process's listener is still bound\n * to, and that listener runs again. Every listener from one process shares\n * this key, so one dispatch still serves all of them.\n *\n * @param {Object} process\n * @returns {string}\n */\n const processKey = (process) => {\n if (!process._eventKey) {\n process._eventKey = process.id + '#' + (++processCounter);\n }\n return process._eventKey;\n };\n\n /**\n * Initialize event interception when QSL loads.\n */\n QSL.loadActions.add(function() {\n if (isIntercepting) return;\n \n documentListener = document.addEventListener;\n windowListener = window.addEventListener;\n isIntercepting = true;\n\n const iterator = (type, eventType, changeEventName) => {\n let currentScriptId = null;\n let targetFlowId = null;\n \n /**\n * Priority 1: Check document.currentScript for current process ID and flow ID.\n */\n if (document.currentScript) {\n const processElement = processElementMap.get(document.currentScript);\n if (processElement) {\n currentScriptId = processElement.processId;\n targetFlowId = processElement.flowId;\n }\n }\n \n /**\n * Priority 2: Check currentProcessPerFlow map for current process ID and flow ID.\n */\n if (!currentScriptId && this.currentProcessPerFlow.size) {\n for (const [flowId, processId] of this.currentProcessPerFlow) {\n if (processId) {\n currentScriptId = processId;\n targetFlowId = flowId;\n break;\n }\n }\n }\n \n /**\n * Priority 3: Use Error stack trace only when currentScript is null.\n */\n if (!currentScriptId) {\n const stack = new Error().stack;\n if (stack) {\n const lines = stack.split('\\n');\n // Skip first 2 lines (Error and iterator function)\n for (let i = 2; i < lines.length; i++) {\n const match = lines[i].match(/([^()\\s]+\\.js(?:\\?[^:)]*)?):\\d+(?::\\d+)?/);\n if (match) {\n const file = match[1];\n const qIndex = file.indexOf('?');\n const stackFile = qIndex === -1 ? file.trim() : file.slice(0, qIndex).trim();\n \n if (stackFile) {\n // Normalize: remove query/hash, extract pathname from URL\n const qIdx = stackFile.indexOf('?');\n const hIdx = stackFile.indexOf('#');\n const endIdx = qIdx === -1 ? (hIdx === -1 ? stackFile.length : hIdx) : (hIdx === -1 ? qIdx : Math.min(qIdx, hIdx));\n let normalizedFile = stackFile.slice(0, endIdx);\n try {\n if (normalizedFile.includes('://')) {\n normalizedFile = new URL(normalizedFile).pathname;\n }\n } catch (e) {}\n const lastSlash = normalizedFile.lastIndexOf('/');\n const fileName = lastSlash === -1 ? normalizedFile : normalizedFile.slice(lastSlash + 1);\n \n for (const [flowId, processes] of this.flows) {\n for (const process of processes) {\n if (process.src && process.type === 'script') {\n const normalizedSrc = normalizeScriptPath(process.src);\n const srcLastSlash = normalizedSrc.lastIndexOf('/');\n const srcFileName = srcLastSlash === -1 ? normalizedSrc : normalizedSrc.slice(srcLastSlash + 1);\n \n if (normalizedFile === normalizedSrc || (fileName && fileName === srcFileName)) {\n currentScriptId = process.id;\n targetFlowId = flowId;\n break;\n }\n }\n }\n if (currentScriptId) break;\n }\n if (currentScriptId) break;\n }\n }\n }\n }\n }\n \n /**\n * If current script ID and flow ID are found, track event.\n * Only change event name if event already fired (changeEventName = true).\n */\n if (currentScriptId && targetFlowId) {\n const flow = this.flows.get(targetFlowId);\n const process = flow?.find(p => p.id === currentScriptId || p.id === this.PREFIX + currentScriptId);\n \n if (process) {\n const shouldFireEvents = process.fireEvents !== false && (this.flowOptions.get(targetFlowId)?.fireEvents !== false);\n if (shouldFireEvents) {\n const key = processKey(process);\n const eventName = `${type}:${key}`;\n if (!customEvents.has(key)) customEvents.set(key, []);\n const events = customEvents.get(key);\n if (!events.some(e => e.name === eventName)) events.push({ type: eventType, name: eventName });\n if (changeEventName) type = eventName;\n }\n }\n }\n return type;\n };\n\n document.addEventListener = (type, listener, opts) => {\n if (type === 'DOMContentLoaded' && this.LIFECYCLE.DOMREADY) {\n /**\n * Only rename here. The renamed event is dispatched once, when\n * the process completes (see processCompleteActions below).\n * Dispatching here as well would deliver it twice, and a vendor\n * that registers two listeners would see every one of them fire\n * once per registration on top of that.\n */\n type = iterator.call(this, type, this.EVENTS.DOMREADY, true);\n }\n return documentListener.call(document, type, listener, opts);\n };\n\n window.addEventListener = (type, listener, opts) => {\n if (type === 'load' && this.LIFECYCLE.LOADED) {\n /* Same as above: rename now, dispatch once on completion. */\n type = iterator.call(this, type, this.EVENTS.LOADED, true);\n }\n return windowListener.call(window, type, listener, opts);\n };\n });\n\n /**\n * Provide handler callbacks for process execution.\n * Register process elements in processElementMap.\n */\n QSL.handlerCallbacksFilters.add(function(process) {\n return {\n registerProcessElement: (el, config) => {\n processElementMap.set(el, { flowId: config.flowId, processId: config.id });\n }\n };\n });\n\n /**\n * Fire tracked events when a process completes.\n * Use processCompleteActions instead of patching execute.\n */\n QSL.processCompleteActions.add(function(process) {\n const events = customEvents.get(process._eventKey);\n if (events && Array.isArray(events)) {\n for (const event of events) {\n if (event.type === this.EVENTS.DOMREADY) {\n if (this.LIFECYCLE.DOMREADY) {\n document.dispatchEvent(new Event(event.name));\n } else {\n document.addEventListener('DOMContentLoaded', () => {\n document.dispatchEvent(new Event(event.name));\n }, { once: true });\n }\n } else if (event.type === this.EVENTS.LOADED) {\n if (this.LIFECYCLE.LOADED) {\n window.dispatchEvent(new Event(event.name));\n } else {\n window.addEventListener('load', () => {\n window.dispatchEvent(new Event(event.name));\n }, { once: true });\n }\n }\n }\n }\n });\n\n /**\n * Cleanup: restore original addEventListener functions on reset.\n * Use resetActions instead of patching reset.\n */\n QSL.resetActions.add(function() {\n if (isIntercepting && documentListener && windowListener) {\n document.addEventListener = documentListener;\n window.addEventListener = windowListener;\n isIntercepting = false;\n }\n });\n\n /**\n * Store custom events map.\n */\n QSL.customEvents = customEvents;\n}\n","/**\n * Check for circular dependencies in flows and processes.\n * @param {*} QSL \n */\nexport default function(QSL) {\n QSL.loadActions.add(function() {\n /**\n * Helper function to detect circular dependencies\n */\n const detectCircularDependency = (id, getDeps, visited = new Set()) => {\n if (visited.has(id)) return true;\n visited.add(id);\n const deps = getDeps(id) || [];\n for (const depId of deps) {\n if (detectCircularDependency(depId, getDeps, new Set(visited))) return true;\n }\n return false;\n };\n \n /**\n * Check for circular dependencies in flows\n */\n const getFlowDeps = id => (this.flowOptions.get(this.normalizeFlowId(id))?.depends) || [];\n for (const [fid, options] of this.flowOptions.entries()) {\n if (Array.isArray(options.depends) && options.depends.length) {\n if (detectCircularDependency(fid, getFlowDeps)) {\n this.log('CIRC_FLOW_DEP_SKIPPED', fid, options.depends);\n this.setFlowOptions({ status: this.FLOW_STATE.COMPLETED }, fid); /* Mark as completed */\n }\n }\n }\n\n /**\n * Check for circular dependencies in processes\n */\n const getProcDeps = id => {\n for (const flow of this.flows.values()) {\n const proc = flow.find(p => p.id === id);\n if (proc && Array.isArray(proc.depends)) return proc.depends.map(dep => this.PREFIX + dep);\n }\n return [];\n };\n for (const flow of this.flows.values()) {\n for (const process of flow) {\n if (Array.isArray(process.depends) && process.depends.length) {\n if (detectCircularDependency(process.id, getProcDeps)) {\n this.log('CIRC_PROCESS_DEP_SKIPPED', process.id, process.depends);\n process.condition = false; /* Turn off condition */\n }\n }\n }\n }\n });\n\n if ( QSL.logger && QSL.logger.VERSION === 'qsl-logger' ) {\n QSL.logger.LOG.CIRC_FLOW_DEP_SKIPPED = '[QSL] Circular flow dependency skipped:';\n QSL.logger.LOG.CIRC_PROCESS_DEP_SKIPPED = '[QSL] Circular process dependency skipped:';\n }\n}\n","/**\n * Handle dynamic flow assignment when resources are added after load has started.\n * @param {*} QSL\n */\nexport default function(QSL) {\n /**\n * Handle dynamic flow assignment when resources are added after load has started.\n */\n QSL.addProcessFilters.add(function(flowId, config) {\n if (this.hasStarted && !flowId) {\n flowId = 'dynamic-' + Math.random().toString(36).slice(2);\n config.paused = true;\n }\n return [flowId, config];\n });\n\n /**\n * Filter out dynamic flows from initial processing.\n *\n * A run targeting one specific flow (runFlow) must pass through untouched,\n * otherwise the dynamic flow this plugin starts below would be filtered\n * out of its own run and never execute.\n */\n QSL.flowIdFilters.add(function(flowIds) {\n if (flowIds.length === 1 && flowIds[0].includes('dynamic')) return flowIds;\n return flowIds.filter(fid => !fid.includes('dynamic'));\n });\n\n /**\n * Process dynamic flows after all regular flows complete.\n * Checks if all non-dynamic flows are completed, then processes dynamic flows.\n */\n QSL.completedFlowsActions.add(function(flowsDone, flows, flowOptions) {\n if (!flows || !flowOptions) return flowsDone;\n\n /**\n * Check if all non-dynamic flows are completed\n */\n const nonDynamicFlowsDone = [...flowOptions.entries()]\n .filter(([fid]) => !fid.includes('dynamic'))\n .every(([, opt]) => opt.status === this.FLOW_STATE.COMPLETED);\n\n if (!nonDynamicFlowsDone) return false;\n\n /**\n * Process dynamic flows\n */\n const dynamicFlowIds = [...flows.keys()].filter(fid => fid.includes('dynamic'));\n if (dynamicFlowIds.length === 0) return flowsDone;\n\n for (const dynamicFlowId of dynamicFlowIds) {\n const dynamicOptions = flowOptions.get(dynamicFlowId);\n\n if (dynamicOptions && dynamicOptions.status !== this.FLOW_STATE.COMPLETED) {\n /**\n * Hand the flow to runFlow while it is still READY — runFlow\n * refuses any other status, and processFlows sets RUNNING\n * itself before the flow starts.\n */\n if (dynamicOptions.status === this.FLOW_STATE.READY) {\n this.runFlow(dynamicFlowId);\n }\n return false;\n }\n }\n return true;\n });\n}\n","/**\n * Media query condition handler\n * @param {*} QSL \n */\nexport function mediaQueryCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || !opt.startsWith('media:')) {\n return null;\n }\n return !window.matchMedia(opt.slice('media:'.length)).matches;\n });\n}\n\n/**\n * Language condition handler\n * @param {*} QSL \n */\nexport function languageCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || !opt.startsWith('lang:')) {\n return null;\n }\n const p = opt.split(':');\n const t = p[1] || 'equals';\n const v = p.slice(2).join(':');\n const l = navigator.language || navigator.languages?.[0] || '';\n \n switch (t) {\n case 'equals':\n case 'is':\n return l !== v;\n case 'contains':\n return !l.includes(v);\n case 'startsWith':\n return !l.startsWith(v);\n case 'in':\n const ls = v.split(',').map(ll => ll.trim());\n return !ls.includes(l);\n default:\n return true; // Unknown type, fail condition\n }\n });\n}\n\n/**\n * Timezone condition handler\n * @param {*} QSL \n */\nexport function timezoneCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || \n (!opt.startsWith('tz:') && !opt.startsWith('timezone:'))) {\n return null;\n }\n const p = opt.split(':');\n const t = p[1] || 'equals';\n const v = p.slice(2).join(':');\n \n try {\n const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const o = -new Date().getTimezoneOffset() / 60;\n \n switch (t) {\n case 'equals':\n case 'is':\n return tz !== v;\n case 'contains':\n return !tz.includes(v);\n case 'offset':\n return o !== parseInt(v);\n default:\n return true;\n }\n } catch (e) {\n return true;\n }\n });\n}\n\n/**\n * URL condition handler\n * @param {*} QSL \n */\nexport function urlCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || !opt.startsWith('url:')) {\n return null;\n }\n const lc = window.location;\n const hf = lc.href;\n const pn = lc.pathname;\n const se = lc.search;\n const hn = lc.hostname;\n \n const p = opt.split(':');\n const t = p[1];\n const v = p.slice(2).join(':');\n \n if (!t) return true;\n \n switch (t) {\n case 'contains':\n return !hf.includes(v);\n case 'path':\n return !pn.includes(v);\n case 'pathStartsWith':\n return !pn.startsWith(v);\n case 'pathEndsWith':\n return !pn.endsWith(v);\n case 'query':\n if (se) {\n const q = new URLSearchParams(se);\n if (v.includes('=')) {\n const [key, val] = v.split('=');\n return q.get(key) !== val;\n } else {\n return !q.has(v);\n }\n } else {\n return true;\n }\n case 'hostname':\n return !hn.includes(v);\n case 'matches':\n try {\n return !(new RegExp(v)).test(hf);\n } catch (e) {\n return true;\n }\n case 'pathMatches':\n try {\n return !(new RegExp(v)).test(pn);\n } catch (e) {\n return true; // Error parsing regex, fail condition\n }\n default:\n return true;\n }\n });\n}\n\n/**\n * User agent condition handler\n * @param {*} QSL \n */\nexport function userAgentCondition(QSL) {\n QSL.conditionHandlers.add(function(opt) {\n if (typeof opt !== 'string' || \n (!opt.startsWith('ua:') && !opt.startsWith('userAgent:'))) {\n return null;\n }\n const p = opt.split(':');\n const t = p[1] || 'contains';\n const v = p.slice(2).join(':');\n const ua = navigator.userAgent || '';\n const uaLower = ua.toLowerCase();\n const vLower = v.toLowerCase();\n\n switch (t) {\n case 'contains':\n if (!uaLower.includes(vLower)) return true;\n break;\n \n case 'equals':\n case 'is':\n if (ua !== v) return true;\n break;\n \n case 'matches':\n // Regex pattern matching\n try {\n if (!(new RegExp(v, 'i')).test(ua)) return true;\n } catch (e) {\n return true; // Error parsing regex, fail condition\n }\n break;\n \n case 'browser':\n // Detect browser\n const bMap = {\n 'chrome': /chrome/i.test(ua) && !/edg|opr/i.test(ua),\n 'firefox': /firefox/i.test(ua),\n 'safari': /safari/i.test(ua) && !/chrome|chromium|edg|opr/i.test(ua),\n 'edge': /edg/i.test(ua),\n 'opera': /opr/i.test(ua),\n 'ie': /msie|trident/i.test(ua),\n 'chromium': /chromium/i.test(ua)\n };\n const bKey = vLower;\n if (!bMap[bKey]) return true;\n break;\n \n case 'device':\n // Detect device type\n const isM = /mobile|android|iphone|ipod|blackberry|iemobile|opera mini/i.test(ua);\n const isT = /tablet|ipad|playbook|silk/i.test(ua) || (isM && /android/i.test(ua) && !/mobile/i.test(ua));\n const isD = !isM && !isT;\n \n switch (vLower) {\n case 'mobile': if (!isM) return true; break;\n case 'tablet': if (!isT) return true; break;\n case 'desktop': if (!isD) return true; break;\n default: return true;\n }\n break;\n \n case 'os':\n case 'platform':\n // Detect operating system\n const oMap = {\n 'windows': /win/i.test(ua),\n 'mac': /mac/i.test(ua),\n 'ios': /iphone|ipad|ipod/i.test(ua),\n 'android': /android/i.test(ua),\n 'linux': /linux/i.test(ua) && !/android/i.test(ua),\n 'unix': /unix/i.test(ua),\n 'chromeos': /cros/i.test(ua)\n };\n if (!oMap[vLower]) return true;\n break;\n \n default:\n return true;\n }\n \n // If we reach here, condition passed (none of the cases returned true)\n return false;\n });\n}\n\nexport default function(QSL) {\n // Media query handler\n mediaQueryCondition(QSL);\n \n // Language handler\n languageCondition(QSL);\n \n // Timezone handler\n timezoneCondition(QSL);\n \n // URL handler\n urlCondition(QSL);\n \n // User agent handler\n userAgentCondition(QSL);\n}\n"],"names":["core","VERSION","PREFIX","FLOW_TYPE","DEFAULT","ORDERED","FLOW_STATE","READY","RUNNING","COMPLETED","FLOW_OPTIONS","delay","priority","between","trigger","condition","beforeStart","onComplete","group","paused","preload","fireEvents","depends","EVENTS","STARTED","ERROR","FLOW_STARTED","FLOW_COMPLETED","ALL_COMPLETED","SKIPPED","DOMREADY","LOADED","LIFECYCLE","document","readyState","CALLBACK","types","Map","flows","flowOptions","flowGroups","currentProcessPerFlow","pendingFlows","Set","pendingProcesses","completedProcesses","loadActions","initActions","addProcessFilters","completedFlowsActions","flowIdFilters","conditionHandlers","triggerHandlers","processCompleteActions","allCompleteActions","resetActions","handlerCallbacksFilters","onAllComplete","globalResolve","logger","hasStarted","eventsEnabled","initialized","completing","autoReset","globalBetween","init","this","loaderScript","currentScript","window","__QSL__","addEventListener","once","registerType","process","Promise","resolve","_a","onBeforeStart","call","setTimeout","message","log","timestamp","Date","now","e","detail","type","config","id","error","size","cb","url","src","URL","baseURI","searchParams","get","callback","use","plugin","args","add","flowId","Math","random","toString","slice","skipped","Array","isArray","normalizedFlowId","normalizeFlowId","getOrCreateFlow","push","load","reset","processFlows","action","clear","destroy","setLogger","setOnAllComplete","useEvents","fire","event","dispatchEvent","CustomEvent","handler","set","registerTypes","list","Object","entries","map","pauseGroup","flowGroup","setFlowOptions","runGroup","runFlow","withTrigger","processes","options","status","has","ordered","prevOptions","length","checkPendingFlows","pendingFlowId","pendingOptions","every","depId","depOpt","delete","checkPendingProcesses","missingDeps","filter","hasProcess","from","values","some","flow","p","join","_depsResolved","_triggered","_waitResolve","maybeComplete","flowsDone","opt","flowIds","keys","sort","a","b","aOpts","bOpts","aHasTrigger","bHasTrigger","aPriority","fid","getConditionStatus","getTriggerFunction","triggered","res","prefetch","href","link","createElement","rel","as","crossOrigin","head","appendChild","prev","forEach","idx","then","async","run","promises","all","_b","_running","_waitPromise","execute","c","operator","conditions","h","r","o","vd","t","tF","f","fCb","triggers","waitForInteraction","passive","finishProcess","callbacks","pluginCallbacks","assign","catch","bypassSuffix","source","bypassCache","includes","render","tag","data","onError","footer","dom","onElement","onCustomResolve","el","registerProcessElement","key","value","setAttribute","replace","toLowerCase","String","onload","onerror","body","InlineScript","storedResolve","alreadyFired","eventName","resolveProcess","normalizedConfig","code","module","textContent","originalCode","JSON","stringify","wrappedCode","removeEventListener","queueMicrotask","Script","defer","integrity","InlineStyle","Stylesheet","Pixel","style","display","Image","width","height","setProperty","resolver","Shadow","customElements","whenDefined","shadowData","hidden","selector","container","querySelector","err","Error","position","insertBefore","firstChild","HTML","html","className","innerHTML","arg","prefix","isPrefixed","startsWith","whenElement","MutationObserver","root","documentElement","observer","found","disconnect","observe","childList","subtree","QSL","LOG","LOGGER_LOADED","LOGGER_LOAD_ERROR","UNKNOWN_TYPE","PROCESS_STARTED","PROCESS_COMPLETED","PROCESS_FAILED","STYLESHEET_STARTED","STYLESHEET_LOADED","STYLESHEET_FAILED","INLINE_SCRIPT_STARTED","INLINE_SCRIPT_SUCCESS","INLINE_SCRIPT_ERROR","INLINE_STYLE_STARTED","INLINE_STYLE_SUCCESS","INLINE_STYLE_ERROR","IMAGE_STARTED","IMAGE_LOADED","IMAGE_FAILED","SHADOW_STARTED","SHADOW_SUCCESS","SHADOW_FAILED","HTML_STARTED","HTML_SUCCESS","HTML_FAILED","PRELOAD_ERROR","FLOW_DEP_SKIPPED","DEP_NOT_FOUND","RESET","console","customEvents","processElementMap","WeakMap","processCounter","documentListener","windowListener","isIntercepting","normalizeScriptPath","u","pathname","split","iterator","eventType","changeEventName","currentScriptId","targetFlowId","processElement","processId","stack","lines","i","match","file","qIndex","indexOf","stackFile","trim","qIdx","hIdx","endIdx","min","normalizedFile","lastSlash","lastIndexOf","fileName","normalizedSrc","srcLastSlash","srcFileName","find","_eventKey","processKey","events","name","listener","opts","Event","detectCircularDependency","getDeps","visited","deps","getFlowDeps","getProcDeps","proc","dep","CIRC_FLOW_DEP_SKIPPED","CIRC_PROCESS_DEP_SKIPPED","dynamicFlowIds","dynamicFlowId","dynamicOptions","matchMedia","matches","v","l","navigator","language","languages","ll","tz","Intl","DateTimeFormat","resolvedOptions","timeZone","getTimezoneOffset","parseInt","lc","location","hf","pn","se","search","hn","hostname","endsWith","q","URLSearchParams","val","RegExp","test","ua","userAgent","uaLower","vLower","chrome","firefox","safari","edge","opera","ie","chromium","isM","isT","isD","windows","mac","ios","android","linux","unix","chromeos","requestIdleCallback","ms","Number","isFinite","IntersectionObserver","entry","isIntersecting","query","mql"],"mappings":"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"}
|