@praxisjs/css 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.
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/dist/__tests__/css-builder.test.d.ts +2 -0
- package/dist/__tests__/css-builder.test.d.ts.map +1 -0
- package/dist/__tests__/css-builder.test.js +198 -0
- package/dist/__tests__/css-builder.test.js.map +1 -0
- package/dist/__tests__/cx.test.d.ts +2 -0
- package/dist/__tests__/cx.test.d.ts.map +1 -0
- package/dist/__tests__/cx.test.js +47 -0
- package/dist/__tests__/cx.test.js.map +1 -0
- package/dist/__tests__/decorators.test.d.ts +2 -0
- package/dist/__tests__/decorators.test.d.ts.map +1 -0
- package/dist/__tests__/decorators.test.js +268 -0
- package/dist/__tests__/decorators.test.js.map +1 -0
- package/dist/__tests__/extract.test.d.ts +2 -0
- package/dist/__tests__/extract.test.d.ts.map +1 -0
- package/dist/__tests__/extract.test.js +420 -0
- package/dist/__tests__/extract.test.js.map +1 -0
- package/dist/__tests__/global.test.d.ts +2 -0
- package/dist/__tests__/global.test.d.ts.map +1 -0
- package/dist/__tests__/global.test.js +117 -0
- package/dist/__tests__/global.test.js.map +1 -0
- package/dist/__tests__/keyframes.test.d.ts +2 -0
- package/dist/__tests__/keyframes.test.d.ts.map +1 -0
- package/dist/__tests__/keyframes.test.js +90 -0
- package/dist/__tests__/keyframes.test.js.map +1 -0
- package/dist/__tests__/preflight.test.d.ts +2 -0
- package/dist/__tests__/preflight.test.d.ts.map +1 -0
- package/dist/__tests__/preflight.test.js +55 -0
- package/dist/__tests__/preflight.test.js.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +132 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/style.test.d.ts +2 -0
- package/dist/__tests__/style.test.d.ts.map +1 -0
- package/dist/__tests__/style.test.js +257 -0
- package/dist/__tests__/style.test.js.map +1 -0
- package/dist/__tests__/styled.test.d.ts +2 -0
- package/dist/__tests__/styled.test.d.ts.map +1 -0
- package/dist/__tests__/styled.test.js +951 -0
- package/dist/__tests__/styled.test.js.map +1 -0
- package/dist/__tests__/theme-instance.test.d.ts +2 -0
- package/dist/__tests__/theme-instance.test.d.ts.map +1 -0
- package/dist/__tests__/theme-instance.test.js +317 -0
- package/dist/__tests__/theme-instance.test.js.map +1 -0
- package/dist/__tests__/theme-uninit.test.d.ts +2 -0
- package/dist/__tests__/theme-uninit.test.d.ts.map +1 -0
- package/dist/__tests__/theme-uninit.test.js +10 -0
- package/dist/__tests__/theme-uninit.test.js.map +1 -0
- package/dist/__tests__/token-sheet.test.d.ts +2 -0
- package/dist/__tests__/token-sheet.test.d.ts.map +1 -0
- package/dist/__tests__/token-sheet.test.js +74 -0
- package/dist/__tests__/token-sheet.test.js.map +1 -0
- package/dist/base/stylesheet.d.ts +30 -0
- package/dist/base/stylesheet.d.ts.map +1 -0
- package/dist/base/stylesheet.js +29 -0
- package/dist/base/stylesheet.js.map +1 -0
- package/dist/builder/css-builder.d.ts +98 -0
- package/dist/builder/css-builder.d.ts.map +1 -0
- package/dist/builder/css-builder.js +79 -0
- package/dist/builder/css-builder.js.map +1 -0
- package/dist/builder/keyframes.d.ts +23 -0
- package/dist/builder/keyframes.d.ts.map +1 -0
- package/dist/builder/keyframes.js +54 -0
- package/dist/builder/keyframes.js.map +1 -0
- package/dist/cx.d.ts +3 -0
- package/dist/cx.d.ts.map +1 -0
- package/dist/cx.js +23 -0
- package/dist/cx.js.map +1 -0
- package/dist/decorators/param.d.ts +23 -0
- package/dist/decorators/param.d.ts.map +1 -0
- package/dist/decorators/param.js +39 -0
- package/dist/decorators/param.js.map +1 -0
- package/dist/decorators/style.d.ts +15 -0
- package/dist/decorators/style.d.ts.map +1 -0
- package/dist/decorators/style.js +53 -0
- package/dist/decorators/style.js.map +1 -0
- package/dist/decorators/styled.d.ts +37 -0
- package/dist/decorators/styled.d.ts.map +1 -0
- package/dist/decorators/styled.js +138 -0
- package/dist/decorators/styled.js.map +1 -0
- package/dist/extract.d.ts +14 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +124 -0
- package/dist/extract.js.map +1 -0
- package/dist/global.d.ts +27 -0
- package/dist/global.d.ts.map +1 -0
- package/dist/global.js +49 -0
- package/dist/global.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/collector.d.ts +15 -0
- package/dist/internal/collector.d.ts.map +1 -0
- package/dist/internal/collector.js +33 -0
- package/dist/internal/collector.js.map +1 -0
- package/dist/internal/hash.d.ts +5 -0
- package/dist/internal/hash.d.ts.map +1 -0
- package/dist/internal/hash.js +11 -0
- package/dist/internal/hash.js.map +1 -0
- package/dist/internal/registry.d.ts +3 -0
- package/dist/internal/registry.d.ts.map +1 -0
- package/dist/internal/registry.js +41 -0
- package/dist/internal/registry.js.map +1 -0
- package/dist/preflight.d.ts +18 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +191 -0
- package/dist/preflight.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +8 -0
- package/dist/server.js.map +1 -0
- package/dist/tokens/decorators.d.ts +41 -0
- package/dist/tokens/decorators.d.ts.map +1 -0
- package/dist/tokens/decorators.js +73 -0
- package/dist/tokens/decorators.js.map +1 -0
- package/dist/tokens/index.d.ts +4 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +4 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/theme-instance.d.ts +33 -0
- package/dist/tokens/theme-instance.d.ts.map +1 -0
- package/dist/tokens/theme-instance.js +130 -0
- package/dist/tokens/theme-instance.js.map +1 -0
- package/dist/tokens/token-sheet.d.ts +46 -0
- package/dist/tokens/token-sheet.d.ts.map +1 -0
- package/dist/tokens/token-sheet.js +55 -0
- package/dist/tokens/token-sheet.js.map +1 -0
- package/package.json +33 -0
- package/src/__tests__/css-builder.test.ts +230 -0
- package/src/__tests__/cx.test.ts +63 -0
- package/src/__tests__/decorators.test.ts +127 -0
- package/src/__tests__/extract.test.ts +418 -0
- package/src/__tests__/global.test.ts +140 -0
- package/src/__tests__/keyframes.test.ts +103 -0
- package/src/__tests__/preflight.test.ts +63 -0
- package/src/__tests__/registry.test.ts +151 -0
- package/src/__tests__/style.test.ts +153 -0
- package/src/__tests__/styled.test.ts +427 -0
- package/src/__tests__/theme-instance.test.ts +374 -0
- package/src/__tests__/theme-uninit.test.ts +12 -0
- package/src/__tests__/token-sheet.test.ts +87 -0
- package/src/base/stylesheet.ts +35 -0
- package/src/builder/css-builder.ts +204 -0
- package/src/builder/keyframes.ts +66 -0
- package/src/cx.ts +26 -0
- package/src/decorators/param.ts +40 -0
- package/src/decorators/style.ts +55 -0
- package/src/decorators/styled.ts +167 -0
- package/src/extract.ts +133 -0
- package/src/global.ts +60 -0
- package/src/index.ts +10 -0
- package/src/internal/collector.ts +38 -0
- package/src/internal/hash.ts +10 -0
- package/src/internal/registry.ts +51 -0
- package/src/preflight.ts +192 -0
- package/src/server.ts +12 -0
- package/src/tokens/decorators.ts +108 -0
- package/src/tokens/index.ts +3 -0
- package/src/tokens/theme-instance.ts +149 -0
- package/src/tokens/token-sheet.ts +86 -0
- package/tsconfig.json +8 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# @praxisjs/css
|
|
2
|
+
|
|
3
|
+
## 0.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 74fabcc: Initial release of `@praxisjs/css`.
|
|
8
|
+
|
|
9
|
+
Scoped CSS with typed class names, reactive CSS custom properties, a fluent builder, design tokens, and static build-time extraction via the `praxisjsCSS()` Vite plugin.
|
|
10
|
+
|
|
11
|
+
**Stylesheet API**: `Stylesheet`, `ReactiveStylesheet`, `@Styled()`, `this.css({})`, `@Param()`, `@Style()`, `keyframes()`, `cx()`.
|
|
12
|
+
|
|
13
|
+
**`globalStyle(factory)`** — injects unscoped CSS via a factory that receives `css` (= `createCSSBuilder`, same as `this.css()` in `Stylesheet`) and returns a `CSSBuilder` or raw string. Use `.on(selector, props)` for element rules.
|
|
14
|
+
|
|
15
|
+
**`preflight()`** — opinionated browser reset inspired by Tailwind CSS preflight, with standard system font stacks (no Tailwind-specific references). Idempotent and statically extracted by the Vite plugin.
|
|
16
|
+
|
|
17
|
+
**Design tokens**: `TokenSheet`, `tokenVars()`, `ThemeInstance`, `@Themed()`, `@Theme()`, `theme()`.
|
|
18
|
+
|
|
19
|
+
**Static extraction**: `praxisjsCSS()` Vite plugin (exported from `@praxisjs/vite-plugin`) extracts all CSS at build time into `virtual:praxisjs/styles.css`.
|
|
20
|
+
|
|
21
|
+
**SSR / integrator APIs**: `@praxisjs/css/server` (collector API) and `@praxisjs/css/extract` (build-time extraction module).
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- Updated dependencies [a0372af]
|
|
26
|
+
- @praxisjs/decorators@1.1.1
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026-present Mateus Martins
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-builder.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/css-builder.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createCSSBuilder, isCSSBuilder } from "../builder/css-builder";
|
|
3
|
+
describe("createCSSBuilder()", () => {
|
|
4
|
+
it("serialises a flat property object to CSS declarations", () => {
|
|
5
|
+
const css = createCSSBuilder({ display: "flex", gap: "12px", padding: "16px" });
|
|
6
|
+
expect(String(css)).toBe("display: flex;\ngap: 12px;\npadding: 16px;");
|
|
7
|
+
});
|
|
8
|
+
it("converts camelCase properties to kebab-case", () => {
|
|
9
|
+
const css = createCSSBuilder({ flexDirection: "column", borderRadius: "8px", fontSize: "1rem" });
|
|
10
|
+
expect(String(css)).toContain("flex-direction: column;");
|
|
11
|
+
expect(String(css)).toContain("border-radius: 8px;");
|
|
12
|
+
expect(String(css)).toContain("font-size: 1rem;");
|
|
13
|
+
});
|
|
14
|
+
it("skips null and undefined values", () => {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
const css = createCSSBuilder({ display: "flex", color: undefined });
|
|
17
|
+
expect(String(css)).toBe("display: flex;");
|
|
18
|
+
});
|
|
19
|
+
it("returns empty string when no properties are given", () => {
|
|
20
|
+
expect(String(createCSSBuilder({}))).toBe("");
|
|
21
|
+
});
|
|
22
|
+
it("accepts CSS custom properties (--var)", () => {
|
|
23
|
+
const css = createCSSBuilder({ "--accent": "#3b82f6" });
|
|
24
|
+
expect(String(css)).toContain("--accent: #3b82f6;");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("CSSBuilder — pseudo-state nesting", () => {
|
|
28
|
+
it(".hover() adds &:hover block", () => {
|
|
29
|
+
const css = createCSSBuilder({ display: "flex" }).hover({ opacity: 0.9 });
|
|
30
|
+
const out = String(css);
|
|
31
|
+
expect(out).toContain("display: flex;");
|
|
32
|
+
expect(out).toContain("&:hover {");
|
|
33
|
+
expect(out).toContain(" opacity: 0.9;");
|
|
34
|
+
});
|
|
35
|
+
it(".focus() adds &:focus block", () => {
|
|
36
|
+
const out = String(createCSSBuilder({ color: "red" }).focus({ outline: "2px solid blue" }));
|
|
37
|
+
expect(out).toContain("&:focus {");
|
|
38
|
+
expect(out).toContain(" outline: 2px solid blue;");
|
|
39
|
+
});
|
|
40
|
+
it(".focusWithin() adds &:focus-within block", () => {
|
|
41
|
+
expect(String(createCSSBuilder({}).focusWithin({ color: "red" }))).toContain("&:focus-within {");
|
|
42
|
+
});
|
|
43
|
+
it(".focusVisible() adds &:focus-visible block", () => {
|
|
44
|
+
expect(String(createCSSBuilder({}).focusVisible({ outline: "none" }))).toContain("&:focus-visible {");
|
|
45
|
+
});
|
|
46
|
+
it(".active() adds &:active block", () => {
|
|
47
|
+
expect(String(createCSSBuilder({}).active({ transform: "scale(0.98)" }))).toContain("&:active {");
|
|
48
|
+
});
|
|
49
|
+
it(".disabled() adds &:disabled + aria-disabled block", () => {
|
|
50
|
+
const out = String(createCSSBuilder({}).disabled({ opacity: 0.4 }));
|
|
51
|
+
expect(out).toContain("&:disabled");
|
|
52
|
+
expect(out).toContain("aria-disabled");
|
|
53
|
+
});
|
|
54
|
+
it(".checked() adds &:checked block", () => {
|
|
55
|
+
expect(String(createCSSBuilder({}).checked({ background: "blue" }))).toContain("&:checked {");
|
|
56
|
+
});
|
|
57
|
+
it(".placeholder() adds &::placeholder block", () => {
|
|
58
|
+
expect(String(createCSSBuilder({}).placeholder({ color: "#999" }))).toContain("&::placeholder {");
|
|
59
|
+
});
|
|
60
|
+
it(".first() adds &:first-child block", () => {
|
|
61
|
+
expect(String(createCSSBuilder({}).first({ marginTop: 0 }))).toContain("&:first-child {");
|
|
62
|
+
});
|
|
63
|
+
it(".last() adds &:last-child block", () => {
|
|
64
|
+
expect(String(createCSSBuilder({}).last({ marginBottom: 0 }))).toContain("&:last-child {");
|
|
65
|
+
});
|
|
66
|
+
it(".nthChild() adds &:nth-child(n) block", () => {
|
|
67
|
+
expect(String(createCSSBuilder({}).nthChild("2n+1", { background: "#f0f0f0" }))).toContain("&:nth-child(2n+1) {");
|
|
68
|
+
});
|
|
69
|
+
it(".not() adds &:not(selector) block", () => {
|
|
70
|
+
expect(String(createCSSBuilder({}).not(".active", { opacity: 0.5 }))).toContain("&:not(.active) {");
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("CSSBuilder — at-rule nesting", () => {
|
|
74
|
+
it(".media() adds @media (query) block", () => {
|
|
75
|
+
const out = String(createCSSBuilder({ display: "flex" }).media("max-width: 640px", { flexDirection: "column" }));
|
|
76
|
+
expect(out).toContain("@media (max-width: 640px) {");
|
|
77
|
+
expect(out).toContain(" flex-direction: column;");
|
|
78
|
+
});
|
|
79
|
+
it(".container() adds @container (query) block", () => {
|
|
80
|
+
const out = String(createCSSBuilder({}).container("min-width: 400px", { padding: "16px" }));
|
|
81
|
+
expect(out).toContain("@container (min-width: 400px) {");
|
|
82
|
+
});
|
|
83
|
+
it(".on() adds any arbitrary selector or at-rule", () => {
|
|
84
|
+
const out = String(createCSSBuilder({}).on("&::before", { content: '""', display: "block" }));
|
|
85
|
+
expect(out).toContain("&::before {");
|
|
86
|
+
expect(out).toContain(" content: \"\";");
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("CSSBuilder — chaining", () => {
|
|
90
|
+
it("chains multiple nesting calls correctly", () => {
|
|
91
|
+
const out = String(createCSSBuilder({ display: "flex" })
|
|
92
|
+
.hover({ opacity: 0.9 })
|
|
93
|
+
.focus({ outline: "2px solid blue" })
|
|
94
|
+
.media("max-width: 640px", { flexDirection: "column" }));
|
|
95
|
+
expect(out).toContain("display: flex;");
|
|
96
|
+
expect(out).toContain("&:hover {");
|
|
97
|
+
expect(out).toContain("&:focus {");
|
|
98
|
+
expect(out).toContain("@media (max-width: 640px) {");
|
|
99
|
+
});
|
|
100
|
+
it("each chained call returns the same builder (fluent pattern)", () => {
|
|
101
|
+
const b1 = createCSSBuilder({ display: "flex" });
|
|
102
|
+
const b2 = b1.hover({ opacity: 0.9 });
|
|
103
|
+
expect(b1).toBe(b2);
|
|
104
|
+
});
|
|
105
|
+
it("skips nested block when props are empty", () => {
|
|
106
|
+
const out = String(createCSSBuilder({ display: "flex" }).hover({}));
|
|
107
|
+
expect(out).not.toContain("&:hover");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe("CSSBuilder — pseudo-elements", () => {
|
|
111
|
+
it(".before() adds &::before block", () => {
|
|
112
|
+
expect(String(createCSSBuilder({}).before({ content: '""', display: "block" }))).toContain("&::before {");
|
|
113
|
+
});
|
|
114
|
+
it(".after() adds &::after block", () => {
|
|
115
|
+
expect(String(createCSSBuilder({}).after({ content: '""' }))).toContain("&::after {");
|
|
116
|
+
});
|
|
117
|
+
it(".selection() adds &::selection block", () => {
|
|
118
|
+
expect(String(createCSSBuilder({}).selection({ background: "blue" }))).toContain("&::selection {");
|
|
119
|
+
});
|
|
120
|
+
it(".firstLine() adds &::first-line block", () => {
|
|
121
|
+
expect(String(createCSSBuilder({}).firstLine({ fontWeight: "bold" }))).toContain("&::first-line {");
|
|
122
|
+
});
|
|
123
|
+
it(".firstLetter() adds &::first-letter block", () => {
|
|
124
|
+
expect(String(createCSSBuilder({}).firstLetter({ fontSize: "2em" }))).toContain("&::first-letter {");
|
|
125
|
+
});
|
|
126
|
+
it(".marker() adds &::marker block", () => {
|
|
127
|
+
expect(String(createCSSBuilder({}).marker({ color: "red" }))).toContain("&::marker {");
|
|
128
|
+
});
|
|
129
|
+
it(".backdrop() adds &::backdrop block", () => {
|
|
130
|
+
expect(String(createCSSBuilder({}).backdrop({ background: "rgba(0,0,0,0.5)" }))).toContain("&::backdrop {");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe("CSSBuilder — form pseudo-classes", () => {
|
|
134
|
+
it(".enabled() adds &:enabled block", () => {
|
|
135
|
+
expect(String(createCSSBuilder({}).enabled({ opacity: 1 }))).toContain("&:enabled {");
|
|
136
|
+
});
|
|
137
|
+
it(".indeterminate() adds &:indeterminate block", () => {
|
|
138
|
+
expect(String(createCSSBuilder({}).indeterminate({ opacity: 0.5 }))).toContain("&:indeterminate {");
|
|
139
|
+
});
|
|
140
|
+
it(".required() adds &:required block", () => {
|
|
141
|
+
expect(String(createCSSBuilder({}).required({ borderColor: "red" }))).toContain("&:required {");
|
|
142
|
+
});
|
|
143
|
+
it(".optional() adds &:optional block", () => {
|
|
144
|
+
expect(String(createCSSBuilder({}).optional({ borderColor: "gray" }))).toContain("&:optional {");
|
|
145
|
+
});
|
|
146
|
+
it(".valid() adds &:valid block", () => {
|
|
147
|
+
expect(String(createCSSBuilder({}).valid({ borderColor: "green" }))).toContain("&:valid {");
|
|
148
|
+
});
|
|
149
|
+
it(".invalid() adds &:invalid block", () => {
|
|
150
|
+
expect(String(createCSSBuilder({}).invalid({ borderColor: "red" }))).toContain("&:invalid {");
|
|
151
|
+
});
|
|
152
|
+
it(".readOnly() adds &:read-only block", () => {
|
|
153
|
+
expect(String(createCSSBuilder({}).readOnly({ opacity: 0.7 }))).toContain("&:read-only {");
|
|
154
|
+
});
|
|
155
|
+
it(".visited() adds &:visited block", () => {
|
|
156
|
+
expect(String(createCSSBuilder({}).visited({ color: "purple" }))).toContain("&:visited {");
|
|
157
|
+
});
|
|
158
|
+
it(".target() adds &:target block", () => {
|
|
159
|
+
expect(String(createCSSBuilder({}).target({ outline: "2px solid blue" }))).toContain("&:target {");
|
|
160
|
+
});
|
|
161
|
+
it(".empty() adds &:empty block", () => {
|
|
162
|
+
expect(String(createCSSBuilder({}).empty({ display: "none" }))).toContain("&:empty {");
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe("CSSBuilder — relational pseudo-classes", () => {
|
|
166
|
+
it(".has() adds &:has(selector) block", () => {
|
|
167
|
+
expect(String(createCSSBuilder({}).has(".active", { fontWeight: "bold" }))).toContain("&:has(.active) {");
|
|
168
|
+
});
|
|
169
|
+
it(".is() adds &:is(selector) block", () => {
|
|
170
|
+
expect(String(createCSSBuilder({}).is("h1, h2", { lineHeight: 1.2 }))).toContain("&:is(h1, h2) {");
|
|
171
|
+
});
|
|
172
|
+
it(".where() adds &:where(selector) block", () => {
|
|
173
|
+
expect(String(createCSSBuilder({}).where("a, button", { cursor: "pointer" }))).toContain("&:where(a, button) {");
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe("CSSBuilder — @supports", () => {
|
|
177
|
+
it(".supports() adds @supports (condition) block", () => {
|
|
178
|
+
const out = String(createCSSBuilder({ display: "flex" }).supports("display: grid", { display: "grid" }));
|
|
179
|
+
expect(out).toContain("@supports (display: grid) {");
|
|
180
|
+
expect(out).toContain(" display: grid;");
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe("isCSSBuilder()", () => {
|
|
184
|
+
it("returns true for a CSSBuilder instance", () => {
|
|
185
|
+
expect(isCSSBuilder(createCSSBuilder({ display: "flex" }))).toBe(true);
|
|
186
|
+
});
|
|
187
|
+
it("returns false for plain strings", () => {
|
|
188
|
+
expect(isCSSBuilder("display: flex;")).toBe(false);
|
|
189
|
+
});
|
|
190
|
+
it("returns false for null and undefined", () => {
|
|
191
|
+
expect(isCSSBuilder(null)).toBe(false);
|
|
192
|
+
expect(isCSSBuilder(undefined)).toBe(false);
|
|
193
|
+
});
|
|
194
|
+
it("returns false for plain objects", () => {
|
|
195
|
+
expect(isCSSBuilder({ display: "flex" })).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=css-builder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-builder.test.js","sourceRoot":"","sources":["../../src/__tests__/css-builder.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cx.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cx.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { cx } from "../cx";
|
|
3
|
+
describe("cx()", () => {
|
|
4
|
+
it("returns empty string with no args", () => {
|
|
5
|
+
expect(cx()).toBe("");
|
|
6
|
+
});
|
|
7
|
+
it("handles plain strings", () => {
|
|
8
|
+
expect(cx("a", "b", "c")).toBe("a b c");
|
|
9
|
+
});
|
|
10
|
+
it("filters falsy values", () => {
|
|
11
|
+
expect(cx(null, undefined, false, "valid")).toBe("valid");
|
|
12
|
+
});
|
|
13
|
+
it("includes 0 as a string", () => {
|
|
14
|
+
expect(cx(0)).toBe("0");
|
|
15
|
+
});
|
|
16
|
+
it("includes numeric class names", () => {
|
|
17
|
+
expect(cx(1, 2)).toBe("1 2");
|
|
18
|
+
});
|
|
19
|
+
it("handles objects — includes truthy keys", () => {
|
|
20
|
+
expect(cx({ active: true, disabled: false, loading: true })).toBe("active loading");
|
|
21
|
+
});
|
|
22
|
+
it("handles objects with zero values as falsy", () => {
|
|
23
|
+
expect(cx({ a: 1, b: 0, c: "", d: null, e: "yes" })).toBe("a e");
|
|
24
|
+
});
|
|
25
|
+
it("handles arrays recursively", () => {
|
|
26
|
+
expect(cx("a", ["b", false, "c"])).toBe("a b c");
|
|
27
|
+
});
|
|
28
|
+
it("handles deeply nested arrays", () => {
|
|
29
|
+
expect(cx(["a", ["b", ["c"]]])).toBe("a b c");
|
|
30
|
+
});
|
|
31
|
+
it("combines strings, objects, and arrays", () => {
|
|
32
|
+
expect(cx("base", { active: true, disabled: false }, ["extra"])).toBe("base active extra");
|
|
33
|
+
});
|
|
34
|
+
it("returns empty string for all-falsy input", () => {
|
|
35
|
+
expect(cx(false, null, undefined, "")).toBe("");
|
|
36
|
+
});
|
|
37
|
+
it("skips empty result from all-falsy nested array", () => {
|
|
38
|
+
// inner = cx(false, null) = "" → falsy → not pushed
|
|
39
|
+
expect(cx("a", [false, null, undefined])).toBe("a");
|
|
40
|
+
expect(cx([false, null])).toBe("");
|
|
41
|
+
});
|
|
42
|
+
it("ignores boolean true — not a string, number, array, or object", () => {
|
|
43
|
+
// boolean true passes the !arg guard but hits the else-if(object) false branch
|
|
44
|
+
expect(cx(true, "valid")).toBe("valid");
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=cx.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cx.test.js","sourceRoot":"","sources":["../../src/__tests__/cx.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/decorators.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
// @vitest-environment jsdom
|
|
36
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
37
|
+
import { Themed, Theme } from "../tokens/decorators";
|
|
38
|
+
import { theme, ThemeInstance, createThemeInstance } from "../tokens/theme-instance";
|
|
39
|
+
import { TokenSheet } from "../tokens/token-sheet";
|
|
40
|
+
// ─── Fixtures ─────────────────────────────────────────────────────────────────
|
|
41
|
+
class AppTokens extends TokenSheet {
|
|
42
|
+
}
|
|
43
|
+
class LightTheme extends AppTokens {
|
|
44
|
+
constructor() {
|
|
45
|
+
super(...arguments);
|
|
46
|
+
this.colorPrimary = "#3b82f6";
|
|
47
|
+
this.colorBg = "#ffffff";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
class DarkTheme extends LightTheme {
|
|
51
|
+
constructor() {
|
|
52
|
+
super(...arguments);
|
|
53
|
+
this.colorPrimary = "#60a5fa";
|
|
54
|
+
this.colorBg = "#0f172a";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function styleEl() {
|
|
58
|
+
return document.querySelector("style[data-praxis-theme]");
|
|
59
|
+
}
|
|
60
|
+
beforeEach(() => { styleEl()?.remove(); });
|
|
61
|
+
afterEach(() => { styleEl()?.remove(); });
|
|
62
|
+
// ─── @Themed ──────────────────────────────────────────────────────────────────
|
|
63
|
+
describe("@Themed — class decorator", () => {
|
|
64
|
+
it("initialize() creates a ThemeInstance singleton at class-decoration time", () => {
|
|
65
|
+
let App = (() => {
|
|
66
|
+
let _classDecorators = [Themed(AppTokens, LightTheme)];
|
|
67
|
+
let _classDescriptor;
|
|
68
|
+
let _classExtraInitializers = [];
|
|
69
|
+
let _classThis;
|
|
70
|
+
var App = class {
|
|
71
|
+
static { _classThis = this; }
|
|
72
|
+
static {
|
|
73
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
74
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
75
|
+
App = _classThis = _classDescriptor.value;
|
|
76
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
77
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
return App = _classThis;
|
|
81
|
+
})();
|
|
82
|
+
void App;
|
|
83
|
+
expect(theme()).toBeInstanceOf(ThemeInstance);
|
|
84
|
+
expect(styleEl()).not.toBeNull();
|
|
85
|
+
});
|
|
86
|
+
it("injected :root vars match the default theme", () => {
|
|
87
|
+
let App = (() => {
|
|
88
|
+
let _classDecorators = [Themed(AppTokens, LightTheme)];
|
|
89
|
+
let _classDescriptor;
|
|
90
|
+
let _classExtraInitializers = [];
|
|
91
|
+
let _classThis;
|
|
92
|
+
var App = class {
|
|
93
|
+
static { _classThis = this; }
|
|
94
|
+
static {
|
|
95
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
96
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
97
|
+
App = _classThis = _classDescriptor.value;
|
|
98
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
99
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
return App = _classThis;
|
|
103
|
+
})();
|
|
104
|
+
void App;
|
|
105
|
+
const css = styleEl()?.textContent ?? "";
|
|
106
|
+
expect(css).toContain("--color-primary: #3b82f6");
|
|
107
|
+
expect(css).toContain("--color-bg: #ffffff");
|
|
108
|
+
});
|
|
109
|
+
it("create() re-creates the singleton when the class is instantiated", () => {
|
|
110
|
+
let App = (() => {
|
|
111
|
+
let _classDecorators = [Themed(AppTokens, DarkTheme)];
|
|
112
|
+
let _classDescriptor;
|
|
113
|
+
let _classExtraInitializers = [];
|
|
114
|
+
let _classThis;
|
|
115
|
+
var App = class {
|
|
116
|
+
static { _classThis = this; }
|
|
117
|
+
static {
|
|
118
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
119
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
120
|
+
App = _classThis = _classDescriptor.value;
|
|
121
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
122
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
123
|
+
}
|
|
124
|
+
// minimal render so createClassDecorator doesn't strip it
|
|
125
|
+
render() { return null; }
|
|
126
|
+
};
|
|
127
|
+
return App = _classThis;
|
|
128
|
+
})();
|
|
129
|
+
const t = theme();
|
|
130
|
+
expect(t.current).toBeInstanceOf(DarkTheme);
|
|
131
|
+
// Instantiating the class triggers create() which calls createThemeInstance again
|
|
132
|
+
new App();
|
|
133
|
+
expect(theme()).toBeInstanceOf(ThemeInstance);
|
|
134
|
+
});
|
|
135
|
+
it("passes persist config to ThemeInstance", () => {
|
|
136
|
+
let App = (() => {
|
|
137
|
+
let _classDecorators = [Themed(AppTokens, LightTheme, { persist: true })];
|
|
138
|
+
let _classDescriptor;
|
|
139
|
+
let _classExtraInitializers = [];
|
|
140
|
+
let _classThis;
|
|
141
|
+
var App = class {
|
|
142
|
+
static { _classThis = this; }
|
|
143
|
+
static {
|
|
144
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
145
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
146
|
+
App = _classThis = _classDescriptor.value;
|
|
147
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
148
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
return App = _classThis;
|
|
152
|
+
})();
|
|
153
|
+
void App;
|
|
154
|
+
theme().switch(DarkTheme);
|
|
155
|
+
expect(localStorage.getItem("praxis-theme")).not.toBeNull();
|
|
156
|
+
localStorage.clear();
|
|
157
|
+
});
|
|
158
|
+
it("second @Themed decoration overwrites the singleton", () => {
|
|
159
|
+
let App = (() => {
|
|
160
|
+
let _classDecorators = [Themed(AppTokens, LightTheme)];
|
|
161
|
+
let _classDescriptor;
|
|
162
|
+
let _classExtraInitializers = [];
|
|
163
|
+
let _classThis;
|
|
164
|
+
var App = class {
|
|
165
|
+
static { _classThis = this; }
|
|
166
|
+
static {
|
|
167
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
168
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
169
|
+
App = _classThis = _classDescriptor.value;
|
|
170
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
171
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
return App = _classThis;
|
|
175
|
+
})();
|
|
176
|
+
void App;
|
|
177
|
+
let App2 = (() => {
|
|
178
|
+
let _classDecorators = [Themed(AppTokens, DarkTheme)];
|
|
179
|
+
let _classDescriptor;
|
|
180
|
+
let _classExtraInitializers = [];
|
|
181
|
+
let _classThis;
|
|
182
|
+
var App2 = class {
|
|
183
|
+
static { _classThis = this; }
|
|
184
|
+
static {
|
|
185
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
186
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
187
|
+
App2 = _classThis = _classDescriptor.value;
|
|
188
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
189
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
return App2 = _classThis;
|
|
193
|
+
})();
|
|
194
|
+
void App2;
|
|
195
|
+
expect(theme().current.colorPrimary).toBe("#60a5fa");
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
// ─── @Theme ───────────────────────────────────────────────────────────────────
|
|
199
|
+
describe("@Theme — field decorator", () => {
|
|
200
|
+
it("returns the singleton ThemeInstance via getter", () => {
|
|
201
|
+
createThemeInstance(LightTheme);
|
|
202
|
+
let Comp = (() => {
|
|
203
|
+
let _theme_decorators;
|
|
204
|
+
let _theme_initializers = [];
|
|
205
|
+
let _theme_extraInitializers = [];
|
|
206
|
+
return class Comp {
|
|
207
|
+
static {
|
|
208
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
209
|
+
_theme_decorators = [Theme()];
|
|
210
|
+
__esDecorate(null, null, _theme_decorators, { kind: "field", name: "theme", static: false, private: false, access: { has: obj => "theme" in obj, get: obj => obj.theme, set: (obj, value) => { obj.theme = value; } }, metadata: _metadata }, _theme_initializers, _theme_extraInitializers);
|
|
211
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
212
|
+
}
|
|
213
|
+
constructor() {
|
|
214
|
+
this.theme = __runInitializers(this, _theme_initializers, void 0);
|
|
215
|
+
__runInitializers(this, _theme_extraInitializers);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
})();
|
|
219
|
+
expect(new Comp().theme).toBe(theme());
|
|
220
|
+
});
|
|
221
|
+
it("same reference on every access", () => {
|
|
222
|
+
createThemeInstance(LightTheme);
|
|
223
|
+
let Comp = (() => {
|
|
224
|
+
let _theme_decorators;
|
|
225
|
+
let _theme_initializers = [];
|
|
226
|
+
let _theme_extraInitializers = [];
|
|
227
|
+
return class Comp {
|
|
228
|
+
static {
|
|
229
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
230
|
+
_theme_decorators = [Theme()];
|
|
231
|
+
__esDecorate(null, null, _theme_decorators, { kind: "field", name: "theme", static: false, private: false, access: { has: obj => "theme" in obj, get: obj => obj.theme, set: (obj, value) => { obj.theme = value; } }, metadata: _metadata }, _theme_initializers, _theme_extraInitializers);
|
|
232
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
233
|
+
}
|
|
234
|
+
constructor() {
|
|
235
|
+
this.theme = __runInitializers(this, _theme_initializers, void 0);
|
|
236
|
+
__runInitializers(this, _theme_extraInitializers);
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
})();
|
|
240
|
+
const c = new Comp();
|
|
241
|
+
expect(c.theme).toBe(c.theme);
|
|
242
|
+
});
|
|
243
|
+
it("setter is a no-op — value stays unchanged", () => {
|
|
244
|
+
createThemeInstance(LightTheme);
|
|
245
|
+
let Comp = (() => {
|
|
246
|
+
let _theme_decorators;
|
|
247
|
+
let _theme_initializers = [];
|
|
248
|
+
let _theme_extraInitializers = [];
|
|
249
|
+
return class Comp {
|
|
250
|
+
static {
|
|
251
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
252
|
+
_theme_decorators = [Theme()];
|
|
253
|
+
__esDecorate(null, null, _theme_decorators, { kind: "field", name: "theme", static: false, private: false, access: { has: obj => "theme" in obj, get: obj => obj.theme, set: (obj, value) => { obj.theme = value; } }, metadata: _metadata }, _theme_initializers, _theme_extraInitializers);
|
|
254
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
255
|
+
}
|
|
256
|
+
constructor() {
|
|
257
|
+
this.theme = __runInitializers(this, _theme_initializers, void 0);
|
|
258
|
+
__runInitializers(this, _theme_extraInitializers);
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
})();
|
|
262
|
+
const c = new Comp();
|
|
263
|
+
const before = c.theme;
|
|
264
|
+
c.theme = "anything";
|
|
265
|
+
expect(c.theme).toBe(before);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
//# sourceMappingURL=decorators.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.test.js","sourceRoot":"","sources":["../../src/__tests__/decorators.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/extract.test.ts"],"names":[],"mappings":""}
|