@trebired/frontend 0.4.1 → 0.5.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 (115) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +61 -1
  3. package/dist/config/index.d.ts +6 -50
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/index.js +19 -266
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/config/module.d.ts +5 -0
  8. package/dist/config/module.d.ts.map +1 -0
  9. package/dist/config/module.js +124 -0
  10. package/dist/config/module.js.map +1 -0
  11. package/dist/config/normalize.d.ts +10 -0
  12. package/dist/config/normalize.d.ts.map +1 -0
  13. package/dist/config/normalize.js +105 -0
  14. package/dist/config/normalize.js.map +1 -0
  15. package/dist/config/scss.d.ts +4 -0
  16. package/dist/config/scss.d.ts.map +1 -0
  17. package/dist/config/scss.js +84 -0
  18. package/dist/config/scss.js.map +1 -0
  19. package/dist/config/shared.d.ts +9 -0
  20. package/dist/config/shared.d.ts.map +1 -0
  21. package/dist/config/shared.js +27 -0
  22. package/dist/config/shared.js.map +1 -0
  23. package/dist/config/theme.d.ts +6 -0
  24. package/dist/config/theme.d.ts.map +1 -0
  25. package/dist/config/theme.js +133 -0
  26. package/dist/config/theme.js.map +1 -0
  27. package/dist/config/types.d.ts +62 -0
  28. package/dist/config/types.d.ts.map +1 -0
  29. package/dist/config/types.js +2 -0
  30. package/dist/config/types.js.map +1 -0
  31. package/dist/src/config/index.d.ts +6 -50
  32. package/dist/src/config/index.d.ts.map +1 -1
  33. package/dist/src/config/index.js +19 -266
  34. package/dist/src/config/index.js.map +1 -1
  35. package/dist/src/config/module.d.ts +5 -0
  36. package/dist/src/config/module.d.ts.map +1 -0
  37. package/dist/src/config/module.js +124 -0
  38. package/dist/src/config/module.js.map +1 -0
  39. package/dist/src/config/normalize.d.ts +10 -0
  40. package/dist/src/config/normalize.d.ts.map +1 -0
  41. package/dist/src/config/normalize.js +105 -0
  42. package/dist/src/config/normalize.js.map +1 -0
  43. package/dist/src/config/scss.d.ts +4 -0
  44. package/dist/src/config/scss.d.ts.map +1 -0
  45. package/dist/src/config/scss.js +84 -0
  46. package/dist/src/config/scss.js.map +1 -0
  47. package/dist/src/config/shared.d.ts +9 -0
  48. package/dist/src/config/shared.d.ts.map +1 -0
  49. package/dist/src/config/shared.js +27 -0
  50. package/dist/src/config/shared.js.map +1 -0
  51. package/dist/src/config/theme.d.ts +6 -0
  52. package/dist/src/config/theme.d.ts.map +1 -0
  53. package/dist/src/config/theme.js +133 -0
  54. package/dist/src/config/theme.js.map +1 -0
  55. package/dist/src/config/types.d.ts +62 -0
  56. package/dist/src/config/types.d.ts.map +1 -0
  57. package/dist/src/config/types.js +2 -0
  58. package/dist/src/config/types.js.map +1 -0
  59. package/dist/src/theme/apply.d.ts +26 -0
  60. package/dist/src/theme/apply.d.ts.map +1 -0
  61. package/dist/src/theme/apply.js +85 -0
  62. package/dist/src/theme/apply.js.map +1 -0
  63. package/dist/src/theme/boot.d.ts +4 -0
  64. package/dist/src/theme/boot.d.ts.map +1 -0
  65. package/dist/src/theme/boot.js +23 -0
  66. package/dist/src/theme/boot.js.map +1 -0
  67. package/dist/src/theme/components/index.d.ts +13 -5
  68. package/dist/src/theme/components/index.d.ts.map +1 -1
  69. package/dist/src/theme/components/index.js +22 -6
  70. package/dist/src/theme/components/index.js.map +1 -1
  71. package/dist/src/theme/constants.d.ts +12 -0
  72. package/dist/src/theme/constants.d.ts.map +1 -0
  73. package/dist/src/theme/constants.js +12 -0
  74. package/dist/src/theme/constants.js.map +1 -0
  75. package/dist/src/theme/controls.d.ts +15 -0
  76. package/dist/src/theme/controls.d.ts.map +1 -0
  77. package/dist/src/theme/controls.js +128 -0
  78. package/dist/src/theme/controls.js.map +1 -0
  79. package/dist/src/theme/index.d.ts +10 -24
  80. package/dist/src/theme/index.d.ts.map +1 -1
  81. package/dist/src/theme/index.js +15 -117
  82. package/dist/src/theme/index.js.map +1 -1
  83. package/dist/src/theme/modes.d.ts +36 -0
  84. package/dist/src/theme/modes.d.ts.map +1 -0
  85. package/dist/src/theme/modes.js +107 -0
  86. package/dist/src/theme/modes.js.map +1 -0
  87. package/dist/theme/apply.d.ts +26 -0
  88. package/dist/theme/apply.d.ts.map +1 -0
  89. package/dist/theme/apply.js +85 -0
  90. package/dist/theme/apply.js.map +1 -0
  91. package/dist/theme/boot.d.ts +4 -0
  92. package/dist/theme/boot.d.ts.map +1 -0
  93. package/dist/theme/boot.js +23 -0
  94. package/dist/theme/boot.js.map +1 -0
  95. package/dist/theme/components/index.d.ts +13 -5
  96. package/dist/theme/components/index.d.ts.map +1 -1
  97. package/dist/theme/components/index.js +22 -6
  98. package/dist/theme/components/index.js.map +1 -1
  99. package/dist/theme/constants.d.ts +12 -0
  100. package/dist/theme/constants.d.ts.map +1 -0
  101. package/dist/theme/constants.js +12 -0
  102. package/dist/theme/constants.js.map +1 -0
  103. package/dist/theme/controls.d.ts +15 -0
  104. package/dist/theme/controls.d.ts.map +1 -0
  105. package/dist/theme/controls.js +128 -0
  106. package/dist/theme/controls.js.map +1 -0
  107. package/dist/theme/index.d.ts +10 -24
  108. package/dist/theme/index.d.ts.map +1 -1
  109. package/dist/theme/index.js +15 -117
  110. package/dist/theme/index.js.map +1 -1
  111. package/dist/theme/modes.d.ts +36 -0
  112. package/dist/theme/modes.d.ts.map +1 -0
  113. package/dist/theme/modes.js +107 -0
  114. package/dist/theme/modes.js.map +1 -0
  115. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -4,6 +4,19 @@ All notable changes to `@trebired/frontend` will be documented here.
4
4
 
5
5
  This project follows semantic versioning once published.
6
6
 
7
+ ## 0.5.0
8
+
9
+ - Generalized the `./theme` runtime to an open, caller-supplied registry of named modes: `configureThemeModes()`, `getThemeModes()`, `themeModeKeys()`, `findThemeMode()`, `isThemeMode()`, mode-aware `setTheme()`/`normalizeTheme()`/`systemThemeKey()`, and `nextTheme()` as a cycler over the registry. `ThemeValue` is now `string`; `data-tbf-theme` accepts any registered key and `color-scheme` follows each mode's declared scheme.
10
+ - Added `[data-tbf-theme-select]` control binding (`bindThemeControls()`, `bindThemeSelect()`, `bindThemeSelects()`, `syncThemeControls()`, `syncThemeSelect()`, `syncThemeSelects()`) for `<select>` pickers and `[data-tbf-theme-value]` option groups.
11
+ - Added the `<ThemeSelect>` multi-choice component with `select` and `buttons` variants, a `labels` prop on `<ThemeToggle>`, and mode registry props on `<ThemeBootScript>`, whose boot script now publishes the registry for the client runtime.
12
+ - Added `theme.modes`, `theme.defaultMode`, `theme.dark`, and `theme.light` to `.trebired/frontend/config.ts`. `generateTrebiredFrontendScss()` emits one `[data-tbf-theme="<mode>"] {}` block per declared mode plus `prefers-color-scheme` fallbacks, alongside the existing shared `:root {}` block.
13
+ - Added `dependencies` to the `loadTrebiredFrontendConfig()` result and keyed the config compile cache on the whole relative import graph, so a design-tokens module imported by the config file drives generated CSS without stale output.
14
+ - Added `collectConfigDependencies()` and `THEME_MODE_ATTRIBUTE` to `@trebired/frontend/config`.
15
+
16
+ ## 0.4.2
17
+
18
+ - Removed the project-local `.trebired/frontend/generated/styles.scss` writer contract; frontend config now exposes deterministic SCSS for bundlers to consume in memory.
19
+
7
20
  ## 0.4.1
8
21
 
9
22
  - Refreshed package dependency ranges and lockfile state with `bun update` after adopting the `.trebired/code-discipline` structure.
package/README.md CHANGED
@@ -138,7 +138,41 @@ export default defineTrebiredFrontendConfig({
138
138
  });
139
139
  ```
140
140
 
141
- `@trebired/frontend/config` exports `defineTrebiredFrontendConfig()`, `normalizeTrebiredFrontendConfig()`, `loadTrebiredFrontendConfig()`, `findTrebiredFrontendConfig()`, `generateTrebiredFrontendScss()`, and `writeGeneratedTrebiredFrontendScss()`. Missing config files use package defaults. Generated SCSS is written to `.trebired/frontend/generated/styles.scss`.
141
+ `@trebired/frontend/config` exports `defineTrebiredFrontendConfig()`, `normalizeTrebiredFrontendConfig()`, `loadTrebiredFrontendConfig()`, `findTrebiredFrontendConfig()`, `generateTrebiredFrontendScss()`, `collectConfigDependencies()`, and `THEME_MODE_ATTRIBUTE`. Missing config files use package defaults. Bundlers should consume the generated SCSS string in memory and emit normal bundled CSS; projects do not need a `.trebired/frontend/generated/styles.scss` file.
142
+
143
+ `loadTrebiredFrontendConfig()` resolves the config file's relative import graph, returns it as `dependencies`, and keys its compile cache on the contents of every file in that graph. A project can therefore keep design tokens in a sibling module and edit them without stale output:
144
+
145
+ ```ts
146
+ // .trebired/frontend/tokens.ts
147
+ export const surface = { dark: "#101014", light: "#ffffff", sepia: "#f4ecd8" };
148
+ ```
149
+
150
+ ### Theme Modes
151
+
152
+ `theme.modes` declares an open set of named modes. Each mode owns a token block and, optionally, a `label` and a `scheme` (`"dark"` or `"light"`). Anything other than `label`, `scheme`, and `tokens` inside a mode is rejected, so custom properties always live under `tokens`.
153
+
154
+ ```ts
155
+ import { defineTrebiredFrontendConfig } from "@trebired/frontend/config";
156
+ import { surface } from "./tokens.js";
157
+
158
+ export default defineTrebiredFrontendConfig({
159
+ prefix: "app",
160
+ theme: {
161
+ cssVariables: true,
162
+ defaultMode: "sepia",
163
+ tokens: { radius: { md: "6px" } },
164
+ modes: {
165
+ dark: { tokens: { color: { surface: surface.dark } } },
166
+ light: { tokens: { color: { surface: surface.light } } },
167
+ sepia: { label: "Paper", scheme: "light", tokens: { color: { surface: surface.sepia } } },
168
+ },
169
+ },
170
+ });
171
+ ```
172
+
173
+ `generateTrebiredFrontendScss()` emits shared tokens in `:root {}` and one `[data-tbf-theme="<mode>"] {}` block per declared mode, each carrying its own `color-scheme`. It also emits `--<prefix>-theme-modes`, `--<prefix>-theme-default`, and `prefers-color-scheme` fallbacks scoped to `:root:not([data-tbf-theme])` so unbooted documents still resolve.
174
+
175
+ `theme.dark` and `theme.light` name which registered modes answer `prefers-color-scheme`. When omitted, the first mode of each scheme wins. Declaring no `theme.modes` keeps the previous single `:root {}` output.
142
176
 
143
177
  ### Runtime Options
144
178
 
@@ -168,6 +202,32 @@ Set `frontend_quiet: true`, `quiet: true`, `globalThis.frontend_quiet = true`, o
168
202
 
169
203
  The canonical runtime binds theme, layer roots, icons, progress, flash, inputs, uploads, tooltips, popovers, modals, actions, fullscreen controls, and live refresh in that order.
170
204
 
205
+ ### Theme
206
+
207
+ `@trebired/frontend/theme` works against a caller-supplied mode registry rather than a fixed light/dark pair. The registry defaults to `["dark", "light"]`, so existing callers keep their behavior.
208
+
209
+ ```ts
210
+ import { bindThemeRuntime } from "@trebired/frontend/theme";
211
+
212
+ await bindThemeRuntime(document, {
213
+ modes: ["dark", "light", { key: "sepia", label: "Paper", scheme: "light" }],
214
+ dark: "dark",
215
+ light: "light",
216
+ defaultTheme: "sepia",
217
+ persistence,
218
+ });
219
+ ```
220
+
221
+ Passing `modes`, `dark`, or `light` to `bindThemeRuntime()` registers them process-wide, so `setTheme()`, `nextTheme()`, and control syncing can be called later without repeating the list. `configureThemeModes(registry)` registers them directly; `configureThemeModes(null)` restores the default pair. `<ThemeBootScript>` publishes the registry it renders with, so a server-rendered page hands its modes to the client before first paint.
222
+
223
+ - `setTheme(key, options)` validates `key` against the registry and falls back to system preference when it is not registered.
224
+ - `nextTheme(options)` cycles through the registry in declaration order.
225
+ - `data-tbf-theme` accepts any registered key; `color-scheme` is set from the mode's `scheme`, not from its name.
226
+ - `systemThemeKey(options)` maps `prefers-color-scheme` onto the registry's `dark` / `light` members.
227
+ - `bindThemeControls(root, options)` binds both `[data-tbf-theme-button]` cyclers and `[data-tbf-theme-select]` pickers; `bindThemeToggles()` and `bindThemeSelects()` bind one kind each.
228
+
229
+ A `[data-tbf-theme-select]` element is either a `<select>` whose option values are mode keys, or a container of `[data-tbf-theme-value]` options. Both stay in sync with the active mode. `<ThemeToggle>` remains the two-mode control and now accepts a `labels` record for registries larger than two; `<ThemeSelect>` renders the multi-choice picker in either `select` or `buttons` form.
230
+
171
231
  ### CSS
172
232
 
173
233
  There is no aggregate CSS file. Each style-owning system exposes SCSS through package exports so `@trebired/bundler` can resolve package `sass` and `style` conditions from `node_modules`.
@@ -1,54 +1,10 @@
1
- type TrebiredFrontendIconPack = "remixicon" | "simple-icons";
2
- type TrebiredFrontendSystemKey = "actions" | "flash" | "fullscreen" | "icons" | "inputs" | "layer" | "modal" | "popover" | "progress" | "theme" | "tooltip";
3
- type TrebiredFrontendThemeTokens = Record<string, unknown>;
4
- type TrebiredFrontendConfig = {
5
- prefix?: string;
6
- icons?: {
7
- endpoint?: string;
8
- packs?: readonly TrebiredFrontendIconPack[];
9
- };
10
- systems?: Partial<Record<TrebiredFrontendSystemKey, boolean>>;
11
- theme?: {
12
- cssVariables?: boolean;
13
- tokens?: TrebiredFrontendThemeTokens;
14
- };
15
- };
16
- type NormalizedTrebiredFrontendConfig = {
17
- prefix: string;
18
- icons: {
19
- endpoint: string;
20
- packs: TrebiredFrontendIconPack[];
21
- };
22
- systems: Record<TrebiredFrontendSystemKey, boolean>;
23
- theme: {
24
- cssVariables: boolean;
25
- tokens: TrebiredFrontendThemeTokens;
26
- };
27
- };
28
- type LoadedTrebiredFrontendConfig = {
29
- config: NormalizedTrebiredFrontendConfig;
30
- configPath: string | null;
31
- generatedScss: string;
32
- generatedScssPath: string;
33
- };
34
- type LoadTrebiredFrontendConfigOptions = {
35
- configPath?: string;
36
- defaultIfMissing?: boolean;
37
- searchFrom?: string;
38
- };
39
- declare const TREBIRED_FRONTEND_CONFIG_PATH = ".trebired/frontend/config.ts";
40
- declare const TREBIRED_FRONTEND_GENERATED_DIR = ".trebired/frontend/generated";
41
- declare const TREBIRED_FRONTEND_GENERATED_SCSS_PATH = ".trebired/frontend/generated/styles.scss";
42
- declare const SUPPORTED_ICON_PACKS: TrebiredFrontendIconPack[];
43
- declare const SYSTEM_ORDER: TrebiredFrontendSystemKey[];
44
- declare const DEFAULT_TREBIRED_FRONTEND_CONFIG: NormalizedTrebiredFrontendConfig;
1
+ import type { LoadTrebiredFrontendConfigOptions, LoadedTrebiredFrontendConfig, TrebiredFrontendConfig } from "./types.js";
45
2
  declare function defineTrebiredFrontendConfig<T extends TrebiredFrontendConfig>(config: T): T;
46
- declare function normalizeTrebiredFrontendConfig(config?: unknown): NormalizedTrebiredFrontendConfig;
47
- declare function generateTrebiredFrontendScss(configInput: TrebiredFrontendConfig | NormalizedTrebiredFrontendConfig): string;
48
3
  declare function findTrebiredFrontendConfig(startDir?: string, boundaryDir?: string): Promise<string | null>;
49
4
  declare function loadTrebiredFrontendConfig(projectRoot?: string, options?: LoadTrebiredFrontendConfigOptions): Promise<LoadedTrebiredFrontendConfig>;
50
- declare function resolveTrebiredFrontendGeneratedScssPath(projectRoot?: string): string;
51
- declare function writeGeneratedTrebiredFrontendScss(projectRoot: string, config: TrebiredFrontendConfig | NormalizedTrebiredFrontendConfig): Promise<string>;
52
- export { DEFAULT_TREBIRED_FRONTEND_CONFIG, SUPPORTED_ICON_PACKS, SYSTEM_ORDER, TREBIRED_FRONTEND_CONFIG_PATH, TREBIRED_FRONTEND_GENERATED_DIR, TREBIRED_FRONTEND_GENERATED_SCSS_PATH, defineTrebiredFrontendConfig, findTrebiredFrontendConfig, generateTrebiredFrontendScss, loadTrebiredFrontendConfig, normalizeTrebiredFrontendConfig, resolveTrebiredFrontendGeneratedScssPath, writeGeneratedTrebiredFrontendScss, };
53
- export type { LoadedTrebiredFrontendConfig, LoadTrebiredFrontendConfigOptions, NormalizedTrebiredFrontendConfig, TrebiredFrontendConfig, TrebiredFrontendIconPack, TrebiredFrontendSystemKey, TrebiredFrontendThemeTokens, };
5
+ export { DEFAULT_TREBIRED_FRONTEND_CONFIG, SUPPORTED_ICON_PACKS, SYSTEM_ORDER, THEME_MODE_ATTRIBUTE, TREBIRED_FRONTEND_CONFIG_PATH, normalizeTrebiredFrontendConfig, } from "./normalize.js";
6
+ export { generateTrebiredFrontendScss } from "./scss.js";
7
+ export { collectConfigDependencies } from "./module.js";
8
+ export { defineTrebiredFrontendConfig, findTrebiredFrontendConfig, loadTrebiredFrontendConfig };
9
+ export type { LoadTrebiredFrontendConfigOptions, LoadedTrebiredFrontendConfig, NormalizedTrebiredFrontendConfig, NormalizedTrebiredFrontendThemeConfig, NormalizedTrebiredFrontendThemeMode, TrebiredFrontendConfig, TrebiredFrontendIconPack, TrebiredFrontendSystemKey, TrebiredFrontendThemeConfig, TrebiredFrontendThemeMode, TrebiredFrontendThemeModeScheme, TrebiredFrontendThemeTokens, } from "./types.js";
54
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iCAAiC,EACjC,4BAA4B,EAC5B,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,iBAAS,4BAA4B,CAAC,CAAC,SAAS,sBAAsB,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAEpF;AAED,iBAAe,0BAA0B,CACvC,QAAQ,GAAE,MAAsB,EAChC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAYD,iBAAe,0BAA0B,CACvC,WAAW,GAAE,MAAsB,EACnC,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,4BAA4B,CAAC,CAyBvC;AAED,OAAO,EACL,gCAAgC,EAChC,oBAAoB,EACpB,YAAY,EACZ,oBAAoB,EACpB,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,CAAC;AAChG,YAAY,EACV,iCAAiC,EACjC,4BAA4B,EAC5B,gCAAgC,EAChC,qCAAqC,EACrC,mCAAmC,EACnC,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
@@ -1,213 +1,10 @@
1
- import crypto from "node:crypto";
2
- import fs from "node:fs/promises";
3
1
  import path from "node:path";
4
- import { pathToFileURL } from "node:url";
5
- const TREBIRED_FRONTEND_CONFIG_PATH = ".trebired/frontend/config.ts";
6
- const TREBIRED_FRONTEND_GENERATED_DIR = ".trebired/frontend/generated";
7
- const TREBIRED_FRONTEND_GENERATED_SCSS_PATH = `${TREBIRED_FRONTEND_GENERATED_DIR}/styles.scss`;
8
- const SUPPORTED_ICON_PACKS = ["remixicon", "simple-icons"];
9
- const SYSTEM_ORDER = [
10
- "theme",
11
- "layer",
12
- "icons",
13
- "progress",
14
- "flash",
15
- "tooltip",
16
- "popover",
17
- "modal",
18
- "inputs",
19
- "actions",
20
- "fullscreen",
21
- ];
22
- const SYSTEM_STYLE_IMPORTS = {
23
- actions: "@trebired/frontend/actions/styles",
24
- flash: "@trebired/frontend/flash/styles",
25
- icons: "@trebired/frontend/icons/styles",
26
- inputs: "@trebired/frontend/inputs/styles",
27
- layer: "@trebired/frontend/layer/styles",
28
- modal: "@trebired/frontend/modal/styles",
29
- popover: "@trebired/frontend/popover/styles",
30
- progress: "@trebired/frontend/progress/styles",
31
- tooltip: "@trebired/frontend/tooltip/styles",
32
- };
33
- const DEFAULT_TREBIRED_FRONTEND_CONFIG = Object.freeze({
34
- prefix: "tbf",
35
- icons: Object.freeze({
36
- endpoint: "/__icons/svg",
37
- packs: Object.freeze([...SUPPORTED_ICON_PACKS]),
38
- }),
39
- systems: Object.freeze(Object.fromEntries(SYSTEM_ORDER.map((key) => [key, true]))),
40
- theme: Object.freeze({
41
- cssVariables: true,
42
- tokens: Object.freeze({}),
43
- }),
44
- });
2
+ import { collectConfigDependencies, importConfigModule, pathExists } from "./module.js";
3
+ import { TREBIRED_FRONTEND_CONFIG_PATH, normalizeTrebiredFrontendConfig } from "./normalize.js";
4
+ import { generateTrebiredFrontendScss } from "./scss.js";
45
5
  function defineTrebiredFrontendConfig(config) {
46
6
  return config;
47
7
  }
48
- function isPlainObject(value) {
49
- return Boolean(value && typeof value === "object" && !Array.isArray(value));
50
- }
51
- function assertPlainObject(value, pathLabel) {
52
- if (!isPlainObject(value)) {
53
- throw new Error(`trebired-frontend-invalid-config :: ${pathLabel} must be an object`);
54
- }
55
- return value;
56
- }
57
- function normalizePrefix(value) {
58
- const prefix = String(value || DEFAULT_TREBIRED_FRONTEND_CONFIG.prefix).trim();
59
- if (!/^[a-z][a-z0-9_-]*$/iu.test(prefix)) {
60
- throw new Error("trebired-frontend-invalid-config :: prefix must start with a letter and contain only letters, numbers, underscores, or hyphens");
61
- }
62
- return prefix;
63
- }
64
- function normalizeEndpoint(value) {
65
- const endpoint = String(value || DEFAULT_TREBIRED_FRONTEND_CONFIG.icons.endpoint).trim();
66
- if (!endpoint || /[\s"'<>]/u.test(endpoint)) {
67
- throw new Error("trebired-frontend-invalid-config :: icons.endpoint must be a URL path without whitespace");
68
- }
69
- return endpoint;
70
- }
71
- function normalizeIconPacks(value) {
72
- const raw = value === undefined ? DEFAULT_TREBIRED_FRONTEND_CONFIG.icons.packs : value;
73
- if (!Array.isArray(raw)) {
74
- throw new Error("trebired-frontend-invalid-config :: icons.packs must be an array");
75
- }
76
- const packs = [];
77
- for (const item of raw) {
78
- if (!SUPPORTED_ICON_PACKS.includes(item)) {
79
- throw new Error(`trebired-frontend-invalid-config :: unsupported icon pack ${String(item)}`);
80
- }
81
- if (!packs.includes(item))
82
- packs.push(item);
83
- }
84
- return packs;
85
- }
86
- function normalizeSystems(value) {
87
- if (value === undefined)
88
- return { ...DEFAULT_TREBIRED_FRONTEND_CONFIG.systems };
89
- const source = assertPlainObject(value, "systems");
90
- const systems = { ...DEFAULT_TREBIRED_FRONTEND_CONFIG.systems };
91
- for (const [key, enabled] of Object.entries(source)) {
92
- if (!SYSTEM_ORDER.includes(key)) {
93
- throw new Error(`trebired-frontend-invalid-config :: unsupported system ${key}`);
94
- }
95
- if (typeof enabled !== "boolean") {
96
- throw new Error(`trebired-frontend-invalid-config :: systems.${key} must be boolean`);
97
- }
98
- systems[key] = enabled;
99
- }
100
- return systems;
101
- }
102
- function normalizeThemeTokens(value, pathLabel = "theme.tokens") {
103
- if (value === undefined)
104
- return {};
105
- const source = assertPlainObject(value, pathLabel);
106
- const out = {};
107
- for (const [key, item] of Object.entries(source).sort(([a], [b]) => a.localeCompare(b))) {
108
- if (!/^[a-z0-9_-]+$/iu.test(key)) {
109
- throw new Error(`trebired-frontend-invalid-config :: ${pathLabel}.${key} has an invalid token key`);
110
- }
111
- if (isPlainObject(item)) {
112
- out[key] = normalizeThemeTokens(item, `${pathLabel}.${key}`);
113
- continue;
114
- }
115
- if (typeof item !== "string" && typeof item !== "number") {
116
- throw new Error(`trebired-frontend-invalid-config :: ${pathLabel}.${key} must be a string, number, or token object`);
117
- }
118
- out[key] = item;
119
- }
120
- return out;
121
- }
122
- function normalizeBoolean(value, defaultValue, pathLabel) {
123
- if (value === undefined)
124
- return defaultValue;
125
- if (typeof value !== "boolean") {
126
- throw new Error(`trebired-frontend-invalid-config :: ${pathLabel} must be boolean`);
127
- }
128
- return value;
129
- }
130
- function normalizeTrebiredFrontendConfig(config = {}) {
131
- const source = assertPlainObject(config, "config");
132
- const icons = source.icons === undefined ? {} : assertPlainObject(source.icons, "icons");
133
- const theme = source.theme === undefined ? {} : assertPlainObject(source.theme, "theme");
134
- return {
135
- prefix: normalizePrefix(source.prefix),
136
- icons: {
137
- endpoint: normalizeEndpoint(icons.endpoint),
138
- packs: normalizeIconPacks(icons.packs),
139
- },
140
- systems: normalizeSystems(source.systems),
141
- theme: {
142
- cssVariables: normalizeBoolean(theme.cssVariables, true, "theme.cssVariables"),
143
- tokens: normalizeThemeTokens(theme.tokens),
144
- },
145
- };
146
- }
147
- function cssString(value) {
148
- return JSON.stringify(String(value ?? ""));
149
- }
150
- function cssComment(value) {
151
- return String(value || "").replace(/\*\//gu, "* /");
152
- }
153
- function flattenThemeTokens(tokens, prefix = []) {
154
- const out = [];
155
- for (const [key, value] of Object.entries(tokens).sort(([a], [b]) => a.localeCompare(b))) {
156
- if (isPlainObject(value)) {
157
- out.push(...flattenThemeTokens(value, [...prefix, key]));
158
- continue;
159
- }
160
- if (typeof value === "string" || typeof value === "number") {
161
- out.push([[...prefix, key].join("-"), value]);
162
- }
163
- }
164
- return out;
165
- }
166
- function renderCssVariables(config) {
167
- if (!config.theme.cssVariables)
168
- return [];
169
- const declarations = [
170
- ` --${config.prefix}-config-prefix: ${cssString(config.prefix)};`,
171
- ` --${config.prefix}-icon-endpoint: ${cssString(config.icons.endpoint)};`,
172
- ...flattenThemeTokens(config.theme.tokens).map(([key, value]) => {
173
- return ` --${config.prefix}-${key}: ${String(value)};`;
174
- }),
175
- ];
176
- return [
177
- ":root {",
178
- ...declarations,
179
- "}",
180
- ];
181
- }
182
- function generateTrebiredFrontendScss(configInput) {
183
- const config = normalizeTrebiredFrontendConfig(configInput);
184
- const lines = [
185
- "/* Generated by @trebired/frontend. Do not edit directly. */",
186
- `/* prefix: ${cssComment(config.prefix)} */`,
187
- '@use "@trebired/frontend/styles/tokens" as *;',
188
- '@use "@trebired/frontend/styles/utils" as *;',
189
- ];
190
- for (const system of SYSTEM_ORDER) {
191
- const importPath = SYSTEM_STYLE_IMPORTS[system];
192
- if (importPath && config.systems[system]) {
193
- lines.push(`@use ${cssString(importPath)} as *;`);
194
- }
195
- }
196
- const variables = renderCssVariables(config);
197
- if (variables.length) {
198
- lines.push("", ...variables);
199
- }
200
- return `${lines.join("\n")}\n`;
201
- }
202
- async function pathExists(filePath) {
203
- try {
204
- await fs.access(filePath);
205
- return true;
206
- }
207
- catch {
208
- return false;
209
- }
210
- }
211
8
  async function findTrebiredFrontendConfig(startDir = process.cwd(), boundaryDir) {
212
9
  const boundary = path.resolve(boundaryDir || path.parse(path.resolve(startDir)).root);
213
10
  let current = path.resolve(startDir);
@@ -220,46 +17,14 @@ async function findTrebiredFrontendConfig(startDir = process.cwd(), boundaryDir)
220
17
  current = path.dirname(current);
221
18
  }
222
19
  }
223
- function createConfigBuildHash(filePath, sourceText) {
224
- return crypto.createHash("sha256")
225
- .update(path.resolve(filePath))
226
- .update("\0")
227
- .update(sourceText)
228
- .digest("hex")
229
- .slice(0, 16);
230
- }
231
- async function buildConfigModuleToUrl(projectRoot, filePath) {
232
- if (typeof Bun === "undefined" || typeof Bun.build !== "function") {
233
- const url = pathToFileURL(filePath);
234
- url.searchParams.set("mtime", String((await fs.stat(filePath)).mtimeMs));
235
- return url.href;
236
- }
237
- const sourceText = await fs.readFile(filePath, "utf8");
238
- const digest = createConfigBuildHash(filePath, sourceText);
239
- const outputDir = path.join(projectRoot, "node_modules", ".cache", "trebired-frontend", "config", digest);
240
- const basename = path.basename(filePath, path.extname(filePath)).replace(/[^\w.-]/gu, "_") || "config";
241
- const outputPath = path.join(outputDir, `${basename}.js`);
242
- if (!await pathExists(outputPath)) {
243
- await fs.mkdir(outputDir, { recursive: true });
244
- const result = await Bun.build({
245
- entrypoints: [filePath],
246
- external: ["@trebired/frontend", "@trebired/frontend/*"],
247
- format: "esm",
248
- naming: `${basename}.js`,
249
- outdir: outputDir,
250
- packages: "external",
251
- target: "bun",
252
- });
253
- if (!result.success) {
254
- const message = result.logs.map((log) => log.message).filter(Boolean).join("\n");
255
- throw new Error(`trebired-frontend-invalid-config :: failed to compile ${filePath}${message ? `\n${message}` : ""}`);
256
- }
257
- }
258
- return pathToFileURL(outputPath).href;
259
- }
260
- async function importConfigModule(projectRoot, filePath) {
261
- const imported = await import(await buildConfigModuleToUrl(projectRoot, filePath));
262
- return imported.default;
20
+ function createDefaultLoadedConfig() {
21
+ const config = normalizeTrebiredFrontendConfig({});
22
+ return {
23
+ config,
24
+ configPath: null,
25
+ dependencies: [],
26
+ generatedScss: generateTrebiredFrontendScss(config),
27
+ };
263
28
  }
264
29
  async function loadTrebiredFrontendConfig(projectRoot = process.cwd(), options = {}) {
265
30
  const root = path.resolve(projectRoot);
@@ -270,34 +35,22 @@ async function loadTrebiredFrontendConfig(projectRoot = process.cwd(), options =
270
35
  if (options.defaultIfMissing === false) {
271
36
  throw new Error(`trebired-frontend-config-not-found :: ${TREBIRED_FRONTEND_CONFIG_PATH}`);
272
37
  }
273
- const config = normalizeTrebiredFrontendConfig({});
274
- return {
275
- config,
276
- configPath: null,
277
- generatedScss: generateTrebiredFrontendScss(config),
278
- generatedScssPath: resolveTrebiredFrontendGeneratedScssPath(root),
279
- };
38
+ return createDefaultLoadedConfig();
280
39
  }
281
40
  if (!await pathExists(resolvedPath)) {
282
41
  throw new Error(`trebired-frontend-config-not-found :: ${resolvedPath}`);
283
42
  }
284
- const config = normalizeTrebiredFrontendConfig(await importConfigModule(root, resolvedPath));
43
+ const dependencies = await collectConfigDependencies(resolvedPath);
44
+ const config = normalizeTrebiredFrontendConfig(await importConfigModule(root, resolvedPath, dependencies));
285
45
  return {
286
46
  config,
287
47
  configPath: resolvedPath,
48
+ dependencies,
288
49
  generatedScss: generateTrebiredFrontendScss(config),
289
- generatedScssPath: resolveTrebiredFrontendGeneratedScssPath(root),
290
50
  };
291
51
  }
292
- function resolveTrebiredFrontendGeneratedScssPath(projectRoot = process.cwd()) {
293
- return path.resolve(projectRoot, TREBIRED_FRONTEND_GENERATED_SCSS_PATH);
294
- }
295
- async function writeGeneratedTrebiredFrontendScss(projectRoot, config) {
296
- const filePath = resolveTrebiredFrontendGeneratedScssPath(projectRoot);
297
- await fs.mkdir(path.dirname(filePath), { recursive: true });
298
- const scss = generateTrebiredFrontendScss(config);
299
- await fs.writeFile(filePath, scss, "utf8");
300
- return filePath;
301
- }
302
- export { DEFAULT_TREBIRED_FRONTEND_CONFIG, SUPPORTED_ICON_PACKS, SYSTEM_ORDER, TREBIRED_FRONTEND_CONFIG_PATH, TREBIRED_FRONTEND_GENERATED_DIR, TREBIRED_FRONTEND_GENERATED_SCSS_PATH, defineTrebiredFrontendConfig, findTrebiredFrontendConfig, generateTrebiredFrontendScss, loadTrebiredFrontendConfig, normalizeTrebiredFrontendConfig, resolveTrebiredFrontendGeneratedScssPath, writeGeneratedTrebiredFrontendScss, };
52
+ export { DEFAULT_TREBIRED_FRONTEND_CONFIG, SUPPORTED_ICON_PACKS, SYSTEM_ORDER, THEME_MODE_ATTRIBUTE, TREBIRED_FRONTEND_CONFIG_PATH, normalizeTrebiredFrontendConfig, } from "./normalize.js";
53
+ export { generateTrebiredFrontendScss } from "./scss.js";
54
+ export { collectConfigDependencies } from "./module.js";
55
+ export { defineTrebiredFrontendConfig, findTrebiredFrontendConfig, loadTrebiredFrontendConfig };
303
56
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ declare function pathExists(filePath: string): Promise<boolean>;
2
+ declare function collectConfigDependencies(entryPath: string): Promise<string[]>;
3
+ declare function importConfigModule(projectRoot: string, filePath: string, dependencies: string[]): Promise<unknown>;
4
+ export { collectConfigDependencies, importConfigModule, pathExists };
5
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/config/module.ts"],"names":[],"mappings":"AAcA,iBAAe,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5D;AAqCD,iBAAe,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAe7E;AAwDD,iBAAe,kBAAkB,CAC/B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,124 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ import { invalidConfig } from "./shared.js";
6
+ const CONFIG_DEPENDENCY_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs", ".json"];
7
+ const IMPORT_FROM_RE = /\bimport\s+(?:type\s+)?(?:[\w*\s{},]+?)\s+from\s+["']([^"']+)["']/gu;
8
+ const IMPORT_SIDE_EFFECT_RE = /\bimport\s+["']([^"']+)["']/gu;
9
+ const EXPORT_FROM_RE = /\bexport\s+(?:type\s+)?(?:[\w*\s{},]+?)\s+from\s+["']([^"']+)["']/gu;
10
+ const DYNAMIC_IMPORT_RE = /\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu;
11
+ const RELATIVE_SPECIFIER_PATTERNS = [IMPORT_FROM_RE, IMPORT_SIDE_EFFECT_RE, EXPORT_FROM_RE, DYNAMIC_IMPORT_RE];
12
+ async function pathExists(filePath) {
13
+ try {
14
+ await fs.access(filePath);
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ async function isFile(filePath) {
22
+ try {
23
+ return (await fs.stat(filePath)).isFile();
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ function collectRelativeSpecifiers(source) {
30
+ const specifiers = new Set();
31
+ for (const pattern of RELATIVE_SPECIFIER_PATTERNS) {
32
+ pattern.lastIndex = 0;
33
+ let match = null;
34
+ while ((match = pattern.exec(source))) {
35
+ const specifier = String(match[1] || "").trim();
36
+ if (specifier.startsWith("./") || specifier.startsWith("../"))
37
+ specifiers.add(specifier);
38
+ }
39
+ }
40
+ return [...specifiers];
41
+ }
42
+ async function resolveDependencyPath(fromFile, specifier) {
43
+ const base = path.resolve(path.dirname(fromFile), specifier);
44
+ const withoutJsExtension = base.replace(/\.(js|jsx|mjs|cjs)$/u, "");
45
+ const candidates = [
46
+ base,
47
+ ...CONFIG_DEPENDENCY_EXTENSIONS.map((extension) => `${withoutJsExtension}${extension}`),
48
+ ...CONFIG_DEPENDENCY_EXTENSIONS.map((extension) => path.join(base, `index${extension}`)),
49
+ ];
50
+ for (const candidate of candidates) {
51
+ if (await isFile(candidate))
52
+ return path.resolve(candidate);
53
+ }
54
+ return "";
55
+ }
56
+ async function collectConfigDependencies(entryPath) {
57
+ const visited = new Set();
58
+ const pending = [path.resolve(entryPath)];
59
+ while (pending.length) {
60
+ const current = pending.pop();
61
+ if (visited.has(current) || !await isFile(current))
62
+ continue;
63
+ visited.add(current);
64
+ if (current.endsWith(".json"))
65
+ continue;
66
+ const source = await fs.readFile(current, "utf8");
67
+ for (const specifier of collectRelativeSpecifiers(source)) {
68
+ const resolved = await resolveDependencyPath(current, specifier);
69
+ if (resolved && !visited.has(resolved))
70
+ pending.push(resolved);
71
+ }
72
+ }
73
+ return [...visited].sort((a, b) => a.localeCompare(b));
74
+ }
75
+ async function createConfigBuildHash(dependencies) {
76
+ const hash = crypto.createHash("sha256");
77
+ for (const dependency of dependencies) {
78
+ hash.update(path.resolve(dependency)).update("\0").update(await fs.readFile(dependency, "utf8")).update("\0");
79
+ }
80
+ return hash.digest("hex").slice(0, 16);
81
+ }
82
+ async function buildConfigModuleToUrl(projectRoot, filePath, dependencies) {
83
+ if (typeof Bun === "undefined" || typeof Bun.build !== "function") {
84
+ const url = pathToFileURL(filePath);
85
+ url.searchParams.set("mtime", String(await newestDependencyMtime(dependencies)));
86
+ return url.href;
87
+ }
88
+ const digest = await createConfigBuildHash(dependencies);
89
+ const outputDir = path.join(projectRoot, "node_modules", ".cache", "trebired-frontend", "config", digest);
90
+ const basename = path.basename(filePath, path.extname(filePath)).replace(/[^\w.-]/gu, "_") || "config";
91
+ const outputPath = path.join(outputDir, `${basename}.js`);
92
+ if (!await pathExists(outputPath)) {
93
+ await fs.mkdir(outputDir, { recursive: true });
94
+ const result = await Bun.build({
95
+ entrypoints: [filePath],
96
+ external: ["@trebired/frontend", "@trebired/frontend/*"],
97
+ format: "esm",
98
+ naming: `${basename}.js`,
99
+ outdir: outputDir,
100
+ packages: "external",
101
+ target: "bun",
102
+ });
103
+ if (!result.success) {
104
+ const message = result.logs.map((log) => log.message).filter(Boolean).join("\n");
105
+ throw invalidConfig(`failed to compile ${filePath}${message ? `\n${message}` : ""}`);
106
+ }
107
+ }
108
+ return pathToFileURL(outputPath).href;
109
+ }
110
+ async function newestDependencyMtime(dependencies) {
111
+ let newest = 0;
112
+ for (const dependency of dependencies) {
113
+ const stats = await fs.stat(dependency);
114
+ if (stats.mtimeMs > newest)
115
+ newest = stats.mtimeMs;
116
+ }
117
+ return newest;
118
+ }
119
+ async function importConfigModule(projectRoot, filePath, dependencies) {
120
+ const imported = await import(await buildConfigModuleToUrl(projectRoot, filePath, dependencies));
121
+ return imported.default;
122
+ }
123
+ export { collectConfigDependencies, importConfigModule, pathExists };
124
+ //# sourceMappingURL=module.js.map