Skip to content

Read VSCode extension namespace from the manifest#383

Closed
holodorum wants to merge 4 commits into
kson-org:mainfrom
holodorum:namespace-vscode-contributions
Closed

Read VSCode extension namespace from the manifest#383
holodorum wants to merge 4 commits into
kson-org:mainfrom
holodorum:namespace-vscode-contributions

Conversation

@holodorum
Copy link
Copy Markdown
Collaborator

The upstream kson extension hard-coded "kson" as the prefix for its contributed command ids (kson.selectSchema) and configuration properties (kson.format.*, kson.codeLens.enable, kson.trace.server, ...).

The client now reads the namespace from a ksonConfigNamespace top-level manifest field, falling back to "kson", and passes it to the server via initializationOptions. CommandType enum values are unqualified ids (plainFormat, compactFormat, ...) with the wire prefix applied at the LSP boundary via toWireCommandId / fromWireCommandId — both exported so the client doesn't hand-build wire ids either. KsonSettings is flattened to drop the fixed { kson: {...} } wrapper and a single unwrapPushedSettings helper handles both namespaced and already-scoped push payloads.

The formatter parses with `ignoreErrors = true`, which can leave hidden
`AstNodeError` nodes in a tree where `hasErrors()` still returns false.
`resolveEmbedBlocks` called `root.toKsonValue()` directly, so those
hidden errors surfaced as a `ShouldNotHappenException` that escaped
`format()` instead of falling back to the original source. This only
reproduced when embed block rules were configured.

Take a `KsonValue` in `resolveEmbedBlocks` instead of a `KsonRoot`, and
have the caller source it from `AstParseResult.ksonValue` — which
already catches the conversion exception and returns null. The new
`ksonValue != null` guard is strictly stronger than the previous
`!hasErrors()` check.
The upstream kson extension hard-coded "kson" as the prefix for its
contributed command ids (kson.selectSchema) and configuration
properties (kson.format.*, kson.codeLens.enable, kson.trace.server,
...).

The client now reads the namespace from a `ksonConfigNamespace`
top-level manifest field and then  "kson", and passes it to the server
via initializationOptions. CommandType enum values are unqualified ids
(plainFormat, compactFormat, ...) with the wire prefix applied at the
LSP boundary via toWireCommandId / fromWireCommandId — both exported so
the client doesn't hand-build wire ids either. KsonSettings is flattened
to drop the fixed { kson: {...} } wrapper and a single
unwrapPushedSettings helper handles both namespaced and already-scoped
push payloads.
@holodorum holodorum force-pushed the namespace-vscode-contributions branch from c58fda3 to 79a0915 Compare May 4, 2026 13:38
holodorum added 2 commits May 6, 2026 11:22
Make the VSCode extension's package.json the single source of truth for
the command/config namespace prefix. The base manifest now declares
"ksonConfigNamespace": "kson" explicitly, and the client-side reader
throws when the field is missing instead of silently falling back to a
default. A fork that rebrands the extension can no longer half-configure
itself by setting the contribution strings without updating the
namespace declaration. Tighten the same contract on the LSP side:
DiagnosticService and KsonTextDocumentService now require the namespace
at construction (no implicit kson default), tests assert the contract
("source equals the configured namespace") rather than the literal
value, and DEFAULT_CONFIG_NAMESPACE is no longer re-exported on the
public package API since the manifest is now the only sanctioned source.
The LSP server's initializationOptions fallback stays in place since
arbitrary LSP clients can't be expected to send it.
`name` is already required to be unique per publisher and every
contributed command id / configuration key in the manifest already
lives under `kson.*`, so it IS the wire-level identifier. The client
reads it directly and threads it as `distributionId` (renamed from the
more generic `configNamespace`) into the LSP initialization options,
the LanguageClient id, and `${name}.selectSchema` registrations. The
redundant `ksonConfigNamespace` manifest field is gone since it
duplicated `name` and could drift; the explicit "throw if missing"
check is gone since VSCode itself rejects manifests without `name`.
`KsonSettings` is also unwrapped — the server now strips the outer
namespace key before applying defaults, so the type is
`{ formatOptions, codeLensEnabled }` rather than `{ kson: {...} }`.
@holodorum
Copy link
Copy Markdown
Collaborator Author

Closed in favor of #388

@holodorum holodorum closed this May 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant