@vue/language-core 2.1.8 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/lib/codegen/globalTypes.js +12 -5
  2. package/lib/codegen/localTypes.js +3 -3
  3. package/lib/codegen/script/component.js +42 -42
  4. package/lib/codegen/script/componentSelf.js +14 -13
  5. package/lib/codegen/script/context.js +2 -2
  6. package/lib/codegen/script/index.d.ts +5 -3
  7. package/lib/codegen/script/index.js +24 -37
  8. package/lib/codegen/script/scriptSetup.js +240 -193
  9. package/lib/codegen/script/src.js +6 -6
  10. package/lib/codegen/script/styleModulesType.js +5 -5
  11. package/lib/codegen/script/template.d.ts +1 -1
  12. package/lib/codegen/script/template.js +89 -99
  13. package/lib/codegen/template/context.d.ts +13 -3
  14. package/lib/codegen/template/context.js +21 -12
  15. package/lib/codegen/template/element.d.ts +2 -4
  16. package/lib/codegen/template/element.js +132 -105
  17. package/lib/codegen/template/elementChildren.d.ts +1 -1
  18. package/lib/codegen/template/elementChildren.js +8 -8
  19. package/lib/codegen/template/elementDirectives.d.ts +1 -0
  20. package/lib/codegen/template/elementDirectives.js +28 -22
  21. package/lib/codegen/template/elementEvents.d.ts +2 -2
  22. package/lib/codegen/template/elementEvents.js +32 -65
  23. package/lib/codegen/template/elementProps.d.ts +3 -2
  24. package/lib/codegen/template/elementProps.js +119 -122
  25. package/lib/codegen/template/index.js +52 -60
  26. package/lib/codegen/template/interpolation.d.ts +5 -3
  27. package/lib/codegen/template/interpolation.js +18 -19
  28. package/lib/codegen/template/objectProperty.js +8 -8
  29. package/lib/codegen/template/propertyAccess.js +4 -4
  30. package/lib/codegen/template/slotOutlet.d.ts +1 -1
  31. package/lib/codegen/template/slotOutlet.js +13 -13
  32. package/lib/codegen/template/styleScopedClasses.d.ts +1 -1
  33. package/lib/codegen/template/styleScopedClasses.js +11 -8
  34. package/lib/codegen/template/templateChild.d.ts +1 -1
  35. package/lib/codegen/template/templateChild.js +31 -19
  36. package/lib/codegen/template/vFor.d.ts +1 -1
  37. package/lib/codegen/template/vFor.js +11 -11
  38. package/lib/codegen/template/vIf.d.ts +1 -1
  39. package/lib/codegen/template/vIf.js +6 -6
  40. package/lib/codegen/{template → utils}/camelized.js +2 -2
  41. package/lib/codegen/{common.d.ts → utils/index.d.ts} +1 -2
  42. package/lib/codegen/{common.js → utils/index.js} +4 -15
  43. package/lib/codegen/{template → utils}/stringLiteralKey.js +3 -3
  44. package/lib/codegen/utils/unicode.d.ts +2 -0
  45. package/lib/codegen/utils/unicode.js +25 -0
  46. package/lib/languagePlugin.js +1 -1
  47. package/lib/parsers/scriptRanges.d.ts +7 -2
  48. package/lib/parsers/scriptSetupRanges.d.ts +67 -81
  49. package/lib/parsers/scriptSetupRanges.js +195 -166
  50. package/lib/parsers/vueCompilerOptions.d.ts +2 -0
  51. package/lib/parsers/vueCompilerOptions.js +23 -0
  52. package/lib/plugins/file-html.js +4 -3
  53. package/lib/plugins/file-md.js +1 -1
  54. package/lib/plugins/file-vue.js +4 -4
  55. package/lib/plugins/vue-root-tags.js +2 -2
  56. package/lib/plugins/vue-template-html.js +6 -2
  57. package/lib/plugins/vue-template-inline-css.js +1 -1
  58. package/lib/plugins/vue-template-inline-ts.js +13 -5
  59. package/lib/plugins/vue-tsx.d.ts +101 -72
  60. package/lib/plugins/vue-tsx.js +65 -69
  61. package/lib/types.d.ts +19 -10
  62. package/lib/utils/buildMappings.d.ts +1 -1
  63. package/lib/utils/parseSfc.d.ts +5 -0
  64. package/lib/utils/parseSfc.js +7 -2
  65. package/lib/utils/ts.d.ts +1 -1
  66. package/lib/utils/ts.js +38 -24
  67. package/lib/virtualFile/computedEmbeddedCodes.d.ts +1 -2
  68. package/lib/virtualFile/computedSfc.js +23 -12
  69. package/lib/virtualFile/computedVueSfc.d.ts +1 -1
  70. package/lib/virtualFile/vueFile.d.ts +3 -3
  71. package/package.json +5 -5
  72. package/lib/codegen/types.d.ts +0 -9
  73. package/lib/codegen/types.js +0 -3
  74. package/lib/utils/findDestructuredProps.d.ts +0 -1
  75. package/lib/utils/findDestructuredProps.js +0 -3
  76. /package/lib/codegen/{template → utils}/camelized.d.ts +0 -0
  77. /package/lib/codegen/{template → utils}/stringLiteralKey.d.ts +0 -0
@@ -5,26 +5,31 @@ exports.parseBindingRanges = parseBindingRanges;
5
5
  exports.findBindingVars = findBindingVars;
6
6
  exports.getStartEnd = getStartEnd;
7
7
  exports.getNodeText = getNodeText;
8
- const common_1 = require("../codegen/common");
8
+ const utils_1 = require("../codegen/utils");
9
+ const tsCheckReg = /^\/\/\s*@ts-(?:no)?check($|\s)/;
9
10
  function parseScriptSetupRanges(ts, ast, vueCompilerOptions) {
10
- let foundNonImportExportNode = false;
11
- let importSectionEndOffset = 0;
12
- const props = {};
13
- const slots = {};
14
- const emits = {};
15
- const expose = {};
16
- const options = {};
17
- const cssModules = [];
18
- const templateRefs = [];
19
- const definePropProposalA = vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition');
20
- const definePropProposalB = vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition');
21
11
  const defineProp = [];
12
+ let defineProps;
13
+ let withDefaults;
14
+ let defineEmits;
15
+ let defineSlots;
16
+ let defineExpose;
17
+ let defineOptions;
18
+ const useAttrs = [];
19
+ const useCssModule = [];
20
+ const useSlots = [];
21
+ const useTemplateRef = [];
22
+ const definePropProposalA = vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition';
23
+ const definePropProposalB = vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition';
22
24
  const text = ast.text;
23
- const leadingCommentEndOffset = ts.getLeadingCommentRanges(text, 0)?.reverse()[0].end ?? 0;
24
- const importComponentNames = new Set();
25
+ const leadingCommentRanges = ts.getLeadingCommentRanges(text, 0)?.reverse() ?? [];
26
+ const leadingCommentEndOffset = leadingCommentRanges.find(range => tsCheckReg.test(text.slice(range.pos, range.end)))?.end ?? 0;
25
27
  let bindings = parseBindingRanges(ts, ast);
28
+ let foundNonImportExportNode = false;
29
+ let importSectionEndOffset = 0;
26
30
  ts.forEachChild(ast, node => {
27
- const isTypeExport = (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) && node.modifiers?.some(mod => mod.kind === ts.SyntaxKind.ExportKeyword);
31
+ const isTypeExport = (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node))
32
+ && node.modifiers?.some(mod => mod.kind === ts.SyntaxKind.ExportKeyword);
28
33
  if (!foundNonImportExportNode
29
34
  && !ts.isImportDeclaration(node)
30
35
  && !isTypeExport
@@ -41,51 +46,34 @@ function parseScriptSetupRanges(ts, ast, vueCompilerOptions) {
41
46
  }
42
47
  foundNonImportExportNode = true;
43
48
  }
44
- if (ts.isImportDeclaration(node)
45
- && node.importClause?.name
46
- && !node.importClause.isTypeOnly) {
47
- const moduleName = getNodeText(ts, node.moduleSpecifier, ast).slice(1, -1);
48
- if (vueCompilerOptions.extensions.some(ext => moduleName.endsWith(ext))) {
49
- importComponentNames.add(getNodeText(ts, node.importClause.name, ast));
50
- }
51
- }
52
49
  });
53
- ts.forEachChild(ast, child => visitNode(child, [ast]));
54
- const templateRefNames = new Set(templateRefs.map(ref => ref.name));
55
- bindings = bindings.filter(range => {
56
- const name = text.substring(range.start, range.end);
50
+ ts.forEachChild(ast, node => visitNode(node, [ast]));
51
+ const templateRefNames = new Set(useTemplateRef.map(ref => ref.name));
52
+ bindings = bindings.filter(({ range }) => {
53
+ const name = text.slice(range.start, range.end);
57
54
  return !templateRefNames.has(name);
58
55
  });
59
56
  return {
60
57
  leadingCommentEndOffset,
61
58
  importSectionEndOffset,
62
59
  bindings,
63
- importComponentNames,
64
- props,
65
- slots,
66
- emits,
67
- expose,
68
- options,
69
- cssModules,
70
60
  defineProp,
71
- templateRefs,
61
+ defineProps,
62
+ withDefaults,
63
+ defineEmits,
64
+ defineSlots,
65
+ defineExpose,
66
+ defineOptions,
67
+ useAttrs,
68
+ useCssModule,
69
+ useSlots,
70
+ useTemplateRef,
72
71
  };
73
- function _getStartEnd(node) {
74
- return getStartEnd(ts, node, ast);
75
- }
76
- function parseDefineFunction(node) {
77
- return {
78
- ..._getStartEnd(node),
79
- exp: _getStartEnd(node.expression),
80
- arg: node.arguments.length ? _getStartEnd(node.arguments[0]) : undefined,
81
- typeArg: node.typeArguments?.length ? _getStartEnd(node.typeArguments[0]) : undefined,
82
- };
83
- }
84
72
  function visitNode(node, parents) {
85
73
  const parent = parents[parents.length - 1];
86
74
  if (ts.isCallExpression(node)
87
75
  && ts.isIdentifier(node.expression)) {
88
- const callText = getNodeText(ts, node.expression, ast);
76
+ const callText = _getNodeText(node.expression);
89
77
  if (vueCompilerOptions.macros.defineModel.includes(callText)) {
90
78
  let localName;
91
79
  let propName;
@@ -99,7 +87,7 @@ function parseScriptSetupRanges(ts, ast, vueCompilerOptions) {
99
87
  options = node.arguments[1];
100
88
  }
101
89
  else if (node.arguments.length >= 1) {
102
- if (ts.isStringLiteral(node.arguments[0])) {
90
+ if (ts.isStringLiteralLike(node.arguments[0])) {
103
91
  propName = _getStartEnd(node.arguments[0]);
104
92
  }
105
93
  else {
@@ -114,7 +102,7 @@ function parseScriptSetupRanges(ts, ast, vueCompilerOptions) {
114
102
  if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) {
115
103
  continue;
116
104
  }
117
- const text = getNodeText(ts, property.name, ast);
105
+ const text = _getNodeText(property.name);
118
106
  if (text === 'type') {
119
107
  runtimeType = _getStartEnd(property.initializer);
120
108
  }
@@ -160,7 +148,7 @@ function parseScriptSetupRanges(ts, ast, vueCompilerOptions) {
160
148
  if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) {
161
149
  continue;
162
150
  }
163
- const text = getNodeText(ts, property.name, ast);
151
+ const text = _getNodeText(property.name);
164
152
  if (text === 'type') {
165
153
  runtimeType = _getStartEnd(property.initializer);
166
154
  }
@@ -190,7 +178,7 @@ function parseScriptSetupRanges(ts, ast, vueCompilerOptions) {
190
178
  if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) {
191
179
  continue;
192
180
  }
193
- const text = getNodeText(ts, property.name, ast);
181
+ const text = _getNodeText(property.name);
194
182
  if (text === 'type') {
195
183
  runtimeType = _getStartEnd(property.initializer);
196
184
  }
@@ -206,160 +194,198 @@ function parseScriptSetupRanges(ts, ast, vueCompilerOptions) {
206
194
  required,
207
195
  });
208
196
  }
209
- else if (vueCompilerOptions.macros.defineSlots.includes(callText)) {
210
- slots.define = parseDefineFunction(node);
197
+ else if (vueCompilerOptions.macros.defineProps.includes(callText)) {
198
+ defineProps = {
199
+ ...parseCallExpression(node),
200
+ statement: getStatementRange(ts, parents, node, ast)
201
+ };
211
202
  if (ts.isVariableDeclaration(parent)) {
212
- if (ts.isIdentifier(parent.name)) {
213
- slots.name = getNodeText(ts, parent.name, ast);
203
+ if (ts.isObjectBindingPattern(parent.name)) {
204
+ defineProps.destructured = new Set();
205
+ const identifiers = (0, utils_1.collectIdentifiers)(ts, parent.name, []);
206
+ for (const [id, isRest] of identifiers) {
207
+ const name = _getNodeText(id);
208
+ if (isRest) {
209
+ defineProps.destructuredRest = name;
210
+ }
211
+ else {
212
+ defineProps.destructured.add(name);
213
+ }
214
+ }
214
215
  }
215
216
  else {
216
- slots.isObjectBindingPattern = ts.isObjectBindingPattern(parent.name);
217
+ defineProps.name = _getNodeText(parent.name);
217
218
  }
218
219
  }
220
+ else if (ts.isCallExpression(parent)
221
+ && vueCompilerOptions.macros.withDefaults.includes(_getNodeText(parent.expression))) {
222
+ const grand = parents.at(-2);
223
+ if (grand && ts.isVariableDeclaration(grand)) {
224
+ defineProps.name = _getNodeText(grand.name);
225
+ }
226
+ }
227
+ }
228
+ else if (vueCompilerOptions.macros.withDefaults.includes(callText)) {
229
+ const [, arg] = node.arguments;
230
+ withDefaults = {
231
+ callExp: _getStartEnd(node),
232
+ exp: _getStartEnd(node.expression),
233
+ arg: arg ? _getStartEnd(arg) : undefined
234
+ };
219
235
  }
220
236
  else if (vueCompilerOptions.macros.defineEmits.includes(callText)) {
221
- emits.define = {
222
- ...parseDefineFunction(node),
237
+ defineEmits = {
238
+ ...parseCallExpression(node),
223
239
  statement: getStatementRange(ts, parents, node, ast)
224
240
  };
225
241
  if (ts.isVariableDeclaration(parent)) {
226
- emits.name = getNodeText(ts, parent.name, ast);
242
+ defineEmits.name = _getNodeText(parent.name);
227
243
  }
228
- if (node.typeArguments?.length && ts.isTypeLiteralNode(node.typeArguments[0]) && node.typeArguments[0].members.at(0)) {
244
+ if (node.typeArguments?.length && ts.isTypeLiteralNode(node.typeArguments[0])) {
229
245
  for (const member of node.typeArguments[0].members) {
230
- if (ts.isCallSignatureDeclaration(member) && member.parameters[0].type && ts.isUnionTypeNode(member.parameters[0].type)) {
231
- emits.define.hasUnionTypeArg = true;
232
- return;
246
+ if (ts.isCallSignatureDeclaration(member)) {
247
+ const type = member.parameters[0]?.type;
248
+ if (type && ts.isUnionTypeNode(type)) {
249
+ defineEmits.hasUnionTypeArg = true;
250
+ break;
251
+ }
233
252
  }
234
253
  }
235
254
  }
236
255
  }
237
- else if (vueCompilerOptions.macros.defineExpose.includes(callText)) {
238
- expose.define = parseDefineFunction(node);
239
- }
240
- else if (vueCompilerOptions.macros.defineProps.includes(callText)) {
256
+ else if (vueCompilerOptions.macros.defineSlots.includes(callText)) {
257
+ defineSlots = {
258
+ ...parseCallExpression(node),
259
+ statement: getStatementRange(ts, parents, node, ast)
260
+ };
241
261
  if (ts.isVariableDeclaration(parent)) {
242
- if (ts.isObjectBindingPattern(parent.name)) {
243
- props.destructured = new Set();
244
- const identifiers = (0, common_1.collectIdentifiers)(ts, parent.name, []);
245
- for (const [id, isRest] of identifiers) {
246
- const name = getNodeText(ts, id, ast);
247
- if (isRest) {
248
- props.destructuredRest = name;
249
- }
250
- else {
251
- props.destructured.add(name);
252
- }
253
- }
262
+ if (ts.isIdentifier(parent.name)) {
263
+ defineSlots.name = _getNodeText(parent.name);
254
264
  }
255
265
  else {
256
- props.name = getNodeText(ts, parent.name, ast);
266
+ defineSlots.isObjectBindingPattern = ts.isObjectBindingPattern(parent.name);
257
267
  }
258
268
  }
259
- props.define = {
260
- ...parseDefineFunction(node),
261
- statement: getStatementRange(ts, parents, node, ast),
262
- };
263
- if (node.arguments.length) {
264
- props.define.arg = _getStartEnd(node.arguments[0]);
265
- }
266
- if (node.typeArguments?.length) {
267
- props.define.typeArg = _getStartEnd(node.typeArguments[0]);
268
- }
269
269
  }
270
- else if (vueCompilerOptions.macros.withDefaults.includes(callText)) {
271
- props.withDefaults = _getStartEnd(node);
272
- if (node.arguments.length >= 2) {
273
- const arg = node.arguments[1];
274
- props.withDefaults.arg = _getStartEnd(arg);
275
- }
276
- if (ts.isVariableDeclaration(parent)) {
277
- props.name = getNodeText(ts, parent.name, ast);
278
- }
270
+ else if (vueCompilerOptions.macros.defineExpose.includes(callText)) {
271
+ defineExpose = parseCallExpression(node);
279
272
  }
280
- else if (vueCompilerOptions.macros.defineOptions.includes(callText)) {
281
- if (node.arguments.length && ts.isObjectLiteralExpression(node.arguments[0])) {
282
- const obj = node.arguments[0];
283
- ts.forEachChild(obj, node => {
284
- if (ts.isPropertyAssignment(node) && ts.isIdentifier(node.name)) {
285
- const name = getNodeText(ts, node.name, ast);
286
- if (name === 'inheritAttrs') {
287
- options.inheritAttrs = getNodeText(ts, node.initializer, ast);
288
- }
273
+ else if (vueCompilerOptions.macros.defineOptions.includes(callText)
274
+ && node.arguments.length
275
+ && ts.isObjectLiteralExpression(node.arguments[0])) {
276
+ defineOptions = {};
277
+ const obj = node.arguments[0];
278
+ for (const prop of obj.properties) {
279
+ if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {
280
+ const name = _getNodeText(prop.name);
281
+ if (name === 'inheritAttrs') {
282
+ defineOptions.inheritAttrs = _getNodeText(prop.initializer);
289
283
  }
290
- });
291
- for (const prop of node.arguments[0].properties) {
292
- if ((ts.isPropertyAssignment(prop)) && getNodeText(ts, prop.name, ast) === 'name' && ts.isStringLiteral(prop.initializer)) {
293
- options.name = prop.initializer.text;
284
+ else if (name === 'name' && ts.isStringLiteral(prop.initializer)) {
285
+ defineOptions.name = prop.initializer.text;
294
286
  }
295
287
  }
296
288
  }
297
289
  }
298
- else if (vueCompilerOptions.composibles.useTemplateRef.includes(callText) && node.arguments.length && !node.typeArguments?.length) {
299
- const define = parseDefineFunction(node);
300
- let name;
301
- if (ts.isVariableDeclaration(parent)) {
302
- name = getNodeText(ts, parent.name, ast);
303
- }
304
- templateRefs.push({
305
- name,
306
- define
307
- });
290
+ else if (vueCompilerOptions.composables.useAttrs.includes(callText)) {
291
+ useAttrs.push(parseCallExpression(node));
292
+ }
293
+ else if (vueCompilerOptions.composables.useCssModule.includes(callText)) {
294
+ useCssModule.push(parseCallExpression(node));
295
+ }
296
+ else if (vueCompilerOptions.composables.useSlots.includes(callText)) {
297
+ useSlots.push(parseCallExpression(node));
308
298
  }
309
- else if (vueCompilerOptions.composibles.useCssModule.includes(callText)) {
310
- const define = parseDefineFunction(node);
311
- cssModules.push({
312
- define
299
+ else if (vueCompilerOptions.composables.useTemplateRef.includes(callText)
300
+ && !node.typeArguments?.length) {
301
+ useTemplateRef.push({
302
+ name: ts.isVariableDeclaration(parent) ? _getNodeText(parent.name) : undefined,
303
+ ...parseCallExpression(node)
313
304
  });
314
305
  }
315
306
  }
316
307
  ts.forEachChild(node, child => {
308
+ if (ts.isFunctionLike(node)) {
309
+ return;
310
+ }
317
311
  parents.push(node);
318
312
  visitNode(child, parents);
319
313
  parents.pop();
320
314
  });
321
315
  }
316
+ function parseCallExpression(node) {
317
+ return {
318
+ callExp: _getStartEnd(node),
319
+ exp: _getStartEnd(node.expression),
320
+ arg: node.arguments.length ? _getStartEnd(node.arguments[0]) : undefined,
321
+ typeArg: node.typeArguments?.length ? _getStartEnd(node.typeArguments[0]) : undefined,
322
+ };
323
+ }
324
+ function _getStartEnd(node) {
325
+ return getStartEnd(ts, node, ast);
326
+ }
327
+ function _getNodeText(node) {
328
+ return getNodeText(ts, node, ast);
329
+ }
322
330
  }
323
- function parseBindingRanges(ts, sourceFile) {
331
+ function parseBindingRanges(ts, ast) {
324
332
  const bindings = [];
325
- ts.forEachChild(sourceFile, node => {
333
+ ts.forEachChild(ast, node => {
326
334
  if (ts.isVariableStatement(node)) {
327
- for (const node_2 of node.declarationList.declarations) {
328
- const vars = _findBindingVars(node_2.name);
329
- for (const _var of vars) {
330
- bindings.push(_var);
331
- }
335
+ for (const decl of node.declarationList.declarations) {
336
+ const vars = _findBindingVars(decl.name);
337
+ bindings.push(...vars.map(range => ({ range })));
332
338
  }
333
339
  }
334
340
  else if (ts.isFunctionDeclaration(node)) {
335
341
  if (node.name && ts.isIdentifier(node.name)) {
336
- bindings.push(_getStartEnd(node.name));
342
+ bindings.push({
343
+ range: _getStartEnd(node.name)
344
+ });
337
345
  }
338
346
  }
339
347
  else if (ts.isClassDeclaration(node)) {
340
348
  if (node.name) {
341
- bindings.push(_getStartEnd(node.name));
349
+ bindings.push({
350
+ range: _getStartEnd(node.name)
351
+ });
342
352
  }
343
353
  }
344
354
  else if (ts.isEnumDeclaration(node)) {
345
- bindings.push(_getStartEnd(node.name));
355
+ bindings.push({
356
+ range: _getStartEnd(node.name)
357
+ });
346
358
  }
347
359
  if (ts.isImportDeclaration(node)) {
360
+ const moduleName = _getNodeText(node.moduleSpecifier).slice(1, -1);
348
361
  if (node.importClause && !node.importClause.isTypeOnly) {
349
- if (node.importClause.name) {
350
- bindings.push(_getStartEnd(node.importClause.name));
362
+ const { name, namedBindings } = node.importClause;
363
+ if (name) {
364
+ bindings.push({
365
+ range: _getStartEnd(name),
366
+ moduleName,
367
+ isDefaultImport: true
368
+ });
351
369
  }
352
- if (node.importClause.namedBindings) {
353
- if (ts.isNamedImports(node.importClause.namedBindings)) {
354
- for (const element of node.importClause.namedBindings.elements) {
370
+ if (namedBindings) {
371
+ if (ts.isNamedImports(namedBindings)) {
372
+ for (const element of namedBindings.elements) {
355
373
  if (element.isTypeOnly) {
356
374
  continue;
357
375
  }
358
- bindings.push(_getStartEnd(element.name));
376
+ bindings.push({
377
+ range: _getStartEnd(element.name),
378
+ moduleName,
379
+ isDefaultImport: element.propertyName?.text === 'default'
380
+ });
359
381
  }
360
382
  }
361
- else if (ts.isNamespaceImport(node.importClause.namedBindings)) {
362
- bindings.push(_getStartEnd(node.importClause.namedBindings.name));
383
+ else {
384
+ bindings.push({
385
+ range: _getStartEnd(namedBindings.name),
386
+ moduleName,
387
+ isNamespace: true
388
+ });
363
389
  }
364
390
  }
365
391
  }
@@ -367,61 +393,64 @@ function parseBindingRanges(ts, sourceFile) {
367
393
  });
368
394
  return bindings;
369
395
  function _getStartEnd(node) {
370
- return getStartEnd(ts, node, sourceFile);
396
+ return getStartEnd(ts, node, ast);
397
+ }
398
+ function _getNodeText(node) {
399
+ return getNodeText(ts, node, ast);
371
400
  }
372
401
  function _findBindingVars(left) {
373
- return findBindingVars(ts, left, sourceFile);
402
+ return findBindingVars(ts, left, ast);
374
403
  }
375
404
  }
376
- function findBindingVars(ts, left, sourceFile) {
405
+ function findBindingVars(ts, left, ast) {
377
406
  const vars = [];
378
407
  worker(left);
379
408
  return vars;
380
- function worker(_node) {
381
- if (ts.isIdentifier(_node)) {
382
- vars.push(getStartEnd(ts, _node, sourceFile));
409
+ function worker(node) {
410
+ if (ts.isIdentifier(node)) {
411
+ vars.push(getStartEnd(ts, node, ast));
383
412
  }
384
413
  // { ? } = ...
385
414
  // [ ? ] = ...
386
- else if (ts.isObjectBindingPattern(_node) || ts.isArrayBindingPattern(_node)) {
387
- for (const property of _node.elements) {
415
+ else if (ts.isObjectBindingPattern(node) || ts.isArrayBindingPattern(node)) {
416
+ for (const property of node.elements) {
388
417
  if (ts.isBindingElement(property)) {
389
418
  worker(property.name);
390
419
  }
391
420
  }
392
421
  }
393
422
  // { foo: ? } = ...
394
- else if (ts.isPropertyAssignment(_node)) {
395
- worker(_node.initializer);
423
+ else if (ts.isPropertyAssignment(node)) {
424
+ worker(node.initializer);
396
425
  }
397
426
  // { foo } = ...
398
- else if (ts.isShorthandPropertyAssignment(_node)) {
399
- vars.push(getStartEnd(ts, _node.name, sourceFile));
427
+ else if (ts.isShorthandPropertyAssignment(node)) {
428
+ vars.push(getStartEnd(ts, node.name, ast));
400
429
  }
401
430
  // { ...? } = ...
402
431
  // [ ...? ] = ...
403
- else if (ts.isSpreadAssignment(_node) || ts.isSpreadElement(_node)) {
404
- worker(_node.expression);
432
+ else if (ts.isSpreadAssignment(node) || ts.isSpreadElement(node)) {
433
+ worker(node.expression);
405
434
  }
406
435
  }
407
436
  }
408
- function getStartEnd(ts, node, sourceFile) {
437
+ function getStartEnd(ts, node, ast) {
409
438
  return {
410
- start: ts.getTokenPosOfNode(node, sourceFile),
439
+ start: ts.getTokenPosOfNode(node, ast),
411
440
  end: node.end,
412
441
  };
413
442
  }
414
- function getNodeText(ts, node, sourceFile) {
415
- const { start, end } = getStartEnd(ts, node, sourceFile);
416
- return sourceFile.text.substring(start, end);
443
+ function getNodeText(ts, node, ast) {
444
+ const { start, end } = getStartEnd(ts, node, ast);
445
+ return ast.text.slice(start, end);
417
446
  }
418
- function getStatementRange(ts, parents, node, sourceFile) {
447
+ function getStatementRange(ts, parents, node, ast) {
419
448
  let statementRange;
420
449
  for (let i = parents.length - 1; i >= 0; i--) {
421
450
  if (ts.isStatement(parents[i])) {
422
451
  const statement = parents[i];
423
452
  ts.forEachChild(statement, child => {
424
- const range = getStartEnd(ts, child, sourceFile);
453
+ const range = getStartEnd(ts, child, ast);
425
454
  statementRange ??= range;
426
455
  statementRange.end = range.end;
427
456
  });
@@ -429,7 +458,7 @@ function getStatementRange(ts, parents, node, sourceFile) {
429
458
  }
430
459
  }
431
460
  if (!statementRange) {
432
- statementRange = getStartEnd(ts, node, sourceFile);
461
+ statementRange = getStartEnd(ts, node, ast);
433
462
  }
434
463
  return statementRange;
435
464
  }
@@ -0,0 +1,2 @@
1
+ import type { VueCompilerOptions } from '../types';
2
+ export declare function parseVueCompilerOptions(comments: string[]): Partial<VueCompilerOptions> | undefined;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseVueCompilerOptions = parseVueCompilerOptions;
4
+ const syntaxReg = /^\s*@(?<key>.+?)\s+(?<value>.+?)\s*$/m;
5
+ function parseVueCompilerOptions(comments) {
6
+ const entries = comments
7
+ .map(text => {
8
+ try {
9
+ const match = text.match(syntaxReg);
10
+ if (match) {
11
+ const { key, value } = match.groups ?? {};
12
+ return [key, JSON.parse(value)];
13
+ }
14
+ }
15
+ catch { }
16
+ ;
17
+ })
18
+ .filter(item => !!item);
19
+ if (entries.length) {
20
+ return Object.fromEntries(entries);
21
+ }
22
+ }
23
+ //# sourceMappingURL=vueCompilerOptions.js.map
@@ -21,6 +21,7 @@ const plugin = ({ vueCompilerOptions }) => {
21
21
  descriptor: {
22
22
  filename: fileName,
23
23
  source: content,
24
+ comments: [],
24
25
  template: null,
25
26
  script: null,
26
27
  scriptSetup: null,
@@ -54,8 +55,8 @@ const plugin = ({ vueCompilerOptions }) => {
54
55
  });
55
56
  }
56
57
  // ignore `<script src="...">`
57
- else if (tag === 'script' && attrs.indexOf('src=') === -1) {
58
- let type = attrs.indexOf('type=') >= 0 ? 'scriptSetup' : 'script';
58
+ else if (tag === 'script' && !attrs.includes('src=')) {
59
+ let type = attrs.includes('type=') ? 'scriptSetup' : 'script';
59
60
  sfc.descriptor[type] = {
60
61
  attrs: {},
61
62
  content,
@@ -68,7 +69,7 @@ const plugin = ({ vueCompilerOptions }) => {
68
69
  lang,
69
70
  };
70
71
  }
71
- templateContent = templateContent.substring(0, match.index) + ' '.repeat(matchText.length) + templateContent.substring(match.index + matchText.length);
72
+ templateContent = templateContent.slice(0, match.index) + ' '.repeat(matchText.length) + templateContent.slice(match.index + matchText.length);
72
73
  }
73
74
  sfc.descriptor.template = {
74
75
  attrs: {},
@@ -41,7 +41,7 @@ const plugin = ({ vueCompilerOptions }) => {
41
41
  const matchText = match[0];
42
42
  codes.push([matchText, undefined, match.index]);
43
43
  codes.push('\n\n');
44
- content = content.substring(0, match.index) + ' '.repeat(matchText.length) + content.substring(match.index + matchText.length);
44
+ content = content.slice(0, match.index) + ' '.repeat(matchText.length) + content.slice(match.index + matchText.length);
45
45
  }
46
46
  }
47
47
  content = content
@@ -25,19 +25,19 @@ const plugin = ({ vueCompilerOptions }) => {
25
25
  sfc.descriptor.scriptSetup,
26
26
  ...sfc.descriptor.styles,
27
27
  ...sfc.descriptor.customBlocks,
28
- ].filter((block) => !!block);
28
+ ].filter(block => !!block);
29
29
  const hitBlock = blocks.find(block => change.start >= block.loc.start.offset && change.end <= block.loc.end.offset);
30
30
  if (!hitBlock) {
31
31
  return;
32
32
  }
33
33
  const oldContent = hitBlock.content;
34
34
  const newContent = hitBlock.content =
35
- hitBlock.content.substring(0, change.start - hitBlock.loc.start.offset)
35
+ hitBlock.content.slice(0, change.start - hitBlock.loc.start.offset)
36
36
  + change.newText
37
- + hitBlock.content.substring(change.end - hitBlock.loc.start.offset);
37
+ + hitBlock.content.slice(change.end - hitBlock.loc.start.offset);
38
38
  // #3449
39
39
  const endTagRegex = new RegExp(`</\\s*${hitBlock.type}\\s*>`);
40
- const insertedEndTag = !!oldContent.match(endTagRegex) !== !!newContent.match(endTagRegex);
40
+ const insertedEndTag = endTagRegex.test(oldContent) !== endTagRegex.test(newContent);
41
41
  if (insertedEndTag) {
42
42
  return;
43
43
  }
@@ -33,12 +33,12 @@ const plugin = () => {
33
33
  }
34
34
  const offset = content.lastIndexOf('\n') + 1;
35
35
  // fix folding range end position failed to mapping
36
- (0, muggle_string_1.replaceSourceRange)(embeddedFile.content, undefined, block.startTagEnd, block.endTagStart, sfc.content.substring(block.startTagEnd, block.startTagEnd + offset), [
36
+ (0, muggle_string_1.replaceSourceRange)(embeddedFile.content, undefined, block.startTagEnd, block.endTagStart, sfc.content.slice(block.startTagEnd, block.startTagEnd + offset), [
37
37
  '',
38
38
  undefined,
39
39
  block.startTagEnd + offset,
40
40
  { structure: true },
41
- ], sfc.content.substring(block.startTagEnd + offset, block.endTagStart));
41
+ ], sfc.content.slice(block.startTagEnd + offset, block.endTagStart));
42
42
  }
43
43
  }
44
44
  else {