@zitadel/config 1.0.0-alpha.21 → 1.0.0-alpha.23

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 (49) hide show
  1. package/README.md +2 -0
  2. package/defaults/README-branding.md +1 -1
  3. package/defaults/README-flows.md +9 -4
  4. package/defaults/default-login.json +0 -27
  5. package/dist/branding-contrast.d.mts +107 -0
  6. package/dist/branding-contrast.d.mts.map +1 -0
  7. package/dist/branding-contrast.mjs +229 -0
  8. package/dist/branding-contrast.mjs.map +1 -0
  9. package/dist/css-color.d.mts +36 -0
  10. package/dist/css-color.d.mts.map +1 -0
  11. package/dist/css-color.mjs +231 -0
  12. package/dist/css-color.mjs.map +1 -0
  13. package/dist/{defaults-Bh4_xVbh.d.mts → defaults-BxGCGdqS.d.mts} +5 -3
  14. package/dist/defaults-BxGCGdqS.d.mts.map +1 -0
  15. package/dist/{defaults-DPq0o3iU.mjs → defaults-DV6hY2KT.mjs} +25 -53
  16. package/dist/defaults-DV6hY2KT.mjs.map +1 -0
  17. package/dist/defaults.d.mts +1 -1
  18. package/dist/defaults.mjs +1 -1
  19. package/dist/index.d.mts +3 -3
  20. package/dist/index.mjs +4 -4
  21. package/dist/meta-schemas-OowgSUfU.mjs +1173 -0
  22. package/dist/meta-schemas-OowgSUfU.mjs.map +1 -0
  23. package/dist/meta-schemas.d.mts +4 -3
  24. package/dist/meta-schemas.d.mts.map +1 -1
  25. package/dist/meta-schemas.mjs +1 -1
  26. package/dist/schemas-7oNU25Qz.mjs +173 -0
  27. package/dist/schemas-7oNU25Qz.mjs.map +1 -0
  28. package/dist/schemas.d.mts +12 -5
  29. package/dist/schemas.d.mts.map +1 -1
  30. package/dist/schemas.mjs +3 -69
  31. package/dist/validate.d.mts +8 -2
  32. package/dist/validate.d.mts.map +1 -1
  33. package/dist/validate.mjs +9 -2
  34. package/dist/validate.mjs.map +1 -1
  35. package/meta-schemas/auth-method.json +1 -0
  36. package/meta-schemas/auth-methods.json +5 -3
  37. package/meta-schemas/branding.json +268 -19
  38. package/meta-schemas/flow-definition.json +375 -171
  39. package/meta-schemas/idp-connection.json +397 -0
  40. package/meta-schemas/property-name.json +1 -0
  41. package/meta-schemas/sso-auth-method.json +54 -0
  42. package/meta-schemas/user-property.json +10 -13
  43. package/meta-schemas/user-schema.json +20 -13
  44. package/package.json +18 -5
  45. package/dist/defaults-Bh4_xVbh.d.mts.map +0 -1
  46. package/dist/defaults-DPq0o3iU.mjs.map +0 -1
  47. package/dist/meta-schemas-z4IlqbLd.mjs +0 -531
  48. package/dist/meta-schemas-z4IlqbLd.mjs.map +0 -1
  49. package/dist/schemas.mjs.map +0 -1
@@ -0,0 +1,231 @@
1
+ import { converter, fixupHueDecreasing, fixupHueIncreasing, fixupHueLonger, fixupHueShorter, interpolateWithPremultipliedAlpha, parse } from "culori";
2
+ //#region src/css-color.ts
3
+ /**
4
+ * Resolves the colour forms a branding palette accepts to sRGB, so a contrast
5
+ * ratio can be measured without a rendering engine.
6
+ *
7
+ * `branding-css.ts` says which forms are *storable*; this says what they
8
+ * *are*. Culori covers the plain forms and `color()`. Two forms it cannot
9
+ * take alone are handled here, because both need something only this codebase
10
+ * knows:
11
+ *
12
+ * - `color-mix()` is a recipe rather than a colour. Culori has the colour
13
+ * spaces and the interpolation; the mixing rules (percentage normalisation,
14
+ * the alpha carried by a pair summing under 100%, the hue strategy) come
15
+ * from CSS Color 5 and live here.
16
+ * - `currentColor` means the inherited text colour at the point of use. In
17
+ * general CSS that is unknowable without rendering. In a branding palette it
18
+ * is not: we own the surface, so the caller says which colour the token
19
+ * would inherit — for anything drawn on the card, the side's own `text`.
20
+ */
21
+ const toRgb = converter("rgb");
22
+ /** Interpolation spaces CSS names, mapped to culori's modes. */
23
+ const MIX_SPACES = {
24
+ srgb: "rgb",
25
+ "srgb-linear": "lrgb",
26
+ hsl: "hsl",
27
+ hwb: "hwb",
28
+ lab: "lab",
29
+ lch: "lch",
30
+ oklab: "oklab",
31
+ oklch: "oklch",
32
+ xyz: "xyz65",
33
+ "xyz-d50": "xyz50",
34
+ "xyz-d65": "xyz65",
35
+ "display-p3": "p3",
36
+ "a98-rgb": "a98",
37
+ "prophoto-rgb": "prophoto",
38
+ rec2020: "rec2020"
39
+ };
40
+ /** Only a polar space has a hue to interpolate, so only these take a strategy. */
41
+ const POLAR_SPACES = new Set([
42
+ "hsl",
43
+ "hwb",
44
+ "lch",
45
+ "oklch"
46
+ ]);
47
+ const HUE_FIXUPS = {
48
+ shorter: fixupHueShorter,
49
+ longer: fixupHueLonger,
50
+ increasing: fixupHueIncreasing,
51
+ decreasing: fixupHueDecreasing
52
+ };
53
+ /** Depth guard: the storage gate bounds nesting at four, so this is slack. */
54
+ const MAX_DEPTH = 6;
55
+ /**
56
+ * Parse any colour form a palette accepts. Returns `undefined` for a value
57
+ * that is malformed, or for `currentColor` with no context to resolve it
58
+ * against.
59
+ */
60
+ function parseCssColor(input, context = {}) {
61
+ return resolve(input, context, 0);
62
+ }
63
+ function resolve(input, context, depth) {
64
+ if (depth > MAX_DEPTH) return void 0;
65
+ const value = input.trim();
66
+ if (value === "") return void 0;
67
+ if (value.toLowerCase() === "currentcolor") {
68
+ if (!context.currentColor) return void 0;
69
+ if (context.currentColor.trim().toLowerCase() === "currentcolor") return void 0;
70
+ return resolve(context.currentColor, context, depth + 1);
71
+ }
72
+ if (value.toLowerCase().startsWith("color-mix(")) return resolveMix(value.slice(10, -1), context, depth);
73
+ const parsed = parse(value);
74
+ if (!parsed) return void 0;
75
+ return fromCulori(parsed);
76
+ }
77
+ /**
78
+ * `in <space> [<hue> hue], <colour> [<percent>], <colour> [<percent>]`.
79
+ *
80
+ * Percentages follow CSS Color 5: both omitted is an even mix; one given
81
+ * makes the other its complement; a pair that sums to less than 100% mixes in
82
+ * that proportion and multiplies the result's alpha by the sum, which is what
83
+ * makes `color-mix(in srgb, red 20%, blue 20%)` translucent rather than an
84
+ * even mix.
85
+ */
86
+ function resolveMix(body, context, depth) {
87
+ const parts = splitTopLevel(body);
88
+ if (parts.length !== 3) return void 0;
89
+ const [spec, first, second] = parts;
90
+ const specTokens = spec.trim().toLowerCase().split(/\s+/);
91
+ if (specTokens[0] !== "in") return void 0;
92
+ const space = specTokens[1] ?? "";
93
+ const mode = MIX_SPACES[space];
94
+ if (!mode) return void 0;
95
+ let fixup = fixupHueShorter;
96
+ if (specTokens.length > 2) {
97
+ if (!POLAR_SPACES.has(space)) return void 0;
98
+ if (specTokens.length !== 4 || specTokens[3] !== "hue") return void 0;
99
+ const named = HUE_FIXUPS[specTokens[2]];
100
+ if (!named) return void 0;
101
+ fixup = named;
102
+ }
103
+ const a = splitColorAndPercent(first);
104
+ const b = splitColorAndPercent(second);
105
+ if (!a || !b) return void 0;
106
+ const [p1, p2] = normalisePercentages(a.percent, b.percent);
107
+ const sum = p1 + p2;
108
+ if (sum <= 0) return void 0;
109
+ const alphaScale = sum < 100 ? sum / 100 : 1;
110
+ const weight = p2 / sum;
111
+ const c1 = resolve(a.color, context, depth + 1);
112
+ const c2 = resolve(b.color, context, depth + 1);
113
+ if (!c1 || !c2) return void 0;
114
+ const rgba = fromCulori(interpolateWithPremultipliedAlpha([toCulori(c1), toCulori(c2)], mode, { h: { fixup } })(weight));
115
+ if (!rgba) return void 0;
116
+ return {
117
+ ...rgba,
118
+ a: clamp(rgba.a * alphaScale, 0, 1)
119
+ };
120
+ }
121
+ function normalisePercentages(first, second) {
122
+ if (first === void 0 && second === void 0) return [50, 50];
123
+ if (first === void 0) return [100 - second, second];
124
+ if (second === void 0) return [first, 100 - first];
125
+ return [first, second];
126
+ }
127
+ /** Split on commas that are not inside parentheses. */
128
+ function splitTopLevel(input) {
129
+ const parts = [];
130
+ let depth = 0;
131
+ let start = 0;
132
+ for (let i = 0; i < input.length; i += 1) {
133
+ const char = input[i];
134
+ if (char === "(") depth += 1;
135
+ else if (char === ")") depth -= 1;
136
+ else if (char === "," && depth === 0) {
137
+ parts.push(input.slice(start, i));
138
+ start = i + 1;
139
+ }
140
+ }
141
+ parts.push(input.slice(start));
142
+ return parts;
143
+ }
144
+ /**
145
+ * `#fff 30%` or `30% #fff` — CSS allows the percentage on either side of the
146
+ * colour. Only a percentage outside any parentheses is the mix stop: the `100%`
147
+ * in `hsl(0 100% 50%)` belongs to the colour, not to the mix.
148
+ */
149
+ function splitColorAndPercent(input) {
150
+ const trimmed = input.trim();
151
+ if (trimmed === "") return void 0;
152
+ let depth = 0;
153
+ for (let i = 0; i < trimmed.length; i += 1) {
154
+ const char = trimmed[i];
155
+ if (char === "(") depth += 1;
156
+ else if (char === ")") depth -= 1;
157
+ else if (char === "%" && depth === 0) {
158
+ const start = startOfNumber(trimmed, i);
159
+ if (start === void 0) return void 0;
160
+ const percent = Number.parseFloat(trimmed.slice(start, i));
161
+ if (!Number.isFinite(percent) || percent < 0 || percent > 100) return void 0;
162
+ const color = (trimmed.slice(0, start) + trimmed.slice(i + 1)).trim();
163
+ if (color === "") return void 0;
164
+ return {
165
+ color,
166
+ percent
167
+ };
168
+ }
169
+ }
170
+ return { color: trimmed };
171
+ }
172
+ /** Walk back over the number preceding a `%`, returning where it starts. */
173
+ function startOfNumber(input, percentIndex) {
174
+ let i = percentIndex - 1;
175
+ while (i >= 0 && /[\d.]/.test(input[i])) i -= 1;
176
+ if (i >= 0 && input[i] === "-") i -= 1;
177
+ const start = i + 1;
178
+ if (start === percentIndex) return void 0;
179
+ if (start > 0 && !/\s/.test(input[start - 1])) return void 0;
180
+ return start;
181
+ }
182
+ function fromCulori(color) {
183
+ const rgb = toRgb(color);
184
+ if (!rgb) return void 0;
185
+ const channel = (value) => clamp((value ?? 0) * 255, 0, 255);
186
+ return {
187
+ r: channel(rgb.r),
188
+ g: channel(rgb.g),
189
+ b: channel(rgb.b),
190
+ a: clamp(rgb.alpha ?? 1, 0, 1)
191
+ };
192
+ }
193
+ function toCulori({ r, g, b, a }) {
194
+ return {
195
+ mode: "rgb",
196
+ r: r / 255,
197
+ g: g / 255,
198
+ b: b / 255,
199
+ alpha: a
200
+ };
201
+ }
202
+ /**
203
+ * Composite a colour over an opaque backdrop. A translucent foreground is what
204
+ * the reader sees blended with what is behind it, so a ratio measured against
205
+ * the raw value would describe a colour nobody sees.
206
+ */
207
+ function compositeOver(color, backdrop) {
208
+ if (color.a >= 1) return color;
209
+ const a = color.a;
210
+ return {
211
+ r: color.r * a + backdrop.r * (1 - a),
212
+ g: color.g * a + backdrop.g * (1 - a),
213
+ b: color.b * a + backdrop.b * (1 - a),
214
+ a: 1
215
+ };
216
+ }
217
+ /** WCAG 2.2 relative luminance of an opaque sRGB colour. */
218
+ function relativeLuminance({ r, g, b }) {
219
+ return .2126 * toLinear(r) + .7152 * toLinear(g) + .0722 * toLinear(b);
220
+ }
221
+ function toLinear(channel) {
222
+ const c = channel / 255;
223
+ return c <= .04045 ? c / 12.92 : ((c + .055) / 1.055) ** 2.4;
224
+ }
225
+ function clamp(value, min, max) {
226
+ return Math.min(max, Math.max(min, value));
227
+ }
228
+ //#endregion
229
+ export { compositeOver, parseCssColor, relativeLuminance };
230
+
231
+ //# sourceMappingURL=css-color.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-color.mjs","names":[],"sources":["../src/css-color.ts"],"sourcesContent":["/**\n * Resolves the colour forms a branding palette accepts to sRGB, so a contrast\n * ratio can be measured without a rendering engine.\n *\n * `branding-css.ts` says which forms are *storable*; this says what they\n * *are*. Culori covers the plain forms and `color()`. Two forms it cannot\n * take alone are handled here, because both need something only this codebase\n * knows:\n *\n * - `color-mix()` is a recipe rather than a colour. Culori has the colour\n * spaces and the interpolation; the mixing rules (percentage normalisation,\n * the alpha carried by a pair summing under 100%, the hue strategy) come\n * from CSS Color 5 and live here.\n * - `currentColor` means the inherited text colour at the point of use. In\n * general CSS that is unknowable without rendering. In a branding palette it\n * is not: we own the surface, so the caller says which colour the token\n * would inherit — for anything drawn on the card, the side's own `text`.\n */\nimport {\n converter,\n fixupHueDecreasing,\n fixupHueIncreasing,\n fixupHueLonger,\n fixupHueShorter,\n interpolateWithPremultipliedAlpha,\n parse,\n type Color,\n} from \"culori\";\n\n/** An sRGB colour, channels 0-255, alpha 0-1. */\nexport type Rgba = { r: number; g: number; b: number; a: number };\n\nexport type ResolveContext = {\n /**\n * What `currentColor` inherits at the point this value is painted. Left\n * unset, `currentColor` stays unresolved rather than being guessed at.\n */\n currentColor?: string;\n};\n\nconst toRgb = converter(\"rgb\");\n\n/** Interpolation spaces CSS names, mapped to culori's modes. */\nconst MIX_SPACES: Record<string, string> = {\n srgb: \"rgb\",\n \"srgb-linear\": \"lrgb\",\n hsl: \"hsl\",\n hwb: \"hwb\",\n lab: \"lab\",\n lch: \"lch\",\n oklab: \"oklab\",\n oklch: \"oklch\",\n xyz: \"xyz65\",\n \"xyz-d50\": \"xyz50\",\n \"xyz-d65\": \"xyz65\",\n \"display-p3\": \"p3\",\n \"a98-rgb\": \"a98\",\n \"prophoto-rgb\": \"prophoto\",\n rec2020: \"rec2020\",\n};\n\n/** Only a polar space has a hue to interpolate, so only these take a strategy. */\nconst POLAR_SPACES = new Set([\"hsl\", \"hwb\", \"lch\", \"oklch\"]);\n\nconst HUE_FIXUPS: Record<string, (hues: number[]) => number[]> = {\n shorter: fixupHueShorter,\n longer: fixupHueLonger,\n increasing: fixupHueIncreasing,\n decreasing: fixupHueDecreasing,\n};\n\n/** Depth guard: the storage gate bounds nesting at four, so this is slack. */\nconst MAX_DEPTH = 6;\n\n/**\n * Parse any colour form a palette accepts. Returns `undefined` for a value\n * that is malformed, or for `currentColor` with no context to resolve it\n * against.\n */\nexport function parseCssColor(input: string, context: ResolveContext = {}): Rgba | undefined {\n return resolve(input, context, 0);\n}\n\nfunction resolve(input: string, context: ResolveContext, depth: number): Rgba | undefined {\n if (depth > MAX_DEPTH) return undefined;\n const value = input.trim();\n if (value === \"\") return undefined;\n\n if (value.toLowerCase() === \"currentcolor\") {\n if (!context.currentColor) return undefined;\n // The inherited value can itself be any accepted form, but it cannot be\n // `currentColor` again: that would be a colour defined as itself.\n if (context.currentColor.trim().toLowerCase() === \"currentcolor\") return undefined;\n return resolve(context.currentColor, context, depth + 1);\n }\n\n if (value.toLowerCase().startsWith(\"color-mix(\")) {\n return resolveMix(value.slice(\"color-mix(\".length, -1), context, depth);\n }\n\n const parsed = parse(value);\n if (!parsed) return undefined;\n return fromCulori(parsed);\n}\n\n/**\n * `in <space> [<hue> hue], <colour> [<percent>], <colour> [<percent>]`.\n *\n * Percentages follow CSS Color 5: both omitted is an even mix; one given\n * makes the other its complement; a pair that sums to less than 100% mixes in\n * that proportion and multiplies the result's alpha by the sum, which is what\n * makes `color-mix(in srgb, red 20%, blue 20%)` translucent rather than an\n * even mix.\n */\nfunction resolveMix(body: string, context: ResolveContext, depth: number): Rgba | undefined {\n const parts = splitTopLevel(body);\n if (parts.length !== 3) return undefined;\n const [spec, first, second] = parts as [string, string, string];\n\n const specTokens = spec.trim().toLowerCase().split(/\\s+/);\n if (specTokens[0] !== \"in\") return undefined;\n const space = specTokens[1] ?? \"\";\n const mode = MIX_SPACES[space];\n if (!mode) return undefined;\n\n let fixup = fixupHueShorter;\n if (specTokens.length > 2) {\n // `in oklch longer hue` — the trailing `hue` keyword is required with a\n // method, and a rectangular space has no hue to interpolate, so CSS\n // rejects the method there and so do we.\n if (!POLAR_SPACES.has(space)) return undefined;\n if (specTokens.length !== 4 || specTokens[3] !== \"hue\") return undefined;\n const named = HUE_FIXUPS[specTokens[2] as string];\n if (!named) return undefined;\n fixup = named;\n }\n\n const a = splitColorAndPercent(first);\n const b = splitColorAndPercent(second);\n if (!a || !b) return undefined;\n\n const [p1, p2] = normalisePercentages(a.percent, b.percent);\n const sum = p1 + p2;\n if (sum <= 0) return undefined;\n const alphaScale = sum < 100 ? sum / 100 : 1;\n const weight = p2 / sum;\n\n const c1 = resolve(a.color, context, depth + 1);\n const c2 = resolve(b.color, context, depth + 1);\n if (!c1 || !c2) return undefined;\n\n // CSS mixes in premultiplied alpha: mixing red with transparent has to keep\n // red's hue and lose opacity, not slide towards transparent black.\n const mixed = interpolateWithPremultipliedAlpha([toCulori(c1), toCulori(c2)], mode as never, {\n h: { fixup },\n } as never)(weight);\n const rgba = fromCulori(mixed);\n if (!rgba) return undefined;\n return { ...rgba, a: clamp(rgba.a * alphaScale, 0, 1) };\n}\n\nfunction normalisePercentages(first: number | undefined, second: number | undefined): [number, number] {\n if (first === undefined && second === undefined) return [50, 50];\n if (first === undefined) return [100 - (second as number), second as number];\n if (second === undefined) return [first, 100 - first];\n return [first, second];\n}\n\n/** Split on commas that are not inside parentheses. */\nfunction splitTopLevel(input: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < input.length; i += 1) {\n const char = input[i];\n if (char === \"(\") depth += 1;\n else if (char === \")\") depth -= 1;\n else if (char === \",\" && depth === 0) {\n parts.push(input.slice(start, i));\n start = i + 1;\n }\n }\n parts.push(input.slice(start));\n return parts;\n}\n\n/**\n * `#fff 30%` or `30% #fff` — CSS allows the percentage on either side of the\n * colour. Only a percentage outside any parentheses is the mix stop: the `100%`\n * in `hsl(0 100% 50%)` belongs to the colour, not to the mix.\n */\nfunction splitColorAndPercent(input: string): { color: string; percent?: number } | undefined {\n const trimmed = input.trim();\n if (trimmed === \"\") return undefined;\n\n let depth = 0;\n for (let i = 0; i < trimmed.length; i += 1) {\n const char = trimmed[i];\n if (char === \"(\") depth += 1;\n else if (char === \")\") depth -= 1;\n else if (char === \"%\" && depth === 0) {\n const start = startOfNumber(trimmed, i);\n if (start === undefined) return undefined;\n const percent = Number.parseFloat(trimmed.slice(start, i));\n // CSS Color 5 bounds a mix stop to 0-100%: beyond that a mix would be an\n // extrapolation, which culori would happily compute and a browser refuses.\n if (!Number.isFinite(percent) || percent < 0 || percent > 100) return undefined;\n const color = (trimmed.slice(0, start) + trimmed.slice(i + 1)).trim();\n if (color === \"\") return undefined;\n return { color, percent };\n }\n }\n return { color: trimmed };\n}\n\n/** Walk back over the number preceding a `%`, returning where it starts. */\nfunction startOfNumber(input: string, percentIndex: number): number | undefined {\n let i = percentIndex - 1;\n while (i >= 0 && /[\\d.]/.test(input[i] as string)) i -= 1;\n if (i >= 0 && input[i] === \"-\") i -= 1;\n const start = i + 1;\n if (start === percentIndex) return undefined;\n // A stop is its own token: `50%` is one, the `0%` of `hsl(0 0% 50%)` is not\n // reachable here because that sits inside parentheses.\n if (start > 0 && !/\\s/.test(input[start - 1] as string)) return undefined;\n return start;\n}\n\nfunction fromCulori(color: Color): Rgba | undefined {\n const rgb = toRgb(color);\n if (!rgb) return undefined;\n const channel = (value: number | undefined): number => clamp((value ?? 0) * 255, 0, 255);\n return { r: channel(rgb.r), g: channel(rgb.g), b: channel(rgb.b), a: clamp(rgb.alpha ?? 1, 0, 1) };\n}\n\nfunction toCulori({ r, g, b, a }: Rgba): Color {\n return { mode: \"rgb\", r: r / 255, g: g / 255, b: b / 255, alpha: a };\n}\n\n/**\n * Composite a colour over an opaque backdrop. A translucent foreground is what\n * the reader sees blended with what is behind it, so a ratio measured against\n * the raw value would describe a colour nobody sees.\n */\nexport function compositeOver(color: Rgba, backdrop: Rgba): Rgba {\n if (color.a >= 1) return color;\n const a = color.a;\n return {\n r: color.r * a + backdrop.r * (1 - a),\n g: color.g * a + backdrop.g * (1 - a),\n b: color.b * a + backdrop.b * (1 - a),\n a: 1,\n };\n}\n\n/** WCAG 2.2 relative luminance of an opaque sRGB colour. */\nexport function relativeLuminance({ r, g, b }: Rgba): number {\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\nfunction toLinear(channel: number): number {\n const c = channel / 255;\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n"],"mappings":"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"}
@@ -48,8 +48,10 @@ type BrandingDesign = (typeof BRANDING_DESIGNS)[number];
48
48
  declare const DEFAULT_BRANDING_DESIGN: BrandingDesign;
49
49
  type DefaultBrandingConfig = {
50
50
  /** The `.zitadel/branding/branding.json` descriptor body (sans `$schema`). */branding: {
51
- layout: "centered" | "split";
52
- liquid_template_file: string;
51
+ layout: "centered" | "split"; /** A `$file` reference to the sibling template; the CLI inlines it before publishing. */
52
+ liquid_template: {
53
+ $file: string;
54
+ };
53
55
  }; /** The `.zitadel/branding/login.liquid` template content. */
54
56
  template: string;
55
57
  };
@@ -81,4 +83,4 @@ declare function getDefaultHumanUserSchema(options?: DefaultConfigRenderOptions)
81
83
  declare function getDefaultLoginFlow(options?: DefaultConfigRenderOptions): CreateFlowDefinitionBodyFlowDefinition;
82
84
  //#endregion
83
85
  export { flowsReadmeContent as C, brandingReadmeContent as S, SetupUseCase as _, DEFAULT_BRANDING_TEMPLATE_PATH as a, getDefaultHumanUserSchema as b, DEFAULT_FLOW_SCHEMA_URI as c, DEFAULT_SETUP_USE_CASE as d, DefaultBrandingConfig as f, SetupPreset as g, SETUP_USE_CASES as h, DEFAULT_BRANDING_DESIGN as i, DEFAULT_SCHEMA_CONFIG_PATH as l, SETUP_PRESETS as m, BrandingDesign as n, DEFAULT_BUILTIN_SCHEMA_BASE as o, DefaultConfigRenderOptions as p, DEFAULT_BRANDING_CONFIG_PATH as r, DEFAULT_FLOW_CONFIG_PATH as s, BRANDING_DESIGNS as t, DEFAULT_SETUP_PRESET as u, defaultHumanUserSchemaUrl as v, schemasReadmeContent as w, getDefaultLoginFlow as x, getDefaultBrandingConfig as y };
84
- //# sourceMappingURL=defaults-Bh4_xVbh.d.mts.map
86
+ //# sourceMappingURL=defaults-BxGCGdqS.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults-BxGCGdqS.d.mts","names":[],"sources":["../src/readmes.ts","../src/defaults.ts"],"mappings":";;;;;;AAQA;;iBAAgB,oBAAA,CAAA;;;AAQhB;;iBAAgB,kBAAA,CAAA;;;AAShB;;;iBAAgB,qBAAA,CAAA;;;cCFH,2BAAA;AAAA,cACA,uBAAA;AAAA,cACA,0BAAA;AAAA,cACA,wBAAA;AAAA,cACA,4BAAA;AAAA,cACA,8BAAA;ADZb;;;;;AASA;;AATA,cCqBa,aAAA;AAAA,KAED,WAAA,WAAsB,aAAA;AAAA,cAErB,oBAAA,EAAsB,WAAA;;;;AAlBnC;;;;cAkDa,gBAAA;AAAA,KAED,cAAA,WAAyB,gBAAA;AAAA,cAExB,uBAAA,EAAyB,cAAA;AAAA,KAW1B,qBAAA;EAhEwB,8EAkElC,QAAA;IACE,MAAA,wBAlEmC;IAoEnC,eAAA;MAAmB,KAAA;IAAA;EAAA,GAnEc;EAsEnC,QAAA;AAAA;;AArEF;;;;iBA6EgB,wBAAA,CACd,MAAA,YACC,qBAAA;AA9EH;;;;;AASA;;;AATA,cAiHa,eAAA;AAAA,KAED,YAAA,WAAuB,eAAA;AAAA,cAEtB,sBAAA,EAAwB,YAAA;AAAA,KA0GzB,0BAAA;EACV,iBAAA;EACA,aAAA,WAtN6C;EAwN7C,MAAA,WAtN+D;EAwN/D,OAAA;AAAA;AAAA,iBAGc,yBAAA,CACd,iBAAA;AAAA,iBAKc,yBAAA,CACd,OAAA,GAAS,0BAAA,GACR,gBAAA;AAAA,iBAca,mBAAA,CACd,OAAA,GAAS,0BAAA,GACR,sCAAA"}
@@ -38,29 +38,19 @@ var default_login_default = {
38
38
  {
39
39
  "name": "identifier",
40
40
  "fields": ["email"],
41
- "actions": [
42
- {
43
- "name": "submit",
44
- "kind": "submit",
45
- "primary": true,
46
- "text_key": "identifier.action.continue"
47
- },
48
- {
49
- "name": "passkey",
50
- "kind": "passkey",
51
- "primary": false,
52
- "text_key": "identifier.action.passkey"
53
- },
54
- {
55
- "name": "register",
56
- "kind": "navigate",
57
- "primary": false,
58
- "text_key": "identifier.action.register.link"
59
- }
60
- ],
41
+ "actions": [{
42
+ "name": "submit",
43
+ "kind": "submit",
44
+ "primary": true,
45
+ "text_key": "identifier.action.continue"
46
+ }, {
47
+ "name": "register",
48
+ "kind": "navigate",
49
+ "primary": false,
50
+ "text_key": "identifier.action.register.link"
51
+ }],
61
52
  "transitions": {
62
53
  "submit": { "target": "password" },
63
- "passkey": { "target": "done" },
64
54
  "user_not_found": { "target": "register" },
65
55
  "register": {
66
56
  "target": "register",
@@ -76,43 +66,25 @@ var default_login_default = {
76
66
  "kind": "submit",
77
67
  "primary": true,
78
68
  "text_key": "password.action.signin"
79
- }, {
80
- "name": "passkey",
81
- "kind": "passkey",
82
- "primary": false,
83
- "text_key": "password.action.passkey"
84
69
  }],
85
- "transitions": {
86
- "submit": { "target": "done" },
87
- "passkey": { "target": "done" }
88
- }
70
+ "transitions": { "submit": { "target": "done" } }
89
71
  },
90
72
  {
91
73
  "name": "register",
92
74
  "fields": ["email"],
93
- "actions": [
94
- {
95
- "name": "submit",
96
- "kind": "submit",
97
- "primary": true,
98
- "text_key": "register.action.password"
99
- },
100
- {
101
- "name": "passkey_register",
102
- "kind": "passkey_register",
103
- "primary": false,
104
- "text_key": "register.action.passkey"
105
- },
106
- {
107
- "name": "sign_in",
108
- "kind": "navigate",
109
- "primary": false,
110
- "text_key": "register.action.sign_in.link"
111
- }
112
- ],
75
+ "actions": [{
76
+ "name": "submit",
77
+ "kind": "submit",
78
+ "primary": true,
79
+ "text_key": "register.action.password"
80
+ }, {
81
+ "name": "sign_in",
82
+ "kind": "navigate",
83
+ "primary": false,
84
+ "text_key": "register.action.sign_in.link"
85
+ }],
113
86
  "transitions": {
114
87
  "submit": { "target": "register-password" },
115
- "passkey_register": { "target": "done" },
116
88
  "user_already_exists": { "target": "password" },
117
89
  "sign_in": {
118
90
  "target": "identifier",
@@ -409,7 +381,7 @@ function getDefaultBrandingConfig(design = DEFAULT_BRANDING_DESIGN) {
409
381
  return {
410
382
  branding: {
411
383
  layout: DESIGN_LAYOUTS[known],
412
- liquid_template_file: "./login.liquid"
384
+ liquid_template: { $file: "./login.liquid" }
413
385
  },
414
386
  template: readFileSync(packageFilePath(`../defaults/branding/${known}/login.liquid`), "utf8")
415
387
  };
@@ -568,4 +540,4 @@ function trimTrailingSlash(value) {
568
540
  //#endregion
569
541
  export { brandingReadmeContent as _, DEFAULT_BUILTIN_SCHEMA_BASE as a, DEFAULT_SCHEMA_CONFIG_PATH as c, SETUP_PRESETS as d, SETUP_USE_CASES as f, getDefaultLoginFlow as g, getDefaultHumanUserSchema as h, DEFAULT_BRANDING_TEMPLATE_PATH as i, DEFAULT_SETUP_PRESET as l, getDefaultBrandingConfig as m, DEFAULT_BRANDING_CONFIG_PATH as n, DEFAULT_FLOW_CONFIG_PATH as o, defaultHumanUserSchemaUrl as p, DEFAULT_BRANDING_DESIGN as r, DEFAULT_FLOW_SCHEMA_URI as s, BRANDING_DESIGNS as t, DEFAULT_SETUP_USE_CASE as u, flowsReadmeContent as v, schemasReadmeContent as y };
570
542
 
571
- //# sourceMappingURL=defaults-DPq0o3iU.mjs.map
543
+ //# sourceMappingURL=defaults-DV6hY2KT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults-DV6hY2KT.mjs","names":["defaultHumanUserSchemaTemplate","defaultLoginFlowTemplate","passkeyFirstHumanUserSchemaTemplate","passkeyFirstLoginFlowTemplate"],"sources":["../defaults/default-human-user.json","../defaults/default-login.json","../defaults/presets/passkey-first/human-user.json","../defaults/presets/passkey-first/login.json","../src/readmes.ts","../src/defaults.ts"],"sourcesContent":["","","","","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * README content the CLI copies to `.zitadel/schemas/README.md` during setup.\n * Source of truth is `packages/config/defaults/README-schemas.md`; the Go\n * server-side embed reads the same file (see `defaults.go`).\n */\nexport function schemasReadmeContent(): string {\n return readFileSync(readmeUrl(\"README-schemas.md\"), \"utf8\");\n}\n\n/**\n * README content the CLI copies to `.zitadel/flows/README.md` during setup.\n * Source of truth is `packages/config/defaults/README-flows.md`.\n */\nexport function flowsReadmeContent(): string {\n return readFileSync(readmeUrl(\"README-flows.md\"), \"utf8\");\n}\n\n/**\n * README content the CLI copies to `.zitadel/branding/README.md` when a\n * branding design is ejected. Source of truth is\n * `packages/config/defaults/README-branding.md`.\n */\nexport function brandingReadmeContent(): string {\n return readFileSync(readmeUrl(\"README-branding.md\"), \"utf8\");\n}\n\nfunction readmeUrl(filename: string): string {\n return fileURLToPath(new URL(`../defaults/${filename}`, import.meta.url));\n}\n","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type {\n CreateFlowDefinitionBodyFlowDefinition,\n CreateSchemaBody,\n} from \"@zitadel/api/generated/model\";\n\nimport defaultHumanUserSchemaTemplate from \"../defaults/default-human-user.json\" with {\n type: \"json\",\n};\nimport defaultLoginFlowTemplate from \"../defaults/default-login.json\" with {\n type: \"json\",\n};\nimport passkeyFirstHumanUserSchemaTemplate from \"../defaults/presets/passkey-first/human-user.json\" with {\n type: \"json\",\n};\nimport passkeyFirstLoginFlowTemplate from \"../defaults/presets/passkey-first/login.json\" with {\n type: \"json\",\n};\n\nexport { brandingReadmeContent, flowsReadmeContent, schemasReadmeContent } from \"./readmes.js\";\n\nexport const DEFAULT_BUILTIN_SCHEMA_BASE = \"https://nextgen.com/api/schemas\";\nexport const DEFAULT_FLOW_SCHEMA_URI = \"https://nextgen.com/flow-definition.json\";\nexport const DEFAULT_SCHEMA_CONFIG_PATH = \".zitadel/schemas/default-human-user.json\";\nexport const DEFAULT_FLOW_CONFIG_PATH = \".zitadel/flows/default-login.json\";\nexport const DEFAULT_BRANDING_CONFIG_PATH = \".zitadel/branding/branding.json\";\nexport const DEFAULT_BRANDING_TEMPLATE_PATH = \".zitadel/branding/login.liquid\";\n\n/**\n * Named schema+flow bundles `zitadel setup` can scaffold (#448: the prompt\n * fires before any `.zitadel/` file is written; each preset maps to a\n * pre-defined bundle the CLI copies on first setup). `password-first` is\n * today's default; `passkey-first` puts a passkey ceremony on the login\n * entry step with an email→password fallback path.\n */\nexport const SETUP_PRESETS = [\"password-first\", \"passkey-first\"] as const;\n\nexport type SetupPreset = (typeof SETUP_PRESETS)[number];\n\nexport const DEFAULT_SETUP_PRESET: SetupPreset = \"password-first\";\n\nconst PRESET_TEMPLATES: Record<SetupPreset, { schema: unknown; flow: unknown }> = {\n \"password-first\": {\n schema: defaultHumanUserSchemaTemplate,\n flow: defaultLoginFlowTemplate,\n },\n \"passkey-first\": {\n schema: passkeyFirstHumanUserSchemaTemplate,\n flow: passkeyFirstLoginFlowTemplate,\n },\n};\n\nfunction presetTemplates(preset: string): { schema: unknown; flow: unknown } {\n // Own-property check: indexing a plain object with an arbitrary string\n // would let \"__proto__\"/\"constructor\" resolve via the prototype chain\n // and bypass the unknown-preset error.\n if (!Object.hasOwn(PRESET_TEMPLATES, preset)) {\n throw new Error(\n `unknown setup preset ${JSON.stringify(preset)} (known presets: ${SETUP_PRESETS.join(\", \")})`,\n );\n }\n return PRESET_TEMPLATES[preset as SetupPreset];\n}\n\n/**\n * Login-design starting points `zitadel branding eject --design <name>` (and\n * `zitadel setup --design <name>`) scaffold into `.zitadel/branding/`. A\n * design is a full Liquid template plus the descriptor `layout` it degrades\n * to — the wire `layout` enum stays `centered | split`, richer designs are\n * delivered as templates (ADR 040).\n */\nexport const BRANDING_DESIGNS = [\"centered\", \"split\", \"split-right\", \"hero\", \"minimal\"] as const;\n\nexport type BrandingDesign = (typeof BRANDING_DESIGNS)[number];\n\nexport const DEFAULT_BRANDING_DESIGN: BrandingDesign = \"centered\";\n\n/** Descriptor `layout` each design degrades to when its template is rejected. */\nconst DESIGN_LAYOUTS: Record<BrandingDesign, \"centered\" | \"split\"> = {\n centered: \"centered\",\n split: \"split\",\n \"split-right\": \"split\",\n hero: \"split\",\n minimal: \"centered\",\n};\n\nexport type DefaultBrandingConfig = {\n /** The `.zitadel/branding/branding.json` descriptor body (sans `$schema`). */\n branding: {\n layout: \"centered\" | \"split\";\n /** A `$file` reference to the sibling template; the CLI inlines it before publishing. */\n liquid_template: { $file: string };\n };\n /** The `.zitadel/branding/login.liquid` template content. */\n template: string;\n};\n\n/**\n * Renders the scaffold files for a branding design. The `centered` template\n * is a drift-tested copy of the bundled default in `@zitadel/components`;\n * the other designs are authored variants of it.\n */\nexport function getDefaultBrandingConfig(\n design: string = DEFAULT_BRANDING_DESIGN,\n): DefaultBrandingConfig {\n if (!Object.hasOwn(DESIGN_LAYOUTS, design)) {\n throw new Error(\n `unknown branding design ${JSON.stringify(design)} (known designs: ${BRANDING_DESIGNS.join(\", \")})`,\n );\n }\n const known = design as BrandingDesign;\n return {\n branding: {\n layout: DESIGN_LAYOUTS[known],\n liquid_template: { $file: \"./login.liquid\" },\n },\n template: readFileSync(packageFilePath(`../defaults/branding/${known}/login.liquid`), \"utf8\"),\n };\n}\n\n/**\n * Resolves a package-relative file to a real filesystem path. Vite-driven\n * runtimes (vitest in dependent packages) rewrite `import.meta.url` to a\n * `/@fs/...` URL, which `fileURLToPath` passes through verbatim — strip the\n * prefix so `readFileSync` gets an actual path.\n */\nfunction packageFilePath(relative: string): string {\n const path = fileURLToPath(new URL(relative, import.meta.url));\n return path.startsWith(\"/@fs/\") ? path.slice(\"/@fs\".length) : path;\n}\n\n/**\n * The second setup axis (#448): *who* signs in, orthogonal to the sign-in\n * preset (*how* they sign in). The sign-in preset owns the flow shape and\n * auth methods; the use case owns which profile fields the schema collects.\n * Composing the two keeps us at one field catalog + one flow-per-preset\n * instead of a bundle per (use case × preset) pair. `minimal` is the\n * default and never blocks non-interactive runs.\n */\nexport const SETUP_USE_CASES = [\"minimal\", \"consumer\", \"business\"] as const;\n\nexport type SetupUseCase = (typeof SETUP_USE_CASES)[number];\n\nexport const DEFAULT_SETUP_USE_CASE: SetupUseCase = \"minimal\";\n\n/**\n * Fields each use case collects, in register/display order. `email` is\n * always first and stays the only required property; the rest are optional\n * profile attributes gathered on the flow's register step. `givenName`/\n * `familyName` are the attributes the backend reads for a user's identity\n * (`internal/domain/user.go`); `companyName` is stored as a plain user\n * attribute today — there is no org/team model behind it yet.\n */\nconst USE_CASE_FIELDS: Record<SetupUseCase, readonly string[]> = {\n minimal: [\"email\"],\n consumer: [\"email\", \"givenName\", \"familyName\"],\n business: [\"email\", \"givenName\", \"familyName\", \"companyName\"],\n};\n\n/**\n * JSON-Schema bodies for the optional profile fields the CLI composes in per\n * use case. The shipped templates are an email-only baseline (shared verbatim\n * with the Go server fallback), so this catalog owns every field beyond\n * `email`. Authored in the templates' style — no `x-claim`, since the backend\n * maps identity by attribute name and the user-property meta-schema defines no\n * claim keyword. `givenName`/`familyName` are the attributes the backend reads\n * for a user's identity (`internal/domain/user.go`).\n */\nconst EXTRA_FIELD_BODIES: Record<string, Record<string, unknown>> = {\n givenName: {\n type: \"string\",\n maxLength: 50,\n description: \"The user's given (first) name.\",\n },\n familyName: {\n type: \"string\",\n maxLength: 50,\n description: \"The user's family (last) name.\",\n },\n companyName: {\n type: \"string\",\n maxLength: 200,\n description: \"The user's company name.\",\n },\n};\n\nfunction useCaseFields(useCase: string): readonly string[] {\n // Own-property check, same rationale as presetTemplates: keep prototype\n // keys (\"__proto__\" etc.) from resolving to a real field list.\n if (!Object.hasOwn(USE_CASE_FIELDS, useCase)) {\n throw new Error(\n `unknown setup use case ${JSON.stringify(useCase)} (known use cases: ${SETUP_USE_CASES.join(\", \")})`,\n );\n }\n return USE_CASE_FIELDS[useCase as SetupUseCase];\n}\n\n/**\n * The body for one use-case field: reuse the template's authored body when it\n * has one (so composed schemas match the shipped defaults for shared fields),\n * else the extra catalog, else a generic editable string so composition stays\n * total for any field a future use case introduces.\n */\nfunction fieldBody(\n field: string,\n templateProps: Record<string, Record<string, unknown>>,\n): Record<string, unknown> {\n if (Object.hasOwn(templateProps, field)) {\n return { ...templateProps[field] };\n }\n if (Object.hasOwn(EXTRA_FIELD_BODIES, field)) {\n return { ...EXTRA_FIELD_BODIES[field] };\n }\n return { type: \"string\", description: `The user's ${field}.` };\n}\n\n/**\n * Narrow a rendered schema to the chosen use case: keep the preset-owned\n * header and `x-auth-methods`, but replace `properties`/`required` with the\n * use case's field set. `email` is the sole required property.\n */\nfunction applyUseCaseToSchema(\n schema: Record<string, unknown>,\n useCase: string,\n): Record<string, unknown> {\n const templateProps = (schema.properties ?? {}) as Record<string, Record<string, unknown>>;\n const properties: Record<string, unknown> = {};\n for (const field of useCaseFields(useCase)) {\n properties[field] = fieldBody(field, templateProps);\n }\n return { ...schema, required: [\"email\"], properties };\n}\n\n/**\n * Derive the flow's register-step fields from the use case rather than\n * copying a hard-coded list into every bundle (#448): the register step\n * collects exactly what the schema defines. Other steps are untouched.\n */\nfunction applyUseCaseToFlow(\n flow: Record<string, unknown>,\n useCase: string,\n): Record<string, unknown> {\n const fields = [...useCaseFields(useCase)];\n const steps = (flow.steps as Array<Record<string, unknown>>).map((step) =>\n step.name === \"register\" ? { ...step, fields } : step,\n );\n return { ...flow, steps };\n}\n\nexport type DefaultConfigRenderOptions = {\n builtinSchemaBase?: string;\n userSchemaUrl?: string;\n /** Which flow/auth bundle to render; defaults to {@link DEFAULT_SETUP_PRESET}. */\n preset?: string;\n /** Which field set to collect; defaults to {@link DEFAULT_SETUP_USE_CASE}. */\n useCase?: string;\n};\n\nexport function defaultHumanUserSchemaUrl(\n builtinSchemaBase = DEFAULT_BUILTIN_SCHEMA_BASE,\n): string {\n return `${trimTrailingSlash(builtinSchemaBase)}/default-human-user.json`;\n}\n\nexport function getDefaultHumanUserSchema(\n options: DefaultConfigRenderOptions = {},\n): CreateSchemaBody {\n const builtinSchemaBase = trimTrailingSlash(\n options.builtinSchemaBase ?? DEFAULT_BUILTIN_SCHEMA_BASE,\n );\n const rendered = renderTemplate(presetTemplates(options.preset ?? DEFAULT_SETUP_PRESET).schema, {\n SERVER_URL: builtinSchemaBase,\n USER_SCHEMA_URL: options.userSchemaUrl ?? defaultHumanUserSchemaUrl(builtinSchemaBase),\n }) as Record<string, unknown>;\n return applyUseCaseToSchema(\n rendered,\n options.useCase ?? DEFAULT_SETUP_USE_CASE,\n ) as CreateSchemaBody;\n}\n\nexport function getDefaultLoginFlow(\n options: DefaultConfigRenderOptions = {},\n): CreateFlowDefinitionBodyFlowDefinition {\n const builtinSchemaBase = trimTrailingSlash(\n options.builtinSchemaBase ?? DEFAULT_BUILTIN_SCHEMA_BASE,\n );\n const rendered = renderTemplate(presetTemplates(options.preset ?? DEFAULT_SETUP_PRESET).flow, {\n SERVER_URL: builtinSchemaBase,\n USER_SCHEMA_URL: options.userSchemaUrl ?? defaultHumanUserSchemaUrl(builtinSchemaBase),\n }) as Record<string, unknown>;\n return applyUseCaseToFlow(\n rendered,\n options.useCase ?? DEFAULT_SETUP_USE_CASE,\n ) as CreateFlowDefinitionBodyFlowDefinition;\n}\n\nfunction renderTemplate(value: unknown, replacements: Record<string, string>): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => renderTemplate(item, replacements));\n }\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, renderTemplate(item, replacements)]),\n );\n }\n if (typeof value === \"string\") {\n return value.replaceAll(/\\$\\{([A-Z_]+)\\}/g, (match, name: string) => {\n return replacements[name] ?? match;\n });\n }\n return value;\n}\n\nfunction trimTrailingSlash(value: string): string {\n let trimmed = value;\n while (trimmed.endsWith(\"/\")) {\n trimmed = trimmed.slice(0, -1);\n }\n return trimmed;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { C as flowsReadmeContent, S as brandingReadmeContent, _ as SetupUseCase, a as DEFAULT_BRANDING_TEMPLATE_PATH, b as getDefaultHumanUserSchema, c as DEFAULT_FLOW_SCHEMA_URI, d as DEFAULT_SETUP_USE_CASE, f as DefaultBrandingConfig, g as SetupPreset, h as SETUP_USE_CASES, i as DEFAULT_BRANDING_DESIGN, l as DEFAULT_SCHEMA_CONFIG_PATH, m as SETUP_PRESETS, n as BrandingDesign, o as DEFAULT_BUILTIN_SCHEMA_BASE, p as DefaultConfigRenderOptions, r as DEFAULT_BRANDING_CONFIG_PATH, s as DEFAULT_FLOW_CONFIG_PATH, t as BRANDING_DESIGNS, u as DEFAULT_SETUP_PRESET, v as defaultHumanUserSchemaUrl, w as schemasReadmeContent, x as getDefaultLoginFlow, y as getDefaultBrandingConfig } from "./defaults-Bh4_xVbh.mjs";
1
+ import { C as flowsReadmeContent, S as brandingReadmeContent, _ as SetupUseCase, a as DEFAULT_BRANDING_TEMPLATE_PATH, b as getDefaultHumanUserSchema, c as DEFAULT_FLOW_SCHEMA_URI, d as DEFAULT_SETUP_USE_CASE, f as DefaultBrandingConfig, g as SetupPreset, h as SETUP_USE_CASES, i as DEFAULT_BRANDING_DESIGN, l as DEFAULT_SCHEMA_CONFIG_PATH, m as SETUP_PRESETS, n as BrandingDesign, o as DEFAULT_BUILTIN_SCHEMA_BASE, p as DefaultConfigRenderOptions, r as DEFAULT_BRANDING_CONFIG_PATH, s as DEFAULT_FLOW_CONFIG_PATH, t as BRANDING_DESIGNS, u as DEFAULT_SETUP_PRESET, v as defaultHumanUserSchemaUrl, w as schemasReadmeContent, x as getDefaultLoginFlow, y as getDefaultBrandingConfig } from "./defaults-BxGCGdqS.mjs";
2
2
  export { BRANDING_DESIGNS, BrandingDesign, DEFAULT_BRANDING_CONFIG_PATH, DEFAULT_BRANDING_DESIGN, DEFAULT_BRANDING_TEMPLATE_PATH, DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, DEFAULT_SETUP_USE_CASE, DefaultBrandingConfig, DefaultConfigRenderOptions, SETUP_PRESETS, SETUP_USE_CASES, SetupPreset, SetupUseCase, brandingReadmeContent, defaultHumanUserSchemaUrl, flowsReadmeContent, getDefaultBrandingConfig, getDefaultHumanUserSchema, getDefaultLoginFlow, schemasReadmeContent };
package/dist/defaults.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { _ as brandingReadmeContent, a as DEFAULT_BUILTIN_SCHEMA_BASE, c as DEFAULT_SCHEMA_CONFIG_PATH, d as SETUP_PRESETS, f as SETUP_USE_CASES, g as getDefaultLoginFlow, h as getDefaultHumanUserSchema, i as DEFAULT_BRANDING_TEMPLATE_PATH, l as DEFAULT_SETUP_PRESET, m as getDefaultBrandingConfig, n as DEFAULT_BRANDING_CONFIG_PATH, o as DEFAULT_FLOW_CONFIG_PATH, p as defaultHumanUserSchemaUrl, r as DEFAULT_BRANDING_DESIGN, s as DEFAULT_FLOW_SCHEMA_URI, t as BRANDING_DESIGNS, u as DEFAULT_SETUP_USE_CASE, v as flowsReadmeContent, y as schemasReadmeContent } from "./defaults-DPq0o3iU.mjs";
1
+ import { _ as brandingReadmeContent, a as DEFAULT_BUILTIN_SCHEMA_BASE, c as DEFAULT_SCHEMA_CONFIG_PATH, d as SETUP_PRESETS, f as SETUP_USE_CASES, g as getDefaultLoginFlow, h as getDefaultHumanUserSchema, i as DEFAULT_BRANDING_TEMPLATE_PATH, l as DEFAULT_SETUP_PRESET, m as getDefaultBrandingConfig, n as DEFAULT_BRANDING_CONFIG_PATH, o as DEFAULT_FLOW_CONFIG_PATH, p as defaultHumanUserSchemaUrl, r as DEFAULT_BRANDING_DESIGN, s as DEFAULT_FLOW_SCHEMA_URI, t as BRANDING_DESIGNS, u as DEFAULT_SETUP_USE_CASE, v as flowsReadmeContent, y as schemasReadmeContent } from "./defaults-DV6hY2KT.mjs";
2
2
  export { BRANDING_DESIGNS, DEFAULT_BRANDING_CONFIG_PATH, DEFAULT_BRANDING_DESIGN, DEFAULT_BRANDING_TEMPLATE_PATH, DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, DEFAULT_SETUP_USE_CASE, SETUP_PRESETS, SETUP_USE_CASES, brandingReadmeContent, defaultHumanUserSchemaUrl, flowsReadmeContent, getDefaultBrandingConfig, getDefaultHumanUserSchema, getDefaultLoginFlow, schemasReadmeContent };
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { isCanonicalLoopbackHttpUrl } from "./branding-url.mjs";
2
- import { C as flowsReadmeContent, S as brandingReadmeContent, _ as SetupUseCase, a as DEFAULT_BRANDING_TEMPLATE_PATH, b as getDefaultHumanUserSchema, c as DEFAULT_FLOW_SCHEMA_URI, d as DEFAULT_SETUP_USE_CASE, f as DefaultBrandingConfig, g as SetupPreset, h as SETUP_USE_CASES, i as DEFAULT_BRANDING_DESIGN, l as DEFAULT_SCHEMA_CONFIG_PATH, m as SETUP_PRESETS, n as BrandingDesign, o as DEFAULT_BUILTIN_SCHEMA_BASE, p as DefaultConfigRenderOptions, r as DEFAULT_BRANDING_CONFIG_PATH, s as DEFAULT_FLOW_CONFIG_PATH, t as BRANDING_DESIGNS, u as DEFAULT_SETUP_PRESET, v as defaultHumanUserSchemaUrl, w as schemasReadmeContent, x as getDefaultLoginFlow, y as getDefaultBrandingConfig } from "./defaults-Bh4_xVbh.mjs";
2
+ import { C as flowsReadmeContent, S as brandingReadmeContent, _ as SetupUseCase, a as DEFAULT_BRANDING_TEMPLATE_PATH, b as getDefaultHumanUserSchema, c as DEFAULT_FLOW_SCHEMA_URI, d as DEFAULT_SETUP_USE_CASE, f as DefaultBrandingConfig, g as SetupPreset, h as SETUP_USE_CASES, i as DEFAULT_BRANDING_DESIGN, l as DEFAULT_SCHEMA_CONFIG_PATH, m as SETUP_PRESETS, n as BrandingDesign, o as DEFAULT_BUILTIN_SCHEMA_BASE, p as DefaultConfigRenderOptions, r as DEFAULT_BRANDING_CONFIG_PATH, s as DEFAULT_FLOW_CONFIG_PATH, t as BRANDING_DESIGNS, u as DEFAULT_SETUP_PRESET, v as defaultHumanUserSchemaUrl, w as schemasReadmeContent, x as getDefaultLoginFlow, y as getDefaultBrandingConfig } from "./defaults-BxGCGdqS.mjs";
3
3
  import { BRANDING_FILE_SCHEMA_REF, FLOW_FILE_SCHEMA_REF, META_SCHEMA_DIR, MetaSchemaFile, metaSchemaFiles } from "./meta-schemas.mjs";
4
4
  import { USER_PROPERTY_DEFAULTS, normalizeFlowBody, normalizeSchemaBody } from "./normalize.mjs";
5
- import { brandingConfigSchema, brandingWireSchema, createFlowDefinitionRequestSchema, flowConfigSchema, schemaConfigSchema } from "./schemas.mjs";
5
+ import { brandingConfigSchema, brandingWireSchema, createFlowDefinitionRequestSchema, flowConfigSchema, localFileReferenceSchema, schemaConfigSchema } from "./schemas.mjs";
6
6
  import { BANNED_TEMPLATE_PATTERNS, MANDATORY_GATES_TAG, MAX_TEMPLATE_BYTES, TEMPLATE_TAGS, TEMPLATE_VALIDATION_RULES, TemplateValidationIssue, TemplateValidationRuleId, TemplateValidationSeverity, validateLoginTemplate } from "./template.mjs";
7
7
  import { FLOW_PURPOSES, FLOW_VALIDATION_RULES, FlowValidationIssue, FlowValidationRuleId, FlowValidationSeverity, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, validateFlowDefinition } from "./validate.mjs";
8
- export { BANNED_TEMPLATE_PATTERNS, BRANDING_DESIGNS, BRANDING_FILE_SCHEMA_REF, BrandingDesign, DEFAULT_BRANDING_CONFIG_PATH, DEFAULT_BRANDING_DESIGN, DEFAULT_BRANDING_TEMPLATE_PATH, DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, DEFAULT_SETUP_USE_CASE, DefaultBrandingConfig, DefaultConfigRenderOptions, FLOW_FILE_SCHEMA_REF, FLOW_PURPOSES, FLOW_VALIDATION_RULES, FlowValidationIssue, FlowValidationRuleId, FlowValidationSeverity, MANDATORY_GATES_TAG, MAX_TEMPLATE_BYTES, META_SCHEMA_DIR, MetaSchemaFile, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, SETUP_PRESETS, SETUP_USE_CASES, SetupPreset, SetupUseCase, TEMPLATE_TAGS, TEMPLATE_VALIDATION_RULES, TemplateValidationIssue, TemplateValidationRuleId, TemplateValidationSeverity, USER_PROPERTY_DEFAULTS, brandingConfigSchema, brandingReadmeContent, brandingWireSchema, createFlowDefinitionRequestSchema, defaultHumanUserSchemaUrl, flowConfigSchema, flowsReadmeContent, getDefaultBrandingConfig, getDefaultHumanUserSchema, getDefaultLoginFlow, isCanonicalLoopbackHttpUrl, metaSchemaFiles, normalizeFlowBody, normalizeSchemaBody, schemaConfigSchema, schemasReadmeContent, validateFlowDefinition, validateLoginTemplate };
8
+ export { BANNED_TEMPLATE_PATTERNS, BRANDING_DESIGNS, BRANDING_FILE_SCHEMA_REF, BrandingDesign, DEFAULT_BRANDING_CONFIG_PATH, DEFAULT_BRANDING_DESIGN, DEFAULT_BRANDING_TEMPLATE_PATH, DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, DEFAULT_SETUP_USE_CASE, DefaultBrandingConfig, DefaultConfigRenderOptions, FLOW_FILE_SCHEMA_REF, FLOW_PURPOSES, FLOW_VALIDATION_RULES, FlowValidationIssue, FlowValidationRuleId, FlowValidationSeverity, MANDATORY_GATES_TAG, MAX_TEMPLATE_BYTES, META_SCHEMA_DIR, MetaSchemaFile, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, SETUP_PRESETS, SETUP_USE_CASES, SetupPreset, SetupUseCase, TEMPLATE_TAGS, TEMPLATE_VALIDATION_RULES, TemplateValidationIssue, TemplateValidationRuleId, TemplateValidationSeverity, USER_PROPERTY_DEFAULTS, brandingConfigSchema, brandingReadmeContent, brandingWireSchema, createFlowDefinitionRequestSchema, defaultHumanUserSchemaUrl, flowConfigSchema, flowsReadmeContent, getDefaultBrandingConfig, getDefaultHumanUserSchema, getDefaultLoginFlow, isCanonicalLoopbackHttpUrl, localFileReferenceSchema, metaSchemaFiles, normalizeFlowBody, normalizeSchemaBody, schemaConfigSchema, schemasReadmeContent, validateFlowDefinition, validateLoginTemplate };
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import { isCanonicalLoopbackHttpUrl } from "./branding-url.mjs";
2
- import { _ as brandingReadmeContent, a as DEFAULT_BUILTIN_SCHEMA_BASE, c as DEFAULT_SCHEMA_CONFIG_PATH, d as SETUP_PRESETS, f as SETUP_USE_CASES, g as getDefaultLoginFlow, h as getDefaultHumanUserSchema, i as DEFAULT_BRANDING_TEMPLATE_PATH, l as DEFAULT_SETUP_PRESET, m as getDefaultBrandingConfig, n as DEFAULT_BRANDING_CONFIG_PATH, o as DEFAULT_FLOW_CONFIG_PATH, p as defaultHumanUserSchemaUrl, r as DEFAULT_BRANDING_DESIGN, s as DEFAULT_FLOW_SCHEMA_URI, t as BRANDING_DESIGNS, u as DEFAULT_SETUP_USE_CASE, v as flowsReadmeContent, y as schemasReadmeContent } from "./defaults-DPq0o3iU.mjs";
3
- import { i as metaSchemaFiles, n as FLOW_FILE_SCHEMA_REF, r as META_SCHEMA_DIR, t as BRANDING_FILE_SCHEMA_REF } from "./meta-schemas-z4IlqbLd.mjs";
2
+ import { _ as brandingReadmeContent, a as DEFAULT_BUILTIN_SCHEMA_BASE, c as DEFAULT_SCHEMA_CONFIG_PATH, d as SETUP_PRESETS, f as SETUP_USE_CASES, g as getDefaultLoginFlow, h as getDefaultHumanUserSchema, i as DEFAULT_BRANDING_TEMPLATE_PATH, l as DEFAULT_SETUP_PRESET, m as getDefaultBrandingConfig, n as DEFAULT_BRANDING_CONFIG_PATH, o as DEFAULT_FLOW_CONFIG_PATH, p as defaultHumanUserSchemaUrl, r as DEFAULT_BRANDING_DESIGN, s as DEFAULT_FLOW_SCHEMA_URI, t as BRANDING_DESIGNS, u as DEFAULT_SETUP_USE_CASE, v as flowsReadmeContent, y as schemasReadmeContent } from "./defaults-DV6hY2KT.mjs";
3
+ import { i as metaSchemaFiles, n as FLOW_FILE_SCHEMA_REF, r as META_SCHEMA_DIR, t as BRANDING_FILE_SCHEMA_REF } from "./meta-schemas-OowgSUfU.mjs";
4
4
  import { USER_PROPERTY_DEFAULTS, normalizeFlowBody, normalizeSchemaBody } from "./normalize.mjs";
5
- import { brandingConfigSchema, brandingWireSchema, createFlowDefinitionRequestSchema, flowConfigSchema, schemaConfigSchema } from "./schemas.mjs";
5
+ import { a as localFileReferenceSchema, i as flowConfigSchema, n as brandingWireSchema, o as schemaConfigSchema, r as createFlowDefinitionRequestSchema, t as brandingConfigSchema } from "./schemas-7oNU25Qz.mjs";
6
6
  import { BANNED_TEMPLATE_PATTERNS, MANDATORY_GATES_TAG, MAX_TEMPLATE_BYTES, TEMPLATE_TAGS, TEMPLATE_VALIDATION_RULES, validateLoginTemplate } from "./template.mjs";
7
7
  import { FLOW_PURPOSES, FLOW_VALIDATION_RULES, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, validateFlowDefinition } from "./validate.mjs";
8
- export { BANNED_TEMPLATE_PATTERNS, BRANDING_DESIGNS, BRANDING_FILE_SCHEMA_REF, DEFAULT_BRANDING_CONFIG_PATH, DEFAULT_BRANDING_DESIGN, DEFAULT_BRANDING_TEMPLATE_PATH, DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, DEFAULT_SETUP_USE_CASE, FLOW_FILE_SCHEMA_REF, FLOW_PURPOSES, FLOW_VALIDATION_RULES, MANDATORY_GATES_TAG, MAX_TEMPLATE_BYTES, META_SCHEMA_DIR, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, SETUP_PRESETS, SETUP_USE_CASES, TEMPLATE_TAGS, TEMPLATE_VALIDATION_RULES, USER_PROPERTY_DEFAULTS, brandingConfigSchema, brandingReadmeContent, brandingWireSchema, createFlowDefinitionRequestSchema, defaultHumanUserSchemaUrl, flowConfigSchema, flowsReadmeContent, getDefaultBrandingConfig, getDefaultHumanUserSchema, getDefaultLoginFlow, isCanonicalLoopbackHttpUrl, metaSchemaFiles, normalizeFlowBody, normalizeSchemaBody, schemaConfigSchema, schemasReadmeContent, validateFlowDefinition, validateLoginTemplate };
8
+ export { BANNED_TEMPLATE_PATTERNS, BRANDING_DESIGNS, BRANDING_FILE_SCHEMA_REF, DEFAULT_BRANDING_CONFIG_PATH, DEFAULT_BRANDING_DESIGN, DEFAULT_BRANDING_TEMPLATE_PATH, DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, DEFAULT_SETUP_USE_CASE, FLOW_FILE_SCHEMA_REF, FLOW_PURPOSES, FLOW_VALIDATION_RULES, MANDATORY_GATES_TAG, MAX_TEMPLATE_BYTES, META_SCHEMA_DIR, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, SETUP_PRESETS, SETUP_USE_CASES, TEMPLATE_TAGS, TEMPLATE_VALIDATION_RULES, USER_PROPERTY_DEFAULTS, brandingConfigSchema, brandingReadmeContent, brandingWireSchema, createFlowDefinitionRequestSchema, defaultHumanUserSchemaUrl, flowConfigSchema, flowsReadmeContent, getDefaultBrandingConfig, getDefaultHumanUserSchema, getDefaultLoginFlow, isCanonicalLoopbackHttpUrl, localFileReferenceSchema, metaSchemaFiles, normalizeFlowBody, normalizeSchemaBody, schemaConfigSchema, schemasReadmeContent, validateFlowDefinition, validateLoginTemplate };