@expressive/mvc 0.87.0 → 0.89.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/README.md +19 -19
- package/dist/component.d.ts +28 -16
- package/dist/component.js +53 -72
- package/dist/component.js.map +1 -1
- package/dist/context.d.ts +28 -26
- package/dist/context.js +45 -27
- package/dist/context.js.map +1 -1
- package/dist/dispatch.d.ts +6 -1
- package/dist/dispatch.js +14 -6
- package/dist/dispatch.js.map +1 -1
- package/dist/field/def.d.ts +3 -3
- package/dist/field/def.js +7 -7
- package/dist/field/def.js.map +1 -1
- package/dist/field/get.d.ts +16 -16
- package/dist/field/get.js +21 -5
- package/dist/field/get.js.map +1 -1
- package/dist/field/has.d.ts +8 -8
- package/dist/field/has.js +3 -3
- package/dist/field/has.js.map +1 -1
- package/dist/field/map.d.ts +2 -2
- package/dist/field/map.js +2 -2
- package/dist/field/map.js.map +1 -1
- package/dist/field/ref.d.ts +8 -8
- package/dist/field/ref.js +3 -3
- package/dist/field/ref.js.map +1 -1
- package/dist/field/set.js +1 -1
- package/dist/field/set.js.map +1 -1
- package/dist/hot.d.ts +5 -8
- package/dist/hot.js +126 -18
- package/dist/hot.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/jsx-dev-runtime.d.ts +1 -2
- package/dist/jsx-dev-runtime.js +1 -1
- package/dist/jsx-runtime.d.ts +77 -4
- package/dist/jsx-runtime.js +67 -2
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/observable.d.ts +7 -4
- package/dist/observable.js +94 -27
- package/dist/observable.js.map +1 -1
- package/dist/state.d.ts +154 -112
- package/dist/state.js +115 -192
- package/dist/state.js.map +1 -1
- package/package.json +7 -5
- package/dist/_virtual/_rolldown/runtime.js +0 -18
- package/dist/caught.d.ts +0 -5237
- package/dist/caught.js +0 -64
- package/dist/caught.js.map +0 -1
- package/dist/runtime.d.ts +0 -72
- package/dist/runtime.js +0 -70
- package/dist/runtime.js.map +0 -1
package/dist/field/has.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { State, parent } from "../state.js";
|
|
2
1
|
import { event, listener, touch } from "../observable.js";
|
|
2
|
+
import { Model, parent } from "../state.js";
|
|
3
3
|
import { Context } from "../context.js";
|
|
4
4
|
import { def } from "./def.js";
|
|
5
5
|
|
|
@@ -99,7 +99,7 @@ var List = class {
|
|
|
99
99
|
};
|
|
100
100
|
var Pool = class {
|
|
101
101
|
constructor(make, fromKey) {
|
|
102
|
-
if (
|
|
102
|
+
if (Model.is(make)) {
|
|
103
103
|
const Type = make;
|
|
104
104
|
make = (...args) => args.length == 1 && args[0] instanceof Type ? args[0] : fromKey ? new Type({ [fromKey]: args[0] }) : new Type(...args);
|
|
105
105
|
}
|
|
@@ -172,7 +172,7 @@ function source(from) {
|
|
|
172
172
|
return OWNED.has(from) ? from : Object.getPrototypeOf(from);
|
|
173
173
|
}
|
|
174
174
|
function adopt(target, key, value) {
|
|
175
|
-
if (!(value instanceof
|
|
175
|
+
if (!(value instanceof Model)) return;
|
|
176
176
|
const owner = parent(target);
|
|
177
177
|
const fresh = parent(value, owner ?? null);
|
|
178
178
|
const evict = listener(value, () => void target.delete(key), null);
|
package/dist/field/has.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"has.js","names":[],"sources":["../../src/field/has.ts"],"sourcesContent":["import { Context } from '../context';\nimport { event, listener, touch } from '../observable';\nimport { State, parent } from '../state';\nimport { def } from './def';\n\nconst LENGTH = Symbol('length');\nconst SHAPE = Symbol('shape');\n\nconst ITEMS = new WeakMap<object, unknown[]>();\nconst MEMBERS = new WeakMap<object, Set<unknown>>();\nconst OWNED = new WeakMap<object, Map<unknown, () => void>>();\nconst MAKE = new WeakMap<object, Make>();\n\ntype Make = (...args: unknown[]) => unknown;\ntype Predicate<T> = (value: T, index: number, self: unknown) => boolean;\ntype Mapper<T, U> = (value: T, index: number, self: unknown) => U;\n\ndeclare namespace has {\n export { Predicate, Mapper, List, Pool, Create, From }\n}\n\nfunction has<T>(initial?: Iterable<T> | false | null): List<T>;\n\nfunction has<T extends State>(\n Type: new (...args: State.Args<T>) => T\n): Create<T>;\n\nfunction has<T extends State, K extends State.Field<T>>(\n Type: new (...args: State.Args<T>) => T,\n fromKey: K\n): From<T, K>;\n\nfunction has<R, A extends unknown[]>(\n make: (...args: A) => R\n): Pool<Exclude<R, null | undefined>, A, R>;\n\nfunction has(\n arg?: Iterable<unknown> | Function | false | null,\n fromKey?: string\n): unknown {\n return def((_key, subject) => {\n const value =\n typeof arg == 'function' ? new Pool(arg, fromKey) : new List(arg);\n\n parent(value, subject);\n listener(subject, () => value.clear(), null);\n\n return { set: false, value };\n });\n}\n\nclass List<T> {\n constructor(initial?: Iterable<T> | false | null) {\n ITEMS.set(this, initial ? Array.from(initial) : []);\n OWNED.set(this, new Map());\n\n event(this);\n }\n\n get size(): number {\n return touch(this, LENGTH, items<T>(this).length);\n }\n\n get(): State.Export<T>[];\n get(index: number): T | undefined;\n get(start: number, end: number): T[];\n get(predicate: Predicate<T>): T | undefined;\n get(arg?: number | Predicate<T>, second?: number): any {\n const values = items<T>(this);\n\n if (arg === undefined) return values.map(exportValue);\n\n if (typeof arg === 'function') return findOf(this, arg);\n\n if (typeof second !== 'number') {\n const at = arg < 0 ? values.length + arg : arg;\n\n return at < 0 || at >= values.length\n ? touch(this, LENGTH)\n : touch(this, at, values[at]);\n }\n\n touch(this, LENGTH);\n\n const start = arg < 0 ? Math.max(values.length + arg, 0) : arg;\n\n return values\n .slice(start, Math.min(second, values.length))\n .map((v, i) => touch(this, start + i, v));\n }\n\n set(index: number, value: T) {\n const target = source(this);\n const values = ITEMS.get(target) as T[];\n const at = index < 0 ? values.length + index : index;\n\n if (at < 0 || at >= values.length || values[at] === value) return;\n\n values[at] = value;\n event(target, at);\n }\n\n put(index: number, ...values: T[]) {\n if (!values.length) return;\n\n const target = source(this);\n const arr = ITEMS.get(target) as T[];\n const at =\n index < 0\n ? Math.max(arr.length + index, 0)\n : Math.min(index, arr.length);\n\n arr.splice(at, 0, ...values);\n\n for (let i = at; i < arr.length; i++) event(target, i);\n event(target, LENGTH);\n }\n\n push(...values: T[]): number {\n this.put(items(this).length, ...values);\n return items(this).length;\n }\n\n pop(): T | undefined;\n pop(index: number): T | undefined;\n pop(index: number, count: number): T[];\n pop(index = -1, count?: number): T | T[] | undefined {\n const target = source(this);\n const values = ITEMS.get(target) as T[];\n const before = values.length;\n const start =\n index < 0 ? Math.max(before + index, 0) : Math.min(index, before);\n const removed = values.splice(start, count ?? 1);\n\n if (removed.length) {\n const end = Math.max(before, values.length);\n for (let i = start; i < end; i++) event(target, i);\n event(target, LENGTH);\n }\n\n return count === undefined ? removed[0] : removed;\n }\n\n clear() {\n this.pop(0, items(this).length);\n }\n\n *[Symbol.iterator](): IterableIterator<T> {\n const values = items<T>(this);\n\n touch(this, LENGTH);\n\n for (let i = 0; i < values.length; i++) yield touch(this, i, values[i]);\n }\n\n map<U>(fn: Mapper<T, U>): U[];\n map<U, X extends U>(fn: Mapper<T, U>, ignore: X): Exclude<U, X>[];\n map<U>(fn: Mapper<T, U>, ignore?: U): U[] {\n return mapOf(this, fn, arguments.length > 1, ignore);\n }\n\n filter(fn: Predicate<T>): T[] {\n return filterOf(this, fn);\n }\n\n any(fn: Predicate<T>): boolean {\n return anyOf(this, fn);\n }\n\n all(fn: Predicate<T>): boolean {\n return !anyOf(this, (v, i, self) => !fn(v, i, self));\n }\n}\n\ninterface Create<T extends State> extends Pool<T, State.Args<T>> {\n add(...args: State.Args<T>): T;\n add(instance: T): T;\n}\n\ninterface From<T extends State, K extends State.Field<T>>\n extends Pool<T, [from: T[K]]> {\n add(from: T[K]): T;\n add(instance: T): T;\n}\n\nclass Pool<T, A extends unknown[] = unknown[], R = T> {\n constructor(make: Function, fromKey?: string) {\n if (State.is(make)) {\n const Type = make as unknown as State.Type;\n\n make = (...args: State.Args) =>\n args.length == 1 && args[0] instanceof Type ? args[0] :\n fromKey ? new Type({ [fromKey]: args[0] }) :\n new Type(...args);\n }\n\n MEMBERS.set(this, new Set());\n MAKE.set(this, make as Make);\n OWNED.set(this, new Map());\n\n event(this);\n }\n\n get size(): number {\n return touch(this, SHAPE, members<T>(this).size);\n }\n\n add(...args: A): R {\n const target = source(this);\n const made = MAKE.get(target)!(...args) as T | null | undefined;\n\n if (made == null) return made as R;\n\n const values = MEMBERS.get(target) as Set<T>;\n\n if (!values.has(made)) {\n values.add(made);\n adopt(target, made, made);\n event(target, made as never);\n event(target, SHAPE);\n }\n\n return made as R;\n }\n\n get(): State.Export<T>[];\n get(predicate: Predicate<T>): T | undefined;\n get(predicate?: Predicate<T>): any {\n return predicate\n ? findOf(this, predicate)\n : Array.from(members<T>(this), exportValue);\n }\n\n has(value: T): boolean {\n return touch(this, value, members<T>(this).has(value));\n }\n\n delete(value: T): boolean {\n const target = source(this);\n const values = MEMBERS.get(target) as Set<T>;\n\n if (!values.has(value)) return false;\n\n release(target, value);\n values.delete(value);\n\n event(target, value as never);\n event(target, SHAPE);\n\n return true;\n }\n\n clear() {\n const target = source(this);\n const values = MEMBERS.get(target) as Set<T>;\n\n if (!values.size) return;\n\n const removed = Array.from(values);\n\n for (const value of removed) release(target, value);\n\n values.clear();\n\n for (const value of removed) event(target, value as never);\n event(target, SHAPE);\n }\n\n *[Symbol.iterator](): IterableIterator<T> {\n const values = members<T>(this);\n\n touch(this, SHAPE);\n\n for (const value of values) yield touch(this, value, value);\n }\n\n map<U>(fn: Mapper<T, U>): U[];\n map<U, X extends U>(fn: Mapper<T, U>, ignore: X): Exclude<U, X>[];\n map<U>(fn: Mapper<T, U>, ignore?: U): U[] {\n return mapOf(this, fn, arguments.length > 1, ignore);\n }\n\n filter(fn: Predicate<T>): T[] {\n return filterOf(this, fn);\n }\n\n any(fn: Predicate<T>): boolean {\n return anyOf(this, fn);\n }\n\n all(fn: Predicate<T>): boolean {\n return !anyOf(this, (v, i, self) => !fn(v, i, self));\n }\n}\n\nfunction source<T extends object>(from: T): T {\n return OWNED.has(from) ? from : Object.getPrototypeOf(from);\n}\n\nfunction adopt(\n target: { delete(key: never): boolean },\n key: unknown,\n value: unknown\n) {\n if (!(value instanceof State)) return;\n\n const owner = parent(target as object);\n const fresh = parent(value, owner ?? null);\n const evict = listener(value, () => void target.delete(key as never), null);\n\n let detach: (() => void) | undefined;\n\n if (fresh && owner)\n detach = Context.get(owner).add(value);\n\n OWNED.get(target)!.set(key, () => {\n evict();\n if (detach) detach();\n if (fresh) value.set(null);\n });\n\n if (fresh) event(value);\n}\n\nfunction release(target: object, key: unknown) {\n const owned = OWNED.get(target)!;\n const free = owned.get(key);\n\n if (free) {\n owned.delete(key);\n free();\n }\n}\n\nfunction exportValue(value: any) {\n return value && typeof value === 'object' && typeof value.get === 'function'\n ? value.get()\n : value;\n}\n\nfunction items<T>(from: object): T[] {\n return ITEMS.get(source(from)) as T[];\n}\n\nfunction members<T>(from: object): Set<T> {\n return MEMBERS.get(source(from)) as Set<T>;\n}\n\nfunction findOf<T>(\n self: Iterable<T>,\n fn: Predicate<T>\n): T | undefined {\n let i = 0;\n\n for (const value of self)\n if (fn(value, i++, self)) return value;\n}\n\nfunction anyOf<T>(self: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n\n for (const value of self)\n if (fn(value, i++, self)) return true;\n\n return false;\n}\n\nfunction mapOf<T, U>(\n self: Iterable<T>,\n fn: Mapper<T, U>,\n skip: boolean,\n ignore?: U\n): U[] {\n const out: U[] = [];\n let i = 0;\n\n for (const value of self) {\n const result = fn(value, i++, self);\n if (skip && result === ignore) continue;\n out.push(result);\n }\n\n return out;\n}\n\nfunction filterOf<T>(self: Iterable<T>, fn: Predicate<T>): T[] {\n const out: T[] = [];\n let i = 0;\n\n for (const value of self) if (fn(value, i++, self)) out.push(value);\n\n return out;\n}\n\nObject.assign(has, { List, Pool });\n\nexport { has };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"has.js","names":[],"sources":["../../src/field/has.ts"],"sourcesContent":["import { Context } from '../context';\nimport { event, listener, touch } from '../observable';\nimport { Model, parent } from '../state';\nimport { def } from './def';\n\nconst LENGTH = Symbol('length');\nconst SHAPE = Symbol('shape');\n\nconst ITEMS = new WeakMap<object, unknown[]>();\nconst MEMBERS = new WeakMap<object, Set<unknown>>();\nconst OWNED = new WeakMap<object, Map<unknown, () => void>>();\nconst MAKE = new WeakMap<object, Make>();\n\ntype Make = (...args: unknown[]) => unknown;\ntype Predicate<T> = (value: T, index: number, self: unknown) => boolean;\ntype Mapper<T, U> = (value: T, index: number, self: unknown) => U;\n\ndeclare namespace has {\n export { Predicate, Mapper, List, Pool, Create, From }\n}\n\nfunction has<T>(initial?: Iterable<T> | false | null): List<T>;\n\nfunction has<T extends Model>(\n Type: new (...args: Model.Args<T>) => T\n): Create<T>;\n\nfunction has<T extends Model, K extends Model.Field<T>>(\n Type: new (...args: Model.Args<T>) => T,\n fromKey: K\n): From<T, K>;\n\nfunction has<R, A extends unknown[]>(\n make: (...args: A) => R\n): Pool<Exclude<R, null | undefined>, A, R>;\n\nfunction has(\n arg?: Iterable<unknown> | Function | false | null,\n fromKey?: string\n): unknown {\n return def((_key, subject) => {\n const value =\n typeof arg == 'function' ? new Pool(arg, fromKey) : new List(arg);\n\n parent(value, subject);\n listener(subject, () => value.clear(), null);\n\n return { set: false, value };\n });\n}\n\nclass List<T> {\n constructor(initial?: Iterable<T> | false | null) {\n ITEMS.set(this, initial ? Array.from(initial) : []);\n OWNED.set(this, new Map());\n\n event(this);\n }\n\n get size(): number {\n return touch(this, LENGTH, items<T>(this).length);\n }\n\n get(): Model.Export<T>[];\n get(index: number): T | undefined;\n get(start: number, end: number): T[];\n get(predicate: Predicate<T>): T | undefined;\n get(arg?: number | Predicate<T>, second?: number): any {\n const values = items<T>(this);\n\n if (arg === undefined) return values.map(exportValue);\n\n if (typeof arg === 'function') return findOf(this, arg);\n\n if (typeof second !== 'number') {\n const at = arg < 0 ? values.length + arg : arg;\n\n return at < 0 || at >= values.length\n ? touch(this, LENGTH)\n : touch(this, at, values[at]);\n }\n\n touch(this, LENGTH);\n\n const start = arg < 0 ? Math.max(values.length + arg, 0) : arg;\n\n return values\n .slice(start, Math.min(second, values.length))\n .map((v, i) => touch(this, start + i, v));\n }\n\n set(index: number, value: T) {\n const target = source(this);\n const values = ITEMS.get(target) as T[];\n const at = index < 0 ? values.length + index : index;\n\n if (at < 0 || at >= values.length || values[at] === value) return;\n\n values[at] = value;\n event(target, at);\n }\n\n put(index: number, ...values: T[]) {\n if (!values.length) return;\n\n const target = source(this);\n const arr = ITEMS.get(target) as T[];\n const at =\n index < 0\n ? Math.max(arr.length + index, 0)\n : Math.min(index, arr.length);\n\n arr.splice(at, 0, ...values);\n\n for (let i = at; i < arr.length; i++) event(target, i);\n event(target, LENGTH);\n }\n\n push(...values: T[]): number {\n this.put(items(this).length, ...values);\n return items(this).length;\n }\n\n pop(): T | undefined;\n pop(index: number): T | undefined;\n pop(index: number, count: number): T[];\n pop(index = -1, count?: number): T | T[] | undefined {\n const target = source(this);\n const values = ITEMS.get(target) as T[];\n const before = values.length;\n const start =\n index < 0 ? Math.max(before + index, 0) : Math.min(index, before);\n const removed = values.splice(start, count ?? 1);\n\n if (removed.length) {\n const end = Math.max(before, values.length);\n for (let i = start; i < end; i++) event(target, i);\n event(target, LENGTH);\n }\n\n return count === undefined ? removed[0] : removed;\n }\n\n clear() {\n this.pop(0, items(this).length);\n }\n\n *[Symbol.iterator](): IterableIterator<T> {\n const values = items<T>(this);\n\n touch(this, LENGTH);\n\n for (let i = 0; i < values.length; i++) yield touch(this, i, values[i]);\n }\n\n map<U>(fn: Mapper<T, U>): U[];\n map<U, X extends U>(fn: Mapper<T, U>, ignore: X): Exclude<U, X>[];\n map<U>(fn: Mapper<T, U>, ignore?: U): U[] {\n return mapOf(this, fn, arguments.length > 1, ignore);\n }\n\n filter(fn: Predicate<T>): T[] {\n return filterOf(this, fn);\n }\n\n any(fn: Predicate<T>): boolean {\n return anyOf(this, fn);\n }\n\n all(fn: Predicate<T>): boolean {\n return !anyOf(this, (v, i, self) => !fn(v, i, self));\n }\n}\n\ninterface Create<T extends Model> extends Pool<T, Model.Args<T>> {\n add(...args: Model.Args<T>): T;\n add(instance: T): T;\n}\n\ninterface From<T extends Model, K extends Model.Field<T>>\n extends Pool<T, [from: T[K]]> {\n add(from: T[K]): T;\n add(instance: T): T;\n}\n\nclass Pool<T, A extends unknown[] = unknown[], R = T> {\n constructor(make: Function, fromKey?: string) {\n if (Model.is(make)) {\n const Type = make as unknown as Model.Type;\n\n make = (...args: Model.Args) =>\n args.length == 1 && args[0] instanceof Type ? args[0] :\n fromKey ? new Type({ [fromKey]: args[0] }) :\n new Type(...args);\n }\n\n MEMBERS.set(this, new Set());\n MAKE.set(this, make as Make);\n OWNED.set(this, new Map());\n\n event(this);\n }\n\n get size(): number {\n return touch(this, SHAPE, members<T>(this).size);\n }\n\n add(...args: A): R {\n const target = source(this);\n const made = MAKE.get(target)!(...args) as T | null | undefined;\n\n if (made == null) return made as R;\n\n const values = MEMBERS.get(target) as Set<T>;\n\n if (!values.has(made)) {\n values.add(made);\n adopt(target, made, made);\n event(target, made as never);\n event(target, SHAPE);\n }\n\n return made as R;\n }\n\n get(): Model.Export<T>[];\n get(predicate: Predicate<T>): T | undefined;\n get(predicate?: Predicate<T>): any {\n return predicate\n ? findOf(this, predicate)\n : Array.from(members<T>(this), exportValue);\n }\n\n has(value: T): boolean {\n return touch(this, value, members<T>(this).has(value));\n }\n\n delete(value: T): boolean {\n const target = source(this);\n const values = MEMBERS.get(target) as Set<T>;\n\n if (!values.has(value)) return false;\n\n release(target, value);\n values.delete(value);\n\n event(target, value as never);\n event(target, SHAPE);\n\n return true;\n }\n\n clear() {\n const target = source(this);\n const values = MEMBERS.get(target) as Set<T>;\n\n if (!values.size) return;\n\n const removed = Array.from(values);\n\n for (const value of removed) release(target, value);\n\n values.clear();\n\n for (const value of removed) event(target, value as never);\n event(target, SHAPE);\n }\n\n *[Symbol.iterator](): IterableIterator<T> {\n const values = members<T>(this);\n\n touch(this, SHAPE);\n\n for (const value of values) yield touch(this, value, value);\n }\n\n map<U>(fn: Mapper<T, U>): U[];\n map<U, X extends U>(fn: Mapper<T, U>, ignore: X): Exclude<U, X>[];\n map<U>(fn: Mapper<T, U>, ignore?: U): U[] {\n return mapOf(this, fn, arguments.length > 1, ignore);\n }\n\n filter(fn: Predicate<T>): T[] {\n return filterOf(this, fn);\n }\n\n any(fn: Predicate<T>): boolean {\n return anyOf(this, fn);\n }\n\n all(fn: Predicate<T>): boolean {\n return !anyOf(this, (v, i, self) => !fn(v, i, self));\n }\n}\n\nfunction source<T extends object>(from: T): T {\n return OWNED.has(from) ? from : Object.getPrototypeOf(from);\n}\n\nfunction adopt(\n target: { delete(key: never): boolean },\n key: unknown,\n value: unknown\n) {\n if (!(value instanceof Model)) return;\n\n const owner = parent(target as object);\n const fresh = parent(value, owner ?? null);\n const evict = listener(value, () => void target.delete(key as never), null);\n\n let detach: (() => void) | undefined;\n\n if (fresh && owner)\n detach = Context.get(owner).add(value);\n\n OWNED.get(target)!.set(key, () => {\n evict();\n if (detach) detach();\n if (fresh) value.set(null);\n });\n\n if (fresh) event(value);\n}\n\nfunction release(target: object, key: unknown) {\n const owned = OWNED.get(target)!;\n const free = owned.get(key);\n\n if (free) {\n owned.delete(key);\n free();\n }\n}\n\nfunction exportValue(value: any) {\n return value && typeof value === 'object' && typeof value.get === 'function'\n ? value.get()\n : value;\n}\n\nfunction items<T>(from: object): T[] {\n return ITEMS.get(source(from)) as T[];\n}\n\nfunction members<T>(from: object): Set<T> {\n return MEMBERS.get(source(from)) as Set<T>;\n}\n\nfunction findOf<T>(\n self: Iterable<T>,\n fn: Predicate<T>\n): T | undefined {\n let i = 0;\n\n for (const value of self)\n if (fn(value, i++, self)) return value;\n}\n\nfunction anyOf<T>(self: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n\n for (const value of self)\n if (fn(value, i++, self)) return true;\n\n return false;\n}\n\nfunction mapOf<T, U>(\n self: Iterable<T>,\n fn: Mapper<T, U>,\n skip: boolean,\n ignore?: U\n): U[] {\n const out: U[] = [];\n let i = 0;\n\n for (const value of self) {\n const result = fn(value, i++, self);\n if (skip && result === ignore) continue;\n out.push(result);\n }\n\n return out;\n}\n\nfunction filterOf<T>(self: Iterable<T>, fn: Predicate<T>): T[] {\n const out: T[] = [];\n let i = 0;\n\n for (const value of self) if (fn(value, i++, self)) out.push(value);\n\n return out;\n}\n\nObject.assign(has, { List, Pool });\n\nexport { has };\n"],"mappings":"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"}
|
package/dist/field/map.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Model } from "../state.js";
|
|
2
2
|
|
|
3
3
|
//#region src/field/map.d.ts
|
|
4
4
|
declare namespace map {
|
|
@@ -15,7 +15,7 @@ declare function map<A extends [unknown, ...unknown[]], V>(make: (...args: A) =>
|
|
|
15
15
|
declare class Managed<K, V> extends Map<K, V> {
|
|
16
16
|
constructor(arg?: Iterable<readonly [K, V]> | Function | false | null);
|
|
17
17
|
get size(): number;
|
|
18
|
-
get(): ReadonlyMap<K,
|
|
18
|
+
get(): ReadonlyMap<K, Model.Export<V>>;
|
|
19
19
|
get(key: K): V | undefined;
|
|
20
20
|
has(key: K): boolean;
|
|
21
21
|
set(key: K, ...rest: unknown[]): this;
|
package/dist/field/map.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { State, parent } from "../state.js";
|
|
2
1
|
import { event, listener, touch } from "../observable.js";
|
|
2
|
+
import { Model, parent } from "../state.js";
|
|
3
3
|
import { Context } from "../context.js";
|
|
4
4
|
import { def } from "./def.js";
|
|
5
5
|
|
|
@@ -111,7 +111,7 @@ function store(target, key, value) {
|
|
|
111
111
|
release(target, key);
|
|
112
112
|
}
|
|
113
113
|
MAP.set.call(target, key, value);
|
|
114
|
-
if (value instanceof
|
|
114
|
+
if (value instanceof Model) {
|
|
115
115
|
const owner = parent(target);
|
|
116
116
|
const fresh = parent(value, owner ?? null);
|
|
117
117
|
const evict = listener(value, () => void target.delete(key), null);
|
package/dist/field/map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.js","names":[],"sources":["../../src/field/map.ts"],"sourcesContent":["import { Context } from '../context';\nimport { event, listener, touch } from '../observable';\nimport {
|
|
1
|
+
{"version":3,"file":"map.js","names":[],"sources":["../../src/field/map.ts"],"sourcesContent":["import { Context } from '../context';\nimport { event, listener, touch } from '../observable';\nimport { Model, parent } from '../state';\nimport { def } from './def';\n\nconst SHAPE = Symbol('shape');\nconst KEYED = (_key: unknown, value: unknown) => value;\n\nconst MAKE = new WeakMap<object, Function>();\nconst OWNED = new WeakMap<object, Map<unknown, () => void>>();\n\nconst MAP = Map.prototype;\nconst MAP_SIZE = Object.getOwnPropertyDescriptor(MAP, 'size')!.get!;\n\ndeclare namespace map {\n export interface Create<A extends [unknown, ...unknown[]], V> extends Managed<A[0], V> {\n set(...args: A): this;\n }\n\n export interface Insert<K, V> extends Managed<K, V> {\n set(key: K, value: V): this;\n }\n\n export { Managed };\n}\n\nfunction map<K, V>(\n entries?: Iterable<readonly [K, V]> | false | null\n): map.Insert<K, V>;\n\nfunction map<A extends [unknown, ...unknown[]], V>(\n make: (...args: A) => V\n): map.Create<A, V>;\n\nfunction map(\n arg?: Iterable<readonly [unknown, unknown]> | Function | false | null\n): unknown {\n return def((_key, subject) => {\n const value = new Managed(typeof arg == 'function' && arg);\n\n parent(value, subject);\n listener(subject, () => value.clear(), null);\n\n if (arg && typeof arg == 'object')\n for (const [key, entry] of arg) value.set(key, entry);\n\n return { set: false, value };\n });\n}\n\nclass Managed<K, V> extends Map<K, V> {\n constructor(arg?: Iterable<readonly [K, V]> | Function | false | null) {\n super();\n\n MAKE.set(this, typeof arg == 'function' ? arg : KEYED);\n OWNED.set(this, new Map());\n\n event(this);\n\n if (arg && typeof arg != 'function')\n for (const [key, value] of arg) store(this, key, value);\n }\n\n get size(): number {\n return touch(this, SHAPE, MAP_SIZE.call(source(this)));\n }\n\n get(): ReadonlyMap<K, Model.Export<V>>;\n get(key: K): V | undefined;\n get(key?: K): unknown {\n const target = source(this);\n\n return arguments.length\n ? touch(this, key, super.get.call(target, key as K)) \n : new Map(\n Array.from(MAP.entries.call(target), ([key, value]) => [\n key,\n value && typeof value === 'object' && typeof value.get === 'function'\n ? value.get()\n : value\n ])\n );\n }\n\n has(key: K): boolean {\n return touch(this, key, MAP.has.call(source(this), key));\n }\n\n set(key: K, ...rest: unknown[]): this {\n const target = source(this);\n const value = MAKE.get(target)!(key, ...rest) as V;\n\n store(target, key, value);\n return this;\n }\n\n delete(key: K) {\n const target = source(this);\n\n if (!MAP.has.call(target, key)) return false;\n\n release(target, key);\n MAP.delete.call(target, key);\n\n event(target, key as never);\n event(target, SHAPE);\n\n return true;\n }\n\n clear() {\n const target = source(this);\n const keys = Array.from(MAP.keys.call(target));\n\n if (!keys.length) return;\n\n for (const key of keys) release(target, key);\n\n MAP.clear.call(target);\n\n for (const key of keys) event(target, key as never);\n event(target, SHAPE);\n }\n\n entries(): MapIterator<[K, V]>;\n entries<R>(fn: (entry: [K, V]) => R): Iterable<R>;\n entries(fn?: (entry: [K, V]) => unknown): any {\n const self = this;\n function* iterate() {\n const target = source(self);\n\n touch(self, SHAPE);\n\n for (const [key, value] of MAP.entries.call(target))\n yield [key, touch(self, key, value)] as [K, V];\n }\n\n return fn ? transform(iterate, fn) : iterate();\n }\n\n keys(): MapIterator<K>;\n keys<R>(fn: (key: K) => R): Iterable<R>;\n keys(fn?: (key: K) => unknown): any {\n const self = this;\n function* iterate() {\n touch(self, SHAPE);\n yield* MAP.keys.call(source(self)) as IterableIterator<K>;\n }\n\n return fn ? transform(iterate, fn) : iterate();\n }\n\n values(): MapIterator<V>;\n values<R>(fn: (value: V, key: K) => R): Iterable<R>;\n values(fn?: (value: V, key: K) => unknown): any {\n if (fn)\n return this.entries(([key, value]) => fn(value, key));\n\n const self = this;\n return (function* () {\n for (const [, value] of self.entries())\n yield value;\n })();\n }\n\n forEach(\n callbackfn: (value: V, key: K, map: this) => void,\n thisArg?: unknown\n ) {\n for (const [key, value] of this.entries())\n callbackfn.call(thisArg, value, key, this);\n }\n\n [Symbol.iterator]() {\n return this.entries();\n }\n}\n\nObject.assign(map, { Managed });\n\nfunction transform<T, R>(\n iterate: () => Generator<T>,\n fn: (item: T) => R\n): Iterable<R> {\n return {\n *[Symbol.iterator]() {\n for (const item of iterate())\n try {\n yield fn(item);\n } catch (err) {\n if (err !== false) throw err;\n }\n }\n };\n}\n\nfunction store<K, V>(target: Managed<K, V>, key: K, value: V) {\n const exists = MAP.has.call(target, key);\n\n if (exists) {\n if (MAP.get.call(target, key) === value) return;\n\n release(target, key);\n }\n\n MAP.set.call(target, key, value);\n\n if (value instanceof Model) {\n const owner = parent(target);\n const fresh = parent(value, owner ?? null);\n const evict = listener(value, () => void target.delete(key), null);\n\n let detach: (() => void) | undefined;\n\n if (fresh && owner)\n detach = Context.get(owner).add(value);\n\n OWNED.get(target)!.set(key, () => {\n evict();\n if (detach) detach();\n if (fresh) value.set(null);\n });\n\n if (fresh) event(value);\n }\n\n event(target, key as never);\n\n if (!exists) event(target, SHAPE);\n}\n\nfunction release(target: object, key: unknown) {\n const owned = OWNED.get(target)!;\n const free = owned.get(key);\n\n if (free) {\n owned.delete(key);\n free();\n }\n}\n\nfunction source<T extends object>(from: T): T {\n return OWNED.has(from) ? from : Object.getPrototypeOf(from);\n}\n\nexport { map };\n"],"mappings":"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"}
|
package/dist/field/ref.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Model } from "../state.js";
|
|
2
2
|
|
|
3
3
|
//#region src/field/ref.d.ts
|
|
4
4
|
declare namespace ref {
|
|
5
|
-
type Map<T extends
|
|
5
|
+
type Map<T extends Model, R> = (this: T, key: Model.Field<T> & string, state: T) => R;
|
|
6
6
|
type Callback<T> = (argument: T) => ((next: T | null) => void) | Promise<void> | void | boolean;
|
|
7
7
|
/** Callable ref that also exposes ref-object properties. */
|
|
8
8
|
interface Object<T = any> {
|
|
@@ -10,8 +10,8 @@ declare namespace ref {
|
|
|
10
10
|
(value: T | null): void;
|
|
11
11
|
/** Current value held by this reference. */
|
|
12
12
|
current: T;
|
|
13
|
-
/**
|
|
14
|
-
is:
|
|
13
|
+
/** Model instance this reference belongs to. */
|
|
14
|
+
is: Model;
|
|
15
15
|
/** Key of property on state this reference belongs to. */
|
|
16
16
|
key: string;
|
|
17
17
|
/**
|
|
@@ -25,10 +25,10 @@ declare namespace ref {
|
|
|
25
25
|
get(): T | null;
|
|
26
26
|
}
|
|
27
27
|
/** Object with references to all managed values of `T`. */
|
|
28
|
-
type Proxy<T extends
|
|
28
|
+
type Proxy<T extends Model> = { [P in Model.Field<T>]-?: Object<T[P]> } & {
|
|
29
29
|
get(): T;
|
|
30
30
|
};
|
|
31
|
-
type CustomProxy<T extends
|
|
31
|
+
type CustomProxy<T extends Model, R> = { [P in Model.Field<T>]-?: R } & {
|
|
32
32
|
get(): T;
|
|
33
33
|
};
|
|
34
34
|
}
|
|
@@ -42,7 +42,7 @@ declare namespace ref {
|
|
|
42
42
|
*
|
|
43
43
|
* @param state - Source state from which to reference values.
|
|
44
44
|
*/
|
|
45
|
-
declare function ref<T extends
|
|
45
|
+
declare function ref<T extends Model>(state: T): ref.Proxy<T>;
|
|
46
46
|
/**
|
|
47
47
|
* Creates an object with values based on managed values.
|
|
48
48
|
* Each property will invoke map function on first access supply
|
|
@@ -53,7 +53,7 @@ declare function ref<T extends State>(state: T): ref.Proxy<T>;
|
|
|
53
53
|
* @param state - Source state from which to reference values.
|
|
54
54
|
* @param map - Function producing the placeholder value for any given property.
|
|
55
55
|
*/
|
|
56
|
-
declare function ref<T extends
|
|
56
|
+
declare function ref<T extends Model, R>(state: T, map: ref.Map<T, R>): ref.CustomProxy<T, R>;
|
|
57
57
|
/**
|
|
58
58
|
* Creates a ref-compatible property.
|
|
59
59
|
* Callable to set the value, with ref-object properties for reading and subscribing.
|
package/dist/field/ref.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { State, update } from "../state.js";
|
|
2
1
|
import { capture, listener } from "../observable.js";
|
|
2
|
+
import { Model, update } from "../state.js";
|
|
3
3
|
import { def } from "./def.js";
|
|
4
4
|
|
|
5
5
|
//#region src/field/ref.ts
|
|
6
6
|
const { defineProperty, defineProperties } = Object;
|
|
7
7
|
function ref(arg, arg2) {
|
|
8
|
-
if (arg instanceof
|
|
9
|
-
if (typeof arg == "object") throw new Error("ref instruction requires a
|
|
8
|
+
if (arg instanceof Model) return proxy(arg, arg2);
|
|
9
|
+
if (typeof arg == "object") throw new Error("ref instruction requires a Model instance, got a plain object");
|
|
10
10
|
return property(arg, arg2);
|
|
11
11
|
}
|
|
12
12
|
function defaultMap(key) {
|
package/dist/field/ref.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.js","names":[],"sources":["../../src/field/ref.ts"],"sourcesContent":["import { listener, capture } from '../observable';\nimport {
|
|
1
|
+
{"version":3,"file":"ref.js","names":[],"sources":["../../src/field/ref.ts"],"sourcesContent":["import { listener, capture } from '../observable';\nimport { Model, update } from '../state';\nimport { def } from './def';\n\nconst { defineProperty, defineProperties } = Object;\n\ndeclare namespace ref {\n type Map<T extends Model, R> = (\n this: T,\n key: Model.Field<T> & string,\n state: T\n ) => R;\n\n type Callback<T> = (\n argument: T\n ) => ((next: T | null) => void) | Promise<void> | void | boolean;\n\n /** Callable ref that also exposes ref-object properties. */\n interface Object<T = any> {\n /** Set the current value of this reference. */\n (value: T | null): void;\n\n /** Current value held by this reference. */\n current: T;\n\n /** Model instance this reference belongs to. */\n is: Model;\n\n /** Key of property on state this reference belongs to. */\n key: string;\n\n /**\n * Subscribe to changes of this reference.\n *\n * @param callback - Callback to invoke with the current value when it changes.\n * @returns Unsubscribe function to stop listening to changes.\n */\n get(callback: (value: T) => void): () => void;\n\n /** Retrieve current value. */\n get(): T | null;\n }\n\n /** Object with references to all managed values of `T`. */\n type Proxy<T extends Model> = { [P in Model.Field<T>]-?: Object<T[P]> } & {\n get(): T;\n };\n\n type CustomProxy<T extends Model, R> = { [P in Model.Field<T>]-?: R } & {\n get(): T;\n };\n}\n\n/**\n * Creates an object with references to all managed values.\n * Each property is a function to set value in state when invoked.\n *\n * *Properties are simultaneously a ref-function and ref-object, use as needed.*\n *\n * Non-enumerable; excluded from snapshots and `ref(this)`.\n *\n * @param state - Source state from which to reference values.\n */\nfunction ref<T extends Model>(state: T): ref.Proxy<T>;\n\n/**\n * Creates an object with values based on managed values.\n * Each property will invoke map function on first access supply\n * the its return value going forward.\n *\n * Non-enumerable; excluded from snapshots and `ref(this)`.\n *\n * @param state - Source state from which to reference values.\n * @param map - Function producing the placeholder value for any given property.\n */\nfunction ref<T extends Model, R>(\n state: T,\n map: ref.Map<T, R>\n): ref.CustomProxy<T, R>;\n\n/**\n * Creates a ref-compatible property.\n * Callable to set the value, with ref-object properties for reading and subscribing.\n *\n * Non-enumerable; excluded from snapshots and `ref(this)`.\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n */\nfunction ref<T>(callback?: ref.Callback<T>): ref.Object<T>;\n\n/**\n * Creates a ref-compatible property.\n * Callable to set the value, with ref-object properties for reading and subscribing.\n *\n * Non-enumerable; excluded from snapshots and `ref(this)`.\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n * @param ignoreNull - Default `true`. If `false`, will still callback with `null`.\n */\nfunction ref<T>(\n callback: ref.Callback<T | null>,\n ignoreNull: boolean\n): ref.Object<T>;\n\nfunction ref<T extends Model>(\n arg?: ref.Callback<T> | T,\n arg2?: ref.Map<T, any> | boolean\n) {\n if (arg instanceof Model)\n return proxy(arg, arg2 as ref.Map<T, any> | undefined);\n\n if (typeof arg == 'object')\n throw new Error(\n 'ref instruction requires a Model instance, got a plain object'\n );\n\n return property(arg, arg2 as boolean | undefined);\n}\n\nfunction defaultMap(this: Model, key: string) {\n const source = this as any as Record<string, any>;\n const set = (x: any) => (source[key] = x);\n const get = (cb?: (value: any) => void) =>\n cb ? listener(this, () => cb(source[key]), key) : source[key];\n\n defineProperties(set, {\n current: { get, set },\n get: { value: get },\n is: { value: this },\n key: { value: key }\n });\n\n return set;\n}\n\nfunction proxy(target: Model, map: ref.Map<any, any> = defaultMap) {\n return def((_key, _subject) => {\n const value = {} as Record<string, any>;\n const source = target as any as Record<string, any>;\n\n listener(target, () => {\n for (const key in source)\n defineProperty(value, key, {\n configurable: true,\n get() {\n const out = map.call(target, key, target);\n defineProperty(value, key, { value: out });\n return out;\n }\n });\n\n return null;\n });\n\n return {\n get: () => value,\n enumerable: false\n };\n });\n}\n\nfunction property<T>(callback?: ref.Callback<T>, ignoreNull?: boolean) {\n return def((key, subject, state) => {\n let unset: ((next: T) => void) | undefined;\n\n function get(cb?: (value: T) => void) {\n return cb ? listener(subject, () => cb(state[key]), key) : state[key];\n }\n\n function set(value?: any) {\n if (!update(subject, key, value) || !callback) return;\n if (unset) unset = void unset(value);\n if (value === null && ignoreNull !== false) return;\n\n capture((release) => {\n const out = callback.call(subject, value);\n\n unset = (next) => {\n if (typeof out == 'function') out(next);\n release();\n };\n });\n }\n\n state[key] = null;\n\n defineProperties(set, {\n current: { get, set },\n get: { value: get },\n is: { value: subject },\n key: { value: key }\n });\n\n return {\n get: () => set,\n enumerable: false\n };\n });\n}\n\nexport { ref };\n"],"mappings":";;;;;AAIA,MAAM,EAAE,gBAAgB,qBAAqB;AAoG7C,SAAS,IACP,KACA,MACA;AACA,KAAI,eAAe,MACjB,QAAO,MAAM,KAAK,KAAoC;AAExD,KAAI,OAAO,OAAO,SAChB,OAAM,IAAI,MACR,gEACD;AAEH,QAAO,SAAS,KAAK,KAA4B;;AAGnD,SAAS,WAAwB,KAAa;CAC5C,MAAM,SAAS;CACf,MAAM,OAAO,MAAY,OAAO,OAAO;CACvC,MAAM,OAAO,OACX,KAAK,SAAS,YAAY,GAAG,OAAO,KAAK,EAAE,IAAI,GAAG,OAAO;AAE3D,kBAAiB,KAAK;EACpB,SAAS;GAAE;GAAK;GAAK;EACrB,KAAK,EAAE,OAAO,KAAK;EACnB,IAAI,EAAE,OAAO,MAAM;EACnB,KAAK,EAAE,OAAO,KAAK;EACpB,CAAC;AAEF,QAAO;;AAGT,SAAS,MAAM,QAAe,MAAyB,YAAY;AACjE,QAAO,KAAK,MAAM,aAAa;EAC7B,MAAM,QAAQ,EAAE;EAChB,MAAM,SAAS;AAEf,WAAS,cAAc;AACrB,QAAK,MAAM,OAAO,OAChB,gBAAe,OAAO,KAAK;IACzB,cAAc;IACd,MAAM;KACJ,MAAM,MAAM,IAAI,KAAK,QAAQ,KAAK,OAAO;AACzC,oBAAe,OAAO,KAAK,EAAE,OAAO,KAAK,CAAC;AAC1C,YAAO;;IAEV,CAAC;AAEJ,UAAO;IACP;AAEF,SAAO;GACL,WAAW;GACX,YAAY;GACb;GACD;;AAGJ,SAAS,SAAY,UAA4B,YAAsB;AACrE,QAAO,KAAK,KAAK,SAAS,UAAU;EAClC,IAAI;EAEJ,SAAS,IAAI,IAAyB;AACpC,UAAO,KAAK,SAAS,eAAe,GAAG,MAAM,KAAK,EAAE,IAAI,GAAG,MAAM;;EAGnE,SAAS,IAAI,OAAa;AACxB,OAAI,CAAC,OAAO,SAAS,KAAK,MAAM,IAAI,CAAC,SAAU;AAC/C,OAAI,MAAO,SAAQ,KAAK,MAAM,MAAM;AACpC,OAAI,UAAU,QAAQ,eAAe,MAAO;AAE5C,YAAS,YAAY;IACnB,MAAM,MAAM,SAAS,KAAK,SAAS,MAAM;AAEzC,aAAS,SAAS;AAChB,SAAI,OAAO,OAAO,WAAY,KAAI,KAAK;AACvC,cAAS;;KAEX;;AAGJ,QAAM,OAAO;AAEb,mBAAiB,KAAK;GACpB,SAAS;IAAE;IAAK;IAAK;GACrB,KAAK,EAAE,OAAO,KAAK;GACnB,IAAI,EAAE,OAAO,SAAS;GACtB,KAAK,EAAE,OAAO,KAAK;GACpB,CAAC;AAEF,SAAO;GACL,WAAW;GACX,YAAY;GACb;GACD"}
|
package/dist/field/set.js
CHANGED
package/dist/field/set.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.js","names":[],"sources":["../../src/field/set.ts"],"sourcesContent":["import { listener, capture, observer } from '../observable';\nimport { access, compute, event,
|
|
1
|
+
{"version":3,"file":"set.js","names":[],"sources":["../../src/field/set.ts"],"sourcesContent":["import { listener, capture, observer } from '../observable';\nimport { access, compute, event, Model, update } from '../state';\nimport { def } from './def';\n\ndeclare namespace set {\n type Callback<T, S = any> = (\n this: S,\n next: T,\n previous: T\n ) => ((next: T) => void) | Promise<any> | void | boolean;\n\n type Factory<T, S = any> = (this: S, property: string) => Promise<T> | T;\n}\n\n/**\n * Set a property as a placeholder, initially `undefined` but required.\n *\n * Property cannot be accessed until it is defined. If accessed while undefined, a hybrid\n * `Promise`/`Error` (aka: [Suspense](https://reactjs.org/docs/concurrent-mode-suspense.html)) will be thrown.\n *\n * Non-enumerable; writable only if `onUpdate` callback is provided.\n *\n * @param value - Starting value (undefined for suspense placeholder).\n * @param onUpdate - Callback run when property is set.\n */\nfunction set<T>(value?: undefined, onUpdate?: set.Callback<T>): T;\n\n/**\n * Set property with an async factory function.\n * If required is not defined, factory runs lazily on first access.\n * If async, or returns a promise, suspense is thrown upon access until resolved.\n *\n * Non-enumerable and read-only.\n *\n * @param factory - Zero-arg async callback to produce property value.\n * @param required - Pass `true` to run factory immediately and require value.\n */\nfunction set<T>(factory: () => T | Promise<T>, required?: true): T;\n\n/**\n * Set property with a lazy factory, no suspense.\n *\n * Non-enumerable and read-only.\n *\n * @param factory - Zero-arg callback to produce property value.\n * @param required - Pass `false` to allow undefined while pending.\n */\nfunction set<T>(\n factory: () => T | Promise<T>,\n required: boolean\n): T | undefined;\n\n/**\n * Set property with a factory and update callback.\n *\n * Non-enumerable but writable via the callback.\n *\n * @param factory - Callback to produce initial value.\n * @param onUpdate - Callback run when property is updated.\n */\nfunction set<T>(factory: () => T | Promise<T>, onUpdate: set.Callback<T>): T;\n\n/**\n * Define a reactive computed property - the instruction equivalent of a getter.\n *\n * Unlike a zero-arg factory (which runs once and caches), the compute function\n * re-runs whenever any managed property it reads is updated. It receives the\n * instance as both `this` and its first argument, so arrow functions work.\n *\n * Enumerable and read-only, matching a prototype getter. Because it assigns\n * through an instruction rather than a concrete getter, subclasses may refine\n * the property's type with `declare`.\n *\n * @param compute - Function of arity >= 1; receives the instance to derive from.\n */\nfunction set<T, S = any>(compute: (this: S, self: S) => T): T;\n\n/**\n * Set a property with a non-function, non-Promise value.\n *\n * Non-enumerable but writable. Unlike plain assignment (`= value`), this\n * property is excluded from snapshots and `ref(this)`.\n *\n * @param value - Starting value for property.\n * @param onUpdate - Optional callback run when property is set.\n */\n// TODO: if onUpdate is not defined, should this have behavior unique to simple assignment?\n// I'm thinking default behavior should be to assign value directly to property, without triggering any additional updates.\n// All this requires is a default callback which throws true, silent updates are already implemented.\nfunction set<T>(\n value: T extends Promise<any> ? never : T,\n onUpdate?: set.Callback<T>\n): T;\n\nfunction set<T = any>(value?: unknown, argument?: unknown): any {\n return def<T>((key, subject) => {\n if (value instanceof Promise)\n throw new TypeError(\n `Direct promises are not supported in set(${subject}.${key}). Use set(() => promise) instead.`\n );\n\n if (typeof value == 'function' && value.length > 0) {\n compute.call(subject, value as () => unknown, key);\n return;\n }\n\n const config: Model.Apply = {\n enumerable: false,\n set: false\n };\n\n let computed = false;\n\n // One-shot factory\n if (typeof value == 'function') {\n const factory = value.bind(subject, key)\n computed = true;\n\n function init() {\n let output: unknown;\n\n try {\n output = attempt(factory);\n } catch (err) {\n console.warn(\n `Generating initial value for ${subject}.${key} failed.`\n );\n throw err;\n }\n\n config.get = argument !== false;\n\n function assign(next: any, silent?: boolean) {\n if (typeof argument == 'function') subject[key] = next;\n else update(subject, key, next, silent, true);\n }\n\n if (output instanceof Promise)\n output.then((next) => {\n if (observer(subject) !== null) assign(next);\n }, (error) => {\n if (observer(subject) === null) return;\n event(subject, key);\n config.get = () => {\n throw error;\n };\n });\n else assign(output, true);\n\n if (argument) return null;\n\n if (output instanceof Promise && argument !== false)\n return access(subject, key, true);\n\n return subject[key];\n }\n\n if (argument) {\n listener(subject, () => {\n init();\n return null;\n });\n } else {\n config.get = init;\n }\n } else if (value !== undefined) {\n config.value = value;\n }\n\n if (typeof argument == 'function') {\n let unset: ((next: T) => void) | undefined;\n\n config.set = function (this: any, value: any, previous: any) {\n capture((release) => {\n const returns = argument.call(this, value, previous);\n\n if (unset) unset(value);\n\n unset = (next: T) => {\n if (typeof returns == 'function') returns(next);\n release();\n };\n });\n };\n } else if (!computed)\n config.set = () => {\n config.get = undefined;\n config.set = undefined;\n };\n\n return config;\n });\n}\n\nfunction attempt(fn: () => any): any {\n function retry(err: unknown) {\n if (err instanceof Promise) return err.then(compute);\n else throw err;\n }\n\n function compute(): any {\n try {\n const output = fn();\n\n return output instanceof Promise ? output.catch(retry) : output;\n } catch (err) {\n return retry(err);\n }\n }\n\n return compute();\n}\n\nexport { set };\n"],"mappings":";;;;;AA8FA,SAAS,IAAa,OAAiB,UAAyB;AAC9D,QAAO,KAAQ,KAAK,YAAY;AAC9B,MAAI,iBAAiB,QACnB,OAAM,IAAI,UACR,4CAA4C,QAAQ,GAAG,IAAI,oCAC5D;AAEH,MAAI,OAAO,SAAS,cAAc,MAAM,SAAS,GAAG;AAClD,WAAQ,KAAK,SAAS,OAAwB,IAAI;AAClD;;EAGF,MAAM,SAAsB;GAC1B,YAAY;GACZ,KAAK;GACN;EAED,IAAI,WAAW;AAGf,MAAI,OAAO,SAAS,YAAY;GAC9B,MAAM,UAAU,MAAM,KAAK,SAAS,IAAI;AACxC,cAAW;GAEX,SAAS,OAAO;IACd,IAAI;AAEJ,QAAI;AACF,cAAS,QAAQ,QAAQ;aAClB,KAAK;AACZ,aAAQ,KACN,gCAAgC,QAAQ,GAAG,IAAI,UAChD;AACD,WAAM;;AAGR,WAAO,MAAM,aAAa;IAE1B,SAAS,OAAO,MAAW,QAAkB;AAC3C,SAAI,OAAO,YAAY,WAAY,SAAQ,OAAO;SAC7C,QAAO,SAAS,KAAK,MAAM,QAAQ,KAAK;;AAG/C,QAAI,kBAAkB,QACpB,QAAO,MAAM,SAAS;AACpB,SAAI,SAAS,QAAQ,KAAK,KAAM,QAAO,KAAK;QAC1C,UAAU;AACZ,SAAI,SAAS,QAAQ,KAAK,KAAM;AAChC,WAAM,SAAS,IAAI;AACnB,YAAO,YAAY;AACjB,YAAM;;MAER;QACC,QAAO,QAAQ,KAAK;AAEzB,QAAI,SAAU,QAAO;AAErB,QAAI,kBAAkB,WAAW,aAAa,MAC5C,QAAO,OAAO,SAAS,KAAK,KAAK;AAEnC,WAAO,QAAQ;;AAGjB,OAAI,SACF,UAAS,eAAe;AACtB,UAAM;AACN,WAAO;KACP;OAEF,QAAO,MAAM;aAEN,UAAU,OACnB,QAAO,QAAQ;AAGjB,MAAI,OAAO,YAAY,YAAY;GACjC,IAAI;AAEJ,UAAO,MAAM,SAAqB,OAAY,UAAe;AAC3D,aAAS,YAAY;KACnB,MAAM,UAAU,SAAS,KAAK,MAAM,OAAO,SAAS;AAEpD,SAAI,MAAO,OAAM,MAAM;AAEvB,cAAS,SAAY;AACnB,UAAI,OAAO,WAAW,WAAY,SAAQ,KAAK;AAC/C,eAAS;;MAEX;;aAEK,CAAC,SACV,QAAO,YAAY;AACjB,UAAO,MAAM;AACb,UAAO,MAAM;;AAGjB,SAAO;GACP;;AAGJ,SAAS,QAAQ,IAAoB;CACnC,SAAS,MAAM,KAAc;AAC3B,MAAI,eAAe,QAAS,QAAO,IAAI,KAAK,QAAQ;MAC/C,OAAM;;CAGb,SAAS,UAAe;AACtB,MAAI;GACF,MAAM,SAAS,IAAI;AAEnB,UAAO,kBAAkB,UAAU,OAAO,MAAM,MAAM,GAAG;WAClD,KAAK;AACZ,UAAO,MAAM,IAAI;;;AAIrB,QAAO,SAAS"}
|
package/dist/hot.d.ts
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Model } from "./state.js";
|
|
2
2
|
|
|
3
3
|
//#region src/hot.d.ts
|
|
4
|
-
declare namespace hot_d_exports {
|
|
5
|
-
export { Replaced, accept, replaced };
|
|
6
|
-
}
|
|
7
4
|
interface Replaced {
|
|
8
5
|
/** Module id the class was accepted under. */
|
|
9
6
|
id: string;
|
|
10
7
|
/** Local declaration name of the class. */
|
|
11
8
|
name: string;
|
|
12
9
|
/** Class live instances belong to. */
|
|
13
|
-
prev:
|
|
10
|
+
prev: Model.Extends;
|
|
14
11
|
/** Class that took its place. */
|
|
15
|
-
next:
|
|
12
|
+
next: Model.Extends;
|
|
16
13
|
}
|
|
17
14
|
/**
|
|
18
|
-
* Keep a module's
|
|
15
|
+
* Keep a module's Model classes stable across runs. A class seen before is
|
|
19
16
|
* patched with its replacement and returned in its place, refreshing live
|
|
20
17
|
* instances; one whose shape or parent changed is returned as-is, and
|
|
21
18
|
* reported to `replaced` listeners before `accept` returns.
|
|
@@ -28,5 +25,5 @@ declare function accept<T extends Record<string, unknown>>(id: string, classes:
|
|
|
28
25
|
*/
|
|
29
26
|
declare function replaced(listener: (event: Replaced) => void): () => void;
|
|
30
27
|
//#endregion
|
|
31
|
-
export { type Replaced, accept,
|
|
28
|
+
export { type Replaced, accept, replaced };
|
|
32
29
|
//# sourceMappingURL=hot.d.ts.map
|
package/dist/hot.js
CHANGED
|
@@ -1,19 +1,129 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { event, observer } from "./observable.js";
|
|
4
|
-
import { rechain } from "./component.js";
|
|
1
|
+
import { event } from "./observable.js";
|
|
2
|
+
import { GETTERS, LATEST, METHODS, Model, SETUP, UNBIND, classify, compute } from "./state.js";
|
|
5
3
|
|
|
6
4
|
//#region src/hot.ts
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
const define = Object.defineProperty;
|
|
6
|
+
/** Method implementations replaced by a hot patch. */
|
|
7
|
+
const PAST = /* @__PURE__ */ new WeakSet();
|
|
8
|
+
/** Live instances, tracked once hot patching is enabled. */
|
|
9
|
+
let LIVE;
|
|
10
|
+
/** Bootstrapped subclasses of each class, tracked once hot patching is enabled. */
|
|
11
|
+
const SUBCLASSES = /* @__PURE__ */ new WeakMap();
|
|
11
12
|
const MODULES = /* @__PURE__ */ new Map();
|
|
12
13
|
const LISTENERS = /* @__PURE__ */ new Set();
|
|
13
14
|
const REFRESH = Symbol.for("@expressive/mvc.refresh");
|
|
14
15
|
const PRIVATE = /(?:^|[\s;{}*])#[\w$]+(?=[\s=;(}])/;
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
/** Begin tracking live instances, so a hot patch can reach them. */
|
|
17
|
+
function track() {
|
|
18
|
+
if (LIVE) return;
|
|
19
|
+
LIVE = /* @__PURE__ */ new Set();
|
|
20
|
+
Model.on({
|
|
21
|
+
type(type) {
|
|
22
|
+
const parent = Object.getPrototypeOf(type);
|
|
23
|
+
let children = SUBCLASSES.get(parent);
|
|
24
|
+
if (!children) SUBCLASSES.set(parent, children = /* @__PURE__ */ new Set());
|
|
25
|
+
children.add(type);
|
|
26
|
+
},
|
|
27
|
+
setup(state) {
|
|
28
|
+
const ref = new WeakRef(state);
|
|
29
|
+
LIVE.add(ref);
|
|
30
|
+
return () => LIVE.delete(ref);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Move the members of `next` onto `prev`, which keeps its identity. Returns the
|
|
36
|
+
* live instances of `prev`, each needing a refresh.
|
|
37
|
+
*/
|
|
38
|
+
function patch(prev, next, own) {
|
|
39
|
+
const proto = prev.prototype;
|
|
40
|
+
const incoming = Object.getOwnPropertyDescriptors(next.prototype);
|
|
41
|
+
const keys = METHODS.get(prev);
|
|
42
|
+
const getters = GETTERS.get(prev);
|
|
43
|
+
const methods = /* @__PURE__ */ new Map();
|
|
44
|
+
const knownKeys = new Set(keys?.keys());
|
|
45
|
+
const knownGetters = new Set(getters?.keys());
|
|
46
|
+
let setup = SETUP.get(prev);
|
|
47
|
+
for (const handler of own) setup.delete(handler);
|
|
48
|
+
for (const handler of handlers(next)) {
|
|
49
|
+
if (!setup) SETUP.set(prev, setup = /* @__PURE__ */ new Set());
|
|
50
|
+
setup.add(handler);
|
|
51
|
+
}
|
|
52
|
+
for (const key of Reflect.ownKeys(next)) {
|
|
53
|
+
if (key == "prototype" || key == "length" || key == "name") continue;
|
|
54
|
+
if (Object.getOwnPropertyDescriptor(prev, key)?.configurable !== false) define(prev, key, Object.getOwnPropertyDescriptor(next, key));
|
|
55
|
+
}
|
|
56
|
+
const removed = /* @__PURE__ */ new Set();
|
|
57
|
+
for (const key of Object.getOwnPropertyNames(proto)) if (key != "constructor" && !(key in incoming)) {
|
|
58
|
+
const bind = keys?.get(key);
|
|
59
|
+
if (bind && Object.getOwnPropertyDescriptor(proto, key).get === bind) {
|
|
60
|
+
PAST.add(UNBIND.get(bind));
|
|
61
|
+
keys.delete(key);
|
|
62
|
+
}
|
|
63
|
+
removed.add(key);
|
|
64
|
+
Reflect.deleteProperty(proto, key);
|
|
65
|
+
getters?.delete(key);
|
|
66
|
+
}
|
|
67
|
+
for (const [key, desc] of Object.entries(incoming)) {
|
|
68
|
+
if (key == "constructor") continue;
|
|
69
|
+
const current = Object.getOwnPropertyDescriptor(proto, key);
|
|
70
|
+
if (typeof desc.value == "function") methods.set(key, desc.value);
|
|
71
|
+
if (current?.configurable === false) {
|
|
72
|
+
if (current.writable) proto[key] = desc.value;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (current?.get && keys?.get(key) === current.get) PAST.add(UNBIND.get(current.get));
|
|
76
|
+
const getter = getters?.get(key);
|
|
77
|
+
if (getter) LATEST.set(getter, desc.get);
|
|
78
|
+
define(proto, key, {
|
|
79
|
+
...desc,
|
|
80
|
+
configurable: true
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (keys) {
|
|
84
|
+
for (let T = prev;; T = Object.getPrototypeOf(T)) {
|
|
85
|
+
for (const handler of SETUP.get(T) || []) if (handler.type) handler.type(prev);
|
|
86
|
+
if (T === Model) break;
|
|
87
|
+
}
|
|
88
|
+
classify(prev, keys, getters);
|
|
89
|
+
}
|
|
90
|
+
const live = [];
|
|
91
|
+
for (const ref of LIVE) {
|
|
92
|
+
const state = ref.deref();
|
|
93
|
+
if (!state) LIVE.delete(ref);
|
|
94
|
+
else if (state instanceof prev) live.push(state);
|
|
95
|
+
}
|
|
96
|
+
const descendants = new Set([prev, ...live.map((state) => state.constructor)]);
|
|
97
|
+
for (const type of descendants) for (const child of SUBCLASSES.get(type) || []) descendants.add(child);
|
|
98
|
+
descendants.delete(prev);
|
|
99
|
+
for (const type of descendants) {
|
|
100
|
+
const inherit = METHODS.get(type);
|
|
101
|
+
const computed = GETTERS.get(type);
|
|
102
|
+
for (const [key, bind] of keys) if (!knownKeys.has(key) && !inherit.has(key)) inherit.set(key, bind);
|
|
103
|
+
for (const [key, get] of getters) if (!knownGetters.has(key) && !computed.has(key)) computed.set(key, get);
|
|
104
|
+
for (const key of removed) if (!(key in type.prototype)) {
|
|
105
|
+
inherit.delete(key);
|
|
106
|
+
computed.delete(key);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const state of live) {
|
|
110
|
+
for (const [key, value] of methods) {
|
|
111
|
+
const desc = Object.getOwnPropertyDescriptor(state, key);
|
|
112
|
+
if (!desc) continue;
|
|
113
|
+
if (desc.set) desc.set.call(state, value);
|
|
114
|
+
else if (PAST.has(UNBIND.get(desc.value))) delete state[key];
|
|
115
|
+
}
|
|
116
|
+
for (const key of removed) if (PAST.has(UNBIND.get(Object.getOwnPropertyDescriptor(state, key)?.value))) delete state[key];
|
|
117
|
+
for (const [key, get] of GETTERS.get(state.constructor)) if (!knownGetters.has(key) && get === getters.get(key)) compute.call(state, get, key);
|
|
118
|
+
}
|
|
119
|
+
return live;
|
|
120
|
+
}
|
|
121
|
+
/** Lifecycle handlers registered on a class itself. */
|
|
122
|
+
function handlers(type) {
|
|
123
|
+
return [...SETUP.get(type) || []];
|
|
124
|
+
}
|
|
125
|
+
function isModel(value) {
|
|
126
|
+
return typeof value == "function" && value.prototype instanceof Model;
|
|
17
127
|
}
|
|
18
128
|
/** What a patch cannot carry: class source less its members, and member kinds. */
|
|
19
129
|
function describe(type) {
|
|
@@ -28,9 +138,10 @@ function describe(type) {
|
|
|
28
138
|
shape = shape.replace(text.call(fn), "");
|
|
29
139
|
if (target !== type) kinds[key] = desc.set ? "accessor" : desc.get ? "get" : "fn";
|
|
30
140
|
}
|
|
141
|
+
shape = shape.replace(/\s+/g, " ").replace(/__vite_ssr_import_\d+__/g, "__vite_ssr_import__");
|
|
31
142
|
return {
|
|
32
143
|
type,
|
|
33
|
-
shape
|
|
144
|
+
shape,
|
|
34
145
|
kinds,
|
|
35
146
|
own: handlers(type)
|
|
36
147
|
};
|
|
@@ -42,7 +153,7 @@ function compatible(prev, next) {
|
|
|
42
153
|
return true;
|
|
43
154
|
}
|
|
44
155
|
/**
|
|
45
|
-
* Keep a module's
|
|
156
|
+
* Keep a module's Model classes stable across runs. A class seen before is
|
|
46
157
|
* patched with its replacement and returned in its place, refreshing live
|
|
47
158
|
* instances; one whose shape or parent changed is returned as-is, and
|
|
48
159
|
* reported to `replaced` listeners before `accept` returns.
|
|
@@ -53,10 +164,9 @@ function accept(id, classes) {
|
|
|
53
164
|
const output = { ...classes };
|
|
54
165
|
const refresh = /* @__PURE__ */ new Set();
|
|
55
166
|
const replace = [];
|
|
56
|
-
let patched = false;
|
|
57
167
|
track();
|
|
58
168
|
for (const [name, type] of Object.entries(classes)) {
|
|
59
|
-
if (!
|
|
169
|
+
if (!isModel(type)) continue;
|
|
60
170
|
const prev = known[name];
|
|
61
171
|
if (prev?.type === type) continue;
|
|
62
172
|
const next = describe(type);
|
|
@@ -72,7 +182,6 @@ function accept(id, classes) {
|
|
|
72
182
|
}
|
|
73
183
|
try {
|
|
74
184
|
for (const state of patch(prev.type, type, prev.own)) refresh.add(state);
|
|
75
|
-
patched = true;
|
|
76
185
|
known[name] = {
|
|
77
186
|
...next,
|
|
78
187
|
type: prev.type
|
|
@@ -89,8 +198,7 @@ function accept(id, classes) {
|
|
|
89
198
|
known[name] = next;
|
|
90
199
|
}
|
|
91
200
|
}
|
|
92
|
-
|
|
93
|
-
for (const state of refresh) if (observer(state)?.ready) event(state, REFRESH);
|
|
201
|
+
for (const state of refresh) event(state, REFRESH);
|
|
94
202
|
for (const event of replace) for (const listener of LISTENERS) try {
|
|
95
203
|
listener(event);
|
|
96
204
|
} catch (error) {
|
|
@@ -109,5 +217,5 @@ function replaced(listener) {
|
|
|
109
217
|
}
|
|
110
218
|
|
|
111
219
|
//#endregion
|
|
112
|
-
export { accept,
|
|
220
|
+
export { accept, replaced };
|
|
113
221
|
//# sourceMappingURL=hot.js.map
|
package/dist/hot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hot.js","names":[],"sources":["../src/hot.ts"],"sourcesContent":["import { rechain } from './component';\nimport { event, observer } from './observable';\nimport { State, handlers, patch, track } from './state';\n\ninterface Entry {\n type: Function;\n shape: string;\n kinds: Record<string, 'get' | 'accessor' | 'fn'>;\n own: ReturnType<typeof handlers>;\n}\n\ninterface Replaced {\n /** Module id the class was accepted under. */\n id: string;\n /** Local declaration name of the class. */\n name: string;\n /** Class live instances belong to. */\n prev: State.Extends;\n /** Class that took its place. */\n next: State.Extends;\n}\n\nconst MODULES = new Map<string, Record<string, Entry>>();\nconst LISTENERS = new Set<(event: Replaced) => void>();\nconst REFRESH = Symbol.for('@expressive/mvc.refresh');\nconst PRIVATE = /(?:^|[\\s;{}*])#[\\w$]+(?=[\\s=;(}])/;\n\nfunction isState(value: unknown): value is State.Extends {\n return typeof value == 'function' && value.prototype instanceof State;\n}\n\n/** What a patch cannot carry: class source less its members, and member kinds. */\nfunction describe(type: Function): Entry {\n const text = Function.prototype.toString;\n const kinds: Entry['kinds'] = {};\n let shape = text.call(type);\n\n for (const target of [type.prototype, type])\n for (const [key, desc] of Object.entries(Object.getOwnPropertyDescriptors(target)))\n for (const fn of [desc.value, desc.get, desc.set])\n if (typeof fn == 'function' && fn !== type) {\n shape = shape.replace(text.call(fn), '');\n if (target !== type) kinds[key] = desc.set ? 'accessor' : desc.get ? 'get' : 'fn';\n }\n\n return { type, shape: shape.replace(/\\s+/g, ' '), kinds, own: handlers(type as State.Extends) };\n}\n\nfunction compatible(prev: Entry, next: Entry) {\n if (prev.shape !== next.shape || PRIVATE.test(next.shape)) return false;\n if (Object.getPrototypeOf(prev.type) !== Object.getPrototypeOf(next.type)) return false;\n\n for (const key in next.kinds)\n if (key in prev.kinds && prev.kinds[key] !== next.kinds[key]) return false;\n\n return true;\n}\n\n/**\n * Keep a module's State classes stable across runs. A class seen before is\n * patched with its replacement and returned in its place, refreshing live\n * instances; one whose shape or parent changed is returned as-is, and\n * reported to `replaced` listeners before `accept` returns.\n */\nfunction accept<T extends Record<string, unknown>>(id: string, classes: T): T {\n let known = MODULES.get(id);\n\n if (!known) MODULES.set(id, (known = {}));\n\n const output: Record<string, unknown> = { ...classes };\n const refresh = new Set<State>();\n const replace: Replaced[] = [];\n let patched = false;\n\n track();\n\n for (const [name, type] of Object.entries(classes)) {\n if (!isState(type)) continue;\n\n const prev = known[name];\n\n if (prev?.type === type) continue;\n\n const next = describe(type);\n\n if (!prev || !compatible(prev, next)) {\n if (prev) replace.push({ id, name, prev: prev.type as State.Extends, next: type });\n known[name] = next;\n continue;\n }\n\n try {\n for (const state of patch(prev.type as State.Extends, type, prev.own)) refresh.add(state);\n patched = true;\n known[name] = { ...next, type: prev.type };\n output[name] = prev.type;\n } catch (error) {\n console.error(error);\n replace.push({ id, name, prev: prev.type as State.Extends, next: type });\n known[name] = next;\n }\n }\n\n if (patched) rechain();\n\n for (const state of refresh) if (observer(state)?.ready) event(state, REFRESH);\n\n for (const event of replace)\n for (const listener of LISTENERS)\n try {\n listener(event);\n } catch (error) {\n console.error(error);\n }\n\n return output as T;\n}\n\n/**\n * Observe classes `accept` replaced instead of patching. Fires synchronously\n * inside `accept`, while the module re-runs, so a host can retire instances of\n * `prev` before anything resolves the module again.\n */\nfunction replaced(listener: (event: Replaced) => void): () => void {\n LISTENERS.add(listener);\n return () => void LISTENERS.delete(listener);\n}\n\nexport { accept, replaced };\nexport type { Replaced };\n"],"mappings":";;;;;;;;;;AAsBA,MAAM,0BAAU,IAAI,KAAoC;AACxD,MAAM,4BAAY,IAAI,KAAgC;AACtD,MAAM,UAAU,OAAO,IAAI,0BAA0B;AACrD,MAAM,UAAU;AAEhB,SAAS,QAAQ,OAAwC;AACvD,QAAO,OAAO,SAAS,cAAc,MAAM,qBAAqB;;;AAIlE,SAAS,SAAS,MAAuB;CACvC,MAAM,OAAO,SAAS,UAAU;CAChC,MAAM,QAAwB,EAAE;CAChC,IAAI,QAAQ,KAAK,KAAK,KAAK;AAE3B,MAAK,MAAM,UAAU,CAAC,KAAK,WAAW,KAAK,CACzC,MAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,OAAO,0BAA0B,OAAO,CAAC,CAChF,MAAK,MAAM,MAAM;EAAC,KAAK;EAAO,KAAK;EAAK,KAAK;EAAI,CAC/C,KAAI,OAAO,MAAM,cAAc,OAAO,MAAM;AAC1C,UAAQ,MAAM,QAAQ,KAAK,KAAK,GAAG,EAAE,GAAG;AACxC,MAAI,WAAW,KAAM,OAAM,OAAO,KAAK,MAAM,aAAa,KAAK,MAAM,QAAQ;;AAGrF,QAAO;EAAE;EAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI;EAAE;EAAO,KAAK,SAAS,KAAsB;EAAE;;AAGjG,SAAS,WAAW,MAAa,MAAa;AAC5C,KAAI,KAAK,UAAU,KAAK,SAAS,QAAQ,KAAK,KAAK,MAAM,CAAE,QAAO;AAClE,KAAI,OAAO,eAAe,KAAK,KAAK,KAAK,OAAO,eAAe,KAAK,KAAK,CAAE,QAAO;AAElF,MAAK,MAAM,OAAO,KAAK,MACrB,KAAI,OAAO,KAAK,SAAS,KAAK,MAAM,SAAS,KAAK,MAAM,KAAM,QAAO;AAEvE,QAAO;;;;;;;;AAST,SAAS,OAA0C,IAAY,SAAe;CAC5E,IAAI,QAAQ,QAAQ,IAAI,GAAG;AAE3B,KAAI,CAAC,MAAO,SAAQ,IAAI,IAAK,QAAQ,EAAE,CAAE;CAEzC,MAAM,SAAkC,EAAE,GAAG,SAAS;CACtD,MAAM,0BAAU,IAAI,KAAY;CAChC,MAAM,UAAsB,EAAE;CAC9B,IAAI,UAAU;AAEd,QAAO;AAEP,MAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,QAAQ,EAAE;AAClD,MAAI,CAAC,QAAQ,KAAK,CAAE;EAEpB,MAAM,OAAO,MAAM;AAEnB,MAAI,MAAM,SAAS,KAAM;EAEzB,MAAM,OAAO,SAAS,KAAK;AAE3B,MAAI,CAAC,QAAQ,CAAC,WAAW,MAAM,KAAK,EAAE;AACpC,OAAI,KAAM,SAAQ,KAAK;IAAE;IAAI;IAAM,MAAM,KAAK;IAAuB,MAAM;IAAM,CAAC;AAClF,SAAM,QAAQ;AACd;;AAGF,MAAI;AACF,QAAK,MAAM,SAAS,MAAM,KAAK,MAAuB,MAAM,KAAK,IAAI,CAAE,SAAQ,IAAI,MAAM;AACzF,aAAU;AACV,SAAM,QAAQ;IAAE,GAAG;IAAM,MAAM,KAAK;IAAM;AAC1C,UAAO,QAAQ,KAAK;WACb,OAAO;AACd,WAAQ,MAAM,MAAM;AACpB,WAAQ,KAAK;IAAE;IAAI;IAAM,MAAM,KAAK;IAAuB,MAAM;IAAM,CAAC;AACxE,SAAM,QAAQ;;;AAIlB,KAAI,QAAS,UAAS;AAEtB,MAAK,MAAM,SAAS,QAAS,KAAI,SAAS,MAAM,EAAE,MAAO,OAAM,OAAO,QAAQ;AAE9E,MAAK,MAAM,SAAS,QAClB,MAAK,MAAM,YAAY,UACrB,KAAI;AACF,WAAS,MAAM;UACR,OAAO;AACd,UAAQ,MAAM,MAAM;;AAG1B,QAAO;;;;;;;AAQT,SAAS,SAAS,UAAiD;AACjE,WAAU,IAAI,SAAS;AACvB,cAAa,KAAK,UAAU,OAAO,SAAS"}
|
|
1
|
+
{"version":3,"file":"hot.js","names":[],"sources":["../src/hot.ts"],"sourcesContent":["import { event } from './observable';\nimport {\n Model,\n GETTERS,\n LATEST,\n METHODS,\n SETUP,\n UNBIND,\n classify,\n compute,\n type Handler\n} from './state';\n\ninterface Entry {\n type: Function;\n shape: string;\n kinds: Record<string, 'get' | 'accessor' | 'fn'>;\n own: Handler[];\n}\n\ninterface Replaced {\n /** Module id the class was accepted under. */\n id: string;\n /** Local declaration name of the class. */\n name: string;\n /** Class live instances belong to. */\n prev: Model.Extends;\n /** Class that took its place. */\n next: Model.Extends;\n}\n\nconst define = Object.defineProperty;\n\n/** Method implementations replaced by a hot patch. */\nconst PAST = new WeakSet<Function>();\n\n/** Live instances, tracked once hot patching is enabled. */\nlet LIVE: Set<WeakRef<Model>> | undefined;\n\n/** Bootstrapped subclasses of each class, tracked once hot patching is enabled. */\nconst SUBCLASSES = new WeakMap<Function, Set<Model.Extends>>();\n\nconst MODULES = new Map<string, Record<string, Entry>>();\nconst LISTENERS = new Set<(event: Replaced) => void>();\nconst REFRESH = Symbol.for('@expressive/mvc.refresh');\nconst PRIVATE = /(?:^|[\\s;{}*])#[\\w$]+(?=[\\s=;(}])/;\n\n/** Begin tracking live instances, so a hot patch can reach them. */\nfunction track() {\n if (LIVE) return;\n\n LIVE = new Set();\n\n Model.on({\n type(type) {\n const parent = Object.getPrototypeOf(type);\n let children = SUBCLASSES.get(parent);\n if (!children) SUBCLASSES.set(parent, (children = new Set()));\n children.add(type);\n },\n setup(state) {\n const ref = new WeakRef(state);\n LIVE!.add(ref);\n return () => LIVE!.delete(ref);\n }\n });\n}\n\n/**\n * Move the members of `next` onto `prev`, which keeps its identity. Returns the\n * live instances of `prev`, each needing a refresh.\n */\nfunction patch(prev: Model.Extends, next: Model.Extends, own: Handler[]): Model[] {\n const proto = prev.prototype;\n const incoming = Object.getOwnPropertyDescriptors(next.prototype);\n const keys = METHODS.get(prev);\n const getters = GETTERS.get(prev);\n const methods = new Map<string, Function>();\n const knownKeys = new Set(keys?.keys());\n const knownGetters = new Set(getters?.keys());\n\n let setup = SETUP.get(prev);\n\n for (const handler of own) setup!.delete(handler);\n for (const handler of handlers(next)) {\n if (!setup) SETUP.set(prev, (setup = new Set()));\n setup.add(handler);\n }\n\n for (const key of Reflect.ownKeys(next)) {\n if (key == 'prototype' || key == 'length' || key == 'name') continue;\n if (Object.getOwnPropertyDescriptor(prev, key)?.configurable !== false)\n define(prev, key, Object.getOwnPropertyDescriptor(next, key)!);\n }\n\n const removed = new Set<string>();\n\n for (const key of Object.getOwnPropertyNames(proto))\n if (key != 'constructor' && !(key in incoming)) {\n const bind = keys?.get(key);\n\n if (bind && Object.getOwnPropertyDescriptor(proto, key)!.get === bind) {\n PAST.add(UNBIND.get(bind));\n keys!.delete(key);\n }\n\n removed.add(key);\n Reflect.deleteProperty(proto, key);\n getters?.delete(key);\n }\n\n for (const [key, desc] of Object.entries(incoming)) {\n if (key == 'constructor') continue;\n\n const current = Object.getOwnPropertyDescriptor(proto, key);\n\n if (typeof desc.value == 'function') methods.set(key, desc.value);\n if (current?.configurable === false) {\n if (current.writable) (proto as any)[key] = desc.value;\n continue;\n }\n\n if (current?.get && keys?.get(key) === current.get)\n PAST.add(UNBIND.get(current.get));\n\n const getter = getters?.get(key);\n\n if (getter) LATEST.set(getter, desc.get!);\n\n define(proto, key, { ...desc, configurable: true });\n }\n\n if (keys) {\n for (let T: Model.Extends = prev; ; T = Object.getPrototypeOf(T)) {\n for (const handler of SETUP.get(T) || [])\n if (handler.type) handler.type(prev);\n\n if (T === Model) break;\n }\n\n classify(prev, keys, getters!);\n }\n\n const live: Model[] = [];\n\n for (const ref of LIVE!) {\n const state = ref.deref();\n\n if (!state) LIVE!.delete(ref);\n else if (state instanceof prev) live.push(state);\n }\n\n const descendants = new Set([prev, ...live.map((state) => state.constructor as Model.Extends)]);\n\n for (const type of descendants) for (const child of SUBCLASSES.get(type) || []) descendants.add(child);\n\n descendants.delete(prev);\n\n for (const type of descendants) {\n const inherit = METHODS.get(type)!;\n const computed = GETTERS.get(type)!;\n\n for (const [key, bind] of keys!) if (!knownKeys.has(key) && !inherit.has(key)) inherit.set(key, bind);\n for (const [key, get] of getters!) if (!knownGetters.has(key) && !computed.has(key)) computed.set(key, get);\n for (const key of removed)\n if (!(key in type.prototype)) {\n inherit.delete(key);\n computed.delete(key);\n }\n }\n\n for (const state of live) {\n for (const [key, value] of methods) {\n const desc = Object.getOwnPropertyDescriptor(state, key);\n\n if (!desc) continue;\n if (desc.set) desc.set.call(state, value);\n else if (PAST.has(UNBIND.get(desc.value))) delete (state as any)[key];\n }\n\n for (const key of removed)\n if (PAST.has(UNBIND.get(Object.getOwnPropertyDescriptor(state, key)?.value))) delete (state as any)[key];\n\n for (const [key, get] of GETTERS.get(state.constructor)!)\n if (!knownGetters.has(key) && get === getters!.get(key)) compute.call(state, get, key);\n }\n\n return live;\n}\n\n/** Lifecycle handlers registered on a class itself. */\nfunction handlers(type: Model.Extends): Handler[] {\n return [...(SETUP.get(type) || [])];\n}\n\nfunction isModel(value: unknown): value is Model.Extends {\n return typeof value == 'function' && value.prototype instanceof Model;\n}\n\n/** What a patch cannot carry: class source less its members, and member kinds. */\nfunction describe(type: Function): Entry {\n const text = Function.prototype.toString;\n const kinds: Entry['kinds'] = {};\n let shape = text.call(type);\n\n for (const target of [type.prototype, type])\n for (const [key, desc] of Object.entries(Object.getOwnPropertyDescriptors(target)))\n for (const fn of [desc.value, desc.get, desc.set])\n if (typeof fn == 'function' && fn !== type) {\n shape = shape.replace(text.call(fn), '');\n if (target !== type) kinds[key] = desc.set ? 'accessor' : desc.get ? 'get' : 'fn';\n }\n\n shape = shape.replace(/\\s+/g, ' ').replace(/__vite_ssr_import_\\d+__/g, '__vite_ssr_import__');\n\n return { type, shape, kinds, own: handlers(type as Model.Extends) };\n}\n\nfunction compatible(prev: Entry, next: Entry) {\n if (prev.shape !== next.shape || PRIVATE.test(next.shape)) return false;\n if (Object.getPrototypeOf(prev.type) !== Object.getPrototypeOf(next.type)) return false;\n\n for (const key in next.kinds)\n if (key in prev.kinds && prev.kinds[key] !== next.kinds[key]) return false;\n\n return true;\n}\n\n/**\n * Keep a module's Model classes stable across runs. A class seen before is\n * patched with its replacement and returned in its place, refreshing live\n * instances; one whose shape or parent changed is returned as-is, and\n * reported to `replaced` listeners before `accept` returns.\n */\nfunction accept<T extends Record<string, unknown>>(id: string, classes: T): T {\n let known = MODULES.get(id);\n\n if (!known) MODULES.set(id, (known = {}));\n\n const output: Record<string, unknown> = { ...classes };\n const refresh = new Set<Model>();\n const replace: Replaced[] = [];\n\n track();\n\n for (const [name, type] of Object.entries(classes)) {\n if (!isModel(type)) continue;\n\n const prev = known[name];\n\n if (prev?.type === type) continue;\n\n const next = describe(type);\n\n if (!prev || !compatible(prev, next)) {\n if (prev) replace.push({ id, name, prev: prev.type as Model.Extends, next: type });\n known[name] = next;\n continue;\n }\n\n try {\n for (const state of patch(prev.type as Model.Extends, type, prev.own)) refresh.add(state);\n known[name] = { ...next, type: prev.type };\n output[name] = prev.type;\n } catch (error) {\n console.error(error);\n replace.push({ id, name, prev: prev.type as Model.Extends, next: type });\n known[name] = next;\n }\n }\n\n for (const state of refresh) event(state, REFRESH);\n\n for (const event of replace)\n for (const listener of LISTENERS)\n try {\n listener(event);\n } catch (error) {\n console.error(error);\n }\n\n return output as T;\n}\n\n/**\n * Observe classes `accept` replaced instead of patching. Fires synchronously\n * inside `accept`, while the module re-runs, so a host can retire instances of\n * `prev` before anything resolves the module again.\n */\nfunction replaced(listener: (event: Replaced) => void): () => void {\n LISTENERS.add(listener);\n return () => void LISTENERS.delete(listener);\n}\n\nexport { accept, replaced };\nexport type { Replaced };\n"],"mappings":"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"}
|