| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.resolveVueCompilerOptions = exports.createParsedCommandLine = exports.createParsedCommandLineByJson = void 0;
- const path = require("path-browserify");
- function createParsedCommandLineByJson(ts, parseConfigHost, rootDir, json, configFileName = rootDir + '/jsconfig.json') {
- const proxyHost = proxyParseConfigHostForExtendConfigPaths(parseConfigHost);
- ts.parseJsonConfigFileContent(json, proxyHost.host, rootDir, {}, configFileName);
- let vueOptions = {};
- for (const extendPath of proxyHost.extendConfigPaths.reverse()) {
- try {
- vueOptions = {
- ...vueOptions,
- ...getPartialVueCompilerOptions(ts, ts.readJsonConfigFile(extendPath, proxyHost.host.readFile)),
- };
- }
- catch (err) { }
- }
- const parsed = ts.parseJsonConfigFileContent(json, proxyHost.host, rootDir, {}, configFileName, undefined, (vueOptions.extensions ?? ['.vue']).map(extension => ({
- extension: extension.slice(1),
- isMixedContent: true,
- scriptKind: ts.ScriptKind.Deferred,
- })));
- // fix https://github.com/vuejs/language-tools/issues/1786
- // https://github.com/microsoft/TypeScript/issues/30457
- // patching ts server broke with outDir + rootDir + composite/incremental
- parsed.options.outDir = undefined;
- return {
- ...parsed,
- vueOptions,
- };
- }
- exports.createParsedCommandLineByJson = createParsedCommandLineByJson;
- function createParsedCommandLine(ts, parseConfigHost, tsConfigPath) {
- try {
- const proxyHost = proxyParseConfigHostForExtendConfigPaths(parseConfigHost);
- const config = ts.readJsonConfigFile(tsConfigPath, proxyHost.host.readFile);
- ts.parseJsonSourceFileConfigFileContent(config, proxyHost.host, path.dirname(tsConfigPath), {}, tsConfigPath);
- let vueOptions = {};
- for (const extendPath of proxyHost.extendConfigPaths.reverse()) {
- try {
- vueOptions = {
- ...vueOptions,
- ...getPartialVueCompilerOptions(ts, ts.readJsonConfigFile(extendPath, proxyHost.host.readFile)),
- };
- }
- catch (err) { }
- }
- const parsed = ts.parseJsonSourceFileConfigFileContent(config, proxyHost.host, path.dirname(tsConfigPath), {}, tsConfigPath, undefined, (vueOptions.extensions ?? ['.vue']).map(extension => ({
- extension: extension.slice(1),
- isMixedContent: true,
- scriptKind: ts.ScriptKind.Deferred,
- })));
- // fix https://github.com/vuejs/language-tools/issues/1786
- // https://github.com/microsoft/TypeScript/issues/30457
- // patching ts server broke with outDir + rootDir + composite/incremental
- parsed.options.outDir = undefined;
- return {
- ...parsed,
- vueOptions,
- };
- }
- catch (err) {
- // console.warn('Failed to resolve tsconfig path:', tsConfigPath, err);
- return {
- fileNames: [],
- options: {},
- vueOptions: resolveVueCompilerOptions({}),
- errors: [],
- };
- }
- }
- exports.createParsedCommandLine = createParsedCommandLine;
- function proxyParseConfigHostForExtendConfigPaths(parseConfigHost) {
- const extendConfigPaths = [];
- const host = new Proxy(parseConfigHost, {
- get(target, key) {
- if (key === 'readFile') {
- return (fileName) => {
- if (!fileName.endsWith('/package.json') && !extendConfigPaths.includes(fileName)) {
- extendConfigPaths.push(fileName);
- }
- return target.readFile(fileName);
- };
- }
- return target[key];
- }
- });
- return {
- host,
- extendConfigPaths,
- };
- }
- function getPartialVueCompilerOptions(ts, tsConfigSourceFile) {
- const folder = path.dirname(tsConfigSourceFile.fileName);
- const obj = ts.convertToObject(tsConfigSourceFile, []);
- const rawOptions = obj?.vueCompilerOptions ?? {};
- const result = {
- ...rawOptions,
- };
- const target = rawOptions.target ?? 'auto';
- if (target === 'auto') {
- const resolvedPath = resolvePath('vue/package.json');
- if (resolvedPath) {
- const vuePackageJson = require(resolvedPath);
- const versionNumbers = vuePackageJson.version.split('.');
- result.target = Number(versionNumbers[0] + '.' + versionNumbers[1]);
- }
- else {
- // console.warn('Load vue/package.json failed from', folder);
- }
- }
- else {
- result.target = target;
- }
- if (rawOptions.plugins) {
- const plugins = rawOptions.plugins
- .map((pluginPath) => {
- try {
- const resolvedPath = resolvePath(pluginPath);
- if (resolvedPath) {
- return require(resolvedPath);
- }
- else {
- console.warn('Load plugin failed:', pluginPath);
- }
- }
- catch (error) {
- console.warn('Load plugin failed:', pluginPath, error);
- }
- return [];
- })
- .flat(Infinity);
- result.plugins = plugins;
- }
- if (rawOptions.hooks) {
- result.hooks = rawOptions.hooks
- .map(resolvePath)
- .filter((hook) => !!hook);
- }
- if (rawOptions.experimentalAdditionalLanguageModules) {
- result.experimentalAdditionalLanguageModules = rawOptions.experimentalAdditionalLanguageModules
- .map(resolvePath)
- .filter((module) => !!module);
- }
- return result;
- function resolvePath(scriptPath) {
- try {
- if (require?.resolve) {
- return require.resolve(scriptPath, { paths: [folder] });
- }
- else {
- // console.warn('failed to resolve path:', scriptPath, 'require.resolve is not supported in web');
- }
- }
- catch (error) {
- // console.warn(error);
- }
- }
- }
- // https://developer.mozilla.org/en-US/docs/Web/HTML/Element
- const HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +
- 'header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,' +
- 'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +
- 'data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,' +
- 'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +
- 'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +
- 'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +
- 'option,output,progress,select,textarea,details,dialog,menu,' +
- 'summary,template,blockquote,iframe,tfoot';
- // https://developer.mozilla.org/en-US/docs/Web/SVG/Element
- const SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +
- 'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +
- 'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +
- 'feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +
- 'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +
- 'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +
- 'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +
- 'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +
- 'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +
- 'text,textPath,title,tspan,unknown,use,view';
- function resolveVueCompilerOptions(vueOptions) {
- const target = vueOptions.target ?? 3.3;
- const lib = vueOptions.lib || (target < 2.7 ? '@vue/runtime-dom' : 'vue');
- return {
- ...vueOptions,
- target,
- extensions: vueOptions.extensions ?? ['.vue'],
- lib,
- jsxSlots: vueOptions.jsxSlots ?? false,
- strictTemplates: vueOptions.strictTemplates ?? false,
- skipTemplateCodegen: vueOptions.skipTemplateCodegen ?? false,
- nativeTags: vueOptions.nativeTags ?? [...new Set([
- ...HTML_TAGS.split(','),
- ...SVG_TAGS.split(','),
- // fix https://github.com/johnsoncodehk/volar/issues/1340
- 'hgroup',
- 'slot',
- 'component',
- ])],
- dataAttributes: vueOptions.dataAttributes ?? [],
- htmlAttributes: vueOptions.htmlAttributes ?? ['aria-*'],
- optionsWrapper: vueOptions.optionsWrapper ?? (target >= 2.7
- ? [`(await import('${lib}')).defineComponent(`, `)`]
- : [`(await import('vue')).default.extend(`, `)`]),
- macros: {
- defineProps: ['defineProps'],
- defineSlots: ['defineSlots'],
- defineEmits: ['defineEmits'],
- defineExpose: ['defineExpose'],
- defineModel: ['defineModel'],
- defineOptions: ['defineOptions'],
- withDefaults: ['withDefaults'],
- ...vueOptions.macros,
- },
- plugins: vueOptions.plugins ?? [],
- hooks: vueOptions.hooks ?? [],
- // experimental
- experimentalDefinePropProposal: vueOptions.experimentalDefinePropProposal ?? false,
- experimentalAdditionalLanguageModules: vueOptions.experimentalAdditionalLanguageModules ?? [],
- experimentalResolveStyleCssClasses: vueOptions.experimentalResolveStyleCssClasses ?? 'scoped',
- // https://github.com/vuejs/vue-next/blob/master/packages/compiler-dom/src/transforms/vModel.ts#L49-L51
- // https://vuejs.org/guide/essentials/forms.html#form-input-bindings
- experimentalModelPropName: vueOptions.experimentalModelPropName ?? {
- '': {
- input: true
- },
- value: {
- input: { type: 'text' },
- textarea: true,
- select: true
- }
- },
- experimentalUseElementAccessInTemplate: vueOptions.experimentalUseElementAccessInTemplate ?? false,
- };
- }
- exports.resolveVueCompilerOptions = resolveVueCompilerOptions;
- //# sourceMappingURL=ts.js.map
|