keycloakify 10.0.0-rc.136 → 10.0.0-rc.138

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/README.md CHANGED
@@ -43,7 +43,8 @@
43
43
 
44
44
  Keycloakify is fully compatible with Keycloak 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, [~~22~~](https://github.com/keycloakify/keycloakify/issues/389#issuecomment-1822509763), 23, 24, 25...[and beyond](https://github.com/keycloakify/keycloakify/discussions/346#discussioncomment-5889791)
45
45
 
46
- > NOTE: Keycloakify 10 is still in release-candidate state. [Follow progress](https://github.com/keycloakify/keycloakify/pull/538).
46
+ > NOTE: Keycloakify 10, while still being tagged as release candidate is the version you should use if you are starting today.
47
+ > Use `yarn add keycloakify@next` or pin [the latest version candidate](https://www.npmjs.com/package/keycloakify?activeTab=versions).
47
48
 
48
49
  ## Sponsors
49
50
 
package/bin/31.index.js CHANGED
@@ -142,7 +142,7 @@ function ensureSingleOrNone(arg0) {
142
142
 
143
143
  (0,assert.assert)();
144
144
  function getBuildContext(params) {
145
- var _a, _b, _c, _d, _e, _f;
145
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
146
146
  const { cliCommandOptions } = params;
147
147
  const projectDirPath = cliCommandOptions.projectDirPath !== undefined
148
148
  ? (0,getAbsoluteAndInOsFormatPath/* getAbsoluteAndInOsFormatPath */.c)({
@@ -260,6 +260,17 @@ function getBuildContext(params) {
260
260
  (0,assert.assert)();
261
261
  return (0,id.id)(zTargetType);
262
262
  })();
263
+ const zStartKeycloakOptions = (() => {
264
+ const zTargetType = lib.z.object({
265
+ dockerImage: lib.z.string().optional(),
266
+ extensionJars: lib.z.array(lib.z.string()).optional(),
267
+ realmJsonFilePath: lib.z.string().optional(),
268
+ dockerExtraArgs: lib.z.array(lib.z.string()).optional(),
269
+ keycloakExtraArgs: lib.z.array(lib.z.string()).optional()
270
+ });
271
+ (0,assert.assert)();
272
+ return (0,id.id)(zTargetType);
273
+ })();
263
274
  const zBuildOptions = (() => {
264
275
  const zTargetType = lib.z.intersection(lib.z.object({
265
276
  themeName: lib.z.union([lib.z.string(), lib.z.array(lib.z.string())]).optional(),
@@ -274,7 +285,8 @@ function getBuildContext(params) {
274
285
  groupId: lib.z.string().optional(),
275
286
  loginThemeResourcesFromKeycloakVersion: lib.z.string().optional(),
276
287
  keycloakifyBuildDirPath: lib.z.string().optional(),
277
- kcContextExclusionsFtl: lib.z.string().optional()
288
+ kcContextExclusionsFtl: lib.z.string().optional(),
289
+ startKeycloakOptions: zStartKeycloakOptions.optional()
278
290
  }), zAccountThemeImplAndKeycloakVersionTargets);
279
291
  (0,assert.assert)();
280
292
  return (0,id.id)(zTargetType);
@@ -660,7 +672,38 @@ function getBuildContext(params) {
660
672
  process.exit(1);
661
673
  }
662
674
  return jarTargets;
663
- })()
675
+ })(),
676
+ startKeycloakOptions: {
677
+ dockerImage: (() => {
678
+ var _a;
679
+ if (((_a = buildOptions.startKeycloakOptions) === null || _a === void 0 ? void 0 : _a.dockerImage) === undefined) {
680
+ return undefined;
681
+ }
682
+ const [reference, tag, ...rest] = buildOptions.startKeycloakOptions.dockerImage.split(":");
683
+ (0,assert.assert)(reference !== undefined && tag !== undefined && rest.length === 0, `Invalid docker image: ${buildOptions.startKeycloakOptions.dockerImage}`);
684
+ return { reference, tag };
685
+ })(),
686
+ dockerExtraArgs: (_h = (_g = buildOptions.startKeycloakOptions) === null || _g === void 0 ? void 0 : _g.dockerExtraArgs) !== null && _h !== void 0 ? _h : [],
687
+ keycloakExtraArgs: (_k = (_j = buildOptions.startKeycloakOptions) === null || _j === void 0 ? void 0 : _j.keycloakExtraArgs) !== null && _k !== void 0 ? _k : [],
688
+ extensionJars: ((_m = (_l = buildOptions.startKeycloakOptions) === null || _l === void 0 ? void 0 : _l.extensionJars) !== null && _m !== void 0 ? _m : []).map(urlOrPath => {
689
+ if (/^https?:\/\//.test(urlOrPath)) {
690
+ return { type: "url", url: urlOrPath };
691
+ }
692
+ return {
693
+ type: "path",
694
+ path: (0,getAbsoluteAndInOsFormatPath/* getAbsoluteAndInOsFormatPath */.c)({
695
+ pathIsh: urlOrPath,
696
+ cwd: projectDirPath
697
+ })
698
+ };
699
+ }),
700
+ realmJsonFilePath: ((_o = buildOptions.startKeycloakOptions) === null || _o === void 0 ? void 0 : _o.realmJsonFilePath) === undefined
701
+ ? undefined
702
+ : (0,getAbsoluteAndInOsFormatPath/* getAbsoluteAndInOsFormatPath */.c)({
703
+ pathIsh: buildOptions.startKeycloakOptions.realmJsonFilePath,
704
+ cwd: projectDirPath
705
+ })
706
+ }
664
707
  };
665
708
  }
666
709
  //# sourceMappingURL=buildContext.js.map
package/bin/440.index.js CHANGED
@@ -885,7 +885,7 @@ async function generateResourcesForMainTheme(params) {
885
885
  break bring_in_account_v3_i18n_messages;
886
886
  }
887
887
  const { extractedDirPath } = await (0,downloadAndExtractArchive/* downloadAndExtractArchive */.I)({
888
- url: "https://repo1.maven.org/maven2/org/keycloak/keycloak-account-ui/25.0.1/keycloak-account-ui-25.0.1.jar",
888
+ urlOrPath: "https://repo1.maven.org/maven2/org/keycloak/keycloak-account-ui/25.0.1/keycloak-account-ui-25.0.1.jar",
889
889
  cacheDirPath: buildContext.cacheDirPath,
890
890
  fetchOptions: buildContext.fetchOptions,
891
891
  uniqueIdOfOnArchiveFile: "bring_in_account_v3_i18n_messages",
package/bin/526.index.js CHANGED
@@ -401,7 +401,7 @@ async function appBuild_vite(params) {
401
401
  const { buildContext } = params;
402
402
  (0,assert.assert)(buildContext.bundler === "vite");
403
403
  const dIsSuccess = new Deferred.Deferred();
404
- console.log(source_default().blue("Running: 'npx vite build'"));
404
+ console.log(source_default().blue("$ npx vite build"));
405
405
  const child = external_child_process_.spawn("npx", ["vite", "build"], {
406
406
  cwd: buildContext.projectDirPath,
407
407
  shell: true
@@ -464,7 +464,7 @@ async function appBuild_webpack(params) {
464
464
  });
465
465
  continue;
466
466
  }
467
- console.log(source_default().blue(`Running: '${subCommand}'`));
467
+ console.log(source_default().blue(`$ ${subCommand}`));
468
468
  const child = external_child_process_.spawn(command, args, {
469
469
  cwd: commandCwd,
470
470
  env: Object.assign(Object.assign({}, process.env), { PATH: (() => {
@@ -498,7 +498,7 @@ async function appBuild_webpack(params) {
498
498
  async function keycloakifyBuild(params) {
499
499
  const { buildForKeycloakMajorVersionNumber, buildContext } = params;
500
500
  const dResult = new Deferred.Deferred();
501
- console.log(source_default().blue("Running: 'npx keycloakify build'"));
501
+ console.log(source_default().blue("$ npx keycloakify build"));
502
502
  const child = external_child_process_.spawn("npx", ["keycloakify", "build"], {
503
503
  cwd: buildContext.projectDirPath,
504
504
  env: Object.assign(Object.assign({}, process.env), { [constants/* BUILD_FOR_KEYCLOAK_MAJOR_VERSION_ENV_NAME */.ac]: `${buildForKeycloakMajorVersionNumber}` }),
@@ -517,6 +517,8 @@ var isInside = __webpack_require__(90665);
517
517
  var fs_existsAsync = __webpack_require__(43765);
518
518
  // EXTERNAL MODULE: ./dist/bin/tools/fs.rm.js
519
519
  var fs_rm = __webpack_require__(8699);
520
+ // EXTERNAL MODULE: ./dist/bin/tools/downloadAndExtractArchive.js
521
+ var downloadAndExtractArchive = __webpack_require__(38367);
520
522
  ;// CONCATENATED MODULE: ./dist/bin/start-keycloak/start-keycloak.js
521
523
 
522
524
 
@@ -538,9 +540,11 @@ var fs_rm = __webpack_require__(8699);
538
540
 
539
541
 
540
542
 
543
+
541
544
 
542
545
 
543
546
  async function command(params) {
547
+ var _a, _b;
544
548
  exit_if_docker_not_installed: {
545
549
  let commandOutput = undefined;
546
550
  try {
@@ -548,7 +552,7 @@ async function command(params) {
548
552
  stdio: ["ignore", "pipe", "ignore"]
549
553
  });
550
554
  }
551
- catch (_a) { }
555
+ catch (_c) { }
552
556
  if (commandOutput === null || commandOutput === void 0 ? void 0 : commandOutput.toString("utf8").includes("Docker")) {
553
557
  break exit_if_docker_not_installed;
554
558
  }
@@ -565,7 +569,7 @@ async function command(params) {
565
569
  external_child_process_.execSync("docker info", { stdio: "ignore" });
566
570
  isDockerRunning = true;
567
571
  }
568
- catch (_b) {
572
+ catch (_d) {
569
573
  isDockerRunning = false;
570
574
  }
571
575
  if (isDockerRunning) {
@@ -579,11 +583,13 @@ async function command(params) {
579
583
  }
580
584
  const { cliCommandOptions } = params;
581
585
  const buildContext = (0,shared_buildContext/* getBuildContext */.s)({ cliCommandOptions });
582
- const { keycloakVersion } = await (async () => {
586
+ const { dockerImageTag } = await (async () => {
583
587
  if (cliCommandOptions.keycloakVersion !== undefined) {
588
+ return { dockerImageTag: cliCommandOptions.keycloakVersion };
589
+ }
590
+ if (buildContext.startKeycloakOptions.dockerImage !== undefined) {
584
591
  return {
585
- keycloakVersion: cliCommandOptions.keycloakVersion,
586
- keycloakMajorNumber: SemVer/* SemVer.parse */.h.parse(cliCommandOptions.keycloakVersion).major
592
+ dockerImageTag: buildContext.startKeycloakOptions.dockerImage.tag
587
593
  };
588
594
  }
589
595
  console.log([
@@ -596,9 +602,26 @@ async function command(params) {
596
602
  buildContext
597
603
  });
598
604
  console.log(`→ ${keycloakVersion}`);
599
- return { keycloakVersion };
605
+ return { dockerImageTag: keycloakVersion };
606
+ })();
607
+ const keycloakMajorVersionNumber = (() => {
608
+ if (buildContext.startKeycloakOptions.dockerImage === undefined) {
609
+ return SemVer/* SemVer.parse */.h.parse(dockerImageTag).major;
610
+ }
611
+ const { tag } = buildContext.startKeycloakOptions.dockerImage;
612
+ const [wrap] = [18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]
613
+ .map(majorVersionNumber => ({
614
+ majorVersionNumber,
615
+ index: tag.indexOf(`${majorVersionNumber}`)
616
+ }))
617
+ .filter(({ index }) => index !== -1)
618
+ .sort((a, b) => a.index - b.index);
619
+ if (wrap === undefined) {
620
+ console.warn(source_default().yellow(`Could not determine the major Keycloak version number from the docker image tag ${tag}. Assuming 25`));
621
+ return 25;
622
+ }
623
+ return wrap.majorVersionNumber;
600
624
  })();
601
- const keycloakMajorVersionNumber = SemVer/* SemVer.parse */.h.parse(keycloakVersion).major;
602
625
  {
603
626
  const { isAppBuildSuccess } = await appBuild({
604
627
  buildContext
@@ -621,18 +644,39 @@ async function command(params) {
621
644
  .map(fileBasename => (0,external_path_.join)(buildContext.keycloakifyBuildDirPath, fileBasename))
622
645
  .sort((a, b) => external_fs_.statSync(b).mtimeMs - external_fs_.statSync(a).mtimeMs)[0];
623
646
  (0,assert.assert)(jarFilePath !== undefined);
624
- console.log(`Using ${source_default().bold((0,external_path_.basename)(jarFilePath))}`);
647
+ const extensionJarFilePaths = await Promise.all(buildContext.startKeycloakOptions.extensionJars.map(async (extensionJar) => {
648
+ switch (extensionJar.type) {
649
+ case "path": {
650
+ (0,assert.assert)(await (0,fs_existsAsync/* existsAsync */.o)(extensionJar.path), `${extensionJar.path} does not exist`);
651
+ return extensionJar.path;
652
+ }
653
+ case "url": {
654
+ const { archiveFilePath } = await (0,downloadAndExtractArchive/* downloadAndExtractArchive */.I)({
655
+ cacheDirPath: buildContext.cacheDirPath,
656
+ fetchOptions: buildContext.fetchOptions,
657
+ urlOrPath: extensionJar.url,
658
+ uniqueIdOfOnArchiveFile: "no extraction",
659
+ onArchiveFile: async () => { }
660
+ });
661
+ return archiveFilePath;
662
+ }
663
+ }
664
+ (0,assert.assert)(false);
665
+ }));
625
666
  const realmJsonFilePath = await (async () => {
626
667
  if (cliCommandOptions.realmJsonFilePath !== undefined) {
627
668
  if (cliCommandOptions.realmJsonFilePath === "none") {
628
669
  return undefined;
629
670
  }
630
- console.log(source_default().green(`Using realm json file: ${cliCommandOptions.realmJsonFilePath}`));
631
671
  return (0,getAbsoluteAndInOsFormatPath/* getAbsoluteAndInOsFormatPath */.c)({
632
672
  pathIsh: cliCommandOptions.realmJsonFilePath,
633
673
  cwd: process.cwd()
634
674
  });
635
675
  }
676
+ if (buildContext.startKeycloakOptions.realmJsonFilePath !== undefined) {
677
+ (0,assert.assert)(await (0,fs_existsAsync/* existsAsync */.o)(buildContext.startKeycloakOptions.realmJsonFilePath), `${(0,external_path_.relative)(process.cwd(), buildContext.startKeycloakOptions.realmJsonFilePath)} does not exist`);
678
+ return buildContext.startKeycloakOptions.realmJsonFilePath;
679
+ }
636
680
  const internalFilePath = await (async () => {
637
681
  const dirPath = (0,external_path_.join)((0,getThisCodebaseRootDirPath/* getThisCodebaseRootDirPath */.e)(), "src", "bin", "start-keycloak");
638
682
  const filePath = (0,external_path_.join)(dirPath, `myrealm-realm-${keycloakMajorVersionNumber}.json`);
@@ -690,65 +734,52 @@ async function command(params) {
690
734
  stdio: "ignore"
691
735
  });
692
736
  }
693
- catch (_c) { }
694
- const spawnArgs = [
695
- "docker",
696
- [
697
- "run",
698
- ...["-p", `${cliCommandOptions.port}:8080`],
699
- ...["--name", constants/* CONTAINER_NAME */.sv],
700
- ...["-e", "KEYCLOAK_ADMIN=admin"],
701
- ...["-e", "KEYCLOAK_ADMIN_PASSWORD=admin"],
702
- ...(realmJsonFilePath === undefined
703
- ? []
704
- : [
705
- "-v",
706
- `"${realmJsonFilePath}":/opt/keycloak/data/import/myrealm-realm.json`
707
- ]),
708
- ...[
709
- "-v",
710
- `"${jarFilePath_cacheDir}":/opt/keycloak/providers/keycloak-theme.jar`
711
- ],
712
- ...(keycloakMajorVersionNumber <= 20
713
- ? ["-e", "JAVA_OPTS=-Dkeycloak.profile=preview"]
714
- : []),
715
- ...[
716
- ...buildContext.themeNames,
717
- ...(external_fs_.existsSync((0,external_path_.join)(buildContext.keycloakifyBuildDirPath, "theme", constants/* ACCOUNT_V1_THEME_NAME */.ZQ))
718
- ? [constants/* ACCOUNT_V1_THEME_NAME */.ZQ]
719
- : [])
720
- ]
721
- .map(themeName => ({
722
- localDirPath: (0,external_path_.join)(buildContext.keycloakifyBuildDirPath, "theme", themeName),
723
- containerDirPath: `/opt/keycloak/themes/${themeName}`
724
- }))
725
- .map(({ localDirPath, containerDirPath }) => [
726
- "-v",
727
- `"${localDirPath}":${containerDirPath}:rw`
728
- ])
729
- .flat(),
730
- ...buildContext.environmentVariables
731
- .map(({ name }) => ({ name, envValue: process.env[name] }))
732
- .map(({ name, envValue }) => envValue === undefined ? undefined : { name, envValue })
733
- .filter((0,exclude.exclude)(undefined))
734
- .map(({ name, envValue }) => [
735
- "--env",
736
- `${name}='${envValue.replace(/'/g, "'\\''")}'`
737
- ])
738
- .flat(),
739
- `quay.io/keycloak/keycloak:${keycloakVersion}`,
740
- "start-dev",
741
- ...(21 <= keycloakMajorVersionNumber && keycloakMajorVersionNumber < 24
742
- ? ["--features=declarative-user-profile"]
743
- : []),
744
- ...(realmJsonFilePath === undefined ? [] : ["--import-realm"])
745
- ],
746
- {
747
- cwd: buildContext.keycloakifyBuildDirPath,
748
- shell: true
749
- }
737
+ catch (_e) { }
738
+ const dockerRunArgs = [
739
+ `-p ${cliCommandOptions.port}:8080`,
740
+ `--name ${constants/* CONTAINER_NAME */.sv}`,
741
+ `-e KEYCLOAK_ADMIN=admin`,
742
+ `-e KEYCLOAK_ADMIN_PASSWORD=admin`,
743
+ ...(realmJsonFilePath === undefined
744
+ ? []
745
+ : [
746
+ `-v ".${external_path_.sep}${(0,external_path_.relative)(process.cwd(), realmJsonFilePath)}":/opt/keycloak/data/import/myrealm-realm.json`
747
+ ]),
748
+ `-v "./${(0,external_path_.relative)(process.cwd(), jarFilePath_cacheDir)}":/opt/keycloak/providers/keycloak-theme.jar`,
749
+ ...extensionJarFilePaths.map(jarFilePath => `-v ".${external_path_.sep}${(0,external_path_.relative)(process.cwd(), jarFilePath)}":/opt/keycloak/providers/${(0,external_path_.basename)(jarFilePath)}`),
750
+ ...(keycloakMajorVersionNumber <= 20
751
+ ? ["-e JAVA_OPTS=-Dkeycloak.profile=preview"]
752
+ : []),
753
+ ...[
754
+ ...buildContext.themeNames,
755
+ ...(external_fs_.existsSync((0,external_path_.join)(buildContext.keycloakifyBuildDirPath, "theme", constants/* ACCOUNT_V1_THEME_NAME */.ZQ))
756
+ ? [constants/* ACCOUNT_V1_THEME_NAME */.ZQ]
757
+ : [])
758
+ ]
759
+ .map(themeName => ({
760
+ localDirPath: (0,external_path_.join)(buildContext.keycloakifyBuildDirPath, "theme", themeName),
761
+ containerDirPath: `/opt/keycloak/themes/${themeName}`
762
+ }))
763
+ .map(({ localDirPath, containerDirPath }) => `-v ".${external_path_.sep}${(0,external_path_.relative)(process.cwd(), localDirPath)}":${containerDirPath}:rw`),
764
+ ...buildContext.environmentVariables
765
+ .map(({ name }) => ({ name, envValue: process.env[name] }))
766
+ .map(({ name, envValue }) => envValue === undefined ? undefined : { name, envValue })
767
+ .filter((0,exclude.exclude)(undefined))
768
+ .map(({ name, envValue }) => `--env ${name}='${envValue.replace(/'/g, "'\\''")}'`),
769
+ ...buildContext.startKeycloakOptions.dockerExtraArgs,
770
+ `${(_b = (_a = buildContext.startKeycloakOptions.dockerImage) === null || _a === void 0 ? void 0 : _a.reference) !== null && _b !== void 0 ? _b : "quay.io/keycloak/keycloak"}:${dockerImageTag}`,
771
+ "start-dev",
772
+ ...(21 <= keycloakMajorVersionNumber && keycloakMajorVersionNumber < 24
773
+ ? ["--features=declarative-user-profile"]
774
+ : []),
775
+ ...(realmJsonFilePath === undefined ? [] : ["--import-realm"]),
776
+ ...buildContext.startKeycloakOptions.keycloakExtraArgs
750
777
  ];
751
- const child = external_child_process_.spawn(...spawnArgs);
778
+ console.log(source_default().blue([
779
+ `$ docker run \\`,
780
+ ...dockerRunArgs.map((line, i, arr) => ` ${line}${arr.length - 1 === i ? "" : " \\"}`)
781
+ ].join("\n")));
782
+ const child = external_child_process_.spawn("docker", ["run", ...dockerRunArgs.map(line => line.split(" ")).flat()], { shell: true });
752
783
  child.stdout.on("data", data => process.stdout.write(data));
753
784
  child.stderr.on("data", data => process.stderr.write(data));
754
785
  child.on("exit", process.exit);
@@ -911,6 +942,195 @@ var SemVer;
911
942
 
912
943
  /***/ }),
913
944
 
945
+ /***/ 38367:
946
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
947
+
948
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
949
+ /* harmony export */ "I": () => (/* binding */ downloadAndExtractArchive)
950
+ /* harmony export */ });
951
+ /* harmony import */ var make_fetch_happen__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9525);
952
+ /* harmony import */ var make_fetch_happen__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(make_fetch_happen__WEBPACK_IMPORTED_MODULE_0__);
953
+ /* harmony import */ var fs_promises__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(73292);
954
+ /* harmony import */ var fs_promises__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs_promises__WEBPACK_IMPORTED_MODULE_1__);
955
+ /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71017);
956
+ /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__);
957
+ /* harmony import */ var tsafe_assert__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(88078);
958
+ /* harmony import */ var tsafe_assert__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(tsafe_assert__WEBPACK_IMPORTED_MODULE_3__);
959
+ /* harmony import */ var _extractArchive__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(29121);
960
+ /* harmony import */ var _fs_existsAsync__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(43765);
961
+ /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(6113);
962
+ /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_6__);
963
+ /* harmony import */ var _fs_rm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(8699);
964
+
965
+
966
+
967
+
968
+
969
+
970
+
971
+
972
+
973
+ async function downloadAndExtractArchive(params) {
974
+ var _a;
975
+ const { urlOrPath, uniqueIdOfOnArchiveFile, onArchiveFile, cacheDirPath, fetchOptions } = params;
976
+ const isUrl = /^https?:\/\//.test(urlOrPath);
977
+ const archiveFileBasename = isUrl
978
+ ? urlOrPath.split("?")[0].split("/").reverse()[0]
979
+ : (0,path__WEBPACK_IMPORTED_MODULE_2__.basename)(urlOrPath);
980
+ const archiveFilePath = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(cacheDirPath, archiveFileBasename);
981
+ download: {
982
+ await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.mkdir)((0,path__WEBPACK_IMPORTED_MODULE_2__.dirname)(archiveFilePath), { recursive: true });
983
+ if (!isUrl) {
984
+ await fs_promises__WEBPACK_IMPORTED_MODULE_1__.copyFile(urlOrPath, archiveFilePath);
985
+ break download;
986
+ }
987
+ const url = urlOrPath;
988
+ if (await (0,_fs_existsAsync__WEBPACK_IMPORTED_MODULE_5__/* .existsAsync */ .o)(archiveFilePath)) {
989
+ const isDownloaded = await SuccessTracker.getIsDownloaded({
990
+ cacheDirPath,
991
+ archiveFileBasename
992
+ });
993
+ if (isDownloaded) {
994
+ break download;
995
+ }
996
+ await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.unlink)(archiveFilePath);
997
+ await SuccessTracker.removeFromDownloaded({
998
+ cacheDirPath,
999
+ archiveFileBasename
1000
+ });
1001
+ }
1002
+ const response = await make_fetch_happen__WEBPACK_IMPORTED_MODULE_0___default()(url, fetchOptions);
1003
+ (_a = response.body) === null || _a === void 0 ? void 0 : _a.setMaxListeners(Number.MAX_VALUE);
1004
+ (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_3__.assert)(typeof response.body !== "undefined" && response.body != null);
1005
+ await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.writeFile)(archiveFilePath, response.body);
1006
+ await SuccessTracker.markAsDownloaded({
1007
+ cacheDirPath,
1008
+ archiveFileBasename
1009
+ });
1010
+ }
1011
+ const extractDirBasename = `${archiveFileBasename.replace(/\.([^.]+)$/, (...[, ext]) => `_${ext}`)}_${uniqueIdOfOnArchiveFile}_${crypto__WEBPACK_IMPORTED_MODULE_6__.createHash("sha256")
1012
+ .update(onArchiveFile.toString())
1013
+ .digest("hex")
1014
+ .substring(0, 5)}`;
1015
+ await Promise.all((await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.readdir)(cacheDirPath))
1016
+ .filter((() => {
1017
+ const prefix = extractDirBasename
1018
+ .split("_")
1019
+ .reverse()
1020
+ .slice(1)
1021
+ .reverse()
1022
+ .join("_");
1023
+ return basename => basename !== extractDirBasename && basename.startsWith(prefix);
1024
+ })())
1025
+ .map(async (extractDirBasename) => {
1026
+ await (0,_fs_rm__WEBPACK_IMPORTED_MODULE_7__.rm)((0,path__WEBPACK_IMPORTED_MODULE_2__.join)(cacheDirPath, extractDirBasename), {
1027
+ recursive: true
1028
+ });
1029
+ await SuccessTracker.removeFromExtracted({
1030
+ cacheDirPath,
1031
+ extractDirBasename
1032
+ });
1033
+ }));
1034
+ const extractedDirPath = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(cacheDirPath, extractDirBasename);
1035
+ extract_and_transform: {
1036
+ if (await (0,_fs_existsAsync__WEBPACK_IMPORTED_MODULE_5__/* .existsAsync */ .o)(extractedDirPath)) {
1037
+ const isExtracted = await SuccessTracker.getIsExtracted({
1038
+ cacheDirPath,
1039
+ extractDirBasename
1040
+ });
1041
+ if (isExtracted) {
1042
+ break extract_and_transform;
1043
+ }
1044
+ await (0,_fs_rm__WEBPACK_IMPORTED_MODULE_7__.rm)(extractedDirPath, { recursive: true });
1045
+ await SuccessTracker.removeFromExtracted({
1046
+ cacheDirPath,
1047
+ extractDirBasename
1048
+ });
1049
+ }
1050
+ await (0,_extractArchive__WEBPACK_IMPORTED_MODULE_4__/* .extractArchive */ .N)({
1051
+ archiveFilePath,
1052
+ onArchiveFile: async ({ relativeFilePathInArchive, readFile, writeFile }) => onArchiveFile({
1053
+ fileRelativePath: relativeFilePathInArchive,
1054
+ readFile,
1055
+ writeFile: ({ fileRelativePath, modifiedData }) => writeFile({
1056
+ filePath: (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(extractedDirPath, fileRelativePath),
1057
+ modifiedData
1058
+ })
1059
+ })
1060
+ });
1061
+ await SuccessTracker.markAsExtracted({
1062
+ cacheDirPath,
1063
+ extractDirBasename
1064
+ });
1065
+ }
1066
+ return { extractedDirPath, archiveFilePath };
1067
+ }
1068
+ var SuccessTracker;
1069
+ (function (SuccessTracker) {
1070
+ async function read(params) {
1071
+ const { cacheDirPath } = params;
1072
+ const filePath = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(cacheDirPath, "downloadAndExtractArchive.json");
1073
+ if (!(await (0,_fs_existsAsync__WEBPACK_IMPORTED_MODULE_5__/* .existsAsync */ .o)(filePath))) {
1074
+ return { archiveFileBasenames: [], extractDirBasenames: [] };
1075
+ }
1076
+ return JSON.parse((await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.readFile)(filePath)).toString("utf8"));
1077
+ }
1078
+ async function write(params) {
1079
+ const { cacheDirPath, successTracker } = params;
1080
+ const filePath = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(cacheDirPath, "downloadAndExtractArchive.json");
1081
+ {
1082
+ const dirPath = (0,path__WEBPACK_IMPORTED_MODULE_2__.dirname)(filePath);
1083
+ if (!(await (0,_fs_existsAsync__WEBPACK_IMPORTED_MODULE_5__/* .existsAsync */ .o)(dirPath))) {
1084
+ await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.mkdir)(dirPath, { recursive: true });
1085
+ }
1086
+ }
1087
+ await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.writeFile)(filePath, JSON.stringify(successTracker));
1088
+ }
1089
+ async function markAsDownloaded(params) {
1090
+ const { cacheDirPath, archiveFileBasename } = params;
1091
+ const successTracker = await read({ cacheDirPath });
1092
+ successTracker.archiveFileBasenames.push(archiveFileBasename);
1093
+ await write({ cacheDirPath, successTracker });
1094
+ }
1095
+ SuccessTracker.markAsDownloaded = markAsDownloaded;
1096
+ async function getIsDownloaded(params) {
1097
+ const { cacheDirPath, archiveFileBasename } = params;
1098
+ const successTracker = await read({ cacheDirPath });
1099
+ return successTracker.archiveFileBasenames.includes(archiveFileBasename);
1100
+ }
1101
+ SuccessTracker.getIsDownloaded = getIsDownloaded;
1102
+ async function removeFromDownloaded(params) {
1103
+ const { cacheDirPath, archiveFileBasename } = params;
1104
+ const successTracker = await read({ cacheDirPath });
1105
+ successTracker.archiveFileBasenames = successTracker.archiveFileBasenames.filter(basename => basename !== archiveFileBasename);
1106
+ await write({ cacheDirPath, successTracker });
1107
+ }
1108
+ SuccessTracker.removeFromDownloaded = removeFromDownloaded;
1109
+ async function markAsExtracted(params) {
1110
+ const { cacheDirPath, extractDirBasename } = params;
1111
+ const successTracker = await read({ cacheDirPath });
1112
+ successTracker.extractDirBasenames.push(extractDirBasename);
1113
+ await write({ cacheDirPath, successTracker });
1114
+ }
1115
+ SuccessTracker.markAsExtracted = markAsExtracted;
1116
+ async function getIsExtracted(params) {
1117
+ const { cacheDirPath, extractDirBasename } = params;
1118
+ const successTracker = await read({ cacheDirPath });
1119
+ return successTracker.extractDirBasenames.includes(extractDirBasename);
1120
+ }
1121
+ SuccessTracker.getIsExtracted = getIsExtracted;
1122
+ async function removeFromExtracted(params) {
1123
+ const { cacheDirPath, extractDirBasename } = params;
1124
+ const successTracker = await read({ cacheDirPath });
1125
+ successTracker.extractDirBasenames = successTracker.extractDirBasenames.filter(basename => basename !== extractDirBasename);
1126
+ await write({ cacheDirPath, successTracker });
1127
+ }
1128
+ SuccessTracker.removeFromExtracted = removeFromExtracted;
1129
+ })(SuccessTracker || (SuccessTracker = {}));
1130
+ //# sourceMappingURL=downloadAndExtractArchive.js.map
1131
+
1132
+ /***/ }),
1133
+
914
1134
  /***/ 29121:
915
1135
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
916
1136
 
package/bin/622.index.js CHANGED
@@ -25,7 +25,7 @@ async function downloadKeycloakDefaultTheme(params) {
25
25
  let kcNodeModulesKeepFilePaths = undefined;
26
26
  let kcNodeModulesKeepFilePaths_lastAccountV1 = undefined;
27
27
  const { extractedDirPath } = await (0,_tools_downloadAndExtractArchive__WEBPACK_IMPORTED_MODULE_3__/* .downloadAndExtractArchive */ .I)({
28
- url: `https://repo1.maven.org/maven2/org/keycloak/keycloak-themes/${keycloakVersion}/keycloak-themes-${keycloakVersion}.jar`,
28
+ urlOrPath: `https://repo1.maven.org/maven2/org/keycloak/keycloak-themes/${keycloakVersion}/keycloak-themes-${keycloakVersion}.jar`,
29
29
  cacheDirPath: buildContext.cacheDirPath,
30
30
  fetchOptions: buildContext.fetchOptions,
31
31
  uniqueIdOfOnArchiveFile: "downloadKeycloakDefaultTheme",
@@ -262,12 +262,22 @@ var SemVer;
262
262
 
263
263
 
264
264
 
265
+
265
266
  async function downloadAndExtractArchive(params) {
266
267
  var _a;
267
- const { url, uniqueIdOfOnArchiveFile, onArchiveFile, cacheDirPath, fetchOptions } = params;
268
- const archiveFileBasename = url.split("?")[0].split("/").reverse()[0];
268
+ const { urlOrPath, uniqueIdOfOnArchiveFile, onArchiveFile, cacheDirPath, fetchOptions } = params;
269
+ const isUrl = /^https?:\/\//.test(urlOrPath);
270
+ const archiveFileBasename = isUrl
271
+ ? urlOrPath.split("?")[0].split("/").reverse()[0]
272
+ : (0,path__WEBPACK_IMPORTED_MODULE_2__.basename)(urlOrPath);
269
273
  const archiveFilePath = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(cacheDirPath, archiveFileBasename);
270
274
  download: {
275
+ await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.mkdir)((0,path__WEBPACK_IMPORTED_MODULE_2__.dirname)(archiveFilePath), { recursive: true });
276
+ if (!isUrl) {
277
+ await fs_promises__WEBPACK_IMPORTED_MODULE_1__.copyFile(urlOrPath, archiveFilePath);
278
+ break download;
279
+ }
280
+ const url = urlOrPath;
271
281
  if (await (0,_fs_existsAsync__WEBPACK_IMPORTED_MODULE_5__/* .existsAsync */ .o)(archiveFilePath)) {
272
282
  const isDownloaded = await SuccessTracker.getIsDownloaded({
273
283
  cacheDirPath,
@@ -282,7 +292,6 @@ async function downloadAndExtractArchive(params) {
282
292
  archiveFileBasename
283
293
  });
284
294
  }
285
- await (0,fs_promises__WEBPACK_IMPORTED_MODULE_1__.mkdir)((0,path__WEBPACK_IMPORTED_MODULE_2__.dirname)(archiveFilePath), { recursive: true });
286
295
  const response = await make_fetch_happen__WEBPACK_IMPORTED_MODULE_0___default()(url, fetchOptions);
287
296
  (_a = response.body) === null || _a === void 0 ? void 0 : _a.setMaxListeners(Number.MAX_VALUE);
288
297
  (0,tsafe_assert__WEBPACK_IMPORTED_MODULE_3__.assert)(typeof response.body !== "undefined" && response.body != null);
@@ -347,7 +356,7 @@ async function downloadAndExtractArchive(params) {
347
356
  extractDirBasename
348
357
  });
349
358
  }
350
- return { extractedDirPath };
359
+ return { extractedDirPath, archiveFilePath };
351
360
  }
352
361
  var SuccessTracker;
353
362
  (function (SuccessTracker) {
@@ -45,6 +45,22 @@ export type BuildContext = {
45
45
  keycloakVersionRange: KeycloakVersionRange;
46
46
  jarFileBasename: string;
47
47
  }[];
48
+ startKeycloakOptions: {
49
+ dockerImage: {
50
+ reference: string;
51
+ tag: string;
52
+ } | undefined;
53
+ dockerExtraArgs: string[];
54
+ keycloakExtraArgs: string[];
55
+ extensionJars: ({
56
+ type: "path";
57
+ path: string;
58
+ } | {
59
+ type: "url";
60
+ url: string;
61
+ })[];
62
+ realmJsonFilePath: string | undefined;
63
+ };
48
64
  };
49
65
  export type BuildOptions = {
50
66
  themeName?: string | string[];
@@ -59,6 +75,13 @@ export type BuildOptions = {
59
75
  loginThemeResourcesFromKeycloakVersion?: string;
60
76
  keycloakifyBuildDirPath?: string;
61
77
  kcContextExclusionsFtl?: string;
78
+ startKeycloakOptions?: {
79
+ dockerImage?: string;
80
+ dockerExtraArgs?: string[];
81
+ keycloakExtraArgs?: string[];
82
+ extensionJars?: string[];
83
+ realmJsonFilePath?: string;
84
+ };
62
85
  } & BuildOptions.AccountThemeImplAndKeycloakVersionTargets;
63
86
  export declare namespace BuildOptions {
64
87
  type AccountThemeImplAndKeycloakVersionTargets = AccountThemeImplAndKeycloakVersionTargets.MultiPageApp | AccountThemeImplAndKeycloakVersionTargets.SinglePageAppOrNone;