@vue/language-core
Advanced tools
Comparing version 1.8.6 to 1.8.7
@@ -274,5 +274,5 @@ "use strict"; | ||
codes.push('(\n'); | ||
codes.push(`__VLS_props: typeof __VLS_setup['props']`, `& import('${vueCompilerOptions.lib}').VNodeProps`, `& import('${vueCompilerOptions.lib}').AllowedComponentProps`, `& import('${vueCompilerOptions.lib}').ComponentCustomProps,\n`); | ||
codes.push(`__VLS_ctx?: Pick<typeof __VLS_setup, 'attrs' | 'emit' | 'slots'>,\n`); | ||
codes.push('__VLS_setup = (() => {\n'); | ||
codes.push(`__VLS_props: Awaited<typeof __VLS_setup>['props']`, `& import('${vueCompilerOptions.lib}').VNodeProps`, `& import('${vueCompilerOptions.lib}').AllowedComponentProps`, `& import('${vueCompilerOptions.lib}').ComponentCustomProps,\n`); | ||
codes.push(`__VLS_ctx?: Pick<Awaited<typeof __VLS_setup>, 'attrs' | 'emit' | 'slots'>,\n`); | ||
codes.push('__VLS_setup = (async () => {\n'); | ||
scriptSetupGeneratedOffset = generateSetupFunction(true, 'none', definePropMirrors); | ||
@@ -344,2 +344,3 @@ //#region exposed | ||
addExtraReferenceVirtualCode('scriptSetup', scriptSetupRanges.slotsTypeArg.start, scriptSetupRanges.slotsTypeArg.end); | ||
codes.push('>'); | ||
} | ||
@@ -372,3 +373,3 @@ codes.push(`;\n`); | ||
codes.push('})(),\n'); | ||
codes.push(`) => ({} as import('${vueCompilerOptions.lib}').VNode & { __ctx?: typeof __VLS_setup }))`); | ||
codes.push(`) => ({} as import('${vueCompilerOptions.lib}').VNode & { __ctx?: Awaited<typeof __VLS_setup> }))`); | ||
} | ||
@@ -375,0 +376,0 @@ else if (!sfc.script) { |
@@ -11,3 +11,4 @@ export * from './generators/template'; | ||
export * as sharedTypes from './utils/globalTypes'; | ||
export { tsCodegen } from './plugins/vue-tsx'; | ||
export * from '@volar/language-core'; | ||
export * from '@volar/source-map'; |
@@ -17,3 +17,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.sharedTypes = exports.scriptRanges = void 0; | ||
exports.tsCodegen = exports.sharedTypes = exports.scriptRanges = void 0; | ||
__exportStar(require("./generators/template"), exports); | ||
@@ -29,4 +29,6 @@ __exportStar(require("./languageModule"), exports); | ||
exports.sharedTypes = require("./utils/globalTypes"); | ||
var vue_tsx_1 = require("./plugins/vue-tsx"); | ||
Object.defineProperty(exports, "tsCodegen", { enumerable: true, get: function () { return vue_tsx_1.tsCodegen; } }); | ||
__exportStar(require("@volar/language-core"), exports); | ||
__exportStar(require("@volar/source-map"), exports); | ||
//# sourceMappingURL=index.js.map |
@@ -5,3 +5,6 @@ import type { Language } from '@volar/language-core'; | ||
import type * as ts from 'typescript/lib/tsserverlibrary'; | ||
export declare function createLanguage(compilerOptions?: ts.CompilerOptions, _vueCompilerOptions?: Partial<VueCompilerOptions>, ts?: typeof import('typescript/lib/tsserverlibrary'), codegenStack?: boolean): Language<VueFile>; | ||
export declare function createVueLanguage(ts: typeof import('typescript/lib/tsserverlibrary'), compilerOptions?: ts.CompilerOptions, _vueCompilerOptions?: Partial<VueCompilerOptions>, codegenStack?: boolean): Language<VueFile>; | ||
/** | ||
* @deprecated planed to remove in 2.0, please use getOrCreateVueLanguage instead of | ||
*/ | ||
export declare function createLanguages(compilerOptions?: ts.CompilerOptions, vueCompilerOptions?: Partial<VueCompilerOptions>, ts?: typeof import('typescript/lib/tsserverlibrary'), codegenStack?: boolean): Language[]; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.createLanguages = exports.createLanguage = void 0; | ||
exports.createLanguages = exports.createVueLanguage = void 0; | ||
const path_1 = require("path"); | ||
@@ -9,6 +9,30 @@ const plugins_1 = require("./plugins"); | ||
const ts_1 = require("./utils/ts"); | ||
function createLanguage(compilerOptions = {}, _vueCompilerOptions = {}, ts = require('typescript'), codegenStack = false) { | ||
const fileRegistries = []; | ||
function getVueFileRegistry(key, plugins) { | ||
let fileRegistry = fileRegistries.find(r => r.key === key | ||
&& r.plugins.length === plugins.length | ||
&& r.plugins.every(plugin => plugins.includes(plugin)))?.files; | ||
if (!fileRegistry) { | ||
fileRegistry = new Map(); | ||
fileRegistries.push({ | ||
key: key, | ||
plugins: plugins, | ||
files: fileRegistry, | ||
}); | ||
} | ||
return fileRegistry; | ||
} | ||
function createVueLanguage(ts, compilerOptions = {}, _vueCompilerOptions = {}, codegenStack = false) { | ||
const vueCompilerOptions = (0, ts_1.resolveVueCompilerOptions)(_vueCompilerOptions); | ||
patchResolveModuleNames(ts, vueCompilerOptions); | ||
const vueLanguagePlugin = (0, plugins_1.getDefaultVueLanguagePlugins)(ts, compilerOptions, vueCompilerOptions, codegenStack); | ||
const plugins = (0, plugins_1.getDefaultVueLanguagePlugins)(ts, compilerOptions, vueCompilerOptions, codegenStack); | ||
const keys = [ | ||
...Object.keys(vueCompilerOptions) | ||
.sort() | ||
.filter(key => key !== 'plugins') | ||
.map(key => [key, vueCompilerOptions[key]]), | ||
[...new Set(plugins.map(plugin => plugin.requiredCompilerOptions ?? []).flat())] | ||
.sort() | ||
.map(key => [key, compilerOptions[key]]), | ||
]; | ||
const fileRegistry = getVueFileRegistry(JSON.stringify(keys), _vueCompilerOptions.plugins ?? []); | ||
const allowLanguageIds = new Set(['vue']); | ||
@@ -21,7 +45,14 @@ if (vueCompilerOptions.extensions.includes('.md')) { | ||
} | ||
const languageModule = { | ||
return { | ||
createVirtualFile(fileName, snapshot, languageId) { | ||
if ((languageId && allowLanguageIds.has(languageId)) | ||
|| (!languageId && vueCompilerOptions.extensions.some(ext => fileName.endsWith(ext)))) { | ||
return new sourceFile_1.VueFile(fileName, snapshot, vueCompilerOptions, vueLanguagePlugin, ts, codegenStack); | ||
if (fileRegistry.has(fileName)) { | ||
const reusedVueFile = fileRegistry.get(fileName); | ||
reusedVueFile.update(snapshot); | ||
return reusedVueFile; | ||
} | ||
const vueFile = new sourceFile_1.VueFile(fileName, snapshot, vueCompilerOptions, plugins, ts, codegenStack); | ||
fileRegistry.set(fileName, vueFile); | ||
return vueFile; | ||
} | ||
@@ -37,2 +68,8 @@ }, | ||
...host, | ||
resolveModuleName(moduleName, impliedNodeFormat) { | ||
if (impliedNodeFormat === ts.ModuleKind.ESNext && vueCompilerOptions.extensions.some(ext => moduleName.endsWith(ext))) { | ||
return `${moduleName}.js`; | ||
} | ||
return host.resolveModuleName?.(moduleName, impliedNodeFormat) ?? moduleName; | ||
}, | ||
getScriptFileNames() { | ||
@@ -53,8 +90,10 @@ return [ | ||
}; | ||
return languageModule; | ||
} | ||
exports.createLanguage = createLanguage; | ||
exports.createVueLanguage = createVueLanguage; | ||
/** | ||
* @deprecated planed to remove in 2.0, please use getOrCreateVueLanguage instead of | ||
*/ | ||
function createLanguages(compilerOptions = {}, vueCompilerOptions = {}, ts = require('typescript'), codegenStack = false) { | ||
return [ | ||
createLanguage(compilerOptions, vueCompilerOptions, ts, codegenStack), | ||
createVueLanguage(ts, compilerOptions, vueCompilerOptions, codegenStack), | ||
...vueCompilerOptions.experimentalAdditionalLanguageModules?.map(module => require(module)) ?? [], | ||
@@ -64,20 +103,2 @@ ]; | ||
exports.createLanguages = createLanguages; | ||
function patchResolveModuleNames(ts, vueCompilerOptions) { | ||
try { | ||
// from https://github.com/vuejs/language-tools/pull/1543 | ||
if (!(ts.__vuePatchResolveModuleNames)) { | ||
ts.__vuePatchResolveModuleNames = true; | ||
const resolveModuleNames = ts.resolveModuleName; | ||
ts.resolveModuleName = (...args) => { | ||
if (args[6] === ts.ModuleKind.ESNext && vueCompilerOptions.extensions.some(ext => args[0].endsWith(ext))) { | ||
args[6] = ts.ModuleKind.CommonJS; | ||
} | ||
return resolveModuleNames(...args); | ||
}; | ||
} | ||
} | ||
catch (e) { | ||
// console.warn('[volar] patchResolveModuleNames failed', e); | ||
} | ||
} | ||
//# sourceMappingURL=languageModule.js.map |
@@ -8,2 +8,3 @@ import type * as ts from 'typescript/lib/tsserverlibrary'; | ||
order?: number | undefined; | ||
requiredCompilerOptions?: string[] | undefined; | ||
parseSFC?(fileName: string, content: string): import("@vue/compiler-sfc").SFCParseResult | undefined; | ||
@@ -10,0 +11,0 @@ updateSFC?(oldResult: import("@vue/compiler-sfc").SFCParseResult, textChange: { |
@@ -1,3 +0,58 @@ | ||
import { VueLanguagePlugin } from '../types'; | ||
import { Sfc, VueLanguagePlugin } from '../types'; | ||
import * as muggle from 'muggle-string'; | ||
import * as ts from 'typescript/lib/tsserverlibrary'; | ||
export declare const tsCodegen: WeakMap<Sfc, { | ||
scriptRanges: import("@vue/reactivity").ComputedRef<{ | ||
exportDefault: (import("../types").TextRange & { | ||
expression: import("../types").TextRange; | ||
args: import("../types").TextRange; | ||
argsNode: ts.ObjectLiteralExpression | undefined; | ||
componentsOption: import("../types").TextRange | undefined; | ||
componentsOptionNode: ts.ObjectLiteralExpression | undefined; | ||
nameOption: import("../types").TextRange | undefined; | ||
}) | undefined; | ||
bindings: import("../types").TextRange[]; | ||
} | undefined>; | ||
scriptSetupRanges: import("@vue/reactivity").ComputedRef<{ | ||
leadingCommentEndOffset: number; | ||
importSectionEndOffset: number; | ||
bindings: import("../types").TextRange[]; | ||
withDefaultsArg: import("../types").TextRange | undefined; | ||
defineProps: import("../types").TextRange | undefined; | ||
propsAssignName: string | undefined; | ||
propsRuntimeArg: import("../types").TextRange | undefined; | ||
propsTypeArg: import("../types").TextRange | undefined; | ||
slotsTypeArg: import("../types").TextRange | undefined; | ||
emitsAssignName: string | undefined; | ||
emitsRuntimeArg: import("../types").TextRange | undefined; | ||
emitsTypeArg: import("../types").TextRange | undefined; | ||
emitsTypeNums: number; | ||
exposeRuntimeArg: import("../types").TextRange | undefined; | ||
defineProp: { | ||
name: import("../types").TextRange | undefined; | ||
nameIsString: boolean; | ||
type: import("../types").TextRange | undefined; | ||
defaultValue: import("../types").TextRange | undefined; | ||
required: boolean; | ||
}[]; | ||
} | undefined>; | ||
lang: import("@vue/reactivity").ComputedRef<string>; | ||
tsxGen: import("@vue/reactivity").ComputedRef<{ | ||
codes: muggle.Segment<import("@volar/language-core").FileRangeCapabilities>[]; | ||
codeStacks: muggle.StackNode[]; | ||
mirrorBehaviorMappings: import("@volar/source-map").Mapping<[import("@volar/language-core").MirrorBehaviorCapabilities, import("@volar/language-core").MirrorBehaviorCapabilities]>[]; | ||
}>; | ||
htmlGen: import("@vue/reactivity").ComputedRef<{ | ||
codes: (string | [string, string | undefined, number | [number, number], import("@volar/language-core").FileRangeCapabilities])[]; | ||
codeStacks: muggle.StackNode[]; | ||
formatCodes: (string | [string, string | undefined, number | [number, number], import("@volar/language-core").FileRangeCapabilities])[]; | ||
formatCodeStacks: muggle.StackNode[]; | ||
cssCodes: (string | [string, string | undefined, number | [number, number], import("@volar/language-core").FileRangeCapabilities])[]; | ||
cssCodeStacks: muggle.StackNode[]; | ||
tagNames: Record<string, number[]>; | ||
identifiers: Set<string>; | ||
hasSlot: boolean; | ||
} | undefined>; | ||
}>; | ||
declare const plugin: VueLanguagePlugin; | ||
export default plugin; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.tsCodegen = void 0; | ||
const reactivity_1 = require("@vue/reactivity"); | ||
@@ -10,9 +11,13 @@ const script_1 = require("../generators/script"); | ||
const muggle = require("muggle-string"); | ||
const ts = require("typescript/lib/tsserverlibrary"); | ||
const templateFormatReg = /^\.template_format\.ts$/; | ||
const templateStyleCssReg = /^\.template_style\.css$/; | ||
const plugin = ({ modules, vueCompilerOptions, compilerOptions, codegenStack }) => { | ||
const ts = modules.typescript; | ||
const instances = new WeakMap(); | ||
exports.tsCodegen = new WeakMap(); | ||
const plugin = (ctx) => { | ||
return { | ||
version: 1, | ||
requiredCompilerOptions: [ | ||
'noPropertyAccessFromIndexSignature', | ||
'exactOptionalPropertyTypes', | ||
], | ||
getEmbeddedFileNames(fileName, sfc) { | ||
@@ -43,3 +48,3 @@ const tsx = useTsx(fileName, sfc); | ||
if (tsx) { | ||
const [content, contentStacks] = codegenStack ? muggle.track([...tsx.codes], [...tsx.codeStacks]) : [[...tsx.codes], [...tsx.codeStacks]]; | ||
const [content, contentStacks] = ctx.codegenStack ? muggle.track([...tsx.codes], [...tsx.codeStacks]) : [[...tsx.codes], [...tsx.codeStacks]]; | ||
embeddedFile.content = content; | ||
@@ -61,3 +66,3 @@ embeddedFile.contentStacks = contentStacks; | ||
if (_tsx.htmlGen.value) { | ||
const [content, contentStacks] = codegenStack ? muggle.track([..._tsx.htmlGen.value.formatCodes], [..._tsx.htmlGen.value.formatCodeStacks]) : [[..._tsx.htmlGen.value.formatCodes], [..._tsx.htmlGen.value.formatCodeStacks]]; | ||
const [content, contentStacks] = ctx.codegenStack ? muggle.track([..._tsx.htmlGen.value.formatCodes], [..._tsx.htmlGen.value.formatCodeStacks]) : [[..._tsx.htmlGen.value.formatCodes], [..._tsx.htmlGen.value.formatCodeStacks]]; | ||
embeddedFile.content = content; | ||
@@ -83,3 +88,3 @@ embeddedFile.contentStacks = contentStacks; | ||
if (_tsx.htmlGen.value) { | ||
const [content, contentStacks] = codegenStack ? muggle.track([..._tsx.htmlGen.value.cssCodes], [..._tsx.htmlGen.value.cssCodeStacks]) : [[..._tsx.htmlGen.value.cssCodes], [..._tsx.htmlGen.value.cssCodeStacks]]; | ||
const [content, contentStacks] = ctx.codegenStack ? muggle.track([..._tsx.htmlGen.value.cssCodes], [..._tsx.htmlGen.value.cssCodeStacks]) : [[..._tsx.htmlGen.value.cssCodes], [..._tsx.htmlGen.value.cssCodeStacks]]; | ||
embeddedFile.content = content; | ||
@@ -94,38 +99,40 @@ embeddedFile.contentStacks = contentStacks; | ||
function useTsx(fileName, sfc) { | ||
if (!instances.has(sfc)) { | ||
instances.set(sfc, createTsx(fileName, sfc)); | ||
if (!exports.tsCodegen.has(sfc)) { | ||
exports.tsCodegen.set(sfc, createTsx(fileName, sfc, ctx)); | ||
} | ||
return instances.get(sfc); | ||
return exports.tsCodegen.get(sfc); | ||
} | ||
function createTsx(fileName, _sfc) { | ||
const lang = (0, reactivity_1.computed)(() => { | ||
return !_sfc.script && !_sfc.scriptSetup ? 'ts' | ||
: _sfc.scriptSetup && _sfc.scriptSetup.lang !== 'js' ? _sfc.scriptSetup.lang | ||
: _sfc.script && _sfc.script.lang !== 'js' ? _sfc.script.lang | ||
: 'js'; | ||
}); | ||
const scriptRanges = (0, reactivity_1.computed)(() => _sfc.scriptAst | ||
? (0, scriptRanges_1.parseScriptRanges)(ts, _sfc.scriptAst, !!_sfc.scriptSetup, false) | ||
: undefined); | ||
const scriptSetupRanges = (0, reactivity_1.computed)(() => _sfc.scriptSetupAst | ||
? (0, scriptSetupRanges_1.parseScriptSetupRanges)(ts, _sfc.scriptSetupAst, vueCompilerOptions) | ||
: undefined); | ||
const htmlGen = (0, reactivity_1.computed)(() => { | ||
if (!_sfc.templateAst) | ||
return; | ||
return templateGen.generate(ts, compilerOptions, vueCompilerOptions, _sfc.template?.content ?? '', _sfc.template?.lang ?? 'html', _sfc, hasScriptSetupSlots.value, codegenStack); | ||
}); | ||
const hasScriptSetupSlots = (0, reactivity_1.shallowRef)(false); // remove when https://github.com/vuejs/core/pull/5912 merged | ||
const tsxGen = (0, reactivity_1.computed)(() => { | ||
hasScriptSetupSlots.value = !!scriptSetupRanges.value?.slotsTypeArg; | ||
return (0, script_1.generate)(ts, fileName, _sfc, lang.value, scriptRanges.value, scriptSetupRanges.value, htmlGen.value, compilerOptions, vueCompilerOptions, codegenStack); | ||
}); | ||
return { | ||
lang, | ||
tsxGen, | ||
htmlGen, | ||
}; | ||
} | ||
}; | ||
exports.default = plugin; | ||
function createTsx(fileName, _sfc, { vueCompilerOptions, compilerOptions, codegenStack }) { | ||
const lang = (0, reactivity_1.computed)(() => { | ||
return !_sfc.script && !_sfc.scriptSetup ? 'ts' | ||
: _sfc.scriptSetup && _sfc.scriptSetup.lang !== 'js' ? _sfc.scriptSetup.lang | ||
: _sfc.script && _sfc.script.lang !== 'js' ? _sfc.script.lang | ||
: 'js'; | ||
}); | ||
const scriptRanges = (0, reactivity_1.computed)(() => _sfc.scriptAst | ||
? (0, scriptRanges_1.parseScriptRanges)(ts, _sfc.scriptAst, !!_sfc.scriptSetup, false) | ||
: undefined); | ||
const scriptSetupRanges = (0, reactivity_1.computed)(() => _sfc.scriptSetupAst | ||
? (0, scriptSetupRanges_1.parseScriptSetupRanges)(ts, _sfc.scriptSetupAst, vueCompilerOptions) | ||
: undefined); | ||
const htmlGen = (0, reactivity_1.computed)(() => { | ||
if (!_sfc.templateAst) | ||
return; | ||
return templateGen.generate(ts, compilerOptions, vueCompilerOptions, _sfc.template?.content ?? '', _sfc.template?.lang ?? 'html', _sfc, hasScriptSetupSlots.value, codegenStack); | ||
}); | ||
const hasScriptSetupSlots = (0, reactivity_1.shallowRef)(false); // remove when https://github.com/vuejs/core/pull/5912 merged | ||
const tsxGen = (0, reactivity_1.computed)(() => { | ||
hasScriptSetupSlots.value = !!scriptSetupRanges.value?.slotsTypeArg; | ||
return (0, script_1.generate)(ts, fileName, _sfc, lang.value, scriptRanges.value, scriptSetupRanges.value, htmlGen.value, compilerOptions, vueCompilerOptions, codegenStack); | ||
}); | ||
return { | ||
scriptRanges, | ||
scriptSetupRanges, | ||
lang, | ||
tsxGen, | ||
htmlGen, | ||
}; | ||
} | ||
//# sourceMappingURL=vue-tsx.js.map |
@@ -70,2 +70,3 @@ import { FileCapabilities, VirtualFile, FileKind, FileRangeCapabilities, MirrorBehaviorCapabilities } from '@volar/language-core'; | ||
update(newScriptSnapshot: ts.IScriptSnapshot): void; | ||
onUpdate(): void; | ||
parseSfc(): SFCParseResult | undefined; | ||
@@ -72,0 +73,0 @@ parseTemplateBlock(block: SFCTemplateBlock): NonNullable<Sfc['template']>; |
@@ -334,6 +334,11 @@ "use strict"; | ||
}); | ||
this.update(snapshot); | ||
this.onUpdate(); | ||
} | ||
update(newScriptSnapshot) { | ||
if (newScriptSnapshot === this.snapshot) | ||
return; | ||
this.snapshot = newScriptSnapshot; | ||
this.onUpdate(); | ||
} | ||
onUpdate() { | ||
const parsedSfc = this.parseSfc(); | ||
@@ -340,0 +345,0 @@ updateObj(this.sfc, { |
@@ -48,2 +48,3 @@ import type { SFCParseResult } from '@vue/compiler-sfc'; | ||
order?: number; | ||
requiredCompilerOptions?: string[]; | ||
parseSFC?(fileName: string, content: string): SFCParseResult | undefined; | ||
@@ -50,0 +51,0 @@ updateSFC?(oldResult: SFCParseResult, textChange: { |
@@ -109,3 +109,3 @@ "use strict"; | ||
} | ||
else if (ts.isArrowFunction(node)) { | ||
else if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) { | ||
const functionArgs = []; | ||
@@ -112,0 +112,0 @@ for (const param of node.parameters) { |
{ | ||
"name": "@vue/language-core", | ||
"version": "1.8.6", | ||
"version": "1.8.7", | ||
"main": "out/index.js", | ||
@@ -16,4 +16,4 @@ "license": "MIT", | ||
"dependencies": { | ||
"@volar/language-core": "~1.9.0", | ||
"@volar/source-map": "~1.9.0", | ||
"@volar/language-core": "~1.10.0", | ||
"@volar/source-map": "~1.10.0", | ||
"@vue/compiler-dom": "^3.3.0", | ||
@@ -38,3 +38,3 @@ "@vue/reactivity": "^3.3.0", | ||
}, | ||
"gitHead": "9da8afee02bc7251ae97716480ba31f8aff2794a" | ||
"gitHead": "2b888901897fc9155bc12eb30ddae41afed5d942" | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
250769
5454
+ Added@volar/language-core@1.10.10(transitive)
+ Added@volar/source-map@1.10.10(transitive)
- Removed@volar/language-core@1.9.2(transitive)
- Removed@volar/source-map@1.9.2(transitive)
Updated@volar/language-core@~1.10.0
Updated@volar/source-map@~1.10.0