@rockcarver/frodo-lib 2.0.0-54 → 2.0.0-55

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/build.zip CHANGED
Binary file
@@ -18,8 +18,9 @@ exports.getTypedFilename = getTypedFilename;
18
18
  exports.getWorkingDirectory = getWorkingDirectory;
19
19
  exports.isValidUrl = isValidUrl;
20
20
  exports.parseUrl = parseUrl;
21
- exports.readFilesRecursive = readFilesRecursive;
21
+ exports.readFiles = readFiles;
22
22
  exports.saveJsonToFile = saveJsonToFile;
23
+ exports.saveTextToFile = saveTextToFile;
23
24
  exports.saveToFile = saveToFile;
24
25
  exports.substituteEnvParams = substituteEnvParams;
25
26
  exports.titleCase = titleCase;
@@ -87,11 +88,13 @@ var _default = state => {
87
88
  });
88
89
  },
89
90
  saveToFile(type, data, identifier, filename) {
91
+ var includeMeta = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
90
92
  return saveToFile({
91
93
  type,
92
94
  data,
93
95
  identifier,
94
96
  filename,
97
+ includeMeta,
95
98
  state
96
99
  });
97
100
  },
@@ -104,6 +107,13 @@ var _default = state => {
104
107
  state
105
108
  });
106
109
  },
110
+ saveTextToFile(data, filename) {
111
+ return saveTextToFile({
112
+ data,
113
+ filename,
114
+ state
115
+ });
116
+ },
107
117
  appendTextToFile(data, filename) {
108
118
  return appendTextToFile(data, filename);
109
119
  },
@@ -112,9 +122,9 @@ var _default = state => {
112
122
  var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : './';
113
123
  return findFilesByName(fileName, fast, path);
114
124
  },
115
- readFilesRecursive(directory) {
125
+ readFiles(directory) {
116
126
  return _asyncToGenerator(function* () {
117
- return readFilesRecursive(directory);
127
+ return readFiles(directory);
118
128
  })();
119
129
  },
120
130
  substituteEnvParams(input, reader) {
@@ -254,12 +264,10 @@ function saveToFile(_ref5) {
254
264
  data,
255
265
  identifier,
256
266
  filename,
267
+ includeMeta,
257
268
  state
258
269
  } = _ref5;
259
270
  var exportData = {};
260
- exportData['meta'] = getMetadata({
261
- state
262
- });
263
271
  exportData[type] = {};
264
272
  if (Array.isArray(data)) {
265
273
  data.forEach(element => {
@@ -268,13 +276,19 @@ function saveToFile(_ref5) {
268
276
  } else {
269
277
  exportData[type][data[identifier]] = data;
270
278
  }
271
- _fs.default.writeFileSync(filename, (0, _JsonUtils.stringify)(exportData));
279
+ saveJsonToFile({
280
+ data: exportData,
281
+ includeMeta,
282
+ filename,
283
+ state
284
+ });
272
285
  }
273
286
 
274
287
  /**
275
288
  * Save JSON object to file
276
- * @param {any} data data object
289
+ * @param {object} data data object
277
290
  * @param {string} filename file name
291
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
278
292
  * @return {boolean} true if successful, false otherwise
279
293
  */
280
294
  function saveJsonToFile(_ref6) {
@@ -285,12 +299,32 @@ function saveJsonToFile(_ref6) {
285
299
  state
286
300
  } = _ref6;
287
301
  var exportData = data;
288
- if (includeMeta) exportData['meta'] = getMetadata({
302
+ if (includeMeta && !exportData['meta']) exportData['meta'] = getMetadata({
289
303
  state
290
304
  });
305
+ if (!includeMeta && exportData['meta']) delete exportData['meta'];
291
306
  (0, _JsonUtils.deleteDeepByKey)(exportData, '_rev');
307
+ return saveTextToFile({
308
+ data: (0, _JsonUtils.stringify)(exportData),
309
+ filename,
310
+ state
311
+ });
312
+ }
313
+
314
+ /**
315
+ * Save text data to file
316
+ * @param data text data
317
+ * @param filename file name
318
+ * @return true if successful, false otherwise
319
+ */
320
+ function saveTextToFile(_ref7) {
321
+ var {
322
+ data,
323
+ filename,
324
+ state
325
+ } = _ref7;
292
326
  try {
293
- _fs.default.writeFileSync(filename, (0, _JsonUtils.stringify)(exportData));
327
+ _fs.default.writeFileSync(filename, data);
294
328
  return true;
295
329
  } catch (err) {
296
330
  (0, _Console.printMessage)({
@@ -344,28 +378,31 @@ function findFilesByName(fileName) {
344
378
  * @param directory directory to search
345
379
  * @returns list of files
346
380
  */
347
- function readFilesRecursive(_x) {
348
- return _readFilesRecursive.apply(this, arguments);
381
+ function readFiles(_x) {
382
+ return _readFiles.apply(this, arguments);
349
383
  }
350
- function _readFilesRecursive() {
351
- _readFilesRecursive = _asyncToGenerator(function* (directory) {
384
+ function _readFiles() {
385
+ _readFiles = _asyncToGenerator(function* (directory) {
352
386
  var items = yield (0, _promises.readdir)(directory);
353
387
  var filePathsNested = yield Promise.all(items.map( /*#__PURE__*/function () {
354
- var _ref7 = _asyncToGenerator(function* (entity) {
388
+ var _ref8 = _asyncToGenerator(function* (entity) {
355
389
  var path = (0, _path.join)(directory, entity);
356
390
  var isDirectory = (yield (0, _promises.lstat)(path)).isDirectory();
357
391
  if (isDirectory) {
358
- return readFilesRecursive(path);
392
+ return readFiles(path);
359
393
  }
360
- return path;
394
+ return {
395
+ path,
396
+ content: yield (0, _promises.readFile)(path, 'utf8')
397
+ };
361
398
  });
362
399
  return function (_x4) {
363
- return _ref7.apply(this, arguments);
400
+ return _ref8.apply(this, arguments);
364
401
  };
365
402
  }()));
366
403
  return filePathsNested.flat();
367
404
  });
368
- return _readFilesRecursive.apply(this, arguments);
405
+ return _readFiles.apply(this, arguments);
369
406
  }
370
407
  function substituteEnvParams(input, reader) {
371
408
  reader.each((key, value) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ExportImportUtils.js","names":["_fs","_interopRequireDefault","require","_promises","_path","_replaceall","_slugify","_Constants","_Base64Utils","_Console","_JsonUtils","obj","__esModule","default","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","_default","state","getMetadata","titleCase","input","getRealmString","convertBase64TextToArray","b64text","convertBase64UrlTextToArray","b64UTF8Text","convertTextArrayToBase64","textArray","convertTextArrayToBase64Url","validateImport","metadata","getTypedFilename","name","type","suffix","length","getWorkingDirectory","mkdirs","getFilePath","fileName","saveToFile","data","identifier","filename","saveJsonToFile","includeMeta","appendTextToFile","findFilesByName","fast","path","readFilesRecursive","directory","substituteEnvParams","reader","unSubstituteEnvParams","parseUrl","href","isValidUrl","urlString","exports","_ref","origin","getHost","originAmVersion","getAmVersion","exportedBy","getUsername","exportDate","Date","toISOString","exportTool","Constants","FRODO_METADATA_ID","exportToolVersion","getFrodoVersion","str","toString","splitStr","toLowerCase","split","i","charAt","toUpperCase","slice","join","_ref2","realm","getRealm","reduce","result","item","concat","arrayOut","plainText","decode","replace","decodeBase64Url","joinedText","b64encodedScript","encode","encodeBase64Url","slug","slugify","remove","_ref3","wd","getDirectory","fs","existsSync","debugMessage","message","mkdirSync","recursive","_ref4","_ref5","exportData","Array","isArray","forEach","element","writeFileSync","stringify","_ref6","deleteDeepByKey","printMessage","appendFileSync","entries","readdirSync","encoding","withFileTypes","files","filter","entry","isDirectory","file","map","folders","folder","push","_x","_readFilesRecursive","items","readdir","filePathsNested","all","_ref7","entity","lstat","_x4","flat","each","replaceall","m","match","r","hash","host","hostname","pathname","port","protocol","search","username","password","searchParam","query","indexOf","substr","vars","pair","decodeURIComponent","Boolean","URL","exportWithErrorHandling","_x2","_x3","_exportWithErrorHandling","exportFunction","parameters","e"],"sources":["../../src/utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport { lstat, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport { Reader } from 'properties-reader';\nimport replaceall from 'replaceall';\nimport slugify from 'slugify';\n\nimport { ExportMetaData } from '../ops/OpsTypes';\nimport Constants from '../shared/Constants';\nimport { State } from '../shared/State';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from './Base64Utils';\nimport { debugMessage, printMessage } from './Console';\nimport { deleteDeepByKey, stringify } from './JsonUtils';\n\nexport type ExportImport = {\n getMetadata(): ExportMetaData;\n titleCase(input: string): string;\n getRealmString(): string;\n convertBase64TextToArray(b64text: string): any[];\n convertBase64UrlTextToArray(b64UTF8Text: string): any[];\n convertTextArrayToBase64(textArray: string[]): string;\n convertTextArrayToBase64Url(textArray: string[]): any;\n validateImport(metadata: any): boolean;\n getTypedFilename(name: string, type: string, suffix?: string): string;\n getWorkingDirectory(mkdirs?: boolean): string;\n getFilePath(fileName: string, mkdirs?: boolean): string;\n saveToFile(\n type: string,\n data: object,\n identifier: string,\n filename: string\n ): void;\n /**\n * Save JSON object to file\n * @param {Object} data data object\n * @param {String} filename file name\n * @return {boolean} true if successful, false otherwise\n */\n saveJsonToFile(\n data: object,\n filename: string,\n includeMeta?: boolean\n ): boolean;\n /**\n * Append text data to file\n * @param {String} data text data\n * @param {String} filename file name\n */\n appendTextToFile(data: string, filename: string): void;\n /**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\n findFilesByName(fileName: string, fast?: boolean, path?: string): string[];\n /**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\n readFilesRecursive(directory: string): Promise<string[]>;\n\n substituteEnvParams(input: string, reader: Reader): string;\n\n unSubstituteEnvParams(input: string, reader: Reader): string;\n /*\n * Parse a URL into its components and make them easily accessible by name\n *\n * Use in a Scripte Decision Node Script as follows:\n * var referer = parseUrl(requestHeaders.get(\"referer\").get(0));\n * var origin = referer.origin;\n *\n * e.g.: https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/\n * {\n * hash: '#/',\n * host: 'openam-volker-dev.forgeblocks.com',\n * hostname: 'openam-volker-dev.forgeblocks.com',\n * href: 'https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/',\n * origin: 'https://openam-volker-dev.forgeblocks.com',\n * pathname: '/am/XUI/',\n * port: '',\n * protocol: 'https',\n * search: '?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim',\n * username: '',\n * password: '',\n * searchParam: {\n * realm: '/bravo',\n * authIndexType: 'service',\n * authIndexValue: 'InitiateOwnerClaim'\n * }\n * }\n */\n parseUrl(href: string): any;\n /**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\n isValidUrl(urlString: string): boolean;\n};\n\nexport default (state: State): ExportImport => {\n return {\n getMetadata(): ExportMetaData {\n return getMetadata({ state });\n },\n titleCase(input: string) {\n return titleCase(input);\n },\n getRealmString() {\n return getRealmString({ state });\n },\n convertBase64TextToArray(b64text: string) {\n return convertBase64TextToArray(b64text);\n },\n convertBase64UrlTextToArray(b64UTF8Text: string) {\n return convertBase64UrlTextToArray(b64UTF8Text);\n },\n convertTextArrayToBase64(textArray: string[]) {\n return convertTextArrayToBase64(textArray);\n },\n convertTextArrayToBase64Url(textArray: string[]) {\n return convertTextArrayToBase64Url(textArray);\n },\n validateImport(metadata): boolean {\n return validateImport(metadata);\n },\n getTypedFilename(name: string, type: string, suffix = 'json') {\n return getTypedFilename(name, type, suffix);\n },\n getWorkingDirectory(mkdirs = false) {\n return getWorkingDirectory({ mkdirs, state });\n },\n getFilePath(fileName: string, mkdirs = false): string {\n return getFilePath({ fileName, mkdirs, state });\n },\n saveToFile(\n type: string,\n data: object,\n identifier: string,\n filename: string\n ) {\n return saveToFile({\n type,\n data,\n identifier,\n filename,\n state,\n });\n },\n saveJsonToFile(\n data: object,\n filename: string,\n includeMeta = true\n ): boolean {\n return saveJsonToFile({ data, filename, includeMeta, state });\n },\n appendTextToFile(data: string, filename: string) {\n return appendTextToFile(data, filename);\n },\n findFilesByName(fileName: string, fast = true, path = './'): string[] {\n return findFilesByName(fileName, fast, path);\n },\n async readFilesRecursive(directory: string): Promise<string[]> {\n return readFilesRecursive(directory);\n },\n substituteEnvParams(input: string, reader: Reader): string {\n return substituteEnvParams(input, reader);\n },\n unSubstituteEnvParams(input: string, reader: Reader): string {\n return unSubstituteEnvParams(input, reader);\n },\n parseUrl(href: string): any {\n return parseUrl(href);\n },\n isValidUrl(urlString: string): boolean {\n return isValidUrl(urlString);\n },\n };\n};\n\nexport function getMetadata({ state }: { state: State }): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: new Date().toISOString(),\n exportTool: Constants.FRODO_METADATA_ID,\n exportToolVersion: state.getFrodoVersion(),\n };\n return metadata;\n}\n\n/*\n * Output str in title case\n *\n * e.g.: 'ALL UPPERCASE AND all lowercase' = 'All Uppercase And All Lowercase'\n */\nexport function titleCase(input: string) {\n const str = input.toString();\n const splitStr = str.toLowerCase().split(' ');\n for (let i = 0; i < splitStr.length; i += 1) {\n splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].slice(1);\n }\n return splitStr.join(' ');\n}\n\nexport function getRealmString({ state }: { state: State }) {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text: string) {\n let arrayOut = [];\n let plainText = decode(b64text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertBase64UrlTextToArray(b64UTF8Text: string) {\n let arrayOut = [];\n let plainText = decodeBase64Url(b64UTF8Text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertTextArrayToBase64(textArray: string[]) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray: string[]) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encodeBase64Url(joinedText);\n return b64encodedScript;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function validateImport(metadata): boolean {\n return metadata || true;\n}\n\nexport function getTypedFilename(name: string, type: string, suffix = 'json') {\n const slug = slugify(name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n });\n return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory({\n mkdirs = false,\n state,\n}: {\n mkdirs: boolean;\n state: State;\n}) {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (mkdirs && !fs.existsSync(wd)) {\n debugMessage({\n message: `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`,\n state,\n });\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\n/**\n * Get the file path to a file in the working directory. If working directory does not exist, it will return the fileName as the file path.\n * @param fileName The file name\n * @param mkdirs If directories to working directory don't exist, makes the directories if true, and if false does not make the directories. Default: false\n * @return The file path to the file in the working directory\n */\nexport function getFilePath({\n fileName,\n mkdirs = false,\n state,\n}: {\n fileName: string;\n mkdirs: boolean;\n state: State;\n}): string {\n return state.getDirectory()\n ? `${getWorkingDirectory({ mkdirs, state })}/${fileName}`\n : fileName;\n}\n\n/**\n * Save to file\n * @param {any} data data object\n * @param {string} filename file name\n */\nexport function saveToFile({\n type,\n data,\n identifier,\n filename,\n state,\n}: {\n type: string;\n data: object;\n identifier: string;\n filename: string;\n state: State;\n}): void {\n const exportData = {};\n exportData['meta'] = getMetadata({ state });\n exportData[type] = {};\n\n if (Array.isArray(data)) {\n data.forEach((element) => {\n exportData[type][element[identifier]] = element;\n });\n } else {\n exportData[type][data[identifier]] = data;\n }\n fs.writeFileSync(filename, stringify(exportData));\n}\n\n/**\n * Save JSON object to file\n * @param {any} data data object\n * @param {string} filename file name\n * @return {boolean} true if successful, false otherwise\n */\nexport function saveJsonToFile({\n data,\n filename,\n includeMeta = true,\n state,\n}: {\n data: object;\n filename: string;\n includeMeta?: boolean;\n state: State;\n}): boolean {\n const exportData = data;\n if (includeMeta) exportData['meta'] = getMetadata({ state });\n deleteDeepByKey(exportData, '_rev');\n try {\n fs.writeFileSync(filename, stringify(exportData));\n return true;\n } catch (err) {\n printMessage({\n message: `ERROR - can't save ${filename}`,\n type: 'error',\n state,\n });\n return false;\n }\n}\n\n/**\n * Append text data to file\n * @param {string} data text data\n * @param {string} filename file name\n */\nexport function appendTextToFile(data: string, filename: string) {\n fs.appendFileSync(filename, data);\n}\n\n/**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\nexport function findFilesByName(\n fileName: string,\n fast = true,\n path = './'\n): string[] {\n const entries = fs.readdirSync(path, {\n encoding: 'utf8',\n withFileTypes: true,\n });\n\n // Get files within the current directory and add a path key to the file objects\n const files: string[] = entries\n .filter((entry) => !entry.isDirectory())\n .filter((file) => file.name === fileName)\n // .map((file) => ({ ...file, path: path + file.name }));\n .map((file) => path + file.name);\n\n if (fast && files.length > 0) return files;\n\n // search sub-folders\n const folders = entries.filter((entry) => entry.isDirectory());\n for (const folder of folders)\n files.push(...findFilesByName(fileName, fast, `${path}${folder.name}/`));\n\n return files;\n}\n\n/**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\nexport async function readFilesRecursive(directory: string): Promise<string[]> {\n const items = await readdir(directory);\n\n const filePathsNested = await Promise.all(\n items.map(async (entity) => {\n const path = join(directory, entity);\n const isDirectory = (await lstat(path)).isDirectory();\n\n if (isDirectory) {\n return readFilesRecursive(path);\n }\n return path;\n })\n );\n\n return filePathsNested.flat();\n}\n\nexport function substituteEnvParams(input: string, reader: Reader): string {\n reader.each((key, value) => {\n input = replaceall(value, `\\${${key}}`, input);\n });\n return input;\n}\n\nexport function unSubstituteEnvParams(input: string, reader: Reader): string {\n reader.each((key, value) => {\n input = replaceall(`\\${${key}}`, value, input);\n });\n return input;\n}\n\n/*\n * Parse a URL into its components and make them easily accessible by name\n *\n * Use in a Scripte Decision Node Script as follows:\n * var referer = parseUrl(requestHeaders.get(\"referer\").get(0));\n * var origin = referer.origin;\n *\n * e.g.: https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/\n * {\n * hash: '#/',\n * host: 'openam-volker-dev.forgeblocks.com',\n * hostname: 'openam-volker-dev.forgeblocks.com',\n * href: 'https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/',\n * origin: 'https://openam-volker-dev.forgeblocks.com',\n * pathname: '/am/XUI/',\n * port: '',\n * protocol: 'https',\n * search: '?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim',\n * username: '',\n * password: '',\n * searchParam: {\n * realm: '/bravo',\n * authIndexType: 'service',\n * authIndexValue: 'InitiateOwnerClaim'\n * }\n * }\n */\nexport function parseUrl(href: string): any {\n const m = href.match(\n /^(([^:/?#]+):?(?:\\/\\/((?:([^/?#:]*):([^/?#:]*)@)?([^/?#:]*)(?::([^/?#:]*))?)))?([^?#]*)(\\?[^#]*)?(#.*)?$/\n ),\n r = {\n hash: m[10] || '',\n host: m[3] || '',\n hostname: m[6] || '',\n href: m[0] || '',\n origin: m[1] || '',\n pathname: m[8] || (m[1] ? '/' : ''),\n port: m[7] || '',\n protocol: m[2] || '',\n search: m[9] || '',\n username: m[4] || '',\n password: m[5] || '',\n searchParam: {}, // { realm: '/bravo',\n // authIndexType: 'service',\n // authIndexValue: 'InitiateOwnerClaim' }\n };\n if (r.protocol.length == 2) {\n r.protocol = 'file:///' + r.protocol.toUpperCase();\n r.origin = r.protocol + '//' + r.host;\n }\n if (r.search.length > 2) {\n const query = r.search.indexOf('?') === 0 ? r.search.substr(1) : r.search;\n const vars = query.split('&');\n for (let i = 0; i < vars.length; i++) {\n const pair = vars[i].split('=');\n r.searchParam[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n }\n r.href = r.origin + r.pathname + r.search + r.hash;\n return r;\n}\n\n/**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\nexport function isValidUrl(urlString: string): boolean {\n try {\n return Boolean(new URL(urlString));\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Performs an export given a function with its parameters with custom error handling that will just print the error if one is thrown and return null.\n * @param exportFunction The export function.\n * @param parameters The parameters to call the export function with. By default, it is { state }.\n * @returns {Promise<R | null>} Returns the result of the export function, or null if an error is thrown\n */\nexport async function exportWithErrorHandling<P extends { state: State }, R>(\n exportFunction: (params: P) => Promise<R>,\n parameters: P\n): Promise<R | null> {\n try {\n return await exportFunction(parameters);\n } catch (e) {\n printMessage({\n message: `ERROR: ${e.message}`,\n type: 'error',\n state: parameters.state,\n });\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ExportImportUtils.js","names":["_fs","_interopRequireDefault","require","_promises","_path","_replaceall","_slugify","_Constants","_Base64Utils","_Console","_JsonUtils","obj","__esModule","default","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","_default","state","getMetadata","titleCase","input","getRealmString","convertBase64TextToArray","b64text","convertBase64UrlTextToArray","b64UTF8Text","convertTextArrayToBase64","textArray","convertTextArrayToBase64Url","validateImport","metadata","getTypedFilename","name","type","suffix","length","getWorkingDirectory","mkdirs","getFilePath","fileName","saveToFile","data","identifier","filename","includeMeta","saveJsonToFile","saveTextToFile","appendTextToFile","findFilesByName","fast","path","readFiles","directory","substituteEnvParams","reader","unSubstituteEnvParams","parseUrl","href","isValidUrl","urlString","exports","_ref","origin","getHost","originAmVersion","getAmVersion","exportedBy","getUsername","exportDate","Date","toISOString","exportTool","Constants","FRODO_METADATA_ID","exportToolVersion","getFrodoVersion","str","toString","splitStr","toLowerCase","split","i","charAt","toUpperCase","slice","join","_ref2","realm","getRealm","reduce","result","item","concat","arrayOut","plainText","decode","replace","decodeBase64Url","joinedText","b64encodedScript","encode","encodeBase64Url","slug","slugify","remove","_ref3","wd","getDirectory","fs","existsSync","debugMessage","message","mkdirSync","recursive","_ref4","_ref5","exportData","Array","isArray","forEach","element","_ref6","deleteDeepByKey","stringify","_ref7","writeFileSync","printMessage","appendFileSync","entries","readdirSync","encoding","withFileTypes","files","filter","entry","isDirectory","file","map","folders","folder","push","_x","_readFiles","items","readdir","filePathsNested","all","_ref8","entity","lstat","content","readFile","_x4","flat","each","replaceall","m","match","r","hash","host","hostname","pathname","port","protocol","search","username","password","searchParam","query","indexOf","substr","vars","pair","decodeURIComponent","Boolean","URL","exportWithErrorHandling","_x2","_x3","_exportWithErrorHandling","exportFunction","parameters","e"],"sources":["../../src/utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport { lstat, readdir, readFile } from 'fs/promises';\nimport { join } from 'path';\nimport { Reader } from 'properties-reader';\nimport replaceall from 'replaceall';\nimport slugify from 'slugify';\n\nimport { ExportMetaData } from '../ops/OpsTypes';\nimport Constants from '../shared/Constants';\nimport { State } from '../shared/State';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from './Base64Utils';\nimport { debugMessage, printMessage } from './Console';\nimport { deleteDeepByKey, stringify } from './JsonUtils';\n\nexport type ExportImport = {\n getMetadata(): ExportMetaData;\n titleCase(input: string): string;\n getRealmString(): string;\n convertBase64TextToArray(b64text: string): any[];\n convertBase64UrlTextToArray(b64UTF8Text: string): any[];\n convertTextArrayToBase64(textArray: string[]): string;\n convertTextArrayToBase64Url(textArray: string[]): any;\n validateImport(metadata: any): boolean;\n getTypedFilename(name: string, type: string, suffix?: string): string;\n getWorkingDirectory(mkdirs?: boolean): string;\n getFilePath(fileName: string, mkdirs?: boolean): string;\n saveToFile(\n type: string,\n data: object,\n identifier: string,\n filename: string,\n includeMeta?: boolean\n ): void;\n /**\n * Save JSON object to file\n * @param {Object} data data object\n * @param {String} filename file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @return {boolean} true if successful, false otherwise\n */\n saveJsonToFile(\n data: object,\n filename: string,\n includeMeta?: boolean\n ): boolean;\n /**\n * Save text data to file\n * @param data text data\n * @param filename file name\n * @return true if successful, false otherwise\n */\n saveTextToFile(data: string, filename: string): boolean;\n /**\n * Append text data to file\n * @param {String} data text data\n * @param {String} filename file name\n */\n appendTextToFile(data: string, filename: string): void;\n /**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\n findFilesByName(fileName: string, fast?: boolean, path?: string): string[];\n /**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\n readFiles(directory: string): Promise<\n {\n path: string;\n content: string;\n }[]\n >;\n\n substituteEnvParams(input: string, reader: Reader): string;\n\n unSubstituteEnvParams(input: string, reader: Reader): string;\n /*\n * Parse a URL into its components and make them easily accessible by name\n *\n * Use in a Scripte Decision Node Script as follows:\n * var referer = parseUrl(requestHeaders.get(\"referer\").get(0));\n * var origin = referer.origin;\n *\n * e.g.: https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/\n * {\n * hash: '#/',\n * host: 'openam-volker-dev.forgeblocks.com',\n * hostname: 'openam-volker-dev.forgeblocks.com',\n * href: 'https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/',\n * origin: 'https://openam-volker-dev.forgeblocks.com',\n * pathname: '/am/XUI/',\n * port: '',\n * protocol: 'https',\n * search: '?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim',\n * username: '',\n * password: '',\n * searchParam: {\n * realm: '/bravo',\n * authIndexType: 'service',\n * authIndexValue: 'InitiateOwnerClaim'\n * }\n * }\n */\n parseUrl(href: string): any;\n /**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\n isValidUrl(urlString: string): boolean;\n};\n\nexport default (state: State): ExportImport => {\n return {\n getMetadata(): ExportMetaData {\n return getMetadata({ state });\n },\n titleCase(input: string) {\n return titleCase(input);\n },\n getRealmString() {\n return getRealmString({ state });\n },\n convertBase64TextToArray(b64text: string) {\n return convertBase64TextToArray(b64text);\n },\n convertBase64UrlTextToArray(b64UTF8Text: string) {\n return convertBase64UrlTextToArray(b64UTF8Text);\n },\n convertTextArrayToBase64(textArray: string[]) {\n return convertTextArrayToBase64(textArray);\n },\n convertTextArrayToBase64Url(textArray: string[]) {\n return convertTextArrayToBase64Url(textArray);\n },\n validateImport(metadata): boolean {\n return validateImport(metadata);\n },\n getTypedFilename(name: string, type: string, suffix = 'json'): string {\n return getTypedFilename(name, type, suffix);\n },\n getWorkingDirectory(mkdirs = false) {\n return getWorkingDirectory({ mkdirs, state });\n },\n getFilePath(fileName: string, mkdirs = false): string {\n return getFilePath({ fileName, mkdirs, state });\n },\n saveToFile(\n type: string,\n data: object,\n identifier: string,\n filename: string,\n includeMeta = true\n ): void {\n return saveToFile({\n type,\n data,\n identifier,\n filename,\n includeMeta,\n state,\n });\n },\n saveJsonToFile(\n data: object,\n filename: string,\n includeMeta = true\n ): boolean {\n return saveJsonToFile({ data, filename, includeMeta, state });\n },\n saveTextToFile(data: string, filename: string): boolean {\n return saveTextToFile({ data, filename, state });\n },\n appendTextToFile(data: string, filename: string) {\n return appendTextToFile(data, filename);\n },\n findFilesByName(fileName: string, fast = true, path = './'): string[] {\n return findFilesByName(fileName, fast, path);\n },\n async readFiles(directory: string): Promise<\n {\n path: string;\n content: string;\n }[]\n > {\n return readFiles(directory);\n },\n substituteEnvParams(input: string, reader: Reader): string {\n return substituteEnvParams(input, reader);\n },\n unSubstituteEnvParams(input: string, reader: Reader): string {\n return unSubstituteEnvParams(input, reader);\n },\n parseUrl(href: string): any {\n return parseUrl(href);\n },\n isValidUrl(urlString: string): boolean {\n return isValidUrl(urlString);\n },\n };\n};\n\nexport function getMetadata({ state }: { state: State }): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: new Date().toISOString(),\n exportTool: Constants.FRODO_METADATA_ID,\n exportToolVersion: state.getFrodoVersion(),\n };\n return metadata;\n}\n\n/*\n * Output str in title case\n *\n * e.g.: 'ALL UPPERCASE AND all lowercase' = 'All Uppercase And All Lowercase'\n */\nexport function titleCase(input: string) {\n const str = input.toString();\n const splitStr = str.toLowerCase().split(' ');\n for (let i = 0; i < splitStr.length; i += 1) {\n splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].slice(1);\n }\n return splitStr.join(' ');\n}\n\nexport function getRealmString({ state }: { state: State }) {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text: string) {\n let arrayOut = [];\n let plainText = decode(b64text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertBase64UrlTextToArray(b64UTF8Text: string) {\n let arrayOut = [];\n let plainText = decodeBase64Url(b64UTF8Text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertTextArrayToBase64(textArray: string[]) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray: string[]) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encodeBase64Url(joinedText);\n return b64encodedScript;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function validateImport(metadata): boolean {\n return metadata || true;\n}\n\nexport function getTypedFilename(\n name: string,\n type: string,\n suffix = 'json'\n): string {\n const slug = slugify(name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n });\n return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory({\n mkdirs = false,\n state,\n}: {\n mkdirs: boolean;\n state: State;\n}) {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (mkdirs && !fs.existsSync(wd)) {\n debugMessage({\n message: `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`,\n state,\n });\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\n/**\n * Get the file path to a file in the working directory. If working directory does not exist, it will return the fileName as the file path.\n * @param fileName The file name\n * @param mkdirs If directories to working directory don't exist, makes the directories if true, and if false does not make the directories. Default: false\n * @return The file path to the file in the working directory\n */\nexport function getFilePath({\n fileName,\n mkdirs = false,\n state,\n}: {\n fileName: string;\n mkdirs: boolean;\n state: State;\n}): string {\n return state.getDirectory()\n ? `${getWorkingDirectory({ mkdirs, state })}/${fileName}`\n : fileName;\n}\n\n/**\n * Save to file\n * @param {any} data data object\n * @param {string} filename file name\n */\nexport function saveToFile({\n type,\n data,\n identifier,\n filename,\n includeMeta,\n state,\n}: {\n type: string;\n data: object;\n identifier: string;\n filename: string;\n includeMeta: boolean;\n state: State;\n}): void {\n const exportData = {};\n exportData[type] = {};\n\n if (Array.isArray(data)) {\n data.forEach((element) => {\n exportData[type][element[identifier]] = element;\n });\n } else {\n exportData[type][data[identifier]] = data;\n }\n saveJsonToFile({\n data: exportData,\n includeMeta,\n filename,\n state,\n });\n}\n\n/**\n * Save JSON object to file\n * @param {object} data data object\n * @param {string} filename file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @return {boolean} true if successful, false otherwise\n */\nexport function saveJsonToFile({\n data,\n filename,\n includeMeta = true,\n state,\n}: {\n data: object;\n filename: string;\n includeMeta?: boolean;\n state: State;\n}): boolean {\n const exportData = data;\n if (includeMeta && !exportData['meta'])\n exportData['meta'] = getMetadata({ state });\n if (!includeMeta && exportData['meta']) delete exportData['meta'];\n deleteDeepByKey(exportData, '_rev');\n return saveTextToFile({\n data: stringify(exportData),\n filename,\n state,\n });\n}\n\n/**\n * Save text data to file\n * @param data text data\n * @param filename file name\n * @return true if successful, false otherwise\n */\nexport function saveTextToFile({\n data,\n filename,\n state,\n}: {\n data: string;\n filename: string;\n state: State;\n}): boolean {\n try {\n fs.writeFileSync(filename, data);\n return true;\n } catch (err) {\n printMessage({\n message: `ERROR - can't save ${filename}`,\n type: 'error',\n state,\n });\n return false;\n }\n}\n\n/**\n * Append text data to file\n * @param {string} data text data\n * @param {string} filename file name\n */\nexport function appendTextToFile(data: string, filename: string) {\n fs.appendFileSync(filename, data);\n}\n\n/**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\nexport function findFilesByName(\n fileName: string,\n fast = true,\n path = './'\n): string[] {\n const entries = fs.readdirSync(path, {\n encoding: 'utf8',\n withFileTypes: true,\n });\n\n // Get files within the current directory and add a path key to the file objects\n const files: string[] = entries\n .filter((entry) => !entry.isDirectory())\n .filter((file) => file.name === fileName)\n // .map((file) => ({ ...file, path: path + file.name }));\n .map((file) => path + file.name);\n\n if (fast && files.length > 0) return files;\n\n // search sub-folders\n const folders = entries.filter((entry) => entry.isDirectory());\n for (const folder of folders)\n files.push(...findFilesByName(fileName, fast, `${path}${folder.name}/`));\n\n return files;\n}\n\n/**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\nexport async function readFiles(directory: string): Promise<\n {\n path: string;\n content: string;\n }[]\n> {\n const items = await readdir(directory);\n\n const filePathsNested = await Promise.all(\n items.map(async (entity) => {\n const path = join(directory, entity);\n const isDirectory = (await lstat(path)).isDirectory();\n\n if (isDirectory) {\n return readFiles(path);\n }\n return {\n path,\n content: await readFile(path, 'utf8'),\n };\n })\n );\n\n return filePathsNested.flat();\n}\n\nexport function substituteEnvParams(input: string, reader: Reader): string {\n reader.each((key, value) => {\n input = replaceall(value, `\\${${key}}`, input);\n });\n return input;\n}\n\nexport function unSubstituteEnvParams(input: string, reader: Reader): string {\n reader.each((key, value) => {\n input = replaceall(`\\${${key}}`, value, input);\n });\n return input;\n}\n\n/*\n * Parse a URL into its components and make them easily accessible by name\n *\n * Use in a Scripte Decision Node Script as follows:\n * var referer = parseUrl(requestHeaders.get(\"referer\").get(0));\n * var origin = referer.origin;\n *\n * e.g.: https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/\n * {\n * hash: '#/',\n * host: 'openam-volker-dev.forgeblocks.com',\n * hostname: 'openam-volker-dev.forgeblocks.com',\n * href: 'https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/',\n * origin: 'https://openam-volker-dev.forgeblocks.com',\n * pathname: '/am/XUI/',\n * port: '',\n * protocol: 'https',\n * search: '?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim',\n * username: '',\n * password: '',\n * searchParam: {\n * realm: '/bravo',\n * authIndexType: 'service',\n * authIndexValue: 'InitiateOwnerClaim'\n * }\n * }\n */\nexport function parseUrl(href: string): any {\n const m = href.match(\n /^(([^:/?#]+):?(?:\\/\\/((?:([^/?#:]*):([^/?#:]*)@)?([^/?#:]*)(?::([^/?#:]*))?)))?([^?#]*)(\\?[^#]*)?(#.*)?$/\n ),\n r = {\n hash: m[10] || '',\n host: m[3] || '',\n hostname: m[6] || '',\n href: m[0] || '',\n origin: m[1] || '',\n pathname: m[8] || (m[1] ? '/' : ''),\n port: m[7] || '',\n protocol: m[2] || '',\n search: m[9] || '',\n username: m[4] || '',\n password: m[5] || '',\n searchParam: {}, // { realm: '/bravo',\n // authIndexType: 'service',\n // authIndexValue: 'InitiateOwnerClaim' }\n };\n if (r.protocol.length == 2) {\n r.protocol = 'file:///' + r.protocol.toUpperCase();\n r.origin = r.protocol + '//' + r.host;\n }\n if (r.search.length > 2) {\n const query = r.search.indexOf('?') === 0 ? r.search.substr(1) : r.search;\n const vars = query.split('&');\n for (let i = 0; i < vars.length; i++) {\n const pair = vars[i].split('=');\n r.searchParam[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n }\n r.href = r.origin + r.pathname + r.search + r.hash;\n return r;\n}\n\n/**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\nexport function isValidUrl(urlString: string): boolean {\n try {\n return Boolean(new URL(urlString));\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Performs an export given a function with its parameters with custom error handling that will just print the error if one is thrown and return null.\n * @param exportFunction The export function.\n * @param parameters The parameters to call the export function with. By default, it is { state }.\n * @returns {Promise<R | null>} Returns the result of the export function, or null if an error is thrown\n */\nexport async function exportWithErrorHandling<P extends { state: State }, R>(\n exportFunction: (params: P) => Promise<R>,\n parameters: P\n): Promise<R | null> {\n try {\n return await exportFunction(parameters);\n } catch (e) {\n printMessage({\n message: `ERROR: ${e.message}`,\n type: 'error',\n state: parameters.state,\n });\n return null;\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import fs from 'fs';
2
- import { lstat, readdir } from 'fs/promises';
2
+ import { lstat, readdir, readFile } from 'fs/promises';
3
3
  import { join } from 'path';
4
4
  import replaceall from 'replaceall';
5
5
  import slugify from 'slugify';
@@ -53,12 +53,13 @@ export default (state => {
53
53
  state
54
54
  });
55
55
  },
56
- saveToFile(type, data, identifier, filename) {
56
+ saveToFile(type, data, identifier, filename, includeMeta = true) {
57
57
  return saveToFile({
58
58
  type,
59
59
  data,
60
60
  identifier,
61
61
  filename,
62
+ includeMeta,
62
63
  state
63
64
  });
64
65
  },
@@ -70,14 +71,21 @@ export default (state => {
70
71
  state
71
72
  });
72
73
  },
74
+ saveTextToFile(data, filename) {
75
+ return saveTextToFile({
76
+ data,
77
+ filename,
78
+ state
79
+ });
80
+ },
73
81
  appendTextToFile(data, filename) {
74
82
  return appendTextToFile(data, filename);
75
83
  },
76
84
  findFilesByName(fileName, fast = true, path = './') {
77
85
  return findFilesByName(fileName, fast, path);
78
86
  },
79
- async readFilesRecursive(directory) {
80
- return readFilesRecursive(directory);
87
+ async readFiles(directory) {
88
+ return readFiles(directory);
81
89
  },
82
90
  substituteEnvParams(input, reader) {
83
91
  return substituteEnvParams(input, reader);
@@ -209,12 +217,10 @@ export function saveToFile({
209
217
  data,
210
218
  identifier,
211
219
  filename,
220
+ includeMeta,
212
221
  state
213
222
  }) {
214
223
  const exportData = {};
215
- exportData['meta'] = getMetadata({
216
- state
217
- });
218
224
  exportData[type] = {};
219
225
  if (Array.isArray(data)) {
220
226
  data.forEach(element => {
@@ -223,13 +229,19 @@ export function saveToFile({
223
229
  } else {
224
230
  exportData[type][data[identifier]] = data;
225
231
  }
226
- fs.writeFileSync(filename, stringify(exportData));
232
+ saveJsonToFile({
233
+ data: exportData,
234
+ includeMeta,
235
+ filename,
236
+ state
237
+ });
227
238
  }
228
239
 
229
240
  /**
230
241
  * Save JSON object to file
231
- * @param {any} data data object
242
+ * @param {object} data data object
232
243
  * @param {string} filename file name
244
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
233
245
  * @return {boolean} true if successful, false otherwise
234
246
  */
235
247
  export function saveJsonToFile({
@@ -239,12 +251,31 @@ export function saveJsonToFile({
239
251
  state
240
252
  }) {
241
253
  const exportData = data;
242
- if (includeMeta) exportData['meta'] = getMetadata({
254
+ if (includeMeta && !exportData['meta']) exportData['meta'] = getMetadata({
243
255
  state
244
256
  });
257
+ if (!includeMeta && exportData['meta']) delete exportData['meta'];
245
258
  deleteDeepByKey(exportData, '_rev');
259
+ return saveTextToFile({
260
+ data: stringify(exportData),
261
+ filename,
262
+ state
263
+ });
264
+ }
265
+
266
+ /**
267
+ * Save text data to file
268
+ * @param data text data
269
+ * @param filename file name
270
+ * @return true if successful, false otherwise
271
+ */
272
+ export function saveTextToFile({
273
+ data,
274
+ filename,
275
+ state
276
+ }) {
246
277
  try {
247
- fs.writeFileSync(filename, stringify(exportData));
278
+ fs.writeFileSync(filename, data);
248
279
  return true;
249
280
  } catch (err) {
250
281
  printMessage({
@@ -296,15 +327,18 @@ export function findFilesByName(fileName, fast = true, path = './') {
296
327
  * @param directory directory to search
297
328
  * @returns list of files
298
329
  */
299
- export async function readFilesRecursive(directory) {
330
+ export async function readFiles(directory) {
300
331
  const items = await readdir(directory);
301
332
  const filePathsNested = await Promise.all(items.map(async entity => {
302
333
  const path = join(directory, entity);
303
334
  const isDirectory = (await lstat(path)).isDirectory();
304
335
  if (isDirectory) {
305
- return readFilesRecursive(path);
336
+ return readFiles(path);
306
337
  }
307
- return path;
338
+ return {
339
+ path,
340
+ content: await readFile(path, 'utf8')
341
+ };
308
342
  }));
309
343
  return filePathsNested.flat();
310
344
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ExportImportUtils.js","names":["fs","lstat","readdir","join","replaceall","slugify","Constants","decode","decodeBase64Url","encode","encodeBase64Url","debugMessage","printMessage","deleteDeepByKey","stringify","state","getMetadata","titleCase","input","getRealmString","convertBase64TextToArray","b64text","convertBase64UrlTextToArray","b64UTF8Text","convertTextArrayToBase64","textArray","convertTextArrayToBase64Url","validateImport","metadata","getTypedFilename","name","type","suffix","getWorkingDirectory","mkdirs","getFilePath","fileName","saveToFile","data","identifier","filename","saveJsonToFile","includeMeta","appendTextToFile","findFilesByName","fast","path","readFilesRecursive","directory","substituteEnvParams","reader","unSubstituteEnvParams","parseUrl","href","isValidUrl","urlString","origin","getHost","originAmVersion","getAmVersion","exportedBy","getUsername","exportDate","Date","toISOString","exportTool","FRODO_METADATA_ID","exportToolVersion","getFrodoVersion","str","toString","splitStr","toLowerCase","split","i","length","charAt","toUpperCase","slice","realm","getRealm","reduce","result","item","arrayOut","plainText","replace","joinedText","b64encodedScript","slug","remove","wd","getDirectory","existsSync","message","mkdirSync","recursive","exportData","Array","isArray","forEach","element","writeFileSync","err","appendFileSync","entries","readdirSync","encoding","withFileTypes","files","filter","entry","isDirectory","file","map","folders","folder","push","items","filePathsNested","Promise","all","entity","flat","each","key","value","m","match","r","hash","host","hostname","pathname","port","protocol","search","username","password","searchParam","query","indexOf","substr","vars","pair","decodeURIComponent","Boolean","URL","error","exportWithErrorHandling","exportFunction","parameters","e"],"sources":["../../src/utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport { lstat, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport { Reader } from 'properties-reader';\nimport replaceall from 'replaceall';\nimport slugify from 'slugify';\n\nimport { ExportMetaData } from '../ops/OpsTypes';\nimport Constants from '../shared/Constants';\nimport { State } from '../shared/State';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from './Base64Utils';\nimport { debugMessage, printMessage } from './Console';\nimport { deleteDeepByKey, stringify } from './JsonUtils';\n\nexport type ExportImport = {\n getMetadata(): ExportMetaData;\n titleCase(input: string): string;\n getRealmString(): string;\n convertBase64TextToArray(b64text: string): any[];\n convertBase64UrlTextToArray(b64UTF8Text: string): any[];\n convertTextArrayToBase64(textArray: string[]): string;\n convertTextArrayToBase64Url(textArray: string[]): any;\n validateImport(metadata: any): boolean;\n getTypedFilename(name: string, type: string, suffix?: string): string;\n getWorkingDirectory(mkdirs?: boolean): string;\n getFilePath(fileName: string, mkdirs?: boolean): string;\n saveToFile(\n type: string,\n data: object,\n identifier: string,\n filename: string\n ): void;\n /**\n * Save JSON object to file\n * @param {Object} data data object\n * @param {String} filename file name\n * @return {boolean} true if successful, false otherwise\n */\n saveJsonToFile(\n data: object,\n filename: string,\n includeMeta?: boolean\n ): boolean;\n /**\n * Append text data to file\n * @param {String} data text data\n * @param {String} filename file name\n */\n appendTextToFile(data: string, filename: string): void;\n /**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\n findFilesByName(fileName: string, fast?: boolean, path?: string): string[];\n /**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\n readFilesRecursive(directory: string): Promise<string[]>;\n\n substituteEnvParams(input: string, reader: Reader): string;\n\n unSubstituteEnvParams(input: string, reader: Reader): string;\n /*\n * Parse a URL into its components and make them easily accessible by name\n *\n * Use in a Scripte Decision Node Script as follows:\n * var referer = parseUrl(requestHeaders.get(\"referer\").get(0));\n * var origin = referer.origin;\n *\n * e.g.: https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/\n * {\n * hash: '#/',\n * host: 'openam-volker-dev.forgeblocks.com',\n * hostname: 'openam-volker-dev.forgeblocks.com',\n * href: 'https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/',\n * origin: 'https://openam-volker-dev.forgeblocks.com',\n * pathname: '/am/XUI/',\n * port: '',\n * protocol: 'https',\n * search: '?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim',\n * username: '',\n * password: '',\n * searchParam: {\n * realm: '/bravo',\n * authIndexType: 'service',\n * authIndexValue: 'InitiateOwnerClaim'\n * }\n * }\n */\n parseUrl(href: string): any;\n /**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\n isValidUrl(urlString: string): boolean;\n};\n\nexport default (state: State): ExportImport => {\n return {\n getMetadata(): ExportMetaData {\n return getMetadata({ state });\n },\n titleCase(input: string) {\n return titleCase(input);\n },\n getRealmString() {\n return getRealmString({ state });\n },\n convertBase64TextToArray(b64text: string) {\n return convertBase64TextToArray(b64text);\n },\n convertBase64UrlTextToArray(b64UTF8Text: string) {\n return convertBase64UrlTextToArray(b64UTF8Text);\n },\n convertTextArrayToBase64(textArray: string[]) {\n return convertTextArrayToBase64(textArray);\n },\n convertTextArrayToBase64Url(textArray: string[]) {\n return convertTextArrayToBase64Url(textArray);\n },\n validateImport(metadata): boolean {\n return validateImport(metadata);\n },\n getTypedFilename(name: string, type: string, suffix = 'json') {\n return getTypedFilename(name, type, suffix);\n },\n getWorkingDirectory(mkdirs = false) {\n return getWorkingDirectory({ mkdirs, state });\n },\n getFilePath(fileName: string, mkdirs = false): string {\n return getFilePath({ fileName, mkdirs, state });\n },\n saveToFile(\n type: string,\n data: object,\n identifier: string,\n filename: string\n ) {\n return saveToFile({\n type,\n data,\n identifier,\n filename,\n state,\n });\n },\n saveJsonToFile(\n data: object,\n filename: string,\n includeMeta = true\n ): boolean {\n return saveJsonToFile({ data, filename, includeMeta, state });\n },\n appendTextToFile(data: string, filename: string) {\n return appendTextToFile(data, filename);\n },\n findFilesByName(fileName: string, fast = true, path = './'): string[] {\n return findFilesByName(fileName, fast, path);\n },\n async readFilesRecursive(directory: string): Promise<string[]> {\n return readFilesRecursive(directory);\n },\n substituteEnvParams(input: string, reader: Reader): string {\n return substituteEnvParams(input, reader);\n },\n unSubstituteEnvParams(input: string, reader: Reader): string {\n return unSubstituteEnvParams(input, reader);\n },\n parseUrl(href: string): any {\n return parseUrl(href);\n },\n isValidUrl(urlString: string): boolean {\n return isValidUrl(urlString);\n },\n };\n};\n\nexport function getMetadata({ state }: { state: State }): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: new Date().toISOString(),\n exportTool: Constants.FRODO_METADATA_ID,\n exportToolVersion: state.getFrodoVersion(),\n };\n return metadata;\n}\n\n/*\n * Output str in title case\n *\n * e.g.: 'ALL UPPERCASE AND all lowercase' = 'All Uppercase And All Lowercase'\n */\nexport function titleCase(input: string) {\n const str = input.toString();\n const splitStr = str.toLowerCase().split(' ');\n for (let i = 0; i < splitStr.length; i += 1) {\n splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].slice(1);\n }\n return splitStr.join(' ');\n}\n\nexport function getRealmString({ state }: { state: State }) {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text: string) {\n let arrayOut = [];\n let plainText = decode(b64text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertBase64UrlTextToArray(b64UTF8Text: string) {\n let arrayOut = [];\n let plainText = decodeBase64Url(b64UTF8Text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertTextArrayToBase64(textArray: string[]) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray: string[]) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encodeBase64Url(joinedText);\n return b64encodedScript;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function validateImport(metadata): boolean {\n return metadata || true;\n}\n\nexport function getTypedFilename(name: string, type: string, suffix = 'json') {\n const slug = slugify(name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n });\n return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory({\n mkdirs = false,\n state,\n}: {\n mkdirs: boolean;\n state: State;\n}) {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (mkdirs && !fs.existsSync(wd)) {\n debugMessage({\n message: `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`,\n state,\n });\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\n/**\n * Get the file path to a file in the working directory. If working directory does not exist, it will return the fileName as the file path.\n * @param fileName The file name\n * @param mkdirs If directories to working directory don't exist, makes the directories if true, and if false does not make the directories. Default: false\n * @return The file path to the file in the working directory\n */\nexport function getFilePath({\n fileName,\n mkdirs = false,\n state,\n}: {\n fileName: string;\n mkdirs: boolean;\n state: State;\n}): string {\n return state.getDirectory()\n ? `${getWorkingDirectory({ mkdirs, state })}/${fileName}`\n : fileName;\n}\n\n/**\n * Save to file\n * @param {any} data data object\n * @param {string} filename file name\n */\nexport function saveToFile({\n type,\n data,\n identifier,\n filename,\n state,\n}: {\n type: string;\n data: object;\n identifier: string;\n filename: string;\n state: State;\n}): void {\n const exportData = {};\n exportData['meta'] = getMetadata({ state });\n exportData[type] = {};\n\n if (Array.isArray(data)) {\n data.forEach((element) => {\n exportData[type][element[identifier]] = element;\n });\n } else {\n exportData[type][data[identifier]] = data;\n }\n fs.writeFileSync(filename, stringify(exportData));\n}\n\n/**\n * Save JSON object to file\n * @param {any} data data object\n * @param {string} filename file name\n * @return {boolean} true if successful, false otherwise\n */\nexport function saveJsonToFile({\n data,\n filename,\n includeMeta = true,\n state,\n}: {\n data: object;\n filename: string;\n includeMeta?: boolean;\n state: State;\n}): boolean {\n const exportData = data;\n if (includeMeta) exportData['meta'] = getMetadata({ state });\n deleteDeepByKey(exportData, '_rev');\n try {\n fs.writeFileSync(filename, stringify(exportData));\n return true;\n } catch (err) {\n printMessage({\n message: `ERROR - can't save ${filename}`,\n type: 'error',\n state,\n });\n return false;\n }\n}\n\n/**\n * Append text data to file\n * @param {string} data text data\n * @param {string} filename file name\n */\nexport function appendTextToFile(data: string, filename: string) {\n fs.appendFileSync(filename, data);\n}\n\n/**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\nexport function findFilesByName(\n fileName: string,\n fast = true,\n path = './'\n): string[] {\n const entries = fs.readdirSync(path, {\n encoding: 'utf8',\n withFileTypes: true,\n });\n\n // Get files within the current directory and add a path key to the file objects\n const files: string[] = entries\n .filter((entry) => !entry.isDirectory())\n .filter((file) => file.name === fileName)\n // .map((file) => ({ ...file, path: path + file.name }));\n .map((file) => path + file.name);\n\n if (fast && files.length > 0) return files;\n\n // search sub-folders\n const folders = entries.filter((entry) => entry.isDirectory());\n for (const folder of folders)\n files.push(...findFilesByName(fileName, fast, `${path}${folder.name}/`));\n\n return files;\n}\n\n/**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\nexport async function readFilesRecursive(directory: string): Promise<string[]> {\n const items = await readdir(directory);\n\n const filePathsNested = await Promise.all(\n items.map(async (entity) => {\n const path = join(directory, entity);\n const isDirectory = (await lstat(path)).isDirectory();\n\n if (isDirectory) {\n return readFilesRecursive(path);\n }\n return path;\n })\n );\n\n return filePathsNested.flat();\n}\n\nexport function substituteEnvParams(input: string, reader: Reader): string {\n reader.each((key, value) => {\n input = replaceall(value, `\\${${key}}`, input);\n });\n return input;\n}\n\nexport function unSubstituteEnvParams(input: string, reader: Reader): string {\n reader.each((key, value) => {\n input = replaceall(`\\${${key}}`, value, input);\n });\n return input;\n}\n\n/*\n * Parse a URL into its components and make them easily accessible by name\n *\n * Use in a Scripte Decision Node Script as follows:\n * var referer = parseUrl(requestHeaders.get(\"referer\").get(0));\n * var origin = referer.origin;\n *\n * e.g.: https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/\n * {\n * hash: '#/',\n * host: 'openam-volker-dev.forgeblocks.com',\n * hostname: 'openam-volker-dev.forgeblocks.com',\n * href: 'https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/',\n * origin: 'https://openam-volker-dev.forgeblocks.com',\n * pathname: '/am/XUI/',\n * port: '',\n * protocol: 'https',\n * search: '?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim',\n * username: '',\n * password: '',\n * searchParam: {\n * realm: '/bravo',\n * authIndexType: 'service',\n * authIndexValue: 'InitiateOwnerClaim'\n * }\n * }\n */\nexport function parseUrl(href: string): any {\n const m = href.match(\n /^(([^:/?#]+):?(?:\\/\\/((?:([^/?#:]*):([^/?#:]*)@)?([^/?#:]*)(?::([^/?#:]*))?)))?([^?#]*)(\\?[^#]*)?(#.*)?$/\n ),\n r = {\n hash: m[10] || '',\n host: m[3] || '',\n hostname: m[6] || '',\n href: m[0] || '',\n origin: m[1] || '',\n pathname: m[8] || (m[1] ? '/' : ''),\n port: m[7] || '',\n protocol: m[2] || '',\n search: m[9] || '',\n username: m[4] || '',\n password: m[5] || '',\n searchParam: {}, // { realm: '/bravo',\n // authIndexType: 'service',\n // authIndexValue: 'InitiateOwnerClaim' }\n };\n if (r.protocol.length == 2) {\n r.protocol = 'file:///' + r.protocol.toUpperCase();\n r.origin = r.protocol + '//' + r.host;\n }\n if (r.search.length > 2) {\n const query = r.search.indexOf('?') === 0 ? r.search.substr(1) : r.search;\n const vars = query.split('&');\n for (let i = 0; i < vars.length; i++) {\n const pair = vars[i].split('=');\n r.searchParam[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n }\n r.href = r.origin + r.pathname + r.search + r.hash;\n return r;\n}\n\n/**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\nexport function isValidUrl(urlString: string): boolean {\n try {\n return Boolean(new URL(urlString));\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Performs an export given a function with its parameters with custom error handling that will just print the error if one is thrown and return null.\n * @param exportFunction The export function.\n * @param parameters The parameters to call the export function with. By default, it is { state }.\n * @returns {Promise<R | null>} Returns the result of the export function, or null if an error is thrown\n */\nexport async function exportWithErrorHandling<P extends { state: State }, R>(\n exportFunction: (params: P) => Promise<R>,\n parameters: P\n): Promise<R | null> {\n try {\n return await exportFunction(parameters);\n } catch (e) {\n printMessage({\n message: `ERROR: ${e.message}`,\n type: 'error',\n state: parameters.state,\n });\n return null;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ExportImportUtils.js","names":["fs","lstat","readdir","readFile","join","replaceall","slugify","Constants","decode","decodeBase64Url","encode","encodeBase64Url","debugMessage","printMessage","deleteDeepByKey","stringify","state","getMetadata","titleCase","input","getRealmString","convertBase64TextToArray","b64text","convertBase64UrlTextToArray","b64UTF8Text","convertTextArrayToBase64","textArray","convertTextArrayToBase64Url","validateImport","metadata","getTypedFilename","name","type","suffix","getWorkingDirectory","mkdirs","getFilePath","fileName","saveToFile","data","identifier","filename","includeMeta","saveJsonToFile","saveTextToFile","appendTextToFile","findFilesByName","fast","path","readFiles","directory","substituteEnvParams","reader","unSubstituteEnvParams","parseUrl","href","isValidUrl","urlString","origin","getHost","originAmVersion","getAmVersion","exportedBy","getUsername","exportDate","Date","toISOString","exportTool","FRODO_METADATA_ID","exportToolVersion","getFrodoVersion","str","toString","splitStr","toLowerCase","split","i","length","charAt","toUpperCase","slice","realm","getRealm","reduce","result","item","arrayOut","plainText","replace","joinedText","b64encodedScript","slug","remove","wd","getDirectory","existsSync","message","mkdirSync","recursive","exportData","Array","isArray","forEach","element","writeFileSync","err","appendFileSync","entries","readdirSync","encoding","withFileTypes","files","filter","entry","isDirectory","file","map","folders","folder","push","items","filePathsNested","Promise","all","entity","content","flat","each","key","value","m","match","r","hash","host","hostname","pathname","port","protocol","search","username","password","searchParam","query","indexOf","substr","vars","pair","decodeURIComponent","Boolean","URL","error","exportWithErrorHandling","exportFunction","parameters","e"],"sources":["../../src/utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport { lstat, readdir, readFile } from 'fs/promises';\nimport { join } from 'path';\nimport { Reader } from 'properties-reader';\nimport replaceall from 'replaceall';\nimport slugify from 'slugify';\n\nimport { ExportMetaData } from '../ops/OpsTypes';\nimport Constants from '../shared/Constants';\nimport { State } from '../shared/State';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from './Base64Utils';\nimport { debugMessage, printMessage } from './Console';\nimport { deleteDeepByKey, stringify } from './JsonUtils';\n\nexport type ExportImport = {\n getMetadata(): ExportMetaData;\n titleCase(input: string): string;\n getRealmString(): string;\n convertBase64TextToArray(b64text: string): any[];\n convertBase64UrlTextToArray(b64UTF8Text: string): any[];\n convertTextArrayToBase64(textArray: string[]): string;\n convertTextArrayToBase64Url(textArray: string[]): any;\n validateImport(metadata: any): boolean;\n getTypedFilename(name: string, type: string, suffix?: string): string;\n getWorkingDirectory(mkdirs?: boolean): string;\n getFilePath(fileName: string, mkdirs?: boolean): string;\n saveToFile(\n type: string,\n data: object,\n identifier: string,\n filename: string,\n includeMeta?: boolean\n ): void;\n /**\n * Save JSON object to file\n * @param {Object} data data object\n * @param {String} filename file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @return {boolean} true if successful, false otherwise\n */\n saveJsonToFile(\n data: object,\n filename: string,\n includeMeta?: boolean\n ): boolean;\n /**\n * Save text data to file\n * @param data text data\n * @param filename file name\n * @return true if successful, false otherwise\n */\n saveTextToFile(data: string, filename: string): boolean;\n /**\n * Append text data to file\n * @param {String} data text data\n * @param {String} filename file name\n */\n appendTextToFile(data: string, filename: string): void;\n /**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\n findFilesByName(fileName: string, fast?: boolean, path?: string): string[];\n /**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\n readFiles(directory: string): Promise<\n {\n path: string;\n content: string;\n }[]\n >;\n\n substituteEnvParams(input: string, reader: Reader): string;\n\n unSubstituteEnvParams(input: string, reader: Reader): string;\n /*\n * Parse a URL into its components and make them easily accessible by name\n *\n * Use in a Scripte Decision Node Script as follows:\n * var referer = parseUrl(requestHeaders.get(\"referer\").get(0));\n * var origin = referer.origin;\n *\n * e.g.: https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/\n * {\n * hash: '#/',\n * host: 'openam-volker-dev.forgeblocks.com',\n * hostname: 'openam-volker-dev.forgeblocks.com',\n * href: 'https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/',\n * origin: 'https://openam-volker-dev.forgeblocks.com',\n * pathname: '/am/XUI/',\n * port: '',\n * protocol: 'https',\n * search: '?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim',\n * username: '',\n * password: '',\n * searchParam: {\n * realm: '/bravo',\n * authIndexType: 'service',\n * authIndexValue: 'InitiateOwnerClaim'\n * }\n * }\n */\n parseUrl(href: string): any;\n /**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\n isValidUrl(urlString: string): boolean;\n};\n\nexport default (state: State): ExportImport => {\n return {\n getMetadata(): ExportMetaData {\n return getMetadata({ state });\n },\n titleCase(input: string) {\n return titleCase(input);\n },\n getRealmString() {\n return getRealmString({ state });\n },\n convertBase64TextToArray(b64text: string) {\n return convertBase64TextToArray(b64text);\n },\n convertBase64UrlTextToArray(b64UTF8Text: string) {\n return convertBase64UrlTextToArray(b64UTF8Text);\n },\n convertTextArrayToBase64(textArray: string[]) {\n return convertTextArrayToBase64(textArray);\n },\n convertTextArrayToBase64Url(textArray: string[]) {\n return convertTextArrayToBase64Url(textArray);\n },\n validateImport(metadata): boolean {\n return validateImport(metadata);\n },\n getTypedFilename(name: string, type: string, suffix = 'json'): string {\n return getTypedFilename(name, type, suffix);\n },\n getWorkingDirectory(mkdirs = false) {\n return getWorkingDirectory({ mkdirs, state });\n },\n getFilePath(fileName: string, mkdirs = false): string {\n return getFilePath({ fileName, mkdirs, state });\n },\n saveToFile(\n type: string,\n data: object,\n identifier: string,\n filename: string,\n includeMeta = true\n ): void {\n return saveToFile({\n type,\n data,\n identifier,\n filename,\n includeMeta,\n state,\n });\n },\n saveJsonToFile(\n data: object,\n filename: string,\n includeMeta = true\n ): boolean {\n return saveJsonToFile({ data, filename, includeMeta, state });\n },\n saveTextToFile(data: string, filename: string): boolean {\n return saveTextToFile({ data, filename, state });\n },\n appendTextToFile(data: string, filename: string) {\n return appendTextToFile(data, filename);\n },\n findFilesByName(fileName: string, fast = true, path = './'): string[] {\n return findFilesByName(fileName, fast, path);\n },\n async readFiles(directory: string): Promise<\n {\n path: string;\n content: string;\n }[]\n > {\n return readFiles(directory);\n },\n substituteEnvParams(input: string, reader: Reader): string {\n return substituteEnvParams(input, reader);\n },\n unSubstituteEnvParams(input: string, reader: Reader): string {\n return unSubstituteEnvParams(input, reader);\n },\n parseUrl(href: string): any {\n return parseUrl(href);\n },\n isValidUrl(urlString: string): boolean {\n return isValidUrl(urlString);\n },\n };\n};\n\nexport function getMetadata({ state }: { state: State }): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: new Date().toISOString(),\n exportTool: Constants.FRODO_METADATA_ID,\n exportToolVersion: state.getFrodoVersion(),\n };\n return metadata;\n}\n\n/*\n * Output str in title case\n *\n * e.g.: 'ALL UPPERCASE AND all lowercase' = 'All Uppercase And All Lowercase'\n */\nexport function titleCase(input: string) {\n const str = input.toString();\n const splitStr = str.toLowerCase().split(' ');\n for (let i = 0; i < splitStr.length; i += 1) {\n splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].slice(1);\n }\n return splitStr.join(' ');\n}\n\nexport function getRealmString({ state }: { state: State }) {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text: string) {\n let arrayOut = [];\n let plainText = decode(b64text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertBase64UrlTextToArray(b64UTF8Text: string) {\n let arrayOut = [];\n let plainText = decodeBase64Url(b64UTF8Text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertTextArrayToBase64(textArray: string[]) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray: string[]) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encodeBase64Url(joinedText);\n return b64encodedScript;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function validateImport(metadata): boolean {\n return metadata || true;\n}\n\nexport function getTypedFilename(\n name: string,\n type: string,\n suffix = 'json'\n): string {\n const slug = slugify(name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n });\n return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory({\n mkdirs = false,\n state,\n}: {\n mkdirs: boolean;\n state: State;\n}) {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (mkdirs && !fs.existsSync(wd)) {\n debugMessage({\n message: `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`,\n state,\n });\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\n/**\n * Get the file path to a file in the working directory. If working directory does not exist, it will return the fileName as the file path.\n * @param fileName The file name\n * @param mkdirs If directories to working directory don't exist, makes the directories if true, and if false does not make the directories. Default: false\n * @return The file path to the file in the working directory\n */\nexport function getFilePath({\n fileName,\n mkdirs = false,\n state,\n}: {\n fileName: string;\n mkdirs: boolean;\n state: State;\n}): string {\n return state.getDirectory()\n ? `${getWorkingDirectory({ mkdirs, state })}/${fileName}`\n : fileName;\n}\n\n/**\n * Save to file\n * @param {any} data data object\n * @param {string} filename file name\n */\nexport function saveToFile({\n type,\n data,\n identifier,\n filename,\n includeMeta,\n state,\n}: {\n type: string;\n data: object;\n identifier: string;\n filename: string;\n includeMeta: boolean;\n state: State;\n}): void {\n const exportData = {};\n exportData[type] = {};\n\n if (Array.isArray(data)) {\n data.forEach((element) => {\n exportData[type][element[identifier]] = element;\n });\n } else {\n exportData[type][data[identifier]] = data;\n }\n saveJsonToFile({\n data: exportData,\n includeMeta,\n filename,\n state,\n });\n}\n\n/**\n * Save JSON object to file\n * @param {object} data data object\n * @param {string} filename file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @return {boolean} true if successful, false otherwise\n */\nexport function saveJsonToFile({\n data,\n filename,\n includeMeta = true,\n state,\n}: {\n data: object;\n filename: string;\n includeMeta?: boolean;\n state: State;\n}): boolean {\n const exportData = data;\n if (includeMeta && !exportData['meta'])\n exportData['meta'] = getMetadata({ state });\n if (!includeMeta && exportData['meta']) delete exportData['meta'];\n deleteDeepByKey(exportData, '_rev');\n return saveTextToFile({\n data: stringify(exportData),\n filename,\n state,\n });\n}\n\n/**\n * Save text data to file\n * @param data text data\n * @param filename file name\n * @return true if successful, false otherwise\n */\nexport function saveTextToFile({\n data,\n filename,\n state,\n}: {\n data: string;\n filename: string;\n state: State;\n}): boolean {\n try {\n fs.writeFileSync(filename, data);\n return true;\n } catch (err) {\n printMessage({\n message: `ERROR - can't save ${filename}`,\n type: 'error',\n state,\n });\n return false;\n }\n}\n\n/**\n * Append text data to file\n * @param {string} data text data\n * @param {string} filename file name\n */\nexport function appendTextToFile(data: string, filename: string) {\n fs.appendFileSync(filename, data);\n}\n\n/**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\nexport function findFilesByName(\n fileName: string,\n fast = true,\n path = './'\n): string[] {\n const entries = fs.readdirSync(path, {\n encoding: 'utf8',\n withFileTypes: true,\n });\n\n // Get files within the current directory and add a path key to the file objects\n const files: string[] = entries\n .filter((entry) => !entry.isDirectory())\n .filter((file) => file.name === fileName)\n // .map((file) => ({ ...file, path: path + file.name }));\n .map((file) => path + file.name);\n\n if (fast && files.length > 0) return files;\n\n // search sub-folders\n const folders = entries.filter((entry) => entry.isDirectory());\n for (const folder of folders)\n files.push(...findFilesByName(fileName, fast, `${path}${folder.name}/`));\n\n return files;\n}\n\n/**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\nexport async function readFiles(directory: string): Promise<\n {\n path: string;\n content: string;\n }[]\n> {\n const items = await readdir(directory);\n\n const filePathsNested = await Promise.all(\n items.map(async (entity) => {\n const path = join(directory, entity);\n const isDirectory = (await lstat(path)).isDirectory();\n\n if (isDirectory) {\n return readFiles(path);\n }\n return {\n path,\n content: await readFile(path, 'utf8'),\n };\n })\n );\n\n return filePathsNested.flat();\n}\n\nexport function substituteEnvParams(input: string, reader: Reader): string {\n reader.each((key, value) => {\n input = replaceall(value, `\\${${key}}`, input);\n });\n return input;\n}\n\nexport function unSubstituteEnvParams(input: string, reader: Reader): string {\n reader.each((key, value) => {\n input = replaceall(`\\${${key}}`, value, input);\n });\n return input;\n}\n\n/*\n * Parse a URL into its components and make them easily accessible by name\n *\n * Use in a Scripte Decision Node Script as follows:\n * var referer = parseUrl(requestHeaders.get(\"referer\").get(0));\n * var origin = referer.origin;\n *\n * e.g.: https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/\n * {\n * hash: '#/',\n * host: 'openam-volker-dev.forgeblocks.com',\n * hostname: 'openam-volker-dev.forgeblocks.com',\n * href: 'https://openam-volker-dev.forgeblocks.com/am/XUI/?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim#/',\n * origin: 'https://openam-volker-dev.forgeblocks.com',\n * pathname: '/am/XUI/',\n * port: '',\n * protocol: 'https',\n * search: '?realm=/bravo&authIndexType=service&authIndexValue=InitiateOwnerClaim',\n * username: '',\n * password: '',\n * searchParam: {\n * realm: '/bravo',\n * authIndexType: 'service',\n * authIndexValue: 'InitiateOwnerClaim'\n * }\n * }\n */\nexport function parseUrl(href: string): any {\n const m = href.match(\n /^(([^:/?#]+):?(?:\\/\\/((?:([^/?#:]*):([^/?#:]*)@)?([^/?#:]*)(?::([^/?#:]*))?)))?([^?#]*)(\\?[^#]*)?(#.*)?$/\n ),\n r = {\n hash: m[10] || '',\n host: m[3] || '',\n hostname: m[6] || '',\n href: m[0] || '',\n origin: m[1] || '',\n pathname: m[8] || (m[1] ? '/' : ''),\n port: m[7] || '',\n protocol: m[2] || '',\n search: m[9] || '',\n username: m[4] || '',\n password: m[5] || '',\n searchParam: {}, // { realm: '/bravo',\n // authIndexType: 'service',\n // authIndexValue: 'InitiateOwnerClaim' }\n };\n if (r.protocol.length == 2) {\n r.protocol = 'file:///' + r.protocol.toUpperCase();\n r.origin = r.protocol + '//' + r.host;\n }\n if (r.search.length > 2) {\n const query = r.search.indexOf('?') === 0 ? r.search.substr(1) : r.search;\n const vars = query.split('&');\n for (let i = 0; i < vars.length; i++) {\n const pair = vars[i].split('=');\n r.searchParam[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n }\n r.href = r.origin + r.pathname + r.search + r.hash;\n return r;\n}\n\n/**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\nexport function isValidUrl(urlString: string): boolean {\n try {\n return Boolean(new URL(urlString));\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Performs an export given a function with its parameters with custom error handling that will just print the error if one is thrown and return null.\n * @param exportFunction The export function.\n * @param parameters The parameters to call the export function with. By default, it is { state }.\n * @returns {Promise<R | null>} Returns the result of the export function, or null if an error is thrown\n */\nexport async function exportWithErrorHandling<P extends { state: State }, R>(\n exportFunction: (params: P) => Promise<R>,\n parameters: P\n): Promise<R | null> {\n try {\n return await exportFunction(parameters);\n } catch (e) {\n printMessage({\n message: `ERROR: ${e.message}`,\n type: 'error',\n state: parameters.state,\n });\n return null;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rockcarver/frodo-lib",
3
- "version": "2.0.0-54",
3
+ "version": "2.0.0-55",
4
4
  "type": "commonjs",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -13,14 +13,22 @@ export type ExportImport = {
13
13
  getTypedFilename(name: string, type: string, suffix?: string): string;
14
14
  getWorkingDirectory(mkdirs?: boolean): string;
15
15
  getFilePath(fileName: string, mkdirs?: boolean): string;
16
- saveToFile(type: string, data: object, identifier: string, filename: string): void;
16
+ saveToFile(type: string, data: object, identifier: string, filename: string, includeMeta?: boolean): void;
17
17
  /**
18
18
  * Save JSON object to file
19
19
  * @param {Object} data data object
20
20
  * @param {String} filename file name
21
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
21
22
  * @return {boolean} true if successful, false otherwise
22
23
  */
23
24
  saveJsonToFile(data: object, filename: string, includeMeta?: boolean): boolean;
25
+ /**
26
+ * Save text data to file
27
+ * @param data text data
28
+ * @param filename file name
29
+ * @return true if successful, false otherwise
30
+ */
31
+ saveTextToFile(data: string, filename: string): boolean;
24
32
  /**
25
33
  * Append text data to file
26
34
  * @param {String} data text data
@@ -41,7 +49,10 @@ export type ExportImport = {
41
49
  * @param directory directory to search
42
50
  * @returns list of files
43
51
  */
44
- readFilesRecursive(directory: string): Promise<string[]>;
52
+ readFiles(directory: string): Promise<{
53
+ path: string;
54
+ content: string;
55
+ }[]>;
45
56
  substituteEnvParams(input: string, reader: Reader): string;
46
57
  unSubstituteEnvParams(input: string, reader: Reader): string;
47
58
  parseUrl(href: string): any;
@@ -87,17 +98,19 @@ export declare function getFilePath({ fileName, mkdirs, state, }: {
87
98
  * @param {any} data data object
88
99
  * @param {string} filename file name
89
100
  */
90
- export declare function saveToFile({ type, data, identifier, filename, state, }: {
101
+ export declare function saveToFile({ type, data, identifier, filename, includeMeta, state, }: {
91
102
  type: string;
92
103
  data: object;
93
104
  identifier: string;
94
105
  filename: string;
106
+ includeMeta: boolean;
95
107
  state: State;
96
108
  }): void;
97
109
  /**
98
110
  * Save JSON object to file
99
- * @param {any} data data object
111
+ * @param {object} data data object
100
112
  * @param {string} filename file name
113
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
101
114
  * @return {boolean} true if successful, false otherwise
102
115
  */
103
116
  export declare function saveJsonToFile({ data, filename, includeMeta, state, }: {
@@ -106,6 +119,17 @@ export declare function saveJsonToFile({ data, filename, includeMeta, state, }:
106
119
  includeMeta?: boolean;
107
120
  state: State;
108
121
  }): boolean;
122
+ /**
123
+ * Save text data to file
124
+ * @param data text data
125
+ * @param filename file name
126
+ * @return true if successful, false otherwise
127
+ */
128
+ export declare function saveTextToFile({ data, filename, state, }: {
129
+ data: string;
130
+ filename: string;
131
+ state: State;
132
+ }): boolean;
109
133
  /**
110
134
  * Append text data to file
111
135
  * @param {string} data text data
@@ -126,7 +150,10 @@ export declare function findFilesByName(fileName: string, fast?: boolean, path?:
126
150
  * @param directory directory to search
127
151
  * @returns list of files
128
152
  */
129
- export declare function readFilesRecursive(directory: string): Promise<string[]>;
153
+ export declare function readFiles(directory: string): Promise<{
154
+ path: string;
155
+ content: string;
156
+ }[]>;
130
157
  export declare function substituteEnvParams(input: string, reader: Reader): string;
131
158
  export declare function unSubstituteEnvParams(input: string, reader: Reader): string;
132
159
  export declare function parseUrl(href: string): any;
@@ -1 +1 @@
1
- {"version":3,"file":"ExportImportUtils.d.ts","sourceRoot":"","sources":["../../src/utils/ExportImportUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExportImportUtils.d.ts","sourceRoot":"","sources":["../../src/utils/ExportImportUtils.ts"],"names":[],"mappings":"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"}