@crowi/api-contract 2.0.0-alpha.12 → 2.0.0-alpha.13

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.
package/dist/index.mjs CHANGED
@@ -105,8 +105,12 @@ var ERROR_CODES = [
105
105
  "INVALID_CREDENTIALS",
106
106
  "REFRESH_TOKEN_REQUIRED",
107
107
  "REGISTRATION_CLOSED",
108
+ // --- federated sign-in (RFC-0014) ---
109
+ "FEDERATED_HANDOFF_INVALID",
110
+ "FEDERATED_HANDOFF_CONSUMED",
108
111
  // --- admin subsystems ---
109
112
  "ENCRYPTION_NOT_CONFIGURED",
113
+ "MAIL_FROM_NOT_CONFIGURED",
110
114
  "MAIL_TEST_FAILED",
111
115
  "PLUGIN_NOT_FOUND",
112
116
  "PLUGIN_CONFIG_VALIDATION_FAILED"
@@ -387,10 +391,16 @@ var SendTestMailResponseSchema = z5.object({
387
391
  to: z5.string()
388
392
  });
389
393
  var SendTestMailErrorSchema = z5.object({
390
- error: z5.object({
391
- code: z5.literal("MAIL_TEST_FAILED"),
392
- message: z5.string()
393
- })
394
+ error: z5.discriminatedUnion("code", [
395
+ z5.object({
396
+ code: z5.literal("MAIL_FROM_NOT_CONFIGURED"),
397
+ message: z5.literal("The mail sender address is not configured.")
398
+ }),
399
+ z5.object({
400
+ code: z5.literal("MAIL_TEST_FAILED"),
401
+ message: z5.enum(["Failed to send the test email. Check the active mail sender configuration.", "No email address on the calling user"])
402
+ })
403
+ ])
394
404
  });
395
405
  var MailSettingsValidationErrorSchema = z5.object({
396
406
  bodyResult: z5.object({
@@ -503,7 +513,7 @@ var sendTestMailRoute = createRoute3({
503
513
  content: { "application/json": { schema: AdminRequiredErrorSchema } }
504
514
  },
505
515
  502: {
506
- description: "Test mail dispatch failed (SMTP error)",
516
+ description: "Test mail dispatch failed (mail dispatch failure \u2014 e.g. sender/transport error, or the mail sender address is not configured)",
507
517
  content: { "application/json": { schema: SendTestMailErrorSchema } }
508
518
  }
509
519
  }
@@ -653,13 +663,16 @@ var PluginReadinessFieldSchema = z6.object({
653
663
  name: z6.string(),
654
664
  configured: z6.literal(false)
655
665
  });
656
- var PluginReadinessIssueSchema = z6.object({
657
- name: z6.string(),
658
- adminPlacement: PluginAdminPlacementSchema,
666
+ var ConfigReadinessIssueSchema = z6.object({
667
+ /** Stable id — `plugin:<name>` or a core declaration id (e.g. `core:mail`). */
668
+ id: z6.string(),
669
+ source: z6.enum(["plugin", "core"]),
670
+ label: z6.string(),
671
+ href: z6.string(),
659
672
  fields: z6.array(PluginReadinessFieldSchema)
660
673
  });
661
- var PluginReadinessResponseSchema = z6.object({
662
- issues: z6.array(PluginReadinessIssueSchema)
674
+ var ConfigReadinessResponseSchema = z6.object({
675
+ issues: z6.array(ConfigReadinessIssueSchema)
663
676
  });
664
677
 
665
678
  // src/contracts/admin/plugins.ts
@@ -797,11 +810,11 @@ var getPluginReadinessRoute = createRoute4({
797
810
  path: "/admin/plugins/readiness",
798
811
  tags: ["admin.plugins"],
799
812
  security: [{ bearerAuth: [] }],
800
- summary: "List active plugins missing required readiness config fields",
813
+ summary: "List active plugins and core config missing required readiness fields",
801
814
  responses: {
802
815
  200: {
803
- description: "Readiness issues for active plugins (empty when everything is configured)",
804
- content: { "application/json": { schema: PluginReadinessResponseSchema } }
816
+ description: "Readiness issues for active plugins and core config (empty when everything is configured)",
817
+ content: { "application/json": { schema: ConfigReadinessResponseSchema } }
805
818
  },
806
819
  401: {
807
820
  description: "Authentication required",
@@ -3518,6 +3531,19 @@ var UserProfileResponseSchema = z31.object({
3518
3531
  introduction: z31.string().optional(),
3519
3532
  hasPassword: z31.boolean(),
3520
3533
  createdAt: z31.string(),
3534
+ /**
3535
+ * True when the account has at least one linked federated identity
3536
+ * (`UserIdentity` row). The email address on a federated account is
3537
+ * fixed to the value the identity provider verified — `PUT /me`
3538
+ * refuses a change and returns `EMAIL_LOCKED_BY_FEDERATED_IDENTITY`
3539
+ * when this is true and a different email is submitted. The web uses
3540
+ * this to disable the email field and point to the Security tab.
3541
+ *
3542
+ * Always reflects the account's current state — on `GET /me` and on
3543
+ * every 200 from `PUT /me`, including a `PUT` that changed only name /
3544
+ * lang.
3545
+ */
3546
+ federated: z31.boolean(),
3521
3547
  /**
3522
3548
  * True when the profile update requested a new email that is awaiting
3523
3549
  * confirmation: the stored `email` is unchanged and a confirmation
@@ -5887,23 +5913,404 @@ var tokenAuthRoutes = {
5887
5913
  tokenMeRoute
5888
5914
  };
5889
5915
 
5916
+ // src/contracts/federated-auth.ts
5917
+ import { createRoute as createRoute29, z as z53 } from "@hono/zod-openapi";
5918
+
5919
+ // src/schemas/federated-auth.ts
5920
+ import { z as z52 } from "@hono/zod-openapi";
5921
+ var FederatedProviderSchema = z52.object({
5922
+ name: z52.string(),
5923
+ buttonLabel: z52.string(),
5924
+ iconUrl: z52.string().optional()
5925
+ });
5926
+ var ProviderListResponseSchema = z52.object({
5927
+ providers: z52.array(FederatedProviderSchema)
5928
+ });
5929
+ var SenderPublicJwkSchema = z52.object({
5930
+ kty: z52.literal("EC"),
5931
+ crv: z52.literal("P-256"),
5932
+ x: z52.string(),
5933
+ y: z52.string()
5934
+ });
5935
+ var SenderProofSchema = z52.object({
5936
+ publicJwk: SenderPublicJwkSchema,
5937
+ /** base64url ES256 signature over the canonical handoff message. */
5938
+ signature: z52.string()
5939
+ });
5940
+ var FederatedHandoffRequestSchema = z52.object({
5941
+ code: z52.string(),
5942
+ proof: SenderProofSchema
5943
+ });
5944
+ var FederatedHandoffResponseSchema = TokenAuthResponseSchema;
5945
+ var LinkedAuthProviderListResponseSchema = z52.object({
5946
+ identities: z52.array(z52.object({ provider: z52.string() }))
5947
+ });
5948
+ var CreateLinkGrantRequestSchema = z52.object({
5949
+ /** RFC 7638 thumbprint of the P-256 public key this browser will use at `/start` — binds the grant to this browser (AC-2). */
5950
+ handoffChallenge: z52.string().min(1)
5951
+ });
5952
+ var CreateLinkGrantResponseSchema = z52.object({
5953
+ linkGrant: z52.string()
5954
+ });
5955
+ var UnlinkAuthProviderErrorSchema = z52.object({
5956
+ error: z52.object({
5957
+ code: z52.enum(["FEDERATED_UNLINK_DISABLED", "PASSWORD_REQUIRED"]),
5958
+ message: z52.string()
5959
+ })
5960
+ });
5961
+
5962
+ // src/contracts/federated-auth.ts
5963
+ var ContinuePathSchema = z53.string().regex(/^\/(?!\/)[^\\\x00-\x1F\x7F]*$/, 'continue must be a local path starting with a single "/" and contain no backslash or control characters').max(2e3, "continue must be at most 2000 characters");
5964
+ var listFederatedProvidersRoute = createRoute29({
5965
+ method: "get",
5966
+ path: "/auth/providers",
5967
+ tags: ["federatedAuth"],
5968
+ summary: "List enabled OAuth2/OIDC federated sign-in providers",
5969
+ responses: {
5970
+ 200: {
5971
+ description: "Enabled providers, in name order",
5972
+ content: { "application/json": { schema: ProviderListResponseSchema } }
5973
+ },
5974
+ 500: {
5975
+ description: "Internal server error",
5976
+ content: { "application/json": { schema: InternalServerErrorSchema } }
5977
+ }
5978
+ }
5979
+ });
5980
+ var startFederatedProviderRoute = createRoute29({
5981
+ method: "get",
5982
+ path: "/auth/providers/{name}/start",
5983
+ tags: ["federatedAuth"],
5984
+ summary: "Top-level navigation that redirects the browser to the named provider",
5985
+ request: {
5986
+ params: z53.object({ name: z53.string() }),
5987
+ query: z53.object({
5988
+ continue: ContinuePathSchema,
5989
+ /** base64url(JSON) of the sender's P-256 public JWK. */
5990
+ handoff_jwk: z53.string().min(1),
5991
+ /** base64url ES256 signature over the start canonical message. */
5992
+ handoff_proof: z53.string().min(1),
5993
+ /**
5994
+ * RFC-0014 phase 3 — `'1'` switches this start into LINK mode: the
5995
+ * request must carry a web-session JWT, and the flow attaches the
5996
+ * resulting identity to that session's user instead of signing
5997
+ * anyone in. Absent (the ordinary sign-in start) the route stays
5998
+ * fully public.
5999
+ */
6000
+ link: z53.literal("1").optional(),
6001
+ /** The opaque id from `POST /auth/providers/{name}/link-grants`. Required when `link=1`, ignored otherwise. */
6002
+ link_grant: z53.string().min(1).optional()
6003
+ })
6004
+ },
6005
+ responses: {
6006
+ 302: { description: "Redirect to the provider authorization endpoint" },
6007
+ 400: {
6008
+ description: "Malformed continue / sender proof, or an invalid/expired/mismatched link grant",
6009
+ content: { "application/json": { schema: ApiErrorSchema } }
6010
+ },
6011
+ 401: {
6012
+ description: "link=1 without a web-session JWT \u2014 never downgraded to the public sign-in start",
6013
+ content: { "application/json": { schema: ApiErrorSchema } }
6014
+ },
6015
+ 403: {
6016
+ description: "link=1 with a non-web credential (PAT / OAuth access token)",
6017
+ content: { "application/json": { schema: ApiErrorSchema } }
6018
+ },
6019
+ 404: {
6020
+ description: "Unknown, unconfigured, or credential-kind provider",
6021
+ content: { "application/json": { schema: ApiErrorSchema } }
6022
+ },
6023
+ 500: {
6024
+ description: "Internal server error",
6025
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6026
+ }
6027
+ }
6028
+ });
6029
+ var listLinkedAuthProvidersRoute = createRoute29({
6030
+ method: "get",
6031
+ path: "/auth/providers/identities",
6032
+ tags: ["federatedAuth"],
6033
+ summary: "List the provider slugs the current user has linked",
6034
+ responses: {
6035
+ 200: {
6036
+ description: "Linked provider slugs, in name order",
6037
+ content: { "application/json": { schema: LinkedAuthProviderListResponseSchema } }
6038
+ },
6039
+ 401: {
6040
+ description: "Authentication required",
6041
+ content: { "application/json": { schema: AuthenticationRequiredErrorSchema } }
6042
+ },
6043
+ 500: {
6044
+ description: "Internal server error",
6045
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6046
+ }
6047
+ }
6048
+ });
6049
+ var createAuthProviderLinkGrantRoute = createRoute29({
6050
+ method: "post",
6051
+ path: "/auth/providers/{name}/link-grants",
6052
+ tags: ["federatedAuth"],
6053
+ summary: "Mint a short-lived, opaque grant that authorizes ONE link start for the current web session",
6054
+ request: {
6055
+ params: z53.object({ name: z53.string() }),
6056
+ body: { content: { "application/json": { schema: CreateLinkGrantRequestSchema } } }
6057
+ },
6058
+ responses: {
6059
+ 200: {
6060
+ description: "Opaque single-use grant id",
6061
+ content: { "application/json": { schema: CreateLinkGrantResponseSchema } }
6062
+ },
6063
+ 401: {
6064
+ description: "Authentication required",
6065
+ content: { "application/json": { schema: AuthenticationRequiredErrorSchema } }
6066
+ },
6067
+ 403: {
6068
+ description: "Non-web credential (PAT / OAuth access token)",
6069
+ content: { "application/json": { schema: ApiErrorSchema } }
6070
+ },
6071
+ 404: {
6072
+ description: "Unknown, unconfigured, or credential-kind provider",
6073
+ content: { "application/json": { schema: ApiErrorSchema } }
6074
+ },
6075
+ 500: {
6076
+ description: "Internal server error",
6077
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6078
+ }
6079
+ }
6080
+ });
6081
+ var unlinkAuthProviderRoute = createRoute29({
6082
+ method: "delete",
6083
+ path: "/auth/providers/{name}/identity",
6084
+ tags: ["federatedAuth"],
6085
+ summary: "Disconnect the current user's identity for this provider",
6086
+ request: {
6087
+ params: z53.object({ name: z53.string() })
6088
+ },
6089
+ responses: {
6090
+ 204: { description: "Identity removed" },
6091
+ 401: {
6092
+ description: "Authentication required",
6093
+ content: { "application/json": { schema: AuthenticationRequiredErrorSchema } }
6094
+ },
6095
+ 403: {
6096
+ description: "Non-web credential (PAT / OAuth access token)",
6097
+ content: { "application/json": { schema: ApiErrorSchema } }
6098
+ },
6099
+ 404: {
6100
+ description: "No identity linked for this provider",
6101
+ content: { "application/json": { schema: ApiErrorSchema } }
6102
+ },
6103
+ 409: {
6104
+ description: "Refused: password auth is disabled instance-wide, or this user has no password set",
6105
+ content: { "application/json": { schema: UnlinkAuthProviderErrorSchema } }
6106
+ },
6107
+ 500: {
6108
+ description: "Internal server error",
6109
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6110
+ }
6111
+ }
6112
+ });
6113
+ var callbackFederatedProviderRoute = createRoute29({
6114
+ method: "get",
6115
+ path: "/auth/providers/{name}/callback",
6116
+ tags: ["federatedAuth"],
6117
+ summary: "Provider redirect target; completes the OAuth2/OIDC exchange",
6118
+ request: {
6119
+ params: z53.object({ name: z53.string() }),
6120
+ query: z53.object({
6121
+ code: z53.string().optional(),
6122
+ state: z53.string().optional(),
6123
+ error: z53.string().optional()
6124
+ })
6125
+ },
6126
+ responses: {
6127
+ 302: {
6128
+ description: "Redirect to the trusted web login/complete page on success, or back to the trusted web /login on failure"
6129
+ },
6130
+ 404: {
6131
+ description: "Unknown or unconfigured provider (also used when trusted origins cannot be resolved)",
6132
+ content: { "application/json": { schema: ApiErrorSchema } }
6133
+ },
6134
+ 500: {
6135
+ description: "Internal server error",
6136
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6137
+ }
6138
+ }
6139
+ });
6140
+ var federatedHandoffRoute = createRoute29({
6141
+ method: "post",
6142
+ path: "/auth/handoff",
6143
+ tags: ["federatedAuth"],
6144
+ summary: "Exchange a sender-constrained federated handoff code for session tokens",
6145
+ request: {
6146
+ body: { content: { "application/json": { schema: FederatedHandoffRequestSchema } } }
6147
+ },
6148
+ responses: {
6149
+ 200: {
6150
+ description: "Session tokens \u2014 same shape as POST /auth/login",
6151
+ content: { "application/json": { schema: FederatedHandoffResponseSchema } }
6152
+ },
6153
+ 401: {
6154
+ description: "Invalid / expired handoff code, or sender proof did not verify",
6155
+ content: { "application/json": { schema: ApiErrorSchema } }
6156
+ },
6157
+ 409: {
6158
+ description: "Handoff code already consumed",
6159
+ content: { "application/json": { schema: ApiErrorSchema } }
6160
+ },
6161
+ 500: {
6162
+ description: "Internal server error",
6163
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6164
+ }
6165
+ }
6166
+ });
6167
+ var federatedAuthRoutes = {
6168
+ listFederatedProvidersRoute,
6169
+ startFederatedProviderRoute,
6170
+ callbackFederatedProviderRoute,
6171
+ federatedHandoffRoute,
6172
+ listLinkedAuthProvidersRoute,
6173
+ createAuthProviderLinkGrantRoute,
6174
+ unlinkAuthProviderRoute
6175
+ };
6176
+
6177
+ // src/contracts/federated-registration.ts
6178
+ import { createRoute as createRoute30, z as z55 } from "@hono/zod-openapi";
6179
+
6180
+ // src/schemas/federated-registration.ts
6181
+ import { z as z54 } from "@hono/zod-openapi";
6182
+ var FederatedRegistrationSnapshotSchema = z54.object({
6183
+ /** IdP-verified email, prefilled read-only on the registration screen. */
6184
+ email: z54.string().email(),
6185
+ /** Driver slug, e.g. `'google'`. */
6186
+ provider: z54.string(),
6187
+ /** Human-friendly provider name (the driver's `buttonLabel`), e.g. `'Google'`. */
6188
+ providerLabel: z54.string(),
6189
+ /**
6190
+ * This grant's registration has already been submitted and is waiting
6191
+ * for an administrator (Restricted mode). The screen must show that
6192
+ * state instead of the username form.
6193
+ *
6194
+ * Deliberately narrow: it is not a general status field, and it never
6195
+ * distinguishes unknown / expired / cancelled / completed grants (those
6196
+ * are all the same 404 — AC-2). It exists because a submitted
6197
+ * registration is still readable by its own grant, and re-offering an
6198
+ * editable username there invites a change that cannot be applied — the
6199
+ * second submit is refused and the typed value silently discarded.
6200
+ */
6201
+ approvalPending: z54.boolean()
6202
+ });
6203
+ var FederatedRegistrationSubmitRequestSchema = z54.object({
6204
+ username: UsernameSchema
6205
+ });
6206
+ var FederatedRegistrationActiveResultSchema = z54.object({
6207
+ status: z54.literal("active"),
6208
+ code: z54.string()
6209
+ });
6210
+ var FederatedRegistrationApprovalResultSchema = z54.object({
6211
+ status: z54.literal("approval_required")
6212
+ });
6213
+ var FederatedRegistrationResultSchema = z54.discriminatedUnion("status", [
6214
+ FederatedRegistrationActiveResultSchema,
6215
+ FederatedRegistrationApprovalResultSchema
6216
+ ]);
6217
+
6218
+ // src/contracts/federated-registration.ts
6219
+ var TokenParamSchema = z55.object({ token: z55.string().min(1) });
6220
+ var getFederatedRegistrationRoute = createRoute30({
6221
+ method: "get",
6222
+ path: "/auth/federated-registration/{token}",
6223
+ tags: ["federatedRegistration"],
6224
+ summary: "Read-only snapshot (email/provider/providerLabel) for a pending federated registration",
6225
+ request: {
6226
+ params: TokenParamSchema
6227
+ },
6228
+ responses: {
6229
+ 200: {
6230
+ description: "Pending registration snapshot",
6231
+ content: { "application/json": { schema: FederatedRegistrationSnapshotSchema } }
6232
+ },
6233
+ 404: {
6234
+ description: "Grant is unknown, expired, or cancelled",
6235
+ content: { "application/json": { schema: ApiErrorSchema } }
6236
+ },
6237
+ 500: {
6238
+ description: "Internal server error",
6239
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6240
+ }
6241
+ }
6242
+ });
6243
+ var submitFederatedRegistrationRoute = createRoute30({
6244
+ method: "post",
6245
+ path: "/auth/federated-registration/{token}",
6246
+ tags: ["federatedRegistration"],
6247
+ summary: "Submit the chosen username; provisions the User (JIT) and activates or queues approval",
6248
+ request: {
6249
+ params: TokenParamSchema,
6250
+ body: { content: { "application/json": { schema: FederatedRegistrationSubmitRequestSchema } } }
6251
+ },
6252
+ responses: {
6253
+ 200: {
6254
+ description: "Open: account is active \u2014 a Phase 1 handoff code, redeemed via POST /auth/handoff. Restricted: awaiting admin approval.",
6255
+ content: { "application/json": { schema: FederatedRegistrationResultSchema } }
6256
+ },
6257
+ 400: {
6258
+ description: "Username fails the shared username contract",
6259
+ content: { "application/json": { schema: ApiErrorSchema } }
6260
+ },
6261
+ 404: {
6262
+ description: "Grant is unknown, expired, or cancelled",
6263
+ content: { "application/json": { schema: ApiErrorSchema } }
6264
+ },
6265
+ 409: {
6266
+ description: "Username/email already taken, or the identity is already linked to a different user",
6267
+ content: { "application/json": { schema: ApiErrorSchema } }
6268
+ },
6269
+ 500: {
6270
+ description: "Internal server error",
6271
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6272
+ }
6273
+ }
6274
+ });
6275
+ var logoutFederatedRegistrationRoute = createRoute30({
6276
+ method: "post",
6277
+ path: "/auth/federated-registration/{token}/logout",
6278
+ tags: ["federatedRegistration"],
6279
+ summary: "Cancel a pending federated registration and invalidate the grant",
6280
+ request: {
6281
+ params: TokenParamSchema
6282
+ },
6283
+ responses: {
6284
+ 204: { description: "Grant cancelled (or was already inactive) \u2014 idempotent" },
6285
+ 500: {
6286
+ description: "Internal server error",
6287
+ content: { "application/json": { schema: InternalServerErrorSchema } }
6288
+ }
6289
+ }
6290
+ });
6291
+ var federatedRegistrationRoutes = {
6292
+ getFederatedRegistrationRoute,
6293
+ submitFederatedRegistrationRoute,
6294
+ logoutFederatedRegistrationRoute
6295
+ };
6296
+
5890
6297
  // src/contracts/invite-accept.ts
5891
- import { createRoute as createRoute29 } from "@hono/zod-openapi";
6298
+ import { createRoute as createRoute31 } from "@hono/zod-openapi";
5892
6299
 
5893
6300
  // src/schemas/invite-accept.ts
5894
- import { z as z52 } from "@hono/zod-openapi";
5895
- var InviteAcceptRequestSchema = z52.object({
5896
- token: z52.string(),
6301
+ import { z as z56 } from "@hono/zod-openapi";
6302
+ var InviteAcceptRequestSchema = z56.object({
6303
+ token: z56.string(),
5897
6304
  username: UsernameSchema,
5898
- name: z52.string().min(1),
5899
- password: z52.string().min(6)
6305
+ name: z56.string().min(1),
6306
+ password: z56.string().min(6)
5900
6307
  });
5901
- var InvitePreviewResponseSchema = z52.object({
5902
- email: z52.string().email()
6308
+ var InvitePreviewResponseSchema = z56.object({
6309
+ email: z56.string().email()
5903
6310
  });
5904
6311
 
5905
6312
  // src/contracts/invite-accept.ts
5906
- var invitePreviewRoute = createRoute29({
6313
+ var invitePreviewRoute = createRoute31({
5907
6314
  method: "get",
5908
6315
  path: "/invite/accept",
5909
6316
  tags: ["inviteAccept"],
@@ -5930,7 +6337,7 @@ var invitePreviewRoute = createRoute29({
5930
6337
  }
5931
6338
  }
5932
6339
  });
5933
- var acceptInviteRoute = createRoute29({
6340
+ var acceptInviteRoute = createRoute31({
5934
6341
  method: "post",
5935
6342
  path: "/invite/accept",
5936
6343
  tags: ["inviteAccept"],
@@ -5973,23 +6380,23 @@ var inviteAcceptRoutes = {
5973
6380
  };
5974
6381
 
5975
6382
  // src/contracts/password-reset.ts
5976
- import { createRoute as createRoute30 } from "@hono/zod-openapi";
6383
+ import { createRoute as createRoute32 } from "@hono/zod-openapi";
5977
6384
 
5978
6385
  // src/schemas/password-reset.ts
5979
- import { z as z53 } from "@hono/zod-openapi";
5980
- var ForgotPasswordRequestSchema = z53.object({
5981
- email: z53.string().email()
6386
+ import { z as z57 } from "@hono/zod-openapi";
6387
+ var ForgotPasswordRequestSchema = z57.object({
6388
+ email: z57.string().email()
5982
6389
  });
5983
- var ForgotPasswordResponseSchema = z53.object({
5984
- ok: z53.literal(true)
6390
+ var ForgotPasswordResponseSchema = z57.object({
6391
+ ok: z57.literal(true)
5985
6392
  });
5986
- var ResetPasswordRequestSchema = z53.object({
5987
- token: z53.string(),
5988
- password: z53.string().min(6)
6393
+ var ResetPasswordRequestSchema = z57.object({
6394
+ token: z57.string(),
6395
+ password: z57.string().min(6)
5989
6396
  });
5990
6397
 
5991
6398
  // src/contracts/password-reset.ts
5992
- var forgotPasswordRoute = createRoute30({
6399
+ var forgotPasswordRoute = createRoute32({
5993
6400
  method: "post",
5994
6401
  path: "/auth/forgot-password",
5995
6402
  tags: ["passwordReset"],
@@ -6014,7 +6421,7 @@ var forgotPasswordRoute = createRoute30({
6014
6421
  }
6015
6422
  }
6016
6423
  });
6017
- var validateResetTokenRoute = createRoute30({
6424
+ var validateResetTokenRoute = createRoute32({
6018
6425
  method: "get",
6019
6426
  path: "/auth/reset-password",
6020
6427
  tags: ["passwordReset"],
@@ -6037,7 +6444,7 @@ var validateResetTokenRoute = createRoute30({
6037
6444
  }
6038
6445
  }
6039
6446
  });
6040
- var selfResetPasswordRoute = createRoute30({
6447
+ var selfResetPasswordRoute = createRoute32({
6041
6448
  method: "post",
6042
6449
  path: "/auth/reset-password",
6043
6450
  tags: ["passwordReset"],
@@ -6077,19 +6484,19 @@ var passwordResetRoutes = {
6077
6484
  };
6078
6485
 
6079
6486
  // src/contracts/activation.ts
6080
- import { createRoute as createRoute31 } from "@hono/zod-openapi";
6487
+ import { createRoute as createRoute33 } from "@hono/zod-openapi";
6081
6488
 
6082
6489
  // src/schemas/activation.ts
6083
- import { z as z54 } from "@hono/zod-openapi";
6084
- var ActivateRequestSchema = z54.object({
6085
- token: z54.string()
6490
+ import { z as z58 } from "@hono/zod-openapi";
6491
+ var ActivateRequestSchema = z58.object({
6492
+ token: z58.string()
6086
6493
  });
6087
- var ActivateValidationResponseSchema = z54.object({
6088
- ok: z54.literal(true)
6494
+ var ActivateValidationResponseSchema = z58.object({
6495
+ ok: z58.literal(true)
6089
6496
  });
6090
6497
 
6091
6498
  // src/contracts/activation.ts
6092
- var validateActivationTokenRoute = createRoute31({
6499
+ var validateActivationTokenRoute = createRoute33({
6093
6500
  method: "get",
6094
6501
  path: "/auth/activate",
6095
6502
  tags: ["activation"],
@@ -6112,7 +6519,7 @@ var validateActivationTokenRoute = createRoute31({
6112
6519
  }
6113
6520
  }
6114
6521
  });
6115
- var activateAccountRoute = createRoute31({
6522
+ var activateAccountRoute = createRoute33({
6116
6523
  method: "post",
6117
6524
  path: "/auth/activate",
6118
6525
  tags: ["activation"],
@@ -6147,21 +6554,21 @@ var activationRoutes = {
6147
6554
  };
6148
6555
 
6149
6556
  // src/contracts/email-change.ts
6150
- import { createRoute as createRoute32 } from "@hono/zod-openapi";
6557
+ import { createRoute as createRoute34 } from "@hono/zod-openapi";
6151
6558
 
6152
6559
  // src/schemas/email-change.ts
6153
- import { z as z55 } from "@hono/zod-openapi";
6154
- var ConfirmEmailChangeRequestSchema = z55.object({
6155
- token: z55.string()
6560
+ import { z as z59 } from "@hono/zod-openapi";
6561
+ var ConfirmEmailChangeRequestSchema = z59.object({
6562
+ token: z59.string()
6156
6563
  });
6157
- var ConfirmEmailChangeResponseSchema = z55.object({
6158
- ok: z55.literal(true),
6564
+ var ConfirmEmailChangeResponseSchema = z59.object({
6565
+ ok: z59.literal(true),
6159
6566
  /** The newly-confirmed email address. */
6160
- email: z55.string().email()
6567
+ email: z59.string().email()
6161
6568
  });
6162
6569
 
6163
6570
  // src/contracts/email-change.ts
6164
- var validateEmailChangeTokenRoute = createRoute32({
6571
+ var validateEmailChangeTokenRoute = createRoute34({
6165
6572
  method: "get",
6166
6573
  path: "/auth/confirm-email-change",
6167
6574
  tags: ["emailChange"],
@@ -6184,7 +6591,7 @@ var validateEmailChangeTokenRoute = createRoute32({
6184
6591
  }
6185
6592
  }
6186
6593
  });
6187
- var confirmEmailChangeRoute = createRoute32({
6594
+ var confirmEmailChangeRoute = createRoute34({
6188
6595
  method: "post",
6189
6596
  path: "/auth/confirm-email-change",
6190
6597
  tags: ["emailChange"],
@@ -6223,9 +6630,9 @@ var emailChangeRoutes = {
6223
6630
  };
6224
6631
 
6225
6632
  // src/contracts/user.ts
6226
- import { createRoute as createRoute33, z as z56 } from "@hono/zod-openapi";
6227
- var UsernameParamSchema = z56.object({ username: z56.string() });
6228
- var getUserPageRoute = createRoute33({
6633
+ import { createRoute as createRoute35, z as z60 } from "@hono/zod-openapi";
6634
+ var UsernameParamSchema = z60.object({ username: z60.string() });
6635
+ var getUserPageRoute = createRoute35({
6229
6636
  method: "get",
6230
6637
  path: "/user/{username}",
6231
6638
  tags: ["user"],
@@ -6253,7 +6660,7 @@ var getUserPageRoute = createRoute33({
6253
6660
  }
6254
6661
  }
6255
6662
  });
6256
- var getUserBookmarksRoute = createRoute33({
6663
+ var getUserBookmarksRoute = createRoute35({
6257
6664
  method: "get",
6258
6665
  path: "/user/{username}/bookmarks",
6259
6666
  tags: ["user"],
@@ -6282,7 +6689,7 @@ var getUserBookmarksRoute = createRoute33({
6282
6689
  }
6283
6690
  }
6284
6691
  });
6285
- var getUserPagesRoute = createRoute33({
6692
+ var getUserPagesRoute = createRoute35({
6286
6693
  method: "get",
6287
6694
  path: "/user/{username}/pages",
6288
6695
  tags: ["user"],
@@ -6311,7 +6718,7 @@ var getUserPagesRoute = createRoute33({
6311
6718
  }
6312
6719
  }
6313
6720
  });
6314
- var getUserSubpagesRoute = createRoute33({
6721
+ var getUserSubpagesRoute = createRoute35({
6315
6722
  method: "get",
6316
6723
  path: "/user/{username}/subpages",
6317
6724
  tags: ["user"],
@@ -6348,7 +6755,7 @@ var getUserSubpagesRoute = createRoute33({
6348
6755
  }
6349
6756
  }
6350
6757
  });
6351
- var listMembersRoute = createRoute33({
6758
+ var listMembersRoute = createRoute35({
6352
6759
  method: "get",
6353
6760
  path: "/users",
6354
6761
  tags: ["user"],
@@ -6394,6 +6801,13 @@ var stubTokens = {
6394
6801
  expiresIn: 0,
6395
6802
  user: stubUser
6396
6803
  };
6804
+ var stubProviderList = { providers: [] };
6805
+ var stubFederatedRegistrationSnapshot = {
6806
+ email: "stub@example.com",
6807
+ provider: "",
6808
+ providerLabel: "",
6809
+ approvalPending: false
6810
+ };
6397
6811
  var stubProfile = {
6398
6812
  id: "",
6399
6813
  username: "",
@@ -6403,7 +6817,8 @@ var stubProfile = {
6403
6817
  theme: "system",
6404
6818
  image: null,
6405
6819
  hasPassword: false,
6406
- createdAt: ""
6820
+ createdAt: "",
6821
+ federated: false
6407
6822
  };
6408
6823
  var stubAccessToken = {
6409
6824
  id: "",
@@ -6684,25 +7099,27 @@ var lateContractApp = new OpenAPIHono().openapi(draftRoutes.createDraftRoute, (c
6684
7099
  var adminSettingsContractApp = new OpenAPIHono().openapi(adminAppRoutes.getAppSettingsRoute, (c) => c.json(stubGetAppSettings, 200)).openapi(adminAppRoutes.updateAppSettingsRoute, (c) => c.json(stubUpdateAppSettings, 200)).openapi(adminAuthRoutes.getAuthSettingsRoute, (c) => c.json(stubAuthSettings, 200)).openapi(adminAuthRoutes.updateAuthSettingsRoute, (c) => c.json(stubAuthSettings, 200)).openapi(adminSecurityRoutes.getSecuritySettingsRoute, (c) => c.json(stubSecuritySettings, 200)).openapi(adminSecurityRoutes.updateSecuritySettingsRoute, (c) => c.json(stubSecuritySettings, 200)).openapi(adminMailRoutes.getMailSettingsRoute, (c) => c.json(stubMailSettings, 200)).openapi(adminMailRoutes.updateMailSettingsRoute, (c) => c.json(stubUpdateMailSettings, 200)).openapi(adminMailRoutes.sendTestMailRoute, (c) => c.json(stubSendTestMail, 200)).openapi(adminStorageRoutes.getStorageStatusRoute, (c) => c.json(stubStorageStatus, 200)).openapi(adminSearchRoutes.getSearchStatusRoute, (c) => c.json(stubSearchStatus, 200));
6685
7100
  var adminUsersPluginsContractApp = new OpenAPIHono().openapi(adminUsersRoutes.listUsersRoute, (c) => c.json(stubListAdminUsers, 200)).openapi(adminUsersRoutes.searchUsersByEmailRoute, (c) => c.json(stubSearchAdminUsersByEmail, 200)).openapi(adminUsersRoutes.pendingUsersCountRoute, (c) => c.json(stubPendingUsersCount, 200)).openapi(adminUsersRoutes.inviteUsersRoute, (c) => c.json(stubInviteUsers, 200)).openapi(adminUsersRoutes.editUserRoute, (c) => c.json(stubAdminUserMutation, 200)).openapi(adminUsersRoutes.makeAdminRoute, (c) => c.json(stubAdminUserMutation, 200)).openapi(adminUsersRoutes.removeFromAdminRoute, (c) => c.json(stubAdminUserMutation, 200)).openapi(adminUsersRoutes.activateUserRoute, (c) => c.json(stubAdminUserMutation, 200)).openapi(adminUsersRoutes.suspendUserRoute, (c) => c.json(stubAdminUserMutation, 200)).openapi(adminUsersRoutes.resetPasswordRoute, (c) => c.json(stubResetPassword, 200)).openapi(adminUsersRoutes.resendInviteRoute, (c) => c.json(stubAdminUserMutation, 200)).openapi(adminUsersRoutes.updateUserEmailRoute, (c) => c.json(stubAdminUserMutation, 200)).openapi(adminUsersRoutes.deleteUserRoute, (c) => c.json(stubDeleteAdminUser, 200)).openapi(adminPluginsRoutes.listPluginsRoute, (c) => c.json(stubListPlugins, 200)).openapi(adminPluginsRoutes.getPluginConfigRoute, (c) => c.json(stubPluginConfig, 200)).openapi(adminPluginsRoutes.updatePluginConfigRoute, (c) => c.json(stubUpdatePluginConfig, 200)).openapi(adminPluginsRoutes.getPluginReadinessRoute, (c) => c.json(stubPluginReadiness, 200)).openapi(adminPluginsRoutes.clearRenderCacheAllRoute, (c) => c.json(stubClearRenderCache, 200)).openapi(adminPluginsRoutes.clearRenderCachePluginRoute, (c) => c.json(stubClearRenderCache, 200));
6686
7101
  var oauthContractApp = new OpenAPIHono().openapi(oauthRoutes.authorizeRoute, (c) => c.json(stubAuthorize, 200)).openapi(oauthRoutes.tokenRoute, (c) => c.json(stubToken, 200)).openapi(oauthRoutes.revokeRoute, (c) => c.json(stubRevoke, 200)).openapi(oauthRoutes.discoveryRoute, (c) => c.json(stubDiscovery, 200)).openapi(oauthRoutes.deviceAuthorizeRoute, (c) => c.json(stubDeviceAuthorize, 200)).openapi(oauthRoutes.deviceInfoRoute, (c) => c.json(stubDeviceInfo, 200)).openapi(oauthRoutes.deviceVerifyRoute, (c) => c.json(stubDeviceVerify, 200)).openapi(oauthRoutes.clientInfoRoute, (c) => c.json(stubClientInfo, 200));
7102
+ var federatedAuthContractApp = new OpenAPIHono().openapi(federatedAuthRoutes.listFederatedProvidersRoute, (c) => c.json(stubProviderList, 200)).openapi(federatedAuthRoutes.startFederatedProviderRoute, (c) => c.redirect("", 302)).openapi(federatedAuthRoutes.callbackFederatedProviderRoute, (c) => c.redirect("", 302)).openapi(federatedAuthRoutes.federatedHandoffRoute, (c) => c.json(stubTokens, 200)).openapi(federatedAuthRoutes.listLinkedAuthProvidersRoute, (c) => c.json({ identities: [] }, 200)).openapi(federatedAuthRoutes.createAuthProviderLinkGrantRoute, (c) => c.json({ linkGrant: "" }, 200)).openapi(federatedAuthRoutes.unlinkAuthProviderRoute, (c) => c.body(null, 204));
7103
+ var federatedRegistrationContractApp = new OpenAPIHono().openapi(federatedRegistrationRoutes.getFederatedRegistrationRoute, (c) => c.json(stubFederatedRegistrationSnapshot, 200)).openapi(federatedRegistrationRoutes.submitFederatedRegistrationRoute, (c) => c.json({ status: "approval_required" }, 200)).openapi(federatedRegistrationRoutes.logoutFederatedRegistrationRoute, (c) => c.body(null, 204));
6687
7104
  var createClient = (baseUrl, options = {}) => hc(baseUrl, {
6688
7105
  headers: options.headers,
6689
7106
  fetch: options.fetch
6690
7107
  });
6691
7108
 
6692
7109
  // src/schemas/mail-token.ts
6693
- import { z as z57 } from "@hono/zod-openapi";
6694
- var MailTokenPurposeSchema = z57.enum(["invite", "activate", "reset", "email-change"]);
6695
- var MailTokenPayloadSchema = z57.object({
7110
+ import { z as z61 } from "@hono/zod-openapi";
7111
+ var MailTokenPurposeSchema = z61.enum(["invite", "activate", "reset", "email-change"]);
7112
+ var MailTokenPayloadSchema = z61.object({
6696
7113
  purpose: MailTokenPurposeSchema,
6697
- userId: z57.string(),
7114
+ userId: z61.string(),
6698
7115
  /** Target address. For `email-change` this is the NEW address. */
6699
- email: z57.string().email(),
7116
+ email: z61.string().email(),
6700
7117
  /**
6701
7118
  * For `email-change`: the account's email at issue time. The confirm
6702
7119
  * endpoint rejects the token unless it still matches, making the token
6703
7120
  * single-use (a stale token cannot revert a later change).
6704
7121
  */
6705
- fromEmail: z57.string().email().optional(),
7122
+ fromEmail: z61.string().email().optional(),
6706
7123
  /**
6707
7124
  * For `reset`: the account's `passwordResetGeneration` at issue time.
6708
7125
  * Consuming the link increments that counter, so the token only matches
@@ -6711,7 +7128,7 @@ var MailTokenPayloadSchema = z57.object({
6711
7128
  * schema because the other purposes don't carry it (and links minted
6712
7129
  * before the claim existed simply no longer match).
6713
7130
  */
6714
- resetGeneration: z57.number().int().nonnegative().optional(),
7131
+ resetGeneration: z61.number().int().nonnegative().optional(),
6715
7132
  /**
6716
7133
  * For `email-change`: the account's `authVersion` at issue time. The
6717
7134
  * confirm endpoint requires it to still match, so a pending address change
@@ -6723,7 +7140,7 @@ var MailTokenPayloadSchema = z57.object({
6723
7140
  * semantics wanted are exactly "the session that asked for this is gone",
6724
7141
  * and that is what every bump of it already means.
6725
7142
  */
6726
- authVersion: z57.number().int().nonnegative().optional(),
7143
+ authVersion: z61.number().int().nonnegative().optional(),
6727
7144
  /**
6728
7145
  * For `email-change`: the account's `emailChangeGeneration` at issue time.
6729
7146
  * Requesting a change increments it, so asking for a different address
@@ -6735,10 +7152,10 @@ var MailTokenPayloadSchema = z57.object({
6735
7152
  * Optional in the schema for the same reason as the others — links minted
6736
7153
  * before the claim existed simply no longer match.
6737
7154
  */
6738
- emailChangeGeneration: z57.number().int().nonnegative().optional(),
7155
+ emailChangeGeneration: z61.number().int().nonnegative().optional(),
6739
7156
  // iat / exp are injected and verified by the JWT layer.
6740
- iat: z57.number().optional(),
6741
- exp: z57.number().optional()
7157
+ iat: z61.number().optional(),
7158
+ exp: z61.number().optional()
6742
7159
  });
6743
7160
 
6744
7161
  // src/util/html-elements.ts
@@ -6953,6 +7370,8 @@ export {
6953
7370
  CommentInvalidRequestErrorSchema,
6954
7371
  CommentNotFoundErrorSchema,
6955
7372
  CommentSchema,
7373
+ ConfigReadinessIssueSchema,
7374
+ ConfigReadinessResponseSchema,
6956
7375
  ConfirmEmailChangeRequestSchema,
6957
7376
  ConfirmEmailChangeResponseSchema,
6958
7377
  ConflictErrorSchema,
@@ -6963,6 +7382,8 @@ export {
6963
7382
  CreateAdminResponseSchema,
6964
7383
  CreateDraftRequestSchema,
6965
7384
  CreateDraftResponseSchema,
7385
+ CreateLinkGrantRequestSchema,
7386
+ CreateLinkGrantResponseSchema,
6966
7387
  CreatePageRequestSchema,
6967
7388
  CrowiCodeSidecarSchema,
6968
7389
  CrowiDiagramNodeSchema,
@@ -6998,6 +7419,14 @@ export {
6998
7419
  EditAdminUserRequestSchema,
6999
7420
  EncryptionNotConfiguredErrorSchema,
7000
7421
  ErrorCodeSchema,
7422
+ FederatedHandoffRequestSchema,
7423
+ FederatedHandoffResponseSchema,
7424
+ FederatedProviderSchema,
7425
+ FederatedRegistrationActiveResultSchema,
7426
+ FederatedRegistrationApprovalResultSchema,
7427
+ FederatedRegistrationResultSchema,
7428
+ FederatedRegistrationSnapshotSchema,
7429
+ FederatedRegistrationSubmitRequestSchema,
7001
7430
  ForbiddenErrorSchema,
7002
7431
  ForgotPasswordRequestSchema,
7003
7432
  ForgotPasswordResponseSchema,
@@ -7039,6 +7468,7 @@ export {
7039
7468
  LanguageSchema,
7040
7469
  LikerSchema,
7041
7470
  LikersResponseSchema,
7471
+ LinkedAuthProviderListResponseSchema,
7042
7472
  ListAccessTokensResponseSchema,
7043
7473
  ListAdminUsersRequestSchema,
7044
7474
  ListAdminUsersResponseSchema,
@@ -7111,8 +7541,6 @@ export {
7111
7541
  PluginInfoSchema,
7112
7542
  PluginNotFoundErrorSchema,
7113
7543
  PluginReadinessFieldSchema,
7114
- PluginReadinessIssueSchema,
7115
- PluginReadinessResponseSchema,
7116
7544
  PresenceClientMessageSchema,
7117
7545
  PresenceCommentChangedMessageSchema,
7118
7546
  PresenceHeartbeatMessageSchema,
@@ -7125,6 +7553,7 @@ export {
7125
7553
  PreviewPageRequestSchema,
7126
7554
  PreviewPageResponseSchema,
7127
7555
  ProfileErrorResponseSchema,
7556
+ ProviderListResponseSchema,
7128
7557
  RENDERED_AST_NODE_DEFS,
7129
7558
  RecentlyViewedPagesResponseSchema,
7130
7559
  ReencryptResponseSchema,
@@ -7173,6 +7602,8 @@ export {
7173
7602
  SendTestMailErrorSchema,
7174
7603
  SendTestMailRequestSchema,
7175
7604
  SendTestMailResponseSchema,
7605
+ SenderProofSchema,
7606
+ SenderPublicJwkSchema,
7176
7607
  SensitiveConfigEntrySchema,
7177
7608
  ServiceUnavailableErrorSchema,
7178
7609
  SetPageGrantRequestSchema,
@@ -7193,6 +7624,7 @@ export {
7193
7624
  TokenRequestSchema,
7194
7625
  TokenResponseSchema,
7195
7626
  UPLOAD_ALLOWED_MIME,
7627
+ UnlinkAuthProviderErrorSchema,
7196
7628
  UpdateAdminUserEmailRequestSchema,
7197
7629
  UpdateAppSettingsRequestSchema,
7198
7630
  UpdateAppSettingsResponseSchema,
@@ -7256,6 +7688,7 @@ export {
7256
7688
  autocompleteUsersRoute,
7257
7689
  backlinkRoutes,
7258
7690
  bookmarkRoutes,
7691
+ callbackFederatedProviderRoute,
7259
7692
  cancelDraftRoute,
7260
7693
  claimPageLinkAccessRoute,
7261
7694
  clearRenderCacheAllRoute,
@@ -7265,6 +7698,7 @@ export {
7265
7698
  confirmEmailChangeRoute,
7266
7699
  createAccessTokenRoute,
7267
7700
  createAdminRoute,
7701
+ createAuthProviderLinkGrantRoute,
7268
7702
  createClient,
7269
7703
  createDraftRoute,
7270
7704
  createPageRoute,
@@ -7280,6 +7714,9 @@ export {
7280
7714
  draftRoutes,
7281
7715
  editUserRoute,
7282
7716
  emailChangeRoutes,
7717
+ federatedAuthRoutes,
7718
+ federatedHandoffRoute,
7719
+ federatedRegistrationRoutes,
7283
7720
  forgotPasswordRoute,
7284
7721
  getAppInfoRoute,
7285
7722
  getAppSettingsRoute,
@@ -7289,6 +7726,7 @@ export {
7289
7726
  getBacklinksRoute,
7290
7727
  getBookmarkRoute,
7291
7728
  getCryptoStatusRoute,
7729
+ getFederatedRegistrationRoute,
7292
7730
  getInstallerStatusRoute,
7293
7731
  getLikersRoute,
7294
7732
  getMailSettingsRoute,
@@ -7322,6 +7760,8 @@ export {
7322
7760
  listAttachmentsRoute,
7323
7761
  listCommentsRoute,
7324
7762
  listDraftsRoute,
7763
+ listFederatedProvidersRoute,
7764
+ listLinkedAuthProvidersRoute,
7325
7765
  listMembersRoute,
7326
7766
  listMyBookmarksRoute,
7327
7767
  listNotificationsRoute,
@@ -7330,6 +7770,7 @@ export {
7330
7770
  listPluginsRoute,
7331
7771
  listRevisionsRoute,
7332
7772
  listUsersRoute,
7773
+ logoutFederatedRegistrationRoute,
7333
7774
  makeAdminRoute,
7334
7775
  markAllAsReadRoute,
7335
7776
  meRoutes,
@@ -7366,7 +7807,9 @@ export {
7366
7807
  sendTestMailRoute,
7367
7808
  setPageGrantRoute,
7368
7809
  setWatchStatusRoute,
7810
+ startFederatedProviderRoute,
7369
7811
  stripKnownHtmlTags,
7812
+ submitFederatedRegistrationRoute,
7370
7813
  suspendUserRoute,
7371
7814
  tokenAuthRoutes,
7372
7815
  tokenLoginRoute,
@@ -7376,6 +7819,7 @@ export {
7376
7819
  tokenRegisterRoute,
7377
7820
  tokenRoute,
7378
7821
  unlikePageRoute,
7822
+ unlinkAuthProviderRoute,
7379
7823
  unwrapRenderedAst,
7380
7824
  updateAppSettingsRoute,
7381
7825
  updateAuthSettingsRoute,