@muze-nl/metro-oidc 0.3.2 → 0.3.4

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/browser.js CHANGED
@@ -80,7 +80,7 @@
80
80
  }
81
81
  let index = middlewares.findIndex((m) => typeof m != "function");
82
82
  if (index >= 0) {
83
- throw metroError("metro.client: middlewares must be a function or an array of functions " + metroURL + "client/invalid-middlewares-value/", middlewares[index]);
83
+ throw metroError("metro.client: middlewares must be a function or an array of functions " + metroURL + "client/invalid-middlewares/", middlewares[index]);
84
84
  }
85
85
  if (!Array.isArray(this.#options.middlewares)) {
86
86
  this.#options.middlewares = [];
@@ -97,13 +97,13 @@
97
97
  fetch(req, options) {
98
98
  req = request(req, options);
99
99
  if (!req.url) {
100
- throw metroError("metro.client." + req.method.toLowerCase() + ": Missing url parameter " + metroURL + "client/missing-url-param/", req);
100
+ throw metroError("metro.client." + req.method.toLowerCase() + ": Missing url parameter " + metroURL + "client/fetch-missing-url/", req);
101
101
  }
102
102
  if (!options) {
103
103
  options = {};
104
104
  }
105
- if (!(typeof options === "object") || Array.isArray(options) || options instanceof String) {
106
- throw metroError("metro.client.fetch: Options is not an object");
105
+ if (!(typeof options === "object") || options instanceof String) {
106
+ throw metroError("metro.client.fetch: Invalid options parameter " + metroURL + "client/fetch-invalid-options/", options);
107
107
  }
108
108
  const metrofetch = async function browserFetch(req2) {
109
109
  if (req2[Symbol.metroProxy]) {
@@ -210,13 +210,16 @@
210
210
  Object.assign(requestParams, getRequestParams(option, requestParams));
211
211
  }
212
212
  }
213
+ let r = new Request(requestParams.url, requestParams);
213
214
  let data = requestParams.body;
214
215
  if (data) {
215
216
  if (typeof data == "object" && !(data instanceof String) && !(data instanceof ReadableStream) && !(data instanceof Blob) && !(data instanceof ArrayBuffer) && !(data instanceof DataView) && !(data instanceof FormData) && !(data instanceof URLSearchParams) && (typeof TypedArray == "undefined" || !(data instanceof TypedArray))) {
216
- requestParams.body = JSON.stringify(data);
217
+ if (typeof data.toString == "function") {
218
+ requestParams.body = data.toString({ headers: r.headers });
219
+ r = new Request(requestParams.url, requestParams);
220
+ }
217
221
  }
218
222
  }
219
- let r = new Request(requestParams.url, requestParams);
220
223
  Object.freeze(r);
221
224
  return new Proxy(r, {
222
225
  get(target, prop, receiver) {
@@ -235,8 +238,6 @@
235
238
  return request(target, ...options2);
236
239
  };
237
240
  break;
238
- case "body":
239
- break;
240
241
  case "data":
241
242
  return data;
242
243
  break;
@@ -297,6 +298,9 @@
297
298
  if (responseParams.body) {
298
299
  data = responseParams.body;
299
300
  }
301
+ if ([101, 204, 205, 304].includes(responseParams.status)) {
302
+ responseParams.body = null;
303
+ }
300
304
  let r = new Response(responseParams.body, responseParams);
301
305
  Object.freeze(r);
302
306
  return new Proxy(r, {
@@ -361,27 +365,31 @@
361
365
  appendSearchParams(u, option);
362
366
  } else if (option && typeof option == "object") {
363
367
  for (let param in option) {
364
- if (param == "search") {
365
- if (typeof option.search == "function") {
366
- option.search(u.search, u);
367
- } else {
368
- u.search = new URLSearchParams(option.search);
369
- }
370
- } else if (param == "searchParams") {
371
- appendSearchParams(u, option.searchParams);
372
- } else {
373
- if (!validParams.includes(param)) {
374
- throw metroError("metro.url: unknown url parameter " + metroURL + "url/unknown-param-name/", param);
375
- }
376
- if (typeof option[param] == "function") {
377
- option[param](u[param], u);
378
- } else if (typeof option[param] == "string" || option[param] instanceof String || typeof option[param] == "number" || option[param] instanceof Number || typeof option[param] == "boolean" || option[param] instanceof Boolean) {
379
- u[param] = "" + option[param];
380
- } else if (typeof option[param] == "object" && option[param].toString) {
381
- u[param] = option[param].toString();
382
- } else {
383
- throw metroError("metro.url: unsupported value for " + param + " " + metroURL + "url/unsupported-param-value/", options[param]);
384
- }
368
+ switch (param) {
369
+ case "search":
370
+ if (typeof option.search == "function") {
371
+ option.search(u.search, u);
372
+ } else {
373
+ u.search = new URLSearchParams(option.search);
374
+ }
375
+ break;
376
+ case "searchParams":
377
+ appendSearchParams(u, option.searchParams);
378
+ break;
379
+ default:
380
+ if (!validParams.includes(param)) {
381
+ throw metroError("metro.url: unknown url parameter " + metroURL + "url/unknown-param-name/", param);
382
+ }
383
+ if (typeof option[param] == "function") {
384
+ option[param](u[param], u);
385
+ } else if (typeof option[param] == "string" || option[param] instanceof String || typeof option[param] == "number" || option[param] instanceof Number || typeof option[param] == "boolean" || option[param] instanceof Boolean) {
386
+ u[param] = "" + option[param];
387
+ } else if (typeof option[param] == "object" && option[param].toString) {
388
+ u[param] = option[param].toString();
389
+ } else {
390
+ throw metroError("metro.url: unsupported value for " + param + " " + metroURL + "url/unsupported-param-value/", options[param]);
391
+ }
392
+ break;
385
393
  }
386
394
  }
387
395
  } else {
@@ -403,6 +411,12 @@
403
411
  return url(target, ...options2);
404
412
  };
405
413
  break;
414
+ case "filename":
415
+ return target.pathname.split("/").pop();
416
+ break;
417
+ case "folderpath":
418
+ return target.pathname.substring(0, target.pathname.lastIndexOf("\\") + 1);
419
+ break;
406
420
  }
407
421
  if (target[prop] instanceof Function) {
408
422
  return target[prop].bind(target);
@@ -414,6 +428,9 @@
414
428
  function formdata(...options) {
415
429
  var params2 = new FormData();
416
430
  for (let option of options) {
431
+ if (option instanceof HTMLFormElement) {
432
+ option = new FormData(option);
433
+ }
417
434
  if (option instanceof FormData) {
418
435
  for (let entry of option.entries()) {
419
436
  params2.append(entry[0], entry[1]);
@@ -429,7 +446,7 @@
429
446
  }
430
447
  }
431
448
  } else {
432
- throw new metroError("metro.formdata: unknown option type, only FormData or Object supported", option);
449
+ throw new metroError("metro.formdata: unknown option type " + metroURL + "formdata/unknown-option-value/", option);
433
450
  }
434
451
  }
435
452
  Object.freeze(params2);
@@ -442,6 +459,9 @@
442
459
  case Symbol.metroSource:
443
460
  return target;
444
461
  break;
462
+ //TODO: add toString() that can check
463
+ //headers param: toString({headers:request.headers})
464
+ //for the content-type
445
465
  case "with":
446
466
  return function(...options2) {
447
467
  return formdata(target, ...options2);
@@ -599,131 +619,210 @@
599
619
  // node_modules/@muze-nl/metro-oauth2/src/oauth2.mjs
600
620
  var oauth2_exports = {};
601
621
  __export(oauth2_exports, {
602
- authorizePopup: () => authorizePopup,
603
622
  base64url_encode: () => base64url_encode,
604
623
  createState: () => createState,
605
624
  default: () => oauth2mw,
606
625
  generateCodeChallenge: () => generateCodeChallenge,
607
626
  generateCodeVerifier: () => generateCodeVerifier,
608
627
  getExpires: () => getExpires,
628
+ isAuthorized: () => isAuthorized,
609
629
  isExpired: () => isExpired,
610
630
  isRedirected: () => isRedirected
611
631
  });
612
632
 
613
- // node_modules/@muze-nl/metro-oauth2/node_modules/@muze-nl/assert/src/assert.mjs
633
+ // node_modules/@muze-nl/assert/src/assert.mjs
614
634
  globalThis.assertEnabled = false;
615
- var assert = (source, test) => {
635
+ function assert(source, test) {
616
636
  if (globalThis.assertEnabled) {
617
637
  let problems = fails(source, test);
618
638
  if (problems) {
619
- throw new assertError("Assertions failed", problems, source);
639
+ console.error("\u{1F170}\uFE0F Assertions failed because of:", problems, "in this source:", source);
640
+ throw new Error("Assertions failed", {
641
+ cause: { problems, source }
642
+ });
620
643
  }
621
644
  }
622
- };
623
- var Optional = (pattern) => (data) => data == null || typeof data == "undefined" ? false : fails(data, pattern);
624
- var Required = (pattern) => (data) => fails(data, pattern);
625
- var Recommended = (pattern) => (data) => data == null || typeof data == "undefined" ? (() => {
626
- console.warning("data does not contain recommended value", data, pattern);
627
- return false;
628
- })() : fails(data, pattern);
629
- var oneOf = (...patterns) => (data) => {
630
- for (let pattern of patterns) {
631
- if (!fails(data, pattern)) {
645
+ }
646
+ function Optional(pattern) {
647
+ return function _Optional(data, root, path) {
648
+ if (typeof data != "undefined" && data != null && typeof pattern != "undefined") {
649
+ return fails(data, pattern, root, path);
650
+ }
651
+ };
652
+ }
653
+ function Required(pattern) {
654
+ return function _Required(data, root, path) {
655
+ if (data == null || typeof data == "undefined") {
656
+ return error2("data is required", data, pattern || "any value", path);
657
+ } else if (typeof pattern != "undefined") {
658
+ return fails(data, pattern, root, path);
659
+ } else {
632
660
  return false;
633
661
  }
634
- }
635
- return error("data does not match oneOf patterns", data, patterns);
636
- };
637
- var anyOf = (...patterns) => (data) => {
638
- if (!Array.isArray(data)) {
639
- return error("data is not an array", data, "anyOf");
640
- }
641
- for (let value of data) {
642
- if (oneOf(...patterns)(value)) {
643
- return error("data does not match anyOf patterns", value, patterns);
662
+ };
663
+ }
664
+ function Recommended(pattern) {
665
+ return function _Recommended(data, root, path) {
666
+ if (data == null || typeof data == "undefined") {
667
+ console.warn("data does not contain recommended value", data, pattern, path);
668
+ return false;
669
+ } else {
670
+ return fails(data, pattern, root, path);
644
671
  }
645
- }
646
- return false;
647
- };
648
- function validURL(data) {
672
+ };
673
+ }
674
+ function oneOf(...patterns) {
675
+ return function _oneOf(data, root, path) {
676
+ for (let pattern of patterns) {
677
+ if (!fails(data, pattern, root, path)) {
678
+ return false;
679
+ }
680
+ }
681
+ return error2("data does not match oneOf patterns", data, patterns, path);
682
+ };
683
+ }
684
+ function anyOf(...patterns) {
685
+ return function _anyOf(data, root, path) {
686
+ if (!Array.isArray(data)) {
687
+ return error2("data is not an array", data, "anyOf", path);
688
+ }
689
+ for (let value of data) {
690
+ if (oneOf(...patterns)(value)) {
691
+ return error2("data does not match anyOf patterns", value, patterns, path);
692
+ }
693
+ }
694
+ return false;
695
+ };
696
+ }
697
+ function allOf(...patterns) {
698
+ return function _allOf(data, root, path) {
699
+ let problems = [];
700
+ for (let pattern of patterns) {
701
+ problems = problems.concat(fails(data, pattern, root, path));
702
+ }
703
+ problems = problems.filter(Boolean);
704
+ if (problems.length) {
705
+ return error2("data does not match all given patterns", data, patterns, path, problems);
706
+ }
707
+ };
708
+ }
709
+ function validURL(data, root, path) {
649
710
  try {
650
711
  if (data instanceof URL) {
651
712
  data = data.href;
652
713
  }
653
714
  let url2 = new URL(data);
654
715
  if (url2.href != data) {
655
- return error("data is not a valid url", data, "validURL");
716
+ if (!(url2.href + "/" == data || url2.href == data + "/")) {
717
+ return error2("data is not a valid url", data, "validURL", path);
718
+ }
656
719
  }
657
720
  } catch (e) {
658
- return error("data is not a valid url", data, "validURL");
721
+ return error2("data is not a valid url", data, "validURL", path);
722
+ }
723
+ }
724
+ function validEmail(data, root, path) {
725
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data)) {
726
+ return error2("data is not a valid email", data, "validEmail", path);
659
727
  }
660
- return false;
661
728
  }
662
- function fails(data, pattern, root) {
729
+ function instanceOf(constructor) {
730
+ return function _instanceOf(data, root, path) {
731
+ if (!(data instanceof constructor)) {
732
+ return error2("data is not an instanceof pattern", data, constructor, path);
733
+ }
734
+ };
735
+ }
736
+ function not(pattern) {
737
+ return function _not(data, root, path) {
738
+ if (!fails(data, pattern, root, path)) {
739
+ return error2("data matches pattern, when required not to", data, pattern, path);
740
+ }
741
+ };
742
+ }
743
+ function fails(data, pattern, root, path = "") {
663
744
  if (!root) {
664
745
  root = data;
665
746
  }
666
747
  let problems = [];
667
748
  if (pattern === Boolean) {
668
- if (typeof data != "boolean") {
669
- problems.push(error("data is not a boolean", data, pattern));
749
+ if (typeof data != "boolean" && !(data instanceof Boolean)) {
750
+ problems.push(error2("data is not a boolean", data, pattern, path));
670
751
  }
671
752
  } else if (pattern === Number) {
672
- if (typeof data != "number") {
673
- problems.push(error("data is not a number", data, pattern));
753
+ if (typeof data != "number" && !(data instanceof Number)) {
754
+ problems.push(error2("data is not a number", data, pattern, path));
755
+ }
756
+ } else if (pattern === String) {
757
+ if (typeof data != "string" && !(data instanceof String)) {
758
+ problems.push(error2("data is not a string", data, pattern, path));
759
+ }
760
+ if (data == "") {
761
+ problems.push(error2("data is an empty string, which is not allowed", data, pattern, path));
674
762
  }
675
763
  } else if (pattern instanceof RegExp) {
676
764
  if (Array.isArray(data)) {
677
- let index = data.findIndex((element) => fails(element, pattern, root));
765
+ let index = data.findIndex((element, index2) => fails(element, pattern, root, path + "[" + index2 + "]"));
678
766
  if (index > -1) {
679
- problems.push(error("data[" + index + "] does not match pattern", data[index], pattern));
767
+ problems.push(error2("data[" + index + "] does not match pattern", data[index], pattern, path + "[" + index + "]"));
680
768
  }
769
+ } else if (typeof data == "undefined") {
770
+ problems.push(error2("data is undefined, should match pattern", data, pattern, path));
681
771
  } else if (!pattern.test(data)) {
682
- problems.push(error("data does not match pattern", data, pattern));
772
+ problems.push(error2("data does not match pattern", data, pattern, path));
683
773
  }
684
774
  } else if (pattern instanceof Function) {
685
- if (pattern(data, root)) {
686
- problems.push(error("data does not match function", data, pattern));
775
+ let problem = pattern(data, root, path);
776
+ if (problem) {
777
+ if (Array.isArray(problem)) {
778
+ problems = problems.concat(problem);
779
+ } else {
780
+ problems.push(problem);
781
+ }
687
782
  }
688
783
  } else if (Array.isArray(pattern)) {
689
784
  if (!Array.isArray(data)) {
690
- problems.push(error("data is not an array", data, []));
785
+ problems.push(error2("data is not an array", data, [], path));
691
786
  }
692
- for (p of pattern) {
693
- let problem = fails(data, p, root);
694
- if (Array.isArray(problem)) {
695
- problems.concat(problem);
696
- } else if (problem) {
697
- problems.push(problem);
787
+ for (let p of pattern) {
788
+ for (let index of data.keys()) {
789
+ let problem = fails(data[index], p, root, path + "[" + index + "]");
790
+ if (Array.isArray(problem)) {
791
+ problems = problems.concat(problem);
792
+ } else if (problem) {
793
+ problems.push(problem);
794
+ }
698
795
  }
699
796
  }
700
797
  } else if (pattern && typeof pattern == "object") {
701
798
  if (Array.isArray(data)) {
702
- let index = data.findIndex((element) => fails(element, pattern, root));
799
+ let index = data.findIndex((element, index2) => fails(element, pattern, root, path + "[" + index2 + "]"));
703
800
  if (index > -1) {
704
- problems.push(error("data[" + index + "] does not match pattern", data[index], pattern));
801
+ problems.push(error2("data[" + index + "] does not match pattern", data[index], pattern, path + "[" + index + "]"));
705
802
  }
706
803
  } else if (!data || typeof data != "object") {
707
- problems.push(error("data is not an object, pattern is", data, pattern));
804
+ problems.push(error2("data is not an object, pattern is", data, pattern, path));
708
805
  } else {
709
806
  if (data instanceof URLSearchParams) {
710
807
  data = Object.fromEntries(data);
711
808
  }
712
- let p2 = problems[problems.length - 1];
713
- for (const [wKey, wVal] of Object.entries(pattern)) {
714
- let result = fails(data[wKey], wVal, root);
809
+ if (pattern instanceof Function) {
810
+ let result = fails(data, pattern, root, path);
715
811
  if (result) {
716
- if (!p2 || typeof p2 == "string") {
717
- p2 = {};
718
- problems.push(error(p2, data[wKey], wVal));
812
+ problems = problems.concat(result);
813
+ }
814
+ } else {
815
+ for (const [wKey, wVal] of Object.entries(pattern)) {
816
+ let result = fails(data[wKey], wVal, root, path + "." + wKey);
817
+ if (result) {
818
+ problems = problems.concat(result);
719
819
  }
720
- p2[wKey] = result.problems;
721
820
  }
722
821
  }
723
822
  }
724
823
  } else {
725
824
  if (pattern != data) {
726
- problems.push(error("data and pattern are not equal", data, pattern));
825
+ problems.push(error2("data and pattern are not equal", data, pattern, path));
727
826
  }
728
827
  }
729
828
  if (problems.length) {
@@ -731,19 +830,17 @@
731
830
  }
732
831
  return false;
733
832
  }
734
- var assertError = class extends Error {
735
- constructor(message, problems, ...details) {
736
- super(message);
737
- this.problems = problems;
738
- this.details = details;
739
- }
740
- };
741
- function error(message, found, expected) {
742
- return {
833
+ function error2(message, found, expected, path, problems) {
834
+ let result = {
743
835
  message,
744
836
  found,
745
- expected
837
+ expected,
838
+ path
746
839
  };
840
+ if (problems) {
841
+ result.problems = problems;
842
+ }
843
+ return result;
747
844
  }
748
845
 
749
846
  // node_modules/@muze-nl/metro-oauth2/src/tokenstore.mjs
@@ -1108,13 +1205,19 @@
1108
1205
  }
1109
1206
  return true;
1110
1207
  }
1111
- async function authorizePopup(authorizationCodeURL) {
1112
- return new Promise((resolve, reject) => {
1113
- addEventListener("oauth2authorized", (evt) => {
1114
- resolve(event.authorization_code);
1115
- }, { once: true });
1116
- window.open(authorizationCodeURL);
1117
- });
1208
+ function isAuthorized(tokens) {
1209
+ if (typeof tokens == "string") {
1210
+ tokens = tokenStore(tokens).tokens;
1211
+ }
1212
+ let accessToken = tokens.get("access_token");
1213
+ if (accessToken && !isExpired(accessToken)) {
1214
+ return true;
1215
+ }
1216
+ let refreshToken = tokens.get("refresh_token");
1217
+ if (refreshToken) {
1218
+ return true;
1219
+ }
1220
+ return false;
1118
1221
  }
1119
1222
 
1120
1223
  // node_modules/@muze-nl/metro-oauth2/src/oauth2.mockserver.mjs
@@ -1142,7 +1245,7 @@
1142
1245
  })
1143
1246
  };
1144
1247
  };
1145
- var error2;
1248
+ var error3;
1146
1249
  var pkce = {};
1147
1250
  function oauth2mockserver(options = {}) {
1148
1251
  const defaultOptions = {
@@ -1154,12 +1257,12 @@
1154
1257
  let url2 = everything_default.url(req.url);
1155
1258
  switch (url2.pathname) {
1156
1259
  case "/authorize/":
1157
- if (error2 = fails(url2.searchParams, {
1260
+ if (error3 = fails(url2.searchParams, {
1158
1261
  response_type: "code",
1159
1262
  client_id: "mockClientId",
1160
1263
  state: Optional(/.*/)
1161
1264
  })) {
1162
- return everything_default.response(badRequest(error2));
1265
+ return everything_default.response(badRequest(error3));
1163
1266
  }
1164
1267
  if (url2.searchParams.has("code_challenge")) {
1165
1268
  if (!url2.searchParams.has("code_challenge_method")) {
@@ -1181,17 +1284,17 @@
1181
1284
  req.data.forEach((value, key) => body[key] = value);
1182
1285
  req = req.with({ body });
1183
1286
  }
1184
- if (error2 = fails(req, {
1287
+ if (error3 = fails(req, {
1185
1288
  method: "POST",
1186
1289
  data: {
1187
1290
  grant_type: oneOf("refresh_token", "authorization_code")
1188
1291
  }
1189
1292
  })) {
1190
- return everything_default.response(badRequest(error2));
1293
+ return everything_default.response(badRequest(error3));
1191
1294
  }
1192
1295
  switch (req.data.grant_type) {
1193
1296
  case "refresh_token":
1194
- if (error2 = fails(req.data, oneOf({
1297
+ if (error3 = fails(req.data, oneOf({
1195
1298
  refresh_token: "mockRefreshToken",
1196
1299
  client_id: "mockClientId",
1197
1300
  client_secret: "mockClientSecret"
@@ -1200,11 +1303,11 @@
1200
1303
  client_id: "mockClientId",
1201
1304
  code_verifier: /.+/
1202
1305
  }))) {
1203
- return everything_default.response(badRequest(error2));
1306
+ return everything_default.response(badRequest(error3));
1204
1307
  }
1205
1308
  break;
1206
1309
  case "access_token":
1207
- if (error2 = fails(req.data, oneOf({
1310
+ if (error3 = fails(req.data, oneOf({
1208
1311
  client_id: "mockClientId",
1209
1312
  client_secret: "mockClientSecret"
1210
1313
  }, {
@@ -1213,7 +1316,7 @@
1213
1316
  //FIXME: check that this matches code_verifier
1214
1317
  code_challenge_method: "S256"
1215
1318
  }))) {
1216
- return everything_default.response(badRequest(error2));
1319
+ return everything_default.response(badRequest(error3));
1217
1320
  }
1218
1321
  break;
1219
1322
  }
@@ -1329,6 +1432,43 @@
1329
1432
  throw everything_default.metroError("metro.oidcmw: Error while fetching " + issuer + ".wellknown/oauth_authorization_server", res);
1330
1433
  }
1331
1434
 
1435
+ // node_modules/@muze-nl/metro-oauth2/src/oauth2.popup.mjs
1436
+ function handleRedirect() {
1437
+ let params2 = new URLSearchParams(window.location.search);
1438
+ if (!params2.has("code") && window.location.hash) {
1439
+ let query = window.location.hash.substr(1);
1440
+ params2 = new URLSearchParams("?" + query);
1441
+ }
1442
+ let parent = window.parent ? window.parent : window.opener;
1443
+ if (params2.has("code")) {
1444
+ parent.postMessage({
1445
+ authorization_code: params2.get("code")
1446
+ }, window.location.origin);
1447
+ } else if (params2.has("error")) {
1448
+ parent.postMessage({
1449
+ error
1450
+ }, window.location.origin);
1451
+ } else {
1452
+ parent.postMessage({
1453
+ error: "Could not find an authorization_code"
1454
+ }, window.location.origin);
1455
+ }
1456
+ }
1457
+ function authorizePopup(authorizationCodeURL) {
1458
+ return new Promise((resolve, reject) => {
1459
+ addEventListener("message", (evt) => {
1460
+ if (event.data.authorization_code) {
1461
+ resolve(event.data.authorization_code);
1462
+ } else if (event.data.error) {
1463
+ reject(event.data.error);
1464
+ } else {
1465
+ reject("Unknown authorization error");
1466
+ }
1467
+ }, { once: true });
1468
+ window.open(authorizationCodeURL);
1469
+ });
1470
+ }
1471
+
1332
1472
  // node_modules/@muze-nl/metro-oauth2/src/keysstore.mjs
1333
1473
  function keysStore() {
1334
1474
  return new Promise((resolve, reject) => {
@@ -1638,237 +1778,26 @@
1638
1778
  discover: oauth2_discovery_exports,
1639
1779
  tokenstore: tokenStore,
1640
1780
  dpopmw,
1641
- keysstore: keysStore
1781
+ keysstore: keysStore,
1782
+ authorizePopup,
1783
+ popupHandleRedirect: handleRedirect
1642
1784
  });
1643
1785
  if (!globalThis.metro.oauth2) {
1644
1786
  globalThis.metro.oauth2 = oauth2;
1645
1787
  }
1646
1788
 
1647
- // node_modules/@muze-nl/assert/src/assert.mjs
1648
- globalThis.assertEnabled = false;
1649
- function assert2(source, test) {
1650
- if (globalThis.assertEnabled) {
1651
- let problems = fails2(source, test);
1652
- if (problems) {
1653
- console.error("\u{1F170}\uFE0F Assertions failed because of:", problems, "in this source:", source);
1654
- throw new Error("Assertions failed", {
1655
- cause: { problems, source }
1656
- });
1657
- }
1658
- }
1659
- }
1660
- function Optional2(pattern) {
1661
- return function _Optional(data, root, path) {
1662
- if (typeof data != "undefined" && data != null && typeof pattern != "undefined") {
1663
- return fails2(data, pattern, root, path);
1664
- }
1665
- };
1666
- }
1667
- function Required2(pattern) {
1668
- return function _Required(data, root, path) {
1669
- if (data == null || typeof data == "undefined") {
1670
- return error3("data is required", data, pattern || "any value", path);
1671
- } else if (typeof pattern != "undefined") {
1672
- return fails2(data, pattern, root, path);
1673
- } else {
1674
- return false;
1675
- }
1676
- };
1677
- }
1678
- function Recommended2(pattern) {
1679
- return function _Recommended(data, root, path) {
1680
- if (data == null || typeof data == "undefined") {
1681
- console.warn("data does not contain recommended value", data, pattern, path);
1682
- return false;
1683
- } else {
1684
- return fails2(data, pattern, root, path);
1685
- }
1686
- };
1687
- }
1688
- function oneOf2(...patterns) {
1689
- return function _oneOf(data, root, path) {
1690
- for (let pattern of patterns) {
1691
- if (!fails2(data, pattern, root, path)) {
1692
- return false;
1693
- }
1694
- }
1695
- return error3("data does not match oneOf patterns", data, patterns, path);
1696
- };
1697
- }
1698
- function anyOf2(...patterns) {
1699
- return function _anyOf(data, root, path) {
1700
- if (!Array.isArray(data)) {
1701
- return error3("data is not an array", data, "anyOf", path);
1702
- }
1703
- for (let value of data) {
1704
- if (oneOf2(...patterns)(value)) {
1705
- return error3("data does not match anyOf patterns", value, patterns, path);
1706
- }
1707
- }
1708
- return false;
1709
- };
1710
- }
1711
- function allOf(...patterns) {
1712
- return function _allOf(data, root, path) {
1713
- let problems = [];
1714
- for (let pattern of patterns) {
1715
- problems = problems.concat(fails2(data, pattern, root, path));
1716
- }
1717
- problems = problems.filter(Boolean);
1718
- if (problems.length) {
1719
- return error3("data does not match all given patterns", data, patterns, path, problems);
1720
- }
1721
- };
1722
- }
1723
- function validURL2(data, root, path) {
1724
- try {
1725
- if (data instanceof URL) {
1726
- data = data.href;
1727
- }
1728
- let url2 = new URL(data);
1729
- if (url2.href != data) {
1730
- if (!(url2.href + "/" == data || url2.href == data + "/")) {
1731
- return error3("data is not a valid url", data, "validURL", path);
1732
- }
1733
- }
1734
- } catch (e) {
1735
- return error3("data is not a valid url", data, "validURL", path);
1736
- }
1737
- }
1738
- function validEmail(data, root, path) {
1739
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data)) {
1740
- return error3("data is not a valid email", data, "validEmail", path);
1741
- }
1742
- }
1743
- function instanceOf(constructor) {
1744
- return function _instanceOf(data, root, path) {
1745
- if (!(data instanceof constructor)) {
1746
- return error3("data is not an instanceof pattern", data, constructor, path);
1747
- }
1748
- };
1749
- }
1750
- function not(pattern) {
1751
- return function _not(data, root, path) {
1752
- if (!fails2(data, pattern, root, path)) {
1753
- return error3("data matches pattern, when required not to", data, pattern, path);
1754
- }
1755
- };
1756
- }
1757
- function fails2(data, pattern, root, path = "") {
1758
- if (!root) {
1759
- root = data;
1760
- }
1761
- let problems = [];
1762
- if (pattern === Boolean) {
1763
- if (typeof data != "boolean" && !(data instanceof Boolean)) {
1764
- problems.push(error3("data is not a boolean", data, pattern, path));
1765
- }
1766
- } else if (pattern === Number) {
1767
- if (typeof data != "number" && !(data instanceof Number)) {
1768
- problems.push(error3("data is not a number", data, pattern, path));
1769
- }
1770
- } else if (pattern === String) {
1771
- if (typeof data != "string" && !(data instanceof String)) {
1772
- problems.push(error3("data is not a string", data, pattern, path));
1773
- }
1774
- if (data == "") {
1775
- problems.push(error3("data is an empty string, which is not allowed", data, pattern, path));
1776
- }
1777
- } else if (pattern instanceof RegExp) {
1778
- if (Array.isArray(data)) {
1779
- let index = data.findIndex((element, index2) => fails2(element, pattern, root, path + "[" + index2 + "]"));
1780
- if (index > -1) {
1781
- problems.push(error3("data[" + index + "] does not match pattern", data[index], pattern, path + "[" + index + "]"));
1782
- }
1783
- } else if (typeof data == "undefined") {
1784
- problems.push(error3("data is undefined, should match pattern", data, pattern, path));
1785
- } else if (!pattern.test(data)) {
1786
- problems.push(error3("data does not match pattern", data, pattern, path));
1787
- }
1788
- } else if (pattern instanceof Function) {
1789
- let problem = pattern(data, root, path);
1790
- if (problem) {
1791
- if (Array.isArray(problem)) {
1792
- problems = problems.concat(problem);
1793
- } else {
1794
- problems.push(problem);
1795
- }
1796
- }
1797
- } else if (Array.isArray(pattern)) {
1798
- if (!Array.isArray(data)) {
1799
- problems.push(error3("data is not an array", data, [], path));
1800
- }
1801
- for (let p2 of pattern) {
1802
- for (let index of data.keys()) {
1803
- let problem = fails2(data[index], p2, root, path + "[" + index + "]");
1804
- if (Array.isArray(problem)) {
1805
- problems = problems.concat(problem);
1806
- } else if (problem) {
1807
- problems.push(problem);
1808
- }
1809
- }
1810
- }
1811
- } else if (pattern && typeof pattern == "object") {
1812
- if (Array.isArray(data)) {
1813
- let index = data.findIndex((element, index2) => fails2(element, pattern, root, path + "[" + index2 + "]"));
1814
- if (index > -1) {
1815
- problems.push(error3("data[" + index + "] does not match pattern", data[index], pattern, path + "[" + index + "]"));
1816
- }
1817
- } else if (!data || typeof data != "object") {
1818
- problems.push(error3("data is not an object, pattern is", data, pattern, path));
1819
- } else {
1820
- if (data instanceof URLSearchParams) {
1821
- data = Object.fromEntries(data);
1822
- }
1823
- if (pattern instanceof Function) {
1824
- let result = fails2(data, pattern, root, path);
1825
- if (result) {
1826
- problems = problems.concat(result);
1827
- }
1828
- } else {
1829
- for (const [wKey, wVal] of Object.entries(pattern)) {
1830
- let result = fails2(data[wKey], wVal, root, path + "." + wKey);
1831
- if (result) {
1832
- problems = problems.concat(result);
1833
- }
1834
- }
1835
- }
1836
- }
1837
- } else {
1838
- if (pattern != data) {
1839
- problems.push(error3("data and pattern are not equal", data, pattern, path));
1840
- }
1841
- }
1842
- if (problems.length) {
1843
- return problems;
1844
- }
1845
- return false;
1846
- }
1847
- function error3(message, found, expected, path, problems) {
1848
- let result = {
1849
- message,
1850
- found,
1851
- expected,
1852
- path
1853
- };
1854
- if (problems) {
1855
- result.problems = problems;
1856
- }
1857
- return result;
1858
- }
1859
-
1860
1789
  // src/oidc.util.mjs
1861
1790
  var MustHave = (...options) => (value, root) => {
1862
1791
  if (options.filter((o) => root.hasOwnKey(o)).length > 0) {
1863
1792
  return false;
1864
1793
  }
1865
- return error3("root data must have all of", root, options);
1794
+ return error2("root data must have all of", root, options);
1866
1795
  };
1867
1796
  var MustInclude = (...options) => (value) => {
1868
1797
  if (Array.isArray(value) && options.filter((o) => !value.includes(o)).length == 0) {
1869
1798
  return false;
1870
1799
  } else {
1871
- return error3("data must be an array which includes", value, options);
1800
+ return error2("data must be an array which includes", value, options);
1872
1801
  }
1873
1802
  };
1874
1803
  var validJWA = [
@@ -1891,9 +1820,9 @@
1891
1820
 
1892
1821
  // src/oidc.discovery.mjs
1893
1822
  async function oidcDiscovery(options = {}) {
1894
- assert2(options, {
1895
- client: Optional2(instanceOf(everything_default.client().constructor)),
1896
- issuer: Required2(validURL2)
1823
+ assert(options, {
1824
+ client: Optional(instanceOf(everything_default.client().constructor)),
1825
+ issuer: Required(validURL)
1897
1826
  });
1898
1827
  const defaultOptions = {
1899
1828
  client: everything_default.client().with(thrower()).with(jsonmw()),
@@ -1905,42 +1834,42 @@
1905
1834
  return TestSucceeded;
1906
1835
  }
1907
1836
  const openid_provider_metadata = {
1908
- issuer: Required2(allOf(options.issuer, MustUseHTTPS)),
1909
- authorization_endpoint: Required2(validURL2),
1910
- token_endpoint: Required2(validURL2),
1911
- userinfo_endpoint: Recommended2(validURL2),
1837
+ issuer: Required(allOf(options.issuer, MustUseHTTPS)),
1838
+ authorization_endpoint: Required(validURL),
1839
+ token_endpoint: Required(validURL),
1840
+ userinfo_endpoint: Recommended(validURL),
1912
1841
  // todo: test for https protocol
1913
- jwks_uri: Required2(validURL2),
1914
- registration_endpoint: options.requireDynamicRegistration ? Required2(validURL2) : Recommended2(validURL2),
1915
- scopes_supported: Recommended2(MustInclude("openid")),
1916
- response_types_supported: options.requireDynamicRegistration ? Required2(MustInclude("code", "id_token", "id_token token")) : Required2([]),
1917
- response_modes_supported: Optional2([]),
1918
- grant_types_supported: options.requireDynamicRegistration ? Optional2(MustInclude("authorization_code")) : Optional2([]),
1919
- acr_values_supported: Optional2([]),
1920
- subject_types_supported: Required2([]),
1921
- id_token_signing_alg_values_supported: Required2(MustInclude("RS256")),
1922
- id_token_encryption_alg_values_supported: Optional2([]),
1923
- id_token_encryption_enc_values_supported: Optional2([]),
1924
- userinfo_signing_alg_values_supported: Optional2([]),
1925
- userinfo_encryption_alg_values_supported: Optional2([]),
1926
- userinfo_encryption_enc_values_supported: Optional2([]),
1927
- request_object_signing_alg_values_supported: Optional2(MustInclude("RS256")),
1842
+ jwks_uri: Required(validURL),
1843
+ registration_endpoint: options.requireDynamicRegistration ? Required(validURL) : Recommended(validURL),
1844
+ scopes_supported: Recommended(MustInclude("openid")),
1845
+ response_types_supported: options.requireDynamicRegistration ? Required(MustInclude("code", "id_token", "id_token token")) : Required([]),
1846
+ response_modes_supported: Optional([]),
1847
+ grant_types_supported: options.requireDynamicRegistration ? Optional(MustInclude("authorization_code")) : Optional([]),
1848
+ acr_values_supported: Optional([]),
1849
+ subject_types_supported: Required([]),
1850
+ id_token_signing_alg_values_supported: Required(MustInclude("RS256")),
1851
+ id_token_encryption_alg_values_supported: Optional([]),
1852
+ id_token_encryption_enc_values_supported: Optional([]),
1853
+ userinfo_signing_alg_values_supported: Optional([]),
1854
+ userinfo_encryption_alg_values_supported: Optional([]),
1855
+ userinfo_encryption_enc_values_supported: Optional([]),
1856
+ request_object_signing_alg_values_supported: Optional(MustInclude("RS256")),
1928
1857
  // not testing for 'none'
1929
- request_object_encryption_alg_values_supported: Optional2([]),
1930
- request_object_encryption_enc_values_supported: Optional2([]),
1931
- token_endpoint_auth_methods_supported: Optional2(anyOf2(...validAuthMethods2)),
1932
- token_endpoint_auth_signing_alg_values_supported: Optional2(MustInclude("RS256"), not(MustInclude("none"))),
1933
- display_values_supported: Optional2(anyOf2("page", "popup", "touch", "wap")),
1934
- claim_types_supported: Optional2(anyOf2("normal", "aggregated", "distributed")),
1935
- claims_supported: Recommended2([]),
1936
- service_documentation: Optional2(validURL2),
1937
- claims_locales_supported: Optional2([]),
1938
- ui_locales_supported: Optional2([]),
1939
- claims_parameter_supported: Optional2(Boolean),
1940
- request_parameter_supported: Optional2(Boolean),
1941
- request_uri_parameter_supported: Optional2(Boolean),
1942
- op_policy_uri: Optional2(validURL2),
1943
- op_tos_uri: Optional2(validURL2)
1858
+ request_object_encryption_alg_values_supported: Optional([]),
1859
+ request_object_encryption_enc_values_supported: Optional([]),
1860
+ token_endpoint_auth_methods_supported: Optional(anyOf(...validAuthMethods2)),
1861
+ token_endpoint_auth_signing_alg_values_supported: Optional(MustInclude("RS256"), not(MustInclude("none"))),
1862
+ display_values_supported: Optional(anyOf("page", "popup", "touch", "wap")),
1863
+ claim_types_supported: Optional(anyOf("normal", "aggregated", "distributed")),
1864
+ claims_supported: Recommended([]),
1865
+ service_documentation: Optional(validURL),
1866
+ claims_locales_supported: Optional([]),
1867
+ ui_locales_supported: Optional([]),
1868
+ claims_parameter_supported: Optional(Boolean),
1869
+ request_parameter_supported: Optional(Boolean),
1870
+ request_uri_parameter_supported: Optional(Boolean),
1871
+ op_policy_uri: Optional(validURL),
1872
+ op_tos_uri: Optional(validURL)
1944
1873
  };
1945
1874
  const configURL = everything_default.url(options.issuer, ".well-known/openid-configuration");
1946
1875
  const response2 = await options.client.get(
@@ -1949,49 +1878,49 @@
1949
1878
  configURL
1950
1879
  );
1951
1880
  const openid_config = response2.data;
1952
- assert2(openid_config, openid_provider_metadata);
1953
- assert2(openid_config.issuer, options.issuer);
1881
+ assert(openid_config, openid_provider_metadata);
1882
+ assert(openid_config.issuer, options.issuer);
1954
1883
  return openid_config;
1955
1884
  }
1956
1885
 
1957
1886
  // src/oidc.register.mjs
1958
1887
  async function register(options) {
1959
1888
  const openid_client_metadata = {
1960
- redirect_uris: Required2([validURL2]),
1961
- response_types: Optional2([]),
1962
- grant_types: Optional2(anyOf2("authorization_code", "refresh_token")),
1889
+ redirect_uris: Required([validURL]),
1890
+ response_types: Optional([]),
1891
+ grant_types: Optional(anyOf("authorization_code", "refresh_token")),
1963
1892
  //TODO: match response_types with grant_types
1964
- application_type: Optional2(oneOf2("native", "web")),
1965
- contacts: Optional2([validEmail]),
1966
- client_name: Optional2(String),
1967
- logo_uri: Optional2(validURL2),
1968
- client_uri: Optional2(validURL2),
1969
- policy_uri: Optional2(validURL2),
1970
- tos_uri: Optional2(validURL2),
1971
- jwks_uri: Optional2(validURL2, not(MustHave("jwks"))),
1972
- jwks: Optional2(validURL2, not(MustHave("jwks_uri"))),
1973
- sector_identifier_uri: Optional2(validURL2),
1974
- subject_type: Optional2(String),
1975
- id_token_signed_response_alg: Optional2(oneOf2(...validJWA)),
1976
- id_token_encrypted_response_alg: Optional2(oneOf2(...validJWA)),
1977
- id_token_encrypted_response_enc: Optional2(oneOf2(...validJWA), MustHave("id_token_encrypted_response_alg")),
1978
- userinfo_signed_response_alg: Optional2(oneOf2(...validJWA)),
1979
- userinfo_encrypted_response_alg: Optional2(oneOf2(...validJWA)),
1980
- userinfo_encrypted_response_enc: Optional2(oneOf2(...validJWA), MustHave("userinfo_encrypted_response_alg")),
1981
- request_object_signing_alg: Optional2(oneOf2(...validJWA)),
1982
- request_object_encryption_alg: Optional2(oneOf2(...validJWA)),
1983
- request_object_encryption_enc: Optional2(oneOf2(...validJWA)),
1984
- token_endpoint_auth_method: Optional2(oneOf2(...validAuthMethods2)),
1985
- token_endpoint_auth_signing_alg: Optional2(oneOf2(...validJWA)),
1986
- default_max_age: Optional2(Number),
1987
- require_auth_time: Optional2(Boolean),
1988
- default_acr_values: Optional2([String]),
1989
- initiate_login_uri: Optional2([validURL2]),
1990
- request_uris: Optional2([validURL2])
1893
+ application_type: Optional(oneOf("native", "web")),
1894
+ contacts: Optional([validEmail]),
1895
+ client_name: Optional(String),
1896
+ logo_uri: Optional(validURL),
1897
+ client_uri: Optional(validURL),
1898
+ policy_uri: Optional(validURL),
1899
+ tos_uri: Optional(validURL),
1900
+ jwks_uri: Optional(validURL, not(MustHave("jwks"))),
1901
+ jwks: Optional(validURL, not(MustHave("jwks_uri"))),
1902
+ sector_identifier_uri: Optional(validURL),
1903
+ subject_type: Optional(String),
1904
+ id_token_signed_response_alg: Optional(oneOf(...validJWA)),
1905
+ id_token_encrypted_response_alg: Optional(oneOf(...validJWA)),
1906
+ id_token_encrypted_response_enc: Optional(oneOf(...validJWA), MustHave("id_token_encrypted_response_alg")),
1907
+ userinfo_signed_response_alg: Optional(oneOf(...validJWA)),
1908
+ userinfo_encrypted_response_alg: Optional(oneOf(...validJWA)),
1909
+ userinfo_encrypted_response_enc: Optional(oneOf(...validJWA), MustHave("userinfo_encrypted_response_alg")),
1910
+ request_object_signing_alg: Optional(oneOf(...validJWA)),
1911
+ request_object_encryption_alg: Optional(oneOf(...validJWA)),
1912
+ request_object_encryption_enc: Optional(oneOf(...validJWA)),
1913
+ token_endpoint_auth_method: Optional(oneOf(...validAuthMethods2)),
1914
+ token_endpoint_auth_signing_alg: Optional(oneOf(...validJWA)),
1915
+ default_max_age: Optional(Number),
1916
+ require_auth_time: Optional(Boolean),
1917
+ default_acr_values: Optional([String]),
1918
+ initiate_login_uri: Optional([validURL]),
1919
+ request_uris: Optional([validURL])
1991
1920
  };
1992
- assert2(options, {
1993
- client: Optional2(instanceOf(everything_default.client().constructor)),
1994
- registration_endpoint: validURL2,
1921
+ assert(options, {
1922
+ client: Optional(instanceOf(everything_default.client().constructor)),
1923
+ registration_endpoint: validURL,
1995
1924
  client_info: openid_client_metadata
1996
1925
  });
1997
1926
  const defaultOptions = {
@@ -2043,13 +1972,13 @@
2043
1972
  }
2044
1973
  };
2045
1974
  options = Object.assign({}, defaultOptions, options);
2046
- assert2(options, {
2047
- client: Required2(instanceOf(client().constructor)),
1975
+ assert(options, {
1976
+ client: Required(instanceOf(client().constructor)),
2048
1977
  // required because it is set in defaultOptions
2049
- client_info: Required2(),
2050
- issuer: Required2(validURL2),
2051
- oauth2: Optional2({}),
2052
- openid_configuration: Optional2()
1978
+ client_info: Required(),
1979
+ issuer: Required(validURL),
1980
+ oauth2: Optional({}),
1981
+ openid_configuration: Optional()
2053
1982
  });
2054
1983
  if (!options.store) {
2055
1984
  options.store = oidcStore(options.issuer);
@@ -2081,7 +2010,7 @@
2081
2010
  options.store.set("openid_configuration", options.openid_configuration);
2082
2011
  }
2083
2012
  if (!options.client_info?.client_id) {
2084
- assert2(options.client_info?.client_name, Required2());
2013
+ assert(options.client_info?.client_name, Required());
2085
2014
  if (!options.openid_configuration.registration_endpoint) {
2086
2015
  throw metroError("metro.oidcmw: Error: issuer " + options.issuer + " does not support dynamic client registration, but you haven't specified a client_id");
2087
2016
  }
@@ -2155,6 +2084,12 @@
2155
2084
  return isRedirected();
2156
2085
  }
2157
2086
  function idToken(options) {
2087
+ if (!options.store) {
2088
+ if (!options.issuer) {
2089
+ throw metroError("Must supply options.issuer or options.store to get the id_token");
2090
+ }
2091
+ options.store = oidcStore(options.issuer);
2092
+ }
2158
2093
  return options.store.get("id_token");
2159
2094
  }
2160
2095