ttsc 0.3.1 → 0.4.0-dev.20260425
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 +1 -1
- package/README.md +93 -362
- package/cmd/ttsc/build.go +128 -0
- package/cmd/ttsc/main.go +222 -0
- package/cmd/ttsc/main_test.go +288 -0
- package/cmd/ttsc/transform.go +166 -0
- package/driver/host.go +31 -0
- package/driver/program.go +298 -0
- package/driver/rewrite.go +315 -0
- package/go.mod +48 -0
- package/go.sum +22 -0
- package/lib/api.d.ts +91 -0
- package/lib/api.js +325 -0
- package/lib/api.js.map +1 -0
- package/lib/cli.d.ts +1 -0
- package/lib/cli.js +481 -0
- package/lib/cli.js.map +1 -0
- package/lib/index.d.ts +18 -0
- package/lib/index.js +35 -0
- package/lib/index.js.map +1 -0
- package/lib/native.d.ts +15 -0
- package/lib/native.js +34 -0
- package/lib/native.js.map +1 -0
- package/lib/platform.d.ts +66 -0
- package/lib/platform.js +170 -0
- package/lib/platform.js.map +1 -0
- package/lib/plugin.d.ts +47 -0
- package/lib/plugin.js +150 -0
- package/lib/plugin.js.map +1 -0
- package/lib/project.d.ts +32 -0
- package/lib/project.js +303 -0
- package/lib/project.js.map +1 -0
- package/lib/runner/cli.d.ts +1 -0
- package/lib/runner/cli.js +284 -0
- package/lib/runner/cli.js.map +1 -0
- package/lib/runner/register.d.ts +13 -0
- package/lib/runner/register.js +424 -0
- package/lib/runner/register.js.map +1 -0
- package/package.json +72 -63
- package/shim/ast/extra-shim.json +4 -0
- package/shim/ast/go.mod +5 -0
- package/shim/ast/shim.go +117 -0
- package/shim/bundled/extra-shim.json +1 -0
- package/shim/bundled/go.mod +5 -0
- package/shim/bundled/shim.go +19 -0
- package/shim/checker/extra-shim.json +31 -0
- package/shim/checker/go.mod +5 -0
- package/shim/checker/shim.go +146 -0
- package/shim/compiler/extra-shim.json +4 -0
- package/shim/compiler/go.mod +5 -0
- package/shim/compiler/shim.go +50 -0
- package/shim/core/extra-shim.json +4 -0
- package/shim/core/go.mod +5 -0
- package/shim/core/shim.go +11 -0
- package/shim/diagnosticwriter/go.mod +5 -0
- package/shim/diagnosticwriter/shim.go +29 -0
- package/shim/parser/extra-shim.json +4 -0
- package/shim/parser/go.mod +5 -0
- package/shim/parser/shim.go +55 -0
- package/shim/scanner/extra-shim.json +4 -0
- package/shim/scanner/go.mod +5 -0
- package/shim/scanner/shim.go +96 -0
- package/shim/tsoptions/extra-shim.json +4 -0
- package/shim/tsoptions/go.mod +5 -0
- package/shim/tsoptions/shim.go +123 -0
- package/shim/tspath/extra-shim.json +4 -0
- package/shim/tspath/go.mod +5 -0
- package/shim/tspath/shim.go +165 -0
- package/shim/vfs/cachedvfs/extra-shim.json +4 -0
- package/shim/vfs/cachedvfs/go.mod +5 -0
- package/shim/vfs/cachedvfs/shim.go +12 -0
- package/shim/vfs/extra-shim.json +4 -0
- package/shim/vfs/go.mod +5 -0
- package/shim/vfs/osvfs/extra-shim.json +4 -0
- package/shim/vfs/osvfs/go.mod +5 -0
- package/shim/vfs/osvfs/shim.go +13 -0
- package/shim/vfs/shim.go +19 -0
- package/src/api.ts +416 -0
- package/src/cli.ts +492 -0
- package/src/index.ts +19 -0
- package/src/launcher/ttsc-dev.js +42 -0
- package/src/launcher/ttsc.js +19 -0
- package/src/launcher/ttsx.js +19 -0
- package/src/native.ts +60 -0
- package/src/platform.ts +163 -0
- package/src/plugin.ts +241 -0
- package/src/project.ts +330 -0
- package/src/runner/cli.ts +286 -0
- package/src/runner/register.ts +487 -0
- package/test/native.test.ts +60 -0
- package/test/package.test.ts +131 -0
- package/test/platform.test.ts +58 -0
- package/test/project.test.ts +195 -0
- package/tools/gen_shims/go.mod +14 -0
- package/tools/gen_shims/go.sum +12 -0
- package/tools/gen_shims/main.go +446 -0
- package/CHANGELOG.md +0 -2
- package/bin/tsc +0 -2
- package/bin/tsserver +0 -2
- package/lib/PluginCreator.d.ts +0 -67
- package/lib/PluginCreator.js +0 -190
- package/lib/cancelationToken.d.ts +0 -0
- package/lib/cancelationToken.js +0 -2
- package/lib/loadTypescript.d.ts +0 -7
- package/lib/loadTypescript.js +0 -56
- package/lib/patchCreateProgram.d.ts +0 -21
- package/lib/patchCreateProgram.js +0 -190
- package/lib/tsc.d.ts +0 -1
- package/lib/tsc.js +0 -24
- package/lib/tsserver.d.ts +0 -0
- package/lib/tsserver.js +0 -2
- package/lib/tsserverlibrary.d.ts +0 -3
- package/lib/tsserverlibrary.js +0 -4
- package/lib/typescript.d.ts +0 -3
- package/lib/typescript.js +0 -4
- package/lib/typescriptServices.d.ts +0 -3
- package/lib/typescriptServices.js +0 -4
- package/lib/typingsInstaller.d.ts +0 -0
- package/lib/typingsInstaller.js +0 -2
- package/lib/watchGuard.d.ts +0 -0
- package/lib/watchGuard.js +0 -2
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const assert = require("node:assert/strict");
|
|
2
|
+
const test = require("node:test");
|
|
3
|
+
const {
|
|
4
|
+
binaryName,
|
|
5
|
+
installHint,
|
|
6
|
+
platformPackageRequest,
|
|
7
|
+
resolveBinary,
|
|
8
|
+
} = require("../src/platform.ts");
|
|
9
|
+
|
|
10
|
+
test("resolveBinary prefers TTSC_BINARY absolute override", () => {
|
|
11
|
+
const resolved = resolveBinary({
|
|
12
|
+
env: {
|
|
13
|
+
TTSC_BINARY: "/tmp/custom-ttsc",
|
|
14
|
+
},
|
|
15
|
+
localBinaryLookup: () => "/tmp/local-ttsc",
|
|
16
|
+
resolver: () => {
|
|
17
|
+
throw new Error("resolver should not be called when TTSC_BINARY is set");
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
assert.equal(resolved, "/tmp/custom-ttsc");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("resolveBinary falls back to local binary when optional package is missing", () => {
|
|
24
|
+
const resolved = resolveBinary({
|
|
25
|
+
env: {},
|
|
26
|
+
localBinaryLookup: () => "/tmp/local-ttsc",
|
|
27
|
+
resolver: () => {
|
|
28
|
+
throw new Error("optional package missing");
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
assert.equal(resolved, "/tmp/local-ttsc");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("resolveBinary returns null when only published and local binaries are missing", () => {
|
|
35
|
+
const resolved = resolveBinary({
|
|
36
|
+
env: {},
|
|
37
|
+
localBinaryLookup: () => null,
|
|
38
|
+
moduleDir: `${process.cwd()}/src`,
|
|
39
|
+
resolver: () => {
|
|
40
|
+
throw new Error("optional package missing");
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
assert.equal(resolved, null);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("platform helpers describe the published package contract", () => {
|
|
47
|
+
assert.equal(binaryName({ platform: "win32" }), "ttsc.exe");
|
|
48
|
+
assert.equal(binaryName({ platform: "linux" }), "ttsc");
|
|
49
|
+
assert.equal(
|
|
50
|
+
platformPackageRequest({ platform: "linux", arch: "x64" }),
|
|
51
|
+
"@ttsc/linux-x64/bin/ttsc",
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const hint = installHint({ platform: "linux", arch: "x64" });
|
|
55
|
+
assert.match(hint, /@ttsc\/linux-x64/);
|
|
56
|
+
assert.match(hint, /TTSC_BINARY env var/);
|
|
57
|
+
assert.doesNotMatch(hint, /ttsc-dev\.js/);
|
|
58
|
+
});
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
const assert = require("node:assert/strict");
|
|
2
|
+
const fs = require("node:fs");
|
|
3
|
+
const os = require("node:os");
|
|
4
|
+
const path = require("node:path");
|
|
5
|
+
const test = require("node:test");
|
|
6
|
+
|
|
7
|
+
const {
|
|
8
|
+
readProjectConfig,
|
|
9
|
+
resolveProjectConfig,
|
|
10
|
+
} = require("../src/project.ts");
|
|
11
|
+
|
|
12
|
+
test("resolveProjectConfig canonicalizes symlinked tsconfig paths", () => {
|
|
13
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "ttsc-project-"));
|
|
14
|
+
const real = path.join(root, "real");
|
|
15
|
+
const link = path.join(root, "link");
|
|
16
|
+
fs.mkdirSync(real, { recursive: true });
|
|
17
|
+
fs.writeFileSync(path.join(real, "tsconfig.json"), "{}\n", "utf8");
|
|
18
|
+
fs.symlinkSync(real, link, "dir");
|
|
19
|
+
|
|
20
|
+
const resolved = resolveProjectConfig({
|
|
21
|
+
tsconfig: path.join(link, "tsconfig.json"),
|
|
22
|
+
});
|
|
23
|
+
assert.equal(resolved, fs.realpathSync(path.join(real, "tsconfig.json")));
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("readProjectConfig inherits plugins and outDir through tsconfig extends", () => {
|
|
27
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "ttsc-project-"));
|
|
28
|
+
const shared = path.join(root, "config");
|
|
29
|
+
const project = path.join(root, "project");
|
|
30
|
+
fs.mkdirSync(shared, { recursive: true });
|
|
31
|
+
fs.mkdirSync(project, { recursive: true });
|
|
32
|
+
fs.writeFileSync(
|
|
33
|
+
path.join(shared, "tsconfig.json"),
|
|
34
|
+
JSON.stringify(
|
|
35
|
+
{
|
|
36
|
+
compilerOptions: {
|
|
37
|
+
outDir: "../dist/shared",
|
|
38
|
+
plugins: [{ transform: "./plugins/example.cjs" }],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
null,
|
|
42
|
+
2,
|
|
43
|
+
),
|
|
44
|
+
"utf8",
|
|
45
|
+
);
|
|
46
|
+
fs.writeFileSync(
|
|
47
|
+
path.join(project, "tsconfig.json"),
|
|
48
|
+
JSON.stringify(
|
|
49
|
+
{
|
|
50
|
+
extends: "../config/tsconfig.json",
|
|
51
|
+
compilerOptions: {},
|
|
52
|
+
},
|
|
53
|
+
null,
|
|
54
|
+
2,
|
|
55
|
+
),
|
|
56
|
+
"utf8",
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const parsed = readProjectConfig({
|
|
60
|
+
tsconfig: path.join(project, "tsconfig.json"),
|
|
61
|
+
});
|
|
62
|
+
assert.deepEqual(parsed.compilerOptions.plugins, [
|
|
63
|
+
{ transform: "./plugins/example.cjs" },
|
|
64
|
+
]);
|
|
65
|
+
assert.equal(parsed.compilerOptions.outDir, path.join(root, "dist/shared"));
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("readProjectConfig lets child tsconfig override inherited plugins", () => {
|
|
69
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "ttsc-project-"));
|
|
70
|
+
const shared = path.join(root, "config");
|
|
71
|
+
const project = path.join(root, "project");
|
|
72
|
+
fs.mkdirSync(shared, { recursive: true });
|
|
73
|
+
fs.mkdirSync(project, { recursive: true });
|
|
74
|
+
fs.writeFileSync(
|
|
75
|
+
path.join(shared, "tsconfig.json"),
|
|
76
|
+
JSON.stringify(
|
|
77
|
+
{
|
|
78
|
+
compilerOptions: {
|
|
79
|
+
plugins: [{ transform: "./plugins/example.cjs" }],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
null,
|
|
83
|
+
2,
|
|
84
|
+
),
|
|
85
|
+
"utf8",
|
|
86
|
+
);
|
|
87
|
+
fs.writeFileSync(
|
|
88
|
+
path.join(project, "tsconfig.json"),
|
|
89
|
+
JSON.stringify(
|
|
90
|
+
{
|
|
91
|
+
extends: "../config/tsconfig.json",
|
|
92
|
+
compilerOptions: {
|
|
93
|
+
plugins: [{ transform: "./local-plugin.cjs" }],
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
null,
|
|
97
|
+
2,
|
|
98
|
+
),
|
|
99
|
+
"utf8",
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const parsed = readProjectConfig({
|
|
103
|
+
tsconfig: path.join(project, "tsconfig.json"),
|
|
104
|
+
});
|
|
105
|
+
assert.deepEqual(parsed.compilerOptions.plugins, [
|
|
106
|
+
{ transform: "./local-plugin.cjs" },
|
|
107
|
+
]);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("readProjectConfig resolves package tsconfig extends", () => {
|
|
111
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "ttsc-project-"));
|
|
112
|
+
const preset = path.join(root, "node_modules", "@scope", "tsconfig");
|
|
113
|
+
const project = path.join(root, "project");
|
|
114
|
+
fs.mkdirSync(preset, { recursive: true });
|
|
115
|
+
fs.mkdirSync(project, { recursive: true });
|
|
116
|
+
fs.writeFileSync(
|
|
117
|
+
path.join(preset, "base.json"),
|
|
118
|
+
JSON.stringify(
|
|
119
|
+
{
|
|
120
|
+
compilerOptions: {
|
|
121
|
+
outDir: "../../dist/preset",
|
|
122
|
+
plugins: [{ transform: "./plugins/from-preset.cjs" }],
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
null,
|
|
126
|
+
2,
|
|
127
|
+
),
|
|
128
|
+
"utf8",
|
|
129
|
+
);
|
|
130
|
+
fs.writeFileSync(
|
|
131
|
+
path.join(project, "tsconfig.json"),
|
|
132
|
+
JSON.stringify(
|
|
133
|
+
{
|
|
134
|
+
extends: "@scope/tsconfig/base.json",
|
|
135
|
+
compilerOptions: {},
|
|
136
|
+
},
|
|
137
|
+
null,
|
|
138
|
+
2,
|
|
139
|
+
),
|
|
140
|
+
"utf8",
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
const parsed = readProjectConfig({
|
|
144
|
+
tsconfig: path.join(project, "tsconfig.json"),
|
|
145
|
+
});
|
|
146
|
+
assert.deepEqual(parsed.compilerOptions.plugins, [
|
|
147
|
+
{ transform: "./plugins/from-preset.cjs" },
|
|
148
|
+
]);
|
|
149
|
+
assert.equal(
|
|
150
|
+
parsed.compilerOptions.outDir,
|
|
151
|
+
path.join(root, "node_modules", "dist", "preset"),
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("readProjectConfig accepts JSONC comments and trailing commas", () => {
|
|
156
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "ttsc-project-"));
|
|
157
|
+
fs.writeFileSync(
|
|
158
|
+
path.join(root, "tsconfig.json"),
|
|
159
|
+
`{
|
|
160
|
+
// plugin host configuration may live in JSONC tsconfig files
|
|
161
|
+
"compilerOptions": {
|
|
162
|
+
"plugins": [
|
|
163
|
+
{ "transform": "./plugins/jsonc.cjs" },
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
}\n`,
|
|
167
|
+
"utf8",
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
const parsed = readProjectConfig({
|
|
171
|
+
tsconfig: path.join(root, "tsconfig.json"),
|
|
172
|
+
});
|
|
173
|
+
assert.deepEqual(parsed.compilerOptions.plugins, [
|
|
174
|
+
{ transform: "./plugins/jsonc.cjs" },
|
|
175
|
+
]);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test("readProjectConfig rejects circular tsconfig extends", () => {
|
|
179
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "ttsc-project-"));
|
|
180
|
+
fs.writeFileSync(
|
|
181
|
+
path.join(root, "a.json"),
|
|
182
|
+
JSON.stringify({ extends: "./b.json" }),
|
|
183
|
+
"utf8",
|
|
184
|
+
);
|
|
185
|
+
fs.writeFileSync(
|
|
186
|
+
path.join(root, "b.json"),
|
|
187
|
+
JSON.stringify({ extends: "./a.json" }),
|
|
188
|
+
"utf8",
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
assert.throws(
|
|
192
|
+
() => readProjectConfig({ tsconfig: path.join(root, "a.json") }),
|
|
193
|
+
/circular tsconfig extends detected/,
|
|
194
|
+
);
|
|
195
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module github.com/samchon/ttsc/packages/ttsc/tools/gen_shims
|
|
2
|
+
|
|
3
|
+
go 1.26
|
|
4
|
+
|
|
5
|
+
require (
|
|
6
|
+
github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433
|
|
7
|
+
golang.org/x/text v0.35.0
|
|
8
|
+
golang.org/x/tools v0.43.0
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
require (
|
|
12
|
+
golang.org/x/mod v0.34.0 // indirect
|
|
13
|
+
golang.org/x/sync v0.20.0 // indirect
|
|
14
|
+
)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 h1:vymEbVwYFP/L05h5TKQxvkXoKxNvTpjxYKdF1Nlwuao=
|
|
2
|
+
github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg=
|
|
3
|
+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
|
4
|
+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
|
5
|
+
golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
|
|
6
|
+
golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
|
|
7
|
+
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
|
8
|
+
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
|
9
|
+
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
|
|
10
|
+
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
|
|
11
|
+
golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
|
|
12
|
+
golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
|