@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 +5 -1
- package/cjs/api/ScriptApi.js.map +1 -1
- package/cjs/ops/OpsTypes.js.map +1 -1
- package/cjs/ops/ScriptOps.js +16 -9
- package/cjs/ops/ScriptOps.js.map +1 -1
- package/cjs/ops/utils/ExportImportUtils.js +0 -16
- package/cjs/ops/utils/ExportImportUtils.js.map +1 -1
- package/cjs/ops/utils/ValidationUtils.js +22 -1
- package/cjs/ops/utils/ValidationUtils.js.map +1 -1
- package/esm/ops/ScriptOps.mjs +16 -10
- package/esm/ops/utils/ExportImportUtils.mjs +0 -15
- package/esm/ops/utils/ValidationUtils.mjs +20 -2
- package/package.json +2 -2
- package/types/api/ScriptApi.d.ts +3 -2
- package/types/api/ScriptApi.d.ts.map +1 -1
- package/types/ops/OpsTypes.d.ts +4 -0
- package/types/ops/OpsTypes.d.ts.map +1 -1
- package/types/ops/ScriptOps.d.ts +1 -1
- package/types/ops/ScriptOps.d.ts.map +1 -1
- package/types/ops/utils/ExportImportUtils.d.ts +0 -6
- package/types/ops/utils/ExportImportUtils.d.ts.map +1 -1
- package/types/ops/utils/ValidationUtils.d.ts +4 -0
- package/types/ops/utils/ValidationUtils.d.ts.map +1 -1
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.
|
|
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
|
|
package/cjs/api/ScriptApi.js.map
CHANGED
|
@@ -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":";;;;;;;;;;AAAA;AACA;AACA;AACA;AAAyC;AAAA;AAAA;AAAA;AAAA;
|
|
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":"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"}
|
package/cjs/ops/OpsTypes.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/cjs/ops/ScriptOps.js
CHANGED
|
@@ -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(
|
|
220
|
-
|
|
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(
|
|
224
|
-
|
|
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,
|
|
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(
|
|
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
|
});
|
package/cjs/ops/ScriptOps.js.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;AAAA;AACA;AACA;AAOA;AAOA;AAOA;AAAgE;AAAA;AAOhE;AACA;AACA;AACA;AACO,SAASA,0BAA0B,GAA0B;EAClE,OAAO;IACLC,IAAI,EAAE,IAAAC,8BAAW,GAAE;IACnBC,MAAM,EAAE,CAAC;EACX,CAAC;AACH;;AAEA;AACA;AACA;AACA;AAHA,SAIsBC,UAAU;EAAA;AAAA;AAKhC;AACA;AACA;AACA;AACA;AAJA;EAAA,iCALO,aAAuD;IAC5D,IAAM;MAAEC;IAAO,CAAC,SAAS,IAAAC,qBAAW,GAAE;IACtC,OAAOD,MAAM;EACf,CAAC;EAAA;AAAA;AAAA,SAOqBE,SAAS;EAAA;AAAA;AAK/B;AACA;AACA;AACA;AACA;AAJA;EAAA,gCALO,WAAyBC,QAAgB,EAA2B;IACzE,IAAMC,QAAQ,SAAS,IAAAC,oBAAU,EAACF,QAAQ,CAAC;IAC3C,OAAOC,QAAQ;EACjB,CAAC;EAAA;AAAA;AAAA,SAOqBE,eAAe;EAAA;AAAA;AAYrC;AACA;AACA;AACA;AACA;AACA;AALA;EAAA,sCAZO,WAA+BC,IAAY,EAA2B;IAC3E,IAAM;MAAEP;IAAO,CAAC,SAAS,IAAAQ,0BAAgB,EAACD,IAAI,CAAC;IAC/C,QAAQP,MAAM,CAACS,MAAM;MACnB,KAAK,CAAC;QACJ,OAAOT,MAAM,CAAC,CAAC,CAAC;MAClB,KAAK,CAAC;QACJ,MAAM,IAAIU,KAAK,mBAAYH,IAAI,iBAAc;MAC/C;QACE,MAAM,IAAIG,KAAK,WAAIV,MAAM,CAACS,MAAM,uBAAaF,IAAI,aAAU;IAAC;EAElE,CAAC;EAAA;AAAA;AAAA,SAQqBI,SAAS;EAAA;AAAA;AA0B/B;AACA;AACA;AACA;AACA;AAJA;EAAA,gCA1BO,WACLR,QAAgB,EAChBS,UAA0B,EACR;IAClB,IAAI;MACF,IAAIC,KAAK,CAACC,OAAO,CAACF,UAAU,CAACd,MAAM,CAAC,EAAE;QACpCc,UAAU,CAACd,MAAM,GAAG,IAAAiB,2CAAwB,EAACH,UAAU,CAACd,MAAM,CAAC;MACjE;MACA,IAAME,MAAM,SAAS,IAAAgB,oBAAU,EAACb,QAAQ,EAAES,UAAU,CAAC;MACrD,OAAOZ,MAAM;IACf,CAAC,CAAC,OAAOiB,KAAK,EAAE;MAAA;MACd,IAAI,oBAAAA,KAAK,CAACb,QAAQ,oDAAd,gBAAgBc,MAAM,MAAK,GAAG,EAAE;QAClC,IAAAC,qBAAY,2DACwCP,UAAU,CAACL,IAAI,gFACjE,MAAM,CACP;QACD,IAAMa,OAAO,GAAG,IAAAC,kCAAwB,EAACT,UAAU,CAACL,IAAI,CAAC;QACzDK,UAAU,CAACL,IAAI,GAAGa,OAAO;QACzB,IAAMpB,OAAM,SAASW,SAAS,CAACR,QAAQ,EAAES,UAAU,CAAC;QACpD,IAAAO,qBAAY,4BAAoBC,OAAO,GAAI,MAAM,CAAC;QAClD,OAAOpB,OAAM;MACf;MACA,MAAMiB,KAAK;IACb;EACF,CAAC;EAAA;AAAA;AAAA,SAOqBK,YAAY;EAAA;AAAA;AAKlC;AACA;AACA;AACA;AACA;AAJA;EAAA,mCALO,WAA4BnB,QAAgB,EAA2B;IAC5E,IAAMC,QAAQ,SAAS,IAAAmB,uBAAa,EAACpB,QAAQ,CAAC;IAC9C,OAAOC,QAAQ;EACjB,CAAC;EAAA;AAAA;AAAA,SAOqBoB,YAAY;EAAA;AAAA;AAYlC;AACA;AACA;AACA;AACA;AAJA;EAAA,kCAZO,WACLrB,QAAgB,EACgB;IAChC,IAAAsB,qBAAY,sCAAqC;IACjD,IAAMb,UAAU,SAAS,IAAAP,oBAAU,EAACF,QAAQ,CAAC;IAC7CS,UAAU,CAACd,MAAM,GAAG,IAAA4B,2CAAwB,EAACd,UAAU,CAACd,MAAM,CAAC;IAC/D,IAAM6B,UAAU,GAAGhC,0BAA0B,EAAE;IAC/CgC,UAAU,CAAC7B,MAAM,CAACc,UAAU,CAACgB,GAAG,CAAC,GAAGhB,UAAU;IAC9C,IAAAa,qBAAY,oCAAmC;IAC/C,OAAOE,UAAU;EACnB,CAAC;EAAA;AAAA;AAAA,SAOqBE,kBAAkB;EAAA;AAAA;AAYxC;AACA;AACA;AACA;AAHA;EAAA,wCAZO,WACLtB,IAAY,EACoB;IAChC,IAAAkB,qBAAY,wCAAuC;IACnD,IAAMb,UAAU,SAASN,eAAe,CAACC,IAAI,CAAC;IAC9CK,UAAU,CAACd,MAAM,GAAG,IAAA4B,2CAAwB,EAACd,UAAU,CAACd,MAAM,CAAC;IAC/D,IAAM6B,UAAU,GAAGhC,0BAA0B,EAAE;IAC/CgC,UAAU,CAAC7B,MAAM,CAACc,UAAU,CAACgB,GAAG,CAAC,GAAGhB,UAAU;IAC9C,IAAAa,qBAAY,sCAAqC;IACjD,OAAOE,UAAU;EACnB,CAAC;EAAA;AAAA;AAAA,SAMqBG,aAAa;EAAA;AAAA;AAiBnC;AACA;AACA;AACA;AACA;AACA;AACA;AANA;EAAA,mCAjBO,aAA+D;IACpE,IAAMC,UAAU,SAAShC,UAAU,EAAE;IACrC,IAAM4B,UAAU,GAAGhC,0BAA0B,EAAE;IAC/C,IAAAqC,gCAAuB,EACrBD,UAAU,CAACtB,MAAM,sBACJsB,UAAU,CAACtB,MAAM,iBAC/B;IACD,KAAK,IAAMX,MAAM,IAAIiC,UAAU,EAAE;MAC/B,IAAAE,gCAAuB,2BAAmBnC,MAAM,CAACS,IAAI,EAAG;MACxD,IAAMK,UAAU,SAASN,eAAe,CAACR,MAAM,CAACS,IAAI,CAAC;MACrDK,UAAU,CAACd,MAAM,GAAG,IAAA4B,2CAAwB,EAACd,UAAU,CAACd,MAAM,CAAC;MAC/D6B,UAAU,CAAC7B,MAAM,CAACc,UAAU,CAACgB,GAAG,CAAC,GAAGhB,UAAU;IAChD;IACA,IAAAsB,8BAAqB,qBAAaH,UAAU,CAACtB,MAAM,eAAY;IAC/D,OAAOkB,UAAU;EACnB,CAAC;EAAA;AAAA;AAAA,SASqBQ,aAAa;EAAA;AAAA;AAAA;EAAA,mCAA5B,WACL5B,IAAY,EACZ6B,UAAiC,EAGf;IAAA,IAFlBC,MAAM,uEAAG,KAAK;IAAA,IACdC,oBAAoB,uEAAG,KAAK;IAE5B,IAAIC,OAAO,GAAG,IAAI;IAClB,IAAAd,qBAAY,2CAA0C;IACtD,KAAK,IAAMe,UAAU,IAAIC,MAAM,CAACC,IAAI,CAACN,UAAU,CAACtC,MAAM,CAAC,EAAE;MACvD,IAAM6C,cAAc,GAAGP,UAAU,CAACtC,MAAM,CAAC0C,UAAU,CAAC;MACpD,IAAII,KAAK,GAAGJ,UAAU;MACtB,IAAIH,MAAM,EAAE;QACVO,KAAK,GAAG,IAAAC,QAAM,GAAE;QAChB,IAAApB,qBAAY,gEAC6CkB,cAAc,CAACpC,IAAI,cAAIiC,UAAU,iBAAOI,KAAK,SACrG;QACDD,cAAc,CAACf,GAAG,GAAGgB,KAAK;MAC5B;MACA,IAAIrC,IAAI,EAAE;QACR,IAAAkB,qBAAY,6DAC0CkB,cAAc,CAACpC,IAAI,iBAAOA,IAAI,SACnF;QACDoC,cAAc,CAACpC,IAAI,GAAGA,IAAI;MAC5B;MACA,IAAI+B,oBAAoB,EAAE;QACxB,IAAI,CAAC,IAAAQ,sCAAqB,EAACH,cAAc,CAAC,EAAE;UAC1CJ,OAAO,GAAG,KAAK;UACf,IAAApB,qBAAY,oCACiBwB,cAAc,CAACpC,IAAI,6BAC9C,OAAO,CACR;UACD;QACF;MACF;MACA,IAAI;QACF,MAAMI,SAAS,CAACiC,KAAK,EAAED,cAAc,CAAC;MACxC,CAAC,CAAC,OAAO1B,KAAK,EAAE;QACdsB,OAAO,GAAG,KAAK;QACf,IAAApB,qBAAY,oCACiBwB,cAAc,CAACpC,IAAI,gBAAMU,KAAK,CAAC8B,OAAO,GACjE,OAAO,CACR;QACD,IAAAtB,qBAAY,EAACR,KAAK,CAAC;MACrB;MACA,IAAIV,IAAI,EAAE;IACZ;IACA,IAAAkB,qBAAY,yCAAwC;IACpD,OAAOc,OAAO;EAChB,CAAC;EAAA;AAAA"}
|
|
@@ -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
|
|
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\
|
|
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"}
|
package/esm/ops/ScriptOps.mjs
CHANGED
|
@@ -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 ${
|
|
158
|
-
|
|
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 ${
|
|
162
|
-
|
|
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,
|
|
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 '${
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
163
|
+
"prettier": "^2.8.0",
|
|
164
164
|
"setup-polly-jest": "^0.11.0",
|
|
165
165
|
"typescript": "^4.9.3"
|
|
166
166
|
}
|
package/types/api/ScriptApi.d.ts
CHANGED
|
@@ -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<
|
|
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:
|
|
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":"
|
|
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"]}
|
package/types/ops/OpsTypes.d.ts
CHANGED
|
@@ -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"]}
|
package/types/ops/ScriptOps.d.ts
CHANGED
|
@@ -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;
|
|
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,
|
|
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":"
|
|
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"]}
|