@reverso/scanner 0.1.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.
- package/README.md +45 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/output/index.d.ts +6 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/output/index.js +6 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/json-writer.d.ts +32 -0
- package/dist/output/json-writer.d.ts.map +1 -0
- package/dist/output/json-writer.js +169 -0
- package/dist/output/json-writer.js.map +1 -0
- package/dist/output/types-writer.d.ts +24 -0
- package/dist/output/types-writer.d.ts.map +1 -0
- package/dist/output/types-writer.js +209 -0
- package/dist/output/types-writer.js.map +1 -0
- package/dist/parser/ast-parser.d.ts +79 -0
- package/dist/parser/ast-parser.d.ts.map +1 -0
- package/dist/parser/ast-parser.js +201 -0
- package/dist/parser/ast-parser.js.map +1 -0
- package/dist/parser/attribute-extractor.d.ts +29 -0
- package/dist/parser/attribute-extractor.d.ts.map +1 -0
- package/dist/parser/attribute-extractor.js +204 -0
- package/dist/parser/attribute-extractor.js.map +1 -0
- package/dist/parser/index.d.ts +7 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +7 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/jsx-walker.d.ts +31 -0
- package/dist/parser/jsx-walker.d.ts.map +1 -0
- package/dist/parser/jsx-walker.js +103 -0
- package/dist/parser/jsx-walker.js.map +1 -0
- package/dist/scanner.d.ts +101 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +204 -0
- package/dist/scanner.js.map +1 -0
- package/dist/schema/generator.d.ts +22 -0
- package/dist/schema/generator.d.ts.map +1 -0
- package/dist/schema/generator.js +176 -0
- package/dist/schema/generator.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/normalizer.d.ts +45 -0
- package/dist/schema/normalizer.d.ts.map +1 -0
- package/dist/schema/normalizer.js +165 -0
- package/dist/schema/normalizer.js.map +1 -0
- package/dist/watch/index.d.ts +5 -0
- package/dist/watch/index.d.ts.map +1 -0
- package/dist/watch/index.js +5 -0
- package/dist/watch/index.js.map +1 -0
- package/dist/watch/watcher.d.ts +82 -0
- package/dist/watch/watcher.d.ts.map +1 -0
- package/dist/watch/watcher.js +141 -0
- package/dist/watch/watcher.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main AST parser using ts-morph.
|
|
3
|
+
*/
|
|
4
|
+
import { type DetectedField, type FileScanResult, type ScanError } from '@reverso/core';
|
|
5
|
+
import { type SourceFile } from 'ts-morph';
|
|
6
|
+
import { type JsxWalkerOptions } from './jsx-walker.js';
|
|
7
|
+
/**
|
|
8
|
+
* Options for the AST parser.
|
|
9
|
+
*/
|
|
10
|
+
export interface AstParserOptions {
|
|
11
|
+
/** Directory to scan */
|
|
12
|
+
srcDir: string;
|
|
13
|
+
/** Glob patterns to include */
|
|
14
|
+
include?: string[];
|
|
15
|
+
/** Glob patterns to exclude */
|
|
16
|
+
exclude?: string[];
|
|
17
|
+
/** TypeScript config path */
|
|
18
|
+
tsConfigFilePath?: string;
|
|
19
|
+
/** JSX walker options */
|
|
20
|
+
walker?: JsxWalkerOptions;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of parsing all files.
|
|
24
|
+
*/
|
|
25
|
+
export interface ParseResult {
|
|
26
|
+
/** All detected fields */
|
|
27
|
+
fields: DetectedField[];
|
|
28
|
+
/** Results per file */
|
|
29
|
+
fileResults: FileScanResult[];
|
|
30
|
+
/** Errors encountered */
|
|
31
|
+
errors: ScanError[];
|
|
32
|
+
/** Total duration in milliseconds */
|
|
33
|
+
duration: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* AST parser for detecting data-reverso markers.
|
|
37
|
+
*/
|
|
38
|
+
export declare class AstParser {
|
|
39
|
+
private project;
|
|
40
|
+
private options;
|
|
41
|
+
constructor(options: AstParserOptions);
|
|
42
|
+
/**
|
|
43
|
+
* Find all files matching the include/exclude patterns.
|
|
44
|
+
*/
|
|
45
|
+
findFiles(): Promise<string[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Parse a single source file.
|
|
48
|
+
*/
|
|
49
|
+
parseFile(sourceFile: SourceFile): FileScanResult;
|
|
50
|
+
/**
|
|
51
|
+
* Parse all files in the source directory.
|
|
52
|
+
*/
|
|
53
|
+
parseAll(): Promise<ParseResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Parse a single file by path.
|
|
56
|
+
*/
|
|
57
|
+
parseSingleFile(filePath: string): Promise<FileScanResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Update a file in the project (for watch mode).
|
|
60
|
+
*/
|
|
61
|
+
updateFile(filePath: string): Promise<FileScanResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Remove a file from the project (for watch mode).
|
|
64
|
+
*/
|
|
65
|
+
removeFile(filePath: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Get the relative path from the source directory.
|
|
68
|
+
*/
|
|
69
|
+
getRelativePath(filePath: string): string;
|
|
70
|
+
/**
|
|
71
|
+
* Clear all files from the project.
|
|
72
|
+
*/
|
|
73
|
+
clear(): void;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a new AST parser instance.
|
|
77
|
+
*/
|
|
78
|
+
export declare function createParser(options: AstParserOptions): AstParser;
|
|
79
|
+
//# sourceMappingURL=ast-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-parser.d.ts","sourceRoot":"","sources":["../../src/parser/ast-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,gBAAgB,EAAmB,MAAM,iBAAiB,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,uBAAuB;IACvB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,yBAAyB;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAmB;gBAEtB,OAAO,EAAE,gBAAgB;IAsBrC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBpC;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc;IA8BjD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IA8CtC;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA+BhE;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAI3D;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQlC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIzC;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAEjE"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main AST parser using ts-morph.
|
|
3
|
+
*/
|
|
4
|
+
import { relative, resolve } from 'node:path';
|
|
5
|
+
import { DEFAULT_EXCLUDE_PATTERNS, DEFAULT_INCLUDE_PATTERNS, } from '@reverso/core';
|
|
6
|
+
import { glob } from 'glob';
|
|
7
|
+
import { Project } from 'ts-morph';
|
|
8
|
+
import { walkJsxElements } from './jsx-walker.js';
|
|
9
|
+
/**
|
|
10
|
+
* AST parser for detecting data-reverso markers.
|
|
11
|
+
*/
|
|
12
|
+
export class AstParser {
|
|
13
|
+
project;
|
|
14
|
+
options;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.options = {
|
|
17
|
+
include: [...DEFAULT_INCLUDE_PATTERNS],
|
|
18
|
+
exclude: [...DEFAULT_EXCLUDE_PATTERNS],
|
|
19
|
+
...options,
|
|
20
|
+
};
|
|
21
|
+
// Create ts-morph project
|
|
22
|
+
this.project = new Project({
|
|
23
|
+
tsConfigFilePath: options.tsConfigFilePath,
|
|
24
|
+
skipAddingFilesFromTsConfig: true,
|
|
25
|
+
skipFileDependencyResolution: true,
|
|
26
|
+
compilerOptions: {
|
|
27
|
+
jsx: 4, // JsxEmit.ReactJSX
|
|
28
|
+
allowJs: true,
|
|
29
|
+
checkJs: false,
|
|
30
|
+
noEmit: true,
|
|
31
|
+
skipLibCheck: true,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Find all files matching the include/exclude patterns.
|
|
37
|
+
*/
|
|
38
|
+
async findFiles() {
|
|
39
|
+
const srcDir = resolve(this.options.srcDir);
|
|
40
|
+
const include = this.options.include ?? [...DEFAULT_INCLUDE_PATTERNS];
|
|
41
|
+
const exclude = this.options.exclude ?? [...DEFAULT_EXCLUDE_PATTERNS];
|
|
42
|
+
const files = [];
|
|
43
|
+
for (const pattern of include) {
|
|
44
|
+
const matches = await glob(pattern, {
|
|
45
|
+
cwd: srcDir,
|
|
46
|
+
absolute: true,
|
|
47
|
+
ignore: exclude,
|
|
48
|
+
nodir: true,
|
|
49
|
+
});
|
|
50
|
+
files.push(...matches);
|
|
51
|
+
}
|
|
52
|
+
// Deduplicate
|
|
53
|
+
return [...new Set(files)];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse a single source file.
|
|
57
|
+
*/
|
|
58
|
+
parseFile(sourceFile) {
|
|
59
|
+
const startTime = performance.now();
|
|
60
|
+
const filePath = sourceFile.getFilePath();
|
|
61
|
+
const errors = [];
|
|
62
|
+
try {
|
|
63
|
+
const fields = walkJsxElements(sourceFile, this.options.walker);
|
|
64
|
+
return {
|
|
65
|
+
file: filePath,
|
|
66
|
+
fields,
|
|
67
|
+
errors,
|
|
68
|
+
duration: performance.now() - startTime,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
errors.push({
|
|
73
|
+
type: 'parse',
|
|
74
|
+
message: error instanceof Error ? error.message : String(error),
|
|
75
|
+
file: filePath,
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
file: filePath,
|
|
79
|
+
fields: [],
|
|
80
|
+
errors,
|
|
81
|
+
duration: performance.now() - startTime,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse all files in the source directory.
|
|
87
|
+
*/
|
|
88
|
+
async parseAll() {
|
|
89
|
+
const startTime = performance.now();
|
|
90
|
+
const errors = [];
|
|
91
|
+
const fileResults = [];
|
|
92
|
+
const allFields = [];
|
|
93
|
+
try {
|
|
94
|
+
// Find all files
|
|
95
|
+
const filePaths = await this.findFiles();
|
|
96
|
+
// Add files to project
|
|
97
|
+
for (const filePath of filePaths) {
|
|
98
|
+
try {
|
|
99
|
+
this.project.addSourceFileAtPath(filePath);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
errors.push({
|
|
103
|
+
type: 'io',
|
|
104
|
+
message: `Failed to add file: ${error instanceof Error ? error.message : String(error)}`,
|
|
105
|
+
file: filePath,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Parse each file
|
|
110
|
+
const sourceFiles = this.project.getSourceFiles();
|
|
111
|
+
for (const sourceFile of sourceFiles) {
|
|
112
|
+
const result = this.parseFile(sourceFile);
|
|
113
|
+
fileResults.push(result);
|
|
114
|
+
allFields.push(...result.fields);
|
|
115
|
+
errors.push(...result.errors);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
errors.push({
|
|
120
|
+
type: 'io',
|
|
121
|
+
message: `Failed to scan directory: ${error instanceof Error ? error.message : String(error)}`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
fields: allFields,
|
|
126
|
+
fileResults,
|
|
127
|
+
errors,
|
|
128
|
+
duration: performance.now() - startTime,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Parse a single file by path.
|
|
133
|
+
*/
|
|
134
|
+
async parseSingleFile(filePath) {
|
|
135
|
+
const absolutePath = resolve(filePath);
|
|
136
|
+
try {
|
|
137
|
+
// Check if file already exists in project
|
|
138
|
+
let sourceFile = this.project.getSourceFile(absolutePath);
|
|
139
|
+
if (!sourceFile) {
|
|
140
|
+
sourceFile = this.project.addSourceFileAtPath(absolutePath);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Refresh the file content
|
|
144
|
+
await sourceFile.refreshFromFileSystem();
|
|
145
|
+
}
|
|
146
|
+
return this.parseFile(sourceFile);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
return {
|
|
150
|
+
file: absolutePath,
|
|
151
|
+
fields: [],
|
|
152
|
+
errors: [
|
|
153
|
+
{
|
|
154
|
+
type: 'io',
|
|
155
|
+
message: `Failed to parse file: ${error instanceof Error ? error.message : String(error)}`,
|
|
156
|
+
file: absolutePath,
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
duration: 0,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Update a file in the project (for watch mode).
|
|
165
|
+
*/
|
|
166
|
+
async updateFile(filePath) {
|
|
167
|
+
return this.parseSingleFile(filePath);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Remove a file from the project (for watch mode).
|
|
171
|
+
*/
|
|
172
|
+
removeFile(filePath) {
|
|
173
|
+
const absolutePath = resolve(filePath);
|
|
174
|
+
const sourceFile = this.project.getSourceFile(absolutePath);
|
|
175
|
+
if (sourceFile) {
|
|
176
|
+
this.project.removeSourceFile(sourceFile);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the relative path from the source directory.
|
|
181
|
+
*/
|
|
182
|
+
getRelativePath(filePath) {
|
|
183
|
+
return relative(this.options.srcDir, filePath);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Clear all files from the project.
|
|
187
|
+
*/
|
|
188
|
+
clear() {
|
|
189
|
+
const sourceFiles = this.project.getSourceFiles();
|
|
190
|
+
for (const file of sourceFiles) {
|
|
191
|
+
this.project.removeSourceFile(file);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a new AST parser instance.
|
|
197
|
+
*/
|
|
198
|
+
export function createParser(options) {
|
|
199
|
+
return new AstParser(options);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=ast-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-parser.js","sourceRoot":"","sources":["../../src/parser/ast-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GAIzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAmB,MAAM,UAAU,CAAC;AACpD,OAAO,EAAyB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAgCzE;;GAEG;AACH,MAAM,OAAO,SAAS;IACZ,OAAO,CAAU;IACjB,OAAO,CAAmB;IAElC,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,GAAG;YACb,OAAO,EAAE,CAAC,GAAG,wBAAwB,CAAC;YACtC,OAAO,EAAE,CAAC,GAAG,wBAAwB,CAAC;YACtC,GAAG,OAAO;SACX,CAAC;QAEF,0BAA0B;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC;YACzB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,2BAA2B,EAAE,IAAI;YACjC,4BAA4B,EAAE,IAAI;YAClC,eAAe,EAAE;gBACf,GAAG,EAAE,CAAC,EAAE,mBAAmB;gBAC3B,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,IAAI;gBACZ,YAAY,EAAE,IAAI;aACnB;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG,wBAAwB,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG,wBAAwB,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;gBAClC,GAAG,EAAE,MAAM;gBACX,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,cAAc;QACd,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,UAAsB;QAC9B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEhE,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;aACxC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/D,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,EAAE;gBACV,MAAM;gBACN,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAqB,EAAE,CAAC;QACzC,MAAM,SAAS,GAAoB,EAAE,CAAC;QAEtC,IAAI,CAAC;YACH,iBAAiB;YACjB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAEzC,uBAAuB;YACvB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,IAAI;wBACV,OAAO,EAAE,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBACxF,IAAI,EAAE,QAAQ;qBACf,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAClD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC1C,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzB,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAC/F,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,WAAW;YACX,MAAM;YACN,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;SACxC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,0CAA0C;YAC1C,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAE1D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,MAAM,UAAU,CAAC,qBAAqB,EAAE,CAAC;YAC3C,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE;oBACN;wBACE,IAAI,EAAE,IAAI;wBACV,OAAO,EAAE,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBAC1F,IAAI,EAAE,YAAY;qBACnB;iBACF;gBACD,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB;QACzB,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB;QAC9B,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAClD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts data-reverso-* attributes from JSX elements.
|
|
3
|
+
*/
|
|
4
|
+
import { type FieldAttributes } from '@reverso/core';
|
|
5
|
+
import type { JsxOpeningElement, JsxSelfClosingElement } from 'ts-morph';
|
|
6
|
+
/**
|
|
7
|
+
* Result of extracting attributes from a JSX element.
|
|
8
|
+
*/
|
|
9
|
+
export interface ExtractedAttributes {
|
|
10
|
+
/** The data-reverso path value */
|
|
11
|
+
path: string;
|
|
12
|
+
/** All extracted attributes */
|
|
13
|
+
attributes: Partial<FieldAttributes>;
|
|
14
|
+
/** Raw attribute map */
|
|
15
|
+
raw: Record<string, string | undefined>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if a JSX element has the data-reverso attribute.
|
|
19
|
+
*/
|
|
20
|
+
export declare function hasReversoMarker(element: JsxOpeningElement | JsxSelfClosingElement): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Extract all data-reverso-* attributes from a JSX element.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractAttributes(element: JsxOpeningElement | JsxSelfClosingElement): ExtractedAttributes | null;
|
|
25
|
+
/**
|
|
26
|
+
* Get the text content of a JSX element.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getElementTextContent(element: JsxOpeningElement | JsxSelfClosingElement): string | undefined;
|
|
29
|
+
//# sourceMappingURL=attribute-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-extractor.d.ts","sourceRoot":"","sources":["../../src/parser/attribute-extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,eAAe,EAAmC,MAAM,eAAe,CAAC;AACtF,OAAO,KAAK,EAGV,iBAAiB,EACjB,qBAAqB,EAEtB,MAAM,UAAU,CAAC;AAGlB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,qBAAqB,GAAG,OAAO,CAU5F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,iBAAiB,GAAG,qBAAqB,GACjD,mBAAmB,GAAG,IAAI,CAmC5B;AA2ID;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,GAAG,qBAAqB,GACjD,MAAM,GAAG,SAAS,CA2BpB"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts data-reverso-* attributes from JSX elements.
|
|
3
|
+
*/
|
|
4
|
+
import { MARKER_ATTRIBUTE, MARKER_PREFIX } from '@reverso/core';
|
|
5
|
+
import { SyntaxKind } from 'ts-morph';
|
|
6
|
+
/**
|
|
7
|
+
* Check if a JSX element has the data-reverso attribute.
|
|
8
|
+
*/
|
|
9
|
+
export function hasReversoMarker(element) {
|
|
10
|
+
const attributes = element.getAttributes();
|
|
11
|
+
return attributes.some((attr) => {
|
|
12
|
+
if (attr.getKind() === SyntaxKind.JsxAttribute) {
|
|
13
|
+
const jsxAttr = attr;
|
|
14
|
+
const name = jsxAttr.getNameNode().getText();
|
|
15
|
+
return name === MARKER_ATTRIBUTE;
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract all data-reverso-* attributes from a JSX element.
|
|
22
|
+
*/
|
|
23
|
+
export function extractAttributes(element) {
|
|
24
|
+
const attributes = element.getAttributes();
|
|
25
|
+
const raw = {};
|
|
26
|
+
let path;
|
|
27
|
+
for (const attr of attributes) {
|
|
28
|
+
// Skip spread attributes
|
|
29
|
+
if (attr.getKind() === SyntaxKind.JsxSpreadAttribute) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const jsxAttr = attr;
|
|
33
|
+
const name = jsxAttr.getNameNode().getText();
|
|
34
|
+
// Check for data-reverso or data-reverso-* attributes
|
|
35
|
+
if (name === MARKER_ATTRIBUTE) {
|
|
36
|
+
path = getAttributeValue(jsxAttr);
|
|
37
|
+
}
|
|
38
|
+
else if (name.startsWith(MARKER_PREFIX)) {
|
|
39
|
+
const key = name.slice(MARKER_PREFIX.length);
|
|
40
|
+
raw[key] = getAttributeValue(jsxAttr);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!path) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
// Convert raw attributes to typed FieldAttributes
|
|
47
|
+
const fieldAttrs = parseFieldAttributes(raw);
|
|
48
|
+
return {
|
|
49
|
+
path,
|
|
50
|
+
attributes: fieldAttrs,
|
|
51
|
+
raw,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the value of a JSX attribute.
|
|
56
|
+
*/
|
|
57
|
+
function getAttributeValue(attr) {
|
|
58
|
+
const initializer = attr.getInitializer();
|
|
59
|
+
if (!initializer) {
|
|
60
|
+
// Boolean attribute like data-reverso-required
|
|
61
|
+
return 'true';
|
|
62
|
+
}
|
|
63
|
+
// String literal: data-reverso="home.hero.title"
|
|
64
|
+
if (initializer.getKind() === SyntaxKind.StringLiteral) {
|
|
65
|
+
return initializer.getText().slice(1, -1); // Remove quotes
|
|
66
|
+
}
|
|
67
|
+
// JSX expression: data-reverso={variable} or data-reverso={"string"}
|
|
68
|
+
if (initializer.getKind() === SyntaxKind.JsxExpression) {
|
|
69
|
+
const expression = initializer.getFirstChildByKind(SyntaxKind.StringLiteral);
|
|
70
|
+
if (expression) {
|
|
71
|
+
return expression.getText().slice(1, -1);
|
|
72
|
+
}
|
|
73
|
+
// Check for template literal
|
|
74
|
+
const template = initializer.getFirstChildByKind(SyntaxKind.NoSubstitutionTemplateLiteral);
|
|
75
|
+
if (template) {
|
|
76
|
+
return template.getText().slice(1, -1);
|
|
77
|
+
}
|
|
78
|
+
// Check for number literal
|
|
79
|
+
const numLiteral = initializer.getFirstChildByKind(SyntaxKind.NumericLiteral);
|
|
80
|
+
if (numLiteral) {
|
|
81
|
+
return numLiteral.getText();
|
|
82
|
+
}
|
|
83
|
+
// Check for true/false
|
|
84
|
+
const trueLiteral = initializer.getFirstChildByKind(SyntaxKind.TrueKeyword);
|
|
85
|
+
if (trueLiteral) {
|
|
86
|
+
return 'true';
|
|
87
|
+
}
|
|
88
|
+
const falseLiteral = initializer.getFirstChildByKind(SyntaxKind.FalseKeyword);
|
|
89
|
+
if (falseLiteral) {
|
|
90
|
+
return 'false';
|
|
91
|
+
}
|
|
92
|
+
// For other expressions, return the raw text
|
|
93
|
+
// Cast to JsxExpression since we've checked the kind above
|
|
94
|
+
const jsxExpr = initializer;
|
|
95
|
+
const expressionNode = jsxExpr.getExpression();
|
|
96
|
+
if (expressionNode) {
|
|
97
|
+
return expressionNode.getText();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parse raw attribute strings into typed FieldAttributes.
|
|
104
|
+
*/
|
|
105
|
+
function parseFieldAttributes(raw) {
|
|
106
|
+
const attrs = {};
|
|
107
|
+
if (raw.type) {
|
|
108
|
+
attrs.type = raw.type;
|
|
109
|
+
}
|
|
110
|
+
if (raw.label) {
|
|
111
|
+
attrs.label = raw.label;
|
|
112
|
+
}
|
|
113
|
+
if (raw.placeholder) {
|
|
114
|
+
attrs.placeholder = raw.placeholder;
|
|
115
|
+
}
|
|
116
|
+
if (raw.required !== undefined) {
|
|
117
|
+
attrs.required = raw.required === 'true' || raw.required === '';
|
|
118
|
+
}
|
|
119
|
+
if (raw.validation) {
|
|
120
|
+
attrs.validation = raw.validation;
|
|
121
|
+
}
|
|
122
|
+
if (raw.options) {
|
|
123
|
+
attrs.options = raw.options;
|
|
124
|
+
}
|
|
125
|
+
if (raw.condition) {
|
|
126
|
+
attrs.condition = raw.condition;
|
|
127
|
+
}
|
|
128
|
+
if (raw.default) {
|
|
129
|
+
attrs.default = raw.default;
|
|
130
|
+
}
|
|
131
|
+
if (raw.help) {
|
|
132
|
+
attrs.help = raw.help;
|
|
133
|
+
}
|
|
134
|
+
if (raw.min !== undefined) {
|
|
135
|
+
const num = Number(raw.min);
|
|
136
|
+
if (!Number.isNaN(num)) {
|
|
137
|
+
attrs.min = num;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (raw.max !== undefined) {
|
|
141
|
+
const num = Number(raw.max);
|
|
142
|
+
if (!Number.isNaN(num)) {
|
|
143
|
+
attrs.max = num;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (raw.step !== undefined) {
|
|
147
|
+
const num = Number(raw.step);
|
|
148
|
+
if (!Number.isNaN(num)) {
|
|
149
|
+
attrs.step = num;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (raw.accept) {
|
|
153
|
+
attrs.accept = raw.accept;
|
|
154
|
+
}
|
|
155
|
+
if (raw.multiple !== undefined) {
|
|
156
|
+
attrs.multiple = raw.multiple === 'true' || raw.multiple === '';
|
|
157
|
+
}
|
|
158
|
+
if (raw.rows !== undefined) {
|
|
159
|
+
const num = Number(raw.rows);
|
|
160
|
+
if (!Number.isNaN(num)) {
|
|
161
|
+
attrs.rows = num;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (raw.width !== undefined) {
|
|
165
|
+
const num = Number(raw.width);
|
|
166
|
+
if (!Number.isNaN(num) && num >= 1 && num <= 12) {
|
|
167
|
+
attrs.width = num;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (raw.readonly !== undefined) {
|
|
171
|
+
attrs.readonly = raw.readonly === 'true' || raw.readonly === '';
|
|
172
|
+
}
|
|
173
|
+
if (raw.hidden !== undefined) {
|
|
174
|
+
attrs.hidden = raw.hidden === 'true' || raw.hidden === '';
|
|
175
|
+
}
|
|
176
|
+
return attrs;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get the text content of a JSX element.
|
|
180
|
+
*/
|
|
181
|
+
export function getElementTextContent(element) {
|
|
182
|
+
// Self-closing elements have no children
|
|
183
|
+
if (element.getKind() === SyntaxKind.JsxSelfClosingElement) {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
const openingElement = element;
|
|
187
|
+
const parent = openingElement.getParent();
|
|
188
|
+
if (!parent || parent.getKind() !== SyntaxKind.JsxElement) {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
// Get all children and extract text
|
|
192
|
+
const children = parent.getChildren();
|
|
193
|
+
const textParts = [];
|
|
194
|
+
for (const child of children) {
|
|
195
|
+
if (child.getKind() === SyntaxKind.JsxText) {
|
|
196
|
+
const text = child.getText().trim();
|
|
197
|
+
if (text) {
|
|
198
|
+
textParts.push(text);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return textParts.length > 0 ? textParts.join(' ') : undefined;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=attribute-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-extractor.js","sourceRoot":"","sources":["../../src/parser/attribute-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser exports for @reverso/scanner
|
|
3
|
+
*/
|
|
4
|
+
export { AstParser, createParser, type AstParserOptions, type ParseResult, } from './ast-parser.js';
|
|
5
|
+
export { walkJsxElements, getUniquePaths, groupFieldsByPath, findDuplicatePaths, type JsxWalkerOptions, } from './jsx-walker.js';
|
|
6
|
+
export { hasReversoMarker, extractAttributes, getElementTextContent, type ExtractedAttributes, } from './attribute-extractor.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser exports for @reverso/scanner
|
|
3
|
+
*/
|
|
4
|
+
export { AstParser, createParser, } from './ast-parser.js';
|
|
5
|
+
export { walkJsxElements, getUniquePaths, groupFieldsByPath, findDuplicatePaths, } from './jsx-walker.js';
|
|
6
|
+
export { hasReversoMarker, extractAttributes, getElementTextContent, } from './attribute-extractor.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,SAAS,EACT,YAAY,GAGb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GAEnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GAEtB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walks through JSX elements in a source file to find data-reverso markers.
|
|
3
|
+
*/
|
|
4
|
+
import type { DetectedField } from '@reverso/core';
|
|
5
|
+
import { type SourceFile } from 'ts-morph';
|
|
6
|
+
/**
|
|
7
|
+
* Options for walking JSX elements.
|
|
8
|
+
*/
|
|
9
|
+
export interface JsxWalkerOptions {
|
|
10
|
+
/** Include the element tag name */
|
|
11
|
+
includeElement?: boolean;
|
|
12
|
+
/** Include text content as default */
|
|
13
|
+
includeTextContent?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Walk through all JSX elements in a source file and detect fields.
|
|
17
|
+
*/
|
|
18
|
+
export declare function walkJsxElements(sourceFile: SourceFile, options?: JsxWalkerOptions): DetectedField[];
|
|
19
|
+
/**
|
|
20
|
+
* Find all unique paths in a list of detected fields.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getUniquePaths(fields: DetectedField[]): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Group fields by their path.
|
|
25
|
+
*/
|
|
26
|
+
export declare function groupFieldsByPath(fields: DetectedField[]): Map<string, DetectedField[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Check for duplicate paths (same path in multiple places).
|
|
29
|
+
*/
|
|
30
|
+
export declare function findDuplicatePaths(fields: DetectedField[]): Map<string, DetectedField[]>;
|
|
31
|
+
//# sourceMappingURL=jsx-walker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx-walker.d.ts","sourceRoot":"","sources":["../../src/parser/jsx-walker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,UAAU,CAAC;AAOlB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sCAAsC;IACtC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,gBAAqB,GAC7B,aAAa,EAAE,CAuBjB;AAmDD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAMhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAUvF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAWxF"}
|