@camstack/addon-auth 1.2.148 → 1.2.150

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.
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-C2ZA1nlf.js");
5
+ const require_dist = require("../dist-Cfzg2F5r.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  node_crypto = require_dist.__toESM(node_crypto);
8
8
  //#region ../../node_modules/jose/dist/webapi/lib/buffer_utils.js
@@ -886,6 +886,90 @@ function clientSecretPatchOf(value) {
886
886
  return { clientSecret: value };
887
887
  }
888
888
  //#endregion
889
+ //#region src/oidc/oidc-provider-record-kinds.ts
890
+ var OIDC_PROVIDER_KIND = "oidc-provider";
891
+ var usernameClaimSchema = require_dist._enum([
892
+ "preferred_username",
893
+ "email",
894
+ "sub"
895
+ ]);
896
+ var OidcProviderBodySchema = require_dist.object({
897
+ displayName: require_dist.string().min(1),
898
+ icon: require_dist.string(),
899
+ issuerUrl: require_dist.string(),
900
+ clientId: require_dist.string(),
901
+ clientSecret: require_dist.string().meta({ secret: true }),
902
+ redirectUri: require_dist.string(),
903
+ scopes: require_dist.string(),
904
+ usernameClaim: usernameClaimSchema
905
+ });
906
+ var oidcProviderEntryKind = require_dist.defineEntryKind(OIDC_PROVIDER_KIND, {
907
+ title: "OIDC providers",
908
+ nameField: "displayName",
909
+ schema: OidcProviderBodySchema,
910
+ writeTrigger: "an operator adds, edits or removes an OpenID Connect identity provider",
911
+ adoptsFrom: require_dist.settingsArrayAdoptsFrom("auth-oidc", "providers")
912
+ });
913
+ //#endregion
914
+ //#region src/oidc/oidc-provider-store.ts
915
+ function rowToProvider(id, data) {
916
+ return {
917
+ ...DEFAULT_OIDC_PROVIDER,
918
+ ...data,
919
+ id
920
+ };
921
+ }
922
+ var OidcProviderStore = class OidcProviderStore {
923
+ kind;
924
+ constructor(kind) {
925
+ this.kind = kind;
926
+ }
927
+ static of(records) {
928
+ return new OidcProviderStore(records.kind(oidcProviderEntryKind));
929
+ }
930
+ async listResolved() {
931
+ const page = await this.kind.query({ limit: 1e3 });
932
+ const out = [];
933
+ for (const record of page.records) {
934
+ let data = record.data;
935
+ try {
936
+ const resolved = await this.kind.getResolved(record.id);
937
+ if (resolved !== null) data = resolved.data;
938
+ } catch (err) {
939
+ if (!(err instanceof require_dist.RecordSecretUnavailableError)) throw err;
940
+ }
941
+ const parsed = OidcProviderBodySchema.safeParse(data);
942
+ if (!parsed.success) continue;
943
+ out.push(rowToProvider(record.id, parsed.data));
944
+ }
945
+ return out;
946
+ }
947
+ async replaceAll(providers) {
948
+ const page = await this.kind.query({ limit: 1e3 });
949
+ const nextIds = new Set(providers.map((p) => p.id));
950
+ for (const row of page.records) if (!nextIds.has(row.id)) await this.kind.delete(row.id);
951
+ for (const row of providers) {
952
+ const { id, displayName, icon, issuerUrl, clientId, clientSecret, redirectUri, scopes, usernameClaim } = row;
953
+ const body = {
954
+ displayName,
955
+ icon,
956
+ issuerUrl,
957
+ clientId,
958
+ clientSecret,
959
+ redirectUri,
960
+ scopes,
961
+ usernameClaim
962
+ };
963
+ const parsed = oidcProviderEntryKind.schema.safeParse(body);
964
+ if (!parsed.success) throw new Error(`invalid OIDC provider '${id}': ${parsed.error.message}`);
965
+ await this.kind.put({
966
+ id,
967
+ data: parsed.data
968
+ });
969
+ }
970
+ }
971
+ };
972
+ //#endregion
889
973
  //#region src/oidc/auth-oidc.addon.ts
890
974
  /**
891
975
  * Generic OpenID Connect (OIDC) authentication provider.
@@ -976,6 +1060,8 @@ function returnBaseOf(redirectUri, callbackPath) {
976
1060
  var AuthOidcAddon = class extends require_dist.BaseAddon {
977
1061
  /** Per-provider runtime state, keyed by `provider.id`. */
978
1062
  instances = /* @__PURE__ */ new Map();
1063
+ providerStore = null;
1064
+ activeProviders = [];
979
1065
  /** Pending OAuth states across ALL providers. The pending entry
980
1066
  * carries `providerId` so the /callback handler picks the right config. */
981
1067
  pendingStates = /* @__PURE__ */ new Map();
@@ -985,9 +1071,24 @@ var AuthOidcAddon = class extends require_dist.BaseAddon {
985
1071
  super({ ...DEFAULT_CONFIG });
986
1072
  }
987
1073
  async onConfigChanged() {
1074
+ this.activeProviders = await this.loadPersistedProviders();
988
1075
  this.rebuildInstances();
989
1076
  }
990
1077
  async onInitialize() {
1078
+ const records = this.ctx.records;
1079
+ if (records === void 0) throw new Error("auth-oidc: ctx.records is required (hub-only addon)");
1080
+ await records.declare({ "oidc-provider": oidcProviderEntryKind });
1081
+ this.providerStore = OidcProviderStore.of(records);
1082
+ this.activeProviders = await this.loadPersistedProviders();
1083
+ if ((await this.providerStore.listResolved()).length === 0 && this.config.providers.length > 0) try {
1084
+ await this.providerStore.replaceAll(this.config.providers);
1085
+ this.activeProviders = await this.loadPersistedProviders();
1086
+ } catch (err) {
1087
+ const msg = err instanceof Error ? err.message : String(err);
1088
+ if (!msg.startsWith("records/foreign-marker:") && !msg.startsWith("records/adoption-pending:")) throw err;
1089
+ this.ctx.logger.warn("OIDC: deferred config→records migrate (secret markers need adopt remap)", { meta: { error: msg } });
1090
+ this.activeProviders = [...this.config.providers];
1091
+ }
991
1092
  this.rebuildInstances();
992
1093
  const authProvider = {
993
1094
  validateCredentials: async () => null,
@@ -1045,7 +1146,7 @@ var AuthOidcAddon = class extends require_dist.BaseAddon {
1045
1146
  connectionFormSchema: async () => OIDC_CONNECTION_FORM_SCHEMA,
1046
1147
  listConnections: async () => {
1047
1148
  const secrets = this.ctx.secrets;
1048
- return this.config.providers.map((row) => {
1149
+ return this.activeProviders.map((row) => {
1049
1150
  const merged = {
1050
1151
  ...DEFAULT_PROVIDER,
1051
1152
  ...row
@@ -1071,15 +1172,15 @@ var AuthOidcAddon = class extends require_dist.BaseAddon {
1071
1172
  });
1072
1173
  },
1073
1174
  createConnection: async (input) => {
1074
- const result = createOidcConnection(this.config, input);
1175
+ const result = createOidcConnection(this.providersConfig(), input);
1075
1176
  if (!result.ok) throw new Error(result.reason === "duplicate-id" ? `An OIDC connection with id "${input.id}" already exists` : `Invalid connection id "${input.id}" — use a lowercase slug`);
1076
- await this.updateGlobalSettings(result.config);
1177
+ await this.persistProviders(result.config.providers);
1077
1178
  this.rebuildInstances();
1078
1179
  return { id: result.id };
1079
1180
  },
1080
1181
  updateConnection: async (input) => {
1081
1182
  const secretPatch = clientSecretPatchOf(input.clientSecret);
1082
- const result = updateOidcConnection(this.config, input.id, {
1183
+ const result = updateOidcConnection(this.providersConfig(), input.id, {
1083
1184
  displayName: input.displayName,
1084
1185
  ...input.icon !== void 0 ? { icon: input.icon } : {},
1085
1186
  ...input.issuerUrl !== void 0 ? { issuerUrl: input.issuerUrl } : {},
@@ -1095,20 +1196,21 @@ var AuthOidcAddon = class extends require_dist.BaseAddon {
1095
1196
  ...p,
1096
1197
  clientSecret: require_dist.SECRET_CLEAR
1097
1198
  } : p);
1098
- await this.updateGlobalSettings({ providers: cleared });
1099
- } else await this.updateGlobalSettings(result.config);
1199
+ await this.persistProviders(cleared);
1200
+ } else await this.persistProviders(result.config.providers);
1100
1201
  this.rebuildInstances();
1101
1202
  return { ok: true };
1102
1203
  },
1103
1204
  deleteConnection: async (input) => {
1104
- if (findOidcProvider(this.config, input.id) === null) throw new Error(`Unknown OIDC connection "${input.id}"`);
1105
- await this.updateGlobalSettings({ providers: this.config.providers.map((p) => p.id === input.id ? {
1205
+ if (findOidcProvider(this.providersConfig(), input.id) === null) throw new Error(`Unknown OIDC connection "${input.id}"`);
1206
+ const cleared = this.activeProviders.map((p) => p.id === input.id ? {
1106
1207
  ...p,
1107
1208
  clientSecret: require_dist.SECRET_CLEAR
1108
- } : p) });
1109
- const result = deleteOidcConnection(this.config, input.id);
1209
+ } : p);
1210
+ await this.persistProviders(cleared);
1211
+ const result = deleteOidcConnection(this.providersConfig(), input.id);
1110
1212
  if (!result.ok) throw new Error(`Unknown OIDC connection "${input.id}"`);
1111
- await this.updateGlobalSettings(result.config);
1213
+ await this.persistProviders(result.config.providers);
1112
1214
  this.rebuildInstances();
1113
1215
  return { ok: true };
1114
1216
  }
@@ -1147,9 +1249,29 @@ var AuthOidcAddon = class extends require_dist.BaseAddon {
1147
1249
  fields: []
1148
1250
  }] });
1149
1251
  }
1252
+ providersConfig() {
1253
+ return { providers: this.activeProviders };
1254
+ }
1255
+ async loadPersistedProviders() {
1256
+ const store = this.providerStore;
1257
+ if (store !== null) {
1258
+ const fromRecords = await store.listResolved();
1259
+ if (fromRecords.length > 0) return fromRecords;
1260
+ }
1261
+ return this.config.providers;
1262
+ }
1263
+ async persistProviders(providers) {
1264
+ this.activeProviders = [...providers];
1265
+ const store = this.providerStore;
1266
+ if (store !== null) {
1267
+ await store.replaceAll(providers);
1268
+ return;
1269
+ }
1270
+ await this.updateGlobalSettings({ providers: [...providers] });
1271
+ }
1150
1272
  rebuildInstances() {
1151
1273
  this.instances.clear();
1152
- const providers = this.config.providers ?? [];
1274
+ const providers = this.activeProviders;
1153
1275
  for (const raw of providers) {
1154
1276
  const merged = {
1155
1277
  ...DEFAULT_PROVIDER,
@@ -1,4 +1,4 @@
1
- import { C as arrayItemFieldPath, D as toSecretFieldView, E as isSecretMarker, S as SECRET_CLEAR, T as isSecretClear, _ as requestMountPrefix, b as errMsg, c as authProviderCapability, d as loginMethodCapability, f as normalizeOrigin, g as pickRequestOrigin, h as parseAppPageLang, i as addonRoutesCapability, l as buildAddonRouteProvider, m as parseAppFlowRequest, n as APP_REFUSED_PATH, o as advertisedHubOrigins, p as oidcConnectionsCapability, r as SSO_STATE_COOKIE, s as appFlowLocation, t as APP_FLOW_DEFAULT_REDIRECT, u as claimedRequestOrigins, v as resolveIconKey, w as globalSecretScope, x as BaseAddon } from "../dist-roKTj364.mjs";
1
+ import { A as settingsArrayAdoptsFrom, C as SECRET_CLEAR, D as globalSecretScope, I as object, L as string, M as _enum, O as isSecretClear, S as RecordSecretUnavailableError, T as defineEntryKind, _ as requestMountPrefix, b as errMsg, c as authProviderCapability, d as loginMethodCapability, f as normalizeOrigin, g as pickRequestOrigin, h as parseAppPageLang, i as addonRoutesCapability, j as toSecretFieldView, k as isSecretMarker, l as buildAddonRouteProvider, m as parseAppFlowRequest, n as APP_REFUSED_PATH, o as advertisedHubOrigins, p as oidcConnectionsCapability, r as SSO_STATE_COOKIE, s as appFlowLocation, t as APP_FLOW_DEFAULT_REDIRECT, u as claimedRequestOrigins, v as resolveIconKey, w as arrayItemFieldPath, x as BaseAddon } from "../dist-BkvErNbe.mjs";
2
2
  import * as crypto$1 from "node:crypto";
3
3
  //#region ../../node_modules/jose/dist/webapi/lib/buffer_utils.js
4
4
  var encoder = new TextEncoder(), decoder = new TextDecoder(), strictDecoder = new TextDecoder("utf-8", { fatal: !0 });
@@ -881,6 +881,90 @@ function clientSecretPatchOf(value) {
881
881
  return { clientSecret: value };
882
882
  }
883
883
  //#endregion
884
+ //#region src/oidc/oidc-provider-record-kinds.ts
885
+ var OIDC_PROVIDER_KIND = "oidc-provider";
886
+ var usernameClaimSchema = _enum([
887
+ "preferred_username",
888
+ "email",
889
+ "sub"
890
+ ]);
891
+ var OidcProviderBodySchema = object({
892
+ displayName: string().min(1),
893
+ icon: string(),
894
+ issuerUrl: string(),
895
+ clientId: string(),
896
+ clientSecret: string().meta({ secret: true }),
897
+ redirectUri: string(),
898
+ scopes: string(),
899
+ usernameClaim: usernameClaimSchema
900
+ });
901
+ var oidcProviderEntryKind = defineEntryKind(OIDC_PROVIDER_KIND, {
902
+ title: "OIDC providers",
903
+ nameField: "displayName",
904
+ schema: OidcProviderBodySchema,
905
+ writeTrigger: "an operator adds, edits or removes an OpenID Connect identity provider",
906
+ adoptsFrom: settingsArrayAdoptsFrom("auth-oidc", "providers")
907
+ });
908
+ //#endregion
909
+ //#region src/oidc/oidc-provider-store.ts
910
+ function rowToProvider(id, data) {
911
+ return {
912
+ ...DEFAULT_OIDC_PROVIDER,
913
+ ...data,
914
+ id
915
+ };
916
+ }
917
+ var OidcProviderStore = class OidcProviderStore {
918
+ kind;
919
+ constructor(kind) {
920
+ this.kind = kind;
921
+ }
922
+ static of(records) {
923
+ return new OidcProviderStore(records.kind(oidcProviderEntryKind));
924
+ }
925
+ async listResolved() {
926
+ const page = await this.kind.query({ limit: 1e3 });
927
+ const out = [];
928
+ for (const record of page.records) {
929
+ let data = record.data;
930
+ try {
931
+ const resolved = await this.kind.getResolved(record.id);
932
+ if (resolved !== null) data = resolved.data;
933
+ } catch (err) {
934
+ if (!(err instanceof RecordSecretUnavailableError)) throw err;
935
+ }
936
+ const parsed = OidcProviderBodySchema.safeParse(data);
937
+ if (!parsed.success) continue;
938
+ out.push(rowToProvider(record.id, parsed.data));
939
+ }
940
+ return out;
941
+ }
942
+ async replaceAll(providers) {
943
+ const page = await this.kind.query({ limit: 1e3 });
944
+ const nextIds = new Set(providers.map((p) => p.id));
945
+ for (const row of page.records) if (!nextIds.has(row.id)) await this.kind.delete(row.id);
946
+ for (const row of providers) {
947
+ const { id, displayName, icon, issuerUrl, clientId, clientSecret, redirectUri, scopes, usernameClaim } = row;
948
+ const body = {
949
+ displayName,
950
+ icon,
951
+ issuerUrl,
952
+ clientId,
953
+ clientSecret,
954
+ redirectUri,
955
+ scopes,
956
+ usernameClaim
957
+ };
958
+ const parsed = oidcProviderEntryKind.schema.safeParse(body);
959
+ if (!parsed.success) throw new Error(`invalid OIDC provider '${id}': ${parsed.error.message}`);
960
+ await this.kind.put({
961
+ id,
962
+ data: parsed.data
963
+ });
964
+ }
965
+ }
966
+ };
967
+ //#endregion
884
968
  //#region src/oidc/auth-oidc.addon.ts
885
969
  /**
886
970
  * Generic OpenID Connect (OIDC) authentication provider.
@@ -971,6 +1055,8 @@ function returnBaseOf(redirectUri, callbackPath) {
971
1055
  var AuthOidcAddon = class extends BaseAddon {
972
1056
  /** Per-provider runtime state, keyed by `provider.id`. */
973
1057
  instances = /* @__PURE__ */ new Map();
1058
+ providerStore = null;
1059
+ activeProviders = [];
974
1060
  /** Pending OAuth states across ALL providers. The pending entry
975
1061
  * carries `providerId` so the /callback handler picks the right config. */
976
1062
  pendingStates = /* @__PURE__ */ new Map();
@@ -980,9 +1066,24 @@ var AuthOidcAddon = class extends BaseAddon {
980
1066
  super({ ...DEFAULT_CONFIG });
981
1067
  }
982
1068
  async onConfigChanged() {
1069
+ this.activeProviders = await this.loadPersistedProviders();
983
1070
  this.rebuildInstances();
984
1071
  }
985
1072
  async onInitialize() {
1073
+ const records = this.ctx.records;
1074
+ if (records === void 0) throw new Error("auth-oidc: ctx.records is required (hub-only addon)");
1075
+ await records.declare({ "oidc-provider": oidcProviderEntryKind });
1076
+ this.providerStore = OidcProviderStore.of(records);
1077
+ this.activeProviders = await this.loadPersistedProviders();
1078
+ if ((await this.providerStore.listResolved()).length === 0 && this.config.providers.length > 0) try {
1079
+ await this.providerStore.replaceAll(this.config.providers);
1080
+ this.activeProviders = await this.loadPersistedProviders();
1081
+ } catch (err) {
1082
+ const msg = err instanceof Error ? err.message : String(err);
1083
+ if (!msg.startsWith("records/foreign-marker:") && !msg.startsWith("records/adoption-pending:")) throw err;
1084
+ this.ctx.logger.warn("OIDC: deferred config→records migrate (secret markers need adopt remap)", { meta: { error: msg } });
1085
+ this.activeProviders = [...this.config.providers];
1086
+ }
986
1087
  this.rebuildInstances();
987
1088
  const authProvider = {
988
1089
  validateCredentials: async () => null,
@@ -1040,7 +1141,7 @@ var AuthOidcAddon = class extends BaseAddon {
1040
1141
  connectionFormSchema: async () => OIDC_CONNECTION_FORM_SCHEMA,
1041
1142
  listConnections: async () => {
1042
1143
  const secrets = this.ctx.secrets;
1043
- return this.config.providers.map((row) => {
1144
+ return this.activeProviders.map((row) => {
1044
1145
  const merged = {
1045
1146
  ...DEFAULT_PROVIDER,
1046
1147
  ...row
@@ -1066,15 +1167,15 @@ var AuthOidcAddon = class extends BaseAddon {
1066
1167
  });
1067
1168
  },
1068
1169
  createConnection: async (input) => {
1069
- const result = createOidcConnection(this.config, input);
1170
+ const result = createOidcConnection(this.providersConfig(), input);
1070
1171
  if (!result.ok) throw new Error(result.reason === "duplicate-id" ? `An OIDC connection with id "${input.id}" already exists` : `Invalid connection id "${input.id}" — use a lowercase slug`);
1071
- await this.updateGlobalSettings(result.config);
1172
+ await this.persistProviders(result.config.providers);
1072
1173
  this.rebuildInstances();
1073
1174
  return { id: result.id };
1074
1175
  },
1075
1176
  updateConnection: async (input) => {
1076
1177
  const secretPatch = clientSecretPatchOf(input.clientSecret);
1077
- const result = updateOidcConnection(this.config, input.id, {
1178
+ const result = updateOidcConnection(this.providersConfig(), input.id, {
1078
1179
  displayName: input.displayName,
1079
1180
  ...input.icon !== void 0 ? { icon: input.icon } : {},
1080
1181
  ...input.issuerUrl !== void 0 ? { issuerUrl: input.issuerUrl } : {},
@@ -1090,20 +1191,21 @@ var AuthOidcAddon = class extends BaseAddon {
1090
1191
  ...p,
1091
1192
  clientSecret: SECRET_CLEAR
1092
1193
  } : p);
1093
- await this.updateGlobalSettings({ providers: cleared });
1094
- } else await this.updateGlobalSettings(result.config);
1194
+ await this.persistProviders(cleared);
1195
+ } else await this.persistProviders(result.config.providers);
1095
1196
  this.rebuildInstances();
1096
1197
  return { ok: true };
1097
1198
  },
1098
1199
  deleteConnection: async (input) => {
1099
- if (findOidcProvider(this.config, input.id) === null) throw new Error(`Unknown OIDC connection "${input.id}"`);
1100
- await this.updateGlobalSettings({ providers: this.config.providers.map((p) => p.id === input.id ? {
1200
+ if (findOidcProvider(this.providersConfig(), input.id) === null) throw new Error(`Unknown OIDC connection "${input.id}"`);
1201
+ const cleared = this.activeProviders.map((p) => p.id === input.id ? {
1101
1202
  ...p,
1102
1203
  clientSecret: SECRET_CLEAR
1103
- } : p) });
1104
- const result = deleteOidcConnection(this.config, input.id);
1204
+ } : p);
1205
+ await this.persistProviders(cleared);
1206
+ const result = deleteOidcConnection(this.providersConfig(), input.id);
1105
1207
  if (!result.ok) throw new Error(`Unknown OIDC connection "${input.id}"`);
1106
- await this.updateGlobalSettings(result.config);
1208
+ await this.persistProviders(result.config.providers);
1107
1209
  this.rebuildInstances();
1108
1210
  return { ok: true };
1109
1211
  }
@@ -1142,9 +1244,29 @@ var AuthOidcAddon = class extends BaseAddon {
1142
1244
  fields: []
1143
1245
  }] });
1144
1246
  }
1247
+ providersConfig() {
1248
+ return { providers: this.activeProviders };
1249
+ }
1250
+ async loadPersistedProviders() {
1251
+ const store = this.providerStore;
1252
+ if (store !== null) {
1253
+ const fromRecords = await store.listResolved();
1254
+ if (fromRecords.length > 0) return fromRecords;
1255
+ }
1256
+ return this.config.providers;
1257
+ }
1258
+ async persistProviders(providers) {
1259
+ this.activeProviders = [...providers];
1260
+ const store = this.providerStore;
1261
+ if (store !== null) {
1262
+ await store.replaceAll(providers);
1263
+ return;
1264
+ }
1265
+ await this.updateGlobalSettings({ providers: [...providers] });
1266
+ }
1145
1267
  rebuildInstances() {
1146
1268
  this.instances.clear();
1147
- const providers = this.config.providers ?? [];
1269
+ const providers = this.activeProviders;
1148
1270
  for (const raw of providers) {
1149
1271
  const merged = {
1150
1272
  ...DEFAULT_PROVIDER,
@@ -1,6 +1,6 @@
1
1
  import { n as e, r as t, t as n } from "./_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare__react__loadShare__.js-BIIa6vDX.mjs";
2
2
  import { n as r, t as i } from "./_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CQ-aEQ9b.mjs";
3
- import { n as a, t as o } from "./_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Jb_VAQPj.mjs";
3
+ import { n as a, t as o } from "./_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DCLE6WWy.mjs";
4
4
  import { n as s, r as c, t as l } from "./_virtual_mf___mfe_internal__addon_auth_webauthn_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-BL2etuqg.mjs";
5
5
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
6
6
  var u = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), d = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), f = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), p = (e) => {
@@ -395,17 +395,31 @@ async function L(e) {
395
395
  function R() {
396
396
  return T();
397
397
  }
398
- async function z(e) {
399
- let t = await L({ optionsJSON: e });
398
+ function z(e) {
399
+ return {
400
+ ...e,
401
+ challenge: e.challenge
402
+ };
403
+ }
404
+ function B(e) {
405
+ return {
406
+ ...e,
407
+ challenge: e.challenge
408
+ };
409
+ }
410
+ async function V(e) {
411
+ if (typeof e.challenge != "string") throw Error("passkey authentication options missing challenge");
412
+ let t = await L({ optionsJSON: z(e) });
400
413
  return Object.fromEntries(Object.entries(t));
401
414
  }
402
- async function B(e) {
403
- let t = await N({ optionsJSON: e });
415
+ async function H(e) {
416
+ if (typeof e.challenge != "string") throw Error("passkey registration options missing challenge");
417
+ let t = await N({ optionsJSON: B(e) });
404
418
  return Object.fromEntries(Object.entries(t));
405
419
  }
406
420
  //#endregion
407
421
  //#region src/i18n/index.ts
408
- var { useT: V } = a("auth-webauthn", {
422
+ var { useT: U } = a("auth-webauthn", {
409
423
  en: {
410
424
  directLogin: {
411
425
  requiresCallback: "Passkey direct-login widget requires an onComplete callback.",
@@ -483,8 +497,8 @@ var { useT: V } = a("auth-webauthn", {
483
497
  });
484
498
  //#endregion
485
499
  //#region src/webauthn/widgets/PasskeyEnrollment.tsx
486
- function H(e) {
487
- let n = o(), { t: a, lang: u } = V(), d = r({
500
+ function W(e) {
501
+ let n = o(), { t: a, lang: u } = U(), d = r({
488
502
  queryKey: ["auth", "listOwnPasskeys"],
489
503
  queryFn: () => n.listOwnPasskeys()
490
504
  }), f = d.data ?? [], [p, m] = t(""), [h, g] = t(!1), [_, C] = t(null), w = r({
@@ -500,7 +514,7 @@ function H(e) {
500
514
  }), D = async () => {
501
515
  C(null), g(!0);
502
516
  try {
503
- let e = await B((await n.beginOwnPasskeyRegistration()).optionsJSON);
517
+ let e = await H((await n.beginOwnPasskeyRegistration()).optionsJSON);
504
518
  await n.finishOwnPasskeyRegistration({
505
519
  response: e,
506
520
  label: p.trim() || a("enrollment.unnamedDevice")
@@ -515,7 +529,7 @@ function H(e) {
515
529
  let t;
516
530
  if ("password" in e.proof) t = (await n.reauthenticate({ password: e.proof.password })).reauthToken;
517
531
  else {
518
- let { optionsJSON: e } = await n.reauthBeginPasskey(), r = await z(e);
532
+ let { optionsJSON: e } = await n.reauthBeginPasskey(), r = await V(e);
519
533
  t = (await n.reauthenticate({ passkeyResponse: r })).reauthToken;
520
534
  }
521
535
  return n.removeOwnPasskey({
@@ -667,7 +681,7 @@ function H(e) {
667
681
  }
668
682
  //#endregion
669
683
  //#region src/webauthn/widgets/PasskeyLogin.tsx
670
- function U(e) {
684
+ function G(e) {
671
685
  if (!e) return null;
672
686
  let t = e.challengeToken, n = e.onComplete, r = e.onError;
673
687
  return typeof t != "string" || typeof n != "function" ? null : {
@@ -676,8 +690,8 @@ function U(e) {
676
690
  onError: typeof r == "function" ? r : void 0
677
691
  };
678
692
  }
679
- function W(e) {
680
- let n = o(), { t: r } = V(), i = U(e.config), [a, l] = t(!1), [u, d] = t(null);
693
+ function K(e) {
694
+ let n = o(), { t: r } = U(), i = G(e.config), [a, l] = t(!1), [u, d] = t(null);
681
695
  return i ? R() ? /* @__PURE__ */ c("div", {
682
696
  className: "space-y-2",
683
697
  children: [/* @__PURE__ */ c("button", {
@@ -686,7 +700,7 @@ function W(e) {
686
700
  onClick: async () => {
687
701
  d(null), l(!0);
688
702
  try {
689
- let e = await z((await n.loginBeginPasskey(i.challengeToken)).optionsJSON), t = await n.loginVerifyPasskey(i.challengeToken, e);
703
+ let e = await V((await n.loginBeginPasskey(i.challengeToken)).optionsJSON), t = await n.loginVerifyPasskey(i.challengeToken, e);
690
704
  i.onComplete(t.token);
691
705
  } catch (e) {
692
706
  let t = e instanceof Error ? e.message : r("login.verificationFailed");
@@ -712,7 +726,7 @@ function W(e) {
712
726
  }
713
727
  //#endregion
714
728
  //#region src/webauthn/widgets/PasskeyDirectLogin.tsx
715
- function G(e) {
729
+ function q(e) {
716
730
  if (!e) return null;
717
731
  let t = e.onComplete, n = e.onSecondFactor, r = e.onError, i = e.locale;
718
732
  return typeof t == "function" ? {
@@ -722,8 +736,8 @@ function G(e) {
722
736
  locale: typeof i == "string" ? i : void 0
723
737
  } : null;
724
738
  }
725
- function K(e) {
726
- let n = o(), r = G(e.config), [i, a] = t(!1), [l, u] = t(null), { t: d } = V(r?.locale);
739
+ function J(e) {
740
+ let n = o(), r = q(e.config), [i, a] = t(!1), [l, u] = t(null), { t: d } = U(r?.locale);
727
741
  return r ? R() ? /* @__PURE__ */ c("div", {
728
742
  className: "space-y-2",
729
743
  children: [/* @__PURE__ */ c("button", {
@@ -732,7 +746,7 @@ function K(e) {
732
746
  onClick: async () => {
733
747
  u(null), a(!0);
734
748
  try {
735
- let e = await z((await n.passkeyLoginBegin()).optionsJSON), t = await n.passkeyLoginFinish(e), i = t.secondFactors ?? (t.requiresTotp === !0 ? ["totp"] : []);
749
+ let e = await V((await n.passkeyLoginBegin()).optionsJSON), t = await n.passkeyLoginFinish(e), i = t.secondFactors ?? (t.requiresTotp === !0 ? ["totp"] : []);
736
750
  if (i.length > 0) {
737
751
  if (r.onSecondFactor) r.onSecondFactor({
738
752
  challengeToken: t.token,
@@ -769,10 +783,10 @@ function K(e) {
769
783
  }
770
784
  //#endregion
771
785
  //#region src/webauthn/widgets/index.tsx
772
- var q = {
773
- "passkey-enrollment": H,
774
- "passkey-login": W,
775
- "passkey-direct-login": K
786
+ var Y = {
787
+ "passkey-enrollment": W,
788
+ "passkey-login": K,
789
+ "passkey-direct-login": J
776
790
  };
777
791
  //#endregion
778
- export { q as default };
792
+ export { Y as default };
@@ -3,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
3
3
  var e = {
4
4
  "@camstack/sdk": {
5
5
  name: "@camstack/sdk",
6
- version: "1.2.132",
6
+ version: "1.2.134",
7
7
  scope: ["default"],
8
8
  loaded: !1,
9
9
  from: "addon_auth_webauthn_widgets",
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.374",
21
+ version: "1.2.384",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_auth_webauthn_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.292",
36
+ version: "1.2.301",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_auth_webauthn_widgets",