pug-tail 0.2.0-alpha.0 → 0.2.0-alpha.2

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 (53) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +40 -1
  3. package/dist/core/compiler/index.d.ts +3 -0
  4. package/dist/core/compiler/index.d.ts.map +1 -0
  5. package/dist/core/compiler/index.js +3 -0
  6. package/dist/core/compiler/index.js.map +1 -0
  7. package/dist/core/compiler/transformer.d.ts +20 -0
  8. package/dist/core/compiler/transformer.d.ts.map +1 -0
  9. package/dist/core/compiler/transformer.js +37 -0
  10. package/dist/core/compiler/transformer.js.map +1 -0
  11. package/dist/core/compiler/traverser.d.ts +18 -0
  12. package/dist/core/compiler/traverser.d.ts.map +1 -0
  13. package/dist/core/compiler/traverser.js +175 -0
  14. package/dist/core/compiler/traverser.js.map +1 -0
  15. package/dist/core/visitors/componentDetector.d.ts +27 -0
  16. package/dist/core/visitors/componentDetector.d.ts.map +1 -0
  17. package/dist/core/visitors/componentDetector.js +118 -0
  18. package/dist/core/visitors/componentDetector.js.map +1 -0
  19. package/dist/core/visitors/componentExpander.d.ts +24 -0
  20. package/dist/core/visitors/componentExpander.d.ts.map +1 -0
  21. package/dist/core/visitors/componentExpander.js +293 -0
  22. package/dist/core/visitors/componentExpander.js.map +1 -0
  23. package/dist/core/visitors/definitionRemover.d.ts +9 -0
  24. package/dist/core/visitors/definitionRemover.d.ts.map +1 -0
  25. package/dist/core/visitors/definitionRemover.js +14 -0
  26. package/dist/core/visitors/definitionRemover.js.map +1 -0
  27. package/dist/core/visitors/includeFlattener.d.ts +12 -0
  28. package/dist/core/visitors/includeFlattener.d.ts.map +1 -0
  29. package/dist/core/visitors/includeFlattener.js +23 -0
  30. package/dist/core/visitors/includeFlattener.js.map +1 -0
  31. package/dist/core/visitors/index.d.ts +6 -0
  32. package/dist/core/visitors/index.d.ts.map +1 -0
  33. package/dist/core/visitors/index.js +6 -0
  34. package/dist/core/visitors/index.js.map +1 -0
  35. package/dist/core/visitors/visitor.d.ts +32 -0
  36. package/dist/core/visitors/visitor.d.ts.map +1 -0
  37. package/dist/core/visitors/visitor.js +3 -0
  38. package/dist/core/visitors/visitor.js.map +1 -0
  39. package/dist/index.d.ts +0 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +0 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/transform.js +4 -4
  44. package/dist/transform.js.map +1 -1
  45. package/dist/utils/astHelpers.d.ts +4 -0
  46. package/dist/utils/astHelpers.d.ts.map +1 -1
  47. package/dist/utils/astHelpers.js +9 -0
  48. package/dist/utils/astHelpers.js.map +1 -1
  49. package/package.json +2 -2
  50. package/dist/core/astTransformer.d.ts +0 -33
  51. package/dist/core/astTransformer.d.ts.map +0 -1
  52. package/dist/core/astTransformer.js +0 -598
  53. package/dist/core/astTransformer.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,34 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.0-alpha.0] - 2026-01-18
9
+
10
+ ### Added
11
+
12
+ - **Property Shorthand Syntax**: Vue/Svelte-style shorthand for component props
13
+ - `Card(title, count)` automatically expands to `Card(title=title, count=count)`
14
+ - Supports mixing shorthand and explicit syntax in the same call
15
+ - Works with boolean attributes correctly
16
+
17
+ ### Changed
18
+
19
+ - **BREAKING**: Renamed `render` configuration option to `entry`
20
+ - `files.render` → `files.entry` in config files
21
+ - `--render-files` → `-e, --entry-files` CLI option
22
+ - Rationale: "entry" is more intuitive and industry-standard (Webpack, Vite, Rollup)
23
+ - Migration: Update `render:` to `entry:` in `pugtail.config.js`
24
+
25
+ ### Fixed
26
+
27
+ - Boolean attributes now correctly use `mustEscape: false` for proper rendering
28
+ - Import path resolution issue in `transform.ts` (changed from `@/cli` to relative path)
29
+
30
+ ### Documentation
31
+
32
+ - Applied shorthand syntax to example pages
33
+ - Simplified and clarified examples/README.md
34
+ - Updated all documentation to use `entry` terminology
35
+
8
36
  ## [0.1.0-alpha.0] - 2026-01-10
9
37
 
10
38
  ### Added
@@ -34,4 +62,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
34
62
  - **Watch Mode**: CLI supports file watching for development
35
63
  - **Error Handling**: Detailed error messages with file locations
36
64
 
65
+ ---
66
+
67
+ **Note**: Versions 0.1.0-alpha.1 through 0.1.0-alpha.7 contained iterative improvements and bug fixes during initial alpha testing. Detailed changelogs are maintained from v0.2.0-alpha.0 onwards.
68
+
69
+ [0.2.0-alpha.0]: https://github.com/megurock/pug-tail/releases/tag/v0.2.0-alpha.0
37
70
  [0.1.0-alpha.0]: https://github.com/megurock/pug-tail/releases/tag/v0.1.0-alpha.0
package/README.md CHANGED
@@ -110,10 +110,23 @@ npx pug-tail src/index.pug -o dist/index.html --obj data.json
110
110
 
111
111
  # Use a configuration file
112
112
  npx pug-tail -c pugtail.config.js
113
+
114
+ # Specify entry patterns (which files to compile)
115
+ # Comma-separated
116
+ npx pug-tail src -o dist -e "**/*.pug,!**/components/**"
117
+
118
+ # Or space-separated
119
+ npx pug-tail src -o dist -e "**/*.pug" "!**/components/**"
113
120
  ```
114
121
 
115
122
  **Key CLI Options**:
116
123
  - `-o, --out <dir>` - Output directory or file
124
+ - `-e, --entry-files <patterns>` - Entry file patterns (comma or space separated)
125
+ - Determines which .pug files are compiled to HTML
126
+ - Supports negation patterns with `!`
127
+ - Example: `-e "**/*.pug" "!**/components/**"`
128
+ - Default (if not specified): `['**/*.pug', '!**/_*.pug', '!**/*.component.pug', '!**/components/**/*.pug']`
129
+ - **Note**: By default, files starting with `_`, `*.component.pug`, and files in `components/` directories are excluded from compilation
117
130
  - `-w, --watch` - Watch mode (monitors file changes)
118
131
  - `-c, --config <path>` - Path to the configuration file
119
132
  - `--obj <path>` - Path to a data file (JSON)
@@ -143,6 +156,32 @@ header
143
156
 
144
157
  See the [Configuration Guide](./docs/CONFIGURATION.md) for more details.
145
158
 
159
+ ### Configuration File
160
+
161
+ For complex projects, use a configuration file (`pugtail.config.js`):
162
+
163
+ ```javascript
164
+ export default {
165
+ files: {
166
+ input: 'src/pages/**/*.pug',
167
+ output: 'dist',
168
+ root: 'src/pages',
169
+ entry: [
170
+ '**/*.pug', // All .pug files
171
+ '!**/_*.pug', // Exclude files starting with _
172
+ '!**/*.component.pug', // Exclude component files
173
+ '!**/components/**/*.pug', // Exclude components directory
174
+ ],
175
+ },
176
+ basedir: 'src',
177
+ pretty: true,
178
+ data: './data/global.json',
179
+ dataKey: 'global',
180
+ }
181
+ ```
182
+
183
+ The `entry` patterns determine which files are compiled to HTML. Files not matching these patterns (like components) are still processed for includes but won't generate output files.
184
+
146
185
  ### Programmatic API
147
186
 
148
187
  ```typescript
@@ -319,4 +358,4 @@ MIT License - see the [LICENSE](./LICENSE) file for details.
319
358
 
320
359
  ---
321
360
 
322
- **Status**: Alpha Release (v0.1.0-alpha.0) - 286 tests passing ✅
361
+ **Status**: Alpha Release
@@ -0,0 +1,3 @@
1
+ export * from './transformer.js';
2
+ export * from './traverser.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/compiler/index.ts"],"names":[],"mappings":"AAMA,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './transformer.js';
2
+ export * from './traverser.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/compiler/index.ts"],"names":[],"mappings":"AAMA,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,20 @@
1
+ import type { Node } from '@/types/pug';
2
+ import type { ComponentRegistry } from '../componentRegistry.js';
3
+ import type { ErrorHandler, ErrorHandlerOptions } from '../errorHandler.js';
4
+ export interface TransformerOptions extends ErrorHandlerOptions {
5
+ validation?: {
6
+ scopeIsolation?: 'error' | 'warn' | 'off';
7
+ allowedGlobals?: string[];
8
+ };
9
+ debug?: boolean;
10
+ }
11
+ export declare class Transformer {
12
+ private registry;
13
+ private errorHandler;
14
+ private traverser;
15
+ private config;
16
+ constructor(registry: ComponentRegistry, errorHandler: ErrorHandler, options?: TransformerOptions);
17
+ transform(ast: Node): Node;
18
+ private createPipeline;
19
+ }
20
+ //# sourceMappingURL=transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../src/core/compiler/transformer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAiBxE,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAE7D,UAAU,CAAC,EAAE;QAEX,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;QAEzC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAC1B,CAAA;IAED,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAoBD,qBAAa,WAAW;IAKpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IALtB,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,MAAM,CAAoB;gBAGxB,QAAQ,EAAE,iBAAiB,EAC3B,YAAY,EAAE,YAAY,EAClC,OAAO,GAAE,kBAAuB;IAiBlC,SAAS,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI;IAkB1B,OAAO,CAAC,cAAc;CAkCvB"}
@@ -0,0 +1,37 @@
1
+ import { ComponentDetectorVisitor, } from '../visitors/componentDetector.js';
2
+ import { ComponentExpanderVisitor, } from '../visitors/componentExpander.js';
3
+ import { DefinitionRemoverVisitor } from '../visitors/definitionRemover.js';
4
+ import { IncludeFlattenerVisitor } from '../visitors/includeFlattener.js';
5
+ import { Traverser } from './traverser.js';
6
+ export class Transformer {
7
+ constructor(registry, errorHandler, options = {}) {
8
+ this.registry = registry;
9
+ this.errorHandler = errorHandler;
10
+ this.traverser = new Traverser();
11
+ this.config = options;
12
+ }
13
+ transform(ast) {
14
+ const pipeline = this.createPipeline();
15
+ let transformedAst = ast;
16
+ for (const visitor of pipeline) {
17
+ transformedAst = this.traverser.traverse(transformedAst, visitor);
18
+ }
19
+ return transformedAst;
20
+ }
21
+ createPipeline() {
22
+ const detectorOptions = {
23
+ validation: this.config.validation,
24
+ debug: this.config.debug,
25
+ };
26
+ const expanderOptions = {
27
+ debug: this.config.debug,
28
+ };
29
+ return [
30
+ new ComponentDetectorVisitor(this.registry, this.errorHandler, detectorOptions),
31
+ new ComponentExpanderVisitor(this.registry, this.errorHandler, expanderOptions),
32
+ new DefinitionRemoverVisitor(),
33
+ new IncludeFlattenerVisitor(),
34
+ ];
35
+ }
36
+ }
37
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../../src/core/compiler/transformer.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,wBAAwB,GACzB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAEL,wBAAwB,GACzB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAmCvC,MAAM,OAAO,WAAW;IAItB,YACU,QAA2B,EAC3B,YAA0B,EAClC,UAA8B,EAAE;QAFxB,aAAQ,GAAR,QAAQ,CAAmB;QAC3B,iBAAY,GAAZ,YAAY,CAAc;QAGlC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,EAAE,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAA;IACvB,CAAC;IAaD,SAAS,CAAC,GAAS;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAGtC,IAAI,cAAc,GAAG,GAAG,CAAA;QACxB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QACnE,CAAC;QAED,OAAO,cAAc,CAAA;IACvB,CAAC;IAOO,cAAc;QAEpB,MAAM,eAAe,GAA6B;YAChD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;SACzB,CAAA;QAED,MAAM,eAAe,GAA6B;YAChD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;SACzB,CAAA;QAGD,OAAO;YAEL,IAAI,wBAAwB,CAC1B,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,YAAY,EACjB,eAAe,CACM;YAGvB,IAAI,wBAAwB,CAC1B,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,YAAY,EACjB,eAAe,CACM;YAGvB,IAAI,wBAAwB,EAAE;YAG9B,IAAI,uBAAuB,EAAE;SAC9B,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { Node } from '@/types/pug';
2
+ import type { Visitor } from '../visitors/visitor.js';
3
+ export declare class Traverser {
4
+ traverse(ast: Node, visitor: Visitor): Node;
5
+ private traverseNode;
6
+ private traverseChildren;
7
+ private traverseBlock;
8
+ private traverseTag;
9
+ private traverseInterpolatedTag;
10
+ private traverseConditional;
11
+ private traverseEach;
12
+ private traverseCase;
13
+ private traverseWhen;
14
+ private traverseWhile;
15
+ private traverseInclude;
16
+ private traverseExtends;
17
+ }
18
+ //# sourceMappingURL=traverser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverser.d.ts","sourceRoot":"","sources":["../../../src/core/compiler/traverser.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAQV,IAAI,EAIL,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,qBAAqB,CAAA;AAqBlE,qBAAa,SAAS;IAUpB,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAmB3C,OAAO,CAAC,YAAY;IAyDpB,OAAO,CAAC,gBAAgB;IAmDxB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,uBAAuB;IAoB/B,OAAO,CAAC,mBAAmB;IA4C3B,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,eAAe;CAkBxB"}
@@ -0,0 +1,175 @@
1
+ export class Traverser {
2
+ traverse(ast, visitor) {
3
+ const result = this.traverseNode(ast, null, visitor);
4
+ if (result === null) {
5
+ throw new Error('Root node cannot be null');
6
+ }
7
+ return result;
8
+ }
9
+ traverseNode(node, parent, visitor) {
10
+ const methods = visitor[node.type];
11
+ const isVisitorMethods = (value) => {
12
+ return (value !== null &&
13
+ value !== undefined &&
14
+ typeof value === 'object' &&
15
+ ('enter' in value || 'exit' in value));
16
+ };
17
+ if (isVisitorMethods(methods) && methods.enter) {
18
+ const result = methods.enter(node, parent);
19
+ if (result !== undefined) {
20
+ node = result;
21
+ }
22
+ }
23
+ if (node === null) {
24
+ return null;
25
+ }
26
+ node = this.traverseChildren(node, visitor);
27
+ if (isVisitorMethods(methods) && methods.exit) {
28
+ const result = methods.exit(node, parent);
29
+ if (result !== undefined) {
30
+ node = result;
31
+ }
32
+ }
33
+ return node;
34
+ }
35
+ traverseChildren(node, visitor) {
36
+ switch (node.type) {
37
+ case 'Block':
38
+ return this.traverseBlock(node, visitor);
39
+ case 'Tag':
40
+ return this.traverseTag(node, visitor);
41
+ case 'InterpolatedTag':
42
+ return this.traverseInterpolatedTag(node, visitor);
43
+ case 'Conditional':
44
+ return this.traverseConditional(node, visitor);
45
+ case 'Each':
46
+ return this.traverseEach(node, visitor);
47
+ case 'Case':
48
+ return this.traverseCase(node, visitor);
49
+ case 'When':
50
+ return this.traverseWhen(node, visitor);
51
+ case 'While':
52
+ return this.traverseWhile(node, visitor);
53
+ case 'Include':
54
+ return this.traverseInclude(node, visitor);
55
+ case 'Extends':
56
+ return this.traverseExtends(node, visitor);
57
+ case 'Text':
58
+ case 'Comment':
59
+ case 'Code':
60
+ case 'Mixin':
61
+ case 'RawInclude':
62
+ return node;
63
+ default:
64
+ return node;
65
+ }
66
+ }
67
+ traverseBlock(block, visitor) {
68
+ const transformedNodes = [];
69
+ for (const childNode of block.nodes) {
70
+ if (!childNode)
71
+ continue;
72
+ const transformed = this.traverseNode(childNode, block, visitor);
73
+ if (transformed !== null) {
74
+ transformedNodes.push(transformed);
75
+ }
76
+ }
77
+ return {
78
+ ...block,
79
+ nodes: transformedNodes,
80
+ };
81
+ }
82
+ traverseTag(tag, visitor) {
83
+ const result = { ...tag };
84
+ if (tag.block) {
85
+ const transformedBlock = this.traverseNode(tag.block, tag, visitor);
86
+ result.block = transformedBlock;
87
+ }
88
+ return result;
89
+ }
90
+ traverseInterpolatedTag(tag, visitor) {
91
+ const result = { ...tag };
92
+ if (tag.block) {
93
+ const transformedBlock = this.traverseNode(tag.block, tag, visitor);
94
+ result.block = transformedBlock;
95
+ }
96
+ return result;
97
+ }
98
+ traverseConditional(conditional, visitor) {
99
+ const result = { ...conditional };
100
+ if (conditional.consequent) {
101
+ const transformedConsequent = this.traverseNode(conditional.consequent, conditional, visitor);
102
+ result.consequent = transformedConsequent;
103
+ }
104
+ if (conditional.alternate) {
105
+ if (conditional.alternate.type === 'Block') {
106
+ const transformedAlternate = this.traverseNode(conditional.alternate, conditional, visitor);
107
+ result.alternate = transformedAlternate;
108
+ }
109
+ else if (conditional.alternate.type === 'Conditional') {
110
+ const transformedAlternate = this.traverseNode(conditional.alternate, conditional, visitor);
111
+ result.alternate = transformedAlternate;
112
+ }
113
+ }
114
+ return result;
115
+ }
116
+ traverseEach(each, visitor) {
117
+ const result = { ...each };
118
+ if (each.block) {
119
+ const transformedBlock = this.traverseNode(each.block, each, visitor);
120
+ result.block = transformedBlock;
121
+ }
122
+ if (each.alternate) {
123
+ const transformedAlternate = this.traverseNode(each.alternate, each, visitor);
124
+ result.alternate = transformedAlternate;
125
+ }
126
+ return result;
127
+ }
128
+ traverseCase(caseNode, visitor) {
129
+ const result = { ...caseNode };
130
+ if (caseNode.block) {
131
+ const transformedBlock = this.traverseNode(caseNode.block, caseNode, visitor);
132
+ result.block = transformedBlock;
133
+ }
134
+ return result;
135
+ }
136
+ traverseWhen(whenNode, visitor) {
137
+ const result = { ...whenNode };
138
+ if (whenNode.block) {
139
+ const transformedBlock = this.traverseNode(whenNode.block, whenNode, visitor);
140
+ result.block = transformedBlock;
141
+ }
142
+ return result;
143
+ }
144
+ traverseWhile(whileNode, visitor) {
145
+ const result = { ...whileNode };
146
+ if (whileNode.block) {
147
+ const transformedBlock = this.traverseNode(whileNode.block, whileNode, visitor);
148
+ result.block = transformedBlock;
149
+ }
150
+ return result;
151
+ }
152
+ traverseInclude(include, visitor) {
153
+ const result = { ...include };
154
+ if (include.file?.ast) {
155
+ const transformedAst = this.traverseNode(include.file.ast, include, visitor);
156
+ result.file = {
157
+ ...include.file,
158
+ ast: transformedAst,
159
+ };
160
+ }
161
+ return result;
162
+ }
163
+ traverseExtends(extendsNode, visitor) {
164
+ const result = { ...extendsNode };
165
+ if (extendsNode.file?.ast) {
166
+ const transformedAst = this.traverseNode(extendsNode.file.ast, extendsNode, visitor);
167
+ result.file = {
168
+ ...extendsNode.file,
169
+ ast: transformedAst,
170
+ };
171
+ }
172
+ return result;
173
+ }
174
+ }
175
+ //# sourceMappingURL=traverser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverser.js","sourceRoot":"","sources":["../../../src/core/compiler/traverser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Node } from '@/types/pug';
2
+ import type { ComponentRegistry } from '../componentRegistry.js';
3
+ import type { ErrorHandler } from '../errorHandler.js';
4
+ export interface ComponentDetectorOptions {
5
+ validation?: {
6
+ scopeIsolation?: 'error' | 'warn' | 'off';
7
+ allowedGlobals?: string[];
8
+ };
9
+ debug?: boolean;
10
+ }
11
+ export declare class ComponentDetectorVisitor {
12
+ private registry;
13
+ private errorHandler;
14
+ private options;
15
+ constructor(registry: ComponentRegistry, errorHandler: ErrorHandler, options?: ComponentDetectorOptions);
16
+ Tag: {
17
+ enter: (node: Node, _parent: Node | null) => Node | undefined;
18
+ };
19
+ Include: {
20
+ enter: (_node: Node, _parent: Node | null) => Node | undefined;
21
+ };
22
+ Extends: {
23
+ enter: (_node: Node, _parent: Node | null) => Node | undefined;
24
+ };
25
+ private fixMustEscapeForPropsAttrs;
26
+ }
27
+ //# sourceMappingURL=componentDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"componentDetector.d.ts","sourceRoot":"","sources":["../../../src/core/visitors/componentDetector.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAS,IAAI,EAAO,MAAM,aAAa,CAAA;AAOnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAKnD,MAAM,WAAW,wBAAwB;IAEvC,UAAU,CAAC,EAAE;QAEX,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;QAEzC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAC1B,CAAA;IAED,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAuBD,qBAAa,wBAAwB;IAEjC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,OAAO;gBAFP,QAAQ,EAAE,iBAAiB,EAC3B,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,wBAA6B;IAMhD,GAAG;sBACa,IAAI,WAAW,IAAI,GAAG,IAAI,KAAG,IAAI,GAAG,SAAS;MA+D5D;IASD,OAAO;uBACU,IAAI,WAAW,IAAI,GAAG,IAAI,KAAG,IAAI,GAAG,SAAS;MAK7D;IASD,OAAO;uBACU,IAAI,WAAW,IAAI,GAAG,IAAI,KAAG,IAAI,GAAG,SAAS;MAK7D;IAYD,OAAO,CAAC,0BAA0B;CA+DnC"}
@@ -0,0 +1,118 @@
1
+ import { extractComponentDefinition, isComponentDefinitionNode, } from '../../utils/componentDetector.js';
2
+ import { analyzeComponentScope } from '../../utils/scopeAnalyzer.js';
3
+ import { detectAttributeUsage } from '../../utils/usageDetector.js';
4
+ export class ComponentDetectorVisitor {
5
+ constructor(registry, errorHandler, options = {}) {
6
+ this.registry = registry;
7
+ this.errorHandler = errorHandler;
8
+ this.options = options;
9
+ this.Tag = {
10
+ enter: (node, _parent) => {
11
+ if (!isComponentDefinitionNode(node)) {
12
+ return undefined;
13
+ }
14
+ const definition = extractComponentDefinition(node, this.errorHandler);
15
+ const usage = detectAttributeUsage(definition.body);
16
+ if (usage.fromProps.length > 0 || usage.fromAttrs.length > 0) {
17
+ definition.usage = usage;
18
+ this.fixMustEscapeForPropsAttrs(definition.body, usage);
19
+ }
20
+ const scopeAnalysis = analyzeComponentScope(definition.body, this.options.validation);
21
+ definition.scopeAnalysis = scopeAnalysis;
22
+ const mode = this.options.validation?.scopeIsolation ?? 'error';
23
+ if (mode !== 'off' && scopeAnalysis.externalReferences.size > 0) {
24
+ for (const varName of scopeAnalysis.externalReferences) {
25
+ const error = this.errorHandler.externalVariableReference(varName, definition.name, definition.location);
26
+ if (mode === 'error') {
27
+ throw error;
28
+ }
29
+ console.warn(error.message);
30
+ }
31
+ }
32
+ this.registry.register(definition);
33
+ if (this.options.debug) {
34
+ console.log(`[DEBUG] Registered component: ${definition.name}`);
35
+ console.log(` - Slots: ${Array.from(definition.slots.keys()).join(', ') || 'none'}`);
36
+ console.log(` - Location: ${definition.location.filename}:${definition.location.line}`);
37
+ }
38
+ return undefined;
39
+ },
40
+ };
41
+ this.Include = {
42
+ enter: (_node, _parent) => {
43
+ return undefined;
44
+ },
45
+ };
46
+ this.Extends = {
47
+ enter: (_node, _parent) => {
48
+ return undefined;
49
+ },
50
+ };
51
+ }
52
+ fixMustEscapeForPropsAttrs(componentBody, usage) {
53
+ const propsVars = new Set(usage.fromProps);
54
+ const attrsVars = new Set(usage.fromAttrs);
55
+ const allVars = new Set([...propsVars, ...attrsVars]);
56
+ const fixNode = (node) => {
57
+ if (node.type === 'Tag') {
58
+ const tag = node;
59
+ if (tag.attrs) {
60
+ for (const attr of tag.attrs) {
61
+ if (typeof attr.val === 'string' && allVars.has(attr.val.trim())) {
62
+ attr.mustEscape = false;
63
+ }
64
+ }
65
+ }
66
+ if (tag.block) {
67
+ fixBlock(tag.block);
68
+ }
69
+ }
70
+ else if (node.type === 'Block') {
71
+ fixBlock(node);
72
+ }
73
+ else if (node.type === 'Conditional') {
74
+ const conditional = node;
75
+ if (conditional.consequent)
76
+ fixBlock(conditional.consequent);
77
+ if (conditional.alternate) {
78
+ if (conditional.alternate.type === 'Block') {
79
+ fixBlock(conditional.alternate);
80
+ }
81
+ else if (conditional.alternate.type === 'Conditional') {
82
+ fixNode(conditional.alternate);
83
+ }
84
+ }
85
+ }
86
+ else if (node.type === 'Each') {
87
+ const each = node;
88
+ if (each.block)
89
+ fixBlock(each.block);
90
+ if (each.alternate)
91
+ fixBlock(each.alternate);
92
+ }
93
+ else if (node.type === 'Case') {
94
+ const caseNode = node;
95
+ if (caseNode.block)
96
+ fixBlock(caseNode.block);
97
+ }
98
+ else if (node.type === 'When') {
99
+ const whenNode = node;
100
+ if (whenNode.block)
101
+ fixBlock(whenNode.block);
102
+ }
103
+ else if (node.type === 'While') {
104
+ const whileNode = node;
105
+ if (whileNode.block)
106
+ fixBlock(whileNode.block);
107
+ }
108
+ };
109
+ const fixBlock = (block) => {
110
+ for (const node of block.nodes) {
111
+ if (node)
112
+ fixNode(node);
113
+ }
114
+ };
115
+ fixBlock(componentBody);
116
+ }
117
+ }
118
+ //# sourceMappingURL=componentDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"componentDetector.js","sourceRoot":"","sources":["../../../src/core/visitors/componentDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Node } from '@/types/pug';
2
+ import type { ComponentRegistry } from '../componentRegistry.js';
3
+ import type { ErrorHandler } from '../errorHandler.js';
4
+ import type { Visitor } from './visitor.js';
5
+ export interface ComponentExpanderOptions {
6
+ debug?: boolean;
7
+ }
8
+ export declare class ComponentExpanderVisitor implements Visitor {
9
+ private registry;
10
+ private errorHandler;
11
+ [nodeType: string]: unknown;
12
+ private callStack;
13
+ private slotResolver;
14
+ constructor(registry: ComponentRegistry, errorHandler: ErrorHandler, options?: ComponentExpanderOptions);
15
+ Block: {
16
+ enter: (node: Node, _parent: Node | null) => Node;
17
+ };
18
+ private isComponentCall;
19
+ private expandComponentCall;
20
+ private injectAttributes;
21
+ private replaceSlots;
22
+ private getDefaultSlotBlock;
23
+ }
24
+ //# sourceMappingURL=componentExpander.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"componentExpander.d.ts","sourceRoot":"","sources":["../../../src/core/visitors/componentExpander.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAOV,IAAI,EAIL,MAAM,aAAa,CAAA;AAqBpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,MAAM,WAAW,wBAAwB;IAEvC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAsBD,qBAAa,wBAAyB,YAAW,OAAO;IAOpD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IANtB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,YAAY,CAAc;gBAGxB,QAAQ,EAAE,iBAAiB,EAC3B,YAAY,EAAE,YAAY,EAClC,OAAO,GAAE,wBAA6B;IAaxC,KAAK;sBACW,IAAI,WAAW,IAAI,GAAG,IAAI,KAAG,IAAI;MA2BhD;IAOD,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAqE3B,OAAO,CAAC,gBAAgB;IAgJxB,OAAO,CAAC,YAAY;IA0IpB,OAAO,CAAC,mBAAmB;CAmB5B"}