@justscale/typescript 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/api.d.ts +144 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +380 -0
- package/dist/api.js.map +1 -0
- package/dist/compiler/analyzer.d.ts +247 -0
- package/dist/compiler/analyzer.d.ts.map +1 -0
- package/dist/compiler/analyzer.js +3201 -0
- package/dist/compiler/analyzer.js.map +1 -0
- package/dist/compiler/cli.d.ts +12 -0
- package/dist/compiler/cli.d.ts.map +1 -0
- package/dist/compiler/cli.js +209 -0
- package/dist/compiler/cli.js.map +1 -0
- package/dist/compiler/compile.d.ts +26 -0
- package/dist/compiler/compile.d.ts.map +1 -0
- package/dist/compiler/compile.js +121 -0
- package/dist/compiler/compile.js.map +1 -0
- package/dist/compiler/errors.d.ts +336 -0
- package/dist/compiler/errors.d.ts.map +1 -0
- package/dist/compiler/errors.js +466 -0
- package/dist/compiler/errors.js.map +1 -0
- package/dist/compiler/exports-prepass.d.ts +31 -0
- package/dist/compiler/exports-prepass.d.ts.map +1 -0
- package/dist/compiler/exports-prepass.js +249 -0
- package/dist/compiler/exports-prepass.js.map +1 -0
- package/dist/compiler/hmr-change-detector.d.ts +47 -0
- package/dist/compiler/hmr-change-detector.d.ts.map +1 -0
- package/dist/compiler/hmr-change-detector.js +395 -0
- package/dist/compiler/hmr-change-detector.js.map +1 -0
- package/dist/compiler/hmr-transformer.d.ts +54 -0
- package/dist/compiler/hmr-transformer.d.ts.map +1 -0
- package/dist/compiler/hmr-transformer.js +535 -0
- package/dist/compiler/hmr-transformer.js.map +1 -0
- package/dist/compiler/index.d.ts +19 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +16 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/primitive-detector.d.ts +70 -0
- package/dist/compiler/primitive-detector.d.ts.map +1 -0
- package/dist/compiler/primitive-detector.js +338 -0
- package/dist/compiler/primitive-detector.js.map +1 -0
- package/dist/compiler/ptsc.d.ts +40 -0
- package/dist/compiler/ptsc.d.ts.map +1 -0
- package/dist/compiler/ptsc.js +462 -0
- package/dist/compiler/ptsc.js.map +1 -0
- package/dist/compiler/rewriter.d.ts +96 -0
- package/dist/compiler/rewriter.d.ts.map +1 -0
- package/dist/compiler/rewriter.js +418 -0
- package/dist/compiler/rewriter.js.map +1 -0
- package/dist/compiler/step-hash.d.ts +43 -0
- package/dist/compiler/step-hash.d.ts.map +1 -0
- package/dist/compiler/step-hash.js +83 -0
- package/dist/compiler/step-hash.js.map +1 -0
- package/dist/compiler/switch-codegen.d.ts +84 -0
- package/dist/compiler/switch-codegen.d.ts.map +1 -0
- package/dist/compiler/switch-codegen.js +1540 -0
- package/dist/compiler/switch-codegen.js.map +1 -0
- package/dist/compiler/transformer.d.ts +29 -0
- package/dist/compiler/transformer.d.ts.map +1 -0
- package/dist/compiler/transformer.js +216 -0
- package/dist/compiler/transformer.js.map +1 -0
- package/dist/config/index.d.ts +122 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +215 -0
- package/dist/config/index.js.map +1 -0
- package/dist/di-errors/formatter.d.ts +126 -0
- package/dist/di-errors/formatter.d.ts.map +1 -0
- package/dist/di-errors/formatter.js +384 -0
- package/dist/di-errors/formatter.js.map +1 -0
- package/dist/di-errors/index.d.ts +5 -0
- package/dist/di-errors/index.d.ts.map +1 -0
- package/dist/di-errors/index.js +13 -0
- package/dist/di-errors/index.js.map +1 -0
- package/dist/editor.d.ts +11 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +2 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/language-service/index.d.ts +52 -0
- package/dist/language-service/index.d.ts.map +1 -0
- package/dist/language-service/index.js +366 -0
- package/dist/language-service/index.js.map +1 -0
- package/dist/language-service/process-quick-fixes.d.ts +20 -0
- package/dist/language-service/process-quick-fixes.d.ts.map +1 -0
- package/dist/language-service/process-quick-fixes.js +114 -0
- package/dist/language-service/process-quick-fixes.js.map +1 -0
- package/dist/language-service/quick-fix-discovery.d.ts +39 -0
- package/dist/language-service/quick-fix-discovery.d.ts.map +1 -0
- package/dist/language-service/quick-fix-discovery.js +124 -0
- package/dist/language-service/quick-fix-discovery.js.map +1 -0
- package/dist/loader/incremental.d.ts +50 -0
- package/dist/loader/incremental.d.ts.map +1 -0
- package/dist/loader/incremental.js +151 -0
- package/dist/loader/incremental.js.map +1 -0
- package/dist/loader/index.d.ts +25 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +24 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/loader.d.ts +52 -0
- package/dist/loader/loader.d.ts.map +1 -0
- package/dist/loader/loader.js +248 -0
- package/dist/loader/loader.js.map +1 -0
- package/dist/loader/register.d.ts +14 -0
- package/dist/loader/register.d.ts.map +1 -0
- package/dist/loader/register.js +20 -0
- package/dist/loader/register.js.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +13 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/index.public.d.ts +13 -0
- package/dist/plugins/index.public.d.ts.map +1 -0
- package/dist/plugins/index.public.js +13 -0
- package/dist/plugins/index.public.js.map +1 -0
- package/dist/plugins/types.d.ts +83 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +24 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/server/index.d.ts +33 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +42 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/tsserver.d.ts +28 -0
- package/dist/server/tsserver.d.ts.map +1 -0
- package/dist/server/tsserver.js +126 -0
- package/dist/server/tsserver.js.map +1 -0
- package/lib/lib.d.ts +20 -0
- package/lib/lib.decorators.d.ts +382 -0
- package/lib/lib.decorators.legacy.d.ts +20 -0
- package/lib/lib.dom.asynciterable.d.ts +18 -0
- package/lib/lib.dom.d.ts +45125 -0
- package/lib/lib.dom.iterable.d.ts +18 -0
- package/lib/lib.es2015.collection.d.ts +150 -0
- package/lib/lib.es2015.core.d.ts +595 -0
- package/lib/lib.es2015.d.ts +26 -0
- package/lib/lib.es2015.generator.d.ts +75 -0
- package/lib/lib.es2015.iterable.d.ts +603 -0
- package/lib/lib.es2015.promise.d.ts +79 -0
- package/lib/lib.es2015.proxy.d.ts +126 -0
- package/lib/lib.es2015.reflect.d.ts +142 -0
- package/lib/lib.es2015.symbol.d.ts +44 -0
- package/lib/lib.es2015.symbol.wellknown.d.ts +324 -0
- package/lib/lib.es2016.array.include.d.ts +114 -0
- package/lib/lib.es2016.d.ts +19 -0
- package/lib/lib.es2016.full.d.ts +21 -0
- package/lib/lib.es2016.intl.d.ts +29 -0
- package/lib/lib.es2017.arraybuffer.d.ts +19 -0
- package/lib/lib.es2017.d.ts +24 -0
- package/lib/lib.es2017.date.d.ts +29 -0
- package/lib/lib.es2017.full.d.ts +21 -0
- package/lib/lib.es2017.intl.d.ts +42 -0
- package/lib/lib.es2017.object.d.ts +47 -0
- package/lib/lib.es2017.sharedmemory.d.ts +133 -0
- package/lib/lib.es2017.string.d.ts +43 -0
- package/lib/lib.es2017.typedarrays.d.ts +51 -0
- package/lib/lib.es2018.asyncgenerator.d.ts +75 -0
- package/lib/lib.es2018.asynciterable.d.ts +51 -0
- package/lib/lib.es2018.d.ts +22 -0
- package/lib/lib.es2018.full.d.ts +22 -0
- package/lib/lib.es2018.intl.d.ts +81 -0
- package/lib/lib.es2018.promise.d.ts +28 -0
- package/lib/lib.es2018.regexp.d.ts +35 -0
- package/lib/lib.es2019.array.d.ts +77 -0
- package/lib/lib.es2019.d.ts +22 -0
- package/lib/lib.es2019.full.d.ts +22 -0
- package/lib/lib.es2019.intl.d.ts +21 -0
- package/lib/lib.es2019.object.d.ts +31 -0
- package/lib/lib.es2019.string.d.ts +35 -0
- package/lib/lib.es2019.symbol.d.ts +22 -0
- package/lib/lib.es2020.bigint.d.ts +763 -0
- package/lib/lib.es2020.d.ts +25 -0
- package/lib/lib.es2020.date.d.ts +40 -0
- package/lib/lib.es2020.full.d.ts +22 -0
- package/lib/lib.es2020.intl.d.ts +472 -0
- package/lib/lib.es2020.number.d.ts +26 -0
- package/lib/lib.es2020.promise.d.ts +45 -0
- package/lib/lib.es2020.sharedmemory.d.ts +97 -0
- package/lib/lib.es2020.string.d.ts +42 -0
- package/lib/lib.es2020.symbol.wellknown.d.ts +39 -0
- package/lib/lib.es2021.d.ts +21 -0
- package/lib/lib.es2021.full.d.ts +22 -0
- package/lib/lib.es2021.intl.d.ts +164 -0
- package/lib/lib.es2021.promise.d.ts +46 -0
- package/lib/lib.es2021.string.d.ts +31 -0
- package/lib/lib.es2021.weakref.d.ts +76 -0
- package/lib/lib.es2022.array.d.ts +119 -0
- package/lib/lib.es2022.d.ts +23 -0
- package/lib/lib.es2022.error.d.ts +73 -0
- package/lib/lib.es2022.full.d.ts +22 -0
- package/lib/lib.es2022.intl.d.ts +143 -0
- package/lib/lib.es2022.object.d.ts +24 -0
- package/lib/lib.es2022.regexp.d.ts +37 -0
- package/lib/lib.es2022.string.d.ts +23 -0
- package/lib/lib.es2023.array.d.ts +922 -0
- package/lib/lib.es2023.collection.d.ts +19 -0
- package/lib/lib.es2023.d.ts +20 -0
- package/lib/lib.es2023.full.d.ts +22 -0
- package/lib/lib.es2023.intl.d.ts +62 -0
- package/lib/lib.es2024.arraybuffer.d.ts +63 -0
- package/lib/lib.es2024.collection.d.ts +27 -0
- package/lib/lib.es2024.d.ts +24 -0
- package/lib/lib.es2024.full.d.ts +22 -0
- package/lib/lib.es2024.object.d.ts +27 -0
- package/lib/lib.es2024.promise.d.ts +33 -0
- package/lib/lib.es2024.regexp.d.ts +23 -0
- package/lib/lib.es2024.sharedmemory.d.ts +66 -0
- package/lib/lib.es2024.string.d.ts +27 -0
- package/lib/lib.es2025.collection.d.ts +94 -0
- package/lib/lib.es2025.d.ts +23 -0
- package/lib/lib.es2025.float16.d.ts +443 -0
- package/lib/lib.es2025.full.d.ts +22 -0
- package/lib/lib.es2025.intl.d.ts +200 -0
- package/lib/lib.es2025.iterator.d.ts +146 -0
- package/lib/lib.es2025.promise.d.ts +32 -0
- package/lib/lib.es2025.regexp.d.ts +30 -0
- package/lib/lib.es5.d.ts +4599 -0
- package/lib/lib.es6.d.ts +21 -0
- package/lib/lib.esnext.array.d.ts +33 -0
- package/lib/lib.esnext.collection.d.ts +47 -0
- package/lib/lib.esnext.d.ts +27 -0
- package/lib/lib.esnext.date.d.ts +21 -0
- package/lib/lib.esnext.decorators.d.ts +26 -0
- package/lib/lib.esnext.disposable.d.ts +191 -0
- package/lib/lib.esnext.error.d.ts +22 -0
- package/lib/lib.esnext.full.d.ts +22 -0
- package/lib/lib.esnext.intl.d.ts +107 -0
- package/lib/lib.esnext.sharedmemory.d.ts +23 -0
- package/lib/lib.esnext.temporal.d.ts +485 -0
- package/lib/lib.esnext.typedarrays.d.ts +90 -0
- package/lib/lib.scripthost.d.ts +320 -0
- package/lib/lib.webworker.asynciterable.d.ts +18 -0
- package/lib/lib.webworker.d.ts +15606 -0
- package/lib/lib.webworker.importscripts.d.ts +21 -0
- package/lib/lib.webworker.iterable.d.ts +18 -0
- package/lib/logger.js +144 -0
- package/lib/package.json +7 -0
- package/lib/tsserver.js +57 -0
- package/lib/tsserverlibrary.js +171 -0
- package/lib/typesMap.json +497 -0
- package/lib/typescript.js +373 -0
- package/package.json +115 -0
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMR Change Detector
|
|
3
|
+
*
|
|
4
|
+
* Analyzes two versions of TypeScript source code to determine:
|
|
5
|
+
* 1. Which services changed
|
|
6
|
+
* 2. What kind of changes occurred (method-only vs structural)
|
|
7
|
+
* 3. Which specific methods changed (for method patching)
|
|
8
|
+
*
|
|
9
|
+
* This enables the dev server to choose between:
|
|
10
|
+
* - method-patch: Only method bodies changed, can do in-place patching
|
|
11
|
+
* - full-reload: Structural changes, need full service reload with state migration
|
|
12
|
+
*/
|
|
13
|
+
import ts from 'typescript';
|
|
14
|
+
/**
|
|
15
|
+
* Detect changes between two versions of a source file.
|
|
16
|
+
*
|
|
17
|
+
* @param oldSource - Previous version of the source code
|
|
18
|
+
* @param newSource - New version of the source code
|
|
19
|
+
* @param fileName - File path (for service ID generation)
|
|
20
|
+
* @param baseDir - Base directory for relative paths
|
|
21
|
+
*/
|
|
22
|
+
export function detectChanges(oldSource, newSource, fileName, baseDir = process.cwd()) {
|
|
23
|
+
const oldServices = extractServiceSignatures(oldSource, fileName, baseDir);
|
|
24
|
+
const newServices = extractServiceSignatures(newSource, fileName, baseDir);
|
|
25
|
+
const result = {
|
|
26
|
+
hasChanges: false,
|
|
27
|
+
services: [],
|
|
28
|
+
added: [],
|
|
29
|
+
removed: [],
|
|
30
|
+
};
|
|
31
|
+
// Find added services
|
|
32
|
+
for (const [id] of newServices) {
|
|
33
|
+
if (!oldServices.has(id)) {
|
|
34
|
+
result.added.push(id);
|
|
35
|
+
result.hasChanges = true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Find removed services
|
|
39
|
+
for (const [id] of oldServices) {
|
|
40
|
+
if (!newServices.has(id)) {
|
|
41
|
+
result.removed.push(id);
|
|
42
|
+
result.hasChanges = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Compare existing services
|
|
46
|
+
for (const [id, newSig] of newServices) {
|
|
47
|
+
const oldSig = oldServices.get(id);
|
|
48
|
+
if (!oldSig)
|
|
49
|
+
continue; // Already handled as added
|
|
50
|
+
const change = compareServiceSignatures(oldSig, newSig);
|
|
51
|
+
if (change) {
|
|
52
|
+
result.services.push(change);
|
|
53
|
+
result.hasChanges = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Extract service signatures from source code.
|
|
60
|
+
*/
|
|
61
|
+
function extractServiceSignatures(source, fileName, baseDir) {
|
|
62
|
+
const sourceFile = ts.createSourceFile(fileName, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
63
|
+
const services = new Map();
|
|
64
|
+
const relativePath = getRelativePath(fileName, baseDir);
|
|
65
|
+
const visitor = (node) => {
|
|
66
|
+
if (ts.isClassDeclaration(node) && node.name) {
|
|
67
|
+
const className = node.name.text;
|
|
68
|
+
// Check if this class extends defineService
|
|
69
|
+
const extendsDefineService = node.heritageClauses?.some((clause) => clause.types.some((type) => {
|
|
70
|
+
if (ts.isCallExpression(type.expression)) {
|
|
71
|
+
const expr = type.expression.expression;
|
|
72
|
+
return ts.isIdentifier(expr) && expr.text === 'defineService';
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}));
|
|
76
|
+
if (extendsDefineService) {
|
|
77
|
+
const sig = extractSingleServiceSignature(node, className, relativePath);
|
|
78
|
+
if (sig) {
|
|
79
|
+
services.set(sig.id, sig);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
ts.forEachChild(node, visitor);
|
|
84
|
+
};
|
|
85
|
+
ts.forEachChild(sourceFile, visitor);
|
|
86
|
+
return services;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Extract signature for a single service class.
|
|
90
|
+
*/
|
|
91
|
+
function extractSingleServiceSignature(classNode, className, relativePath) {
|
|
92
|
+
const id = `${relativePath}#${className}`;
|
|
93
|
+
// Find the defineService call in heritage clause
|
|
94
|
+
const heritageClause = classNode.heritageClauses?.find((clause) => clause.types.some((type) => {
|
|
95
|
+
if (ts.isCallExpression(type.expression)) {
|
|
96
|
+
const expr = type.expression.expression;
|
|
97
|
+
return ts.isIdentifier(expr) && expr.text === 'defineService';
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}));
|
|
101
|
+
if (!heritageClause)
|
|
102
|
+
return null;
|
|
103
|
+
const defineServiceType = heritageClause.types.find((type) => {
|
|
104
|
+
if (ts.isCallExpression(type.expression)) {
|
|
105
|
+
const expr = type.expression.expression;
|
|
106
|
+
return ts.isIdentifier(expr) && expr.text === 'defineService';
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
});
|
|
110
|
+
if (!defineServiceType || !ts.isCallExpression(defineServiceType.expression)) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const callExpr = defineServiceType.expression;
|
|
114
|
+
const configArg = callExpr.arguments[0];
|
|
115
|
+
if (!configArg || !ts.isObjectLiteralExpression(configArg)) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
// Extract inject signature
|
|
119
|
+
let injectSignature = '';
|
|
120
|
+
let factoryNode = null;
|
|
121
|
+
let hasHotReload = false;
|
|
122
|
+
for (const prop of configArg.properties) {
|
|
123
|
+
if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {
|
|
124
|
+
if (prop.name.text === 'inject') {
|
|
125
|
+
injectSignature = normalizeNode(prop.initializer);
|
|
126
|
+
}
|
|
127
|
+
else if (prop.name.text === 'factory') {
|
|
128
|
+
if (ts.isArrowFunction(prop.initializer) ||
|
|
129
|
+
ts.isFunctionExpression(prop.initializer)) {
|
|
130
|
+
factoryNode = prop.initializer;
|
|
131
|
+
// Check for hotReload registration
|
|
132
|
+
hasHotReload = containsHotReloadRegistration(factoryNode.body);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (!factoryNode) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
// Extract method signatures and bodies from factory return
|
|
141
|
+
const { methods, methodBodies } = extractMethodsFromFactory(factoryNode);
|
|
142
|
+
return {
|
|
143
|
+
id,
|
|
144
|
+
className,
|
|
145
|
+
injectSignature,
|
|
146
|
+
methods,
|
|
147
|
+
methodBodies,
|
|
148
|
+
hasHotReload,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Extract method signatures and bodies from factory function.
|
|
153
|
+
*/
|
|
154
|
+
function extractMethodsFromFactory(factory) {
|
|
155
|
+
const methods = new Map();
|
|
156
|
+
const methodBodies = new Map();
|
|
157
|
+
// Find return statement in factory
|
|
158
|
+
const returnedObject = findReturnedObject(factory.body);
|
|
159
|
+
if (!returnedObject) {
|
|
160
|
+
return { methods, methodBodies };
|
|
161
|
+
}
|
|
162
|
+
for (const prop of returnedObject.properties) {
|
|
163
|
+
if (ts.isMethodDeclaration(prop) && ts.isIdentifier(prop.name)) {
|
|
164
|
+
const name = prop.name.text;
|
|
165
|
+
methods.set(name, getMethodSignature(prop));
|
|
166
|
+
methodBodies.set(name, normalizeNode(prop.body ?? prop));
|
|
167
|
+
}
|
|
168
|
+
else if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {
|
|
169
|
+
const name = prop.name.text;
|
|
170
|
+
if (ts.isArrowFunction(prop.initializer) ||
|
|
171
|
+
ts.isFunctionExpression(prop.initializer)) {
|
|
172
|
+
methods.set(name, getPropertyFunctionSignature(prop.initializer));
|
|
173
|
+
methodBodies.set(name, normalizeNode(prop.initializer.body));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else if (ts.isShorthandPropertyAssignment(prop) &&
|
|
177
|
+
ts.isIdentifier(prop.name)) {
|
|
178
|
+
// Shorthand like { myFunc } - we can't compare bodies easily
|
|
179
|
+
const name = prop.name.text;
|
|
180
|
+
methods.set(name, 'shorthand');
|
|
181
|
+
methodBodies.set(name, 'shorthand');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { methods, methodBodies };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Find the returned object literal in a factory body.
|
|
188
|
+
*/
|
|
189
|
+
function findReturnedObject(body) {
|
|
190
|
+
// Direct object return: () => ({ ... })
|
|
191
|
+
if (ts.isParenthesizedExpression(body)) {
|
|
192
|
+
const inner = body.expression;
|
|
193
|
+
if (ts.isObjectLiteralExpression(inner)) {
|
|
194
|
+
return inner;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (ts.isObjectLiteralExpression(body)) {
|
|
198
|
+
return body;
|
|
199
|
+
}
|
|
200
|
+
// Block with return statement
|
|
201
|
+
if (ts.isBlock(body)) {
|
|
202
|
+
for (const stmt of body.statements) {
|
|
203
|
+
if (ts.isReturnStatement(stmt) && stmt.expression) {
|
|
204
|
+
if (ts.isObjectLiteralExpression(stmt.expression)) {
|
|
205
|
+
return stmt.expression;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get signature of a method declaration (params + return type).
|
|
214
|
+
*/
|
|
215
|
+
function getMethodSignature(method) {
|
|
216
|
+
const params = method.parameters
|
|
217
|
+
.map((p) => {
|
|
218
|
+
const name = ts.isIdentifier(p.name) ? p.name.text : '?';
|
|
219
|
+
const type = p.type ? normalizeNode(p.type) : 'any';
|
|
220
|
+
return `${name}:${type}`;
|
|
221
|
+
})
|
|
222
|
+
.join(',');
|
|
223
|
+
const returnType = method.type ? normalizeNode(method.type) : 'any';
|
|
224
|
+
return `(${params})=>${returnType}`;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get signature of a function property (arrow/function expression).
|
|
228
|
+
*/
|
|
229
|
+
function getPropertyFunctionSignature(fn) {
|
|
230
|
+
const params = fn.parameters
|
|
231
|
+
.map((p) => {
|
|
232
|
+
const name = ts.isIdentifier(p.name) ? p.name.text : '?';
|
|
233
|
+
const type = p.type ? normalizeNode(p.type) : 'any';
|
|
234
|
+
return `${name}:${type}`;
|
|
235
|
+
})
|
|
236
|
+
.join(',');
|
|
237
|
+
const returnType = fn.type ? normalizeNode(fn.type) : 'any';
|
|
238
|
+
return `(${params})=>${returnType}`;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Check if a function body contains a hotReload registration.
|
|
242
|
+
*/
|
|
243
|
+
function containsHotReloadRegistration(body) {
|
|
244
|
+
let found = false;
|
|
245
|
+
const visitor = (node) => {
|
|
246
|
+
if (found)
|
|
247
|
+
return;
|
|
248
|
+
if (ts.isCallExpression(node)) {
|
|
249
|
+
const expr = node.expression;
|
|
250
|
+
if (ts.isPropertyAccessExpression(expr) &&
|
|
251
|
+
expr.name.text === 'register' &&
|
|
252
|
+
node.arguments.length >= 1) {
|
|
253
|
+
const hookArg = node.arguments[0];
|
|
254
|
+
if (ts.isStringLiteral(hookArg) && hookArg.text === 'hotReload') {
|
|
255
|
+
found = true;
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
ts.forEachChild(node, visitor);
|
|
261
|
+
};
|
|
262
|
+
if (ts.isBlock(body)) {
|
|
263
|
+
ts.forEachChild(body, visitor);
|
|
264
|
+
}
|
|
265
|
+
return found;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Compare two service signatures and determine what changed.
|
|
269
|
+
*/
|
|
270
|
+
function compareServiceSignatures(oldSig, newSig) {
|
|
271
|
+
// Check for structural changes that require full reload
|
|
272
|
+
if (oldSig.injectSignature !== newSig.injectSignature) {
|
|
273
|
+
return {
|
|
274
|
+
serviceId: newSig.id,
|
|
275
|
+
changeType: 'structural',
|
|
276
|
+
changedMethods: [],
|
|
277
|
+
reason: 'inject dependencies changed',
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Check if methods were added or removed
|
|
281
|
+
const oldMethods = new Set(oldSig.methods.keys());
|
|
282
|
+
const newMethods = new Set(newSig.methods.keys());
|
|
283
|
+
for (const name of newMethods) {
|
|
284
|
+
if (!oldMethods.has(name)) {
|
|
285
|
+
return {
|
|
286
|
+
serviceId: newSig.id,
|
|
287
|
+
changeType: 'structural',
|
|
288
|
+
changedMethods: [],
|
|
289
|
+
reason: `method added: ${name}`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
for (const name of oldMethods) {
|
|
294
|
+
if (!newMethods.has(name)) {
|
|
295
|
+
return {
|
|
296
|
+
serviceId: newSig.id,
|
|
297
|
+
changeType: 'structural',
|
|
298
|
+
changedMethods: [],
|
|
299
|
+
reason: `method removed: ${name}`,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Check if method signatures changed.
|
|
304
|
+
//
|
|
305
|
+
// This comparison includes TypeScript type annotations because normalizeNode
|
|
306
|
+
// uses getText() which preserves the original source text. This means a
|
|
307
|
+
// type-only change like (x: string) => void -> (x: number) => void IS
|
|
308
|
+
// detected as a structural change and triggers a full reload. This is
|
|
309
|
+
// intentionally conservative: while types are erased at runtime, a type
|
|
310
|
+
// change in a parameter often accompanies a semantic change in the method
|
|
311
|
+
// body or its callers. If this causes excessive full reloads in practice,
|
|
312
|
+
// the signature comparison could be relaxed to strip type annotations.
|
|
313
|
+
for (const [name, oldSigStr] of oldSig.methods) {
|
|
314
|
+
const newSigStr = newSig.methods.get(name);
|
|
315
|
+
if (oldSigStr !== newSigStr) {
|
|
316
|
+
return {
|
|
317
|
+
serviceId: newSig.id,
|
|
318
|
+
changeType: 'structural',
|
|
319
|
+
changedMethods: [],
|
|
320
|
+
reason: `method signature changed: ${name}`,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Check for method body changes (can use method-patch)
|
|
325
|
+
const changedMethods = [];
|
|
326
|
+
for (const [name, oldBody] of oldSig.methodBodies) {
|
|
327
|
+
const newBody = newSig.methodBodies.get(name);
|
|
328
|
+
if (oldBody !== newBody) {
|
|
329
|
+
changedMethods.push(name);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (changedMethods.length > 0) {
|
|
333
|
+
// If service doesn't have hotReload hook, we need full reload
|
|
334
|
+
if (!newSig.hasHotReload) {
|
|
335
|
+
return {
|
|
336
|
+
serviceId: newSig.id,
|
|
337
|
+
changeType: 'structural',
|
|
338
|
+
changedMethods: [],
|
|
339
|
+
reason: 'method body changed but no hotReload hook',
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
serviceId: newSig.id,
|
|
344
|
+
changeType: 'method-only',
|
|
345
|
+
changedMethods,
|
|
346
|
+
reason: `method bodies changed: ${changedMethods.join(', ')}`,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// No changes
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Normalize a node to a string for comparison.
|
|
354
|
+
* Strips whitespace and formatting differences.
|
|
355
|
+
*/
|
|
356
|
+
function normalizeNode(node) {
|
|
357
|
+
// Get the source file from the node itself
|
|
358
|
+
const sourceFile = node.getSourceFile();
|
|
359
|
+
if (sourceFile) {
|
|
360
|
+
// Use getText() which extracts from the original source
|
|
361
|
+
try {
|
|
362
|
+
return node.getText(sourceFile).replace(/\s+/g, ' ').trim();
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
// Fall through to printer approach
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Fallback: use printer for synthesized nodes
|
|
369
|
+
const printer = ts.createPrinter({
|
|
370
|
+
newLine: ts.NewLineKind.LineFeed,
|
|
371
|
+
removeComments: true,
|
|
372
|
+
});
|
|
373
|
+
const dummySourceFile = ts.createSourceFile('temp.ts', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
|
|
374
|
+
return printer
|
|
375
|
+
.printNode(ts.EmitHint.Unspecified, node, dummySourceFile)
|
|
376
|
+
.replace(/\s+/g, ' ')
|
|
377
|
+
.trim();
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Get relative path for service ID.
|
|
381
|
+
*/
|
|
382
|
+
function getRelativePath(fileName, baseDir) {
|
|
383
|
+
if (fileName.startsWith(baseDir)) {
|
|
384
|
+
return fileName.slice(baseDir.length).replace(/^\//, '');
|
|
385
|
+
}
|
|
386
|
+
return fileName;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Quick check if a file might contain services.
|
|
390
|
+
* Use this for early filtering in file watchers.
|
|
391
|
+
*/
|
|
392
|
+
export function mightContainServices(source) {
|
|
393
|
+
return source.includes('defineService');
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=hmr-change-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr-change-detector.js","sourceRoot":"","sources":["../../src/compiler/hmr-change-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMR (Hot Module Replacement) Transformer
|
|
3
|
+
*
|
|
4
|
+
* TypeScript transformer that enables hot reload for JustScale services.
|
|
5
|
+
*
|
|
6
|
+
* Transforms:
|
|
7
|
+
* 1. Injects stable service IDs into defineService() calls
|
|
8
|
+
* 2. Wraps factory functions with HMR state injection
|
|
9
|
+
* 3. Rewrites variable initializers to use HMR state
|
|
10
|
+
*
|
|
11
|
+
* Example transformation:
|
|
12
|
+
*
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // Input
|
|
15
|
+
* class CacheService extends defineService({
|
|
16
|
+
* inject: { lifecycle: Lifecycle },
|
|
17
|
+
* factory: ({ lifecycle }) => {
|
|
18
|
+
* const cache = new Map()
|
|
19
|
+
* lifecycle.register('hotReload', () => ({ cache }))
|
|
20
|
+
* return { get: (k) => cache.get(k) }
|
|
21
|
+
* }
|
|
22
|
+
* }) {}
|
|
23
|
+
*
|
|
24
|
+
* // Output
|
|
25
|
+
* class CacheService extends defineService({
|
|
26
|
+
* __serviceId: 'src/services/cache.ts#CacheService',
|
|
27
|
+
* inject: { lifecycle: Lifecycle },
|
|
28
|
+
* factory: ((__hmr) =>
|
|
29
|
+
* ({ lifecycle }) => {
|
|
30
|
+
* const cache = __hmr?.cache ?? new Map()
|
|
31
|
+
* lifecycle.register('hotReload', () => ({ cache }))
|
|
32
|
+
* return { get: (k) => cache.get(k) }
|
|
33
|
+
* }
|
|
34
|
+
* )(__getHmrState('src/services/cache.ts#CacheService'))
|
|
35
|
+
* }) {}
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
import ts from 'typescript';
|
|
39
|
+
export interface HmrTransformerOptions {
|
|
40
|
+
/** Enable verbose logging */
|
|
41
|
+
verbose?: boolean;
|
|
42
|
+
/** Base directory for relative paths (defaults to cwd) */
|
|
43
|
+
baseDir?: string;
|
|
44
|
+
/** Whether to enable HMR transforms (default: true in dev mode) */
|
|
45
|
+
enabled?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Creates a TypeScript transformer for HMR support.
|
|
49
|
+
*
|
|
50
|
+
* This should be used in dev mode only. In production builds,
|
|
51
|
+
* set enabled: false to skip all HMR transforms.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createHmrTransformer(program: ts.Program, options?: HmrTransformerOptions): ts.TransformerFactory<ts.SourceFile>;
|
|
54
|
+
//# sourceMappingURL=hmr-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr-transformer.d.ts","sourceRoot":"","sources":["../../src/compiler/hmr-transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAoE5B,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,OAAO,GAAE,qBAA0B,GAClC,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,UAAU,CAAC,CA0EtC"}
|