@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.
Files changed (245) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/api.d.ts +144 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +380 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/compiler/analyzer.d.ts +247 -0
  8. package/dist/compiler/analyzer.d.ts.map +1 -0
  9. package/dist/compiler/analyzer.js +3201 -0
  10. package/dist/compiler/analyzer.js.map +1 -0
  11. package/dist/compiler/cli.d.ts +12 -0
  12. package/dist/compiler/cli.d.ts.map +1 -0
  13. package/dist/compiler/cli.js +209 -0
  14. package/dist/compiler/cli.js.map +1 -0
  15. package/dist/compiler/compile.d.ts +26 -0
  16. package/dist/compiler/compile.d.ts.map +1 -0
  17. package/dist/compiler/compile.js +121 -0
  18. package/dist/compiler/compile.js.map +1 -0
  19. package/dist/compiler/errors.d.ts +336 -0
  20. package/dist/compiler/errors.d.ts.map +1 -0
  21. package/dist/compiler/errors.js +466 -0
  22. package/dist/compiler/errors.js.map +1 -0
  23. package/dist/compiler/exports-prepass.d.ts +31 -0
  24. package/dist/compiler/exports-prepass.d.ts.map +1 -0
  25. package/dist/compiler/exports-prepass.js +249 -0
  26. package/dist/compiler/exports-prepass.js.map +1 -0
  27. package/dist/compiler/hmr-change-detector.d.ts +47 -0
  28. package/dist/compiler/hmr-change-detector.d.ts.map +1 -0
  29. package/dist/compiler/hmr-change-detector.js +395 -0
  30. package/dist/compiler/hmr-change-detector.js.map +1 -0
  31. package/dist/compiler/hmr-transformer.d.ts +54 -0
  32. package/dist/compiler/hmr-transformer.d.ts.map +1 -0
  33. package/dist/compiler/hmr-transformer.js +535 -0
  34. package/dist/compiler/hmr-transformer.js.map +1 -0
  35. package/dist/compiler/index.d.ts +19 -0
  36. package/dist/compiler/index.d.ts.map +1 -0
  37. package/dist/compiler/index.js +16 -0
  38. package/dist/compiler/index.js.map +1 -0
  39. package/dist/compiler/primitive-detector.d.ts +70 -0
  40. package/dist/compiler/primitive-detector.d.ts.map +1 -0
  41. package/dist/compiler/primitive-detector.js +338 -0
  42. package/dist/compiler/primitive-detector.js.map +1 -0
  43. package/dist/compiler/ptsc.d.ts +40 -0
  44. package/dist/compiler/ptsc.d.ts.map +1 -0
  45. package/dist/compiler/ptsc.js +462 -0
  46. package/dist/compiler/ptsc.js.map +1 -0
  47. package/dist/compiler/rewriter.d.ts +96 -0
  48. package/dist/compiler/rewriter.d.ts.map +1 -0
  49. package/dist/compiler/rewriter.js +418 -0
  50. package/dist/compiler/rewriter.js.map +1 -0
  51. package/dist/compiler/step-hash.d.ts +43 -0
  52. package/dist/compiler/step-hash.d.ts.map +1 -0
  53. package/dist/compiler/step-hash.js +83 -0
  54. package/dist/compiler/step-hash.js.map +1 -0
  55. package/dist/compiler/switch-codegen.d.ts +84 -0
  56. package/dist/compiler/switch-codegen.d.ts.map +1 -0
  57. package/dist/compiler/switch-codegen.js +1540 -0
  58. package/dist/compiler/switch-codegen.js.map +1 -0
  59. package/dist/compiler/transformer.d.ts +29 -0
  60. package/dist/compiler/transformer.d.ts.map +1 -0
  61. package/dist/compiler/transformer.js +216 -0
  62. package/dist/compiler/transformer.js.map +1 -0
  63. package/dist/config/index.d.ts +122 -0
  64. package/dist/config/index.d.ts.map +1 -0
  65. package/dist/config/index.js +215 -0
  66. package/dist/config/index.js.map +1 -0
  67. package/dist/di-errors/formatter.d.ts +126 -0
  68. package/dist/di-errors/formatter.d.ts.map +1 -0
  69. package/dist/di-errors/formatter.js +384 -0
  70. package/dist/di-errors/formatter.js.map +1 -0
  71. package/dist/di-errors/index.d.ts +5 -0
  72. package/dist/di-errors/index.d.ts.map +1 -0
  73. package/dist/di-errors/index.js +13 -0
  74. package/dist/di-errors/index.js.map +1 -0
  75. package/dist/editor.d.ts +11 -0
  76. package/dist/editor.d.ts.map +1 -0
  77. package/dist/editor.js +2 -0
  78. package/dist/editor.js.map +1 -0
  79. package/dist/index.d.ts +35 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +40 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/language-service/index.d.ts +52 -0
  84. package/dist/language-service/index.d.ts.map +1 -0
  85. package/dist/language-service/index.js +366 -0
  86. package/dist/language-service/index.js.map +1 -0
  87. package/dist/language-service/process-quick-fixes.d.ts +20 -0
  88. package/dist/language-service/process-quick-fixes.d.ts.map +1 -0
  89. package/dist/language-service/process-quick-fixes.js +114 -0
  90. package/dist/language-service/process-quick-fixes.js.map +1 -0
  91. package/dist/language-service/quick-fix-discovery.d.ts +39 -0
  92. package/dist/language-service/quick-fix-discovery.d.ts.map +1 -0
  93. package/dist/language-service/quick-fix-discovery.js +124 -0
  94. package/dist/language-service/quick-fix-discovery.js.map +1 -0
  95. package/dist/loader/incremental.d.ts +50 -0
  96. package/dist/loader/incremental.d.ts.map +1 -0
  97. package/dist/loader/incremental.js +151 -0
  98. package/dist/loader/incremental.js.map +1 -0
  99. package/dist/loader/index.d.ts +25 -0
  100. package/dist/loader/index.d.ts.map +1 -0
  101. package/dist/loader/index.js +24 -0
  102. package/dist/loader/index.js.map +1 -0
  103. package/dist/loader/loader.d.ts +52 -0
  104. package/dist/loader/loader.d.ts.map +1 -0
  105. package/dist/loader/loader.js +248 -0
  106. package/dist/loader/loader.js.map +1 -0
  107. package/dist/loader/register.d.ts +14 -0
  108. package/dist/loader/register.d.ts.map +1 -0
  109. package/dist/loader/register.js +20 -0
  110. package/dist/loader/register.js.map +1 -0
  111. package/dist/plugins/index.d.ts +13 -0
  112. package/dist/plugins/index.d.ts.map +1 -0
  113. package/dist/plugins/index.js +13 -0
  114. package/dist/plugins/index.js.map +1 -0
  115. package/dist/plugins/index.public.d.ts +13 -0
  116. package/dist/plugins/index.public.d.ts.map +1 -0
  117. package/dist/plugins/index.public.js +13 -0
  118. package/dist/plugins/index.public.js.map +1 -0
  119. package/dist/plugins/types.d.ts +83 -0
  120. package/dist/plugins/types.d.ts.map +1 -0
  121. package/dist/plugins/types.js +24 -0
  122. package/dist/plugins/types.js.map +1 -0
  123. package/dist/server/index.d.ts +33 -0
  124. package/dist/server/index.d.ts.map +1 -0
  125. package/dist/server/index.js +42 -0
  126. package/dist/server/index.js.map +1 -0
  127. package/dist/server/tsserver.d.ts +28 -0
  128. package/dist/server/tsserver.d.ts.map +1 -0
  129. package/dist/server/tsserver.js +126 -0
  130. package/dist/server/tsserver.js.map +1 -0
  131. package/lib/lib.d.ts +20 -0
  132. package/lib/lib.decorators.d.ts +382 -0
  133. package/lib/lib.decorators.legacy.d.ts +20 -0
  134. package/lib/lib.dom.asynciterable.d.ts +18 -0
  135. package/lib/lib.dom.d.ts +45125 -0
  136. package/lib/lib.dom.iterable.d.ts +18 -0
  137. package/lib/lib.es2015.collection.d.ts +150 -0
  138. package/lib/lib.es2015.core.d.ts +595 -0
  139. package/lib/lib.es2015.d.ts +26 -0
  140. package/lib/lib.es2015.generator.d.ts +75 -0
  141. package/lib/lib.es2015.iterable.d.ts +603 -0
  142. package/lib/lib.es2015.promise.d.ts +79 -0
  143. package/lib/lib.es2015.proxy.d.ts +126 -0
  144. package/lib/lib.es2015.reflect.d.ts +142 -0
  145. package/lib/lib.es2015.symbol.d.ts +44 -0
  146. package/lib/lib.es2015.symbol.wellknown.d.ts +324 -0
  147. package/lib/lib.es2016.array.include.d.ts +114 -0
  148. package/lib/lib.es2016.d.ts +19 -0
  149. package/lib/lib.es2016.full.d.ts +21 -0
  150. package/lib/lib.es2016.intl.d.ts +29 -0
  151. package/lib/lib.es2017.arraybuffer.d.ts +19 -0
  152. package/lib/lib.es2017.d.ts +24 -0
  153. package/lib/lib.es2017.date.d.ts +29 -0
  154. package/lib/lib.es2017.full.d.ts +21 -0
  155. package/lib/lib.es2017.intl.d.ts +42 -0
  156. package/lib/lib.es2017.object.d.ts +47 -0
  157. package/lib/lib.es2017.sharedmemory.d.ts +133 -0
  158. package/lib/lib.es2017.string.d.ts +43 -0
  159. package/lib/lib.es2017.typedarrays.d.ts +51 -0
  160. package/lib/lib.es2018.asyncgenerator.d.ts +75 -0
  161. package/lib/lib.es2018.asynciterable.d.ts +51 -0
  162. package/lib/lib.es2018.d.ts +22 -0
  163. package/lib/lib.es2018.full.d.ts +22 -0
  164. package/lib/lib.es2018.intl.d.ts +81 -0
  165. package/lib/lib.es2018.promise.d.ts +28 -0
  166. package/lib/lib.es2018.regexp.d.ts +35 -0
  167. package/lib/lib.es2019.array.d.ts +77 -0
  168. package/lib/lib.es2019.d.ts +22 -0
  169. package/lib/lib.es2019.full.d.ts +22 -0
  170. package/lib/lib.es2019.intl.d.ts +21 -0
  171. package/lib/lib.es2019.object.d.ts +31 -0
  172. package/lib/lib.es2019.string.d.ts +35 -0
  173. package/lib/lib.es2019.symbol.d.ts +22 -0
  174. package/lib/lib.es2020.bigint.d.ts +763 -0
  175. package/lib/lib.es2020.d.ts +25 -0
  176. package/lib/lib.es2020.date.d.ts +40 -0
  177. package/lib/lib.es2020.full.d.ts +22 -0
  178. package/lib/lib.es2020.intl.d.ts +472 -0
  179. package/lib/lib.es2020.number.d.ts +26 -0
  180. package/lib/lib.es2020.promise.d.ts +45 -0
  181. package/lib/lib.es2020.sharedmemory.d.ts +97 -0
  182. package/lib/lib.es2020.string.d.ts +42 -0
  183. package/lib/lib.es2020.symbol.wellknown.d.ts +39 -0
  184. package/lib/lib.es2021.d.ts +21 -0
  185. package/lib/lib.es2021.full.d.ts +22 -0
  186. package/lib/lib.es2021.intl.d.ts +164 -0
  187. package/lib/lib.es2021.promise.d.ts +46 -0
  188. package/lib/lib.es2021.string.d.ts +31 -0
  189. package/lib/lib.es2021.weakref.d.ts +76 -0
  190. package/lib/lib.es2022.array.d.ts +119 -0
  191. package/lib/lib.es2022.d.ts +23 -0
  192. package/lib/lib.es2022.error.d.ts +73 -0
  193. package/lib/lib.es2022.full.d.ts +22 -0
  194. package/lib/lib.es2022.intl.d.ts +143 -0
  195. package/lib/lib.es2022.object.d.ts +24 -0
  196. package/lib/lib.es2022.regexp.d.ts +37 -0
  197. package/lib/lib.es2022.string.d.ts +23 -0
  198. package/lib/lib.es2023.array.d.ts +922 -0
  199. package/lib/lib.es2023.collection.d.ts +19 -0
  200. package/lib/lib.es2023.d.ts +20 -0
  201. package/lib/lib.es2023.full.d.ts +22 -0
  202. package/lib/lib.es2023.intl.d.ts +62 -0
  203. package/lib/lib.es2024.arraybuffer.d.ts +63 -0
  204. package/lib/lib.es2024.collection.d.ts +27 -0
  205. package/lib/lib.es2024.d.ts +24 -0
  206. package/lib/lib.es2024.full.d.ts +22 -0
  207. package/lib/lib.es2024.object.d.ts +27 -0
  208. package/lib/lib.es2024.promise.d.ts +33 -0
  209. package/lib/lib.es2024.regexp.d.ts +23 -0
  210. package/lib/lib.es2024.sharedmemory.d.ts +66 -0
  211. package/lib/lib.es2024.string.d.ts +27 -0
  212. package/lib/lib.es2025.collection.d.ts +94 -0
  213. package/lib/lib.es2025.d.ts +23 -0
  214. package/lib/lib.es2025.float16.d.ts +443 -0
  215. package/lib/lib.es2025.full.d.ts +22 -0
  216. package/lib/lib.es2025.intl.d.ts +200 -0
  217. package/lib/lib.es2025.iterator.d.ts +146 -0
  218. package/lib/lib.es2025.promise.d.ts +32 -0
  219. package/lib/lib.es2025.regexp.d.ts +30 -0
  220. package/lib/lib.es5.d.ts +4599 -0
  221. package/lib/lib.es6.d.ts +21 -0
  222. package/lib/lib.esnext.array.d.ts +33 -0
  223. package/lib/lib.esnext.collection.d.ts +47 -0
  224. package/lib/lib.esnext.d.ts +27 -0
  225. package/lib/lib.esnext.date.d.ts +21 -0
  226. package/lib/lib.esnext.decorators.d.ts +26 -0
  227. package/lib/lib.esnext.disposable.d.ts +191 -0
  228. package/lib/lib.esnext.error.d.ts +22 -0
  229. package/lib/lib.esnext.full.d.ts +22 -0
  230. package/lib/lib.esnext.intl.d.ts +107 -0
  231. package/lib/lib.esnext.sharedmemory.d.ts +23 -0
  232. package/lib/lib.esnext.temporal.d.ts +485 -0
  233. package/lib/lib.esnext.typedarrays.d.ts +90 -0
  234. package/lib/lib.scripthost.d.ts +320 -0
  235. package/lib/lib.webworker.asynciterable.d.ts +18 -0
  236. package/lib/lib.webworker.d.ts +15606 -0
  237. package/lib/lib.webworker.importscripts.d.ts +21 -0
  238. package/lib/lib.webworker.iterable.d.ts +18 -0
  239. package/lib/logger.js +144 -0
  240. package/lib/package.json +7 -0
  241. package/lib/tsserver.js +57 -0
  242. package/lib/tsserverlibrary.js +171 -0
  243. package/lib/typesMap.json +497 -0
  244. package/lib/typescript.js +373 -0
  245. 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"}