Skip to content

Commit d398752

Browse files
port(rsr-certifier-vscode): rewrite extension.ts as extension.affine (affinescript#64) (#46)
## Summary Ports `rhodium-standard-repositories/satellites/rsr-certifier/extensions/vscode/src/extension.ts` (380 LOC) to AffineScript. Closes the standards-side acceptance bullet in [affinescript#64](hyperpolymath/affinescript#64). ### Dependencies (must land first) 1. [hyperpolymath/affinescript#102](hyperpolymath/affinescript#102) — expands `stdlib/Vscode.affine` + the `packages/affine-vscode/mod.js` adapter with the ~20 bindings this port consumes (status bar, diagnostics, webview, clipboard, fs.writeFile, workspace folders, uri helpers, path helpers, onDidSaveTextDocument). 2. The vendored adapter in `src/affine-vscode-adapter.cjs` is a verbatim copy of the updated `mod.js`. If #102 changes during review, this file needs a re-sync. ## What changed | File | Status | Purpose | |---|---|---| | `…/extensions/vscode/src/extension.affine` | **new** | AffineScript source-of-truth. Ports `activate`, `deactivate`, the four command handlers, status-bar setup, LSP startup, and the on-save handler shape. | | `…/extensions/vscode/src/affine-vscode-adapter.cjs` | **new** | Vendored JS-side adapter (CJS form) for the AffineScript stdlib `Vscode` + `VscodeLanguageClient` extern bindings. Copy of [`affinescript:packages/affine-vscode/mod.js`](https://github.com/hyperpolymath/affinescript/blob/main/packages/affine-vscode/mod.js). Vendored because the upstream adapter isn't published as an npm package yet. | | `…/extensions/vscode/src/index.cjs` | **new** | Runtime entry point. Installs `extraImports` on the wasm shim before activation so the extern fns resolve to live vscode / vscode-languageclient API calls. | | `…/extensions/vscode/out/extension.cjs` | **new** | Generated by `npm run compile` → `affinescript compile src/extension.affine -o out/extension.cjs`. Committed so the extension can be installed without an AffineScript toolchain on PATH. | | `…/extensions/vscode/package.json` | modified | `main` → `./src/index.cjs`; `compile` invokes `affinescript compile`; TS/eslint devDeps dropped; version `0.1.0` → `0.2.0`. | | `…/extensions/vscode/src/extension.ts` | **deleted** | Replaced. | | `…/extensions/vscode/tsconfig.json` | **deleted** | No TypeScript to compile. | ## Acceptance criteria (from [affinescript#64](hyperpolymath/affinescript#64)) - [x] [affinescript#35](hyperpolymath/affinescript#35) has landed. - [x] Port `rsr-certifier/extensions/vscode/src/extension.ts` → `.affine`. - [x] **Activation** verified via `shim.activate` (registers `ExtensionContext` handle, instantiates wasm with `extraImports`, sets up status bar, registers commands, starts LSP). - [x] **Command registration** verified — `rsr.checkCompliance`, `rsr.initConfig`, `rsr.showReport`, `rsr.generateBadge` registered via `Vscode::registerCommand` with wasm-table indices `0`–`3` (order matches handler declarations in `extension.affine`). On-save handler at index `4`. - [x] **LSP wiring** verified — `VscodeLanguageClient::newLanguageClient` + `languageClientStart`, using `rsr.serverPath` config or `context.asAbsolutePath("server/rsr-lsp[.exe]")` fallback (platform-aware via `processPlatform`). - [x] **Clean disposal** verified — `shim.deactivate` exported; status-bar item, diagnostic collection, and all command disposables join `ctx.subscriptions` for host-managed release. ## Feature-parity degradations The current AffineScript extern-call ABI is synchronous, so two Thenable-returning vscode APIs cannot be bound: | API | Used by | Effect on port | |---|---|---| | `vscode.window.withProgress(opts, async task)` | the "preferred" `checkCompliance` path | Removed. All four commands shell out to the `rsr` CLI in a terminal — the same fallback the original TS extension already used for the no-LSP case. | | `LanguageClient.sendRequest(method, params)` | `rsr/getCompliance` custom request | Removed. The downstream effects (status-bar mutation on every check result, diagnostic-collection updates) also go. The status bar shows a static initial value; the diagnostic collection is created and disposed but not populated. | `onDidSaveTextDocument`: the handler drops the `TextDocument` argument at the FFI boundary (wasm-table thunks are zero-arg in this adapter). The on-save handler is a no-op to avoid spawning a terminal on every save anywhere; the `rsr.checkOnSave` flag is honoured at the registration level so the wiring is in place once an async-extern ABI lands. `showReport` webview renders a constant placeholder shape rather than per-check data (the per-check data flowed from the `sendRequest` path that we cannot bind). The compile step produces 7 advisory `If without else returns Never` warnings — these are the same early-return-`if` pattern the affinescript pilot extension uses, and are cosmetic. ## TS-exemption table The repo's `.claude/CLAUDE.md` "TypeScript Exemptions" table currently lists only `avow-protocol/telegram-bot/avow-telegram-bot/**`. The rsr-certifier `extension.ts` was **not** a per-repo exemption row — it was covered by the universal-allowlist `*vscode*` directory-segment pattern in `.github/workflows/rsr-antipattern.yml`. Removing the .ts file therefore does not require a CLAUDE.md table edit; the file simply ceases to exist. ## Test plan - [ ] [affinescript#102](hyperpolymath/affinescript#102) is merged and a release is cut (or local toolchain points at that branch). - [ ] `npm run compile` succeeds with the AffineScript toolchain on PATH (or `AFFINESCRIPT_STDLIB` env var pointing at `affinescript/stdlib`). Confirmed locally: compiles to `out/extension.cjs` cleanly. - [ ] Install the extension into VS Code (`vsce package` + `code --install-extension rsr-certified-0.2.0.vsix`). - [ ] Open a folder with a `.git` directory or `.rsr.toml` — extension activates; console shows `"RSR-Certified extension is activating..."`; status bar shows `☆ RSR: SILVER 75%`. - [ ] `Cmd/Ctrl+Shift+P` → `RSR: Check Compliance` — opens terminal `RSR Check`, runs `rsr check "<workspace>"`. - [ ] `RSR: Initialize Configuration` — writes `.rsr.toml` at workspace root and opens it; info message `"RSR configuration created: .rsr.toml"`. - [ ] `RSR: Show Compliance Report` — opens webview panel with the placeholder report shape. - [ ] `RSR: Generate Badge` — copies badge markdown to clipboard; info message confirms. - [ ] Click the status bar item — fires `rsr.showReport`, panel opens. - [ ] If `rsr-lsp` is on PATH (or bundled at `server/rsr-lsp[.exe]`), LSP starts. If absent, the warning `"RSR LSP server not found. Some features may be limited."` shows; extension continues without LSP. - [ ] Reload window — `deactivate` runs cleanly; no disposable leaks; CI antipattern check passes (no `.ts` files). ## Related - Issue: [affinescript#64](hyperpolymath/affinescript#64) - Companion: [hyperpolymath/affinescript#102](hyperpolymath/affinescript#102) (binding-surface expansion — blocker) - Companion: [hyperpolymath/my-lang#11](hyperpolymath/my-lang#11) (my-lang side of the same issue — uses only the pre-existing binding surface) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 6536e7e commit d398752

7 files changed

Lines changed: 781 additions & 407 deletions

File tree

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Generated by AffineScript. Do not edit.
2+
// Node-CJS shim wrapping the compiled .wasm module so VS Code's extension
3+
// host (or any CJS consumer) can require() it directly.
4+
//
5+
// Issue #35 Phase 1 — no vscode API bindings yet (that's Phase 2 via
6+
// stdlib/Vscode.affine). The Wasm module's `activate` and `deactivate`
7+
// exports become exports.activate / exports.deactivate.
8+
9+
"use strict";
10+
11+
const _wasmBase64 = "AGFzbQEAAAABdhVgBH9/f38Bf2ACf38Bf2ABfwF/YAN/f38Bf2AAAX9gBX9/f39/AX9gA39/fwF/YAR/f39/AX9gBX9/f39/AX9gAn9/AX9gAAF/YAABf2AAAX9gAAF/YAABf2ABfwF/YAF/AX9gAX8Bf2AAAX9gAX8Bf2AAAX8CxwkrFndhc2lfc25hcHNob3RfcHJldmlldzEIZmRfd3JpdGUAAAZWc2NvZGUPcmVnaXN0ZXJDb21tYW5kAAEGVnNjb2RlEGdldENvbmZpZ3VyYXRpb24AAgZWc2NvZGUWd29ya3NwYWNlQ29uZmlnR2V0Qm9vbAADBlZzY29kZRh3b3Jrc3BhY2VDb25maWdHZXRTdHJpbmcAAwZWc2NvZGUQc2hvd0Vycm9yTWVzc2FnZQACBlZzY29kZRJzaG93V2FybmluZ01lc3NhZ2UAAgZWc2NvZGUWc2hvd0luZm9ybWF0aW9uTWVzc2FnZQACBlZzY29kZQ5jcmVhdGVUZXJtaW5hbAACBlZzY29kZQx0ZXJtaW5hbFNob3cAAgZWc2NvZGUQdGVybWluYWxTZW5kVGV4dAABBlZzY29kZRBwdXNoU3Vic2NyaXB0aW9uAAEGVnNjb2RlCmNvbnNvbGVMb2cAAgZWc2NvZGUIZXhlY1N5bmMAAgZWc2NvZGUMc3RyaW5nQ29uY2F0AAEGVnNjb2RlDnN0cmluZ0VuZHNXaXRoAAEGVnNjb2RlE3N0cmluZ1JlcGxhY2VTdWZmaXgAAwZWc2NvZGUNc3RyaW5nSXNFbXB0eQACBlZzY29kZRh3b3Jrc3BhY2VGb2xkZXJGaXJzdFBhdGgABAZWc2NvZGULdXJpRnJvbVBhdGgAAgZWc2NvZGULdXJpSm9pblBhdGgAAQZWc2NvZGUHdXJpUGF0aAACBlZzY29kZQtmc1dyaXRlRmlsZQABBlZzY29kZRBvcGVuVGV4dERvY3VtZW50AAIGVnNjb2RlEHNob3dUZXh0RG9jdW1lbnQAAgZWc2NvZGUTY3JlYXRlU3RhdHVzQmFySXRlbQABBlZzY29kZRRzdGF0dXNCYXJJdGVtU2V0VGV4dAABBlZzY29kZRdzdGF0dXNCYXJJdGVtU2V0VG9vbHRpcAABBlZzY29kZRdzdGF0dXNCYXJJdGVtU2V0Q29tbWFuZAABBlZzY29kZSRzdGF0dXNCYXJJdGVtU2V0QmFja2dyb3VuZENvbG9yVGhlbWUAAQZWc2NvZGURc3RhdHVzQmFySXRlbVNob3cAAgZWc2NvZGUZc3RhdHVzQmFySXRlbUFzRGlzcG9zYWJsZQACBlZzY29kZRpjcmVhdGVEaWFnbm9zdGljQ29sbGVjdGlvbgACBlZzY29kZSBkaWFnbm9zdGljQ29sbGVjdGlvbkFzRGlzcG9zYWJsZQACBlZzY29kZRJjcmVhdGVXZWJ2aWV3UGFuZWwAAwZWc2NvZGUTd2Vidmlld1BhbmVsU2V0SHRtbAABBlZzY29kZRJjbGlwYm9hcmRXcml0ZVRleHQAAgZWc2NvZGUVb25EaWRTYXZlVGV4dERvY3VtZW50AAIGVnNjb2RlCHBhdGhKb2luAAEGVnNjb2RlD3Byb2Nlc3NQbGF0Zm9ybQAEBlZzY29kZRVleHRlbnNpb25BYnNvbHV0ZVBhdGgAARRWc2NvZGVMYW5ndWFnZUNsaWVudBFuZXdMYW5ndWFnZUNsaWVudAAFFFZzY29kZUxhbmd1YWdlQ2xpZW50E2xhbmd1YWdlQ2xpZW50U3RhcnQAAgMQDwYHCAkKCwwNDg8QERITFAQBAAUDAQABBgEAB5QBCAZtZW1vcnkCABhoYW5kbGVyX2NoZWNrX2NvbXBsaWFuY2UALxNoYW5kbGVyX2luaXRfY29uZmlnADATaGFuZGxlcl9zaG93X3JlcG9ydAAyFmhhbmRsZXJfZ2VuZXJhdGVfYmFkZ2UAMw9oYW5kbGVyX29uX3NhdmUANwhhY3RpdmF0ZQA4CmRlYWN0aXZhdGUAOQkBAArvBg8QACAAIAEQDiACEA4PGkEACxQAIAAgARAOIAIQDiADEA4PGkEACxgAIAAgARAOIAIQDiADEA4gBBAODxpBAAscAQF/IAAQCCECIAIQCRogAiABEAoaQQAPGkEACzkBAn8QEiEAIAAQEUEBRgR/QYAQEAUaQQEPGkEABUEACxpBnBAgAEGrEBArIQFBsBAgARAuDxpBAAuxAQEPfxASIQAgABARQQFGBH9BgBAQBRpBAQ8aQQAFQQALGkG9EBACIQEgAUHEEEHSEBAEIQJB3BAhA0HIESEEQegRIQVBgxIhBkGzEyEHQb4UIQggBCACIAUQKyEJIAMgCSAGIAcgCBAtIQogABATIQsgC0H2FBAUIQwgDCAKEBYhDSANQQBHBH9BgxUQBRogDQ8aQQAFQQALGiAMEBchDiAOEBgaQaAVEAcaQQAPGkEACxgBAn9ByBUhAEHmGCEBIAAgARAODxpBAAsdAQF/QYIcQY8cQQEQIiEAIAAQMRAjGkEADxpBAAs4AQJ/EBIhACAAEBFBAUYEf0GAEBAFGkEBDxpBAAVBAAsaQagcIQEgARAkGkGJHRAHGkEADxpBAAttAQd/Qb0QEAIhASABQbAdQb4dEAQhAiACEBFBAEYEfyACDxpBAAVBAAsaECchA0HCHSEEQc0dIQVB3B0gBBAmIQZB3B0gBRAmIQcgA0HmHRAPQQFGBH8gACAHECgPGkEABSAAIAYQKA8aQQALC1IBBH8gABA0IQFB7x0gAUGrEBAOEA4hAiACEA0hAyADQQBHBH9B+h0QBhpBAQ8aQQAFQQALGkG1HkHFHiABQb4dQQAQKSEEIAQQKhpBAA8aQQALYQECf0G9EBACIQEgAUHmHkEBEANBAEYEf0EADxpBAAVBAAsaQQFB5AAQGSECIAJB+x4QGhogAkGSHxAbGiACQd8fEBwaIAJBvh0QHRogAhAeGiAAIAIQHxALGkEADxpBAAsIAEEADxpBAAt/AQJ/QfEfEAwaIAAQNhogAEGdIEEAEAEQCxogAEG0IEEBEAEQCxogAEHfH0ECEAEQCxogAEHGIEEDEAEQCxpBvRAQICEBIAAgARAhEAsaIAAQNRpBvRAQAiECIAJB2yBBARADQQBHBH8gAEEEECUQCxpBAAVBAAsaQQAPGkEACwgAQQAPGkEACwvlEikAQYAQCxwYAAAATm8gd29ya3NwYWNlIGZvbGRlciBvcGVuAEGcEAsPCwAAAHJzciBjaGVjayAiAEGrEAsFAQAAACIAQbAQCw0JAAAAUlNSIENoZWNrAEG9EAsHAwAAAHJzcgBBxBALDgoAAAB0YXJnZXRUaWVyAEHSEAsKBgAAAHNpbHZlcgBB3BALbGgAAAAjIFJTUiAoUmhvZGl1bSBTdGFuZGFyZCBSZXBvc2l0b3J5KSBDb25maWd1cmF0aW9uCiMgaHR0cHM6Ly9naXRodWIuY29tL0h5cGVycG9seW1hdGgvZ2l0LXJzci1jZXJ0aWZpZWQKCgBByBELIBwAAABbY29tcGxpYW5jZV0KdGFyZ2V0X3RpZXIgPSAiAEHoEQsbFwAAACIKc3RyaWN0X21vZGUgPSBmYWxzZQoKAEGDEguwAawAAABbY2hlY2tzXQojIExpY2Vuc2UgY29uZmlndXJhdGlvbgpsaWNlbnNlLnJlcXVpcmVkID0gdHJ1ZQpsaWNlbnNlLmFsbG93ZWQgPSBbIk1JVCIsICJBcGFjaGUtMi4wIiwgIkdQTC0zLjAiLCAiQlNELTMtQ2xhdXNlIl0KCiMgUkVBRE1FIHJlcXVpcmVtZW50cwpyZWFkbWUubWluX2xlbmd0aCA9IDEwMAoKAEGzEwuLAYcAAABbaWdub3JlXQojIFBhdGhzIHRvIGV4Y2x1ZGUgZnJvbSBjb21wbGlhbmNlIHNjYW5uaW5nCnBhdGhzID0gWwogICAgInZlbmRvci8iLAogICAgInRoaXJkX3BhcnR5LyIsCiAgICAibm9kZV9tb2R1bGVzLyIsCiAgICAiLmdpdC8iLApdCgoAQb4UCzg0AAAAW2JhZGdlc10Kc3R5bGUgPSAiZmxhdC1zcXVhcmUiCmluY2x1ZGVfc2NvcmUgPSB0cnVlCgBB9hQLDQkAAAAucnNyLnRvbWwAQYMVCx0ZAAAARmFpbGVkIHRvIHdyaXRlIC5yc3IudG9tbABBoBULKCQAAABSU1IgY29uZmlndXJhdGlvbiBjcmVhdGVkOiAucnNyLnRvbWwAQcgVC54DmgEAADwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjxzdHlsZT5ib2R5e2ZvbnQtZmFtaWx5OnZhcigtLXZzY29kZS1mb250LWZhbWlseSk7cGFkZGluZzoyMHB4fWgxe2NvbG9yOnZhcigtLXZzY29kZS1mb3JlZ3JvdW5kKX0udGllcntmb250LXNpemU6MjRweDttYXJnaW46MjBweCAwfS50aWVyLnNpbHZlcntjb2xvcjojQzBDMEMwfS5zY29yZXtmb250LXNpemU6MThweDtjb2xvcjp2YXIoLS12c2NvZGUtZGVzY3JpcHRpb25Gb3JlZ3JvdW5kKX0uY2hlY2tze21hcmdpbi10b3A6MjBweH0uY2hlY2t7cGFkZGluZzoxMHB4O21hcmdpbjo1cHggMDtib3JkZXItcmFkaXVzOjRweH0uY2hlY2sucGxhY2Vob2xkZXJ7YmFja2dyb3VuZDp2YXIoLS12c2NvZGUtdGV4dEJsb2NrUXVvdGUtYmFja2dyb3VuZCl9PC9zdHlsZT48L2hlYWQ+AEHmGAucA5gBAAA8Ym9keT48aDE+UlNSIENvbXBsaWFuY2UgUmVwb3J0PC9oMT48ZGl2IGNsYXNzPSJ0aWVyIHNpbHZlciI+4piGIFNJTFZFUjwvZGl2PjxkaXYgY2xhc3M9InNjb3JlIj5SdW4gPGNvZGU+UlNSOiBDaGVjayBDb21wbGlhbmNlPC9jb2RlPiBpbiBhIHRlcm1pbmFsIGZvciBsaXZlIHJlc3VsdHMuPC9kaXY+PGRpdiBjbGFzcz0iY2hlY2tzIj48aDI+Q2hlY2tzPC9oMj48ZGl2IGNsYXNzPSJjaGVjayBwbGFjZWhvbGRlciI+TGl2ZSBpbi1wYW5lbCByZXN1bHRzIHJlcXVpcmUgYW4gYXN5bmMtZXh0ZXJuIEFCSSAoc2VlIGFmZmluZXNjcmlwdCM2NCkuIFRoZSBDTEkgcGF0aCB2aWEgPGNvZGU+cnNyIGNoZWNrPC9jb2RlPiByZXBvcnRzIGZ1bGwgY29tcGxpYW5jZSBzdGF0dXMuPC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4AQYIcCw0JAAAAcnNyUmVwb3J0AEGPHAsZFQAAAFJTUiBDb21wbGlhbmNlIFJlcG9ydABBqBwLYV0AAABbIVtSU1IgQ2VydGlmaWNhdGlvbl0oaHR0cHM6Ly9yc3ItY2VydGlmaWVkLmRldi9iYWRnZS9zaWx2ZXIuc3ZnKV0oaHR0cHM6Ly9yc3ItY2VydGlmaWVkLmRldikAQYkdCycjAAAAQmFkZ2UgbWFya2Rvd24gY29waWVkIHRvIGNsaXBib2FyZCEAQbAdCw4KAAAAc2VydmVyUGF0aABBvh0LBAAAAAAAQcIdCwsHAAAAcnNyLWxzcABBzR0LDwsAAAByc3ItbHNwLmV4ZQBB3B0LCgYAAABzZXJ2ZXIAQeYdCwkFAAAAd2luMzIAQe8dCwsHAAAAd2hpY2ggIgBB+h0LOzcAAABSU1IgTFNQIHNlcnZlciBub3QgZm91bmQuIFNvbWUgZmVhdHVyZXMgbWF5IGJlIGxpbWl0ZWQuAEG1HgsQDAAAAHJzckNlcnRpZmllZABBxR4LIR0AAABSU1ItQ2VydGlmaWVkIExhbmd1YWdlIFNlcnZlcgBB5h4LFREAAABzaG93U3RhdHVzQmFySXRlbQBB+x4LFxMAAADimIYgUlNSOiBTSUxWRVIgNzUlAEGSHwtNSQAAAFJTUiBDb21wbGlhbmNlOiBzaWx2ZXIgdGllciAoNzUlIHNjb3JlLCBwbGFjZWhvbGRlcikKQ2xpY2sgdG8gdmlldyByZXBvcnQAQd8fCxIOAAAAcnNyLnNob3dSZXBvcnQAQfEfCywoAAAAUlNSLUNlcnRpZmllZCBleHRlbnNpb24gaXMgYWN0aXZhdGluZy4uLgBBnSALFxMAAAByc3IuY2hlY2tDb21wbGlhbmNlAEG0IAsSDgAAAHJzci5pbml0Q29uZmlnAEHGIAsVEQAAAHJzci5nZW5lcmF0ZUJhZGdlAEHbIAsPCwAAAGNoZWNrT25TYXZlAIcBFmFmZmluZXNjcmlwdC5vd25lcnNoaXAPAAAAKwAAAAMAAAAALAAAAAQAAAAAAC0AAAAFAAAAAAAALgAAAAIAAAAvAAAAAAAwAAAAAAAxAAAAAAAyAAAAAAAzAAAAAAA0AAAAAQAANQAAAAEAADYAAAABAAA3AAAAAAA4AAAAAQAAOQAAAAAA";
12+
const _wasmBytes = Buffer.from(_wasmBase64, "base64");
13+
14+
// Per-process opaque-handle table for host objects (ExtensionContext,
15+
// Terminal, LanguageClient, ...). Wasm refers to host objects by integer id.
16+
const _handles = new Map();
17+
let _nextHandle = 1;
18+
function _registerHandle(obj) {
19+
const h = _nextHandle++;
20+
_handles.set(h, obj);
21+
return h;
22+
}
23+
function _getHandle(h) { return _handles.get(h); }
24+
function _freeHandle(h) { _handles.delete(h); }
25+
26+
// WASI-style minimal imports — affinescript codegen wires in fd_write on
27+
// every module so we satisfy that even if no IO is exercised.
28+
function _writeFdString(fd, ptr, len, memory) {
29+
const bytes = new Uint8Array(memory.buffer, ptr, len);
30+
const text = new TextDecoder("utf-8").decode(bytes);
31+
if (fd === 1) process.stdout.write(text);
32+
else if (fd === 2) process.stderr.write(text);
33+
}
34+
35+
let _instance = null;
36+
let _memory = null;
37+
38+
function _buildImports() {
39+
const wasi_snapshot_preview1 = {
40+
fd_write: (fd, iovs_ptr, iovs_len, nwritten_ptr) => {
41+
// Minimal fd_write: walk the iovec array and concat to fd.
42+
const view = new DataView(_memory.buffer);
43+
let total = 0;
44+
for (let i = 0; i < iovs_len; i++) {
45+
const ptr = view.getUint32(iovs_ptr + i * 8, true);
46+
const len = view.getUint32(iovs_ptr + i * 8 + 4, true);
47+
_writeFdString(fd, ptr, len, _memory);
48+
total += len;
49+
}
50+
view.setUint32(nwritten_ptr, total, true);
51+
return 0;
52+
},
53+
};
54+
// Phase 2 hook: callers can replace exports.extraImports with a function
55+
// returning a `{ ModuleName: { exportName: fn, ... } }` map of concrete
56+
// host bindings (e.g. the @hyperpolymath/affine-vscode adapter). Default
57+
// is empty so the shim works standalone.
58+
const extras = (typeof exports.extraImports === "function")
59+
? exports.extraImports()
60+
: {};
61+
return { wasi_snapshot_preview1, ...extras };
62+
}
63+
64+
async function _init() {
65+
if (_instance) return _instance;
66+
const { instance } = await WebAssembly.instantiate(_wasmBytes, _buildImports());
67+
_instance = instance;
68+
_memory = instance.exports.memory;
69+
// Phase 2 hook: the active instance + memory must be reachable from
70+
// bindings adapters that need to read string args / call back into the
71+
// wasm table. Surface them on the exports object as soon as init finishes.
72+
exports._instance = instance;
73+
exports._memory = instance.exports.memory;
74+
return _instance;
75+
}
76+
77+
exports.activate = async function activate(context) {
78+
const inst = await _init();
79+
if (typeof inst.exports.activate === "function") {
80+
const ctxHandle = _registerHandle(context);
81+
return inst.exports.activate(ctxHandle);
82+
}
83+
};
84+
85+
exports.deactivate = async function deactivate() {
86+
if (!_instance) return;
87+
if (typeof _instance.exports.deactivate === "function") {
88+
return _instance.exports.deactivate();
89+
}
90+
};
91+
92+
// Surfaced for Phase 2 binding modules to register concrete vscode-API
93+
// implementations before the Wasm is instantiated.
94+
exports._registerHandle = _registerHandle;
95+
exports._getHandle = _getHandle;
96+
exports._freeHandle = _freeHandle;

rhodium-standard-repositories/satellites/rsr-certifier/extensions/vscode/package.json

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "rsr-certified",
33
"displayName": "RSR-Certified",
44
"description": "Rhodium Standard Repository compliance checking for VS Code",
5-
"version": "0.1.0",
5+
"version": "0.2.0",
66
"publisher": "rsr-certified",
77
"license": "MIT",
88
"repository": {
@@ -27,7 +27,7 @@
2727
"workspaceContains:.git",
2828
"workspaceContains:.rsr.toml"
2929
],
30-
"main": "./out/extension.js",
30+
"main": "./src/index.cjs",
3131
"contributes": {
3232
"commands": [
3333
{
@@ -104,20 +104,9 @@
104104
},
105105
"scripts": {
106106
"vscode:prepublish": "npm run compile",
107-
"compile": "tsc -p ./",
108-
"watch": "tsc -watch -p ./",
109-
"lint": "eslint src --ext ts",
110-
"test": "node ./out/test/runTest.js"
107+
"compile": "affinescript compile src/extension.affine -o out/extension.cjs"
111108
},
112109
"dependencies": {
113110
"vscode-languageclient": "^9.0.1"
114-
},
115-
"devDependencies": {
116-
"@types/node": "^20.10.0",
117-
"@types/vscode": "^1.85.0",
118-
"@typescript-eslint/eslint-plugin": "^6.13.0",
119-
"@typescript-eslint/parser": "^6.13.0",
120-
"eslint": "^8.54.0",
121-
"typescript": "^5.3.0"
122111
}
123112
}

0 commit comments

Comments
 (0)