htl-to-js 0.1.3 → 0.2.1
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/README.md +224 -14
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/loader.js.map +1 -1
- package/dist/transpiler/directives.d.ts +1 -0
- package/dist/transpiler/directives.js +39 -11
- package/dist/transpiler/directives.js.map +1 -1
- package/dist/transpiler/expr.js +16 -8
- package/dist/transpiler/expr.js.map +1 -1
- package/dist/transpiler/index.d.ts +10 -1
- package/dist/transpiler/index.js +147 -39
- package/dist/transpiler/index.js.map +1 -1
- package/dist/transpiler/walker.d.ts +4 -2
- package/dist/transpiler/walker.js +107 -24
- package/dist/transpiler/walker.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -126,6 +126,8 @@ The following AEM implicit objects are automatically detected and added as optio
|
|
|
126
126
|
| `model` | `{}` |
|
|
127
127
|
| `_includes` | `{}` |
|
|
128
128
|
| `_i18n` | `{}` |
|
|
129
|
+
| `_wrapperClass` | `''` |
|
|
130
|
+
| `_resourceWrappers` | `{}` |
|
|
129
131
|
| `request` | `{ requestPathInfo: { selectorString: '', suffix: '', resourcePath: '' }, contextPath: '' }` |
|
|
130
132
|
|
|
131
133
|
Variables declared via `data-sly-use.X` are always included as parameters. Any other free variables referenced in directive expressions are also detected and added as parameters with `{}` defaults.
|
|
@@ -417,9 +419,230 @@ config.module.rules.push({
|
|
|
417
419
|
|
|
418
420
|
Pass `omitAttrs: []` to disable filtering entirely.
|
|
419
421
|
|
|
422
|
+
### `wrapperClass`
|
|
423
|
+
|
|
424
|
+
Wraps the component output in a `<div>` with a CSS class, similar to how AEM wraps component markup.
|
|
425
|
+
|
|
426
|
+
| Value | Behavior |
|
|
427
|
+
|---|---|
|
|
428
|
+
| `true` | Auto-derives the class from the parent folder name (e.g. `/apps/mysite/image/image.html` → `"image"`) |
|
|
429
|
+
| `'custom classes'` | Uses the provided string as the class attribute |
|
|
430
|
+
| `false` / omitted | No wrapper (default — backward compatible) |
|
|
431
|
+
|
|
432
|
+
```js
|
|
433
|
+
use: {
|
|
434
|
+
loader: require.resolve('htl-to-js/loader'),
|
|
435
|
+
options: {
|
|
436
|
+
wrapperClass: true,
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
At runtime, the generated function also accepts `_wrapperClass` to append extra classes to the wrapper. This is useful when a parent component (like a responsive grid) needs to inject layout classes into its children:
|
|
442
|
+
|
|
443
|
+
```js
|
|
444
|
+
const html = createColumn({ _wrapperClass: 'aem-GridColumn aem-GridColumn--default--12' });
|
|
445
|
+
// → <div class="column aem-GridColumn aem-GridColumn--default--12">...</div>
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### `resourceWrappers`
|
|
449
|
+
|
|
450
|
+
Object mapping resource keys **or `resourceType` paths** to CSS classes (or configuration objects) that wrap `data-sly-resource` slot output. Mimics the extra wrapper divs that AEM's responsive grid adds around its children.
|
|
451
|
+
|
|
452
|
+
Keys are matched in this order:
|
|
453
|
+
1. **Resource name** — the value in the expression (e.g. `'par'` from `data-sly-resource="${'par' @ ...}"`)
|
|
454
|
+
2. **`resourceType`** — the `@resourceType` option value (e.g. `'mysite/components/responsivegrid'`)
|
|
455
|
+
|
|
456
|
+
**Simple string value** — wraps the slot output in a `<div>` with that class:
|
|
457
|
+
|
|
458
|
+
```js
|
|
459
|
+
options: {
|
|
460
|
+
resourceWrappers: {
|
|
461
|
+
'mysite/components/responsivegrid': 'aem-Grid aem-Grid--12 aem-Grid--default--12',
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
**Object value** — wraps the slot output and injects a class into the first element of each child:
|
|
467
|
+
|
|
468
|
+
```js
|
|
469
|
+
options: {
|
|
470
|
+
resourceWrappers: {
|
|
471
|
+
'mysite/components/responsivegrid': {
|
|
472
|
+
wrapper: 'aem-Grid aem-Grid--12 aem-Grid--default--12',
|
|
473
|
+
childClass: 'aem-GridColumn aem-GridColumn--default--12',
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
- **`wrapper`** — CSS class for the extra `<div>` added around the slot HTML
|
|
480
|
+
- **`childClass`** — CSS class injected into the first element of the child component's output (merges with existing `class` or creates one)
|
|
481
|
+
|
|
482
|
+
At runtime, the `_resourceWrappers` parameter can override or extend the static config.
|
|
483
|
+
|
|
420
484
|
### `modelTransforms`
|
|
421
485
|
|
|
422
|
-
Object mapping use-
|
|
486
|
+
Object mapping `data-sly-use` class-name patterns to property injections. Enables build-time property merging based on the use class. All keys are merged as computed properties into the model variable.
|
|
487
|
+
|
|
488
|
+
**Example — set default model values:**
|
|
489
|
+
|
|
490
|
+
```js
|
|
491
|
+
const modelTransforms = {
|
|
492
|
+
'LayoutContainer': {
|
|
493
|
+
layout: "'RESPONSIVE_GRID'",
|
|
494
|
+
},
|
|
495
|
+
};
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
Any component that uses `data-sly-use.x="com.example.LayoutContainer"` will get `layout` set to `'RESPONSIVE_GRID'` as default (can be overridden at runtime). The value is a JS expression string where `model` is replaced with the actual variable name.
|
|
499
|
+
|
|
500
|
+
**Special key `_includes`** — computes `_includes` slot entries from model data. Unlike regular keys (which are merged into the model object), `_includes` is assigned to the `_includes` parameter directly. Runtime `_includes` take precedence over computed ones.
|
|
501
|
+
|
|
502
|
+
```js
|
|
503
|
+
const modelTransforms = {
|
|
504
|
+
'ColumnModel': {
|
|
505
|
+
_includes: "Object.fromEntries((model.columns || []).map((col, i) => [col.path, () => (model._content || [])[i] || '']))",
|
|
506
|
+
},
|
|
507
|
+
};
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
This is the only special key — it belongs in `modelTransforms` because the value is computed from the model data, unlike `resourceWrappers` or `wrapperClass` which are static configuration.
|
|
511
|
+
|
|
512
|
+
### `fileOverrides`
|
|
513
|
+
|
|
514
|
+
Object mapping HTL file names to expression strings (or configuration objects) that replace `data-sly-use.X="file.html"` + `data-sly-call` references. Useful for replacing AEM template files (like `responsiveGrid.html`) that don't exist in your Storybook build.
|
|
515
|
+
|
|
516
|
+
**Simple string value** — replaces the `require()` call with the provided expression:
|
|
517
|
+
|
|
518
|
+
```js
|
|
519
|
+
options: {
|
|
520
|
+
fileOverrides: {
|
|
521
|
+
'responsiveGrid.html': "{ responsiveGrid: ({ container, _includes }) => _includes?.content?.() ?? '' }",
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
**Object value with `resourceType`** — additionally wraps the `data-sly-call` output with the matching `resourceWrappers` config:
|
|
527
|
+
|
|
528
|
+
```js
|
|
529
|
+
options: {
|
|
530
|
+
resourceWrappers: {
|
|
531
|
+
'mysite/components/responsivegrid': {
|
|
532
|
+
wrapper: 'aem-Grid aem-Grid--12 aem-Grid--default--12',
|
|
533
|
+
childClass: 'aem-GridColumn aem-GridColumn--default--12',
|
|
534
|
+
},
|
|
535
|
+
},
|
|
536
|
+
fileOverrides: {
|
|
537
|
+
'responsiveGrid.html': {
|
|
538
|
+
expression: "{ responsiveGrid: ({ container, _includes }) => _includes?.content?.() ?? '' }",
|
|
539
|
+
resourceType: 'mysite/components/responsivegrid',
|
|
540
|
+
},
|
|
541
|
+
},
|
|
542
|
+
}
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
The `resourceType` links the file override to a `resourceWrappers` entry. The transpiler wraps the call output with `_wrapResource()`, applying the grid wrapper and `childClass` automatically — the same helper used for `data-sly-resource`.
|
|
546
|
+
|
|
547
|
+
When the transpiler encounters `data-sly-use.tpl="responsiveGrid.html"`, instead of generating a `require()` call, it uses the provided value as the default for the `tpl` parameter. The `data-sly-call="${tpl.responsiveGrid @ ...}"` then calls the function directly.
|
|
548
|
+
|
|
549
|
+
The override can be replaced at runtime by passing a different value for the parameter:
|
|
550
|
+
|
|
551
|
+
```js
|
|
552
|
+
// Use default from fileOverrides
|
|
553
|
+
const html = createContainer();
|
|
554
|
+
|
|
555
|
+
// Override at runtime
|
|
556
|
+
const html = createContainer({
|
|
557
|
+
responsiveGridTemplate: { responsiveGrid: myCustomFn },
|
|
558
|
+
});
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
---
|
|
562
|
+
|
|
563
|
+
## AEM component composition example
|
|
564
|
+
|
|
565
|
+
Combining `wrapperClass`, `resourceWrappers`, `modelTransforms`, and `fileOverrides` reproduces AEM's full component nesting structure.
|
|
566
|
+
|
|
567
|
+
**Config (shared across all components):**
|
|
568
|
+
|
|
569
|
+
```js
|
|
570
|
+
const options = {
|
|
571
|
+
wrapperClass: true,
|
|
572
|
+
resourceWrappers: {
|
|
573
|
+
'mysite/components/responsivegrid': {
|
|
574
|
+
wrapper: 'aem-Grid aem-Grid--12 aem-Grid--default--12',
|
|
575
|
+
childClass: 'aem-GridColumn aem-GridColumn--default--12',
|
|
576
|
+
},
|
|
577
|
+
},
|
|
578
|
+
modelTransforms: {
|
|
579
|
+
'LayoutContainer': {
|
|
580
|
+
layout: "'RESPONSIVE_GRID'",
|
|
581
|
+
},
|
|
582
|
+
},
|
|
583
|
+
fileOverrides: {
|
|
584
|
+
'responsiveGrid.html': {
|
|
585
|
+
expression: "{ responsiveGrid: ({ container, _includes }) => _includes?.content?.() ?? '' }",
|
|
586
|
+
resourceType: 'mysite/components/responsivegrid',
|
|
587
|
+
},
|
|
588
|
+
},
|
|
589
|
+
};
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
**Container HTL:**
|
|
593
|
+
|
|
594
|
+
```html
|
|
595
|
+
<sly data-sly-use.container="com.adobe.cq.wcm.core.components.models.LayoutContainer">
|
|
596
|
+
<sly data-sly-test.responsive="${container.layout == 'RESPONSIVE_GRID'}"
|
|
597
|
+
data-sly-use.responsiveGridTemplate="responsiveGrid.html"
|
|
598
|
+
data-sly-call="${responsiveGridTemplate.responsiveGrid @ container=container}"></sly>
|
|
599
|
+
<sly data-sly-test="${!responsive}"
|
|
600
|
+
data-sly-use.simpleTemplate="simple.html"
|
|
601
|
+
data-sly-call="${simpleTemplate.simple @ container=container}"></sly>
|
|
602
|
+
</sly>
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
**Column HTL:**
|
|
606
|
+
|
|
607
|
+
```html
|
|
608
|
+
<div class="cmp-column">Sample Text</div>
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
**Story:**
|
|
612
|
+
|
|
613
|
+
```js
|
|
614
|
+
import { createContainer } from '../container/container.html';
|
|
615
|
+
import { createColumn } from '../column/column.html';
|
|
616
|
+
|
|
617
|
+
export const Default = {
|
|
618
|
+
render: () => createContainer({
|
|
619
|
+
_includes: {
|
|
620
|
+
content: () => createColumn(),
|
|
621
|
+
},
|
|
622
|
+
}),
|
|
623
|
+
};
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
**Rendered HTML:**
|
|
627
|
+
|
|
628
|
+
```html
|
|
629
|
+
<div class="container"> <!-- wrapperClass -->
|
|
630
|
+
<div class="aem-Grid aem-Grid--12 aem-Grid--default--12"> <!-- resourceWrappers.wrapper via fileOverrides.resourceType -->
|
|
631
|
+
<div class="cmp-column aem-GridColumn aem-GridColumn--default--12"> <!-- resourceWrappers.childClass -->
|
|
632
|
+
Sample Text
|
|
633
|
+
</div>
|
|
634
|
+
</div>
|
|
635
|
+
</div>
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
Each option has a single responsibility:
|
|
639
|
+
|
|
640
|
+
| Option | Responsibility |
|
|
641
|
+
|---|---|
|
|
642
|
+
| `wrapperClass` | Component wrapper `<div>` with CSS class |
|
|
643
|
+
| `resourceWrappers` | Wraps output with grid/column divs (used by both `data-sly-resource` and `fileOverrides` with `resourceType`) |
|
|
644
|
+
| `modelTransforms` | Model property defaults (e.g. `layout: 'RESPONSIVE_GRID'`) |
|
|
645
|
+
| `fileOverrides` | Replaces `data-sly-use="file.html"` with JS functions; `resourceType` links to `resourceWrappers` |
|
|
423
646
|
|
|
424
647
|
---
|
|
425
648
|
|
|
@@ -471,19 +694,6 @@ card/default.html → card/default.template.js
|
|
|
471
694
|
|
|
472
695
|
---
|
|
473
696
|
|
|
474
|
-
## Development
|
|
475
|
-
|
|
476
|
-
Written in TypeScript. Source in `src/`, compiled to `dist/`.
|
|
477
|
-
|
|
478
|
-
```bash
|
|
479
|
-
npm run build # compile TypeScript
|
|
480
|
-
npm test # run 111 Jest tests
|
|
481
|
-
npm run test:watch # watch mode
|
|
482
|
-
npm run test:coverage # with coverage
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
---
|
|
486
|
-
|
|
487
697
|
## License
|
|
488
698
|
|
|
489
699
|
[MIT](./LICENSE)
|
package/dist/cli.js
CHANGED
|
@@ -25,7 +25,7 @@ Examples:
|
|
|
25
25
|
process.exit(0);
|
|
26
26
|
}
|
|
27
27
|
const watchMode = args.includes('--watch') || args.includes('-w');
|
|
28
|
-
const patternArg = args.find(a => !a.startsWith('-'));
|
|
28
|
+
const patternArg = args.find((a) => !a.startsWith('-'));
|
|
29
29
|
if (!patternArg) {
|
|
30
30
|
console.error('Error: no glob pattern provided.');
|
|
31
31
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,8CAA+C;AAC/C,+BAA4B;AAC5B,sDAAyB;AACzB,0DAA6B;AAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;CAWb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":";AAAA,8CAA+C;AAE/C;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,SAAS,CAAY,MAAc;IAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzD,IAAI,CAAC;QACH,OAAO,IAAA,iBAAS,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":";AAAA,8CAA+C;AAE/C;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,SAAS,CAAY,MAAc;IAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzD,IAAI,CAAC;QACH,OAAO,IAAA,iBAAS,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,CACZ,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,YAAY,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAC9D,CAAC;QACF,OAAO,sBAAsB,CAAC;IAChC,CAAC;AACH,CAAC;AAED,iBAAS,SAAS,CAAC"}
|
|
@@ -49,7 +49,7 @@ function parseUseDefault(val) {
|
|
|
49
49
|
const atIdx = val.indexOf('@');
|
|
50
50
|
if (atIdx === -1)
|
|
51
51
|
return null;
|
|
52
|
-
const vals = [...val.slice(atIdx + 1).matchAll(/\w+\s*=\s*(\w+)/g)].map(m => m[1]);
|
|
52
|
+
const vals = [...val.slice(atIdx + 1).matchAll(/\w+\s*=\s*(\w+)/g)].map((m) => m[1]);
|
|
53
53
|
return vals.length ? `{ ${vals.join(', ')} }` : null;
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
@@ -68,6 +68,7 @@ function parseDirectives(attrs, sourceDir = '') {
|
|
|
68
68
|
sets: [],
|
|
69
69
|
text: null,
|
|
70
70
|
resource: null,
|
|
71
|
+
resourceType: null,
|
|
71
72
|
template: null,
|
|
72
73
|
call: null,
|
|
73
74
|
include: null,
|
|
@@ -99,19 +100,31 @@ function parseDirectives(attrs, sourceDir = '') {
|
|
|
99
100
|
const testVarMatch = /^data-sly-test\.(\w+)$/.exec(key);
|
|
100
101
|
if (testVarMatch) {
|
|
101
102
|
const varName = testVarMatch[1];
|
|
102
|
-
directives.sets.push({
|
|
103
|
+
directives.sets.push({
|
|
104
|
+
name: varName,
|
|
105
|
+
expr: (0, expr_1.convertExpr)(val),
|
|
106
|
+
raw: true,
|
|
107
|
+
});
|
|
103
108
|
directives.test = varName;
|
|
104
109
|
directives.skip.add(key);
|
|
105
110
|
continue;
|
|
106
111
|
}
|
|
107
112
|
const repeatMatch = /^data-sly-(?:repeat|list)\.(\w+)$/.exec(key);
|
|
108
113
|
if (repeatMatch) {
|
|
109
|
-
directives.repeat = {
|
|
114
|
+
directives.repeat = {
|
|
115
|
+
varName: repeatMatch[1],
|
|
116
|
+
listExpr: (0, expr_1.convertExpr)(val),
|
|
117
|
+
listMode: key.startsWith('data-sly-list.'),
|
|
118
|
+
};
|
|
110
119
|
directives.skip.add(key);
|
|
111
120
|
continue;
|
|
112
121
|
}
|
|
113
122
|
if (key === 'data-sly-list' || key === 'data-sly-repeat') {
|
|
114
|
-
directives.repeat = {
|
|
123
|
+
directives.repeat = {
|
|
124
|
+
varName: 'item',
|
|
125
|
+
listExpr: (0, expr_1.convertExpr)(val),
|
|
126
|
+
listMode: key === 'data-sly-list',
|
|
127
|
+
};
|
|
115
128
|
directives.skip.add(key);
|
|
116
129
|
continue;
|
|
117
130
|
}
|
|
@@ -147,13 +160,16 @@ function parseDirectives(attrs, sourceDir = '') {
|
|
|
147
160
|
if (pathMatch)
|
|
148
161
|
resource = (0, expr_1.convertExpr)('${' + pathMatch[1] + '}');
|
|
149
162
|
}
|
|
163
|
+
const rtMatch = /@\s*resourceType\s*=\s*['"]([^'"]+)['"]/.exec(val);
|
|
164
|
+
if (rtMatch)
|
|
165
|
+
directives.resourceType = rtMatch[1];
|
|
150
166
|
directives.resource = resource;
|
|
151
167
|
directives.skip.add(key);
|
|
152
168
|
continue;
|
|
153
169
|
}
|
|
154
170
|
const templateMatch = /^data-sly-template\.(\w+)$/.exec(key);
|
|
155
171
|
if (templateMatch) {
|
|
156
|
-
const params = [...val.matchAll(/@\s*(\w+)/g)].map(m => m[1]);
|
|
172
|
+
const params = [...val.matchAll(/@\s*(\w+)/g)].map((m) => m[1]);
|
|
157
173
|
directives.template = { name: templateMatch[1], params };
|
|
158
174
|
directives.skip.add(key);
|
|
159
175
|
continue;
|
|
@@ -166,24 +182,33 @@ function parseDirectives(attrs, sourceDir = '') {
|
|
|
166
182
|
const exprs = (0, expr_1.extractExprs)(t);
|
|
167
183
|
const isPureExpr = exprs.length === 1 && exprs[0].index === 0 && exprs[0].end === t.length;
|
|
168
184
|
if (isPureExpr) {
|
|
169
|
-
directives.dynamicAttrs.push({
|
|
185
|
+
directives.dynamicAttrs.push({
|
|
186
|
+
name: attrName,
|
|
187
|
+
expr: (0, expr_1.convertExpr)(val),
|
|
188
|
+
});
|
|
170
189
|
}
|
|
171
190
|
else if (exprs.length > 0) {
|
|
172
191
|
const parts = [];
|
|
173
192
|
let last = 0;
|
|
174
193
|
for (const { index, expr: e, end } of exprs) {
|
|
175
194
|
if (index > last)
|
|
176
|
-
parts.push(t.slice(last, index).replaceAll(
|
|
195
|
+
parts.push(t.slice(last, index).replaceAll('`', '\\`'));
|
|
177
196
|
parts.push(`\${${(0, expr_1.convertExpr)(e)}}`);
|
|
178
197
|
last = end;
|
|
179
198
|
}
|
|
180
199
|
if (last < t.length)
|
|
181
|
-
parts.push(t.slice(last).replaceAll(
|
|
182
|
-
directives.dynamicAttrs.push({
|
|
200
|
+
parts.push(t.slice(last).replaceAll('`', '\\`'));
|
|
201
|
+
directives.dynamicAttrs.push({
|
|
202
|
+
name: attrName,
|
|
203
|
+
expr: '`' + parts.join('') + '`',
|
|
204
|
+
});
|
|
183
205
|
}
|
|
184
206
|
else {
|
|
185
207
|
const escaped = t.replaceAll("'", String.raw `\'`);
|
|
186
|
-
directives.dynamicAttrs.push({
|
|
208
|
+
directives.dynamicAttrs.push({
|
|
209
|
+
name: attrName,
|
|
210
|
+
expr: "'" + escaped + "'",
|
|
211
|
+
});
|
|
187
212
|
}
|
|
188
213
|
directives.skip.add(key);
|
|
189
214
|
directives.skip.add(attrName);
|
|
@@ -213,7 +238,10 @@ function parseDirectives(attrs, sourceDir = '') {
|
|
|
213
238
|
* Output: { fn: "template.default", params: { model: "item", title: "item.title" } }
|
|
214
239
|
*/
|
|
215
240
|
function parseCallExpr(raw) {
|
|
216
|
-
const inner = raw
|
|
241
|
+
const inner = raw
|
|
242
|
+
.trim()
|
|
243
|
+
.replace(/^\$\{([\s\S]+)\}$/, '$1')
|
|
244
|
+
.trim();
|
|
217
245
|
const atIdx = inner.indexOf('@');
|
|
218
246
|
const fn = (atIdx === -1 ? inner : inner.slice(0, atIdx)).trim();
|
|
219
247
|
const params = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/transpiler/directives.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/transpiler/directives.ts"],"names":[],"mappings":"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"}
|
package/dist/transpiler/expr.js
CHANGED
|
@@ -21,21 +21,27 @@ function convertExpr(raw) {
|
|
|
21
21
|
inner = inner.slice(2, -1).trim();
|
|
22
22
|
}
|
|
23
23
|
const i18nMatch = /^\s*(['"])([^'"]*?)\1\s*@\s*(?:.*,\s*)?i18n\b/.exec(inner);
|
|
24
|
-
inner = inner.replace(
|
|
25
|
-
/^([\s\S]+?)\s*@\s*join\s*=\s*(?:'([^']*)'|"([^"]*)")/, (_, expr, sepSingle, sepDouble) => {
|
|
24
|
+
inner = inner.replace(/^([\s\S]+?)\s*@\s*join\s*=\s*(?:'([^']*)'|"([^"]*)")/, (_, expr, sepSingle, sepDouble) => {
|
|
26
25
|
const sep = sepSingle ?? sepDouble;
|
|
27
26
|
return `(${expr.trim()}).join('${sep}')`;
|
|
28
27
|
});
|
|
29
28
|
inner = inner.replaceAll(/['"]([^'"]*)['"]\s*@\s*format=\[([^\]]*)\]/g, (_, tmpl, args) => {
|
|
30
|
-
const argList = args.split(',').map(a => a.trim());
|
|
29
|
+
const argList = args.split(',').map((a) => a.trim());
|
|
31
30
|
const parts = tmpl.split(/\{(\d+)\}/);
|
|
32
|
-
return parts
|
|
33
|
-
.map((part, i) =>
|
|
31
|
+
return (parts
|
|
32
|
+
.map((part, i) => i % 2 === 1
|
|
33
|
+
? argList[Number.parseInt(part)] || "''"
|
|
34
|
+
: part
|
|
35
|
+
? `'${part}'`
|
|
36
|
+
: null)
|
|
34
37
|
.filter(Boolean)
|
|
35
|
-
.join(' + ') || "''";
|
|
38
|
+
.join(' + ') || "''");
|
|
36
39
|
});
|
|
37
40
|
const arrays = [];
|
|
38
|
-
inner = inner.replaceAll(/\[[^\]]*\]/g,
|
|
41
|
+
inner = inner.replaceAll(/\[[^\]]*\]/g, (m) => {
|
|
42
|
+
arrays.push(m);
|
|
43
|
+
return `__ARR${arrays.length - 1}__`;
|
|
44
|
+
});
|
|
39
45
|
const OPT_VAL = String.raw `(?:'[^']*'|"[^"]*"|__ARR\d+__|(?:[^,@}'"\n]|'[^']*'|"[^"]*")+)`;
|
|
40
46
|
inner = inner
|
|
41
47
|
.replaceAll(new RegExp(String.raw `\s*@\s*[\w]+\s*=\s*${OPT_VAL}`, 'g'), '')
|
|
@@ -46,7 +52,9 @@ function convertExpr(raw) {
|
|
|
46
52
|
.replaceAll(/\.size\b/g, '.length')
|
|
47
53
|
.replaceAll(/(\w+)\.jcr:(\w+)/g, "$1?.['jcr:$2']")
|
|
48
54
|
.trim();
|
|
49
|
-
arrays.forEach((arr, i) => {
|
|
55
|
+
arrays.forEach((arr, i) => {
|
|
56
|
+
inner = inner.replace(`__ARR${i}__`, arr);
|
|
57
|
+
});
|
|
50
58
|
inner = inner.replaceAll(/(\w|\])(?<!\?)\[/g, '$1?.[');
|
|
51
59
|
inner = inner.replaceAll(/(\w|\])\.(?=([\w$]))/g, (m, a, b) => /\d/.test(a) && /\d/.test(b) ? m : `${a}?.`);
|
|
52
60
|
inner = inner.replaceAll(/([\w$.?[\]]+)\s+in\s+([\w$.?[\]]+)/g, (_match, left, right) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expr.js","sourceRoot":"","sources":["../../src/transpiler/expr.ts"],"names":[],"mappings":";;AAQA,
|
|
1
|
+
{"version":3,"file":"expr.js","sourceRoot":"","sources":["../../src/transpiler/expr.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,15 @@ interface TranspileOptions {
|
|
|
2
2
|
filename?: string;
|
|
3
3
|
omitAttrs?: RegExp[];
|
|
4
4
|
modelTransforms?: Record<string, Record<string, string>>;
|
|
5
|
+
wrapperClass?: string | boolean;
|
|
6
|
+
resourceWrappers?: Record<string, string | {
|
|
7
|
+
wrapper?: string;
|
|
8
|
+
childClass?: string;
|
|
9
|
+
}>;
|
|
10
|
+
fileOverrides?: Record<string, string | {
|
|
11
|
+
expression: string;
|
|
12
|
+
resourceType: string;
|
|
13
|
+
}>;
|
|
5
14
|
}
|
|
6
15
|
/**
|
|
7
16
|
* Transpiles an HTL source string into a JavaScript module that exports
|
|
@@ -11,5 +20,5 @@ interface TranspileOptions {
|
|
|
11
20
|
* @param options
|
|
12
21
|
* @returns A valid CJS module source string
|
|
13
22
|
*/
|
|
14
|
-
export declare function transpile(htlSource: string, { filename, omitAttrs, modelTransforms }?: TranspileOptions): string;
|
|
23
|
+
export declare function transpile(htlSource: string, { filename, omitAttrs, modelTransforms, wrapperClass, resourceWrappers, fileOverrides, }?: TranspileOptions): string;
|
|
15
24
|
export {};
|