@justscale/typescript 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/api.d.ts +144 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +380 -0
- package/dist/api.js.map +1 -0
- package/dist/compiler/analyzer.d.ts +247 -0
- package/dist/compiler/analyzer.d.ts.map +1 -0
- package/dist/compiler/analyzer.js +3201 -0
- package/dist/compiler/analyzer.js.map +1 -0
- package/dist/compiler/cli.d.ts +12 -0
- package/dist/compiler/cli.d.ts.map +1 -0
- package/dist/compiler/cli.js +209 -0
- package/dist/compiler/cli.js.map +1 -0
- package/dist/compiler/compile.d.ts +26 -0
- package/dist/compiler/compile.d.ts.map +1 -0
- package/dist/compiler/compile.js +121 -0
- package/dist/compiler/compile.js.map +1 -0
- package/dist/compiler/errors.d.ts +336 -0
- package/dist/compiler/errors.d.ts.map +1 -0
- package/dist/compiler/errors.js +466 -0
- package/dist/compiler/errors.js.map +1 -0
- package/dist/compiler/exports-prepass.d.ts +31 -0
- package/dist/compiler/exports-prepass.d.ts.map +1 -0
- package/dist/compiler/exports-prepass.js +249 -0
- package/dist/compiler/exports-prepass.js.map +1 -0
- package/dist/compiler/hmr-change-detector.d.ts +47 -0
- package/dist/compiler/hmr-change-detector.d.ts.map +1 -0
- package/dist/compiler/hmr-change-detector.js +395 -0
- package/dist/compiler/hmr-change-detector.js.map +1 -0
- package/dist/compiler/hmr-transformer.d.ts +54 -0
- package/dist/compiler/hmr-transformer.d.ts.map +1 -0
- package/dist/compiler/hmr-transformer.js +535 -0
- package/dist/compiler/hmr-transformer.js.map +1 -0
- package/dist/compiler/index.d.ts +19 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +16 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/primitive-detector.d.ts +70 -0
- package/dist/compiler/primitive-detector.d.ts.map +1 -0
- package/dist/compiler/primitive-detector.js +338 -0
- package/dist/compiler/primitive-detector.js.map +1 -0
- package/dist/compiler/ptsc.d.ts +40 -0
- package/dist/compiler/ptsc.d.ts.map +1 -0
- package/dist/compiler/ptsc.js +462 -0
- package/dist/compiler/ptsc.js.map +1 -0
- package/dist/compiler/rewriter.d.ts +96 -0
- package/dist/compiler/rewriter.d.ts.map +1 -0
- package/dist/compiler/rewriter.js +418 -0
- package/dist/compiler/rewriter.js.map +1 -0
- package/dist/compiler/step-hash.d.ts +43 -0
- package/dist/compiler/step-hash.d.ts.map +1 -0
- package/dist/compiler/step-hash.js +83 -0
- package/dist/compiler/step-hash.js.map +1 -0
- package/dist/compiler/switch-codegen.d.ts +84 -0
- package/dist/compiler/switch-codegen.d.ts.map +1 -0
- package/dist/compiler/switch-codegen.js +1540 -0
- package/dist/compiler/switch-codegen.js.map +1 -0
- package/dist/compiler/transformer.d.ts +29 -0
- package/dist/compiler/transformer.d.ts.map +1 -0
- package/dist/compiler/transformer.js +216 -0
- package/dist/compiler/transformer.js.map +1 -0
- package/dist/config/index.d.ts +122 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +215 -0
- package/dist/config/index.js.map +1 -0
- package/dist/di-errors/formatter.d.ts +126 -0
- package/dist/di-errors/formatter.d.ts.map +1 -0
- package/dist/di-errors/formatter.js +384 -0
- package/dist/di-errors/formatter.js.map +1 -0
- package/dist/di-errors/index.d.ts +5 -0
- package/dist/di-errors/index.d.ts.map +1 -0
- package/dist/di-errors/index.js +13 -0
- package/dist/di-errors/index.js.map +1 -0
- package/dist/editor.d.ts +11 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +2 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/language-service/index.d.ts +52 -0
- package/dist/language-service/index.d.ts.map +1 -0
- package/dist/language-service/index.js +366 -0
- package/dist/language-service/index.js.map +1 -0
- package/dist/language-service/process-quick-fixes.d.ts +20 -0
- package/dist/language-service/process-quick-fixes.d.ts.map +1 -0
- package/dist/language-service/process-quick-fixes.js +114 -0
- package/dist/language-service/process-quick-fixes.js.map +1 -0
- package/dist/language-service/quick-fix-discovery.d.ts +39 -0
- package/dist/language-service/quick-fix-discovery.d.ts.map +1 -0
- package/dist/language-service/quick-fix-discovery.js +124 -0
- package/dist/language-service/quick-fix-discovery.js.map +1 -0
- package/dist/loader/incremental.d.ts +50 -0
- package/dist/loader/incremental.d.ts.map +1 -0
- package/dist/loader/incremental.js +151 -0
- package/dist/loader/incremental.js.map +1 -0
- package/dist/loader/index.d.ts +25 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +24 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/loader.d.ts +52 -0
- package/dist/loader/loader.d.ts.map +1 -0
- package/dist/loader/loader.js +248 -0
- package/dist/loader/loader.js.map +1 -0
- package/dist/loader/register.d.ts +14 -0
- package/dist/loader/register.d.ts.map +1 -0
- package/dist/loader/register.js +20 -0
- package/dist/loader/register.js.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +13 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/index.public.d.ts +13 -0
- package/dist/plugins/index.public.d.ts.map +1 -0
- package/dist/plugins/index.public.js +13 -0
- package/dist/plugins/index.public.js.map +1 -0
- package/dist/plugins/types.d.ts +83 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +24 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/server/index.d.ts +33 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +42 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/tsserver.d.ts +28 -0
- package/dist/server/tsserver.d.ts.map +1 -0
- package/dist/server/tsserver.js +126 -0
- package/dist/server/tsserver.js.map +1 -0
- package/lib/lib.d.ts +20 -0
- package/lib/lib.decorators.d.ts +382 -0
- package/lib/lib.decorators.legacy.d.ts +20 -0
- package/lib/lib.dom.asynciterable.d.ts +18 -0
- package/lib/lib.dom.d.ts +45125 -0
- package/lib/lib.dom.iterable.d.ts +18 -0
- package/lib/lib.es2015.collection.d.ts +150 -0
- package/lib/lib.es2015.core.d.ts +595 -0
- package/lib/lib.es2015.d.ts +26 -0
- package/lib/lib.es2015.generator.d.ts +75 -0
- package/lib/lib.es2015.iterable.d.ts +603 -0
- package/lib/lib.es2015.promise.d.ts +79 -0
- package/lib/lib.es2015.proxy.d.ts +126 -0
- package/lib/lib.es2015.reflect.d.ts +142 -0
- package/lib/lib.es2015.symbol.d.ts +44 -0
- package/lib/lib.es2015.symbol.wellknown.d.ts +324 -0
- package/lib/lib.es2016.array.include.d.ts +114 -0
- package/lib/lib.es2016.d.ts +19 -0
- package/lib/lib.es2016.full.d.ts +21 -0
- package/lib/lib.es2016.intl.d.ts +29 -0
- package/lib/lib.es2017.arraybuffer.d.ts +19 -0
- package/lib/lib.es2017.d.ts +24 -0
- package/lib/lib.es2017.date.d.ts +29 -0
- package/lib/lib.es2017.full.d.ts +21 -0
- package/lib/lib.es2017.intl.d.ts +42 -0
- package/lib/lib.es2017.object.d.ts +47 -0
- package/lib/lib.es2017.sharedmemory.d.ts +133 -0
- package/lib/lib.es2017.string.d.ts +43 -0
- package/lib/lib.es2017.typedarrays.d.ts +51 -0
- package/lib/lib.es2018.asyncgenerator.d.ts +75 -0
- package/lib/lib.es2018.asynciterable.d.ts +51 -0
- package/lib/lib.es2018.d.ts +22 -0
- package/lib/lib.es2018.full.d.ts +22 -0
- package/lib/lib.es2018.intl.d.ts +81 -0
- package/lib/lib.es2018.promise.d.ts +28 -0
- package/lib/lib.es2018.regexp.d.ts +35 -0
- package/lib/lib.es2019.array.d.ts +77 -0
- package/lib/lib.es2019.d.ts +22 -0
- package/lib/lib.es2019.full.d.ts +22 -0
- package/lib/lib.es2019.intl.d.ts +21 -0
- package/lib/lib.es2019.object.d.ts +31 -0
- package/lib/lib.es2019.string.d.ts +35 -0
- package/lib/lib.es2019.symbol.d.ts +22 -0
- package/lib/lib.es2020.bigint.d.ts +763 -0
- package/lib/lib.es2020.d.ts +25 -0
- package/lib/lib.es2020.date.d.ts +40 -0
- package/lib/lib.es2020.full.d.ts +22 -0
- package/lib/lib.es2020.intl.d.ts +472 -0
- package/lib/lib.es2020.number.d.ts +26 -0
- package/lib/lib.es2020.promise.d.ts +45 -0
- package/lib/lib.es2020.sharedmemory.d.ts +97 -0
- package/lib/lib.es2020.string.d.ts +42 -0
- package/lib/lib.es2020.symbol.wellknown.d.ts +39 -0
- package/lib/lib.es2021.d.ts +21 -0
- package/lib/lib.es2021.full.d.ts +22 -0
- package/lib/lib.es2021.intl.d.ts +164 -0
- package/lib/lib.es2021.promise.d.ts +46 -0
- package/lib/lib.es2021.string.d.ts +31 -0
- package/lib/lib.es2021.weakref.d.ts +76 -0
- package/lib/lib.es2022.array.d.ts +119 -0
- package/lib/lib.es2022.d.ts +23 -0
- package/lib/lib.es2022.error.d.ts +73 -0
- package/lib/lib.es2022.full.d.ts +22 -0
- package/lib/lib.es2022.intl.d.ts +143 -0
- package/lib/lib.es2022.object.d.ts +24 -0
- package/lib/lib.es2022.regexp.d.ts +37 -0
- package/lib/lib.es2022.string.d.ts +23 -0
- package/lib/lib.es2023.array.d.ts +922 -0
- package/lib/lib.es2023.collection.d.ts +19 -0
- package/lib/lib.es2023.d.ts +20 -0
- package/lib/lib.es2023.full.d.ts +22 -0
- package/lib/lib.es2023.intl.d.ts +62 -0
- package/lib/lib.es2024.arraybuffer.d.ts +63 -0
- package/lib/lib.es2024.collection.d.ts +27 -0
- package/lib/lib.es2024.d.ts +24 -0
- package/lib/lib.es2024.full.d.ts +22 -0
- package/lib/lib.es2024.object.d.ts +27 -0
- package/lib/lib.es2024.promise.d.ts +33 -0
- package/lib/lib.es2024.regexp.d.ts +23 -0
- package/lib/lib.es2024.sharedmemory.d.ts +66 -0
- package/lib/lib.es2024.string.d.ts +27 -0
- package/lib/lib.es2025.collection.d.ts +94 -0
- package/lib/lib.es2025.d.ts +23 -0
- package/lib/lib.es2025.float16.d.ts +443 -0
- package/lib/lib.es2025.full.d.ts +22 -0
- package/lib/lib.es2025.intl.d.ts +200 -0
- package/lib/lib.es2025.iterator.d.ts +146 -0
- package/lib/lib.es2025.promise.d.ts +32 -0
- package/lib/lib.es2025.regexp.d.ts +30 -0
- package/lib/lib.es5.d.ts +4599 -0
- package/lib/lib.es6.d.ts +21 -0
- package/lib/lib.esnext.array.d.ts +33 -0
- package/lib/lib.esnext.collection.d.ts +47 -0
- package/lib/lib.esnext.d.ts +27 -0
- package/lib/lib.esnext.date.d.ts +21 -0
- package/lib/lib.esnext.decorators.d.ts +26 -0
- package/lib/lib.esnext.disposable.d.ts +191 -0
- package/lib/lib.esnext.error.d.ts +22 -0
- package/lib/lib.esnext.full.d.ts +22 -0
- package/lib/lib.esnext.intl.d.ts +107 -0
- package/lib/lib.esnext.sharedmemory.d.ts +23 -0
- package/lib/lib.esnext.temporal.d.ts +485 -0
- package/lib/lib.esnext.typedarrays.d.ts +90 -0
- package/lib/lib.scripthost.d.ts +320 -0
- package/lib/lib.webworker.asynciterable.d.ts +18 -0
- package/lib/lib.webworker.d.ts +15606 -0
- package/lib/lib.webworker.importscripts.d.ts +21 -0
- package/lib/lib.webworker.iterable.d.ts +18 -0
- package/lib/logger.js +144 -0
- package/lib/package.json +7 -0
- package/lib/tsserver.js +57 -0
- package/lib/tsserverlibrary.js +171 -0
- package/lib/typesMap.json +497 -0
- package/lib/typescript.js +373 -0
- package/package.json +115 -0
|
@@ -0,0 +1,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
|
+
}
|