diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9da48c0..add6769 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,9 @@ jobs: - name: Lint run: npm run lint + - name: Type-check tab + run: npm run typecheck + - name: Test run: npm test diff --git a/CLAUDE.md b/CLAUDE.md index de9a46c..6587269 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -99,23 +99,25 @@ service endpoint. The tab never sees raw credentials outside that attachment. `package.json` has no `dependencies`, so nothing is installed into `dist/tb-stop-tunnel`. -- **Web/tab code** (`tb-build-info/scripts/*.js`) runs in the browser inside Azure - DevOps and is bundled by webpack (`webpack.config.js`) with AMD output and - `@babel/preset-env`. The two entry points (`info`, `dialog`) emit to - `dist/tb-build-info/scripts/`. The host-provided SDK modules (`TFS/*`, `VSS/*`, - `react`) are declared as webpack **externals** (`externalsType: 'amd'`) — they - are resolved by the VSS module loader at runtime, not bundled. Add any new - host-provided module to the `externals` list in `webpack.config.js`, or the - bundle will try to inline it. `info.js` still uses `Buffer`, so the config - provides a `buffer` polyfill (removed when the tab is rewritten — see - `MODERNIZATION.md` Phase 3). +- **Web/tab code** (`tb-build-info/scripts/*.ts`) runs in the browser inside Azure + DevOps. It is TypeScript using `azure-devops-extension-sdk` (v4) + + `azure-devops-extension-api` (v5) — `SDK.init`/`SDK.ready`/`SDK.getService`, + `BuildRestClient` for attachments, `ServiceEndpointRestClient` for the data + source, `IHostPageLayoutService.openCustomDialog` for the embed dialog. webpack + (`webpack.config.js`) bundles it **self-contained** (the SDK/API and `md5` are + bundled in, not external) via `@babel/preset-env` + `@babel/preset-typescript`; + the two entry points (`info`, `dialog`) emit to `dist/tb-build-info/scripts/`. + `infoTab.html` / `embedDialog.html` load those bundles directly with a plain + ` - -
+ + +