@thomas-siegfried/tapout 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,6 +4,8 @@ A modern ESM reactivity and templating library, spiritually inspired by [Knockou
4
4
 
5
5
  Tapout provides dependency-tracked observables, computed values, declarative DOM bindings, a component system, and TC39 Stage 3 decorators — all in a lightweight, explicit architecture built on TypeScript.
6
6
 
7
+ For detailed TypeScript decorator setup and compatibility notes, see [`decorator-config.md`](./decorator-config.md).
8
+
7
9
  ## Table of Contents
8
10
 
9
11
  - [Installation](#installation)
@@ -0,0 +1,220 @@
1
+ # Vite Decorator Setup Guide
2
+
3
+ Four tested configurations for using decorators with Vite 7/8 and tapout.
4
+
5
+ ---
6
+
7
+ ## Option A: Babel + TC39 Stage 3 Decorators
8
+
9
+ Uses the `accessor` keyword. Babel transpiles TC39 decorators into `_applyDecs` helper calls.
10
+
11
+ ### Install
12
+
13
+ ```bash
14
+ npm install -D vite-plugin-babel @babel/plugin-proposal-decorators @babel/plugin-transform-typescript
15
+ ```
16
+
17
+ ### `vite.config.ts`
18
+
19
+ ```typescript
20
+ import { defineConfig } from 'vite';
21
+ import babel from 'vite-plugin-babel';
22
+
23
+ export default defineConfig({
24
+ resolve: {
25
+ preserveSymlinks: true, // only needed for npm link scenarios
26
+ },
27
+ oxc: false as any, // disable Vite 8's default Oxc transpiler
28
+ plugins: [
29
+ babel({
30
+ filter: /\.[jt]sx?$/, // must include .ts/.tsx — default only handles .js/.jsx
31
+ babelConfig: {
32
+ plugins: [
33
+ ['@babel/plugin-proposal-decorators', { version: '2023-11' }],
34
+ ['@babel/plugin-transform-typescript', { allowDeclareFields: true }],
35
+ ],
36
+ },
37
+ }),
38
+ ],
39
+ });
40
+ ```
41
+
42
+ ### `tsconfig.json`
43
+
44
+ Do **not** add `experimentalDecorators`. Keep `useDefineForClassFields: true` (the default).
45
+
46
+ ### Source syntax
47
+
48
+ ```typescript
49
+ @reactive accessor currentRoute: string = 'dashboard';
50
+ @reactiveArray accessor items: Item[] = [];
51
+ @computed get fullName(): string { return ... }
52
+ ```
53
+
54
+ ---
55
+
56
+ ## Option B: Babel + Experimental (Legacy) Decorators
57
+
58
+ No `accessor` keyword. Babel transpiles legacy decorators. Requires `@babel/plugin-transform-class-properties` with `loose: true` to prevent Babel from creating own data properties that shadow the decorator's getter/setter.
59
+
60
+ ### Install
61
+
62
+ ```bash
63
+ npm install -D vite-plugin-babel @babel/plugin-proposal-decorators @babel/plugin-transform-class-properties @babel/plugin-transform-typescript
64
+ ```
65
+
66
+ ### `vite.config.ts`
67
+
68
+ ```typescript
69
+ import { defineConfig } from 'vite';
70
+ import babel from 'vite-plugin-babel';
71
+
72
+ export default defineConfig({
73
+ resolve: {
74
+ preserveSymlinks: true,
75
+ },
76
+ oxc: false as any,
77
+ plugins: [
78
+ babel({
79
+ filter: /\.[jt]sx?$/,
80
+ babelConfig: {
81
+ plugins: [
82
+ ['@babel/plugin-proposal-decorators', { version: 'legacy' }],
83
+ ['@babel/plugin-transform-class-properties', { loose: true }],
84
+ ['@babel/plugin-transform-typescript', { allowDeclareFields: true }],
85
+ ],
86
+ },
87
+ }),
88
+ ],
89
+ });
90
+ ```
91
+
92
+ ### `tsconfig.json`
93
+
94
+ ```json
95
+ {
96
+ "compilerOptions": {
97
+ "experimentalDecorators": true,
98
+ "useDefineForClassFields": false
99
+ }
100
+ }
101
+ ```
102
+
103
+ ### Source syntax
104
+
105
+ ```typescript
106
+ @reactive currentRoute: string = 'dashboard';
107
+ @reactiveArray items: Item[] = [];
108
+ @computed get fullName(): string { return ... }
109
+ ```
110
+
111
+ ### Babel-specific note
112
+
113
+ Babel passes a `descriptor` with an `initializer` property to legacy field decorators — this is a Babel convention, not a standard. tapout handles this to prevent Babel's class property transform from shadowing the decorator's getter/setter with a plain data property.
114
+
115
+ ---
116
+
117
+ ## Option C: Oxc (Vite 8 built-in) + Experimental (Legacy) Decorators
118
+
119
+ No Babel needed — Vite 8's built-in Oxc transpiler handles legacy decorators natively. Zero extra dependencies.
120
+
121
+ ### Install
122
+
123
+ No additional packages needed beyond Vite itself.
124
+
125
+ ### `vite.config.ts`
126
+
127
+ ```typescript
128
+ import { defineConfig } from 'vite';
129
+
130
+ export default defineConfig({
131
+ resolve: {
132
+ preserveSymlinks: true,
133
+ },
134
+ oxc: {
135
+ decorator: {
136
+ legacy: true,
137
+ },
138
+ },
139
+ });
140
+ ```
141
+
142
+ ### `tsconfig.json`
143
+
144
+ ```json
145
+ {
146
+ "compilerOptions": {
147
+ "experimentalDecorators": true,
148
+ "useDefineForClassFields": false
149
+ }
150
+ }
151
+ ```
152
+
153
+ ### Source syntax
154
+
155
+ Same as Option B (no `accessor` keyword).
156
+
157
+ ---
158
+
159
+ ## Option D: esbuild (Vite 7 built-in) + Experimental (Legacy) Decorators
160
+
161
+ No Babel or Oxc needed — Vite 7's built-in esbuild transpiler handles legacy decorators natively by reading `tsconfig.json`. Zero extra dependencies.
162
+
163
+ ### Install
164
+
165
+ No additional packages needed beyond Vite itself.
166
+
167
+ ```bash
168
+ npm install -D vite@~7.3.1
169
+ ```
170
+
171
+ ### `vite.config.ts`
172
+
173
+ No `vite.config.ts` is required. esbuild reads `experimentalDecorators` and `useDefineForClassFields` directly from `tsconfig.json` — no explicit esbuild config needed.
174
+
175
+ ### `tsconfig.json`
176
+
177
+ ```json
178
+ {
179
+ "compilerOptions": {
180
+ "experimentalDecorators": true,
181
+ "useDefineForClassFields": false
182
+ }
183
+ }
184
+ ```
185
+
186
+ `erasableSyntaxOnly` (added in TypeScript 5.9) must **not** be enabled — it rejects decorator syntax as non-erasable.
187
+
188
+ ### Source syntax
189
+
190
+ Same as Option B (no `accessor` keyword).
191
+
192
+ ### esbuild-specific notes
193
+
194
+ - esbuild does **not** support `emitDecoratorMetadata`. tapout does not use `reflect-metadata`, so this is a non-issue.
195
+ - esbuild does **not** pass a `descriptor` with an `initializer` to legacy field decorators (unlike Babel). tapout's legacy path handles both cases — with and without the Babel-style `initializer`.
196
+
197
+ ---
198
+
199
+ ## Quick Reference
200
+
201
+ | | Option A | Option B | Option C | Option D |
202
+ |---|---|---|---|---|
203
+ | Vite version | 8 | 8 | 8 | 7 |
204
+ | Spec | TC39 Stage 3 | Experimental/Legacy | Experimental/Legacy | Experimental/Legacy |
205
+ | Transpiler | Babel | Babel | Oxc (built-in) | esbuild (built-in) |
206
+ | Extra deps | 2 packages | 3 packages | None | None |
207
+ | `accessor` keyword | Yes | No | No | No |
208
+ | `experimentalDecorators` | No | Yes | Yes | Yes |
209
+ | `useDefineForClassFields` | `true` | `false` | `false` | `false` |
210
+ | `emitDecoratorMetadata` | N/A | Supported | Supported | Not supported |
211
+
212
+ ## Common Gotchas
213
+
214
+ - **`oxc: false as any`** — required for Options A/B to disable Vite 8's default Oxc transpiler so Babel takes over. The `as any` is needed because Vite 8's types don't expose this option.
215
+ - **`filter: /\.[jt]sx?$/`** — critical for Babel options. Without it, `.ts` files bypass Babel and hit the default transpiler.
216
+ - **`preserveSymlinks: true`** (Vite 8) / **`resolve.dedupe`** (Vite 7) — only needed when using `npm link` for local package development.
217
+ - **Plugin order matters** — decorators must come before class-properties, which must come before TypeScript transform (Options A/B only).
218
+ - **Vite caches pre-bundled deps** — after changing a linked package, delete `node_modules/.vite` and restart the dev server.
219
+ - **`erasableSyntaxOnly: true`** — if present in `tsconfig.json`, must be removed when enabling `experimentalDecorators`. TypeScript 5.9 introduced this flag to enforce type-only syntax, but decorator emit is runtime code.
220
+ - **esbuild reads tsconfig automatically** (Option D) — no `vite.config.ts` is needed at all. esbuild picks up `experimentalDecorators` and `useDefineForClassFields` from the project's `tsconfig.json`.
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Observable } from './observable.js';
2
2
  import { ObservableArray } from './observableArray.js';
3
+ import { getReactiveArrayDecoratorProxy } from './reactiveArrayDecoratorProxy.js';
3
4
  import { Computed } from './computed.js';
4
5
  import { registerDependency } from './dependencyDetection.js';
5
6
  // --- Observable registry for getObservable() ---
@@ -106,12 +107,12 @@ function createStage3ReactiveArray(extenders) {
106
107
  if (extenders)
107
108
  obs.extend(extenders);
108
109
  storeObservable(this, context.name, obs);
109
- return obs;
110
+ return getReactiveArrayDecoratorProxy(obs);
110
111
  },
111
112
  get() {
112
113
  const obs = lookupObservable(this, context.name);
113
114
  registerDependency(obs);
114
- return obs;
115
+ return getReactiveArrayDecoratorProxy(obs);
115
116
  },
116
117
  set(newValue) {
117
118
  const obs = lookupObservable(this, context.name);
@@ -136,7 +137,7 @@ function applyLegacyReactiveArray(target, propertyKey, descriptor, extenders) {
136
137
  storeObservable(this, propertyKey, obs);
137
138
  }
138
139
  registerDependency(obs);
139
- return obs;
140
+ return getReactiveArrayDecoratorProxy(obs);
140
141
  },
141
142
  set(value) {
142
143
  let obs = lookupObservable(this, propertyKey);
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export interface TrackingFrame {
7
7
  getDependencies(): AnySubscribable[];
8
8
  };
9
9
  isInitial?: boolean;
10
+ /** Dedupes repeated registration of the same subscribable in one frame (e.g. `@reactiveArray` getter + indexed proxy read). */
11
+ _dependencyDedupe?: WeakSet<AnySubscribable>;
10
12
  }
11
13
  export declare function getId(): number;
12
14
  export declare function begin(frame?: TrackingFrame): void;
@@ -1 +1 @@
1
- {"version":3,"file":"dependencyDetection.d.ts","sourceRoot":"","sources":["../src/dependencyDetection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,mBAAmB,CAAC;AAGtE,KAAK,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,QAAQ,CAAC,EAAE;QACT,oBAAoB,IAAI,MAAM,CAAC;QAC/B,eAAe,IAAI,eAAe,EAAE,CAAC;KACtC,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAMD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,wBAAgB,KAAK,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAGjD;AAED,wBAAgB,GAAG,IAAI,IAAI,CAE1B;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,CAUtE;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAO9C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAKzD;AAED,wBAAgB,eAAe,IAAI,eAAe,EAAE,GAAG,SAAS,CAK/D;AAED,wBAAgB,SAAS,IAAI,OAAO,GAAG,SAAS,CAK/C;AAED,wBAAgB,kBAAkB,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,SAAS,CAE1E"}
1
+ {"version":3,"file":"dependencyDetection.d.ts","sourceRoot":"","sources":["../src/dependencyDetection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,mBAAmB,CAAC;AAGtE,KAAK,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,QAAQ,CAAC,EAAE;QACT,oBAAoB,IAAI,MAAM,CAAC;QAC/B,eAAe,IAAI,eAAe,EAAE,CAAC;KACtC,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+HAA+H;IAC/H,iBAAiB,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CAC9C;AAMD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,wBAAgB,KAAK,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAGjD;AAED,wBAAgB,GAAG,IAAI,IAAI,CAE1B;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,CAmBtE;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAO9C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAKzD;AAED,wBAAgB,eAAe,IAAI,eAAe,EAAE,GAAG,SAAS,CAK/D;AAED,wBAAgB,SAAS,IAAI,OAAO,GAAG,SAAS,CAK/C;AAED,wBAAgB,kBAAkB,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,SAAS,CAE1E"}
@@ -17,6 +17,15 @@ export function registerDependency(subscribable) {
17
17
  if (!isSubscribable(subscribable)) {
18
18
  throw new Error('Only subscribable things can act as dependencies');
19
19
  }
20
+ let dedupe = currentFrame._dependencyDedupe;
21
+ if (!dedupe) {
22
+ dedupe = new WeakSet();
23
+ currentFrame._dependencyDedupe = dedupe;
24
+ }
25
+ if (dedupe.has(subscribable)) {
26
+ return;
27
+ }
28
+ dedupe.add(subscribable);
20
29
  currentFrame.callback(subscribable, subscribable._id || (subscribable._id = getId()));
21
30
  }
22
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dependencyDetection.js","sourceRoot":"","sources":["../src/dependencyDetection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AActE,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,MAAM,WAAW,GAAqC,EAAE,CAAC;AACzD,IAAI,YAAuC,CAAC;AAE5C,MAAM,UAAU,KAAK;IACnB,OAAO,EAAE,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAqB;IACzC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/B,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAA6B;IAC9D,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,YAAY,CAAC,QAAQ,CACnB,YAAY,EACZ,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CACjD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAI,QAAiB;IACzC,IAAI,CAAC;QACH,KAAK,EAAE,CAAC;QACR,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,GAAG,EAAE,CAAC;IACR,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,IAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC,SAAS,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,YAAY,EAAE,QAAQ,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"dependencyDetection.js","sourceRoot":"","sources":["../src/dependencyDetection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgBtE,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,MAAM,WAAW,GAAqC,EAAE,CAAC;AACzD,IAAI,YAAuC,CAAC;AAE5C,MAAM,UAAU,KAAK;IACnB,OAAO,EAAE,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAqB;IACzC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/B,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAA6B;IAC9D,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACvB,YAAY,CAAC,iBAAiB,GAAG,MAAM,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACzB,YAAY,CAAC,QAAQ,CACnB,YAAY,EACZ,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CACjD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAI,QAAiB;IACzC,IAAI,CAAC;QACH,KAAK,EAAE,CAAC;QACR,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,GAAG,EAAE,CAAC;IACR,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,IAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;QAC3B,OAAO,YAAY,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC,SAAS,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,YAAY,EAAE,QAAQ,CAAC;AAChC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { ObservableArray } from './observableArray.js';
2
+ /**
3
+ * Proxy used only for `@reactiveArray` decorated properties: supports `list[0]` read/write
4
+ * while keeping `getObservable()` on the underlying {@link ObservableArray}.
5
+ *
6
+ * Methods and accessors are applied to the real instance (not the proxy) so internal state works.
7
+ */
8
+ export declare function getReactiveArrayDecoratorProxy<T>(obs: ObservableArray<T>): ObservableArray<T>;
9
+ //# sourceMappingURL=reactiveArrayDecoratorProxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactiveArrayDecoratorProxy.d.ts","sourceRoot":"","sources":["../src/reactiveArrayDecoratorProxy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAevD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CA6D7F"}
@@ -0,0 +1,83 @@
1
+ import { registerDependency } from './dependencyDetection.js';
2
+ const proxyCache = new WeakMap();
3
+ /**
4
+ * ES array index property name: ToString(ToUint32(P)) === P and ToUint32(P) ≠ 2³²−1.
5
+ * @see https://tc39.es/ecma262/#sec-array-exotic-objects
6
+ */
7
+ function parseArrayIndexString(key) {
8
+ const index = Number(key) >>> 0;
9
+ if (index === 0xffff_ffff)
10
+ return undefined;
11
+ if (`${index}` !== key)
12
+ return undefined;
13
+ return index;
14
+ }
15
+ /**
16
+ * Proxy used only for `@reactiveArray` decorated properties: supports `list[0]` read/write
17
+ * while keeping `getObservable()` on the underlying {@link ObservableArray}.
18
+ *
19
+ * Methods and accessors are applied to the real instance (not the proxy) so internal state works.
20
+ */
21
+ export function getReactiveArrayDecoratorProxy(obs) {
22
+ let prox = proxyCache.get(obs);
23
+ if (!prox) {
24
+ prox = new Proxy(obs, {
25
+ get(target, prop, _receiver) {
26
+ if (typeof prop === 'string') {
27
+ const index = parseArrayIndexString(prop);
28
+ if (index !== undefined) {
29
+ registerDependency(target);
30
+ return target.peek()[index];
31
+ }
32
+ }
33
+ const value = Reflect.get(target, prop, target);
34
+ if (typeof value === 'function') {
35
+ return value.bind(target);
36
+ }
37
+ return value;
38
+ },
39
+ set(target, prop, value, _receiver) {
40
+ if (typeof prop === 'string') {
41
+ const index = parseArrayIndexString(prop);
42
+ if (index !== undefined) {
43
+ const arr = target.peek();
44
+ target.valueWillMutate();
45
+ arr[index] = value;
46
+ target.valueHasMutated();
47
+ return true;
48
+ }
49
+ }
50
+ return Reflect.set(target, prop, value, target);
51
+ },
52
+ has(target, prop) {
53
+ if (typeof prop === 'string') {
54
+ const index = parseArrayIndexString(prop);
55
+ if (index !== undefined) {
56
+ registerDependency(target);
57
+ return Reflect.has(target.peek(), prop);
58
+ }
59
+ }
60
+ return Reflect.has(target, prop);
61
+ },
62
+ deleteProperty(target, prop) {
63
+ if (typeof prop === 'string') {
64
+ const index = parseArrayIndexString(prop);
65
+ if (index !== undefined) {
66
+ const arr = target.peek();
67
+ if (Reflect.has(arr, prop)) {
68
+ target.valueWillMutate();
69
+ delete arr[index];
70
+ target.valueHasMutated();
71
+ return true;
72
+ }
73
+ return true;
74
+ }
75
+ }
76
+ return Reflect.deleteProperty(target, prop);
77
+ },
78
+ });
79
+ proxyCache.set(obs, prox);
80
+ }
81
+ return prox;
82
+ }
83
+ //# sourceMappingURL=reactiveArrayDecoratorProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactiveArrayDecoratorProxy.js","sourceRoot":"","sources":["../src/reactiveArrayDecoratorProxy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wireParams.d.ts","sourceRoot":"","sources":["../src/wireParams.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMtD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;CACxC;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,IAAI,GACb,gBAAgB,CA+BlB"}
1
+ {"version":3,"file":"wireParams.d.ts","sourceRoot":"","sources":["../src/wireParams.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAkBtD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;CACxC;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,IAAI,GACb,gBAAgB,CAuClB"}
@@ -4,14 +4,27 @@ import { isSubscribable } from './subscribable.js';
4
4
  import { getObservable, replaceObservable } from './decorators.js';
5
5
  import { addDisposeCallback } from './domNodeDisposal.js';
6
6
  const SKIP_KEYS = new Set(['$raw']);
7
+ function getWritableChildTarget(instance, key) {
8
+ const decorated = getObservable(instance, key);
9
+ if (decorated instanceof Observable)
10
+ return decorated;
11
+ if (decorated instanceof Computed && decorated.hasWriteFunction)
12
+ return decorated;
13
+ const directValue = instance[key];
14
+ if (directValue instanceof Observable)
15
+ return directValue;
16
+ if (directValue instanceof Computed && directValue.hasWriteFunction)
17
+ return directValue;
18
+ return undefined;
19
+ }
7
20
  export function wireParams(instance, params, element) {
8
21
  const subscriptions = [];
9
22
  for (const key of Object.keys(params)) {
10
23
  if (SKIP_KEYS.has(key))
11
24
  continue;
12
25
  const paramValue = params[key];
13
- const childObs = getObservable(instance, key);
14
- const childIsReactive = childObs !== undefined && isSubscribable(childObs);
26
+ const childTarget = getWritableChildTarget(instance, key);
27
+ const childIsReactive = childTarget !== undefined && isSubscribable(childTarget);
15
28
  if (paramValue instanceof Observable) {
16
29
  if (childIsReactive) {
17
30
  replaceObservable(instance, key, paramValue);
@@ -21,9 +34,19 @@ export function wireParams(instance, params, element) {
21
34
  }
22
35
  }
23
36
  else if (paramValue instanceof Computed) {
24
- instance[key] = paramValue.get();
37
+ if (childTarget) {
38
+ childTarget.set(paramValue.get());
39
+ }
40
+ else {
41
+ instance[key] = paramValue.get();
42
+ }
25
43
  const sub = paramValue.subscribe((newValue) => {
26
- instance[key] = newValue;
44
+ if (childTarget) {
45
+ childTarget.set(newValue);
46
+ }
47
+ else {
48
+ instance[key] = newValue;
49
+ }
27
50
  });
28
51
  subscriptions.push(sub);
29
52
  if (element) {
@@ -1 +1 @@
1
- {"version":3,"file":"wireParams.js","sourceRoot":"","sources":["../src/wireParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAMpC,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,MAA+B,EAC/B,OAAc;IAEd,MAAM,aAAa,GAA4B,EAAE,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9C,MAAM,eAAe,GAAG,QAAQ,KAAK,SAAS,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE3E,IAAI,UAAU,YAAY,UAAU,EAAE,CAAC;YACrC,IAAI,eAAe,EAAE,CAAC;gBACpB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACL,QAAoC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChE,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,YAAY,QAAQ,EAAE,CAAC;YACzC,QAAoC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,QAAiB,EAAE,EAAE;gBACpD,QAAoC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YACxD,CAAC,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,OAAO,EAAE,CAAC;gBACZ,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;aAAM,CAAC;YACL,QAAoC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"wireParams.js","sourceRoot":"","sources":["../src/wireParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpC,SAAS,sBAAsB,CAAC,QAAgB,EAAE,GAAW;IAC3D,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/C,IAAI,SAAS,YAAY,UAAU;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,SAAS,YAAY,QAAQ,IAAI,SAAS,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAC;IAElF,MAAM,WAAW,GAAI,QAAoC,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,WAAW,YAAY,UAAU;QAAE,OAAO,WAAW,CAAC;IAC1D,IAAI,WAAW,YAAY,QAAQ,IAAI,WAAW,CAAC,gBAAgB;QAAE,OAAO,WAAW,CAAC;IAExF,OAAO,SAAS,CAAC;AACnB,CAAC;AAMD,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,MAA+B,EAC/B,OAAc;IAEd,MAAM,aAAa,GAA4B,EAAE,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,eAAe,GAAG,WAAW,KAAK,SAAS,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;QAEjF,IAAI,UAAU,YAAY,UAAU,EAAE,CAAC;YACrC,IAAI,eAAe,EAAE,CAAC;gBACpB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACL,QAAoC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChE,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,YAAY,QAAQ,EAAE,CAAC;YAC1C,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACL,QAAoC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChE,CAAC;YACD,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,QAAiB,EAAE,EAAE;gBACrD,IAAI,WAAW,EAAE,CAAC;oBAChB,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACL,QAAoC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,OAAO,EAAE,CAAC;gBACZ,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;aAAM,CAAC;YACL,QAAoC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC"}
package/llms.txt ADDED
@@ -0,0 +1,360 @@
1
+ # Tapout
2
+
3
+ > Tapout is a modern ESM reactivity and templating library, spiritually inspired by KnockoutJS. Same philosophy, modern implementation.
4
+
5
+ ## Guidance
6
+
7
+ - Prefer `@reactive accessor` over `new Observable()` for class properties
8
+ - Prefer `@reactiveArray accessor` over `new ObservableArray()` for array properties
9
+ - Prefer `@computed` over `new Computed()` for derived values in classes
10
+ - Prefer `@component` decorator over `components.register()` for component registration
11
+ - Use `tapout/core` when you only need reactivity (no DOM)
12
+ - Use `tapout` when you need DOM bindings, templates, and components
13
+ - Always dispose subscriptions and effects when no longer needed
14
+ - Use `DisposableGroup` for centralized cleanup
15
+ - Use `PureComputed` (or `@computed`, which uses it) for intermittent UI values
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install tapout
21
+ ```
22
+
23
+ ESM-only. Two entry points:
24
+
25
+ ```typescript
26
+ import { Observable, applyBindings } from 'tapout'; // full library
27
+ import { Observable, Computed } from 'tapout/core'; // reactivity only, no DOM
28
+ ```
29
+
30
+ ## Quick Start (Preferred Style)
31
+
32
+ ```typescript
33
+ import { reactive, computed, component, applyBindings } from 'tapout';
34
+
35
+ @component('greeting-card', `
36
+ <p>First: <input data-bind="textInput: firstName" /></p>
37
+ <p>Last: <input data-bind="textInput: lastName" /></p>
38
+ <h2 data-bind="text: fullName"></h2>
39
+ `)
40
+ class GreetingCard {
41
+ @reactive accessor firstName = 'Jane';
42
+ @reactive accessor lastName = 'Doe';
43
+
44
+ @computed get fullName() {
45
+ return `${this.firstName} ${this.lastName}`;
46
+ }
47
+ }
48
+
49
+ applyBindings({}, document.body);
50
+ ```
51
+
52
+ ```html
53
+ <greeting-card></greeting-card>
54
+ ```
55
+
56
+ ## Core Reactivity
57
+
58
+ ### Observable
59
+
60
+ Mutable reactive value. Reading inside a computed or effect tracks the dependency.
61
+
62
+ ```typescript
63
+ const count = new Observable(0);
64
+ count.get(); // read (tracks dependency)
65
+ count.peek(); // read without tracking
66
+ count.set(5); // write, notifies subscribers
67
+ ```
68
+
69
+ Decorator equivalent (preferred in classes):
70
+
71
+ ```typescript
72
+ class MyClass {
73
+ @reactive accessor count = 0;
74
+ }
75
+ // Reading: this.count (tracks), Writing: this.count = 5 (notifies)
76
+ ```
77
+
78
+ Pass extender options: `@reactive({ deferred: true }) accessor query = '';`
79
+
80
+ ### ObservableArray
81
+
82
+ Observable wrapping an array with mutation methods: `push`, `pop`, `shift`, `unshift`, `splice`, `sort`, `reverse`, `remove`, `removeAll`, `replace`.
83
+
84
+ ```typescript
85
+ const items = new ObservableArray(['a', 'b']);
86
+ items.push('c');
87
+ items.remove('a');
88
+ ```
89
+
90
+ Decorator equivalent (preferred in classes):
91
+
92
+ ```typescript
93
+ class MyClass {
94
+ @reactiveArray accessor items: string[] = [];
95
+ }
96
+ ```
97
+
98
+ Subscribe to fine-grained diffs:
99
+
100
+ ```typescript
101
+ items.subscribe(changes => { /* status, value, index */ }, 'arrayChange');
102
+ ```
103
+
104
+ ### Computed
105
+
106
+ Derived value, re-evaluates when dependencies change.
107
+
108
+ ```typescript
109
+ const area = new Computed(() => width.get() * height.get());
110
+ ```
111
+
112
+ Writable computed:
113
+
114
+ ```typescript
115
+ const full = new Computed({
116
+ read: () => `${first.get()} ${last.get()}`,
117
+ write: (v: string) => { [first, last] = v.split(' ').map(s => s); },
118
+ });
119
+ ```
120
+
121
+ Decorator equivalent (preferred in classes):
122
+
123
+ ```typescript
124
+ class MyClass {
125
+ @reactive accessor first = 'John';
126
+ @reactive accessor last = 'Doe';
127
+
128
+ @computed get full() { return `${this.first} ${this.last}`; }
129
+ set full(v: string) { [this.first, this.last] = v.split(' '); }
130
+ }
131
+ ```
132
+
133
+ ### PureComputed
134
+
135
+ Memory-optimized computed that sleeps when it has no subscribers. `@computed` uses this internally.
136
+
137
+ ```typescript
138
+ const label = new PureComputed(() => `Count: ${count.get()}`);
139
+ ```
140
+
141
+ ### Effects
142
+
143
+ ```typescript
144
+ // Runs immediately, then on each dependency change
145
+ const handle = effect(() => name.get(), val => console.log(val));
146
+
147
+ // Runs only on subsequent changes (not immediately)
148
+ const handle = observe(() => name.get(), val => console.log(val));
149
+
150
+ handle.dispose(); // stop
151
+ ```
152
+
153
+ ### Subscriptions
154
+
155
+ ```typescript
156
+ const sub = count.subscribe(value => console.log(value));
157
+ sub.dispose();
158
+ ```
159
+
160
+ Event channels: `'change'` (default), `'beforeChange'`, `'spectate'`, `'dirty'`, `'awake'`, `'asleep'`, `'arrayChange'`.
161
+
162
+ ### Events
163
+
164
+ Stateless hot signals with owner/consumer separation:
165
+
166
+ ```typescript
167
+ class MyService {
168
+ private _onSave = new Event<SaveEvent>();
169
+ readonly onSave = this._onSave.subscribable;
170
+
171
+ save(id: number) { this._onSave.emit(new SaveEvent(id, true)); }
172
+ }
173
+ ```
174
+
175
+ Type-filtered: `event.subscribable.on(SaveEvent).subscribe(...)`.
176
+ Aggregate: `AggregateEvent` rolls up multiple event sources via `pipe()`.
177
+
178
+ ### DisposableGroup
179
+
180
+ Centralized cleanup for subscriptions and event subscriptions:
181
+
182
+ ```typescript
183
+ private _subs = new DisposableGroup();
184
+ // this._subs.add(someSubscription);
185
+ // this._subs.dispose(); // cleans up all at once
186
+ ```
187
+
188
+ ## Extenders
189
+
190
+ ```typescript
191
+ obs.extend({ rateLimit: { timeout: 300, method: 'notifyWhenChangesStop' } });
192
+ obs.extend({ rateLimit: 200 }); // throttle
193
+ obs.extend({ notify: 'always' }); // always notify
194
+ obs.extend({ deferred: true }); // microtask batching
195
+ ```
196
+
197
+ ## Decorators (Preferred API)
198
+
199
+ | Decorator | Target | Backing |
200
+ |---|---|---|
201
+ | `@reactive` | `accessor` property | `Observable` |
202
+ | `@reactiveArray` | `accessor` property | `ObservableArray` |
203
+ | `@computed` | getter, getter+setter, method | `PureComputed` / writable `Computed` |
204
+ | `@component(tag, template)` | class | registers component |
205
+
206
+ Access underlying observable: `getObservable(instance, 'propName')`.
207
+ Replace underlying observable: `replaceObservable(instance, 'propName', newObs)`.
208
+
209
+ ## Components
210
+
211
+ ### Registration (decorator preferred)
212
+
213
+ ```typescript
214
+ @component('user-card', '<div><span data-bind="text: name"></span></div>')
215
+ class UserCard {
216
+ @reactive accessor name = '';
217
+ }
218
+ ```
219
+
220
+ Or with options:
221
+
222
+ ```typescript
223
+ @component({ tag: 'user-card', template: '...', synchronous: true })
224
+ class UserCard { ... }
225
+ ```
226
+
227
+ Manual registration (use decorator instead when possible):
228
+
229
+ ```typescript
230
+ components.register('user-card', { template: '...', viewModel: UserCard });
231
+ ```
232
+
233
+ ### Usage
234
+
235
+ ```html
236
+ <user-card params="name: userName"></user-card>
237
+ ```
238
+
239
+ ### Params and Wiring
240
+
241
+ - Plain values assigned directly
242
+ - Computed params create one-way subscription
243
+ - `$`-prefixed observable params enable two-way binding
244
+
245
+ ```html
246
+ <user-card params="name: $sharedName"></user-card>
247
+ ```
248
+
249
+ ### Lifecycle
250
+
251
+ ```typescript
252
+ onInit() // after creation and param wiring
253
+ onDescendantsComplete(node) // after DOM is ready
254
+ dispose() // on cleanup
255
+ ```
256
+
257
+ ### Slots
258
+
259
+ ```html
260
+ <!-- Component template -->
261
+ <div data-bind="slot: 'header'">Default</div>
262
+ <div data-bind="slot: ''">Default body</div>
263
+
264
+ <!-- Usage -->
265
+ <my-card>
266
+ <h2 slot="header">Custom Title</h2>
267
+ <p>Body content</p>
268
+ </my-card>
269
+ ```
270
+
271
+ ## Binding System
272
+
273
+ Apply bindings: `applyBindings(vm, rootElement)`.
274
+
275
+ ### Context
276
+
277
+ `$data`, `$root`, `$parent`, `$parents`, `$index`, `$component`, `$parentContext`, `$rawData`, `$componentTemplateNodes`.
278
+
279
+ Inspect: `contextFor(element)`, `dataFor(element)`.
280
+
281
+ ### Built-in Bindings
282
+
283
+ **Display:** `text`, `html`, `visible`, `hidden`.
284
+ **Attributes:** `attr: { href: url }`, `css: { active: isActive }`, `class: className`, `style: { color: c }`.
285
+ **Form state:** `enable`, `disable`, `uniqueName`.
286
+ **Events:** `event: { mouseover: fn }`, `click`, `submit`, `enter`. Return `true` for default behavior. Use `clickBubble: false` to stop bubbling.
287
+ **Two-way:** `value`, `textInput`, `checked`, `checkedValue`, `hasFocus`, `selectedOptions`, `options`.
288
+ **Control flow:** `if`, `ifnot`, `with`, `using`, `let`, `foreach`, `template`.
289
+ **Dialog:** `modal`.
290
+
291
+ ### Virtual Elements
292
+
293
+ ```html
294
+ <!-- tap if: showSection -->
295
+ <p>Content</p>
296
+ <!-- /tap -->
297
+
298
+ <!-- tap foreach: items -->
299
+ <span data-bind="text: $data"></span>
300
+ <!-- /tap -->
301
+ ```
302
+
303
+ ### Interpolation Markup
304
+
305
+ Enable with `enableInterpolationMarkup()`:
306
+
307
+ ```html
308
+ <span>Hello, {{ name }}!</span>
309
+ <div>{{{ richHtml }}}</div>
310
+ {{# if isLoggedIn }}<p>Welcome!</p>{{/ if }}
311
+ ```
312
+
313
+ ### Attribute Interpolation
314
+
315
+ Enable with `enableAttributeInterpolationMarkup()`:
316
+
317
+ ```html
318
+ <a href="{{ baseUrl }}/profile/{{ userId }}">Profile</a>
319
+ ```
320
+
321
+ ### Namespaced Bindings
322
+
323
+ Enable with `enableNamespacedBindings()`:
324
+
325
+ ```html
326
+ <a data-bind="attr.href: url, css.active: isActive">Link</a>
327
+ ```
328
+
329
+ ### Filters
330
+
331
+ Enable with `enableTextFilter('text')`:
332
+
333
+ ```html
334
+ <span data-bind="text: name | uppercase"></span>
335
+ <span data-bind="text: bio | default:'None'"></span>
336
+ ```
337
+
338
+ Built-in: `uppercase`, `lowercase`, `default`, `json`. Custom: `filters['myFilter'] = (val, ...args) => result`.
339
+
340
+ ## Utilities
341
+
342
+ - `toJS(obj)` — deep-unwrap observables to plain JS
343
+ - `toJSON(obj)` — JSON string of unwrapped object
344
+ - `when(() => condition, callback)` — one-shot reactive wait (or returns Promise if no callback)
345
+ - `unwrapObservable(val)` — recursively unwrap
346
+ - `cleanNode(el)`, `removeNode(el)`, `addDisposeCallback(el, fn)` — DOM cleanup
347
+
348
+ ## Configuration
349
+
350
+ ```typescript
351
+ import { options } from 'tapout';
352
+ options.deferUpdates = true; // global microtask batching
353
+ options.onError = (err) => { ... }; // global error handler
354
+ options.viewModelFactory = (ctor) => new ctor(); // DI hook
355
+ options.customElementDisplayContents = true; // display: contents on custom elements
356
+ ```
357
+
358
+ ## Type Guards
359
+
360
+ `isObservable(v)`, `isObservableArray(v)`, `isComputed(v)`, `isPureComputed(v)`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thomas-siegfried/tapout",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,7 +30,9 @@
30
30
  },
31
31
  "files": [
32
32
  "dist",
33
- "src"
33
+ "src",
34
+ "llms.txt",
35
+ "decorator-config.md"
34
36
  ],
35
37
  "scripts": {
36
38
  "build": "tsc",
package/src/decorators.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Observable } from './observable.js';
2
2
  import { ObservableArray } from './observableArray.js';
3
+ import { getReactiveArrayDecoratorProxy } from './reactiveArrayDecoratorProxy.js';
3
4
  import { Computed } from './computed.js';
4
5
  import type { Subscribable } from './subscribable.js';
5
6
  import type { ExtenderOptions } from './extenders.js';
@@ -157,12 +158,12 @@ function createStage3ReactiveArray(extenders?: ExtenderOptions) {
157
158
  const obs = new ObservableArray(arr);
158
159
  if (extenders) obs.extend(extenders);
159
160
  storeObservable(this as object, context.name, obs);
160
- return obs;
161
+ return getReactiveArrayDecoratorProxy(obs);
161
162
  },
162
163
  get(this: object): unknown {
163
164
  const obs = lookupObservable(this, context.name) as ObservableArray<unknown>;
164
165
  registerDependency(obs);
165
- return obs;
166
+ return getReactiveArrayDecoratorProxy(obs);
166
167
  },
167
168
  set(this: object, newValue: unknown): void {
168
169
  const obs = lookupObservable(this, context.name) as ObservableArray<unknown>;
@@ -193,7 +194,7 @@ function applyLegacyReactiveArray(
193
194
  storeObservable(this, propertyKey, obs);
194
195
  }
195
196
  registerDependency(obs);
196
- return obs;
197
+ return getReactiveArrayDecoratorProxy(obs as ObservableArray<unknown>);
197
198
  },
198
199
  set(this: object, value: unknown) {
199
200
  let obs = lookupObservable(this, propertyKey);
@@ -10,6 +10,8 @@ export interface TrackingFrame {
10
10
  getDependencies(): AnySubscribable[];
11
11
  };
12
12
  isInitial?: boolean;
13
+ /** Dedupes repeated registration of the same subscribable in one frame (e.g. `@reactiveArray` getter + indexed proxy read). */
14
+ _dependencyDedupe?: WeakSet<AnySubscribable>;
13
15
  }
14
16
 
15
17
  let lastId = 0;
@@ -34,6 +36,15 @@ export function registerDependency(subscribable: AnySubscribable): void {
34
36
  if (!isSubscribable(subscribable)) {
35
37
  throw new Error('Only subscribable things can act as dependencies');
36
38
  }
39
+ let dedupe = currentFrame._dependencyDedupe;
40
+ if (!dedupe) {
41
+ dedupe = new WeakSet();
42
+ currentFrame._dependencyDedupe = dedupe;
43
+ }
44
+ if (dedupe.has(subscribable)) {
45
+ return;
46
+ }
47
+ dedupe.add(subscribable);
37
48
  currentFrame.callback(
38
49
  subscribable,
39
50
  subscribable._id || (subscribable._id = getId()),
@@ -0,0 +1,84 @@
1
+ import { registerDependency } from './dependencyDetection.js';
2
+ import { ObservableArray } from './observableArray.js';
3
+
4
+ const proxyCache = new WeakMap<ObservableArray<unknown>, object>();
5
+
6
+ /**
7
+ * ES array index property name: ToString(ToUint32(P)) === P and ToUint32(P) ≠ 2³²−1.
8
+ * @see https://tc39.es/ecma262/#sec-array-exotic-objects
9
+ */
10
+ function parseArrayIndexString(key: string): number | undefined {
11
+ const index = Number(key) >>> 0;
12
+ if (index === 0xffff_ffff) return undefined;
13
+ if (`${index}` !== key) return undefined;
14
+ return index;
15
+ }
16
+
17
+ /**
18
+ * Proxy used only for `@reactiveArray` decorated properties: supports `list[0]` read/write
19
+ * while keeping `getObservable()` on the underlying {@link ObservableArray}.
20
+ *
21
+ * Methods and accessors are applied to the real instance (not the proxy) so internal state works.
22
+ */
23
+ export function getReactiveArrayDecoratorProxy<T>(obs: ObservableArray<T>): ObservableArray<T> {
24
+ let prox = proxyCache.get(obs as ObservableArray<unknown>);
25
+ if (!prox) {
26
+ prox = new Proxy(obs, {
27
+ get(target, prop, _receiver) {
28
+ if (typeof prop === 'string') {
29
+ const index = parseArrayIndexString(prop);
30
+ if (index !== undefined) {
31
+ registerDependency(target);
32
+ return target.peek()[index];
33
+ }
34
+ }
35
+ const value = Reflect.get(target, prop, target);
36
+ if (typeof value === 'function') {
37
+ return value.bind(target);
38
+ }
39
+ return value;
40
+ },
41
+ set(target, prop, value, _receiver) {
42
+ if (typeof prop === 'string') {
43
+ const index = parseArrayIndexString(prop);
44
+ if (index !== undefined) {
45
+ const arr = target.peek();
46
+ target.valueWillMutate();
47
+ arr[index] = value as T;
48
+ target.valueHasMutated();
49
+ return true;
50
+ }
51
+ }
52
+ return Reflect.set(target, prop, value, target);
53
+ },
54
+ has(target, prop) {
55
+ if (typeof prop === 'string') {
56
+ const index = parseArrayIndexString(prop);
57
+ if (index !== undefined) {
58
+ registerDependency(target);
59
+ return Reflect.has(target.peek(), prop);
60
+ }
61
+ }
62
+ return Reflect.has(target, prop);
63
+ },
64
+ deleteProperty(target, prop) {
65
+ if (typeof prop === 'string') {
66
+ const index = parseArrayIndexString(prop);
67
+ if (index !== undefined) {
68
+ const arr = target.peek();
69
+ if (Reflect.has(arr, prop)) {
70
+ target.valueWillMutate();
71
+ delete arr[index];
72
+ target.valueHasMutated();
73
+ return true;
74
+ }
75
+ return true;
76
+ }
77
+ }
78
+ return Reflect.deleteProperty(target, prop);
79
+ },
80
+ });
81
+ proxyCache.set(obs as ObservableArray<unknown>, prox);
82
+ }
83
+ return prox as ObservableArray<T>;
84
+ }
package/src/wireParams.ts CHANGED
@@ -7,6 +7,18 @@ import { addDisposeCallback } from './domNodeDisposal.js';
7
7
 
8
8
  const SKIP_KEYS = new Set(['$raw']);
9
9
 
10
+ function getWritableChildTarget(instance: object, key: string): Observable<unknown> | Computed<unknown> | undefined {
11
+ const decorated = getObservable(instance, key);
12
+ if (decorated instanceof Observable) return decorated;
13
+ if (decorated instanceof Computed && decorated.hasWriteFunction) return decorated;
14
+
15
+ const directValue = (instance as Record<string, unknown>)[key];
16
+ if (directValue instanceof Observable) return directValue;
17
+ if (directValue instanceof Computed && directValue.hasWriteFunction) return directValue;
18
+
19
+ return undefined;
20
+ }
21
+
10
22
  export interface WireParamsResult {
11
23
  subscriptions: Subscription<unknown>[];
12
24
  }
@@ -22,8 +34,8 @@ export function wireParams(
22
34
  if (SKIP_KEYS.has(key)) continue;
23
35
 
24
36
  const paramValue = params[key];
25
- const childObs = getObservable(instance, key);
26
- const childIsReactive = childObs !== undefined && isSubscribable(childObs);
37
+ const childTarget = getWritableChildTarget(instance, key);
38
+ const childIsReactive = childTarget !== undefined && isSubscribable(childTarget);
27
39
 
28
40
  if (paramValue instanceof Observable) {
29
41
  if (childIsReactive) {
@@ -32,9 +44,17 @@ export function wireParams(
32
44
  (instance as Record<string, unknown>)[key] = paramValue.get();
33
45
  }
34
46
  } else if (paramValue instanceof Computed) {
35
- (instance as Record<string, unknown>)[key] = paramValue.get();
47
+ if (childTarget) {
48
+ childTarget.set(paramValue.get());
49
+ } else {
50
+ (instance as Record<string, unknown>)[key] = paramValue.get();
51
+ }
36
52
  const sub = paramValue.subscribe((newValue: unknown) => {
37
- (instance as Record<string, unknown>)[key] = newValue;
53
+ if (childTarget) {
54
+ childTarget.set(newValue);
55
+ } else {
56
+ (instance as Record<string, unknown>)[key] = newValue;
57
+ }
38
58
  });
39
59
  subscriptions.push(sub);
40
60
  if (element) {