@esportsplus/reactivity 0.25.2 → 0.25.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.
Files changed (41) hide show
  1. package/build/constants.d.ts +8 -1
  2. package/build/constants.js +8 -1
  3. package/build/index.d.ts +2 -2
  4. package/build/index.js +2 -2
  5. package/build/reactive/array.js +18 -27
  6. package/build/reactive/index.d.ts +14 -15
  7. package/build/reactive/index.js +2 -2
  8. package/build/system.d.ts +2 -2
  9. package/build/system.js +10 -10
  10. package/build/transformer/detector.d.ts +2 -2
  11. package/build/transformer/detector.js +14 -14
  12. package/build/transformer/index.d.ts +3 -7
  13. package/build/transformer/index.js +21 -39
  14. package/build/transformer/plugins/tsc.js +7 -2
  15. package/build/transformer/plugins/vite.js +7 -9
  16. package/build/transformer/transforms/array.d.ts +3 -3
  17. package/build/transformer/transforms/array.js +16 -19
  18. package/build/transformer/transforms/object.d.ts +3 -3
  19. package/build/transformer/transforms/object.js +41 -57
  20. package/build/transformer/transforms/primitives.d.ts +3 -3
  21. package/build/transformer/transforms/primitives.js +60 -117
  22. package/build/types.d.ts +2 -2
  23. package/package.json +6 -6
  24. package/readme.md +5 -5
  25. package/src/constants.ts +20 -13
  26. package/src/index.ts +2 -2
  27. package/src/reactive/array.ts +18 -32
  28. package/src/reactive/index.ts +18 -19
  29. package/src/system.ts +14 -21
  30. package/src/transformer/detector.ts +16 -25
  31. package/src/transformer/index.ts +24 -46
  32. package/src/transformer/plugins/tsc.ts +8 -2
  33. package/src/transformer/plugins/vite.ts +9 -12
  34. package/src/transformer/transforms/array.ts +20 -33
  35. package/src/transformer/transforms/object.ts +55 -79
  36. package/src/transformer/transforms/primitives.ts +70 -144
  37. package/src/types.ts +5 -3
  38. package/test/vite.config.ts +1 -1
  39. package/build/transformer/transforms/utilities.d.ts +0 -8
  40. package/build/transformer/transforms/utilities.js +0 -27
  41. package/src/transformer/transforms/utilities.ts +0 -45
@@ -1,4 +1,11 @@
1
+ declare const COMPILATION_ENTRYPOINT = "reactive";
2
+ declare const COMPILATION_ENTRYPOINT_REGEX: RegExp;
3
+ declare const COMPILATION_NAMESPACE = "reactive";
4
+ declare const COMPILATION_TYPE_ARRAY = "array";
5
+ declare const COMPILATION_TYPE_COMPUTED = "computed";
6
+ declare const COMPILATION_TYPE_SIGNAL = "signal";
1
7
  declare const COMPUTED: unique symbol;
8
+ declare const PACKAGE = "@esportsplus/reactivity";
2
9
  declare const REACTIVE_ARRAY: unique symbol;
3
10
  declare const REACTIVE_OBJECT: unique symbol;
4
11
  declare const SIGNAL: unique symbol;
@@ -12,4 +19,4 @@ declare const STATE_DIRTY: number;
12
19
  declare const STATE_RECOMPUTING: number;
13
20
  declare const STATE_IN_HEAP: number;
14
21
  declare const STATE_NOTIFY_MASK: number;
15
- export { COMPUTED, REACTIVE_ARRAY, REACTIVE_OBJECT, SIGNAL, STABILIZER_IDLE, STATE_NOTIFY_MASK, STABILIZER_RESCHEDULE, STABILIZER_RUNNING, STABILIZER_SCHEDULED, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_RECOMPUTING };
22
+ export { COMPILATION_TYPE_ARRAY, COMPILATION_TYPE_COMPUTED, COMPILATION_ENTRYPOINT, COMPILATION_ENTRYPOINT_REGEX, COMPILATION_NAMESPACE, COMPILATION_TYPE_SIGNAL, COMPUTED, PACKAGE, REACTIVE_ARRAY, REACTIVE_OBJECT, SIGNAL, STABILIZER_IDLE, STABILIZER_RESCHEDULE, STABILIZER_RUNNING, STABILIZER_SCHEDULED, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_NOTIFY_MASK, STATE_RECOMPUTING };
@@ -1,4 +1,11 @@
1
+ const COMPILATION_ENTRYPOINT = 'reactive';
2
+ const COMPILATION_ENTRYPOINT_REGEX = /\breactive\b/;
3
+ const COMPILATION_NAMESPACE = 'reactive';
4
+ const COMPILATION_TYPE_ARRAY = 'array';
5
+ const COMPILATION_TYPE_COMPUTED = 'computed';
6
+ const COMPILATION_TYPE_SIGNAL = 'signal';
1
7
  const COMPUTED = Symbol('reactivity.computed');
8
+ const PACKAGE = '@esportsplus/reactivity';
2
9
  const REACTIVE_ARRAY = Symbol('reactivity.reactive.array');
3
10
  const REACTIVE_OBJECT = Symbol('reactivity.reactive.object');
4
11
  const SIGNAL = Symbol('reactivity.signal');
@@ -12,4 +19,4 @@ const STATE_DIRTY = 1 << 1;
12
19
  const STATE_RECOMPUTING = 1 << 2;
13
20
  const STATE_IN_HEAP = 1 << 3;
14
21
  const STATE_NOTIFY_MASK = (STATE_CHECK | STATE_DIRTY);
15
- export { COMPUTED, REACTIVE_ARRAY, REACTIVE_OBJECT, SIGNAL, STABILIZER_IDLE, STATE_NOTIFY_MASK, STABILIZER_RESCHEDULE, STABILIZER_RUNNING, STABILIZER_SCHEDULED, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_RECOMPUTING };
22
+ export { COMPILATION_TYPE_ARRAY, COMPILATION_TYPE_COMPUTED, COMPILATION_ENTRYPOINT, COMPILATION_ENTRYPOINT_REGEX, COMPILATION_NAMESPACE, COMPILATION_TYPE_SIGNAL, COMPUTED, PACKAGE, REACTIVE_ARRAY, REACTIVE_OBJECT, SIGNAL, STABILIZER_IDLE, STABILIZER_RESCHEDULE, STABILIZER_RUNNING, STABILIZER_SCHEDULED, STATE_CHECK, STATE_DIRTY, STATE_IN_HEAP, STATE_NONE, STATE_NOTIFY_MASK, STATE_RECOMPUTING };
package/build/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { STABILIZER_IDLE, STABILIZER_RESCHEDULE, STABILIZER_RUNNING, STABILIZER_SCHEDULED } from './constants.js';
2
- export { default as reactive } from './reactive/index.js';
1
+ export { REACTIVE_OBJECT } from './constants.js';
2
+ export { default as reactive, ReactiveArray } from './reactive/index.js';
3
3
  export * from './system.js';
4
4
  export * from './types.js';
package/build/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { STABILIZER_IDLE, STABILIZER_RESCHEDULE, STABILIZER_RUNNING, STABILIZER_SCHEDULED } from './constants.js';
2
- export { default as reactive } from './reactive/index.js';
1
+ export { REACTIVE_OBJECT } from './constants.js';
2
+ export { default as reactive, ReactiveArray } from './reactive/index.js';
3
3
  export * from './system.js';
4
4
  export * from './types.js';
@@ -1,8 +1,10 @@
1
1
  import { isArray } from '@esportsplus/utilities';
2
- import { read, set, signal } from '../system.js';
2
+ import { read, signal, write } from '../system.js';
3
3
  import { REACTIVE_ARRAY, REACTIVE_OBJECT } from '../constants.js';
4
- function isReactiveObject(value) {
5
- return value !== null && typeof value === 'object' && value[REACTIVE_OBJECT] === true;
4
+ function dispose(value) {
5
+ if (value !== null && typeof value === 'object' && value[REACTIVE_OBJECT] === true) {
6
+ value.dispose();
7
+ }
6
8
  }
7
9
  class ReactiveArray extends Array {
8
10
  _length;
@@ -21,13 +23,13 @@ class ReactiveArray extends Array {
21
23
  }
22
24
  this[i] = value;
23
25
  if (i >= super.length) {
24
- set(this._length, i + 1);
26
+ write(this._length, i + 1);
25
27
  }
26
28
  this.dispatch('set', { index: i, item: value });
27
29
  }
28
30
  clear() {
29
31
  this.dispose();
30
- set(this._length, 0);
32
+ write(this._length, 0);
31
33
  this.dispatch('clear');
32
34
  }
33
35
  concat(...items) {
@@ -46,7 +48,7 @@ class ReactiveArray extends Array {
46
48
  }
47
49
  }
48
50
  if (added.length) {
49
- set(this._length, super.length);
51
+ write(this._length, super.length);
50
52
  this.dispatch('concat', { items: added });
51
53
  }
52
54
  return this;
@@ -76,14 +78,10 @@ class ReactiveArray extends Array {
76
78
  }
77
79
  }
78
80
  dispose() {
79
- let item;
80
81
  while (this.length) {
81
- item = super.pop();
82
- if (isReactiveObject(item)) {
83
- item.dispose();
84
- }
82
+ dispose(super.pop());
85
83
  }
86
- set(this._length, 0);
84
+ write(this._length, 0);
87
85
  }
88
86
  on(event, listener) {
89
87
  let listeners = this.listeners[event];
@@ -114,10 +112,8 @@ class ReactiveArray extends Array {
114
112
  pop() {
115
113
  let item = super.pop();
116
114
  if (item !== undefined) {
117
- set(this._length, super.length);
118
- if (isReactiveObject(item)) {
119
- item.dispose();
120
- }
115
+ dispose(item);
116
+ write(this._length, super.length);
121
117
  this.dispatch('pop', { item });
122
118
  }
123
119
  return item;
@@ -127,7 +123,7 @@ class ReactiveArray extends Array {
127
123
  return super.length;
128
124
  }
129
125
  let length = super.push(...items);
130
- set(this._length, length);
126
+ write(this._length, length);
131
127
  this.dispatch('push', { items });
132
128
  return length;
133
129
  }
@@ -139,10 +135,8 @@ class ReactiveArray extends Array {
139
135
  shift() {
140
136
  let item = super.shift();
141
137
  if (item !== undefined) {
142
- set(this._length, super.length);
143
- if (isReactiveObject(item)) {
144
- item.dispose();
145
- }
138
+ dispose(item);
139
+ write(this._length, super.length);
146
140
  this.dispatch('shift', { item });
147
141
  }
148
142
  return item;
@@ -179,12 +173,9 @@ class ReactiveArray extends Array {
179
173
  splice(start, deleteCount = this.length, ...items) {
180
174
  let removed = super.splice(start, deleteCount, ...items);
181
175
  if (items.length > 0 || removed.length > 0) {
182
- set(this._length, super.length);
176
+ write(this._length, super.length);
183
177
  for (let i = 0, n = removed.length; i < n; i++) {
184
- let item = removed[i];
185
- if (isReactiveObject(item)) {
186
- item.dispose();
187
- }
178
+ dispose(removed[i]);
188
179
  }
189
180
  this.dispatch('splice', { deleteCount, items, start });
190
181
  }
@@ -192,7 +183,7 @@ class ReactiveArray extends Array {
192
183
  }
193
184
  unshift(...items) {
194
185
  let length = super.unshift(...items);
195
- set(this._length, length);
186
+ write(this._length, length);
196
187
  this.dispatch('unshift', { items });
197
188
  return length;
198
189
  }
@@ -1,26 +1,25 @@
1
1
  import { Prettify } from '@esportsplus/utilities';
2
- import { REACTIVE_OBJECT } from '../constants.js';
3
2
  import { ReactiveArray } from './array.js';
3
+ import { Reactive } from '../types.js';
4
4
  declare const READONLY: unique symbol;
5
- type Infer<T> = T extends (...args: unknown[]) => Promise<infer R> ? R | undefined : T extends (...args: any[]) => infer R ? R : T extends (infer U)[] ? ReactiveArray<U> : T extends ReactiveObject<any> ? T : T extends Record<PropertyKey, unknown> ? {
5
+ type Guard<T> = T extends Record<PropertyKey, unknown> ? T extends {
6
+ dispose: any;
7
+ } ? {
8
+ never: '[ dispose ] is a reserved key';
9
+ } : T : never;
10
+ type Infer<T> = T extends (...args: unknown[]) => Promise<infer R> ? R | undefined : T extends (...args: any[]) => infer R ? R : T extends (infer U)[] ? U[] & Pick<ReactiveArray<U>, 'clear' | 'on' | 'once'> : T extends ReactiveObject<any> ? T : T extends Record<PropertyKey, unknown> ? {
6
11
  [K in keyof T]: T[K];
7
12
  } : T;
8
- type ReactiveObject<T> = T extends Record<PropertyKey, unknown> ? Prettify<{
13
+ type ReactiveObject<T> = T extends Record<PropertyKey, unknown> ? Reactive<Prettify<{
9
14
  [K in keyof T]: Infer<T[K]>;
10
15
  } & {
11
- [REACTIVE_OBJECT]: true;
12
16
  dispose: VoidFunction;
13
- }> : T extends (infer U)[] ? ReactiveArray<U> : never;
14
- type ReactiveObjectGuard<T> = T extends {
15
- dispose: any;
16
- } ? {
17
- never: '[ dispose ] is a reserved key';
18
- } : T;
19
- declare function reactive<T extends () => unknown>(_input: T): ReturnType<T> & {
17
+ }>> : T extends (infer U)[] ? U[] & Pick<ReactiveArray<U>, 'clear' | 'on' | 'once'> : never;
18
+ declare function reactive<T extends () => unknown>(_input: T): Reactive<ReturnType<T> & {
20
19
  readonly [READONLY]: true;
21
- };
22
- declare function reactive<T extends Record<PropertyKey, any>>(_input: ReactiveObjectGuard<T>): ReactiveObject<T>;
23
- declare function reactive<T>(_input: T[]): ReactiveArray<T>;
20
+ }>;
21
+ declare function reactive<T extends Record<PropertyKey, any>>(_input: Guard<T>): ReactiveObject<T>;
22
+ declare function reactive<T>(_input: T[]): Reactive<T[] & Pick<ReactiveArray<T>, 'clear' | 'on' | 'once'>>;
24
23
  export default reactive;
25
24
  export { reactive, ReactiveArray };
26
- export type { ReactiveObject };
25
+ export type { Reactive, ReactiveObject };
@@ -1,7 +1,7 @@
1
- import { REACTIVE_OBJECT } from '../constants.js';
2
1
  import { ReactiveArray } from './array.js';
2
+ import { PACKAGE } from '../constants.js';
3
3
  function reactive(_input) {
4
- throw new Error('@esportsplus/reactivity: reactive() called at runtime. ' +
4
+ throw new Error(`${PACKAGE}: reactive() called at runtime. ` +
5
5
  'Ensure vite-plugin-reactivity-compile is configured.');
6
6
  }
7
7
  export default reactive;
package/build/system.d.ts CHANGED
@@ -10,7 +10,7 @@ declare const root: {
10
10
  <T>(fn: ((dispose: VoidFunction) => T) | (() => T)): T;
11
11
  disposables: number;
12
12
  };
13
- declare const set: <T>(signal: Signal<T>, value: T) => void;
14
13
  declare const signal: <T>(value: T) => Signal<T>;
15
- export { computed, dispose, effect, isComputed, isSignal, onCleanup, read, root, set, signal };
14
+ declare const write: <T>(signal: Signal<T>, value: T) => void;
15
+ export { computed, dispose, effect, isComputed, isSignal, onCleanup, read, root, signal, write };
16
16
  export type { Computed, Signal };
package/build/system.js CHANGED
@@ -368,7 +368,15 @@ const root = (fn) => {
368
368
  return value;
369
369
  };
370
370
  root.disposables = 0;
371
- const set = (signal, value) => {
371
+ const signal = (value) => {
372
+ return {
373
+ subs: null,
374
+ subsTail: null,
375
+ type: SIGNAL,
376
+ value,
377
+ };
378
+ };
379
+ const write = (signal, value) => {
372
380
  if (signal.value === value) {
373
381
  return;
374
382
  }
@@ -382,12 +390,4 @@ const set = (signal, value) => {
382
390
  }
383
391
  schedule();
384
392
  };
385
- const signal = (value) => {
386
- return {
387
- subs: null,
388
- subsTail: null,
389
- type: SIGNAL,
390
- value,
391
- };
392
- };
393
- export { computed, dispose, effect, isComputed, isSignal, onCleanup, read, root, set, signal };
393
+ export { computed, dispose, effect, isComputed, isSignal, onCleanup, read, root, signal, write };
@@ -1,2 +1,2 @@
1
- declare const mightNeedTransform: (code: string) => boolean;
2
- export { mightNeedTransform };
1
+ declare const contains: (code: string) => boolean;
2
+ export { contains };
@@ -1,8 +1,8 @@
1
- import { mightNeedTransform as checkTransform } from '@esportsplus/typescript/transformer';
1
+ import { code as c } from '@esportsplus/typescript/transformer';
2
2
  import { ts } from '@esportsplus/typescript';
3
- const REACTIVE_REGEX = /\breactive\b/;
3
+ import { COMPILATION_ENTRYPOINT, COMPILATION_ENTRYPOINT_REGEX } from '../constants.js';
4
4
  function visit(ctx, node) {
5
- if (ctx.hasImport && ctx.hasUsage) {
5
+ if (ctx.imported && ctx.used) {
6
6
  return;
7
7
  }
8
8
  if (ts.isImportDeclaration(node) &&
@@ -10,29 +10,29 @@ function visit(ctx, node) {
10
10
  ts.isNamedImports(node.importClause.namedBindings)) {
11
11
  let elements = node.importClause.namedBindings.elements;
12
12
  for (let i = 0, n = elements.length; i < n; i++) {
13
- let el = elements[i], name = el.propertyName?.text ?? el.name.text;
14
- if (name === 'reactive') {
15
- ctx.hasImport = true;
13
+ let element = elements[i];
14
+ if ((element.propertyName?.text ?? element.name.text) === COMPILATION_ENTRYPOINT) {
15
+ ctx.imported = true;
16
16
  break;
17
17
  }
18
18
  }
19
19
  }
20
20
  if (ts.isCallExpression(node) &&
21
21
  ts.isIdentifier(node.expression) &&
22
- node.expression.text === 'reactive') {
23
- ctx.hasUsage = true;
22
+ node.expression.text === COMPILATION_ENTRYPOINT) {
23
+ ctx.used = true;
24
24
  }
25
25
  ts.forEachChild(node, n => visit(ctx, n));
26
26
  }
27
- const mightNeedTransform = (code) => {
28
- if (!checkTransform(code, { regex: REACTIVE_REGEX })) {
27
+ const contains = (code) => {
28
+ if (!c.contains(code, { regex: COMPILATION_ENTRYPOINT_REGEX })) {
29
29
  return false;
30
30
  }
31
31
  let ctx = {
32
- hasImport: false,
33
- hasUsage: false
32
+ imported: false,
33
+ used: false
34
34
  };
35
35
  visit(ctx, ts.createSourceFile('detect.ts', code, ts.ScriptTarget.Latest, false));
36
- return ctx.hasImport && ctx.hasUsage;
36
+ return ctx.imported && ctx.used;
37
37
  };
38
- export { mightNeedTransform };
38
+ export { contains };
@@ -1,9 +1,5 @@
1
- import type { TransformResult } from '../types.js';
2
- import { mightNeedTransform } from './detector.js';
3
1
  import { ts } from '@esportsplus/typescript';
4
- declare const createTransformer: () => ts.TransformerFactory<ts.SourceFile>;
2
+ import type { TransformResult } from '../types.js';
3
+ import { contains } from './detector.js';
5
4
  declare const transform: (sourceFile: ts.SourceFile) => TransformResult;
6
- export { createTransformer, mightNeedTransform, transform };
7
- export { transformReactiveArrays } from './transforms/array.js';
8
- export { transformReactiveObjects } from './transforms/object.js';
9
- export { transformReactivePrimitives } from './transforms/primitives.js';
5
+ export { contains, transform };
@@ -1,46 +1,28 @@
1
- import { mightNeedTransform } from './detector.js';
2
- import { transformReactiveArrays } from './transforms/array.js';
3
- import { transformReactiveObjects } from './transforms/object.js';
4
- import { transformReactivePrimitives } from './transforms/primitives.js';
5
1
  import { ts } from '@esportsplus/typescript';
6
- const createTransformer = () => {
7
- return () => {
8
- return (sourceFile) => {
9
- let result = transform(sourceFile);
10
- return result.transformed ? result.sourceFile : sourceFile;
11
- };
12
- };
13
- };
2
+ import { uid } from '@esportsplus/typescript/transformer';
3
+ import { COMPILATION_NAMESPACE } from '../constants.js';
4
+ import { contains } from './detector.js';
5
+ import array from './transforms/array.js';
6
+ import object from './transforms/object.js';
7
+ import primitives from './transforms/primitives.js';
8
+ let ns = uid(COMPILATION_NAMESPACE), transforms = [object, array, primitives];
14
9
  const transform = (sourceFile) => {
15
- let bindings = new Map(), code = sourceFile.getFullText(), current = sourceFile, original = code, result;
16
- if (!mightNeedTransform(code)) {
10
+ let bindings = new Map(), code = sourceFile.getFullText(), current = sourceFile, result, transformed = false;
11
+ if (!contains(code)) {
17
12
  return { code, sourceFile, transformed: false };
18
13
  }
19
- result = transformReactiveObjects(current, bindings);
20
- if (result !== code) {
21
- current = ts.createSourceFile(sourceFile.fileName, result, sourceFile.languageVersion, true);
22
- code = result;
23
- }
24
- result = transformReactiveArrays(current, bindings);
25
- if (result !== code) {
26
- current = ts.createSourceFile(sourceFile.fileName, result, sourceFile.languageVersion, true);
27
- code = result;
14
+ for (let i = 0, n = transforms.length; i < n; i++) {
15
+ result = transforms[i](current, bindings, ns);
16
+ if (result !== code) {
17
+ current = ts.createSourceFile(sourceFile.fileName, result, sourceFile.languageVersion, true);
18
+ code = result;
19
+ transformed = true;
20
+ }
28
21
  }
29
- result = transformReactivePrimitives(current, bindings);
30
- if (result !== code) {
31
- current = ts.createSourceFile(sourceFile.fileName, result, sourceFile.languageVersion, true);
32
- code = result;
33
- }
34
- if (code === original) {
35
- return { code, sourceFile, transformed: false };
22
+ if (transformed) {
23
+ code = `import * as ${ns} from '@esportsplus/reactivity';\n` + code;
24
+ sourceFile = ts.createSourceFile(sourceFile.fileName, code, sourceFile.languageVersion, true);
36
25
  }
37
- return {
38
- code,
39
- sourceFile: current,
40
- transformed: true
41
- };
26
+ return { code, sourceFile, transformed };
42
27
  };
43
- export { createTransformer, mightNeedTransform, transform };
44
- export { transformReactiveArrays } from './transforms/array.js';
45
- export { transformReactiveObjects } from './transforms/object.js';
46
- export { transformReactivePrimitives } from './transforms/primitives.js';
28
+ export { contains, transform };
@@ -1,4 +1,9 @@
1
- import { createTransformer } from '../../transformer/index.js';
1
+ import { transform } from '../../transformer/index.js';
2
2
  export default (_program) => {
3
- return createTransformer();
3
+ return () => {
4
+ return (sourceFile) => {
5
+ let result = transform(sourceFile);
6
+ return result.transformed ? result.sourceFile : sourceFile;
7
+ };
8
+ };
4
9
  };
@@ -1,26 +1,24 @@
1
- import { TRANSFORM_PATTERN } from '@esportsplus/typescript/transformer';
2
- import { mightNeedTransform, transform } from '../../transformer/index.js';
3
1
  import { ts } from '@esportsplus/typescript';
2
+ import { TRANSFORM_PATTERN } from '@esportsplus/typescript/transformer';
3
+ import { contains, transform } from '../../transformer/index.js';
4
+ import { PACKAGE } from '../../constants.js';
4
5
  export default () => {
5
6
  return {
6
7
  enforce: 'pre',
7
- name: '@esportsplus/reactivity/plugin-vite',
8
+ name: `${PACKAGE}/plugin-vite`,
8
9
  transform(code, id) {
9
- if (!TRANSFORM_PATTERN.test(id) || id.includes('node_modules')) {
10
- return null;
11
- }
12
- if (!mightNeedTransform(code)) {
10
+ if (!TRANSFORM_PATTERN.test(id) || id.includes('node_modules') || !contains(code)) {
13
11
  return null;
14
12
  }
15
13
  try {
16
- let sourceFile = ts.createSourceFile(id, code, ts.ScriptTarget.Latest, true), result = transform(sourceFile);
14
+ let result = transform(ts.createSourceFile(id, code, ts.ScriptTarget.Latest, true));
17
15
  if (!result.transformed) {
18
16
  return null;
19
17
  }
20
18
  return { code: result.code, map: null };
21
19
  }
22
20
  catch (error) {
23
- console.error(`@esportsplus/reactivity: Error transforming ${id}:`, error);
21
+ console.error(`${PACKAGE}: Error transforming ${id}:`, error);
24
22
  return null;
25
23
  }
26
24
  }
@@ -1,4 +1,4 @@
1
- import type { Bindings } from '../../types.js';
2
1
  import { ts } from '@esportsplus/typescript';
3
- declare const transformReactiveArrays: (sourceFile: ts.SourceFile, bindings: Bindings) => string;
4
- export { transformReactiveArrays };
2
+ import type { Bindings } from '../../types.js';
3
+ declare const _default: (sourceFile: ts.SourceFile, bindings: Bindings, _ns: string) => string;
4
+ export default _default;
@@ -1,5 +1,6 @@
1
- import { applyReplacements } from './utilities.js';
1
+ import { code as c } from '@esportsplus/typescript/transformer';
2
2
  import { ts } from '@esportsplus/typescript';
3
+ import { COMPILATION_TYPE_ARRAY } from '../../constants.js';
3
4
  function getExpressionName(node) {
4
5
  if (ts.isIdentifier(node)) {
5
6
  return node.text;
@@ -12,33 +13,30 @@ function getExpressionName(node) {
12
13
  function getPropertyPath(node) {
13
14
  let current = node, parts = [];
14
15
  while (ts.isPropertyAccessExpression(current)) {
15
- parts.unshift(current.name.text);
16
+ parts.push(current.name.text);
16
17
  current = current.expression;
17
18
  }
18
19
  if (ts.isIdentifier(current)) {
19
- parts.unshift(current.text);
20
- return parts.join('.');
20
+ parts.push(current.text);
21
+ return parts.reverse().join('.');
21
22
  }
22
23
  return null;
23
24
  }
24
25
  function isAssignmentTarget(node) {
25
26
  let parent = node.parent;
26
- if ((ts.isBinaryExpression(parent) && parent.left === node) ||
27
+ return !!parent && ((ts.isBinaryExpression(parent) && parent.left === node) ||
27
28
  ts.isPostfixUnaryExpression(parent) ||
28
- ts.isPrefixUnaryExpression(parent)) {
29
- return true;
30
- }
31
- return false;
29
+ ts.isPrefixUnaryExpression(parent));
32
30
  }
33
31
  function visit(ctx, node) {
34
32
  if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer) {
35
- if (ts.isIdentifier(node.initializer) && ctx.bindings.get(node.initializer.text) === 'array') {
36
- ctx.bindings.set(node.name.text, 'array');
33
+ if (ts.isIdentifier(node.initializer) && ctx.bindings.get(node.initializer.text) === COMPILATION_TYPE_ARRAY) {
34
+ ctx.bindings.set(node.name.text, COMPILATION_TYPE_ARRAY);
37
35
  }
38
36
  if (ts.isPropertyAccessExpression(node.initializer)) {
39
37
  let path = getPropertyPath(node.initializer);
40
- if (path && ctx.bindings.get(path) === 'array') {
41
- ctx.bindings.set(node.name.text, 'array');
38
+ if (path && ctx.bindings.get(path) === COMPILATION_TYPE_ARRAY) {
39
+ ctx.bindings.set(node.name.text, COMPILATION_TYPE_ARRAY);
42
40
  }
43
41
  }
44
42
  }
@@ -49,7 +47,7 @@ function visit(ctx, node) {
49
47
  ts.isTypeReferenceNode(param.type) &&
50
48
  ts.isIdentifier(param.type.typeName) &&
51
49
  param.type.typeName.text === 'ReactiveArray') {
52
- ctx.bindings.set(param.name.text, 'array');
50
+ ctx.bindings.set(param.name.text, COMPILATION_TYPE_ARRAY);
53
51
  }
54
52
  }
55
53
  }
@@ -57,7 +55,7 @@ function visit(ctx, node) {
57
55
  node.name.text === 'length' &&
58
56
  !isAssignmentTarget(node)) {
59
57
  let name = getExpressionName(node.expression);
60
- if (name && ctx.bindings.get(name) === 'array') {
58
+ if (name && ctx.bindings.get(name) === COMPILATION_TYPE_ARRAY) {
61
59
  let objText = node.expression.getText(ctx.sourceFile);
62
60
  ctx.replacements.push({
63
61
  end: node.end,
@@ -70,7 +68,7 @@ function visit(ctx, node) {
70
68
  node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
71
69
  ts.isElementAccessExpression(node.left)) {
72
70
  let elemAccess = node.left, objName = getExpressionName(elemAccess.expression);
73
- if (objName && ctx.bindings.get(objName) === 'array') {
71
+ if (objName && ctx.bindings.get(objName) === COMPILATION_TYPE_ARRAY) {
74
72
  let indexText = elemAccess.argumentExpression.getText(ctx.sourceFile), objText = elemAccess.expression.getText(ctx.sourceFile), valueText = node.right.getText(ctx.sourceFile);
75
73
  ctx.replacements.push({
76
74
  end: node.end,
@@ -81,13 +79,12 @@ function visit(ctx, node) {
81
79
  }
82
80
  ts.forEachChild(node, n => visit(ctx, n));
83
81
  }
84
- const transformReactiveArrays = (sourceFile, bindings) => {
82
+ export default (sourceFile, bindings, _ns) => {
85
83
  let code = sourceFile.getFullText(), ctx = {
86
84
  bindings,
87
85
  replacements: [],
88
86
  sourceFile
89
87
  };
90
88
  visit(ctx, sourceFile);
91
- return applyReplacements(code, ctx.replacements);
89
+ return c.replace(code, ctx.replacements);
92
90
  };
93
- export { transformReactiveArrays };
@@ -1,4 +1,4 @@
1
- import type { Bindings } from '../../types.js';
2
1
  import { ts } from '@esportsplus/typescript';
3
- declare const transformReactiveObjects: (sourceFile: ts.SourceFile, bindings: Bindings) => string;
4
- export { transformReactiveObjects };
2
+ import type { Bindings } from '../../types.js';
3
+ declare const _default: (sourceFile: ts.SourceFile, bindings: Bindings, ns: string) => string;
4
+ export default _default;