@excom/quark 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.
Files changed (130) hide show
  1. package/.rush/temp/chunked-rush-logs/quark.apply-exports.chunks.jsonl +1 -0
  2. package/.rush/temp/chunked-rush-logs/quark.build_package-metas.chunks.jsonl +1 -0
  3. package/.rush/temp/operation/apply-exports/all.log +1 -0
  4. package/.rush/temp/operation/apply-exports/log-chunks.jsonl +1 -0
  5. package/.rush/temp/operation/apply-exports/state.json +3 -0
  6. package/.rush/temp/operation/build_package-metas/all.log +1 -0
  7. package/.rush/temp/operation/build_package-metas/log-chunks.jsonl +1 -0
  8. package/.rush/temp/operation/build_package-metas/state.json +3 -0
  9. package/.rush/temp/shrinkwrap-deps.json +3 -0
  10. package/config/rig.json +6 -0
  11. package/index.ts +4 -0
  12. package/language.ts +7 -0
  13. package/package.json +45 -0
  14. package/rush-logs/quark.apply-exports.cache.log +1 -0
  15. package/rush-logs/quark.apply-exports.log +1 -0
  16. package/rush-logs/quark.build_package-metas.cache.log +1 -0
  17. package/rush-logs/quark.build_package-metas.log +1 -0
  18. package/src/actions.ts +445 -0
  19. package/src/ast.ts +187 -0
  20. package/src/bindings.ts +115 -0
  21. package/src/builtin-modules.ts +401 -0
  22. package/src/constants.ts +47 -0
  23. package/src/cycle-check.ts +121 -0
  24. package/src/devtools-hook.ts +303 -0
  25. package/src/element-api.ts +109 -0
  26. package/src/evaluator.ts +317 -0
  27. package/src/form-controls.ts +69 -0
  28. package/src/language-tables.ts +137 -0
  29. package/src/language.ts +1225 -0
  30. package/src/observer.ts +110 -0
  31. package/src/paint.ts +305 -0
  32. package/src/properties.ts +818 -0
  33. package/src/props.ts +94 -0
  34. package/src/quark-element.ts +7 -0
  35. package/src/quark-internal.ts +365 -0
  36. package/src/quark.ts +817 -0
  37. package/src/resolvers.ts +867 -0
  38. package/src/rule.ts +800 -0
  39. package/src/scope-id.ts +47 -0
  40. package/src/selector-utils.ts +430 -0
  41. package/src/settle.ts +117 -0
  42. package/src/types.ts +155 -0
  43. package/src/utils.ts +79 -0
  44. package/src/variables.ts +359 -0
  45. package/support/demos/css-variables.html +18 -0
  46. package/support/demos/dispatch.html +20 -0
  47. package/support/demos/events.html +9 -0
  48. package/support/demos/iterate.html +13 -0
  49. package/support/demos/js-api.html +17 -0
  50. package/support/demos/provider-list.html +16 -0
  51. package/support/demos/toggle-content.html +14 -0
  52. package/support/demos/unset.html +12 -0
  53. package/support/demos/view-transition.html +36 -0
  54. package/support/docs/ATTRIBUTES.md +37 -0
  55. package/support/docs/AT_RULES.md +45 -0
  56. package/support/docs/BUILTINS.md +57 -0
  57. package/support/docs/CONTENT.md +40 -0
  58. package/support/docs/CSS_VARIABLES.md +16 -0
  59. package/support/docs/DECLARATIONS.md +26 -0
  60. package/support/docs/DELAY.md +37 -0
  61. package/support/docs/DIAGNOSTICS.md +32 -0
  62. package/support/docs/DISPATCH.md +81 -0
  63. package/support/docs/ELEMENT_PROPERTIES.md +34 -0
  64. package/support/docs/EXPRESSIONS.md +31 -0
  65. package/support/docs/INTERNAL.md +8 -0
  66. package/support/docs/JS_API.md +53 -0
  67. package/support/docs/JS_WRITES.md +36 -0
  68. package/support/docs/LIMITATIONS.md +26 -0
  69. package/support/docs/LOOP_GUARD.md +30 -0
  70. package/support/docs/METHODS.md +43 -0
  71. package/support/docs/MODULES.md +111 -0
  72. package/support/docs/NO_REVERSION.md +18 -0
  73. package/support/docs/ON.md +87 -0
  74. package/support/docs/REACTIVITY.md +24 -0
  75. package/support/docs/README.md +143 -0
  76. package/support/docs/SELECTORS.md +87 -0
  77. package/support/docs/SHEETS.md +67 -0
  78. package/support/docs/SYNTAX.md +36 -0
  79. package/support/docs/USE.md +24 -0
  80. package/support/docs/VALUES.md +27 -0
  81. package/support/docs/VARIABLES.md +47 -0
  82. package/support/docs/VIEW_TRANSITION.md +64 -0
  83. package/support/docs-sections.json +65 -0
  84. package/support/package-meta.json +208 -0
  85. package/support/scripts/build-language-docs.mjs +196 -0
  86. package/support/tests/__snapshots__/css-variables.view.test.ts.snap +23 -0
  87. package/support/tests/__snapshots__/dispatch.view.test.ts.snap +23 -0
  88. package/support/tests/__snapshots__/events.view.test.ts.snap +23 -0
  89. package/support/tests/__snapshots__/iterate.view.test.ts.snap +23 -0
  90. package/support/tests/__snapshots__/js-api.view.test.ts.snap +23 -0
  91. package/support/tests/__snapshots__/provider-list.view.test.ts.snap +23 -0
  92. package/support/tests/__snapshots__/quark-features.test.ts.snap +1079 -0
  93. package/support/tests/__snapshots__/quark-with-providers.test.ts.snap +89 -0
  94. package/support/tests/__snapshots__/quark.test.ts.snap +221 -0
  95. package/support/tests/__snapshots__/selectors.test.ts.snap +133 -0
  96. package/support/tests/__snapshots__/toggle-content.view.test.ts.snap +23 -0
  97. package/support/tests/__snapshots__/unset.view.test.ts.snap +23 -0
  98. package/support/tests/__snapshots__/view-transition.view.test.ts.snap +23 -0
  99. package/support/tests/actions.test.ts +437 -0
  100. package/support/tests/builtin-modules.test.ts +337 -0
  101. package/support/tests/builtins.test.ts +189 -0
  102. package/support/tests/css-variables.view.test.ts +35 -0
  103. package/support/tests/delay.test.ts +244 -0
  104. package/support/tests/devtools-hook.test.ts +496 -0
  105. package/support/tests/diagnostics.test.ts +224 -0
  106. package/support/tests/dispatch.view.test.ts +43 -0
  107. package/support/tests/element-api.test.ts +202 -0
  108. package/support/tests/evaluator.test.ts +237 -0
  109. package/support/tests/events.view.test.ts +40 -0
  110. package/support/tests/form-controls.test.ts +452 -0
  111. package/support/tests/helpers.ts +354 -0
  112. package/support/tests/internals.test.ts +568 -0
  113. package/support/tests/iterate.view.test.ts +40 -0
  114. package/support/tests/js-api.view.test.ts +45 -0
  115. package/support/tests/language-docs.test.ts +147 -0
  116. package/support/tests/lifecycle.test.ts +440 -0
  117. package/support/tests/loop-guard.test.ts +323 -0
  118. package/support/tests/provider-list.view.test.ts +47 -0
  119. package/support/tests/quark-features.test.ts +2887 -0
  120. package/support/tests/quark-with-providers.test.ts +169 -0
  121. package/support/tests/quark.test.ts +359 -0
  122. package/support/tests/resolvers.test.ts +346 -0
  123. package/support/tests/selector-analysis.test.ts +281 -0
  124. package/support/tests/selectors.test.ts +670 -0
  125. package/support/tests/toggle-content.view.test.ts +40 -0
  126. package/support/tests/unset.view.test.ts +42 -0
  127. package/support/tests/view-helpers.ts +81 -0
  128. package/support/tests/view-transition.test.ts +1069 -0
  129. package/support/tests/view-transition.view.test.ts +76 -0
  130. package/tsconfig.json +5 -0
@@ -0,0 +1,40 @@
1
+ import "@excom/quark-sheet";
2
+ import {
3
+ afterEach,
4
+ describe,
5
+ expect,
6
+ it,
7
+ } from "@excom/heft-rig/profiles/default/config/test-utils";
8
+ import {
9
+ expectComplexity,
10
+ flush,
11
+ measureComplexity,
12
+ mountView,
13
+ readDemo,
14
+ } from "./view-helpers";
15
+
16
+ describe("toggle-content view", () => {
17
+ afterEach(() => {
18
+ document.body.innerHTML = "";
19
+ });
20
+
21
+ it("reflects details open and closed", async () => {
22
+ const { root, quark } = await mountView(
23
+ readDemo(import.meta.url, "toggle-content"),
24
+ );
25
+ const details = root.querySelector("details")!;
26
+ const status = root.querySelector("[bind-status]")!;
27
+ expect(status.textContent).toBe("Closed");
28
+ const meter = measureComplexity(quark!);
29
+ details.setAttribute("open", "");
30
+ await flush();
31
+ const budget = meter.take();
32
+ meter.stop();
33
+ expect(details.hasAttribute("open")).toBe(true);
34
+ expect(status.textContent).toBe("Open");
35
+ details.removeAttribute("open");
36
+ await flush();
37
+ expect(status.textContent).toBe("Closed");
38
+ expectComplexity(budget);
39
+ });
40
+ });
@@ -0,0 +1,42 @@
1
+ import "@excom/quark-sheet";
2
+ import {
3
+ afterEach,
4
+ describe,
5
+ expect,
6
+ it,
7
+ } from "@excom/heft-rig/profiles/default/config/test-utils";
8
+ import {
9
+ expectComplexity,
10
+ flush,
11
+ measureComplexity,
12
+ mountView,
13
+ readDemo,
14
+ } from "./view-helpers";
15
+
16
+ describe("unset view", () => {
17
+ afterEach(() => {
18
+ document.body.innerHTML = "";
19
+ });
20
+
21
+ it("shadows $foo while open and falls back when closed", async () => {
22
+ const { root, quark } = await mountView(readDemo(import.meta.url, "unset"));
23
+ expect(root.querySelector("[bind-foo]")?.textContent).toBe(
24
+ "$foo resolves to 1",
25
+ );
26
+ const details = root.querySelector("details")!;
27
+ const meter = measureComplexity(quark!);
28
+ details.setAttribute("open", "");
29
+ await flush();
30
+ const budget = meter.take();
31
+ meter.stop();
32
+ expect(root.querySelector("[bind-foo]")?.textContent).toBe(
33
+ "$foo resolves to 2",
34
+ );
35
+ details.removeAttribute("open");
36
+ await flush();
37
+ expect(root.querySelector("[bind-foo]")?.textContent).toBe(
38
+ "$foo resolves to 1",
39
+ );
40
+ expectComplexity(budget);
41
+ });
42
+ });
@@ -0,0 +1,81 @@
1
+ import { Quark } from "../../index";
2
+ import {
3
+ fixture,
4
+ waitForEvent,
5
+ } from "@excom/heft-rig/profiles/default/config/test-utils";
6
+ import { readFileSync } from "node:fs";
7
+ import { dirname, resolve } from "node:path";
8
+ import { fileURLToPath } from "node:url";
9
+ import * as demoUtils from "../../../docs-site/public/demo-utils";
10
+ import { flush } from "./helpers";
11
+
12
+ export {
13
+ bypassSelectorCache,
14
+ expectComplexity,
15
+ flush,
16
+ measureComplexity,
17
+ } from "./helpers";
18
+
19
+ const originalLoader = Quark.moduleLoader;
20
+
21
+ /** Resolve `@use "/demo-utils"` the way the docs-site live demos do. */
22
+ export const installDemoModules = (extra?: Record<string, unknown>) => {
23
+ Quark.moduleLoader = async (url: string) => {
24
+ if (url.includes("demo-utils")) return { ...demoUtils, ...extra };
25
+ if (extra) {
26
+ for (const key of Object.keys(extra)) {
27
+ if (url.includes(key)) return extra;
28
+ }
29
+ }
30
+ return originalLoader(url);
31
+ };
32
+ return () => {
33
+ Quark.moduleLoader = originalLoader;
34
+ };
35
+ };
36
+
37
+ export const restoreDemoModules = () => {
38
+ Quark.moduleLoader = originalLoader;
39
+ };
40
+
41
+ export const readViewFile = (fromImportMetaUrl: string, relPath: string) =>
42
+ readFileSync(
43
+ resolve(dirname(fileURLToPath(fromImportMetaUrl)), relPath),
44
+ "utf8"
45
+ );
46
+
47
+ export const readDemo = (fromImportMetaUrl: string, name: string) =>
48
+ readViewFile(fromImportMetaUrl, `../demos/${name}.html`);
49
+
50
+ const stripAssets = (html: string) =>
51
+ html.replace(/<link[\s\S]*?>/g, "").replace(/\s+src-url="[^"]*"/g, "");
52
+
53
+ /** Mount a demo / view. Inline `quarkSrc` when the sheet used `src-url`. */
54
+ export const mountView = async (
55
+ html: string,
56
+ quarkSrc?: string
57
+ ): Promise<{
58
+ root: HTMLElement;
59
+ sheet: HTMLQuarkSheetElement | null;
60
+ quark: InstanceType<typeof Quark> | undefined;
61
+ }> => {
62
+ const wrap = document.createElement("div");
63
+ wrap.innerHTML = stripAssets(html);
64
+ const kids = [...wrap.children] as HTMLElement[];
65
+ const root = (kids.length === 1 ? kids[0] : wrap) as HTMLElement;
66
+ const sheet = wrap.querySelector<HTMLQuarkSheetElement>("quark-sheet");
67
+ if (sheet && quarkSrc) sheet.textContent = quarkSrc;
68
+ document.body.append(wrap);
69
+ if (sheet && !sheet.quarkInstance) {
70
+ await waitForEvent(sheet, "quark-sheet-success");
71
+ }
72
+ await flush();
73
+ return { root, sheet, quark: sheet?.quarkInstance };
74
+ };
75
+
76
+ export const click = (el: Element | null) => {
77
+ if (!el) throw new Error("click: missing element");
78
+ el.dispatchEvent(
79
+ new MouseEvent("click", { bubbles: true, cancelable: true })
80
+ );
81
+ };