Skip to content

Commit 8b8c279

Browse files
authored
fix(web): typescript config - resolve library types without host compiler overrides (#869)
## Why The web libraries expose their declarations through `exports`. TypeScript's legacy `node` resolver does not read that field, so hosts using it cannot resolve the public imports without changing their compiler configuration. ## Change Add a top-level `types` entry and explicit `typesVersions` mappings for the public JavaScript subpaths in platform, Stovepipe, and SubmitQueue. Keep the existing exports, ESM output, and browser/server boundaries unchanged. This adds declaration resolution support, not CommonJS support. Use the same packaged consumer fixture to check every public JavaScript entry point with both `node` and `bundler` resolution. Run the new legacy-resolver check in the normal web test suite. ## Test plan - `make web-check` (includes both consumer typechecks, package contents, Node runtime, and React 18 rendering checks) - `make fmt`, `make lint`, `make check-tidy`, `make check-gazelle`
1 parent 6d4a25f commit 8b8c279

7 files changed

Lines changed: 97 additions & 18 deletions

File tree

‎web/BUILD.bazel‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,6 @@ test_suite(
1111
tests = [
1212
"//web/api:generate_tests",
1313
"//web/api:test",
14-
"//web/test/package:consumer_typecheck_typecheck_test",
15-
"//web/test/package:consumer_runtime_test",
16-
"//web/test/package:pack_contents_test",
17-
"//web/test/package/react18:react18_runtime_test",
18-
"//web/service/submitqueue:lint",
19-
"//web/service/submitqueue:test",
20-
"//web/service/submitqueue:typecheck_typecheck_test",
21-
"//web/submitqueue:test",
22-
"//web/submitqueue:typecheck_typecheck_test",
2314
"//web/platform:lint",
2415
"//web/platform:test",
2516
"//web/platform:typecheck_typecheck_test",
@@ -29,16 +20,26 @@ test_suite(
2920
"//web/service/stovepipe:lint",
3021
"//web/service/stovepipe:test",
3122
"//web/service/stovepipe:typecheck_typecheck_test",
23+
"//web/service/submitqueue:lint",
24+
"//web/service/submitqueue:test",
25+
"//web/service/submitqueue:typecheck_typecheck_test",
3226
"//web/stovepipe:lint",
3327
"//web/stovepipe:test",
3428
"//web/stovepipe:typecheck_typecheck_test",
3529
"//web/submitqueue:lint",
30+
"//web/submitqueue:test",
31+
"//web/submitqueue:typecheck_typecheck_test",
3632
"//web/test/e2e/stovepipe:run_e2e_test",
3733
"//web/test/e2e/stovepipe:typecheck_typecheck_test",
38-
"//web/test/testutil:compose_test",
39-
"//web/test/package:stovepipe_pack_contents_test",
4034
"//web/test/e2e/submitqueue:run_e2e_test",
4135
"//web/test/e2e/submitqueue:typecheck_typecheck_test",
36+
"//web/test/package:consumer_node_typecheck_typecheck_test",
37+
"//web/test/package:consumer_runtime_test",
38+
"//web/test/package:consumer_typecheck_typecheck_test",
39+
"//web/test/package:pack_contents_test",
40+
"//web/test/package:stovepipe_pack_contents_test",
41+
"//web/test/package/react18:react18_runtime_test",
42+
"//web/test/testutil:compose_test",
4243
],
4344
)
4445

‎web/platform/package.json‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33
"version": "0.0.0",
44
"private": true,
55
"type": "module",
6+
"types": "./dist/index.d.ts",
7+
"typesVersions": {
8+
"*": {
9+
"path-segment": ["dist/path-segment.d.ts"],
10+
"logging": ["dist/logging.d.ts"]
11+
}
12+
},
613
"sideEffects": [
714
"./styles.css"
815
],

‎web/stovepipe/package.json‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
"version": "0.0.0",
44
"private": true,
55
"type": "module",
6+
"types": "./dist/index.d.ts",
7+
"typesVersions": {
8+
"*": {
9+
"server": ["dist/server.d.ts"]
10+
}
11+
},
612
"sideEffects": [
713
"./view/styles.css"
814
],

‎web/submitqueue/package.json‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
"version": "0.0.0",
44
"private": true,
55
"type": "module",
6+
"types": "./dist/index.d.ts",
7+
"typesVersions": {
8+
"*": {
9+
"server": ["dist/server.d.ts"],
10+
"extension/gateway/mock": ["dist/extension/gateway/mock/index.d.ts"],
11+
"extension/cursor/hmac": ["dist/extension/cursor/hmac/index.d.ts"]
12+
}
13+
},
614
"sideEffects": [
715
"./view/styles.css"
816
],

‎web/test/package/BUILD.bazel‎

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
load("@aspect_rules_js//npm:defs.bzl", "npm_link_package")
21
load("@aspect_rules_js//js:defs.bzl", "js_test")
2+
load("@aspect_rules_js//npm:defs.bzl", "npm_link_package")
33
load("@aspect_rules_ts//ts:defs.bzl", "ts_config", "ts_project")
44
load("@rules_python//python:defs.bzl", "py_test")
55

@@ -15,6 +15,11 @@ npm_link_package(
1515
src = "//web/platform:pkg",
1616
)
1717

18+
npm_link_package(
19+
name = "node_modules/@submitqueue/web-stovepipe",
20+
src = "//web/stovepipe:pkg",
21+
)
22+
1823
ts_config(
1924
name = "tsconfig",
2025
src = "tsconfig.json",
@@ -27,8 +32,33 @@ ts_project(
2732
no_emit = True,
2833
tsconfig = ":tsconfig",
2934
deps = [
35+
":node_modules/@submitqueue/web-platform",
36+
":node_modules/@submitqueue/web-stovepipe",
3037
":node_modules/@submitqueue/web-submitqueue",
38+
"//web:node_modules/@bufbuild/protobuf",
39+
"//web:node_modules/@connectrpc/connect",
40+
"//web:node_modules/@types/node",
41+
"//web:node_modules/react",
42+
"//web:node_modules/react-dom",
43+
],
44+
)
45+
46+
ts_config(
47+
name = "tsconfig_node",
48+
src = "tsconfig.node.json",
49+
deps = [":tsconfig"],
50+
)
51+
52+
ts_project(
53+
name = "consumer_node_typecheck",
54+
srcs = ["consumer.ts"],
55+
declaration = False,
56+
no_emit = True,
57+
tsconfig = ":tsconfig_node",
58+
deps = [
3159
":node_modules/@submitqueue/web-platform",
60+
":node_modules/@submitqueue/web-stovepipe",
61+
":node_modules/@submitqueue/web-submitqueue",
3262
"//web:node_modules/@bufbuild/protobuf",
3363
"//web:node_modules/@connectrpc/connect",
3464
"//web:node_modules/@types/node",
@@ -40,24 +70,24 @@ ts_project(
4070
py_test(
4171
name = "pack_contents_test",
4272
srcs = ["pack_contents_test.py"],
43-
main = "pack_contents_test.py",
44-
legacy_create_init = 0,
4573
args = ["$(rootpath //web/submitqueue:pkg.pack)"],
4674
data = ["//web/submitqueue:pkg.pack"],
75+
legacy_create_init = 0,
76+
main = "pack_contents_test.py",
4777
)
4878

4979
js_test(
5080
name = "consumer_runtime_test",
51-
entry_point = "consumer-runtime.mjs",
5281
data = [
53-
":node_modules/@submitqueue/web-submitqueue",
5482
":node_modules/@submitqueue/web-platform",
55-
"//web/submitqueue:node_modules",
83+
":node_modules/@submitqueue/web-submitqueue",
5684
"//web:node_modules/@bufbuild/protobuf",
5785
"//web:node_modules/@connectrpc/connect",
5886
"//web:node_modules/react",
5987
"//web:node_modules/react-dom",
88+
"//web/submitqueue:node_modules",
6089
],
90+
entry_point = "consumer-runtime.mjs",
6191
)
6292

6393
py_test(

‎web/test/package/consumer.ts‎

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
// Typechecks a host written only against the package's public entry points.
2-
import { SubmitQueueApp, SubmitQueueShell, WebNavigationProvider } from "@submitqueue/web-submitqueue";
2+
import { WebNavigationProvider } from "@submitqueue/web-platform";
3+
import { createLogCallback } from "@submitqueue/web-platform/logging";
4+
import { encodePathSegment } from "@submitqueue/web-platform/path-segment";
5+
import { StovepipeApp } from "@submitqueue/web-stovepipe";
6+
import { createStovepipeWeb, StovepipePaths, type StovepipeService } from "@submitqueue/web-stovepipe/server";
7+
import { SubmitQueueApp, SubmitQueueShell } from "@submitqueue/web-submitqueue";
38
import { createSubmitQueueWeb, type SubmitQueueGateway } from "@submitqueue/web-submitqueue/server";
49
import { createFakeGatewayReader } from "@submitqueue/web-submitqueue/extension/gateway/mock";
510
import { newHmacCursorCodec } from "@submitqueue/web-submitqueue/extension/cursor/hmac";
@@ -17,3 +22,19 @@ export async function render() {
1722
}
1823
return [WebNavigationProvider, SubmitQueueShell, SubmitQueueApp, result.model] as const;
1924
}
25+
26+
export async function renderStovepipe(service: StovepipeService) {
27+
const web = createStovepipeWeb({
28+
service,
29+
queues: [{ name: "demo-queue" }],
30+
paths: new StovepipePaths("/queues"),
31+
});
32+
const result = await web.handle({
33+
path: "/queues/" + encodePathSegment("demo-queue"),
34+
search: new URLSearchParams(),
35+
onLog: createLogCallback(),
36+
});
37+
return result.kind === "render"
38+
? [WebNavigationProvider, StovepipeApp, result.model] as const
39+
: null;
40+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"extends": "./tsconfig.json",
3+
"compilerOptions": {
4+
"moduleResolution": "Node"
5+
}
6+
}

0 commit comments

Comments
 (0)