@microsoft/fast-html 1.0.0-alpha.1 → 1.0.0-alpha.10

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.
Files changed (69) hide show
  1. package/README.md +100 -7
  2. package/dist/dts/components/index.d.ts +1 -0
  3. package/dist/dts/components/template.d.ts +74 -0
  4. package/dist/dts/components/utilities.d.ts +111 -0
  5. package/dist/dts/components/utilities.spec.d.ts +1 -0
  6. package/dist/dts/debug.d.ts +3 -0
  7. package/dist/dts/fixtures/attribute/attribute.spec.d.ts +1 -0
  8. package/dist/dts/fixtures/attribute/main.d.ts +1 -0
  9. package/dist/dts/fixtures/binding/binding.spec.d.ts +1 -0
  10. package/dist/dts/fixtures/binding/main.d.ts +1 -0
  11. package/dist/dts/fixtures/children/children.spec.d.ts +1 -0
  12. package/dist/dts/fixtures/children/main.d.ts +1 -0
  13. package/dist/dts/fixtures/dot-syntax/dot-syntax.spec.d.ts +1 -0
  14. package/dist/dts/fixtures/dot-syntax/main.d.ts +1 -0
  15. package/dist/dts/fixtures/event/event.spec.d.ts +1 -0
  16. package/dist/dts/fixtures/event/main.d.ts +1 -0
  17. package/dist/dts/fixtures/partial/main.d.ts +1 -0
  18. package/dist/dts/fixtures/partial/partial.spec.d.ts +1 -0
  19. package/dist/dts/fixtures/ref/main.d.ts +1 -0
  20. package/dist/dts/fixtures/ref/ref.spec.d.ts +1 -0
  21. package/dist/dts/fixtures/repeat/main.d.ts +1 -0
  22. package/dist/dts/fixtures/repeat/repeat.spec.d.ts +1 -0
  23. package/dist/dts/fixtures/slotted/main.d.ts +1 -0
  24. package/dist/dts/fixtures/slotted/slotted.spec.d.ts +1 -0
  25. package/dist/dts/fixtures/when/main.d.ts +1 -0
  26. package/dist/dts/fixtures/when/when.spec.d.ts +1 -0
  27. package/dist/dts/index.d.ts +1 -0
  28. package/dist/dts/interfaces.d.ts +7 -0
  29. package/dist/dts/tsdoc-metadata.json +11 -0
  30. package/dist/esm/components/index.js +1 -0
  31. package/dist/esm/components/template.js +313 -0
  32. package/dist/esm/components/utilities.js +370 -0
  33. package/dist/esm/components/utilities.spec.js +189 -0
  34. package/dist/esm/debug.js +3 -0
  35. package/dist/esm/fixtures/attribute/attribute.spec.js +23 -0
  36. package/dist/esm/fixtures/attribute/main.js +26 -0
  37. package/dist/esm/fixtures/binding/binding.spec.js +23 -0
  38. package/dist/esm/fixtures/binding/main.js +40 -0
  39. package/dist/esm/fixtures/children/children.spec.js +37 -0
  40. package/dist/esm/fixtures/children/main.js +31 -0
  41. package/dist/esm/fixtures/dot-syntax/dot-syntax.spec.js +9 -0
  42. package/dist/esm/fixtures/dot-syntax/main.js +23 -0
  43. package/dist/esm/fixtures/event/event.spec.js +28 -0
  44. package/dist/esm/fixtures/event/main.js +35 -0
  45. package/dist/esm/fixtures/partial/main.js +38 -0
  46. package/dist/esm/fixtures/partial/partial.spec.js +14 -0
  47. package/dist/esm/fixtures/ref/main.js +21 -0
  48. package/dist/esm/fixtures/ref/ref.spec.js +13 -0
  49. package/dist/esm/fixtures/repeat/main.js +27 -0
  50. package/dist/esm/fixtures/repeat/repeat.spec.js +29 -0
  51. package/dist/esm/fixtures/slotted/main.js +29 -0
  52. package/dist/esm/fixtures/slotted/slotted.spec.js +25 -0
  53. package/dist/esm/fixtures/when/main.js +198 -0
  54. package/dist/esm/fixtures/when/when.spec.js +82 -0
  55. package/dist/esm/index.js +4 -0
  56. package/dist/esm/interfaces.js +1 -0
  57. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  58. package/dist/fast-html.api.json +356 -0
  59. package/dist/fast-html.d.ts +78 -0
  60. package/dist/fast-html.untrimmed.d.ts +78 -0
  61. package/package.json +12 -6
  62. package/rules/attribute-directives.yml +38 -0
  63. package/rules/call-expression-with-event-argument.yml +41 -0
  64. package/rules/member-expression.yml +33 -0
  65. package/rules/tag-function-to-template-literal.yml +16 -0
  66. package/CHANGELOG.json +0 -26
  67. package/CHANGELOG.md +0 -14
  68. package/docs/api-report.api.md +0 -18
  69. package/webpack.common.config.js +0 -18
@@ -0,0 +1,189 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ import { getNextBehavior, getAllPartials, getIndexOfNextMatchingTag, pathResolver, transformInnerHTML } from "./utilities.js";
4
+ test.describe("utilities", () => __awaiter(void 0, void 0, void 0, function* () {
5
+ test.describe("content", () => __awaiter(void 0, void 0, void 0, function* () {
6
+ test("get the next content binding", () => __awaiter(void 0, void 0, void 0, function* () {
7
+ const innerHTML = "{{text}}";
8
+ const templateResult = getNextBehavior(innerHTML);
9
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.type).toEqual("dataBinding");
10
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.subtype).toEqual("content");
11
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.bindingType).toEqual("default");
12
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingStartIndex).toEqual(0);
13
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingEndIndex).toEqual(2);
14
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingStartIndex).toEqual(6);
15
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingEndIndex).toEqual(8);
16
+ }));
17
+ }));
18
+ test.describe("attributes", () => __awaiter(void 0, void 0, void 0, function* () {
19
+ test("get the next attribute binding", () => __awaiter(void 0, void 0, void 0, function* () {
20
+ const innerHTML = "<input type=\"{{type}}\" disabled>";
21
+ const templateResult = getNextBehavior(innerHTML);
22
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.type).toEqual("dataBinding");
23
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.subtype).toEqual("attribute");
24
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.aspect).toEqual(null);
25
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.bindingType).toEqual("default");
26
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingStartIndex).toEqual(13);
27
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingEndIndex).toEqual(15);
28
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingStartIndex).toEqual(19);
29
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingEndIndex).toEqual(21);
30
+ }));
31
+ test("get the next attribute event binding", () => __awaiter(void 0, void 0, void 0, function* () {
32
+ const innerHTML = "<input @click=\"{handleClick()}\">";
33
+ const templateResult = getNextBehavior(innerHTML);
34
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.type).toEqual("dataBinding");
35
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.subtype).toEqual("attribute");
36
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.aspect).toEqual("@");
37
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.bindingType).toEqual("client");
38
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingStartIndex).toEqual(15);
39
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingEndIndex).toEqual(16);
40
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingStartIndex).toEqual(29);
41
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingEndIndex).toEqual(30);
42
+ }));
43
+ }));
44
+ test.describe("templates", () => __awaiter(void 0, void 0, void 0, function* () {
45
+ test("when directive", () => __awaiter(void 0, void 0, void 0, function* () {
46
+ const innerHTML = "<f-when value=\"{{show}}\">Hello world</f-when>";
47
+ const templateResult = getNextBehavior(innerHTML);
48
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.type).toEqual("templateDirective");
49
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingTagStartIndex).toEqual(0);
50
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingTagEndIndex).toEqual(25);
51
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingTagStartIndex).toEqual(36);
52
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingTagEndIndex).toEqual(45);
53
+ }));
54
+ test("when directive with content", () => __awaiter(void 0, void 0, void 0, function* () {
55
+ const innerHTML = "Hello pluto<f-when value=\"{{show}}\">Hello world</f-when>";
56
+ const templateResult = getNextBehavior(innerHTML);
57
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.type).toEqual("templateDirective");
58
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingTagStartIndex).toEqual(11);
59
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingTagEndIndex).toEqual(36);
60
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingTagStartIndex).toEqual(47);
61
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingTagEndIndex).toEqual(56);
62
+ }));
63
+ test("when directive with binding", () => __awaiter(void 0, void 0, void 0, function* () {
64
+ const innerHTML = "<f-when value=\"{{show}}\">{{text}}</f-when>";
65
+ const templateResult = getNextBehavior(innerHTML);
66
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.type).toEqual("templateDirective");
67
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingTagStartIndex).toEqual(0);
68
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.openingTagEndIndex).toEqual(25);
69
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingTagStartIndex).toEqual(33);
70
+ expect(templateResult === null || templateResult === void 0 ? void 0 : templateResult.closingTagEndIndex).toEqual(42);
71
+ }));
72
+ }));
73
+ test.describe("attributes", () => __awaiter(void 0, void 0, void 0, function* () {
74
+ test("children directive", () => __awaiter(void 0, void 0, void 0, function* () {
75
+ const innerHTML = "<ul f-children=\"{list}\"></ul>";
76
+ const result = getNextBehavior(innerHTML);
77
+ expect(result === null || result === void 0 ? void 0 : result.type).toEqual("dataBinding");
78
+ expect(result === null || result === void 0 ? void 0 : result.subtype).toEqual("attributeDirective");
79
+ expect(result === null || result === void 0 ? void 0 : result.name).toEqual("children");
80
+ expect(result === null || result === void 0 ? void 0 : result.bindingType).toEqual("client");
81
+ expect(result === null || result === void 0 ? void 0 : result.openingStartIndex).toEqual(16);
82
+ expect(result === null || result === void 0 ? void 0 : result.openingEndIndex).toEqual(17);
83
+ expect(result === null || result === void 0 ? void 0 : result.closingStartIndex).toEqual(21);
84
+ expect(result === null || result === void 0 ? void 0 : result.closingEndIndex).toEqual(22);
85
+ }));
86
+ test("slotted directive", () => __awaiter(void 0, void 0, void 0, function* () {
87
+ const innerHTML = "<slot f-slotted=\"{slottedNodes}\"></slot>";
88
+ const result = getNextBehavior(innerHTML);
89
+ expect(result === null || result === void 0 ? void 0 : result.type).toEqual("dataBinding");
90
+ expect(result === null || result === void 0 ? void 0 : result.subtype).toEqual("attributeDirective");
91
+ expect(result === null || result === void 0 ? void 0 : result.name).toEqual("slotted");
92
+ expect(result === null || result === void 0 ? void 0 : result.bindingType).toEqual("client");
93
+ expect(result === null || result === void 0 ? void 0 : result.openingStartIndex).toEqual(17);
94
+ expect(result === null || result === void 0 ? void 0 : result.openingEndIndex).toEqual(18);
95
+ expect(result === null || result === void 0 ? void 0 : result.closingStartIndex).toEqual(30);
96
+ expect(result === null || result === void 0 ? void 0 : result.closingEndIndex).toEqual(31);
97
+ }));
98
+ test("ref directive", () => __awaiter(void 0, void 0, void 0, function* () {
99
+ const innerHTML = "<video f-ref=\"{video}\"></video>";
100
+ const result = getNextBehavior(innerHTML);
101
+ expect(result === null || result === void 0 ? void 0 : result.type).toEqual("dataBinding");
102
+ expect(result === null || result === void 0 ? void 0 : result.subtype).toEqual("attributeDirective");
103
+ expect(result === null || result === void 0 ? void 0 : result.name).toEqual("ref");
104
+ expect(result === null || result === void 0 ? void 0 : result.bindingType).toEqual("client");
105
+ expect(result === null || result === void 0 ? void 0 : result.openingStartIndex).toEqual(14);
106
+ expect(result === null || result === void 0 ? void 0 : result.openingEndIndex).toEqual(15);
107
+ expect(result === null || result === void 0 ? void 0 : result.closingStartIndex).toEqual(20);
108
+ expect(result === null || result === void 0 ? void 0 : result.closingEndIndex).toEqual(21);
109
+ }));
110
+ }));
111
+ test.describe("partials", () => __awaiter(void 0, void 0, void 0, function* () {
112
+ test("get a single partial", () => __awaiter(void 0, void 0, void 0, function* () {
113
+ const partialContent = "{{text}}";
114
+ const partial = `<f-partial id="foo">${partialContent}</f-partial>`;
115
+ const allPartials = getAllPartials(partial);
116
+ expect(allPartials.foo.innerHTML).toEqual(partialContent);
117
+ expect(allPartials.foo.startIndex).toEqual(20);
118
+ expect(allPartials.foo.endIndex).toEqual(28);
119
+ }));
120
+ test("get multiple partials", () => __awaiter(void 0, void 0, void 0, function* () {
121
+ const partial1Content = "{{text}}";
122
+ const partial2Content = "{{othertext}}";
123
+ const partial1 = `<f-partial id="foo">${partial1Content}</f-partial>`;
124
+ const partial2 = `<f-partial id="foobar">${partial2Content}</f-partial>`;
125
+ const allPartials = getAllPartials(`${partial1}${partial2}`);
126
+ expect(allPartials.foo.innerHTML).toEqual(partial1Content);
127
+ expect(allPartials.foo.startIndex).toEqual(20);
128
+ expect(allPartials.foo.endIndex).toEqual(28);
129
+ expect(allPartials.foobar.innerHTML).toEqual(partial2Content);
130
+ expect(allPartials.foobar.startIndex).toEqual(63);
131
+ expect(allPartials.foobar.endIndex).toEqual(76);
132
+ }));
133
+ }));
134
+ test.describe("getIndexOfNextMatchingTag", () => __awaiter(void 0, void 0, void 0, function* () {
135
+ test("should resolve a single tag", () => __awaiter(void 0, void 0, void 0, function* () {
136
+ const index = getIndexOfNextMatchingTag(`<div>Hello world</div>`, `<div`, `</div>`, 0);
137
+ expect(index).toEqual(16);
138
+ }));
139
+ test("should resolve when there is a nested tag", () => __awaiter(void 0, void 0, void 0, function* () {
140
+ const index = getIndexOfNextMatchingTag(`<div><div>Hello world</div></div>`, `<div`, `</div>`, 0);
141
+ expect(index).toEqual(27);
142
+ }));
143
+ test("should get adjacent tags", () => __awaiter(void 0, void 0, void 0, function* () {
144
+ const index = getIndexOfNextMatchingTag(`<div>Hello world</div><div>Hello pluto</div>`, `<div`, `</div>`, 0);
145
+ expect(index).toEqual(16);
146
+ }));
147
+ test("should add an offset for content before the tag", () => __awaiter(void 0, void 0, void 0, function* () {
148
+ const index = getIndexOfNextMatchingTag(`<div>Hello world</div>`, `<div`, `</div>`, 23);
149
+ expect(index).toEqual(39);
150
+ }));
151
+ }));
152
+ test.describe("pathResolver", () => __awaiter(void 0, void 0, void 0, function* () {
153
+ test("should resolve a path with no nesting", () => __awaiter(void 0, void 0, void 0, function* () {
154
+ expect(pathResolver("foo")({ foo: "bar" }, {})).toEqual("bar");
155
+ }));
156
+ test("should resolve a path with nesting", () => __awaiter(void 0, void 0, void 0, function* () {
157
+ expect(pathResolver("foo.bar.bat")({ foo: { bar: { bat: "baz" } } }, {})).toEqual("baz");
158
+ }));
159
+ test("should resolve a path with no nesting and self reference", () => __awaiter(void 0, void 0, void 0, function* () {
160
+ expect(pathResolver("foo", true)("bar", {})).toEqual("bar");
161
+ }));
162
+ test("should resolve a path with nesting and self reference", () => __awaiter(void 0, void 0, void 0, function* () {
163
+ expect(pathResolver("foo.bar.bat", true)({ bar: { bat: "baz" } }, {})).toEqual("baz");
164
+ }));
165
+ test("should resolve a path with context", () => __awaiter(void 0, void 0, void 0, function* () {
166
+ expect(pathResolver("../foo")({}, { parent: { foo: "bar" } })).toEqual("bar");
167
+ }));
168
+ }));
169
+ test.describe("transformInnerHTML", () => __awaiter(void 0, void 0, void 0, function* () {
170
+ test("should resolve a single unescaped data binding", () => __awaiter(void 0, void 0, void 0, function* () {
171
+ expect(transformInnerHTML(`{{{html}}}`)).toEqual(`<div :innerHTML="{{html}}"></div>`);
172
+ }));
173
+ test("should resolve multiple unescaped data bindings", () => __awaiter(void 0, void 0, void 0, function* () {
174
+ expect(transformInnerHTML(`{{{foo}}}{{{bar}}}`)).toEqual(`<div :innerHTML="{{foo}}"></div><div :innerHTML="{{bar}}"></div>`);
175
+ }));
176
+ test("should resolve an unescaped data bindings in a mix of other data content bindings", () => __awaiter(void 0, void 0, void 0, function* () {
177
+ expect(transformInnerHTML(`{{text1}}{{{foo}}}{{text2}}{{{bar}}}{{text3}}`)).toEqual(`{{text1}}<div :innerHTML="{{foo}}"></div>{{text2}}<div :innerHTML="{{bar}}"></div>{{text3}}`);
178
+ }));
179
+ test("should resolve default data bindings in sequence", () => __awaiter(void 0, void 0, void 0, function* () {
180
+ expect(transformInnerHTML(`{{text1}}{{text2}}`)).toEqual(`{{text1}}{{text2}}`);
181
+ }));
182
+ test("should resolve an unescaped data bindings in a mix of other data attribute bindings and nesting", () => __awaiter(void 0, void 0, void 0, function* () {
183
+ expect(transformInnerHTML(`<div data-foo="{{text1}}">{{{foo}}}</div><div data-bar="{{text2}}"></div>{{{bar}}}<div data-bat="{{text3}}"></div>`)).toEqual(`<div data-foo="{{text1}}"><div :innerHTML="{{foo}}"></div></div><div data-bar="{{text2}}"></div><div :innerHTML="{{bar}}"></div><div data-bat="{{text3}}"></div>`);
184
+ }));
185
+ test("should resolve a non-data and non-attribute bindings", () => __awaiter(void 0, void 0, void 0, function* () {
186
+ expect(transformInnerHTML(`<button @click="{handleNoArgsClick()}">No arguments</button>`)).toEqual(`<button @click="{handleNoArgsClick()}">No arguments</button>`);
187
+ }));
188
+ }));
189
+ }));
@@ -0,0 +1,3 @@
1
+ export const debugMessages = {
2
+ [2000 /* noTemplateProvided */]: `The first child of the <f-template> must be a <template>, this is missing from ${name}.`,
3
+ };
@@ -0,0 +1,23 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ test.describe("f-template", () => __awaiter(void 0, void 0, void 0, function* () {
4
+ test("create a non-binding attribute", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
5
+ yield page.goto("/attribute");
6
+ const customElement = page.locator("test-element");
7
+ const customElementInput = customElement.locator("input");
8
+ yield expect(customElementInput).toHaveAttribute("disabled");
9
+ }));
10
+ test("create an attribute binding", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
11
+ yield page.goto("/attribute");
12
+ const customElement = page.locator("test-element");
13
+ yield expect(customElement).toHaveAttribute("type", "checkbox");
14
+ yield expect(customElement.locator("input[type='checkbox']")).toHaveCount(1);
15
+ yield page.evaluate(() => {
16
+ var _a;
17
+ const customElement = document.getElementsByTagName("test-element");
18
+ (_a = customElement.item(0)) === null || _a === void 0 ? void 0 : _a.setAttribute("type", "radio");
19
+ });
20
+ yield expect(customElement).toHaveAttribute("type", "radio");
21
+ yield expect(customElement.locator("input[type='radio']")).toHaveCount(1);
22
+ }));
23
+ }));
@@ -0,0 +1,26 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { TemplateElement } from "@microsoft/fast-html";
3
+ import { attr, FASTElement } from "@microsoft/fast-element";
4
+ class TestElement extends FASTElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.type = "radio";
8
+ }
9
+ }
10
+ __decorate([
11
+ attr,
12
+ __metadata("design:type", String)
13
+ ], TestElement.prototype, "type", void 0);
14
+ TestElement.define({
15
+ name: "test-element",
16
+ shadowOptions: null,
17
+ });
18
+ TemplateElement.options({
19
+ "test-element": {
20
+ shadowOptions: {
21
+ mode: "closed",
22
+ },
23
+ },
24
+ }).define({
25
+ name: "f-template",
26
+ });
@@ -0,0 +1,23 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ test.describe("f-template", () => __awaiter(void 0, void 0, void 0, function* () {
4
+ test("create a binding", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
5
+ yield page.goto("/binding");
6
+ const customElement = yield page.locator("test-element");
7
+ yield expect(yield customElement.getAttribute("text")).toEqual("Hello world");
8
+ yield expect(customElement).toHaveText("Hello world");
9
+ yield page.evaluate(() => {
10
+ var _a;
11
+ const customElement = document.getElementsByTagName("test-element");
12
+ (_a = customElement.item(0)) === null || _a === void 0 ? void 0 : _a.setAttribute("text", "Hello pluto");
13
+ });
14
+ yield expect(yield customElement.getAttribute("text")).toEqual("Hello pluto");
15
+ yield expect(customElement).toHaveText("Hello pluto");
16
+ }));
17
+ test("create an unescaped binding", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
18
+ yield page.goto("/binding");
19
+ const customElement = yield page.locator("test-element-unescaped");
20
+ yield expect(yield customElement.locator("p").count()).toEqual(1);
21
+ yield expect(customElement).toHaveText("Hello world");
22
+ }));
23
+ }));
@@ -0,0 +1,40 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { TemplateElement } from "@microsoft/fast-html";
3
+ import { attr, FASTElement } from "@microsoft/fast-element";
4
+ class TestElement extends FASTElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.text = "Hello";
8
+ }
9
+ }
10
+ __decorate([
11
+ attr,
12
+ __metadata("design:type", String)
13
+ ], TestElement.prototype, "text", void 0);
14
+ TestElement.define({
15
+ name: "test-element",
16
+ });
17
+ class TestElementUnescaped extends FASTElement {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.html = `<p>Hello world</p>`;
21
+ }
22
+ }
23
+ TestElementUnescaped.define({
24
+ name: "test-element-unescaped",
25
+ shadowOptions: null,
26
+ });
27
+ TemplateElement.options({
28
+ "test-element": {
29
+ shadowOptions: {
30
+ mode: "closed",
31
+ },
32
+ },
33
+ "test-element-unescaped": {
34
+ shadowOptions: {
35
+ mode: "closed",
36
+ },
37
+ },
38
+ }).define({
39
+ name: "f-template",
40
+ });
@@ -0,0 +1,37 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ test.describe("f-template", () => __awaiter(void 0, void 0, void 0, function* () {
4
+ test("create a children directive", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
5
+ yield page.goto("/children");
6
+ const listItemCount1 = yield page.evaluate(() => {
7
+ var _a;
8
+ const customElement = document.getElementsByTagName("test-element");
9
+ const listItems = (_a = customElement.item(0)) === null || _a === void 0 ? void 0 : _a.listItems.filter((listItem) => {
10
+ return listItem instanceof HTMLLIElement;
11
+ });
12
+ return listItems === null || listItems === void 0 ? void 0 : listItems.length;
13
+ });
14
+ expect(listItemCount1).toEqual(2);
15
+ yield page.evaluate(() => {
16
+ const customElement = document.getElementsByTagName("test-element");
17
+ customElement.item(0).list = [
18
+ "A",
19
+ "B",
20
+ "C"
21
+ ];
22
+ });
23
+ const timeout = new Promise(function (resolve) {
24
+ setTimeout(resolve, 100);
25
+ });
26
+ yield timeout;
27
+ const listItemCount2 = yield page.evaluate(() => {
28
+ var _a;
29
+ const customElement = document.getElementsByTagName("test-element");
30
+ const listItems = (_a = customElement.item(0)) === null || _a === void 0 ? void 0 : _a.listItems.filter((listItem) => {
31
+ return listItem instanceof HTMLLIElement;
32
+ });
33
+ return listItems === null || listItems === void 0 ? void 0 : listItems.length;
34
+ });
35
+ expect(listItemCount2).toEqual(3);
36
+ }));
37
+ }));
@@ -0,0 +1,31 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { TemplateElement } from "@microsoft/fast-html";
3
+ import { FASTElement, observable } from "@microsoft/fast-element";
4
+ class TestElement extends FASTElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.listItems = [];
8
+ this.list = ["Foo", "Bar"];
9
+ }
10
+ }
11
+ __decorate([
12
+ observable,
13
+ __metadata("design:type", Array)
14
+ ], TestElement.prototype, "listItems", void 0);
15
+ __decorate([
16
+ observable,
17
+ __metadata("design:type", Array)
18
+ ], TestElement.prototype, "list", void 0);
19
+ TestElement.define({
20
+ name: "test-element",
21
+ shadowOptions: null,
22
+ });
23
+ TemplateElement.options({
24
+ "test-element": {
25
+ shadowOptions: {
26
+ mode: "closed",
27
+ },
28
+ },
29
+ }).define({
30
+ name: "f-template",
31
+ });
@@ -0,0 +1,9 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ test.describe("f-template", () => __awaiter(void 0, void 0, void 0, function* () {
4
+ test("create a object property reference using dot syntax in a binding", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
5
+ yield page.goto("/dot-syntax");
6
+ const customElement = yield page.locator("test-element");
7
+ yield expect(customElement).toHaveText("bar");
8
+ }));
9
+ }));
@@ -0,0 +1,23 @@
1
+ import { TemplateElement } from "@microsoft/fast-html";
2
+ import { FASTElement } from "@microsoft/fast-element";
3
+ class TestElement extends FASTElement {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.object = {
7
+ foo: "bar",
8
+ };
9
+ }
10
+ }
11
+ TestElement.define({
12
+ name: "test-element",
13
+ shadowOptions: null,
14
+ });
15
+ TemplateElement.options({
16
+ "test-element": {
17
+ shadowOptions: {
18
+ mode: "closed",
19
+ },
20
+ },
21
+ }).define({
22
+ name: "f-template",
23
+ });
@@ -0,0 +1,28 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ test.describe("f-template", () => __awaiter(void 0, void 0, void 0, function* () {
4
+ test("create an event attribute without arguments", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
5
+ yield page.goto("/event");
6
+ const customElement = yield page.locator("test-element");
7
+ let message;
8
+ yield page.on("console", msg => message = msg.text());
9
+ yield customElement.locator("button").nth(0).click();
10
+ expect(message).toEqual("no args");
11
+ }));
12
+ test("create an event attribute with an event argument", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
13
+ yield page.goto("/event");
14
+ const customElement = yield page.locator("test-element");
15
+ let message;
16
+ yield page.on("console", msg => message = msg.text());
17
+ yield customElement.locator("button").nth(1).click();
18
+ expect(message).toEqual("click");
19
+ }));
20
+ test("create an event attribute with an attribute argument", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
21
+ yield page.goto("/event");
22
+ const customElement = yield page.locator("test-element");
23
+ let message;
24
+ yield page.on("console", msg => message = msg.text());
25
+ yield customElement.locator("button").nth(2).click();
26
+ expect(message).toEqual("bar");
27
+ }));
28
+ }));
@@ -0,0 +1,35 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { TemplateElement } from "@microsoft/fast-html";
3
+ import { attr, FASTElement } from "@microsoft/fast-element";
4
+ class TestElement extends FASTElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.foo = "";
8
+ this.handleNoArgsClick = () => {
9
+ console.log("no args");
10
+ };
11
+ this.handleEventArgClick = (e) => {
12
+ console.log(e.type);
13
+ };
14
+ this.handleAttributeArgClick = (foo) => {
15
+ console.log(foo);
16
+ };
17
+ }
18
+ }
19
+ __decorate([
20
+ attr,
21
+ __metadata("design:type", String)
22
+ ], TestElement.prototype, "foo", void 0);
23
+ TestElement.define({
24
+ name: "test-element",
25
+ shadowOptions: null,
26
+ });
27
+ TemplateElement.options({
28
+ "test-element": {
29
+ shadowOptions: {
30
+ mode: "closed",
31
+ },
32
+ },
33
+ }).define({
34
+ name: "f-template",
35
+ });
@@ -0,0 +1,38 @@
1
+ import { TemplateElement } from "@microsoft/fast-html";
2
+ import { FASTElement } from "@microsoft/fast-element";
3
+ class TestElement extends FASTElement {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.items = [
7
+ {
8
+ text: "Hello",
9
+ },
10
+ {
11
+ text: "Earth",
12
+ items: [
13
+ {
14
+ text: "Pluto",
15
+ items: [
16
+ {
17
+ text: "Mars",
18
+ },
19
+ ],
20
+ },
21
+ ],
22
+ },
23
+ ];
24
+ }
25
+ }
26
+ TestElement.define({
27
+ name: "test-element",
28
+ shadowOptions: null,
29
+ });
30
+ TemplateElement.options({
31
+ "test-element": {
32
+ shadowOptions: {
33
+ mode: "closed",
34
+ },
35
+ },
36
+ }).define({
37
+ name: "f-template",
38
+ });
@@ -0,0 +1,14 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ test.describe("f-template", () => __awaiter(void 0, void 0, void 0, function* () {
4
+ test("create a partial", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
5
+ yield page.goto("/partial");
6
+ const customElement = yield page.locator("#test");
7
+ let customElementListItems = yield customElement.locator("li");
8
+ expect(yield customElementListItems.count()).toEqual(4);
9
+ expect(yield customElementListItems.nth(0).textContent()).toEqual("Hello");
10
+ expect(yield customElementListItems.nth(1).textContent()).toContain("Earth");
11
+ expect(yield customElementListItems.nth(2).textContent()).toContain("Pluto");
12
+ expect(yield customElementListItems.nth(3).textContent()).toContain("Mars");
13
+ }));
14
+ }));
@@ -0,0 +1,21 @@
1
+ import { TemplateElement } from "@microsoft/fast-html";
2
+ import { FASTElement } from "@microsoft/fast-element";
3
+ class TestElement extends FASTElement {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.video = null;
7
+ }
8
+ }
9
+ TestElement.define({
10
+ name: "test-element",
11
+ shadowOptions: null,
12
+ });
13
+ TemplateElement.options({
14
+ "test-element": {
15
+ shadowOptions: {
16
+ mode: "closed",
17
+ },
18
+ },
19
+ }).define({
20
+ name: "f-template",
21
+ });
@@ -0,0 +1,13 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ test.describe("f-template", () => __awaiter(void 0, void 0, void 0, function* () {
4
+ test("create a ref directive", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
5
+ yield page.goto("/ref");
6
+ const isVideo = yield page.evaluate(() => {
7
+ var _a;
8
+ const customElement = document.getElementsByTagName("test-element");
9
+ return ((_a = customElement.item(0)) === null || _a === void 0 ? void 0 : _a.video) instanceof HTMLVideoElement;
10
+ });
11
+ expect(isVideo).toEqual(true);
12
+ }));
13
+ }));
@@ -0,0 +1,27 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { TemplateElement } from "@microsoft/fast-html";
3
+ import { FASTElement, observable } from "@microsoft/fast-element";
4
+ class TestElement extends FASTElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.list = ["Foo", "Bar"];
8
+ this.parent = "Bat";
9
+ }
10
+ }
11
+ __decorate([
12
+ observable,
13
+ __metadata("design:type", Array)
14
+ ], TestElement.prototype, "list", void 0);
15
+ TestElement.define({
16
+ name: "test-element",
17
+ shadowOptions: null,
18
+ });
19
+ TemplateElement.options({
20
+ "test-element": {
21
+ shadowOptions: {
22
+ mode: "closed",
23
+ },
24
+ },
25
+ }).define({
26
+ name: "f-template",
27
+ });
@@ -0,0 +1,29 @@
1
+ import { __awaiter } from "tslib";
2
+ import { expect, test } from "@playwright/test";
3
+ test.describe("f-template", () => __awaiter(void 0, void 0, void 0, function* () {
4
+ test("create a repeat directive", ({ page }) => __awaiter(void 0, void 0, void 0, function* () {
5
+ yield page.goto("/repeat");
6
+ const customElement = yield page.locator("test-element");
7
+ let customElementListItems = yield customElement.locator("li");
8
+ expect(yield customElementListItems.count()).toEqual(2);
9
+ expect(yield customElementListItems.nth(0).textContent()).toEqual("Foo - Bat");
10
+ expect(yield customElementListItems.nth(1).textContent()).toEqual("Bar - Bat");
11
+ yield page.evaluate(() => {
12
+ const customElement = document.getElementsByTagName("test-element");
13
+ customElement.item(0).list = [
14
+ "A",
15
+ "B",
16
+ "C"
17
+ ];
18
+ });
19
+ const timeout = new Promise(function (resolve) {
20
+ setTimeout(resolve, 100);
21
+ });
22
+ yield timeout;
23
+ customElementListItems = yield customElement.locator("li");
24
+ expect(yield customElementListItems.count()).toEqual(3);
25
+ expect(yield customElementListItems.nth(0).textContent()).toEqual("A - Bat");
26
+ expect(yield customElementListItems.nth(1).textContent()).toEqual("B - Bat");
27
+ expect(yield customElementListItems.nth(2).textContent()).toEqual("C - Bat");
28
+ }));
29
+ }));