From d589b0dd974d35533ad70bbe5ec9352e4d9076e9 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Wed, 14 Oct 2026 20:09:50 +0000 Subject: [PATCH] fix(web): support legacy TypeScript package resolution --- web/BUILD.bazel | 23 ++++++++-------- web/platform/package.json | 7 +++++ web/stovepipe/package.json | 6 +++++ web/submitqueue/package.json | 8 ++++++ web/test/package/BUILD.bazel | 42 ++++++++++++++++++++++++----- web/test/package/consumer.ts | 23 +++++++++++++++- web/test/package/tsconfig.node.json | 6 +++++ 7 files changed, 97 insertions(+), 18 deletions(-) create mode 100644 web/test/package/tsconfig.node.json diff --git a/web/BUILD.bazel b/web/BUILD.bazel index f222101e7..9dc880121 100644 --- a/web/BUILD.bazel +++ b/web/BUILD.bazel @@ -11,15 +11,6 @@ test_suite( tests = [ "//web/api:generate_tests", "//web/api:test", - "//web/test/package:consumer_typecheck_typecheck_test", - "//web/test/package:consumer_runtime_test", - "//web/test/package:pack_contents_test", - "//web/test/package/react18:react18_runtime_test", - "//web/service/submitqueue:lint", - "//web/service/submitqueue:test", - "//web/service/submitqueue:typecheck_typecheck_test", - "//web/submitqueue:test", - "//web/submitqueue:typecheck_typecheck_test", "//web/platform:lint", "//web/platform:test", "//web/platform:typecheck_typecheck_test", @@ -29,16 +20,26 @@ test_suite( "//web/service/stovepipe:lint", "//web/service/stovepipe:test", "//web/service/stovepipe:typecheck_typecheck_test", + "//web/service/submitqueue:lint", + "//web/service/submitqueue:test", + "//web/service/submitqueue:typecheck_typecheck_test", "//web/stovepipe:lint", "//web/stovepipe:test", "//web/stovepipe:typecheck_typecheck_test", "//web/submitqueue:lint", + "//web/submitqueue:test", + "//web/submitqueue:typecheck_typecheck_test", "//web/test/e2e/stovepipe:run_e2e_test", "//web/test/e2e/stovepipe:typecheck_typecheck_test", - "//web/test/testutil:compose_test", - "//web/test/package:stovepipe_pack_contents_test", "//web/test/e2e/submitqueue:run_e2e_test", "//web/test/e2e/submitqueue:typecheck_typecheck_test", + "//web/test/package:consumer_node_typecheck_typecheck_test", + "//web/test/package:consumer_runtime_test", + "//web/test/package:consumer_typecheck_typecheck_test", + "//web/test/package:pack_contents_test", + "//web/test/package:stovepipe_pack_contents_test", + "//web/test/package/react18:react18_runtime_test", + "//web/test/testutil:compose_test", ], ) diff --git a/web/platform/package.json b/web/platform/package.json index e4a882147..e2c4e2a1a 100644 --- a/web/platform/package.json +++ b/web/platform/package.json @@ -3,6 +3,13 @@ "version": "0.0.0", "private": true, "type": "module", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "path-segment": ["dist/path-segment.d.ts"], + "logging": ["dist/logging.d.ts"] + } + }, "sideEffects": [ "./styles.css" ], diff --git a/web/stovepipe/package.json b/web/stovepipe/package.json index cd69ed8f8..995fbc2c4 100644 --- a/web/stovepipe/package.json +++ b/web/stovepipe/package.json @@ -3,6 +3,12 @@ "version": "0.0.0", "private": true, "type": "module", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "server": ["dist/server.d.ts"] + } + }, "sideEffects": [ "./view/styles.css" ], diff --git a/web/submitqueue/package.json b/web/submitqueue/package.json index 9e693cc7e..d4e6e24ed 100644 --- a/web/submitqueue/package.json +++ b/web/submitqueue/package.json @@ -3,6 +3,14 @@ "version": "0.0.0", "private": true, "type": "module", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "server": ["dist/server.d.ts"], + "extension/gateway/mock": ["dist/extension/gateway/mock/index.d.ts"], + "extension/cursor/hmac": ["dist/extension/cursor/hmac/index.d.ts"] + } + }, "sideEffects": [ "./view/styles.css" ], diff --git a/web/test/package/BUILD.bazel b/web/test/package/BUILD.bazel index 5a9785e31..de29edbab 100644 --- a/web/test/package/BUILD.bazel +++ b/web/test/package/BUILD.bazel @@ -1,5 +1,5 @@ -load("@aspect_rules_js//npm:defs.bzl", "npm_link_package") load("@aspect_rules_js//js:defs.bzl", "js_test") +load("@aspect_rules_js//npm:defs.bzl", "npm_link_package") load("@aspect_rules_ts//ts:defs.bzl", "ts_config", "ts_project") load("@rules_python//python:defs.bzl", "py_test") @@ -15,6 +15,11 @@ npm_link_package( src = "//web/platform:pkg", ) +npm_link_package( + name = "node_modules/@submitqueue/web-stovepipe", + src = "//web/stovepipe:pkg", +) + ts_config( name = "tsconfig", src = "tsconfig.json", @@ -27,8 +32,33 @@ ts_project( no_emit = True, tsconfig = ":tsconfig", deps = [ + ":node_modules/@submitqueue/web-platform", + ":node_modules/@submitqueue/web-stovepipe", ":node_modules/@submitqueue/web-submitqueue", + "//web:node_modules/@bufbuild/protobuf", + "//web:node_modules/@connectrpc/connect", + "//web:node_modules/@types/node", + "//web:node_modules/react", + "//web:node_modules/react-dom", + ], +) + +ts_config( + name = "tsconfig_node", + src = "tsconfig.node.json", + deps = [":tsconfig"], +) + +ts_project( + name = "consumer_node_typecheck", + srcs = ["consumer.ts"], + declaration = False, + no_emit = True, + tsconfig = ":tsconfig_node", + deps = [ ":node_modules/@submitqueue/web-platform", + ":node_modules/@submitqueue/web-stovepipe", + ":node_modules/@submitqueue/web-submitqueue", "//web:node_modules/@bufbuild/protobuf", "//web:node_modules/@connectrpc/connect", "//web:node_modules/@types/node", @@ -40,24 +70,24 @@ ts_project( py_test( name = "pack_contents_test", srcs = ["pack_contents_test.py"], - main = "pack_contents_test.py", - legacy_create_init = 0, args = ["$(rootpath //web/submitqueue:pkg.pack)"], data = ["//web/submitqueue:pkg.pack"], + legacy_create_init = 0, + main = "pack_contents_test.py", ) js_test( name = "consumer_runtime_test", - entry_point = "consumer-runtime.mjs", data = [ - ":node_modules/@submitqueue/web-submitqueue", ":node_modules/@submitqueue/web-platform", - "//web/submitqueue:node_modules", + ":node_modules/@submitqueue/web-submitqueue", "//web:node_modules/@bufbuild/protobuf", "//web:node_modules/@connectrpc/connect", "//web:node_modules/react", "//web:node_modules/react-dom", + "//web/submitqueue:node_modules", ], + entry_point = "consumer-runtime.mjs", ) py_test( diff --git a/web/test/package/consumer.ts b/web/test/package/consumer.ts index 99d193ccb..880779762 100644 --- a/web/test/package/consumer.ts +++ b/web/test/package/consumer.ts @@ -1,5 +1,10 @@ // Typechecks a host written only against the package's public entry points. -import { SubmitQueueApp, SubmitQueueShell, WebNavigationProvider } from "@submitqueue/web-submitqueue"; +import { WebNavigationProvider } from "@submitqueue/web-platform"; +import { createLogCallback } from "@submitqueue/web-platform/logging"; +import { encodePathSegment } from "@submitqueue/web-platform/path-segment"; +import { StovepipeApp } from "@submitqueue/web-stovepipe"; +import { createStovepipeWeb, StovepipePaths, type StovepipeService } from "@submitqueue/web-stovepipe/server"; +import { SubmitQueueApp, SubmitQueueShell } from "@submitqueue/web-submitqueue"; import { createSubmitQueueWeb, type SubmitQueueGateway } from "@submitqueue/web-submitqueue/server"; import { createFakeGatewayReader } from "@submitqueue/web-submitqueue/extension/gateway/mock"; import { newHmacCursorCodec } from "@submitqueue/web-submitqueue/extension/cursor/hmac"; @@ -17,3 +22,19 @@ export async function render() { } return [WebNavigationProvider, SubmitQueueShell, SubmitQueueApp, result.model] as const; } + +export async function renderStovepipe(service: StovepipeService) { + const web = createStovepipeWeb({ + service, + queues: [{ name: "demo-queue" }], + paths: new StovepipePaths("/queues"), + }); + const result = await web.handle({ + path: "/queues/" + encodePathSegment("demo-queue"), + search: new URLSearchParams(), + onLog: createLogCallback(), + }); + return result.kind === "render" + ? [WebNavigationProvider, StovepipeApp, result.model] as const + : null; +} diff --git a/web/test/package/tsconfig.node.json b/web/test/package/tsconfig.node.json new file mode 100644 index 000000000..b189a9a29 --- /dev/null +++ b/web/test/package/tsconfig.node.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "moduleResolution": "Node" + } +}