@evertondgn/solid-tooling 0.4.0 → 0.6.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 (43) hide show
  1. package/README.md +193 -578
  2. package/app-env.d.ts +7 -0
  3. package/dist/architecture-plugin.mjs +1 -1
  4. package/dist/backend-plugin.mjs +139 -4
  5. package/dist/cli.d.mts +1 -0
  6. package/dist/cli.mjs +42 -0
  7. package/dist/commitlint.d.mts +3 -0
  8. package/dist/commitlint.mjs +28 -0
  9. package/dist/{constants-Jqvtbvxu.mjs → constants-BZJm7ouk.mjs} +1 -1
  10. package/dist/css-filename-CEHQd2gz.mjs +40 -0
  11. package/dist/css-filename.mjs +1 -40
  12. package/dist/fmt-9dlUYOMk.mjs +34 -0
  13. package/dist/fmt.mjs +1 -34
  14. package/dist/i18n-generate.d.mts +1 -0
  15. package/dist/i18n-generate.mjs +23 -0
  16. package/dist/i18nPlugin-CS7Gob6R.mjs +109 -0
  17. package/dist/knip.d.mts +2 -1
  18. package/dist/knip.mjs +7 -2
  19. package/dist/{lint-UTfyg7AR.mjs → lint-ehdtTKfw.mjs} +33 -86
  20. package/dist/lint.mjs +1 -1
  21. package/dist/playwright-teardown.mjs +1 -1
  22. package/dist/playwright.d.mts +2 -1
  23. package/dist/playwright.mjs +4 -3
  24. package/dist/prepareMessages-BXmY6Ko2.mjs +222 -0
  25. package/dist/project-plugin.mjs +2 -2
  26. package/dist/protocol-DSNNUYja.mjs +18 -0
  27. package/dist/publication/read-llms-index.d.mts +12 -0
  28. package/dist/publication/read-llms-index.mjs +1 -0
  29. package/dist/publication-CRUTOB0B.mjs +885 -0
  30. package/dist/readLlmsIndex-Gj4iTxAk.mjs +27 -0
  31. package/dist/stylelint.mjs +2 -2
  32. package/dist/test-locale--tuH0Np5.mjs +3 -0
  33. package/dist/types-DHu2Z_ot.d.mts +49 -0
  34. package/dist/vite.d.mts +33 -7
  35. package/dist/vite.mjs +415 -88
  36. package/dist/vitest-BjLr7iLf.mjs +362 -0
  37. package/dist/vitest.d.mts +3 -7
  38. package/dist/vitest.mjs +1 -129
  39. package/lefthook.yml +57 -0
  40. package/node-env.d.ts +1 -0
  41. package/package.json +54 -35
  42. package/tsconfig.app.json +4 -9
  43. package/virtual-modules.d.ts +90 -0
@@ -0,0 +1,362 @@
1
+ import { c as MAX_HTML_BYTES, i as LLMS_MAX_BYTES, l as MAX_MARKDOWN_BYTES, n as LLMS_FULL_MAX_BYTES, s as MARKDOWN_TIMEOUT_MS } from "./protocol-DSNNUYja.mjs";
2
+ import { t as TEST_LOCALE } from "./test-locale--tuH0Np5.mjs";
3
+ import path from "node:path";
4
+ import { env } from "node:process";
5
+ import { fileURLToPath } from "node:url";
6
+ import { readFile, realpath } from "node:fs/promises";
7
+ import { loadEnv } from "vite-plus";
8
+ import { existsSync, readFileSync } from "node:fs";
9
+ import * as v from "valibot";
10
+ import { playwright } from "vite-plus/test/browser-playwright";
11
+ // src/has-i18n.ts
12
+ const I18N_SETTINGS = "project.inlang/settings.json";
13
+ function hasI18n(root) {
14
+ return existsSync(path.join(root, I18N_SETTINGS));
15
+ }
16
+ // src/publication/options.ts
17
+ const BudgetSchema = v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(Number.MAX_SAFE_INTEGER));
18
+ const TimeoutSchema = v.pipe(BudgetSchema, v.maxValue(2147483647));
19
+ const MarkdownSchema = v.strictObject({
20
+ static: v.optional(v.boolean(), false),
21
+ maxInputBytes: v.optional(BudgetSchema, MAX_HTML_BYTES),
22
+ maxOutputBytes: v.optional(BudgetSchema, MAX_MARKDOWN_BYTES),
23
+ timeoutMs: v.optional(TimeoutSchema, MARKDOWN_TIMEOUT_MS)
24
+ });
25
+ const LlmsSchema = v.strictObject({ maxBytes: v.optional(BudgetSchema, LLMS_MAX_BYTES) });
26
+ const LlmsFullSchema = v.strictObject({ maxBytes: v.optional(BudgetSchema, LLMS_FULL_MAX_BYTES) });
27
+ const SitemapSchema = v.union([v.boolean(), v.strictObject({ static: v.literal(true) })]);
28
+ function validatePublicationFeatures(options) {
29
+ if (typeof options.llmsFull === "object" && (typeof options.llms !== "object" || typeof options.markdown !== "object" || options.markdown.static !== true)) throw new Error("seo.llmsFull requires seo.llms and seo.markdown.static");
30
+ }
31
+ // src/locale-module.ts
32
+ const MODULE_ID = "virtual:solid-app/locale";
33
+ const RESOLVED_ID = "\0solid-app:locale";
34
+ function localeRequestSource({ root }) {
35
+ if (hasI18n(root)) return `export { shouldRedirect, extractLocaleFromRequest, cookieName, cookieMaxAge, cookieDomain, cookieSameSite, cookieSecure } from ${JSON.stringify(path.join(root, "paraglide/runtime.js"))}; export { paraglideMiddleware } from ${JSON.stringify(path.join(root, "paraglide/server.js"))}`;
36
+ return `const missing = () => { throw new Error('Locale requests require project.inlang/settings.json') }; export { missing as shouldRedirect, missing as extractLocaleFromRequest, missing as paraglideMiddleware }; export const cookieName = '', cookieMaxAge = 0, cookieDomain = '', cookieSameSite = 'lax', cookieSecure = false`;
37
+ }
38
+ function localeSource({ root, language = "en" }) {
39
+ if (hasI18n(root)) return `export { locales, baseLocale, getLocale, setLocale, extractLocaleFromUrl, localizeHref, deLocalizeUrl } from ${JSON.stringify(path.join(root, "paraglide/runtime.js"))}`;
40
+ return `export const baseLocale = ${JSON.stringify(language)}
41
+ export const locales = [baseLocale]
42
+ export const getLocale = () => baseLocale
43
+ export const setLocale = () => undefined
44
+ export const extractLocaleFromUrl = () => undefined
45
+ export const localizeHref = href => href
46
+ export const deLocalizeUrl = url => url instanceof URL ? url : new URL(typeof url === 'string' ? url : url.href)
47
+ `;
48
+ }
49
+ function localeModule(options) {
50
+ return {
51
+ name: "solid-app:locale",
52
+ resolveId: (id) => {
53
+ if (id === "virtual:solid-app/locale-context") return "\0solid-app:locale-context";
54
+ if (id === "virtual:solid-app/request-middleware") return "\0solid-app:request-middleware";
55
+ if (id === "virtual:solid-app/locale-request") return "\0solid-app:locale-request";
56
+ return id === MODULE_ID ? RESOLVED_ID : void 0;
57
+ },
58
+ load: (id) => {
59
+ if (id === "\0solid-app:locale-context") {
60
+ if (!hasI18n(options.root)) return `export const requestLocale = () => ${JSON.stringify(options.language ?? "en")}; export const withLocaleContext = ({run}) => Promise.resolve().then(run)`;
61
+ return `import { extractLocaleFromRequest } from ${JSON.stringify(path.join(options.root, "paraglide/runtime.js"))}; import { paraglideMiddleware } from ${JSON.stringify(path.join(options.root, "paraglide/server.js"))}; export const requestLocale = extractLocaleFromRequest; export const withLocaleContext = ({url, run}) => paraglideMiddleware(new Request(url), run)`;
62
+ }
63
+ if (id === "\0solid-app:request-middleware") return hasI18n(options.root) ? "export { createLocalizeRequest as createRequestLocale } from '@evertondgn/solid-runtime/middleware/localize-request'" : "export const createRequestLocale = () => ({ next }) => next()";
64
+ if (id === "\0solid-app:locale-request") return localeRequestSource(options);
65
+ return id === RESOLVED_ID ? localeSource(options) : void 0;
66
+ }
67
+ };
68
+ }
69
+ // src/seo-module.ts
70
+ const LineSchema = v.pipe(v.string(), v.nonEmpty(), v.regex(/^[^\r\n]+$/u));
71
+ const GroupSchema = v.strictObject({
72
+ userAgents: v.array(LineSchema),
73
+ allow: v.optional(v.array(LineSchema)),
74
+ disallow: v.optional(v.array(LineSchema))
75
+ });
76
+ const RobotsSchema = v.strictObject({
77
+ groups: v.optional(v.array(GroupSchema), []),
78
+ sitemapPaths: v.optional(v.array(LineSchema), []),
79
+ cacheControl: v.optional(LineSchema)
80
+ });
81
+ const RobotsOptionSchema = v.union([v.literal(false), RobotsSchema]);
82
+ const DisabledSchema = v.literal(false);
83
+ const MarkdownOptionSchema = v.union([DisabledSchema, MarkdownSchema]);
84
+ const LlmsOptionSchema = v.union([DisabledSchema, LlmsSchema]);
85
+ const LlmsFullOptionSchema = v.union([DisabledSchema, LlmsFullSchema]);
86
+ const SeoSchema = v.strictObject({
87
+ originEnv: v.optional(LineSchema, "VITE_SITE_URL"),
88
+ robots: v.optional(RobotsOptionSchema),
89
+ sitemap: v.optional(SitemapSchema),
90
+ markdown: v.optional(MarkdownOptionSchema),
91
+ llms: v.optional(LlmsOptionSchema),
92
+ llmsFull: v.optional(LlmsFullOptionSchema)
93
+ });
94
+ function readOrigin({ root, mode, key }) {
95
+ const value = loadEnv(mode, root, key)[key];
96
+ if (!value) throw new Error(`Missing site origin: ${key}`);
97
+ let origin;
98
+ try {
99
+ origin = new URL(value);
100
+ } catch {
101
+ throw new Error(`${key} must be an HTTP(S) origin without a path, query, fragment or credentials`);
102
+ }
103
+ if (!["http:", "https:"].includes(origin.protocol) || origin.pathname !== "/" || origin.search || origin.hash || origin.username || origin.password) throw new Error(`${key} must be an HTTP(S) origin without a path, query, fragment or credentials`);
104
+ return origin.origin;
105
+ }
106
+ function seoModule({ root, mode, seo }) {
107
+ const config = v.parse(SeoSchema, seo === false ? {} : seo ?? {});
108
+ validatePublicationFeatures(config);
109
+ const origin = () => readOrigin({
110
+ root,
111
+ mode,
112
+ key: config.originEnv
113
+ });
114
+ return {
115
+ name: "solid-app:seo",
116
+ configResolved() {
117
+ if (seo !== false && seo !== void 0) origin();
118
+ },
119
+ resolveId: (id) => [
120
+ "virtual:solid-app/seo-origin",
121
+ "virtual:solid-app/seo-robots",
122
+ "virtual:solid-app/seo-markdown",
123
+ "virtual:solid-app/seo-llms"
124
+ ].includes(id) ? `\0${id}` : void 0,
125
+ load: (id) => {
126
+ if (id === "\0virtual:solid-app/seo-markdown") {
127
+ if (typeof config.markdown !== "object") throw new TypeError("Markdown requires seo.markdown");
128
+ return `export const markdown = ${JSON.stringify({
129
+ ...config.markdown,
130
+ hasLlms: Boolean(config.llms)
131
+ })}`;
132
+ }
133
+ if (id === "\0virtual:solid-app/seo-llms") {
134
+ if (typeof config.llms !== "object") throw new TypeError("llms requires seo.llms");
135
+ return `export const llms = ${JSON.stringify({
136
+ ...config.llms,
137
+ hasMarkdown: Boolean(config.markdown),
138
+ hasLlmsFull: Boolean(config.llmsFull)
139
+ })}`;
140
+ }
141
+ if (id === "\0virtual:solid-app/seo-origin") return `export const origin = ${JSON.stringify(origin())}`;
142
+ if (id !== "\0virtual:solid-app/seo-robots") return null;
143
+ if (config.robots === false || config.robots === void 0) throw new Error("The robots route requires defineSolidApp({ seo: { robots: {} } })");
144
+ const { groups, sitemapPaths, cacheControl } = config.robots;
145
+ const siteOrigin = origin();
146
+ return `export const robots = ${JSON.stringify({
147
+ groups,
148
+ sitemaps: sitemapPaths.map((path) => new URL(path, siteOrigin).href),
149
+ cacheControl
150
+ })}`;
151
+ }
152
+ };
153
+ }
154
+ // src/vitest/dom-url.ts
155
+ const ORIGIN = "http://localhost";
156
+ function readBaseLocale(root) {
157
+ let settings;
158
+ try {
159
+ settings = JSON.parse(readFileSync(path.join(root, I18N_SETTINGS), "utf8"));
160
+ } catch (error) {
161
+ throw new Error(`solidTest: cannot read the base locale from ${I18N_SETTINGS}; fix the file or pass domUrl.`, { cause: error });
162
+ }
163
+ const baseLocale = settings !== null && typeof settings === "object" && "baseLocale" in settings ? settings.baseLocale : void 0;
164
+ if (typeof baseLocale !== "string" || baseLocale === "") throw new Error(`solidTest: ${I18N_SETTINGS} must declare baseLocale as a string; fix the file or pass domUrl.`);
165
+ return baseLocale;
166
+ }
167
+ function defaultDomUrl(root) {
168
+ return hasI18n(root) ? `${ORIGIN}/${readBaseLocale(root)}` : `${ORIGIN}/`;
169
+ }
170
+ // src/vitest/source-packages.ts
171
+ function isRecord(value) {
172
+ return typeof value === "object" && value !== null;
173
+ }
174
+ async function findPackage({ root, name }) {
175
+ for (let dir = root;; dir = path.dirname(dir)) {
176
+ const packageDir = path.join(dir, "node_modules", name);
177
+ try {
178
+ const manifest = JSON.parse(await readFile(path.join(packageDir, "package.json"), "utf8"));
179
+ return isRecord(manifest) && isRecord(manifest.exports) ? {
180
+ dir: packageDir,
181
+ exports: manifest.exports
182
+ } : void 0;
183
+ } catch {
184
+ if (path.dirname(dir) === dir) return void 0;
185
+ }
186
+ }
187
+ }
188
+ function sourcePackages({ root, packages }) {
189
+ const installed = /* @__PURE__ */ new Map();
190
+ async function resolveSource({ name, source }) {
191
+ let lookup = installed.get(name);
192
+ if (!lookup) {
193
+ lookup = findPackage({
194
+ root,
195
+ name
196
+ });
197
+ installed.set(name, lookup);
198
+ }
199
+ const found = await lookup;
200
+ const entry = found?.exports[`.${source.slice(name.length)}`];
201
+ if (!found || !isRecord(entry) || typeof entry.solid !== "string") return null;
202
+ return realpath(path.join(found.dir, entry.solid));
203
+ }
204
+ return {
205
+ name: "solid-tooling:source-packages",
206
+ enforce: "pre",
207
+ resolveId(source) {
208
+ const name = packages.find((candidate) => source === candidate || source.startsWith(`${candidate}/`));
209
+ return name === void 0 ? null : resolveSource({
210
+ name,
211
+ source
212
+ });
213
+ }
214
+ };
215
+ }
216
+ // src/vitest/index.ts
217
+ const CI_WORKERS = 2;
218
+ const SOURCE_PACKAGES = ["@evertondgn/solid-runtime"];
219
+ const STUB_PREFIX = "\0solid-tooling-stub:";
220
+ const NODE_STUBS = /* @__PURE__ */ new Map([
221
+ ["server-only", "export default undefined"],
222
+ ["virtual:file-routes", "export const pageRoutes = []\nexport default []"],
223
+ ["virtual:solid-server-function-handler", "export const endpoint = '/_server'"]
224
+ ]);
225
+ const TEST_ENV_KEYS = [
226
+ "BASE_URL_TEST",
227
+ "HOST",
228
+ "PORT"
229
+ ];
230
+ function packageFile(name) {
231
+ return fileURLToPath(new URL(name, import.meta.url));
232
+ }
233
+ function nodeStubs(source) {
234
+ const stubs = new Map([...NODE_STUBS, ["virtual:solid-app/locale", source]]);
235
+ return {
236
+ name: "solid-tooling:node-stubs",
237
+ enforce: "pre",
238
+ resolveId: (id) => stubs.has(id) ? `${STUB_PREFIX}${id}` : void 0,
239
+ load: (id) => id.startsWith(STUB_PREFIX) ? stubs.get(id.slice(20)) : void 0
240
+ };
241
+ }
242
+ function readTestEnv() {
243
+ return Object.fromEntries(TEST_ENV_KEYS.flatMap((key) => {
244
+ const value = env[key];
245
+ return value === void 0 ? [] : [[key, value]];
246
+ }));
247
+ }
248
+ function solidTest({ root, language, seo, plugins, sourcePackages: packages = SOURCE_PACKAGES, domUrl = defaultDomUrl(root), locale = TEST_LOCALE }) {
249
+ const hasParaglide = hasI18n(root);
250
+ return {
251
+ pool: "threads",
252
+ maxWorkers: env.CI ? CI_WORKERS : void 0,
253
+ css: false,
254
+ globals: true,
255
+ restoreMocks: true,
256
+ unstubGlobals: true,
257
+ unstubEnvs: true,
258
+ expect: {
259
+ requireAssertions: true,
260
+ poll: { interval: 10 }
261
+ },
262
+ env: readTestEnv(),
263
+ coverage: {
264
+ provider: "v8",
265
+ reporter: ["text", "html"],
266
+ thresholds: {
267
+ lines: 80,
268
+ functions: 80,
269
+ branches: 75,
270
+ statements: 80
271
+ },
272
+ include: ["src/**/*.{ts,tsx}"],
273
+ exclude: [
274
+ "src/**/*.d.ts",
275
+ "src/**/{constants,types,@types}/**",
276
+ "src/**/{constants,types}.{ts,tsx}",
277
+ "src/**/__tests__/**",
278
+ "src/tests/**",
279
+ "src/App.tsx",
280
+ "src/Document.tsx",
281
+ "src/entry-server.tsx",
282
+ "src/entry-client.tsx",
283
+ "src/router.ts"
284
+ ]
285
+ },
286
+ reporters: env.GITHUB_ACTIONS ? ["default", "github-actions"] : ["verbose"],
287
+ projects: [
288
+ {
289
+ plugins: [
290
+ nodeStubs(localeSource({
291
+ root,
292
+ language
293
+ })),
294
+ localeModule({
295
+ root,
296
+ language
297
+ }),
298
+ seoModule({
299
+ root,
300
+ mode: "test",
301
+ seo
302
+ }),
303
+ sourcePackages({
304
+ root,
305
+ packages
306
+ })
307
+ ],
308
+ test: {
309
+ name: {
310
+ label: "node",
311
+ color: "cyan"
312
+ },
313
+ environment: "node",
314
+ include: ["src/**/*.node.test.{ts,tsx}"]
315
+ }
316
+ },
317
+ {
318
+ plugins: plugins(),
319
+ test: {
320
+ name: {
321
+ label: "dom",
322
+ color: "magenta"
323
+ },
324
+ environment: "happy-dom",
325
+ setupFiles: [fileURLToPath(import.meta.resolve("@testing-library/jest-dom/vitest"))],
326
+ environmentOptions: { happyDOM: { url: domUrl } },
327
+ include: ["src/**/*.dom.test.{ts,tsx}"]
328
+ }
329
+ },
330
+ {
331
+ plugins: plugins(),
332
+ ...hasParaglide && { resolve: { alias: [{
333
+ find: /^@paraglide\//u,
334
+ replacement: `${path.join(root, "paraglide")}/`
335
+ }] } },
336
+ test: {
337
+ css: true,
338
+ name: {
339
+ label: "browser",
340
+ color: "yellow"
341
+ },
342
+ setupFiles: hasParaglide ? [packageFile("vitest-setup/browser.mjs")] : [],
343
+ include: ["src/**/*.browser.test.{ts,tsx}"],
344
+ browser: {
345
+ enabled: true,
346
+ headless: true,
347
+ trace: {
348
+ mode: "retain-on-failure",
349
+ tracesDir: path.join(root, "test-results/browser-traces")
350
+ },
351
+ provider: playwright({
352
+ contextOptions: { locale },
353
+ launchOptions: env.CI ? { channel: "chrome" } : {}
354
+ }),
355
+ instances: [{ browser: "chromium" }]
356
+ }
357
+ }
358
+ }
359
+ ]
360
+ };
361
+ }
362
+ export { I18N_SETTINGS as a, validatePublicationFeatures as i, seoModule as n, hasI18n as o, localeModule as r, solidTest as t };
package/dist/vitest.d.mts CHANGED
@@ -1,7 +1,3 @@
1
- import { TestUserConfig, ViteUserConfig } from "vite-plus";
2
- type SolidTestOptions = {
3
- root: string;
4
- plugins: () => ViteUserConfig['plugins'];
5
- };
6
- export declare function solidTest({ root, plugins }: SolidTestOptions): TestUserConfig;
7
- export {};
1
+ import { t as SolidTestOptions } from "./types-DHu2Z_ot.mjs";
2
+ import { TestUserConfig } from "vite-plus";
3
+ export declare function solidTest({ root, language, seo, plugins, sourcePackages: packages, domUrl, locale }: SolidTestOptions): TestUserConfig;
package/dist/vitest.mjs CHANGED
@@ -1,129 +1 @@
1
- import path from "node:path";
2
- import { fileURLToPath } from "node:url";
3
- import { env } from "node:process";
4
- import { playwright } from "vite-plus/test/browser-playwright";
5
- // src/vitest/index.ts
6
- const CI_WORKERS = 2;
7
- const STUB_PREFIX = "\0solid-tooling-stub:";
8
- const NODE_STUBS = /* @__PURE__ */ new Map([
9
- ["server-only", "export default undefined"],
10
- ["virtual:file-routes", "export const pageRoutes = []\nexport default []"],
11
- ["virtual:solid-server-function-handler", "export const endpoint = '/_server'"]
12
- ]);
13
- const TEST_ENV_KEYS = [
14
- "BASE_URL_TEST",
15
- "HOST",
16
- "PORT"
17
- ];
18
- function packageFile(name) {
19
- return fileURLToPath(new URL(name, import.meta.url));
20
- }
21
- function nodeStubs() {
22
- return {
23
- name: "solid-tooling:node-stubs",
24
- enforce: "pre",
25
- resolveId: (id) => NODE_STUBS.has(id) ? `${STUB_PREFIX}${id}` : void 0,
26
- load: (id) => id.startsWith(STUB_PREFIX) ? NODE_STUBS.get(id.slice(20)) : void 0
27
- };
28
- }
29
- function readTestEnv() {
30
- return Object.fromEntries(TEST_ENV_KEYS.flatMap((key) => {
31
- const value = env[key];
32
- return value === void 0 ? [] : [[key, value]];
33
- }));
34
- }
35
- function solidTest({ root, plugins }) {
36
- return {
37
- pool: "threads",
38
- maxWorkers: env.CI ? CI_WORKERS : void 0,
39
- css: false,
40
- globals: true,
41
- restoreMocks: true,
42
- unstubGlobals: true,
43
- unstubEnvs: true,
44
- expect: {
45
- requireAssertions: true,
46
- poll: { interval: 10 }
47
- },
48
- env: readTestEnv(),
49
- coverage: {
50
- provider: "v8",
51
- reporter: ["text", "html"],
52
- thresholds: {
53
- lines: 80,
54
- functions: 80,
55
- branches: 75,
56
- statements: 80
57
- },
58
- include: ["src/**/*.{ts,tsx}"],
59
- exclude: [
60
- "src/**/*.d.ts",
61
- "src/**/{constants,types,@types}/**",
62
- "src/**/{constants,types}.{ts,tsx}",
63
- "src/**/__tests__/**",
64
- "src/tests/**",
65
- "src/App.tsx",
66
- "src/Document.tsx",
67
- "src/entry-server.tsx",
68
- "src/entry-client.tsx",
69
- "src/router.ts"
70
- ]
71
- },
72
- reporters: env.GITHUB_ACTIONS ? ["default", "github-actions"] : ["verbose"],
73
- projects: [
74
- {
75
- plugins: [nodeStubs()],
76
- test: {
77
- name: {
78
- label: "node",
79
- color: "cyan"
80
- },
81
- environment: "node",
82
- include: ["src/**/*.node.test.{ts,tsx}"]
83
- }
84
- },
85
- {
86
- plugins: plugins(),
87
- test: {
88
- name: {
89
- label: "dom",
90
- color: "magenta"
91
- },
92
- environment: "happy-dom",
93
- environmentOptions: { happyDOM: { url: "http://localhost/en" } },
94
- include: ["src/**/*.dom.test.{ts,tsx}"]
95
- }
96
- },
97
- {
98
- plugins: plugins(),
99
- resolve: { alias: [{
100
- find: /^@paraglide\//u,
101
- replacement: `${path.join(root, "paraglide")}/`
102
- }] },
103
- test: {
104
- css: true,
105
- name: {
106
- label: "browser",
107
- color: "yellow"
108
- },
109
- setupFiles: [packageFile("vitest-setup/browser.mjs")],
110
- include: ["src/**/*.browser.test.{ts,tsx}"],
111
- browser: {
112
- enabled: true,
113
- headless: true,
114
- trace: {
115
- mode: "retain-on-failure",
116
- tracesDir: path.join(root, "test-results/browser-traces")
117
- },
118
- provider: playwright({
119
- contextOptions: { locale: "en-US" },
120
- launchOptions: env.CI ? { channel: "chrome" } : {}
121
- }),
122
- instances: [{ browser: "chromium" }]
123
- }
124
- }
125
- }
126
- ]
127
- };
128
- }
129
- export { solidTest };
1
+ export { t as solidTest } from "./vitest-BjLr7iLf.mjs";
package/lefthook.yml ADDED
@@ -0,0 +1,57 @@
1
+ # Git hooks shared by the applications. The application extends this file from
2
+ # its .lefthook.yml and defines the package.json scripts the jobs call.
3
+
4
+ commit-msg:
5
+ jobs:
6
+ - name: commitlint
7
+ run:
8
+ vp exec node node_modules/@evertondgn/solid-tooling/dist/cli.mjs
9
+ commitlint --edit {1}
10
+
11
+ pre-commit:
12
+ skip:
13
+ - merge
14
+ - rebase
15
+ jobs:
16
+ - name: check
17
+ glob: '*.{ts,tsx,mts,cts,js,mjs,cjs,json,css,md,yml,yaml,toml,html}'
18
+ run: vp run check:fix {staged_files}
19
+ stage_fixed: true
20
+
21
+ - name: secret-scan
22
+ run: |
23
+ if ! command -v kingfisher > /dev/null 2>&1; then
24
+ echo "kingfisher is not installed; the secret scan was skipped."
25
+ echo "With Homebrew (macOS/Linux): brew install kingfisher"
26
+ echo "Without Homebrew (Linux/Windows): download the binary for your system and add it to PATH: https://github.com/mongodb/kingfisher/releases"
27
+ exit 0
28
+ fi
29
+ vp run scan:secrets --staged
30
+
31
+ pre-push:
32
+ # Without piped, Lefthook runs the next jobs after a failure.
33
+ piped: true
34
+ jobs:
35
+ # check:ci restores the Paraglide output from the Vite Task cache. Ending it
36
+ # before the tests avoids concurrent restores.
37
+ - name: check-ci
38
+ run: vp run check:ci
39
+
40
+ - name: typecheck-node
41
+ run: vp run typecheck:node
42
+
43
+ # Vitest has short windows (per-test timeout and waitFor). Running it
44
+ # without sharing the CPU with the tooling tests avoids timeouts that are
45
+ # not logic failures.
46
+ - name: test
47
+ run: vp run test:ci
48
+
49
+ - name: tooling-and-dead-code
50
+ group:
51
+ parallel: true
52
+ jobs:
53
+ - name: tooling
54
+ run: vp run test:tooling
55
+
56
+ - name: dead-code
57
+ run: vp run dead-code
package/node-env.d.ts ADDED
@@ -0,0 +1 @@
1
+ /// <reference types="node" />