@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.
- package/build/constants.d.ts +8 -1
- package/build/constants.js +8 -1
- package/build/index.d.ts +2 -2
- package/build/index.js +2 -2
- package/build/reactive/array.js +18 -27
- package/build/reactive/index.d.ts +14 -15
- package/build/reactive/index.js +2 -2
- package/build/system.d.ts +2 -2
- package/build/system.js +10 -10
- package/build/transformer/detector.d.ts +2 -2
- package/build/transformer/detector.js +14 -14
- package/build/transformer/index.d.ts +3 -7
- package/build/transformer/index.js +21 -39
- package/build/transformer/plugins/tsc.js +7 -2
- package/build/transformer/plugins/vite.js +7 -9
- package/build/transformer/transforms/array.d.ts +3 -3
- package/build/transformer/transforms/array.js +16 -19
- package/build/transformer/transforms/object.d.ts +3 -3
- package/build/transformer/transforms/object.js +41 -57
- package/build/transformer/transforms/primitives.d.ts +3 -3
- package/build/transformer/transforms/primitives.js +60 -117
- package/build/types.d.ts +2 -2
- package/package.json +6 -6
- package/readme.md +5 -5
- package/src/constants.ts +20 -13
- package/src/index.ts +2 -2
- package/src/reactive/array.ts +18 -32
- package/src/reactive/index.ts +18 -19
- package/src/system.ts +14 -21
- package/src/transformer/detector.ts +16 -25
- package/src/transformer/index.ts +24 -46
- package/src/transformer/plugins/tsc.ts +8 -2
- package/src/transformer/plugins/vite.ts +9 -12
- package/src/transformer/transforms/array.ts +20 -33
- package/src/transformer/transforms/object.ts +55 -79
- package/src/transformer/transforms/primitives.ts +70 -144
- package/src/types.ts +5 -3
- package/test/vite.config.ts +1 -1
- package/build/transformer/transforms/utilities.d.ts +0 -8
- package/build/transformer/transforms/utilities.js +0 -27
- package/src/transformer/transforms/utilities.ts +0 -45
package/build/constants.d.ts
CHANGED
|
@@ -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,
|
|
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/constants.js
CHANGED
|
@@ -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,
|
|
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 {
|
|
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 {
|
|
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/reactive/array.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { isArray } from '@esportsplus/utilities';
|
|
2
|
-
import { read,
|
|
2
|
+
import { read, signal, write } from '../system.js';
|
|
3
3
|
import { REACTIVE_ARRAY, REACTIVE_OBJECT } from '../constants.js';
|
|
4
|
-
function
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
82
|
-
if (isReactiveObject(item)) {
|
|
83
|
-
item.dispose();
|
|
84
|
-
}
|
|
82
|
+
dispose(super.pop());
|
|
85
83
|
}
|
|
86
|
-
|
|
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
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
-
|
|
143
|
-
|
|
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
|
-
|
|
176
|
+
write(this._length, super.length);
|
|
183
177
|
for (let i = 0, n = removed.length; i < n; i++) {
|
|
184
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
}
|
|
14
|
-
|
|
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:
|
|
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 };
|
package/build/reactive/index.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2
|
-
export {
|
|
1
|
+
declare const contains: (code: string) => boolean;
|
|
2
|
+
export { contains };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { code as c } from '@esportsplus/typescript/transformer';
|
|
2
2
|
import { ts } from '@esportsplus/typescript';
|
|
3
|
-
|
|
3
|
+
import { COMPILATION_ENTRYPOINT, COMPILATION_ENTRYPOINT_REGEX } from '../constants.js';
|
|
4
4
|
function visit(ctx, node) {
|
|
5
|
-
if (ctx.
|
|
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
|
|
14
|
-
if (name ===
|
|
15
|
-
ctx.
|
|
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 ===
|
|
23
|
-
ctx.
|
|
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
|
|
28
|
-
if (!
|
|
27
|
+
const contains = (code) => {
|
|
28
|
+
if (!c.contains(code, { regex: COMPILATION_ENTRYPOINT_REGEX })) {
|
|
29
29
|
return false;
|
|
30
30
|
}
|
|
31
31
|
let ctx = {
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
imported: false,
|
|
33
|
+
used: false
|
|
34
34
|
};
|
|
35
35
|
visit(ctx, ts.createSourceFile('detect.ts', code, ts.ScriptTarget.Latest, false));
|
|
36
|
-
return ctx.
|
|
36
|
+
return ctx.imported && ctx.used;
|
|
37
37
|
};
|
|
38
|
-
export {
|
|
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
|
-
|
|
2
|
+
import type { TransformResult } from '../types.js';
|
|
3
|
+
import { contains } from './detector.js';
|
|
5
4
|
declare const transform: (sourceFile: ts.SourceFile) => TransformResult;
|
|
6
|
-
export {
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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,
|
|
16
|
-
if (!
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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 {
|
|
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 {
|
|
1
|
+
import { transform } from '../../transformer/index.js';
|
|
2
2
|
export default (_program) => {
|
|
3
|
-
return
|
|
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:
|
|
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
|
|
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(
|
|
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
|
-
|
|
4
|
-
|
|
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 {
|
|
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.
|
|
16
|
+
parts.push(current.name.text);
|
|
16
17
|
current = current.expression;
|
|
17
18
|
}
|
|
18
19
|
if (ts.isIdentifier(current)) {
|
|
19
|
-
parts.
|
|
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
|
-
|
|
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) ===
|
|
36
|
-
ctx.bindings.set(node.name.text,
|
|
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) ===
|
|
41
|
-
ctx.bindings.set(node.name.text,
|
|
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,
|
|
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) ===
|
|
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) ===
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
4
|
-
|
|
2
|
+
import type { Bindings } from '../../types.js';
|
|
3
|
+
declare const _default: (sourceFile: ts.SourceFile, bindings: Bindings, ns: string) => string;
|
|
4
|
+
export default _default;
|