@eudiplo/cli 9.1.0-main.52a85b9 → 9.1.0-main.53e4625

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.js CHANGED
@@ -3099,9 +3099,9 @@ var require_data = __commonJS({
3099
3099
  }
3100
3100
  });
3101
3101
 
3102
- // ../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/lib/utils.js
3102
+ // ../../node_modules/.pnpm/fast-uri@3.1.9/node_modules/fast-uri/lib/utils.js
3103
3103
  var require_utils = __commonJS({
3104
- "../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/lib/utils.js"(exports, module) {
3104
+ "../../node_modules/.pnpm/fast-uri@3.1.9/node_modules/fast-uri/lib/utils.js"(exports, module) {
3105
3105
  "use strict";
3106
3106
  var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu);
3107
3107
  var isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);
@@ -3333,6 +3333,37 @@ var require_utils = __commonJS({
3333
3333
  }
3334
3334
  return output.join("");
3335
3335
  }
3336
+ function removeDotSegmentsRelative(path2) {
3337
+ if (path2 === "" || path2[0] === "/") {
3338
+ return removeDotSegments(path2);
3339
+ }
3340
+ const segments = path2.split("/");
3341
+ const last = segments.length - 1;
3342
+ const output = [];
3343
+ let trailingDirectory = false;
3344
+ for (let i2 = 0; i2 <= last; i2++) {
3345
+ const segment = segments[i2];
3346
+ if (segment === "." || segment === "..") {
3347
+ if (segment === "..") {
3348
+ if (output.length !== 0 && output[output.length - 1] !== "..") {
3349
+ output.pop();
3350
+ } else {
3351
+ output.push("..");
3352
+ }
3353
+ }
3354
+ trailingDirectory = i2 === last;
3355
+ } else {
3356
+ output.push(segment);
3357
+ }
3358
+ }
3359
+ if (trailingDirectory && output[output.length - 1] !== "..") {
3360
+ output.push("");
3361
+ }
3362
+ if (output.length === 0 || output[0] === "" || output[0].includes(":")) {
3363
+ output.unshift(".");
3364
+ }
3365
+ return output.join("/");
3366
+ }
3336
3367
  var HOST_DELIMS = { "@": "%40", "/": "%2F", "?": "%3F", "#": "%23", ":": "%3A" };
3337
3368
  var HOST_DELIM_RE = /[@/?#:]/g;
3338
3369
  var HOST_DELIM_NO_COLON_RE = /[@/?#]/g;
@@ -3593,6 +3624,7 @@ var require_utils = __commonJS({
3593
3624
  encodeFragment,
3594
3625
  escapePreservingEscapes,
3595
3626
  removeDotSegments,
3627
+ removeDotSegmentsRelative,
3596
3628
  isIPv4,
3597
3629
  isUUID,
3598
3630
  normalizeIPv6,
@@ -3601,9 +3633,9 @@ var require_utils = __commonJS({
3601
3633
  }
3602
3634
  });
3603
3635
 
3604
- // ../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/lib/schemes.js
3636
+ // ../../node_modules/.pnpm/fast-uri@3.1.9/node_modules/fast-uri/lib/schemes.js
3605
3637
  var require_schemes = __commonJS({
3606
- "../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/lib/schemes.js"(exports, module) {
3638
+ "../../node_modules/.pnpm/fast-uri@3.1.9/node_modules/fast-uri/lib/schemes.js"(exports, module) {
3607
3639
  "use strict";
3608
3640
  var { isUUID } = require_utils();
3609
3641
  var URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu;
@@ -3812,20 +3844,22 @@ var require_schemes = __commonJS({
3812
3844
  }
3813
3845
  });
3814
3846
 
3815
- // ../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/index.js
3847
+ // ../../node_modules/.pnpm/fast-uri@3.1.9/node_modules/fast-uri/index.js
3816
3848
  var require_fast_uri = __commonJS({
3817
- "../../node_modules/.pnpm/fast-uri@3.1.8/node_modules/fast-uri/index.js"(exports, module) {
3849
+ "../../node_modules/.pnpm/fast-uri@3.1.9/node_modules/fast-uri/index.js"(exports, module) {
3818
3850
  "use strict";
3819
- var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3851
+ var { normalizeIPv6, removeDotSegments, removeDotSegmentsRelative, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3820
3852
  var { SCHEMES, getSchemeHandler } = require_schemes();
3821
3853
  var VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u;
3822
3854
  var MALFORMED_SCHEME_ERROR = "URI scheme is malformed.";
3823
- function decodeValidScheme(scheme) {
3824
- const decodedScheme = unescape(String(scheme));
3825
- if (!VALID_SCHEME.test(decodedScheme)) {
3855
+ var MALFORMED_HOST_ERROR = "URI host is malformed.";
3856
+ var FORBIDDEN_DOMAIN_HOST_CHARACTER = /[\0-\x20"#/:<>?@[\\\]^`{|}\x7F]/u;
3857
+ function validateScheme(scheme) {
3858
+ const stringScheme = String(scheme);
3859
+ if (!VALID_SCHEME.test(stringScheme)) {
3826
3860
  throw new TypeError(MALFORMED_SCHEME_ERROR);
3827
3861
  }
3828
- return decodedScheme;
3862
+ return stringScheme;
3829
3863
  }
3830
3864
  function normalize(uri, options) {
3831
3865
  if (typeof uri === "string") {
@@ -3862,6 +3896,9 @@ var require_fast_uri = __commonJS({
3862
3896
  const resolvedSchemeHandler = getSchemeHandler(options && options.scheme || resolved.scheme);
3863
3897
  const resolvedHost = resolved.host;
3864
3898
  const resolvedHostIsIP = resolvedHost !== void 0 && resolvedHost !== "" && (isIPv4(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6);
3899
+ if (hasForbiddenDomainHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP)) {
3900
+ throw new Error(MALFORMED_HOST_ERROR);
3901
+ }
3865
3902
  canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP);
3866
3903
  const encodedASCIIHost = resolvedHost && resolvedHost.indexOf("%") !== -1 && !new RegExp("\\P{ASCII}", "u").test(resolvedHost);
3867
3904
  if (resolved.error && !encodedASCIIHost) {
@@ -3903,14 +3940,15 @@ var require_fast_uri = __commonJS({
3903
3940
  if (relative3.path[0] === "/") {
3904
3941
  target.path = removeDotSegments(relative3.path);
3905
3942
  } else {
3906
- if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) {
3943
+ const baseHasAuthority = base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0;
3944
+ if (baseHasAuthority && !base.path) {
3907
3945
  target.path = "/" + relative3.path;
3908
3946
  } else if (!base.path) {
3909
3947
  target.path = relative3.path;
3910
3948
  } else {
3911
3949
  target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative3.path;
3912
3950
  }
3913
- target.path = removeDotSegments(target.path);
3951
+ target.path = base.scheme === void 0 && !baseHasAuthority && target.path[0] !== "/" ? removeDotSegmentsRelative(target.path) : removeDotSegments(target.path);
3914
3952
  }
3915
3953
  target.query = relative3.query;
3916
3954
  }
@@ -3948,12 +3986,13 @@ var require_fast_uri = __commonJS({
3948
3986
  const options = Object.assign({}, opts);
3949
3987
  const uriTokens = [];
3950
3988
  if (component.scheme) {
3951
- component.scheme = decodeValidScheme(component.scheme);
3989
+ component.scheme = validateScheme(component.scheme);
3952
3990
  }
3953
3991
  const schemeHandler = getSchemeHandler(options.scheme || component.scheme);
3954
3992
  if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
3955
3993
  const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0;
3956
- const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority;
3994
+ const schemelessReference = (component.scheme === void 0 || options.reference === "suffix") && !hasAuthority;
3995
+ const pathNoScheme = !options.skipEscape && schemelessReference;
3957
3996
  if (component.path !== void 0) {
3958
3997
  if (!options.skipEscape) {
3959
3998
  component.path = serializePathEncoding(component.path, pathNoScheme);
@@ -3962,7 +4001,7 @@ var require_fast_uri = __commonJS({
3962
4001
  }
3963
4002
  }
3964
4003
  if (options.reference !== "suffix" && component.scheme) {
3965
- component.scheme = decodeValidScheme(component.scheme);
4004
+ component.scheme = validateScheme(component.scheme);
3966
4005
  uriTokens.push(component.scheme, ":");
3967
4006
  }
3968
4007
  const authority = recomposeAuthority(component);
@@ -3978,9 +4017,9 @@ var require_fast_uri = __commonJS({
3978
4017
  if (component.path !== void 0) {
3979
4018
  let s = component.path;
3980
4019
  if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
3981
- s = removeDotSegments(s);
4020
+ s = schemelessReference && s[0] !== "/" ? removeDotSegmentsRelative(s) : removeDotSegments(s);
3982
4021
  }
3983
- if (pathNoScheme) {
4022
+ if (schemelessReference) {
3984
4023
  s = serializePathEncoding(s, true);
3985
4024
  }
3986
4025
  if (authority === void 0 && s[0] === "/" && s[1] === "/") {
@@ -4027,16 +4066,34 @@ var require_fast_uri = __commonJS({
4027
4066
  return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
4028
4067
  }
4029
4068
  function canonicalizeHost(parsed, options, schemeHandler, isIP) {
4069
+ if (hasForbiddenDomainHost(parsed, options, schemeHandler, isIP)) {
4070
+ parsed.error = parsed.error || MALFORMED_HOST_ERROR;
4071
+ return true;
4072
+ }
4030
4073
  if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
4074
+ let url;
4031
4075
  try {
4032
- parsed.host = new URL("http://" + parsed.host).hostname;
4076
+ url = new URL("http://" + parsed.host);
4033
4077
  } catch (e) {
4034
4078
  parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
4035
4079
  return true;
4036
4080
  }
4081
+ if (!isHostOnlyURL(url)) {
4082
+ parsed.error = parsed.error || MALFORMED_HOST_ERROR;
4083
+ return true;
4084
+ }
4085
+ parsed.host = url.hostname;
4037
4086
  }
4038
4087
  return false;
4039
4088
  }
4089
+ function hasForbiddenDomainHost(parsed, options, schemeHandler, isIP) {
4090
+ return Boolean(
4091
+ parsed.host && isIP === false && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && FORBIDDEN_DOMAIN_HOST_CHARACTER.test(parsed.host)
4092
+ );
4093
+ }
4094
+ function isHostOnlyURL(url) {
4095
+ return url.username === "" && url.password === "" && url.port === "" && url.pathname === "/" && url.search === "" && url.hash === "" && url.hostname !== "";
4096
+ }
4040
4097
  function parseWithStatus(uri, opts) {
4041
4098
  const options = Object.assign({}, opts);
4042
4099
  const parsed = {
@@ -4091,9 +4148,8 @@ var require_fast_uri = __commonJS({
4091
4148
  parsed.query = matches[7];
4092
4149
  parsed.fragment = matches[8];
4093
4150
  if (parsed.scheme !== void 0) {
4094
- const decodedScheme = unescape(parsed.scheme);
4095
- if (VALID_SCHEME.test(decodedScheme)) {
4096
- parsed.scheme = decodedScheme.toLowerCase();
4151
+ if (VALID_SCHEME.test(parsed.scheme)) {
4152
+ parsed.scheme = parsed.scheme.toLowerCase();
4097
4153
  } else {
4098
4154
  parsed.error = parsed.error || MALFORMED_SCHEME_ERROR;
4099
4155
  malformedScheme = true;
@@ -4121,7 +4177,7 @@ var require_fast_uri = __commonJS({
4121
4177
  malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
4122
4178
  parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
4123
4179
  if (malformedIPLiteral) {
4124
- parsed.error = parsed.error || "URI host is malformed.";
4180
+ parsed.error = parsed.error || MALFORMED_HOST_ERROR;
4125
4181
  malformedAuthorityOrPort = true;
4126
4182
  }
4127
4183
  } else {
@@ -4149,7 +4205,7 @@ var require_fast_uri = __commonJS({
4149
4205
  if (!isIP) {
4150
4206
  host = normalizePercentEncoding(host.toLowerCase());
4151
4207
  }
4152
- parsed.host = reescapeHostDelimiters(host, isIP);
4208
+ parsed.host = isIP || options.scheme !== "null" ? reescapeHostDelimiters(host, isIP) : host;
4153
4209
  }
4154
4210
  if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
4155
4211
  if (parsed.path) {
@@ -13749,6 +13805,16 @@ var registry_default = [
13749
13805
  "/apps/backend/test/fixtures/*/attribute-providers/*.json"
13750
13806
  ]
13751
13807
  },
13808
+ {
13809
+ kind: "directory",
13810
+ subfolder: "federation-trust-anchors",
13811
+ resourceType: "federation trust anchor",
13812
+ schemaFile: "FederationTrustAnchorConfigFile.schema.json",
13813
+ fileMatch: [
13814
+ "/assets/config/*/federation-trust-anchors/*.json",
13815
+ "/apps/backend/test/fixtures/*/federation-trust-anchors/*.json"
13816
+ ]
13817
+ },
13752
13818
  {
13753
13819
  kind: "directory",
13754
13820
  subfolder: "webhook-endpoints",
@@ -15081,10 +15147,10 @@ function unzipSync(data, opts) {
15081
15147
 
15082
15148
  // ../../packages/eudiplo-config-format/dist/config-format.js
15083
15149
  var CONFIG_FORMATS = {
15084
- Tenant: { slug: "tenant", file: "TenantConfigFile", version: 1 },
15150
+ Tenant: { slug: "tenant", file: "TenantConfigFile", version: 3 },
15085
15151
  Client: { slug: "client", file: "ClientConfigFile", version: 2 },
15086
15152
  KmsConfig: { slug: "kms-config", file: "KmsConfigFile", version: 2 },
15087
- KeyChain: { slug: "key-chain", file: "KeyChainConfigFile", version: 2 },
15153
+ KeyChain: { slug: "key-chain", file: "KeyChainConfigFile", version: 3 },
15088
15154
  RegistrarConfig: {
15089
15155
  slug: "registrar-config",
15090
15156
  file: "RegistrarConfigFile",
@@ -15093,7 +15159,7 @@ var CONFIG_FORMATS = {
15093
15159
  IssuanceConfig: {
15094
15160
  slug: "issuance-config",
15095
15161
  file: "IssuanceConfigFile",
15096
- version: 4
15162
+ version: 5
15097
15163
  },
15098
15164
  CredentialConfig: {
15099
15165
  slug: "credential-config",
@@ -15116,6 +15182,11 @@ var CONFIG_FORMATS = {
15116
15182
  version: 1
15117
15183
  },
15118
15184
  TrustList: { slug: "trust-list", file: "TrustListConfigFile", version: 1 },
15185
+ FederationTrustAnchor: {
15186
+ slug: "federation-trust-anchor",
15187
+ file: "FederationTrustAnchorConfigFile",
15188
+ version: 1
15189
+ },
15119
15190
  StatusList: {
15120
15191
  slug: "status-list",
15121
15192
  file: "StatusListConfigFile",
@@ -15143,16 +15214,74 @@ function resourceId(input) {
15143
15214
  return id;
15144
15215
  }
15145
15216
  function bareFileVersion(kind, spec) {
15146
- if (kind === "KeyChain")
15217
+ if (kind === "KeyChain") {
15218
+ if (spec.usageType === "federation")
15219
+ return 3;
15147
15220
  return "type" in spec ? 2 : 1;
15221
+ }
15148
15222
  if (kind === "RegistrarConfig")
15149
15223
  return "relyingPartyContact" in spec ? 2 : 1;
15224
+ if (kind === "Tenant") {
15225
+ if ("defaultKeyChains" in spec)
15226
+ return 3;
15227
+ return "defaultAccessKeyChainId" in spec ? 2 : 1;
15228
+ }
15150
15229
  if (kind === "KmsConfig") {
15151
15230
  const providers = Array.isArray(spec.providers) ? spec.providers : [];
15152
15231
  return providers.some((provider) => typeof provider === "object" && provider !== null && ("algorithms" in provider || "defaultAlgorithm" in provider)) ? 2 : 1;
15153
15232
  }
15154
15233
  return 1;
15155
15234
  }
15235
+ var issuanceConfigV4ToV5 = {
15236
+ id: "issuance-config-v5-federation-entity",
15237
+ kind: "IssuanceConfig",
15238
+ from: 4,
15239
+ to: 5,
15240
+ migrate(spec) {
15241
+ const federation = spec.federation;
15242
+ const problem = object(federation) && typeof federation.entityId === "string" && federation.entityId !== "" ? federationEntityIdProblem(federation.entityId, {
15243
+ allowHttp: true
15244
+ }) : void 0;
15245
+ if (!problem)
15246
+ return { spec };
15247
+ return {
15248
+ spec,
15249
+ issues: [
15250
+ {
15251
+ severity: "required-input",
15252
+ code: "FEDERATION_ENTITY_ID_INVALID",
15253
+ path: "/spec/federation/entityId",
15254
+ message: `${problem}: set an https URL with a host and without query or fragment, usually <PUBLIC_URL>/issuers/<tenant>`
15255
+ }
15256
+ ]
15257
+ };
15258
+ }
15259
+ };
15260
+ function federationEntityIdProblem(entityId, options) {
15261
+ const value = `federation.entityId '${JSON.stringify(entityId).slice(1, -1)}'`;
15262
+ if (/[\s\u0000-\u001f\u007f]/.test(entityId)) {
15263
+ return `${value} must not contain whitespace or control characters`;
15264
+ }
15265
+ if (entityId.includes("?") || entityId.includes("#")) {
15266
+ return `${value} must not have a query or fragment`;
15267
+ }
15268
+ let url;
15269
+ try {
15270
+ url = new URL(entityId);
15271
+ } catch {
15272
+ return `${value} is not a URL`;
15273
+ }
15274
+ if (url.protocol !== "https:" && !(options.allowHttp && url.protocol === "http:")) {
15275
+ return options.allowHttp ? `${value} must be an https or http URL` : `${value} must be an https URL (http only with OUTBOUND_URL_ALLOW_HTTP=true)`;
15276
+ }
15277
+ if (url.href !== entityId && url.href !== `${entityId}/`) {
15278
+ return `${value} must be written as the URL it stands for: ${url.href}`;
15279
+ }
15280
+ if (url.username || url.password) {
15281
+ return `${value} must not contain credentials`;
15282
+ }
15283
+ return void 0;
15284
+ }
15156
15285
  var presentationConfigV1ToV2 = {
15157
15286
  id: "presentation-config-v2-provides-attestations",
15158
15287
  kind: "PresentationConfig",
@@ -15206,6 +15335,7 @@ var CONFIG_MIGRATIONS = [
15206
15335
  // a valid v4 spec.
15207
15336
  migrate: (spec) => ({ spec })
15208
15337
  },
15338
+ issuanceConfigV4ToV5,
15209
15339
  {
15210
15340
  id: "client-v2-read-and-status-roles",
15211
15341
  kind: "Client",
@@ -15235,6 +15365,35 @@ var CONFIG_MIGRATIONS = [
15235
15365
  // as before.
15236
15366
  migrate: (spec) => ({ spec })
15237
15367
  },
15368
+ {
15369
+ id: "tenant-v2-default-access-key-chain",
15370
+ kind: "Tenant",
15371
+ from: 1,
15372
+ to: 2,
15373
+ // v2 only adds the optional defaultAccessKeyChainId: a v1 spec is a
15374
+ // valid v2 spec, whose tenant keeps picking its access key chain by
15375
+ // rule.
15376
+ migrate: (spec) => ({ spec })
15377
+ },
15378
+ {
15379
+ id: "tenant-v3-default-key-chains",
15380
+ kind: "Tenant",
15381
+ from: 2,
15382
+ to: 3,
15383
+ // v3 keeps the tenant's default key chains in a map by usage type:
15384
+ // defaultAccessKeyChainId becomes defaultKeyChains.access.
15385
+ migrate: (spec) => {
15386
+ const { defaultAccessKeyChainId, ...rest } = spec;
15387
+ return {
15388
+ spec: typeof defaultAccessKeyChainId === "string" ? {
15389
+ ...rest,
15390
+ defaultKeyChains: {
15391
+ access: defaultAccessKeyChainId
15392
+ }
15393
+ } : rest
15394
+ };
15395
+ }
15396
+ },
15238
15397
  {
15239
15398
  id: "key-chain-v2-type",
15240
15399
  kind: "KeyChain",
@@ -15244,6 +15403,15 @@ var CONFIG_MIGRATIONS = [
15244
15403
  // spec, imported as before.
15245
15404
  migrate: (spec) => ({ spec })
15246
15405
  },
15406
+ {
15407
+ id: "key-chain-v3-federation-usage",
15408
+ kind: "KeyChain",
15409
+ from: 2,
15410
+ to: 3,
15411
+ // v3 only adds the usage type `federation`: a v2 spec is a valid v3
15412
+ // spec.
15413
+ migrate: (spec) => ({ spec })
15414
+ },
15247
15415
  {
15248
15416
  id: "credential-config-v2-x509-trusted-authority",
15249
15417
  kind: "CredentialConfig",
@@ -16806,6 +16974,143 @@ var CONFIG_SCHEMAS = [
16806
16974
  }
16807
16975
  }
16808
16976
  },
16977
+ {
16978
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
16979
+ "$id": "https://eudiplo.dev/schemas/v1/FederationTrustAnchorConfigFile.schema.json",
16980
+ "title": "FederationTrustAnchorConfigFile",
16981
+ "type": "object",
16982
+ "properties": {
16983
+ "$schema": {
16984
+ "type": "string",
16985
+ "const": "https://eudiplo.dev/schemas/v1/FederationTrustAnchorConfigFile.schema.json"
16986
+ },
16987
+ "metadata": {
16988
+ "type": "object",
16989
+ "properties": {
16990
+ "generation": {
16991
+ "type": "integer",
16992
+ "minimum": 1,
16993
+ "description": "Monotonically increasing configuration generation."
16994
+ },
16995
+ "ownership": {
16996
+ "type": "string",
16997
+ "enum": [
16998
+ "unmanaged",
16999
+ "file-managed"
17000
+ ],
17001
+ "description": "Requested ownership recorded when the document is applied."
17002
+ }
17003
+ },
17004
+ "additionalProperties": false
17005
+ },
17006
+ "spec": {
17007
+ "allOf": [
17008
+ {
17009
+ "$ref": "#/$defs/CreateFederationTrustAnchorDto"
17010
+ },
17011
+ {
17012
+ "type": "object",
17013
+ "required": [
17014
+ "id"
17015
+ ],
17016
+ "properties": {
17017
+ "id": {
17018
+ "type": "string",
17019
+ "minLength": 1
17020
+ }
17021
+ }
17022
+ }
17023
+ ]
17024
+ }
17025
+ },
17026
+ "required": [
17027
+ "$schema",
17028
+ "spec"
17029
+ ],
17030
+ "additionalProperties": false,
17031
+ "$defs": {
17032
+ "CreateFederationTrustAnchorDto": {
17033
+ "type": "object",
17034
+ "properties": {
17035
+ "id": {
17036
+ "type": "string",
17037
+ "minLength": 1,
17038
+ "maxLength": 255,
17039
+ "pattern": "^[A-Za-z0-9._-]+$",
17040
+ "description": "Unique identifier of the trust anchor in the tenant."
17041
+ },
17042
+ "entityId": {
17043
+ "type": "string",
17044
+ "minLength": 1,
17045
+ "maxLength": 2048,
17046
+ "description": "Entity identifier of the trust anchor, exactly as configured in `federation.trustAnchors` and DCQL `openid_federation` values."
17047
+ },
17048
+ "description": {
17049
+ "anyOf": [
17050
+ {
17051
+ "type": "string",
17052
+ "minLength": 1,
17053
+ "maxLength": 1e3
17054
+ },
17055
+ {
17056
+ "type": "null"
17057
+ }
17058
+ ],
17059
+ "description": "Optional description of the trust anchor."
17060
+ },
17061
+ "jwks": {
17062
+ "type": "object",
17063
+ "properties": {
17064
+ "keys": {
17065
+ "minItems": 1,
17066
+ "maxItems": 20,
17067
+ "type": "array",
17068
+ "items": {
17069
+ "type": "object",
17070
+ "properties": {
17071
+ "kty": {
17072
+ "type": "string",
17073
+ "enum": [
17074
+ "EC",
17075
+ "RSA",
17076
+ "OKP"
17077
+ ],
17078
+ "description": "Key type of the public federation key."
17079
+ },
17080
+ "kid": {
17081
+ "type": "string",
17082
+ "minLength": 1,
17083
+ "maxLength": 256,
17084
+ "description": "Key ID. Federation statements name their signing key with `kid`."
17085
+ }
17086
+ },
17087
+ "required": [
17088
+ "kty",
17089
+ "kid"
17090
+ ],
17091
+ "additionalProperties": {},
17092
+ "description": "Public federation key of the trust anchor as a JWK."
17093
+ },
17094
+ "description": "The trust anchor's federation keys."
17095
+ }
17096
+ },
17097
+ "required": [
17098
+ "keys"
17099
+ ],
17100
+ "additionalProperties": false,
17101
+ "description": "JWK set with the federation keys of the trust anchor, obtained out of band (OpenID Federation 1.0 Section 10.2)."
17102
+ }
17103
+ },
17104
+ "required": [
17105
+ "id",
17106
+ "entityId",
17107
+ "jwks"
17108
+ ],
17109
+ "additionalProperties": false,
17110
+ "title": "CreateFederationTrustAnchorDto"
17111
+ }
17112
+ }
17113
+ },
16809
17114
  {
16810
17115
  "$schema": "https://json-schema.org/draft/2020-12/schema",
16811
17116
  "$id": "https://eudiplo.dev/schemas/v1/IssuanceConfigFile.schema.json",
@@ -24368,13 +24673,13 @@ var CONFIG_SCHEMAS = [
24368
24673
  },
24369
24674
  {
24370
24675
  "$schema": "https://json-schema.org/draft/2020-12/schema",
24371
- "$id": "https://eudiplo.dev/schemas/v3/IssuanceConfigFile.schema.json",
24372
- "title": "IssuanceConfigFile",
24676
+ "$id": "https://eudiplo.dev/schemas/v2/TenantConfigFile.schema.json",
24677
+ "title": "TenantConfigFile",
24373
24678
  "type": "object",
24374
24679
  "properties": {
24375
24680
  "$schema": {
24376
24681
  "type": "string",
24377
- "const": "https://eudiplo.dev/schemas/v3/IssuanceConfigFile.schema.json"
24682
+ "const": "https://eudiplo.dev/schemas/v2/TenantConfigFile.schema.json"
24378
24683
  },
24379
24684
  "metadata": {
24380
24685
  "type": "object",
@@ -24382,95 +24687,226 @@ var CONFIG_SCHEMAS = [
24382
24687
  "generation": {
24383
24688
  "type": "integer",
24384
24689
  "minimum": 1,
24385
- "description": "Monotonically increasing configuration generation."
24690
+ "maximum": 9007199254740991
24386
24691
  },
24387
24692
  "ownership": {
24388
24693
  "type": "string",
24389
24694
  "enum": [
24390
24695
  "unmanaged",
24391
24696
  "file-managed"
24392
- ],
24393
- "description": "Requested ownership recorded when the document is applied."
24697
+ ]
24394
24698
  }
24395
24699
  },
24396
24700
  "additionalProperties": false
24397
24701
  },
24398
24702
  "spec": {
24399
- "$ref": "#/$defs/IssuanceConfig"
24400
- }
24401
- },
24402
- "required": [
24403
- "$schema",
24404
- "spec"
24405
- ],
24406
- "additionalProperties": false,
24407
- "$defs": {
24408
- "IssuanceConfig": {
24409
24703
  "type": "object",
24410
24704
  "properties": {
24411
- "batchSize": {
24412
- "description": "Optional issuance batch size.",
24413
- "type": "integer",
24414
- "minimum": 1,
24415
- "maximum": 9007199254740991
24416
- },
24417
- "dPopRequired": {
24418
- "description": "Require DPoP proofs for issuance endpoints.",
24419
- "type": "boolean"
24420
- },
24421
- "walletAttestationRequired": {
24422
- "description": "Default wallet attestation requirement for managed authorization servers.",
24423
- "type": "boolean"
24424
- },
24425
- "walletProviderTrustLists": {
24426
- "description": "Shared wallet provider trust lists for key attestations and default authorization server wallet authentication.",
24427
- "type": "array",
24428
- "items": {
24429
- "type": "object",
24430
- "properties": {
24431
- "trustListId": {
24432
- "type": "string",
24433
- "minLength": 1
24434
- },
24435
- "url": {
24436
- "description": "URL of the wallet provider trust list.",
24437
- "type": "string",
24438
- "format": "uri"
24439
- },
24440
- "verifierKey": {
24441
- "description": "Optional verifier key material used for trust list verification.",
24442
- "type": "object",
24443
- "propertyNames": {
24444
- "type": "string"
24445
- },
24446
- "additionalProperties": {}
24447
- },
24448
- "verifierKeyPem": {
24449
- "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
24450
- "type": "string",
24451
- "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
24452
- },
24453
- "verifierX509Der": {
24454
- "description": "Optional verifier certificate in DER/base64 form.",
24455
- "type": "string"
24456
- }
24457
- },
24458
- "additionalProperties": false
24459
- }
24705
+ "name": {
24706
+ "default": "EUDIPLO",
24707
+ "description": "Display name of the tenant.",
24708
+ "type": "string",
24709
+ "minLength": 1
24460
24710
  },
24461
- "signingKeyId": {
24462
- "description": "Default signing key chain id for credential issuance.",
24711
+ "description": {
24712
+ "description": "Optional tenant description.",
24463
24713
  "type": "string",
24464
24714
  "minLength": 1
24465
24715
  },
24466
- "authorizationServers": {
24467
- "minItems": 1,
24468
- "type": "array",
24469
- "items": {
24470
- "oneOf": [
24471
- {
24472
- "type": "object",
24473
- "properties": {
24716
+ "sessionConfig": {
24717
+ "description": "Optional tenant-specific session storage configuration.",
24718
+ "type": "object",
24719
+ "properties": {
24720
+ "ttlSeconds": {
24721
+ "description": "Session time-to-live in seconds.",
24722
+ "type": "integer",
24723
+ "minimum": 60,
24724
+ "maximum": 9007199254740991
24725
+ },
24726
+ "cleanupMode": {
24727
+ "description": "Whether to fully delete or anonymize expired sessions.",
24728
+ "type": "string",
24729
+ "enum": [
24730
+ "full",
24731
+ "anonymize"
24732
+ ]
24733
+ }
24734
+ },
24735
+ "additionalProperties": false
24736
+ },
24737
+ "statusListConfig": {
24738
+ "description": "Optional tenant-specific status list defaults.",
24739
+ "type": "object",
24740
+ "properties": {
24741
+ "capacity": {
24742
+ "description": "Default status list capacity.",
24743
+ "type": "integer",
24744
+ "minimum": 100,
24745
+ "maximum": 9007199254740991
24746
+ },
24747
+ "bits": {
24748
+ "description": "Bits-per-status setting (1, 2, 4, or 8).",
24749
+ "anyOf": [
24750
+ {
24751
+ "type": "number",
24752
+ "const": 1
24753
+ },
24754
+ {
24755
+ "type": "number",
24756
+ "const": 2
24757
+ },
24758
+ {
24759
+ "type": "number",
24760
+ "const": 4
24761
+ },
24762
+ {
24763
+ "type": "number",
24764
+ "const": 8
24765
+ }
24766
+ ]
24767
+ },
24768
+ "ttl": {
24769
+ "description": "JWT TTL for status list tokens in seconds.",
24770
+ "type": "integer",
24771
+ "minimum": 60,
24772
+ "maximum": 9007199254740991
24773
+ },
24774
+ "immediateUpdate": {
24775
+ "description": "Regenerate status list JWTs immediately after status updates.",
24776
+ "type": "boolean"
24777
+ },
24778
+ "enableAggregation": {
24779
+ "description": "Include aggregation_uri in generated status list JWTs.",
24780
+ "type": "boolean"
24781
+ }
24782
+ },
24783
+ "additionalProperties": false
24784
+ },
24785
+ "defaultAccessKeyChainId": {
24786
+ "description": "ID of the access key chain used where no configuration names one: presentation requests of configurations without accessKeyChainId and the signed issuer metadata. Without it, EUDIPLO picks one of the tenant's access key chains by rule.",
24787
+ "type": "string",
24788
+ "minLength": 1
24789
+ }
24790
+ },
24791
+ "required": [
24792
+ "name"
24793
+ ],
24794
+ "additionalProperties": false,
24795
+ "description": "Payload used when importing tenant metadata from config files."
24796
+ }
24797
+ },
24798
+ "required": [
24799
+ "$schema",
24800
+ "metadata",
24801
+ "spec"
24802
+ ],
24803
+ "additionalProperties": false
24804
+ },
24805
+ {
24806
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
24807
+ "$id": "https://eudiplo.dev/schemas/v3/IssuanceConfigFile.schema.json",
24808
+ "title": "IssuanceConfigFile",
24809
+ "type": "object",
24810
+ "properties": {
24811
+ "$schema": {
24812
+ "type": "string",
24813
+ "const": "https://eudiplo.dev/schemas/v3/IssuanceConfigFile.schema.json"
24814
+ },
24815
+ "metadata": {
24816
+ "type": "object",
24817
+ "properties": {
24818
+ "generation": {
24819
+ "type": "integer",
24820
+ "minimum": 1,
24821
+ "description": "Monotonically increasing configuration generation."
24822
+ },
24823
+ "ownership": {
24824
+ "type": "string",
24825
+ "enum": [
24826
+ "unmanaged",
24827
+ "file-managed"
24828
+ ],
24829
+ "description": "Requested ownership recorded when the document is applied."
24830
+ }
24831
+ },
24832
+ "additionalProperties": false
24833
+ },
24834
+ "spec": {
24835
+ "$ref": "#/$defs/IssuanceConfig"
24836
+ }
24837
+ },
24838
+ "required": [
24839
+ "$schema",
24840
+ "spec"
24841
+ ],
24842
+ "additionalProperties": false,
24843
+ "$defs": {
24844
+ "IssuanceConfig": {
24845
+ "type": "object",
24846
+ "properties": {
24847
+ "batchSize": {
24848
+ "description": "Optional issuance batch size.",
24849
+ "type": "integer",
24850
+ "minimum": 1,
24851
+ "maximum": 9007199254740991
24852
+ },
24853
+ "dPopRequired": {
24854
+ "description": "Require DPoP proofs for issuance endpoints.",
24855
+ "type": "boolean"
24856
+ },
24857
+ "walletAttestationRequired": {
24858
+ "description": "Default wallet attestation requirement for managed authorization servers.",
24859
+ "type": "boolean"
24860
+ },
24861
+ "walletProviderTrustLists": {
24862
+ "description": "Shared wallet provider trust lists for key attestations and default authorization server wallet authentication.",
24863
+ "type": "array",
24864
+ "items": {
24865
+ "type": "object",
24866
+ "properties": {
24867
+ "trustListId": {
24868
+ "type": "string",
24869
+ "minLength": 1
24870
+ },
24871
+ "url": {
24872
+ "description": "URL of the wallet provider trust list.",
24873
+ "type": "string",
24874
+ "format": "uri"
24875
+ },
24876
+ "verifierKey": {
24877
+ "description": "Optional verifier key material used for trust list verification.",
24878
+ "type": "object",
24879
+ "propertyNames": {
24880
+ "type": "string"
24881
+ },
24882
+ "additionalProperties": {}
24883
+ },
24884
+ "verifierKeyPem": {
24885
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
24886
+ "type": "string",
24887
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
24888
+ },
24889
+ "verifierX509Der": {
24890
+ "description": "Optional verifier certificate in DER/base64 form.",
24891
+ "type": "string"
24892
+ }
24893
+ },
24894
+ "additionalProperties": false
24895
+ }
24896
+ },
24897
+ "signingKeyId": {
24898
+ "description": "Default signing key chain id for credential issuance.",
24899
+ "type": "string",
24900
+ "minLength": 1
24901
+ },
24902
+ "authorizationServers": {
24903
+ "minItems": 1,
24904
+ "type": "array",
24905
+ "items": {
24906
+ "oneOf": [
24907
+ {
24908
+ "type": "object",
24909
+ "properties": {
24474
24910
  "type": {
24475
24911
  "type": "string",
24476
24912
  "const": "external",
@@ -25063,13 +25499,13 @@ var CONFIG_SCHEMAS = [
25063
25499
  },
25064
25500
  {
25065
25501
  "$schema": "https://json-schema.org/draft/2020-12/schema",
25066
- "$id": "https://eudiplo.dev/schemas/v3/PresentationConfigFile.schema.json",
25067
- "title": "PresentationConfigFile",
25502
+ "$id": "https://eudiplo.dev/schemas/v3/KeyChainConfigFile.schema.json",
25503
+ "title": "KeyChainConfigFile",
25068
25504
  "type": "object",
25069
25505
  "properties": {
25070
25506
  "$schema": {
25071
25507
  "type": "string",
25072
- "const": "https://eudiplo.dev/schemas/v3/PresentationConfigFile.schema.json"
25508
+ "const": "https://eudiplo.dev/schemas/v3/KeyChainConfigFile.schema.json"
25073
25509
  },
25074
25510
  "metadata": {
25075
25511
  "type": "object",
@@ -25077,597 +25513,1850 @@ var CONFIG_SCHEMAS = [
25077
25513
  "generation": {
25078
25514
  "type": "integer",
25079
25515
  "minimum": 1,
25080
- "description": "Monotonically increasing configuration generation."
25516
+ "maximum": 9007199254740991
25081
25517
  },
25082
25518
  "ownership": {
25083
25519
  "type": "string",
25084
25520
  "enum": [
25085
25521
  "unmanaged",
25086
25522
  "file-managed"
25087
- ],
25088
- "description": "Requested ownership recorded when the document is applied."
25523
+ ]
25089
25524
  }
25090
25525
  },
25091
25526
  "additionalProperties": false
25092
25527
  },
25093
25528
  "spec": {
25094
- "allOf": [
25095
- {
25096
- "$ref": "#/$defs/PresentationConfigCreateDto"
25097
- },
25098
- {
25099
- "type": "object",
25100
- "required": [
25101
- "id"
25102
- ],
25103
- "properties": {
25104
- "id": {
25105
- "type": "string",
25106
- "minLength": 1
25107
- }
25108
- }
25109
- }
25110
- ]
25111
- }
25112
- },
25113
- "required": [
25114
- "$schema",
25115
- "spec"
25116
- ],
25117
- "additionalProperties": false,
25118
- "$defs": {
25119
- "PresentationConfigCreateDto": {
25120
25529
  "type": "object",
25121
25530
  "properties": {
25122
25531
  "id": {
25123
- "type": "string",
25124
- "minLength": 1,
25125
- "description": "Presentation configuration identifier."
25532
+ "type": "string"
25126
25533
  },
25127
25534
  "description": {
25128
- "description": "Optional presentation configuration description.",
25129
- "type": [
25130
- "string",
25131
- "null"
25132
- ]
25133
- },
25134
- "lifeTime": {
25135
- "description": "Presentation request lifetime in seconds.",
25136
- "type": "integer",
25137
- "minimum": 1,
25138
- "maximum": 9007199254740991
25139
- },
25140
- "skewSeconds": {
25141
- "description": "Clock skew tolerance in seconds.",
25142
- "type": "integer",
25143
- "minimum": 0,
25144
- "maximum": 9007199254740991
25535
+ "type": "string"
25145
25536
  },
25146
- "statusCheckMode": {
25147
- "description": "Revocation/status check mode.",
25537
+ "usageType": {
25148
25538
  "type": "string",
25149
25539
  "enum": [
25150
- "strict",
25151
- "best_effort",
25152
- "disabled"
25153
- ]
25540
+ "access",
25541
+ "attestation",
25542
+ "trustList",
25543
+ "statusList",
25544
+ "federation",
25545
+ "encrypt"
25546
+ ]
25547
+ },
25548
+ "type": {
25549
+ "description": "Key chain type. For a `private-jwk` key source without `activeJwk`, `standalone` makes `jwk` the signing key and `crt` its chain, leaf first; `internalChain` makes `jwk` a CA key and the last `crt` entry its CA certificate (created if `crt` is omitted), and the import generates a new signing key with a certificate issued by it. Without `type`, `jwk` is a CA key only if `rotationPolicy.enabled` is true and `crt` is not a single self-signed certificate that is not a CA. For `regenerate`, it is the type of the new key chain and must equal `keySource.keyChainType` if both are set. For the other key sources, it must match the key chain they describe.",
25550
+ "type": "string",
25551
+ "enum": [
25552
+ "standalone",
25553
+ "internalChain"
25554
+ ]
25555
+ },
25556
+ "keySource": {
25557
+ "oneOf": [
25558
+ {
25559
+ "type": "object",
25560
+ "properties": {
25561
+ "type": {
25562
+ "type": "string",
25563
+ "const": "private-jwk"
25564
+ },
25565
+ "jwk": {
25566
+ "type": "object",
25567
+ "properties": {
25568
+ "kty": {
25569
+ "type": "string",
25570
+ "description": "Key type (for example EC)."
25571
+ },
25572
+ "x": {
25573
+ "type": "string",
25574
+ "description": "Elliptic curve public x coordinate."
25575
+ },
25576
+ "y": {
25577
+ "type": "string",
25578
+ "description": "Elliptic curve public y coordinate."
25579
+ },
25580
+ "crv": {
25581
+ "type": "string",
25582
+ "description": "Elliptic curve name."
25583
+ },
25584
+ "d": {
25585
+ "type": "string",
25586
+ "description": "Private key value."
25587
+ },
25588
+ "alg": {
25589
+ "description": "Optional algorithm hint.",
25590
+ "type": "string"
25591
+ },
25592
+ "kid": {
25593
+ "description": "Optional key identifier.",
25594
+ "type": "string"
25595
+ }
25596
+ },
25597
+ "required": [
25598
+ "kty",
25599
+ "x",
25600
+ "y",
25601
+ "crv",
25602
+ "d"
25603
+ ],
25604
+ "additionalProperties": false
25605
+ },
25606
+ "activeJwk": {
25607
+ "type": "object",
25608
+ "properties": {
25609
+ "kty": {
25610
+ "type": "string",
25611
+ "description": "Key type (for example EC)."
25612
+ },
25613
+ "x": {
25614
+ "type": "string",
25615
+ "description": "Elliptic curve public x coordinate."
25616
+ },
25617
+ "y": {
25618
+ "type": "string",
25619
+ "description": "Elliptic curve public y coordinate."
25620
+ },
25621
+ "crv": {
25622
+ "type": "string",
25623
+ "description": "Elliptic curve name."
25624
+ },
25625
+ "d": {
25626
+ "type": "string",
25627
+ "description": "Private key value."
25628
+ },
25629
+ "alg": {
25630
+ "description": "Optional algorithm hint.",
25631
+ "type": "string"
25632
+ },
25633
+ "kid": {
25634
+ "description": "Optional key identifier.",
25635
+ "type": "string"
25636
+ }
25637
+ },
25638
+ "required": [
25639
+ "kty",
25640
+ "x",
25641
+ "y",
25642
+ "crv",
25643
+ "d"
25644
+ ],
25645
+ "additionalProperties": false
25646
+ }
25647
+ },
25648
+ "required": [
25649
+ "type",
25650
+ "jwk"
25651
+ ],
25652
+ "additionalProperties": false
25653
+ },
25654
+ {
25655
+ "type": "object",
25656
+ "properties": {
25657
+ "type": {
25658
+ "type": "string",
25659
+ "const": "external-reference"
25660
+ },
25661
+ "provider": {
25662
+ "type": "string"
25663
+ },
25664
+ "externalKeyId": {
25665
+ "type": "string"
25666
+ },
25667
+ "publicJwk": {
25668
+ "type": "object",
25669
+ "properties": {
25670
+ "kty": {
25671
+ "type": "string"
25672
+ },
25673
+ "x": {
25674
+ "type": "string"
25675
+ },
25676
+ "y": {
25677
+ "type": "string"
25678
+ },
25679
+ "crv": {
25680
+ "type": "string"
25681
+ },
25682
+ "alg": {
25683
+ "type": "string"
25684
+ },
25685
+ "kid": {
25686
+ "type": "string"
25687
+ }
25688
+ },
25689
+ "required": [
25690
+ "kty",
25691
+ "x",
25692
+ "y",
25693
+ "crv"
25694
+ ],
25695
+ "additionalProperties": false
25696
+ },
25697
+ "activeExternalKeyId": {
25698
+ "type": "string"
25699
+ },
25700
+ "activePublicJwk": {
25701
+ "type": "object",
25702
+ "properties": {
25703
+ "kty": {
25704
+ "type": "string"
25705
+ },
25706
+ "x": {
25707
+ "type": "string"
25708
+ },
25709
+ "y": {
25710
+ "type": "string"
25711
+ },
25712
+ "crv": {
25713
+ "type": "string"
25714
+ },
25715
+ "alg": {
25716
+ "type": "string"
25717
+ },
25718
+ "kid": {
25719
+ "type": "string"
25720
+ }
25721
+ },
25722
+ "required": [
25723
+ "kty",
25724
+ "x",
25725
+ "y",
25726
+ "crv"
25727
+ ],
25728
+ "additionalProperties": false
25729
+ }
25730
+ },
25731
+ "required": [
25732
+ "type",
25733
+ "provider",
25734
+ "externalKeyId",
25735
+ "publicJwk"
25736
+ ],
25737
+ "additionalProperties": false
25738
+ },
25739
+ {
25740
+ "type": "object",
25741
+ "properties": {
25742
+ "type": {
25743
+ "type": "string",
25744
+ "const": "required"
25745
+ },
25746
+ "publicJwk": {
25747
+ "type": "object",
25748
+ "properties": {
25749
+ "kty": {
25750
+ "type": "string"
25751
+ },
25752
+ "x": {
25753
+ "type": "string"
25754
+ },
25755
+ "y": {
25756
+ "type": "string"
25757
+ },
25758
+ "crv": {
25759
+ "type": "string"
25760
+ },
25761
+ "alg": {
25762
+ "type": "string"
25763
+ },
25764
+ "kid": {
25765
+ "type": "string"
25766
+ }
25767
+ },
25768
+ "required": [
25769
+ "kty",
25770
+ "x",
25771
+ "y",
25772
+ "crv"
25773
+ ],
25774
+ "additionalProperties": false
25775
+ }
25776
+ },
25777
+ "required": [
25778
+ "type"
25779
+ ],
25780
+ "additionalProperties": false
25781
+ },
25782
+ {
25783
+ "type": "object",
25784
+ "properties": {
25785
+ "type": {
25786
+ "type": "string",
25787
+ "const": "regenerate"
25788
+ },
25789
+ "keyChainType": {
25790
+ "type": "string",
25791
+ "enum": [
25792
+ "standalone",
25793
+ "internalChain"
25794
+ ]
25795
+ }
25796
+ },
25797
+ "required": [
25798
+ "type"
25799
+ ],
25800
+ "additionalProperties": false
25801
+ }
25802
+ ]
25803
+ },
25804
+ "crt": {
25805
+ "type": "array",
25806
+ "items": {
25807
+ "type": "string"
25808
+ }
25809
+ },
25810
+ "activeCertificate": {
25811
+ "description": "Active certificate for an internal key chain.",
25812
+ "type": "string"
25813
+ },
25814
+ "kmsProvider": {
25815
+ "type": "string"
25816
+ },
25817
+ "rotationPolicy": {
25818
+ "type": "object",
25819
+ "properties": {
25820
+ "enabled": {
25821
+ "type": "boolean"
25822
+ },
25823
+ "intervalDays": {
25824
+ "anyOf": [
25825
+ {
25826
+ "type": "number",
25827
+ "minimum": 1,
25828
+ "maximum": 3650
25829
+ },
25830
+ {
25831
+ "type": "null"
25832
+ }
25833
+ ]
25834
+ },
25835
+ "certValidityDays": {
25836
+ "anyOf": [
25837
+ {
25838
+ "type": "number",
25839
+ "minimum": 1,
25840
+ "maximum": 3650
25841
+ },
25842
+ {
25843
+ "type": "null"
25844
+ }
25845
+ ]
25846
+ }
25847
+ },
25848
+ "required": [
25849
+ "enabled"
25850
+ ],
25851
+ "additionalProperties": false
25852
+ }
25853
+ },
25854
+ "required": [
25855
+ "usageType",
25856
+ "keySource"
25857
+ ],
25858
+ "additionalProperties": false
25859
+ }
25860
+ },
25861
+ "required": [
25862
+ "$schema",
25863
+ "metadata",
25864
+ "spec"
25865
+ ],
25866
+ "additionalProperties": false
25867
+ },
25868
+ {
25869
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
25870
+ "$id": "https://eudiplo.dev/schemas/v3/PresentationConfigFile.schema.json",
25871
+ "title": "PresentationConfigFile",
25872
+ "type": "object",
25873
+ "properties": {
25874
+ "$schema": {
25875
+ "type": "string",
25876
+ "const": "https://eudiplo.dev/schemas/v3/PresentationConfigFile.schema.json"
25877
+ },
25878
+ "metadata": {
25879
+ "type": "object",
25880
+ "properties": {
25881
+ "generation": {
25882
+ "type": "integer",
25883
+ "minimum": 1,
25884
+ "description": "Monotonically increasing configuration generation."
25885
+ },
25886
+ "ownership": {
25887
+ "type": "string",
25888
+ "enum": [
25889
+ "unmanaged",
25890
+ "file-managed"
25891
+ ],
25892
+ "description": "Requested ownership recorded when the document is applied."
25893
+ }
25894
+ },
25895
+ "additionalProperties": false
25896
+ },
25897
+ "spec": {
25898
+ "allOf": [
25899
+ {
25900
+ "$ref": "#/$defs/PresentationConfigCreateDto"
25901
+ },
25902
+ {
25903
+ "type": "object",
25904
+ "required": [
25905
+ "id"
25906
+ ],
25907
+ "properties": {
25908
+ "id": {
25909
+ "type": "string",
25910
+ "minLength": 1
25911
+ }
25912
+ }
25913
+ }
25914
+ ]
25915
+ }
25916
+ },
25917
+ "required": [
25918
+ "$schema",
25919
+ "spec"
25920
+ ],
25921
+ "additionalProperties": false,
25922
+ "$defs": {
25923
+ "PresentationConfigCreateDto": {
25924
+ "type": "object",
25925
+ "properties": {
25926
+ "id": {
25927
+ "type": "string",
25928
+ "minLength": 1,
25929
+ "description": "Presentation configuration identifier."
25930
+ },
25931
+ "description": {
25932
+ "description": "Optional presentation configuration description.",
25933
+ "type": [
25934
+ "string",
25935
+ "null"
25936
+ ]
25937
+ },
25938
+ "lifeTime": {
25939
+ "description": "Presentation request lifetime in seconds.",
25940
+ "type": "integer",
25941
+ "minimum": 1,
25942
+ "maximum": 9007199254740991
25943
+ },
25944
+ "skewSeconds": {
25945
+ "description": "Clock skew tolerance in seconds.",
25946
+ "type": "integer",
25947
+ "minimum": 0,
25948
+ "maximum": 9007199254740991
25949
+ },
25950
+ "statusCheckMode": {
25951
+ "description": "Revocation/status check mode.",
25952
+ "type": "string",
25953
+ "enum": [
25954
+ "strict",
25955
+ "best_effort",
25956
+ "disabled"
25957
+ ]
25958
+ },
25959
+ "dcql_query": {
25960
+ "type": "object",
25961
+ "properties": {
25962
+ "credentials": {
25963
+ "minItems": 1,
25964
+ "type": "array",
25965
+ "items": {
25966
+ "oneOf": [
25967
+ {
25968
+ "type": "object",
25969
+ "properties": {
25970
+ "id": {
25971
+ "type": "string",
25972
+ "minLength": 1,
25973
+ "pattern": "^[A-Za-z0-9_-]+$",
25974
+ "description": "Credential query identifier."
25975
+ },
25976
+ "multiple": {
25977
+ "description": "Allow multiple matching credentials.",
25978
+ "type": "boolean"
25979
+ },
25980
+ "claim_sets": {
25981
+ "description": "Optional claim set constraints.",
25982
+ "type": "array",
25983
+ "items": {
25984
+ "type": "array",
25985
+ "items": {
25986
+ "type": "string"
25987
+ }
25988
+ }
25989
+ },
25990
+ "trusted_authorities": {
25991
+ "description": "Optional trusted authority constraints.",
25992
+ "type": "array",
25993
+ "items": {
25994
+ "oneOf": [
25995
+ {
25996
+ "type": "object",
25997
+ "properties": {
25998
+ "type": {
25999
+ "type": "string",
26000
+ "const": "etsi_tl",
26001
+ "description": "Trusted authority type discriminator for ETSI trust lists."
26002
+ },
26003
+ "values": {
26004
+ "type": "array",
26005
+ "items": {
26006
+ "type": "object",
26007
+ "properties": {
26008
+ "trustListId": {
26009
+ "description": "Optional trust list id reference.",
26010
+ "type": "string"
26011
+ },
26012
+ "url": {
26013
+ "description": "Optional trust list URL reference.",
26014
+ "anyOf": [
26015
+ {
26016
+ "type": "string",
26017
+ "format": "uri"
26018
+ },
26019
+ {
26020
+ "type": "string",
26021
+ "pattern": "^<TENANT_URL>(?:\\/.*)?$"
26022
+ }
26023
+ ]
26024
+ },
26025
+ "verifierKey": {
26026
+ "description": "Optional verifier key material.",
26027
+ "type": "object",
26028
+ "propertyNames": {
26029
+ "type": "string"
26030
+ },
26031
+ "additionalProperties": {}
26032
+ },
26033
+ "verifierX509Der": {
26034
+ "description": "Optional verifier certificate in DER/base64 form.",
26035
+ "type": "string"
26036
+ }
26037
+ },
26038
+ "additionalProperties": false
26039
+ },
26040
+ "description": "Trust list references for ETSI TL verification."
26041
+ }
26042
+ },
26043
+ "required": [
26044
+ "type",
26045
+ "values"
26046
+ ],
26047
+ "additionalProperties": false
26048
+ },
26049
+ {
26050
+ "type": "object",
26051
+ "properties": {
26052
+ "type": {
26053
+ "type": "string",
26054
+ "const": "openid_federation",
26055
+ "description": "Trusted authority type discriminator for OpenID Federation."
26056
+ },
26057
+ "values": {
26058
+ "type": "array",
26059
+ "items": {
26060
+ "type": "string"
26061
+ },
26062
+ "description": "OpenID Federation authority identifiers."
26063
+ }
26064
+ },
26065
+ "required": [
26066
+ "type",
26067
+ "values"
26068
+ ],
26069
+ "additionalProperties": false
26070
+ }
26071
+ ]
26072
+ }
26073
+ },
26074
+ "format": {
26075
+ "type": "string",
26076
+ "const": "dc+sd-jwt",
26077
+ "description": "Credential format discriminator."
26078
+ },
26079
+ "meta": {
26080
+ "type": "object",
26081
+ "properties": {
26082
+ "vct_values": {
26083
+ "minItems": 1,
26084
+ "type": "array",
26085
+ "items": {
26086
+ "type": "string"
26087
+ },
26088
+ "description": "Accepted VCT values."
26089
+ }
26090
+ },
26091
+ "required": [
26092
+ "vct_values"
26093
+ ],
26094
+ "additionalProperties": false
26095
+ },
26096
+ "claims": {
26097
+ "description": "Optional claim-level constraints.",
26098
+ "type": "array",
26099
+ "items": {
26100
+ "type": "object",
26101
+ "properties": {
26102
+ "id": {
26103
+ "description": "Optional claim query id.",
26104
+ "type": "string"
26105
+ },
26106
+ "path": {
26107
+ "type": "array",
26108
+ "items": {
26109
+ "type": [
26110
+ "string",
26111
+ "number"
26112
+ ]
26113
+ },
26114
+ "description": "Path to the claim value in presented credentials."
26115
+ },
26116
+ "values": {
26117
+ "description": "Optional allowed values for the claim. A disclosed value must equal one of them in type and value.",
26118
+ "minItems": 1,
26119
+ "type": "array",
26120
+ "items": {
26121
+ "anyOf": [
26122
+ {
26123
+ "type": "string"
26124
+ },
26125
+ {
26126
+ "type": "integer",
26127
+ "minimum": -9007199254740991,
26128
+ "maximum": 9007199254740991
26129
+ },
26130
+ {
26131
+ "type": "boolean"
26132
+ }
26133
+ ]
26134
+ }
26135
+ }
26136
+ },
26137
+ "required": [
26138
+ "path"
26139
+ ],
26140
+ "additionalProperties": false
26141
+ }
26142
+ }
26143
+ },
26144
+ "required": [
26145
+ "id",
26146
+ "format",
26147
+ "meta"
26148
+ ],
26149
+ "additionalProperties": false
26150
+ },
26151
+ {
26152
+ "type": "object",
26153
+ "properties": {
26154
+ "id": {
26155
+ "type": "string",
26156
+ "minLength": 1,
26157
+ "pattern": "^[A-Za-z0-9_-]+$",
26158
+ "description": "Credential query identifier."
26159
+ },
26160
+ "multiple": {
26161
+ "description": "Allow multiple matching credentials.",
26162
+ "type": "boolean"
26163
+ },
26164
+ "claim_sets": {
26165
+ "description": "Optional claim set constraints.",
26166
+ "type": "array",
26167
+ "items": {
26168
+ "type": "array",
26169
+ "items": {
26170
+ "type": "string"
26171
+ }
26172
+ }
26173
+ },
26174
+ "trusted_authorities": {
26175
+ "description": "Optional trusted authority constraints.",
26176
+ "type": "array",
26177
+ "items": {
26178
+ "oneOf": [
26179
+ {
26180
+ "type": "object",
26181
+ "properties": {
26182
+ "type": {
26183
+ "type": "string",
26184
+ "const": "etsi_tl",
26185
+ "description": "Trusted authority type discriminator for ETSI trust lists."
26186
+ },
26187
+ "values": {
26188
+ "type": "array",
26189
+ "items": {
26190
+ "type": "object",
26191
+ "properties": {
26192
+ "trustListId": {
26193
+ "description": "Optional trust list id reference.",
26194
+ "type": "string"
26195
+ },
26196
+ "url": {
26197
+ "description": "Optional trust list URL reference.",
26198
+ "anyOf": [
26199
+ {
26200
+ "type": "string",
26201
+ "format": "uri"
26202
+ },
26203
+ {
26204
+ "type": "string",
26205
+ "pattern": "^<TENANT_URL>(?:\\/.*)?$"
26206
+ }
26207
+ ]
26208
+ },
26209
+ "verifierKey": {
26210
+ "description": "Optional verifier key material.",
26211
+ "type": "object",
26212
+ "propertyNames": {
26213
+ "type": "string"
26214
+ },
26215
+ "additionalProperties": {}
26216
+ },
26217
+ "verifierX509Der": {
26218
+ "description": "Optional verifier certificate in DER/base64 form.",
26219
+ "type": "string"
26220
+ }
26221
+ },
26222
+ "additionalProperties": false
26223
+ },
26224
+ "description": "Trust list references for ETSI TL verification."
26225
+ }
26226
+ },
26227
+ "required": [
26228
+ "type",
26229
+ "values"
26230
+ ],
26231
+ "additionalProperties": false
26232
+ },
26233
+ {
26234
+ "type": "object",
26235
+ "properties": {
26236
+ "type": {
26237
+ "type": "string",
26238
+ "const": "openid_federation",
26239
+ "description": "Trusted authority type discriminator for OpenID Federation."
26240
+ },
26241
+ "values": {
26242
+ "type": "array",
26243
+ "items": {
26244
+ "type": "string"
26245
+ },
26246
+ "description": "OpenID Federation authority identifiers."
26247
+ }
26248
+ },
26249
+ "required": [
26250
+ "type",
26251
+ "values"
26252
+ ],
26253
+ "additionalProperties": false
26254
+ }
26255
+ ]
26256
+ }
26257
+ },
26258
+ "format": {
26259
+ "type": "string",
26260
+ "const": "mso_mdoc",
26261
+ "description": "Credential format discriminator."
26262
+ },
26263
+ "meta": {
26264
+ "type": "object",
26265
+ "properties": {
26266
+ "doctype_value": {
26267
+ "type": "string",
26268
+ "minLength": 1,
26269
+ "description": "Expected mDoc doctype value."
26270
+ }
26271
+ },
26272
+ "required": [
26273
+ "doctype_value"
26274
+ ],
26275
+ "additionalProperties": false
26276
+ },
26277
+ "claims": {
26278
+ "description": "Optional mDoc claim-level constraints.",
26279
+ "type": "array",
26280
+ "items": {
26281
+ "type": "object",
26282
+ "properties": {
26283
+ "id": {
26284
+ "description": "Optional claim query id.",
26285
+ "type": "string"
26286
+ },
26287
+ "path": {
26288
+ "type": "array",
26289
+ "items": {
26290
+ "type": [
26291
+ "string",
26292
+ "number"
26293
+ ]
26294
+ },
26295
+ "description": "Path to the claim value in presented credentials."
26296
+ },
26297
+ "values": {
26298
+ "description": "Optional allowed values for the claim. A disclosed value must equal one of them in type and value.",
26299
+ "minItems": 1,
26300
+ "type": "array",
26301
+ "items": {
26302
+ "anyOf": [
26303
+ {
26304
+ "type": "string"
26305
+ },
26306
+ {
26307
+ "type": "integer",
26308
+ "minimum": -9007199254740991,
26309
+ "maximum": 9007199254740991
26310
+ },
26311
+ {
26312
+ "type": "boolean"
26313
+ }
26314
+ ]
26315
+ }
26316
+ },
26317
+ "intent_to_retain": {
26318
+ "description": "Whether relying party intends to retain the claim.",
26319
+ "type": "boolean"
26320
+ }
26321
+ },
26322
+ "required": [
26323
+ "path"
26324
+ ],
26325
+ "additionalProperties": false
26326
+ }
26327
+ }
26328
+ },
26329
+ "required": [
26330
+ "id",
26331
+ "format",
26332
+ "meta"
26333
+ ],
26334
+ "additionalProperties": false
26335
+ }
26336
+ ]
26337
+ },
26338
+ "description": "Credential queries requested by the verifier."
26339
+ },
26340
+ "credential_sets": {
26341
+ "description": "Optional higher-level credential set requirements.",
26342
+ "type": "array",
26343
+ "items": {
26344
+ "type": "object",
26345
+ "properties": {
26346
+ "options": {
26347
+ "minItems": 1,
26348
+ "type": "array",
26349
+ "items": {
26350
+ "minItems": 1,
26351
+ "type": "array",
26352
+ "items": {
26353
+ "type": "string"
26354
+ }
26355
+ },
26356
+ "description": "Alternative credential query id combinations."
26357
+ },
26358
+ "required": {
26359
+ "description": "Whether this credential set is mandatory.",
26360
+ "type": "boolean"
26361
+ }
26362
+ },
26363
+ "required": [
26364
+ "options"
26365
+ ],
26366
+ "additionalProperties": false
26367
+ }
26368
+ }
26369
+ },
26370
+ "required": [
26371
+ "credentials"
26372
+ ],
26373
+ "additionalProperties": false,
26374
+ "description": "DCQL query defining requested credentials and claims."
26375
+ },
26376
+ "transaction_data": {
26377
+ "description": "Optional transaction data descriptors.",
26378
+ "anyOf": [
26379
+ {
26380
+ "type": "array",
26381
+ "items": {
26382
+ "type": "object",
26383
+ "properties": {
26384
+ "type": {
26385
+ "type": "string",
26386
+ "description": "Transaction data type identifier."
26387
+ },
26388
+ "credential_ids": {
26389
+ "type": "array",
26390
+ "items": {
26391
+ "type": "string"
26392
+ },
26393
+ "description": "Credential query ids this transaction data applies to."
26394
+ },
26395
+ "payload": {
26396
+ "description": "Transaction details. Required for TS12 SCA transaction data."
26397
+ }
26398
+ },
26399
+ "required": [
26400
+ "type",
26401
+ "credential_ids"
26402
+ ],
26403
+ "additionalProperties": {}
26404
+ }
26405
+ },
26406
+ {
26407
+ "type": "null"
26408
+ }
26409
+ ]
26410
+ },
26411
+ "registration_cert": {
26412
+ "description": "Optional registration certificate request settings.",
26413
+ "anyOf": [
26414
+ {
26415
+ "type": "object",
26416
+ "properties": {
26417
+ "id": {
26418
+ "type": "string"
26419
+ },
26420
+ "body": {
26421
+ "type": "object",
26422
+ "properties": {
26423
+ "privacy_policy": {
26424
+ "type": "string"
26425
+ },
26426
+ "support_uri": {
26427
+ "type": "string"
26428
+ },
26429
+ "intermediary": {
26430
+ "type": "string"
26431
+ },
26432
+ "purpose": {
26433
+ "type": "array",
26434
+ "items": {
26435
+ "type": "object",
26436
+ "properties": {
26437
+ "lang": {
26438
+ "type": "string"
26439
+ },
26440
+ "content": {
26441
+ "type": "string"
26442
+ }
26443
+ },
26444
+ "required": [
26445
+ "lang",
26446
+ "content"
26447
+ ],
26448
+ "additionalProperties": false
26449
+ }
26450
+ },
26451
+ "credentials": {
26452
+ "type": "array",
26453
+ "items": {
26454
+ "type": "object",
26455
+ "propertyNames": {
26456
+ "type": "string"
26457
+ },
26458
+ "additionalProperties": {}
26459
+ }
26460
+ },
26461
+ "provides_attestations": {
26462
+ "type": "array",
26463
+ "items": {
26464
+ "type": "string",
26465
+ "minLength": 1
26466
+ }
26467
+ }
26468
+ },
26469
+ "additionalProperties": false
26470
+ },
26471
+ "jwt": {
26472
+ "type": "string"
26473
+ }
26474
+ },
26475
+ "additionalProperties": false
26476
+ },
26477
+ {
26478
+ "type": "null"
26479
+ }
26480
+ ]
26481
+ },
26482
+ "registrationCertImportJwt": {
26483
+ "description": "Optional imported registration certificate JWT.",
26484
+ "type": [
26485
+ "string",
26486
+ "null"
26487
+ ]
26488
+ },
26489
+ "registrationCertImportId": {
26490
+ "description": "Optional registrar-side registration certificate id.",
26491
+ "type": [
26492
+ "string",
26493
+ "null"
26494
+ ]
26495
+ },
26496
+ "registrationCertBodyPrivacyPolicy": {
26497
+ "description": "Optional registration certificate privacy policy URI.",
26498
+ "type": [
26499
+ "string",
26500
+ "null"
26501
+ ]
26502
+ },
26503
+ "registrationCertBodySupportUri": {
26504
+ "description": "Optional registration certificate support URI.",
26505
+ "type": [
26506
+ "string",
26507
+ "null"
26508
+ ]
26509
+ },
26510
+ "registrationCertBodyIntermediary": {
26511
+ "description": "Optional registration certificate intermediary.",
26512
+ "type": [
26513
+ "string",
26514
+ "null"
26515
+ ]
26516
+ },
26517
+ "registrationCertBodyPurpose": {
26518
+ "description": "Optional registration certificate purpose entries.",
26519
+ "anyOf": [
26520
+ {
26521
+ "type": "array",
26522
+ "items": {
26523
+ "type": "object",
26524
+ "properties": {
26525
+ "lang": {
26526
+ "type": "string"
26527
+ },
26528
+ "content": {
26529
+ "type": "string"
26530
+ }
26531
+ },
26532
+ "additionalProperties": false
26533
+ }
26534
+ },
26535
+ {
26536
+ "type": "null"
26537
+ }
26538
+ ]
26539
+ },
26540
+ "webhookEndpointId": {
26541
+ "description": "Optional webhook endpoint id for presentation callbacks.",
26542
+ "type": [
26543
+ "string",
26544
+ "null"
26545
+ ]
26546
+ },
26547
+ "attached": {
26548
+ "description": "Optional attachments included with presentation requests.",
26549
+ "anyOf": [
26550
+ {
26551
+ "type": "array",
26552
+ "items": {
26553
+ "type": "object",
26554
+ "properties": {
26555
+ "format": {
26556
+ "type": "string",
26557
+ "description": "Attachment format identifier."
26558
+ },
26559
+ "data": {
26560
+ "description": "Attachment payload."
26561
+ },
26562
+ "credential_ids": {
26563
+ "description": "Optional credential query ids bound to this attachment.",
26564
+ "type": "array",
26565
+ "items": {
26566
+ "type": "string"
26567
+ }
26568
+ }
26569
+ },
26570
+ "required": [
26571
+ "format",
26572
+ "data"
26573
+ ],
26574
+ "additionalProperties": false
26575
+ }
26576
+ },
26577
+ {
26578
+ "type": "null"
26579
+ }
26580
+ ]
26581
+ },
26582
+ "redirectUri": {
26583
+ "description": "Optional redirect URI after presentation completion.",
26584
+ "type": [
26585
+ "string",
26586
+ "null"
26587
+ ]
26588
+ },
26589
+ "accessKeyChainId": {
26590
+ "description": "Optional key chain id for access token/auth operations.",
26591
+ "type": [
26592
+ "string",
26593
+ "null"
26594
+ ]
26595
+ },
26596
+ "readerAuth": {
26597
+ "description": "Whether reader authentication is required for mDoc requests.",
26598
+ "type": [
26599
+ "boolean",
26600
+ "null"
26601
+ ]
26602
+ }
26603
+ },
26604
+ "required": [
26605
+ "id",
26606
+ "dcql_query"
26607
+ ],
26608
+ "additionalProperties": false,
26609
+ "title": "PresentationConfigCreateDto"
26610
+ }
26611
+ }
26612
+ },
26613
+ {
26614
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26615
+ "$id": "https://eudiplo.dev/schemas/v3/TenantConfigFile.schema.json",
26616
+ "title": "TenantConfigFile",
26617
+ "type": "object",
26618
+ "properties": {
26619
+ "$schema": {
26620
+ "type": "string",
26621
+ "const": "https://eudiplo.dev/schemas/v3/TenantConfigFile.schema.json"
26622
+ },
26623
+ "metadata": {
26624
+ "type": "object",
26625
+ "properties": {
26626
+ "generation": {
26627
+ "type": "integer",
26628
+ "minimum": 1,
26629
+ "maximum": 9007199254740991
26630
+ },
26631
+ "ownership": {
26632
+ "type": "string",
26633
+ "enum": [
26634
+ "unmanaged",
26635
+ "file-managed"
26636
+ ]
26637
+ }
26638
+ },
26639
+ "additionalProperties": false
26640
+ },
26641
+ "spec": {
26642
+ "type": "object",
26643
+ "properties": {
26644
+ "name": {
26645
+ "default": "EUDIPLO",
26646
+ "description": "Display name of the tenant.",
26647
+ "type": "string",
26648
+ "minLength": 1
26649
+ },
26650
+ "description": {
26651
+ "description": "Optional tenant description.",
26652
+ "type": "string",
26653
+ "minLength": 1
26654
+ },
26655
+ "sessionConfig": {
26656
+ "description": "Optional tenant-specific session storage configuration.",
26657
+ "type": "object",
26658
+ "properties": {
26659
+ "ttlSeconds": {
26660
+ "description": "Session time-to-live in seconds.",
26661
+ "type": "integer",
26662
+ "minimum": 60,
26663
+ "maximum": 9007199254740991
26664
+ },
26665
+ "cleanupMode": {
26666
+ "description": "Whether to fully delete or anonymize expired sessions.",
26667
+ "type": "string",
26668
+ "enum": [
26669
+ "full",
26670
+ "anonymize"
26671
+ ]
26672
+ }
26673
+ },
26674
+ "additionalProperties": false
26675
+ },
26676
+ "statusListConfig": {
26677
+ "description": "Optional tenant-specific status list defaults.",
26678
+ "type": "object",
26679
+ "properties": {
26680
+ "capacity": {
26681
+ "description": "Default status list capacity.",
26682
+ "type": "integer",
26683
+ "minimum": 100,
26684
+ "maximum": 9007199254740991
26685
+ },
26686
+ "bits": {
26687
+ "description": "Bits-per-status setting (1, 2, 4, or 8).",
26688
+ "anyOf": [
26689
+ {
26690
+ "type": "number",
26691
+ "const": 1
26692
+ },
26693
+ {
26694
+ "type": "number",
26695
+ "const": 2
26696
+ },
26697
+ {
26698
+ "type": "number",
26699
+ "const": 4
26700
+ },
26701
+ {
26702
+ "type": "number",
26703
+ "const": 8
26704
+ }
26705
+ ]
26706
+ },
26707
+ "ttl": {
26708
+ "description": "JWT TTL for status list tokens in seconds.",
26709
+ "type": "integer",
26710
+ "minimum": 60,
26711
+ "maximum": 9007199254740991
26712
+ },
26713
+ "immediateUpdate": {
26714
+ "description": "Regenerate status list JWTs immediately after status updates.",
26715
+ "type": "boolean"
26716
+ },
26717
+ "enableAggregation": {
26718
+ "description": "Include aggregation_uri in generated status list JWTs.",
26719
+ "type": "boolean"
26720
+ }
26721
+ },
26722
+ "additionalProperties": false
25154
26723
  },
25155
- "dcql_query": {
26724
+ "defaultKeyChains": {
25156
26725
  "type": "object",
25157
26726
  "properties": {
25158
- "credentials": {
25159
- "minItems": 1,
25160
- "type": "array",
25161
- "items": {
25162
- "oneOf": [
25163
- {
26727
+ "access": {
26728
+ "description": "ID of the access key chain used where no configuration names one: presentation requests of configurations without accessKeyChainId and the signed issuer metadata. Without it, EUDIPLO picks one of the tenant's access key chains by rule.",
26729
+ "type": "string",
26730
+ "minLength": 1
26731
+ }
26732
+ },
26733
+ "additionalProperties": false,
26734
+ "description": "The tenant's key chain per usage type, used where no configuration names one. A usage type without an entry uses a key chain picked by rule."
26735
+ }
26736
+ },
26737
+ "required": [
26738
+ "name"
26739
+ ],
26740
+ "additionalProperties": false,
26741
+ "description": "Payload used when importing tenant metadata from config files."
26742
+ }
26743
+ },
26744
+ "required": [
26745
+ "$schema",
26746
+ "metadata",
26747
+ "spec"
26748
+ ],
26749
+ "additionalProperties": false
26750
+ },
26751
+ {
26752
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26753
+ "$id": "https://eudiplo.dev/schemas/v4/IssuanceConfigFile.schema.json",
26754
+ "title": "IssuanceConfigFile",
26755
+ "type": "object",
26756
+ "properties": {
26757
+ "$schema": {
26758
+ "type": "string",
26759
+ "const": "https://eudiplo.dev/schemas/v4/IssuanceConfigFile.schema.json"
26760
+ },
26761
+ "metadata": {
26762
+ "type": "object",
26763
+ "properties": {
26764
+ "generation": {
26765
+ "type": "integer",
26766
+ "minimum": 1,
26767
+ "description": "Monotonically increasing configuration generation."
26768
+ },
26769
+ "ownership": {
26770
+ "type": "string",
26771
+ "enum": [
26772
+ "unmanaged",
26773
+ "file-managed"
26774
+ ],
26775
+ "description": "Requested ownership recorded when the document is applied."
26776
+ }
26777
+ },
26778
+ "additionalProperties": false
26779
+ },
26780
+ "spec": {
26781
+ "$ref": "#/$defs/IssuanceConfig"
26782
+ }
26783
+ },
26784
+ "required": [
26785
+ "$schema",
26786
+ "spec"
26787
+ ],
26788
+ "additionalProperties": false,
26789
+ "$defs": {
26790
+ "IssuanceConfig": {
26791
+ "type": "object",
26792
+ "properties": {
26793
+ "batchSize": {
26794
+ "description": "Optional issuance batch size.",
26795
+ "type": "integer",
26796
+ "minimum": 1,
26797
+ "maximum": 9007199254740991
26798
+ },
26799
+ "dPopRequired": {
26800
+ "description": "Require DPoP proofs for issuance endpoints.",
26801
+ "type": "boolean"
26802
+ },
26803
+ "walletAttestationRequired": {
26804
+ "description": "Default wallet attestation requirement for managed authorization servers.",
26805
+ "type": "boolean"
26806
+ },
26807
+ "walletProviderTrustLists": {
26808
+ "description": "Shared wallet provider trust lists for key attestations and default authorization server wallet authentication.",
26809
+ "type": "array",
26810
+ "items": {
26811
+ "type": "object",
26812
+ "properties": {
26813
+ "trustListId": {
26814
+ "type": "string",
26815
+ "minLength": 1
26816
+ },
26817
+ "url": {
26818
+ "description": "URL of the wallet provider trust list.",
26819
+ "type": "string",
26820
+ "format": "uri"
26821
+ },
26822
+ "verifierKey": {
26823
+ "description": "Optional verifier key material used for trust list verification.",
26824
+ "type": "object",
26825
+ "propertyNames": {
26826
+ "type": "string"
26827
+ },
26828
+ "additionalProperties": {}
26829
+ },
26830
+ "verifierKeyPem": {
26831
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
26832
+ "type": "string",
26833
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
26834
+ },
26835
+ "verifierX509Der": {
26836
+ "description": "Optional verifier certificate in DER/base64 form.",
26837
+ "type": "string"
26838
+ }
26839
+ },
26840
+ "additionalProperties": false
26841
+ }
26842
+ },
26843
+ "walletAttestationStatusCheckMode": {
26844
+ "description": "Default status check mode for wallet attestations at managed authorization servers: strict, best_effort (default) or disabled.",
26845
+ "anyOf": [
26846
+ {
26847
+ "type": "string",
26848
+ "enum": [
26849
+ "strict",
26850
+ "best_effort",
26851
+ "disabled"
26852
+ ]
26853
+ },
26854
+ {
26855
+ "type": "null"
26856
+ }
26857
+ ]
26858
+ },
26859
+ "signingKeyId": {
26860
+ "description": "Default signing key chain id for credential issuance.",
26861
+ "type": "string",
26862
+ "minLength": 1
26863
+ },
26864
+ "authorizationServers": {
26865
+ "minItems": 1,
26866
+ "type": "array",
26867
+ "items": {
26868
+ "oneOf": [
26869
+ {
26870
+ "type": "object",
26871
+ "properties": {
26872
+ "type": {
26873
+ "type": "string",
26874
+ "const": "external",
26875
+ "description": "Use an externally managed authorization server."
26876
+ },
26877
+ "id": {
26878
+ "type": "string",
26879
+ "minLength": 1,
26880
+ "description": "Authorization server identifier."
26881
+ },
26882
+ "issuer": {
26883
+ "type": "string",
26884
+ "format": "uri",
26885
+ "description": "Issuer URL for the external authorization server."
26886
+ },
26887
+ "sessionBinding": {
26888
+ "description": "Explicit mapping from an external access-token claim to an existing issuance session.",
25164
26889
  "type": "object",
25165
26890
  "properties": {
25166
- "id": {
26891
+ "method": {
26892
+ "type": "string",
26893
+ "const": "access_token_claim",
26894
+ "description": "Read the correlation value from a configured access-token claim."
26895
+ },
26896
+ "claim": {
26897
+ "type": "string",
26898
+ "minLength": 1,
26899
+ "description": "Claim name that contains the issuance-session correlation value."
26900
+ }
26901
+ },
26902
+ "required": [
26903
+ "method",
26904
+ "claim"
26905
+ ],
26906
+ "additionalProperties": false
26907
+ },
26908
+ "label": {
26909
+ "description": "Optional display label for UI selection.",
26910
+ "type": "string"
26911
+ },
26912
+ "enabled": {
26913
+ "description": "Whether this authorization server entry is enabled.",
26914
+ "type": "boolean"
26915
+ }
26916
+ },
26917
+ "required": [
26918
+ "type",
26919
+ "id",
26920
+ "issuer"
26921
+ ],
26922
+ "additionalProperties": false
26923
+ },
26924
+ {
26925
+ "type": "object",
26926
+ "properties": {
26927
+ "type": {
26928
+ "type": "string",
26929
+ "const": "oid4vp",
26930
+ "description": "Use OID4VP-based authorization server chaining."
26931
+ },
26932
+ "id": {
26933
+ "type": "string",
26934
+ "minLength": 1,
26935
+ "description": "Authorization server identifier."
26936
+ },
26937
+ "presentationConfigId": {
26938
+ "type": "string",
26939
+ "minLength": 1,
26940
+ "description": "Presentation configuration id used during authorization."
26941
+ },
26942
+ "immediateWalletRedirect": {
26943
+ "description": "Redirect wallets immediately after authorization response creation.",
26944
+ "type": "boolean"
26945
+ },
26946
+ "token": {
26947
+ "description": "Optional token issuance settings.",
26948
+ "type": "object",
26949
+ "properties": {
26950
+ "lifetimeSeconds": {
26951
+ "description": "Access token lifetime in seconds.",
26952
+ "type": "number",
26953
+ "minimum": 60
26954
+ },
26955
+ "signingKeyId": {
26956
+ "description": "Optional key chain id used to sign issued tokens.",
25167
26957
  "type": "string",
25168
- "minLength": 1,
25169
- "pattern": "^[A-Za-z0-9_-]+$",
25170
- "description": "Credential query identifier."
26958
+ "minLength": 1
25171
26959
  },
25172
- "multiple": {
25173
- "description": "Allow multiple matching credentials.",
26960
+ "refreshTokenEnabled": {
26961
+ "description": "Enable issuing refresh tokens.",
25174
26962
  "type": "boolean"
25175
26963
  },
25176
- "claim_sets": {
25177
- "description": "Optional claim set constraints.",
25178
- "type": "array",
25179
- "items": {
25180
- "type": "array",
25181
- "items": {
25182
- "type": "string"
25183
- }
25184
- }
25185
- },
25186
- "trusted_authorities": {
25187
- "description": "Optional trusted authority constraints.",
25188
- "type": "array",
25189
- "items": {
25190
- "oneOf": [
25191
- {
25192
- "type": "object",
25193
- "properties": {
25194
- "type": {
25195
- "type": "string",
25196
- "const": "etsi_tl",
25197
- "description": "Trusted authority type discriminator for ETSI trust lists."
25198
- },
25199
- "values": {
25200
- "type": "array",
25201
- "items": {
25202
- "type": "object",
25203
- "properties": {
25204
- "trustListId": {
25205
- "description": "Optional trust list id reference.",
25206
- "type": "string"
25207
- },
25208
- "url": {
25209
- "description": "Optional trust list URL reference.",
25210
- "anyOf": [
25211
- {
25212
- "type": "string",
25213
- "format": "uri"
25214
- },
25215
- {
25216
- "type": "string",
25217
- "pattern": "^<TENANT_URL>(?:\\/.*)?$"
25218
- }
25219
- ]
25220
- },
25221
- "verifierKey": {
25222
- "description": "Optional verifier key material.",
25223
- "type": "object",
25224
- "propertyNames": {
25225
- "type": "string"
25226
- },
25227
- "additionalProperties": {}
25228
- },
25229
- "verifierX509Der": {
25230
- "description": "Optional verifier certificate in DER/base64 form.",
25231
- "type": "string"
25232
- }
25233
- },
25234
- "additionalProperties": false
25235
- },
25236
- "description": "Trust list references for ETSI TL verification."
25237
- }
25238
- },
25239
- "required": [
25240
- "type",
25241
- "values"
25242
- ],
25243
- "additionalProperties": false
25244
- },
25245
- {
25246
- "type": "object",
25247
- "properties": {
25248
- "type": {
25249
- "type": "string",
25250
- "const": "openid_federation",
25251
- "description": "Trusted authority type discriminator for OpenID Federation."
25252
- },
25253
- "values": {
25254
- "type": "array",
25255
- "items": {
25256
- "type": "string"
25257
- },
25258
- "description": "OpenID Federation authority identifiers."
25259
- }
25260
- },
25261
- "required": [
25262
- "type",
25263
- "values"
25264
- ],
25265
- "additionalProperties": false
25266
- }
25267
- ]
25268
- }
25269
- },
25270
- "format": {
25271
- "type": "string",
25272
- "const": "dc+sd-jwt",
25273
- "description": "Credential format discriminator."
25274
- },
25275
- "meta": {
25276
- "type": "object",
25277
- "properties": {
25278
- "vct_values": {
25279
- "minItems": 1,
25280
- "type": "array",
25281
- "items": {
25282
- "type": "string"
25283
- },
25284
- "description": "Accepted VCT values."
25285
- }
26964
+ "refreshTokenExpiresInSeconds": {
26965
+ "description": "Refresh token lifetime in seconds.",
26966
+ "type": "number",
26967
+ "minimum": 60
26968
+ }
26969
+ },
26970
+ "additionalProperties": false
26971
+ },
26972
+ "requireDPoP": {
26973
+ "description": "Require DPoP proofs for token/credential requests.",
26974
+ "type": "boolean"
26975
+ },
26976
+ "walletAttestationRequired": {
26977
+ "description": "Require wallet attestation for this authorization server.",
26978
+ "type": "boolean"
26979
+ },
26980
+ "walletProviderTrustLists": {
26981
+ "description": "Optional wallet provider trust list references for this authorization server.",
26982
+ "type": "array",
26983
+ "items": {
26984
+ "type": "object",
26985
+ "properties": {
26986
+ "trustListId": {
26987
+ "type": "string",
26988
+ "minLength": 1
25286
26989
  },
25287
- "required": [
25288
- "vct_values"
25289
- ],
25290
- "additionalProperties": false
25291
- },
25292
- "claims": {
25293
- "description": "Optional claim-level constraints.",
25294
- "type": "array",
25295
- "items": {
26990
+ "url": {
26991
+ "description": "URL of the wallet provider trust list.",
26992
+ "type": "string",
26993
+ "format": "uri"
26994
+ },
26995
+ "verifierKey": {
26996
+ "description": "Optional verifier key material used for trust list verification.",
25296
26997
  "type": "object",
25297
- "properties": {
25298
- "id": {
25299
- "description": "Optional claim query id.",
25300
- "type": "string"
25301
- },
25302
- "path": {
25303
- "type": "array",
25304
- "items": {
25305
- "type": [
25306
- "string",
25307
- "number"
25308
- ]
25309
- },
25310
- "description": "Path to the claim value in presented credentials."
25311
- },
25312
- "values": {
25313
- "description": "Optional allowed values for the claim. A disclosed value must equal one of them in type and value.",
25314
- "minItems": 1,
25315
- "type": "array",
25316
- "items": {
25317
- "anyOf": [
25318
- {
25319
- "type": "string"
25320
- },
25321
- {
25322
- "type": "integer",
25323
- "minimum": -9007199254740991,
25324
- "maximum": 9007199254740991
25325
- },
25326
- {
25327
- "type": "boolean"
25328
- }
25329
- ]
25330
- }
25331
- }
26998
+ "propertyNames": {
26999
+ "type": "string"
25332
27000
  },
25333
- "required": [
25334
- "path"
25335
- ],
25336
- "additionalProperties": false
27001
+ "additionalProperties": {}
27002
+ },
27003
+ "verifierKeyPem": {
27004
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
27005
+ "type": "string",
27006
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
27007
+ },
27008
+ "verifierX509Der": {
27009
+ "description": "Optional verifier certificate in DER/base64 form.",
27010
+ "type": "string"
25337
27011
  }
25338
- }
25339
- },
25340
- "required": [
25341
- "id",
25342
- "format",
25343
- "meta"
25344
- ],
25345
- "additionalProperties": false
27012
+ },
27013
+ "additionalProperties": false
27014
+ }
27015
+ },
27016
+ "walletAttestationStatusCheckMode": {
27017
+ "description": "Status check mode for wallet attestations at this authorization server. Omit to inherit the issuance default.",
27018
+ "type": "string",
27019
+ "enum": [
27020
+ "strict",
27021
+ "best_effort",
27022
+ "disabled"
27023
+ ]
27024
+ },
27025
+ "label": {
27026
+ "description": "Optional display label for UI selection.",
27027
+ "type": "string"
27028
+ },
27029
+ "enabled": {
27030
+ "description": "Whether this authorization server entry is enabled.",
27031
+ "type": "boolean"
27032
+ }
27033
+ },
27034
+ "required": [
27035
+ "type",
27036
+ "id",
27037
+ "presentationConfigId"
27038
+ ],
27039
+ "additionalProperties": false
27040
+ },
27041
+ {
27042
+ "type": "object",
27043
+ "properties": {
27044
+ "type": {
27045
+ "type": "string",
27046
+ "const": "chained",
27047
+ "description": "Use upstream OIDC as authorization source."
27048
+ },
27049
+ "id": {
27050
+ "type": "string",
27051
+ "minLength": 1,
27052
+ "description": "Authorization server identifier."
25346
27053
  },
25347
- {
27054
+ "upstream": {
25348
27055
  "type": "object",
25349
27056
  "properties": {
25350
- "id": {
27057
+ "issuer": {
25351
27058
  "type": "string",
25352
- "minLength": 1,
25353
- "pattern": "^[A-Za-z0-9_-]+$",
25354
- "description": "Credential query identifier."
27059
+ "format": "uri",
27060
+ "description": "Upstream OIDC issuer URL."
25355
27061
  },
25356
- "multiple": {
25357
- "description": "Allow multiple matching credentials.",
25358
- "type": "boolean"
27062
+ "clientId": {
27063
+ "type": "string",
27064
+ "minLength": 1,
27065
+ "description": "Client id for upstream OIDC authentication."
25359
27066
  },
25360
- "claim_sets": {
25361
- "description": "Optional claim set constraints.",
25362
- "type": "array",
25363
- "items": {
25364
- "type": "array",
25365
- "items": {
25366
- "type": "string"
25367
- }
25368
- }
27067
+ "clientSecret": {
27068
+ "description": "Optional client secret for upstream OIDC authentication.",
27069
+ "type": "string",
27070
+ "minLength": 1
25369
27071
  },
25370
- "trusted_authorities": {
25371
- "description": "Optional trusted authority constraints.",
27072
+ "scopes": {
27073
+ "description": "Optional scopes requested from the upstream issuer.",
25372
27074
  "type": "array",
25373
27075
  "items": {
25374
- "oneOf": [
25375
- {
25376
- "type": "object",
25377
- "properties": {
25378
- "type": {
25379
- "type": "string",
25380
- "const": "etsi_tl",
25381
- "description": "Trusted authority type discriminator for ETSI trust lists."
25382
- },
25383
- "values": {
25384
- "type": "array",
25385
- "items": {
25386
- "type": "object",
25387
- "properties": {
25388
- "trustListId": {
25389
- "description": "Optional trust list id reference.",
25390
- "type": "string"
25391
- },
25392
- "url": {
25393
- "description": "Optional trust list URL reference.",
25394
- "anyOf": [
25395
- {
25396
- "type": "string",
25397
- "format": "uri"
25398
- },
25399
- {
25400
- "type": "string",
25401
- "pattern": "^<TENANT_URL>(?:\\/.*)?$"
25402
- }
25403
- ]
25404
- },
25405
- "verifierKey": {
25406
- "description": "Optional verifier key material.",
25407
- "type": "object",
25408
- "propertyNames": {
25409
- "type": "string"
25410
- },
25411
- "additionalProperties": {}
25412
- },
25413
- "verifierX509Der": {
25414
- "description": "Optional verifier certificate in DER/base64 form.",
25415
- "type": "string"
25416
- }
25417
- },
25418
- "additionalProperties": false
25419
- },
25420
- "description": "Trust list references for ETSI TL verification."
25421
- }
25422
- },
25423
- "required": [
25424
- "type",
25425
- "values"
25426
- ],
25427
- "additionalProperties": false
25428
- },
25429
- {
25430
- "type": "object",
25431
- "properties": {
25432
- "type": {
25433
- "type": "string",
25434
- "const": "openid_federation",
25435
- "description": "Trusted authority type discriminator for OpenID Federation."
25436
- },
25437
- "values": {
25438
- "type": "array",
25439
- "items": {
25440
- "type": "string"
25441
- },
25442
- "description": "OpenID Federation authority identifiers."
25443
- }
25444
- },
25445
- "required": [
25446
- "type",
25447
- "values"
25448
- ],
25449
- "additionalProperties": false
25450
- }
25451
- ]
27076
+ "type": "string",
27077
+ "minLength": 1
25452
27078
  }
27079
+ }
27080
+ },
27081
+ "required": [
27082
+ "issuer",
27083
+ "clientId"
27084
+ ],
27085
+ "additionalProperties": false,
27086
+ "description": "Upstream OIDC connection settings."
27087
+ },
27088
+ "token": {
27089
+ "description": "Optional token issuance settings.",
27090
+ "type": "object",
27091
+ "properties": {
27092
+ "lifetimeSeconds": {
27093
+ "description": "Access token lifetime in seconds.",
27094
+ "type": "number",
27095
+ "minimum": 60
25453
27096
  },
25454
- "format": {
27097
+ "signingKeyId": {
27098
+ "description": "Optional key chain id used to sign issued tokens.",
25455
27099
  "type": "string",
25456
- "const": "mso_mdoc",
25457
- "description": "Credential format discriminator."
27100
+ "minLength": 1
25458
27101
  },
25459
- "meta": {
25460
- "type": "object",
25461
- "properties": {
25462
- "doctype_value": {
25463
- "type": "string",
25464
- "minLength": 1,
25465
- "description": "Expected mDoc doctype value."
25466
- }
25467
- },
25468
- "required": [
25469
- "doctype_value"
25470
- ],
25471
- "additionalProperties": false
27102
+ "refreshTokenEnabled": {
27103
+ "description": "Enable issuing refresh tokens.",
27104
+ "type": "boolean"
25472
27105
  },
25473
- "claims": {
25474
- "description": "Optional mDoc claim-level constraints.",
25475
- "type": "array",
25476
- "items": {
25477
- "type": "object",
25478
- "properties": {
25479
- "id": {
25480
- "description": "Optional claim query id.",
25481
- "type": "string"
25482
- },
25483
- "path": {
25484
- "type": "array",
25485
- "items": {
25486
- "type": [
25487
- "string",
25488
- "number"
25489
- ]
25490
- },
25491
- "description": "Path to the claim value in presented credentials."
25492
- },
25493
- "values": {
25494
- "description": "Optional allowed values for the claim. A disclosed value must equal one of them in type and value.",
25495
- "minItems": 1,
25496
- "type": "array",
25497
- "items": {
25498
- "anyOf": [
25499
- {
25500
- "type": "string"
25501
- },
25502
- {
25503
- "type": "integer",
25504
- "minimum": -9007199254740991,
25505
- "maximum": 9007199254740991
25506
- },
25507
- {
25508
- "type": "boolean"
25509
- }
25510
- ]
25511
- }
25512
- },
25513
- "intent_to_retain": {
25514
- "description": "Whether relying party intends to retain the claim.",
25515
- "type": "boolean"
25516
- }
25517
- },
25518
- "required": [
25519
- "path"
25520
- ],
25521
- "additionalProperties": false
25522
- }
27106
+ "refreshTokenExpiresInSeconds": {
27107
+ "description": "Refresh token lifetime in seconds.",
27108
+ "type": "number",
27109
+ "minimum": 60
25523
27110
  }
25524
27111
  },
25525
- "required": [
25526
- "id",
25527
- "format",
25528
- "meta"
25529
- ],
25530
27112
  "additionalProperties": false
25531
- }
25532
- ]
25533
- },
25534
- "description": "Credential queries requested by the verifier."
25535
- },
25536
- "credential_sets": {
25537
- "description": "Optional higher-level credential set requirements.",
25538
- "type": "array",
25539
- "items": {
25540
- "type": "object",
25541
- "properties": {
25542
- "options": {
25543
- "minItems": 1,
27113
+ },
27114
+ "requireDPoP": {
27115
+ "description": "Require DPoP proofs for token/credential requests.",
27116
+ "type": "boolean"
27117
+ },
27118
+ "walletAttestationRequired": {
27119
+ "description": "Require wallet attestation for this authorization server.",
27120
+ "type": "boolean"
27121
+ },
27122
+ "walletProviderTrustLists": {
27123
+ "description": "Optional wallet provider trust list references for this authorization server.",
25544
27124
  "type": "array",
25545
27125
  "items": {
25546
- "minItems": 1,
25547
- "type": "array",
25548
- "items": {
25549
- "type": "string"
25550
- }
25551
- },
25552
- "description": "Alternative credential query id combinations."
27126
+ "type": "object",
27127
+ "properties": {
27128
+ "trustListId": {
27129
+ "type": "string",
27130
+ "minLength": 1
27131
+ },
27132
+ "url": {
27133
+ "description": "URL of the wallet provider trust list.",
27134
+ "type": "string",
27135
+ "format": "uri"
27136
+ },
27137
+ "verifierKey": {
27138
+ "description": "Optional verifier key material used for trust list verification.",
27139
+ "type": "object",
27140
+ "propertyNames": {
27141
+ "type": "string"
27142
+ },
27143
+ "additionalProperties": {}
27144
+ },
27145
+ "verifierKeyPem": {
27146
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
27147
+ "type": "string",
27148
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
27149
+ },
27150
+ "verifierX509Der": {
27151
+ "description": "Optional verifier certificate in DER/base64 form.",
27152
+ "type": "string"
27153
+ }
27154
+ },
27155
+ "additionalProperties": false
27156
+ }
25553
27157
  },
25554
- "required": {
25555
- "description": "Whether this credential set is mandatory.",
27158
+ "walletAttestationStatusCheckMode": {
27159
+ "description": "Status check mode for wallet attestations at this authorization server. Omit to inherit the issuance default.",
27160
+ "type": "string",
27161
+ "enum": [
27162
+ "strict",
27163
+ "best_effort",
27164
+ "disabled"
27165
+ ]
27166
+ },
27167
+ "label": {
27168
+ "description": "Optional display label for UI selection.",
27169
+ "type": "string"
27170
+ },
27171
+ "enabled": {
27172
+ "description": "Whether this authorization server entry is enabled.",
25556
27173
  "type": "boolean"
25557
27174
  }
25558
27175
  },
25559
27176
  "required": [
25560
- "options"
27177
+ "type",
27178
+ "id",
27179
+ "upstream"
25561
27180
  ],
25562
27181
  "additionalProperties": false
25563
- }
25564
- }
25565
- },
25566
- "required": [
25567
- "credentials"
25568
- ],
25569
- "additionalProperties": false,
25570
- "description": "DCQL query defining requested credentials and claims."
25571
- },
25572
- "transaction_data": {
25573
- "description": "Optional transaction data descriptors.",
25574
- "anyOf": [
25575
- {
25576
- "type": "array",
25577
- "items": {
27182
+ },
27183
+ {
25578
27184
  "type": "object",
25579
27185
  "properties": {
25580
27186
  "type": {
25581
27187
  "type": "string",
25582
- "description": "Transaction data type identifier."
27188
+ "const": "built-in",
27189
+ "description": "Use EUDIPLO built-in authorization server."
25583
27190
  },
25584
- "credential_ids": {
27191
+ "id": {
27192
+ "type": "string",
27193
+ "minLength": 1,
27194
+ "description": "Authorization server identifier."
27195
+ },
27196
+ "token": {
27197
+ "description": "Optional token issuance settings.",
27198
+ "type": "object",
27199
+ "properties": {
27200
+ "lifetimeSeconds": {
27201
+ "description": "Access token lifetime in seconds.",
27202
+ "type": "number",
27203
+ "minimum": 60
27204
+ },
27205
+ "signingKeyId": {
27206
+ "description": "Optional key chain id used to sign issued tokens.",
27207
+ "type": "string",
27208
+ "minLength": 1
27209
+ },
27210
+ "refreshTokenEnabled": {
27211
+ "description": "Enable issuing refresh tokens.",
27212
+ "type": "boolean"
27213
+ },
27214
+ "refreshTokenExpiresInSeconds": {
27215
+ "description": "Refresh token lifetime in seconds.",
27216
+ "type": "number",
27217
+ "minimum": 60
27218
+ }
27219
+ },
27220
+ "additionalProperties": false
27221
+ },
27222
+ "requireDPoP": {
27223
+ "description": "Require DPoP proofs for token/credential requests.",
27224
+ "type": "boolean"
27225
+ },
27226
+ "walletAttestationRequired": {
27227
+ "description": "Require wallet attestation for this authorization server.",
27228
+ "type": "boolean"
27229
+ },
27230
+ "walletProviderTrustLists": {
27231
+ "description": "Optional wallet provider trust list references for this authorization server.",
25585
27232
  "type": "array",
25586
27233
  "items": {
25587
- "type": "string"
25588
- },
25589
- "description": "Credential query ids this transaction data applies to."
27234
+ "type": "object",
27235
+ "properties": {
27236
+ "trustListId": {
27237
+ "type": "string",
27238
+ "minLength": 1
27239
+ },
27240
+ "url": {
27241
+ "description": "URL of the wallet provider trust list.",
27242
+ "type": "string",
27243
+ "format": "uri"
27244
+ },
27245
+ "verifierKey": {
27246
+ "description": "Optional verifier key material used for trust list verification.",
27247
+ "type": "object",
27248
+ "propertyNames": {
27249
+ "type": "string"
27250
+ },
27251
+ "additionalProperties": {}
27252
+ },
27253
+ "verifierKeyPem": {
27254
+ "description": "Optional verifier public key in SPKI PEM form (-----BEGIN PUBLIC KEY-----).",
27255
+ "type": "string",
27256
+ "pattern": "^\\s*-----BEGIN PUBLIC KEY-----[A-Za-z0-9+/=\\s]+-----END PUBLIC KEY-----\\s*$"
27257
+ },
27258
+ "verifierX509Der": {
27259
+ "description": "Optional verifier certificate in DER/base64 form.",
27260
+ "type": "string"
27261
+ }
27262
+ },
27263
+ "additionalProperties": false
27264
+ }
25590
27265
  },
25591
- "payload": {
25592
- "description": "Transaction details. Required for TS12 SCA transaction data."
27266
+ "walletAttestationStatusCheckMode": {
27267
+ "description": "Status check mode for wallet attestations at this authorization server. Omit to inherit the issuance default.",
27268
+ "type": "string",
27269
+ "enum": [
27270
+ "strict",
27271
+ "best_effort",
27272
+ "disabled"
27273
+ ]
27274
+ },
27275
+ "label": {
27276
+ "description": "Optional display label for UI selection.",
27277
+ "type": "string"
27278
+ },
27279
+ "enabled": {
27280
+ "description": "Whether this authorization server entry is enabled.",
27281
+ "type": "boolean"
25593
27282
  }
25594
27283
  },
25595
27284
  "required": [
25596
27285
  "type",
25597
- "credential_ids"
27286
+ "id"
25598
27287
  ],
25599
- "additionalProperties": {}
27288
+ "additionalProperties": false
25600
27289
  }
25601
- },
25602
- {
25603
- "type": "null"
25604
- }
25605
- ]
27290
+ ],
27291
+ "description": "Supported authorization server configurations."
27292
+ },
27293
+ "description": "Configured authorization server entries."
25606
27294
  },
25607
- "registration_cert": {
25608
- "description": "Optional registration certificate request settings.",
27295
+ "federation": {
27296
+ "description": "Optional OpenID Federation settings.",
25609
27297
  "anyOf": [
25610
27298
  {
25611
27299
  "type": "object",
25612
27300
  "properties": {
25613
- "id": {
27301
+ "role": {
27302
+ "description": "Federation role for this issuer.",
27303
+ "type": "string",
27304
+ "enum": [
27305
+ "trust_anchor",
27306
+ "intermediate",
27307
+ "leaf"
27308
+ ]
27309
+ },
27310
+ "mode": {
27311
+ "description": "Federation operation mode.",
27312
+ "type": "string",
27313
+ "enum": [
27314
+ "federation-only",
27315
+ "hybrid"
27316
+ ]
27317
+ },
27318
+ "entityId": {
27319
+ "description": "Optional local federation entity id.",
25614
27320
  "type": "string"
25615
27321
  },
25616
- "body": {
25617
- "type": "object",
25618
- "properties": {
25619
- "privacy_policy": {
25620
- "type": "string"
25621
- },
25622
- "support_uri": {
25623
- "type": "string"
25624
- },
25625
- "intermediary": {
25626
- "type": "string"
25627
- },
25628
- "purpose": {
25629
- "type": "array",
25630
- "items": {
25631
- "type": "object",
25632
- "properties": {
25633
- "lang": {
25634
- "type": "string"
25635
- },
25636
- "content": {
25637
- "type": "string"
25638
- }
25639
- },
25640
- "required": [
25641
- "lang",
25642
- "content"
25643
- ],
25644
- "additionalProperties": false
25645
- }
25646
- },
25647
- "credentials": {
25648
- "type": "array",
25649
- "items": {
25650
- "type": "object",
25651
- "propertyNames": {
25652
- "type": "string"
25653
- },
25654
- "additionalProperties": {}
25655
- }
25656
- },
25657
- "provides_attestations": {
25658
- "type": "array",
25659
- "items": {
27322
+ "enforceSigningPolicy": {
27323
+ "description": "Enforce strict signing policy checks.",
27324
+ "type": "boolean"
27325
+ },
27326
+ "cacheTtlSeconds": {
27327
+ "description": "Cache time-to-live for federation metadata in seconds.",
27328
+ "type": "integer",
27329
+ "minimum": 1,
27330
+ "maximum": 9007199254740991
27331
+ },
27332
+ "trustAnchors": {
27333
+ "type": "array",
27334
+ "items": {
27335
+ "type": "object",
27336
+ "properties": {
27337
+ "entityId": {
27338
+ "type": "string",
27339
+ "minLength": 1,
27340
+ "description": "Federation trust anchor entity id."
27341
+ },
27342
+ "entityConfigurationUri": {
25660
27343
  "type": "string",
25661
- "minLength": 1
27344
+ "format": "uri",
27345
+ "description": "Entity configuration URI for the trust anchor."
25662
27346
  }
25663
- }
27347
+ },
27348
+ "required": [
27349
+ "entityId",
27350
+ "entityConfigurationUri"
27351
+ ],
27352
+ "additionalProperties": false
25664
27353
  },
25665
- "additionalProperties": false
25666
- },
25667
- "jwt": {
25668
- "type": "string"
27354
+ "description": "Federation trust anchors."
25669
27355
  }
25670
27356
  },
27357
+ "required": [
27358
+ "trustAnchors"
27359
+ ],
25671
27360
  "additionalProperties": false
25672
27361
  },
25673
27362
  {
@@ -25675,146 +27364,137 @@ var CONFIG_SCHEMAS = [
25675
27364
  }
25676
27365
  ]
25677
27366
  },
25678
- "registrationCertImportJwt": {
25679
- "description": "Optional imported registration certificate JWT.",
25680
- "type": [
25681
- "string",
25682
- "null"
25683
- ]
25684
- },
25685
- "registrationCertImportId": {
25686
- "description": "Optional registrar-side registration certificate id.",
25687
- "type": [
25688
- "string",
25689
- "null"
25690
- ]
25691
- },
25692
- "registrationCertBodyPrivacyPolicy": {
25693
- "description": "Optional registration certificate privacy policy URI.",
25694
- "type": [
25695
- "string",
25696
- "null"
25697
- ]
25698
- },
25699
- "registrationCertBodySupportUri": {
25700
- "description": "Optional registration certificate support URI.",
25701
- "type": [
25702
- "string",
25703
- "null"
25704
- ]
25705
- },
25706
- "registrationCertBodyIntermediary": {
25707
- "description": "Optional registration certificate intermediary.",
25708
- "type": [
25709
- "string",
25710
- "null"
25711
- ]
25712
- },
25713
- "registrationCertBodyPurpose": {
25714
- "description": "Optional registration certificate purpose entries.",
27367
+ "registrationCertificate": {
27368
+ "description": "Optional registration certificate settings.",
25715
27369
  "anyOf": [
25716
27370
  {
25717
- "type": "array",
25718
- "items": {
25719
- "type": "object",
25720
- "properties": {
25721
- "lang": {
25722
- "type": "string"
25723
- },
25724
- "content": {
25725
- "type": "string"
25726
- }
27371
+ "type": "object",
27372
+ "properties": {
27373
+ "enabled": {
27374
+ "description": "Enable issuer registration certificate support.",
27375
+ "type": "boolean"
25727
27376
  },
25728
- "additionalProperties": false
25729
- }
27377
+ "mode": {
27378
+ "description": "How registration certificate data is provided.",
27379
+ "type": "string",
27380
+ "enum": [
27381
+ "import",
27382
+ "generate"
27383
+ ]
27384
+ },
27385
+ "jwt": {
27386
+ "description": "Optional registration certificate JWT when using import mode.",
27387
+ "type": "string"
27388
+ },
27389
+ "privacyPolicy": {
27390
+ "description": "Optional privacy policy URI.",
27391
+ "type": "string"
27392
+ },
27393
+ "supportUri": {
27394
+ "description": "Optional support URI.",
27395
+ "type": "string"
27396
+ }
27397
+ },
27398
+ "additionalProperties": false
25730
27399
  },
25731
27400
  {
25732
27401
  "type": "null"
25733
27402
  }
25734
27403
  ]
25735
27404
  },
25736
- "webhookEndpointId": {
25737
- "description": "Optional webhook endpoint id for presentation callbacks.",
25738
- "type": [
25739
- "string",
25740
- "null"
25741
- ]
25742
- },
25743
- "attached": {
25744
- "description": "Optional attachments included with presentation requests.",
25745
- "anyOf": [
25746
- {
25747
- "type": "array",
25748
- "items": {
27405
+ "display": {
27406
+ "description": "Localized issuer metadata shown to wallets.",
27407
+ "type": "array",
27408
+ "items": {
27409
+ "type": "object",
27410
+ "properties": {
27411
+ "name": {
27412
+ "description": "Issuer display name.",
27413
+ "type": "string"
27414
+ },
27415
+ "locale": {
27416
+ "description": "Locale tag for this display entry.",
27417
+ "type": "string"
27418
+ },
27419
+ "logo": {
27420
+ "description": "Optional issuer logo metadata.",
25749
27421
  "type": "object",
25750
27422
  "properties": {
25751
- "format": {
27423
+ "uri": {
25752
27424
  "type": "string",
25753
- "description": "Attachment format identifier."
25754
- },
25755
- "data": {
25756
- "description": "Attachment payload."
27425
+ "minLength": 1,
27426
+ "description": "Logo URI."
25757
27427
  },
25758
- "credential_ids": {
25759
- "description": "Optional credential query ids bound to this attachment.",
25760
- "type": "array",
25761
- "items": {
25762
- "type": "string"
25763
- }
27428
+ "alt_text": {
27429
+ "description": "Optional localized alternative text.",
27430
+ "type": "string"
25764
27431
  }
25765
27432
  },
25766
27433
  "required": [
25767
- "format",
25768
- "data"
27434
+ "uri"
25769
27435
  ],
25770
- "additionalProperties": false
27436
+ "additionalProperties": {}
25771
27437
  }
25772
27438
  },
27439
+ "additionalProperties": {}
27440
+ }
27441
+ },
27442
+ "notificationEndpointEnabled": {
27443
+ "description": "Whether the OID4VCI notification endpoint is exposed for this issuance configuration.",
27444
+ "type": "boolean"
27445
+ },
27446
+ "credentialResponseEncryption": {
27447
+ "description": "Enable encrypted credential responses.",
27448
+ "type": "boolean"
27449
+ },
27450
+ "credentialRequestEncryption": {
27451
+ "description": "Require encrypted credential requests.",
27452
+ "type": "boolean"
27453
+ },
27454
+ "txCodeMaxAttempts": {
27455
+ "description": "Maximum verification attempts for transaction codes. Null resets to defaults.",
27456
+ "anyOf": [
27457
+ {
27458
+ "type": "integer",
27459
+ "minimum": 1,
27460
+ "maximum": 9007199254740991
27461
+ },
25773
27462
  {
25774
27463
  "type": "null"
25775
27464
  }
25776
27465
  ]
25777
27466
  },
25778
- "redirectUri": {
25779
- "description": "Optional redirect URI after presentation completion.",
25780
- "type": [
25781
- "string",
25782
- "null"
25783
- ]
25784
- },
25785
- "accessKeyChainId": {
25786
- "description": "Optional key chain id for access token/auth operations.",
25787
- "type": [
25788
- "string",
25789
- "null"
25790
- ]
25791
- },
25792
- "readerAuth": {
25793
- "description": "Whether reader authentication is required for mDoc requests.",
25794
- "type": [
25795
- "boolean",
25796
- "null"
27467
+ "offerLifetimeSeconds": {
27468
+ "description": "Default lifetime of credential offers in seconds. Can be overridden per offer request. Null or unset: offers do not expire.",
27469
+ "anyOf": [
27470
+ {
27471
+ "type": "integer",
27472
+ "minimum": 1,
27473
+ "maximum": 9007199254740991
27474
+ },
27475
+ {
27476
+ "type": "null"
27477
+ }
25797
27478
  ]
25798
27479
  }
25799
27480
  },
25800
27481
  "required": [
25801
- "id",
25802
- "dcql_query"
27482
+ "authorizationServers"
25803
27483
  ],
25804
27484
  "additionalProperties": false,
25805
- "title": "PresentationConfigCreateDto"
27485
+ "title": "IssuanceConfig"
25806
27486
  }
25807
27487
  }
25808
27488
  },
25809
27489
  {
25810
27490
  "$schema": "https://json-schema.org/draft/2020-12/schema",
25811
- "$id": "https://eudiplo.dev/schemas/v4/IssuanceConfigFile.schema.json",
27491
+ "$id": "https://eudiplo.dev/schemas/v5/IssuanceConfigFile.schema.json",
25812
27492
  "title": "IssuanceConfigFile",
25813
27493
  "type": "object",
25814
27494
  "properties": {
25815
27495
  "$schema": {
25816
27496
  "type": "string",
25817
- "const": "https://eudiplo.dev/schemas/v4/IssuanceConfigFile.schema.json"
27497
+ "const": "https://eudiplo.dev/schemas/v5/IssuanceConfigFile.schema.json"
25818
27498
  },
25819
27499
  "metadata": {
25820
27500
  "type": "object",
@@ -26374,8 +28054,9 @@ var CONFIG_SCHEMAS = [
26374
28054
  ]
26375
28055
  },
26376
28056
  "entityId": {
26377
- "description": "Optional local federation entity id.",
26378
- "type": "string"
28057
+ "description": "Entity Identifier of the tenant's federation entity, usually {PUBLIC_URL}/issuers/{tenantId}: an https URL with a host and without query or fragment (OpenID Federation 1.0 Section 1.2). http is accepted only when OUTBOUND_URL_ALLOW_HTTP is true.",
28058
+ "type": "string",
28059
+ "pattern": "^(https?:\\/\\/[^\\s?#]+)?$"
26379
28060
  },
26380
28061
  "enforceSigningPolicy": {
26381
28062
  "description": "Enforce strict signing policy checks.",
@@ -26410,6 +28091,80 @@ var CONFIG_SCHEMAS = [
26410
28091
  "additionalProperties": false
26411
28092
  },
26412
28093
  "description": "Federation trust anchors."
28094
+ },
28095
+ "entityTypes": {
28096
+ "description": "Roles the entity configuration publishes metadata for. Defaults to openid_credential_issuer.",
28097
+ "minItems": 1,
28098
+ "type": "array",
28099
+ "items": {
28100
+ "type": "string",
28101
+ "enum": [
28102
+ "openid_credential_issuer",
28103
+ "openid_credential_verifier"
28104
+ ]
28105
+ }
28106
+ },
28107
+ "authorityHints": {
28108
+ "description": "authority_hints of the entity configuration: the superiors that issue a subordinate statement about this entity. Defaults to the trust anchor entity ids.",
28109
+ "type": "array",
28110
+ "items": {
28111
+ "type": "string",
28112
+ "format": "uri"
28113
+ }
28114
+ },
28115
+ "entityKeyChainId": {
28116
+ "description": "Key chain with usage type 'federation' that signs the entity configuration. Without it, a federation key chain of the tenant is used; set it when the tenant has several.",
28117
+ "type": "string",
28118
+ "minLength": 1
28119
+ },
28120
+ "entityConfigurationLifetimeSeconds": {
28121
+ "description": "Lifetime (exp - iat) of the entity configuration in seconds. Defaults to 86400.",
28122
+ "type": "integer",
28123
+ "minimum": 60,
28124
+ "maximum": 31536e3
28125
+ },
28126
+ "trustMarks": {
28127
+ "description": "Trust mark JWTs issued to this entity, published in the entity configuration.",
28128
+ "type": "array",
28129
+ "items": {
28130
+ "type": "string",
28131
+ "minLength": 1
28132
+ }
28133
+ },
28134
+ "entityMetadata": {
28135
+ "description": "Informational federation_entity metadata of the entity configuration.",
28136
+ "type": "object",
28137
+ "properties": {
28138
+ "organization_name": {
28139
+ "type": "string",
28140
+ "minLength": 1
28141
+ },
28142
+ "contacts": {
28143
+ "minItems": 1,
28144
+ "type": "array",
28145
+ "items": {
28146
+ "type": "string",
28147
+ "minLength": 1
28148
+ }
28149
+ },
28150
+ "logo_uri": {
28151
+ "type": "string",
28152
+ "format": "uri"
28153
+ },
28154
+ "policy_uri": {
28155
+ "type": "string",
28156
+ "format": "uri"
28157
+ },
28158
+ "homepage_uri": {
28159
+ "type": "string",
28160
+ "format": "uri"
28161
+ }
28162
+ },
28163
+ "additionalProperties": false
28164
+ },
28165
+ "includeTrustChain": {
28166
+ "description": "Add the trust chain of this entity as trust_chain header to federation SD-JWT VCs and OID4VP request objects.",
28167
+ "type": "boolean"
26413
28168
  }
26414
28169
  },
26415
28170
  "required": [
@@ -29324,7 +31079,7 @@ function createDeploymentCommands(context, setExitCode) {
29324
31079
  // package.json
29325
31080
  var package_default = {
29326
31081
  name: "@eudiplo/cli",
29327
- version: "9.1.0-main.52a85b9",
31082
+ version: "9.1.0-main.53e4625",
29328
31083
  description: "Deployment-aware command line tools for EUDIPLO",
29329
31084
  private: false,
29330
31085
  type: "module",
@@ -29339,11 +31094,12 @@ var package_default = {
29339
31094
  scripts: {
29340
31095
  "assets:sync": "node scripts/sync-cli-assets.cjs",
29341
31096
  "assets:check": "node scripts/check-cli-assets.cjs",
31097
+ "build:deps": 'pnpm --silent --filter "@eudiplo/cli^..." build',
29342
31098
  build: "pnpm assets:sync && pnpm assets:check && tsc -p tsconfig.json",
29343
31099
  "build:publish": "pnpm build && esbuild src/index.ts --bundle --platform=node --format=esm --target=node22.12 --alias:jsonc-parser=jsonc-parser/lib/esm/main.js --outfile=dist/index.js",
29344
31100
  "build:sea:bundle": "pnpm assets:sync && pnpm assets:check && esbuild src/index.ts --bundle --platform=node --format=esm --target=node22.12 --alias:jsonc-parser=jsonc-parser/lib/esm/main.js --outfile=dist-sea/index.js",
29345
31101
  "build:sea": "node scripts/build-cli-sea.mjs",
29346
- dev: "tsx src/index.ts",
31102
+ dev: "pnpm -s build:deps && tsx src/index.ts",
29347
31103
  test: "vitest run --root ../.. --project cli",
29348
31104
  lint: "biome lint .",
29349
31105
  format: "biome format --write .",
@@ -29389,7 +31145,7 @@ var package_default = {
29389
31145
  esbuild: "^0.28.2",
29390
31146
  tsx: "^4.23.15",
29391
31147
  typescript: "^7.0.2",
29392
- vitest: "5.0.3"
31148
+ vitest: "5.0.4"
29393
31149
  }
29394
31150
  };
29395
31151