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,24 @@
1
+ import type { NodeLocation, PugTailError } from '../types/index.js';
2
+ export interface ErrorHandlerOptions {
3
+ filename?: string;
4
+ }
5
+ export interface ExtendedPugTailError extends Error, PugTailError {
6
+ code: string;
7
+ location?: NodeLocation;
8
+ hint?: string;
9
+ }
10
+ export declare class ErrorHandler {
11
+ private filename?;
12
+ constructor(options?: ErrorHandlerOptions);
13
+ componentNotFound(name: string, location: NodeLocation, availableComponents: string[]): ExtendedPugTailError;
14
+ duplicateComponent(name: string, existingLocation: NodeLocation, newLocation: NodeLocation): ExtendedPugTailError;
15
+ duplicateSlotProvided(slotName: string, location: NodeLocation): ExtendedPugTailError;
16
+ duplicateSlotDefinition(slotName: string, location: NodeLocation): ExtendedPugTailError;
17
+ slotNotDefined(slotName: string, location: NodeLocation, availableSlots: string[]): ExtendedPugTailError;
18
+ recursiveComponentCall(componentName: string, callStack: string[], location: NodeLocation): ExtendedPugTailError;
19
+ unexpectedNodeType(expectedType: string, actualType: string, location: NodeLocation): ExtendedPugTailError;
20
+ externalVariableReference(variableName: string, componentName: string, location: NodeLocation): ExtendedPugTailError;
21
+ private formatError;
22
+ private formatLocation;
23
+ }
24
+ //# sourceMappingURL=errorHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/core/errorHandler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAKzD,MAAM,WAAW,mBAAmB;IAElC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAKD,MAAM,WAAW,oBAAqB,SAAQ,KAAK,EAAE,YAAY;IAE/D,IAAI,EAAE,MAAM,CAAA;IAGZ,QAAQ,CAAC,EAAE,YAAY,CAAA;IAGvB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAWD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAQ;gBAEb,OAAO,GAAE,mBAAwB;IAY7C,iBAAiB,CACf,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EACtB,mBAAmB,EAAE,MAAM,EAAE,GAC5B,oBAAoB;IAsBvB,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,YAAY,EAC9B,WAAW,EAAE,YAAY,GACxB,oBAAoB;IAkBvB,qBAAqB,CACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,GACrB,oBAAoB;IAkBvB,uBAAuB,CACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,GACrB,oBAAoB;IAoBvB,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,EAAE,GACvB,oBAAoB;IAsBvB,sBAAsB,CACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,EAAE,YAAY,GACrB,oBAAoB;IAwBvB,kBAAkB,CAChB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,YAAY,GACrB,oBAAoB;IAmBvB,yBAAyB,CACvB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,YAAY,GACrB,oBAAoB;IAyBvB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,cAAc;CAiBvB"}
@@ -0,0 +1,102 @@
1
+ export class ErrorHandler {
2
+ constructor(options = {}) {
3
+ this.filename = options.filename;
4
+ }
5
+ componentNotFound(name, location, availableComponents) {
6
+ const error = new Error(`Component "${name}" not found`);
7
+ error.code = 'COMPONENT_NOT_FOUND';
8
+ error.location = location;
9
+ error.hint =
10
+ availableComponents.length > 0
11
+ ? `Available components: ${availableComponents.join(', ')}`
12
+ : 'No components are defined. Make sure to define components before use.';
13
+ return this.formatError(error);
14
+ }
15
+ duplicateComponent(name, existingLocation, newLocation) {
16
+ const error = new Error(`Component "${name}" is already defined`);
17
+ error.code = 'DUPLICATE_COMPONENT';
18
+ error.location = newLocation;
19
+ error.hint = `Previously defined at ${this.formatLocation(existingLocation)}`;
20
+ return this.formatError(error);
21
+ }
22
+ duplicateSlotProvided(slotName, location) {
23
+ const error = new Error(`Duplicate slot "${slotName}" provided`);
24
+ error.code = 'DUPLICATE_SLOT_PROVIDED';
25
+ error.location = location;
26
+ error.hint = 'Each slot name can only be provided once in a component call.';
27
+ return this.formatError(error);
28
+ }
29
+ duplicateSlotDefinition(slotName, location) {
30
+ const error = new Error(`Duplicate slot "${slotName}" defined in component`);
31
+ error.code = 'DUPLICATE_SLOT_DEFINITION';
32
+ error.location = location;
33
+ error.hint =
34
+ 'Each slot name can only be defined once in a component definition.';
35
+ return this.formatError(error);
36
+ }
37
+ slotNotDefined(slotName, location, availableSlots) {
38
+ const error = new Error(`Slot "${slotName}" is not defined in this component`);
39
+ error.code = 'SLOT_NOT_DEFINED';
40
+ error.location = location;
41
+ error.hint =
42
+ availableSlots.length > 0
43
+ ? `Available slots: ${availableSlots.join(', ')}`
44
+ : 'This component does not define any slots.';
45
+ return this.formatError(error);
46
+ }
47
+ recursiveComponentCall(componentName, callStack, location) {
48
+ const fullStack = callStack.concat(componentName);
49
+ const stackStr = fullStack.join(' -> ');
50
+ const error = new Error(`Recursive component call detected: ${stackStr}`);
51
+ error.code = 'RECURSIVE_COMPONENT_CALL';
52
+ error.location = location;
53
+ error.hint =
54
+ 'Components cannot call themselves directly or indirectly. ' +
55
+ 'Review the component structure to break the circular dependency.';
56
+ return this.formatError(error);
57
+ }
58
+ unexpectedNodeType(expectedType, actualType, location) {
59
+ const error = new Error(`Expected ${expectedType} node, but got ${actualType}`);
60
+ error.code = 'UNEXPECTED_NODE_TYPE';
61
+ error.location = location;
62
+ error.hint = 'This may indicate a syntax error in the Pug source.';
63
+ return this.formatError(error);
64
+ }
65
+ externalVariableReference(variableName, componentName, location) {
66
+ const error = new Error(`Component "${componentName}" references external variable "${variableName}"`);
67
+ error.code = 'EXTERNAL_VARIABLE_REFERENCE';
68
+ error.location = location;
69
+ error.hint =
70
+ 'Components must be scope-isolated. External variable access is not allowed.\n\n' +
71
+ 'Suggestions:\n' +
72
+ `1. Pass as a prop: ${componentName}(${variableName}=${variableName})\n` +
73
+ `2. Declare inside component: const ${variableName} = ...\n` +
74
+ "3. Disable strict mode: Set validation.scopeIsolation to 'warn' or 'off'";
75
+ return this.formatError(error);
76
+ }
77
+ formatError(error) {
78
+ if (error.location) {
79
+ const locationStr = this.formatLocation(error.location);
80
+ error.message = `${error.message} at ${locationStr}`;
81
+ }
82
+ if (error.hint) {
83
+ error.message = `${error.message}\n\nHint: ${error.hint}`;
84
+ }
85
+ return error;
86
+ }
87
+ formatLocation(location) {
88
+ const parts = [];
89
+ if (location.filename) {
90
+ parts.push(location.filename);
91
+ }
92
+ else if (this.filename) {
93
+ parts.push(this.filename);
94
+ }
95
+ parts.push(`line ${location.line}`);
96
+ if (location.column !== undefined) {
97
+ parts.push(`column ${location.column}`);
98
+ }
99
+ return parts.join(':');
100
+ }
101
+ }
102
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/core/errorHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Block, Node } from '@/types/pug';
2
+ import { type ErrorHandlerOptions } from './errorHandler.js';
3
+ export declare class SlotResolver {
4
+ private errorHandler;
5
+ constructor(options?: ErrorHandlerOptions);
6
+ extractProvidedSlots(callNode: Node): Map<string, Block>;
7
+ resolveSlot(slotName: string, providedSlots: Map<string, Block>, defaultSlot: Block | null): Block;
8
+ }
9
+ //# sourceMappingURL=slotResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slotResolver.d.ts","sourceRoot":"","sources":["../../src/core/slotResolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAO,MAAM,aAAa,CAAA;AAInD,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAevE,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAc;gBAEtB,OAAO,GAAE,mBAAwB;IA0B7C,oBAAoB,CAAC,QAAQ,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;IAuGxD,WAAW,CACT,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,EACjC,WAAW,EAAE,KAAK,GAAG,IAAI,GACxB,KAAK;CAqBT"}
@@ -0,0 +1,88 @@
1
+ import { getNodeLocationObject, isTagWithName } from '../utils/astHelpers.js';
2
+ import { extractSlotName } from '../utils/componentDetector.js';
3
+ import { deepCloneBlock, deepCloneNode } from '../utils/deepClone.js';
4
+ import { ErrorHandler } from './errorHandler.js';
5
+ export class SlotResolver {
6
+ constructor(options = {}) {
7
+ this.errorHandler = new ErrorHandler(options);
8
+ }
9
+ extractProvidedSlots(callNode) {
10
+ const slots = new Map();
11
+ if (callNode.type !== 'Tag') {
12
+ return slots;
13
+ }
14
+ const tagNode = callNode;
15
+ if (!tagNode.block) {
16
+ return slots;
17
+ }
18
+ const slotNodes = [];
19
+ const nonSlotNodes = [];
20
+ for (const node of tagNode.block.nodes) {
21
+ if (isTagWithName(node, 'slot')) {
22
+ slotNodes.push(node);
23
+ }
24
+ else if (node.type !== 'Comment') {
25
+ nonSlotNodes.push(node);
26
+ }
27
+ }
28
+ for (const node of slotNodes) {
29
+ if (node.type !== 'Tag') {
30
+ continue;
31
+ }
32
+ const slotName = extractSlotName(node);
33
+ if (slots.has(slotName)) {
34
+ const location = getNodeLocationObject(node);
35
+ throw this.errorHandler.duplicateSlotProvided(slotName, location);
36
+ }
37
+ if (node.block) {
38
+ slots.set(slotName, deepCloneBlock(node.block));
39
+ }
40
+ else {
41
+ const emptyBlock = {
42
+ type: 'Block',
43
+ nodes: [],
44
+ line: node.line,
45
+ column: node.column,
46
+ filename: node.filename,
47
+ };
48
+ slots.set(slotName, emptyBlock);
49
+ }
50
+ }
51
+ if (nonSlotNodes.length > 0) {
52
+ if (slots.has('default')) {
53
+ const firstNonSlotNode = nonSlotNodes[0];
54
+ if (!firstNonSlotNode) {
55
+ return slots;
56
+ }
57
+ const location = getNodeLocationObject(firstNonSlotNode);
58
+ throw this.errorHandler.duplicateSlotProvided('default', location);
59
+ }
60
+ const defaultBlock = {
61
+ type: 'Block',
62
+ nodes: nonSlotNodes.map((node) => deepCloneNode(node)),
63
+ line: tagNode.block.line,
64
+ column: tagNode.block.column,
65
+ filename: tagNode.block.filename,
66
+ };
67
+ slots.set('default', defaultBlock);
68
+ }
69
+ return slots;
70
+ }
71
+ resolveSlot(slotName, providedSlots, defaultSlot) {
72
+ if (providedSlots.has(slotName)) {
73
+ const provided = providedSlots.get(slotName);
74
+ if (provided) {
75
+ return provided;
76
+ }
77
+ }
78
+ if (defaultSlot) {
79
+ return defaultSlot;
80
+ }
81
+ return {
82
+ type: 'Block',
83
+ nodes: [],
84
+ line: 0,
85
+ };
86
+ }
87
+ }
88
+ //# sourceMappingURL=slotResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slotResolver.js","sourceRoot":"","sources":["../../src/core/slotResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const version = "0.1.0-alpha.0";
2
+ export { ASTTransformer } from './core/astTransformer.js';
3
+ export { ComponentRegistry } from './core/componentRegistry.js';
4
+ export type { ExtendedPugTailError } from './core/errorHandler.js';
5
+ export { ErrorHandler, type ErrorHandlerOptions } from './core/errorHandler.js';
6
+ export { SlotResolver } from './core/slotResolver.js';
7
+ export { type TransformOptions, type TransformResult, transform, } from './transform.js';
8
+ export type { ComponentDefinition, NodeLocation, PugTailError, SlotDefinition, } from './types/index.js';
9
+ export { extractComponentBody, extractComponentDefinition, extractComponentName, extractSlotDefinition, extractSlotDefinitions, extractSlotName, isComponentDefinitionNode, isSlotDefinitionNode, } from './utils/componentDetector.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,OAAO,kBAAkB,CAAA;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,SAAS,GACV,MAAM,aAAa,CAAA;AAEpB,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAA;AAEhB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,2BAA2B,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export const version = '0.1.0-alpha.0';
2
+ export { ASTTransformer } from './core/astTransformer.js';
3
+ export { ComponentRegistry } from './core/componentRegistry.js';
4
+ export { ErrorHandler } from './core/errorHandler.js';
5
+ export { SlotResolver } from './core/slotResolver.js';
6
+ export { transform, } from './transform.js';
7
+ export { extractComponentBody, extractComponentDefinition, extractComponentName, extractSlotDefinition, extractSlotDefinitions, extractSlotName, isComponentDefinitionNode, isSlotDefinitionNode, } from './utils/componentDetector.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAA;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO,EAAE,YAAY,EAA4B,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAGL,SAAS,GACV,MAAM,aAAa,CAAA;AASpB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,26 @@
1
+ import type { ErrorHandlerOptions } from './core/errorHandler.js';
2
+ import type { Block } from '@/types/pug';
3
+ export interface TransformOptions extends ErrorHandlerOptions {
4
+ debug?: boolean;
5
+ output?: 'ast' | 'html' | 'pug-code';
6
+ htmlOptions?: {
7
+ pretty?: boolean;
8
+ compileDebug?: boolean;
9
+ doctype?: string;
10
+ };
11
+ basedir?: string;
12
+ basePath?: string;
13
+ data?: Record<string, unknown>;
14
+ dataKey?: string;
15
+ validation?: {
16
+ scopeIsolation?: 'error' | 'warn' | 'off';
17
+ allowedGlobals?: string[];
18
+ };
19
+ }
20
+ export interface TransformResult {
21
+ ast?: Block;
22
+ html?: string;
23
+ code?: string;
24
+ }
25
+ export declare function transform(source: string, options?: TransformOptions): TransformResult;
26
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAEjE,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,aAAa,CAAA;AAS9C,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAE3D,KAAK,CAAC,EAAE,OAAO,CAAA;IAGf,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,CAAA;IAGpC,WAAW,CAAC,EAAE;QAEZ,MAAM,CAAC,EAAE,OAAO,CAAA;QAEhB,YAAY,CAAC,EAAE,OAAO,CAAA;QAEtB,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;IAGD,OAAO,CAAC,EAAE,MAAM,CAAA;IAGhB,QAAQ,CAAC,EAAE,MAAM,CAAA;IAGjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAG9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAGhB,UAAU,CAAC,EAAE;QAEX,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;QAEzC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAC1B,CAAA;CACF;AAKD,MAAM,WAAW,eAAe;IAE9B,GAAG,CAAC,EAAE,KAAK,CAAA;IAGX,IAAI,CAAC,EAAE,MAAM,CAAA;IAGb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAeD,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CAyJjB"}
@@ -0,0 +1,247 @@
1
+ import generateCode from 'pug-code-gen';
2
+ import lex from 'pug-lexer';
3
+ import load from 'pug-load';
4
+ import parse from 'pug-parser';
5
+ import { dataLoader } from './cli/dataLoader.js';
6
+ import { ASTTransformer } from './core/astTransformer.js';
7
+ import { ComponentRegistry } from './core/componentRegistry.js';
8
+ import { SlotResolver } from './core/slotResolver.js';
9
+ import { detectDataFiles, removeDataFilesDeclaration, } from './utils/dataFilesDetector.js';
10
+ export function transform(source, options = {}) {
11
+ const { debug = false, output = 'ast', htmlOptions = {}, basePath, ...errorHandlerOptions } = options;
12
+ if (debug) {
13
+ console.log('[pug-tail] Starting transformation...');
14
+ }
15
+ let tokens;
16
+ try {
17
+ tokens = errorHandlerOptions.filename
18
+ ? lex(source, { filename: errorHandlerOptions.filename })
19
+ : lex(source);
20
+ if (debug) {
21
+ console.log(`[pug-tail] Lexed ${tokens.length} tokens`);
22
+ }
23
+ }
24
+ catch (error) {
25
+ throw new Error(`Lexing failed: ${error instanceof Error ? error.message : String(error)}`);
26
+ }
27
+ let ast;
28
+ try {
29
+ ast = errorHandlerOptions.filename
30
+ ? parse(tokens, {
31
+ filename: errorHandlerOptions.filename,
32
+ })
33
+ : parse(tokens);
34
+ if (debug) {
35
+ console.log('[pug-tail] Parsed AST:', JSON.stringify(ast, null, 2));
36
+ }
37
+ }
38
+ catch (error) {
39
+ throw new Error(`Parsing failed: ${error instanceof Error ? error.message : String(error)}`);
40
+ }
41
+ try {
42
+ ast = load(ast, {
43
+ lex,
44
+ parse,
45
+ basedir: options.basedir,
46
+ filename: errorHandlerOptions.filename,
47
+ });
48
+ if (debug) {
49
+ console.log('[pug-tail] Loaded includes/extends');
50
+ }
51
+ }
52
+ catch (error) {
53
+ throw new Error(`Loading includes/extends failed: ${error instanceof Error ? error.message : String(error)}`);
54
+ }
55
+ const globalData = options.data || {};
56
+ let pageData = {};
57
+ try {
58
+ const dataFilePaths = detectDataFiles(ast);
59
+ if (dataFilePaths.length > 0) {
60
+ if (debug) {
61
+ console.log('[pug-tail] Detected $dataFiles:', dataFilePaths);
62
+ console.log('[pug-tail] basePath:', basePath);
63
+ console.log('[pug-tail] basedir:', options.basedir);
64
+ }
65
+ pageData = dataLoader.loadDataFiles(dataFilePaths, basePath, options.basedir);
66
+ if (debug) {
67
+ console.log('[pug-tail] Loaded data from files:', pageData);
68
+ }
69
+ removeDataFilesDeclaration(ast);
70
+ if (debug) {
71
+ console.log('[pug-tail] Loaded and removed $dataFiles declaration');
72
+ }
73
+ }
74
+ }
75
+ catch (error) {
76
+ throw new Error(`Loading $dataFiles failed: ${error instanceof Error ? error.message : String(error)}`);
77
+ }
78
+ const registry = new ComponentRegistry(errorHandlerOptions);
79
+ const resolver = new SlotResolver(errorHandlerOptions);
80
+ const transformer = new ASTTransformer(registry, resolver, {
81
+ ...errorHandlerOptions,
82
+ validation: options.validation,
83
+ debug,
84
+ });
85
+ const transformedAst = transformer.transform(ast);
86
+ if (debug) {
87
+ console.log('[pug-tail] Transformed AST:', JSON.stringify(transformedAst, null, 2));
88
+ }
89
+ const result = {};
90
+ if (output === 'ast') {
91
+ if (transformedAst.type !== 'Block') {
92
+ throw new Error('Expected Block node after transformation');
93
+ }
94
+ result.ast = transformedAst;
95
+ }
96
+ else if (output === 'html') {
97
+ const mergedGlobalData = options.dataKey
98
+ ? globalData
99
+ : { ...globalData, ...pageData };
100
+ const mergedPageData = options.dataKey ? pageData : {};
101
+ result.html = generateHTML(transformedAst, {
102
+ pretty: htmlOptions.pretty ?? true,
103
+ compileDebug: htmlOptions.compileDebug ?? false,
104
+ doctype: htmlOptions.doctype,
105
+ globalData: mergedGlobalData,
106
+ pageData: mergedPageData,
107
+ dataKey: options.dataKey,
108
+ });
109
+ if (debug) {
110
+ console.log('[pug-tail] Generated HTML:', result.html);
111
+ }
112
+ }
113
+ else if (output === 'pug-code') {
114
+ result.code = generateCode(transformedAst, {
115
+ compileDebug: htmlOptions.compileDebug ?? false,
116
+ pretty: htmlOptions.pretty ?? true,
117
+ });
118
+ if (debug) {
119
+ console.log('[pug-tail] Generated code:', result.code);
120
+ }
121
+ }
122
+ if (debug) {
123
+ console.log('[pug-tail] Transformation completed');
124
+ }
125
+ return result;
126
+ }
127
+ function createPugRuntime() {
128
+ return {
129
+ attr: (key, val, escaped) => {
130
+ if (val === true)
131
+ return ` ${key}`;
132
+ if (val === false || val == null)
133
+ return '';
134
+ return escaped
135
+ ? ` ${key}="${String(val).replace(/"/g, '&quot;')}"`
136
+ : ` ${key}="${val}"`;
137
+ },
138
+ attrs: (attrs) => {
139
+ const result = [];
140
+ for (const [key, val] of Object.entries(attrs)) {
141
+ if (val === true)
142
+ result.push(` ${key}`);
143
+ else if (val !== false && val != null)
144
+ result.push(` ${key}="${String(val).replace(/"/g, '&quot;')}"`);
145
+ }
146
+ return result.join('');
147
+ },
148
+ escape: (str) => String(str)
149
+ .replace(/&/g, '&amp;')
150
+ .replace(/</g, '&lt;')
151
+ .replace(/>/g, '&gt;')
152
+ .replace(/"/g, '&quot;'),
153
+ rethrow: (err) => {
154
+ throw err;
155
+ },
156
+ classes: (classes) => {
157
+ if (Array.isArray(classes)) {
158
+ return classes.filter(Boolean).join(' ');
159
+ }
160
+ if (typeof classes === 'object' && classes !== null) {
161
+ return Object.entries(classes)
162
+ .filter(([, val]) => val)
163
+ .map(([key]) => key)
164
+ .join(' ');
165
+ }
166
+ return String(classes);
167
+ },
168
+ merge: (...args) => {
169
+ const sources = args.length === 1 && Array.isArray(args[0])
170
+ ? args[0]
171
+ : args;
172
+ const base = {};
173
+ for (const source of sources) {
174
+ if (!source || typeof source !== 'object')
175
+ continue;
176
+ for (const [key, val] of Object.entries(source)) {
177
+ if (key === 'class') {
178
+ const baseClass = base.class;
179
+ const sourceClass = val;
180
+ if (baseClass && sourceClass) {
181
+ const baseClasses = Array.isArray(baseClass)
182
+ ? baseClass
183
+ : String(baseClass).split(' ');
184
+ const sourceClasses = Array.isArray(sourceClass)
185
+ ? sourceClass
186
+ : String(sourceClass).split(' ');
187
+ base.class = [...baseClasses, ...sourceClasses]
188
+ .filter(Boolean)
189
+ .join(' ');
190
+ }
191
+ else {
192
+ base.class = sourceClass || baseClass;
193
+ }
194
+ }
195
+ else {
196
+ base[key] = val;
197
+ }
198
+ }
199
+ }
200
+ return base;
201
+ },
202
+ };
203
+ }
204
+ function generateHTML(ast, options) {
205
+ try {
206
+ const generatedCode = generateCode(ast, {
207
+ compileDebug: options.compileDebug ?? false,
208
+ pretty: options.pretty ?? true,
209
+ doctype: options.doctype,
210
+ });
211
+ const pugRuntime = createPugRuntime();
212
+ const templateFn = new Function('pug', `
213
+ ${generatedCode}
214
+ return template;
215
+ `);
216
+ const template = templateFn(pugRuntime);
217
+ if (typeof template !== 'function') {
218
+ throw new Error('Template function was not returned from generated code');
219
+ }
220
+ let locals = {};
221
+ const globalData = options.globalData || {};
222
+ if (Object.keys(globalData).length > 0) {
223
+ if (options.dataKey) {
224
+ locals[options.dataKey] = globalData;
225
+ }
226
+ else {
227
+ locals = { ...locals, ...globalData };
228
+ }
229
+ }
230
+ const pageData = options.pageData || {};
231
+ if (Object.keys(pageData).length > 0) {
232
+ locals = { ...locals, ...pageData };
233
+ }
234
+ const html = template(locals);
235
+ if (html == null) {
236
+ return '';
237
+ }
238
+ return String(html);
239
+ }
240
+ catch (error) {
241
+ if (error instanceof Error) {
242
+ throw new Error(`HTML generation failed: ${error.message}`);
243
+ }
244
+ throw error;
245
+ }
246
+ }
247
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAOA,OAAO,YAAY,MAAM,cAAc,CAAA;AACvC,OAAO,GAAG,MAAM,WAAW,CAAA;AAC3B,OAAO,IAAI,MAAM,UAAU,CAAA;AAC3B,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD,OAAO,EACL,eAAe,EACf,0BAA0B,GAC3B,MAAM,8BAA8B,CAAA;AAsErC,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,UAA4B,EAAE;IAE9B,MAAM,EACJ,KAAK,GAAG,KAAK,EACb,MAAM,GAAG,KAAK,EACd,WAAW,GAAG,EAAE,EAChB,QAAQ,EACR,GAAG,mBAAmB,EACvB,GAAG,OAAO,CAAA;IAEX,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;IACtD,CAAC;IAGD,IAAI,MAA8B,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,mBAAmB,CAAC,QAAQ;YACnC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YACzD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACf,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,MAAM,SAAS,CAAC,CAAA;QACzD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3E,CAAA;IACH,CAAC;IAGD,IAAI,GAAS,CAAA;IACb,IAAI,CAAC;QACH,GAAG,GAAG,mBAAmB,CAAC,QAAQ;YAChC,CAAC,CAAC,KAAK,CAAC,MAAgD,EAAE;gBACtD,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;aACvC,CAAC;YACJ,CAAC,CAAC,KAAK,CAAC,MAAgD,CAAC,CAAA;QAC3D,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5E,CAAA;IACH,CAAC;IAGD,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;YACd,GAAG;YACH,KAAK;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,mBAAmB,CAAC,QAAQ;SACvC,CAAC,CAAA;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7F,CAAA;IACH,CAAC;IAGD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAA;IACrC,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,eAAe,CAAC,GAAY,CAAC,CAAA;QACnD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,aAAa,CAAC,CAAA;gBAC7D,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAA;gBAC7C,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;YACrD,CAAC;YACD,QAAQ,GAAG,UAAU,CAAC,aAAa,CACjC,aAAa,EACb,QAAQ,EACR,OAAO,CAAC,OAAO,CAChB,CAAA;YACD,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,QAAQ,CAAC,CAAA;YAC7D,CAAC;YAED,0BAA0B,CAAC,GAAY,CAAC,CAAA;YACxC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvF,CAAA;IACH,CAAC;IAGD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,mBAAmB,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC,CAAA;IACtD,MAAM,WAAW,GAAG,IAAI,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE;QACzD,GAAG,mBAAmB;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK;KACN,CAAC,CAAA;IAGF,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CACT,6BAA6B,EAC7B,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CACxC,CAAA;IACH,CAAC;IAGD,MAAM,MAAM,GAAoB,EAAE,CAAA;IAElC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,IAAI,cAAc,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,CAAC,GAAG,GAAG,cAAuB,CAAA;IACtC,CAAC;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAG7B,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO;YACtC,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAA;QAClC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QAEtD,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,cAAuB,EAAE;YAClD,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,IAAI;YAClC,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,KAAK;YAC/C,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,UAAU,EAAE,gBAAgB;YAC5B,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAA;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,cAAuB,EAAE;YAClD,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,KAAK;YAC/C,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,IAAI;SACnC,CAAC,CAAA;QACF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAOD,SAAS,gBAAgB;IACvB,OAAO;QACL,IAAI,EAAE,CAAC,GAAW,EAAE,GAAY,EAAE,OAAgB,EAAE,EAAE;YACpD,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,GAAG,EAAE,CAAA;YAClC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAA;YAC3C,OAAO,OAAO;gBACZ,CAAC,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG;gBACpD,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,GAAG,CAAA;QACxB,CAAC;QACD,KAAK,EAAE,CAAC,KAA8B,EAAE,EAAE;YACxC,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,IAAI,GAAG,KAAK,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;qBACnC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI;oBACnC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;YACnE,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC;QACD,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC;aACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC5B,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YACtB,MAAM,GAAG,CAAA;QACX,CAAC;QAED,OAAO,EAAE,CAAC,OAAgB,EAAE,EAAE;YAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC1C,CAAC;YACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACpD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;qBAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;qBACxB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;qBACnB,IAAI,CAAC,GAAG,CAAC,CAAA;YACd,CAAC;YACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;QAED,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAE5B,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACT,CAAC,CAAE,IAAkC,CAAA;YAEzC,MAAM,IAAI,GAA4B,EAAE,CAAA;YAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;oBAAE,SAAQ;gBAEnD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CACrC,MAAiC,CAClC,EAAE,CAAC;oBACF,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;wBAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAA;wBAC5B,MAAM,WAAW,GAAG,GAAG,CAAA;wBAEvB,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;4BAC7B,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;gCAC1C,CAAC,CAAC,SAAS;gCACX,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;4BAChC,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;gCAC9C,CAAC,CAAC,WAAW;gCACb,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;4BAElC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,aAAa,CAAC;iCAC5C,MAAM,CAAC,OAAO,CAAC;iCACf,IAAI,CAAC,GAAG,CAAC,CAAA;wBACd,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,KAAK,GAAG,WAAW,IAAI,SAAS,CAAA;wBACvC,CAAC;oBACH,CAAC;yBAAM,CAAC;wBAEN,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC;AASD,SAAS,YAAY,CACnB,GAAU,EACV,OAOC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,EAAE;YACtC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;YAC3C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAA;QAIrC,MAAM,UAAU,GAAG,IAAI,QAAQ,CAC7B,KAAK,EACL;QACE,aAAa;;OAEd,CACF,CAAA;QAGD,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;QAEvC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;QAC3E,CAAC;QAGD,IAAI,MAAM,GAA4B,EAAE,CAAA;QAGxC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAA;QAC3C,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;YACvC,CAAC;QACH,CAAC;QAGD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;QACvC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;QACrC,CAAC;QAGD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QAG7B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { Block, Tag } from './pug';
2
+ export interface NodeLocation {
3
+ line: number;
4
+ column?: number;
5
+ filename?: string;
6
+ path?: string;
7
+ }
8
+ export interface SlotDefinition {
9
+ name: string;
10
+ placeholder: Tag;
11
+ location: NodeLocation;
12
+ }
13
+ export interface ComponentDefinition {
14
+ name: string;
15
+ body: Block;
16
+ slots: Map<string, SlotDefinition>;
17
+ location: NodeLocation;
18
+ usage?: ComponentUsage;
19
+ scopeAnalysis?: ScopeAnalysisResult;
20
+ }
21
+ export interface ComponentUsage {
22
+ fromProps: string[];
23
+ fromAttrs: string[];
24
+ }
25
+ export interface ScopeAnalysisResult {
26
+ declaredVariables: Set<string>;
27
+ referencedVariables: Set<string>;
28
+ propsVariables: Set<string>;
29
+ attrsVariables: Set<string>;
30
+ slotVariables: Set<string>;
31
+ externalReferences: Set<string>;
32
+ }
33
+ export interface ValidationConfig {
34
+ scopeIsolation?: 'error' | 'warn' | 'off';
35
+ allowedGlobals?: string[];
36
+ }
37
+ export interface PugTailError {
38
+ message: string;
39
+ location?: NodeLocation;
40
+ }
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAKvC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAKD,MAAM,WAAW,cAAc;IAE7B,IAAI,EAAE,MAAM,CAAA;IAGZ,WAAW,EAAE,GAAG,CAAA;IAGhB,QAAQ,EAAE,YAAY,CAAA;CACvB;AAKD,MAAM,WAAW,mBAAmB;IAElC,IAAI,EAAE,MAAM,CAAA;IAGZ,IAAI,EAAE,KAAK,CAAA;IAGX,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAGlC,QAAQ,EAAE,YAAY,CAAA;IAGtB,KAAK,CAAC,EAAE,cAAc,CAAA;IAGtB,aAAa,CAAC,EAAE,mBAAmB,CAAA;CACpC;AAMD,MAAM,WAAW,cAAc;IAE7B,SAAS,EAAE,MAAM,EAAE,CAAA;IAGnB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAMD,MAAM,WAAW,mBAAmB;IAElC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAG9B,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAGhC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAG3B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAG3B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAG1B,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAChC;AAKD,MAAM,WAAW,gBAAgB;IAE/B,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;IAGzC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAC1B;AAKD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { NodeLocation } from '../types/index.js';
2
+ import type { Attribute, Block, Node, Tag, Text } from '@/types/pug';
3
+ export declare function isTagNode(node: Node): node is Tag;
4
+ export declare function isBlockNode(node: Node): node is Block;
5
+ export declare function isTextNode(node: Node): node is Text;
6
+ export declare function isTagWithName(node: Node, name: string): node is Tag;
7
+ export declare function isCapitalizedTag(node: Node): node is Tag;
8
+ export declare function getAttributeValue(attrs: Attribute[] | undefined, name: string): string | boolean | undefined;
9
+ export declare function getAttributeNames(attrs: Attribute[] | undefined): string[];
10
+ export declare function getChildNodes(block: Block | undefined): Node[];
11
+ export declare function getNodeLocationObject(node: Node): NodeLocation;
12
+ export declare function getNodeLocation(node: Node): string;
13
+ export declare function getFirstTextContent(node: Tag): string | undefined;
14
+ export declare function filterNodes(block: Block, predicate: (node: Node) => boolean): Node[];
15
+ export declare function findNode(block: Block, predicate: (node: Node) => boolean): Node | undefined;
16
+ //# sourceMappingURL=astHelpers.d.ts.map