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.
- package/CHANGELOG.md +33 -0
- package/README.md +40 -1
- package/dist/core/compiler/index.d.ts +3 -0
- package/dist/core/compiler/index.d.ts.map +1 -0
- package/dist/core/compiler/index.js +3 -0
- package/dist/core/compiler/index.js.map +1 -0
- package/dist/core/compiler/transformer.d.ts +20 -0
- package/dist/core/compiler/transformer.d.ts.map +1 -0
- package/dist/core/compiler/transformer.js +37 -0
- package/dist/core/compiler/transformer.js.map +1 -0
- package/dist/core/compiler/traverser.d.ts +18 -0
- package/dist/core/compiler/traverser.d.ts.map +1 -0
- package/dist/core/compiler/traverser.js +175 -0
- package/dist/core/compiler/traverser.js.map +1 -0
- package/dist/core/visitors/componentDetector.d.ts +27 -0
- package/dist/core/visitors/componentDetector.d.ts.map +1 -0
- package/dist/core/visitors/componentDetector.js +118 -0
- package/dist/core/visitors/componentDetector.js.map +1 -0
- package/dist/core/visitors/componentExpander.d.ts +24 -0
- package/dist/core/visitors/componentExpander.d.ts.map +1 -0
- package/dist/core/visitors/componentExpander.js +293 -0
- package/dist/core/visitors/componentExpander.js.map +1 -0
- package/dist/core/visitors/definitionRemover.d.ts +9 -0
- package/dist/core/visitors/definitionRemover.d.ts.map +1 -0
- package/dist/core/visitors/definitionRemover.js +14 -0
- package/dist/core/visitors/definitionRemover.js.map +1 -0
- package/dist/core/visitors/includeFlattener.d.ts +12 -0
- package/dist/core/visitors/includeFlattener.d.ts.map +1 -0
- package/dist/core/visitors/includeFlattener.js +23 -0
- package/dist/core/visitors/includeFlattener.js.map +1 -0
- package/dist/core/visitors/index.d.ts +6 -0
- package/dist/core/visitors/index.d.ts.map +1 -0
- package/dist/core/visitors/index.js +6 -0
- package/dist/core/visitors/index.js.map +1 -0
- package/dist/core/visitors/visitor.d.ts +32 -0
- package/dist/core/visitors/visitor.d.ts.map +1 -0
- package/dist/core/visitors/visitor.js +3 -0
- package/dist/core/visitors/visitor.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/transform.js +4 -4
- package/dist/transform.js.map +1 -1
- package/dist/utils/astHelpers.d.ts +4 -0
- package/dist/utils/astHelpers.d.ts.map +1 -1
- package/dist/utils/astHelpers.js +9 -0
- package/dist/utils/astHelpers.js.map +1 -1
- package/package.json +2 -2
- package/dist/core/astTransformer.d.ts +0 -33
- package/dist/core/astTransformer.d.ts.map +0 -1
- package/dist/core/astTransformer.js +0 -598
- 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
|
|
361
|
+
**Status**: Alpha Release
|
|
@@ -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 @@
|
|
|
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"}
|