Built and signed on GitHub ActionsBuilt and signed on GitHub Actions
The low-level *scaffolding engine* used internally by `@vsce/cli` (https://jsr.io/@vsce/cli) β our all-in-one, fully-featured development suite.
@vsce/create
π¦ The Deno-native scaffolding tool for modern, dual-runtime VS Code extensions
@vsce/create
bootstraps Deno-first, web-compatible VS Code extensions in seconds. Each project it generates is ready to build with @vsce/bundler
and ships with type-safe VS Code APIs via @typed/vscode
.
Heads-up!
@vsce/create
is the low-level scaffolding engine used internally by@vsce/cli
β our all-in-one, fully-featured development suite. If you want the entire toolchain (project generation, dev server, bundling, testing, publishing) in one command, install@vsce/cli
instead.
β¨ Features
Category | Details |
---|---|
π¦ Deno-Native | No Node.js toolchain requiredβscaffolds projects you can run & build with Deno only. |
π Dual Runtime | Templates target both Desktop and Web extension hosts out-of-the-box (extensionKind: ["workspace", "web"] ). |
ποΈ Rich Templates | basic , treeview , webview , and language-server templates plus shared utilities. |
π¦ Bundler-Ready | Generates a scripts/build.ts that calls @vsce/bundler for a single-file, web-safe bundle. |
π§ VS Code Tasks | Emits .vscode/tasks.json & .vscode/launch.json for one-click build, test & debug. |
β Strict Types | Uses @typed/vscode definitions with full TypeScript --strict compliance. |
π₯ Installation
# Add to your Deno project (recommended) deno add @vsce/create
or run directly without installation:
deno run -A jsr:@vsce/create@latest init my-extension
@vsce/create
targets Deno β₯1.44 and VS Code β₯1.90.
π Quick Start
# Scaffold a Tree View extension deno run -A jsr:@vsce/create init my-treeview --template treeview cd my-treeview # Build the extension (outputs dist/extension.js) deno task build # Test everything deno task test
Resulting structure (example treeview
):
my-treeview/ βββ README.md # template-specific doc βββ deno.json # import map + tasks + lint/fmt βββ jsr.json # JSR package meta βββ package.json # VS Code extension manifest βββ scripts/ β βββ build.ts # calls @vsce/bundler βββ src/ β βββ extension.ts # your entry point βββ .vscode/ βββ extensions.json # recommended VS Code extensions βββ tasks.json # build / test tasks βββ launch.json # debug configuration
ποΈ Available Templates
Template | Description |
---|---|
basic |
Minimal βHello Worldβ commandβperfect seed for small utilities. |
treeview |
Demonstrates TreeDataProvider , custom view registration and refresh command. |
webview |
Shows how to create a Webview panel with static HTML content. |
language-server |
Runs a minimal language server in a Web Worker using vscode-languageclient/browser . |
π Development Workflow
- Start coding inside
src/extension.ts
(or additional modules).
VS Code + the Deno extension give you instant type-checking and IntelliSense. - Press
F5
to run the Run Extension launch target (uses Deno to executescripts/build.ts
). - Run tests with
deno task test
(generated for you).
All templates include example tests you can extend. - Bundle with
deno task build
for production. The outputdist/extension.js
works for both desktop and web versions of VS Code.
Web Extension Support
Why Web Extensions?
This package is optimized for the VSCode Web Extensions runtime as our pragmatic path to bringing VSCode extension development to Deno. While our ideal would be full parity with the Node.js extension development environment, the web extension runtime represents the best available approach given current VSCode architecture limitations.
The Reality:
- π― Goal: Enable Deno-native VSCode extension development
- β οΈ Challenge: VSCode's extension host is deeply integrated with Node.js
- β Solution: Leverage the web extension runtime for Deno compatibility
- πͺ Future: Working toward fuller Node.js runtime parity as the ecosystem evolves
Universal Compatibility
The web extension runtime enables you to create extensions that run everywhere - both desktop VSCode and web-based environments (vscode.dev, github.dev, GitHub Codespaces):
import * as vscode from "@typed/vscode"; // Web extensions run on BOTH desktop and web VSCode export function activate(context: vscode.ExtensionContext): void { // Full VSCode API support: TreeView, Commands, Language Features, etc. const provider = new MyTreeDataProvider(); vscode.window.createTreeView('myView', { treeDataProvider: provider }); // Limitation: Node.js APIs are not available (browser sandbox restrictions) // However, we can use Deno's web API's as a drop-in replacement for some Node.js APIs // The extension works identically on desktop and web! }
Key Benefits:
- β Universal compatibility - One extension runs on desktop AND web VSCode
- β Full VSCode API access - Commands, UI, language features, etc.
- β Modern deployment - Works in vscode.dev, github.dev, Codespaces
- β οΈ Browser limitations - No Node.js/filesystem APIs (applies to web runtime only)
π§ Deno VSCode Extension Ecosystem (WIP) π§
@typed/vscode
is part of a complete ecosystem for Deno-based VSCode extension development. Explore these complementary packages:
π οΈ Development Tools
@vsce/cli - Command-line tools for Deno VSCode extensions
deno add @vsce/cli
- Project scaffolding and templates
- Development server with hot reload
- Build and packaging utilities
- Extension testing and validation
@vsce/create - Project generator for new extensions
deno add @vsce/create
- Interactive project setup
- Multiple template options (basic, language server, tree view, etc.)
- Deno-optimized project structure
- Best practices and conventions built-in
π§ Build and Bundle
@vsce/bundler - Web extension bundler for Deno
deno add @vsce/bundler
- Bundle Deno code for VSCode web extensions
- Tree shaking and optimization
- Source map support
- Multi-target builds (desktop + web)
π§ͺ Testing Framework
@vsce/testing - Testing utilities for VSCode extensions
deno add @vsce/testing
- Mock VSCode APIs for unit testing
- Extension host simulation
- Language server testing utilities
- TreeView and UI component testing
π Complete Example
// extension.ts - Built with the full @vsce ecosystem import * as vscode from "@typed/vscode"; import { createLanguageServer } from "@vsce/cli"; import { MockExtensionContext } from "@vsce/testing"; export async function activate(context: vscode.ExtensionContext): Promise<void> { // Full ecosystem integration example const server = await createLanguageServer({ name: 'my-language-server', languages: ['typescript', 'javascript'] }); context.subscriptions.push( vscode.languages.registerHoverProvider(['typescript'], server), vscode.languages.registerCompletionItemProvider(['typescript'], server) ); }
Runtime Compatibility
Environment | Support | Notes |
---|---|---|
VSCode Desktop | β Full | All APIs available |
VSCode Web | β Most APIs | No Node.js/filesystem APIs |
Deno Runtime | β Type-checking | For development and testing |
GitHub Codespaces | β Full | Web + server APIs |
vscode.dev | β Web APIs | Browser-based development |
π Docs & Resources
- VS Code Extension API: https://code.visualstudio.com/api
- VS Code Web Extensions Guide: https://code.visualstudio.com/api/extension-guides/web-extensions
- Deno Runtime Documentation: https://docs.deno.com
- JSR Package Registry: https://jsr.io
License
MIT License - see LICENSE for details.
Happy coding with Deno + VSCode! π¦β‘
Part of the @vsce ecosystem for Deno-based VSCode extension development.
Add Package
deno add jsr:@vsce/create
Import symbol
import * as create from "@vsce/create";
Import directly with a jsr specifier
import * as create from "jsr:@vsce/create";
Add Package
pnpm i jsr:@vsce/create
pnpm dlx jsr add @vsce/create
Import symbol
import * as create from "@vsce/create";
Add Package
yarn add jsr:@vsce/create
yarn dlx jsr add @vsce/create
Import symbol
import * as create from "@vsce/create";
Add Package
vlt install jsr:@vsce/create
Import symbol
import * as create from "@vsce/create";
Add Package
npx jsr add @vsce/create
Import symbol
import * as create from "@vsce/create";
Add Package
bunx jsr add @vsce/create
Import symbol
import * as create from "@vsce/create";