keycloakify 11.0.1 → 11.2.0

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/bin/31.index.js CHANGED
@@ -216,9 +216,7 @@ function getBuildContext(params) {
216
216
  })
217
217
  .parse(JSON.parse(external_fs_.readFileSync(packageJsonFilePath).toString("utf8")));
218
218
  if (((_a = parsedPackageJson.dependencies) === null || _a === void 0 ? void 0 : _a.keycloakify) === undefined &&
219
- ((_b = parsedPackageJson.devDependencies) === null || _b === void 0 ? void 0 : _b.keycloakify) === undefined &&
220
- parsedPackageJson.name !== "keycloakify" // NOTE: For local storybook build
221
- ) {
219
+ ((_b = parsedPackageJson.devDependencies) === null || _b === void 0 ? void 0 : _b.keycloakify) === undefined) {
222
220
  break success;
223
221
  }
224
222
  return packageJsonFilePath;
@@ -361,22 +359,34 @@ function getBuildContext(params) {
361
359
  process.exit(-1);
362
360
  }
363
361
  const themeNames = (() => {
364
- if (buildOptions.themeName === undefined) {
365
- return parsedPackageJson.name === undefined
366
- ? ["keycloakify"]
367
- : [
368
- parsedPackageJson.name
369
- .replace(/^@(.*)/, "$1")
370
- .split("/")
371
- .join("-")
372
- ];
373
- }
374
- if (typeof buildOptions.themeName === "string") {
375
- return [buildOptions.themeName];
362
+ const themeNames = (() => {
363
+ if (buildOptions.themeName === undefined) {
364
+ return parsedPackageJson.name === undefined
365
+ ? ["keycloakify"]
366
+ : [
367
+ parsedPackageJson.name
368
+ .replace(/^@(.*)/, "$1")
369
+ .split("/")
370
+ .join("-")
371
+ ];
372
+ }
373
+ if (typeof buildOptions.themeName === "string") {
374
+ return [buildOptions.themeName];
375
+ }
376
+ const [mainThemeName, ...themeVariantNames] = buildOptions.themeName;
377
+ (0,assert.assert)(mainThemeName !== undefined);
378
+ return [mainThemeName, ...themeVariantNames];
379
+ })();
380
+ for (const themeName of themeNames) {
381
+ if (!/^[a-zA-Z0-9_-]+$/.test(themeName)) {
382
+ console.error(source_default().red([
383
+ `Invalid theme name: ${themeName}`,
384
+ `Theme names should only contain letters, numbers, and "_" or "-"`
385
+ ].join(" ")));
386
+ process.exit(-1);
387
+ }
376
388
  }
377
- const [mainThemeName, ...themeVariantNames] = buildOptions.themeName;
378
- (0,assert.assert)(mainThemeName !== undefined);
379
- return [mainThemeName, ...themeVariantNames];
389
+ return themeNames;
380
390
  })();
381
391
  const projectBuildDirPath = (() => {
382
392
  webpack: {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
- exports.id = 499;
3
- exports.ids = [499];
2
+ exports.id = 573;
3
+ exports.ids = [573];
4
4
  exports.modules = {
5
5
 
6
6
  /***/ 73817:
@@ -315,7 +315,7 @@ function recastParseTs(filePath) {
315
315
 
316
316
  /***/ }),
317
317
 
318
- /***/ 70499:
318
+ /***/ 82573:
319
319
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
320
320
 
321
321
  // ESM COMPAT FLAG
@@ -326,15 +326,17 @@ __webpack_require__.d(__webpack_exports__, {
326
326
  "command": () => (/* reexport */ command)
327
327
  });
328
328
 
329
- // EXTERNAL MODULE: ./node_modules/tsafe/assert.js
330
- var assert = __webpack_require__(88078);
331
- // EXTERNAL MODULE: ./dist/bin/tools/transformCodebase.js
332
- var transformCodebase = __webpack_require__(60332);
333
329
  // EXTERNAL MODULE: external "fs"
334
330
  var external_fs_ = __webpack_require__(57147);
335
331
  var external_fs_default = /*#__PURE__*/__webpack_require__.n(external_fs_);
332
+ // EXTERNAL MODULE: ./dist/bin/tools/fs.rmSync.js
333
+ var fs_rmSync = __webpack_require__(89693);
334
+ // EXTERNAL MODULE: ./dist/bin/tools/transformCodebase.js
335
+ var transformCodebase = __webpack_require__(60332);
336
336
  // EXTERNAL MODULE: external "path"
337
337
  var external_path_ = __webpack_require__(71017);
338
+ // EXTERNAL MODULE: ./node_modules/tsafe/assert.js
339
+ var assert = __webpack_require__(88078);
338
340
  // EXTERNAL MODULE: ./dist/bin/shared/constants.js
339
341
  var constants = __webpack_require__(173);
340
342
  ;// CONCATENATED MODULE: ./dist/bin/tools/String.prototype.replaceAll.js
@@ -753,8 +755,6 @@ function readExtraPagesNames(params) {
753
755
  //# sourceMappingURL=readExtraPageNames.js.map
754
756
  // EXTERNAL MODULE: ./dist/bin/keycloakify/generateResources/generateMessageProperties.js
755
757
  var generateMessageProperties = __webpack_require__(73817);
756
- // EXTERNAL MODULE: ./dist/bin/tools/fs.rmSync.js
757
- var fs_rmSync = __webpack_require__(89693);
758
758
  // EXTERNAL MODULE: ./dist/bin/tools/readThisNpmPackageVersion.js
759
759
  var readThisNpmPackageVersion = __webpack_require__(64795);
760
760
  ;// CONCATENATED MODULE: ./dist/bin/shared/metaInfKeycloakThemes.js
@@ -785,7 +785,11 @@ var escapeStringForPropertiesFile = __webpack_require__(27190);
785
785
  // EXTERNAL MODULE: external "child_process"
786
786
  var external_child_process_ = __webpack_require__(32081);
787
787
  var external_child_process_default = /*#__PURE__*/__webpack_require__.n(external_child_process_);
788
- ;// CONCATENATED MODULE: ./dist/bin/keycloakify/generateResources/generateResourcesForMainTheme.js
788
+ // EXTERNAL MODULE: ./node_modules/properties-parser/index.js
789
+ var properties_parser = __webpack_require__(44414);
790
+ var properties_parser_default = /*#__PURE__*/__webpack_require__.n(properties_parser);
791
+ ;// CONCATENATED MODULE: ./dist/bin/keycloakify/generateResources/generateResources.js
792
+
789
793
 
790
794
 
791
795
 
@@ -805,11 +809,15 @@ var external_child_process_default = /*#__PURE__*/__webpack_require__.n(external
805
809
 
806
810
 
807
811
  (0,assert.assert)();
808
- async function generateResourcesForMainTheme(params) {
812
+ async function generateResources(params) {
809
813
  var _a;
810
- const { themeName, resourcesDirPath, buildContext } = params;
814
+ const { resourcesDirPath, buildContext } = params;
815
+ const [themeName] = buildContext.themeNames;
816
+ if (external_fs_default().existsSync(resourcesDirPath)) {
817
+ (0,fs_rmSync/* rmSync */.a)(resourcesDirPath, { recursive: true });
818
+ }
811
819
  const getThemeTypeDirPath = (params) => {
812
- const { themeType } = params;
820
+ const { themeType, themeName } = params;
813
821
  return (0,external_path_.join)(resourcesDirPath, "theme", themeName, themeType);
814
822
  };
815
823
  const writeMessagePropertiesFilesByThemeType = {};
@@ -820,7 +828,7 @@ async function generateResourcesForMainTheme(params) {
820
828
  const isForAccountSpa = themeType === "account" &&
821
829
  ((0,assert.assert)(buildContext.implementedThemeTypes.account.isImplemented),
822
830
  buildContext.implementedThemeTypes.account.type === "Single-Page");
823
- const themeTypeDirPath = getThemeTypeDirPath({ themeType });
831
+ const themeTypeDirPath = getThemeTypeDirPath({ themeName, themeType });
824
832
  apply_replacers_and_move_to_theme_resources: {
825
833
  const destDirPath = (0,external_path_.join)(themeTypeDirPath, "resources", constants/* WELL_KNOWN_DIRECTORY_BASE_NAME.DIST */.Ju.DIST);
826
834
  // NOTE: Prevent accumulation of files in the assets dir, as names are hashed they pile up.
@@ -830,6 +838,7 @@ async function generateResourcesForMainTheme(params) {
830
838
  // NOTE: We prevent doing it twice, it has been done for the login theme.
831
839
  (0,transformCodebase/* transformCodebase */.N)({
832
840
  srcDirPath: (0,external_path_.join)(getThemeTypeDirPath({
841
+ themeName,
833
842
  themeType: "login"
834
843
  }), "resources", constants/* WELL_KNOWN_DIRECTORY_BASE_NAME.DIST */.Ju.DIST),
835
844
  destDirPath
@@ -838,7 +847,7 @@ async function generateResourcesForMainTheme(params) {
838
847
  }
839
848
  {
840
849
  const dirPath = (0,external_path_.join)(buildContext.projectBuildDirPath, constants/* WELL_KNOWN_DIRECTORY_BASE_NAME.KEYCLOAKIFY_DEV_RESOURCES */.Ju.KEYCLOAKIFY_DEV_RESOURCES);
841
- if (external_fs_.existsSync(dirPath)) {
850
+ if (external_fs_default().existsSync(dirPath)) {
842
851
  (0,assert.assert)(buildContext.bundler === "webpack");
843
852
  throw new Error([
844
853
  `Keycloakify build error: The ${constants/* WELL_KNOWN_DIRECTORY_BASE_NAME.KEYCLOAKIFY_DEV_RESOURCES */.Ju.KEYCLOAKIFY_DEV_RESOURCES} directory shouldn't exist in your build directory.`,
@@ -878,7 +887,7 @@ async function generateResourcesForMainTheme(params) {
878
887
  }
879
888
  const { generateFtlFilesCode } = generateFtlFilesCodeFactory({
880
889
  themeName,
881
- indexHtmlCode: external_fs_.readFileSync((0,external_path_.join)(buildContext.projectBuildDirPath, "index.html"))
890
+ indexHtmlCode: external_fs_default().readFileSync((0,external_path_.join)(buildContext.projectBuildDirPath, "index.html"))
882
891
  .toString("utf8"),
883
892
  buildContext,
884
893
  keycloakifyVersion: (0,readThisNpmPackageVersion/* readThisNpmPackageVersion */.K)(),
@@ -905,7 +914,7 @@ async function generateResourcesForMainTheme(params) {
905
914
  }))
906
915
  ].forEach(pageId => {
907
916
  const { ftlCode } = generateFtlFilesCode({ pageId });
908
- external_fs_.writeFileSync((0,external_path_.join)(themeTypeDirPath, pageId), Buffer.from(ftlCode, "utf8"));
917
+ external_fs_default().writeFileSync((0,external_path_.join)(themeTypeDirPath, pageId), Buffer.from(ftlCode, "utf8"));
909
918
  });
910
919
  let languageTags = undefined;
911
920
  i18n_messages_generation: {
@@ -920,10 +929,6 @@ async function generateResourcesForMainTheme(params) {
920
929
  const { writeMessagePropertiesFiles } = wrap;
921
930
  writeMessagePropertiesFilesByThemeType[themeType] =
922
931
  writeMessagePropertiesFiles;
923
- writeMessagePropertiesFiles({
924
- messageDirPath: (0,external_path_.join)(themeTypeDirPath, "messages"),
925
- themeName
926
- });
927
932
  }
928
933
  bring_in_account_v3_i18n_messages: {
929
934
  if (!buildContext.implementedThemeTypes.account.isImplemented) {
@@ -937,14 +942,38 @@ async function generateResourcesForMainTheme(params) {
937
942
  })
938
943
  .toString("utf8")
939
944
  .trim();
940
- const messagesDirPath = (0,external_path_.join)(accountUiDirPath, "messages");
941
- if (!external_fs_.existsSync(messagesDirPath)) {
945
+ const messageDirPath_defaults = (0,external_path_.join)(accountUiDirPath, "messages");
946
+ if (!external_fs_default().existsSync(messageDirPath_defaults)) {
942
947
  throw new Error(`Please update @keycloakify/keycloak-account-ui to 25.0.4-rc.5 or later.`);
943
948
  }
949
+ const messagesDirPath_dest = (0,external_path_.join)(getThemeTypeDirPath({ themeName, themeType: "account" }), "messages");
944
950
  (0,transformCodebase/* transformCodebase */.N)({
945
- srcDirPath: messagesDirPath,
946
- destDirPath: (0,external_path_.join)(getThemeTypeDirPath({ themeType: "account" }), "messages")
951
+ srcDirPath: messageDirPath_defaults,
952
+ destDirPath: messagesDirPath_dest
947
953
  });
954
+ apply_theme_changes: {
955
+ const messagesDirPath_theme = (0,external_path_.join)(buildContext.themeSrcDirPath, "account", "messages");
956
+ if (!external_fs_default().existsSync(messagesDirPath_theme)) {
957
+ break apply_theme_changes;
958
+ }
959
+ external_fs_default().readdirSync(messagesDirPath_theme).forEach(basename => {
960
+ const filePath_src = (0,external_path_.join)(messagesDirPath_theme, basename);
961
+ const filePath_dest = (0,external_path_.join)(messagesDirPath_dest, basename);
962
+ if (!external_fs_default().existsSync(filePath_dest)) {
963
+ external_fs_default().cpSync(filePath_src, filePath_dest);
964
+ }
965
+ const messages_src = properties_parser_default().parse(external_fs_default().readFileSync(filePath_src).toString("utf8"));
966
+ const messages_dest = properties_parser_default().parse(external_fs_default().readFileSync(filePath_dest).toString("utf8"));
967
+ const messages = Object.assign(Object.assign({}, messages_dest), messages_src);
968
+ const editor = properties_parser_default().createEditor();
969
+ Object.entries(messages).forEach(([key, value]) => {
970
+ editor.set(key, value);
971
+ });
972
+ external_fs_default().writeFileSync(filePath_dest, Buffer.from(editor.toString(), "utf8"));
973
+ });
974
+ }
975
+ languageTags = external_fs_default().readdirSync(messagesDirPath_dest)
976
+ .map(basename => basename.replace(/^messages_/, "").replace(/\.properties$/, ""));
948
977
  }
949
978
  keycloak_static_resources: {
950
979
  if (isForAccountSpa) {
@@ -955,7 +984,7 @@ async function generateResourcesForMainTheme(params) {
955
984
  destDirPath: (0,external_path_.join)(themeTypeDirPath, "resources")
956
985
  });
957
986
  }
958
- external_fs_.writeFileSync((0,external_path_.join)(themeTypeDirPath, "theme.properties"), Buffer.from([
987
+ external_fs_default().writeFileSync((0,external_path_.join)(themeTypeDirPath, "theme.properties"), Buffer.from([
959
988
  `parent=${(() => {
960
989
  switch (themeType) {
961
990
  case "account":
@@ -980,7 +1009,7 @@ async function generateResourcesForMainTheme(params) {
980
1009
  const emailThemeSrcDirPath = (0,external_path_.join)(buildContext.themeSrcDirPath, "email");
981
1010
  (0,transformCodebase/* transformCodebase */.N)({
982
1011
  srcDirPath: emailThemeSrcDirPath,
983
- destDirPath: getThemeTypeDirPath({ themeType: "email" })
1012
+ destDirPath: getThemeTypeDirPath({ themeName, themeType: "email" })
984
1013
  });
985
1014
  }
986
1015
  bring_in_account_v1: {
@@ -992,17 +1021,22 @@ async function generateResourcesForMainTheme(params) {
992
1021
  }
993
1022
  (0,transformCodebase/* transformCodebase */.N)({
994
1023
  srcDirPath: (0,external_path_.join)((0,getThisCodebaseRootDirPath/* getThisCodebaseRootDirPath */.e)(), "res", "account-v1"),
995
- destDirPath: (0,external_path_.join)(resourcesDirPath, "theme", "account-v1", "account")
1024
+ destDirPath: getThemeTypeDirPath({
1025
+ themeName: "account-v1",
1026
+ themeType: "account"
1027
+ })
996
1028
  });
997
1029
  }
998
1030
  {
999
1031
  const metaInfKeycloakThemes = { themes: [] };
1000
- metaInfKeycloakThemes.themes.push({
1001
- name: themeName,
1002
- types: (0,objectEntries.objectEntries)(buildContext.implementedThemeTypes)
1003
- .filter(([, { isImplemented }]) => isImplemented)
1004
- .map(([themeType]) => themeType)
1005
- });
1032
+ for (const themeName of buildContext.themeNames) {
1033
+ metaInfKeycloakThemes.themes.push({
1034
+ name: themeName,
1035
+ types: (0,objectEntries.objectEntries)(buildContext.implementedThemeTypes)
1036
+ .filter(([, { isImplemented }]) => isImplemented)
1037
+ .map(([themeType]) => themeType)
1038
+ });
1039
+ }
1006
1040
  if (buildContext.implementedThemeTypes.account.isImplemented) {
1007
1041
  metaInfKeycloakThemes.themes.push({
1008
1042
  name: "account-v1",
@@ -1014,92 +1048,63 @@ async function generateResourcesForMainTheme(params) {
1014
1048
  getNewMetaInfKeycloakTheme: () => metaInfKeycloakThemes
1015
1049
  });
1016
1050
  }
1017
- return {
1018
- writeMessagePropertiesFilesForThemeVariant: ({ getMessageDirPath, themeName }) => {
1019
- (0,objectEntries.objectEntries)(writeMessagePropertiesFilesByThemeType).forEach(([themeType, writeMessagePropertiesFiles]) => {
1020
- if (writeMessagePropertiesFiles === undefined) {
1021
- return;
1051
+ for (const themeVariantName of buildContext.themeNames) {
1052
+ if (themeVariantName === themeName) {
1053
+ continue;
1054
+ }
1055
+ (0,transformCodebase/* transformCodebase */.N)({
1056
+ srcDirPath: (0,external_path_.join)(resourcesDirPath, "theme", themeName),
1057
+ destDirPath: (0,external_path_.join)(resourcesDirPath, "theme", themeVariantName),
1058
+ transformSourceCode: ({ fileRelativePath, sourceCode }) => {
1059
+ if ((0,external_path_.extname)(fileRelativePath) === ".ftl" &&
1060
+ fileRelativePath.split(external_path_.sep).length === 2) {
1061
+ const modifiedSourceCode = Buffer.from(Buffer.from(sourceCode)
1062
+ .toString("utf-8")
1063
+ .replace(`"themeName": "${themeName}"`, `"themeName": "${themeVariantName}"`), "utf8");
1064
+ (0,assert.assert)(Buffer.compare(modifiedSourceCode, sourceCode) !== 0);
1065
+ return { modifiedSourceCode };
1022
1066
  }
1023
- writeMessagePropertiesFiles({
1024
- messageDirPath: getMessageDirPath({ themeType }),
1025
- themeName
1026
- });
1067
+ return { modifiedSourceCode: sourceCode };
1068
+ }
1069
+ });
1070
+ }
1071
+ for (const themeName of buildContext.themeNames) {
1072
+ for (const [themeType, writeMessagePropertiesFiles] of (0,objectEntries.objectEntries)(writeMessagePropertiesFilesByThemeType)) {
1073
+ // NOTE: This is just a quirk of the type system: We can't really differentiate in a record
1074
+ // between the case where the key isn't present and the case where the value is `undefined`.
1075
+ if (writeMessagePropertiesFiles === undefined) {
1076
+ return;
1077
+ }
1078
+ writeMessagePropertiesFiles({
1079
+ messageDirPath: (0,external_path_.join)(getThemeTypeDirPath({ themeName, themeType }), "messages"),
1080
+ themeName
1027
1081
  });
1028
1082
  }
1029
- };
1030
- }
1031
- //# sourceMappingURL=generateResourcesForMainTheme.js.map
1032
- ;// CONCATENATED MODULE: ./dist/bin/keycloakify/generateResources/generateResourcesForThemeVariant.js
1033
-
1034
-
1035
-
1036
-
1037
- function generateResourcesForThemeVariant(params) {
1038
- const { resourcesDirPath, themeName, themeVariantName, writeMessagePropertiesFiles } = params;
1039
- const mainThemeDirPath = (0,external_path_.join)(resourcesDirPath, "theme", themeName);
1040
- const themeVariantDirPath = (0,external_path_.join)(mainThemeDirPath, "..", themeVariantName);
1041
- (0,transformCodebase/* transformCodebase */.N)({
1042
- srcDirPath: mainThemeDirPath,
1043
- destDirPath: themeVariantDirPath,
1044
- transformSourceCode: ({ fileRelativePath, sourceCode }) => {
1045
- if ((0,external_path_.extname)(fileRelativePath) === ".ftl" &&
1046
- fileRelativePath.split(external_path_.sep).length === 2) {
1047
- const modifiedSourceCode = Buffer.from(Buffer.from(sourceCode)
1048
- .toString("utf-8")
1049
- .replace(`"themeName": "${themeName}"`, `"themeName": "${themeVariantName}"`), "utf8");
1050
- (0,assert.assert)(Buffer.compare(modifiedSourceCode, sourceCode) !== 0);
1051
- return { modifiedSourceCode };
1052
- }
1053
- return { modifiedSourceCode: sourceCode };
1083
+ }
1084
+ modify_email_theme_per_variant: {
1085
+ if (!buildContext.implementedThemeTypes.email.isImplemented) {
1086
+ break modify_email_theme_per_variant;
1054
1087
  }
1055
- });
1056
- writeMetaInfKeycloakThemes({
1057
- resourcesDirPath,
1058
- getNewMetaInfKeycloakTheme: ({ metaInfKeycloakTheme }) => {
1059
- (0,assert.assert)(metaInfKeycloakTheme !== undefined);
1060
- const newMetaInfKeycloakTheme = metaInfKeycloakTheme;
1061
- newMetaInfKeycloakTheme.themes.push({
1062
- name: themeVariantName,
1063
- types: (() => {
1064
- const theme = newMetaInfKeycloakTheme.themes.find(({ name }) => name === themeName);
1065
- (0,assert.assert)(theme !== undefined);
1066
- return theme.types;
1067
- })()
1088
+ for (const themeName of buildContext.themeNames) {
1089
+ const emailThemeDirPath = getThemeTypeDirPath({
1090
+ themeName,
1091
+ themeType: "email"
1092
+ });
1093
+ (0,transformCodebase/* transformCodebase */.N)({
1094
+ srcDirPath: emailThemeDirPath,
1095
+ destDirPath: emailThemeDirPath,
1096
+ transformSourceCode: ({ filePath, sourceCode }) => {
1097
+ if (!filePath.endsWith(".ftl")) {
1098
+ return { modifiedSourceCode: sourceCode };
1099
+ }
1100
+ return {
1101
+ modifiedSourceCode: Buffer.from(sourceCode
1102
+ .toString("utf8")
1103
+ .replace(/xKeycloakify\.themeName/g, `"${themeName}"`), "utf8")
1104
+ };
1105
+ }
1068
1106
  });
1069
- return newMetaInfKeycloakTheme;
1070
1107
  }
1071
- });
1072
- writeMessagePropertiesFiles({
1073
- getMessageDirPath: ({ themeType }) => (0,external_path_.join)(themeVariantDirPath, themeType, "messages"),
1074
- themeName: themeVariantName
1075
- });
1076
- }
1077
- //# sourceMappingURL=generateResourcesForThemeVariant.js.map
1078
- ;// CONCATENATED MODULE: ./dist/bin/keycloakify/generateResources/generateResources.js
1079
-
1080
-
1081
-
1082
-
1083
-
1084
- (0,assert.assert)();
1085
- async function generateResources(params) {
1086
- const { resourcesDirPath, buildContext } = params;
1087
- const [themeName, ...themeVariantNames] = buildContext.themeNames;
1088
- if (external_fs_default().existsSync(resourcesDirPath)) {
1089
- (0,fs_rmSync/* rmSync */.a)(resourcesDirPath, { recursive: true });
1090
- }
1091
- const { writeMessagePropertiesFilesForThemeVariant } = await generateResourcesForMainTheme({
1092
- resourcesDirPath,
1093
- themeName,
1094
- buildContext
1095
- });
1096
- for (const themeVariantName of themeVariantNames) {
1097
- generateResourcesForThemeVariant({
1098
- resourcesDirPath,
1099
- themeName,
1100
- themeVariantName,
1101
- writeMessagePropertiesFiles: writeMessagePropertiesFilesForThemeVariant
1102
- });
1103
1108
  }
1104
1109
  }
1105
1110
  //# sourceMappingURL=generateResources.js.map