Vue component for editing Vue components with interactive REPL functionality.
—
Import map management provides Vue-specific utilities for managing CDN URLs, version switching, and ES module resolution in the browser environment. It handles Vue runtime imports, version compatibility, and module resolution for the preview system.
Creates Vue-specific import map configuration with version management and production/development mode switching.
/**
* Creates Vue-specific import map configuration with version management
* @param defaults - Default URL configurations for Vue runtime
* @returns Reactive import map system with version controls
*/
function useVueImportMap(defaults?: {
/** Custom development Vue runtime URL or URL factory function */
runtimeDev?: string | (() => string);
/** Custom production Vue runtime URL or URL factory function */
runtimeProd?: string | (() => string);
/** Custom Vue server-renderer URL or URL factory function */
serverRenderer?: string | (() => string);
/** Initial Vue version to use */
vueVersion?: string | null;
}): {
/** Reactive flag for production vs development mode */
productionMode: Ref<boolean>;
/** Computed import map configuration */
importMap: ComputedRef<ImportMap>;
/** Reactive Vue version reference */
vueVersion: Ref<string | null>;
/** Default Vue version from package dependencies */
defaultVersion: string;
};Usage Examples:
import { useVueImportMap } from "@vue/repl/core";
// Basic usage with defaults
const { importMap, vueVersion, productionMode } = useVueImportMap();
// Custom configuration
const { importMap, vueVersion, productionMode } = useVueImportMap({
runtimeDev: 'https://unpkg.com/vue@3.4.0/dist/vue.esm-browser.js',
runtimeProd: 'https://unpkg.com/vue@3.4.0/dist/vue.esm-browser.prod.js',
serverRenderer: 'https://unpkg.com/@vue/server-renderer@3.4.0/dist/server-renderer.esm-browser.js',
vueVersion: '3.4.0'
});
// Switch to production mode
productionMode.value = true;
// Change Vue version dynamically
vueVersion.value = '3.3.0'; // Automatically updates import map
// Access the computed import map
console.log(importMap.value);
// {
// imports: {
// "vue": "https://cdn.jsdelivr.net/npm/@vue/runtime-dom@3.4.0/dist/runtime-dom.esm-browser.js",
// "vue/server-renderer": "https://cdn.jsdelivr.net/npm/@vue/server-renderer@3.4.0/dist/server-renderer.esm-browser.js"
// }
// }Standard ES import map structure for browser module resolution.
/**
* Standard ES import map structure for module resolution
*/
interface ImportMap {
/** Module specifier to URL mappings */
imports?: Record<string, string | undefined>;
/** Scoped module mappings for specific URL prefixes */
scopes?: Record<string, Record<string, string>>;
}Utility functions for working with import map objects.
/**
* Merge two import map objects, with second taking precedence
* @param a - Base import map
* @param b - Import map to merge (takes precedence)
* @returns Merged import map with combined imports and scopes
*/
function mergeImportMap(a: ImportMap, b: ImportMap): ImportMap;Usage Examples:
import { mergeImportMap } from "@vue/repl/core";
const baseMap: ImportMap = {
imports: {
'vue': 'https://cdn.jsdelivr.net/npm/vue@3.4.0/dist/vue.esm-browser.js',
'lodash': 'https://cdn.skypack.dev/lodash'
}
};
const additionalMap: ImportMap = {
imports: {
'axios': 'https://cdn.skypack.dev/axios',
'vue': 'https://unpkg.com/vue@3.3.0/dist/vue.esm-browser.js' // Override
},
scopes: {
'https://cdn.skypack.dev/': {
'vue': 'https://cdn.skypack.dev/vue@3.4.0'
}
}
};
const merged = mergeImportMap(baseMap, additionalMap);
console.log(merged);
// {
// imports: {
// 'vue': 'https://unpkg.com/vue@3.3.0/dist/vue.esm-browser.js', // Override from b
// 'lodash': 'https://cdn.skypack.dev/lodash',
// 'axios': 'https://cdn.skypack.dev/axios'
// },
// scopes: {
// 'https://cdn.skypack.dev/': {
// 'vue': 'https://cdn.skypack.dev/vue@3.4.0'
// }
// }
// }Utilities for handling Vue version compatibility and feature detection.
/**
* Parse version string into numeric array for comparison
* @param version - Semantic version string (e.g., "3.4.0")
* @returns Array of version numbers [major, minor, patch]
*/
function getVersions(version: string): number[];
/**
* Check if Vue version supports vapor mode (experimental)
* @param version - Vue version string
* @returns True if vapor mode is supported (3.6+)
*/
function isVaporSupported(version: string): boolean;Usage Examples:
import { getVersions, isVaporSupported } from "@vue/repl/core";
// Version parsing
const versions = getVersions('3.4.15');
console.log(versions); // [3, 4, 15]
// Feature detection
console.log(isVaporSupported('3.5.0')); // false
console.log(isVaporSupported('3.6.0')); // true
console.log(isVaporSupported('3.7.2')); // true
// Version comparison
const [major, minor, patch] = getVersions('3.4.0');
const supportsFeature = major > 3 || (major === 3 && minor >= 4);The import map system automatically generates appropriate CDN URLs based on Vue version and mode:
Development URLs (default mode):
vue.runtime-with-vapor.esm-browser.jsruntime-dom.esm-browser.jsProduction URLs (when productionMode.value = true):
.prod suffix before .js extensionCDN Sources:
cdn.jsdelivr.net (fast, reliable)https://cdn.jsdelivr.net/npm/{package}@{version}/dist/{file}// URLs are automatically generated based on version and mode
const { importMap, vueVersion, productionMode } = useVueImportMap();
vueVersion.value = '3.4.0';
productionMode.value = false;
// Generates: https://cdn.jsdelivr.net/npm/@vue/runtime-dom@3.4.0/dist/runtime-dom.esm-browser.js
productionMode.value = true;
// Generates: https://cdn.jsdelivr.net/npm/@vue/runtime-dom@3.4.0/dist/runtime-dom.esm-browser.prod.js
vueVersion.value = '3.6.0';
// Generates: https://cdn.jsdelivr.net/npm/vue@3.6.0/dist/vue.runtime-with-vapor.esm-browser.prod.jsImport maps integrate seamlessly with the store system for dynamic module resolution:
// Create store with Vue import map
const { importMap, vueVersion } = useVueImportMap({ vueVersion: '3.4.0' });
const store = useStore({
builtinImportMap: importMap,
vueVersion
});
// Import map is automatically applied to preview
store.init();
// Version changes trigger recompilation
vueVersion.value = '3.3.0'; // Store automatically updatesAdd custom modules to the import map for preview execution:
// Get current store import map
const currentMap = store.getImportMap();
// Add custom dependencies
store.setImportMap({
...currentMap,
imports: {
...currentMap.imports,
'my-library': 'https://cdn.skypack.dev/my-library',
'utils': './src/utils.js' // Relative imports
}
});
// Merge approach (preserves existing mappings)
store.setImportMap({
imports: {
'lodash': 'https://cdn.skypack.dev/lodash',
'@vueuse/core': 'https://cdn.skypack.dev/@vueuse/core'
}
}, true); // merge = trueImport map management includes robust error handling:
Install with Tessl CLI
npx tessl i tessl/npm-vue--repl