@praxisjs/vite-plugin 0.1.0 → 1.0.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 +37 -0
- package/dist/__tests__/css-esbuild-error.test.d.ts +2 -0
- package/dist/__tests__/css-esbuild-error.test.d.ts.map +1 -0
- package/dist/__tests__/css-esbuild-error.test.js +25 -0
- package/dist/__tests__/css-esbuild-error.test.js.map +1 -0
- package/dist/__tests__/css.test.d.ts +2 -0
- package/dist/__tests__/css.test.d.ts.map +1 -0
- package/dist/__tests__/css.test.js +243 -0
- package/dist/__tests__/css.test.js.map +1 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +122 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/css.d.ts +20 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +172 -0
- package/dist/css.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -4
- package/src/__tests__/css-esbuild-error.test.ts +39 -0
- package/src/__tests__/css.test.ts +319 -0
- package/src/__tests__/index.test.ts +143 -0
- package/src/css.ts +186 -0
- package/src/index.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# @praxisjs/vite-plugin
|
|
2
2
|
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 8abc950: Add `praxisjsCSS()` — static CSS extraction plugin for `@praxisjs/css`.
|
|
8
|
+
|
|
9
|
+
Scans TypeScript source files for `Stylesheet` subclasses, `keyframes()`, `globalStyle()`, and `@Themed()` decorators, evaluates them in a sandboxed Node.js context, and emits all CSS into `virtual:praxisjs/styles.css`. In production, runtime `<style>` injection is disabled via `__PRAXIS_CSS_STATIC__`. In development, the virtual module is empty and CSS is injected at runtime as usual.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
// vite.config.ts
|
|
13
|
+
import { praxisjs, praxisjsCSS } from "@praxisjs/vite-plugin";
|
|
14
|
+
|
|
15
|
+
export default defineConfig({
|
|
16
|
+
plugins: [praxisjs(), praxisjsCSS()],
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
// main.ts
|
|
22
|
+
import "virtual:praxisjs/styles.css";
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`@praxisjs/css` is now a peer dependency.
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- Updated dependencies [74fabcc]
|
|
30
|
+
- @praxisjs/css@0.1.0
|
|
31
|
+
|
|
32
|
+
## 0.1.1
|
|
33
|
+
|
|
34
|
+
### Patch Changes
|
|
35
|
+
|
|
36
|
+
- 2c61a25: Refresh dependencies across workspace to improve stability and security.
|
|
37
|
+
|
|
38
|
+
Bumped versions of several packages, including @types/node, eslint, and unocss, to enhance compatibility and security.
|
|
39
|
+
|
|
3
40
|
## 0.1.0
|
|
4
41
|
|
|
5
42
|
### Minor Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-esbuild-error.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/css-esbuild-error.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Isolated test file: mocks esbuild to throw so we can exercise the
|
|
2
|
+
// esbuild-failure branch in extractStaticCSS (css.ts line 97).
|
|
3
|
+
import { describe, it, expect, vi, beforeAll, afterAll } from "vitest";
|
|
4
|
+
import { mkdtempSync, writeFileSync, rmSync } from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
vi.mock("esbuild", () => ({
|
|
8
|
+
build: vi.fn().mockRejectedValue(new Error("esbuild crash")),
|
|
9
|
+
}));
|
|
10
|
+
let tmpDir;
|
|
11
|
+
beforeAll(() => {
|
|
12
|
+
tmpDir = mkdtempSync(path.join(tmpdir(), "praxis-css-esbuild-err-"));
|
|
13
|
+
writeFileSync(path.join(tmpDir, "styles.ts"), `import { Stylesheet } from "@praxisjs/css";\nclass X extends Stylesheet {}`);
|
|
14
|
+
});
|
|
15
|
+
afterAll(() => { rmSync(tmpDir, { recursive: true, force: true }); });
|
|
16
|
+
describe("praxisjsCSS() — esbuild failure (mocked)", () => {
|
|
17
|
+
it("returns empty CSS when esbuild throws during extraction", async () => {
|
|
18
|
+
const { praxisjsCSS } = await import("../css");
|
|
19
|
+
const p = praxisjsCSS();
|
|
20
|
+
p.configResolved({ command: "build", root: tmpDir });
|
|
21
|
+
await p.buildStart.call({ info: vi.fn() });
|
|
22
|
+
expect(p.load("\0virtual:praxisjs/styles.css")).toContain("no static styles found");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=css-esbuild-error.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-esbuild-error.test.js","sourceRoot":"","sources":["../../src/__tests__/css-esbuild-error.test.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,+DAA+D;AAC/D,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;CAC7D,CAAC,CAAC,CAAC;AAQJ,IAAI,MAAc,CAAC;AAEnB,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACrE,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B,4EAA4E,CAC7E,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtE,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,WAAW,EAA6I,CAAC;QACnK,CAAC,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAA6B,CAAC,CAAC;QAChF,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/css.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeAll, afterAll } from "vitest";
|
|
2
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import vm from "node:vm";
|
|
6
|
+
import { praxisjsCSS } from "../css";
|
|
7
|
+
function hooks(p) {
|
|
8
|
+
return p;
|
|
9
|
+
}
|
|
10
|
+
function servePlugin() {
|
|
11
|
+
const p = praxisjsCSS();
|
|
12
|
+
hooks(p).configResolved({ command: "serve", root: "/" });
|
|
13
|
+
return p;
|
|
14
|
+
}
|
|
15
|
+
function buildPlugin(root = "/") {
|
|
16
|
+
const p = praxisjsCSS();
|
|
17
|
+
hooks(p).configResolved({ command: "build", root });
|
|
18
|
+
return p;
|
|
19
|
+
}
|
|
20
|
+
// ─── Plugin shape ─────────────────────────────────────────────────────────────
|
|
21
|
+
describe("praxisjsCSS() — plugin shape", () => {
|
|
22
|
+
it("has name praxisjs:css", () => {
|
|
23
|
+
expect(praxisjsCSS().name).toBe("praxisjs:css");
|
|
24
|
+
});
|
|
25
|
+
it("enforces 'pre'", () => {
|
|
26
|
+
expect(praxisjsCSS().enforce).toBe("pre");
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
// ─── resolveId() ─────────────────────────────────────────────────────────────
|
|
30
|
+
describe("praxisjsCSS() — resolveId()", () => {
|
|
31
|
+
it("resolves virtual:praxisjs/styles.css to internal null-prefixed id", () => {
|
|
32
|
+
const p = servePlugin();
|
|
33
|
+
expect(hooks(p).resolveId("virtual:praxisjs/styles.css")).toBe("\0virtual:praxisjs/styles.css");
|
|
34
|
+
});
|
|
35
|
+
it("returns undefined for any other id", () => {
|
|
36
|
+
const p = servePlugin();
|
|
37
|
+
expect(hooks(p).resolveId("./component.ts")).toBeUndefined();
|
|
38
|
+
expect(hooks(p).resolveId("vite/client")).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
// ─── config() ────────────────────────────────────────────────────────────────
|
|
42
|
+
describe("praxisjsCSS() — config()", () => {
|
|
43
|
+
it("injects __PRAXIS_CSS_STATIC__ define in build mode", () => {
|
|
44
|
+
const p = praxisjsCSS();
|
|
45
|
+
const result = hooks(p).config({}, { command: "build" });
|
|
46
|
+
expect(result?.define?.["__PRAXIS_CSS_STATIC__"]).toBe("true");
|
|
47
|
+
});
|
|
48
|
+
it("returns undefined in serve mode", () => {
|
|
49
|
+
const p = praxisjsCSS();
|
|
50
|
+
expect(hooks(p).config({}, { command: "serve" })).toBeUndefined();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
// ─── load() ──────────────────────────────────────────────────────────────────
|
|
54
|
+
describe("praxisjsCSS() — load()", () => {
|
|
55
|
+
it("returns runtime-injection comment for virtual id in serve mode", () => {
|
|
56
|
+
const result = hooks(servePlugin()).load("\0virtual:praxisjs/styles.css");
|
|
57
|
+
expect(result).toContain("runtime injection active");
|
|
58
|
+
});
|
|
59
|
+
it("returns 'no static styles found' for virtual id in build mode before extraction", () => {
|
|
60
|
+
const result = hooks(buildPlugin()).load("\0virtual:praxisjs/styles.css");
|
|
61
|
+
expect(result).toContain("no static styles found");
|
|
62
|
+
});
|
|
63
|
+
it("returns undefined for non-virtual ids", () => {
|
|
64
|
+
expect(hooks(servePlugin()).load("./component.ts")).toBeUndefined();
|
|
65
|
+
expect(hooks(buildPlugin()).load("node_modules/something")).toBeUndefined();
|
|
66
|
+
});
|
|
67
|
+
it("returns extracted CSS header in build mode after extraction", async () => {
|
|
68
|
+
// set up extraction output by running buildStart first (integration test below)
|
|
69
|
+
// this test checks the static CSS header content after buildStart sets staticCSS
|
|
70
|
+
const p = buildPlugin(tmpDir);
|
|
71
|
+
const info = vi.fn();
|
|
72
|
+
await hooks(p).buildStart.call({ info });
|
|
73
|
+
const result = hooks(p).load("\0virtual:praxisjs/styles.css");
|
|
74
|
+
expect(result).toContain("static extraction");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// ─── buildStart() — integration ──────────────────────────────────────────────
|
|
78
|
+
let tmpDir;
|
|
79
|
+
beforeAll(async () => {
|
|
80
|
+
tmpDir = mkdtempSync(path.join(tmpdir(), "praxis-css-test-"));
|
|
81
|
+
// tsconfig.json — exercises the findTsConfig() success branch (return p)
|
|
82
|
+
writeFileSync(path.join(tmpDir, "tsconfig.json"), "{}");
|
|
83
|
+
// File 1: extends Stylesheet + uses Styled()
|
|
84
|
+
writeFileSync(path.join(tmpDir, "button.ts"), `
|
|
85
|
+
import { Stylesheet, Styled } from "@praxisjs/css";
|
|
86
|
+
class BtnStyles extends Stylesheet {
|
|
87
|
+
$root = this.css({ display: "inline-flex", padding: "8px 16px" });
|
|
88
|
+
$hover = this.css({ opacity: 0.9 });
|
|
89
|
+
}
|
|
90
|
+
Styled(BtnStyles);
|
|
91
|
+
`);
|
|
92
|
+
// File 2: globalStyle()
|
|
93
|
+
writeFileSync(path.join(tmpDir, "base.ts"), `
|
|
94
|
+
import { globalStyle } from "@praxisjs/css";
|
|
95
|
+
globalStyle(_css => "*, *::before, *::after { box-sizing: border-box; }");
|
|
96
|
+
`);
|
|
97
|
+
// File 3: keyframes()
|
|
98
|
+
writeFileSync(path.join(tmpDir, "animations.ts"), `
|
|
99
|
+
import { keyframes } from "@praxisjs/css";
|
|
100
|
+
const spin = keyframes("spin", {
|
|
101
|
+
from: { transform: "rotate(0deg)" },
|
|
102
|
+
to: { transform: "rotate(360deg)" },
|
|
103
|
+
});
|
|
104
|
+
`);
|
|
105
|
+
// File 4: Themed()
|
|
106
|
+
writeFileSync(path.join(tmpDir, "theme.ts"), `
|
|
107
|
+
import { Themed } from "@praxisjs/css";
|
|
108
|
+
class AppTokens { colorBrand = "#6d5bbd"; }
|
|
109
|
+
class LightTheme extends AppTokens {}
|
|
110
|
+
Themed(AppTokens, LightTheme);
|
|
111
|
+
`);
|
|
112
|
+
// File that imports another @praxisjs/* package — exercises the praxis stub,
|
|
113
|
+
// calls noop, AND calls noop's return value to achieve full function coverage
|
|
114
|
+
writeFileSync(path.join(tmpDir, "with-runtime.ts"), `
|
|
115
|
+
import { signal } from "@praxisjs/core";
|
|
116
|
+
import { globalStyle } from "@praxisjs/css";
|
|
117
|
+
globalStyle(_css => "html { font-family: system-ui; }");
|
|
118
|
+
const s = signal(0);
|
|
119
|
+
if (typeof s === 'function') s();
|
|
120
|
+
console.log(s);
|
|
121
|
+
setTimeout(() => {}, 0);
|
|
122
|
+
clearTimeout(0);
|
|
123
|
+
`);
|
|
124
|
+
// File that imports a third-party package — exercises require() fallback return {}
|
|
125
|
+
writeFileSync(path.join(tmpDir, "with-thirdparty.ts"), `
|
|
126
|
+
import { globalStyle } from "@praxisjs/css";
|
|
127
|
+
import { format } from "date-fns";
|
|
128
|
+
globalStyle(_css => "body { color: black; }");
|
|
129
|
+
void format;
|
|
130
|
+
`);
|
|
131
|
+
// Subdirectory with a .tsx file — exercises isDirectory() and .tsx branches
|
|
132
|
+
const subDir = path.join(tmpDir, "components");
|
|
133
|
+
mkdirSync(subDir);
|
|
134
|
+
writeFileSync(path.join(subDir, "card.tsx"), `
|
|
135
|
+
import { Stylesheet, Styled } from "@praxisjs/css";
|
|
136
|
+
class CardStyles extends Stylesheet {
|
|
137
|
+
$card = this.css({ borderRadius: "8px" });
|
|
138
|
+
}
|
|
139
|
+
Styled(CardStyles);
|
|
140
|
+
`);
|
|
141
|
+
// Skipped directory (SKIP_DIRS) — exercises the SKIP_DIRS.has() branch
|
|
142
|
+
mkdirSync(path.join(tmpDir, "node_modules"));
|
|
143
|
+
// Hidden file — exercises the startsWith(".") branch
|
|
144
|
+
writeFileSync(path.join(tmpDir, ".hidden.ts"), `export {};`);
|
|
145
|
+
// Non-TS/TSX file — exercises the else-if false branch in findSourceFiles
|
|
146
|
+
writeFileSync(path.join(tmpDir, "styles.css"), `body { margin: 0; }`);
|
|
147
|
+
// Non-matching TS file (should be ignored)
|
|
148
|
+
writeFileSync(path.join(tmpDir, "utils.ts"), `export const add = (a: number, b: number) => a + b;`);
|
|
149
|
+
});
|
|
150
|
+
afterAll(() => {
|
|
151
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
152
|
+
});
|
|
153
|
+
describe("praxisjsCSS() — buildStart() integration", () => {
|
|
154
|
+
it("extracts scoped class CSS from Stylesheet subclasses", async () => {
|
|
155
|
+
const p = buildPlugin(tmpDir);
|
|
156
|
+
const info = vi.fn();
|
|
157
|
+
await hooks(p).buildStart.call({ info });
|
|
158
|
+
const css = hooks(p).load("\0virtual:praxisjs/styles.css");
|
|
159
|
+
expect(css).toContain(".prx-root-");
|
|
160
|
+
expect(css).toContain("display: inline-flex");
|
|
161
|
+
});
|
|
162
|
+
it("extracts globalStyle CSS", async () => {
|
|
163
|
+
const p = buildPlugin(tmpDir);
|
|
164
|
+
await hooks(p).buildStart.call({ info: vi.fn() });
|
|
165
|
+
const css = hooks(p).load("\0virtual:praxisjs/styles.css");
|
|
166
|
+
expect(css).toContain("box-sizing: border-box");
|
|
167
|
+
});
|
|
168
|
+
it("extracts @keyframes CSS", async () => {
|
|
169
|
+
const p = buildPlugin(tmpDir);
|
|
170
|
+
await hooks(p).buildStart.call({ info: vi.fn() });
|
|
171
|
+
const css = hooks(p).load("\0virtual:praxisjs/styles.css");
|
|
172
|
+
expect(css).toContain("@keyframes prx-spin-");
|
|
173
|
+
expect(css).toContain("rotate(0deg)");
|
|
174
|
+
});
|
|
175
|
+
it("extracts :root vars from Themed()", async () => {
|
|
176
|
+
const p = buildPlugin(tmpDir);
|
|
177
|
+
await hooks(p).buildStart.call({ info: vi.fn() });
|
|
178
|
+
const css = hooks(p).load("\0virtual:praxisjs/styles.css");
|
|
179
|
+
expect(css).toContain(":root");
|
|
180
|
+
expect(css).toContain("--color-brand: #6d5bbd");
|
|
181
|
+
});
|
|
182
|
+
it(":root vars appear before class rules", async () => {
|
|
183
|
+
const p = buildPlugin(tmpDir);
|
|
184
|
+
await hooks(p).buildStart.call({ info: vi.fn() });
|
|
185
|
+
const css = hooks(p).load("\0virtual:praxisjs/styles.css");
|
|
186
|
+
const rootIdx = css.indexOf(":root");
|
|
187
|
+
const classIdx = css.indexOf(".prx-");
|
|
188
|
+
expect(rootIdx).toBeLessThan(classIdx);
|
|
189
|
+
});
|
|
190
|
+
it("calls this.info() with extracted rule count", async () => {
|
|
191
|
+
const p = buildPlugin(tmpDir);
|
|
192
|
+
const info = vi.fn();
|
|
193
|
+
await hooks(p).buildStart.call({ info });
|
|
194
|
+
expect(info).toHaveBeenCalledWith(expect.stringContaining("extracted"));
|
|
195
|
+
});
|
|
196
|
+
it("returns empty when root has no matching source files", async () => {
|
|
197
|
+
const emptyDir = mkdtempSync(path.join(tmpdir(), "praxis-empty-"));
|
|
198
|
+
try {
|
|
199
|
+
const p = buildPlugin(emptyDir);
|
|
200
|
+
const info = vi.fn();
|
|
201
|
+
await hooks(p).buildStart.call({ info });
|
|
202
|
+
expect(info).not.toHaveBeenCalled();
|
|
203
|
+
const css = hooks(p).load("\0virtual:praxisjs/styles.css");
|
|
204
|
+
expect(css).toContain("no static styles found");
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
rmSync(emptyDir, { recursive: true, force: true });
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
it("skips non-serve mode in buildStart for serve command", async () => {
|
|
211
|
+
const p = servePlugin();
|
|
212
|
+
const info = vi.fn();
|
|
213
|
+
await hooks(p).buildStart.call({ info });
|
|
214
|
+
expect(info).not.toHaveBeenCalled();
|
|
215
|
+
});
|
|
216
|
+
it("handles a root directory that cannot be read (readdirSync throws)", async () => {
|
|
217
|
+
const p = buildPlugin("/this/path/does/not/exist/at/all");
|
|
218
|
+
const info = vi.fn();
|
|
219
|
+
await hooks(p).buildStart.call({ info });
|
|
220
|
+
expect(info).not.toHaveBeenCalled();
|
|
221
|
+
expect(hooks(p).load("\0virtual:praxisjs/styles.css")).toContain("no static styles found");
|
|
222
|
+
});
|
|
223
|
+
it("handles vm execution error gracefully (returns empty CSS)", async () => {
|
|
224
|
+
const spy = vi.spyOn(vm, "runInNewContext").mockImplementationOnce(() => { throw new Error("vm crash"); });
|
|
225
|
+
try {
|
|
226
|
+
const p = buildPlugin(tmpDir);
|
|
227
|
+
await hooks(p).buildStart.call({ info: vi.fn() });
|
|
228
|
+
expect(hooks(p).load("\0virtual:praxisjs/styles.css")).toContain("no static styles found");
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
spy.mockRestore();
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
it("exercises the @praxisjs/* stub path (require for non-css praxis packages)", async () => {
|
|
235
|
+
const p = buildPlugin(tmpDir);
|
|
236
|
+
await hooks(p).buildStart.call({ info: vi.fn() });
|
|
237
|
+
const css = hooks(p).load("\0virtual:praxisjs/styles.css");
|
|
238
|
+
// The with-runtime.ts fixture imports @praxisjs/core which uses the stub
|
|
239
|
+
// If no error was thrown, the stub handled it correctly
|
|
240
|
+
expect(typeof css).toBe("string");
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=css.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.test.js","sourceRoot":"","sources":["../../src/__tests__/css.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { praxisjs } from "../index";
|
|
3
|
+
describe("praxisjs() plugin factory", () => {
|
|
4
|
+
it("returns two plugins by default (core + hmr)", () => {
|
|
5
|
+
const plugins = praxisjs();
|
|
6
|
+
expect(plugins).toHaveLength(2);
|
|
7
|
+
});
|
|
8
|
+
it("returns one plugin when hmr is disabled", () => {
|
|
9
|
+
const plugins = praxisjs({ hmr: false });
|
|
10
|
+
expect(plugins).toHaveLength(1);
|
|
11
|
+
});
|
|
12
|
+
it("core plugin has the correct name", () => {
|
|
13
|
+
const [core] = praxisjs();
|
|
14
|
+
expect(core.name).toBe("praxisjs:core");
|
|
15
|
+
});
|
|
16
|
+
it("core plugin enforces 'pre'", () => {
|
|
17
|
+
const [core] = praxisjs();
|
|
18
|
+
expect(core.enforce).toBe("pre");
|
|
19
|
+
});
|
|
20
|
+
it("hmr plugin has the correct name", () => {
|
|
21
|
+
const [, hmr] = praxisjs();
|
|
22
|
+
expect(hmr.name).toBe("praxisjs:hmr");
|
|
23
|
+
});
|
|
24
|
+
it("hmr plugin enforces 'post'", () => {
|
|
25
|
+
const [, hmr] = praxisjs();
|
|
26
|
+
expect(hmr.enforce).toBe("post");
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe("praxisjs:core config()", () => {
|
|
30
|
+
it("sets esbuild target to es2022", () => {
|
|
31
|
+
const [core] = praxisjs();
|
|
32
|
+
const config = core.config();
|
|
33
|
+
expect(config).toEqual({ esbuild: { target: "es2022" } });
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("praxisjs:core transform()", () => {
|
|
37
|
+
it("returns null for .tsx files when autoImport is enabled", () => {
|
|
38
|
+
const [core] = praxisjs({ autoImport: true });
|
|
39
|
+
const transform = core.transform;
|
|
40
|
+
const result = transform("const x = 1;", "component.tsx");
|
|
41
|
+
expect(result).toBeNull();
|
|
42
|
+
});
|
|
43
|
+
it("returns null for .jsx files when autoImport is enabled", () => {
|
|
44
|
+
const [core] = praxisjs({ autoImport: true });
|
|
45
|
+
const transform = core.transform;
|
|
46
|
+
const result = transform("const x = 1;", "component.jsx");
|
|
47
|
+
expect(result).toBeNull();
|
|
48
|
+
});
|
|
49
|
+
it("returns undefined (no-op) for non-.tsx/.jsx files", () => {
|
|
50
|
+
const [core] = praxisjs({ autoImport: true });
|
|
51
|
+
const transform = core.transform;
|
|
52
|
+
const result = transform("const x = 1;", "module.ts");
|
|
53
|
+
expect(result).toBeUndefined();
|
|
54
|
+
});
|
|
55
|
+
it("returns undefined when autoImport is false", () => {
|
|
56
|
+
const [core] = praxisjs({ autoImport: false });
|
|
57
|
+
const transform = core.transform;
|
|
58
|
+
const result = transform("const x = 1;", "component.tsx");
|
|
59
|
+
expect(result).toBeUndefined();
|
|
60
|
+
});
|
|
61
|
+
it("returns undefined when code already imports @praxisjs/jsx/jsx-runtime", () => {
|
|
62
|
+
const [core] = praxisjs({ autoImport: true });
|
|
63
|
+
const transform = core.transform;
|
|
64
|
+
const code = 'import "@praxisjs/jsx/jsx-runtime"; const x = 1;';
|
|
65
|
+
const result = transform(code, "component.tsx");
|
|
66
|
+
expect(result).toBeUndefined();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("praxisjs:hmr handleHotUpdate()", () => {
|
|
70
|
+
function makeMockServer() {
|
|
71
|
+
return {
|
|
72
|
+
ws: {
|
|
73
|
+
send: vi.fn(),
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
it("sends custom event for .ts files", () => {
|
|
78
|
+
const [, hmr] = praxisjs({ hmr: true });
|
|
79
|
+
const server = makeMockServer();
|
|
80
|
+
hmr.handleHotUpdate({
|
|
81
|
+
file: "src/app.ts",
|
|
82
|
+
server,
|
|
83
|
+
});
|
|
84
|
+
expect(server.ws.send).toHaveBeenCalledWith({
|
|
85
|
+
type: "custom",
|
|
86
|
+
event: "praxisjs:component-update",
|
|
87
|
+
data: { file: "src/app.ts" },
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it("sends custom event for .tsx files", () => {
|
|
91
|
+
const [, hmr] = praxisjs({ hmr: true });
|
|
92
|
+
const server = makeMockServer();
|
|
93
|
+
hmr.handleHotUpdate({
|
|
94
|
+
file: "src/component.tsx",
|
|
95
|
+
server,
|
|
96
|
+
});
|
|
97
|
+
expect(server.ws.send).toHaveBeenCalledWith({
|
|
98
|
+
type: "custom",
|
|
99
|
+
event: "praxisjs:component-update",
|
|
100
|
+
data: { file: "src/component.tsx" },
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
it("does not send event for non-.ts/.tsx files", () => {
|
|
104
|
+
const [, hmr] = praxisjs({ hmr: true });
|
|
105
|
+
const server = makeMockServer();
|
|
106
|
+
hmr.handleHotUpdate({
|
|
107
|
+
file: "src/style.css",
|
|
108
|
+
server,
|
|
109
|
+
});
|
|
110
|
+
expect(server.ws.send).not.toHaveBeenCalled();
|
|
111
|
+
});
|
|
112
|
+
it("does not send event for .js files", () => {
|
|
113
|
+
const [, hmr] = praxisjs({ hmr: true });
|
|
114
|
+
const server = makeMockServer();
|
|
115
|
+
hmr.handleHotUpdate({
|
|
116
|
+
file: "src/utils.js",
|
|
117
|
+
server,
|
|
118
|
+
});
|
|
119
|
+
expect(server.ws.send).not.toHaveBeenCalled();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"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"}
|
package/dist/css.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
/**
|
|
3
|
+
* Extracts all `@Styled()`, `keyframes()`, and `globalStyle()` CSS at build
|
|
4
|
+
* time and emits it as `virtual:praxisjs/styles.css`.
|
|
5
|
+
*
|
|
6
|
+
* In production:
|
|
7
|
+
* - CSS lives in a static asset with normal HTTP caching.
|
|
8
|
+
* - Runtime `<style>` injection is disabled (`__PRAXIS_CSS_STATIC__ = true`).
|
|
9
|
+
*
|
|
10
|
+
* In development:
|
|
11
|
+
* - The virtual module is empty; CSS is injected at runtime.
|
|
12
|
+
* - HMR works without extra configuration.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // vite.config.ts
|
|
16
|
+
* import { praxisjs, praxisjsCSS } from '@praxisjs/vite-plugin'
|
|
17
|
+
* export default defineConfig({ plugins: [praxisjs(), praxisjsCSS()] })
|
|
18
|
+
*/
|
|
19
|
+
export declare function praxisjsCSS(): Plugin;
|
|
20
|
+
//# sourceMappingURL=css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AA0HnD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAsCpC"}
|