@weasel-js/registry 1.7.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/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 orochi235
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# @weasel-js/registry
|
|
2
|
+
|
|
3
|
+
Keyed registries with a uniform reflection surface: enumerate the entries, see which ones displaced others, subscribe to changes. No React, no DOM.
|
|
4
|
+
|
|
5
|
+
Part of [weasel](https://github.com/orochi235/weasel), a domain-agnostic 2D
|
|
6
|
+
scene-graph canvas kit for React. See the
|
|
7
|
+
[API reference](https://orochi235.github.io/weasel/api/).
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install @weasel-js/registry
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { /* … */ } from '@weasel-js/registry';
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## License
|
|
22
|
+
|
|
23
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** One registrant of a key: its value and, when the registrant named one, where it came from. */
|
|
2
|
+
interface Registrant<V> {
|
|
3
|
+
readonly value: V;
|
|
4
|
+
readonly source: string | undefined;
|
|
5
|
+
}
|
|
6
|
+
/** One key as a reflection reports it. */
|
|
7
|
+
interface ReflectedEntry<V, K = string> extends Registrant<V> {
|
|
8
|
+
readonly key: K;
|
|
9
|
+
/** The registrants this one displaced, oldest first. Non-empty means two
|
|
10
|
+
* registrants claimed one key — a conflict, resolved newest-wins. */
|
|
11
|
+
readonly shadowed: readonly Registrant<V>[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The read-only face of a registry: what is registered, what displaced what,
|
|
15
|
+
* and a way to hear about changes. Every kit registry that embeds a
|
|
16
|
+
* {@link Reflectable} hands this out, so a debug overlay or a conflict check
|
|
17
|
+
* can walk any of them the same way.
|
|
18
|
+
*
|
|
19
|
+
* `subscribe` and `getVersion` are shaped for `useSyncExternalStore`; so is
|
|
20
|
+
* `entries`, which returns the same frozen array until the next change.
|
|
21
|
+
*/
|
|
22
|
+
interface Reflection<V, K = string> {
|
|
23
|
+
get(key: K): V | undefined;
|
|
24
|
+
has(key: K): boolean;
|
|
25
|
+
/** Every key's live registrant, in the order each key was first registered. */
|
|
26
|
+
entries(): readonly ReflectedEntry<V, K>[];
|
|
27
|
+
/** Called after every change. Returns the unsubscribe. */
|
|
28
|
+
subscribe(listener: () => void): () => void;
|
|
29
|
+
/** Advances on every change. */
|
|
30
|
+
getVersion(): number;
|
|
31
|
+
}
|
|
32
|
+
/** Options for {@link Reflectable.push} and {@link Reflectable.set}. */
|
|
33
|
+
interface RegisterOptions {
|
|
34
|
+
/** Who registered this — `'kit'`, a package, a plugin id. Reported, never interpreted. */
|
|
35
|
+
source?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A keyed store that keeps its own {@link Reflection}. The registry owning it
|
|
39
|
+
* writes through `push` / `set` / `delete` and hands out `reflection`.
|
|
40
|
+
*/
|
|
41
|
+
interface Reflectable<V, K = string> extends Reflection<V, K> {
|
|
42
|
+
/** Register `value` over whatever `key` holds and return its release.
|
|
43
|
+
* Registrants stack, newest live: releasing the live one uncovers the one
|
|
44
|
+
* it displaced, and releasing a displaced one removes only it. Double-release safe. */
|
|
45
|
+
push(key: K, value: V, options?: RegisterOptions): () => void;
|
|
46
|
+
/** Replace `key`'s live registrant in place, the way `Map.set` does — for
|
|
47
|
+
* registries where a second registration means "newer version", not
|
|
48
|
+
* "override". Records no conflict. */
|
|
49
|
+
set(key: K, value: V, options?: RegisterOptions): void;
|
|
50
|
+
/** Drop every registrant of `key`. Returns whether there was one. */
|
|
51
|
+
delete(key: K): boolean;
|
|
52
|
+
clear(): void;
|
|
53
|
+
/** Announce a change the store cannot see — a registered value mutated in place. */
|
|
54
|
+
bump(): void;
|
|
55
|
+
/** This store as a {@link Reflection}, with no write methods on it. */
|
|
56
|
+
readonly reflection: Reflection<V, K>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a keyed store with a uniform reflection surface.
|
|
60
|
+
*
|
|
61
|
+
* Deliberately only the cross-cutting part of a registry: validation, lookup
|
|
62
|
+
* fallbacks and lifecycle stay with the registry that embeds it.
|
|
63
|
+
*/
|
|
64
|
+
declare function createReflectable<V, K = string>(): Reflectable<V, K>;
|
|
65
|
+
|
|
66
|
+
export { type Reflectable, type ReflectedEntry, type Reflection, type RegisterOptions, type Registrant, createReflectable };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// src/reflectable.ts
|
|
2
|
+
function createReflectable() {
|
|
3
|
+
const stacks = /* @__PURE__ */ new Map();
|
|
4
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
5
|
+
let version = 0;
|
|
6
|
+
let snapshot = null;
|
|
7
|
+
function changed() {
|
|
8
|
+
version++;
|
|
9
|
+
for (const listener of listeners) {
|
|
10
|
+
try {
|
|
11
|
+
listener();
|
|
12
|
+
} catch (err) {
|
|
13
|
+
console.error("weasel registry: subscriber threw", err);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const reflection = {
|
|
18
|
+
get: (key) => stacks.get(key)?.at(-1)?.value,
|
|
19
|
+
has: (key) => stacks.has(key),
|
|
20
|
+
entries() {
|
|
21
|
+
if (snapshot?.version === version) return snapshot.entries;
|
|
22
|
+
const entries = [];
|
|
23
|
+
for (const [key, stack] of stacks) {
|
|
24
|
+
const live = stack.at(-1);
|
|
25
|
+
entries.push(Object.freeze({
|
|
26
|
+
key,
|
|
27
|
+
value: live.value,
|
|
28
|
+
source: live.source,
|
|
29
|
+
shadowed: Object.freeze(stack.slice(0, -1))
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
snapshot = { version, entries: Object.freeze(entries) };
|
|
33
|
+
return snapshot.entries;
|
|
34
|
+
},
|
|
35
|
+
subscribe(listener) {
|
|
36
|
+
listeners.add(listener);
|
|
37
|
+
return () => {
|
|
38
|
+
listeners.delete(listener);
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
getVersion: () => version
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
...reflection,
|
|
45
|
+
reflection,
|
|
46
|
+
push(key, value, options) {
|
|
47
|
+
const registrant = Object.freeze({ value, source: options?.source });
|
|
48
|
+
const stack = stacks.get(key);
|
|
49
|
+
if (stack) stack.push(registrant);
|
|
50
|
+
else stacks.set(key, [registrant]);
|
|
51
|
+
changed();
|
|
52
|
+
let released = false;
|
|
53
|
+
return () => {
|
|
54
|
+
if (released) return;
|
|
55
|
+
released = true;
|
|
56
|
+
const cur = stacks.get(key);
|
|
57
|
+
const i = cur ? cur.lastIndexOf(registrant) : -1;
|
|
58
|
+
if (i === -1) return;
|
|
59
|
+
cur.splice(i, 1);
|
|
60
|
+
if (cur.length === 0) stacks.delete(key);
|
|
61
|
+
changed();
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
set(key, value, options) {
|
|
65
|
+
const registrant = Object.freeze({ value, source: options?.source });
|
|
66
|
+
const stack = stacks.get(key);
|
|
67
|
+
if (stack) stack[stack.length - 1] = registrant;
|
|
68
|
+
else stacks.set(key, [registrant]);
|
|
69
|
+
changed();
|
|
70
|
+
},
|
|
71
|
+
delete(key) {
|
|
72
|
+
if (!stacks.delete(key)) return false;
|
|
73
|
+
changed();
|
|
74
|
+
return true;
|
|
75
|
+
},
|
|
76
|
+
clear() {
|
|
77
|
+
if (stacks.size === 0) return;
|
|
78
|
+
stacks.clear();
|
|
79
|
+
changed();
|
|
80
|
+
},
|
|
81
|
+
bump: changed
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { createReflectable };
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
87
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/reflectable.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/** One registrant of a key: its value and, when the registrant named one, where it came from. */\nexport interface Registrant<V> {\n readonly value: V;\n readonly source: string | undefined;\n}\n\n/** One key as a reflection reports it. */\nexport interface ReflectedEntry<V, K = string> extends Registrant<V> {\n readonly key: K;\n /** The registrants this one displaced, oldest first. Non-empty means two\n * registrants claimed one key — a conflict, resolved newest-wins. */\n readonly shadowed: readonly Registrant<V>[];\n}\n\n/**\n * The read-only face of a registry: what is registered, what displaced what,\n * and a way to hear about changes. Every kit registry that embeds a\n * {@link Reflectable} hands this out, so a debug overlay or a conflict check\n * can walk any of them the same way.\n *\n * `subscribe` and `getVersion` are shaped for `useSyncExternalStore`; so is\n * `entries`, which returns the same frozen array until the next change.\n */\nexport interface Reflection<V, K = string> {\n get(key: K): V | undefined;\n has(key: K): boolean;\n /** Every key's live registrant, in the order each key was first registered. */\n entries(): readonly ReflectedEntry<V, K>[];\n /** Called after every change. Returns the unsubscribe. */\n subscribe(listener: () => void): () => void;\n /** Advances on every change. */\n getVersion(): number;\n}\n\n/** Options for {@link Reflectable.push} and {@link Reflectable.set}. */\nexport interface RegisterOptions {\n /** Who registered this — `'kit'`, a package, a plugin id. Reported, never interpreted. */\n source?: string;\n}\n\n/**\n * A keyed store that keeps its own {@link Reflection}. The registry owning it\n * writes through `push` / `set` / `delete` and hands out `reflection`.\n */\nexport interface Reflectable<V, K = string> extends Reflection<V, K> {\n /** Register `value` over whatever `key` holds and return its release.\n * Registrants stack, newest live: releasing the live one uncovers the one\n * it displaced, and releasing a displaced one removes only it. Double-release safe. */\n push(key: K, value: V, options?: RegisterOptions): () => void;\n /** Replace `key`'s live registrant in place, the way `Map.set` does — for\n * registries where a second registration means \"newer version\", not\n * \"override\". Records no conflict. */\n set(key: K, value: V, options?: RegisterOptions): void;\n /** Drop every registrant of `key`. Returns whether there was one. */\n delete(key: K): boolean;\n clear(): void;\n /** Announce a change the store cannot see — a registered value mutated in place. */\n bump(): void;\n /** This store as a {@link Reflection}, with no write methods on it. */\n readonly reflection: Reflection<V, K>;\n}\n\n/**\n * Create a keyed store with a uniform reflection surface.\n *\n * Deliberately only the cross-cutting part of a registry: validation, lookup\n * fallbacks and lifecycle stay with the registry that embeds it.\n */\nexport function createReflectable<V, K = string>(): Reflectable<V, K> {\n const stacks = new Map<K, Registrant<V>[]>();\n const listeners = new Set<() => void>();\n let version = 0;\n let snapshot: { version: number; entries: readonly ReflectedEntry<V, K>[] } | null = null;\n\n function changed(): void {\n version++;\n for (const listener of listeners) {\n try {\n listener();\n } catch (err) {\n console.error('weasel registry: subscriber threw', err);\n }\n }\n }\n\n const reflection: Reflection<V, K> = {\n get: (key) => stacks.get(key)?.at(-1)?.value,\n has: (key) => stacks.has(key),\n entries() {\n if (snapshot?.version === version) return snapshot.entries;\n const entries: ReflectedEntry<V, K>[] = [];\n for (const [key, stack] of stacks) {\n const live = stack.at(-1)!;\n entries.push(Object.freeze({\n key, value: live.value, source: live.source, shadowed: Object.freeze(stack.slice(0, -1)),\n }));\n }\n snapshot = { version, entries: Object.freeze(entries) };\n return snapshot.entries;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n getVersion: () => version,\n };\n\n return {\n ...reflection,\n reflection,\n push(key, value, options) {\n const registrant: Registrant<V> = Object.freeze({ value, source: options?.source });\n const stack = stacks.get(key);\n if (stack) stack.push(registrant);\n else stacks.set(key, [registrant]);\n changed();\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const cur = stacks.get(key);\n const i = cur ? cur.lastIndexOf(registrant) : -1;\n if (i === -1) return;\n cur!.splice(i, 1);\n if (cur!.length === 0) stacks.delete(key);\n changed();\n };\n },\n set(key, value, options) {\n const registrant: Registrant<V> = Object.freeze({ value, source: options?.source });\n const stack = stacks.get(key);\n if (stack) stack[stack.length - 1] = registrant;\n else stacks.set(key, [registrant]);\n changed();\n },\n delete(key) {\n if (!stacks.delete(key)) return false;\n changed();\n return true;\n },\n clear() {\n if (stacks.size === 0) return;\n stacks.clear();\n changed();\n },\n bump: changed,\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@weasel-js/registry",
|
|
3
|
+
"version": "1.7.0",
|
|
4
|
+
"description": "Keyed registries with a uniform reflection surface: enumerate the entries, see which ones displaced others, subscribe to changes. No React, no DOM.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./package.json": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
"author": "orochi235",
|
|
19
|
+
"homepage": "https://orochi235.github.io/weasel/",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/orochi235/weasel.git",
|
|
23
|
+
"directory": "packages/registry"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/orochi235/weasel/issues"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=22"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsup"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public",
|
|
41
|
+
"provenance": true
|
|
42
|
+
}
|
|
43
|
+
}
|