@forinda/kickjs 5.7.1 → 5.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adapter-CoJp35rz.d.mts → adapter-BRvrS9xR.d.mts} +119 -16
- package/dist/adapter-BRvrS9xR.d.mts.map +1 -0
- package/dist/app-module-BE7hAASB.d.mts.map +1 -1
- package/dist/application-BQN6JUFA.mjs +12 -0
- package/dist/application-BQN6JUFA.mjs.map +1 -0
- package/dist/{application-DmekGKp7.d.mts → application-BpRV6_s8.d.mts} +29 -9
- package/dist/application-BpRV6_s8.d.mts.map +1 -0
- package/dist/{bootstrap-Dqyit14A.mjs → bootstrap-B9xvalW_.mjs} +3 -3
- package/dist/{bootstrap-Dqyit14A.mjs.map → bootstrap-B9xvalW_.mjs.map} +1 -1
- package/dist/{bootstrap-CwP2GGu0.d.mts → bootstrap-DJ3Qutd_.d.mts} +2 -2
- package/dist/bootstrap-DJ3Qutd_.d.mts.map +1 -0
- package/dist/cache-XrNWj1KQ.d.mts.map +1 -1
- package/dist/config/index.mjs +2 -2
- package/dist/{config-DsD1NCSn.mjs → config-BfLro7F5.mjs} +3 -3
- package/dist/{config-DsD1NCSn.mjs.map → config-BfLro7F5.mjs.map} +1 -1
- package/dist/{container-jPCvIZH2.mjs → container-B1X8WRwl.mjs} +3 -3
- package/dist/{container-jPCvIZH2.mjs.map → container-B1X8WRwl.mjs.map} +1 -1
- package/dist/container-BZKeHc5X.d.mts.map +1 -1
- package/dist/context-CtiMB_tb.mjs +12 -0
- package/dist/context-CtiMB_tb.mjs.map +1 -0
- package/dist/context-aocg9gO-.d.mts.map +1 -1
- package/dist/context-decorator-BYf8HdMl.d.mts.map +1 -1
- package/dist/core/adapter.d.mts +2 -2
- package/dist/core/adapter.mjs +1 -1
- package/dist/core/app-module.mjs +1 -1
- package/dist/core/cache.mjs +1 -1
- package/dist/core/cache.mjs.map +1 -1
- package/dist/core/container.mjs +2 -2
- package/dist/core/cron.mjs +2 -2
- package/dist/core/cron.mjs.map +1 -1
- package/dist/core/decorators.mjs +2 -2
- package/dist/core/decorators.mjs.map +1 -1
- package/dist/core/errors.mjs +2 -2
- package/dist/core/errors.mjs.map +1 -1
- package/dist/core/interfaces.mjs +1 -1
- package/dist/core/interfaces.mjs.map +1 -1
- package/dist/core/logger.mjs +1 -1
- package/dist/core/logger.mjs.map +1 -1
- package/dist/core/path.mjs +1 -1
- package/dist/core/path.mjs.map +1 -1
- package/dist/core/plugin.d.mts +1 -1
- package/dist/core/plugin.mjs +1 -1
- package/dist/core/reactivity.d.mts +1 -1
- package/dist/core/reactivity.mjs +2 -2
- package/dist/core/reactivity.mjs.map +1 -1
- package/dist/{core-DR36jGxB.mjs → core-Cd5c8LhS.mjs} +3 -3
- package/dist/{core-DR36jGxB.mjs.map → core-Cd5c8LhS.mjs.map} +1 -1
- package/dist/cors-BfgqfLPd.d.mts.map +1 -1
- package/dist/cron-GNoYydfg.d.mts.map +1 -1
- package/dist/csrf-DiK9zept.d.mts.map +1 -1
- package/dist/decorators-BYi8lB37.d.mts.map +1 -1
- package/dist/{env-CDmi8uj3.mjs → env-BgiV8KKj.mjs} +3 -3
- package/dist/{env-CDmi8uj3.mjs.map → env-BgiV8KKj.mjs.map} +1 -1
- package/dist/errors-uaHCeXRz.d.mts.map +1 -1
- package/dist/execution-context-DKnt61pY.d.mts.map +1 -1
- package/dist/helmet-CaMbjzBG.d.mts.map +1 -1
- package/dist/http/application.d.mts +1 -1
- package/dist/http/application.mjs +2 -2
- package/dist/http/bootstrap.d.mts +1 -1
- package/dist/http/bootstrap.mjs +2 -2
- package/dist/http/context.mjs +2 -2
- package/dist/http/middleware/cors.mjs +1 -1
- package/dist/http/middleware/cors.mjs.map +1 -1
- package/dist/http/middleware/csrf.mjs +1 -1
- package/dist/http/middleware/csrf.mjs.map +1 -1
- package/dist/http/middleware/error-handler.mjs +2 -2
- package/dist/http/middleware/error-handler.mjs.map +1 -1
- package/dist/http/middleware/helmet.mjs +1 -1
- package/dist/http/middleware/helmet.mjs.map +1 -1
- package/dist/http/middleware/rate-limit.mjs +2 -2
- package/dist/http/middleware/rate-limit.mjs.map +1 -1
- package/dist/http/middleware/request-id.mjs +1 -1
- package/dist/http/middleware/request-id.mjs.map +1 -1
- package/dist/http/middleware/request-logger.mjs +2 -2
- package/dist/http/middleware/request-logger.mjs.map +1 -1
- package/dist/http/middleware/session.mjs +1 -1
- package/dist/http/middleware/session.mjs.map +1 -1
- package/dist/http/middleware/spa.d.mts +1 -1
- package/dist/http/middleware/spa.mjs +2 -2
- package/dist/http/middleware/spa.mjs.map +1 -1
- package/dist/http/middleware/upload.mjs +1 -1
- package/dist/http/middleware/upload.mjs.map +1 -1
- package/dist/http/middleware/validate.mjs +2 -2
- package/dist/http/middleware/validate.mjs.map +1 -1
- package/dist/http/middleware/views.d.mts +1 -1
- package/dist/http/middleware/views.mjs +2 -2
- package/dist/http/middleware/views.mjs.map +1 -1
- package/dist/http/query/index.mjs +2 -2
- package/dist/http/router-builder.d.mts +1 -1
- package/dist/http/router-builder.mjs +2 -2
- package/dist/http/router-builder.mjs.map +1 -1
- package/dist/index-B9cyOQAe.d.mts.map +1 -1
- package/dist/index-DM1PteZT.d.mts.map +1 -1
- package/dist/{index-CkKLXZHg.d.mts → index-qZqR_Mxr.d.mts} +3 -3
- package/dist/index-qZqR_Mxr.d.mts.map +1 -0
- package/dist/index.d.mts +10 -10
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces-B50n7dwl.d.mts.map +1 -1
- package/dist/logger-CLVRZf2N.d.mts.map +1 -1
- package/dist/{metadata-Chvfoj23.mjs → metadata-BNNMsb9P.mjs} +2 -2
- package/dist/{metadata-Chvfoj23.mjs.map → metadata-BNNMsb9P.mjs.map} +1 -1
- package/dist/path-Diviu6hv.d.mts.map +1 -1
- package/dist/{plugin-NMHVmDRF.d.mts → plugin-CyoGnRbq.d.mts} +8 -7
- package/dist/plugin-CyoGnRbq.d.mts.map +1 -0
- package/dist/{query-CtctnbW6.mjs → query-Du-Evuhc.mjs} +2 -2
- package/dist/{query-CtctnbW6.mjs.map → query-Du-Evuhc.mjs.map} +1 -1
- package/dist/{reactivity-CfJceo4H.d.mts → reactivity-BRvj7bdG.d.mts} +14 -1
- package/dist/reactivity-BRvj7bdG.d.mts.map +1 -0
- package/dist/request-id-BgglvZHN.d.mts.map +1 -1
- package/dist/request-logger-CWHbAzTE.d.mts.map +1 -1
- package/dist/{router-builder-BfCCeQB-.d.mts → router-builder-R6dyZ-A3.d.mts} +2 -2
- package/dist/router-builder-R6dyZ-A3.d.mts.map +1 -0
- package/dist/session-N0hActOO.d.mts.map +1 -1
- package/dist/{spa-DIXtRBj-.d.mts → spa-DFxiK7jQ.d.mts} +2 -2
- package/dist/spa-DFxiK7jQ.d.mts.map +1 -0
- package/dist/upload-5goxbO9A.d.mts.map +1 -1
- package/dist/validate-HwAyWTwH.d.mts.map +1 -1
- package/dist/{views-DDT9vghc.d.mts → views-DGbyY_oV.d.mts} +2 -2
- package/dist/views-DGbyY_oV.d.mts.map +1 -0
- package/package.json +4 -4
- package/dist/adapter-CoJp35rz.d.mts.map +0 -1
- package/dist/application-DbUe_4St.mjs +0 -12
- package/dist/application-DbUe_4St.mjs.map +0 -1
- package/dist/application-DmekGKp7.d.mts.map +0 -1
- package/dist/bootstrap-CwP2GGu0.d.mts.map +0 -1
- package/dist/context-CPW8cxav.mjs +0 -12
- package/dist/context-CPW8cxav.mjs.map +0 -1
- package/dist/index-CkKLXZHg.d.mts.map +0 -1
- package/dist/plugin-NMHVmDRF.d.mts.map +0 -1
- package/dist/reactivity-CfJceo4H.d.mts.map +0 -1
- package/dist/router-builder-BfCCeQB-.d.mts.map +0 -1
- package/dist/spa-DIXtRBj-.d.mts.map +0 -1
- package/dist/views-DDT9vghc.d.mts.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
|
|
2
|
-
import { a as isRef, c as toRefs, i as computed, l as unref, n as Ref, o as reactive, r as WatchOptions, s as ref, t as ComputedRef, u as watch } from "../reactivity-
|
|
2
|
+
import { a as isRef, c as toRefs, i as computed, l as unref, n as Ref, o as reactive, r as WatchOptions, s as ref, t as ComputedRef, u as watch } from "../reactivity-BRvj7bdG.mjs";
|
|
3
3
|
export { ComputedRef, Ref, WatchOptions, computed, isRef, reactive, ref, toRefs, unref, watch };
|
package/dist/core/reactivity.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @forinda/kickjs v5.
|
|
2
|
+
* @forinda/kickjs v5.9.0
|
|
3
3
|
*
|
|
4
4
|
* Copyright (c) Felix Orinda
|
|
5
5
|
*
|
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @license MIT
|
|
10
10
|
*/
|
|
11
|
-
let activeEffect=null;const targetMap=new WeakMap;function track(target,key){if(!activeEffect)return;let depsMap=targetMap.get(target);depsMap||(depsMap=new Map,targetMap.set(target,depsMap));let deps=depsMap.get(key);deps||(deps=new Set,depsMap.set(key,deps)),deps.add(activeEffect)}function trigger(target,key){let depsMap=targetMap.get(target);if(!depsMap)return;let deps=depsMap.get(key);if(deps)for(let effect of deps)effect()}function ref(initialValue){let subscribers=new Set,wrapper={_value:initialValue};return{get value(){return track(wrapper,`_value`),wrapper._value},set value(newValue){let oldValue=wrapper._value;if(!Object.is(oldValue,newValue)){wrapper._value=newValue,trigger(wrapper,`_value`);for(let fn of subscribers)fn(newValue,oldValue)}},subscribe(fn){return subscribers.add(fn),()=>subscribers.delete(fn)}}}function computed(getter){let cached,dirty=!0,wrapper={_value:void 0},effect=()=>{dirty=!0,trigger(wrapper,`_value`)}
|
|
11
|
+
let activeEffect=null;const targetMap=new WeakMap;function track(target,key){if(!activeEffect)return;let depsMap=targetMap.get(target);depsMap||(depsMap=new Map,targetMap.set(target,depsMap));let deps=depsMap.get(key);deps||(deps=new Set,depsMap.set(key,deps)),deps.add(activeEffect)}function trigger(target,key){let depsMap=targetMap.get(target);if(!depsMap)return;let deps=depsMap.get(key);if(deps)for(let effect of deps)effect()}function ref(initialValue){let subscribers=new Set,wrapper={_value:initialValue};return{get value(){return track(wrapper,`_value`),wrapper._value},set value(newValue){let oldValue=wrapper._value;if(!Object.is(oldValue,newValue)){wrapper._value=newValue,trigger(wrapper,`_value`);for(let fn of subscribers)fn(newValue,oldValue)}},subscribe(fn){return subscribers.add(fn),()=>subscribers.delete(fn)},toJSON(){return wrapper._value}}}function computed(getter){let cached,dirty=!0,wrapper={_value:void 0},effect=()=>{dirty=!0,trigger(wrapper,`_value`)},recompute=()=>{if(dirty){let prev=activeEffect;activeEffect=effect;try{cached=getter()}finally{activeEffect=prev}wrapper._value=cached,dirty=!1}return cached};return{get value(){return track(wrapper,`_value`),recompute()},toJSON(){return recompute()}}}function watch(source,callback,options){let oldValue,stopped=!1,getter=typeof source==`function`?source:()=>source.value,job=()=>{if(stopped)return;let newValue=getter();Object.is(newValue,oldValue)||(callback(newValue,oldValue),oldValue=newValue)},prev=activeEffect;activeEffect=job;try{oldValue=getter()}finally{activeEffect=prev}return options?.immediate&&callback(oldValue,void 0),()=>{stopped=!0}}function reactive(target){return new Proxy(target,{get(obj,key,receiver){let value=Reflect.get(obj,key,receiver);return typeof key==`symbol`?value:(track(obj,key),typeof value==`object`&&value&&!Array.isArray(value)?reactive(value):value)},set(obj,key,value,receiver){let oldValue=Reflect.get(obj,key,receiver),result=Reflect.set(obj,key,value,receiver);return!Object.is(oldValue,value)&&typeof key!=`symbol`&&trigger(obj,key),result}})}function isRef(value){return typeof value==`object`&&!!value&&`subscribe`in value&&`value`in value}function unref(value){return isRef(value)?value.value:value}function toRefs(obj){let result={};for(let key in obj)result[key]=ref(obj[key]);return result}export{computed,isRef,reactive,ref,toRefs,unref,watch};
|
|
12
12
|
//# sourceMappingURL=reactivity.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactivity.mjs","names":[],"sources":["../../src/core/reactivity.ts"],"sourcesContent":["/**\n * Lightweight reactivity system inspired by Vue 3's composition API.\n * Provides ref(), computed(), watch(), and reactive() for observable\n * backend state — config, metrics, health, circuit breakers.\n */\n\n// ── Dependency Tracking ─────────────────────────────────────────────────\n\ntype Effect = () => void\nlet activeEffect: Effect | null = null\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<Effect>>>()\n\nfunction track(target: object, key: string | symbol): void {\n if (!activeEffect) return\n let depsMap = targetMap.get(target)\n if (!depsMap) {\n depsMap = new Map()\n targetMap.set(target, depsMap)\n }\n let deps = depsMap.get(key)\n if (!deps) {\n deps = new Set()\n depsMap.set(key, deps)\n }\n deps.add(activeEffect)\n}\n\nfunction trigger(target: object, key: string | symbol): void {\n const depsMap = targetMap.get(target)\n if (!depsMap) return\n const deps = depsMap.get(key)\n if (!deps) return\n for (const effect of deps) {\n effect()\n }\n}\n\n// ── ref() ────────────────────────────────────────────────────────────────\n\nexport interface Ref<T = any> {\n value: T\n /** Subscribe to changes. Returns unsubscribe function. */\n subscribe(fn: (newValue: T, oldValue: T) => void): () => void\n}\n\n/**\n * Create a reactive reference. Reading `.value` tracks the dependency,\n * writing `.value` triggers watchers and computed recalculations.\n *\n * @example\n * ```ts\n * const count = ref(0)\n * count.value++ // triggers watchers\n * ```\n */\nexport function ref<T>(initialValue: T): Ref<T> {\n const subscribers = new Set<(newValue: T, oldValue: T) => void>()\n const wrapper = { _value: initialValue }\n\n return {\n get value(): T {\n track(wrapper, '_value')\n return wrapper._value\n },\n set value(newValue: T) {\n const oldValue = wrapper._value\n if (Object.is(oldValue, newValue)) return\n wrapper._value = newValue\n trigger(wrapper, '_value')\n for (const fn of subscribers) {\n fn(newValue, oldValue)\n }\n },\n subscribe(fn: (newValue: T, oldValue: T) => void): () => void {\n subscribers.add(fn)\n return () => subscribers.delete(fn)\n },\n }\n}\n\n// ── computed() ───────────────────────────────────────────────────────────\n\nexport interface ComputedRef<T = any> {\n readonly value: T\n}\n\n/**\n * Create a computed value that auto-recalculates when its reactive\n * dependencies change. Cached until a dependency triggers.\n *\n * @example\n * ```ts\n * const count = ref(0)\n * const doubled = computed(() => count.value * 2)\n * count.value = 5\n * console.log(doubled.value) // 10\n * ```\n */\nexport function computed<T>(getter: () => T): ComputedRef<T> {\n let cached: T\n let dirty = true\n const wrapper = { _value: undefined as T }\n\n const effect: Effect = () => {\n dirty = true\n trigger(wrapper, '_value')\n }\n\n return {\n get value(): T {\n track(wrapper, '_value')\n if (dirty) {\n const prev = activeEffect\n activeEffect = effect\n try {\n cached = getter()\n } finally {\n activeEffect = prev\n }\n wrapper._value = cached\n dirty = false\n }\n return cached\n },\n }\n}\n\n// ── watch() ──────────────────────────────────────────────────────────────\n\nexport interface WatchOptions {\n /** Run the callback immediately with the current value (default: false) */\n immediate?: boolean\n}\n\ntype WatchSource<T> = Ref<T> | ComputedRef<T> | (() => T)\n\n/**\n * Watch a reactive source and run a callback when it changes.\n * Returns a stop function to unsubscribe.\n *\n * @example\n * ```ts\n * const count = ref(0)\n * const stop = watch(count, (newVal, oldVal) => {\n * console.log(`Changed from ${oldVal} to ${newVal}`)\n * })\n * count.value = 1 // logs: \"Changed from 0 to 1\"\n * stop() // no more callbacks\n * ```\n */\nexport function watch<T>(\n source: WatchSource<T>,\n callback: (newValue: T, oldValue: T) => void,\n options?: WatchOptions,\n): () => void {\n let oldValue: T\n let stopped = false\n\n const getter = typeof source === 'function' ? source : () => source.value\n\n const job: Effect = () => {\n if (stopped) return\n const newValue = getter()\n if (!Object.is(newValue, oldValue)) {\n callback(newValue, oldValue)\n oldValue = newValue\n }\n }\n\n // Initial run to establish tracking\n const prev = activeEffect\n activeEffect = job\n try {\n oldValue = getter()\n } finally {\n activeEffect = prev\n }\n\n if (options?.immediate) {\n callback(oldValue, undefined as T)\n }\n\n return () => {\n stopped = true\n }\n}\n\n// ── reactive() ───────────────────────────────────────────────────────────\n\n/**\n * Create a deeply reactive proxy around a plain object. Property reads\n * are tracked, property writes trigger watchers and computed recalculations.\n *\n * @example\n * ```ts\n * const state = reactive({ users: 0, errors: 0 })\n * const errorRate = computed(() =>\n * state.users > 0 ? state.errors / state.users : 0\n * )\n * state.users = 100\n * state.errors = 5\n * console.log(errorRate.value) // 0.05\n * ```\n */\nexport function reactive<T extends Record<string, any>>(target: T): T {\n return new Proxy(target, {\n get(obj, key, receiver) {\n const value = Reflect.get(obj, key, receiver)\n if (typeof key === 'symbol') return value\n track(obj, key)\n // Deep reactivity for nested objects\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n return reactive(value)\n }\n return value\n },\n set(obj, key, value, receiver) {\n const oldValue = Reflect.get(obj, key, receiver)\n const result = Reflect.set(obj, key, value, receiver)\n if (!Object.is(oldValue, value) && typeof key !== 'symbol') {\n trigger(obj, key)\n }\n return result\n },\n })\n}\n\n// ── Utility ──────────────────────────────────────────────────────────────\n\n/** Check if a value is a Ref */\nexport function isRef(value: any): value is Ref {\n return value !== null && typeof value === 'object' && 'subscribe' in value && 'value' in value\n}\n\n/** Unwrap a ref or return the value as-is */\nexport function unref<T>(value: Ref<T> | T): T {\n return isRef(value) ? value.value : value\n}\n\n/** Convert all properties of an object to refs */\nexport function toRefs<T extends Record<string, any>>(obj: T): { [K in keyof T]: Ref<T[K]> } {\n const result = {} as any\n for (const key in obj) {\n result[key] = ref(obj[key])\n }\n return result\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reactivity.mjs","names":[],"sources":["../../src/core/reactivity.ts"],"sourcesContent":["/**\n * Lightweight reactivity system inspired by Vue 3's composition API.\n * Provides ref(), computed(), watch(), and reactive() for observable\n * backend state — config, metrics, health, circuit breakers.\n */\n\n// ── Dependency Tracking ─────────────────────────────────────────────────\n\ntype Effect = () => void\nlet activeEffect: Effect | null = null\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<Effect>>>()\n\nfunction track(target: object, key: string | symbol): void {\n if (!activeEffect) return\n let depsMap = targetMap.get(target)\n if (!depsMap) {\n depsMap = new Map()\n targetMap.set(target, depsMap)\n }\n let deps = depsMap.get(key)\n if (!deps) {\n deps = new Set()\n depsMap.set(key, deps)\n }\n deps.add(activeEffect)\n}\n\nfunction trigger(target: object, key: string | symbol): void {\n const depsMap = targetMap.get(target)\n if (!depsMap) return\n const deps = depsMap.get(key)\n if (!deps) return\n for (const effect of deps) {\n effect()\n }\n}\n\n// ── ref() ────────────────────────────────────────────────────────────────\n\nexport interface Ref<T = any> {\n value: T\n /** Subscribe to changes. Returns unsubscribe function. */\n subscribe(fn: (newValue: T, oldValue: T) => void): () => void\n /**\n * Auto-unwrap on `JSON.stringify` — returns the underlying value\n * so refs serialize transparently inside larger payloads (introspect\n * snapshots, devtools state, request responses). Equivalent to\n * `unref(ref)` but invoked implicitly by the JSON pipeline.\n */\n toJSON(): T\n}\n\n/**\n * Create a reactive reference. Reading `.value` tracks the dependency,\n * writing `.value` triggers watchers and computed recalculations.\n *\n * @example\n * ```ts\n * const count = ref(0)\n * count.value++ // triggers watchers\n * ```\n */\nexport function ref<T>(initialValue: T): Ref<T> {\n const subscribers = new Set<(newValue: T, oldValue: T) => void>()\n const wrapper = { _value: initialValue }\n\n return {\n get value(): T {\n track(wrapper, '_value')\n return wrapper._value\n },\n set value(newValue: T) {\n const oldValue = wrapper._value\n if (Object.is(oldValue, newValue)) return\n wrapper._value = newValue\n trigger(wrapper, '_value')\n for (const fn of subscribers) {\n fn(newValue, oldValue)\n }\n },\n subscribe(fn: (newValue: T, oldValue: T) => void): () => void {\n subscribers.add(fn)\n return () => subscribers.delete(fn)\n },\n /**\n * Auto-unwrap on `JSON.stringify`. Without this, serializing a ref\n * leaks the wrapper shape (`{\"value\": …, \"subscribe\": …}`) instead\n * of the underlying value — particularly painful for adopters who\n * keep adapter / plugin state in refs and surface it through\n * `introspect()`. Returning `value` here means\n * `JSON.stringify({ count: ref(0) })` produces `{\"count\":0}` as\n * expected, without callers having to `.value`-unwrap by hand.\n */\n toJSON(): T {\n return wrapper._value\n },\n }\n}\n\n// ── computed() ───────────────────────────────────────────────────────────\n\nexport interface ComputedRef<T = any> {\n readonly value: T\n /**\n * Auto-unwrap on `JSON.stringify` — see {@link Ref.toJSON} for the\n * motivation. Triggers a recompute when the cached value is stale,\n * same as reading `.value`.\n */\n toJSON(): T\n}\n\n/**\n * Create a computed value that auto-recalculates when its reactive\n * dependencies change. Cached until a dependency triggers.\n *\n * @example\n * ```ts\n * const count = ref(0)\n * const doubled = computed(() => count.value * 2)\n * count.value = 5\n * console.log(doubled.value) // 10\n * ```\n */\nexport function computed<T>(getter: () => T): ComputedRef<T> {\n let cached: T\n let dirty = true\n const wrapper = { _value: undefined as T }\n\n const effect: Effect = () => {\n dirty = true\n trigger(wrapper, '_value')\n }\n\n const recompute = (): T => {\n if (dirty) {\n const prev = activeEffect\n activeEffect = effect\n try {\n cached = getter()\n } finally {\n activeEffect = prev\n }\n wrapper._value = cached\n dirty = false\n }\n return cached\n }\n\n return {\n get value(): T {\n track(wrapper, '_value')\n return recompute()\n },\n /**\n * Auto-unwrap on `JSON.stringify`, matching {@link ref}'s behavior\n * so adopters can drop a computed straight into a JSON-bound\n * payload (introspect snapshot, devtools state) and get the value\n * rather than the wrapper shape.\n *\n * Computed values cache through the same dirty-flag the getter\n * uses, so calling `toJSON` is at worst one recompute when stale —\n * identical cost to reading `.value`.\n */\n toJSON(): T {\n return recompute()\n },\n }\n}\n\n// ── watch() ──────────────────────────────────────────────────────────────\n\nexport interface WatchOptions {\n /** Run the callback immediately with the current value (default: false) */\n immediate?: boolean\n}\n\ntype WatchSource<T> = Ref<T> | ComputedRef<T> | (() => T)\n\n/**\n * Watch a reactive source and run a callback when it changes.\n * Returns a stop function to unsubscribe.\n *\n * @example\n * ```ts\n * const count = ref(0)\n * const stop = watch(count, (newVal, oldVal) => {\n * console.log(`Changed from ${oldVal} to ${newVal}`)\n * })\n * count.value = 1 // logs: \"Changed from 0 to 1\"\n * stop() // no more callbacks\n * ```\n */\nexport function watch<T>(\n source: WatchSource<T>,\n callback: (newValue: T, oldValue: T) => void,\n options?: WatchOptions,\n): () => void {\n let oldValue: T\n let stopped = false\n\n const getter = typeof source === 'function' ? source : () => source.value\n\n const job: Effect = () => {\n if (stopped) return\n const newValue = getter()\n if (!Object.is(newValue, oldValue)) {\n callback(newValue, oldValue)\n oldValue = newValue\n }\n }\n\n // Initial run to establish tracking\n const prev = activeEffect\n activeEffect = job\n try {\n oldValue = getter()\n } finally {\n activeEffect = prev\n }\n\n if (options?.immediate) {\n callback(oldValue, undefined as T)\n }\n\n return () => {\n stopped = true\n }\n}\n\n// ── reactive() ───────────────────────────────────────────────────────────\n\n/**\n * Create a deeply reactive proxy around a plain object. Property reads\n * are tracked, property writes trigger watchers and computed recalculations.\n *\n * @example\n * ```ts\n * const state = reactive({ users: 0, errors: 0 })\n * const errorRate = computed(() =>\n * state.users > 0 ? state.errors / state.users : 0\n * )\n * state.users = 100\n * state.errors = 5\n * console.log(errorRate.value) // 0.05\n * ```\n */\nexport function reactive<T extends Record<string, any>>(target: T): T {\n return new Proxy(target, {\n get(obj, key, receiver) {\n const value = Reflect.get(obj, key, receiver)\n if (typeof key === 'symbol') return value\n track(obj, key)\n // Deep reactivity for nested objects\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n return reactive(value)\n }\n return value\n },\n set(obj, key, value, receiver) {\n const oldValue = Reflect.get(obj, key, receiver)\n const result = Reflect.set(obj, key, value, receiver)\n if (!Object.is(oldValue, value) && typeof key !== 'symbol') {\n trigger(obj, key)\n }\n return result\n },\n })\n}\n\n// ── Utility ──────────────────────────────────────────────────────────────\n\n/** Check if a value is a Ref */\nexport function isRef(value: any): value is Ref {\n return value !== null && typeof value === 'object' && 'subscribe' in value && 'value' in value\n}\n\n/** Unwrap a ref or return the value as-is */\nexport function unref<T>(value: Ref<T> | T): T {\n return isRef(value) ? value.value : value\n}\n\n/** Convert all properties of an object to refs */\nexport function toRefs<T extends Record<string, any>>(obj: T): { [K in keyof T]: Ref<T[K]> } {\n const result = {} as any\n for (const key in obj) {\n result[key] = ref(obj[key])\n }\n return result\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @forinda/kickjs v5.
|
|
2
|
+
* @forinda/kickjs v5.9.0
|
|
3
3
|
*
|
|
4
4
|
* Copyright (c) Felix Orinda
|
|
5
5
|
*
|
|
@@ -8,6 +8,6 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @license MIT
|
|
10
10
|
*/
|
|
11
|
-
import"./container-
|
|
11
|
+
import"./container-B1X8WRwl.mjs";import{METADATA}from"./core/interfaces.mjs";import"./core/logger.mjs";import{c as pushClassMeta,l as pushMethodMeta}from"./metadata-BNNMsb9P.mjs";import"./core/decorators.mjs";import"./core/cron.mjs";import"./core/cache.mjs";import"reflect-metadata";const mergeConfig$2=(defaults={},overrides={})=>({...defaults,...overrides}),composeName$2=(base,scope)=>`${base}:${scope}`;function defineModule(options){if(typeof options!=`object`||!options)throw TypeError(`defineModule: options must be an object literal. See architecture.md §21 for the spec shape.`);if(typeof options.name!=`string`||options.name.length===0){let got=typeof options.name==`string`?`""`:typeof options.name;throw TypeError(`defineModule: options.name must be a non-empty string (got ${got}). Module names appear in diagnostics and \`.scoped()\` namespacing — anonymous modules make cycle / missing-dep errors hard to localize.`)}if(typeof options.build!=`function`)throw TypeError(`defineModule(${options.name}): options.build is required and must be a function (got ${typeof options.build}). The build function returns the AppModule shape — register() / routes() / contributors() — wired with the resolved config.`);let buildSync=(instanceName,scoped,overrides)=>{let config=mergeConfig$2(options.defaults,overrides),built=options.build(config,{name:instanceName,scoped});return Object.defineProperty(built,`__moduleName`,{value:instanceName,enumerable:!1,writable:!1,configurable:!1}),built},factory=(config=>buildSync(options.name,!1,config));return factory.scoped=(scopeName,config)=>buildSync(composeName$2(options.name,scopeName),!0,config),Object.defineProperty(factory,`definition`,{value:Object.freeze({...options}),writable:!1,enumerable:!0,configurable:!1}),factory}var ModuleList=class extends Array{mount(module){return this.push(module),this}};function defineModules(...initial){let list=new ModuleList;for(let entry of initial)list.push(entry);return list}var MutableModuleRegistry=class{entries=[];mount(module){this.entries.push(module)}},CircuitOpenError=class extends Error{breakerName;constructor(breakerName){super(`Circuit breaker "${breakerName}" is open — request rejected`),this.breakerName=breakerName,this.name=`CircuitOpenError`}},CircuitBreaker=class{name;state=`closed`;failures=0;successes=0;halfOpenAttempts=0;lastFailure;openedAt;failureThreshold;resetTimeout;halfOpenMax;constructor(name,options){this.name=name,this.failureThreshold=options.failureThreshold,this.resetTimeout=options.resetTimeout,this.halfOpenMax=options.halfOpenMax??1}async execute(fn){if(this.maybeTransitionToHalfOpen(),this.state===`open`||this.state===`half_open`&&this.halfOpenAttempts>=this.halfOpenMax)throw new CircuitOpenError(this.name);this.state===`half_open`&&this.halfOpenAttempts++;try{let result=await fn();return this.onSuccess(),result}catch(error){throw this.onFailure(),error}}getState(){return this.maybeTransitionToHalfOpen(),this.state}getStats(){return this.maybeTransitionToHalfOpen(),{failures:this.failures,successes:this.successes,state:this.state,...this.lastFailure?{lastFailure:this.lastFailure}:{}}}reset(){this.state=`closed`,this.failures=0,this.successes=0,this.halfOpenAttempts=0,this.lastFailure=void 0,this.openedAt=void 0}onSuccess(){this.state===`half_open`&&(this.state=`closed`,this.failures=0,this.halfOpenAttempts=0,this.openedAt=void 0),this.successes++}onFailure(){this.failures++,this.lastFailure=new Date,this.state===`half_open`?(this.state=`open`,this.openedAt=Date.now(),this.halfOpenAttempts=0):this.state===`closed`&&this.failures>=this.failureThreshold&&(this.state=`open`,this.openedAt=Date.now())}maybeTransitionToHalfOpen(){this.state===`open`&&this.openedAt!=null&&Date.now()-this.openedAt>=this.resetTimeout&&(this.state=`half_open`,this.halfOpenAttempts=0)}};function defineContextDecorator(spec){if(typeof spec!=`object`||!spec)throw TypeError(`defineContextDecorator: spec must be an object literal. See architecture.md §20.4 for the spec shape.`);if(typeof spec.key!=`string`||spec.key.length===0){let got=typeof spec.key==`string`?`""`:typeof spec.key;throw TypeError(`defineContextDecorator: spec.key must be a non-empty string (got ${got}). Pick a name that matches a key declared on \`ContextMeta\` (or one of the framework keys).`)}if(typeof spec.resolve!=`function`)throw TypeError(`defineContextDecorator(${spec.key}): spec.resolve is required and must be a function (got ${typeof spec.resolve}). Each contributor needs a resolver that produces the value to write into ctx.set(${JSON.stringify(spec.key)}, …).`);if(spec.onError!==void 0&&typeof spec.onError!=`function`)throw TypeError(`defineContextDecorator(${spec.key}): spec.onError must be a function when provided (got ${typeof spec.onError}).`);if(spec.dependsOn!==void 0&&!Array.isArray(spec.dependsOn))throw TypeError(`defineContextDecorator(${spec.key}): spec.dependsOn must be an array when provided (got ${typeof spec.dependsOn}).`);if(Array.isArray(spec.dependsOn)&&spec.dependsOn.some(dep=>typeof dep!=`string`||dep.length===0))throw TypeError(`defineContextDecorator(${spec.key}): spec.dependsOn entries must be non-empty strings.`);let definedAt=Error().stack,defaults=Object.freeze({...spec.paramDefaults??{}}),sharedDeps=Object.freeze({...spec.deps??{}}),sharedDependsOn=Object.freeze([...spec.dependsOn??[]]),sharedOptional=spec.optional??!1,buildRegistration=params=>{let frozenParams=Object.freeze({...params}),onError=spec.onError?(err,ctx)=>spec.onError(err,ctx,frozenParams):void 0;return Object.freeze({key:spec.key,deps:sharedDeps,dependsOn:sharedDependsOn,optional:sharedOptional,onError,resolve:(ctx,deps)=>spec.resolve(ctx,deps,frozenParams),definedAt})},defaultRegistration=buildRegistration({...defaults}),isDecoratorCall=args=>args.length===0?!1:args.length>=2||typeof args[0]==`function`,applyAsDecorator=(registration,target,propertyKey)=>{if(propertyKey===void 0)pushClassMeta(METADATA.CLASS_CONTRIBUTORS,target,registration);else{let constructor=target.constructor;pushMethodMeta(METADATA.METHOD_CONTRIBUTORS,constructor,String(propertyKey),registration)}},isPlainObject=value=>{let proto=Object.getPrototypeOf(value);return proto===Object.prototype||proto===null},mergeParams=override=>{if(override===void 0)return{...defaults};if(typeof override!=`object`||!override||Array.isArray(override)||!isPlainObject(override)){let got=override===null?`null`:Array.isArray(override)?`array`:typeof override==`object`?`instance of ${override.constructor?.name??`unknown class`}`:typeof override;throw TypeError(`defineContextDecorator(${spec.key}): factory call requires a plain object literal, got ${got}. Class instances and built-ins (Map, Date, etc) silently spread to empty objects — call the decorator with a spread object literal instead, e.g. \`MyDecorator({ ...someInstance })\`.`)}return{...defaults,...override}};function decoratorOrFactory(...args){if(isDecoratorCall(args)){let[target,propertyKey]=args;applyAsDecorator(defaultRegistration,target,propertyKey);return}let registration=buildRegistration(mergeParams(args[0]));return(target,propertyKey)=>{applyAsDecorator(registration,target,propertyKey)}}Object.defineProperty(decoratorOrFactory,`name`,{value:`ContextDecorator(${spec.key})`,writable:!1,enumerable:!1,configurable:!0});let decorator=Object.assign(decoratorOrFactory,{registration:defaultRegistration,with:params=>({registration:buildRegistration(mergeParams(params))})});return Object.freeze(decorator)}var MissingContributorError=class extends Error{key;dependent;route;dependentDefinedAt;constructor(key,dependent,route,dependentDefinedAt){let where=route?` on route ${route}`:``,declaredAt=formatDeclaredAt(dependentDefinedAt);super(`Missing context contributor '${key}' required by '${dependent}'${where}${declaredAt}`),this.name=`MissingContributorError`,this.key=key,this.dependent=dependent,this.route=route,this.dependentDefinedAt=dependentDefinedAt}};function formatDeclaredAt(stack){if(!stack)return``;let lines=stack.split(`
|
|
12
12
|
`);for(let line of lines){let trimmed=line.trim();if(trimmed.startsWith(`at `)&&!trimmed.includes(`context-decorator.`)&&!trimmed.includes(`context-errors.`))return`\n declared at ${trimmed.replace(/^at /,``)}`}return``}var ContributorCycleError=class extends Error{cycle;route;constructor(cycle,route){let where=route?` on route ${route}`:``;super(`Cycle in context contributors${where}: ${cycle.join(` → `)}`),this.name=`ContributorCycleError`,this.cycle=Object.freeze([...cycle]),this.route=route}},DuplicateContributorError=class extends Error{key;sources;constructor(key,sources){super(`Duplicate context contributor for key '${key}' at the same precedence level. Sources: ${sources.join(`, `)}`),this.name=`DuplicateContributorError`,this.key=key,this.sources=Object.freeze([...sources])}};const PRECEDENCE_ORDER=[`method`,`class`,`module`,`adapter`,`global`];function buildPipeline(sources,options={}){let route=options.route,bySource=new Map;for(let src of PRECEDENCE_ORDER)bySource.set(src,[]);for(let entry of sources)bySource.get(entry.source).push(entry);let winners=new Map;for(let src of PRECEDENCE_ORDER){let rows=bySource.get(src),keysAtThisLevel=new Map;for(let row of rows){let key=row.registration.key,existing=keysAtThisLevel.get(key)??[];existing.push(row),keysAtThisLevel.set(key,existing)}for(let[key,rowsForKey]of keysAtThisLevel){if(rowsForKey.length>1)throw new DuplicateContributorError(key,rowsForKey.map((r,i)=>r.label??`${src}#${i}`));winners.has(key)||winners.set(key,rowsForKey[0])}}let survivors=[...winners.values()].map(r=>r.registration),allKeys=new Set(survivors.map(r=>r.key));for(let reg of survivors)for(let dep of reg.dependsOn)if(!allKeys.has(dep))throw new MissingContributorError(dep,reg.key,route,reg.definedAt);let sorted=topoSort(survivors,route);return Object.freeze({contributors:Object.freeze(sorted),keys:allKeys})}function topoSort(registrations,route){let indegree=new Map,dependents=new Map,byKey=new Map;for(let reg of registrations)indegree.set(reg.key,reg.dependsOn.length),byKey.set(reg.key,reg);for(let reg of registrations)for(let dep of reg.dependsOn){let list=dependents.get(dep)??[];list.push(reg),dependents.set(dep,list)}let queue=[];for(let reg of registrations)indegree.get(reg.key)===0&&queue.push(reg);let sorted=[];for(;queue.length>0;){let node=queue.shift();sorted.push(node);for(let dependent of dependents.get(node.key)??[]){let next=(indegree.get(dependent.key)??0)-1;indegree.set(dependent.key,next),next===0&&queue.push(dependent)}}if(sorted.length!==registrations.length)throw new ContributorCycleError(reconstructCycle$1(registrations.filter(r=>(indegree.get(r.key)??0)>0),byKey),route);return sorted}function reconstructCycle$1(residual,byKey){let residualKeys=new Set(residual.map(r=>r.key)),start=residual[0].key,path=[start],seen=new Set([start]),cursor=start;for(;;){let nextDep=byKey.get(cursor).dependsOn.find(d=>residualKeys.has(d));if(nextDep===void 0)break;if(seen.has(nextDep)){let cycleStart=path.indexOf(nextDep);return[...path.slice(cycleStart),nextDep]}path.push(nextDep),seen.add(nextDep),cursor=nextDep}return path}async function runContributors(options){let{pipeline,ctx,container}=options;for(let reg of pipeline.contributors)await runOne(reg,ctx,container)}async function runOne(reg,ctx,container){let value;try{let deps=resolveDeps(reg,container);value=await reg.resolve(ctx,deps)}catch(err){if(reg.optional)return;if(reg.onError){let replacement=await reg.onError(err,ctx);if(replacement===void 0)return;ctx.set(reg.key,replacement);return}throw err}ctx.set(reg.key,value)}function resolveDeps(reg,container){let out={};for(let[key,token]of Object.entries(reg.deps))out[key]=container.resolve(token);return out}var DuplicateMountNameError=class extends Error{kind;mountName;constructor(kind,mountName){super(`Duplicate ${kind} name '${mountName}' — every ${kind} must declare a unique name`),this.name=`DuplicateMountNameError`,this.kind=kind,this.mountName=mountName}},MissingMountDepError=class extends Error{kind;missing;dependent;constructor(kind,missing,dependent){super(`Missing ${kind} dependency '${missing}' required by '${dependent}' — is the ${kind} installed and named correctly?`),this.name=`MissingMountDepError`,this.kind=kind,this.missing=missing,this.dependent=dependent}},MountCycleError=class extends Error{kind;cycle;constructor(kind,cycle){super(`Cycle in ${kind} dependsOn declarations: ${cycle.join(` → `)}`),this.name=`MountCycleError`,this.kind=kind,this.cycle=Object.freeze([...cycle])}};function mountSort(items,kind){let byName=new Map;for(let item of items){if(byName.has(item.name))throw new DuplicateMountNameError(kind,item.name);byName.set(item.name,item)}let indegree=new Map,dependents=new Map;for(let item of items)indegree.set(item.name,item.dependsOn?.length??0);for(let item of items)for(let dep of item.dependsOn??[]){if(!byName.has(dep))throw new MissingMountDepError(kind,dep,item.name);let list=dependents.get(dep)??[];list.push(item),dependents.set(dep,list)}let queue=[];for(let item of items)indegree.get(item.name)===0&&queue.push(item);let sorted=[];for(;queue.length>0;){let node=queue.shift();sorted.push(node);for(let dependent of dependents.get(node.name)??[]){let next=(indegree.get(dependent.name)??0)-1;indegree.set(dependent.name,next),next===0&&queue.push(dependent)}}if(sorted.length!==items.length)throw new MountCycleError(kind,reconstructCycle(items.filter(it=>(indegree.get(it.name)??0)>0),byName));return sorted}function reconstructCycle(residual,byName){let residualNames=new Set(residual.map(r=>r.name)),start=residual[0].name,path=[start],seen=new Set([start]),cursor=start;for(;;){let nextDep=byName.get(cursor).dependsOn?.find(d=>residualNames.has(d));if(nextDep===void 0)break;if(seen.has(nextDep)){let cycleStart=path.indexOf(nextDep);return[...path.slice(cycleStart),nextDep]}path.push(nextDep),seen.add(nextDep),cursor=nextDep}return path}const mergeConfig$1=(defaults={},overrides={})=>({...defaults,...overrides}),composeName$1=(base,scope)=>`${base}:${scope}`;function definePlugin(options){let buildSync=(instanceName,scoped,overrides)=>{let config=mergeConfig$1(options.defaults,overrides),built=options.build(config,{name:instanceName,scoped});return built.name=instanceName,built},buildAsync=(instanceName,opts)=>{let inner,ensureInner=async container=>{if(inner)return inner;let deps=(opts.inject??[]).map(tok=>container.resolve(tok));return inner=buildSync(instanceName,!1,await opts.useFactory(...deps)),inner};return{name:instanceName,async onReady(container){let built=await ensureInner(container);built.register?.(container),await built.onReady?.(container)},async shutdown(){await inner?.shutdown?.()}}},factory=(config=>buildSync(options.name,!1,config));return factory.scoped=(scopeName,config)=>buildSync(composeName$1(options.name,scopeName),!0,config),factory.async=opts=>buildAsync(options.name,opts),Object.defineProperty(factory,`definition`,{value:Object.freeze({...options})}),factory}const mergeConfig=(defaults={},overrides={})=>({...defaults,...overrides}),composeName=(base,scope)=>`${base}:${scope}`;function defineAdapter(options){let buildSync=(instanceName,scoped,overrides)=>{let config=mergeConfig(options.defaults,overrides),built=options.build(config,{name:instanceName,scoped});return built.name=instanceName,built},buildAsync=(instanceName,opts)=>{let inner;return{name:instanceName,async beforeStart(ctx){let deps=(opts.inject??[]).map(tok=>ctx.container.resolve(tok));inner=buildSync(instanceName,!1,await opts.useFactory(...deps)),await inner.beforeStart?.(ctx)},async afterStart(ctx){await inner?.afterStart?.(ctx)},async shutdown(){await inner?.shutdown?.()},async onHealthCheck(){return await inner?.onHealthCheck?.()??{name:instanceName,status:`up`}}}},factory=(config=>buildSync(options.name,!1,config));return factory.scoped=(scopeName,config)=>buildSync(composeName(options.name,scopeName),!0,config),factory.async=opts=>buildAsync(options.name,opts),Object.defineProperty(factory,`definition`,{value:Object.freeze({...options})}),factory}function defineAugmentation(name,meta){}export{ModuleList as _,MissingMountDepError as a,runContributors as c,DuplicateContributorError as d,MissingContributorError as f,MutableModuleRegistry as g,CircuitOpenError as h,DuplicateMountNameError as i,buildPipeline as l,CircuitBreaker as m,defineAdapter as n,MountCycleError as o,defineContextDecorator as p,definePlugin as r,mountSort as s,defineAugmentation as t,ContributorCycleError as u,defineModules as v,defineModule as y};
|
|
13
|
-
//# sourceMappingURL=core-
|
|
13
|
+
//# sourceMappingURL=core-Cd5c8LhS.mjs.map
|