@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,373 @@
1
+ "use strict";
2
+ /**
3
+ * JustScale TypeScript
4
+ *
5
+ * Drop-in TypeScript SDK that injects JustScale process diagnostics
6
+ * (TSP* errors) into the IDE language service without requiring the
7
+ * tsserver LSP plugin to be loaded.
8
+ *
9
+ * Usage:
10
+ * // In VS Code settings.json:
11
+ * { "typescript.tsdk": "node_modules/@justscale/typescript/lib" }
12
+ *
13
+ * // In JetBrains:
14
+ * Settings > Languages > TypeScript > TypeScript package path
15
+ */
16
+ const logger_1 = require("./logger");
17
+ // Process analyzer is loaded dynamically at runtime to avoid rootDir issues
18
+ // These will be populated when the lib is used from a built package
19
+ let analyzeHandler = null;
20
+ let formatErrorCode = null;
21
+ let filterUsingExportsDiagnostics = null;
22
+ let extractAndInjectExportsTypes = null;
23
+ // Try to load process analyzer from built dist
24
+ try {
25
+ const analyzer = require('@justscale/typescript/api');
26
+ analyzeHandler = analyzer.analyzeHandler;
27
+ formatErrorCode = analyzer.formatErrorCode;
28
+ const errors = require('../dist/compiler/errors.js');
29
+ filterUsingExportsDiagnostics = errors.filterUsingExportsDiagnostics;
30
+ const prepass = require('../dist/compiler/exports-prepass.js');
31
+ extractAndInjectExportsTypes = prepass.extractAndInjectExportsTypes;
32
+ }
33
+ catch {
34
+ // Not available yet (during build) or not installed
35
+ }
36
+ const log = (0, logger_1.createLogger)('typescript');
37
+ log.info('JustScale TypeScript loading...');
38
+ const ts = require('typescript');
39
+ log.info('TypeScript loaded', { version: ts.version });
40
+ // TypeScript Language Service plugins are not reliably loaded by all IDEs
41
+ // (especially JetBrains). We patch createLanguageService directly to inject
42
+ // process-specific diagnostics (TSP errors) without requiring plugin loading.
43
+ const originalCreateLanguageService = ts.createLanguageService;
44
+ /**
45
+ * Check if a source file is a process file (imports from @justscale/core/process
46
+ * or has .process. in the filename).
47
+ */
48
+ function isProcessFile(sourceFile) {
49
+ if (sourceFile.fileName.includes('.process.')) {
50
+ return true;
51
+ }
52
+ for (const statement of sourceFile.statements) {
53
+ if (ts.isImportDeclaration(statement)) {
54
+ const moduleSpecifier = statement.moduleSpecifier;
55
+ if (ts.isStringLiteral(moduleSpecifier)) {
56
+ if (moduleSpecifier.text === '@justscale/core/process') {
57
+ return true;
58
+ }
59
+ }
60
+ }
61
+ }
62
+ return false;
63
+ }
64
+ /**
65
+ * Get process-specific diagnostics for a source file.
66
+ */
67
+ function getProcessDiagnostics(sourceFile, program) {
68
+ const diagnostics = [];
69
+ const typeChecker = program.getTypeChecker();
70
+ // Find all createProcess calls
71
+ const visit = (node) => {
72
+ if (ts.isCallExpression(node)) {
73
+ const expr = node.expression;
74
+ if (ts.isIdentifier(expr) && expr.text === 'createProcess') {
75
+ const configArg = node.arguments[0];
76
+ if (configArg && ts.isObjectLiteralExpression(configArg)) {
77
+ const handlerDiagnostics = analyzeProcessConfig(configArg, typeChecker);
78
+ diagnostics.push(...handlerDiagnostics);
79
+ }
80
+ }
81
+ }
82
+ ts.forEachChild(node, visit);
83
+ };
84
+ visit(sourceFile);
85
+ return diagnostics;
86
+ }
87
+ /**
88
+ * Analyze a createProcess config and return diagnostics.
89
+ */
90
+ function analyzeProcessConfig(configObj, typeChecker) {
91
+ // Analyzer not available (during build or not installed)
92
+ if (!analyzeHandler) {
93
+ return [];
94
+ }
95
+ // Find the handler property
96
+ let handler;
97
+ for (const prop of configObj.properties) {
98
+ // Handle method declarations: async handler() {}
99
+ if (ts.isMethodDeclaration(prop)) {
100
+ if (ts.isIdentifier(prop.name) && prop.name.text === 'handler') {
101
+ handler = prop;
102
+ }
103
+ continue;
104
+ }
105
+ if (!ts.isPropertyAssignment(prop))
106
+ continue;
107
+ if (!ts.isIdentifier(prop.name))
108
+ continue;
109
+ if (prop.name.text === 'handler') {
110
+ if (ts.isFunctionExpression(prop.initializer) ||
111
+ ts.isArrowFunction(prop.initializer)) {
112
+ handler = prop.initializer;
113
+ }
114
+ }
115
+ }
116
+ if (!handler) {
117
+ return [];
118
+ }
119
+ // Analyze the handler
120
+ const analysis = analyzeHandler(handler, typeChecker);
121
+ // Format diagnostic messages with TSP codes
122
+ return analysis.diagnostics.map(d => ({
123
+ ...d,
124
+ messageText: formatDiagnosticMessage(d),
125
+ }));
126
+ }
127
+ /**
128
+ * Format diagnostic message with TSP code prefix.
129
+ */
130
+ function formatDiagnosticMessage(diagnostic) {
131
+ const code = diagnostic.code - 100000; // Get our error code back
132
+ const tspCode = formatErrorCode ? formatErrorCode(code) : `TSP${code}`;
133
+ const message = typeof diagnostic.messageText === 'string'
134
+ ? diagnostic.messageText
135
+ : diagnostic.messageText.messageText;
136
+ return `${tspCode}: ${message}`;
137
+ }
138
+ /**
139
+ * Patched createLanguageService that injects process diagnostics.
140
+ */
141
+ function patchedCreateLanguageService(host, documentRegistry, syntaxOnlyOrLanguageServiceMode) {
142
+ log.info('createLanguageService: CALLED - wrapping with process diagnostics');
143
+ const originalLS = originalCreateLanguageService(host, documentRegistry, syntaxOnlyOrLanguageServiceMode);
144
+ log.info('createLanguageService: original LS created, now wrapping');
145
+ // Create a proxy that intercepts getSemanticDiagnostics
146
+ const proxy = Object.create(null);
147
+ // Copy all methods from the original language service
148
+ for (const k of Object.keys(originalLS)) {
149
+ const x = originalLS[k];
150
+ // @ts-expect-error - dynamic property assignment
151
+ proxy[k] = typeof x === 'function' ? x.bind(originalLS) : x;
152
+ }
153
+ // Override getSemanticDiagnostics to add process errors
154
+ proxy.getSemanticDiagnostics = (fileName) => {
155
+ log.info('getSemanticDiagnostics: called', { fileName });
156
+ const original = originalLS.getSemanticDiagnostics(fileName);
157
+ const program = originalLS.getProgram();
158
+ if (!program) {
159
+ log.info('getSemanticDiagnostics: no program');
160
+ return original;
161
+ }
162
+ const sourceFile = program.getSourceFile(fileName);
163
+ if (!sourceFile) {
164
+ log.info('getSemanticDiagnostics: no sourceFile');
165
+ return original;
166
+ }
167
+ // Only check process files
168
+ const isProcess = isProcessFile(sourceFile);
169
+ log.info('getSemanticDiagnostics: isProcessFile check', { fileName, isProcess });
170
+ if (!isProcess) {
171
+ return original;
172
+ }
173
+ const filtered = filterUsingExportsDiagnostics ? filterUsingExportsDiagnostics(original) : original;
174
+ log.info('getSemanticDiagnostics: analyzing process file', { fileName, analyzerLoaded: !!analyzeHandler });
175
+ try {
176
+ const processDiagnostics = getProcessDiagnostics(sourceFile, program);
177
+ log.info('getSemanticDiagnostics: analysis complete', {
178
+ fileName,
179
+ originalCount: original.length,
180
+ filteredCount: filtered.length,
181
+ processCount: processDiagnostics.length,
182
+ });
183
+ if (processDiagnostics.length > 0) {
184
+ log.info('getSemanticDiagnostics: found process errors', {
185
+ fileName,
186
+ count: processDiagnostics.length,
187
+ errors: processDiagnostics.map(d => ({
188
+ code: d.code,
189
+ message: typeof d.messageText === 'string' ? d.messageText : d.messageText.messageText
190
+ }))
191
+ });
192
+ }
193
+ return [...filtered, ...processDiagnostics];
194
+ }
195
+ catch (err) {
196
+ log.error('getSemanticDiagnostics: error analyzing process file', {
197
+ fileName,
198
+ error: String(err),
199
+ stack: err instanceof Error ? err.stack : undefined,
200
+ });
201
+ return original;
202
+ }
203
+ };
204
+ log.info('createLanguageService: wrapped LS ready');
205
+ return proxy;
206
+ }
207
+ log.info('Patched createLanguageService function created');
208
+ // The bundled tsserver has its own copy of createLanguageService that we can't
209
+ // patch. Instead, we patch the Project class prototype to intercept
210
+ // getLanguageService() and wrap the returned service.
211
+ const tsServer = ts.server;
212
+ if (tsServer?.Project) {
213
+ const ProjectProto = tsServer.Project.prototype;
214
+ if (ProjectProto.getLanguageService && !ProjectProto.__justscale_patched) {
215
+ const originalGetLanguageService = ProjectProto.getLanguageService;
216
+ ProjectProto.getLanguageService = function () {
217
+ const ls = originalGetLanguageService.call(this);
218
+ // Check if we already wrapped this language service
219
+ const lsAny = ls;
220
+ if (lsAny.__justscale_wrapped) {
221
+ return ls;
222
+ }
223
+ log.info('Project.getLanguageService: wrapping language service');
224
+ // Two-pass exports type injection state
225
+ // Project IS the LanguageServiceHost (has getScriptSnapshot/getScriptVersion)
226
+ const project = this;
227
+ let exportsExtracted = false;
228
+ const modifiedSnapshots = new Map();
229
+ const injectedAtVersion = new Map();
230
+ // Override Project's getScriptSnapshot/getScriptVersion for exports injection
231
+ if (extractAndInjectExportsTypes && project.getScriptSnapshot && project.getScriptVersion) {
232
+ const origGetSnapshot = project.getScriptSnapshot.bind(project);
233
+ const origGetVersion = project.getScriptVersion.bind(project);
234
+ project.getScriptSnapshot = (fn) => {
235
+ const version = origGetVersion(fn);
236
+ const injAt = injectedAtVersion.get(fn);
237
+ // Cache invalidation on file change
238
+ if (injAt && injAt !== version) {
239
+ modifiedSnapshots.delete(fn);
240
+ injectedAtVersion.delete(fn);
241
+ exportsExtracted = false;
242
+ }
243
+ const modified = modifiedSnapshots.get(fn);
244
+ if (modified) {
245
+ return ts.ScriptSnapshot.fromString(modified);
246
+ }
247
+ return origGetSnapshot(fn);
248
+ };
249
+ project.getScriptVersion = (fn) => {
250
+ const version = origGetVersion(fn);
251
+ if (modifiedSnapshots.has(fn)) {
252
+ return version + '-exports';
253
+ }
254
+ return version;
255
+ };
256
+ log.info('Project: host overridden for exports type injection');
257
+ }
258
+ // Create wrapped version
259
+ const originalGetSemanticDiagnostics = ls.getSemanticDiagnostics.bind(ls);
260
+ ls.getSemanticDiagnostics = (fileName) => {
261
+ // Two-pass: on first call, extract exports types and inject into host snapshots
262
+ if (!exportsExtracted && extractAndInjectExportsTypes) {
263
+ exportsExtracted = true;
264
+ try {
265
+ const program = ls.getProgram();
266
+ if (program) {
267
+ const modified = extractAndInjectExportsTypes(program);
268
+ if (modified.size > 0) {
269
+ for (const [file, text] of modified) {
270
+ modifiedSnapshots.set(file, text);
271
+ try {
272
+ const origGetVersion = project.getScriptVersion;
273
+ // Get base version (without our suffix) for cache tracking
274
+ const v = typeof origGetVersion === 'function' ? origGetVersion(file) : '0';
275
+ injectedAtVersion.set(file, String(v).replace('-exports', ''));
276
+ }
277
+ catch {
278
+ injectedAtVersion.set(file, '0');
279
+ }
280
+ }
281
+ log.info('Exports injection: injected types', {
282
+ count: modified.size,
283
+ files: [...modified.keys()],
284
+ });
285
+ }
286
+ }
287
+ }
288
+ catch (err) {
289
+ log.error('Exports injection error', { error: String(err) });
290
+ }
291
+ }
292
+ const original = originalGetSemanticDiagnostics(fileName);
293
+ const program = ls.getProgram();
294
+ if (!program) {
295
+ return original;
296
+ }
297
+ const sourceFile = program.getSourceFile(fileName);
298
+ if (!sourceFile) {
299
+ return original;
300
+ }
301
+ if (!isProcessFile(sourceFile)) {
302
+ return original;
303
+ }
304
+ const filtered = filterUsingExportsDiagnostics ? filterUsingExportsDiagnostics(original) : original;
305
+ try {
306
+ const processDiagnostics = getProcessDiagnostics(sourceFile, program);
307
+ return [...filtered, ...processDiagnostics];
308
+ }
309
+ catch (err) {
310
+ log.error('getSemanticDiagnostics: error', {
311
+ fileName,
312
+ error: String(err),
313
+ stack: err instanceof Error ? err.stack : undefined,
314
+ });
315
+ return filtered;
316
+ }
317
+ };
318
+ lsAny.__justscale_wrapped = true;
319
+ return ls;
320
+ };
321
+ ProjectProto.__justscale_patched = true;
322
+ log.info('Patched ts.server.Project.prototype.getLanguageService');
323
+ }
324
+ else {
325
+ log.warn('Could not patch ts.server.Project - getLanguageService not found or already patched');
326
+ }
327
+ }
328
+ else {
329
+ log.info('ts.server.Project not available yet (will be patched when tsserver loads)');
330
+ }
331
+ const justscale = {
332
+ version: '0.1.0',
333
+ isProcessFile(sourceFile) {
334
+ if (sourceFile.fileName.includes('.process.'))
335
+ return true;
336
+ for (const stmt of sourceFile.statements) {
337
+ if (ts.isImportDeclaration(stmt)) {
338
+ const moduleSpecifier = stmt.moduleSpecifier;
339
+ if (ts.isStringLiteral(moduleSpecifier)) {
340
+ if (moduleSpecifier.text === '@justscale/core/process') {
341
+ return true;
342
+ }
343
+ }
344
+ }
345
+ }
346
+ return false;
347
+ },
348
+ };
349
+ const extendedTs = new Proxy(ts, {
350
+ get(target, prop, receiver) {
351
+ if (prop === 'createLanguageService') {
352
+ return patchedCreateLanguageService;
353
+ }
354
+ if (prop === 'justscale') {
355
+ return justscale;
356
+ }
357
+ return Reflect.get(target, prop, receiver);
358
+ },
359
+ });
360
+ log.info('JustScale TypeScript ready', {
361
+ tsVersion: ts.version,
362
+ justscaleVersion: justscale.version,
363
+ });
364
+ // Replace in require cache so other modules get our patched version
365
+ const typescriptModulePath = require.resolve('typescript');
366
+ log.info('Replacing typescript module in require cache', { path: typescriptModulePath });
367
+ for (const [path, mod] of Object.entries(require.cache)) {
368
+ if (path.endsWith('/typescript/lib/typescript.js') && mod) {
369
+ log.info('Patching typescript in cache', { path });
370
+ mod.exports = extendedTs;
371
+ }
372
+ }
373
+ module.exports = extendedTs;
package/package.json ADDED
@@ -0,0 +1,115 @@
1
+ {
2
+ "name": "@justscale/typescript",
3
+ "version": "0.1.1",
4
+ "description": "Drop-in TypeScript replacement with JustScale process compilation - ptsc compiler, tsserver, LSP plugin, programmatic API",
5
+ "author": "JustScale",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/justscale/justscale.git",
10
+ "directory": "packages/core/typescript"
11
+ },
12
+ "homepage": "https://justscale.sh",
13
+ "bugs": {
14
+ "url": "https://github.com/justscale/justscale/issues"
15
+ },
16
+ "keywords": [
17
+ "justscale",
18
+ "typescript",
19
+ "compiler",
20
+ "tsc",
21
+ "tsserver",
22
+ "language-service",
23
+ "ide",
24
+ "vscode",
25
+ "durable",
26
+ "process"
27
+ ],
28
+ "type": "module",
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "bin": {
33
+ "ptsc": "./dist/compiler/ptsc.js",
34
+ "ptscserver": "./dist/server/tsserver.js",
35
+ "justscale-tsc": "./dist/compiler/ptsc.js",
36
+ "justscale-tsserver": "./dist/server/tsserver.js"
37
+ },
38
+ "exports": {
39
+ ".": {
40
+ "source": "./src/index.ts",
41
+ "types": "./dist/index.d.ts",
42
+ "import": "./dist/index.js",
43
+ "default": "./dist/index.js"
44
+ },
45
+ "./api": {
46
+ "source": "./src/api.ts",
47
+ "types": "./dist/api.d.ts",
48
+ "import": "./dist/api.js",
49
+ "default": "./dist/api.js"
50
+ },
51
+ "./config": {
52
+ "source": "./src/config/index.ts",
53
+ "types": "./dist/config/index.d.ts",
54
+ "import": "./dist/config/index.js",
55
+ "default": "./dist/config/index.js"
56
+ },
57
+ "./language-service": {
58
+ "source": "./src/language-service/index.ts",
59
+ "types": "./dist/language-service/index.d.ts",
60
+ "require": "./dist/language-service/index.js",
61
+ "import": "./dist/language-service/index.js",
62
+ "default": "./dist/language-service/index.js"
63
+ },
64
+ "./server": {
65
+ "source": "./src/server/index.ts",
66
+ "types": "./dist/server/index.d.ts",
67
+ "import": "./dist/server/index.js",
68
+ "default": "./dist/server/index.js"
69
+ },
70
+ "./loader": {
71
+ "source": "./src/loader/index.ts",
72
+ "types": "./dist/loader/index.d.ts",
73
+ "import": "./dist/loader/index.js",
74
+ "default": "./dist/loader/index.js"
75
+ },
76
+ "./register": {
77
+ "source": "./src/loader/register.ts",
78
+ "import": "./dist/loader/register.js",
79
+ "default": "./dist/loader/register.js"
80
+ },
81
+ "./editor": {
82
+ "source": "./src/editor.ts",
83
+ "types": "./dist/editor.d.ts",
84
+ "import": "./dist/editor.js",
85
+ "default": "./dist/editor.js"
86
+ },
87
+ "./lib/typescript": {
88
+ "source": "./src/lib/typescript.ts",
89
+ "require": "./lib/typescript.js",
90
+ "default": "./lib/typescript.js"
91
+ },
92
+ "./lib/tsserver": {
93
+ "source": "./src/lib/tsserver.ts",
94
+ "require": "./lib/tsserver.js",
95
+ "default": "./lib/tsserver.js"
96
+ }
97
+ },
98
+ "files": [
99
+ "dist",
100
+ "lib"
101
+ ],
102
+ "peerDependencies": {
103
+ "typescript": "^6.0.0"
104
+ },
105
+ "devDependencies": {
106
+ "source-map": "^0.7.6"
107
+ },
108
+ "scripts": {
109
+ "build": "tsc -b tsconfig.build.json && tsc -p tsconfig.lib.json && npm run postbuild",
110
+ "postbuild": "node scripts/create-lib-shims.js",
111
+ "clean": "rm -rf dist lib",
112
+ "test": "tsx --test --test-timeout=10000 --test-force-exit 'test/**/*.test.ts'",
113
+ "typecheck": "ptsc --noEmit"
114
+ }
115
+ }