pug-tail 0.1.0-alpha.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.

Potentially problematic release.


This version of pug-tail might be problematic. Click here for more details.

Files changed (126) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/LICENSE +21 -0
  3. package/README.md +318 -0
  4. package/dist/cli/config/loader.d.ts +9 -0
  5. package/dist/cli/config/loader.d.ts.map +1 -0
  6. package/dist/cli/config/loader.js +82 -0
  7. package/dist/cli/config/loader.js.map +1 -0
  8. package/dist/cli/config/matcher.d.ts +3 -0
  9. package/dist/cli/config/matcher.d.ts.map +1 -0
  10. package/dist/cli/config/matcher.js +29 -0
  11. package/dist/cli/config/matcher.js.map +1 -0
  12. package/dist/cli/config/types.d.ts +26 -0
  13. package/dist/cli/config/types.d.ts.map +1 -0
  14. package/dist/cli/config/types.js +2 -0
  15. package/dist/cli/config/types.js.map +1 -0
  16. package/dist/cli/dataLoader.d.ts +8 -0
  17. package/dist/cli/dataLoader.d.ts.map +1 -0
  18. package/dist/cli/dataLoader.js +70 -0
  19. package/dist/cli/dataLoader.js.map +1 -0
  20. package/dist/cli/dependencyTracker.d.ts +19 -0
  21. package/dist/cli/dependencyTracker.d.ts.map +1 -0
  22. package/dist/cli/dependencyTracker.js +149 -0
  23. package/dist/cli/dependencyTracker.js.map +1 -0
  24. package/dist/cli/fileProcessor.d.ts +32 -0
  25. package/dist/cli/fileProcessor.d.ts.map +1 -0
  26. package/dist/cli/fileProcessor.js +218 -0
  27. package/dist/cli/fileProcessor.js.map +1 -0
  28. package/dist/cli/pathResolver.d.ts +12 -0
  29. package/dist/cli/pathResolver.d.ts.map +1 -0
  30. package/dist/cli/pathResolver.js +35 -0
  31. package/dist/cli/pathResolver.js.map +1 -0
  32. package/dist/cli/watcher.d.ts +22 -0
  33. package/dist/cli/watcher.d.ts.map +1 -0
  34. package/dist/cli/watcher.js +186 -0
  35. package/dist/cli/watcher.js.map +1 -0
  36. package/dist/cli.d.ts +3 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +624 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/core/astTransformer.d.ts +32 -0
  41. package/dist/core/astTransformer.d.ts.map +1 -0
  42. package/dist/core/astTransformer.js +532 -0
  43. package/dist/core/astTransformer.js.map +1 -0
  44. package/dist/core/componentRegistry.d.ts +14 -0
  45. package/dist/core/componentRegistry.d.ts.map +1 -0
  46. package/dist/core/componentRegistry.js +32 -0
  47. package/dist/core/componentRegistry.js.map +1 -0
  48. package/dist/core/errorHandler.d.ts +24 -0
  49. package/dist/core/errorHandler.d.ts.map +1 -0
  50. package/dist/core/errorHandler.js +102 -0
  51. package/dist/core/errorHandler.js.map +1 -0
  52. package/dist/core/slotResolver.d.ts +9 -0
  53. package/dist/core/slotResolver.d.ts.map +1 -0
  54. package/dist/core/slotResolver.js +88 -0
  55. package/dist/core/slotResolver.js.map +1 -0
  56. package/dist/index.d.ts +10 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +8 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/transform.d.ts +26 -0
  61. package/dist/transform.d.ts.map +1 -0
  62. package/dist/transform.js +247 -0
  63. package/dist/transform.js.map +1 -0
  64. package/dist/types/index.d.ts +41 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +2 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/utils/astHelpers.d.ts +16 -0
  69. package/dist/utils/astHelpers.d.ts.map +1 -0
  70. package/dist/utils/astHelpers.js +66 -0
  71. package/dist/utils/astHelpers.js.map +1 -0
  72. package/dist/utils/attributeCategorizer.d.ts +6 -0
  73. package/dist/utils/attributeCategorizer.d.ts.map +1 -0
  74. package/dist/utils/attributeCategorizer.js +17 -0
  75. package/dist/utils/attributeCategorizer.js.map +1 -0
  76. package/dist/utils/attributes/addAttributeFallthrough.d.ts +4 -0
  77. package/dist/utils/attributes/addAttributeFallthrough.d.ts.map +1 -0
  78. package/dist/utils/attributes/addAttributeFallthrough.js +22 -0
  79. package/dist/utils/attributes/addAttributeFallthrough.js.map +1 -0
  80. package/dist/utils/attributes/createAttributesCode.d.ts +3 -0
  81. package/dist/utils/attributes/createAttributesCode.d.ts.map +1 -0
  82. package/dist/utils/attributes/createAttributesCode.js +21 -0
  83. package/dist/utils/attributes/createAttributesCode.js.map +1 -0
  84. package/dist/utils/attributes/extractAttributes.d.ts +4 -0
  85. package/dist/utils/attributes/extractAttributes.d.ts.map +1 -0
  86. package/dist/utils/attributes/extractAttributes.js +15 -0
  87. package/dist/utils/attributes/extractAttributes.js.map +1 -0
  88. package/dist/utils/attributes/findRootElements.d.ts +7 -0
  89. package/dist/utils/attributes/findRootElements.d.ts.map +1 -0
  90. package/dist/utils/attributes/findRootElements.js +36 -0
  91. package/dist/utils/attributes/findRootElements.js.map +1 -0
  92. package/dist/utils/attributes/index.d.ts +5 -0
  93. package/dist/utils/attributes/index.d.ts.map +1 -0
  94. package/dist/utils/attributes/index.js +5 -0
  95. package/dist/utils/attributes/index.js.map +1 -0
  96. package/dist/utils/babelHelpers.d.ts +3 -0
  97. package/dist/utils/babelHelpers.d.ts.map +1 -0
  98. package/dist/utils/babelHelpers.js +73 -0
  99. package/dist/utils/babelHelpers.js.map +1 -0
  100. package/dist/utils/componentDetector.d.ts +12 -0
  101. package/dist/utils/componentDetector.d.ts.map +1 -0
  102. package/dist/utils/componentDetector.js +206 -0
  103. package/dist/utils/componentDetector.js.map +1 -0
  104. package/dist/utils/dataFilesDetector.d.ts +4 -0
  105. package/dist/utils/dataFilesDetector.d.ts.map +1 -0
  106. package/dist/utils/dataFilesDetector.js +88 -0
  107. package/dist/utils/dataFilesDetector.js.map +1 -0
  108. package/dist/utils/deepClone.d.ts +5 -0
  109. package/dist/utils/deepClone.d.ts.map +1 -0
  110. package/dist/utils/deepClone.js +10 -0
  111. package/dist/utils/deepClone.js.map +1 -0
  112. package/dist/utils/index.d.ts +7 -0
  113. package/dist/utils/index.d.ts.map +1 -0
  114. package/dist/utils/index.js +7 -0
  115. package/dist/utils/index.js.map +1 -0
  116. package/dist/utils/scopeAnalyzer.d.ts +5 -0
  117. package/dist/utils/scopeAnalyzer.d.ts.map +1 -0
  118. package/dist/utils/scopeAnalyzer.js +267 -0
  119. package/dist/utils/scopeAnalyzer.js.map +1 -0
  120. package/dist/utils/usageDetector.d.ts +8 -0
  121. package/dist/utils/usageDetector.d.ts.map +1 -0
  122. package/dist/utils/usageDetector.js +148 -0
  123. package/dist/utils/usageDetector.js.map +1 -0
  124. package/docs/COMPONENTS.md +708 -0
  125. package/docs/CONFIGURATION.md +708 -0
  126. package/package.json +103 -0
@@ -0,0 +1,88 @@
1
+ import { parse } from '@babel/parser';
2
+ export function detectDataFiles(ast) {
3
+ const dataFiles = [];
4
+ function visitNode(node) {
5
+ if (node.type === 'Code' && !node.buffer) {
6
+ const files = extractDataFilesFromCode(node.val);
7
+ dataFiles.push(...files);
8
+ }
9
+ if ('nodes' in node && node.nodes) {
10
+ for (const child of node.nodes) {
11
+ visitNode(child);
12
+ }
13
+ }
14
+ if ('block' in node && node.block) {
15
+ visitNode(node.block);
16
+ }
17
+ }
18
+ visitNode(ast);
19
+ return dataFiles;
20
+ }
21
+ function extractDataFilesFromCode(code) {
22
+ try {
23
+ const ast = parse(code, {
24
+ sourceType: 'module',
25
+ plugins: ['typescript'],
26
+ });
27
+ const files = [];
28
+ for (const statement of ast.program.body) {
29
+ if (statement.type === 'VariableDeclaration') {
30
+ for (const declaration of statement.declarations) {
31
+ if (declaration.id.type === 'Identifier' &&
32
+ declaration.id.name === '$dataFiles' &&
33
+ declaration.init?.type === 'ArrayExpression') {
34
+ for (const element of declaration.init.elements) {
35
+ if (element?.type === 'StringLiteral') {
36
+ files.push(element.value);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return files;
44
+ }
45
+ catch {
46
+ return [];
47
+ }
48
+ }
49
+ export function removeDataFilesDeclaration(ast) {
50
+ function visitNode(node) {
51
+ if ('nodes' in node && node.nodes) {
52
+ node.nodes = node.nodes.filter((child) => {
53
+ if (child.type === 'Code' && !child.buffer) {
54
+ return !isDataFilesDeclaration(child.val);
55
+ }
56
+ return true;
57
+ });
58
+ for (const child of node.nodes) {
59
+ visitNode(child);
60
+ }
61
+ }
62
+ if ('block' in node && node.block) {
63
+ visitNode(node.block);
64
+ }
65
+ }
66
+ visitNode(ast);
67
+ }
68
+ function isDataFilesDeclaration(code) {
69
+ try {
70
+ const ast = parse(code, {
71
+ sourceType: 'module',
72
+ plugins: ['typescript'],
73
+ });
74
+ return ast.program.body.some((statement) => {
75
+ if (statement.type === 'VariableDeclaration') {
76
+ return statement.declarations.some((declaration) => {
77
+ return (declaration.id.type === 'Identifier' &&
78
+ declaration.id.name === '$dataFiles');
79
+ });
80
+ }
81
+ return false;
82
+ });
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ //# sourceMappingURL=dataFilesDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataFilesDetector.js","sourceRoot":"","sources":["../../src/utils/dataFilesDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Block, Node } from '@/types/pug';
2
+ export declare function deepCloneNode<T extends Node>(node: T): T;
3
+ export declare function deepCloneBlock(block: Block): Block;
4
+ export declare function deepClone<T>(value: T): T;
5
+ //# sourceMappingURL=deepClone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepClone.d.ts","sourceRoot":"","sources":["../../src/utils/deepClone.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAgB9C,wBAAgB,aAAa,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAExD;AAgBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAElD;AAqBD,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAExC"}
@@ -0,0 +1,10 @@
1
+ export function deepCloneNode(node) {
2
+ return structuredClone(node);
3
+ }
4
+ export function deepCloneBlock(block) {
5
+ return structuredClone(block);
6
+ }
7
+ export function deepClone(value) {
8
+ return structuredClone(value);
9
+ }
10
+ //# sourceMappingURL=deepClone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepClone.js","sourceRoot":"","sources":["../../src/utils/deepClone.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,aAAa,CAAiB,IAAO;IACnD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC;AAgBD,MAAM,UAAU,cAAc,CAAC,KAAY;IACzC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAC/B,CAAC;AAqBD,MAAM,UAAU,SAAS,CAAI,KAAQ;IACnC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './astHelpers.js';
2
+ export * from './attributeCategorizer.js';
3
+ export * from './babelHelpers.js';
4
+ export * from './componentDetector.js';
5
+ export * from './deepClone.js';
6
+ export * from './usageDetector.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,7 @@
1
+ export * from './astHelpers.js';
2
+ export * from './attributeCategorizer.js';
3
+ export * from './babelHelpers.js';
4
+ export * from './componentDetector.js';
5
+ export * from './deepClone.js';
6
+ export * from './usageDetector.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ScopeAnalysisResult, ValidationConfig } from '../types/index.js';
2
+ import type { Block } from '@/types/pug';
3
+ export declare function analyzeComponentScope(componentBody: Block, config?: ValidationConfig): ScopeAnalysisResult;
4
+ export declare function isAllowedIdentifier(name: string, scopeAnalysis: ScopeAnalysisResult, config: ValidationConfig): boolean;
5
+ //# sourceMappingURL=scopeAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopeAnalyzer.d.ts","sourceRoot":"","sources":["../../src/utils/scopeAnalyzer.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACpE,OAAO,KAAK,EACV,KAAK,EAON,MAAM,aAAa,CAAA;AA6DpB,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,KAAK,EACpB,MAAM,GAAE,gBAAqB,GAC5B,mBAAmB,CA6BrB;AAqSD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,mBAAmB,EAClC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAST"}
@@ -0,0 +1,267 @@
1
+ import * as parser from '@babel/parser';
2
+ import traverseModule from '@babel/traverse';
3
+ import * as t from '@babel/types';
4
+ const traverse = typeof traverseModule === 'function'
5
+ ? traverseModule
6
+ : traverseModule.default;
7
+ const ALLOWED_GLOBALS = new Set([
8
+ 'console',
9
+ 'Math',
10
+ 'Date',
11
+ 'JSON',
12
+ 'Object',
13
+ 'Array',
14
+ 'String',
15
+ 'Number',
16
+ 'Boolean',
17
+ 'RegExp',
18
+ 'Error',
19
+ 'Promise',
20
+ 'Set',
21
+ 'Map',
22
+ 'WeakMap',
23
+ 'WeakSet',
24
+ 'Symbol',
25
+ 'BigInt',
26
+ 'Proxy',
27
+ 'Reflect',
28
+ 'undefined',
29
+ 'null',
30
+ 'true',
31
+ 'false',
32
+ 'NaN',
33
+ 'Infinity',
34
+ 'globalThis',
35
+ 'attributes',
36
+ 'block',
37
+ '$props',
38
+ '$attrs',
39
+ ]);
40
+ export function analyzeComponentScope(componentBody, config = {}) {
41
+ const result = {
42
+ declaredVariables: new Set(),
43
+ referencedVariables: new Set(),
44
+ propsVariables: new Set(),
45
+ attrsVariables: new Set(),
46
+ slotVariables: new Set(),
47
+ externalReferences: new Set(),
48
+ };
49
+ walkBlock(componentBody, result);
50
+ for (const varName of result.referencedVariables) {
51
+ if (!result.declaredVariables.has(varName) &&
52
+ !result.propsVariables.has(varName) &&
53
+ !result.attrsVariables.has(varName) &&
54
+ !result.slotVariables.has(varName) &&
55
+ !ALLOWED_GLOBALS.has(varName) &&
56
+ !(config.allowedGlobals || []).includes(varName)) {
57
+ result.externalReferences.add(varName);
58
+ }
59
+ }
60
+ return result;
61
+ }
62
+ function walkBlock(block, result) {
63
+ for (const node of block.nodes) {
64
+ walkNode(node, result);
65
+ }
66
+ }
67
+ function walkNode(node, result) {
68
+ if (node.type === 'Code') {
69
+ analyzeCodeNode(node, result);
70
+ }
71
+ else if (node.type === 'Tag') {
72
+ const tag = node;
73
+ if (tag.block) {
74
+ walkBlock(tag.block, result);
75
+ }
76
+ }
77
+ else if (node.type === 'Block') {
78
+ walkBlock(node, result);
79
+ }
80
+ else if (node.type === 'Conditional') {
81
+ const conditional = node;
82
+ if (conditional.test) {
83
+ analyzeExpression(conditional.test, result);
84
+ }
85
+ if (conditional.consequent) {
86
+ walkBlock(conditional.consequent, result);
87
+ }
88
+ if (conditional.alternate) {
89
+ walkNode(conditional.alternate, result);
90
+ }
91
+ }
92
+ else if (node.type === 'Each') {
93
+ const each = node;
94
+ if (each.val) {
95
+ result.declaredVariables.add(each.val);
96
+ }
97
+ if (each.key) {
98
+ result.declaredVariables.add(each.key);
99
+ }
100
+ if (each.obj) {
101
+ analyzeExpression(each.obj, result);
102
+ }
103
+ if (each.block) {
104
+ walkBlock(each.block, result);
105
+ }
106
+ if (each.alternate) {
107
+ walkBlock(each.alternate, result);
108
+ }
109
+ }
110
+ else if (node.type === 'Case') {
111
+ const caseNode = node;
112
+ analyzeExpression(caseNode.expr, result);
113
+ if (caseNode.block) {
114
+ walkBlock(caseNode.block, result);
115
+ }
116
+ }
117
+ }
118
+ function analyzeCodeNode(code, result) {
119
+ const codeValue = code.val.trim();
120
+ if (codeValue.includes('$props')) {
121
+ extractPropsVariables(codeValue, result);
122
+ }
123
+ if (codeValue.includes('$attrs')) {
124
+ extractAttrsVariables(codeValue, result);
125
+ }
126
+ try {
127
+ analyzeJavaScriptCode(codeValue, result);
128
+ }
129
+ catch {
130
+ extractIdentifiersSimple(codeValue, result);
131
+ }
132
+ }
133
+ function analyzeJavaScriptCode(code, result) {
134
+ const ast = parser.parse(code, {
135
+ sourceType: 'module',
136
+ plugins: ['typescript'],
137
+ });
138
+ traverse(ast, {
139
+ VariableDeclarator(path) {
140
+ if (t.isIdentifier(path.node.id)) {
141
+ result.declaredVariables.add(path.node.id.name);
142
+ }
143
+ else if (t.isObjectPattern(path.node.id)) {
144
+ for (const prop of path.node.id.properties) {
145
+ if (t.isObjectProperty(prop) && t.isIdentifier(prop.value)) {
146
+ result.declaredVariables.add(prop.value.name);
147
+ }
148
+ else if (t.isRestElement(prop) && t.isIdentifier(prop.argument)) {
149
+ result.declaredVariables.add(prop.argument.name);
150
+ }
151
+ }
152
+ }
153
+ else if (t.isArrayPattern(path.node.id)) {
154
+ for (const element of path.node.id.elements) {
155
+ if (element && t.isIdentifier(element)) {
156
+ result.declaredVariables.add(element.name);
157
+ }
158
+ }
159
+ }
160
+ },
161
+ Identifier(path) {
162
+ if (path.isBindingIdentifier()) {
163
+ return;
164
+ }
165
+ const parent = path.parent;
166
+ const node = path.node;
167
+ if (t.isObjectProperty(parent) &&
168
+ parent.key === node &&
169
+ !parent.computed) {
170
+ return;
171
+ }
172
+ if (t.isMemberExpression(parent) &&
173
+ parent.property === node &&
174
+ !parent.computed) {
175
+ return;
176
+ }
177
+ result.referencedVariables.add(node.name);
178
+ },
179
+ });
180
+ }
181
+ function extractPropsVariables(code, result) {
182
+ const destructureMatch = code.match(/const\s+{([^}]+)}\s*=\s*\$props/);
183
+ if (!destructureMatch) {
184
+ return;
185
+ }
186
+ const variablesStr = destructureMatch[1];
187
+ if (!variablesStr) {
188
+ return;
189
+ }
190
+ const variables = variablesStr
191
+ .split(',')
192
+ .map((v) => {
193
+ const v_trimmed = v.trim();
194
+ const withoutDefault = v_trimmed.split('=')[0]?.trim();
195
+ if (!withoutDefault)
196
+ return undefined;
197
+ const parts = withoutDefault.split(':');
198
+ return parts.length > 1 ? parts[1]?.trim() : parts[0]?.trim();
199
+ })
200
+ .filter((v) => v !== undefined && v.length > 0);
201
+ for (const varName of variables) {
202
+ result.propsVariables.add(varName);
203
+ result.declaredVariables.add(varName);
204
+ }
205
+ }
206
+ function extractAttrsVariables(code, result) {
207
+ const destructureMatch = code.match(/const\s+{([^}]+)}\s*=\s*\$attrs/);
208
+ if (!destructureMatch) {
209
+ return;
210
+ }
211
+ const variablesStr = destructureMatch[1];
212
+ if (!variablesStr) {
213
+ return;
214
+ }
215
+ const variables = variablesStr
216
+ .split(',')
217
+ .map((v) => {
218
+ const v_trimmed = v.trim();
219
+ const withoutDefault = v_trimmed.split('=')[0]?.trim();
220
+ if (!withoutDefault)
221
+ return undefined;
222
+ const parts = withoutDefault.split(':');
223
+ return parts.length > 1 ? parts[1]?.trim() : parts[0]?.trim();
224
+ })
225
+ .filter((v) => v !== undefined && v.length > 0);
226
+ for (const varName of variables) {
227
+ result.attrsVariables.add(varName);
228
+ result.declaredVariables.add(varName);
229
+ }
230
+ }
231
+ function extractIdentifiersSimple(code, result) {
232
+ const identifierRegex = /\b([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g;
233
+ let match = identifierRegex.exec(code);
234
+ while (match !== null) {
235
+ const identifier = match[1];
236
+ if (identifier) {
237
+ result.referencedVariables.add(identifier);
238
+ }
239
+ match = identifierRegex.exec(code);
240
+ }
241
+ const declarationRegex = /(?:const|let|var)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g;
242
+ match = declarationRegex.exec(code);
243
+ while (match !== null) {
244
+ const identifier = match[1];
245
+ if (identifier) {
246
+ result.declaredVariables.add(identifier);
247
+ }
248
+ match = declarationRegex.exec(code);
249
+ }
250
+ }
251
+ function analyzeExpression(expr, result) {
252
+ try {
253
+ analyzeJavaScriptCode(expr, result);
254
+ }
255
+ catch {
256
+ extractIdentifiersSimple(expr, result);
257
+ }
258
+ }
259
+ export function isAllowedIdentifier(name, scopeAnalysis, config) {
260
+ return (ALLOWED_GLOBALS.has(name) ||
261
+ scopeAnalysis.declaredVariables.has(name) ||
262
+ scopeAnalysis.propsVariables.has(name) ||
263
+ scopeAnalysis.attrsVariables.has(name) ||
264
+ scopeAnalysis.slotVariables.has(name) ||
265
+ (config.allowedGlobals || []).includes(name));
266
+ }
267
+ //# sourceMappingURL=scopeAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopeAnalyzer.js","sourceRoot":"","sources":["../../src/utils/scopeAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ComponentUsage } from '../types/index.js';
2
+ import type { Block, Code } from '@/types/pug';
3
+ export declare function detectAttributeUsage(componentBody: Block): ComponentUsage;
4
+ export declare function isVariableReference(value: string): boolean;
5
+ export declare function createPropsCode(props: Map<string, string>, paramPrefix?: string): Code[];
6
+ export declare function createAttrsCode(attrs: Map<string, string>, paramPrefix?: string): Code[];
7
+ export declare function extractReferencedVariables(props: Map<string, string>, attrs: Map<string, string>): Set<string>;
8
+ //# sourceMappingURL=usageDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageDetector.d.ts","sourceRoot":"","sources":["../../src/utils/usageDetector.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAe,MAAM,aAAa,CAAA;AAyB3D,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,KAAK,GAAG,cAAc,CA6BzE;AA4ED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAuB1D;AAUD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,EAAE,CAuBR;AAUD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,EAAE,CAuBR;AASD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACzB,GAAG,CAAC,MAAM,CAAC,CAgBb"}
@@ -0,0 +1,148 @@
1
+ import { detectDestructuringSource, extractDestructuredVars, } from './babelHelpers.js';
2
+ export function detectAttributeUsage(componentBody) {
3
+ const fromProps = [];
4
+ const fromAttrs = [];
5
+ walkNodes(componentBody, (node) => {
6
+ if (node.type === 'Code') {
7
+ const code = node.val;
8
+ const source = detectDestructuringSource(code);
9
+ if (source === 'props') {
10
+ const vars = extractDestructuredVars(code);
11
+ fromProps.push(...vars);
12
+ }
13
+ else if (source === 'attrs') {
14
+ const vars = extractDestructuredVars(code);
15
+ fromAttrs.push(...vars);
16
+ }
17
+ }
18
+ });
19
+ return {
20
+ fromProps: Array.from(new Set(fromProps)),
21
+ fromAttrs: Array.from(new Set(fromAttrs)),
22
+ };
23
+ }
24
+ function walkNodes(block, callback) {
25
+ if (!block.nodes)
26
+ return;
27
+ for (const node of block.nodes) {
28
+ callback(node);
29
+ if ('block' in node && node.block) {
30
+ walkNodes(node.block, callback);
31
+ }
32
+ if (node.type === 'Conditional') {
33
+ if (node.consequent) {
34
+ walkNodes(node.consequent, callback);
35
+ }
36
+ if (node.alternate) {
37
+ if (node.alternate.type === 'Block') {
38
+ walkNodes(node.alternate, callback);
39
+ }
40
+ else if (node.alternate.type === 'Conditional') {
41
+ const conditionalNode = node.alternate;
42
+ if (conditionalNode.consequent) {
43
+ walkNodes(conditionalNode.consequent, callback);
44
+ }
45
+ if (conditionalNode.alternate) {
46
+ walkConditional(conditionalNode);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ function walkConditional(conditional) {
52
+ if (conditional.consequent) {
53
+ walkNodes(conditional.consequent, callback);
54
+ }
55
+ if (conditional.alternate) {
56
+ if (conditional.alternate.type === 'Block') {
57
+ walkNodes(conditional.alternate, callback);
58
+ }
59
+ else if (conditional.alternate.type === 'Conditional') {
60
+ walkConditional(conditional.alternate);
61
+ }
62
+ }
63
+ }
64
+ if (node.type === 'Each' && node.block) {
65
+ walkNodes(node.block, callback);
66
+ }
67
+ if (node.type === 'Case') {
68
+ if (node.block) {
69
+ walkNodes(node.block, callback);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ export function isVariableReference(value) {
75
+ const trimmed = value.trim();
76
+ if (trimmed === 'true' || trimmed === 'false')
77
+ return false;
78
+ if (trimmed === 'null' || trimmed === 'undefined')
79
+ return false;
80
+ if (trimmed === '$props' || trimmed === '$attrs')
81
+ return false;
82
+ if (/^-?\d+(\.\d+)?$/.test(trimmed))
83
+ return false;
84
+ if (/^["'].*["']$/.test(trimmed))
85
+ return false;
86
+ if (/^`.*`$/.test(trimmed))
87
+ return false;
88
+ return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(trimmed);
89
+ }
90
+ export function createPropsCode(props, paramPrefix) {
91
+ const pairs = Array.from(props.entries())
92
+ .map(([key, value]) => {
93
+ if (paramPrefix && isVariableReference(value)) {
94
+ return `"${key}": ${paramPrefix}${value.trim()}`;
95
+ }
96
+ return `"${key}": ${value}`;
97
+ })
98
+ .join(', ');
99
+ return [
100
+ {
101
+ type: 'Code',
102
+ val: `const $props = {${pairs}}`,
103
+ buffer: false,
104
+ mustEscape: false,
105
+ isInline: false,
106
+ line: 0,
107
+ column: 0,
108
+ filename: '',
109
+ },
110
+ ];
111
+ }
112
+ export function createAttrsCode(attrs, paramPrefix) {
113
+ const pairs = Array.from(attrs.entries())
114
+ .map(([key, value]) => {
115
+ if (paramPrefix && isVariableReference(value)) {
116
+ return `"${key}": ${paramPrefix}${value.trim()}`;
117
+ }
118
+ return `"${key}": ${value}`;
119
+ })
120
+ .join(', ');
121
+ return [
122
+ {
123
+ type: 'Code',
124
+ val: `const $attrs = {${pairs}}`,
125
+ buffer: false,
126
+ mustEscape: false,
127
+ isInline: false,
128
+ line: 0,
129
+ column: 0,
130
+ filename: '',
131
+ },
132
+ ];
133
+ }
134
+ export function extractReferencedVariables(props, attrs) {
135
+ const vars = new Set();
136
+ for (const value of props.values()) {
137
+ if (isVariableReference(value)) {
138
+ vars.add(value.trim());
139
+ }
140
+ }
141
+ for (const value of attrs.values()) {
142
+ if (isVariableReference(value)) {
143
+ vars.add(value.trim());
144
+ }
145
+ }
146
+ return vars;
147
+ }
148
+ //# sourceMappingURL=usageDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageDetector.js","sourceRoot":"","sources":["../../src/utils/usageDetector.ts"],"names":[],"mappings":"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"}