@gusnips/vite 0.8.35 → 0.8.37

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 (57) hide show
  1. package/README.md +20 -20
  2. package/dist/catalog.d.ts +5 -6
  3. package/dist/catalog.d.ts.map +1 -1
  4. package/dist/catalog.js +5 -6
  5. package/dist/catalog.js.map +1 -1
  6. package/dist/contrast.js +8 -8
  7. package/dist/contrast.js.map +1 -1
  8. package/dist/head.d.ts +35 -36
  9. package/dist/head.d.ts.map +1 -1
  10. package/dist/head.js +20 -20
  11. package/dist/head.js.map +1 -1
  12. package/dist/i18n.d.ts +8 -7
  13. package/dist/i18n.d.ts.map +1 -1
  14. package/dist/i18n.js +5 -4
  15. package/dist/i18n.js.map +1 -1
  16. package/dist/icons.d.ts +6 -6
  17. package/dist/icons.d.ts.map +1 -1
  18. package/dist/icons.js +2 -2
  19. package/dist/icons.js.map +1 -1
  20. package/dist/index.d.ts +7 -7
  21. package/dist/index.js +7 -7
  22. package/dist/node.d.ts +24 -25
  23. package/dist/node.d.ts.map +1 -1
  24. package/dist/node.js +26 -26
  25. package/dist/node.js.map +1 -1
  26. package/dist/og.d.ts +7 -7
  27. package/dist/og.d.ts.map +1 -1
  28. package/dist/og.js +2 -2
  29. package/dist/og.js.map +1 -1
  30. package/dist/pre-paint.d.ts +3 -3
  31. package/dist/preset.d.ts +9 -9
  32. package/dist/preset.js +3 -3
  33. package/dist/render.d.ts +9 -9
  34. package/dist/render.js +4 -4
  35. package/dist/render.js.map +1 -1
  36. package/dist/sitemap.d.ts +26 -27
  37. package/dist/sitemap.d.ts.map +1 -1
  38. package/dist/sitemap.js +18 -18
  39. package/dist/sitemap.js.map +1 -1
  40. package/dist/theme.d.ts +1 -2
  41. package/dist/theme.d.ts.map +1 -1
  42. package/dist/theme.js +1 -2
  43. package/dist/theme.js.map +1 -1
  44. package/package.json +2 -2
  45. package/src/catalog.ts +5 -6
  46. package/src/contrast.ts +8 -8
  47. package/src/head.ts +36 -37
  48. package/src/i18n.ts +8 -7
  49. package/src/icons.ts +7 -7
  50. package/src/index.ts +7 -7
  51. package/src/node.ts +28 -29
  52. package/src/og.ts +8 -8
  53. package/src/pre-paint.ts +3 -3
  54. package/src/preset.ts +9 -9
  55. package/src/render.ts +10 -10
  56. package/src/sitemap.ts +27 -28
  57. package/src/theme.ts +1 -2
package/dist/og.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Fitting copy into a share card.
3
3
  *
4
- * The card's ART — the palette, the lockup, the size ladder — is the product, and it stays in
4
+ * The card's ART, including the palette, lockup and size ladder, is the product, and it stays in
5
5
  * the product. What ships here is the part two independent generators got wrong the same way:
6
6
  * deciding what happens when a headline does not fit.
7
7
  *
@@ -20,7 +20,7 @@ export interface OgOverflow {
20
20
  /** The string as given. */
21
21
  text: string;
22
22
  maxLines: number;
23
- /** Characters per line at this size — the budget the text blew. */
23
+ /** Characters per line at this size, the budget the text exceeded. */
24
24
  maxChars: number;
25
25
  size: number;
26
26
  }
@@ -34,11 +34,11 @@ export interface FitOptions {
34
34
  /**
35
35
  * Average glyph advance as a fraction of the font size.
36
36
  *
37
- * Character-budget estimation rather than real metrics: an SVG rasterizer gives no measuring
38
- * API, and card copy is short enough that the estimate never drifts more than a word. Measure
39
- * it off a rendered card and round UP — a budget that is too generous overflows the column,
40
- * while one that is too mean only breaks a line early. Donor values: ~0.5 for a display face
41
- * at headline sizes, ~0.46 for body copy.
37
+ * Character-budget estimation rather than real metrics: an SVG rasterizer gives no measuring API,
38
+ * and card copy is short enough that the estimate never drifts more than a word. Measure it off a
39
+ * rendered card and round UP. A budget that is too generous overflows the column, while one that
40
+ * is too mean only breaks a line early. Donor values: ~0.5 for a display face at headline sizes,
41
+ * ~0.46 for body copy.
42
42
  */
43
43
  advance: number;
44
44
  /** Names this line in an overflow report. `"pricing headline"`, not `"line 1"`. */
package/dist/og.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"og.d.ts","sourceRoot":"","sources":["../src/og.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,iGAAiG;AACjG,eAAO,MAAM,SAAS;;;CAAwC,CAAC;AAE/D,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB;6BACyB;IACzB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,SAAS,CAyBpE;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAM7D"}
1
+ {"version":3,"file":"og.d.ts","sourceRoot":"","sources":["../src/og.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,iGAAiG;AACjG,eAAO,MAAM,SAAS;;;CAAwC,CAAC;AAE/D,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB;6BACyB;IACzB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,SAAS,CAyBpE;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAM7D"}
package/dist/og.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Fitting copy into a share card.
3
3
  *
4
- * The card's ART — the palette, the lockup, the size ladder — is the product, and it stays in
4
+ * The card's ART, including the palette, lockup and size ladder, is the product, and it stays in
5
5
  * the product. What ships here is the part two independent generators got wrong the same way:
6
6
  * deciding what happens when a headline does not fit.
7
7
  *
@@ -53,7 +53,7 @@ export function fitText(text, options) {
53
53
  }
54
54
  /** One overflow, as the line an operator reads in a failed build. */
55
55
  export function describeOverflow(overflow) {
56
- return (`${overflow.label} — ${String(overflow.maxLines)} lines of ~${String(overflow.maxChars)} ` +
56
+ return (`${overflow.label}: ${String(overflow.maxLines)} lines of ~${String(overflow.maxChars)} ` +
57
57
  `chars at ${String(overflow.size)}px, ${String(overflow.text.length)} chars given\n` +
58
58
  ` ${JSON.stringify(overflow.text)}`);
59
59
  }
package/dist/og.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"og.js","sourceRoot":"","sources":["../src/og.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,iGAAiG;AACjG,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAW,CAAC;AA0C/D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAmB;IACvD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,IAAI,SAAS,CAAC,MAAM,IAAI,QAAQ,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,SAAS,CAAC;aACvD,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;YACxD,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3B,OAAO,UAAU;QACf,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACtE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,QAAoB;IACnD,OAAO,CACL,GAAG,QAAQ,CAAC,KAAK,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG;QAC1F,YAAY,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB;QACpF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CACvC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"og.js","sourceRoot":"","sources":["../src/og.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,iGAAiG;AACjG,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAW,CAAC;AA0C/D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAmB;IACvD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,IAAI,SAAS,CAAC,MAAM,IAAI,QAAQ,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,SAAS,CAAC;aACvD,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;YACxD,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3B,OAAO,UAAU;QACf,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACtE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,QAAoB;IACnD,OAAO,CACL,GAAG,QAAQ,CAAC,KAAK,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG;QACzF,YAAY,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB;QACpF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CACvC,CAAC;AACJ,CAAC"}
@@ -5,10 +5,10 @@ export interface PrePaintScriptOptions {
5
5
  /** The script's full text. It runs alone, so it must not reference anything outside itself. */
6
6
  source: string;
7
7
  /**
8
- * Where the tag goes. `"head"` (the end of `<head>`) when the script reads elements above it —
8
+ * Where the tag goes. `"head"` (the end of `<head>`) when the script reads elements above it, as
9
9
  * the theme reads `<meta name="theme-color">`. `"head-prepend"` when it only needs to run as
10
- * early as possible: a classic script after a stylesheet waits for that stylesheet, so the
11
- * locale gate goes first and redirects without downloading the page's CSS.
10
+ * early as possible: a classic script after a stylesheet waits for that stylesheet, so the locale
11
+ * gate goes first and redirects without downloading the page's CSS.
12
12
  */
13
13
  position?: "head" | "head-prepend";
14
14
  }
package/dist/preset.d.ts CHANGED
@@ -5,13 +5,13 @@ import type { Plugin, PluginOption, UserConfig } from "vite";
5
5
  * `index.html` cannot import TypeScript, so a brand name or tagline written there is a literal
6
6
  * that drifts from the one the app renders. This injects them from the module that owns them.
7
7
  *
8
- * Vite already replaces `%VITE_FOO%` from the environment, and that is the right tool when the
9
- * value IS environment — an API URL, a build id. It is the wrong one for brand identity, which
10
- * belongs in a typed module the app imports, not in a `.env` nobody reviews.
8
+ * Vite already replaces `%VITE_FOO%` from the environment, and that is the right tool for an
9
+ * environment value, such as an API URL or a build id. It is the wrong one for brand identity,
10
+ * which belongs in a typed module the app imports, not in a `.env` nobody reviews.
11
11
  */
12
12
  export declare function htmlPlaceholders(values: Readonly<Record<string, string>>): Plugin;
13
13
  export interface WebPresetOptions {
14
- /** The app folder — the one holding `index.html`. In a `vite.config.ts` that is
14
+ /** The app folder holding `index.html`. In a `vite.config.ts` that is
15
15
  * `import.meta.dirname`. `@` resolves to `<root>/src`. */
16
16
  root: string;
17
17
  /** Dev server port. Two apps in one repo must not share one, which is why it has no clever
@@ -25,11 +25,11 @@ export interface WebPresetOptions {
25
25
  /**
26
26
  * The workspace scope to bundle into the SSR build, as in `"@acme"`.
27
27
  *
28
- * INSURANCE, not a fix. Measured: Vite already bundles linked workspace dependencies in an
29
- * SSR build — one donor runs without this declaration and its SSR output has zero bare
30
- * imports. It is here because workspace packages are consumed as TypeScript SOURCE through
31
- * subpath exports, and leaving them external would hand the runtime `.ts` files with
32
- * Vite-only semantics in them (aliases, `?raw`, `define`) if that behaviour ever changed.
28
+ * INSURANCE, not a fix. Measured: Vite already bundles linked workspace dependencies in an SSR
29
+ * build. One donor runs without this declaration and its SSR output has zero bare imports. It is
30
+ * here because workspace packages are consumed as TypeScript SOURCE through subpath exports, and
31
+ * leaving them external would hand the runtime `.ts` files with Vite-only semantics in them
32
+ * (aliases, `?raw`, `define`) if that behaviour ever changed.
33
33
  */
34
34
  ssrScope?: string;
35
35
  /** More plugins, after the preset's own: `[themeScript(THEME)]`. */
package/dist/preset.js CHANGED
@@ -14,9 +14,9 @@ import path from "node:path";
14
14
  * `index.html` cannot import TypeScript, so a brand name or tagline written there is a literal
15
15
  * that drifts from the one the app renders. This injects them from the module that owns them.
16
16
  *
17
- * Vite already replaces `%VITE_FOO%` from the environment, and that is the right tool when the
18
- * value IS environment — an API URL, a build id. It is the wrong one for brand identity, which
19
- * belongs in a typed module the app imports, not in a `.env` nobody reviews.
17
+ * Vite already replaces `%VITE_FOO%` from the environment, and that is the right tool for an
18
+ * environment value, such as an API URL or a build id. It is the wrong one for brand identity,
19
+ * which belongs in a typed module the app imports, not in a `.env` nobody reviews.
20
20
  */
21
21
  export function htmlPlaceholders(values) {
22
22
  return {
package/dist/render.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * One page, as the markup that goes inside `<div id="root">`.
3
3
  *
4
- * This is the build-time half of `main.tsx`, and the app's `entry-server.tsx` is expected to
5
- * be four lines around it: the same `<App />` and the same route table the browser runs, with
6
- * a `StaticRouter` in place of the history the build does not have. `main.tsx` is deliberately
7
- * NOT reused — it reads `window.location`, registers listeners and starts analytics at module
4
+ * This is the build-time half of `main.tsx`, and the app's `entry-server.tsx` is expected to be
5
+ * four lines around it: the same `<App />` and the same route table the browser runs, with a
6
+ * `StaticRouter` in place of the history the build does not have. `main.tsx` is deliberately NOT
7
+ * reused because it reads `window.location`, registers listeners and starts analytics at module
8
8
  * scope, none of which mean anything here.
9
9
  *
10
10
  * No `node:` import: this file is bundled into the SSR build by Vite, and it is React's own
@@ -15,9 +15,9 @@ import type { ReactNode } from "react";
15
15
  * Render a tree to markup with `prerender` from `react-dom/static`.
16
16
  *
17
17
  * **Never `renderToString`.** With `lazy()` routes behind a `<Suspense fallback={<Spinner />}>`,
18
- * `renderToString` renders the FALLBACK — it would write a loading screen into every file and
19
- * pass every gate that only asks whether the root has children. `prerender` waits for the tree
20
- * to settle, which is also why this is async and why the whole renderer contract is.
18
+ * `renderToString` renders the FALLBACK. It would write a loading screen into every file and pass
19
+ * every gate that only asks whether the root has children. `prerender` waits for the tree to
20
+ * settle, which is also why this is async and why the whole renderer contract is.
21
21
  *
22
22
  * Two more halves of the same lesson are here too: `onError` is captured and rethrown, so a
23
23
  * render failure fails the build rather than shipping a partial page; and an empty result is
@@ -28,8 +28,8 @@ export declare function renderTree(tree: ReactNode): Promise<string>;
28
28
  /**
29
29
  * What an SSR entry exports, and what {@link loadRenderer} looks for.
30
30
  *
31
- * `context` is opaque on purpose. A multi-locale app builds its i18n instance per call — three
32
- * languages render in one process and a shared singleton would have them racing for one `lng` —
31
+ * `context` is opaque on purpose. A multi-locale app builds its i18n instance per call. Three
32
+ * languages render in one process and a shared singleton would have them racing for one `lng`,
33
33
  * while a single-locale app ignores the argument and keeps its singleton.
34
34
  */
35
35
  export type PageRenderer<Context = unknown> = (route: string, context?: Context) => Promise<string>;
package/dist/render.js CHANGED
@@ -22,9 +22,9 @@ const HOISTED_HEAD = /^(?:<title>[^<]*<\/title>|<meta\b[^>]*\/?>|<link\b[^>]*\/?
22
22
  * Render a tree to markup with `prerender` from `react-dom/static`.
23
23
  *
24
24
  * **Never `renderToString`.** With `lazy()` routes behind a `<Suspense fallback={<Spinner />}>`,
25
- * `renderToString` renders the FALLBACK — it would write a loading screen into every file and
26
- * pass every gate that only asks whether the root has children. `prerender` waits for the tree
27
- * to settle, which is also why this is async and why the whole renderer contract is.
25
+ * `renderToString` renders the FALLBACK. It would write a loading screen into every file and pass
26
+ * every gate that only asks whether the root has children. `prerender` waits for the tree to
27
+ * settle, which is also why this is async and why the whole renderer contract is.
28
28
  *
29
29
  * Two more halves of the same lesson are here too: `onError` is captured and rethrown, so a
30
30
  * render failure fails the build rather than shipping a partial page; and an empty result is
@@ -43,7 +43,7 @@ export async function renderTree(tree) {
43
43
  throw failure;
44
44
  const markup = html.replace(HOISTED_HEAD, "");
45
45
  if (markup.trim() === "")
46
- throw new Error("renderTree: the tree rendered to nothing — usually a router whose location or basename " +
46
+ throw new Error("renderTree: the tree rendered to nothing. Usually a router whose location or basename " +
47
47
  "matches no route, which React reports as an empty string rather than an error");
48
48
  return markup;
49
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAaA,+FAA+F;AAC/F,gGAAgG;AAChG,yFAAyF;AACzF,8FAA8F;AAC9F,4FAA4F;AAC5F,oEAAoE;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,YAAY,GAAG,mEAAmE,CAAC;AAEzF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAe;IAC9C,IAAI,OAAgB,CAAC;IACrB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE;QACxC,OAAO,CAAC,KAAc;YACpB,OAAO,KAAK,KAAK,CAAC;QACpB,CAAC;KACF,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,OAAO,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QACtB,MAAM,IAAI,KAAK,CACb,yFAAyF;YACvF,+EAA+E,CAClF,CAAC;IACJ,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAaA,+FAA+F;AAC/F,gGAAgG;AAChG,yFAAyF;AACzF,8FAA8F;AAC9F,4FAA4F;AAC5F,oEAAoE;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,YAAY,GAAG,mEAAmE,CAAC;AAEzF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAe;IAC9C,IAAI,OAAgB,CAAC;IACrB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE;QACxC,OAAO,CAAC,KAAc;YACpB,OAAO,KAAK,KAAK,CAAC;QACpB,CAAC;KACF,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,OAAO,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QACtB,MAAM,IAAI,KAAK,CACb,wFAAwF;YACtF,+EAA+E,CAClF,CAAC;IACJ,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/sitemap.d.ts CHANGED
@@ -2,19 +2,19 @@ import type { Alternate } from "./head.ts";
2
2
  /**
3
3
  * Where a rendered page lands.
4
4
  *
5
- * FLAT (`pricing.html`), not directory-style (`pricing/index.html`). Cloudflare Pages serves
6
- * the directory form at `/pricing/` and answers `/pricing` with a 308 to it — so every address
7
- * the app advertises in its canonical and its sitemap would be a redirect rather than a page.
8
- * A flat file answers `/pricing` — the address the canonical and the sitemap name — with a 200,
9
- * and normalizes `/pricing/` to it with a 308.
5
+ * FLAT (`pricing.html`), not directory-style (`pricing/index.html`). Cloudflare Pages serves the
6
+ * directory form at `/pricing/` and answers `/pricing` with a 308 to it, so every address the app
7
+ * advertises in its canonical and its sitemap would be a redirect rather than a page. A flat file
8
+ * answers the advertised `/pricing` address with a 200, and normalizes `/pricing/` to it with a
9
+ * 308.
10
10
  *
11
11
  * This said "200 either way" until somebody measured it. On a live Pages deployment `/precos/`
12
- * answers `308` with `location: /precos`, which then answers 200. The rule is untouched by that
13
- * — the ADVERTISED form is the one that must be a page, and it is — but the parenthetical was
14
- * inherited from a donor comment and repeated into an adopter's commit message as a live bug
15
- * before anyone checked. It also has a consequence worth knowing: on a host that normalizes,
16
- * `hydrateOrMount`'s slash tolerance can never fire, because the browser is redirected before it
17
- * runs. That tolerance earns its place on hosts that serve both forms, not on this one.
12
+ * answers `308` with `location: /precos`, which then answers 200. The rule is untouched: the
13
+ * ADVERTISED form is the one that must be a page, and it is. But the parenthetical was inherited
14
+ * from a donor comment and repeated into an adopter's commit message as a live bug before anyone
15
+ * checked. It also has a consequence worth knowing: on a host that normalizes, `hydrateOrMount`'s
16
+ * slash tolerance can never fire, because the browser is redirected before it runs. That tolerance
17
+ * earns its place on hosts that serve both forms, not on this one.
18
18
  *
19
19
  * That is Cloudflare Pages, not every host. Firebase Hosting serves the directory form at
20
20
  * `/pricing` itself with `trailingSlash: false`, and an adopter there names its own files. What
@@ -36,21 +36,21 @@ export declare function siteOrigin(url: string): string;
36
36
  /**
37
37
  * The origin the template already declares, read out of its canonical.
38
38
  *
39
- * One file is the answer for the head Vite ships and for every file written after it, so there
40
- * is no second place for a domain to drift to — no env var the script has to resolve beside
41
- * it. Demanded rather than defaulted, for the reason `bakeHead` demands the tag: a template
42
- * without one would hand every page somebody else's origin, quietly.
39
+ * One file is the answer for the head Vite ships and for every file written after it, so there is
40
+ * no second place for a domain to drift to and no env var the script has to resolve beside it.
41
+ * Demanded rather than defaulted, for the reason `bakeHead` demands the tag: a template without one
42
+ * would hand every page somebody else's origin, quietly.
43
43
  */
44
44
  export declare function templateOrigin(template: string): string;
45
45
  /**
46
46
  * The three things about a public page that do not translate: where it is, how often it
47
47
  * changes, and how it ranks against its siblings.
48
48
  *
49
- * A product's registry extends this with its own copy fields — one donor names an i18n key per
50
- * page, another keys its locale catalogs by `pageSlug` and stores no copy here at all. Where
51
- * the copy lives is the product's call. These three are what a sitemap needs from every one of
52
- * them, and the registry is the single source the prerender, the sitemap and the share cards
53
- * all walk, so a page can never be in one and missing from another.
49
+ * A product's registry extends this with its own copy fields. One donor names an i18n key per page,
50
+ * another keys its locale catalogs by `pageSlug` and stores no copy here at all. Where the copy
51
+ * lives is the product's call. These three are what a sitemap needs from every one of them, and the
52
+ * registry is the single source the prerender, the sitemap and the share cards all walk, so a page
53
+ * can never be in one and missing from another.
54
54
  */
55
55
  export interface PublicPage {
56
56
  path: string;
@@ -66,7 +66,7 @@ export declare function ogImagePath(path: string): string;
66
66
  export interface SitemapEntry {
67
67
  loc: string;
68
68
  changefreq: string;
69
- /** Already formatted — an app ranks its own pages, and that rule does not belong here. */
69
+ /** Already formatted, because an app ranks its own pages, and that rule does not belong here. */
70
70
  priority: string;
71
71
  /** `YYYY-MM-DD`. The one hint in a sitemap Google actually reads. One date for the whole
72
72
  * build is the honest answer: these pages ship together. */
@@ -78,8 +78,8 @@ export interface SitemapEntry {
78
78
  /** `sitemap.xml`, from whichever registry the caller walks. */
79
79
  export declare function sitemapXml(entries: readonly SitemapEntry[]): string;
80
80
  /**
81
- * `sitemap.xml` for a single-language site, straight from the registry — the common case, and
82
- * the reason a registry exists: the sitemap can never drift from the routes the app serves.
81
+ * `sitemap.xml` for a single-language site, straight from the registry. This is the common case,
82
+ * and the reason a registry exists: the sitemap can never drift from the routes the app serves.
83
83
  *
84
84
  * A localized site walks its own locales and calls {@link sitemapXml}, because only it knows
85
85
  * how an address carries a language.
@@ -87,17 +87,16 @@ export declare function sitemapXml(entries: readonly SitemapEntry[]): string;
87
87
  export declare function sitemapFor(origin: string, pages: readonly PublicPage[], lastmod?: string): string;
88
88
  export interface RobotsOptions {
89
89
  /** The origin this file is served from. Every sitemap path is resolved against it, so the
90
- * file can never advertise a host it is not on — a mistake one donor is still shipping,
90
+ * file can never advertise a host it is not on. One donor still ships that mistake,
91
91
  * where a static `robots.txt` and the build's fallback name different domains. */
92
92
  origin: string;
93
93
  /** Every sitemap on this ORIGIN, as paths (`/sitemap.xml`, `/docs/sitemap.xml`).
94
94
  *
95
95
  * A crawler reads only the robots.txt at the origin root. An app served from a
96
- * subdirectory therefore cannot ship its own — the one file at the root has to list its
96
+ * subdirectory therefore cannot ship its own. The one file at the root has to list its
97
97
  * sitemap too, or nothing ever finds it. */
98
98
  sitemaps: readonly string[];
99
- /** Paths to keep out of every index. A page nobody should be able to find by searching —
100
- * a per-request status page, an unsubscribe link — belongs here AND in `noindex`. */
99
+ /** Paths to keep out of every index. A per-request status page or an unsubscribe link that nobody should be able to find by searching belongs here AND in `noindex`. */
101
100
  disallow?: readonly string[];
102
101
  }
103
102
  export declare function robotsTxt({ origin, sitemaps, disallow }: RobotsOptions): string;
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../src/sitemap.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASvD;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC5F;AAED;+CAC+C;AAC/C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAC;IACjB;iEAC6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;iFAC6E;IAC7E,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CACnC;AAED,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAyBnE;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAYjG;AAED,MAAM,WAAW,aAAa;IAC5B;;uFAEmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf;;;;iDAI6C;IAC7C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B;0FACsF;IACtF,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAa,EAAE,EAAE,aAAa,GAAG,MAAM,CAQpF"}
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../src/sitemap.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASvD;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC5F;AAED;+CAC+C;AAC/C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,iGAAiG;IACjG,QAAQ,EAAE,MAAM,CAAC;IACjB;iEAC6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;iFAC6E;IAC7E,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CACnC;AAED,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAyBnE;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAYjG;AAED,MAAM,WAAW,aAAa;IAC5B;;uFAEmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf;;;;iDAI6C;IAC7C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,wKAAwK;IACxK,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAa,EAAE,EAAE,aAAa,GAAG,MAAM,CAQpF"}
package/dist/sitemap.js CHANGED
@@ -8,19 +8,19 @@ import { escapeAttr } from "./escape.js";
8
8
  /**
9
9
  * Where a rendered page lands.
10
10
  *
11
- * FLAT (`pricing.html`), not directory-style (`pricing/index.html`). Cloudflare Pages serves
12
- * the directory form at `/pricing/` and answers `/pricing` with a 308 to it — so every address
13
- * the app advertises in its canonical and its sitemap would be a redirect rather than a page.
14
- * A flat file answers `/pricing` — the address the canonical and the sitemap name — with a 200,
15
- * and normalizes `/pricing/` to it with a 308.
11
+ * FLAT (`pricing.html`), not directory-style (`pricing/index.html`). Cloudflare Pages serves the
12
+ * directory form at `/pricing/` and answers `/pricing` with a 308 to it, so every address the app
13
+ * advertises in its canonical and its sitemap would be a redirect rather than a page. A flat file
14
+ * answers the advertised `/pricing` address with a 200, and normalizes `/pricing/` to it with a
15
+ * 308.
16
16
  *
17
17
  * This said "200 either way" until somebody measured it. On a live Pages deployment `/precos/`
18
- * answers `308` with `location: /precos`, which then answers 200. The rule is untouched by that
19
- * — the ADVERTISED form is the one that must be a page, and it is — but the parenthetical was
20
- * inherited from a donor comment and repeated into an adopter's commit message as a live bug
21
- * before anyone checked. It also has a consequence worth knowing: on a host that normalizes,
22
- * `hydrateOrMount`'s slash tolerance can never fire, because the browser is redirected before it
23
- * runs. That tolerance earns its place on hosts that serve both forms, not on this one.
18
+ * answers `308` with `location: /precos`, which then answers 200. The rule is untouched: the
19
+ * ADVERTISED form is the one that must be a page, and it is. But the parenthetical was inherited
20
+ * from a donor comment and repeated into an adopter's commit message as a live bug before anyone
21
+ * checked. It also has a consequence worth knowing: on a host that normalizes, `hydrateOrMount`'s
22
+ * slash tolerance can never fire, because the browser is redirected before it runs. That tolerance
23
+ * earns its place on hosts that serve both forms, not on this one.
24
24
  *
25
25
  * That is Cloudflare Pages, not every host. Firebase Hosting serves the directory form at
26
26
  * `/pricing` itself with `trailingSlash: false`, and an adopter there names its own files. What
@@ -43,16 +43,16 @@ export function pageFile(routePath) {
43
43
  */
44
44
  export function siteOrigin(url) {
45
45
  if (!/^https?:\/\/[^/]+/.test(url))
46
- throw new Error(`prerender: "${url}" is not an absolute origin — it needs a scheme, as in https://example.com`);
46
+ throw new Error(`prerender: "${url}" is not an absolute origin. It needs a scheme, as in https://example.com`);
47
47
  return url.replace(/\/+$/, "");
48
48
  }
49
49
  /**
50
50
  * The origin the template already declares, read out of its canonical.
51
51
  *
52
- * One file is the answer for the head Vite ships and for every file written after it, so there
53
- * is no second place for a domain to drift to — no env var the script has to resolve beside
54
- * it. Demanded rather than defaulted, for the reason `bakeHead` demands the tag: a template
55
- * without one would hand every page somebody else's origin, quietly.
52
+ * One file is the answer for the head Vite ships and for every file written after it, so there is
53
+ * no second place for a domain to drift to and no env var the script has to resolve beside it.
54
+ * Demanded rather than defaulted, for the reason `bakeHead` demands the tag: a template without one
55
+ * would hand every page somebody else's origin, quietly.
56
56
  */
57
57
  export function templateOrigin(template) {
58
58
  const href = /<link[^>]*rel="canonical"[^>]*href="([^"]*)"/.exec(template)?.[1] ??
@@ -94,8 +94,8 @@ export function sitemapXml(entries) {
94
94
  ` xmlns:xhtml="http://www.w3.org/1999/xhtml">\n${urls}\n</urlset>\n`);
95
95
  }
96
96
  /**
97
- * `sitemap.xml` for a single-language site, straight from the registry — the common case, and
98
- * the reason a registry exists: the sitemap can never drift from the routes the app serves.
97
+ * `sitemap.xml` for a single-language site, straight from the registry. This is the common case,
98
+ * and the reason a registry exists: the sitemap can never drift from the routes the app serves.
99
99
  *
100
100
  * A localized site walks its own locales and calls {@link sitemapXml}, because only it knows
101
101
  * how an address carries a language.
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../src/sitemap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../src/sitemap.ts"],"names":[],"mappings":"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"}
package/dist/theme.d.ts CHANGED
@@ -5,8 +5,7 @@
5
5
  * It lives behind its own subpath because it imports the controller, and that module imports
6
6
  * React. The barrel stays free of React so a script that only wants a sitemap does not load it.
7
7
  *
8
- * The delivery — a hashed same-origin file and one classic `<script src>`, never inline — is
9
- * `prePaintScript`'s, and that module says why. What is particular to the theme:
8
+ * `prePaintScript` owns the delivery: a hashed same-origin file and one classic `<script src>`, never inline, and that module says why. What is particular to the theme:
10
9
  *
11
10
  * - **Not hand-written.** The file is `startTheme`'s own source, called with your options. The
12
11
  * script that paints first and the controller the app talks to cannot disagree, because they
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAE/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAEzD"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAE/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAEzD"}
package/dist/theme.js CHANGED
@@ -5,8 +5,7 @@
5
5
  * It lives behind its own subpath because it imports the controller, and that module imports
6
6
  * React. The barrel stays free of React so a script that only wants a sitemap does not load it.
7
7
  *
8
- * The delivery — a hashed same-origin file and one classic `<script src>`, never inline — is
9
- * `prePaintScript`'s, and that module says why. What is particular to the theme:
8
+ * `prePaintScript` owns the delivery: a hashed same-origin file and one classic `<script src>`, never inline, and that module says why. What is particular to the theme:
10
9
  *
11
10
  * - **Not hand-written.** The file is `startTheme`'s own source, called with your options. The
12
11
  * script that paints first and the controller the app talks to cannot disagree, because they
package/dist/theme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAAC,OAAqB;IACrD,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,OAAqB;IAC/C,OAAO,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACjG,CAAC"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAAC,OAAqB;IACrD,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,OAAqB;IAC/C,OAAO,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACjG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gusnips/vite",
3
- "version": "0.8.35",
3
+ "version": "0.8.37",
4
4
  "description": "The build-time half of a prerendered Vite SPA: head baking, sitemap, robots, the prerender driver, a shared vite preset, and the translation catalog check.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -73,7 +73,7 @@
73
73
  "release:major": "bun pm version major && bun publish --access public"
74
74
  },
75
75
  "dependencies": {
76
- "@gusnips/react": "0.9.24"
76
+ "@gusnips/react": "0.9.26"
77
77
  },
78
78
  "peerDependencies": {
79
79
  "@tailwindcss/cli": "^4",
package/src/catalog.ts CHANGED
@@ -1,13 +1,12 @@
1
1
  /**
2
2
  * Build-time i18n: one string out of a raw locale catalog, by dotted key.
3
3
  *
4
- * The prerender reads the SAME JSON the app initializes i18next from, without initializing
5
- * i18next — a localized build renders every language in one process, and a singleton would race
6
- * on `lng`. So this is deliberately not a translator: no plurals, no interpolation, no fallback
7
- * chain. A `<title>` is one string, and every donor that needed one wrote exactly this function.
4
+ * The prerender reads the SAME JSON the app initializes i18next from, without initializing i18next.
5
+ * A localized build renders every language in one process, and a singleton would race on `lng`. So
6
+ * this is deliberately not a translator: no plurals, no interpolation, no fallback chain. A
7
+ * `<title>` is one string, and every donor that needed one wrote exactly this function.
8
8
  *
9
- * A miss returns the KEY. That is what makes a stale key visible — `seo.old.title` sitting in a
10
- * tab and in a search result — instead of an empty tag nobody notices.
9
+ * A miss returns the KEY. That makes a stale key visible as `seo.old.title` in a tab or search result instead of an empty tag nobody notices.
11
10
  *
12
11
  * `hasOwnProperty` and not `in`: `in` walks the prototype, so `faq.constructor.name` resolves to
13
12
  * `"Object"` and ships as a page title. Both donor copies used `in` and neither had noticed.
package/src/contrast.ts CHANGED
@@ -334,7 +334,7 @@ async function checkBundle(
334
334
  problem({
335
335
  rule: "floor",
336
336
  message:
337
- `${mode}: cannot measure ${token} on ${against} — one of them is no longer a ` +
337
+ `${mode}: cannot measure ${token} on ${against}, because one of them is no longer a ` +
338
338
  `hex colour. Keep the values hex, or teach this check the new notation; ` +
339
339
  `do not let the floor go unmeasured.`,
340
340
  });
@@ -357,7 +357,7 @@ async function checkBundle(
357
357
  if (!dark.has(name))
358
358
  problem({
359
359
  rule: "rebind",
360
- message: `\`${name}\` is missing from the .dark block — one mode keeps the light value`,
360
+ message: `\`${name}\` is missing from the .dark block, so one mode keeps the light value`,
361
361
  });
362
362
  }
363
363
  // A fill chosen against a white page lands on the 3:1 line on a near-black card instead of
@@ -369,7 +369,7 @@ async function checkBundle(
369
369
  problem({
370
370
  rule: "retune",
371
371
  message:
372
- `--color-primary (${day}) is the same fill in both modes — lift it for dark, and ` +
372
+ `--color-primary (${day}) is the same fill in both modes. Lift it for dark, and ` +
373
373
  `flip --color-primary-foreground with it`,
374
374
  });
375
375
  }
@@ -406,7 +406,7 @@ async function checkBundle(
406
406
  class: cls,
407
407
  at: firstAt(scanned, cls),
408
408
  message:
409
- "compiled to no rule — a token Tailwind does not have, or a class built dynamically",
409
+ "compiled to no rule: a token Tailwind does not have, or a class built dynamically",
410
410
  });
411
411
  continue;
412
412
  }
@@ -425,7 +425,7 @@ async function checkBundle(
425
425
  rule: "untokened",
426
426
  class: cls,
427
427
  at: `${file}:${String(line)}`,
428
- message: `paints ${prop} with a literal colour — point it at a theme token instead`,
428
+ message: `paints ${prop} with a literal colour. Point it at a theme token instead`,
429
429
  });
430
430
  }
431
431
  continue;
@@ -438,8 +438,8 @@ async function checkBundle(
438
438
  class: cls,
439
439
  at: `${file}:${String(line)}`,
440
440
  message:
441
- `paints ${prop} from \`${token}\`, which the theme never declares — ` +
442
- `a default-palette rung that reads right in one mode and vanishes in the other`,
441
+ `paints ${prop} from \`${token}\`, which the theme never declares. ` +
442
+ `A default-palette rung reads right in one mode and vanishes in the other`,
443
443
  });
444
444
  }
445
445
  }
@@ -457,7 +457,7 @@ async function checkBundle(
457
457
  class: variant,
458
458
  at: firstAt(scanned, variant),
459
459
  message:
460
- `paints the same ${base} the base state already has — the state changes nothing. ` +
460
+ `paints the same ${base} the base state already has, so the state changes nothing. ` +
461
461
  `If these are on different elements, ignore this.`,
462
462
  });
463
463
  }