@barefootjs/xslate 0.8.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.
- package/dist/adapter/boolean-result.d.ts +42 -0
- package/dist/adapter/boolean-result.d.ts.map +1 -0
- package/dist/adapter/index.d.ts +6 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +1204 -0
- package/dist/adapter/xslate-adapter.d.ts +176 -0
- package/dist/adapter/xslate-adapter.d.ts.map +1 -0
- package/dist/build.d.ts +28 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +1224 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1204 -0
- package/lib/BarefootJS/Backend/Xslate.pm +152 -0
- package/package.json +82 -0
- package/src/__tests__/xslate-counter.test.ts +142 -0
- package/src/adapter/boolean-result.ts +126 -0
- package/src/adapter/index.ts +6 -0
- package/src/adapter/xslate-adapter.ts +1721 -0
- package/src/build.ts +37 -0
- package/src/index.ts +8 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BarefootJS Text::Xslate (Kolon) Template Adapter
|
|
3
|
+
*
|
|
4
|
+
* Generates Text::Xslate Kolon template files (.tx) from BarefootJS IR.
|
|
5
|
+
*
|
|
6
|
+
* Near-mechanical port of the Mojolicious EP adapter
|
|
7
|
+
* (packages/adapter-mojolicious/src/adapter/mojo-adapter.ts) from Mojo EP
|
|
8
|
+
* syntax to Kolon syntax. The expression-lowering pipeline (JS → Perl
|
|
9
|
+
* scalars / `$bf.helper(...)` calls) is shared in spirit with the Mojo
|
|
10
|
+
* adapter; only the surrounding template syntax differs:
|
|
11
|
+
*
|
|
12
|
+
* Mojo `<%= EXPR %>` → Kolon `<: EXPR :>` (HTML-escaped)
|
|
13
|
+
* Mojo `<%== EXPR %>` → Kolon `<: EXPR | mark_raw :>` (raw)
|
|
14
|
+
* Mojo `bf->method(args)` → Kolon `$bf.method(args)`
|
|
15
|
+
* Mojo `% if (C) { ... % }` → Kolon `: if (C) { ... : }` (line statements)
|
|
16
|
+
* Mojo `% for ... { ... % }`→ Kolon `: for $arr -> $x { ... : }`
|
|
17
|
+
*
|
|
18
|
+
* Kolon auto-escapes `<: ... :>` interpolations (the backend builds the
|
|
19
|
+
* engine with `type => 'html'`); helpers that emit markup are piped through
|
|
20
|
+
* `| mark_raw` so they survive verbatim — mirroring Mojo EP's `<%==` vs `<%=`.
|
|
21
|
+
*/
|
|
22
|
+
import type { ComponentIR, IRNode, IRElement, IRText, IRExpression, IRConditional, IRLoop, IRComponent, IRFragment, IRSlot, IRIfStatement, IRProvider, IRAsync, TemplatePrimitiveRegistry } from '@barefootjs/jsx';
|
|
23
|
+
import { BaseAdapter, type AdapterOutput, type AdapterGenerateOptions, type IRNodeEmitter, type EmitIRNode } from '@barefootjs/jsx';
|
|
24
|
+
/**
|
|
25
|
+
* Xslate adapter's IRNode render context. Like the Mojo adapter, Kolon's
|
|
26
|
+
* lowering doesn't consume any render-position flags, so the Ctx is empty.
|
|
27
|
+
* Kept as a named alias so future flags can extend it without changing the
|
|
28
|
+
* `IRNodeEmitter` interface.
|
|
29
|
+
*/
|
|
30
|
+
type XslateRenderCtx = Record<string, never>;
|
|
31
|
+
import type { ParsedExpr } from '@barefootjs/jsx';
|
|
32
|
+
export interface XslateAdapterOptions {
|
|
33
|
+
/** Base path for client JS files (default: '/static/components/') */
|
|
34
|
+
clientJsBasePath?: string;
|
|
35
|
+
/** Path to barefoot.js runtime (default: '/static/components/barefoot.js') */
|
|
36
|
+
barefootJsPath?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare class XslateAdapter extends BaseAdapter implements IRNodeEmitter<XslateRenderCtx> {
|
|
39
|
+
name: string;
|
|
40
|
+
extension: string;
|
|
41
|
+
templatesPerComponent: boolean;
|
|
42
|
+
importMapInjection: 'html-snippet';
|
|
43
|
+
/**
|
|
44
|
+
* Identifier-path callees the Xslate runtime can render in template scope.
|
|
45
|
+
* The relocate pass consults this map to mark matching calls as
|
|
46
|
+
* template-safe; the SSR template emitter substitutes the JS call with the
|
|
47
|
+
* registered `$bf.NAME(...)` helper invocation.
|
|
48
|
+
*/
|
|
49
|
+
templatePrimitives: TemplatePrimitiveRegistry;
|
|
50
|
+
private componentName;
|
|
51
|
+
private options;
|
|
52
|
+
private errors;
|
|
53
|
+
private inLoop;
|
|
54
|
+
/**
|
|
55
|
+
* SolidJS-style props identifier (`function(props: P)`) and the
|
|
56
|
+
* analyzer-extracted prop names. Stashed at `generate()` entry so the
|
|
57
|
+
* per-attribute `emitSpread` callback can build a propsObject spread bag as
|
|
58
|
+
* an inline Kolon hashref literal without re-walking the IR.
|
|
59
|
+
*/
|
|
60
|
+
private propsObjectName;
|
|
61
|
+
private propsParams;
|
|
62
|
+
/**
|
|
63
|
+
* Names (signal getters + props) whose value is a string, so `===`/`!==`
|
|
64
|
+
* against them lowers to Perl `eq`/`ne` rather than numeric `==`/`!=`.
|
|
65
|
+
* Kolon comparison operators delegate to Perl semantics, so the same
|
|
66
|
+
* string-vs-numeric distinction the Mojo adapter makes applies here.
|
|
67
|
+
*/
|
|
68
|
+
private stringValueNames;
|
|
69
|
+
constructor(options?: XslateAdapterOptions);
|
|
70
|
+
generate(ir: ComponentIR, options?: AdapterGenerateOptions): AdapterOutput;
|
|
71
|
+
private generateScriptRegistrations;
|
|
72
|
+
private hasClientInteractivity;
|
|
73
|
+
/**
|
|
74
|
+
* Public entry point for node rendering. Delegates to the shared
|
|
75
|
+
* `IRNodeEmitter` dispatcher; per-kind logic lives in the `IRNodeEmitter`
|
|
76
|
+
* methods below.
|
|
77
|
+
*/
|
|
78
|
+
renderNode(node: IRNode): string;
|
|
79
|
+
emitElement(node: IRElement, _ctx: XslateRenderCtx, _emit: EmitIRNode<XslateRenderCtx>): string;
|
|
80
|
+
emitText(node: IRText): string;
|
|
81
|
+
emitExpression(node: IRExpression): string;
|
|
82
|
+
emitConditional(node: IRConditional, _ctx: XslateRenderCtx, _emit: EmitIRNode<XslateRenderCtx>): string;
|
|
83
|
+
emitLoop(node: IRLoop, _ctx: XslateRenderCtx, _emit: EmitIRNode<XslateRenderCtx>): string;
|
|
84
|
+
emitComponent(node: IRComponent, _ctx: XslateRenderCtx, _emit: EmitIRNode<XslateRenderCtx>): string;
|
|
85
|
+
emitFragment(node: IRFragment, _ctx: XslateRenderCtx, _emit: EmitIRNode<XslateRenderCtx>): string;
|
|
86
|
+
emitSlot(node: IRSlot): string;
|
|
87
|
+
emitIfStatement(node: IRIfStatement, _ctx: XslateRenderCtx, _emit: EmitIRNode<XslateRenderCtx>): string;
|
|
88
|
+
emitProvider(node: IRProvider, _ctx: XslateRenderCtx, _emit: EmitIRNode<XslateRenderCtx>): string;
|
|
89
|
+
emitAsync(node: IRAsync, _ctx: XslateRenderCtx, _emit: EmitIRNode<XslateRenderCtx>): string;
|
|
90
|
+
renderElement(element: IRElement): string;
|
|
91
|
+
renderExpression(expr: IRExpression): string;
|
|
92
|
+
renderConditional(cond: IRConditional): string;
|
|
93
|
+
private renderNodeOrNull;
|
|
94
|
+
/**
|
|
95
|
+
* Add bf-c attribute to the first HTML element in a branch.
|
|
96
|
+
* If no element found, wrap with comment markers.
|
|
97
|
+
*/
|
|
98
|
+
private addCondMarkerToFirstElement;
|
|
99
|
+
/**
|
|
100
|
+
* Push a `BF103` diagnostic for every component reference inside a loop body
|
|
101
|
+
* whose name is imported from a relative-path module. Mirror of the Mojo
|
|
102
|
+
* adapter's check — the Xslate adapter has the same cross-template-
|
|
103
|
+
* registration constraint at request time.
|
|
104
|
+
*/
|
|
105
|
+
private checkImportedLoopChildComponents;
|
|
106
|
+
renderLoop(loop: IRLoop): string;
|
|
107
|
+
/**
|
|
108
|
+
* AttrValue lowering for component invocation props (Kolon hashref-entry
|
|
109
|
+
* form). Kolon CANNOT splat a hash into positional args, so every prop is
|
|
110
|
+
* emitted as a `key => value` entry that the caller collects into ONE
|
|
111
|
+
* hashref literal passed to `$bf.render_child(name, { ... })`.
|
|
112
|
+
*
|
|
113
|
+
* `jsx-children` returns empty — children are captured via a Kolon macro
|
|
114
|
+
* below, not threaded through the hashref entry list.
|
|
115
|
+
*/
|
|
116
|
+
private readonly componentPropEmitter;
|
|
117
|
+
renderComponent(comp: IRComponent): string;
|
|
118
|
+
private childrenCaptureCounter;
|
|
119
|
+
private toTemplateName;
|
|
120
|
+
private renderIfStatement;
|
|
121
|
+
private renderFragment;
|
|
122
|
+
private renderSlot;
|
|
123
|
+
renderAsync(node: IRAsync): string;
|
|
124
|
+
/**
|
|
125
|
+
* AttrValue lowering for intrinsic-element attributes (Kolon).
|
|
126
|
+
*/
|
|
127
|
+
private readonly elementAttrEmitter;
|
|
128
|
+
private renderAttributes;
|
|
129
|
+
renderScopeMarker(_instanceIdExpr: string): string;
|
|
130
|
+
renderSlotMarker(slotId: string): string;
|
|
131
|
+
renderCondMarker(condId: string): string;
|
|
132
|
+
/**
|
|
133
|
+
* Convert a ParsedExpr AST to a Kolon expression string for filter
|
|
134
|
+
* predicates. Wraps the shared ParsedExpr dispatcher with an
|
|
135
|
+
* `XslateFilterEmitter` carrying the predicate's loop param and any
|
|
136
|
+
* block-body local var aliases.
|
|
137
|
+
*/
|
|
138
|
+
private renderKolonFilterExpr;
|
|
139
|
+
/**
|
|
140
|
+
* Render a complex block body filter into a Kolon condition.
|
|
141
|
+
* Handles patterns like: filter(t => { const f = filter(); if (...) return ...; })
|
|
142
|
+
*/
|
|
143
|
+
private renderBlockBodyCondition;
|
|
144
|
+
private collectReturnPaths;
|
|
145
|
+
private buildSinglePathCondition;
|
|
146
|
+
private renderConditionsAnd;
|
|
147
|
+
private convertTemplateLiteralPartsToKolon;
|
|
148
|
+
/**
|
|
149
|
+
* Translate `${EXPR}` interpolations in a static template-part string into
|
|
150
|
+
* Kolon variable references and concatenate them with the surrounding
|
|
151
|
+
* literal text.
|
|
152
|
+
*/
|
|
153
|
+
private substituteJsInterpolationsToKolon;
|
|
154
|
+
/**
|
|
155
|
+
* Refuse JS expression shapes that have no idiomatic Kolon representation:
|
|
156
|
+
* object literals (`style={{...}}`) and tagged-template-literal call
|
|
157
|
+
* expressions (`cn\`base \${tone()}\``). Records `BF101`. Returns `true`
|
|
158
|
+
* when the shape was rejected (caller should drop the attribute).
|
|
159
|
+
*/
|
|
160
|
+
private refuseUnsupportedAttrExpression;
|
|
161
|
+
private convertExpressionToKolon;
|
|
162
|
+
/**
|
|
163
|
+
* Render a full ParsedExpr tree to Kolon for top-level (non-filter)
|
|
164
|
+
* expressions where identifiers are signals / template vars.
|
|
165
|
+
*/
|
|
166
|
+
private renderParsedExprToKolon;
|
|
167
|
+
/** Whether `name` (a signal getter or prop) holds a string value, so an
|
|
168
|
+
* equality comparison against it should use Perl `eq`/`ne`. */
|
|
169
|
+
_isStringValueName(name: string): boolean;
|
|
170
|
+
_recordExprBF101(message: string, reason?: string): void;
|
|
171
|
+
/** Internal hook for higher-order: predicate body re-uses the filter emitter. */
|
|
172
|
+
_renderKolonFilterExprPublic(expr: ParsedExpr, param: string): string;
|
|
173
|
+
}
|
|
174
|
+
export declare const xslateAdapter: XslateAdapter;
|
|
175
|
+
export {};
|
|
176
|
+
//# sourceMappingURL=xslate-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xslate-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/xslate-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/build.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { BuildOptions } from '@barefootjs/jsx';
|
|
2
|
+
import { XslateAdapter } from './adapter';
|
|
3
|
+
import type { XslateAdapterOptions } from './adapter';
|
|
4
|
+
export interface XslateBuildOptions extends BuildOptions {
|
|
5
|
+
/** Adapter-specific options passed to XslateAdapter */
|
|
6
|
+
adapterOptions?: XslateAdapterOptions;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create a BarefootBuildConfig for Text::Xslate (Kolon) template projects.
|
|
10
|
+
*
|
|
11
|
+
* Uses structural typing — does not import BarefootBuildConfig to avoid a
|
|
12
|
+
* circular dependency between @barefootjs/xslate and @barefootjs/cli.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createConfig(options?: XslateBuildOptions): {
|
|
15
|
+
adapter: XslateAdapter;
|
|
16
|
+
paths: import("@barefootjs/jsx").BarefootPaths | undefined;
|
|
17
|
+
components: string[] | undefined;
|
|
18
|
+
outDir: string | undefined;
|
|
19
|
+
minify: boolean | undefined;
|
|
20
|
+
contentHash: boolean | undefined;
|
|
21
|
+
externals: Record<string, import("@barefootjs/jsx").ExternalSpec> | undefined;
|
|
22
|
+
externalsBasePath: string | undefined;
|
|
23
|
+
bundleEntries: import("@barefootjs/jsx").BundleEntry[] | undefined;
|
|
24
|
+
localImportPrefixes: string[] | undefined;
|
|
25
|
+
outputLayout: import("@barefootjs/jsx").OutputLayout;
|
|
26
|
+
postBuild: ((ctx: import("@barefootjs/jsx").PostBuildContext) => Promise<void> | void) | undefined;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAErD,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,uDAAuD;IACvD,cAAc,CAAC,EAAE,oBAAoB,CAAA;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,kBAAuB;IAEzD,OAAO;IACP,KAAK;IACL,UAAU;IACV,MAAM;IACN,MAAM;IACN,WAAW;IACX,SAAS;IACT,iBAAiB;IACjB,aAAa;IACb,mBAAmB;IACnB,YAAY;IAKZ,SAAS;EAEZ"}
|