htl-to-js 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,42 @@
1
+ export interface SetDecl {
2
+ name: string;
3
+ expr: string;
4
+ raw?: boolean;
5
+ }
6
+ export interface CallDescriptor {
7
+ fn: string;
8
+ params: Record<string, string>;
9
+ }
10
+ export interface Directives {
11
+ use: Record<string, string>;
12
+ useDefaults: Record<string, string>;
13
+ fileUse: Record<string, string>;
14
+ test: string | null;
15
+ repeat: {
16
+ varName: string;
17
+ listExpr: string;
18
+ listMode: boolean;
19
+ } | null;
20
+ element: string | null;
21
+ unwrap: string | null;
22
+ sets: SetDecl[];
23
+ text: string | null;
24
+ resource: string | null;
25
+ template: {
26
+ name: string;
27
+ params: string[];
28
+ } | null;
29
+ call: CallDescriptor | null;
30
+ include: string | null;
31
+ dynamicAttrs?: {
32
+ name: string;
33
+ expr: string;
34
+ }[];
35
+ spreadAttr?: string | null;
36
+ skip: Set<string>;
37
+ }
38
+ /**
39
+ * Parses all data-sly-* attributes from a node's attribute map and returns
40
+ * a structured descriptor used by the walker to generate JS code.
41
+ */
42
+ export declare function parseDirectives(attrs: Record<string, string>, sourceDir?: string): Directives;
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseDirectives = parseDirectives;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const expr_1 = require("./expr");
10
+ /**
11
+ * Resolves an HTL data-sly-use file path to a require()-ready relative path.
12
+ * AEM resolves paths relative to the component root, not the current file,
13
+ * so we walk up the directory tree until the file is found.
14
+ * Returns a './relative/path.html' string, or null if not resolvable locally.
15
+ */
16
+ function resolveHtlPath(val, sourceDir) {
17
+ if (!val.endsWith('.html') || val.includes('${'))
18
+ return null;
19
+ if (val.startsWith('/')) {
20
+ let dir = sourceDir;
21
+ for (let i = 0; i < 10; i++) {
22
+ const jcrRoot = node_path_1.default.join(dir, 'jcr_root');
23
+ if (node_fs_1.default.existsSync(jcrRoot)) {
24
+ const candidate = node_path_1.default.join(jcrRoot, val);
25
+ if (node_fs_1.default.existsSync(candidate)) {
26
+ const rel = node_path_1.default.relative(sourceDir, candidate).replaceAll('\\', '/');
27
+ return rel.startsWith('.') ? rel : `./${rel}`;
28
+ }
29
+ return null;
30
+ }
31
+ dir = node_path_1.default.dirname(dir);
32
+ }
33
+ return null;
34
+ }
35
+ if (val.split('/').length > 2)
36
+ return null;
37
+ let dir = sourceDir;
38
+ for (let i = 0; i < 4; i++) {
39
+ const candidate = node_path_1.default.join(dir, val);
40
+ if (node_fs_1.default.existsSync(candidate)) {
41
+ const rel = node_path_1.default.relative(sourceDir, candidate).replaceAll('\\', '/');
42
+ return rel.startsWith('.') ? rel : `./${rel}`;
43
+ }
44
+ dir = node_path_1.default.dirname(dir);
45
+ }
46
+ return null;
47
+ }
48
+ function parseUseDefault(val) {
49
+ const atIdx = val.indexOf('@');
50
+ if (atIdx === -1)
51
+ return null;
52
+ const vals = [...val.slice(atIdx + 1).matchAll(/\w+\s*=\s*(\w+)/g)].map(m => m[1]);
53
+ return vals.length ? `{ ${vals.join(', ')} }` : null;
54
+ }
55
+ /**
56
+ * Parses all data-sly-* attributes from a node's attribute map and returns
57
+ * a structured descriptor used by the walker to generate JS code.
58
+ */
59
+ function parseDirectives(attrs, sourceDir = '') {
60
+ const directives = {
61
+ use: {},
62
+ useDefaults: {},
63
+ fileUse: {},
64
+ test: null,
65
+ repeat: null,
66
+ element: null,
67
+ unwrap: null,
68
+ sets: [],
69
+ text: null,
70
+ resource: null,
71
+ template: null,
72
+ call: null,
73
+ include: null,
74
+ skip: new Set(),
75
+ };
76
+ for (const [key, val] of Object.entries(attrs)) {
77
+ const useMatch = /^data-sly-use\.(\w+)$/.exec(key);
78
+ if (useMatch) {
79
+ const name = useMatch[1];
80
+ const trimmed = val.trim();
81
+ const requirePath = sourceDir ? resolveHtlPath(trimmed, sourceDir) : null;
82
+ if (requirePath) {
83
+ directives.fileUse[name] = requirePath;
84
+ }
85
+ else {
86
+ directives.use[name] = val;
87
+ const def = parseUseDefault(trimmed);
88
+ if (def)
89
+ directives.useDefaults[name] = def;
90
+ }
91
+ directives.skip.add(key);
92
+ continue;
93
+ }
94
+ if (key === 'data-sly-test') {
95
+ directives.test = (0, expr_1.convertExpr)(val);
96
+ directives.skip.add(key);
97
+ continue;
98
+ }
99
+ const testVarMatch = /^data-sly-test\.(\w+)$/.exec(key);
100
+ if (testVarMatch) {
101
+ const varName = testVarMatch[1];
102
+ directives.sets.push({ name: varName, expr: (0, expr_1.convertExpr)(val), raw: true });
103
+ directives.test = varName;
104
+ directives.skip.add(key);
105
+ continue;
106
+ }
107
+ const repeatMatch = /^data-sly-(?:repeat|list)\.(\w+)$/.exec(key);
108
+ if (repeatMatch) {
109
+ directives.repeat = { varName: repeatMatch[1], listExpr: (0, expr_1.convertExpr)(val), listMode: key.startsWith('data-sly-list.') };
110
+ directives.skip.add(key);
111
+ continue;
112
+ }
113
+ if (key === 'data-sly-list' || key === 'data-sly-repeat') {
114
+ directives.repeat = { varName: 'item', listExpr: (0, expr_1.convertExpr)(val), listMode: key === 'data-sly-list' };
115
+ directives.skip.add(key);
116
+ continue;
117
+ }
118
+ if (key === 'data-sly-element') {
119
+ directives.element = (0, expr_1.convertExpr)(val);
120
+ directives.skip.add(key);
121
+ continue;
122
+ }
123
+ if (key === 'data-sly-unwrap') {
124
+ directives.unwrap = val.trim() ? (0, expr_1.convertExpr)(val) : 'true';
125
+ directives.skip.add(key);
126
+ continue;
127
+ }
128
+ const setMatch = /^data-sly-set\.(\w+)$/.exec(key);
129
+ if (setMatch) {
130
+ const t = val.trim();
131
+ const isPureExpr = t.startsWith('${') && t.endsWith('}') && !t.slice(2, -1).includes('${');
132
+ directives.sets.push(isPureExpr
133
+ ? { name: setMatch[1], expr: (0, expr_1.convertExpr)(t), raw: true }
134
+ : { name: setMatch[1], expr: (0, expr_1.convertAttrValue)(val) });
135
+ directives.skip.add(key);
136
+ continue;
137
+ }
138
+ if (key === 'data-sly-text') {
139
+ directives.text = (0, expr_1.convertExpr)(val);
140
+ directives.skip.add(key);
141
+ continue;
142
+ }
143
+ if (key === 'data-sly-resource') {
144
+ let resource = (0, expr_1.convertExpr)(val);
145
+ if (!resource) {
146
+ const pathMatch = /@\s*path\s*=\s*([^,}@\s'"]+)/.exec(val);
147
+ if (pathMatch)
148
+ resource = (0, expr_1.convertExpr)('${' + pathMatch[1] + '}');
149
+ }
150
+ directives.resource = resource;
151
+ directives.skip.add(key);
152
+ continue;
153
+ }
154
+ const templateMatch = /^data-sly-template\.(\w+)$/.exec(key);
155
+ if (templateMatch) {
156
+ const params = [...val.matchAll(/@\s*(\w+)/g)].map(m => m[1]);
157
+ directives.template = { name: templateMatch[1], params };
158
+ directives.skip.add(key);
159
+ continue;
160
+ }
161
+ const attrMatch = /^data-sly-attribute\.(.+)$/.exec(key);
162
+ if (attrMatch) {
163
+ const attrName = attrMatch[1];
164
+ directives.dynamicAttrs ??= [];
165
+ directives.dynamicAttrs.push({ name: attrName, expr: (0, expr_1.convertExpr)(val) });
166
+ directives.skip.add(key);
167
+ directives.skip.add(attrName);
168
+ continue;
169
+ }
170
+ if (key === 'data-sly-attribute') {
171
+ directives.spreadAttr = (0, expr_1.convertExpr)(val);
172
+ directives.skip.add(key);
173
+ continue;
174
+ }
175
+ if (key === 'data-sly-include') {
176
+ directives.include = val;
177
+ directives.skip.add(key);
178
+ continue;
179
+ }
180
+ if (key === 'data-sly-call') {
181
+ directives.call = parseCallExpr(val);
182
+ directives.skip.add(key);
183
+ }
184
+ }
185
+ return directives;
186
+ }
187
+ /**
188
+ * Parses a data-sly-call expression into a callable descriptor.
189
+ *
190
+ * Input: "${template.default @ model=item, title=item.title}"
191
+ * Output: { fn: "template.default", params: { model: "item", title: "item.title" } }
192
+ */
193
+ function parseCallExpr(raw) {
194
+ const inner = raw.trim().replace(/^\$\{([\s\S]+)\}$/, '$1').trim();
195
+ const atIdx = inner.indexOf('@');
196
+ const fn = (atIdx === -1 ? inner : inner.slice(0, atIdx)).trim();
197
+ const params = {};
198
+ if (atIdx !== -1) {
199
+ const optStr = inner.slice(atIdx + 1);
200
+ const valueRe = /(\w+)\s*=\s*((?:'(?:\\.|[^'\\])*'|"(?:\\.|[^"\\])*"|\$\{(?:[^{}]|\{[^{}]*\})*\}|\[[^\]]*\]|[^,}])+)/g; // NOSONAR -- inherent complexity of HTL value parsing
201
+ for (const m of optStr.matchAll(valueRe)) {
202
+ params[m[1].trim()] = (0, expr_1.convertExpr)(m[2].trim());
203
+ }
204
+ }
205
+ return { fn, params };
206
+ }
207
+ //# sourceMappingURL=directives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/transpiler/directives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Converts a raw HTL expression (with or without ${}) to a JS expression string.
3
+ *
4
+ * Examples:
5
+ * "${items.size > 0}" → "items.length > 0"
6
+ * "'Text' @ i18n" → "'Text'"
7
+ * "${model.title @ context='html'}" → "model.title"
8
+ */
9
+ export declare function convertExpr(raw: string): string;
10
+ interface ExprMatch {
11
+ index: number;
12
+ expr: string;
13
+ end: number;
14
+ }
15
+ /**
16
+ * Extracts all ${...} HTL expressions from a string, correctly handling
17
+ * any depth of nested braces (e.g. '{{url}}' or '{0}/{1}' placeholders).
18
+ */
19
+ export declare function extractExprs(str: string): ExprMatch[];
20
+ /**
21
+ * Converts all ${htlExpr} occurrences within an attribute value string,
22
+ * while escaping literal backticks and bare $ signs.
23
+ */
24
+ export declare function convertAttrValue(value: string): string;
25
+ /**
26
+ * Converts HTL expressions in text node content, escaping everything else
27
+ * for safe embedding in a JS template literal.
28
+ */
29
+ export declare function convertTextContent(text: string): string;
30
+ /**
31
+ * Escapes characters that would break a JS template literal.
32
+ */
33
+ export declare function escapeLiteral(str: string): string;
34
+ export {};
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertExpr = convertExpr;
4
+ exports.extractExprs = extractExprs;
5
+ exports.convertAttrValue = convertAttrValue;
6
+ exports.convertTextContent = convertTextContent;
7
+ exports.escapeLiteral = escapeLiteral;
8
+ /**
9
+ * Converts a raw HTL expression (with or without ${}) to a JS expression string.
10
+ *
11
+ * Examples:
12
+ * "${items.size > 0}" → "items.length > 0"
13
+ * "'Text' @ i18n" → "'Text'"
14
+ * "${model.title @ context='html'}" → "model.title"
15
+ */
16
+ function convertExpr(raw) {
17
+ if (!raw?.trim())
18
+ return raw;
19
+ let inner = raw.trim();
20
+ if (inner.startsWith('${') && inner.endsWith('}')) {
21
+ inner = inner.slice(2, -1).trim();
22
+ }
23
+ const i18nMatch = /^\s*(['"])([^'"]*?)\1\s*@\s*(?:.*,\s*)?i18n\b/.exec(inner);
24
+ inner = inner.replace(// NOSONAR -- intentional single match (anchored at ^)
25
+ /^([\s\S]+?)\s*@\s*join\s*=\s*(?:'([^']*)'|"([^"]*)")/, (_, expr, sepSingle, sepDouble) => {
26
+ const sep = sepSingle ?? sepDouble;
27
+ return `(${expr.trim()}).join('${sep}')`;
28
+ });
29
+ inner = inner.replaceAll(/['"]([^'"]*)['"]\s*@\s*format=\[([^\]]*)\]/g, (_, tmpl, args) => {
30
+ const argList = args.split(',').map(a => a.trim());
31
+ const parts = tmpl.split(/\{(\d+)\}/);
32
+ return parts
33
+ .map((part, i) => (i % 2 === 1 ? argList[Number.parseInt(part)] || "''" : part ? `'${part}'` : null))
34
+ .filter(Boolean)
35
+ .join(' + ') || "''";
36
+ });
37
+ const arrays = [];
38
+ inner = inner.replaceAll(/\[[^\]]*\]/g, m => { arrays.push(m); return `__ARR${arrays.length - 1}__`; });
39
+ const OPT_VAL = String.raw `(?:'[^']*'|"[^"]*"|__ARR\d+__|(?:[^,@}'"\n]|'[^']*'|"[^"]*")+)`;
40
+ inner = inner
41
+ .replaceAll(new RegExp(String.raw `\s*@\s*[\w]+\s*=\s*${OPT_VAL}`, 'g'), '')
42
+ .replaceAll(new RegExp(String.raw `,\s*\w+\s*=\s*${OPT_VAL}`, 'g'), '')
43
+ .replaceAll(/,\s*\w+\b(?!\s*[=.(])/g, '')
44
+ .replaceAll(/\s*@\s*\w+\b/g, '')
45
+ .replaceAll(/\s*@\s*$/g, '')
46
+ .replaceAll(/\.size\b/g, '.length')
47
+ .replaceAll(/(\w+)\.jcr:(\w+)/g, "$1?.['jcr:$2']")
48
+ .trim();
49
+ arrays.forEach((arr, i) => { inner = inner.replace(`__ARR${i}__`, arr); });
50
+ inner = inner.replaceAll(/(\w|\])(?<!\?)\[/g, '$1?.[');
51
+ inner = inner.replaceAll(/(\w|\])\.([\w$])/g, (m, a, b) => /\d/.test(a) && /\d/.test(b) ? m : `${a}?.${b}`);
52
+ inner = inner.replaceAll(/(\S+)\s+in\s+(\S+)/g, (_, left, right) => {
53
+ return `(${right} && ${left} in ${right})`;
54
+ });
55
+ inner = inner.replaceAll(/(?<![?.])\b(class|for)\b/g, '_$1');
56
+ if (i18nMatch) {
57
+ const escapedKey = i18nMatch[2].replaceAll("'", String.raw `\'`);
58
+ inner = "_i18n?.['" + escapedKey + "'] ?? " + inner;
59
+ }
60
+ return inner;
61
+ }
62
+ /**
63
+ * Extracts all ${...} HTL expressions from a string, correctly handling
64
+ * any depth of nested braces (e.g. '{{url}}' or '{0}/{1}' placeholders).
65
+ */
66
+ function extractExprs(str) {
67
+ const results = [];
68
+ let i = 0;
69
+ while (i < str.length) {
70
+ const start = str.indexOf('${', i);
71
+ if (start === -1)
72
+ break;
73
+ let depth = 0;
74
+ let j = start;
75
+ for (; j < str.length; j++) {
76
+ if (str[j] === '{')
77
+ depth++;
78
+ else if (str[j] === '}') {
79
+ depth--;
80
+ if (depth === 0)
81
+ break;
82
+ }
83
+ }
84
+ if (depth === 0) {
85
+ results.push({ index: start, expr: str.slice(start + 2, j), end: j + 1 });
86
+ }
87
+ i = j + 1;
88
+ }
89
+ return results;
90
+ }
91
+ /**
92
+ * Converts all ${htlExpr} occurrences within an attribute value string,
93
+ * while escaping literal backticks and bare $ signs.
94
+ */
95
+ function convertAttrValue(value) {
96
+ const parts = [];
97
+ let last = 0;
98
+ for (const { index, expr, end } of extractExprs(value)) {
99
+ if (index > last)
100
+ parts.push(escapeLiteral(value.slice(last, index)));
101
+ parts.push(`\${_htlAttr(${convertExpr(expr)})}`);
102
+ last = end;
103
+ }
104
+ if (last < value.length)
105
+ parts.push(escapeLiteral(value.slice(last)));
106
+ return parts.join('');
107
+ }
108
+ /**
109
+ * Converts HTL expressions in text node content, escaping everything else
110
+ * for safe embedding in a JS template literal.
111
+ */
112
+ function convertTextContent(text) {
113
+ const parts = [];
114
+ let last = 0;
115
+ for (const { index, expr, end } of extractExprs(text)) {
116
+ if (index > last)
117
+ parts.push(escapeLiteral(text.slice(last, index)));
118
+ parts.push(`\${(${convertExpr(expr)}) ?? ''}`);
119
+ last = end;
120
+ }
121
+ if (last < text.length)
122
+ parts.push(escapeLiteral(text.slice(last)));
123
+ return parts.join('');
124
+ }
125
+ /**
126
+ * Escapes characters that would break a JS template literal.
127
+ */
128
+ function escapeLiteral(str) {
129
+ return str
130
+ .replaceAll('\\', '\\\\')
131
+ .replaceAll('`', String.raw `\``)
132
+ .replaceAll(/\$(?!\{)/g, String.raw `\$`);
133
+ }
134
+ //# sourceMappingURL=expr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expr.js","sourceRoot":"","sources":["../../src/transpiler/expr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ interface TranspileOptions {
2
+ filename?: string;
3
+ omitAttrs?: RegExp[];
4
+ modelTransforms?: Record<string, Record<string, string>>;
5
+ }
6
+ /**
7
+ * Transpiles an HTL source string into a JavaScript module that exports
8
+ * a template function (or multiple named template functions).
9
+ *
10
+ * @param htlSource - Raw HTL file content
11
+ * @param options
12
+ * @returns A valid CJS module source string
13
+ */
14
+ export declare function transpile(htlSource: string, { filename, omitAttrs, modelTransforms }?: TranspileOptions): string;
15
+ export {};