@player-tools/fluent 0.12.1--canary.241.6077
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/cjs/index.cjs +2396 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/index.legacy-esm.js +2276 -0
- package/dist/index.mjs +2276 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +38 -0
- package/src/core/base-builder/__tests__/fluent-builder-base.test.ts +2423 -0
- package/src/core/base-builder/__tests__/fluent-partial.test.ts +179 -0
- package/src/core/base-builder/__tests__/id-generator.test.ts +658 -0
- package/src/core/base-builder/__tests__/registry.test.ts +534 -0
- package/src/core/base-builder/__tests__/resolution-mixed-arrays.test.ts +319 -0
- package/src/core/base-builder/__tests__/resolution-pipeline.test.ts +416 -0
- package/src/core/base-builder/__tests__/resolution-switches.test.ts +468 -0
- package/src/core/base-builder/__tests__/resolution-templates.test.ts +255 -0
- package/src/core/base-builder/__tests__/switch.test.ts +815 -0
- package/src/core/base-builder/__tests__/template.test.ts +596 -0
- package/src/core/base-builder/__tests__/value-extraction.test.ts +200 -0
- package/src/core/base-builder/__tests__/value-storage.test.ts +459 -0
- package/src/core/base-builder/conditional/index.ts +64 -0
- package/src/core/base-builder/context.ts +152 -0
- package/src/core/base-builder/errors.ts +69 -0
- package/src/core/base-builder/fluent-builder-base.ts +308 -0
- package/src/core/base-builder/guards.ts +137 -0
- package/src/core/base-builder/id/generator.ts +290 -0
- package/src/core/base-builder/id/registry.ts +152 -0
- package/src/core/base-builder/index.ts +72 -0
- package/src/core/base-builder/resolution/path-resolver.ts +116 -0
- package/src/core/base-builder/resolution/pipeline.ts +103 -0
- package/src/core/base-builder/resolution/steps/__tests__/nested-asset-wrappers.test.ts +206 -0
- package/src/core/base-builder/resolution/steps/asset-id.ts +77 -0
- package/src/core/base-builder/resolution/steps/asset-wrappers.ts +64 -0
- package/src/core/base-builder/resolution/steps/builders.ts +84 -0
- package/src/core/base-builder/resolution/steps/mixed-arrays.ts +95 -0
- package/src/core/base-builder/resolution/steps/nested-asset-wrappers.ts +124 -0
- package/src/core/base-builder/resolution/steps/static-values.ts +35 -0
- package/src/core/base-builder/resolution/steps/switches.ts +71 -0
- package/src/core/base-builder/resolution/steps/templates.ts +40 -0
- package/src/core/base-builder/resolution/value-resolver.ts +333 -0
- package/src/core/base-builder/storage/auxiliary-storage.ts +82 -0
- package/src/core/base-builder/storage/value-storage.ts +282 -0
- package/src/core/base-builder/types.ts +266 -0
- package/src/core/base-builder/utils.ts +10 -0
- package/src/core/flow/__tests__/index.test.ts +292 -0
- package/src/core/flow/index.ts +118 -0
- package/src/core/index.ts +8 -0
- package/src/core/mocks/generated/action.builder.ts +92 -0
- package/src/core/mocks/generated/choice-item.builder.ts +120 -0
- package/src/core/mocks/generated/choice.builder.ts +134 -0
- package/src/core/mocks/generated/collection.builder.ts +93 -0
- package/src/core/mocks/generated/field-collection.builder.ts +86 -0
- package/src/core/mocks/generated/index.ts +10 -0
- package/src/core/mocks/generated/info.builder.ts +64 -0
- package/src/core/mocks/generated/input.builder.ts +63 -0
- package/src/core/mocks/generated/overview-collection.builder.ts +65 -0
- package/src/core/mocks/generated/splash-collection.builder.ts +93 -0
- package/src/core/mocks/generated/text.builder.ts +47 -0
- package/src/core/mocks/index.ts +1 -0
- package/src/core/mocks/types/action.ts +92 -0
- package/src/core/mocks/types/choice.ts +129 -0
- package/src/core/mocks/types/collection.ts +140 -0
- package/src/core/mocks/types/info.ts +7 -0
- package/src/core/mocks/types/input.ts +7 -0
- package/src/core/mocks/types/text.ts +5 -0
- package/src/core/schema/__tests__/index.test.ts +127 -0
- package/src/core/schema/index.ts +195 -0
- package/src/core/schema/types.ts +7 -0
- package/src/core/switch/__tests__/index.test.ts +156 -0
- package/src/core/switch/index.ts +81 -0
- package/src/core/tagged-template/README.md +448 -0
- package/src/core/tagged-template/__tests__/extract-bindings-from-schema.test.ts +207 -0
- package/src/core/tagged-template/__tests__/index.test.ts +190 -0
- package/src/core/tagged-template/__tests__/schema-std-integration.test.ts +580 -0
- package/src/core/tagged-template/binding.ts +95 -0
- package/src/core/tagged-template/expression.ts +92 -0
- package/src/core/tagged-template/extract-bindings-from-schema.ts +120 -0
- package/src/core/tagged-template/index.ts +5 -0
- package/src/core/tagged-template/std.ts +472 -0
- package/src/core/tagged-template/types.ts +123 -0
- package/src/core/template/__tests__/index.test.ts +380 -0
- package/src/core/template/index.ts +196 -0
- package/src/core/utils/index.ts +160 -0
- package/src/fp/README.md +411 -0
- package/src/fp/__tests__/index.test.ts +1178 -0
- package/src/fp/index.ts +386 -0
- package/src/gen/common.ts +15 -0
- package/src/index.ts +5 -0
- package/src/types.ts +203 -0
- package/types/core/base-builder/conditional/index.d.ts +21 -0
- package/types/core/base-builder/context.d.ts +39 -0
- package/types/core/base-builder/errors.d.ts +45 -0
- package/types/core/base-builder/fluent-builder-base.d.ts +147 -0
- package/types/core/base-builder/guards.d.ts +58 -0
- package/types/core/base-builder/id/generator.d.ts +69 -0
- package/types/core/base-builder/id/registry.d.ts +93 -0
- package/types/core/base-builder/index.d.ts +9 -0
- package/types/core/base-builder/resolution/path-resolver.d.ts +15 -0
- package/types/core/base-builder/resolution/pipeline.d.ts +27 -0
- package/types/core/base-builder/resolution/steps/asset-id.d.ts +14 -0
- package/types/core/base-builder/resolution/steps/asset-wrappers.d.ts +14 -0
- package/types/core/base-builder/resolution/steps/builders.d.ts +14 -0
- package/types/core/base-builder/resolution/steps/mixed-arrays.d.ts +14 -0
- package/types/core/base-builder/resolution/steps/nested-asset-wrappers.d.ts +14 -0
- package/types/core/base-builder/resolution/steps/static-values.d.ts +14 -0
- package/types/core/base-builder/resolution/steps/switches.d.ts +15 -0
- package/types/core/base-builder/resolution/steps/templates.d.ts +14 -0
- package/types/core/base-builder/resolution/value-resolver.d.ts +62 -0
- package/types/core/base-builder/storage/auxiliary-storage.d.ts +50 -0
- package/types/core/base-builder/storage/value-storage.d.ts +82 -0
- package/types/core/base-builder/types.d.ts +183 -0
- package/types/core/base-builder/utils.d.ts +2 -0
- package/types/core/flow/index.d.ts +23 -0
- package/types/core/index.d.ts +8 -0
- package/types/core/mocks/index.d.ts +2 -0
- package/types/core/mocks/types/action.d.ts +58 -0
- package/types/core/mocks/types/choice.d.ts +95 -0
- package/types/core/mocks/types/collection.d.ts +102 -0
- package/types/core/mocks/types/info.d.ts +7 -0
- package/types/core/mocks/types/input.d.ts +7 -0
- package/types/core/mocks/types/text.d.ts +5 -0
- package/types/core/schema/index.d.ts +34 -0
- package/types/core/schema/types.d.ts +5 -0
- package/types/core/switch/index.d.ts +21 -0
- package/types/core/tagged-template/binding.d.ts +19 -0
- package/types/core/tagged-template/expression.d.ts +11 -0
- package/types/core/tagged-template/extract-bindings-from-schema.d.ts +7 -0
- package/types/core/tagged-template/index.d.ts +6 -0
- package/types/core/tagged-template/std.d.ts +174 -0
- package/types/core/tagged-template/types.d.ts +69 -0
- package/types/core/template/index.d.ts +97 -0
- package/types/core/utils/index.d.ts +47 -0
- package/types/fp/index.d.ts +149 -0
- package/types/gen/common.d.ts +6 -0
- package/types/index.d.ts +3 -0
- package/types/types.d.ts +163 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { describe, test, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
binding,
|
|
4
|
+
expression,
|
|
5
|
+
isTaggedTemplateValue,
|
|
6
|
+
TaggedTemplateValueSymbol,
|
|
7
|
+
type TaggedTemplateValue,
|
|
8
|
+
} from "../index";
|
|
9
|
+
|
|
10
|
+
describe("Tagged Templates Module", () => {
|
|
11
|
+
describe("binding function", () => {
|
|
12
|
+
test("creates a simple binding template", () => {
|
|
13
|
+
const result = binding`foo`;
|
|
14
|
+
expect(result.toString()).toBe("{{foo}}");
|
|
15
|
+
expect(result.toValue()).toBe("foo");
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test("interpolates string values", () => {
|
|
19
|
+
const value = "bar";
|
|
20
|
+
const result = binding`foo.${value}`;
|
|
21
|
+
expect(result.toString()).toBe("{{foo.bar}}");
|
|
22
|
+
expect(result.toValue()).toBe("foo.bar");
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test("replaces _index_ placeholders with unique identifiers", () => {
|
|
26
|
+
const result = binding`items._index_.value`;
|
|
27
|
+
expect(result.toString()).toBe("{{items._index_.value}}");
|
|
28
|
+
expect(result.toValue()).toBe("items._index_.value");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("handles multiple _index_ placeholders", () => {
|
|
32
|
+
const result = binding`items._index_.values._index_`;
|
|
33
|
+
expect(result.toString()).toBe("{{items._index_.values._index1_}}");
|
|
34
|
+
expect(result.toValue()).toBe("items._index_.values._index1_");
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("processes _index_ in interpolated strings", () => {
|
|
38
|
+
const indexStr = "_index_";
|
|
39
|
+
const result = binding`items.${indexStr}.value`;
|
|
40
|
+
expect(result.toString()).toBe("{{items._index_.value}}");
|
|
41
|
+
expect(result.toValue()).toBe("items._index_.value");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("handles nested binding templates", () => {
|
|
45
|
+
const inner = binding`bar`;
|
|
46
|
+
const result = binding`foo.${inner}`;
|
|
47
|
+
expect(result.toString()).toBe("{{foo.{{bar}}}}");
|
|
48
|
+
expect(result.toValue()).toBe("foo.{{bar}}");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("handles nested expression templates", () => {
|
|
52
|
+
const result = binding`foo.bar`;
|
|
53
|
+
const expr = expression`getValue(${result})`;
|
|
54
|
+
expect(expr.toString()).toBe("@[getValue({{foo.bar}})]@");
|
|
55
|
+
expect(expr.toValue()).toBe("getValue({{foo.bar}})");
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("formats correctly in different contexts", () => {
|
|
59
|
+
const templ = binding`foo`;
|
|
60
|
+
expect(templ.toString()).toBe("{{foo}}");
|
|
61
|
+
expect(templ.toRefString()).toBe("{{foo}}");
|
|
62
|
+
expect(templ.toRefString({ nestedContext: "binding" })).toBe("foo");
|
|
63
|
+
expect(templ.toValue()).toBe("foo");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("converts non-string, non-template values to strings", () => {
|
|
67
|
+
const num = 42;
|
|
68
|
+
const bool = true;
|
|
69
|
+
const result = binding`value: ${num}, isActive: ${bool}`;
|
|
70
|
+
expect(result.toString()).toBe("{{value: 42, isActive: true}}");
|
|
71
|
+
expect(result.toValue()).toBe("value: 42, isActive: true");
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe("expression function", () => {
|
|
76
|
+
test("creates a simple expression template", () => {
|
|
77
|
+
const result = expression`getValue()`;
|
|
78
|
+
expect(result.toString()).toBe("@[getValue()]@");
|
|
79
|
+
expect(result.toValue()).toBe("getValue()");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test("interpolates string values", () => {
|
|
83
|
+
const methodName = "getValue";
|
|
84
|
+
const result = expression`${methodName}()`;
|
|
85
|
+
expect(result.toString()).toBe("@[getValue()]@");
|
|
86
|
+
expect(result.toValue()).toBe("getValue()");
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("handles nested expression templates", () => {
|
|
90
|
+
const inner = expression`getInner()`;
|
|
91
|
+
const result = expression`getOuter(${inner})`;
|
|
92
|
+
expect(result.toString()).toBe("@[getOuter(getInner())]@");
|
|
93
|
+
expect(result.toValue()).toBe("getOuter(getInner())");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("handles nested binding templates", () => {
|
|
97
|
+
const bind = binding`foo.bar`;
|
|
98
|
+
const result = expression`getValue(${bind})`;
|
|
99
|
+
expect(result.toString()).toBe("@[getValue({{foo.bar}})]@");
|
|
100
|
+
expect(result.toValue()).toBe("getValue({{foo.bar}})");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("formats correctly in different contexts", () => {
|
|
104
|
+
const templ = expression`getValue()`;
|
|
105
|
+
expect(templ.toString()).toBe("@[getValue()]@");
|
|
106
|
+
expect(templ.toRefString()).toBe("@[getValue()]@");
|
|
107
|
+
expect(templ.toRefString({ nestedContext: "binding" })).toBe(
|
|
108
|
+
"`getValue()`",
|
|
109
|
+
);
|
|
110
|
+
expect(templ.toRefString({ nestedContext: "expression" })).toBe(
|
|
111
|
+
"getValue()",
|
|
112
|
+
);
|
|
113
|
+
expect(templ.toValue()).toBe("getValue()");
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("throws error for unbalanced parentheses (too many closing)", () => {
|
|
117
|
+
expect(() => expression`getValue())`).toThrow(/Unexpected \)/);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("throws error for unbalanced parentheses (missing closing)", () => {
|
|
121
|
+
expect(() => expression`getValue(`).toThrow(/Expected \)/);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("converts non-string, non-template values to strings", () => {
|
|
125
|
+
const num = 42;
|
|
126
|
+
const bool = true;
|
|
127
|
+
const result = expression`getValue(${num}, ${bool})`;
|
|
128
|
+
expect(result.toString()).toBe("@[getValue(42, true)]@");
|
|
129
|
+
expect(result.toValue()).toBe("getValue(42, true)");
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe("isTaggedTemplateValue function", () => {
|
|
134
|
+
test("returns true for binding templates", () => {
|
|
135
|
+
const templ = binding`foo`;
|
|
136
|
+
expect(isTaggedTemplateValue(templ)).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("returns true for expression templates", () => {
|
|
140
|
+
const templ = expression`getValue()`;
|
|
141
|
+
expect(isTaggedTemplateValue(templ)).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test("returns false for non-template values", () => {
|
|
145
|
+
expect(isTaggedTemplateValue("string")).toBe(false);
|
|
146
|
+
expect(isTaggedTemplateValue(123)).toBe(false);
|
|
147
|
+
expect(isTaggedTemplateValue({})).toBe(false);
|
|
148
|
+
expect(isTaggedTemplateValue(null)).toBe(false);
|
|
149
|
+
expect(isTaggedTemplateValue(undefined)).toBe(false);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test("returns false for objects without the symbol", () => {
|
|
153
|
+
const fakeTemplate = {
|
|
154
|
+
toValue: () => "value",
|
|
155
|
+
toRefString: () => "ref",
|
|
156
|
+
toString: () => "string",
|
|
157
|
+
};
|
|
158
|
+
expect(isTaggedTemplateValue(fakeTemplate)).toBe(false);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("returns true for manually created tagged template values", () => {
|
|
162
|
+
const manual: TaggedTemplateValue = {
|
|
163
|
+
[TaggedTemplateValueSymbol]: true,
|
|
164
|
+
toValue: () => "value",
|
|
165
|
+
toRefString: () => "ref",
|
|
166
|
+
toString: () => "string",
|
|
167
|
+
};
|
|
168
|
+
expect(isTaggedTemplateValue(manual)).toBe(true);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe("Complex scenarios", () => {
|
|
173
|
+
test("handles complex nested templates", () => {
|
|
174
|
+
const inner1 = binding`foo._index_`;
|
|
175
|
+
const inner2 = expression`getBar()`;
|
|
176
|
+
const result = binding`complex.${inner1}.with.${inner2}`;
|
|
177
|
+
expect(result.toString()).toBe(
|
|
178
|
+
"{{complex.{{foo._index_}}.with.`getBar()`}}",
|
|
179
|
+
);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
test("correctly handles deeply nested templates", () => {
|
|
183
|
+
const level3 = binding`value._index_`;
|
|
184
|
+
const level2 = expression`getItem(${level3})`;
|
|
185
|
+
const level1 = binding`items.${level2}`;
|
|
186
|
+
|
|
187
|
+
expect(level1.toString()).toBe("{{items.`getItem({{value._index_}})`}}");
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
});
|