@zitadel/config 0.1.0-alpha.15 → 0.1.0-alpha.16

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.
@@ -40,7 +40,49 @@ Typical edits:
40
40
  different next step, or use `action: switch` / `pivot` to jump to
41
41
  another flow.
42
42
  - **Add another flow** — drop a new JSON file with its own `purposes`
43
- and `audience` (e.g. a per-team login).
43
+ and a distinct `name` (e.g. a per-team login). See
44
+ [Multiple flows](#multiple-flows) for how it gets selected at runtime.
45
+
46
+ ## Multiple flows
47
+
48
+ All files in this folder sync on `apply`, but the widget runs exactly
49
+ one flow per sign-in. Which one:
50
+
51
+ - **By name** — give the flow a distinct `name` and pass it as
52
+ `flowName` on `ZitadelLogin` (the `flow-name` attribute on
53
+ `<zitadel-login>`). The platform resolves that definition directly;
54
+ an unknown name or wrong purpose surfaces as a startup error in the
55
+ widget.
56
+ - **By audience** — omit `flowName` and scope the flow with
57
+ `audience.app_ids` / `audience.team_ids`. A start request hinting one
58
+ of those ids gets the scoped flow (app match beats team match); all
59
+ other requests get the newest flow without an `audience`.
60
+
61
+ A flow scoped to an app or team never captures the project default —
62
+ requests that don't identify that audience fall back to the unscoped
63
+ flow.
64
+
65
+ The flip side: a **new active flow without an `audience` becomes the
66
+ newest unscoped definition, i.e. the default**, the moment it applies.
67
+ `plan` calls this out with a `# warning:` line on the create so an
68
+ experiment can't silently take over `/login` — scope it or pin
69
+ `flow-name` in the widget if that isn't the intent.
70
+
71
+ ## Presets
72
+
73
+ `zitadel setup` scaffolds this folder from a preset (`--preset
74
+ password-first` or `--preset passkey-first`). The passkey-first flow
75
+ enters login on a fields-less passkey step with an email → password
76
+ fallback path. The preset only decides the starting point — edit
77
+ anything here afterwards.
78
+
79
+ ## Presets
80
+
81
+ `zitadel setup` scaffolds this folder from a preset (`--preset
82
+ password-first` or `--preset passkey-first`). The passkey-first flow
83
+ enters login on a fields-less passkey step with an email → password
84
+ fallback path. The preset only decides the starting point — edit
85
+ anything here afterwards.
44
86
 
45
87
  ## Schema revisions
46
88
 
@@ -124,6 +124,12 @@ Set `"passkey": { "enabled": true }` in `x-auth-methods`.
124
124
 
125
125
  Create another JSON file in this directory.
126
126
 
127
+ ## Start from a different preset
128
+
129
+ `zitadel setup` scaffolds this folder from a preset (`--preset
130
+ password-first` or `--preset passkey-first`). The preset only decides the
131
+ starting point — everything in it is editable afterwards.
132
+
127
133
  ------------------------------------------------------------------------
128
134
 
129
135
  ## Next step
@@ -1,4 +1,5 @@
1
1
  {
2
+ "$schema": "../meta/flow-definition.json",
2
3
  "name": "default-login",
3
4
  "status": "active",
4
5
  "user_schema": "${USER_SCHEMA_URL}",
@@ -0,0 +1,46 @@
1
+ {
2
+ "title": "DefaultHumanUserSchema",
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "metaSchema": "${SERVER_URL}/user-schema.json",
5
+ "$id": "${USER_SCHEMA_URL}",
6
+ "objectType": "human-user",
7
+ "kind": "user-schema",
8
+ "type": "object",
9
+ "description": "The default editable schema for human users (passkey-first sign-in).",
10
+ "x-auth-methods": {
11
+ "passkey": {
12
+ "enabled": true,
13
+ "position": 1
14
+ },
15
+ "password": {
16
+ "enabled": true,
17
+ "position": 2
18
+ }
19
+ },
20
+ "required": [
21
+ "email"
22
+ ],
23
+ "properties": {
24
+ "email": {
25
+ "type": "string",
26
+ "format": "email",
27
+ "x-unique": "project",
28
+ "description": "The user's email address."
29
+ },
30
+ "givenName": {
31
+ "type": "string",
32
+ "maxLength": 50,
33
+ "description": "The user's given (first) name."
34
+ },
35
+ "familyName": {
36
+ "type": "string",
37
+ "maxLength": 50,
38
+ "description": "The user's family (last) name."
39
+ },
40
+ "dateOfBirth": {
41
+ "type": "string",
42
+ "format": "date",
43
+ "description": "The user's date of birth (ISO 8601, YYYY-MM-DD)."
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,161 @@
1
+ {
2
+ "$schema": "../meta/flow-definition.json",
3
+ "name": "default-login",
4
+ "status": "active",
5
+ "user_schema": "${USER_SCHEMA_URL}",
6
+ "purposes": {
7
+ "login": "passkey-first",
8
+ "register": "register"
9
+ },
10
+ "steps": [
11
+ {
12
+ "name": "passkey-first",
13
+ "fields": [],
14
+ "actions": [
15
+ {
16
+ "name": "passkey",
17
+ "kind": "passkey",
18
+ "primary": true,
19
+ "text_key": "passkey-first.action.passkey"
20
+ },
21
+ {
22
+ "name": "email_fallback",
23
+ "kind": "navigate",
24
+ "primary": false,
25
+ "text_key": "passkey-first.action.email_fallback"
26
+ }
27
+ ],
28
+ "transitions": {
29
+ "passkey": {
30
+ "target": "done"
31
+ },
32
+ "email_fallback": {
33
+ "target": "identifier"
34
+ },
35
+ "user_not_found": {
36
+ "target": "register"
37
+ }
38
+ }
39
+ },
40
+ {
41
+ "name": "identifier",
42
+ "fields": [
43
+ "email"
44
+ ],
45
+ "actions": [
46
+ {
47
+ "name": "submit",
48
+ "kind": "submit",
49
+ "primary": true,
50
+ "text_key": "identifier.action.continue"
51
+ },
52
+ {
53
+ "name": "passkey",
54
+ "kind": "passkey",
55
+ "primary": false,
56
+ "text_key": "identifier.action.passkey"
57
+ }
58
+ ],
59
+ "transitions": {
60
+ "submit": {
61
+ "target": "password"
62
+ },
63
+ "passkey": {
64
+ "target": "done"
65
+ },
66
+ "user_not_found": {
67
+ "target": "register"
68
+ }
69
+ }
70
+ },
71
+ {
72
+ "name": "password",
73
+ "fields": [
74
+ "x-auth-methods#password"
75
+ ],
76
+ "actions": [
77
+ {
78
+ "name": "submit",
79
+ "kind": "submit",
80
+ "primary": true,
81
+ "text_key": "password.action.signin"
82
+ },
83
+ {
84
+ "name": "passkey",
85
+ "kind": "passkey",
86
+ "primary": false,
87
+ "text_key": "password.action.passkey"
88
+ }
89
+ ],
90
+ "transitions": {
91
+ "submit": {
92
+ "target": "done"
93
+ },
94
+ "passkey": {
95
+ "target": "done"
96
+ }
97
+ }
98
+ },
99
+ {
100
+ "name": "register",
101
+ "fields": [
102
+ "email",
103
+ "givenName",
104
+ "familyName",
105
+ "dateOfBirth"
106
+ ],
107
+ "actions": [
108
+ {
109
+ "name": "passkey_register",
110
+ "kind": "passkey_register",
111
+ "primary": true,
112
+ "text_key": "register.action.passkey"
113
+ },
114
+ {
115
+ "name": "submit",
116
+ "kind": "submit",
117
+ "primary": false,
118
+ "text_key": "register.action.password"
119
+ }
120
+ ],
121
+ "transitions": {
122
+ "passkey_register": {
123
+ "target": "done"
124
+ },
125
+ "submit": {
126
+ "target": "register-password"
127
+ },
128
+ "user_already_exists": {
129
+ "target": "password"
130
+ }
131
+ }
132
+ },
133
+ {
134
+ "name": "register-password",
135
+ "fields": [
136
+ "x-auth-methods#password"
137
+ ],
138
+ "actions": [
139
+ {
140
+ "name": "submit",
141
+ "kind": "submit",
142
+ "primary": true,
143
+ "text_key": "register-password.action.submit"
144
+ }
145
+ ],
146
+ "on_success": "create_user",
147
+ "transitions": {
148
+ "submit": {
149
+ "target": "done"
150
+ },
151
+ "user_already_exists": {
152
+ "target": "password"
153
+ }
154
+ }
155
+ },
156
+ {
157
+ "name": "done",
158
+ "complete": "show"
159
+ }
160
+ ]
161
+ }
@@ -48,6 +48,7 @@ var default_human_user_default = {
48
48
  //#endregion
49
49
  //#region defaults/default-login.json
50
50
  var default_login_default = {
51
+ $schema: "../meta/flow-definition.json",
51
52
  name: "default-login",
52
53
  status: "active",
53
54
  user_schema: "${USER_SCHEMA_URL}",
@@ -142,6 +143,169 @@ var default_login_default = {
142
143
  ]
143
144
  };
144
145
  //#endregion
146
+ //#region defaults/presets/passkey-first/human-user.json
147
+ var human_user_default = {
148
+ title: "DefaultHumanUserSchema",
149
+ $schema: "https://json-schema.org/draft/2020-12/schema",
150
+ metaSchema: "${SERVER_URL}/user-schema.json",
151
+ $id: "${USER_SCHEMA_URL}",
152
+ objectType: "human-user",
153
+ kind: "user-schema",
154
+ type: "object",
155
+ description: "The default editable schema for human users (passkey-first sign-in).",
156
+ "x-auth-methods": {
157
+ "passkey": {
158
+ "enabled": true,
159
+ "position": 1
160
+ },
161
+ "password": {
162
+ "enabled": true,
163
+ "position": 2
164
+ }
165
+ },
166
+ required: ["email"],
167
+ properties: {
168
+ "email": {
169
+ "type": "string",
170
+ "format": "email",
171
+ "x-unique": "project",
172
+ "description": "The user's email address."
173
+ },
174
+ "givenName": {
175
+ "type": "string",
176
+ "maxLength": 50,
177
+ "description": "The user's given (first) name."
178
+ },
179
+ "familyName": {
180
+ "type": "string",
181
+ "maxLength": 50,
182
+ "description": "The user's family (last) name."
183
+ },
184
+ "dateOfBirth": {
185
+ "type": "string",
186
+ "format": "date",
187
+ "description": "The user's date of birth (ISO 8601, YYYY-MM-DD)."
188
+ }
189
+ }
190
+ };
191
+ //#endregion
192
+ //#region defaults/presets/passkey-first/login.json
193
+ var login_default = {
194
+ $schema: "../meta/flow-definition.json",
195
+ name: "default-login",
196
+ status: "active",
197
+ user_schema: "${USER_SCHEMA_URL}",
198
+ purposes: {
199
+ "login": "passkey-first",
200
+ "register": "register"
201
+ },
202
+ steps: [
203
+ {
204
+ "name": "passkey-first",
205
+ "fields": [],
206
+ "actions": [{
207
+ "name": "passkey",
208
+ "kind": "passkey",
209
+ "primary": true,
210
+ "text_key": "passkey-first.action.passkey"
211
+ }, {
212
+ "name": "email_fallback",
213
+ "kind": "navigate",
214
+ "primary": false,
215
+ "text_key": "passkey-first.action.email_fallback"
216
+ }],
217
+ "transitions": {
218
+ "passkey": { "target": "done" },
219
+ "email_fallback": { "target": "identifier" },
220
+ "user_not_found": { "target": "register" }
221
+ }
222
+ },
223
+ {
224
+ "name": "identifier",
225
+ "fields": ["email"],
226
+ "actions": [{
227
+ "name": "submit",
228
+ "kind": "submit",
229
+ "primary": true,
230
+ "text_key": "identifier.action.continue"
231
+ }, {
232
+ "name": "passkey",
233
+ "kind": "passkey",
234
+ "primary": false,
235
+ "text_key": "identifier.action.passkey"
236
+ }],
237
+ "transitions": {
238
+ "submit": { "target": "password" },
239
+ "passkey": { "target": "done" },
240
+ "user_not_found": { "target": "register" }
241
+ }
242
+ },
243
+ {
244
+ "name": "password",
245
+ "fields": ["x-auth-methods#password"],
246
+ "actions": [{
247
+ "name": "submit",
248
+ "kind": "submit",
249
+ "primary": true,
250
+ "text_key": "password.action.signin"
251
+ }, {
252
+ "name": "passkey",
253
+ "kind": "passkey",
254
+ "primary": false,
255
+ "text_key": "password.action.passkey"
256
+ }],
257
+ "transitions": {
258
+ "submit": { "target": "done" },
259
+ "passkey": { "target": "done" }
260
+ }
261
+ },
262
+ {
263
+ "name": "register",
264
+ "fields": [
265
+ "email",
266
+ "givenName",
267
+ "familyName",
268
+ "dateOfBirth"
269
+ ],
270
+ "actions": [{
271
+ "name": "passkey_register",
272
+ "kind": "passkey_register",
273
+ "primary": true,
274
+ "text_key": "register.action.passkey"
275
+ }, {
276
+ "name": "submit",
277
+ "kind": "submit",
278
+ "primary": false,
279
+ "text_key": "register.action.password"
280
+ }],
281
+ "transitions": {
282
+ "passkey_register": { "target": "done" },
283
+ "submit": { "target": "register-password" },
284
+ "user_already_exists": { "target": "password" }
285
+ }
286
+ },
287
+ {
288
+ "name": "register-password",
289
+ "fields": ["x-auth-methods#password"],
290
+ "actions": [{
291
+ "name": "submit",
292
+ "kind": "submit",
293
+ "primary": true,
294
+ "text_key": "register-password.action.submit"
295
+ }],
296
+ "on_success": "create_user",
297
+ "transitions": {
298
+ "submit": { "target": "done" },
299
+ "user_already_exists": { "target": "password" }
300
+ }
301
+ },
302
+ {
303
+ "name": "done",
304
+ "complete": "show"
305
+ }
306
+ ]
307
+ };
308
+ //#endregion
145
309
  //#region src/readmes.ts
146
310
  /**
147
311
  * README content the CLI copies to `.zitadel/schemas/README.md` during setup.
@@ -167,19 +331,42 @@ const DEFAULT_BUILTIN_SCHEMA_BASE = "https://nextgen.com/api/schemas";
167
331
  const DEFAULT_FLOW_SCHEMA_URI = "https://nextgen.com/flow-definition.json";
168
332
  const DEFAULT_SCHEMA_CONFIG_PATH = ".zitadel/schemas/default-human-user.json";
169
333
  const DEFAULT_FLOW_CONFIG_PATH = ".zitadel/flows/default-login.json";
334
+ /**
335
+ * Named schema+flow bundles `zitadel setup` can scaffold (#448: the prompt
336
+ * fires before any `.zitadel/` file is written; each preset maps to a
337
+ * pre-defined bundle the CLI copies on first setup). `password-first` is
338
+ * today's default; `passkey-first` puts a passkey ceremony on the login
339
+ * entry step with an email→password fallback path.
340
+ */
341
+ const SETUP_PRESETS = ["password-first", "passkey-first"];
342
+ const DEFAULT_SETUP_PRESET = "password-first";
343
+ const PRESET_TEMPLATES = {
344
+ "password-first": {
345
+ schema: default_human_user_default,
346
+ flow: default_login_default
347
+ },
348
+ "passkey-first": {
349
+ schema: human_user_default,
350
+ flow: login_default
351
+ }
352
+ };
353
+ function presetTemplates(preset) {
354
+ if (!Object.hasOwn(PRESET_TEMPLATES, preset)) throw new Error(`unknown setup preset ${JSON.stringify(preset)} (known presets: ${SETUP_PRESETS.join(", ")})`);
355
+ return PRESET_TEMPLATES[preset];
356
+ }
170
357
  function defaultHumanUserSchemaUrl(builtinSchemaBase = DEFAULT_BUILTIN_SCHEMA_BASE) {
171
358
  return `${trimTrailingSlash(builtinSchemaBase)}/default-human-user.json`;
172
359
  }
173
360
  function getDefaultHumanUserSchema(options = {}) {
174
361
  const builtinSchemaBase = trimTrailingSlash(options.builtinSchemaBase ?? "https://nextgen.com/api/schemas");
175
- return renderTemplate(default_human_user_default, {
362
+ return renderTemplate(presetTemplates(options.preset ?? "password-first").schema, {
176
363
  SERVER_URL: builtinSchemaBase,
177
364
  USER_SCHEMA_URL: options.userSchemaUrl ?? defaultHumanUserSchemaUrl(builtinSchemaBase)
178
365
  });
179
366
  }
180
367
  function getDefaultLoginFlow(options = {}) {
181
368
  const builtinSchemaBase = trimTrailingSlash(options.builtinSchemaBase ?? "https://nextgen.com/api/schemas");
182
- return renderTemplate(default_login_default, {
369
+ return renderTemplate(presetTemplates(options.preset ?? "password-first").flow, {
183
370
  SERVER_URL: builtinSchemaBase,
184
371
  USER_SCHEMA_URL: options.userSchemaUrl ?? defaultHumanUserSchemaUrl(builtinSchemaBase)
185
372
  });
@@ -196,6 +383,6 @@ function trimTrailingSlash(value) {
196
383
  return value.replace(/\/+$/u, "");
197
384
  }
198
385
  //#endregion
199
- export { defaultHumanUserSchemaUrl as a, flowsReadmeContent as c, DEFAULT_SCHEMA_CONFIG_PATH as i, schemasReadmeContent as l, DEFAULT_FLOW_CONFIG_PATH as n, getDefaultHumanUserSchema as o, DEFAULT_FLOW_SCHEMA_URI as r, getDefaultLoginFlow as s, DEFAULT_BUILTIN_SCHEMA_BASE as t };
386
+ export { DEFAULT_SETUP_PRESET as a, getDefaultHumanUserSchema as c, schemasReadmeContent as d, DEFAULT_SCHEMA_CONFIG_PATH as i, getDefaultLoginFlow as l, DEFAULT_FLOW_CONFIG_PATH as n, SETUP_PRESETS as o, DEFAULT_FLOW_SCHEMA_URI as r, defaultHumanUserSchemaUrl as s, DEFAULT_BUILTIN_SCHEMA_BASE as t, flowsReadmeContent as u };
200
387
 
201
- //# sourceMappingURL=defaults-B2iIPSSl.mjs.map
388
+ //# sourceMappingURL=defaults-BQej3KIY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults-BQej3KIY.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\nfunction readmeUrl(filename: string): string {\n return fileURLToPath(new URL(`../defaults/${filename}`, import.meta.url));\n}\n","import 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 { 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\";\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\nexport type DefaultConfigRenderOptions = {\n builtinSchemaBase?: string;\n userSchemaUrl?: string;\n /** Which bundle to render; defaults to {@link DEFAULT_SETUP_PRESET}. */\n preset?: 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 return renderTemplate(presetTemplates(options.preset ?? DEFAULT_SETUP_PRESET).schema, {\n SERVER_URL: builtinSchemaBase,\n USER_SCHEMA_URL: options.userSchemaUrl ?? defaultHumanUserSchemaUrl(builtinSchemaBase),\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 return renderTemplate(presetTemplates(options.preset ?? DEFAULT_SETUP_PRESET).flow, {\n SERVER_URL: builtinSchemaBase,\n USER_SCHEMA_URL: options.userSchemaUrl ?? defaultHumanUserSchemaUrl(builtinSchemaBase),\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 return value.replace(/\\/+$/u, \"\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AIQA,SAAgB,uBAA+B;AAC7C,QAAO,aAAa,UAAU,oBAAoB,EAAE,OAAO;;;;;;AAO7D,SAAgB,qBAA6B;AAC3C,QAAO,aAAa,UAAU,kBAAkB,EAAE,OAAO;;AAG3D,SAAS,UAAU,UAA0B;AAC3C,QAAO,cAAc,IAAI,IAAI,eAAe,YAAY,OAAO,KAAK,IAAI,CAAC;;;;ACD3E,MAAa,8BAA8B;AAC3C,MAAa,0BAA0B;AACvC,MAAa,6BAA6B;AAC1C,MAAa,2BAA2B;;;;;;;;AASxC,MAAa,gBAAgB,CAAC,kBAAkB,gBAAgB;AAIhE,MAAa,uBAAoC;AAEjD,MAAM,mBAA4E;CAChF,kBAAkB;EAChB,QAAQA;EACR,MAAMC;EACP;CACD,iBAAiB;EACf,QAAQC;EACR,MAAMC;EACP;CACF;AAED,SAAS,gBAAgB,QAAoD;AAI3E,KAAI,CAAC,OAAO,OAAO,kBAAkB,OAAO,CAC1C,OAAM,IAAI,MACR,wBAAwB,KAAK,UAAU,OAAO,CAAC,mBAAmB,cAAc,KAAK,KAAK,CAAC,GAC5F;AAEH,QAAO,iBAAiB;;AAU1B,SAAgB,0BACd,oBAAoB,6BACZ;AACR,QAAO,GAAG,kBAAkB,kBAAkB,CAAC;;AAGjD,SAAgB,0BACd,UAAsC,EAAE,EACtB;CAClB,MAAM,oBAAoB,kBACxB,QAAQ,qBAAA,kCACT;AACD,QAAO,eAAe,gBAAgB,QAAQ,UAAA,iBAA+B,CAAC,QAAQ;EACpF,YAAY;EACZ,iBAAiB,QAAQ,iBAAiB,0BAA0B,kBAAkB;EACvF,CAAC;;AAGJ,SAAgB,oBACd,UAAsC,EAAE,EACA;CACxC,MAAM,oBAAoB,kBACxB,QAAQ,qBAAA,kCACT;AACD,QAAO,eAAe,gBAAgB,QAAQ,UAAA,iBAA+B,CAAC,MAAM;EAClF,YAAY;EACZ,iBAAiB,QAAQ,iBAAiB,0BAA0B,kBAAkB;EACvF,CAAC;;AAGJ,SAAS,eAAe,OAAgB,cAA+C;AACrF,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,SAAS,eAAe,MAAM,aAAa,CAAC;AAEhE,KAAI,UAAU,QAAQ,OAAO,UAAU,SACrC,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,eAAe,MAAM,aAAa,CAAC,CAAC,CACtF;AAEH,KAAI,OAAO,UAAU,SACnB,QAAO,MAAM,WAAW,qBAAqB,OAAO,SAAiB;AACnE,SAAO,aAAa,SAAS;GAC7B;AAEJ,QAAO;;AAGT,SAAS,kBAAkB,OAAuB;AAChD,QAAO,MAAM,QAAQ,SAAS,GAAG"}
@@ -18,13 +18,24 @@ declare const DEFAULT_BUILTIN_SCHEMA_BASE = "https://nextgen.com/api/schemas";
18
18
  declare const DEFAULT_FLOW_SCHEMA_URI = "https://nextgen.com/flow-definition.json";
19
19
  declare const DEFAULT_SCHEMA_CONFIG_PATH = ".zitadel/schemas/default-human-user.json";
20
20
  declare const DEFAULT_FLOW_CONFIG_PATH = ".zitadel/flows/default-login.json";
21
+ /**
22
+ * Named schema+flow bundles `zitadel setup` can scaffold (#448: the prompt
23
+ * fires before any `.zitadel/` file is written; each preset maps to a
24
+ * pre-defined bundle the CLI copies on first setup). `password-first` is
25
+ * today's default; `passkey-first` puts a passkey ceremony on the login
26
+ * entry step with an email→password fallback path.
27
+ */
28
+ declare const SETUP_PRESETS: readonly ["password-first", "passkey-first"];
29
+ type SetupPreset = (typeof SETUP_PRESETS)[number];
30
+ declare const DEFAULT_SETUP_PRESET: SetupPreset;
21
31
  type DefaultConfigRenderOptions = {
22
32
  builtinSchemaBase?: string;
23
- userSchemaUrl?: string;
33
+ userSchemaUrl?: string; /** Which bundle to render; defaults to {@link DEFAULT_SETUP_PRESET}. */
34
+ preset?: string;
24
35
  };
25
36
  declare function defaultHumanUserSchemaUrl(builtinSchemaBase?: string): string;
26
37
  declare function getDefaultHumanUserSchema(options?: DefaultConfigRenderOptions): CreateSchemaBody;
27
38
  declare function getDefaultLoginFlow(options?: DefaultConfigRenderOptions): CreateFlowDefinitionBodyFlowDefinition;
28
39
  //#endregion
29
- export { DefaultConfigRenderOptions as a, getDefaultLoginFlow as c, DEFAULT_SCHEMA_CONFIG_PATH as i, flowsReadmeContent as l, DEFAULT_FLOW_CONFIG_PATH as n, defaultHumanUserSchemaUrl as o, DEFAULT_FLOW_SCHEMA_URI as r, getDefaultHumanUserSchema as s, DEFAULT_BUILTIN_SCHEMA_BASE as t, schemasReadmeContent as u };
30
- //# sourceMappingURL=defaults-DzfOT2_7.d.mts.map
40
+ export { DEFAULT_SETUP_PRESET as a, SetupPreset as c, getDefaultLoginFlow as d, flowsReadmeContent as f, DEFAULT_SCHEMA_CONFIG_PATH as i, defaultHumanUserSchemaUrl as l, DEFAULT_FLOW_CONFIG_PATH as n, DefaultConfigRenderOptions as o, schemasReadmeContent as p, DEFAULT_FLOW_SCHEMA_URI as r, SETUP_PRESETS as s, DEFAULT_BUILTIN_SCHEMA_BASE as t, getDefaultHumanUserSchema as u };
41
+ //# sourceMappingURL=defaults-CSjBjBkQ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults-CSjBjBkQ.d.mts","names":[],"sources":["../src/readmes.ts","../src/defaults.ts"],"mappings":";;;;;;AAQA;;iBAAgB,oBAAA,CAAA;;;AAQhB;;iBAAgB,kBAAA,CAAA;;;cCIH,2BAAA;AAAA,cACA,uBAAA;AAAA,cACA,0BAAA;AAAA,cACA,wBAAA;;;ADPb;;;;;cCgBa,aAAA;AAAA,KAED,WAAA,WAAsB,aAAA;AAAA,cAErB,oBAAA,EAAsB,WAAA;AAAA,KAyBvB,0BAAA;EACV,iBAAA;EACA,aAAA,WA3CsC;EA6CtC,MAAA;AAAA;AAAA,iBAGc,yBAAA,CACd,iBAAA;AAAA,iBAKc,yBAAA,CACd,OAAA,GAAS,0BAAA,GACR,gBAAA;AAAA,iBAUa,mBAAA,CACd,OAAA,GAAS,0BAAA,GACR,sCAAA"}
@@ -1,2 +1,2 @@
1
- import { a as DefaultConfigRenderOptions, c as getDefaultLoginFlow, i as DEFAULT_SCHEMA_CONFIG_PATH, l as flowsReadmeContent, n as DEFAULT_FLOW_CONFIG_PATH, o as defaultHumanUserSchemaUrl, r as DEFAULT_FLOW_SCHEMA_URI, s as getDefaultHumanUserSchema, t as DEFAULT_BUILTIN_SCHEMA_BASE, u as schemasReadmeContent } from "./defaults-DzfOT2_7.mjs";
2
- export { DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DefaultConfigRenderOptions, defaultHumanUserSchemaUrl, flowsReadmeContent, getDefaultHumanUserSchema, getDefaultLoginFlow, schemasReadmeContent };
1
+ import { a as DEFAULT_SETUP_PRESET, c as SetupPreset, d as getDefaultLoginFlow, f as flowsReadmeContent, i as DEFAULT_SCHEMA_CONFIG_PATH, l as defaultHumanUserSchemaUrl, n as DEFAULT_FLOW_CONFIG_PATH, o as DefaultConfigRenderOptions, p as schemasReadmeContent, r as DEFAULT_FLOW_SCHEMA_URI, s as SETUP_PRESETS, t as DEFAULT_BUILTIN_SCHEMA_BASE, u as getDefaultHumanUserSchema } from "./defaults-CSjBjBkQ.mjs";
2
+ export { DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, DefaultConfigRenderOptions, SETUP_PRESETS, SetupPreset, defaultHumanUserSchemaUrl, flowsReadmeContent, getDefaultHumanUserSchema, getDefaultLoginFlow, schemasReadmeContent };
package/dist/defaults.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as defaultHumanUserSchemaUrl, c as flowsReadmeContent, i as DEFAULT_SCHEMA_CONFIG_PATH, l as schemasReadmeContent, n as DEFAULT_FLOW_CONFIG_PATH, o as getDefaultHumanUserSchema, r as DEFAULT_FLOW_SCHEMA_URI, s as getDefaultLoginFlow, t as DEFAULT_BUILTIN_SCHEMA_BASE } from "./defaults-B2iIPSSl.mjs";
2
- export { DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, defaultHumanUserSchemaUrl, flowsReadmeContent, getDefaultHumanUserSchema, getDefaultLoginFlow, schemasReadmeContent };
1
+ import { a as DEFAULT_SETUP_PRESET, c as getDefaultHumanUserSchema, d as schemasReadmeContent, i as DEFAULT_SCHEMA_CONFIG_PATH, l as getDefaultLoginFlow, n as DEFAULT_FLOW_CONFIG_PATH, o as SETUP_PRESETS, r as DEFAULT_FLOW_SCHEMA_URI, s as defaultHumanUserSchemaUrl, t as DEFAULT_BUILTIN_SCHEMA_BASE, u as flowsReadmeContent } from "./defaults-BQej3KIY.mjs";
2
+ export { DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, SETUP_PRESETS, defaultHumanUserSchemaUrl, flowsReadmeContent, getDefaultHumanUserSchema, getDefaultLoginFlow, schemasReadmeContent };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,6 @@
1
- import { a as DefaultConfigRenderOptions, c as getDefaultLoginFlow, i as DEFAULT_SCHEMA_CONFIG_PATH, l as flowsReadmeContent, n as DEFAULT_FLOW_CONFIG_PATH, o as defaultHumanUserSchemaUrl, r as DEFAULT_FLOW_SCHEMA_URI, s as getDefaultHumanUserSchema, t as DEFAULT_BUILTIN_SCHEMA_BASE, u as schemasReadmeContent } from "./defaults-DzfOT2_7.mjs";
1
+ import { a as DEFAULT_SETUP_PRESET, c as SetupPreset, d as getDefaultLoginFlow, f as flowsReadmeContent, i as DEFAULT_SCHEMA_CONFIG_PATH, l as defaultHumanUserSchemaUrl, n as DEFAULT_FLOW_CONFIG_PATH, o as DefaultConfigRenderOptions, p as schemasReadmeContent, r as DEFAULT_FLOW_SCHEMA_URI, s as SETUP_PRESETS, t as DEFAULT_BUILTIN_SCHEMA_BASE, u as getDefaultHumanUserSchema } from "./defaults-CSjBjBkQ.mjs";
2
+ import { FLOW_FILE_SCHEMA_REF, META_SCHEMA_DIR, MetaSchemaFile, metaSchemaFiles } from "./meta-schemas.mjs";
2
3
  import { USER_PROPERTY_DEFAULTS, normalizeFlowBody, normalizeSchemaBody } from "./normalize.mjs";
3
4
  import { createFlowDefinitionRequestSchema, flowConfigSchema, schemaConfigSchema } from "./schemas.mjs";
4
- export { DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DefaultConfigRenderOptions, USER_PROPERTY_DEFAULTS, createFlowDefinitionRequestSchema, defaultHumanUserSchemaUrl, flowConfigSchema, flowsReadmeContent, getDefaultHumanUserSchema, getDefaultLoginFlow, normalizeFlowBody, normalizeSchemaBody, schemaConfigSchema, schemasReadmeContent };
5
+ import { FLOW_PURPOSES, FLOW_VALIDATION_RULES, FlowValidationIssue, FlowValidationRuleId, FlowValidationSeverity, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, validateFlowDefinition } from "./validate.mjs";
6
+ export { DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, DefaultConfigRenderOptions, FLOW_FILE_SCHEMA_REF, FLOW_PURPOSES, FLOW_VALIDATION_RULES, FlowValidationIssue, FlowValidationRuleId, FlowValidationSeverity, META_SCHEMA_DIR, MetaSchemaFile, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, SETUP_PRESETS, SetupPreset, USER_PROPERTY_DEFAULTS, createFlowDefinitionRequestSchema, defaultHumanUserSchemaUrl, flowConfigSchema, flowsReadmeContent, getDefaultHumanUserSchema, getDefaultLoginFlow, metaSchemaFiles, normalizeFlowBody, normalizeSchemaBody, schemaConfigSchema, schemasReadmeContent, validateFlowDefinition };
package/dist/index.mjs CHANGED
@@ -1,4 +1,6 @@
1
- import { a as defaultHumanUserSchemaUrl, c as flowsReadmeContent, i as DEFAULT_SCHEMA_CONFIG_PATH, l as schemasReadmeContent, n as DEFAULT_FLOW_CONFIG_PATH, o as getDefaultHumanUserSchema, r as DEFAULT_FLOW_SCHEMA_URI, s as getDefaultLoginFlow, t as DEFAULT_BUILTIN_SCHEMA_BASE } from "./defaults-B2iIPSSl.mjs";
1
+ import { a as DEFAULT_SETUP_PRESET, c as getDefaultHumanUserSchema, d as schemasReadmeContent, i as DEFAULT_SCHEMA_CONFIG_PATH, l as getDefaultLoginFlow, n as DEFAULT_FLOW_CONFIG_PATH, o as SETUP_PRESETS, r as DEFAULT_FLOW_SCHEMA_URI, s as defaultHumanUserSchemaUrl, t as DEFAULT_BUILTIN_SCHEMA_BASE, u as flowsReadmeContent } from "./defaults-BQej3KIY.mjs";
2
+ import { n as META_SCHEMA_DIR, r as metaSchemaFiles, t as FLOW_FILE_SCHEMA_REF } from "./meta-schemas-8nlyVL7g.mjs";
2
3
  import { USER_PROPERTY_DEFAULTS, normalizeFlowBody, normalizeSchemaBody } from "./normalize.mjs";
3
4
  import { createFlowDefinitionRequestSchema, flowConfigSchema, schemaConfigSchema } from "./schemas.mjs";
4
- export { DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, USER_PROPERTY_DEFAULTS, createFlowDefinitionRequestSchema, defaultHumanUserSchemaUrl, flowConfigSchema, flowsReadmeContent, getDefaultHumanUserSchema, getDefaultLoginFlow, normalizeFlowBody, normalizeSchemaBody, schemaConfigSchema, schemasReadmeContent };
5
+ import { FLOW_PURPOSES, FLOW_VALIDATION_RULES, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, validateFlowDefinition } from "./validate.mjs";
6
+ export { DEFAULT_BUILTIN_SCHEMA_BASE, DEFAULT_FLOW_CONFIG_PATH, DEFAULT_FLOW_SCHEMA_URI, DEFAULT_SCHEMA_CONFIG_PATH, DEFAULT_SETUP_PRESET, FLOW_FILE_SCHEMA_REF, FLOW_PURPOSES, FLOW_VALIDATION_RULES, META_SCHEMA_DIR, PURPOSE_FLIP_TARGETS, RESERVED_OUTCOMES, SETUP_PRESETS, USER_PROPERTY_DEFAULTS, createFlowDefinitionRequestSchema, defaultHumanUserSchemaUrl, flowConfigSchema, flowsReadmeContent, getDefaultHumanUserSchema, getDefaultLoginFlow, metaSchemaFiles, normalizeFlowBody, normalizeSchemaBody, schemaConfigSchema, schemasReadmeContent, validateFlowDefinition };