@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,418 @@
1
+ /**
2
+ * @justscale/core/process - AST Rewriter
3
+ *
4
+ * Rewrites variable references in block bodies to use state.vars and services.
5
+ *
6
+ * Transforms:
7
+ * - Handler params (orderId) -> state.vars.orderId
8
+ * - Injected services (payments) -> services.payments
9
+ * - Local variables (payment) -> state.vars.payment
10
+ * - Using variables (order) -> state.vars.order (rehydrated before block)
11
+ */
12
+ import ts from 'typescript';
13
+ /**
14
+ * Rewrite a statement to use state.vars and services.
15
+ * Preserves source positions for accurate source maps.
16
+ */
17
+ export function rewriteStatement(factory, stmt, ctx) {
18
+ const visitor = createRewriteVisitor(factory, ctx);
19
+ const result = ts.visitNode(stmt, visitor);
20
+ // Preserve source position from original statement for source maps
21
+ return ts.setTextRange(result, stmt);
22
+ }
23
+ /**
24
+ * Rewrite an expression to use state.vars and services.
25
+ * Preserves source positions for accurate source maps.
26
+ */
27
+ export function rewriteExpression(factory, expr, ctx) {
28
+ const visitor = createRewriteVisitor(factory, ctx);
29
+ const result = ts.visitNode(expr, visitor);
30
+ // Preserve source position from original expression for source maps
31
+ return ts.setTextRange(result, expr);
32
+ }
33
+ /**
34
+ * Build a derived RewriterContext that removes the given names from all
35
+ * rewrite sets. Used when descending into a nested scope (function
36
+ * parameters, catch clause variable, for-of/in loop variable) where those
37
+ * names shadow the outer rewrite targets.
38
+ */
39
+ function withShadowed(ctx, shadowed) {
40
+ if (shadowed.size === 0)
41
+ return ctx;
42
+ const subtract = (s) => {
43
+ const out = new Set();
44
+ for (const v of s)
45
+ if (!shadowed.has(v))
46
+ out.add(v);
47
+ return out;
48
+ };
49
+ const subtractMap = (m) => {
50
+ const out = new Map();
51
+ for (const [k, v] of m)
52
+ if (!shadowed.has(k))
53
+ out.set(k, v);
54
+ return out;
55
+ };
56
+ return {
57
+ paramVars: subtract(ctx.paramVars),
58
+ paramAliases: subtractMap(ctx.paramAliases),
59
+ serviceVars: subtract(ctx.serviceVars),
60
+ localVars: subtract(ctx.localVars),
61
+ usingVars: subtract(ctx.usingVars),
62
+ raceVars: subtract(ctx.raceVars),
63
+ blockLocalVars: ctx.blockLocalVars ? subtract(ctx.blockLocalVars) : undefined,
64
+ breakTarget: ctx.breakTarget,
65
+ continueTarget: ctx.continueTarget,
66
+ };
67
+ }
68
+ /**
69
+ * Collect parameter binding names from a function-like node.
70
+ */
71
+ function collectParameterNames(params) {
72
+ const names = new Set();
73
+ for (const p of params) {
74
+ extractBindingNames(p.name, names);
75
+ }
76
+ return names;
77
+ }
78
+ /**
79
+ * Create a visitor that rewrites variable references.
80
+ */
81
+ function createRewriteVisitor(factory, ctx) {
82
+ const visitor = (node) => {
83
+ // Preserve literals unchanged - they don't need rewriting and visitEachChild
84
+ // can corrupt them when no proper transformation context is provided
85
+ // Note: We create new literals to ensure they have proper node structure for printing
86
+ if (ts.isStringLiteral(node)) {
87
+ return factory.createStringLiteral(node.text);
88
+ }
89
+ if (ts.isNumericLiteral(node)) {
90
+ return factory.createNumericLiteral(node.text);
91
+ }
92
+ if (ts.isNoSubstitutionTemplateLiteral(node)) {
93
+ return factory.createNoSubstitutionTemplateLiteral(node.text, node.rawText);
94
+ }
95
+ if (node.kind === ts.SyntaxKind.TrueKeyword) {
96
+ return factory.createTrue();
97
+ }
98
+ if (node.kind === ts.SyntaxKind.FalseKeyword) {
99
+ return factory.createFalse();
100
+ }
101
+ if (node.kind === ts.SyntaxKind.NullKeyword) {
102
+ return factory.createNull();
103
+ }
104
+ // Nested function-like scopes: parameter bindings shadow outer locals.
105
+ // Build a sub-context with those names removed and recurse with a fresh
106
+ // visitor so neither the parameter declaration sites NOR body references
107
+ // to the shadowed names get rewritten to state.vars.* / services.*.
108
+ if (ts.isFunctionDeclaration(node) ||
109
+ ts.isFunctionExpression(node) ||
110
+ ts.isArrowFunction(node) ||
111
+ ts.isMethodDeclaration(node) ||
112
+ ts.isConstructorDeclaration(node) ||
113
+ ts.isGetAccessorDeclaration(node) ||
114
+ ts.isSetAccessorDeclaration(node)) {
115
+ const shadowed = collectParameterNames(node.parameters);
116
+ if (shadowed.size > 0) {
117
+ const subVisitor = createRewriteVisitor(factory, withShadowed(ctx, shadowed));
118
+ return ts.visitEachChild(node, subVisitor, undefined);
119
+ }
120
+ }
121
+ // for-of / for-in: the loop variable shadows outer names inside the
122
+ // body. The iterable expression evaluates in OUTER scope so it must
123
+ // not see the shadowing.
124
+ if (ts.isForOfStatement(node) || ts.isForInStatement(node)) {
125
+ const init = node.initializer;
126
+ if (init && ts.isVariableDeclarationList(init)) {
127
+ const shadowed = new Set();
128
+ for (const decl of init.declarations) {
129
+ extractBindingNames(decl.name, shadowed);
130
+ }
131
+ if (shadowed.size > 0) {
132
+ const subVisitor = createRewriteVisitor(factory, withShadowed(ctx, shadowed));
133
+ const newExpr = ts.visitNode(node.expression, visitor);
134
+ const newInit = ts.visitNode(node.initializer, subVisitor);
135
+ const newStmt = ts.visitNode(node.statement, subVisitor);
136
+ return ts.isForOfStatement(node)
137
+ ? factory.updateForOfStatement(node, node.awaitModifier, newInit, newExpr, newStmt)
138
+ : factory.updateForInStatement(node, newInit, newExpr, newStmt);
139
+ }
140
+ }
141
+ }
142
+ // Catch clause: the bound variable shadows outer names inside the block.
143
+ if (ts.isCatchClause(node) && node.variableDeclaration) {
144
+ const shadowed = new Set();
145
+ extractBindingNames(node.variableDeclaration.name, shadowed);
146
+ if (shadowed.size > 0) {
147
+ const subVisitor = createRewriteVisitor(factory, withShadowed(ctx, shadowed));
148
+ return ts.visitEachChild(node, subVisitor, undefined);
149
+ }
150
+ }
151
+ // Rewrite identifiers
152
+ if (ts.isIdentifier(node)) {
153
+ const name = node.text;
154
+ // Don't rewrite if it's a property name (handled by parent)
155
+ if (isPropertyName(node)) {
156
+ return node;
157
+ }
158
+ // Block-local variables - declared in this block, don't rewrite
159
+ if (ctx.blockLocalVars?.has(name)) {
160
+ return node;
161
+ }
162
+ // Service variable -> services.xxx
163
+ if (ctx.serviceVars.has(name)) {
164
+ return factory.createPropertyAccessExpression(factory.createIdentifier('services'), name);
165
+ }
166
+ // Param variable -> state.vars.xxx (using alias if renamed via destructuring)
167
+ if (ctx.paramVars.has(name)) {
168
+ const varName = ctx.paramAliases.get(name) ?? name;
169
+ return factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier('state'), 'vars'), varName);
170
+ }
171
+ // Race variable -> __raceResult (must check before localVars since r might be in both)
172
+ // Race variables (from const r = race()) hold the race result after resumption
173
+ if (ctx.raceVars?.has(name)) {
174
+ return factory.createIdentifier('__raceResult');
175
+ }
176
+ // Local variable -> state.vars.xxx
177
+ if (ctx.localVars.has(name)) {
178
+ return factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier('state'), 'vars'), name);
179
+ }
180
+ // Using variable -> keep as local variable (declared with let at function scope)
181
+ // These are rehydrated at resume points and accessed directly, not via state.vars
182
+ if (ctx.usingVars.has(name)) {
183
+ return node; // Keep as-is, it's a local variable
184
+ }
185
+ }
186
+ // Handle destructuring in variable declarations
187
+ if (ts.isVariableDeclaration(node)) {
188
+ // Skip rewriting the binding pattern itself
189
+ // Only rewrite the initializer
190
+ if (node.initializer) {
191
+ const newInitializer = ts.visitNode(node.initializer, visitor);
192
+ return factory.updateVariableDeclaration(node, node.name, node.exclamationToken, node.type, newInitializer);
193
+ }
194
+ return node;
195
+ }
196
+ // Handle shorthand property assignments: { orderId } -> { orderId: state.vars.orderId }
197
+ if (ts.isShorthandPropertyAssignment(node)) {
198
+ const name = node.name.text;
199
+ // Using vars are local, keep shorthand as-is (will reference local var)
200
+ if (ctx.usingVars.has(name)) {
201
+ return node;
202
+ }
203
+ if (ctx.paramVars.has(name) || ctx.localVars.has(name)) {
204
+ const varName = ctx.paramVars.has(name) ? (ctx.paramAliases.get(name) ?? name) : name;
205
+ return factory.createPropertyAssignment(node.name, factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier('state'), 'vars'), varName));
206
+ }
207
+ if (ctx.serviceVars.has(name)) {
208
+ return factory.createPropertyAssignment(node.name, factory.createPropertyAccessExpression(factory.createIdentifier('services'), name));
209
+ }
210
+ }
211
+ return ts.visitEachChild(node, visitor, undefined);
212
+ };
213
+ return visitor;
214
+ }
215
+ /**
216
+ * Check if an identifier is being used as a property name.
217
+ */
218
+ function isPropertyName(node) {
219
+ const parent = node.parent;
220
+ // Cloned/synthesized nodes may not have parents
221
+ if (!parent) {
222
+ return false;
223
+ }
224
+ // Property access: obj.prop - don't rewrite 'prop'
225
+ if (ts.isPropertyAccessExpression(parent) && parent.name === node) {
226
+ return true;
227
+ }
228
+ // Property assignment: { prop: value } - don't rewrite 'prop'
229
+ if (ts.isPropertyAssignment(parent) && parent.name === node) {
230
+ return true;
231
+ }
232
+ // Method declaration: method() {} - don't rewrite 'method'
233
+ if (ts.isMethodDeclaration(parent) && parent.name === node) {
234
+ return true;
235
+ }
236
+ return false;
237
+ }
238
+ /**
239
+ * Extract param variable names from handler parameters.
240
+ *
241
+ * Handles both tuple and object destructuring:
242
+ * handler(deps, [orderId]) -> paramVars: {orderId}, aliases: {}
243
+ * handler(deps, { order: orderId }) -> paramVars: {orderId}, aliases: {orderId -> order}
244
+ *
245
+ * The aliases map local names to the param names from the path.
246
+ * The rewriter uses aliases to access state.vars[paramName] instead of state.vars[localName].
247
+ */
248
+ export function extractParamVars(handler) {
249
+ const params = new Set();
250
+ const paramsParam = handler.parameters[1];
251
+ if (paramsParam) {
252
+ extractBindingNames(paramsParam.name, params);
253
+ }
254
+ return params;
255
+ }
256
+ /**
257
+ * Extract param aliases from object destructuring rename patterns.
258
+ *
259
+ * For `{ user: userId }`, returns Map { "userId" -> "user" }.
260
+ * The rewriter uses this to access `state.vars.user` when it sees `userId`.
261
+ */
262
+ export function extractParamAliases(handler) {
263
+ const aliases = new Map();
264
+ const paramsParam = handler.parameters[1];
265
+ if (!paramsParam)
266
+ return aliases;
267
+ const binding = paramsParam.name;
268
+ if (!ts.isObjectBindingPattern(binding))
269
+ return aliases;
270
+ for (const element of binding.elements) {
271
+ if (!ts.isBindingElement(element))
272
+ continue;
273
+ // { user: userId } - propertyName is "user", name is "userId"
274
+ if (element.propertyName && ts.isIdentifier(element.propertyName) && ts.isIdentifier(element.name)) {
275
+ aliases.set(element.name.text, element.propertyName.text);
276
+ }
277
+ }
278
+ return aliases;
279
+ }
280
+ /**
281
+ * Extract service variable names from handler parameters.
282
+ *
283
+ * Handles: async handler({ payments, shipping }, [...])
284
+ */
285
+ export function extractServiceVars(handler) {
286
+ const services = new Set();
287
+ // First parameter is the deps object: { payments, shipping }
288
+ const depsParam = handler.parameters[0];
289
+ if (depsParam) {
290
+ extractBindingNames(depsParam.name, services);
291
+ }
292
+ return services;
293
+ }
294
+ /**
295
+ * Extract variable names from a binding pattern.
296
+ */
297
+ function extractBindingNames(name, result) {
298
+ if (ts.isIdentifier(name)) {
299
+ result.add(name.text);
300
+ }
301
+ else if (ts.isObjectBindingPattern(name)) {
302
+ for (const element of name.elements) {
303
+ if (ts.isBindingElement(element)) {
304
+ extractBindingNames(element.name, result);
305
+ }
306
+ }
307
+ }
308
+ else if (ts.isArrayBindingPattern(name)) {
309
+ for (const element of name.elements) {
310
+ if (ts.isBindingElement(element)) {
311
+ extractBindingNames(element.name, result);
312
+ }
313
+ }
314
+ }
315
+ }
316
+ /**
317
+ * Extract all variable names declared in a list of statements.
318
+ * Used to identify block-local variables that shouldn't be rewritten.
319
+ */
320
+ export function extractDeclaredVars(statements) {
321
+ const vars = new Set();
322
+ for (const stmt of statements) {
323
+ if (ts.isVariableStatement(stmt)) {
324
+ for (const decl of stmt.declarationList.declarations) {
325
+ extractBindingNames(decl.name, vars);
326
+ }
327
+ }
328
+ }
329
+ return vars;
330
+ }
331
+ /**
332
+ * Clone an expression, creating synthesized nodes that can be printed.
333
+ * This is necessary when the original expression comes from a different source file.
334
+ */
335
+ export function cloneExpression(factory, expr) {
336
+ // NumericLiteral
337
+ if (ts.isNumericLiteral(expr)) {
338
+ return factory.createNumericLiteral(expr.text);
339
+ }
340
+ // StringLiteral
341
+ if (ts.isStringLiteral(expr)) {
342
+ return factory.createStringLiteral(expr.text);
343
+ }
344
+ // Identifier
345
+ if (ts.isIdentifier(expr)) {
346
+ return factory.createIdentifier(expr.text);
347
+ }
348
+ // PropertyAccessExpression: obj.prop
349
+ if (ts.isPropertyAccessExpression(expr)) {
350
+ return factory.createPropertyAccessExpression(cloneExpression(factory, expr.expression), expr.name.text);
351
+ }
352
+ // ElementAccessExpression: obj[key]
353
+ if (ts.isElementAccessExpression(expr)) {
354
+ return factory.createElementAccessExpression(cloneExpression(factory, expr.expression), cloneExpression(factory, expr.argumentExpression));
355
+ }
356
+ // BinaryExpression: a + b, a * b, etc.
357
+ if (ts.isBinaryExpression(expr)) {
358
+ return factory.createBinaryExpression(cloneExpression(factory, expr.left), expr.operatorToken.kind, cloneExpression(factory, expr.right));
359
+ }
360
+ // ParenthesizedExpression: (expr)
361
+ if (ts.isParenthesizedExpression(expr)) {
362
+ return factory.createParenthesizedExpression(cloneExpression(factory, expr.expression));
363
+ }
364
+ // ConditionalExpression: cond ? a : b
365
+ if (ts.isConditionalExpression(expr)) {
366
+ return factory.createConditionalExpression(cloneExpression(factory, expr.condition), factory.createToken(ts.SyntaxKind.QuestionToken), cloneExpression(factory, expr.whenTrue), factory.createToken(ts.SyntaxKind.ColonToken), cloneExpression(factory, expr.whenFalse));
367
+ }
368
+ // CallExpression: fn(args)
369
+ if (ts.isCallExpression(expr)) {
370
+ return factory.createCallExpression(cloneExpression(factory, expr.expression), undefined, // type arguments
371
+ expr.arguments.map(arg => cloneExpression(factory, arg)));
372
+ }
373
+ // PrefixUnaryExpression: !x, -x, ++x
374
+ if (ts.isPrefixUnaryExpression(expr)) {
375
+ return factory.createPrefixUnaryExpression(expr.operator, cloneExpression(factory, expr.operand));
376
+ }
377
+ // PostfixUnaryExpression: x++, x--
378
+ if (ts.isPostfixUnaryExpression(expr)) {
379
+ return factory.createPostfixUnaryExpression(cloneExpression(factory, expr.operand), expr.operator);
380
+ }
381
+ // ObjectLiteralExpression: { a: 1, b: 2 }
382
+ if (ts.isObjectLiteralExpression(expr)) {
383
+ return factory.createObjectLiteralExpression(expr.properties.map(prop => {
384
+ if (ts.isPropertyAssignment(prop)) {
385
+ const name = ts.isIdentifier(prop.name)
386
+ ? factory.createIdentifier(prop.name.text)
387
+ : ts.isStringLiteral(prop.name)
388
+ ? factory.createStringLiteral(prop.name.text)
389
+ : ts.isNumericLiteral(prop.name)
390
+ ? factory.createNumericLiteral(prop.name.text)
391
+ : prop.name;
392
+ return factory.createPropertyAssignment(name, cloneExpression(factory, prop.initializer));
393
+ }
394
+ if (ts.isShorthandPropertyAssignment(prop)) {
395
+ return factory.createShorthandPropertyAssignment(prop.name.text);
396
+ }
397
+ return prop;
398
+ }), true);
399
+ }
400
+ // ArrayLiteralExpression: [a, b, c]
401
+ if (ts.isArrayLiteralExpression(expr)) {
402
+ return factory.createArrayLiteralExpression(expr.elements.map(el => cloneExpression(factory, el)));
403
+ }
404
+ // true/false literals
405
+ if (expr.kind === ts.SyntaxKind.TrueKeyword) {
406
+ return factory.createTrue();
407
+ }
408
+ if (expr.kind === ts.SyntaxKind.FalseKeyword) {
409
+ return factory.createFalse();
410
+ }
411
+ // null
412
+ if (expr.kind === ts.SyntaxKind.NullKeyword) {
413
+ return factory.createNull();
414
+ }
415
+ // Fallback: return original (may not print correctly)
416
+ return expr;
417
+ }
418
+ //# sourceMappingURL=rewriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../../src/compiler/rewriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @justscale/core/process - Step Hash Computation
3
+ *
4
+ * Computes stable hashes for process steps to enable:
5
+ * 1. Persistence stability (code changes don't break suspended processes)
6
+ * 2. Version migration detection
7
+ * 3. Debugging/tracing
8
+ *
9
+ * Hash inputs:
10
+ * - Step type (entry, resume, branch)
11
+ * - Signal/timer being waited on (for resume steps)
12
+ * - Suspension index within the function
13
+ * - Control flow context
14
+ */
15
+ import type { AnalysisResult } from './analyzer.js';
16
+ export interface StepHashInput {
17
+ type: 'entry' | 'block' | 'resume' | 'branch';
18
+ opcodeRange: {
19
+ start: number;
20
+ end: number;
21
+ };
22
+ index: number;
23
+ }
24
+ /**
25
+ * Compute a stable hash for a step.
26
+ *
27
+ * The hash is based on:
28
+ * 1. Step type
29
+ * 2. Signal/timer identity (for suspension points)
30
+ * 3. Step index as tiebreaker
31
+ *
32
+ * This means:
33
+ * - Adding console.log doesn't change the hash (no new suspension)
34
+ * - Renaming variables doesn't change the hash (not part of identity)
35
+ * - Adding a new suspension point DOES change subsequent hashes
36
+ */
37
+ export declare function computeStepHash(input: StepHashInput, analysis: AnalysisResult, opcodeStart: number): string;
38
+ /**
39
+ * Compute a version hash for the entire process.
40
+ * Used to detect if the process structure has changed.
41
+ */
42
+ export declare function computeVersionHash(analysis: AnalysisResult): string;
43
+ //# sourceMappingURL=step-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-hash.d.ts","sourceRoot":"","sources":["../../src/compiler/step-hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC7C,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3C,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,MAAM,GAClB,MAAM,CA6CR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CASnE"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @justscale/core/process - Step Hash Computation
3
+ *
4
+ * Computes stable hashes for process steps to enable:
5
+ * 1. Persistence stability (code changes don't break suspended processes)
6
+ * 2. Version migration detection
7
+ * 3. Debugging/tracing
8
+ *
9
+ * Hash inputs:
10
+ * - Step type (entry, resume, branch)
11
+ * - Signal/timer being waited on (for resume steps)
12
+ * - Suspension index within the function
13
+ * - Control flow context
14
+ */
15
+ import { createHash } from 'crypto';
16
+ /**
17
+ * Compute a stable hash for a step.
18
+ *
19
+ * The hash is based on:
20
+ * 1. Step type
21
+ * 2. Signal/timer identity (for suspension points)
22
+ * 3. Step index as tiebreaker
23
+ *
24
+ * This means:
25
+ * - Adding console.log doesn't change the hash (no new suspension)
26
+ * - Renaming variables doesn't change the hash (not part of identity)
27
+ * - Adding a new suspension point DOES change subsequent hashes
28
+ */
29
+ export function computeStepHash(input, analysis, opcodeStart) {
30
+ const { type, index } = input;
31
+ const { opcodes } = analysis;
32
+ // Build hash input string
33
+ const parts = [type];
34
+ // For resume/branch steps, include the signal/timer being waited on
35
+ if (type === 'resume' && opcodeStart > 0) {
36
+ const waitOp = opcodes[opcodeStart - 1];
37
+ if (waitOp.op === 'WAIT') {
38
+ parts.push(`signal:${waitOp.signal}`);
39
+ }
40
+ }
41
+ if (type === 'branch') {
42
+ // Find the race branch this step handles
43
+ for (let i = 0; i < opcodeStart; i++) {
44
+ const op = opcodes[i];
45
+ if (op.op === 'RACE_START') {
46
+ for (const branch of op.branches) {
47
+ if (branch.jumpTarget === opcodeStart) {
48
+ if (branch.signal) {
49
+ parts.push(`race-signal:${branch.signal}`);
50
+ }
51
+ else if (branch.timer) {
52
+ // Serialize timer without the AST node - just unit and expression text
53
+ const timerInfo = `${branch.timer.unit}:${branch.timer.valueExpr.getText()}`;
54
+ parts.push(`race-timer:${timerInfo}`);
55
+ }
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+ // Include index as tiebreaker for uniqueness
63
+ parts.push(`idx:${index}`);
64
+ // Compute hash
65
+ const hashInput = parts.join('|');
66
+ const hash = createHash('sha256').update(hashInput).digest('hex').slice(0, 8);
67
+ // Return formatted hash with type prefix
68
+ return `${type}_${hash}`;
69
+ }
70
+ /**
71
+ * Compute a version hash for the entire process.
72
+ * Used to detect if the process structure has changed.
73
+ */
74
+ export function computeVersionHash(analysis) {
75
+ const structure = JSON.stringify({
76
+ opcodes: analysis.opcodes.map(op => op.op),
77
+ signals: Object.keys(analysis.signals).sort(),
78
+ rehydration: Object.keys(analysis.rehydrationBlocks).sort(),
79
+ });
80
+ const hash = createHash('sha256').update(structure).digest('hex').slice(0, 8);
81
+ return `v_${hash}`;
82
+ }
83
+ //# sourceMappingURL=step-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-hash.js","sourceRoot":"","sources":["../../src/compiler/step-hash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @justscale/core/process - Switch-Based Code Generator
3
+ *
4
+ * Generates VM-style switch-based execution code from process analysis.
5
+ *
6
+ * The generated code follows this pattern:
7
+ * ```
8
+ * async execute(ctx) {
9
+ * const { state, services } = ctx
10
+ * let step = state.step | 0
11
+ * const __r = [0, undefined] // [DONE/SUSPEND, payload]
12
+ *
13
+ * main_loop: while (true) {
14
+ * switch (step) {
15
+ * case 0: { ... }
16
+ * case 1: { ... }
17
+ * }
18
+ * }
19
+ * return __r
20
+ * }
21
+ * ```
22
+ */
23
+ import ts from 'typescript';
24
+ import type { AnalysisResult } from './analyzer.js';
25
+ export interface SwitchCodeGenInput {
26
+ id: string;
27
+ path: string;
28
+ version: string;
29
+ injectNode: ts.ObjectLiteralExpression | undefined;
30
+ typesNode?: ts.Expression;
31
+ handler: ts.FunctionExpression | ts.ArrowFunction | ts.MethodDeclaration;
32
+ analysis: AnalysisResult;
33
+ originalNode?: ts.Node;
34
+ typeChecker?: ts.TypeChecker;
35
+ }
36
+ /**
37
+ * Represents a step (case) in the generated switch statement.
38
+ */
39
+ export interface Step {
40
+ /** Unique step index (0-based) */
41
+ index: number;
42
+ /** Hash for persistence stability */
43
+ hash: string;
44
+ /** Step type for semantic meaning */
45
+ type: 'entry' | 'block' | 'resume' | 'branch';
46
+ /** Source line range [start, end] for debugging */
47
+ sourceRange?: [number, number];
48
+ /** Opcodes to execute in this step */
49
+ opcodeRange: {
50
+ start: number;
51
+ end: number;
52
+ };
53
+ /** Next step after execution (if not suspended/returned) */
54
+ nextStep?: number;
55
+ /** For resume steps: the rehydration deps */
56
+ rehydrateDeps?: string[];
57
+ /** For race branches: branch info */
58
+ branchInfo?: {
59
+ raceOpcodeIndex: number;
60
+ branchId: string;
61
+ };
62
+ }
63
+ /**
64
+ * Result of building steps from opcodes.
65
+ */
66
+ export interface StepBuildResult {
67
+ steps: Step[];
68
+ stepMap: Record<string, number>;
69
+ sourceMap: Record<number, [number, number]>;
70
+ }
71
+ /**
72
+ * Build steps from opcodes.
73
+ * Steps are created for:
74
+ * 1. Entry point (step 0)
75
+ * 2. After each suspension point (WAIT, RACE_SUSPEND)
76
+ * 3. Jump targets (after JUMP_IF, LABEL targets)
77
+ * 4. Race branch handlers
78
+ */
79
+ export declare function buildSteps(analysis: AnalysisResult): StepBuildResult;
80
+ /**
81
+ * Generate the compiled switch-based process.
82
+ */
83
+ export declare function generateSwitchProcess(factory: ts.NodeFactory, input: SwitchCodeGenInput): ts.Expression;
84
+ //# sourceMappingURL=switch-codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch-codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/switch-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,eAAe,CAAC;AAajF,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,EAAE,CAAC,uBAAuB,GAAG,SAAS,CAAA;IAClD,SAAS,CAAC,EAAE,EAAE,CAAC,UAAU,CAAA;IACzB,OAAO,EAAE,EAAE,CAAC,kBAAkB,GAAG,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,iBAAiB,CAAA;IACxE,QAAQ,EAAE,cAAc,CAAA;IACxB,YAAY,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;IACtB,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,qCAAqC;IACrC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC7C,mDAAmD;IACnD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,sCAAsC;IACtC,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3C,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,qCAAqC;IACrC,UAAU,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAC5C;AAuFD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe,CA2TpE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,KAAK,EAAE,kBAAkB,GACxB,EAAE,CAAC,UAAU,CAqHf"}