vue-component-meta 3.1.8 → 3.2.1

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.
package/index.d.ts CHANGED
@@ -1,27 +1,21 @@
1
1
  import * as ts from 'typescript';
2
2
  import type { MetaCheckerOptions } from './lib/types';
3
3
  export * from './lib/types';
4
- export declare function createCheckerByJson(rootPath: string, json: any, checkerOptions?: MetaCheckerOptions): {
4
+ export declare function createCheckerByJson(rootDir: string, json: any, checkerOptions?: MetaCheckerOptions): {
5
5
  getExportNames: (componentPath: string) => string[];
6
- getComponentMeta: (componentPath: string, exportName?: string) => import("./lib/types").ComponentMeta;
6
+ getComponentMeta(fileName: string, exportName?: string): import("./lib/types").ComponentMeta;
7
7
  updateFile(fileName: string, text: string): void;
8
8
  deleteFile(fileName: string): void;
9
9
  reload(): void;
10
10
  clearCache(): void;
11
11
  getProgram(): ts.Program | undefined;
12
- __internal__: {
13
- tsLs: ts.LanguageService;
14
- };
15
12
  };
16
13
  export declare function createChecker(tsconfig: string, checkerOptions?: MetaCheckerOptions): {
17
14
  getExportNames: (componentPath: string) => string[];
18
- getComponentMeta: (componentPath: string, exportName?: string) => import("./lib/types").ComponentMeta;
15
+ getComponentMeta(fileName: string, exportName?: string): import("./lib/types").ComponentMeta;
19
16
  updateFile(fileName: string, text: string): void;
20
17
  deleteFile(fileName: string): void;
21
18
  reload(): void;
22
19
  clearCache(): void;
23
20
  getProgram(): ts.Program | undefined;
24
- __internal__: {
25
- tsLs: ts.LanguageService;
26
- };
27
21
  };
package/index.js CHANGED
@@ -10,19 +10,63 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
13
35
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
36
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
37
  };
16
38
  Object.defineProperty(exports, "__esModule", { value: true });
17
39
  exports.createCheckerByJson = createCheckerByJson;
18
40
  exports.createChecker = createChecker;
19
- const ts = require("typescript");
20
- const base_1 = require("./lib/base");
41
+ const core = __importStar(require("@vue/language-core"));
42
+ const path_browserify_1 = require("path-browserify");
43
+ const ts = __importStar(require("typescript"));
44
+ const checker_1 = require("./lib/checker");
21
45
  __exportStar(require("./lib/types"), exports);
22
- function createCheckerByJson(rootPath, json, checkerOptions = {}) {
23
- return (0, base_1.createCheckerByJsonConfigBase)(ts, rootPath, json, checkerOptions);
46
+ function createCheckerByJson(rootDir, json, checkerOptions = {}) {
47
+ rootDir = rootDir.replace(/\\/g, '/');
48
+ return (0, checker_1.createCheckerBase)(ts, () => {
49
+ const commandLine = core.createParsedCommandLineByJson(ts, ts.sys, rootDir, json);
50
+ const { fileNames } = ts.parseJsonConfigFileContent(json, ts.sys, rootDir, {}, undefined, undefined, core.getAllExtensions(commandLine.vueOptions)
51
+ .map(extension => ({
52
+ extension: extension.slice(1),
53
+ isMixedContent: true,
54
+ scriptKind: ts.ScriptKind.Deferred,
55
+ })));
56
+ return [commandLine, fileNames];
57
+ }, checkerOptions, rootDir);
24
58
  }
25
59
  function createChecker(tsconfig, checkerOptions = {}) {
26
- return (0, base_1.createCheckerBase)(ts, tsconfig, checkerOptions);
60
+ tsconfig = tsconfig.replace(/\\/g, '/');
61
+ return (0, checker_1.createCheckerBase)(ts, () => {
62
+ const commandLine = core.createParsedCommandLine(ts, ts.sys, tsconfig);
63
+ const { fileNames } = ts.parseJsonSourceFileConfigFileContent(ts.readJsonConfigFile(tsconfig, ts.sys.readFile), ts.sys, path_browserify_1.posix.dirname(tsconfig), {}, tsconfig, undefined, core.getAllExtensions(commandLine.vueOptions)
64
+ .map(extension => ({
65
+ extension: extension.slice(1),
66
+ isMixedContent: true,
67
+ scriptKind: ts.ScriptKind.Deferred,
68
+ })));
69
+ return [commandLine, fileNames];
70
+ }, checkerOptions, path_browserify_1.posix.dirname(tsconfig));
27
71
  }
28
72
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,16 @@
1
+ import * as core from '@vue/language-core';
2
+ import type * as ts from 'typescript';
3
+ import type { MetaCheckerOptions } from './types';
4
+ export declare function createCheckerBase(ts: typeof import('typescript'), getConfigAndFiles: () => [
5
+ commandLine: core.ParsedCommandLine,
6
+ fileNames: string[]
7
+ ], checkerOptions: MetaCheckerOptions, rootPath: string): {
8
+ getExportNames: (componentPath: string) => string[];
9
+ getComponentMeta(fileName: string, exportName?: string): import("./types").ComponentMeta;
10
+ updateFile(fileName: string, text: string): void;
11
+ deleteFile(fileName: string): void;
12
+ reload(): void;
13
+ clearCache(): void;
14
+ getProgram(): ts.Program | undefined;
15
+ };
16
+ export declare function getExport(ts: typeof import('typescript'), program: ts.Program, sourceFile: ts.SourceFile, exportName: string): ts.Expression | undefined;
package/lib/checker.js ADDED
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createCheckerBase = createCheckerBase;
37
+ exports.getExport = getExport;
38
+ const typescript_1 = require("@volar/typescript");
39
+ const core = __importStar(require("@vue/language-core"));
40
+ const componentMeta_1 = require("./componentMeta");
41
+ function createCheckerBase(ts, getConfigAndFiles, checkerOptions, rootPath) {
42
+ let [{ vueOptions, options, projectReferences }, fileNames] = getConfigAndFiles();
43
+ /**
44
+ * Used to lookup if a file is referenced.
45
+ */
46
+ let fileNamesSet = new Set(fileNames.map(path => path.replace(/\\/g, '/')));
47
+ let projectVersion = 0;
48
+ const projectHost = {
49
+ getCurrentDirectory: () => rootPath,
50
+ getProjectVersion: () => projectVersion.toString(),
51
+ getCompilationSettings: () => options,
52
+ getScriptFileNames: () => [...fileNamesSet],
53
+ getProjectReferences: () => projectReferences,
54
+ };
55
+ const scriptSnapshots = new Map();
56
+ const vueLanguagePlugin = core.createVueLanguagePlugin(ts, projectHost.getCompilationSettings(), vueOptions, id => id);
57
+ const language = core.createLanguage([
58
+ vueLanguagePlugin,
59
+ {
60
+ getLanguageId(fileName) {
61
+ return (0, typescript_1.resolveFileLanguageId)(fileName);
62
+ },
63
+ },
64
+ ], new core.FileMap(ts.sys.useCaseSensitiveFileNames), fileName => {
65
+ let snapshot = scriptSnapshots.get(fileName);
66
+ if (!scriptSnapshots.has(fileName)) {
67
+ const fileText = ts.sys.readFile(fileName);
68
+ if (fileText !== undefined) {
69
+ scriptSnapshots.set(fileName, ts.ScriptSnapshot.fromString(fileText));
70
+ }
71
+ else {
72
+ scriptSnapshots.set(fileName, undefined);
73
+ }
74
+ }
75
+ snapshot = scriptSnapshots.get(fileName);
76
+ if (snapshot) {
77
+ language.scripts.set(fileName, snapshot);
78
+ }
79
+ else {
80
+ language.scripts.delete(fileName);
81
+ }
82
+ });
83
+ const { languageServiceHost } = (0, typescript_1.createLanguageServiceHost)(ts, ts.sys, language, s => s, projectHost);
84
+ const tsLs = ts.createLanguageService(languageServiceHost);
85
+ const printer = ts.createPrinter(checkerOptions.printer);
86
+ const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost);
87
+ if (checkerOptions.forceUseTs ?? true) {
88
+ languageServiceHost.getScriptKind = fileName => {
89
+ const scriptKind = getScriptKind(fileName);
90
+ if (vueOptions.extensions.some(ext => fileName.endsWith(ext))) {
91
+ if (scriptKind === ts.ScriptKind.JS) {
92
+ return ts.ScriptKind.TS;
93
+ }
94
+ if (scriptKind === ts.ScriptKind.JSX) {
95
+ return ts.ScriptKind.TSX;
96
+ }
97
+ }
98
+ return scriptKind;
99
+ };
100
+ }
101
+ return {
102
+ getExportNames,
103
+ getComponentMeta(fileName, exportName = 'default') {
104
+ fileName = fileName.replace(/\\/g, '/');
105
+ const [program, sourceFile] = getProgramAndFile(fileName);
106
+ const componentNode = getExport(ts, program, sourceFile, exportName);
107
+ if (!componentNode) {
108
+ throw new Error(`Export '${exportName}' not found in '${sourceFile.fileName}'.`);
109
+ }
110
+ const checker = program.getTypeChecker();
111
+ const componentType = checker.getTypeAtLocation(componentNode);
112
+ return (0, componentMeta_1.getComponentMeta)(ts, checker, printer, language, componentNode, componentType, checkerOptions.schema ?? false, {
113
+ noDeclarations: checkerOptions.noDeclarations ?? true,
114
+ rawType: checkerOptions.rawType ?? false,
115
+ });
116
+ },
117
+ updateFile(fileName, text) {
118
+ fileName = fileName.replace(/\\/g, '/');
119
+ scriptSnapshots.set(fileName, ts.ScriptSnapshot.fromString(text));
120
+ // Ensure the file is referenced
121
+ fileNamesSet.add(fileName);
122
+ projectVersion++;
123
+ },
124
+ deleteFile(fileName) {
125
+ fileName = fileName.replace(/\\/g, '/');
126
+ fileNamesSet.delete(fileName);
127
+ projectVersion++;
128
+ },
129
+ reload() {
130
+ [{ vueOptions, options, projectReferences }, fileNames] = getConfigAndFiles();
131
+ fileNamesSet = new Set(fileNames.map(path => path.replace(/\\/g, '/')));
132
+ this.clearCache();
133
+ },
134
+ clearCache() {
135
+ scriptSnapshots.clear();
136
+ projectVersion++;
137
+ },
138
+ getProgram() {
139
+ return tsLs.getProgram();
140
+ },
141
+ };
142
+ function getProgramAndFile(componentPath) {
143
+ let program = tsLs.getProgram();
144
+ let sourceFile = program.getSourceFile(componentPath);
145
+ if (!sourceFile) {
146
+ fileNamesSet.add(componentPath);
147
+ projectVersion++;
148
+ program = tsLs.getProgram();
149
+ sourceFile = program.getSourceFile(componentPath);
150
+ }
151
+ return [program, sourceFile];
152
+ }
153
+ function getExportNames(componentPath) {
154
+ const [program, sourceFile] = getProgramAndFile(componentPath);
155
+ return getExports(program, sourceFile).map(e => e.getName());
156
+ }
157
+ }
158
+ function getExport(ts, program, sourceFile, exportName) {
159
+ const exports = getExports(program, sourceFile);
160
+ const symbol = exports.find(e => e.getName() === exportName);
161
+ if (symbol?.valueDeclaration) {
162
+ const decl = symbol.valueDeclaration;
163
+ if (ts.isExportAssignment(decl)) {
164
+ return decl.expression;
165
+ }
166
+ if (ts.isVariableDeclaration(decl)) {
167
+ return decl.initializer;
168
+ }
169
+ }
170
+ }
171
+ function getExports(program, sourceFile) {
172
+ const typeChecker = program.getTypeChecker();
173
+ const moduleSymbol = typeChecker.getSymbolAtLocation(sourceFile);
174
+ return moduleSymbol ? typeChecker.getExportsOfModule(moduleSymbol) : [];
175
+ }
176
+ //# sourceMappingURL=checker.js.map
@@ -0,0 +1,7 @@
1
+ import * as core from '@vue/language-core';
2
+ import type * as ts from 'typescript';
3
+ import type { ComponentMeta, MetaCheckerSchemaOptions } from './types';
4
+ export declare function getComponentMeta(ts: typeof import('typescript'), typeChecker: ts.TypeChecker, printer: ts.Printer, language: core.Language<string>, componentNode: ts.Node, componentType: ts.Type, options: MetaCheckerSchemaOptions, deprecatedOptions?: {
5
+ noDeclarations: boolean;
6
+ rawType: boolean;
7
+ }): ComponentMeta;
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getComponentMeta = getComponentMeta;
37
+ const core = __importStar(require("@vue/language-core"));
38
+ const helpers_1 = require("./helpers");
39
+ const schemaResolvers_1 = require("./schemaResolvers");
40
+ const scriptSetup_1 = require("./scriptSetup");
41
+ function getComponentMeta(ts, typeChecker, printer, language, componentNode, componentType, options, deprecatedOptions = { noDeclarations: true, rawType: false }) {
42
+ const componentSymbol = typeChecker.getSymbolAtLocation(componentNode);
43
+ let componentFile = componentNode.getSourceFile();
44
+ if (componentSymbol) {
45
+ const symbol = componentSymbol.flags & ts.SymbolFlags.Alias
46
+ ? typeChecker.getAliasedSymbol(componentSymbol)
47
+ : componentType.symbol;
48
+ const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];
49
+ if (declaration) {
50
+ componentFile = declaration.getSourceFile();
51
+ componentNode = declaration;
52
+ }
53
+ }
54
+ let name;
55
+ let description;
56
+ let type;
57
+ let props;
58
+ let events;
59
+ let slots;
60
+ let exposed;
61
+ const meta = {
62
+ get name() {
63
+ return name ?? (name = getName());
64
+ },
65
+ get description() {
66
+ return description ?? (description = getDescription());
67
+ },
68
+ get type() {
69
+ return type ?? (type = getType());
70
+ },
71
+ get props() {
72
+ return props ?? (props = getProps());
73
+ },
74
+ get events() {
75
+ return events ?? (events = getEvents());
76
+ },
77
+ get slots() {
78
+ return slots ?? (slots = getSlots());
79
+ },
80
+ get exposed() {
81
+ return exposed ?? (exposed = getExposed());
82
+ },
83
+ };
84
+ return meta;
85
+ function getType() {
86
+ return (0, helpers_1.inferComponentType)(componentType) ?? 0;
87
+ }
88
+ function getProps() {
89
+ const propsType = (0, helpers_1.inferComponentProps)(typeChecker, componentType);
90
+ if (!propsType) {
91
+ return [];
92
+ }
93
+ let result = [];
94
+ const properties = propsType.getProperties();
95
+ const eventProps = new Set(meta.events.map(event => `on${event.name.charAt(0).toUpperCase()}${event.name.slice(1)}`));
96
+ result = properties
97
+ .map(prop => {
98
+ const { resolveNestedProperties, } = (0, schemaResolvers_1.createSchemaResolvers)(ts, typeChecker, printer, language, options, deprecatedOptions);
99
+ return resolveNestedProperties(prop);
100
+ })
101
+ .filter((prop) => !!prop && !eventProps.has(prop.name));
102
+ const defaults = (0, scriptSetup_1.getDefaultsFromScriptSetup)(ts, printer, language, componentFile.fileName);
103
+ for (const prop of result) {
104
+ if (prop.name.match(/^onVnode[A-Z]/)) {
105
+ prop.name = 'onVue:' + prop.name['onVnode'.length]?.toLowerCase() + prop.name.slice('onVnode'.length + 1);
106
+ }
107
+ prop.default ??= defaults?.get(prop.name);
108
+ }
109
+ return result;
110
+ }
111
+ function getEvents() {
112
+ const emitType = (0, helpers_1.inferComponentEmit)(typeChecker, componentType);
113
+ if (emitType) {
114
+ const calls = emitType.getCallSignatures();
115
+ return calls.map(call => {
116
+ const { resolveEventSignature, } = (0, schemaResolvers_1.createSchemaResolvers)(ts, typeChecker, printer, language, options, deprecatedOptions);
117
+ return resolveEventSignature(call);
118
+ }).filter(event => event.name);
119
+ }
120
+ return [];
121
+ }
122
+ function getSlots() {
123
+ const slotsType = (0, helpers_1.inferComponentSlots)(typeChecker, componentType);
124
+ if (slotsType) {
125
+ const properties = slotsType.getProperties();
126
+ return properties.map(prop => {
127
+ const { resolveSlotProperties, } = (0, schemaResolvers_1.createSchemaResolvers)(ts, typeChecker, printer, language, options, deprecatedOptions);
128
+ return resolveSlotProperties(prop);
129
+ });
130
+ }
131
+ return [];
132
+ }
133
+ function getExposed() {
134
+ const exposedType = (0, helpers_1.inferComponentExposed)(typeChecker, componentType);
135
+ if (exposedType) {
136
+ const propsType = (0, helpers_1.inferComponentProps)(typeChecker, componentType);
137
+ const propsProperties = propsType?.getProperties() ?? [];
138
+ const properties = exposedType.getProperties().filter(prop =>
139
+ // only exposed props will have at least one declaration and no valueDeclaration
140
+ prop.declarations?.length
141
+ && !prop.valueDeclaration
142
+ // Cross-check with props to avoid including props here
143
+ && (!propsProperties.length || !propsProperties.some(({ name }) => name === prop.name))
144
+ // Exclude $slots
145
+ && prop.name !== '$slots');
146
+ return properties.map(prop => {
147
+ const { resolveExposedProperties, } = (0, schemaResolvers_1.createSchemaResolvers)(ts, typeChecker, printer, language, options, deprecatedOptions);
148
+ return resolveExposedProperties(prop);
149
+ });
150
+ }
151
+ return [];
152
+ }
153
+ function getName() {
154
+ let decl = componentNode;
155
+ // const __VLS_export = ...
156
+ const text = componentFile.text.slice(decl.pos, decl.end);
157
+ if (text.includes(core.names._export)) {
158
+ ts.forEachChild(componentFile, child2 => {
159
+ if (ts.isVariableStatement(child2)) {
160
+ for (const { name, initializer } of child2.declarationList.declarations) {
161
+ if (name.getText() === core.names._export && initializer) {
162
+ decl = initializer;
163
+ }
164
+ }
165
+ }
166
+ });
167
+ }
168
+ return core.parseOptionsFromExtression(ts, decl, componentFile)?.name?.node.text;
169
+ }
170
+ function getDescription() {
171
+ // Try to get JSDoc comments from the node using TypeScript API
172
+ const jsDocComments = ts.getJSDocCommentsAndTags(componentNode);
173
+ for (const jsDoc of jsDocComments) {
174
+ if (ts.isJSDoc(jsDoc) && jsDoc.comment) {
175
+ // Handle both string and array of comment parts
176
+ if (typeof jsDoc.comment === 'string') {
177
+ return jsDoc.comment;
178
+ }
179
+ else if (Array.isArray(jsDoc.comment)) {
180
+ return jsDoc.comment.map(part => part.text || '').join('');
181
+ }
182
+ }
183
+ }
184
+ // Fallback to symbol documentation
185
+ const symbol = typeChecker.getSymbolAtLocation(componentNode);
186
+ if (symbol) {
187
+ const description = ts.displayPartsToString(symbol.getDocumentationComment(typeChecker));
188
+ return description || undefined;
189
+ }
190
+ }
191
+ }
192
+ //# sourceMappingURL=componentMeta.js.map
@@ -0,0 +1,6 @@
1
+ import type * as ts from 'typescript';
2
+ export declare function inferComponentType(componentType: ts.Type): 1 | 2 | undefined;
3
+ export declare function inferComponentProps(typeChecker: ts.TypeChecker, componentType: ts.Type): ts.Type | undefined;
4
+ export declare function inferComponentSlots(typeChecker: ts.TypeChecker, componentType: ts.Type): ts.Type | undefined;
5
+ export declare function inferComponentEmit(typeChecker: ts.TypeChecker, componentType: ts.Type): ts.Type | undefined;
6
+ export declare function inferComponentExposed(typeChecker: ts.TypeChecker, componentType: ts.Type): ts.Type | undefined;
package/lib/helpers.js ADDED
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inferComponentType = inferComponentType;
4
+ exports.inferComponentProps = inferComponentProps;
5
+ exports.inferComponentSlots = inferComponentSlots;
6
+ exports.inferComponentEmit = inferComponentEmit;
7
+ exports.inferComponentExposed = inferComponentExposed;
8
+ function inferComponentType(componentType) {
9
+ const constructSignatures = componentType.getConstructSignatures();
10
+ const callSignatures = componentType.getCallSignatures();
11
+ for (const _sig of constructSignatures) {
12
+ return 1;
13
+ }
14
+ for (const _sig of callSignatures) {
15
+ return 2;
16
+ }
17
+ }
18
+ function inferComponentProps(typeChecker, componentType) {
19
+ const constructSignatures = componentType.getConstructSignatures();
20
+ const callSignatures = componentType.getCallSignatures();
21
+ for (const sig of constructSignatures) {
22
+ const retType = sig.getReturnType();
23
+ const props = findProperty(typeChecker, retType, '$props');
24
+ if (props) {
25
+ return props;
26
+ }
27
+ }
28
+ for (const sig of callSignatures) {
29
+ if (sig.parameters.length > 0) {
30
+ const props = sig.parameters[0];
31
+ if (props) {
32
+ return typeChecker.getTypeOfSymbol(props);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ function inferComponentSlots(typeChecker, componentType) {
38
+ const constructSignatures = componentType.getConstructSignatures();
39
+ const callSignatures = componentType.getCallSignatures();
40
+ for (const sig of constructSignatures) {
41
+ const retType = sig.getReturnType();
42
+ const slots = findProperty(typeChecker, retType, '$slots');
43
+ if (slots) {
44
+ return slots;
45
+ }
46
+ }
47
+ for (const sig of callSignatures) {
48
+ if (sig.parameters.length > 1) {
49
+ const ctxParam = sig.parameters[1];
50
+ if (ctxParam) {
51
+ const ctxType = typeChecker.getTypeOfSymbol(ctxParam);
52
+ const slots = findProperty(typeChecker, ctxType, 'slots');
53
+ if (slots) {
54
+ return slots;
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ function inferComponentEmit(typeChecker, componentType) {
61
+ const constructSignatures = componentType.getConstructSignatures();
62
+ const callSignatures = componentType.getCallSignatures();
63
+ for (const sig of constructSignatures) {
64
+ const retType = sig.getReturnType();
65
+ const emit = findProperty(typeChecker, retType, '$emit');
66
+ if (emit) {
67
+ return emit;
68
+ }
69
+ }
70
+ for (const sig of callSignatures) {
71
+ if (sig.parameters.length > 1) {
72
+ const ctxParam = sig.parameters[1];
73
+ if (ctxParam) {
74
+ const ctxType = typeChecker.getTypeOfSymbol(ctxParam);
75
+ const emitType = findProperty(typeChecker, ctxType, 'emit');
76
+ if (emitType) {
77
+ return emitType;
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ function inferComponentExposed(typeChecker, componentType) {
84
+ const constructSignatures = componentType.getConstructSignatures();
85
+ const callSignatures = componentType.getCallSignatures();
86
+ for (const sig of constructSignatures) {
87
+ return sig.getReturnType();
88
+ }
89
+ for (const sig of callSignatures) {
90
+ if (sig.parameters.length > 2) {
91
+ const exposeParam = sig.parameters[2];
92
+ if (exposeParam) {
93
+ const exposeType = typeChecker.getTypeOfSymbol(exposeParam);
94
+ const callSignatures = exposeType.getCallSignatures();
95
+ for (const callSig of callSignatures) {
96
+ const params = callSig.getParameters();
97
+ if (params.length > 0) {
98
+ return typeChecker.getTypeOfSymbol(params[0]);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ function findProperty(typeChecker, type, property) {
106
+ const symbol = type.getProperty(property);
107
+ if (symbol) {
108
+ return typeChecker.getTypeOfSymbol(symbol);
109
+ }
110
+ if (type.isUnionOrIntersection()) {
111
+ for (const sub of type.types) {
112
+ const found = findProperty(typeChecker, sub, property);
113
+ if (found) {
114
+ return found;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1,13 @@
1
+ import type * as core from '@vue/language-core';
2
+ import type * as ts from 'typescript';
3
+ import type { EventMeta, ExposeMeta, PropertyMeta, PropertyMetaSchema, SlotMeta } from './types';
4
+ export declare function createSchemaResolvers(ts: typeof import('typescript'), typeChecker: ts.TypeChecker, printer: ts.Printer, language: core.Language<string>, options: import('./types').MetaCheckerSchemaOptions, deprecatedOptions: {
5
+ noDeclarations: boolean;
6
+ rawType: boolean;
7
+ }): {
8
+ resolveNestedProperties: (propSymbol: ts.Symbol) => PropertyMeta;
9
+ resolveSlotProperties: (prop: ts.Symbol) => SlotMeta;
10
+ resolveEventSignature: (call: ts.Signature) => EventMeta;
11
+ resolveExposedProperties: (expose: ts.Symbol) => ExposeMeta;
12
+ resolveSchema: (subtype: ts.Type) => PropertyMetaSchema;
13
+ };