| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.tsCodegen = void 0;
- const computeds_1 = require("computeds");
- const script_1 = require("../generators/script");
- const template_1 = require("../generators/template");
- const scriptRanges_1 = require("../parsers/scriptRanges");
- const scriptSetupRanges_1 = require("../parsers/scriptSetupRanges");
- const language_core_1 = require("@volar/language-core");
- const muggle = require("muggle-string");
- const templateFormatReg = /^\.template_format\.ts$/;
- const templateStyleCssReg = /^\.template_style\.css$/;
- exports.tsCodegen = new WeakMap();
- const plugin = (ctx) => {
- return {
- version: 1,
- requiredCompilerOptions: [
- 'noPropertyAccessFromIndexSignature',
- 'exactOptionalPropertyTypes',
- ],
- getEmbeddedFileNames(fileName, sfc) {
- const tsx = useTsx(fileName, sfc);
- const fileNames = [];
- if (['js', 'ts', 'jsx', 'tsx'].includes(tsx.lang())) {
- fileNames.push(fileName + '.' + tsx.lang());
- }
- if (sfc.template) {
- fileNames.push(fileName + '.template_format.ts');
- fileNames.push(fileName + '.template_style.css');
- }
- return fileNames;
- },
- resolveEmbeddedFile(fileName, sfc, embeddedFile) {
- const _tsx = useTsx(fileName, sfc);
- const suffix = embeddedFile.fileName.replace(fileName, '');
- if (suffix === '.' + _tsx.lang()) {
- embeddedFile.kind = language_core_1.FileKind.TypeScriptHostFile;
- embeddedFile.capabilities = {
- ...language_core_1.FileCapabilities.full,
- foldingRange: false,
- documentFormatting: false,
- documentSymbol: false,
- };
- const tsx = _tsx.generatedScript();
- if (tsx) {
- const [content, contentStacks] = ctx.codegenStack ? muggle.track([...tsx.codes], [...tsx.codeStacks]) : [[...tsx.codes], [...tsx.codeStacks]];
- embeddedFile.content = content;
- embeddedFile.contentStacks = contentStacks;
- embeddedFile.mirrorBehaviorMappings = [...tsx.mirrorBehaviorMappings];
- }
- }
- else if (suffix.match(templateFormatReg)) {
- embeddedFile.parentFileName = fileName + '.template.' + sfc.template?.lang;
- embeddedFile.kind = language_core_1.FileKind.TextFile;
- embeddedFile.capabilities = {
- ...language_core_1.FileCapabilities.full,
- diagnostic: false,
- foldingRange: false,
- codeAction: false,
- inlayHint: false,
- };
- const template = _tsx.generatedTemplate();
- if (template) {
- const [content, contentStacks] = ctx.codegenStack
- ? muggle.track([...template.formatCodes], [...template.formatCodeStacks])
- : [[...template.formatCodes], [...template.formatCodeStacks]];
- embeddedFile.content = content;
- embeddedFile.contentStacks = contentStacks;
- }
- for (const style of sfc.styles) {
- embeddedFile.content.push('\n\n');
- for (const cssVar of style.cssVars) {
- embeddedFile.content.push('(');
- embeddedFile.content.push([
- cssVar.text,
- style.name,
- cssVar.offset,
- {},
- ]);
- embeddedFile.content.push(');\n');
- }
- }
- }
- else if (suffix.match(templateStyleCssReg)) {
- embeddedFile.parentFileName = fileName + '.template.' + sfc.template?.lang;
- const template = _tsx.generatedTemplate();
- if (template) {
- const [content, contentStacks] = ctx.codegenStack
- ? muggle.track([...template.cssCodes], [...template.cssCodeStacks])
- : [[...template.cssCodes], [...template.cssCodeStacks]];
- embeddedFile.content = content;
- embeddedFile.contentStacks = contentStacks;
- }
- // for color pickers support
- embeddedFile.capabilities.documentSymbol = true;
- }
- },
- };
- function useTsx(fileName, sfc) {
- if (!exports.tsCodegen.has(sfc)) {
- exports.tsCodegen.set(sfc, createTsx(fileName, sfc, ctx));
- }
- return exports.tsCodegen.get(sfc);
- }
- };
- exports.default = plugin;
- function createTsx(fileName, _sfc, { vueCompilerOptions, compilerOptions, codegenStack, modules }) {
- const ts = modules.typescript;
- const lang = (0, computeds_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, computeds_1.computed)(() => _sfc.script
- ? (0, scriptRanges_1.parseScriptRanges)(ts, _sfc.script.ast, !!_sfc.scriptSetup, false)
- : undefined);
- const scriptSetupRanges = (0, computeds_1.computed)(() => _sfc.scriptSetup
- ? (0, scriptSetupRanges_1.parseScriptSetupRanges)(ts, _sfc.scriptSetup.ast, vueCompilerOptions)
- : undefined);
- const shouldGenerateScopedClasses = (0, computeds_1.computed)(() => {
- const option = vueCompilerOptions.experimentalResolveStyleCssClasses;
- return _sfc.styles.some(s => {
- return option === 'always' || (option === 'scoped' && s.scoped);
- });
- });
- const stylesScopedClasses = (0, computeds_1.computedSet)(() => {
- const classes = new Set();
- if (!shouldGenerateScopedClasses()) {
- return classes;
- }
- for (const style of _sfc.styles) {
- const option = vueCompilerOptions.experimentalResolveStyleCssClasses;
- if (option === 'always' || (option === 'scoped' && style.scoped)) {
- for (const className of style.classNames) {
- classes.add(className.text.substring(1));
- }
- }
- }
- return classes;
- });
- const generatedTemplate = (0, computeds_1.computed)(() => {
- if (!_sfc.template)
- return;
- return (0, template_1.generate)(ts, compilerOptions, vueCompilerOptions, _sfc.template, shouldGenerateScopedClasses(), stylesScopedClasses(), hasScriptSetupSlots(), slotsAssignName(), propsAssignName(), codegenStack);
- });
- const hasScriptSetupSlots = (0, computeds_1.computed)(() => !!scriptSetupRanges()?.slots.define);
- const slotsAssignName = (0, computeds_1.computed)(() => scriptSetupRanges()?.slots.name);
- const propsAssignName = (0, computeds_1.computed)(() => scriptSetupRanges()?.props.name);
- const generatedScript = (0, computeds_1.computed)(() => (0, script_1.generate)(ts, fileName, _sfc.script, _sfc.scriptSetup, _sfc.styles, lang(), scriptRanges(), scriptSetupRanges(), generatedTemplate(), compilerOptions, vueCompilerOptions, codegenStack));
- return {
- scriptRanges,
- scriptSetupRanges,
- lang,
- generatedScript,
- generatedTemplate,
- };
- }
- //# sourceMappingURL=vue-tsx.js.map
|