@rockcarver/frodo-lib 0.18.1 → 0.18.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/CHANGELOG.md CHANGED
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.18.2-0] - 2023-01-24
11
+
10
12
  ## [0.18.1] - 2023-01-20
11
13
 
12
14
  ### Changed
@@ -1028,7 +1030,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1028
1030
  - Fixed problem with adding connection profiles
1029
1031
  - Miscellaneous bug fixes
1030
1032
 
1031
- [Unreleased]: https://github.com/rockcarver/frodo-lib/compare/v0.18.1...HEAD
1033
+ [Unreleased]: https://github.com/rockcarver/frodo-lib/compare/v0.18.2-0...HEAD
1034
+
1035
+ [0.18.2-0]: https://github.com/rockcarver/frodo-lib/compare/v0.18.1...v0.18.2-0
1032
1036
 
1033
1037
  [0.18.1]: https://github.com/rockcarver/frodo-lib/compare/v0.18.1-0...v0.18.1
1034
1038
 
@@ -1 +1 @@
1
- {"version":3,"file":"ScriptApi.js","names":["scriptURLTemplate","scriptListURLTemplate","scriptQueryURLTemplate","apiVersion","getApiConfig","path","getCurrentRealmPath","getScripts","urlString","util","format","state","getHost","data","generateAmApi","get","withCredentials","getScriptByName","scriptName","encodeURIComponent","getScript","scriptId","putScript","scriptData","put","deleteScript","delete"],"sources":["api/ScriptApi.ts"],"sourcesContent":["import util from 'util';\nimport { generateAmApi } from './BaseApi';\nimport { getCurrentRealmPath } from './utils/ApiUtils';\nimport * as state from '../shared/State';\n\nconst scriptURLTemplate = '%s/json%s/scripts/%s';\nconst scriptListURLTemplate = '%s/json%s/scripts?_queryFilter=true';\nconst scriptQueryURLTemplate =\n '%s/json%s/scripts?_queryFilter=name+eq+%%22%s%%22';\nconst apiVersion = 'protocol=2.0,resource=1.0';\nconst getApiConfig = () => {\n return {\n path: `/json${getCurrentRealmPath()}/scripts`,\n apiVersion,\n };\n};\n\n/**\n * Get all scripts\n * @returns {Promise} a promise that resolves to an object containing an array of script objects\n */\nexport async function getScripts() {\n const urlString = util.format(\n scriptListURLTemplate,\n state.getHost(),\n getCurrentRealmPath()\n );\n const { data } = await generateAmApi(getApiConfig()).get(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Get script by name\n * @param {String} scriptName script name\n * @returns {Promise} a promise that resolves to an object containing a script object\n */\nexport async function getScriptByName(scriptName) {\n const urlString = util.format(\n scriptQueryURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n encodeURIComponent(scriptName)\n );\n const { data } = await generateAmApi(getApiConfig()).get(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Get script by id\n * @param {String} scriptId script uuid/name\n * @returns {Promise} a promise that resolves to a script object\n */\nexport async function getScript(scriptId) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).get(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Put script\n * @param {string} scriptId script uuid\n * @param {Object} scriptData script object\n * @returns {Promise} a promise that resolves to an object containing a script object\n */\nexport async function putScript(scriptId, scriptData) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).put(\n urlString,\n scriptData,\n {\n withCredentials: true,\n }\n );\n return data;\n}\n\n/**\n * Delete script by id\n * @param {String} scriptId script uuid/name\n * @returns {Promise} a promise that resolves to a script object\n */\nexport async function deleteScript(scriptId) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).delete(urlString, {\n withCredentials: true,\n });\n return data;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScriptApi.js","names":["scriptURLTemplate","scriptListURLTemplate","scriptQueryURLTemplate","apiVersion","getApiConfig","path","getCurrentRealmPath","getScripts","urlString","util","format","state","getHost","data","generateAmApi","get","withCredentials","getScriptByName","scriptName","encodeURIComponent","getScript","scriptId","putScript","scriptData","put","deleteScript","delete"],"sources":["api/ScriptApi.ts"],"sourcesContent":["import util from 'util';\nimport { generateAmApi } from './BaseApi';\nimport { getCurrentRealmPath } from './utils/ApiUtils';\nimport * as state from '../shared/State';\nimport { PagedResult, ScriptSkeleton } from './ApiTypes';\n\nconst scriptURLTemplate = '%s/json%s/scripts/%s';\nconst scriptListURLTemplate = '%s/json%s/scripts?_queryFilter=true';\nconst scriptQueryURLTemplate =\n '%s/json%s/scripts?_queryFilter=name+eq+%%22%s%%22';\nconst apiVersion = 'protocol=2.0,resource=1.0';\nconst getApiConfig = () => {\n return {\n path: `/json${getCurrentRealmPath()}/scripts`,\n apiVersion,\n };\n};\n\n/**\n * Get all scripts\n * @returns {Promise} a promise that resolves to an object containing an array of script objects\n */\nexport async function getScripts(): Promise<PagedResult<ScriptSkeleton>> {\n const urlString = util.format(\n scriptListURLTemplate,\n state.getHost(),\n getCurrentRealmPath()\n );\n const { data } = await generateAmApi(getApiConfig()).get<\n PagedResult<ScriptSkeleton>\n >(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Get script by name\n * @param {String} scriptName script name\n * @returns {Promise} a promise that resolves to an object containing a script object\n */\nexport async function getScriptByName(\n scriptName: string\n): Promise<PagedResult<ScriptSkeleton>> {\n const urlString = util.format(\n scriptQueryURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n encodeURIComponent(scriptName)\n );\n const { data } = await generateAmApi(getApiConfig()).get<\n PagedResult<ScriptSkeleton>\n >(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Get script by id\n * @param {String} scriptId script uuid/name\n * @returns {Promise} a promise that resolves to a script object\n */\nexport async function getScript(scriptId) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).get(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Put script\n * @param {string} scriptId script uuid\n * @param {Object} scriptData script object\n * @returns {Promise} a promise that resolves to an object containing a script object\n */\nexport async function putScript(scriptId, scriptData) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).put(\n urlString,\n scriptData,\n {\n withCredentials: true,\n }\n );\n return data;\n}\n\n/**\n * Delete script by id\n * @param {String} scriptId script uuid/name\n * @returns {Promise} a promise that resolves to a script object\n */\nexport async function deleteScript(scriptId) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).delete(urlString, {\n withCredentials: true,\n });\n return data;\n}\n"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AAAyC;AAAA;AAAA;AAAA;AAAA;AAGzC,IAAMA,iBAAiB,GAAG,sBAAsB;AAChD,IAAMC,qBAAqB,GAAG,qCAAqC;AACnE,IAAMC,sBAAsB,GAC1B,mDAAmD;AACrD,IAAMC,UAAU,GAAG,2BAA2B;AAC9C,IAAMC,YAAY,GAAG,MAAM;EACzB,OAAO;IACLC,IAAI,iBAAU,IAAAC,6BAAmB,GAAE,aAAU;IAC7CH;EACF,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AAHA,SAIsBI,UAAU;EAAA;AAAA;AAchC;AACA;AACA;AACA;AACA;AAJA;EAAA,gCAdO,aAAkE;IACvE,IAAMC,SAAS,GAAGC,aAAI,CAACC,MAAM,CAC3BT,qBAAqB,EACrBU,KAAK,CAACC,OAAO,EAAE,EACf,IAAAN,6BAAmB,GAAE,CACtB;IACD,IAAM;MAAEO;IAAK,CAAC,SAAS,IAAAC,sBAAa,EAACV,YAAY,EAAE,CAAC,CAACW,GAAG,CAEtDP,SAAS,EAAE;MACXQ,eAAe,EAAE;IACnB,CAAC,CAAC;IACF,OAAOH,IAAI;EACb,CAAC;EAAA;AAAA;AAAA,SAOqBI,eAAe;EAAA;AAAA;AAiBrC;AACA;AACA;AACA;AACA;AAJA;EAAA,qCAjBO,WACLC,UAAkB,EACoB;IACtC,IAAMV,SAAS,GAAGC,aAAI,CAACC,MAAM,CAC3BR,sBAAsB,EACtBS,KAAK,CAACC,OAAO,EAAE,EACf,IAAAN,6BAAmB,GAAE,EACrBa,kBAAkB,CAACD,UAAU,CAAC,CAC/B;IACD,IAAM;MAAEL;IAAK,CAAC,SAAS,IAAAC,sBAAa,EAACV,YAAY,EAAE,CAAC,CAACW,GAAG,CAEtDP,SAAS,EAAE;MACXQ,eAAe,EAAE;IACnB,CAAC,CAAC;IACF,OAAOH,IAAI;EACb,CAAC;EAAA;AAAA;AAAA,SAOqBO,SAAS;EAAA;AAAA;AAa/B;AACA;AACA;AACA;AACA;AACA;AALA;EAAA,+BAbO,WAAyBC,QAAQ,EAAE;IACxC,IAAMb,SAAS,GAAGC,aAAI,CAACC,MAAM,CAC3BV,iBAAiB,EACjBW,KAAK,CAACC,OAAO,EAAE,EACf,IAAAN,6BAAmB,GAAE,EACrBe,QAAQ,CACT;IACD,IAAM;MAAER;IAAK,CAAC,SAAS,IAAAC,sBAAa,EAACV,YAAY,EAAE,CAAC,CAACW,GAAG,CAACP,SAAS,EAAE;MAClEQ,eAAe,EAAE;IACnB,CAAC,CAAC;IACF,OAAOH,IAAI;EACb,CAAC;EAAA;AAAA;AAAA,SAQqBS,SAAS;EAAA;AAAA;AAiB/B;AACA;AACA;AACA;AACA;AAJA;EAAA,+BAjBO,WAAyBD,QAAQ,EAAEE,UAAU,EAAE;IACpD,IAAMf,SAAS,GAAGC,aAAI,CAACC,MAAM,CAC3BV,iBAAiB,EACjBW,KAAK,CAACC,OAAO,EAAE,EACf,IAAAN,6BAAmB,GAAE,EACrBe,QAAQ,CACT;IACD,IAAM;MAAER;IAAK,CAAC,SAAS,IAAAC,sBAAa,EAACV,YAAY,EAAE,CAAC,CAACoB,GAAG,CACtDhB,SAAS,EACTe,UAAU,EACV;MACEP,eAAe,EAAE;IACnB,CAAC,CACF;IACD,OAAOH,IAAI;EACb,CAAC;EAAA;AAAA;AAAA,SAOqBY,YAAY;EAAA;AAAA;AAAA;EAAA,kCAA3B,WAA4BJ,QAAQ,EAAE;IAC3C,IAAMb,SAAS,GAAGC,aAAI,CAACC,MAAM,CAC3BV,iBAAiB,EACjBW,KAAK,CAACC,OAAO,EAAE,EACf,IAAAN,6BAAmB,GAAE,EACrBe,QAAQ,CACT;IACD,IAAM;MAAER;IAAK,CAAC,SAAS,IAAAC,sBAAa,EAACV,YAAY,EAAE,CAAC,CAACsB,MAAM,CAAClB,SAAS,EAAE;MACrEQ,eAAe,EAAE;IACnB,CAAC,CAAC;IACF,OAAOH,IAAI;EACb,CAAC;EAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"OpsTypes.js","names":["NodeClassification","JourneyClassification"],"sources":["ops/OpsTypes.ts"],"sourcesContent":["import {\n AgentSkeleton,\n AmServiceSkeleton,\n CircleOfTrustSkeleton,\n EmailTemplateSkeleton,\n NodeSkeleton,\n Saml2ProviderSkeleton,\n ScriptSkeleton,\n SocialIdpSkeleton,\n ThemeSkeleton,\n TreeSkeleton,\n} from '../api/ApiTypes';\n\n/**\n * Tree export options\n */\nexport interface TreeExportOptions {\n /**\n * Where applicable, use string arrays to store multi-line text (e.g. scripts).\n */\n useStringArrays: boolean;\n /**\n * Include any dependencies (scripts, email templates, SAML entity providers and circles of trust, social identity providers, themes).\n */\n deps: boolean;\n}\n\n/**\n * Tree import options\n */\nexport interface TreeImportOptions {\n /**\n * Generate new UUIDs for all nodes during import.\n */\n reUuid: boolean;\n /**\n * Include any dependencies (scripts, email templates, SAML entity providers and circles of trust, social identity providers, themes).\n */\n deps: boolean;\n}\n\nexport interface ExportMetaData {\n origin: string;\n originAmVersion: string;\n exportedBy: string;\n exportDate: string;\n exportTool: string;\n exportToolVersion: string;\n}\n\nexport interface SingleTreeExportInterface {\n meta?: ExportMetaData;\n innerNodes?: Record<string, NodeSkeleton>;\n innernodes?: Record<string, NodeSkeleton>;\n nodes: Record<string, NodeSkeleton>;\n scripts: Record<string, ScriptSkeleton>;\n emailTemplates: Record<string, EmailTemplateSkeleton>;\n socialIdentityProviders: Record<string, SocialIdpSkeleton>;\n themes: ThemeSkeleton[];\n saml2Entities: Record<string, Saml2ProviderSkeleton>;\n circlesOfTrust: Record<string, CircleOfTrustSkeleton>;\n tree: TreeSkeleton;\n}\n\nexport interface MultiTreeExportInterface {\n meta?: ExportMetaData;\n trees: Record<string, SingleTreeExportInterface>;\n}\n\nexport interface AgentExportInterface {\n meta?: Record<string, ExportMetaData>;\n agents: Record<string, AgentSkeleton>;\n}\n\nexport interface Saml2ExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n saml: {\n hosted: Record<string, Saml2ProviderSkeleton>;\n remote: Record<string, Saml2ProviderSkeleton>;\n metadata: Record<string, string[]>;\n };\n}\n\nexport interface ServiceExportInterface {\n meta?: Record<string, ExportMetaData>;\n service: Record<string, AmServiceSkeleton>;\n}\n\nexport interface TreeDependencyMapInterface {\n [k: string]: TreeDependencyMapInterface[];\n}\n\nexport interface TreeExportResolverInterface {\n (treeId: string): Promise<SingleTreeExportInterface>;\n}\n\nexport enum NodeClassification {\n STANDARD = 'standard',\n CUSTOM = 'custom',\n CLOUD = 'cloud',\n PREMIUM = 'premium',\n}\n\nexport enum JourneyClassification {\n STANDARD = 'standard',\n CUSTOM = 'custom',\n CLOUD = 'cloud',\n PREMIUM = 'premium',\n}\n\nexport interface MultiOpStatusInterface {\n total: number;\n successes: number;\n warnings: number;\n failures: number;\n message?: string;\n}\n"],"mappings":";;;;;;AAaA;AACA;AACA;AAYA;AACA;AACA;AAFA,IAsEYA,kBAAkB;AAAA;AAAA,WAAlBA,kBAAkB;EAAlBA,kBAAkB;EAAlBA,kBAAkB;EAAlBA,kBAAkB;EAAlBA,kBAAkB;AAAA,GAAlBA,kBAAkB,kCAAlBA,kBAAkB;AAAA,IAOlBC,qBAAqB;AAAA;AAAA,WAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;AAAA,GAArBA,qBAAqB,qCAArBA,qBAAqB"}
1
+ {"version":3,"file":"OpsTypes.js","names":["NodeClassification","JourneyClassification"],"sources":["ops/OpsTypes.ts"],"sourcesContent":["import {\n AgentSkeleton,\n AmServiceSkeleton,\n CircleOfTrustSkeleton,\n EmailTemplateSkeleton,\n NodeSkeleton,\n Saml2ProviderSkeleton,\n ScriptSkeleton,\n SocialIdpSkeleton,\n ThemeSkeleton,\n TreeSkeleton,\n} from '../api/ApiTypes';\n\n/**\n * Tree export options\n */\nexport interface TreeExportOptions {\n /**\n * Where applicable, use string arrays to store multi-line text (e.g. scripts).\n */\n useStringArrays: boolean;\n /**\n * Include any dependencies (scripts, email templates, SAML entity providers and circles of trust, social identity providers, themes).\n */\n deps: boolean;\n}\n\n/**\n * Tree import options\n */\nexport interface TreeImportOptions {\n /**\n * Generate new UUIDs for all nodes during import.\n */\n reUuid: boolean;\n /**\n * Include any dependencies (scripts, email templates, SAML entity providers and circles of trust, social identity providers, themes).\n */\n deps: boolean;\n}\n\nexport interface ExportMetaData {\n origin: string;\n originAmVersion: string;\n exportedBy: string;\n exportDate: string;\n exportTool: string;\n exportToolVersion: string;\n}\n\nexport interface SingleTreeExportInterface {\n meta?: ExportMetaData;\n innerNodes?: Record<string, NodeSkeleton>;\n innernodes?: Record<string, NodeSkeleton>;\n nodes: Record<string, NodeSkeleton>;\n scripts: Record<string, ScriptSkeleton>;\n emailTemplates: Record<string, EmailTemplateSkeleton>;\n socialIdentityProviders: Record<string, SocialIdpSkeleton>;\n themes: ThemeSkeleton[];\n saml2Entities: Record<string, Saml2ProviderSkeleton>;\n circlesOfTrust: Record<string, CircleOfTrustSkeleton>;\n tree: TreeSkeleton;\n}\n\nexport interface MultiTreeExportInterface {\n meta?: ExportMetaData;\n trees: Record<string, SingleTreeExportInterface>;\n}\n\nexport interface AgentExportInterface {\n meta?: Record<string, ExportMetaData>;\n agents: Record<string, AgentSkeleton>;\n}\n\nexport interface Saml2ExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n saml: {\n hosted: Record<string, Saml2ProviderSkeleton>;\n remote: Record<string, Saml2ProviderSkeleton>;\n metadata: Record<string, string[]>;\n };\n}\n\nexport interface ServiceExportInterface {\n meta?: Record<string, ExportMetaData>;\n service: Record<string, AmServiceSkeleton>;\n}\n\nexport interface TreeDependencyMapInterface {\n [k: string]: TreeDependencyMapInterface[];\n}\n\nexport interface TreeExportResolverInterface {\n (treeId: string): Promise<SingleTreeExportInterface>;\n}\n\nexport interface ScriptExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n}\n\nexport enum NodeClassification {\n STANDARD = 'standard',\n CUSTOM = 'custom',\n CLOUD = 'cloud',\n PREMIUM = 'premium',\n}\n\nexport enum JourneyClassification {\n STANDARD = 'standard',\n CUSTOM = 'custom',\n CLOUD = 'cloud',\n PREMIUM = 'premium',\n}\n\nexport interface MultiOpStatusInterface {\n total: number;\n successes: number;\n warnings: number;\n failures: number;\n message?: string;\n}\n"],"mappings":";;;;;;AAaA;AACA;AACA;AAYA;AACA;AACA;AAFA,IA2EYA,kBAAkB;AAAA;AAAA,WAAlBA,kBAAkB;EAAlBA,kBAAkB;EAAlBA,kBAAkB;EAAlBA,kBAAkB;EAAlBA,kBAAkB;AAAA,GAAlBA,kBAAkB,kCAAlBA,kBAAkB;AAAA,IAOlBC,qBAAqB;AAAA;AAAA,WAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;AAAA,GAArBA,qBAAqB,qCAArBA,qBAAqB"}
@@ -18,6 +18,7 @@ var _OpsUtils = require("./utils/OpsUtils");
18
18
  var _Console = require("./utils/Console");
19
19
  var _ScriptApi = require("../api/ScriptApi");
20
20
  var _ExportImportUtils = require("./utils/ExportImportUtils");
21
+ var _ValidationUtils = require("./utils/ValidationUtils");
21
22
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
22
23
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
23
24
  /**
@@ -209,31 +210,37 @@ function importScripts(_x8, _x9) {
209
210
  function _importScripts() {
210
211
  _importScripts = _asyncToGenerator(function* (name, importData) {
211
212
  var reUuid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
213
+ var shouldValidateScript = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
212
214
  var outcome = true;
213
215
  (0, _Console.debugMessage)("ScriptOps.importScriptsFromFile: start");
214
- (0, _Console.createProgressIndicator)(Object.keys(importData.script).length, 'Importing scripts...');
215
216
  for (var existingId of Object.keys(importData.script)) {
217
+ var scriptSkeleton = importData.script[existingId];
216
218
  var newId = existingId;
217
219
  if (reUuid) {
218
220
  newId = (0, _uuid.v4)();
219
- (0, _Console.debugMessage)("ScriptOps.importScriptsFromFile: Re-uuid-ing script ".concat(importData.script[existingId].name, " ").concat(existingId, " => ").concat(newId, "..."));
220
- importData.script[existingId]._id = newId;
221
+ (0, _Console.debugMessage)("ScriptOps.importScriptsFromFile: Re-uuid-ing script ".concat(scriptSkeleton.name, " ").concat(existingId, " => ").concat(newId, "..."));
222
+ scriptSkeleton._id = newId;
221
223
  }
222
224
  if (name) {
223
- (0, _Console.debugMessage)("ScriptOps.importScriptsFromFile: Renaming script ".concat(importData.script[existingId].name, " => ").concat(name, "..."));
224
- importData.script[existingId].name = name;
225
+ (0, _Console.debugMessage)("ScriptOps.importScriptsFromFile: Renaming script ".concat(scriptSkeleton.name, " => ").concat(name, "..."));
226
+ scriptSkeleton.name = name;
227
+ }
228
+ if (shouldValidateScript) {
229
+ if (!(0, _ValidationUtils.validateScriptDecoded)(scriptSkeleton)) {
230
+ outcome = false;
231
+ (0, _Console.printMessage)("Error importing script '".concat(scriptSkeleton.name, "': Script is not valid"), 'error');
232
+ continue;
233
+ }
225
234
  }
226
235
  try {
227
- yield putScript(newId, importData.script[existingId]);
228
- (0, _Console.updateProgressIndicator)("Imported ".concat(importData.script[existingId].name));
236
+ yield putScript(newId, scriptSkeleton);
229
237
  } catch (error) {
230
238
  outcome = false;
231
- (0, _Console.printMessage)("Error importing script '".concat(importData.script[existingId].name, "': ").concat(error.message), 'error');
239
+ (0, _Console.printMessage)("Error importing script '".concat(scriptSkeleton.name, "': ").concat(error.message), 'error');
232
240
  (0, _Console.debugMessage)(error);
233
241
  }
234
242
  if (name) break;
235
243
  }
236
- (0, _Console.stopProgressIndicator)('Done');
237
244
  (0, _Console.debugMessage)("ScriptOps.importScriptsFromFile: end");
238
245
  return outcome;
239
246
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ScriptOps.js","names":["createScriptExportTemplate","meta","getMetadata","script","getScripts","result","_getScripts","getScript","scriptId","response","_getScript","getScriptByName","name","_getScriptByName","length","Error","putScript","scriptData","Array","isArray","convertTextArrayToBase64","_putScript","error","status","printMessage","newName","applyNameCollisionPolicy","deleteScript","_deleteScript","exportScript","debugMessage","convertBase64TextToArray","exportData","_id","exportScriptByName","exportScripts","scriptList","createProgressIndicator","updateProgressIndicator","stopProgressIndicator","importScripts","importData","reUuid","outcome","Object","keys","existingId","newId","uuidv4","message"],"sources":["ops/ScriptOps.ts"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport { applyNameCollisionPolicy } from './utils/OpsUtils';\nimport {\n createProgressIndicator,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from './utils/Console';\nimport {\n getScript as _getScript,\n getScriptByName as _getScriptByName,\n getScripts as _getScripts,\n putScript as _putScript,\n deleteScript as _deleteScript,\n} from '../api/ScriptApi';\nimport {\n convertBase64TextToArray,\n convertTextArrayToBase64,\n getMetadata,\n} from './utils/ExportImportUtils';\nimport { ScriptSkeleton } from '../api/ApiTypes';\nimport { ExportMetaData } from '../ops/OpsTypes';\n\nexport interface ScriptExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n}\n\n/**\n * Create an empty idp export template\n * @returns {ScriptExportInterface} an empty idp export template\n */\nexport function createScriptExportTemplate(): ScriptExportInterface {\n return {\n meta: getMetadata(),\n script: {},\n } as ScriptExportInterface;\n}\n\n/**\n * Get all scripts\n * @returns {Promise<ScriptSkeleton[]>} a promise that resolves to an array of script objects\n */\nexport async function getScripts(): Promise<ScriptSkeleton[]> {\n const { result } = await _getScripts();\n return result;\n}\n\n/**\n * Get script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function getScript(scriptId: string): Promise<ScriptSkeleton> {\n const response = await _getScript(scriptId);\n return response;\n}\n\n/**\n * Get script by name\n * @param {string} name name of the script\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function getScriptByName(name: string): Promise<ScriptSkeleton> {\n const { result } = await _getScriptByName(name);\n switch (result.length) {\n case 1:\n return result[0];\n case 0:\n throw new Error(`Script '${name}' not found`);\n default:\n throw new Error(`${result.length} scripts '${name}' found`);\n }\n}\n\n/**\n * Create or update script\n * @param {string} scriptId script uuid\n * @param {ScriptSkeleton} scriptData script object\n * @returns {Promise<boolean>} a status object\n */\nexport async function putScript(\n scriptId: string,\n scriptData: ScriptSkeleton\n): Promise<boolean> {\n try {\n if (Array.isArray(scriptData.script)) {\n scriptData.script = convertTextArrayToBase64(scriptData.script);\n }\n const result = await _putScript(scriptId, scriptData);\n return result;\n } catch (error) {\n if (error.response?.status === 409) {\n printMessage(\n `createOrUpdateScript WARNING: script with name ${scriptData.name} already exists, using renaming policy... <name> => <name - imported (n)>`,\n 'warn'\n );\n const newName = applyNameCollisionPolicy(scriptData.name);\n scriptData.name = newName;\n const result = await putScript(scriptId, scriptData);\n printMessage(`Saved script as ${newName}`, 'warn');\n return result;\n }\n throw error;\n }\n}\n\n/**\n * Delete script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function deleteScript(scriptId: string): Promise<ScriptSkeleton> {\n const response = await _deleteScript(scriptId);\n return response;\n}\n\n/**\n * Export script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScript(\n scriptId: string\n): Promise<ScriptExportInterface> {\n debugMessage(`ScriptOps.exportScriptById: start`);\n const scriptData = await _getScript(scriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n const exportData = createScriptExportTemplate();\n exportData.script[scriptData._id] = scriptData;\n debugMessage(`ScriptOps.exportScriptById: end`);\n return exportData;\n}\n\n/**\n * Export script by name\n * @param {string} name script name\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScriptByName(\n name: string\n): Promise<ScriptExportInterface> {\n debugMessage(`ScriptOps.exportScriptByName: start`);\n const scriptData = await getScriptByName(name);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n const exportData = createScriptExportTemplate();\n exportData.script[scriptData._id] = scriptData;\n debugMessage(`ScriptOps.exportScriptByName: end`);\n return exportData;\n}\n\n/**\n * Export all scripts\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScripts(): Promise<ScriptExportInterface> {\n const scriptList = await getScripts();\n const exportData = createScriptExportTemplate();\n createProgressIndicator(\n scriptList.length,\n `Exporting ${scriptList.length} scripts...`\n );\n for (const script of scriptList) {\n updateProgressIndicator(`Reading script ${script.name}`);\n const scriptData = await getScriptByName(script.name);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n exportData.script[scriptData._id] = scriptData;\n }\n stopProgressIndicator(`Exported ${scriptList.length} scripts.`);\n return exportData;\n}\n\n/**\n * Import scripts\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {ScriptExportInterface} importData Script import data\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScripts(\n name: string,\n importData: ScriptExportInterface,\n reUuid = false\n): Promise<boolean> {\n let outcome = true;\n debugMessage(`ScriptOps.importScriptsFromFile: start`);\n createProgressIndicator(\n Object.keys(importData.script).length,\n 'Importing scripts...'\n );\n for (const existingId of Object.keys(importData.script)) {\n let newId = existingId;\n if (reUuid) {\n newId = uuidv4();\n debugMessage(\n `ScriptOps.importScriptsFromFile: Re-uuid-ing script ${importData.script[existingId].name} ${existingId} => ${newId}...`\n );\n importData.script[existingId]._id = newId;\n }\n if (name) {\n debugMessage(\n `ScriptOps.importScriptsFromFile: Renaming script ${importData.script[existingId].name} => ${name}...`\n );\n importData.script[existingId].name = name;\n }\n try {\n await putScript(newId, importData.script[existingId]);\n updateProgressIndicator(`Imported ${importData.script[existingId].name}`);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error importing script '${importData.script[existingId].name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n if (name) break;\n }\n stopProgressIndicator('Done');\n debugMessage(`ScriptOps.importScriptsFromFile: end`);\n return outcome;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScriptOps.js","names":["createScriptExportTemplate","meta","getMetadata","script","getScripts","result","_getScripts","getScript","scriptId","response","_getScript","getScriptByName","name","_getScriptByName","length","Error","putScript","scriptData","Array","isArray","convertTextArrayToBase64","_putScript","error","status","printMessage","newName","applyNameCollisionPolicy","deleteScript","_deleteScript","exportScript","debugMessage","convertBase64TextToArray","exportData","_id","exportScriptByName","exportScripts","scriptList","createProgressIndicator","updateProgressIndicator","stopProgressIndicator","importScripts","importData","reUuid","shouldValidateScript","outcome","existingId","Object","keys","scriptSkeleton","newId","uuidv4","validateScriptDecoded","message"],"sources":["ops/ScriptOps.ts"],"sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport { applyNameCollisionPolicy } from './utils/OpsUtils';\nimport {\n createProgressIndicator,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from './utils/Console';\nimport {\n getScript as _getScript,\n getScriptByName as _getScriptByName,\n getScripts as _getScripts,\n putScript as _putScript,\n deleteScript as _deleteScript,\n} from '../api/ScriptApi';\nimport {\n convertBase64TextToArray,\n convertTextArrayToBase64,\n getMetadata,\n} from './utils/ExportImportUtils';\nimport { ScriptSkeleton } from '../api/ApiTypes';\nimport { ExportMetaData } from '../ops/OpsTypes';\nimport { validateScriptDecoded } from './utils/ValidationUtils';\n\nexport interface ScriptExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n}\n\n/**\n * Create an empty idp export template\n * @returns {ScriptExportInterface} an empty idp export template\n */\nexport function createScriptExportTemplate(): ScriptExportInterface {\n return {\n meta: getMetadata(),\n script: {},\n } as ScriptExportInterface;\n}\n\n/**\n * Get all scripts\n * @returns {Promise<ScriptSkeleton[]>} a promise that resolves to an array of script objects\n */\nexport async function getScripts(): Promise<ScriptSkeleton[]> {\n const { result } = await _getScripts();\n return result;\n}\n\n/**\n * Get script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function getScript(scriptId: string): Promise<ScriptSkeleton> {\n const response = await _getScript(scriptId);\n return response;\n}\n\n/**\n * Get script by name\n * @param {string} name name of the script\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function getScriptByName(name: string): Promise<ScriptSkeleton> {\n const { result } = await _getScriptByName(name);\n switch (result.length) {\n case 1:\n return result[0];\n case 0:\n throw new Error(`Script '${name}' not found`);\n default:\n throw new Error(`${result.length} scripts '${name}' found`);\n }\n}\n\n/**\n * Create or update script\n * @param {string} scriptId script uuid\n * @param {ScriptSkeleton} scriptData script object\n * @returns {Promise<boolean>} a status object\n */\nexport async function putScript(\n scriptId: string,\n scriptData: ScriptSkeleton\n): Promise<boolean> {\n try {\n if (Array.isArray(scriptData.script)) {\n scriptData.script = convertTextArrayToBase64(scriptData.script);\n }\n const result = await _putScript(scriptId, scriptData);\n return result;\n } catch (error) {\n if (error.response?.status === 409) {\n printMessage(\n `createOrUpdateScript WARNING: script with name ${scriptData.name} already exists, using renaming policy... <name> => <name - imported (n)>`,\n 'warn'\n );\n const newName = applyNameCollisionPolicy(scriptData.name);\n scriptData.name = newName;\n const result = await putScript(scriptId, scriptData);\n printMessage(`Saved script as ${newName}`, 'warn');\n return result;\n }\n throw error;\n }\n}\n\n/**\n * Delete script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function deleteScript(scriptId: string): Promise<ScriptSkeleton> {\n const response = await _deleteScript(scriptId);\n return response;\n}\n\n/**\n * Export script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScript(\n scriptId: string\n): Promise<ScriptExportInterface> {\n debugMessage(`ScriptOps.exportScriptById: start`);\n const scriptData = await _getScript(scriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n const exportData = createScriptExportTemplate();\n exportData.script[scriptData._id] = scriptData;\n debugMessage(`ScriptOps.exportScriptById: end`);\n return exportData;\n}\n\n/**\n * Export script by name\n * @param {string} name script name\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScriptByName(\n name: string\n): Promise<ScriptExportInterface> {\n debugMessage(`ScriptOps.exportScriptByName: start`);\n const scriptData = await getScriptByName(name);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n const exportData = createScriptExportTemplate();\n exportData.script[scriptData._id] = scriptData;\n debugMessage(`ScriptOps.exportScriptByName: end`);\n return exportData;\n}\n\n/**\n * Export all scripts\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScripts(): Promise<ScriptExportInterface> {\n const scriptList = await getScripts();\n const exportData = createScriptExportTemplate();\n createProgressIndicator(\n scriptList.length,\n `Exporting ${scriptList.length} scripts...`\n );\n for (const script of scriptList) {\n updateProgressIndicator(`Reading script ${script.name}`);\n const scriptData = await getScriptByName(script.name);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n exportData.script[scriptData._id] = scriptData;\n }\n stopProgressIndicator(`Exported ${scriptList.length} scripts.`);\n return exportData;\n}\n\n/**\n * Import scripts\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {ScriptExportInterface} importData Script import data\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScripts(\n name: string,\n importData: ScriptExportInterface,\n reUuid = false,\n shouldValidateScript = false\n): Promise<boolean> {\n let outcome = true;\n debugMessage(`ScriptOps.importScriptsFromFile: start`);\n for (const existingId of Object.keys(importData.script)) {\n const scriptSkeleton = importData.script[existingId];\n let newId = existingId;\n if (reUuid) {\n newId = uuidv4();\n debugMessage(\n `ScriptOps.importScriptsFromFile: Re-uuid-ing script ${scriptSkeleton.name} ${existingId} => ${newId}...`\n );\n scriptSkeleton._id = newId;\n }\n if (name) {\n debugMessage(\n `ScriptOps.importScriptsFromFile: Renaming script ${scriptSkeleton.name} => ${name}...`\n );\n scriptSkeleton.name = name;\n }\n if (shouldValidateScript) {\n if (!validateScriptDecoded(scriptSkeleton)) {\n outcome = false;\n printMessage(\n `Error importing script '${scriptSkeleton.name}': Script is not valid`,\n 'error'\n );\n continue;\n }\n }\n try {\n await putScript(newId, scriptSkeleton);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error importing script '${scriptSkeleton.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n if (name) break;\n }\n debugMessage(`ScriptOps.importScriptsFromFile: end`);\n return outcome;\n}\n"],"mappings":"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"}
@@ -16,7 +16,6 @@ exports.getTypedFilename = getTypedFilename;
16
16
  exports.getWorkingDirectory = getWorkingDirectory;
17
17
  exports.readFilesRecursive = readFilesRecursive;
18
18
  exports.saveJsonToFile = saveJsonToFile;
19
- exports.saveTextToFile = saveTextToFile;
20
19
  exports.saveToFile = saveToFile;
21
20
  exports.titleCase = titleCase;
22
21
  exports.validateImport = validateImport;
@@ -152,21 +151,6 @@ function saveJsonToFile(data, filename) {
152
151
  }
153
152
  }
154
153
 
155
- /**
156
- * Save text data to file
157
- * @param {String} data text data
158
- * @param {String} filename file name
159
- */
160
- function saveTextToFile(data, filename) {
161
- _fs.default.writeFile(filename, data, err => {
162
- if (err) {
163
- (0, _Console.printMessage)("ERROR - can't save ".concat(filename), 'error');
164
- return false;
165
- }
166
- return true;
167
- });
168
- }
169
-
170
154
  /**
171
155
  * Append text data to file
172
156
  * @param {String} data text data
@@ -1 +1 @@
1
- {"version":3,"file":"ExportImportUtils.js","names":["getCurrentTimestamp","ts","Date","toISOString","getMetadata","metadata","origin","state","getHost","originAmVersion","getAmVersion","exportedBy","getUsername","exportDate","exportTool","FRODO_METADATA_ID","exportToolVersion","getFrodoVersion","titleCase","input","str","toString","splitStr","toLowerCase","split","i","length","charAt","toUpperCase","slice","join","getRealmString","realm","getRealm","reduce","result","item","convertBase64TextToArray","b64text","arrayOut","plainText","decode","replace","convertBase64UrlTextToArray","b64UTF8Text","decodeBase64Url","convertTextArrayToBase64","textArray","joinedText","b64encodedScript","encode","convertTextArrayToBase64Url","encodeBase64Url","validateImport","getTypedFilename","name","type","suffix","slug","slugify","getWorkingDirectory","wd","getDirectory","fs","existsSync","debugMessage","mkdirSync","recursive","saveToFile","data","identifier","filename","exportData","Array","isArray","forEach","element","writeFile","JSON","stringify","err","printMessage","saveJsonToFile","includeMeta","meta","writeFileSync","saveTextToFile","appendTextToFile","appendFileSync","error","message","findFilesByName","fileName","fast","path","entries","readdirSync","encoding","withFileTypes","files","filter","entry","isDirectory","file","map","folders","folder","push","readFilesRecursive","directory","items","readdir","filePathsNested","Promise","all","entity","lstat","flat"],"sources":["ops/utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport { lstat, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport slugify from 'slugify';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from '../../api/utils/Base64';\nimport * as state from '../../shared/State';\nimport { FRODO_METADATA_ID } from '../../storage/StaticStorage';\nimport { ExportMetaData } from '../OpsTypes';\nimport { debugMessage, printMessage } from './Console';\n\nexport function getCurrentTimestamp() {\n const ts = new Date();\n return ts.toISOString();\n}\n\nexport function getMetadata(): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: getCurrentTimestamp(),\n exportTool: 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) {\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() {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text) {\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) {\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) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray) {\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 return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory() {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (!fs.existsSync(wd)) {\n debugMessage(\n `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`\n );\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\nexport function saveToFile(type, data, identifier, filename) {\n const exportData = {};\n exportData['meta'] = getMetadata();\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.writeFile(filename, JSON.stringify(exportData, null, 2), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${type} to file`, 'error');\n }\n return '';\n });\n}\n\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 */\nexport function saveJsonToFile(data, filename, includeMeta = true): boolean {\n const exportData = data;\n if (includeMeta) exportData.meta = getMetadata();\n try {\n fs.writeFileSync(filename, JSON.stringify(exportData, null, 2));\n return true;\n } catch (err) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\n return false;\n }\n}\n\n/**\n * Save text data to file\n * @param {String} data text data\n * @param {String} filename file name\n */\nexport function saveTextToFile(data, filename) {\n fs.writeFile(filename, data, (err) => {\n if (err) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\n return false;\n }\n return true;\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, filename) {\n try {\n fs.appendFileSync(filename, data);\n } catch (error) {\n printMessage(`${error.message}`, 'error');\n }\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"],"mappings":"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"}
1
+ {"version":3,"file":"ExportImportUtils.js","names":["getCurrentTimestamp","ts","Date","toISOString","getMetadata","metadata","origin","state","getHost","originAmVersion","getAmVersion","exportedBy","getUsername","exportDate","exportTool","FRODO_METADATA_ID","exportToolVersion","getFrodoVersion","titleCase","input","str","toString","splitStr","toLowerCase","split","i","length","charAt","toUpperCase","slice","join","getRealmString","realm","getRealm","reduce","result","item","convertBase64TextToArray","b64text","arrayOut","plainText","decode","replace","convertBase64UrlTextToArray","b64UTF8Text","decodeBase64Url","convertTextArrayToBase64","textArray","joinedText","b64encodedScript","encode","convertTextArrayToBase64Url","encodeBase64Url","validateImport","getTypedFilename","name","type","suffix","slug","slugify","getWorkingDirectory","wd","getDirectory","fs","existsSync","debugMessage","mkdirSync","recursive","saveToFile","data","identifier","filename","exportData","Array","isArray","forEach","element","writeFile","JSON","stringify","err","printMessage","saveJsonToFile","includeMeta","meta","writeFileSync","appendTextToFile","appendFileSync","error","message","findFilesByName","fileName","fast","path","entries","readdirSync","encoding","withFileTypes","files","filter","entry","isDirectory","file","map","folders","folder","push","readFilesRecursive","directory","items","readdir","filePathsNested","Promise","all","entity","lstat","flat"],"sources":["ops/utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport { lstat, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport slugify from 'slugify';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from '../../api/utils/Base64';\nimport * as state from '../../shared/State';\nimport { FRODO_METADATA_ID } from '../../storage/StaticStorage';\nimport { ExportMetaData } from '../OpsTypes';\nimport { debugMessage, printMessage } from './Console';\n\nexport function getCurrentTimestamp() {\n const ts = new Date();\n return ts.toISOString();\n}\n\nexport function getMetadata(): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: getCurrentTimestamp(),\n exportTool: 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) {\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() {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text) {\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) {\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) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray) {\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 return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory() {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (!fs.existsSync(wd)) {\n debugMessage(\n `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`\n );\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\nexport function saveToFile(type, data, identifier, filename) {\n const exportData = {};\n exportData['meta'] = getMetadata();\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.writeFile(filename, JSON.stringify(exportData, null, 2), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${type} to file`, 'error');\n }\n return '';\n });\n}\n\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 */\nexport function saveJsonToFile(data, filename, includeMeta = true): boolean {\n const exportData = data;\n if (includeMeta) exportData.meta = getMetadata();\n try {\n fs.writeFileSync(filename, JSON.stringify(exportData, null, 2));\n return true;\n } catch (err) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\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, filename) {\n try {\n fs.appendFileSync(filename, data);\n } catch (error) {\n printMessage(`${error.message}`, 'error');\n }\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"],"mappings":"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"}
@@ -3,8 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.isValidJs = isValidJs;
7
+ exports.validateScript = validateScript;
8
+ exports.validateScriptDecoded = validateScriptDecoded;
6
9
  exports.validateScriptHooks = validateScriptHooks;
7
10
  var _esprima = require("esprima");
11
+ var _Base = require("../../api/utils/Base64");
8
12
  var _Console = require("./Console");
9
13
  function validateScriptHooks(jsonData) {
10
14
  var scriptHooks = findAllScriptHooks(jsonData);
@@ -36,12 +40,29 @@ function findAllScriptHooks(jsonData) {
36
40
  }
37
41
  return scriptHooksArray;
38
42
  }
43
+ function validateScript(script) {
44
+ var scriptRaw = (0, _Base.decode)(script.script);
45
+ if (script.language === 'JAVASCRIPT') {
46
+ return isValidJs(scriptRaw);
47
+ }
48
+ return true;
49
+ }
50
+ function validateScriptDecoded(scriptSkeleton) {
51
+ if (!Array.isArray(scriptSkeleton.script)) {
52
+ return false;
53
+ }
54
+ if (scriptSkeleton.language === 'JAVASCRIPT') {
55
+ var script = scriptSkeleton.script.join('\n');
56
+ return isValidJs(script);
57
+ }
58
+ return true;
59
+ }
39
60
  function isValidJs(javascriptSource) {
40
61
  try {
41
62
  (0, _esprima.parseScript)(javascriptSource);
42
63
  return true;
43
64
  } catch (e) {
44
- (0, _Console.printMessage)("Invalid JavaScript in script hook: ".concat(e.message), 'error');
65
+ (0, _Console.printMessage)("Invalid JavaScript: ".concat(e.message), 'error');
45
66
  return false;
46
67
  }
47
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationUtils.js","names":["validateScriptHooks","jsonData","scriptHooks","findAllScriptHooks","scriptHook","isValidJs","source","scriptHooksArray","key","item","type","push","javascriptSource","parseScript","e","printMessage","message"],"sources":["ops/utils/ValidationUtils.ts"],"sourcesContent":["import { parseScript } from 'esprima';\nimport { printMessage } from './Console';\n\ninterface ScriptHook {\n type: 'text/javascript';\n source?: string;\n}\n\nexport function validateScriptHooks(jsonData: object): boolean {\n const scriptHooks = findAllScriptHooks(jsonData);\n\n for (const scriptHook of scriptHooks) {\n if (!('source' in scriptHook)) {\n continue;\n }\n\n if (!isValidJs(scriptHook.source)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction findAllScriptHooks(\n jsonData: unknown,\n scriptHooksArray: ScriptHook[] = []\n): ScriptHook[] {\n if (typeof jsonData !== 'object' || jsonData === null) {\n return scriptHooksArray;\n }\n\n for (const key in jsonData) {\n const item = jsonData[key];\n if (typeof item !== 'object' || item === null) {\n continue;\n }\n\n if ('type' in item && item.type === 'text/javascript') {\n scriptHooksArray.push(item);\n } else {\n findAllScriptHooks(item, scriptHooksArray);\n }\n }\n\n return scriptHooksArray;\n}\n\nfunction isValidJs(javascriptSource: string) {\n try {\n parseScript(javascriptSource);\n return true;\n } catch (e) {\n printMessage(`Invalid JavaScript in script hook: ${e.message}`, 'error');\n\n return false;\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AAOO,SAASA,mBAAmB,CAACC,QAAgB,EAAW;EAC7D,IAAMC,WAAW,GAAGC,kBAAkB,CAACF,QAAQ,CAAC;EAEhD,KAAK,IAAMG,UAAU,IAAIF,WAAW,EAAE;IACpC,IAAI,EAAE,QAAQ,IAAIE,UAAU,CAAC,EAAE;MAC7B;IACF;IAEA,IAAI,CAACC,SAAS,CAACD,UAAU,CAACE,MAAM,CAAC,EAAE;MACjC,OAAO,KAAK;IACd;EACF;EAEA,OAAO,IAAI;AACb;AAEA,SAASH,kBAAkB,CACzBF,QAAiB,EAEH;EAAA,IADdM,gBAA8B,uEAAG,EAAE;EAEnC,IAAI,OAAON,QAAQ,KAAK,QAAQ,IAAIA,QAAQ,KAAK,IAAI,EAAE;IACrD,OAAOM,gBAAgB;EACzB;EAEA,KAAK,IAAMC,GAAG,IAAIP,QAAQ,EAAE;IAC1B,IAAMQ,IAAI,GAAGR,QAAQ,CAACO,GAAG,CAAC;IAC1B,IAAI,OAAOC,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,EAAE;MAC7C;IACF;IAEA,IAAI,MAAM,IAAIA,IAAI,IAAIA,IAAI,CAACC,IAAI,KAAK,iBAAiB,EAAE;MACrDH,gBAAgB,CAACI,IAAI,CAACF,IAAI,CAAC;IAC7B,CAAC,MAAM;MACLN,kBAAkB,CAACM,IAAI,EAAEF,gBAAgB,CAAC;IAC5C;EACF;EAEA,OAAOA,gBAAgB;AACzB;AAEA,SAASF,SAAS,CAACO,gBAAwB,EAAE;EAC3C,IAAI;IACF,IAAAC,oBAAW,EAACD,gBAAgB,CAAC;IAC7B,OAAO,IAAI;EACb,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV,IAAAC,qBAAY,+CAAuCD,CAAC,CAACE,OAAO,GAAI,OAAO,CAAC;IAExE,OAAO,KAAK;EACd;AACF"}
1
+ {"version":3,"file":"ValidationUtils.js","names":["validateScriptHooks","jsonData","scriptHooks","findAllScriptHooks","scriptHook","isValidJs","source","scriptHooksArray","key","item","type","push","validateScript","script","scriptRaw","decode","language","validateScriptDecoded","scriptSkeleton","Array","isArray","join","javascriptSource","parseScript","e","printMessage","message"],"sources":["ops/utils/ValidationUtils.ts"],"sourcesContent":["import { parseScript } from 'esprima';\nimport { ScriptSkeleton } from '../../api/ApiTypes';\nimport { decode } from '../../api/utils/Base64';\nimport { printMessage } from './Console';\n\ninterface ScriptHook {\n type: 'text/javascript';\n source?: string;\n}\n\nexport function validateScriptHooks(jsonData: object): boolean {\n const scriptHooks = findAllScriptHooks(jsonData);\n\n for (const scriptHook of scriptHooks) {\n if (!('source' in scriptHook)) {\n continue;\n }\n\n if (!isValidJs(scriptHook.source)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction findAllScriptHooks(\n jsonData: unknown,\n scriptHooksArray: ScriptHook[] = []\n): ScriptHook[] {\n if (typeof jsonData !== 'object' || jsonData === null) {\n return scriptHooksArray;\n }\n\n for (const key in jsonData) {\n const item = jsonData[key];\n if (typeof item !== 'object' || item === null) {\n continue;\n }\n\n if ('type' in item && item.type === 'text/javascript') {\n scriptHooksArray.push(item);\n } else {\n findAllScriptHooks(item, scriptHooksArray);\n }\n }\n\n return scriptHooksArray;\n}\n\nexport function validateScript(script: ScriptSkeleton): boolean {\n const scriptRaw = decode(script.script);\n\n if (script.language === 'JAVASCRIPT') {\n return isValidJs(scriptRaw);\n }\n return true;\n}\n\nexport function validateScriptDecoded(scriptSkeleton: ScriptSkeleton): boolean {\n if (!Array.isArray(scriptSkeleton.script)) {\n return false;\n }\n if (scriptSkeleton.language === 'JAVASCRIPT') {\n const script = scriptSkeleton.script.join('\\n');\n return isValidJs(script);\n }\n return true;\n}\n\nexport function isValidJs(javascriptSource: string) {\n try {\n parseScript(javascriptSource);\n return true;\n } catch (e) {\n printMessage(`Invalid JavaScript: ${e.message}`, 'error');\n\n return false;\n }\n}\n"],"mappings":";;;;;;;;;AAAA;AAEA;AACA;AAOO,SAASA,mBAAmB,CAACC,QAAgB,EAAW;EAC7D,IAAMC,WAAW,GAAGC,kBAAkB,CAACF,QAAQ,CAAC;EAEhD,KAAK,IAAMG,UAAU,IAAIF,WAAW,EAAE;IACpC,IAAI,EAAE,QAAQ,IAAIE,UAAU,CAAC,EAAE;MAC7B;IACF;IAEA,IAAI,CAACC,SAAS,CAACD,UAAU,CAACE,MAAM,CAAC,EAAE;MACjC,OAAO,KAAK;IACd;EACF;EAEA,OAAO,IAAI;AACb;AAEA,SAASH,kBAAkB,CACzBF,QAAiB,EAEH;EAAA,IADdM,gBAA8B,uEAAG,EAAE;EAEnC,IAAI,OAAON,QAAQ,KAAK,QAAQ,IAAIA,QAAQ,KAAK,IAAI,EAAE;IACrD,OAAOM,gBAAgB;EACzB;EAEA,KAAK,IAAMC,GAAG,IAAIP,QAAQ,EAAE;IAC1B,IAAMQ,IAAI,GAAGR,QAAQ,CAACO,GAAG,CAAC;IAC1B,IAAI,OAAOC,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,EAAE;MAC7C;IACF;IAEA,IAAI,MAAM,IAAIA,IAAI,IAAIA,IAAI,CAACC,IAAI,KAAK,iBAAiB,EAAE;MACrDH,gBAAgB,CAACI,IAAI,CAACF,IAAI,CAAC;IAC7B,CAAC,MAAM;MACLN,kBAAkB,CAACM,IAAI,EAAEF,gBAAgB,CAAC;IAC5C;EACF;EAEA,OAAOA,gBAAgB;AACzB;AAEO,SAASK,cAAc,CAACC,MAAsB,EAAW;EAC9D,IAAMC,SAAS,GAAG,IAAAC,YAAM,EAACF,MAAM,CAACA,MAAM,CAAC;EAEvC,IAAIA,MAAM,CAACG,QAAQ,KAAK,YAAY,EAAE;IACpC,OAAOX,SAAS,CAACS,SAAS,CAAC;EAC7B;EACA,OAAO,IAAI;AACb;AAEO,SAASG,qBAAqB,CAACC,cAA8B,EAAW;EAC7E,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,cAAc,CAACL,MAAM,CAAC,EAAE;IACzC,OAAO,KAAK;EACd;EACA,IAAIK,cAAc,CAACF,QAAQ,KAAK,YAAY,EAAE;IAC5C,IAAMH,MAAM,GAAGK,cAAc,CAACL,MAAM,CAACQ,IAAI,CAAC,IAAI,CAAC;IAC/C,OAAOhB,SAAS,CAACQ,MAAM,CAAC;EAC1B;EACA,OAAO,IAAI;AACb;AAEO,SAASR,SAAS,CAACiB,gBAAwB,EAAE;EAClD,IAAI;IACF,IAAAC,oBAAW,EAACD,gBAAgB,CAAC;IAC7B,OAAO,IAAI;EACb,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV,IAAAC,qBAAY,gCAAwBD,CAAC,CAACE,OAAO,GAAI,OAAO,CAAC;IAEzD,OAAO,KAAK;EACd;AACF"}
@@ -3,6 +3,7 @@ import { applyNameCollisionPolicy } from './utils/OpsUtils';
3
3
  import { createProgressIndicator, debugMessage, printMessage, stopProgressIndicator, updateProgressIndicator } from './utils/Console';
4
4
  import { getScript as _getScript, getScriptByName as _getScriptByName, getScripts as _getScripts, putScript as _putScript, deleteScript as _deleteScript } from '../api/ScriptApi';
5
5
  import { convertBase64TextToArray, convertTextArrayToBase64, getMetadata } from './utils/ExportImportUtils';
6
+ import { validateScriptDecoded } from './utils/ValidationUtils';
6
7
  /**
7
8
  * Create an empty idp export template
8
9
  * @returns {ScriptExportInterface} an empty idp export template
@@ -146,32 +147,37 @@ export async function exportScripts() {
146
147
  * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise
147
148
  * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise
148
149
  */
149
- export async function importScripts(name, importData, reUuid = false) {
150
+ export async function importScripts(name, importData, reUuid = false, shouldValidateScript = false) {
150
151
  let outcome = true;
151
152
  debugMessage(`ScriptOps.importScriptsFromFile: start`);
152
- createProgressIndicator(Object.keys(importData.script).length, 'Importing scripts...');
153
153
  for (const existingId of Object.keys(importData.script)) {
154
+ const scriptSkeleton = importData.script[existingId];
154
155
  let newId = existingId;
155
156
  if (reUuid) {
156
157
  newId = uuidv4();
157
- debugMessage(`ScriptOps.importScriptsFromFile: Re-uuid-ing script ${importData.script[existingId].name} ${existingId} => ${newId}...`);
158
- importData.script[existingId]._id = newId;
158
+ debugMessage(`ScriptOps.importScriptsFromFile: Re-uuid-ing script ${scriptSkeleton.name} ${existingId} => ${newId}...`);
159
+ scriptSkeleton._id = newId;
159
160
  }
160
161
  if (name) {
161
- debugMessage(`ScriptOps.importScriptsFromFile: Renaming script ${importData.script[existingId].name} => ${name}...`);
162
- importData.script[existingId].name = name;
162
+ debugMessage(`ScriptOps.importScriptsFromFile: Renaming script ${scriptSkeleton.name} => ${name}...`);
163
+ scriptSkeleton.name = name;
164
+ }
165
+ if (shouldValidateScript) {
166
+ if (!validateScriptDecoded(scriptSkeleton)) {
167
+ outcome = false;
168
+ printMessage(`Error importing script '${scriptSkeleton.name}': Script is not valid`, 'error');
169
+ continue;
170
+ }
163
171
  }
164
172
  try {
165
- await putScript(newId, importData.script[existingId]);
166
- updateProgressIndicator(`Imported ${importData.script[existingId].name}`);
173
+ await putScript(newId, scriptSkeleton);
167
174
  } catch (error) {
168
175
  outcome = false;
169
- printMessage(`Error importing script '${importData.script[existingId].name}': ${error.message}`, 'error');
176
+ printMessage(`Error importing script '${scriptSkeleton.name}': ${error.message}`, 'error');
170
177
  debugMessage(error);
171
178
  }
172
179
  if (name) break;
173
180
  }
174
- stopProgressIndicator('Done');
175
181
  debugMessage(`ScriptOps.importScriptsFromFile: end`);
176
182
  return outcome;
177
183
  }
@@ -123,21 +123,6 @@ export function saveJsonToFile(data, filename, includeMeta = true) {
123
123
  }
124
124
  }
125
125
 
126
- /**
127
- * Save text data to file
128
- * @param {String} data text data
129
- * @param {String} filename file name
130
- */
131
- export function saveTextToFile(data, filename) {
132
- fs.writeFile(filename, data, err => {
133
- if (err) {
134
- printMessage(`ERROR - can't save ${filename}`, 'error');
135
- return false;
136
- }
137
- return true;
138
- });
139
- }
140
-
141
126
  /**
142
127
  * Append text data to file
143
128
  * @param {String} data text data
@@ -1,4 +1,5 @@
1
1
  import { parseScript } from 'esprima';
2
+ import { decode } from '../../api/utils/Base64';
2
3
  import { printMessage } from './Console';
3
4
  export function validateScriptHooks(jsonData) {
4
5
  const scriptHooks = findAllScriptHooks(jsonData);
@@ -29,12 +30,29 @@ function findAllScriptHooks(jsonData, scriptHooksArray = []) {
29
30
  }
30
31
  return scriptHooksArray;
31
32
  }
32
- function isValidJs(javascriptSource) {
33
+ export function validateScript(script) {
34
+ const scriptRaw = decode(script.script);
35
+ if (script.language === 'JAVASCRIPT') {
36
+ return isValidJs(scriptRaw);
37
+ }
38
+ return true;
39
+ }
40
+ export function validateScriptDecoded(scriptSkeleton) {
41
+ if (!Array.isArray(scriptSkeleton.script)) {
42
+ return false;
43
+ }
44
+ if (scriptSkeleton.language === 'JAVASCRIPT') {
45
+ const script = scriptSkeleton.script.join('\n');
46
+ return isValidJs(script);
47
+ }
48
+ return true;
49
+ }
50
+ export function isValidJs(javascriptSource) {
33
51
  try {
34
52
  parseScript(javascriptSource);
35
53
  return true;
36
54
  } catch (e) {
37
- printMessage(`Invalid JavaScript in script hook: ${e.message}`, 'error');
55
+ printMessage(`Invalid JavaScript: ${e.message}`, 'error');
38
56
  return false;
39
57
  }
40
58
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rockcarver/frodo-lib",
3
- "version": "0.18.1",
3
+ "version": "0.18.2-0",
4
4
  "type": "commonjs",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.mjs",
@@ -160,7 +160,7 @@
160
160
  "loglevel": "^1.8.1",
161
161
  "map-stream": "^0.0.7",
162
162
  "mock-fs": "^5.2.0",
163
- "prettier": "^2.7.1",
163
+ "prettier": "^2.8.0",
164
164
  "setup-polly-jest": "^0.11.0",
165
165
  "typescript": "^4.9.3"
166
166
  }
@@ -1,14 +1,15 @@
1
+ import { PagedResult, ScriptSkeleton } from './ApiTypes';
1
2
  /**
2
3
  * Get all scripts
3
4
  * @returns {Promise} a promise that resolves to an object containing an array of script objects
4
5
  */
5
- export declare function getScripts(): Promise<any>;
6
+ export declare function getScripts(): Promise<PagedResult<ScriptSkeleton>>;
6
7
  /**
7
8
  * Get script by name
8
9
  * @param {String} scriptName script name
9
10
  * @returns {Promise} a promise that resolves to an object containing a script object
10
11
  */
11
- export declare function getScriptByName(scriptName: any): Promise<any>;
12
+ export declare function getScriptByName(scriptName: string): Promise<PagedResult<ScriptSkeleton>>;
12
13
  /**
13
14
  * Get script by id
14
15
  * @param {String} scriptId script uuid/name
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/ScriptApi.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAsB,UAAU,iBAU/B;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,UAAU,KAAA,gBAW/C;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,KAAA,gBAWvC;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,QAAQ,KAAA,EAAE,UAAU,KAAA,gBAenD;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,KAAA,gBAW1C","file":"ScriptApi.d.ts","sourcesContent":["import util from 'util';\nimport { generateAmApi } from './BaseApi';\nimport { getCurrentRealmPath } from './utils/ApiUtils';\nimport * as state from '../shared/State';\n\nconst scriptURLTemplate = '%s/json%s/scripts/%s';\nconst scriptListURLTemplate = '%s/json%s/scripts?_queryFilter=true';\nconst scriptQueryURLTemplate =\n '%s/json%s/scripts?_queryFilter=name+eq+%%22%s%%22';\nconst apiVersion = 'protocol=2.0,resource=1.0';\nconst getApiConfig = () => {\n return {\n path: `/json${getCurrentRealmPath()}/scripts`,\n apiVersion,\n };\n};\n\n/**\n * Get all scripts\n * @returns {Promise} a promise that resolves to an object containing an array of script objects\n */\nexport async function getScripts() {\n const urlString = util.format(\n scriptListURLTemplate,\n state.getHost(),\n getCurrentRealmPath()\n );\n const { data } = await generateAmApi(getApiConfig()).get(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Get script by name\n * @param {String} scriptName script name\n * @returns {Promise} a promise that resolves to an object containing a script object\n */\nexport async function getScriptByName(scriptName) {\n const urlString = util.format(\n scriptQueryURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n encodeURIComponent(scriptName)\n );\n const { data } = await generateAmApi(getApiConfig()).get(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Get script by id\n * @param {String} scriptId script uuid/name\n * @returns {Promise} a promise that resolves to a script object\n */\nexport async function getScript(scriptId) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).get(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Put script\n * @param {string} scriptId script uuid\n * @param {Object} scriptData script object\n * @returns {Promise} a promise that resolves to an object containing a script object\n */\nexport async function putScript(scriptId, scriptData) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).put(\n urlString,\n scriptData,\n {\n withCredentials: true,\n }\n );\n return data;\n}\n\n/**\n * Delete script by id\n * @param {String} scriptId script uuid/name\n * @returns {Promise} a promise that resolves to a script object\n */\nexport async function deleteScript(scriptId) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).delete(urlString, {\n withCredentials: true,\n });\n return data;\n}\n"]}
1
+ {"version":3,"sources":["../src/api/ScriptApi.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAczD;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAYvE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAatC;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,KAAA,gBAWvC;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,QAAQ,KAAA,EAAE,UAAU,KAAA,gBAenD;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,KAAA,gBAW1C","file":"ScriptApi.d.ts","sourcesContent":["import util from 'util';\nimport { generateAmApi } from './BaseApi';\nimport { getCurrentRealmPath } from './utils/ApiUtils';\nimport * as state from '../shared/State';\nimport { PagedResult, ScriptSkeleton } from './ApiTypes';\n\nconst scriptURLTemplate = '%s/json%s/scripts/%s';\nconst scriptListURLTemplate = '%s/json%s/scripts?_queryFilter=true';\nconst scriptQueryURLTemplate =\n '%s/json%s/scripts?_queryFilter=name+eq+%%22%s%%22';\nconst apiVersion = 'protocol=2.0,resource=1.0';\nconst getApiConfig = () => {\n return {\n path: `/json${getCurrentRealmPath()}/scripts`,\n apiVersion,\n };\n};\n\n/**\n * Get all scripts\n * @returns {Promise} a promise that resolves to an object containing an array of script objects\n */\nexport async function getScripts(): Promise<PagedResult<ScriptSkeleton>> {\n const urlString = util.format(\n scriptListURLTemplate,\n state.getHost(),\n getCurrentRealmPath()\n );\n const { data } = await generateAmApi(getApiConfig()).get<\n PagedResult<ScriptSkeleton>\n >(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Get script by name\n * @param {String} scriptName script name\n * @returns {Promise} a promise that resolves to an object containing a script object\n */\nexport async function getScriptByName(\n scriptName: string\n): Promise<PagedResult<ScriptSkeleton>> {\n const urlString = util.format(\n scriptQueryURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n encodeURIComponent(scriptName)\n );\n const { data } = await generateAmApi(getApiConfig()).get<\n PagedResult<ScriptSkeleton>\n >(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Get script by id\n * @param {String} scriptId script uuid/name\n * @returns {Promise} a promise that resolves to a script object\n */\nexport async function getScript(scriptId) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).get(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Put script\n * @param {string} scriptId script uuid\n * @param {Object} scriptData script object\n * @returns {Promise} a promise that resolves to an object containing a script object\n */\nexport async function putScript(scriptId, scriptData) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).put(\n urlString,\n scriptData,\n {\n withCredentials: true,\n }\n );\n return data;\n}\n\n/**\n * Delete script by id\n * @param {String} scriptId script uuid/name\n * @returns {Promise} a promise that resolves to a script object\n */\nexport async function deleteScript(scriptId) {\n const urlString = util.format(\n scriptURLTemplate,\n state.getHost(),\n getCurrentRealmPath(),\n scriptId\n );\n const { data } = await generateAmApi(getApiConfig()).delete(urlString, {\n withCredentials: true,\n });\n return data;\n}\n"]}
@@ -73,6 +73,10 @@ export interface TreeDependencyMapInterface {
73
73
  export interface TreeExportResolverInterface {
74
74
  (treeId: string): Promise<SingleTreeExportInterface>;
75
75
  }
76
+ export interface ScriptExportInterface {
77
+ meta?: ExportMetaData;
78
+ script: Record<string, ScriptSkeleton>;
79
+ }
76
80
  export declare enum NodeClassification {
77
81
  STANDARD = "standard",
78
82
  CUSTOM = "custom",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ops/OpsTypes.ts"],"names":[],"mappings":"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","file":"OpsTypes.d.ts","sourcesContent":["import {\n AgentSkeleton,\n AmServiceSkeleton,\n CircleOfTrustSkeleton,\n EmailTemplateSkeleton,\n NodeSkeleton,\n Saml2ProviderSkeleton,\n ScriptSkeleton,\n SocialIdpSkeleton,\n ThemeSkeleton,\n TreeSkeleton,\n} from '../api/ApiTypes';\n\n/**\n * Tree export options\n */\nexport interface TreeExportOptions {\n /**\n * Where applicable, use string arrays to store multi-line text (e.g. scripts).\n */\n useStringArrays: boolean;\n /**\n * Include any dependencies (scripts, email templates, SAML entity providers and circles of trust, social identity providers, themes).\n */\n deps: boolean;\n}\n\n/**\n * Tree import options\n */\nexport interface TreeImportOptions {\n /**\n * Generate new UUIDs for all nodes during import.\n */\n reUuid: boolean;\n /**\n * Include any dependencies (scripts, email templates, SAML entity providers and circles of trust, social identity providers, themes).\n */\n deps: boolean;\n}\n\nexport interface ExportMetaData {\n origin: string;\n originAmVersion: string;\n exportedBy: string;\n exportDate: string;\n exportTool: string;\n exportToolVersion: string;\n}\n\nexport interface SingleTreeExportInterface {\n meta?: ExportMetaData;\n innerNodes?: Record<string, NodeSkeleton>;\n innernodes?: Record<string, NodeSkeleton>;\n nodes: Record<string, NodeSkeleton>;\n scripts: Record<string, ScriptSkeleton>;\n emailTemplates: Record<string, EmailTemplateSkeleton>;\n socialIdentityProviders: Record<string, SocialIdpSkeleton>;\n themes: ThemeSkeleton[];\n saml2Entities: Record<string, Saml2ProviderSkeleton>;\n circlesOfTrust: Record<string, CircleOfTrustSkeleton>;\n tree: TreeSkeleton;\n}\n\nexport interface MultiTreeExportInterface {\n meta?: ExportMetaData;\n trees: Record<string, SingleTreeExportInterface>;\n}\n\nexport interface AgentExportInterface {\n meta?: Record<string, ExportMetaData>;\n agents: Record<string, AgentSkeleton>;\n}\n\nexport interface Saml2ExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n saml: {\n hosted: Record<string, Saml2ProviderSkeleton>;\n remote: Record<string, Saml2ProviderSkeleton>;\n metadata: Record<string, string[]>;\n };\n}\n\nexport interface ServiceExportInterface {\n meta?: Record<string, ExportMetaData>;\n service: Record<string, AmServiceSkeleton>;\n}\n\nexport interface TreeDependencyMapInterface {\n [k: string]: TreeDependencyMapInterface[];\n}\n\nexport interface TreeExportResolverInterface {\n (treeId: string): Promise<SingleTreeExportInterface>;\n}\n\nexport enum NodeClassification {\n STANDARD = 'standard',\n CUSTOM = 'custom',\n CLOUD = 'cloud',\n PREMIUM = 'premium',\n}\n\nexport enum JourneyClassification {\n STANDARD = 'standard',\n CUSTOM = 'custom',\n CLOUD = 'cloud',\n PREMIUM = 'premium',\n}\n\nexport interface MultiOpStatusInterface {\n total: number;\n successes: number;\n warnings: number;\n failures: number;\n message?: string;\n}\n"]}
1
+ {"version":3,"sources":["../src/ops/OpsTypes.ts"],"names":[],"mappings":"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","file":"OpsTypes.d.ts","sourcesContent":["import {\n AgentSkeleton,\n AmServiceSkeleton,\n CircleOfTrustSkeleton,\n EmailTemplateSkeleton,\n NodeSkeleton,\n Saml2ProviderSkeleton,\n ScriptSkeleton,\n SocialIdpSkeleton,\n ThemeSkeleton,\n TreeSkeleton,\n} from '../api/ApiTypes';\n\n/**\n * Tree export options\n */\nexport interface TreeExportOptions {\n /**\n * Where applicable, use string arrays to store multi-line text (e.g. scripts).\n */\n useStringArrays: boolean;\n /**\n * Include any dependencies (scripts, email templates, SAML entity providers and circles of trust, social identity providers, themes).\n */\n deps: boolean;\n}\n\n/**\n * Tree import options\n */\nexport interface TreeImportOptions {\n /**\n * Generate new UUIDs for all nodes during import.\n */\n reUuid: boolean;\n /**\n * Include any dependencies (scripts, email templates, SAML entity providers and circles of trust, social identity providers, themes).\n */\n deps: boolean;\n}\n\nexport interface ExportMetaData {\n origin: string;\n originAmVersion: string;\n exportedBy: string;\n exportDate: string;\n exportTool: string;\n exportToolVersion: string;\n}\n\nexport interface SingleTreeExportInterface {\n meta?: ExportMetaData;\n innerNodes?: Record<string, NodeSkeleton>;\n innernodes?: Record<string, NodeSkeleton>;\n nodes: Record<string, NodeSkeleton>;\n scripts: Record<string, ScriptSkeleton>;\n emailTemplates: Record<string, EmailTemplateSkeleton>;\n socialIdentityProviders: Record<string, SocialIdpSkeleton>;\n themes: ThemeSkeleton[];\n saml2Entities: Record<string, Saml2ProviderSkeleton>;\n circlesOfTrust: Record<string, CircleOfTrustSkeleton>;\n tree: TreeSkeleton;\n}\n\nexport interface MultiTreeExportInterface {\n meta?: ExportMetaData;\n trees: Record<string, SingleTreeExportInterface>;\n}\n\nexport interface AgentExportInterface {\n meta?: Record<string, ExportMetaData>;\n agents: Record<string, AgentSkeleton>;\n}\n\nexport interface Saml2ExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n saml: {\n hosted: Record<string, Saml2ProviderSkeleton>;\n remote: Record<string, Saml2ProviderSkeleton>;\n metadata: Record<string, string[]>;\n };\n}\n\nexport interface ServiceExportInterface {\n meta?: Record<string, ExportMetaData>;\n service: Record<string, AmServiceSkeleton>;\n}\n\nexport interface TreeDependencyMapInterface {\n [k: string]: TreeDependencyMapInterface[];\n}\n\nexport interface TreeExportResolverInterface {\n (treeId: string): Promise<SingleTreeExportInterface>;\n}\n\nexport interface ScriptExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n}\n\nexport enum NodeClassification {\n STANDARD = 'standard',\n CUSTOM = 'custom',\n CLOUD = 'cloud',\n PREMIUM = 'premium',\n}\n\nexport enum JourneyClassification {\n STANDARD = 'standard',\n CUSTOM = 'custom',\n CLOUD = 'cloud',\n PREMIUM = 'premium',\n}\n\nexport interface MultiOpStatusInterface {\n total: number;\n successes: number;\n warnings: number;\n failures: number;\n message?: string;\n}\n"]}
@@ -63,4 +63,4 @@ export declare function exportScripts(): Promise<ScriptExportInterface>;
63
63
  * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise
64
64
  * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise
65
65
  */
66
- export declare function importScripts(name: string, importData: ScriptExportInterface, reUuid?: boolean): Promise<boolean>;
66
+ export declare function importScripts(name: string, importData: ScriptExportInterface, reUuid?: boolean, shouldValidateScript?: boolean): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ops/ScriptOps.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,qBAAqB,CAKlE;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAG5D;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAGzE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAU3E;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAG5E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAepE;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,qBAAqB,EACjC,MAAM,UAAQ,GACb,OAAO,CAAC,OAAO,CAAC,CAsClB","file":"ScriptOps.d.ts","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport { applyNameCollisionPolicy } from './utils/OpsUtils';\nimport {\n createProgressIndicator,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from './utils/Console';\nimport {\n getScript as _getScript,\n getScriptByName as _getScriptByName,\n getScripts as _getScripts,\n putScript as _putScript,\n deleteScript as _deleteScript,\n} from '../api/ScriptApi';\nimport {\n convertBase64TextToArray,\n convertTextArrayToBase64,\n getMetadata,\n} from './utils/ExportImportUtils';\nimport { ScriptSkeleton } from '../api/ApiTypes';\nimport { ExportMetaData } from '../ops/OpsTypes';\n\nexport interface ScriptExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n}\n\n/**\n * Create an empty idp export template\n * @returns {ScriptExportInterface} an empty idp export template\n */\nexport function createScriptExportTemplate(): ScriptExportInterface {\n return {\n meta: getMetadata(),\n script: {},\n } as ScriptExportInterface;\n}\n\n/**\n * Get all scripts\n * @returns {Promise<ScriptSkeleton[]>} a promise that resolves to an array of script objects\n */\nexport async function getScripts(): Promise<ScriptSkeleton[]> {\n const { result } = await _getScripts();\n return result;\n}\n\n/**\n * Get script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function getScript(scriptId: string): Promise<ScriptSkeleton> {\n const response = await _getScript(scriptId);\n return response;\n}\n\n/**\n * Get script by name\n * @param {string} name name of the script\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function getScriptByName(name: string): Promise<ScriptSkeleton> {\n const { result } = await _getScriptByName(name);\n switch (result.length) {\n case 1:\n return result[0];\n case 0:\n throw new Error(`Script '${name}' not found`);\n default:\n throw new Error(`${result.length} scripts '${name}' found`);\n }\n}\n\n/**\n * Create or update script\n * @param {string} scriptId script uuid\n * @param {ScriptSkeleton} scriptData script object\n * @returns {Promise<boolean>} a status object\n */\nexport async function putScript(\n scriptId: string,\n scriptData: ScriptSkeleton\n): Promise<boolean> {\n try {\n if (Array.isArray(scriptData.script)) {\n scriptData.script = convertTextArrayToBase64(scriptData.script);\n }\n const result = await _putScript(scriptId, scriptData);\n return result;\n } catch (error) {\n if (error.response?.status === 409) {\n printMessage(\n `createOrUpdateScript WARNING: script with name ${scriptData.name} already exists, using renaming policy... <name> => <name - imported (n)>`,\n 'warn'\n );\n const newName = applyNameCollisionPolicy(scriptData.name);\n scriptData.name = newName;\n const result = await putScript(scriptId, scriptData);\n printMessage(`Saved script as ${newName}`, 'warn');\n return result;\n }\n throw error;\n }\n}\n\n/**\n * Delete script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function deleteScript(scriptId: string): Promise<ScriptSkeleton> {\n const response = await _deleteScript(scriptId);\n return response;\n}\n\n/**\n * Export script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScript(\n scriptId: string\n): Promise<ScriptExportInterface> {\n debugMessage(`ScriptOps.exportScriptById: start`);\n const scriptData = await _getScript(scriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n const exportData = createScriptExportTemplate();\n exportData.script[scriptData._id] = scriptData;\n debugMessage(`ScriptOps.exportScriptById: end`);\n return exportData;\n}\n\n/**\n * Export script by name\n * @param {string} name script name\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScriptByName(\n name: string\n): Promise<ScriptExportInterface> {\n debugMessage(`ScriptOps.exportScriptByName: start`);\n const scriptData = await getScriptByName(name);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n const exportData = createScriptExportTemplate();\n exportData.script[scriptData._id] = scriptData;\n debugMessage(`ScriptOps.exportScriptByName: end`);\n return exportData;\n}\n\n/**\n * Export all scripts\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScripts(): Promise<ScriptExportInterface> {\n const scriptList = await getScripts();\n const exportData = createScriptExportTemplate();\n createProgressIndicator(\n scriptList.length,\n `Exporting ${scriptList.length} scripts...`\n );\n for (const script of scriptList) {\n updateProgressIndicator(`Reading script ${script.name}`);\n const scriptData = await getScriptByName(script.name);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n exportData.script[scriptData._id] = scriptData;\n }\n stopProgressIndicator(`Exported ${scriptList.length} scripts.`);\n return exportData;\n}\n\n/**\n * Import scripts\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {ScriptExportInterface} importData Script import data\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScripts(\n name: string,\n importData: ScriptExportInterface,\n reUuid = false\n): Promise<boolean> {\n let outcome = true;\n debugMessage(`ScriptOps.importScriptsFromFile: start`);\n createProgressIndicator(\n Object.keys(importData.script).length,\n 'Importing scripts...'\n );\n for (const existingId of Object.keys(importData.script)) {\n let newId = existingId;\n if (reUuid) {\n newId = uuidv4();\n debugMessage(\n `ScriptOps.importScriptsFromFile: Re-uuid-ing script ${importData.script[existingId].name} ${existingId} => ${newId}...`\n );\n importData.script[existingId]._id = newId;\n }\n if (name) {\n debugMessage(\n `ScriptOps.importScriptsFromFile: Renaming script ${importData.script[existingId].name} => ${name}...`\n );\n importData.script[existingId].name = name;\n }\n try {\n await putScript(newId, importData.script[existingId]);\n updateProgressIndicator(`Imported ${importData.script[existingId].name}`);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error importing script '${importData.script[existingId].name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n if (name) break;\n }\n stopProgressIndicator('Done');\n debugMessage(`ScriptOps.importScriptsFromFile: end`);\n return outcome;\n}\n"]}
1
+ {"version":3,"sources":["../src/ops/ScriptOps.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,qBAAqB,CAKlE;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAG5D;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAGzE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAU3E;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAG5E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAepE;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,qBAAqB,EACjC,MAAM,UAAQ,EACd,oBAAoB,UAAQ,GAC3B,OAAO,CAAC,OAAO,CAAC,CA2ClB","file":"ScriptOps.d.ts","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport { applyNameCollisionPolicy } from './utils/OpsUtils';\nimport {\n createProgressIndicator,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from './utils/Console';\nimport {\n getScript as _getScript,\n getScriptByName as _getScriptByName,\n getScripts as _getScripts,\n putScript as _putScript,\n deleteScript as _deleteScript,\n} from '../api/ScriptApi';\nimport {\n convertBase64TextToArray,\n convertTextArrayToBase64,\n getMetadata,\n} from './utils/ExportImportUtils';\nimport { ScriptSkeleton } from '../api/ApiTypes';\nimport { ExportMetaData } from '../ops/OpsTypes';\nimport { validateScriptDecoded } from './utils/ValidationUtils';\n\nexport interface ScriptExportInterface {\n meta?: ExportMetaData;\n script: Record<string, ScriptSkeleton>;\n}\n\n/**\n * Create an empty idp export template\n * @returns {ScriptExportInterface} an empty idp export template\n */\nexport function createScriptExportTemplate(): ScriptExportInterface {\n return {\n meta: getMetadata(),\n script: {},\n } as ScriptExportInterface;\n}\n\n/**\n * Get all scripts\n * @returns {Promise<ScriptSkeleton[]>} a promise that resolves to an array of script objects\n */\nexport async function getScripts(): Promise<ScriptSkeleton[]> {\n const { result } = await _getScripts();\n return result;\n}\n\n/**\n * Get script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function getScript(scriptId: string): Promise<ScriptSkeleton> {\n const response = await _getScript(scriptId);\n return response;\n}\n\n/**\n * Get script by name\n * @param {string} name name of the script\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function getScriptByName(name: string): Promise<ScriptSkeleton> {\n const { result } = await _getScriptByName(name);\n switch (result.length) {\n case 1:\n return result[0];\n case 0:\n throw new Error(`Script '${name}' not found`);\n default:\n throw new Error(`${result.length} scripts '${name}' found`);\n }\n}\n\n/**\n * Create or update script\n * @param {string} scriptId script uuid\n * @param {ScriptSkeleton} scriptData script object\n * @returns {Promise<boolean>} a status object\n */\nexport async function putScript(\n scriptId: string,\n scriptData: ScriptSkeleton\n): Promise<boolean> {\n try {\n if (Array.isArray(scriptData.script)) {\n scriptData.script = convertTextArrayToBase64(scriptData.script);\n }\n const result = await _putScript(scriptId, scriptData);\n return result;\n } catch (error) {\n if (error.response?.status === 409) {\n printMessage(\n `createOrUpdateScript WARNING: script with name ${scriptData.name} already exists, using renaming policy... <name> => <name - imported (n)>`,\n 'warn'\n );\n const newName = applyNameCollisionPolicy(scriptData.name);\n scriptData.name = newName;\n const result = await putScript(scriptId, scriptData);\n printMessage(`Saved script as ${newName}`, 'warn');\n return result;\n }\n throw error;\n }\n}\n\n/**\n * Delete script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptSkeleton>} promise that resolves to a script object\n */\nexport async function deleteScript(scriptId: string): Promise<ScriptSkeleton> {\n const response = await _deleteScript(scriptId);\n return response;\n}\n\n/**\n * Export script by id\n * @param {string} scriptId script uuid\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScript(\n scriptId: string\n): Promise<ScriptExportInterface> {\n debugMessage(`ScriptOps.exportScriptById: start`);\n const scriptData = await _getScript(scriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n const exportData = createScriptExportTemplate();\n exportData.script[scriptData._id] = scriptData;\n debugMessage(`ScriptOps.exportScriptById: end`);\n return exportData;\n}\n\n/**\n * Export script by name\n * @param {string} name script name\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScriptByName(\n name: string\n): Promise<ScriptExportInterface> {\n debugMessage(`ScriptOps.exportScriptByName: start`);\n const scriptData = await getScriptByName(name);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n const exportData = createScriptExportTemplate();\n exportData.script[scriptData._id] = scriptData;\n debugMessage(`ScriptOps.exportScriptByName: end`);\n return exportData;\n}\n\n/**\n * Export all scripts\n * @returns {Promise<ScriptExportInterface>} a promise that resolved to a ScriptExportInterface object\n */\nexport async function exportScripts(): Promise<ScriptExportInterface> {\n const scriptList = await getScripts();\n const exportData = createScriptExportTemplate();\n createProgressIndicator(\n scriptList.length,\n `Exporting ${scriptList.length} scripts...`\n );\n for (const script of scriptList) {\n updateProgressIndicator(`Reading script ${script.name}`);\n const scriptData = await getScriptByName(script.name);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n exportData.script[scriptData._id] = scriptData;\n }\n stopProgressIndicator(`Exported ${scriptList.length} scripts.`);\n return exportData;\n}\n\n/**\n * Import scripts\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {ScriptExportInterface} importData Script import data\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScripts(\n name: string,\n importData: ScriptExportInterface,\n reUuid = false,\n shouldValidateScript = false\n): Promise<boolean> {\n let outcome = true;\n debugMessage(`ScriptOps.importScriptsFromFile: start`);\n for (const existingId of Object.keys(importData.script)) {\n const scriptSkeleton = importData.script[existingId];\n let newId = existingId;\n if (reUuid) {\n newId = uuidv4();\n debugMessage(\n `ScriptOps.importScriptsFromFile: Re-uuid-ing script ${scriptSkeleton.name} ${existingId} => ${newId}...`\n );\n scriptSkeleton._id = newId;\n }\n if (name) {\n debugMessage(\n `ScriptOps.importScriptsFromFile: Renaming script ${scriptSkeleton.name} => ${name}...`\n );\n scriptSkeleton.name = name;\n }\n if (shouldValidateScript) {\n if (!validateScriptDecoded(scriptSkeleton)) {\n outcome = false;\n printMessage(\n `Error importing script '${scriptSkeleton.name}': Script is not valid`,\n 'error'\n );\n continue;\n }\n }\n try {\n await putScript(newId, scriptSkeleton);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error importing script '${scriptSkeleton.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n if (name) break;\n }\n debugMessage(`ScriptOps.importScriptsFromFile: end`);\n return outcome;\n}\n"]}
@@ -18,12 +18,6 @@ export declare function saveToFile(type: any, data: any, identifier: any, filena
18
18
  * @return {boolean} true if successful, false otherwise
19
19
  */
20
20
  export declare function saveJsonToFile(data: any, filename: any, includeMeta?: boolean): boolean;
21
- /**
22
- * Save text data to file
23
- * @param {String} data text data
24
- * @param {String} filename file name
25
- */
26
- export declare function saveTextToFile(data: any, filename: any): void;
27
21
  /**
28
22
  * Append text data to file
29
23
  * @param {String} data text data
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ops/utils/ExportImportUtils.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAgB,mBAAmB,WAGlC;AAED,wBAAgB,WAAW,IAAI,cAAc,CAU5C;AAOD,wBAAgB,SAAS,CAAC,KAAK,KAAA,OAO9B;AAED,wBAAgB,cAAc,WAK7B;AAED,wBAAgB,wBAAwB,CAAC,OAAO,KAAA,SAM/C;AAED,wBAAgB,2BAA2B,CAAC,WAAW,KAAA,SAMtD;AAED,wBAAgB,wBAAwB,CAAC,SAAS,KAAA,UAIjD;AAED,wBAAgB,2BAA2B,CAAC,SAAS,KAAA,OAIpD;AAGD,wBAAgB,cAAc,CAAC,QAAQ,KAAA,GAAG,OAAO,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS,UAG3E;AAED,wBAAgB,mBAAmB,WAalC;AAED,wBAAgB,UAAU,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,QAAQ,KAAA,QAkB1D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,KAAA,EAAE,QAAQ,KAAA,EAAE,WAAW,UAAO,GAAG,OAAO,CAU1E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,KAAA,EAAE,QAAQ,KAAA,QAQ5C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,KAAA,EAAE,QAAQ,KAAA,QAM9C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,UAAO,EACX,IAAI,SAAO,GACV,MAAM,EAAE,CAqBV;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgB7E","file":"ExportImportUtils.d.ts","sourcesContent":["import fs from 'fs';\nimport { lstat, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport slugify from 'slugify';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from '../../api/utils/Base64';\nimport * as state from '../../shared/State';\nimport { FRODO_METADATA_ID } from '../../storage/StaticStorage';\nimport { ExportMetaData } from '../OpsTypes';\nimport { debugMessage, printMessage } from './Console';\n\nexport function getCurrentTimestamp() {\n const ts = new Date();\n return ts.toISOString();\n}\n\nexport function getMetadata(): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: getCurrentTimestamp(),\n exportTool: 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) {\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() {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text) {\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) {\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) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray) {\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 return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory() {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (!fs.existsSync(wd)) {\n debugMessage(\n `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`\n );\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\nexport function saveToFile(type, data, identifier, filename) {\n const exportData = {};\n exportData['meta'] = getMetadata();\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.writeFile(filename, JSON.stringify(exportData, null, 2), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${type} to file`, 'error');\n }\n return '';\n });\n}\n\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 */\nexport function saveJsonToFile(data, filename, includeMeta = true): boolean {\n const exportData = data;\n if (includeMeta) exportData.meta = getMetadata();\n try {\n fs.writeFileSync(filename, JSON.stringify(exportData, null, 2));\n return true;\n } catch (err) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\n return false;\n }\n}\n\n/**\n * Save text data to file\n * @param {String} data text data\n * @param {String} filename file name\n */\nexport function saveTextToFile(data, filename) {\n fs.writeFile(filename, data, (err) => {\n if (err) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\n return false;\n }\n return true;\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, filename) {\n try {\n fs.appendFileSync(filename, data);\n } catch (error) {\n printMessage(`${error.message}`, 'error');\n }\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"]}
1
+ {"version":3,"sources":["../src/ops/utils/ExportImportUtils.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAgB,mBAAmB,WAGlC;AAED,wBAAgB,WAAW,IAAI,cAAc,CAU5C;AAOD,wBAAgB,SAAS,CAAC,KAAK,KAAA,OAO9B;AAED,wBAAgB,cAAc,WAK7B;AAED,wBAAgB,wBAAwB,CAAC,OAAO,KAAA,SAM/C;AAED,wBAAgB,2BAA2B,CAAC,WAAW,KAAA,SAMtD;AAED,wBAAgB,wBAAwB,CAAC,SAAS,KAAA,UAIjD;AAED,wBAAgB,2BAA2B,CAAC,SAAS,KAAA,OAIpD;AAGD,wBAAgB,cAAc,CAAC,QAAQ,KAAA,GAAG,OAAO,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS,UAG3E;AAED,wBAAgB,mBAAmB,WAalC;AAED,wBAAgB,UAAU,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,QAAQ,KAAA,QAkB1D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,KAAA,EAAE,QAAQ,KAAA,EAAE,WAAW,UAAO,GAAG,OAAO,CAU1E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,KAAA,EAAE,QAAQ,KAAA,QAM9C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,UAAO,EACX,IAAI,SAAO,GACV,MAAM,EAAE,CAqBV;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgB7E","file":"ExportImportUtils.d.ts","sourcesContent":["import fs from 'fs';\nimport { lstat, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport slugify from 'slugify';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from '../../api/utils/Base64';\nimport * as state from '../../shared/State';\nimport { FRODO_METADATA_ID } from '../../storage/StaticStorage';\nimport { ExportMetaData } from '../OpsTypes';\nimport { debugMessage, printMessage } from './Console';\n\nexport function getCurrentTimestamp() {\n const ts = new Date();\n return ts.toISOString();\n}\n\nexport function getMetadata(): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: getCurrentTimestamp(),\n exportTool: 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) {\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() {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text) {\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) {\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) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray) {\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 return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory() {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (!fs.existsSync(wd)) {\n debugMessage(\n `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`\n );\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\nexport function saveToFile(type, data, identifier, filename) {\n const exportData = {};\n exportData['meta'] = getMetadata();\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.writeFile(filename, JSON.stringify(exportData, null, 2), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${type} to file`, 'error');\n }\n return '';\n });\n}\n\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 */\nexport function saveJsonToFile(data, filename, includeMeta = true): boolean {\n const exportData = data;\n if (includeMeta) exportData.meta = getMetadata();\n try {\n fs.writeFileSync(filename, JSON.stringify(exportData, null, 2));\n return true;\n } catch (err) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\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, filename) {\n try {\n fs.appendFileSync(filename, data);\n } catch (error) {\n printMessage(`${error.message}`, 'error');\n }\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"]}
@@ -1 +1,5 @@
1
+ import { ScriptSkeleton } from '../../api/ApiTypes';
1
2
  export declare function validateScriptHooks(jsonData: object): boolean;
3
+ export declare function validateScript(script: ScriptSkeleton): boolean;
4
+ export declare function validateScriptDecoded(scriptSkeleton: ScriptSkeleton): boolean;
5
+ export declare function isValidJs(javascriptSource: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ops/utils/ValidationUtils.ts"],"names":[],"mappings":"AAQA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAc7D","file":"ValidationUtils.d.ts","sourcesContent":["import { parseScript } from 'esprima';\nimport { printMessage } from './Console';\n\ninterface ScriptHook {\n type: 'text/javascript';\n source?: string;\n}\n\nexport function validateScriptHooks(jsonData: object): boolean {\n const scriptHooks = findAllScriptHooks(jsonData);\n\n for (const scriptHook of scriptHooks) {\n if (!('source' in scriptHook)) {\n continue;\n }\n\n if (!isValidJs(scriptHook.source)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction findAllScriptHooks(\n jsonData: unknown,\n scriptHooksArray: ScriptHook[] = []\n): ScriptHook[] {\n if (typeof jsonData !== 'object' || jsonData === null) {\n return scriptHooksArray;\n }\n\n for (const key in jsonData) {\n const item = jsonData[key];\n if (typeof item !== 'object' || item === null) {\n continue;\n }\n\n if ('type' in item && item.type === 'text/javascript') {\n scriptHooksArray.push(item);\n } else {\n findAllScriptHooks(item, scriptHooksArray);\n }\n }\n\n return scriptHooksArray;\n}\n\nfunction isValidJs(javascriptSource: string) {\n try {\n parseScript(javascriptSource);\n return true;\n } catch (e) {\n printMessage(`Invalid JavaScript in script hook: ${e.message}`, 'error');\n\n return false;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/ops/utils/ValidationUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AASpD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAc7D;AA0BD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAO9D;AAED,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAS7E;AAED,wBAAgB,SAAS,CAAC,gBAAgB,EAAE,MAAM,WASjD","file":"ValidationUtils.d.ts","sourcesContent":["import { parseScript } from 'esprima';\nimport { ScriptSkeleton } from '../../api/ApiTypes';\nimport { decode } from '../../api/utils/Base64';\nimport { printMessage } from './Console';\n\ninterface ScriptHook {\n type: 'text/javascript';\n source?: string;\n}\n\nexport function validateScriptHooks(jsonData: object): boolean {\n const scriptHooks = findAllScriptHooks(jsonData);\n\n for (const scriptHook of scriptHooks) {\n if (!('source' in scriptHook)) {\n continue;\n }\n\n if (!isValidJs(scriptHook.source)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction findAllScriptHooks(\n jsonData: unknown,\n scriptHooksArray: ScriptHook[] = []\n): ScriptHook[] {\n if (typeof jsonData !== 'object' || jsonData === null) {\n return scriptHooksArray;\n }\n\n for (const key in jsonData) {\n const item = jsonData[key];\n if (typeof item !== 'object' || item === null) {\n continue;\n }\n\n if ('type' in item && item.type === 'text/javascript') {\n scriptHooksArray.push(item);\n } else {\n findAllScriptHooks(item, scriptHooksArray);\n }\n }\n\n return scriptHooksArray;\n}\n\nexport function validateScript(script: ScriptSkeleton): boolean {\n const scriptRaw = decode(script.script);\n\n if (script.language === 'JAVASCRIPT') {\n return isValidJs(scriptRaw);\n }\n return true;\n}\n\nexport function validateScriptDecoded(scriptSkeleton: ScriptSkeleton): boolean {\n if (!Array.isArray(scriptSkeleton.script)) {\n return false;\n }\n if (scriptSkeleton.language === 'JAVASCRIPT') {\n const script = scriptSkeleton.script.join('\\n');\n return isValidJs(script);\n }\n return true;\n}\n\nexport function isValidJs(javascriptSource: string) {\n try {\n parseScript(javascriptSource);\n return true;\n } catch (e) {\n printMessage(`Invalid JavaScript: ${e.message}`, 'error');\n\n return false;\n }\n}\n"]}