@jucie.io/engine 1.1.45 → 1.1.52
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/package.json +14 -9
- package/dist/services/command-manager.js +0 -2
- package/dist/services/command-manager.js.map +0 -7
- package/dist/services/database.js +0 -11
- package/dist/services/database.js.map +0 -7
- package/dist/services/local-storage.js +0 -2
- package/dist/services/local-storage.js.map +0 -7
- package/dist/services/message.js +0 -9
- package/dist/services/message.js.map +0 -7
- package/dist/services/painter.js +0 -2
- package/dist/services/painter.js.map +0 -7
- package/dist/services/server.js +0 -4
- package/dist/services/server.js.map +0 -7
- package/dist/services/signal.js +0 -2
- package/dist/services/signal.js.map +0 -7
- package/dist/services/socket.js +0 -2
- package/dist/services/socket.js.map +0 -7
- package/dist/services/state-machine.js +0 -2
- package/dist/services/state-machine.js.map +0 -7
- package/dist/services/storage.js +0 -5
- package/dist/services/storage.js.map +0 -7
- package/dist/services/worker.js +0 -2
- package/dist/services/worker.js.map +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jucie.io/engine",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.52",
|
|
4
4
|
"description": "A powerful, extensible service engine with middleware, async operations, and lifecycle management (includes core + services)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/main.js",
|
|
@@ -13,14 +13,7 @@
|
|
|
13
13
|
"./service-provider": {
|
|
14
14
|
"types": "./dist/ServiceProvider.d.ts",
|
|
15
15
|
"import": "./dist/ServiceProvider.js"
|
|
16
|
-
}
|
|
17
|
-
"./command-manager": "./dist/services/command-manager.js",
|
|
18
|
-
"./message": "./dist/services/message.js",
|
|
19
|
-
"./painter": "./dist/services/painter.js",
|
|
20
|
-
"./server": "./dist/services/server.js",
|
|
21
|
-
"./socket": "./dist/services/socket.js",
|
|
22
|
-
"./storage": "./dist/services/storage.js",
|
|
23
|
-
"./worker": "./dist/services/worker.js"
|
|
16
|
+
}
|
|
24
17
|
},
|
|
25
18
|
"files": [
|
|
26
19
|
"dist/",
|
|
@@ -59,5 +52,17 @@
|
|
|
59
52
|
"@jucie.io/state": "file:../state",
|
|
60
53
|
"@jucie.io/reactive": "file:../reactive"
|
|
61
54
|
},
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"firebase-admin": "^12.0.0",
|
|
57
|
+
"@aws-sdk/client-s3": "^3.0.0"
|
|
58
|
+
},
|
|
59
|
+
"peerDependenciesMeta": {
|
|
60
|
+
"firebase-admin": {
|
|
61
|
+
"optional": true
|
|
62
|
+
},
|
|
63
|
+
"@aws-sdk/client-s3": {
|
|
64
|
+
"optional": true
|
|
65
|
+
}
|
|
66
|
+
},
|
|
62
67
|
"devDependencies": {}
|
|
63
68
|
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var W=Object.freeze(Object.create(null));function I(t,e,n="value"){if(Array.isArray(e)){for(let i of e)if(T(t,i))return!0;let r=e.map(d).join(" | ");throw new TypeError(`${n} must be one of: ${r}. Got ${d(t)}`)}if(!T(t,e))throw new TypeError(`${n} must be ${d(e)}. Got ${d(t)}`);return!0}function T(t,e){return e===String?typeof t=="string":e===Number?typeof t=="number"&&!isNaN(t):e===Boolean?typeof t=="boolean":e===Symbol?typeof t=="symbol":e===BigInt?typeof t=="bigint":e===Function?typeof t=="function":e===Array?Array.isArray(t):e===Object?t!==null&&typeof t=="object"&&!Array.isArray(t):t instanceof e}function d(t){return t===String?"String":t===Number?"Number":t===Boolean?"Boolean":t===Array?"Array":t===Object?"Object":t===Function?"Function":t===Date?"Date":t===RegExp?"RegExp":t===Promise?"Promise":t===Map?"Map":t===Set?"Set":t===WeakMap?"WeakMap":t===WeakSet?"WeakSet":t===Symbol?"Symbol":t===BigInt?"BigInt":t===Error?"Error":typeof t=="string"?"string":typeof t=="number"?"number":typeof t=="boolean"?"boolean":typeof t=="symbol"?"symbol":typeof t=="bigint"?"bigint":typeof t=="function"?"function":Array.isArray(t)?"Array":t===null?"null":t===void 0?"undefined":typeof t=="object"?t.constructor?.name||"Object":"unknown"}function l(t,e="value"){return n=>I(n,t,e)}var g=new Map,_=new WeakMap;var f=(t,e=[])=>{let n=e.length>0?l(e,"return value"):null;if(g.has(t))return console.warn(`Definition type "${t}" already exists`),g.get(t);let r=(i,s,...c)=>{l(String,"name")(i),l(Function,"factory")(s);let a=(...o)=>{try{let u=[...o,...c],y=s(...u);if(n&&y===void 0)throw new Error(`Factory ${t} must return a value for ${i}`);return n&&n(y),y}catch(u){throw console.error(`Error creating definition "${i}"`,u),u}};return Object.defineProperty(a,"_name",{value:i,enumerable:!1,configurable:!1}),_.set(a,t),a};return g.set(t,r),r};var F=new Set(["__proto__","prototype","constructor"]),v=new Set(["use","install","uninstall","relay","state","debug"]),$=64,L=/^[a-zA-Z_$][a-zA-Z_$0-9]*$/;function P(t,e="key"){if(F.has(t))throw new Error(`Illegal key "${t}" in ${e}`)}function m(t){if(P(t,"namespace"),typeof t!="string")throw new Error(`Namespace must be a string, got ${typeof t}`);if(!L.test(t))throw new Error(`Invalid namespace "${t}". Must be a valid JS identifier`);if(t.length>$)throw new Error(`Namespace "${t}" too long (max ${$} chars)`);if(v.has(t))throw new Error(`Namespace "${t}" is reserved`);return t}var b=f("MIDDLEWARE",[Function,Array]),w=f("ACTIONS",[Object]),A=f("UNINSTALL"),E=f("INITIALIZE"),x=f("GETTERS",[Object]);var p=class t{static create(e){return new t(e)}#e;#r;#t={MIDDLEWARE:null,GETTERS:null,ACTIONS:null,INITIALIZE:null,UNINSTALL:null};constructor(e){this.#e=e}#n(e,n,r){if(this.#t[e])throw new Error(`${e} already defined for ${this.#e}`);this.#t[e]=r(this.#e,n)}defineMiddleware=e=>this.#n("MIDDLEWARE",e,b);defineGetters=e=>this.#n("GETTERS",e,x);defineActions=e=>this.#n("ACTIONS",e,w);defineInitialize=e=>this.#n("INITIALIZE",e,E);defineUninstall=e=>this.#n("UNINSTALL",e,A);_toArray(){return[this.#t.MIDDLEWARE,this.#t.GETTERS,this.#t.ACTIONS,this.#t.INITIALIZE,this.#t.UNINSTALL].filter(Boolean)}};var h=class t{static#e=new Set;static manifest={name:"base",dependencies:[],version:"1.0.0",description:"Base extension template"};static config=null;static unique=!1;static configure(e={}){return{install:(n,r)=>this.install(n,r),manifest:this.manifest,config:{...this.config||this.manifest.defaults||{},...e},unique:!0,configured:!0}}static install(e,n){try{let{namespace:r}=this.manifest;m(r);let i=new this;t.#e.add(i),Object.defineProperty(i,"config",{value:Object.freeze({...n}),writable:!1,configurable:!1,enumerable:!1}),Object.defineProperty(i,"context",{get:()=>e(),configurable:!1,enumerable:!1}),Object.defineProperty(i,"useContext",{value:(...c)=>e(...c),writable:!1,configurable:!1,enumerable:!1});let s=p.create(r);if(i.setup){let c={defineActions:o=>s.defineActions(()=>o(e,n)),defineMiddleware:o=>s.defineMiddleware(()=>o(e,n)),defineGetters:o=>s.defineGetters(()=>o(e,n)),defineInitialize:o=>s.defineInitialize(()=>o(e,n)),defineUninstall:o=>s.defineUninstall(()=>o(e,n))},a=i.setup(c);return a?.then?a.then(()=>s._toArray()):s._toArray()}return i.middleware&&s.defineMiddleware(()=>i.middleware(e,n)),i.getters&&s.defineGetters(()=>i.getters(e,n)),i.actions&&s.defineActions(()=>i.actions(e,n)),i.initialize&&s.defineInitialize(()=>i.initialize(e,n)),i.uninstall&&s.defineUninstall(()=>i.uninstall(e,n)),s._toArray()}catch(r){throw r}}};var Ue=Symbol("jucie.engine");var O=class extends h{#e=[];#r=new Map;static manifest={name:"Command manager",namespace:"commandManager",description:"Manages commands for the engine",version:"1.0.0",author:"Jucie",license:"MIT",dependencies:[]};actions(e){return{useCommands:(...n)=>{let r=[];for(let i of n){let s=i._name,c=i(e),{target:a,commands:o}=c;this.#t({name:s,target:a,commands:o}),r.push(()=>this.#n(s))}return()=>{for(let i of r)i()}}}}#t({name:e,target:n,commands:r}){for(let i of r){let s=i.options||!1,c=`${i.event}-${n}`;if(!this.#r.has(c)){let a=o=>{this.#i(o,i.event)};n.addEventListener(i.event,a,s),this.#r.set(c,{handler:a,options:s,refCount:0})}this.#r.get(c).refCount++,this.#e.push({...i,target:n,name:e})}}#n(e){let n=this.#e.filter(r=>r.name===e);for(let r of n){let i=`${r.event}-${r.target}`,s=this.#r.get(i);s&&(s.refCount--,s.refCount===0&&(r.target.removeEventListener(r.event,s.handler,s.options),this.#r.delete(i)))}this.#e=this.#e.filter(r=>r.name!==e)}#i(e,n){for(let r of this.#e)r.event===n&&this.#s(r.keys,e)&&(r.matchTarget&&!this.#a(r.matchTarget,e)||r.when&&!r.when(this._engine)||(r.preventDefault&&e.preventDefault(),r.stopPropagation&&e.stopPropagation(),r.action(e)))}#s(e,n){if(!e||e.includes("*"))return!0;let r=this.#o(n);for(let i of e)if(this.#c(i,r))return!0;return!1}#o(e){let n=[];return e.ctrlKey&&n.push("Ctrl"),e.metaKey&&n.push("Meta"),e.altKey&&n.push("Alt"),e.shiftKey&&n.push("Shift"),n.push(e.key),n.join("+")}#c(e,n){if(e===n)return!0;if(e==="char")return n.length===1&&n.match(/^[a-z0-9]$/i);if(e==="Arrow*")return n.includes("Arrow");if(e.endsWith("+*")){let r=e.slice(0,-2);return n.startsWith(r+"+")}return!1}#a(e,n){let r=n.target;return e?typeof e=="function"?e(n):e.startsWith(".")||e.startsWith("#")?r.closest(e)!==null:r.tagName===e.toUpperCase():!0}};var V=f("commands",[Object]);export{O as CommandManager,V as defineCommands};
|
|
2
|
-
//# sourceMappingURL=command-manager.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/lib/relay/src/Relay.js", "../../src/utils/typeChecker.js", "../../src/definitions/createDefinition.js", "../../src/utils/asserts.js", "../../src/definitions/defaults.js", "../../src/definitions/DefinitionBuilder.js", "../../src/ServiceProvider.js", "../../src/global.js", "../../services/command-manager/src/CommandManager.js", "../../services/command-manager/src/defineCommands.js"],
|
|
4
|
-
"sourcesContent": ["// Simple, readable relay with wildcard matching and no indexing\n\nconst GLOBAL_NS_OBJ = Object.freeze(Object.create(null));\n\nfunction queueMicrotask(fn) {\n if (globalThis.queueMicrotask && typeof globalThis.queueMicrotask === 'function') {\n globalThis.queueMicrotask(fn);\n return;\n }\n setTimeout(fn, 0);\n}\n\nclass Channel {\n #nsObj; #relay;\n constructor(nsObj, relay) { this.#nsObj = nsObj; this.#relay = relay; }\n\n // Any source -> me\n on(event, handler) {\n return this.#relay.subscribe(event, GLOBAL_NS_OBJ, this.#nsObj, handler);\n }\n\n once(event, handler) {\n return this.#relay.once(event, GLOBAL_NS_OBJ, this.#nsObj, handler);\n }\n\n // Me -> everyone (sender never hears itself)\n broadcast(event, ...payload) {\n this.#relay.publish(event, this.#nsObj, GLOBAL_NS_OBJ, payload);\n }\n\n // Specific source -> me\n from(fromNs) {\n return {\n subscribe: (event, handler) => this.#relay.subscribe(event, fromNs, this.#nsObj, handler),\n once: (event, handler) => this.#relay.once(event, fromNs, this.#nsObj, handler),\n };\n }\n\n // Me -> specific target\n to(toNs) {\n return {\n publish: (event, ...payload) => this.#relay.publish(event, this.#nsObj, toNs, payload),\n publishAsync: (event, ...payload) => this.#relay.publishAsync(event, this.#nsObj, toNs, payload),\n };\n }\n}\n\nexport class Relay {\n #channels = new WeakMap(); // nsObj -> Channel\n #events = new Map(); // eventName -> Set<Listener>\n #onError = null;\n\n static create(config = {}) {\n return new Relay(config);\n }\n\n constructor({ onError = null } = {}) {\n this.#onError = onError;\n this.createChannel(GLOBAL_NS_OBJ);\n }\n\n // Public convenience\n channel(nsObj) { return this.createChannel(nsObj); }\n createChannel(nsObj) {\n if (this.#channels.has(nsObj)) return this.#channels.get(nsObj);\n const ch = new Channel(nsObj, this);\n this.#channels.set(nsObj, ch);\n return ch;\n }\n\n // Internal helpers\n #listeners(event) {\n let set = this.#events.get(event);\n if (!set) { set = new Set(); this.#events.set(event, set); }\n return set;\n }\n\n // Wildcard matcher:\n // - If published `from` is GLOBAL, it matches every listener.from\n // - If listener.from is GLOBAL, it matches every published from\n // Same for `to`. This makes broadcast (to = GLOBAL) hit specific targets too.\n static #matchSide(published, constraint) {\n return published === GLOBAL_NS_OBJ || constraint === GLOBAL_NS_OBJ || published === constraint;\n }\n\n static #matches(publishedFrom, publishedTo, listenerFrom, listenerTo) {\n return Relay.#matchSide(publishedFrom, listenerFrom)\n && Relay.#matchSide(publishedTo, listenerTo);\n }\n\n subscribe(event, from, to, handler) {\n const listener = { from, to, handler };\n this.#listeners(event).add(listener);\n return () => {\n const set = this.#events.get(event);\n if (set) set.delete(listener);\n };\n }\n\n once(event, from, to, handler) {\n let off = null;\n const wrapped = (payload) => {\n try { handler(payload); } finally { off && off(); }\n };\n off = this.subscribe(event, from, to, wrapped);\n return off;\n }\n\n offAllFor(nsObj) {\n for (const set of this.#events.values()) {\n for (const l of Array.from(set)) {\n if (l.from === nsObj || l.to === nsObj) set.delete(l);\n }\n }\n }\n\n listenerCount(event) {\n const set = this.#events.get(event);\n return set ? set.size : 0;\n }\n\n #deliver(event, from, to, payload) {\n const set = this.#events.get(event);\n if (!set || set.size === 0) return;\n\n for (const l of set) {\n // Always skip self-delivery\n if (l.to === from) continue;\n\n if (Relay.#matches(from, to, l.from, l.to)) {\n try { l.handler(...payload); }\n catch (err) { if (this.#onError) this.#onError(err, { event, from, to, listener: l }); }\n }\n }\n }\n\n publish(event, from, to, payload) {\n this.#deliver(event, from, to, payload);\n }\n\n publishAsync(event, from, to, payload) {\n queueMicrotask(() => this.#deliver(event, from, to, payload));\n }\n\n broadcast(event, from, payload) {\n this.publish(event, from, GLOBAL_NS_OBJ, payload);\n }\n}\n", "/**\n * Type Checker Utility\n * \n * Supports syntax like:\n * - createDefinition('action', [Array, Function]) // Array or Function\n * - createDefinition('name', String) // Must be String\n * - createDefinition('items', Array) // Must be Array\n * - createDefinition('callback', Function) // Must be Function\n * - createDefinition('value', [String, Number]) // String or Number\n */\n\n/**\n * Type definitions mapping constructor names to actual constructors\n */\nconst TYPE_MAP = {\n String,\n Number,\n Boolean,\n Array,\n Object,\n Function,\n Date,\n RegExp,\n Promise,\n Map,\n Set,\n WeakMap,\n WeakSet,\n Symbol,\n BigInt,\n Error,\n TypeError,\n RangeError,\n ReferenceError,\n SyntaxError,\n EvalError,\n URIError\n};\n\n/**\n * Checks if a value matches the expected type(s)\n * @param {*} value - The value to check\n * @param {Function|Array<Function>} expectedType - Single type or array of possible types\n * @param {string} name - Name of the parameter for error messages\n * @returns {boolean} - True if value matches expected type(s)\n */\nexport function checkType(value, expectedType, name = 'value') {\n // Handle array of possible types\n if (Array.isArray(expectedType)) {\n for (const type of expectedType) {\n if (matchesType(value, type)) {\n return true;\n }\n }\n \n const typeNames = expectedType.map(getTypeName).join(' | ');\n throw new TypeError(`${name} must be one of: ${typeNames}. Got ${getTypeName(value)}`);\n }\n \n // Handle single type\n if (!matchesType(value, expectedType)) {\n throw new TypeError(`${name} must be ${getTypeName(expectedType)}. Got ${getTypeName(value)}`);\n }\n \n return true;\n}\n\n/**\n * Checks if a value matches a specific type\n * @param {*} value - The value to check\n * @param {Function} type - The expected constructor/type\n * @returns {boolean} - True if value matches the type\n */\nfunction matchesType(value, type) {\n // Handle primitive constructors\n if (type === String) {\n return typeof value === 'string';\n }\n if (type === Number) {\n return typeof value === 'number' && !isNaN(value);\n }\n if (type === Boolean) {\n return typeof value === 'boolean';\n }\n if (type === Symbol) {\n return typeof value === 'symbol';\n }\n if (type === BigInt) {\n return typeof value === 'bigint';\n }\n if (type === Function) {\n return typeof value === 'function';\n }\n \n // Handle object constructors (including Array, Object, Date, etc.)\n if (type === Array) {\n return Array.isArray(value);\n }\n if (type === Object) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n \n // Handle other constructors (Date, RegExp, Map, Set, etc.)\n return value instanceof type;\n}\n\n/**\n * Gets a human-readable name for a type\n * @param {*} value - The value or constructor to get name for\n * @returns {string} - Human-readable type name\n */\nfunction getTypeName(value) {\n if (value === String) return 'String';\n if (value === Number) return 'Number';\n if (value === Boolean) return 'Boolean';\n if (value === Array) return 'Array';\n if (value === Object) return 'Object';\n if (value === Function) return 'Function';\n if (value === Date) return 'Date';\n if (value === RegExp) return 'RegExp';\n if (value === Promise) return 'Promise';\n if (value === Map) return 'Map';\n if (value === Set) return 'Set';\n if (value === WeakMap) return 'WeakMap';\n if (value === WeakSet) return 'WeakSet';\n if (value === Symbol) return 'Symbol';\n if (value === BigInt) return 'BigInt';\n if (value === Error) return 'Error';\n \n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'symbol') return 'symbol';\n if (typeof value === 'bigint') return 'bigint';\n if (typeof value === 'function') return 'function';\n if (Array.isArray(value)) return 'Array';\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'object') {\n return value.constructor?.name || 'Object';\n }\n \n return 'unknown';\n}\n\n/**\n * Creates a type checker function for a specific parameter\n * @param {Function|Array<Function>} expectedType - Expected type(s)\n * @param {string} name - Parameter name\n * @returns {Function} - Type checker function\n */\nexport function createTypeChecker(expectedType, name = 'value') {\n return (value) => checkType(value, expectedType, name);\n}\n\n/**\n * Validates an object against a schema\n * @param {Object} obj - Object to validate\n * @param {Object} schema - Schema definition { prop: Type, prop2: [Type1, Type2] }\n * @param {string} objName - Name of the object for error messages\n */\nexport function validateObject(obj, schema, objName = 'object') {\n if (!obj || typeof obj !== 'object') {\n throw new TypeError(`${objName} must be an object`);\n }\n \n for (const [prop, expectedType] of Object.entries(schema)) {\n if (prop in obj) {\n checkType(obj[prop], expectedType, `${objName}.${prop}`);\n }\n }\n}\n\n/**\n * Creates a validator function for an object schema\n * @param {Object} schema - Schema definition\n * @param {string} objName - Name of the object\n * @returns {Function} - Validator function\n */\nexport function createObjectValidator(schema, objName = 'object') {\n return (obj) => validateObject(obj, schema, objName);\n}\n\n// Export the type map for advanced usage\nexport { TYPE_MAP };\n", "const DefinitionTypes = new Map();\nconst Definitions = new WeakMap();\nimport { createTypeChecker } from '../utils/typeChecker.js';\n\n/**\n * Creates a definition type with return type validation\n * @param {string} type - The definition type name\n * @param {Function|Array<Function>} returnTypes - Expected return type(s)\n * @returns {Function} - Definition creator function\n */\n\n\nexport const definitionType = (definition) => {\n if (Definitions.has(definition)) {\n return Definitions.get(definition);\n }\n return undefined;\n}\n\nexport const createDefinition = (type, returnTypes = []) => { \n // Create type checker for return values if returnTypes specified\n const returnTypeChecker = returnTypes.length > 0 ? createTypeChecker(returnTypes, 'return value') : null;\n \n if (DefinitionTypes.has(type)) {\n console.warn(`Definition type \"${type}\" already exists`);\n return DefinitionTypes.get(type);\n }\n\n const definitionType = (name, factory, ...defaultArgs) => {\n // Validate inputs using type checker\n createTypeChecker(String, 'name')(name);\n createTypeChecker(Function, 'factory')(factory);\n\n const definition = (...args) => {\n try {\n const combinedArgs = [...args, ...defaultArgs];\n const res = factory(...combinedArgs);\n \n if (returnTypeChecker && res === undefined) {\n throw new Error(`Factory ${type} must return a value for ${name}`);\n }\n\n // Use type checker to validate return value\n if (returnTypeChecker) {\n returnTypeChecker(res);\n }\n\n return res\n } catch (error) {\n console.error(`Error creating definition \"${name}\"`, error);\n throw error;\n }\n }\n\n Object.defineProperty(definition, '_name', {\n value: name,\n enumerable: false,\n configurable: false\n });\n\n Definitions.set(definition, type);\n\n return definition;\n }\n\n DefinitionTypes.set(type, definitionType);\n\n return definitionType;\n}; ", "// utils/asserts.js\n\nconst BAD_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\nconst RESERVED_NAMESPACES = new Set(['use', 'install', 'uninstall', 'relay', 'state', 'debug']);\n\nconst MAX_NAME_LENGTH = 64;\nconst VALID_NAME = /^[a-zA-Z_$][a-zA-Z_$0-9]*$/;\n\n/**\n * Throw if key is unsafe (__proto__, constructor, etc.)\n */\nexport function assertSafeKey(key, where = 'key') {\n if (BAD_KEYS.has(key)) {\n throw new Error(`Illegal key \"${key}\" in ${where}`);\n }\n}\n\n/**\n * Validate a namespace string: format, length, reserved words, proto poisoning.\n */\nexport function assertNamespace(ns) {\n assertSafeKey(ns, 'namespace');\n if (typeof ns !== 'string') {\n throw new Error(`Namespace must be a string, got ${typeof ns}`);\n }\n if (!VALID_NAME.test(ns)) {\n throw new Error(`Invalid namespace \"${ns}\". Must be a valid JS identifier`);\n }\n if (ns.length > MAX_NAME_LENGTH) {\n throw new Error(`Namespace \"${ns}\" too long (max ${MAX_NAME_LENGTH} chars)`);\n }\n if (RESERVED_NAMESPACES.has(ns)) {\n throw new Error(`Namespace \"${ns}\" is reserved`);\n }\n return ns;\n}\n\n/**\n * Validate an action or getter name within a namespace.\n */\nexport function assertMemberName(name, namespace, kind = 'member') {\n assertSafeKey(name, `${kind}:${namespace}`);\n if (typeof name !== 'string') {\n throw new Error(`${kind} name in ${namespace} must be a string`);\n }\n if (!VALID_NAME.test(name)) {\n throw new Error(`Invalid ${kind} name \"${name}\" in ${namespace}`);\n }\n if (name.length > MAX_NAME_LENGTH) {\n throw new Error(\n `${kind} name \"${name}\" in ${namespace} too long (max ${MAX_NAME_LENGTH})`\n );\n }\n return name;\n}\n", "import { createDefinition, definitionType } from './createDefinition.js';\nexport const defineMiddleware = createDefinition('MIDDLEWARE', [Function, Array]);\nexport const defineActions = createDefinition('ACTIONS', [Object]);\nexport const defineUninstall = createDefinition('UNINSTALL');\nexport const defineInitialize = createDefinition('INITIALIZE');\nexport const defineGetters = createDefinition('GETTERS', [Object]);\nexport { createDefinition, definitionType };", "// DefinitionBuilder.js\nimport { defineActions, defineGetters, defineMiddleware, defineInitialize, defineUninstall } from './defaults.js';\n\nexport class DefinitionBuilder {\n static create(namespace) {\n return new DefinitionBuilder(namespace);\n }\n\n #ns; #args;\n #slots = { MIDDLEWARE:null, GETTERS:null, ACTIONS:null, INITIALIZE:null, UNINSTALL:null };\n constructor(namespace) { this.#ns = namespace }\n\n #set(type, factory, creator) {\n if (this.#slots[type]) throw new Error(`${type} already defined for ${this.#ns}`);\n this.#slots[type] = creator(this.#ns, factory);\n }\n\n defineMiddleware = (factory) => this.#set('MIDDLEWARE', factory, defineMiddleware);\n defineGetters = (factory) => this.#set('GETTERS', factory, defineGetters);\n defineActions = (factory) => this.#set('ACTIONS', factory, defineActions);\n defineInitialize = (factory) => this.#set('INITIALIZE', factory, defineInitialize);\n defineUninstall = (factory) => this.#set('UNINSTALL', factory, defineUninstall);\n\n _toArray() {\n return [\n this.#slots.MIDDLEWARE,\n this.#slots.GETTERS,\n this.#slots.ACTIONS,\n this.#slots.INITIALIZE,\n this.#slots.UNINSTALL\n ].filter(Boolean);\n }\n}\n\n", "import { assertNamespace } from './utils/asserts.js';\nimport { DefinitionBuilder } from './definitions/DefinitionBuilder.js';\n\n\nexport class ServiceProvider {\n static #services = new Set();\n\n static manifest = {\n name: 'base',\n dependencies: [],\n version: '1.0.0',\n description: 'Base extension template',\n };\n\n static config = null;\n\n static unique = false;\n\n static configure(options = {}) {\n return {\n install: (useContext, config) => this.install(useContext, config),\n manifest: this.manifest,\n config: { ...(this.config || this.manifest.defaults || {}), ...options },\n unique: true,\n configured: true\n };\n }\n\n static install(useContext, config) { \n try {\n const {namespace} = this.manifest;\n assertNamespace(namespace);\n\n // instantiate\n const instance = new this();\n ServiceProvider.#services.add(instance);\n\n // bind context/config\n // bind config (frozen to avoid accidental mutation)\n Object.defineProperty(instance, 'config', {\n value: Object.freeze({ ...config }),\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n // expose both a live context getter AND the keyed accessor\n Object.defineProperty(instance, 'context', {\n get: () => useContext(), // always fresh, via your proxy\n configurable: false,\n enumerable: false,\n });\n \n Object.defineProperty(instance, 'useContext', {\n value: (...keys) => useContext(...keys),\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n const builder = DefinitionBuilder.create(namespace);\n\n if (instance.setup) {\n // Create properly bound context for setup pattern\n const setupContext = {\n defineActions: (factory) => builder.defineActions(() => factory(useContext, config)),\n defineMiddleware: (factory) => builder.defineMiddleware(() => factory(useContext, config)),\n defineGetters: (factory) => builder.defineGetters(() => factory(useContext, config)),\n defineInitialize: (factory) => builder.defineInitialize(() => factory(useContext, config)),\n defineUninstall: (factory) => builder.defineUninstall(() => factory(useContext, config))\n };\n const maybe = instance.setup(setupContext);\n return maybe?.then ? maybe.then(() => builder._toArray()) : builder._toArray();\n }\n\n if (instance.middleware) builder.defineMiddleware(() => instance.middleware(useContext, config));\n if (instance.getters) builder.defineGetters (() => instance.getters(useContext, config));\n if (instance.actions) builder.defineActions (() => instance.actions(useContext, config));\n if (instance.initialize) builder.defineInitialize(() => instance.initialize(useContext, config));\n if (instance.uninstall) builder.defineUninstall (() => instance.uninstall(useContext, config));\n\n return builder._toArray();\n } catch (error) {\n throw error;\n }\n }\n}", "const ENGINE_CONTEXT = Symbol('jucie.engine');\n\n/**\n * Registers the engine globally, but only if no engine has already been set.\n * @param {object} engine \n */\n\nexport function provideEngine(engine) {\n if (!globalThis[ENGINE_CONTEXT]) {\n globalThis[ENGINE_CONTEXT] = engine;\n }\n}\n\nexport function hasEngine() {\n return globalThis[ENGINE_CONTEXT] !== undefined;\n}\n\n/**\n * Forcefully override the engine in the global context.\n * Useful for testing or resetting.\n */\nexport function forceEngine(engine) {\n globalThis[ENGINE_CONTEXT] = engine;\n}\n\n/**\n * Retrieves the globally registered engine.\n */\nexport function getEngine() {\n return globalThis[ENGINE_CONTEXT] || null;\n}\n\n/**\n * Retrieves the globally registered engine.\n */\nexport function useEngine() {\n return getEngine();\n}", "import { ServiceProvider } from '@jucie.io/engine';\n\nexport class CommandManager extends ServiceProvider {\n #bindings = [];\n #listeners = new Map(); // Track event listeners to avoid duplicates\n\n static manifest = {\n name: 'Command manager',\n namespace: 'commandManager',\n description: 'Manages commands for the engine',\n version: '1.0.0',\n author: 'Jucie',\n license: 'MIT',\n dependencies: [],\n }\n\n actions(useContext) {\n return {\n useCommands: (...commands) => {\n const unregisterFns = []\n for (const command of commands) {\n const name = command._name;\n const config = command(useContext);\n const { target, commands } = config;\n this.#registerGroup({ name, target, commands });\n unregisterFns.push(() => this.#unregisterGroup(name));\n }\n\n return () => {\n for (const unregisterFn of unregisterFns) {\n unregisterFn();\n }\n }\n }\n }\n }\n\n #registerGroup({ name, target, commands }) {\n for (const command of commands) {\n const options = command.options || false;\n const listenerKey = `${command.event}-${target}`;\n\n // Only add ONE event listener per event type per target\n if (!this.#listeners.has(listenerKey)) {\n const handler = (e) => {\n this.#handleEvent(e, command.event);\n }\n\n target.addEventListener(command.event, handler, options);\n this.#listeners.set(listenerKey, { handler, options, refCount: 0 });\n }\n\n // Increment reference count\n this.#listeners.get(listenerKey).refCount++;\n\n // Store the binding without the handler (since it's shared)\n this.#bindings.push({ ...command, target, name });\n }\n }\n\n #unregisterGroup(name) {\n const toRemove = this.#bindings.filter(b => b.name === name);\n\n for (const b of toRemove) {\n const listenerKey = `${b.event}-${b.target}`;\n const listener = this.#listeners.get(listenerKey);\n\n if (listener) {\n listener.refCount--;\n\n // Only remove the event listener when ref count reaches 0\n if (listener.refCount === 0) {\n b.target.removeEventListener(b.event, listener.handler, listener.options);\n this.#listeners.delete(listenerKey);\n }\n }\n }\n\n this.#bindings = this.#bindings.filter(b => b.name !== name);\n }\n\n #handleEvent(e, eventType) { \n for (const binding of this.#bindings) {\n if (binding.event !== eventType) continue;\n if (!this.#matchesKey(binding.keys, e)) continue;\n if (binding.matchTarget && !this.#matchesTarget(binding.matchTarget, e)) continue;\n if (binding.when && !binding.when(this._engine)) continue;\n\n if (binding.preventDefault) { \n e.preventDefault()\n };\n\n if (binding.stopPropagation) {\n e.stopPropagation();\n }\n\n binding.action(e);\n }\n }\n\n #matchesKey(keys, e) {\n if (!keys || keys.includes('*')) return true;\n\n const combo = this.#normalizeCombo(e);\n\n for (const key of keys) {\n if (this.#matchPattern(key, combo)) return true;\n }\n\n return false;\n }\n\n #normalizeCombo(e) {\n const parts = [];\n if (e.ctrlKey) parts.push('Ctrl');\n if (e.metaKey) parts.push('Meta');\n if (e.altKey) parts.push('Alt');\n if (e.shiftKey) parts.push('Shift');\n parts.push(e.key);\n return parts.join('+');\n }\n\n #matchPattern(pattern, combo) {\n if (pattern === combo) return true;\n\n // Match typed characters only\n if (pattern === 'char') {\n return combo.length === 1 && combo.match(/^[a-z0-9]$/i);\n }\n\n // Match arrow keys\n if (pattern === 'Arrow*') {\n return combo.includes('Arrow');\n }\n\n // Match modifier combos like 'Ctrl+*'\n if (pattern.endsWith('+*')) {\n const prefix = pattern.slice(0, -2);\n return combo.startsWith(prefix + '+');\n }\n\n return false;\n }\n\n #matchesTarget(matchTarget, e) {\n const el = e.target;\n\n if (!matchTarget) return true;\n if (typeof matchTarget === 'function') return matchTarget(e);\n\n if (matchTarget.startsWith('.') || matchTarget.startsWith('#')) {\n return el.closest(matchTarget) !== null;\n }\n\n return el.tagName === matchTarget.toUpperCase();\n }\n}", "import { createDefinition } from '@jucie.io/engine';\n\nexport const defineCommands = createDefinition('commands', [Object]);"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["GLOBAL_NS_OBJ", "checkType", "value", "expectedType", "name", "type", "matchesType", "typeNames", "getTypeName", "createTypeChecker", "DefinitionTypes", "Definitions", "createDefinition", "type", "returnTypes", "returnTypeChecker", "createTypeChecker", "DefinitionTypes", "definitionType", "name", "factory", "defaultArgs", "definition", "args", "combinedArgs", "res", "error", "Definitions", "BAD_KEYS", "RESERVED_NAMESPACES", "MAX_NAME_LENGTH", "VALID_NAME", "assertSafeKey", "key", "where", "assertNamespace", "ns", "defineMiddleware", "createDefinition", "defineActions", "defineUninstall", "defineInitialize", "defineGetters", "DefinitionBuilder", "_DefinitionBuilder", "namespace", "#ns", "#args", "#slots", "#set", "type", "factory", "creator", "defineMiddleware", "defineGetters", "defineActions", "defineInitialize", "defineUninstall", "ServiceProvider", "_ServiceProvider", "#services", "options", "useContext", "config", "namespace", "assertNamespace", "instance", "keys", "builder", "DefinitionBuilder", "setupContext", "factory", "maybe", "error", "ENGINE_CONTEXT", "CommandManager", "ServiceProvider", "#bindings", "#listeners", "useContext", "commands", "unregisterFns", "command", "name", "config", "target", "#registerGroup", "#unregisterGroup", "unregisterFn", "options", "listenerKey", "handler", "e", "#handleEvent", "toRemove", "b", "listener", "eventType", "binding", "#matchesKey", "#matchesTarget", "keys", "combo", "#normalizeCombo", "key", "#matchPattern", "parts", "pattern", "prefix", "matchTarget", "el", "defineCommands", "createDefinition"]
|
|
7
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
var wt=Object.freeze(Object.create(null));function we(e,t,r="value"){if(Array.isArray(t)){for(let i of t)if(be(e,i))return!0;let n=t.map(R).join(" | ");throw new TypeError(`${r} must be one of: ${n}. Got ${R(e)}`)}if(!be(e,t))throw new TypeError(`${r} must be ${R(t)}. Got ${R(e)}`);return!0}function be(e,t){return t===String?typeof e=="string":t===Number?typeof e=="number"&&!isNaN(e):t===Boolean?typeof e=="boolean":t===Symbol?typeof e=="symbol":t===BigInt?typeof e=="bigint":t===Function?typeof e=="function":t===Array?Array.isArray(e):t===Object?e!==null&&typeof e=="object"&&!Array.isArray(e):e instanceof t}function R(e){return e===String?"String":e===Number?"Number":e===Boolean?"Boolean":e===Array?"Array":e===Object?"Object":e===Function?"Function":e===Date?"Date":e===RegExp?"RegExp":e===Promise?"Promise":e===Map?"Map":e===Set?"Set":e===WeakMap?"WeakMap":e===WeakSet?"WeakSet":e===Symbol?"Symbol":e===BigInt?"BigInt":e===Error?"Error":typeof e=="string"?"string":typeof e=="number"?"number":typeof e=="boolean"?"boolean":typeof e=="symbol"?"symbol":typeof e=="bigint"?"bigint":typeof e=="function"?"function":Array.isArray(e)?"Array":e===null?"null":e===void 0?"undefined":typeof e=="object"?e.constructor?.name||"Object":"unknown"}function I(e,t="value"){return r=>we(r,e,t)}var Q=new Map,Ye=new WeakMap;var b=(e,t=[])=>{let r=t.length>0?I(t,"return value"):null;if(Q.has(e))return console.warn(`Definition type "${e}" already exists`),Q.get(e);let n=(i,s,...o)=>{I(String,"name")(i),I(Function,"factory")(s);let c=(...a)=>{try{let l=[...a,...o],u=s(...l);if(r&&u===void 0)throw new Error(`Factory ${e} must return a value for ${i}`);return r&&r(u),u}catch(l){throw console.error(`Error creating definition "${i}"`,l),l}};return Object.defineProperty(c,"_name",{value:i,enumerable:!1,configurable:!1}),Ye.set(c,e),c};return Q.set(e,n),n};var tt=new Set(["__proto__","prototype","constructor"]),rt=new Set(["use","install","uninstall","relay","state","debug"]),Ae=64,nt=/^[a-zA-Z_$][a-zA-Z_$0-9]*$/;function it(e,t="key"){if(tt.has(e))throw new Error(`Illegal key "${e}" in ${t}`)}function ee(e){if(it(e,"namespace"),typeof e!="string")throw new Error(`Namespace must be a string, got ${typeof e}`);if(!nt.test(e))throw new Error(`Invalid namespace "${e}". Must be a valid JS identifier`);if(e.length>Ae)throw new Error(`Namespace "${e}" too long (max ${Ae} chars)`);if(rt.has(e))throw new Error(`Namespace "${e}" is reserved`);return e}var te=b("MIDDLEWARE",[Function,Array]),re=b("ACTIONS",[Object]),ne=b("UNINSTALL"),ie=b("INITIALIZE"),se=b("GETTERS",[Object]);var F=class e{static create(t){return new e(t)}#t;#e;#r={MIDDLEWARE:null,GETTERS:null,ACTIONS:null,INITIALIZE:null,UNINSTALL:null};constructor(t){this.#t=t}#n(t,r,n){if(this.#r[t])throw new Error(`${t} already defined for ${this.#t}`);this.#r[t]=n(this.#t,r)}defineMiddleware=t=>this.#n("MIDDLEWARE",t,te);defineGetters=t=>this.#n("GETTERS",t,se);defineActions=t=>this.#n("ACTIONS",t,re);defineInitialize=t=>this.#n("INITIALIZE",t,ie);defineUninstall=t=>this.#n("UNINSTALL",t,ne);_toArray(){return[this.#r.MIDDLEWARE,this.#r.GETTERS,this.#r.ACTIONS,this.#r.INITIALIZE,this.#r.UNINSTALL].filter(Boolean)}};var $=class e{static#t=new Set;static manifest={name:"base",dependencies:[],version:"1.0.0",description:"Base extension template"};static config=null;static unique=!1;static configure(t={}){return{install:(r,n)=>this.install(r,n),manifest:this.manifest,config:{...this.config||this.manifest.defaults||{},...t},unique:!0,configured:!0}}static install(t,r){try{let{namespace:n}=this.manifest;ee(n);let i=new this;e.#t.add(i),Object.defineProperty(i,"config",{value:Object.freeze({...r}),writable:!1,configurable:!1,enumerable:!1}),Object.defineProperty(i,"context",{get:()=>t(),configurable:!1,enumerable:!1}),Object.defineProperty(i,"useContext",{value:(...o)=>t(...o),writable:!1,configurable:!1,enumerable:!1});let s=F.create(n);if(i.setup){let o={defineActions:a=>s.defineActions(()=>a(t,r)),defineMiddleware:a=>s.defineMiddleware(()=>a(t,r)),defineGetters:a=>s.defineGetters(()=>a(t,r)),defineInitialize:a=>s.defineInitialize(()=>a(t,r)),defineUninstall:a=>s.defineUninstall(()=>a(t,r))},c=i.setup(o);return c?.then?c.then(()=>s._toArray()):s._toArray()}return i.middleware&&s.defineMiddleware(()=>i.middleware(t,r)),i.getters&&s.defineGetters(()=>i.getters(t,r)),i.actions&&s.defineActions(()=>i.actions(t,r)),i.initialize&&s.defineInitialize(()=>i.initialize(t,r)),i.uninstall&&s.defineUninstall(()=>i.uninstall(t,r)),s._toArray()}catch(n){throw n}}};var yr=Symbol("jucie.engine");import ye from"path";import h from"fs";import{promises as X}from"fs";import ke from"crypto";var Te="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var ct=128,w,A,at=e=>{!w||w.length<e?(w=Buffer.allocUnsafe(e*ct),ke.randomFillSync(w),A=0):A+e>w.length&&(ke.randomFillSync(w),A=0),A+=e};var Ce=(e=21)=>{at(e|=0);let t="";for(let r=A-e;r<A;r++)t+=Te[w[r]&63];return t};var L=class e{static create(t,r=null){return new e(t,r)}constructor(t,r=null){this.state=t,this.database=r}add(t){try{let r=Ce();return this.state.set([r],t),r}catch(r){return console.error("Error adding value to database:",r),null}}set(...t){try{let[r,n]=t;return this.state.set(r,n),!0}catch(r){console.error("Error setting value in database:",r);return}}get(t=[]){try{return this.state.get(t)}catch(r){console.error("Error getting value from database:",r);return}}has(t){try{return this.state.has(t)}catch(r){return console.error("Error checking if key exists in database:",r),!1}}remove(t){try{return this.state.remove(t)}catch(r){return console.error("Error removing from database:",r),this}}update(t,r){try{return this.state.update(t,r)}catch(n){console.error("Error updating value in database:",n);return}}keys(t=[]){try{return this.state.keys(t)}catch(r){return console.error("Error getting keys from database:",r),[]}}findWhere(t,r,n){try{let i=this.state.findWhere(t,r,n);if(i.length===0)return null;let[s]=i;return this.state.get([s])}catch(i){return console.error("Error finding value in database:",i),null}}findAllWhere(t,r,n){try{return this.state.findAllWhere(t,r,n).map(s=>{let[o]=s;return this.state.get([o])})}catch(i){return console.error("Error finding all values in database:",i),[]}}typeof(t){try{return this.state.typeof(t)}catch(r){return console.error("Error getting type of value in database:",r),null}}collection(t){return e.create(this.state.ref(t),this.database)}batch(t){if(!this.database)return this.state.batch(t);this.database._beginBatch();try{return this.state.batch(t)}finally{this.database._endBatch()}}};function oe(e){return typeof setImmediate<"u"?setImmediate(e):typeof process<"u"&&process.nextTick?process.nextTick(e):setTimeout(e,0)}function P(e){typeof clearImmediate<"u"?clearImmediate(e):clearTimeout(e)}var y="*",lt=Symbol("STATE_CONTEXT"),Lr=Symbol("MATCHER"),x="CREATED",E="DELETED",S="UPDATED",v=1,T=2,U=4,B=8;function ht(e){let t="";for(let r=0;r<e.length;r++){let n=e[r];n==="~"?t+="~~":n==="."?t+="~d":t+=n}return t.length===0?"~e":t}function Oe(e){let t=new Array(e.length);for(let r=0;r<e.length;r++){let n=e[r];if(typeof n=="number"&&Number.isInteger(n))t[r]="n"+String(n);else if(typeof n=="string")t[r]="s"+ht(n);else throw new TypeError(`Unsupported segment type at index ${r}: ${n}`)}return t.join(".")}function Ie(e){return(e.type&v)===v}function ce(e){return(e.type&T)===T}function ae(e){return(e.type&U)===U}function $e(e){return(e.type&B)===B}function le(e){return!e||e.length===0||e===y||e[0]===y}function _e(e=[]){let t=e.length;return t===0?[0,[]]:t===1&&e[0]===y?[0,[]]:Array.isArray(e[0])?t===1?[1,[e[0]]]:[t,e]:[1,[[...e]]]}function ft(e){if(!Array.isArray(e))return!1;for(let t=0;t<e.length;t++){let r=e[t];if(typeof r=="string"&&r.charCodeAt(0)===46)return!0}return!1}function g(e=[]){if(le(e))return{address:y,isMarker:!0,length:0,path:[],children:null,type:v};let[t,r]=_e(e),n=t===1?T:U,i=t===1?r[0]:r,s=t>1?r.map(a=>g(a)):null,o=n===T?ft(i):s.some(a=>$e(a)),c=n;return o&&(c|=B),{address:n===T?Oe(i):null,isMarker:!0,length:t,path:i,children:s,type:c}}function p(e,t){if(t.length===0)return e;let[r,n]=_e(t);if(Ie(e))return g(n,e.state);if(ce(e)){if(r===0)return e;if(r===1){let i=[...e.path,...n[0]];return g(i,e.state)}else{let i=n.map(s=>[...e.path,...s]);return g(i,e.state)}}if(ae(e)){let i=new Array(e.length),s=0;for(;s<e.length;)i[s]=p(e.children[s],t),s++;let o=[];for(s=0;s<i.length;){let c=i[s];if(ce(c))o.push(c.path);else if(ae(c)){let a=0;for(;a<c.length;)o.push(c.children[a].path),a++}s++}return g(o,e.state)}return e}function d(e,{global:t,path:r,ephemeral:n,error:i}){try{if(!e.isMarker)return;if(Ie(e))return t?t(e):void 0;if($e(e))return n?n(e):r?r(e):void 0;if(ce(e))return r?r(e):void 0;if(ae(e)){let s=new Array(e.length),o=0;for(;o<e.length;){let c=e.children[o];s[o]=d(c,{global:t,path:r,ephemeral:n,error:i}),o++}return s}return}catch(s){return i?i(s.message):void 0}}var k=[null,null,(e,t)=>e?.[t[0]]?.[t[1]],(e,t)=>e?.[t[0]]?.[t[1]]?.[t[2]],(e,t)=>e?.[t[0]]?.[t[1]]?.[t[2]]?.[t[3]],(e,t)=>e?.[t[0]]?.[t[1]]?.[t[2]]?.[t[3]]?.[t[4]],(e,t)=>e?.[t[0]]?.[t[1]]?.[t[2]]?.[t[3]]?.[t[4]]?.[t[5]],(e,t)=>e?.[t[0]]?.[t[1]]?.[t[2]]?.[t[3]]?.[t[4]]?.[t[5]]?.[t[6]],(e,t)=>e?.[t[0]]?.[t[1]]?.[t[2]]?.[t[3]]?.[t[4]]?.[t[5]]?.[t[6]]?.[t[7]]];function ut(e){let r="obj"+Array.from({length:e},(i,s)=>`?.[path[${s}]]`).join(""),n=new Function("obj","path",`return ${r}`);return k[e]=n,n}function C(e,t){let r=t.length;return r===0?e:r===1?e[t[0]]:r<k.length&&k[r]||k[r]?k[r](e,t):ut(r)(e,t)}function f(e){return typeof e=="number"?[]:{}}var G=[null,null,(e,t,r)=>{let[n,i]=t;return e[n]=n in e?e[n]:f(i),e[n][i]=r,r},(e,t,r)=>{let[n,i,s]=t;return e[n]=n in e?e[n]:f(i),e[n][i]=i in e[n]?e[n][i]:f(s),e[n][i][s]=r,r},(e,t,r)=>{let[n,i,s,o]=t;return e[n]=n in e?e[n]:f(i),e[n][i]=i in e[n]?e[n][i]:f(s),e[n][i][s]=s in e[n][i]?e[n][i][s]:f(o),e[n][i][s][o]=r,r},(e,t,r)=>{let[n,i,s,o,c]=t;return e[n]=n in e?e[n]:f(i),e[n][i]=i in e[n]?e[n][i]:f(s),e[n][i][s]=s in e[n][i]?e[n][i][s]:f(o),e[n][i][s][o]=o in e[n][i][s]?e[n][i][s][o]:f(c),e[n][i][s][o][c]=r,r},(e,t,r)=>{let[n,i,s,o,c,a]=t;return e[n]=n in e?e[n]:f(i),e[n][i]=i in e[n]?e[n][i]:f(s),e[n][i][s]=s in e[n][i]?e[n][i][s]:f(o),e[n][i][s][o]=o in e[n][i][s]?e[n][i][s][o]:f(c),e[n][i][s][o][c]=c in e[n][i][s][o]?e[n][i][s][o][c]:f(a),e[n][i][s][o][c][a]=r,r},(e,t,r)=>{let[n,i,s,o,c,a,l]=t;return e[n]=n in e?e[n]:f(i),e[n][i]=i in e[n]?e[n][i]:f(s),e[n][i][s]=s in e[n][i]?e[n][i][s]:f(o),e[n][i][s][o]=o in e[n][i][s]?e[n][i][s][o]:f(c),e[n][i][s][o][c]=c in e[n][i][s][o]?e[n][i][s][o][c]:f(a),e[n][i][s][o][c][a]=a in e[n][i][s][o][c]?e[n][i][s][o][c][a]:f(l),e[n][i][s][o][c][a][l]=r,r},(e,t,r)=>{let[n,i,s,o,c,a,l,u]=t;return e[n]=n in e?e[n]:f(i),e[n][i]=i in e[n]?e[n][i]:f(s),e[n][i][s]=s in e[n][i]?e[n][i][s]:f(o),e[n][i][s][o]=o in e[n][i][s]?e[n][i][s][o]:f(c),e[n][i][s][o][c]=c in e[n][i][s][o]?e[n][i][s][o][c]:f(a),e[n][i][s][o][c][a]=a in e[n][i][s][o][c]?e[n][i][s][o][c][a]:f(l),e[n][i][s][o][c][a][l]=l in e[n][i][s][o][c][a]?e[n][i][s][o][c][a][l]:f(u),e[n][i][s][o][c][a][l][u]=r,r}];function dt(e){let t=Array.from({length:e},(o,c)=>`v${c}`),n=`const [${t.join(", ")}] = path;
|
|
2
|
-
`,i="state";for(let o=0;o<e-1;o++){let c=t[o],a=t[o+1];n+=`${i}[${c}] = (${i}[${c}] !== undefined && typeof ${i}[${c}] === 'object') ? ${i}[${c}] : createNodeType(${a});
|
|
3
|
-
`,i+=`[${c}]`}n+=`${i}[${t[e-1]}] = value;
|
|
4
|
-
return state;`;let s=new Function("state","path","value","createNodeType",n);return G[e]=(o,c,a)=>s(o,c,a,f),G[e]}function he(e,t,r){let n=t.length;return n===0?Object.assign(e,r):n===1?e[t[0]]=r:G[n]?G[n](e,t,r):dt(n)(e,t,r)}function Ne(e,t){let r=t.length;if(r===0)return;if(r===1){let c=e[t[0]];return Array.isArray(e)?e.splice(t[0],1):delete e[t[0]],c}let n=t.slice(0,-1),i=t[r-1],s=C(e,n);if(!s)return;let o=s[i];return Array.isArray(s)?s.splice(i,1):delete s[i],o}function _(e,t){let r=Object.keys(e),n=0;for(;n<r.length;)delete e[r[n]],n++;let i=Object.keys(t);for(n=0;n<i.length;){let s=i[n],o=t[s];o&&typeof o=="object"&&!Array.isArray(o)?(e[s]=e[s]||{},_(e[s],o)):e[s]=o,n++}return e}function je(e){let t=Object.keys(e);for(let r of t)delete e[r];return e}function Me(e){let t=typeof e;return e==null||t==="string"||t==="number"||t==="boolean"||t==="bigint"||t==="symbol"||t==="function"}var De=e=>structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e));function pt(e){return Array.isArray(e)?[...e]:typeof e=="object"&&e!==null?{...e}:e}function m(e,t,r){let n=!1;try{return d(t,{global:()=>(n=!0,e),path:({path:i})=>(n=!0,C(e,i))})}catch(i){console.error(i);return}finally{n&&r&&r(t)}}function W(e,t,r,n,i){let s,o=!1;try{return d(t,{global:()=>(s={...e},e=_(e,r),o=!0,r),path:({path:c})=>(s=pt(C(e,c)),he(e,c,r),o=!0,r)})}catch(c){console.error(c);return}finally{o&&i&&i(t,n,r,s)}}function fe(e,t,r,n){let i,s=!1;try{return d(t,{global:()=>(i=e,e=_(e,{}),s=!0,i),path:({path:o})=>(i=Ne(e,o),s=!0,i)})}catch(o){console.error(o);return}finally{n&&n(t,r,void 0,i)}}function Re(e,t,r,n,i){let s,o,c=!1;try{return d(t,{global:()=>(s=e,o=r(e),e=_(e,o),c=!0,o),path:({path:a})=>{s=le(a)?e:C(e,a);let l=Me(s)?s:De(s);return o=r(l),he(e,a,o),c=!0,o}})}catch(a){console.error(a);return}finally{c&&i&&i(t,n,o,s)}}function ue(e,t){if(!(e&&e[0]==="."))return t}function z(e,t=ue,r=""){if(e===null||typeof e!="object")return e;if(Array.isArray(e))return e.map(i=>z(i,t));let n={};for(let i of Object.keys(e)){let s=t(i,e[i]);typeof s<"u"&&(n[i]=z(s,t,i))}return n}import{encode as yt,decode as gt}from"cbor-x";var H=new Uint8Array([74,83,67,50]),V=2;function Fe(e){let r="";for(let n=0;n<e.length;n+=8192){let i=e.slice(n,n+8192);r+=String.fromCharCode(...i)}return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Le(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t+"=".repeat((4-t.length%4)%4),n=atob(r),i=new Uint8Array(n.length);for(let s=0;s<n.length;s++)i[s]=n.charCodeAt(s);return i}function J(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e[r]>>>0;return t}function K(e,t,r=0){return new DataView(t.buffer,t.byteOffset+r,4).setUint32(0,e,!0),r+4}function q(e,t=0){return new DataView(e.buffer,e.byteOffset+t,4).getUint32(0,!0)}function Pe(e,t,r=0){return new DataView(t.buffer,t.byteOffset+r,2).setUint16(0,e,!0),r+2}function ve(e,t=0){return new DataView(e.buffer,e.byteOffset+t,2).getUint16(0,!0)}function Ue(e,t,r=0){return t[r]=e,r+1}function Be(e,t=0){return e[t]}function Ge(e){return yt(e)}function We(e){return[gt(e),e.length]}async function de(e,{replacer:t=ue}={}){let r=z(e,t),n=Ge(r),i=4+n.length,s=new Uint8Array(i),o=0;o=K(n.length,s,o),s.set(n,o);let c=J(s),a=15,l=new Uint8Array(a+s.length);return l.set(H,0),Pe(V,l,4),Ue(0,l,6),K(c,l,7),K(s.length,l,11),l.set(s,15),Fe(l)}async function ze(e,t){let r=Le(e);if(r.length<15)throw new Error("Invalid capsule: too short");for(let D=0;D<4;D++)if(r[D]!==H[D])throw new Error("Invalid capsule: bad magic");let n=ve(r,4);if(n!==V)throw new Error(`Unsupported capsule version: ${n}`);let i=Be(r,6),s=q(r,7),o=q(r,11);if(o<0)throw new Error("Invalid capsule: negative payload length");if(r.length!==15+o)throw new Error("Invalid capsule: length mismatch");let c=r.slice(15),a=J(c);if(s!==a)throw new Error("Integrity check failed: checksum mismatch");let l=0,u=q(c,l);if(l+=4,l+u>c.length)throw new Error(`Data length ${u} exceeds payload bounds at offset ${l}`);let[O]=We(c.slice(l,l+u));return t&&t(O),{data:O,meta:{version:n,flags:i,bytes:r.length,checksum:a.toString(16)}}}function mt(e,t,r){switch(t){case"is":case"===":case"==":return e===r;case"not":case"!==":case"!=":return e!==r;case"includes":return Array.isArray(e)&&e.includes(r);case"has":return typeof e=="object"&&e!==null&&Object.values(e).includes(r);case"in":return typeof e=="object"&&e!==null&&r in e;case"gt":case">":return e>r;case"lt":case"<":return e<r;case"gte":case">=":return e>=r;case"lte":case"<=":return e<=r;default:throw new Error(`Unknown matcher: ${t}`)}}function Y(e,t,r,n,i=[],s=!1){let o=[];if(e===null||typeof e!="object")return o;for(let[c,a]of Object.entries(e)){if(c===t&&mt(a,r,n)&&(o.push([...i,c]),!s))return o;if(typeof a=="object"&&a!==null)if(Array.isArray(a))for(let l=0;l<a.length;l++){let u=a[l];if(u&&typeof u=="object"){let O=Y(u,t,r,n,[...i,c,l],s);if(o.push(...O),!s&&o.length>0)return o}}else{let l=Y(a,t,r,n,[...i,c],s);if(o.push(...l),!s&&o.length>0)return o}}return o}function He(e,t,r="is",n){return Y(e,t,r,n,[],!1)?.[0]}function Ve(e,t,r="is",n){return Y(e,t,r,n,[],!0)}var bn={[x]:E,[E]:x,[S]:S};function Je(e,t){return t===void 0?x:e===void 0?E:S}function Ke(e,t,r,n){return d(e,{global:()=>({path:y,method:t,operation:Je(r,n),from:n,to:r}),path:i=>({path:i.path,method:t,operation:Je(r,n),from:n,to:r})})}var Z=class e{#t;#e;#r=0;#n;#s;#l=new Map;static create(t={}){return new e(t)}constructor(t,r=null,n=null,i=null){this.#t=t,this.#n=n||this.#f(),this.#s=i||this.#a(),this.#e=r||g(),this.#r=0}install(...t){let r=new Map;for(let n of t){if(this.#l.has(n.name)){console.warn(`Plugin "${n.name}" already installed`);continue}if(!n.install){console.warn(`Plugin "${n.name}" does not have an install function`);continue}let i=n.install(this);if(this.#l.set(n.name,i),i.initialize&&r.set(n.name,()=>i.initialize(this,i.options)),i.actions){let s=i.actions(this,i.options);Object.defineProperty(this,n.name,{value:s,writable:!1,enumerable:!0,configurable:!1})}}return r.forEach(n=>n()),this}get batching(){return this.#r>0}get(...t){return m(this.#t,p(this.#e,t),this.#s)}has(...t){let r=p(this.#e,t);return d(r,{global:()=>{},path:n=>m(this.#t,n,this.#s)!==void 0})}keys(...t){let r=p(this.#e,t);return d(r,{global:()=>Object.keys(this.#t),path:n=>Object.keys(m(this.#t,n,this.#s)||{})})}typeof(...t){let r=p(this.#e,t);return d(r,{global:()=>{},path:({path:i})=>typeof m(this.#t,i,this.#s)})}findWhere(t,r="is",n){let i=m(this.#t,this.#e,this.#s);return He(i,t,r,n)}findAllWhere(t,r="is",n){let i=m(this.#t,this.#e,this.#s);return Ve(i,t,r,n)}set(...t){let r=t.pop(),n=p(this.#e,t);return W(this.#t,n,r,"set",this.#n)}update(...t){let r=t.pop(),n=p(this.#e,t);return Re(this.#t,n,r,"update",this.#n)}apply(t){for(let r of t){let{path:n,operation:i,to:s}=r,o=p(this.#e,n);switch(i){case x:case S:W(this.#t,o,s,"apply",this.#n);break;case E:fe(this.#t,o,"apply",this.#n);break}}}load(t){return W(this.#t,this.#e,t,"load",this.#n),this}remove(...t){let r=p(this.#e,t);return fe(this.#t,r,"remove",this.#n)}async export(...t){try{let r=p(this.#e,t),n=d(r,{global:async()=>await de(this.#t),path:async i=>await de(m(this.#t,i,this.#s))});return Array.isArray(n)?await Promise.all(n):await n}catch(r){throw console.trace(`Failed to export state: ${r.message}`),r}}async import(t){try{let{data:r}=await ze(t);return this.load(r),this}catch(r){throw console.trace(`Failed to import state: ${r.message}`),r}}reset(){je(this.#t);for(let t of this.#l.values())t.reset&&t.reset();this.#n=this.#f(),this.#e=g([],this),this.#r=0}ref(...t){let r=p(this.#e,t);return new e(this.#t,r,this.#n,this.#s)}batch(t){return this.#r++,this.#i("onBatchStart",this.batching),t?(t(this),this.endBatch()):()=>this.endBatch()}endBatch(){return this.#r--,this.#r===0&&this.#i("onBatchEnd"),this}#f(){return(t,r,n=void 0,i=void 0)=>{this.#i("onStateChange",t,Ke(t,r,n,i),this.batching)}}#a(){return t=>this.#i("onStateAccess",t)}#i(t,...r){for(let n of this.#l.values())typeof n[t]=="function"&&n[t](...r)}},pe=(...e)=>Z.create(...e);var N=class{static name=null;static options={};static configure(t){return t={...this.options,...t},{install:r=>this.install(r,t),name:this.name,options:t}}static install(t,r){r={...this.options,...r};let n=new this(t,r);return Object.defineProperty(n,"state",{value:t,writable:!1,configurable:!1}),Object.defineProperty(n,"options",{value:r,writable:!1,configurable:!1}),n}};var j=class extends N{static name="onChange";#t=new Set;#e=new Map;#r=!1;#n=!1;#s=0;constructor(t={}){super(t),this.#s=t.debounce??0}actions(){return{addListener:t=>{if(typeof t=="function")return this.#a(t)},subscribe:t=>{if(typeof t=="function")return this.#a(t)},unsubscribe:t=>{if(typeof t=="function")return this.#i(t)},removeListener:t=>this.#i(t),clear:()=>this.#h()}}onStateChange(t,r){!this.#n||r.method==="apply"||this.#l(t,r)}#l(t,r){this.#e.has(t.address)&&this.#e.delete(t.address),this.#e.set(t.address,r),this.#f()}#f(){if(!this.#r){this.#r=!0;try{setTimeout(()=>{let t=Array.from(this.#e.values());this.#e.clear();for(let r of this.#t)try{r(t)}catch(n){console.error("Error in onChange listener:",n)}this.#r=!1},this.#s)}catch(t){console.error(t)}}}#a(t){return this.#t.add(t),this.#n=!0,()=>this.#i(t)}#i(t){typeof t=="function"&&(this.#t.delete(t),this.#t.size===0&&(this.#n=!1))}#h(){this.#t.clear(),this.#e.clear(),this.#n=!1}};var M=new Set,qe=!1,ge=class extends ${#t=!1;#e=null;#r=null;#n=null;#s=0;#l=100;#f=1e3;#a=new Set;#i=null;#h=!1;#c=null;#y=Date.now();#g=5e3;#p=!1;#o=0;static manifest={name:"Database",dependencies:[],namespace:"database",defaults:{debug:!1,dbPath:"./",dbName:".db",walPath:"./",walName:".wal",checkpointThreshold:100,forceThreshold:1e3,checkpointInterval:5e3}};initialize(t,r){let n=t("state");n||(n=pe().install(j)),this.#i=n,this.#l=r.checkpointThreshold,this.#f=r.forceThreshold,this.#g=r.checkpointInterval,M.add(this),this.#b()}#b(){if(qe)return;qe=!0;let t=async r=>{console.log(`Received ${r}, performing final checkpoint on all databases...`);for(let n of M)try{n.#c&&P(n.#c),n.#t&&n.#s>0&&(await n.#u(),console.log(`Checkpoint completed for database at ${n.#r}`))}catch(i){console.error(`Error checkpointing database ${n.#r}:`,i)}};process.on("SIGINT",async()=>{await t("SIGINT"),process.exit(0)}),process.on("SIGTERM",async()=>{await t("SIGTERM"),process.exit(0)}),process.on("exit",()=>{for(let r of M)r.#t&&r.#s>0&&console.warn(`Emergency: Database ${r.#r} has ${r.#s} uncommitted changes in WAL`)})}actions(t,r){return{isInitialized:()=>this.#t,beginBatch:()=>{this.#o++},endBatch:()=>{this.#o=Math.max(0,this.#o-1),this.#o===0&&this.#h&&this.#d()},initializeDb:async(n={})=>{r={...r,...n};try{if(this.#r=ye.join(r.dbPath,r.dbName),this.#e=ye.join(r.walPath,r.walName),this.#n=this.#i.onChange.addListener(this.#w),!h.existsSync(this.#r)){let s=await this.#i.export();h.mkdirSync(r.dbPath,{recursive:!0}),h.writeFileSync(this.#r,s)}let i=h.readFileSync(this.#r,"utf8");if(await this.#i.import(i),h.existsSync(this.#e)){let o=h.readFileSync(this.#e,"utf8").trim().split(`
|
|
5
|
-
`).filter(c=>c.trim());for(let c of o){if(!c)continue;let[a,l,u]=JSON.parse(c);l.method==="set"||l.method==="update"?this.#i.set(l.path,l.to):l.method==="remove"&&this.#i.remove(l.path)}await this.#m()}return this.#k(),this.#t=!0,this.#t}catch(i){return console.error("Error initializing database:",i),this.#t}},backup:async(n="./backup.json")=>{try{let i=await this.#i.export();return h.existsSync(n)||h.mkdirSync(ye.dirname(n),{recursive:!0}),h.writeFileSync(n,i),n}catch(i){return console.error("Error backing up database:",i),null}},restore:async(n="./backup.json")=>{try{if(!h.existsSync(n))throw new Error("Backup file not found");let i=h.readFileSync(n,"utf8");return await this.#i.import(i),!0}catch(i){return console.error("Error restoring database:",i),!1}},restoreFromBackup:async()=>{try{let n=`${this.#r}.backup`,i=`${this.#e}.backup`;if(!h.existsSync(n))throw new Error("No backup files found");let s=h.readFileSync(n,"utf8");if(await this.#i.import(s),h.existsSync(i)){let c=h.readFileSync(i,"utf8").trim().split(`
|
|
6
|
-
`).filter(a=>a.trim());for(let a of c){if(!a)continue;let[l,u,O]=JSON.parse(a);u.method==="set"||u.method==="update"?this.#i.set(u.path,u.to):u.method==="remove"&&this.#i.remove(u.path)}}return console.log("Successfully restored from backup"),!0}catch(n){return console.error("Error restoring from backup:",n),!1}},checkpoint:async()=>this.#o>0?(this.#h=!0,!1):(await this.#u(),!0),close:async()=>{try{return this.#c&&(P(this.#c),this.#c=null),this.#s>0&&await this.#u(),this.#n&&(this.#n(),this.#n=null),M.delete(this),this.#t=!1,!0}catch(n){return console.error("Error closing database:",n),!1}},destroy:()=>{try{return this.#n(),this.#c&&(P(this.#c),this.#c=null),this.#O(),this.#n=null,this.#i.reset(),M.delete(this),!0}catch(n){return console.error("Error destroying database:",n),!1}},collection:n=>L.create(this.#i.ref(n),this),_beginBatch:()=>{this.#o++},_endBatch:()=>{this.#o=Math.max(0,this.#o-1),this.#o===0&&this.#h&&this.#d()},batch:n=>{this.#o++;try{return this.#i.batch(n)}finally{this.#o=Math.max(0,this.#o-1),this.#o===0&&this.#h&&this.#d()}},...this.#I(this.config.debug)}}#w=async t=>{this.#s+=t.length,this.#S(t);let r=Date.now()-this.#y;if(this.#s>=this.#f){console.warn(`Force checkpoint triggered at ${this.#s} changes`),this.#s=0,await this.#u();return}(this.#s>=this.#l||r>=this.#g)&&(this.#d(),this.#s=0),this.#A()};#A=()=>{this.#a.size!==0&&(this.#a.forEach(t=>t()),this.#a.clear())};#d=()=>{this.#h&&this.#c||(this.#h=!0,!(this.#o>0)&&(this.#c=oe(async()=>{await this.#u()})))};#u=async()=>{if(this.#o>0){this.#c=oe(async()=>{await this.#u()});return}if(!this.#p)try{this.#p=!0,await this.#x(),await this.#m(),await this.#C(),this.#y=Date.now()}catch(t){console.error("Error during checkpoint:",t)}finally{this.#p=!1,this.#h=!1,this.#c=null}};#x=async()=>{let t=`${this.#r}.backup`,r=`${this.#e}.backup`;try{h.existsSync(this.#r)&&await X.copyFile(this.#r,t),h.existsSync(this.#e)&&await X.copyFile(this.#e,r)}catch(n){console.error("Error backing up files:",n)}};#m=async()=>{let t=await this.#i.export();await X.writeFile(this.#r,t,"utf8")};#E=()=>{h.existsSync(this.#r)&&h.unlinkSync(this.#r)};#S=t=>{let r="";for(let n of t)r+=JSON.stringify(n)+`
|
|
7
|
-
`;h.appendFileSync(this.#e,r)};#T=()=>{h.existsSync(this.#e)&&h.unlinkSync(this.#e)};#k=()=>{h.existsSync(this.#e)&&h.writeFileSync(this.#e,"")};#C=async()=>{h.existsSync(this.#e)&&await X.writeFile(this.#e,"","utf8")};#O=()=>{this.#T(),this.#E()};#I(t=!1){return t?{_afterWrite:()=>new Promise(r=>this.#a.add(r)),_clearDatabase:()=>{try{return this.#i.reset(),h.existsSync(this.#r)&&h.unlinkSync(this.#r),!0}catch(r){return console.error("Error clearing database:",r),!1}},_clearChanges:()=>{try{return this.#s=0,!0}catch(r){return console.error("Error clearing changes:",r),!1}},_getChangeCount:()=>this.#s,_clearWAL:()=>{try{return h.existsSync(this.#e)&&h.writeFileSync(this.#e,""),!0}catch(r){return console.error("Error clearing WAL:",r),!1}},_applyWAL:async()=>{try{if(!h.existsSync(this.#e))return!1;let n=h.readFileSync(this.#e,"utf8").trim().split(`
|
|
8
|
-
`).map(i=>JSON.parse(i));return this.#i.apply(n),h.writeFileSync(this.#e,""),!0}catch(r){return console.error("Error applying WAL:",r),!1}},_checkpoint:async()=>{try{return await new Promise(r=>setTimeout(r,10)),await new Promise(r=>{this.#a.size===0?r():this.#a.add(r)}),await this.#u(),!0}catch(r){return console.error("Error during checkpoint:",r),!1}},_getWALEntries:()=>{try{if(!h.existsSync(this.#e))return[];let r=h.readFileSync(this.#e,"utf8");return r.trim().length===0?[]:r.trim().split(`
|
|
9
|
-
`).map(n=>JSON.parse(n))}catch(r){return console.error("Error reading WAL entries:",r),[]}},_getWALEntryCount:()=>{try{return h.existsSync(this.#e)?h.readFileSync(this.#e,"utf8").trim().split(`
|
|
10
|
-
`).filter(n=>n.trim()!=="").length:0}catch(r){return console.error("Error counting WAL entries:",r),0}}}:{}}};export{ge as Database};
|
|
11
|
-
//# sourceMappingURL=database.js.map
|