@rockcarver/frodo-cli 0.20.1-1 → 0.20.2-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.20.2-0] - 2023-01-24
11
+
12
+ ## [0.20.1] - 2023-01-20
13
+
14
+ ### Changed
15
+
16
+ - Updated to frodo-lib 0.18.1
17
+ - Include service account name in `frodo conn list -l` and `frodo conn describe <host>` output.
18
+ - Add missing service account name when running `frodo conn save <host>`.
19
+ - Add tenant name to beginning of output of all `frodo logs` sub-commands: `fetch`, `list`, `tail`.
20
+
21
+ ### Fixed
22
+
23
+ - \#176: frodo logs fetch end timestamp ignored
24
+
10
25
  ## [0.20.1-1] - 2023-01-16
11
26
 
12
27
  ## [0.20.1-0] - 2023-01-15
@@ -109,7 +124,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
109
124
 
110
125
  - Updated list of contributors in package.json
111
126
 
112
- - Add linux arm64 binary builds
127
+ - \#166: Add linux arm64 binary builds
113
128
 
114
129
  ### Changed
115
130
 
@@ -118,6 +133,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
118
133
 
119
134
  ### Fixed
120
135
 
136
+ - \#164: Frodo now properly exports scripts with special chars in name
121
137
  - \#161: Frodo now properly adds connection profiles with log credentials
122
138
 
123
139
  ## [0.19.5-2] - 2023-01-13
@@ -962,7 +978,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
962
978
  - Fixed problem with adding connection profiles
963
979
  - Miscellaneous bug fixes
964
980
 
965
- [Unreleased]: https://github.com/rockcarver/frodo-cli/compare/v0.20.1-1...HEAD
981
+ [Unreleased]: https://github.com/rockcarver/frodo-cli/compare/v0.20.2-0...HEAD
982
+
983
+ [0.20.2-0]: https://github.com/rockcarver/frodo-cli/compare/v0.20.1...v0.20.2-0
984
+
985
+ [0.20.1]: https://github.com/rockcarver/frodo-cli/compare/v0.20.1-1...v0.20.1
966
986
 
967
987
  [0.20.1-1]: https://github.com/rockcarver/frodo-cli/compare/v0.20.1-0...v0.20.1-1
968
988
 
@@ -10,7 +10,7 @@ process.env.FRODO_REALM || globalConfig.DEFAULT_REALM_KEY, '"alpha" for Identity
10
10
  const usernameArgument = new Argument('[username]', 'Username to login with. Must be an admin user with appropriate rights to manage authentication journeys/trees.');
11
11
  const passwordArgument = new Argument('[password]', 'Password.');
12
12
  const serviceAccountIdOption = new Option('--sa-id <sa-id>', 'Service account id.');
13
- const serviceAccountJwkFileOption = new Option('--sa-jwk-file <file>', 'File containing the java web key (jwk) associated with the the service account.');
13
+ const serviceAccountJwkFileOption = new Option('--sa-jwk-file <file>', 'File containing the JSON Web Key (JWK) associated with the the service account.');
14
14
  const deploymentOption = new Option('-m, --type <type>', 'Override auto-detected deployment type. Valid values for type: \n\
15
15
  classic: A classic Access Management-only deployment with custom layout and configuration. \n\
16
16
  cloud: A ForgeRock Identity Cloud environment. \n\
@@ -111,6 +111,10 @@ export class FrodoCommand extends FrodoStubCommand {
111
111
 
112
112
  // handle arguments first
113
113
  for (const [i, v] of command.args.entries()) {
114
+ if (!command._args[i]) {
115
+ printMessage(`${command.args.length} arguments supplied but command only supports ${command._args.length}.`, 'warn');
116
+ break;
117
+ }
114
118
  const arg = command._args[i].name();
115
119
  // handle only default arguments
116
120
  if (Object.keys(stateMap).includes(arg)) {
@@ -1 +1 @@
1
- {"version":3,"file":"FrodoCommand.js","names":["Argument","Command","Option","globalConfig","state","fs","printMessage","createProgressIndicator","updateProgressIndicator","stopProgressIndicator","verboseMessage","debugMessage","curlirizeMessage","hostArgument","realmArgument","default","process","env","FRODO_REALM","DEFAULT_REALM_KEY","usernameArgument","passwordArgument","serviceAccountIdOption","serviceAccountJwkFileOption","deploymentOption","choices","DEPLOYMENT_TYPES","insecureOption","verboseOption","debugOption","curlirizeOption","defaultArgs","defaultOpts","stateMap","name","setHost","setRealm","setUsername","setPassword","attributeName","setServiceAccountId","file","data","readFileSync","jwk","JSON","parse","toString","setServiceAccountJwk","error","message","setDeploymentType","setAllowInsecureConnection","setVerbose","setDebug","setCurlirize","FrodoStubCommand","constructor","helpOption","showHelpAfterError","configureHelp","sortSubcommands","sortOptions","setPrintHandler","setVerboseHandler","setDebugHandler","setCurlirizeHandler","setCreateProgressHandler","setUpdateProgressHandler","setStopProgressHandler","FrodoCommand","omits","arg","includes","addArgument","opt","addOption","handleDefaultArgsAndOpts","args","command","pop","options","i","v","entries","_args","Object","keys","handler","k"],"sources":["cli/FrodoCommand.ts"],"sourcesContent":["import { Argument, Command, Option } from 'commander';\nimport * as globalConfig from '../storage/StaticStorage';\nimport { state } from '@rockcarver/frodo-lib';\nimport fs from 'fs';\nimport {\n printMessage,\n createProgressIndicator,\n updateProgressIndicator,\n stopProgressIndicator,\n verboseMessage,\n debugMessage,\n curlirizeMessage,\n} from '../utils/Console.js';\n\nconst hostArgument = new Argument(\n '[host]',\n 'Access Management base URL, e.g.: https://cdk.iam.example.com/am. To use a connection profile, just specify a unique substring.'\n);\n\nconst realmArgument = new Argument(\n '[realm]',\n \"Realm. Specify realm as '/' for the root realm or 'realm' or '/parent/child' otherwise.\"\n).default(\n // must check for FRODO_REALM env variable here because otherwise cli will overwrite realm with default value\n process.env.FRODO_REALM || globalConfig.DEFAULT_REALM_KEY,\n '\"alpha\" for Identity Cloud tenants, \"/\" otherwise.'\n);\n\nconst usernameArgument = new Argument(\n '[username]',\n 'Username to login with. Must be an admin user with appropriate rights to manage authentication journeys/trees.'\n);\n\nconst passwordArgument = new Argument('[password]', 'Password.');\n\nconst serviceAccountIdOption = new Option(\n '--sa-id <sa-id>',\n 'Service account id.'\n);\n\nconst serviceAccountJwkFileOption = new Option(\n '--sa-jwk-file <file>',\n 'File containing the java web key (jwk) associated with the the service account.'\n);\n\nconst deploymentOption = new Option(\n '-m, --type <type>',\n 'Override auto-detected deployment type. Valid values for type: \\n\\\nclassic: A classic Access Management-only deployment with custom layout and configuration. \\n\\\ncloud: A ForgeRock Identity Cloud environment. \\n\\\nforgeops: A ForgeOps CDK or CDM deployment. \\n\\\nThe detected or provided deployment type controls certain behavior like obtaining an Identity \\\nManagement admin token or not and whether to export/import referenced email templates or how \\\nto walk through the tenant admin login flow of Identity Cloud and handle MFA'\n).choices(globalConfig.DEPLOYMENT_TYPES);\n\nconst insecureOption = new Option(\n '-k, --insecure',\n 'Allow insecure connections when using SSL/TLS. Has no effect when using a network proxy for https (HTTPS_PROXY=http://<host>:<port>), in that case the proxy must provide this capability.'\n).default(false, \"Don't allow insecure connections\");\n\nconst verboseOption = new Option(\n '--verbose',\n 'Verbose output during command execution. If specified, may or may not produce additional output.'\n);\n\nconst debugOption = new Option(\n '--debug',\n 'Debug output during command execution. If specified, may or may not produce additional output helpful for troubleshooting.'\n);\n\nconst curlirizeOption = new Option(\n '--curlirize',\n 'Output all network calls in curl format.'\n);\n\nconst defaultArgs = [\n hostArgument,\n realmArgument,\n usernameArgument,\n passwordArgument,\n];\n\nconst defaultOpts = [\n serviceAccountIdOption,\n serviceAccountJwkFileOption,\n deploymentOption,\n insecureOption,\n verboseOption,\n debugOption,\n curlirizeOption,\n];\n\nconst stateMap = {\n [hostArgument.name()]: state.setHost,\n [realmArgument.name()]: state.setRealm,\n [usernameArgument.name()]: state.setUsername,\n [passwordArgument.name()]: state.setPassword,\n [serviceAccountIdOption.attributeName()]: state.setServiceAccountId,\n [serviceAccountJwkFileOption.attributeName()]: (file) => {\n try {\n const data = fs.readFileSync(file);\n const jwk = JSON.parse(data.toString());\n state.setServiceAccountJwk(jwk);\n } catch (error) {\n printMessage(\n `Error parsing JWK from file ${file}: ${error.message}`,\n 'error'\n );\n }\n },\n [deploymentOption.attributeName()]: state.setDeploymentType,\n [insecureOption.attributeName()]: state.setAllowInsecureConnection,\n [verboseOption.attributeName()]: state.setVerbose,\n [debugOption.attributeName()]: state.setDebug,\n [curlirizeOption.attributeName()]: state.setCurlirize,\n};\n\n/**\n * Command with default options\n */\nexport class FrodoStubCommand extends Command {\n /**\n * Creates a new FrodoCommand instance\n * @param name Name of the command\n * @param omits Array of default argument names and default option names that should not be added to this command\n */\n constructor(name: string) {\n super(name);\n\n // other default settings\n this.helpOption('-h, --help', 'Help');\n this.showHelpAfterError();\n this.configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n });\n\n // register default handlers\n state.setPrintHandler(printMessage);\n state.setVerboseHandler(verboseMessage);\n state.setDebugHandler(debugMessage);\n state.setCurlirizeHandler(curlirizeMessage);\n state.setCreateProgressHandler(createProgressIndicator);\n state.setUpdateProgressHandler(updateProgressIndicator);\n state.setStopProgressHandler(stopProgressIndicator);\n }\n}\n\n/**\n * Command with default options\n */\nexport class FrodoCommand extends FrodoStubCommand {\n /**\n * Creates a new FrodoCommand instance\n * @param name Name of the command\n * @param omits Array of default argument names and default option names that should not be added to this command\n */\n constructor(name: string, omits: string[] = []) {\n super(name);\n\n // register default arguments\n for (const arg of defaultArgs) {\n if (!omits.includes(arg.name())) this.addArgument(arg);\n }\n\n // register default options\n for (const opt of defaultOpts) {\n if (!omits.includes(opt.name())) this.addOption(opt);\n }\n }\n\n /**\n *\n * @param args\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleDefaultArgsAndOpts(...args: any) {\n const command = args.pop();\n const options = args.pop();\n\n // handle arguments first\n for (const [i, v] of command.args.entries()) {\n const arg = command._args[i].name();\n // handle only default arguments\n if (Object.keys(stateMap).includes(arg)) {\n debugMessage(\n `FrodoCommand.handleDefaultArgsAndOpts: Handling default argument '${arg}'.`\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: any = stateMap[arg];\n handler(v);\n } else {\n debugMessage(\n `FrodoCommand.handleDefaultArgsAndOpts: Ignoring non-default argument '${arg}'.`\n );\n }\n }\n\n // handle options\n for (const [k, v] of Object.entries(options)) {\n // handle only default options\n if (Object.keys(stateMap).includes(k)) {\n debugMessage(\n `FrodoCommand.handleDefaultArgsAndOpts: Handling default option '${k}'.`\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: any = stateMap[k];\n handler(v);\n } else {\n debugMessage(\n `FrodoCommand.handleDefaultArgsAndOpts: Ignoring non-default option '${k}'.`\n );\n }\n }\n }\n}\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,OAAO,EAAEC,MAAM,QAAQ,WAAW;AACrD,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AACxD,SAASC,KAAK,QAAQ,uBAAuB;AAC7C,OAAOC,EAAE,MAAM,IAAI;AACnB,SACEC,YAAY,EACZC,uBAAuB,EACvBC,uBAAuB,EACvBC,qBAAqB,EACrBC,cAAc,EACdC,YAAY,EACZC,gBAAgB,QACX,qBAAqB;AAE5B,MAAMC,YAAY,GAAG,IAAIb,QAAQ,CAC/B,QAAQ,EACR,iIAAiI,CAClI;AAED,MAAMc,aAAa,GAAG,IAAId,QAAQ,CAChC,SAAS,EACT,yFAAyF,CAC1F,CAACe,OAAO;AACP;AACAC,OAAO,CAACC,GAAG,CAACC,WAAW,IAAIf,YAAY,CAACgB,iBAAiB,EACzD,oDAAoD,CACrD;AAED,MAAMC,gBAAgB,GAAG,IAAIpB,QAAQ,CACnC,YAAY,EACZ,gHAAgH,CACjH;AAED,MAAMqB,gBAAgB,GAAG,IAAIrB,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;AAEhE,MAAMsB,sBAAsB,GAAG,IAAIpB,MAAM,CACvC,iBAAiB,EACjB,qBAAqB,CACtB;AAED,MAAMqB,2BAA2B,GAAG,IAAIrB,MAAM,CAC5C,sBAAsB,EACtB,iFAAiF,CAClF;AAED,MAAMsB,gBAAgB,GAAG,IAAItB,MAAM,CACjC,mBAAmB,EACnB;AACF;AACA;AACA;AACA;AACA;AACA,6EAA6E,CAC5E,CAACuB,OAAO,CAACtB,YAAY,CAACuB,gBAAgB,CAAC;AAExC,MAAMC,cAAc,GAAG,IAAIzB,MAAM,CAC/B,gBAAgB,EAChB,4LAA4L,CAC7L,CAACa,OAAO,CAAC,KAAK,EAAE,kCAAkC,CAAC;AAEpD,MAAMa,aAAa,GAAG,IAAI1B,MAAM,CAC9B,WAAW,EACX,kGAAkG,CACnG;AAED,MAAM2B,WAAW,GAAG,IAAI3B,MAAM,CAC5B,SAAS,EACT,4HAA4H,CAC7H;AAED,MAAM4B,eAAe,GAAG,IAAI5B,MAAM,CAChC,aAAa,EACb,0CAA0C,CAC3C;AAED,MAAM6B,WAAW,GAAG,CAClBlB,YAAY,EACZC,aAAa,EACbM,gBAAgB,EAChBC,gBAAgB,CACjB;AAED,MAAMW,WAAW,GAAG,CAClBV,sBAAsB,EACtBC,2BAA2B,EAC3BC,gBAAgB,EAChBG,cAAc,EACdC,aAAa,EACbC,WAAW,EACXC,eAAe,CAChB;AAED,MAAMG,QAAQ,GAAG;EACf,CAACpB,YAAY,CAACqB,IAAI,EAAE,GAAG9B,KAAK,CAAC+B,OAAO;EACpC,CAACrB,aAAa,CAACoB,IAAI,EAAE,GAAG9B,KAAK,CAACgC,QAAQ;EACtC,CAAChB,gBAAgB,CAACc,IAAI,EAAE,GAAG9B,KAAK,CAACiC,WAAW;EAC5C,CAAChB,gBAAgB,CAACa,IAAI,EAAE,GAAG9B,KAAK,CAACkC,WAAW;EAC5C,CAAChB,sBAAsB,CAACiB,aAAa,EAAE,GAAGnC,KAAK,CAACoC,mBAAmB;EACnE,CAACjB,2BAA2B,CAACgB,aAAa,EAAE,GAAIE,IAAI,IAAK;IACvD,IAAI;MACF,MAAMC,IAAI,GAAGrC,EAAE,CAACsC,YAAY,CAACF,IAAI,CAAC;MAClC,MAAMG,GAAG,GAAGC,IAAI,CAACC,KAAK,CAACJ,IAAI,CAACK,QAAQ,EAAE,CAAC;MACvC3C,KAAK,CAAC4C,oBAAoB,CAACJ,GAAG,CAAC;IACjC,CAAC,CAAC,OAAOK,KAAK,EAAE;MACd3C,YAAY,CACT,+BAA8BmC,IAAK,KAAIQ,KAAK,CAACC,OAAQ,EAAC,EACvD,OAAO,CACR;IACH;EACF,CAAC;EACD,CAAC1B,gBAAgB,CAACe,aAAa,EAAE,GAAGnC,KAAK,CAAC+C,iBAAiB;EAC3D,CAACxB,cAAc,CAACY,aAAa,EAAE,GAAGnC,KAAK,CAACgD,0BAA0B;EAClE,CAACxB,aAAa,CAACW,aAAa,EAAE,GAAGnC,KAAK,CAACiD,UAAU;EACjD,CAACxB,WAAW,CAACU,aAAa,EAAE,GAAGnC,KAAK,CAACkD,QAAQ;EAC7C,CAACxB,eAAe,CAACS,aAAa,EAAE,GAAGnC,KAAK,CAACmD;AAC3C,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,SAASvD,OAAO,CAAC;EAC5C;AACF;AACA;AACA;AACA;EACEwD,WAAW,CAACvB,IAAY,EAAE;IACxB,KAAK,CAACA,IAAI,CAAC;;IAEX;IACA,IAAI,CAACwB,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC;IACrC,IAAI,CAACC,kBAAkB,EAAE;IACzB,IAAI,CAACC,aAAa,CAAC;MACjBC,eAAe,EAAE,IAAI;MACrBC,WAAW,EAAE;IACf,CAAC,CAAC;;IAEF;IACA1D,KAAK,CAAC2D,eAAe,CAACzD,YAAY,CAAC;IACnCF,KAAK,CAAC4D,iBAAiB,CAACtD,cAAc,CAAC;IACvCN,KAAK,CAAC6D,eAAe,CAACtD,YAAY,CAAC;IACnCP,KAAK,CAAC8D,mBAAmB,CAACtD,gBAAgB,CAAC;IAC3CR,KAAK,CAAC+D,wBAAwB,CAAC5D,uBAAuB,CAAC;IACvDH,KAAK,CAACgE,wBAAwB,CAAC5D,uBAAuB,CAAC;IACvDJ,KAAK,CAACiE,sBAAsB,CAAC5D,qBAAqB,CAAC;EACrD;AACF;;AAEA;AACA;AACA;AACA,OAAO,MAAM6D,YAAY,SAASd,gBAAgB,CAAC;EACjD;AACF;AACA;AACA;AACA;EACEC,WAAW,CAACvB,IAAY,EAAEqC,KAAe,GAAG,EAAE,EAAE;IAC9C,KAAK,CAACrC,IAAI,CAAC;;IAEX;IACA,KAAK,MAAMsC,GAAG,IAAIzC,WAAW,EAAE;MAC7B,IAAI,CAACwC,KAAK,CAACE,QAAQ,CAACD,GAAG,CAACtC,IAAI,EAAE,CAAC,EAAE,IAAI,CAACwC,WAAW,CAACF,GAAG,CAAC;IACxD;;IAEA;IACA,KAAK,MAAMG,GAAG,IAAI3C,WAAW,EAAE;MAC7B,IAAI,CAACuC,KAAK,CAACE,QAAQ,CAACE,GAAG,CAACzC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC0C,SAAS,CAACD,GAAG,CAAC;IACtD;EACF;;EAEA;AACF;AACA;AACA;EACE;EACAE,wBAAwB,CAAC,GAAGC,IAAS,EAAE;IACrC,MAAMC,OAAO,GAAGD,IAAI,CAACE,GAAG,EAAE;IAC1B,MAAMC,OAAO,GAAGH,IAAI,CAACE,GAAG,EAAE;;IAE1B;IACA,KAAK,MAAM,CAACE,CAAC,EAAEC,CAAC,CAAC,IAAIJ,OAAO,CAACD,IAAI,CAACM,OAAO,EAAE,EAAE;MAC3C,MAAMZ,GAAG,GAAGO,OAAO,CAACM,KAAK,CAACH,CAAC,CAAC,CAAChD,IAAI,EAAE;MACnC;MACA,IAAIoD,MAAM,CAACC,IAAI,CAACtD,QAAQ,CAAC,CAACwC,QAAQ,CAACD,GAAG,CAAC,EAAE;QACvC7D,YAAY,CACT,qEAAoE6D,GAAI,IAAG,CAC7E;QACD;QACA,MAAMgB,OAAY,GAAGvD,QAAQ,CAACuC,GAAG,CAAC;QAClCgB,OAAO,CAACL,CAAC,CAAC;MACZ,CAAC,MAAM;QACLxE,YAAY,CACT,yEAAwE6D,GAAI,IAAG,CACjF;MACH;IACF;;IAEA;IACA,KAAK,MAAM,CAACiB,CAAC,EAAEN,CAAC,CAAC,IAAIG,MAAM,CAACF,OAAO,CAACH,OAAO,CAAC,EAAE;MAC5C;MACA,IAAIK,MAAM,CAACC,IAAI,CAACtD,QAAQ,CAAC,CAACwC,QAAQ,CAACgB,CAAC,CAAC,EAAE;QACrC9E,YAAY,CACT,mEAAkE8E,CAAE,IAAG,CACzE;QACD;QACA,MAAMD,OAAY,GAAGvD,QAAQ,CAACwD,CAAC,CAAC;QAChCD,OAAO,CAACL,CAAC,CAAC;MACZ,CAAC,MAAM;QACLxE,YAAY,CACT,uEAAsE8E,CAAE,IAAG,CAC7E;MACH;IACF;EACF;AACF"}
1
+ {"version":3,"file":"FrodoCommand.js","names":["Argument","Command","Option","globalConfig","state","fs","printMessage","createProgressIndicator","updateProgressIndicator","stopProgressIndicator","verboseMessage","debugMessage","curlirizeMessage","hostArgument","realmArgument","default","process","env","FRODO_REALM","DEFAULT_REALM_KEY","usernameArgument","passwordArgument","serviceAccountIdOption","serviceAccountJwkFileOption","deploymentOption","choices","DEPLOYMENT_TYPES","insecureOption","verboseOption","debugOption","curlirizeOption","defaultArgs","defaultOpts","stateMap","name","setHost","setRealm","setUsername","setPassword","attributeName","setServiceAccountId","file","data","readFileSync","jwk","JSON","parse","toString","setServiceAccountJwk","error","message","setDeploymentType","setAllowInsecureConnection","setVerbose","setDebug","setCurlirize","FrodoStubCommand","constructor","helpOption","showHelpAfterError","configureHelp","sortSubcommands","sortOptions","setPrintHandler","setVerboseHandler","setDebugHandler","setCurlirizeHandler","setCreateProgressHandler","setUpdateProgressHandler","setStopProgressHandler","FrodoCommand","omits","arg","includes","addArgument","opt","addOption","handleDefaultArgsAndOpts","args","command","pop","options","i","v","entries","_args","length","Object","keys","handler","k"],"sources":["cli/FrodoCommand.ts"],"sourcesContent":["import { Argument, Command, Option } from 'commander';\nimport * as globalConfig from '../storage/StaticStorage';\nimport { state } from '@rockcarver/frodo-lib';\nimport fs from 'fs';\nimport {\n printMessage,\n createProgressIndicator,\n updateProgressIndicator,\n stopProgressIndicator,\n verboseMessage,\n debugMessage,\n curlirizeMessage,\n} from '../utils/Console.js';\n\nconst hostArgument = new Argument(\n '[host]',\n 'Access Management base URL, e.g.: https://cdk.iam.example.com/am. To use a connection profile, just specify a unique substring.'\n);\n\nconst realmArgument = new Argument(\n '[realm]',\n \"Realm. Specify realm as '/' for the root realm or 'realm' or '/parent/child' otherwise.\"\n).default(\n // must check for FRODO_REALM env variable here because otherwise cli will overwrite realm with default value\n process.env.FRODO_REALM || globalConfig.DEFAULT_REALM_KEY,\n '\"alpha\" for Identity Cloud tenants, \"/\" otherwise.'\n);\n\nconst usernameArgument = new Argument(\n '[username]',\n 'Username to login with. Must be an admin user with appropriate rights to manage authentication journeys/trees.'\n);\n\nconst passwordArgument = new Argument('[password]', 'Password.');\n\nconst serviceAccountIdOption = new Option(\n '--sa-id <sa-id>',\n 'Service account id.'\n);\n\nconst serviceAccountJwkFileOption = new Option(\n '--sa-jwk-file <file>',\n 'File containing the JSON Web Key (JWK) associated with the the service account.'\n);\n\nconst deploymentOption = new Option(\n '-m, --type <type>',\n 'Override auto-detected deployment type. Valid values for type: \\n\\\nclassic: A classic Access Management-only deployment with custom layout and configuration. \\n\\\ncloud: A ForgeRock Identity Cloud environment. \\n\\\nforgeops: A ForgeOps CDK or CDM deployment. \\n\\\nThe detected or provided deployment type controls certain behavior like obtaining an Identity \\\nManagement admin token or not and whether to export/import referenced email templates or how \\\nto walk through the tenant admin login flow of Identity Cloud and handle MFA'\n).choices(globalConfig.DEPLOYMENT_TYPES);\n\nconst insecureOption = new Option(\n '-k, --insecure',\n 'Allow insecure connections when using SSL/TLS. Has no effect when using a network proxy for https (HTTPS_PROXY=http://<host>:<port>), in that case the proxy must provide this capability.'\n).default(false, \"Don't allow insecure connections\");\n\nconst verboseOption = new Option(\n '--verbose',\n 'Verbose output during command execution. If specified, may or may not produce additional output.'\n);\n\nconst debugOption = new Option(\n '--debug',\n 'Debug output during command execution. If specified, may or may not produce additional output helpful for troubleshooting.'\n);\n\nconst curlirizeOption = new Option(\n '--curlirize',\n 'Output all network calls in curl format.'\n);\n\nconst defaultArgs = [\n hostArgument,\n realmArgument,\n usernameArgument,\n passwordArgument,\n];\n\nconst defaultOpts = [\n serviceAccountIdOption,\n serviceAccountJwkFileOption,\n deploymentOption,\n insecureOption,\n verboseOption,\n debugOption,\n curlirizeOption,\n];\n\nconst stateMap = {\n [hostArgument.name()]: state.setHost,\n [realmArgument.name()]: state.setRealm,\n [usernameArgument.name()]: state.setUsername,\n [passwordArgument.name()]: state.setPassword,\n [serviceAccountIdOption.attributeName()]: state.setServiceAccountId,\n [serviceAccountJwkFileOption.attributeName()]: (file) => {\n try {\n const data = fs.readFileSync(file);\n const jwk = JSON.parse(data.toString());\n state.setServiceAccountJwk(jwk);\n } catch (error) {\n printMessage(\n `Error parsing JWK from file ${file}: ${error.message}`,\n 'error'\n );\n }\n },\n [deploymentOption.attributeName()]: state.setDeploymentType,\n [insecureOption.attributeName()]: state.setAllowInsecureConnection,\n [verboseOption.attributeName()]: state.setVerbose,\n [debugOption.attributeName()]: state.setDebug,\n [curlirizeOption.attributeName()]: state.setCurlirize,\n};\n\n/**\n * Command with default options\n */\nexport class FrodoStubCommand extends Command {\n /**\n * Creates a new FrodoCommand instance\n * @param name Name of the command\n * @param omits Array of default argument names and default option names that should not be added to this command\n */\n constructor(name: string) {\n super(name);\n\n // other default settings\n this.helpOption('-h, --help', 'Help');\n this.showHelpAfterError();\n this.configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n });\n\n // register default handlers\n state.setPrintHandler(printMessage);\n state.setVerboseHandler(verboseMessage);\n state.setDebugHandler(debugMessage);\n state.setCurlirizeHandler(curlirizeMessage);\n state.setCreateProgressHandler(createProgressIndicator);\n state.setUpdateProgressHandler(updateProgressIndicator);\n state.setStopProgressHandler(stopProgressIndicator);\n }\n}\n\n/**\n * Command with default options\n */\nexport class FrodoCommand extends FrodoStubCommand {\n /**\n * Creates a new FrodoCommand instance\n * @param name Name of the command\n * @param omits Array of default argument names and default option names that should not be added to this command\n */\n constructor(name: string, omits: string[] = []) {\n super(name);\n\n // register default arguments\n for (const arg of defaultArgs) {\n if (!omits.includes(arg.name())) this.addArgument(arg);\n }\n\n // register default options\n for (const opt of defaultOpts) {\n if (!omits.includes(opt.name())) this.addOption(opt);\n }\n }\n\n /**\n *\n * @param args\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handleDefaultArgsAndOpts(...args: any) {\n const command = args.pop();\n const options = args.pop();\n\n // handle arguments first\n for (const [i, v] of command.args.entries()) {\n if (!command._args[i]) {\n printMessage(\n `${command.args.length} arguments supplied but command only supports ${command._args.length}.`,\n 'warn'\n );\n break;\n }\n const arg = command._args[i].name();\n // handle only default arguments\n if (Object.keys(stateMap).includes(arg)) {\n debugMessage(\n `FrodoCommand.handleDefaultArgsAndOpts: Handling default argument '${arg}'.`\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: any = stateMap[arg];\n handler(v);\n } else {\n debugMessage(\n `FrodoCommand.handleDefaultArgsAndOpts: Ignoring non-default argument '${arg}'.`\n );\n }\n }\n\n // handle options\n for (const [k, v] of Object.entries(options)) {\n // handle only default options\n if (Object.keys(stateMap).includes(k)) {\n debugMessage(\n `FrodoCommand.handleDefaultArgsAndOpts: Handling default option '${k}'.`\n );\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler: any = stateMap[k];\n handler(v);\n } else {\n debugMessage(\n `FrodoCommand.handleDefaultArgsAndOpts: Ignoring non-default option '${k}'.`\n );\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import fs from 'fs';
2
2
  import { FrodoCommand } from '../FrodoCommand';
3
3
  import { Option } from 'commander';
4
- import { Authenticate, ExportImportUtils, Journey, state } from '@rockcarver/frodo-lib';
4
+ import { Authenticate, Journey, state } from '@rockcarver/frodo-lib';
5
5
  import { describeJourney, describeJourneyMd } from '../../ops/JourneyOps';
6
6
  import { printMessage, verboseMessage } from '../../utils/Console';
7
+ import { saveTextToFile } from '../../utils/ExportImportUtils';
7
8
  const {
8
9
  getTokens
9
10
  } = Authenticate;
@@ -12,9 +13,6 @@ const {
12
13
  exportJourney,
13
14
  createFileParamTreeExportResolver
14
15
  } = Journey;
15
- const {
16
- saveTextToFile
17
- } = ExportImportUtils;
18
16
  const program = new FrodoCommand('frodo journey describe');
19
17
  program.description('If -h is supplied, describe the journey/tree indicated by -i, or all journeys/trees in the realm if no -i is supplied, otherwise describe the journey/tree export file indicated by -f.').addOption(new Option('-i, --journey-id <journey>', 'Name of a journey/tree. If specified, -a and -A are ignored.')).addOption(new Option('-f, --file <file>', 'Name of the journey export file to describe. Ignored with -A.')).addOption(new Option('-F, --output-file <file>', 'Name of the file to write the output to.')).addOption(new Option('--markdown', 'Output in markdown.')).addOption(new Option('-o, --override-version <version>', "Override version. Notation: '<major>.<minor>.<patch>' e.g. '7.2.0'. Override detected version with any version. This is helpful in order to check if journeys in one environment would be compatible running in another environment (e.g. in preparation of migrating from on-prem to ForgeRock Identity Cloud.")).action(
20
18
  // implement command logic inside action handler
@@ -1 +1 @@
1
- {"version":3,"file":"journey-describe.js","names":["fs","FrodoCommand","Option","Authenticate","ExportImportUtils","Journey","state","describeJourney","describeJourneyMd","printMessage","verboseMessage","getTokens","getJourneys","exportJourney","createFileParamTreeExportResolver","saveTextToFile","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","outputFile","setOutputFile","file","process","exitCode","overrideVersion","setAmVersion","fileData","JSON","parse","readFileSync","journeyData","journeyId","trees","Object","values","tree","_id","Error","markdown","error","message","getRealm","journeys","journey","treeData"],"sources":["cli/journey/journey-describe.ts"],"sourcesContent":["import fs from 'fs';\nimport { FrodoCommand } from '../FrodoCommand';\nimport { Option } from 'commander';\nimport {\n Authenticate,\n ExportImportUtils,\n Journey,\n state,\n} from '@rockcarver/frodo-lib';\nimport { describeJourney, describeJourneyMd } from '../../ops/JourneyOps';\nimport { printMessage, verboseMessage } from '../../utils/Console';\n\nconst { getTokens } = Authenticate;\nconst { getJourneys, exportJourney, createFileParamTreeExportResolver } =\n Journey;\nconst { saveTextToFile } = ExportImportUtils;\n\nconst program = new FrodoCommand('frodo journey describe');\n\nprogram\n .description(\n 'If -h is supplied, describe the journey/tree indicated by -i, or all journeys/trees in the realm if no -i is supplied, otherwise describe the journey/tree export file indicated by -f.'\n )\n .addOption(\n new Option(\n '-i, --journey-id <journey>',\n 'Name of a journey/tree. If specified, -a and -A are ignored.'\n )\n )\n .addOption(\n new Option(\n '-f, --file <file>',\n 'Name of the journey export file to describe. Ignored with -A.'\n )\n )\n .addOption(\n new Option(\n '-F, --output-file <file>',\n 'Name of the file to write the output to.'\n )\n )\n .addOption(new Option('--markdown', 'Output in markdown.'))\n .addOption(\n new Option(\n '-o, --override-version <version>',\n \"Override version. Notation: '<major>.<minor>.<patch>' e.g. '7.2.0'. Override detected version with any version. This is helpful in order to check if journeys in one environment would be compatible running in another environment (e.g. in preparation of migrating from on-prem to ForgeRock Identity Cloud.\"\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (options.outputFile) state.setOutputFile(options.outputFile);\n // TODO: review checks for arguments\n if (typeof host === 'undefined' || typeof options.file !== 'undefined') {\n if (\n typeof host === 'undefined' &&\n typeof options.file === 'undefined'\n ) {\n printMessage('Need either [host] or -f.', 'error');\n process.exitCode = 1;\n return;\n }\n verboseMessage(`Describing local journey file ${options.file}...`);\n try {\n // override version\n if (typeof options.overrideVersion !== 'undefined') {\n state.setAmVersion(options.overrideVersion);\n }\n const fileData = JSON.parse(fs.readFileSync(options.file, 'utf8'));\n let journeyData;\n // single or multi tree export?\n // multi - by id\n if (\n typeof options.journeyId !== 'undefined' &&\n fileData.trees &&\n fileData.trees[options.journeyId]\n ) {\n journeyData = fileData.trees[options.journeyId];\n }\n // multi - first\n else if (typeof options.journeyId === 'undefined' && fileData.trees) {\n [journeyData] = Object.values(fileData.trees);\n }\n // single - by id\n else if (\n typeof options.journeyId !== 'undefined' &&\n options.journeyId === fileData.tree?._id\n ) {\n journeyData = fileData;\n }\n // single\n else if (\n typeof options.journeyId === 'undefined' &&\n fileData.tree?._id\n ) {\n journeyData = fileData;\n }\n // no journey/tree found\n else {\n throw new Error(\n typeof options.journeyId === 'undefined'\n ? `No journey found in ${options.file}`\n : `Journey '${options.journeyId}' not found in ${options.file}`\n );\n }\n // ANSI text output\n if (!options.markdown) {\n await describeJourney(\n journeyData,\n createFileParamTreeExportResolver(options.file)\n );\n }\n // Markdown output\n else {\n // reset output file\n if (options.outputFile) saveTextToFile('', options.outputFile);\n await describeJourneyMd(\n journeyData,\n createFileParamTreeExportResolver(options.file)\n );\n }\n } catch (error) {\n printMessage(error.message, 'error');\n process.exitCode = 1;\n }\n } else if (await getTokens()) {\n verboseMessage(\n `Describing journey(s) in realm \"${state.getRealm()}\"...`\n );\n // override version\n if (typeof options.overrideVersion !== 'undefined') {\n state.setAmVersion(options.overrideVersion);\n }\n if (typeof options.journeyId === 'undefined') {\n let journeys = [];\n journeys = await getJourneys();\n for (const journey of journeys) {\n try {\n // eslint-disable-next-line no-await-in-loop, dot-notation\n const treeData = await exportJourney(journey['_id']);\n // ANSI text output\n if (!options.markdown) {\n await describeJourney(treeData);\n }\n // Markdown output\n else {\n // reset output file\n if (options.outputFile) saveTextToFile('', options.outputFile);\n await describeJourneyMd(treeData);\n }\n } catch (error) {\n printMessage(error.message, 'error');\n process.exitCode = 1;\n }\n }\n } else {\n try {\n const treeData = await exportJourney(options.journeyId);\n // ANSI text output\n if (!options.markdown) {\n await describeJourney(treeData);\n }\n // Markdown output\n else {\n // reset output file\n if (options.outputFile) saveTextToFile('', options.outputFile);\n await describeJourneyMd(treeData);\n }\n } catch (error) {\n printMessage(error.message, 'error');\n process.exitCode = 1;\n }\n }\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"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"}
1
+ {"version":3,"file":"journey-describe.js","names":["fs","FrodoCommand","Option","Authenticate","Journey","state","describeJourney","describeJourneyMd","printMessage","verboseMessage","saveTextToFile","getTokens","getJourneys","exportJourney","createFileParamTreeExportResolver","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","outputFile","setOutputFile","file","process","exitCode","overrideVersion","setAmVersion","fileData","JSON","parse","readFileSync","journeyData","journeyId","trees","Object","values","tree","_id","Error","markdown","error","message","getRealm","journeys","journey","treeData"],"sources":["cli/journey/journey-describe.ts"],"sourcesContent":["import fs from 'fs';\nimport { FrodoCommand } from '../FrodoCommand';\nimport { Option } from 'commander';\nimport { Authenticate, Journey, state } from '@rockcarver/frodo-lib';\nimport { describeJourney, describeJourneyMd } from '../../ops/JourneyOps';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { saveTextToFile } from '../../utils/ExportImportUtils';\n\nconst { getTokens } = Authenticate;\nconst { getJourneys, exportJourney, createFileParamTreeExportResolver } =\n Journey;\n\nconst program = new FrodoCommand('frodo journey describe');\n\nprogram\n .description(\n 'If -h is supplied, describe the journey/tree indicated by -i, or all journeys/trees in the realm if no -i is supplied, otherwise describe the journey/tree export file indicated by -f.'\n )\n .addOption(\n new Option(\n '-i, --journey-id <journey>',\n 'Name of a journey/tree. If specified, -a and -A are ignored.'\n )\n )\n .addOption(\n new Option(\n '-f, --file <file>',\n 'Name of the journey export file to describe. Ignored with -A.'\n )\n )\n .addOption(\n new Option(\n '-F, --output-file <file>',\n 'Name of the file to write the output to.'\n )\n )\n .addOption(new Option('--markdown', 'Output in markdown.'))\n .addOption(\n new Option(\n '-o, --override-version <version>',\n \"Override version. Notation: '<major>.<minor>.<patch>' e.g. '7.2.0'. Override detected version with any version. This is helpful in order to check if journeys in one environment would be compatible running in another environment (e.g. in preparation of migrating from on-prem to ForgeRock Identity Cloud.\"\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (options.outputFile) state.setOutputFile(options.outputFile);\n // TODO: review checks for arguments\n if (typeof host === 'undefined' || typeof options.file !== 'undefined') {\n if (\n typeof host === 'undefined' &&\n typeof options.file === 'undefined'\n ) {\n printMessage('Need either [host] or -f.', 'error');\n process.exitCode = 1;\n return;\n }\n verboseMessage(`Describing local journey file ${options.file}...`);\n try {\n // override version\n if (typeof options.overrideVersion !== 'undefined') {\n state.setAmVersion(options.overrideVersion);\n }\n const fileData = JSON.parse(fs.readFileSync(options.file, 'utf8'));\n let journeyData;\n // single or multi tree export?\n // multi - by id\n if (\n typeof options.journeyId !== 'undefined' &&\n fileData.trees &&\n fileData.trees[options.journeyId]\n ) {\n journeyData = fileData.trees[options.journeyId];\n }\n // multi - first\n else if (typeof options.journeyId === 'undefined' && fileData.trees) {\n [journeyData] = Object.values(fileData.trees);\n }\n // single - by id\n else if (\n typeof options.journeyId !== 'undefined' &&\n options.journeyId === fileData.tree?._id\n ) {\n journeyData = fileData;\n }\n // single\n else if (\n typeof options.journeyId === 'undefined' &&\n fileData.tree?._id\n ) {\n journeyData = fileData;\n }\n // no journey/tree found\n else {\n throw new Error(\n typeof options.journeyId === 'undefined'\n ? `No journey found in ${options.file}`\n : `Journey '${options.journeyId}' not found in ${options.file}`\n );\n }\n // ANSI text output\n if (!options.markdown) {\n await describeJourney(\n journeyData,\n createFileParamTreeExportResolver(options.file)\n );\n }\n // Markdown output\n else {\n // reset output file\n if (options.outputFile) saveTextToFile('', options.outputFile);\n await describeJourneyMd(\n journeyData,\n createFileParamTreeExportResolver(options.file)\n );\n }\n } catch (error) {\n printMessage(error.message, 'error');\n process.exitCode = 1;\n }\n } else if (await getTokens()) {\n verboseMessage(\n `Describing journey(s) in realm \"${state.getRealm()}\"...`\n );\n // override version\n if (typeof options.overrideVersion !== 'undefined') {\n state.setAmVersion(options.overrideVersion);\n }\n if (typeof options.journeyId === 'undefined') {\n let journeys = [];\n journeys = await getJourneys();\n for (const journey of journeys) {\n try {\n // eslint-disable-next-line no-await-in-loop, dot-notation\n const treeData = await exportJourney(journey['_id']);\n // ANSI text output\n if (!options.markdown) {\n await describeJourney(treeData);\n }\n // Markdown output\n else {\n // reset output file\n if (options.outputFile) saveTextToFile('', options.outputFile);\n await describeJourneyMd(treeData);\n }\n } catch (error) {\n printMessage(error.message, 'error');\n process.exitCode = 1;\n }\n }\n } else {\n try {\n const treeData = await exportJourney(options.journeyId);\n // ANSI text output\n if (!options.markdown) {\n await describeJourney(treeData);\n }\n // Markdown output\n else {\n // reset output file\n if (options.outputFile) saveTextToFile('', options.outputFile);\n await describeJourneyMd(treeData);\n }\n } catch (error) {\n printMessage(error.message, 'error');\n process.exitCode = 1;\n }\n }\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { FrodoCommand } from '../FrodoCommand';
2
2
  import { Option } from 'commander';
3
3
  import { Authenticate } from '@rockcarver/frodo-lib';
4
4
  import { printMessage, verboseMessage } from '../../utils/Console';
5
- import { exportScriptByNameToFile, exportScriptsToFile, exportScriptsToFiles } from '../../ops/ScriptOps';
5
+ import { exportScriptByNameToFile, exportScriptsToFile, exportScriptsToFiles, exportScriptsToFilesExtract } from '../../ops/ScriptOps';
6
6
  const {
7
7
  getTokens
8
8
  } = Authenticate;
@@ -14,27 +14,40 @@ program.description('Export scripts.').addOption(new Option('-n, --script-name <
14
14
  // 'Uuid of the script. If specified, -a and -A are ignored.'
15
15
  // )
16
16
  // )
17
- .addOption(new Option('-f, --file <file>', 'Name of the export file.')).addOption(new Option('-a, --all', 'Export all scripts to a single file. Ignored with -i.')).addOption(new Option('-A, --all-separate', 'Export all scripts to separate files (*.script.json) in the current directory. Ignored with -i or -a.'))
17
+ .addOption(new Option('-f, --file <file>', 'Name of the export file.')).addOption(new Option('-a, --all', 'Export all scripts to a single file. Ignored with -n.')).addOption(new Option('-A, --all-separate', 'Export all scripts to separate files (*.script.json) in the current directory. Ignored with -n or -a.'))
18
18
  // deprecated option
19
- .addOption(new Option('-s, --script <script>', 'DEPRECATED! Use -n/--script-name instead. Name of the script.')).action(
19
+ .addOption(new Option('-s, --script <script>', 'DEPRECATED! Use -n/--script-name instead. Name of the script.')).addOption(new Option('-x, --extract', 'Extract the script from the exported file, and save it to a separate file. Ignored with -n or -a.')).action(
20
20
  // implement command logic inside action handler
21
21
  async (host, realm, user, password, options, command) => {
22
22
  command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
23
+ const tokens = await getTokens();
24
+ if (!tokens) {
25
+ printMessage('Unable to get tokens. Exiting...', 'error');
26
+ program.help();
27
+ process.exitCode = 1;
28
+ return;
29
+ }
23
30
  // export by name
24
- if ((options.scriptName || options.script) && (await getTokens())) {
31
+ if (options.scriptName || options.script) {
25
32
  verboseMessage('Exporting script...');
26
33
  await exportScriptByNameToFile(options.scriptName || options.script, options.file);
27
34
  }
28
35
  // -a / --all
29
- else if (options.all && (await getTokens())) {
36
+ else if (options.all) {
30
37
  verboseMessage('Exporting all scripts to a single file...');
31
38
  await exportScriptsToFile(options.file);
32
39
  }
33
40
  // -A / --all-separate
34
- else if (options.allSeparate && (await getTokens())) {
41
+ else if (options.allSeparate) {
35
42
  verboseMessage('Exporting all scripts to separate files...');
36
- await exportScriptsToFiles();
43
+ // -x / --extract
44
+ if (options.extract) {
45
+ await exportScriptsToFilesExtract();
46
+ } else {
47
+ await exportScriptsToFiles();
48
+ }
37
49
  }
50
+
38
51
  // unrecognized combination of options or no options
39
52
  else {
40
53
  printMessage('Unrecognized combination of options or no options...', 'error');
@@ -1 +1 @@
1
- {"version":3,"file":"script-export.js","names":["FrodoCommand","Option","Authenticate","printMessage","verboseMessage","exportScriptByNameToFile","exportScriptsToFile","exportScriptsToFiles","getTokens","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","scriptName","script","file","all","allSeparate","help","process","exitCode","parse"],"sources":["cli/script/script-export.ts"],"sourcesContent":["import { FrodoCommand } from '../FrodoCommand';\nimport { Option } from 'commander';\nimport { Authenticate } from '@rockcarver/frodo-lib';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport {\n exportScriptByNameToFile,\n exportScriptsToFile,\n exportScriptsToFiles,\n} from '../../ops/ScriptOps';\n\nconst { getTokens } = Authenticate;\n\nconst program = new FrodoCommand('frodo script export');\n\nprogram\n .description('Export scripts.')\n .addOption(\n new Option(\n '-n, --script-name <name>',\n 'Name of the script. If specified, -a and -A are ignored.'\n )\n )\n // .addOption(\n // new Option(\n // '-i, --script-id <uuid>',\n // 'Uuid of the script. If specified, -a and -A are ignored.'\n // )\n // )\n .addOption(new Option('-f, --file <file>', 'Name of the export file.'))\n .addOption(\n new Option(\n '-a, --all',\n 'Export all scripts to a single file. Ignored with -i.'\n )\n )\n .addOption(\n new Option(\n '-A, --all-separate',\n 'Export all scripts to separate files (*.script.json) in the current directory. Ignored with -i or -a.'\n )\n )\n // deprecated option\n .addOption(\n new Option(\n '-s, --script <script>',\n 'DEPRECATED! Use -n/--script-name instead. Name of the script.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n // export by name\n if ((options.scriptName || options.script) && (await getTokens())) {\n verboseMessage('Exporting script...');\n await exportScriptByNameToFile(\n options.scriptName || options.script,\n options.file\n );\n }\n // -a / --all\n else if (options.all && (await getTokens())) {\n verboseMessage('Exporting all scripts to a single file...');\n await exportScriptsToFile(options.file);\n }\n // -A / --all-separate\n else if (options.allSeparate && (await getTokens())) {\n verboseMessage('Exporting all scripts to separate files...');\n await exportScriptsToFiles();\n }\n // unrecognized combination of options or no options\n else {\n printMessage(\n 'Unrecognized combination of options or no options...',\n 'error'\n );\n program.help();\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,MAAM,QAAQ,WAAW;AAClC,SAASC,YAAY,QAAQ,uBAAuB;AACpD,SAASC,YAAY,EAAEC,cAAc,QAAQ,qBAAqB;AAClE,SACEC,wBAAwB,EACxBC,mBAAmB,EACnBC,oBAAoB,QACf,qBAAqB;AAE5B,MAAM;EAAEC;AAAU,CAAC,GAAGN,YAAY;AAElC,MAAMO,OAAO,GAAG,IAAIT,YAAY,CAAC,qBAAqB,CAAC;AAEvDS,OAAO,CACJC,WAAW,CAAC,iBAAiB,CAAC,CAC9BC,SAAS,CACR,IAAIV,MAAM,CACR,0BAA0B,EAC1B,0DAA0D,CAC3D;AAEH;AACA;AACA;AACA;AACA;AACA;AAAA,CACCU,SAAS,CAAC,IAAIV,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,CAAC,CAAC,CACtEU,SAAS,CACR,IAAIV,MAAM,CACR,WAAW,EACX,uDAAuD,CACxD,CACF,CACAU,SAAS,CACR,IAAIV,MAAM,CACR,oBAAoB,EACpB,uGAAuG,CACxG;AAEH;AAAA,CACCU,SAAS,CACR,IAAIV,MAAM,CACR,uBAAuB,EACvB,+DAA+D,CAChE,CACF,CACAW,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OAAO,CACR;EACD;EACA,IAAI,CAACD,OAAO,CAACG,UAAU,IAAIH,OAAO,CAACI,MAAM,MAAM,MAAMb,SAAS,EAAE,CAAC,EAAE;IACjEJ,cAAc,CAAC,qBAAqB,CAAC;IACrC,MAAMC,wBAAwB,CAC5BY,OAAO,CAACG,UAAU,IAAIH,OAAO,CAACI,MAAM,EACpCJ,OAAO,CAACK,IAAI,CACb;EACH;EACA;EAAA,KACK,IAAIL,OAAO,CAACM,GAAG,KAAK,MAAMf,SAAS,EAAE,CAAC,EAAE;IAC3CJ,cAAc,CAAC,2CAA2C,CAAC;IAC3D,MAAME,mBAAmB,CAACW,OAAO,CAACK,IAAI,CAAC;EACzC;EACA;EAAA,KACK,IAAIL,OAAO,CAACO,WAAW,KAAK,MAAMhB,SAAS,EAAE,CAAC,EAAE;IACnDJ,cAAc,CAAC,4CAA4C,CAAC;IAC5D,MAAMG,oBAAoB,EAAE;EAC9B;EACA;EAAA,KACK;IACHJ,YAAY,CACV,sDAAsD,EACtD,OAAO,CACR;IACDM,OAAO,CAACgB,IAAI,EAAE;IACdC,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AAAA,CACD;;AAEHlB,OAAO,CAACmB,KAAK,EAAE"}
1
+ {"version":3,"file":"script-export.js","names":["FrodoCommand","Option","Authenticate","printMessage","verboseMessage","exportScriptByNameToFile","exportScriptsToFile","exportScriptsToFiles","exportScriptsToFilesExtract","getTokens","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","tokens","help","process","exitCode","scriptName","script","file","all","allSeparate","extract","parse"],"sources":["cli/script/script-export.ts"],"sourcesContent":["import { FrodoCommand } from '../FrodoCommand';\nimport { Option } from 'commander';\nimport { Authenticate } from '@rockcarver/frodo-lib';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport {\n exportScriptByNameToFile,\n exportScriptsToFile,\n exportScriptsToFiles,\n exportScriptsToFilesExtract,\n} from '../../ops/ScriptOps';\n\nconst { getTokens } = Authenticate;\n\nconst program = new FrodoCommand('frodo script export');\n\nprogram\n .description('Export scripts.')\n .addOption(\n new Option(\n '-n, --script-name <name>',\n 'Name of the script. If specified, -a and -A are ignored.'\n )\n )\n // .addOption(\n // new Option(\n // '-i, --script-id <uuid>',\n // 'Uuid of the script. If specified, -a and -A are ignored.'\n // )\n // )\n .addOption(new Option('-f, --file <file>', 'Name of the export file.'))\n .addOption(\n new Option(\n '-a, --all',\n 'Export all scripts to a single file. Ignored with -n.'\n )\n )\n .addOption(\n new Option(\n '-A, --all-separate',\n 'Export all scripts to separate files (*.script.json) in the current directory. Ignored with -n or -a.'\n )\n )\n // deprecated option\n .addOption(\n new Option(\n '-s, --script <script>',\n 'DEPRECATED! Use -n/--script-name instead. Name of the script.'\n )\n )\n .addOption(\n new Option(\n '-x, --extract',\n 'Extract the script from the exported file, and save it to a separate file. Ignored with -n or -a.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n const tokens = await getTokens();\n if (!tokens) {\n printMessage('Unable to get tokens. Exiting...', 'error');\n program.help();\n process.exitCode = 1;\n return;\n }\n // export by name\n if (options.scriptName || options.script) {\n verboseMessage('Exporting script...');\n await exportScriptByNameToFile(\n options.scriptName || options.script,\n options.file\n );\n }\n // -a / --all\n else if (options.all) {\n verboseMessage('Exporting all scripts to a single file...');\n await exportScriptsToFile(options.file);\n }\n // -A / --all-separate\n else if (options.allSeparate) {\n verboseMessage('Exporting all scripts to separate files...');\n // -x / --extract\n if (options.extract) {\n await exportScriptsToFilesExtract();\n } else {\n await exportScriptsToFiles();\n }\n }\n\n // unrecognized combination of options or no options\n else {\n printMessage(\n 'Unrecognized combination of options or no options...',\n 'error'\n );\n program.help();\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,MAAM,QAAQ,WAAW;AAClC,SAASC,YAAY,QAAQ,uBAAuB;AACpD,SAASC,YAAY,EAAEC,cAAc,QAAQ,qBAAqB;AAClE,SACEC,wBAAwB,EACxBC,mBAAmB,EACnBC,oBAAoB,EACpBC,2BAA2B,QACtB,qBAAqB;AAE5B,MAAM;EAAEC;AAAU,CAAC,GAAGP,YAAY;AAElC,MAAMQ,OAAO,GAAG,IAAIV,YAAY,CAAC,qBAAqB,CAAC;AAEvDU,OAAO,CACJC,WAAW,CAAC,iBAAiB,CAAC,CAC9BC,SAAS,CACR,IAAIX,MAAM,CACR,0BAA0B,EAC1B,0DAA0D,CAC3D;AAEH;AACA;AACA;AACA;AACA;AACA;AAAA,CACCW,SAAS,CAAC,IAAIX,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,CAAC,CAAC,CACtEW,SAAS,CACR,IAAIX,MAAM,CACR,WAAW,EACX,uDAAuD,CACxD,CACF,CACAW,SAAS,CACR,IAAIX,MAAM,CACR,oBAAoB,EACpB,uGAAuG,CACxG;AAEH;AAAA,CACCW,SAAS,CACR,IAAIX,MAAM,CACR,uBAAuB,EACvB,+DAA+D,CAChE,CACF,CACAW,SAAS,CACR,IAAIX,MAAM,CACR,eAAe,EACf,mGAAmG,CACpG,CACF,CACAY,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OAAO,CACR;EACD,MAAME,MAAM,GAAG,MAAMZ,SAAS,EAAE;EAChC,IAAI,CAACY,MAAM,EAAE;IACXlB,YAAY,CAAC,kCAAkC,EAAE,OAAO,CAAC;IACzDO,OAAO,CAACY,IAAI,EAAE;IACdC,OAAO,CAACC,QAAQ,GAAG,CAAC;IACpB;EACF;EACA;EACA,IAAIN,OAAO,CAACO,UAAU,IAAIP,OAAO,CAACQ,MAAM,EAAE;IACxCtB,cAAc,CAAC,qBAAqB,CAAC;IACrC,MAAMC,wBAAwB,CAC5Ba,OAAO,CAACO,UAAU,IAAIP,OAAO,CAACQ,MAAM,EACpCR,OAAO,CAACS,IAAI,CACb;EACH;EACA;EAAA,KACK,IAAIT,OAAO,CAACU,GAAG,EAAE;IACpBxB,cAAc,CAAC,2CAA2C,CAAC;IAC3D,MAAME,mBAAmB,CAACY,OAAO,CAACS,IAAI,CAAC;EACzC;EACA;EAAA,KACK,IAAIT,OAAO,CAACW,WAAW,EAAE;IAC5BzB,cAAc,CAAC,4CAA4C,CAAC;IAC5D;IACA,IAAIc,OAAO,CAACY,OAAO,EAAE;MACnB,MAAMtB,2BAA2B,EAAE;IACrC,CAAC,MAAM;MACL,MAAMD,oBAAoB,EAAE;IAC9B;EACF;;EAEA;EAAA,KACK;IACHJ,YAAY,CACV,sDAAsD,EACtD,OAAO,CACR;IACDO,OAAO,CAACY,IAAI,EAAE;IACdC,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AAAA,CACD;;AAEHd,OAAO,CAACqB,KAAK,EAAE"}
@@ -1,23 +1,30 @@
1
1
  import { FrodoCommand } from '../FrodoCommand';
2
2
  import { Option } from 'commander';
3
3
  import { Authenticate, state } from '@rockcarver/frodo-lib';
4
- import { verboseMessage } from '../../utils/Console';
5
- import { importScriptsFromFile } from '../../ops/ScriptOps';
4
+ import { printMessage, verboseMessage } from '../../utils/Console';
5
+ import { importScriptsFromFile, importScriptsFromFiles } from '../../ops/ScriptOps';
6
6
  const {
7
7
  getTokens
8
8
  } = Authenticate;
9
9
  const program = new FrodoCommand('frodo script import');
10
10
  program.description('Import scripts.').addOption(new Option('-f, --file <file>', 'Name of the file to import.')).addOption(new Option('-n, --script-name <name>', 'Name of the script. If specified, -a and -A are ignored.')).addOption(new Option('--re-uuid', 'Re-UUID. Create a new UUID for the script upon import. Use this to duplicate a script or create a new version of the same script. Note that you must also choose a new name using -n/--script-name to avoid import errors.').default(false, 'false'))
11
11
  // deprecated option
12
- .addOption(new Option('-s, --script <script>', 'DEPRECATED! Use -n/--script-name instead. Name of the script.')).action(
12
+ .addOption(new Option('-s, --script <script>', 'DEPRECATED! Use -n/--script-name instead. Name of the script.')).addOption(new Option('-A, --all-separate', 'Import all scripts from separate files (*.script.json) in the current directory. Ignored with -n.')).addOption(new Option('-w, --watch', 'Watch for changes to the script files and import the scripts automatically when the file changes. Can only be used with -A.').default(false, 'false')).action(
13
13
  // implement command logic inside action handler
14
14
  async (host, realm, user, password, options, command) => {
15
15
  command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
16
- if (await getTokens()) {
17
- verboseMessage(`Importing script(s) into realm "${state.getRealm()}"...`);
18
- importScriptsFromFile(options.scriptName || options.script, options.file, options.reUuid);
19
- } else {
16
+ const tokens = await getTokens();
17
+ if (!tokens) {
18
+ printMessage('Unable to get tokens. Exiting...', 'error');
19
+ program.help();
20
20
  process.exitCode = 1;
21
+ return;
22
+ }
23
+ verboseMessage(`Importing script(s) into realm "${state.getRealm()}"...`);
24
+ if (options.scriptName) {
25
+ await importScriptsFromFile(options.scriptName || options.script, options.file, options.reUuid);
26
+ } else if (options.allSeparate) {
27
+ await importScriptsFromFiles(options.watch, options.reUuid, true);
21
28
  }
22
29
  }
23
30
  // end command logic inside action handler
@@ -1 +1 @@
1
- {"version":3,"file":"script-import.js","names":["FrodoCommand","Option","Authenticate","state","verboseMessage","importScriptsFromFile","getTokens","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","getRealm","scriptName","script","file","reUuid","process","exitCode","parse"],"sources":["cli/script/script-import.ts"],"sourcesContent":["import { FrodoCommand } from '../FrodoCommand';\nimport { Option } from 'commander';\nimport { Authenticate, state } from '@rockcarver/frodo-lib';\nimport { verboseMessage } from '../../utils/Console';\nimport { importScriptsFromFile } from '../../ops/ScriptOps';\n\nconst { getTokens } = Authenticate;\n\nconst program = new FrodoCommand('frodo script import');\n\nprogram\n .description('Import scripts.')\n .addOption(new Option('-f, --file <file>', 'Name of the file to import.'))\n .addOption(\n new Option(\n '-n, --script-name <name>',\n 'Name of the script. If specified, -a and -A are ignored.'\n )\n )\n .addOption(\n new Option(\n '--re-uuid',\n 'Re-UUID. Create a new UUID for the script upon import. Use this to duplicate a script or create a new version of the same script. Note that you must also choose a new name using -n/--script-name to avoid import errors.'\n ).default(false, 'false')\n )\n // deprecated option\n .addOption(\n new Option(\n '-s, --script <script>',\n 'DEPRECATED! Use -n/--script-name instead. Name of the script.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n verboseMessage(\n `Importing script(s) into realm \"${state.getRealm()}\"...`\n );\n importScriptsFromFile(\n options.scriptName || options.script,\n options.file,\n options.reUuid\n );\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,MAAM,QAAQ,WAAW;AAClC,SAASC,YAAY,EAAEC,KAAK,QAAQ,uBAAuB;AAC3D,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,qBAAqB,QAAQ,qBAAqB;AAE3D,MAAM;EAAEC;AAAU,CAAC,GAAGJ,YAAY;AAElC,MAAMK,OAAO,GAAG,IAAIP,YAAY,CAAC,qBAAqB,CAAC;AAEvDO,OAAO,CACJC,WAAW,CAAC,iBAAiB,CAAC,CAC9BC,SAAS,CAAC,IAAIR,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,CAAC,CACzEQ,SAAS,CACR,IAAIR,MAAM,CACR,0BAA0B,EAC1B,0DAA0D,CAC3D,CACF,CACAQ,SAAS,CACR,IAAIR,MAAM,CACR,WAAW,EACX,4NAA4N,CAC7N,CAACS,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;AAE3B;AAAA,CACCD,SAAS,CACR,IAAIR,MAAM,CACR,uBAAuB,EACvB,+DAA+D,CAChE,CACF,CACAU,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OAAO,CACR;EACD,IAAI,MAAMX,SAAS,EAAE,EAAE;IACrBF,cAAc,CACX,mCAAkCD,KAAK,CAACgB,QAAQ,EAAG,MAAK,CAC1D;IACDd,qBAAqB,CACnBW,OAAO,CAACI,UAAU,IAAIJ,OAAO,CAACK,MAAM,EACpCL,OAAO,CAACM,IAAI,EACZN,OAAO,CAACO,MAAM,CACf;EACH,CAAC,MAAM;IACLC,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AAAA,CACD;;AAEHlB,OAAO,CAACmB,KAAK,EAAE"}
1
+ {"version":3,"file":"script-import.js","names":["FrodoCommand","Option","Authenticate","state","printMessage","verboseMessage","importScriptsFromFile","importScriptsFromFiles","getTokens","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","tokens","help","process","exitCode","getRealm","scriptName","script","file","reUuid","allSeparate","watch","parse"],"sources":["cli/script/script-import.ts"],"sourcesContent":["import { FrodoCommand } from '../FrodoCommand';\nimport { Option } from 'commander';\nimport { Authenticate, state } from '@rockcarver/frodo-lib';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport {\n importScriptsFromFile,\n importScriptsFromFiles,\n} from '../../ops/ScriptOps';\n\nconst { getTokens } = Authenticate;\n\nconst program = new FrodoCommand('frodo script import');\n\nprogram\n .description('Import scripts.')\n .addOption(new Option('-f, --file <file>', 'Name of the file to import.'))\n .addOption(\n new Option(\n '-n, --script-name <name>',\n 'Name of the script. If specified, -a and -A are ignored.'\n )\n )\n .addOption(\n new Option(\n '--re-uuid',\n 'Re-UUID. Create a new UUID for the script upon import. Use this to duplicate a script or create a new version of the same script. Note that you must also choose a new name using -n/--script-name to avoid import errors.'\n ).default(false, 'false')\n )\n // deprecated option\n .addOption(\n new Option(\n '-s, --script <script>',\n 'DEPRECATED! Use -n/--script-name instead. Name of the script.'\n )\n )\n .addOption(\n new Option(\n '-A, --all-separate',\n 'Import all scripts from separate files (*.script.json) in the current directory. Ignored with -n.'\n )\n )\n .addOption(\n new Option(\n '-w, --watch',\n 'Watch for changes to the script files and import the scripts automatically when the file changes. Can only be used with -A.'\n ).default(false, 'false')\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n const tokens = await getTokens();\n if (!tokens) {\n printMessage('Unable to get tokens. Exiting...', 'error');\n program.help();\n process.exitCode = 1;\n return;\n }\n\n verboseMessage(`Importing script(s) into realm \"${state.getRealm()}\"...`);\n\n if (options.scriptName) {\n await importScriptsFromFile(\n options.scriptName || options.script,\n options.file,\n options.reUuid\n );\n } else if (options.allSeparate) {\n await importScriptsFromFiles(options.watch, options.reUuid, true);\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,MAAM,QAAQ,WAAW;AAClC,SAASC,YAAY,EAAEC,KAAK,QAAQ,uBAAuB;AAC3D,SAASC,YAAY,EAAEC,cAAc,QAAQ,qBAAqB;AAClE,SACEC,qBAAqB,EACrBC,sBAAsB,QACjB,qBAAqB;AAE5B,MAAM;EAAEC;AAAU,CAAC,GAAGN,YAAY;AAElC,MAAMO,OAAO,GAAG,IAAIT,YAAY,CAAC,qBAAqB,CAAC;AAEvDS,OAAO,CACJC,WAAW,CAAC,iBAAiB,CAAC,CAC9BC,SAAS,CAAC,IAAIV,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,CAAC,CACzEU,SAAS,CACR,IAAIV,MAAM,CACR,0BAA0B,EAC1B,0DAA0D,CAC3D,CACF,CACAU,SAAS,CACR,IAAIV,MAAM,CACR,WAAW,EACX,4NAA4N,CAC7N,CAACW,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;AAE3B;AAAA,CACCD,SAAS,CACR,IAAIV,MAAM,CACR,uBAAuB,EACvB,+DAA+D,CAChE,CACF,CACAU,SAAS,CACR,IAAIV,MAAM,CACR,oBAAoB,EACpB,mGAAmG,CACpG,CACF,CACAU,SAAS,CACR,IAAIV,MAAM,CACR,aAAa,EACb,6HAA6H,CAC9H,CAACW,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAC1B,CACAC,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OAAO,CACR;EACD,MAAME,MAAM,GAAG,MAAMb,SAAS,EAAE;EAChC,IAAI,CAACa,MAAM,EAAE;IACXjB,YAAY,CAAC,kCAAkC,EAAE,OAAO,CAAC;IACzDK,OAAO,CAACa,IAAI,EAAE;IACdC,OAAO,CAACC,QAAQ,GAAG,CAAC;IACpB;EACF;EAEAnB,cAAc,CAAE,mCAAkCF,KAAK,CAACsB,QAAQ,EAAG,MAAK,CAAC;EAEzE,IAAIP,OAAO,CAACQ,UAAU,EAAE;IACtB,MAAMpB,qBAAqB,CACzBY,OAAO,CAACQ,UAAU,IAAIR,OAAO,CAACS,MAAM,EACpCT,OAAO,CAACU,IAAI,EACZV,OAAO,CAACW,MAAM,CACf;EACH,CAAC,MAAM,IAAIX,OAAO,CAACY,WAAW,EAAE;IAC9B,MAAMvB,sBAAsB,CAACW,OAAO,CAACa,KAAK,EAAEb,OAAO,CAACW,MAAM,EAAE,IAAI,CAAC;EACnE;AACF;AACA;AAAA,CACD;;AAEHpB,OAAO,CAACuB,KAAK,EAAE"}
@@ -2,6 +2,7 @@ import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { Saml2, ExportImportUtils } from '@rockcarver/frodo-lib';
4
4
  import { createObjectTable, createProgressBar, createTable, debugMessage, printMessage, showSpinner, stopProgressBar, stopSpinner, updateProgressBar } from '../utils/Console';
5
+ import { saveTextToFile } from '../utils/ExportImportUtils';
5
6
  const {
6
7
  roleMap,
7
8
  exportSaml2Provider,
@@ -20,7 +21,6 @@ const {
20
21
  const {
21
22
  getTypedFilename,
22
23
  saveJsonToFile,
23
- saveTextToFile,
24
24
  getRealmString,
25
25
  saveToFile,
26
26
  validateImport
@@ -1 +1 @@
1
- {"version":3,"file":"Saml2Ops.js","names":["fs","path","Saml2","ExportImportUtils","createObjectTable","createProgressBar","createTable","debugMessage","printMessage","showSpinner","stopProgressBar","stopSpinner","updateProgressBar","roleMap","exportSaml2Provider","exportSaml2Providers","getSaml2ProviderStubs","getProviderByLocationAndId","getProviderMetadata","getProviderMetadataUrl","getSaml2ProviderStub","getRawSaml2Providers","getRawSaml2Provider","importSaml2Provider","importSaml2Providers","putRawSaml2Provider","getTypedFilename","saveJsonToFile","saveTextToFile","getRealmString","saveToFile","validateImport","getOneLineDescription","saml2ProviderObj","roles","key","value","Object","entries","push","description","entityId","entityLocation","length","join","getTableHeaderMd","markdown","getTableRowMd","row","listSaml2Providers","long","providerList","sort","a","b","_id","localeCompare","provider","table","location","map","role","toString","describeSaml2Provider","stub","id","rawProviderData","_rev","metadataUrl","error","message","exportSaml2MetadataToFile","file","fileName","metaData","brightCyan","exportSaml2ProviderToFile","fileData","err","exportSaml2ProvidersToFile","exportData","response","status","exportSaml2ProvidersToFiles","stubs","importSaml2ProviderFromFile","readFile","data","JSON","parse","meta","importFirstSaml2ProviderFromFile","keys","saml","remote","hosted","importSaml2ProvidersFromFile","importSaml2ProvidersFromFiles","names","readdirSync","jsonFiles","filter","name","toLowerCase","endsWith","totalStatus","total","successes","warnings","failures","readFileSync","myStatus","listRawSaml2Providers","result","exportRawSaml2ProviderToFile","rawData","stringify","exportRawSaml2ProvidersToFile","samlApplicationList","exportRawSaml2ProvidersToFiles","hasError","exportedAmount","item","samlApplicationData","importRawSaml2ProviderFromFile","indexOf","samlEntityData","application","importFirstRawSaml2ProviderFromFile","importRawSaml2ProvidersFromFile","amountOfEntities","then","importRawSaml2ProvidersFromFiles","directory","files","filesToImport","forEach","filePathAbsolute"],"sources":["ops/Saml2Ops.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Saml2ProviderSkeleton } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport { Saml2, ExportImportUtils } from '@rockcarver/frodo-lib';\nimport {\n MultiOpStatusInterface,\n Saml2ExportInterface,\n} from '@rockcarver/frodo-lib/types/ops/OpsTypes';\nimport {\n createObjectTable,\n createProgressBar,\n createTable,\n debugMessage,\n printMessage,\n showSpinner,\n stopProgressBar,\n stopSpinner,\n updateProgressBar,\n} from '../utils/Console';\n\nconst {\n roleMap,\n exportSaml2Provider,\n exportSaml2Providers,\n getSaml2ProviderStubs,\n getProviderByLocationAndId,\n getProviderMetadata,\n getProviderMetadataUrl,\n getSaml2ProviderStub,\n getRawSaml2Providers,\n getRawSaml2Provider,\n importSaml2Provider,\n importSaml2Providers,\n putRawSaml2Provider,\n} = Saml2;\nconst {\n getTypedFilename,\n saveJsonToFile,\n saveTextToFile,\n getRealmString,\n saveToFile,\n validateImport,\n} = ExportImportUtils;\n\n/**\n * Get a one-line description of the saml2 provider object\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n saml2ProviderObj: Saml2ProviderSkeleton\n): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const description = `[${saml2ProviderObj.entityId['brightCyan']}]${\n ' (' + saml2ProviderObj.entityLocation\n }${roles.length ? ' ' + roles.join(', ') + ')' : ')'}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Entity Id | Location | Role(s) |\\n';\n markdown += '| --------- | -------- | ------- |';\n return markdown;\n}\n\n/**\n * Get a table-row of the saml2 provider in markdown\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a table-row of the saml2 provider in markdown\n */\nexport function getTableRowMd(saml2ProviderObj: Saml2ProviderSkeleton): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const row = `| ${saml2ProviderObj.entityId} | ${\n saml2ProviderObj.entityLocation\n } | ${roles.length ? roles.join(', ') : ''} |`;\n return row;\n}\n\n/**\n * List entity providers\n * @param {boolean} long Long list format with details\n */\nexport async function listSaml2Providers(long = false) {\n const providerList = await getSaml2ProviderStubs();\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const provider of providerList) {\n printMessage(`${provider.entityId}`, 'data');\n }\n } else {\n const table = createTable([\n 'Entity Id'['brightCyan'],\n 'Location'['brightCyan'],\n 'Role(s)'['brightCyan'],\n ]);\n for (const provider of providerList) {\n table.push([\n provider.entityId,\n provider.location,\n provider.roles.map((role) => roleMap[role]).join(', '),\n ]);\n }\n printMessage(table.toString());\n }\n}\n\n/**\n * Describe an entity provider's configuration\n * @param {String} entityId Provider entity id\n */\nexport async function describeSaml2Provider(entityId) {\n try {\n const stub = await getSaml2ProviderStub(entityId);\n printMessage(stub);\n const { location } = stub;\n const id = stub._id;\n const roles = stub.roles.map((role: string) => roleMap[role]).join(', ');\n const rawProviderData = await getProviderByLocationAndId(location, id);\n delete rawProviderData._id;\n delete rawProviderData._rev;\n rawProviderData.location = location;\n rawProviderData.roles = roles;\n rawProviderData.metadataUrl = getProviderMetadataUrl(entityId);\n const table = createObjectTable(rawProviderData);\n printMessage(table.toString());\n } catch (error) {\n printMessage(error.message, 'error');\n }\n}\n\n/**\n * Export provider metadata to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2MetadataToFile(entityId, file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'metadata', 'xml');\n }\n createProgressBar(1, `Exporting metadata for: ${entityId}`);\n try {\n updateProgressBar(`Writing file ${fileName}`);\n const metaData = await getProviderMetadata(entityId);\n saveTextToFile(metaData, fileName);\n stopProgressBar(\n `Exported ${entityId.brightCyan} metadata to ${fileName.brightCyan}.`\n );\n } catch (error) {\n stopProgressBar(`${error}`);\n printMessage(error, 'error');\n }\n}\n\n/**\n * Export a single entity provider to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProviderToFile(entityId, file = null) {\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: start [entityId=${entityId}, file=${file}]`\n );\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'saml');\n }\n try {\n createProgressBar(1, `Exporting provider ${entityId}`);\n const fileData = await exportSaml2Provider(entityId);\n saveJsonToFile(fileData, fileName);\n stopProgressBar(\n `Exported ${entityId.brightCyan} to ${fileName.brightCyan}.`\n );\n } catch (err) {\n stopProgressBar(`${err}`);\n printMessage(err, 'error');\n }\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: end [entityId=${entityId}, file=${fileName}]`\n );\n}\n\n/**\n * Export all entity providers to one file\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProvidersToFile(file = null) {\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: start [file=${file}]`);\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Providers`, 'saml');\n }\n try {\n const exportData = await exportSaml2Providers();\n saveJsonToFile(exportData, fileName);\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: end [file=${file}]`);\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportSaml2ProvidersToFiles() {\n const stubs = await getSaml2ProviderStubs();\n if (stubs.length > 0) {\n createProgressBar(stubs.length, 'Exporting providers');\n for (const stub of stubs) {\n updateProgressBar(`Exporting provider ${stub.entityId}`);\n const fileName = getTypedFilename(stub.entityId, 'saml');\n const fileData = await exportSaml2Provider(stub.entityId);\n saveJsonToFile(fileData, fileName);\n }\n stopProgressBar(`${stubs.length} providers exported.`);\n } else {\n printMessage('No entity providers found.', 'info');\n }\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} entityId Provider entity id\n * @param {String} file Import file name\n */\nexport async function importSaml2ProviderFromFile(\n entityId: string,\n file: string\n) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n stopSpinner(`Imported ${entityId}.`);\n } catch (error) {\n stopSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} file Import file name\n */\nexport async function importFirstSaml2ProviderFromFile(file: string) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data) as Saml2ExportInterface;\n // pick the first provider and run with it\n const entityId =\n Object.keys(fileData.saml.remote)[0] ||\n Object.keys(fileData.saml.hosted)[0];\n if (validateImport(fileData.meta)) {\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n stopSpinner(`Imported ${entityId}.`);\n } catch (error) {\n stopSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from file\n * @param {String} file Import file name\n */\nexport async function importSaml2ProvidersFromFile(file: string) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n await importSaml2Providers(fileData);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from all *.saml.json files in the current directory\n */\nexport async function importSaml2ProvidersFromFiles() {\n const names = fs.readdirSync('.');\n const jsonFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.saml.json')\n );\n createProgressBar(jsonFiles.length, 'Importing providers...');\n const totalStatus: MultiOpStatusInterface = {\n total: 0,\n successes: 0,\n warnings: 0,\n failures: 0,\n };\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n const myStatus = await importSaml2Providers(fileData);\n totalStatus.total += myStatus.total;\n totalStatus.successes += myStatus.successes;\n totalStatus.warnings += myStatus.warnings;\n totalStatus.failures += myStatus.failures;\n updateProgressBar(\n `Imported ${myStatus.successes}/${myStatus.total} provider(s) from ${file}.`\n );\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressBar(\n `Imported ${totalStatus.successes} of ${totalStatus.total} provider(s) from ${jsonFiles.length} file(s).`\n );\n}\n\n/**\n * List entity providers\n */\nexport async function listRawSaml2Providers() {\n const providerList = (await getRawSaml2Providers()).result;\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n for (const provider of providerList) {\n printMessage(`${provider._id}`, 'data');\n }\n}\n\n/**\n * Exports a RAW SAML entity, which means the raw xml is included.\n * @param {string} entityId Reference to the entity for export\n * @param {string} file Optional filename for the exported file\n */\nexport async function exportRawSaml2ProviderToFile(entityId, file = null) {\n printMessage(`Exporting raw SAML entity provider ${entityId}`, 'info');\n let fileName = file;\n if (!file) {\n fileName = getTypedFilename(`${entityId}`, 'raw.saml');\n }\n createProgressBar(1, `Exporting raw entity provider: ${entityId}`);\n try {\n const rawData = await getRawSaml2Provider(entityId);\n updateProgressBar(`Writing file ${fileName}`);\n saveTextToFile(JSON.stringify(rawData, null, 2), fileName);\n stopProgressBar(`Exported raw entity provider ${entityId} to ${fileName}.`);\n } catch (error) {\n stopProgressBar(`Error exporting raw entity ${entityId}: ${error.message}`);\n printMessage(error.response?.data, 'error');\n }\n}\n\n/**\n * Export all entity providers raw to one file\n * @param {String} file Optional filename\n */\nexport async function exportRawSaml2ProvidersToFile(file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(\n `all${getRealmString()}ProvidersRaw`,\n 'raw.saml'\n );\n }\n try {\n const samlApplicationList = (await getRawSaml2Providers()).result;\n\n saveToFile('application', samlApplicationList, '_id', fileName);\n printMessage(\n `All RAW saml entity providers exported to: ${fileName}`,\n 'info'\n );\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportRawSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportRawSaml2ProvidersToFiles() {\n const samlApplicationList = (await getRawSaml2Providers()).result;\n let hasError = false;\n createProgressBar(samlApplicationList.length, 'Exporting RAW providers');\n let exportedAmount = 0;\n for (const item of samlApplicationList) {\n updateProgressBar(`Exporting provider ${item.entityId}`);\n try {\n const samlApplicationData = await getRawSaml2Provider(item._id);\n const fileName = getTypedFilename(\n `${item._id}${getRealmString()}ProviderRaw`,\n 'raw.saml'\n );\n saveToFile('application', [samlApplicationData], '_id', fileName);\n exportedAmount++;\n } catch (error) {\n hasError = true;\n printMessage(`Unable to export: ${item._id}`, 'error');\n }\n }\n stopProgressBar(`${exportedAmount} providers exported.`);\n if (!hasError) {\n printMessage('All entities exported.', 'info');\n } else {\n printMessage('All other entities exported.', 'info');\n }\n}\n\n/**\n * Imports a raw SAML export file (containing one entity).\n * @param {string} file The import file\n */\nexport async function importRawSaml2ProviderFromFile(\n // entityId: string,\n file: string\n) {\n printMessage(`Importing SAML Entity ${file}...`, 'info');\n if (file.indexOf('.raw.saml.json') > -1) {\n const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n try {\n await putRawSaml2Provider(id, samlEntityData.application[id]);\n } catch (error) {\n printMessage(`Unable to import: ${id}`, 'error');\n }\n printMessage(`Imported ${id}`, 'info');\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n }\n}\n\n/**\n * Import first raw SAML entity provider from file\n * @param {String} file Import file name\n */\nexport async function importFirstRawSaml2ProviderFromFile(file) {\n printMessage(`Importing SAML Entity ${file}...`, 'info');\n if (file.indexOf('.raw.saml.json') > -1) {\n const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n try {\n await putRawSaml2Provider(id, samlEntityData.application[id]);\n } catch (error) {\n printMessage(`Unable to import: ${id}`, 'error');\n }\n printMessage(`Imported ${id}`, 'info');\n return;\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n }\n}\n\n/**\n * Imports the RAW provider info from a single file.\n * @param file Import file name\n */\nexport async function importRawSaml2ProvidersFromFile(file: string) {\n fs.readFile(file, 'utf8', async function (err, data) {\n if (err) throw err;\n const samlEntityData = JSON.parse(data);\n let amountOfEntities = 0;\n for (const id in samlEntityData.application) {\n if (id.length) {\n amountOfEntities++;\n }\n }\n if (validateImport(samlEntityData.meta)) {\n createProgressBar(amountOfEntities, 'Importing providers...');\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n await putRawSaml2Provider(id, samlEntityData.application[id]).then(\n (result) => {\n if (result === null) {\n printMessage(`Import validation failed for ${id}`, 'error');\n }\n }\n );\n updateProgressBar(`Imported ${id}...`);\n }\n stopProgressBar(`Import done`);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Whenever the SAML RAW file were exported using the exportRAW functionality this function\n * is used to read them back in. Only files with the .samlRaw.json extension will be imported.\n * @param {string} directory The directory from which to import the files\n */\nexport async function importRawSaml2ProvidersFromFiles(directory) {\n const files = fs.readdirSync(directory);\n const filesToImport = files.filter(\n (file) => file.indexOf('.samlRaw.json') > -1\n );\n\n if (filesToImport.length > 0) {\n createProgressBar(filesToImport.length, 'Importing providers...');\n filesToImport.forEach(async (file) => {\n const filePathAbsolute = path.join(directory, file);\n filesToImport.push(file);\n const samlEntityData = JSON.parse(\n fs.readFileSync(filePathAbsolute, 'utf8')\n );\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n await putRawSaml2Provider(id, samlEntityData.application[id]).then(\n (result) => {\n if (result === null) {\n printMessage(`Import validation failed for ${id}`, 'error');\n }\n }\n );\n updateProgressBar(`Imported ${id}...`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n stopProgressBar(`Import done`);\n } else {\n printMessage(\n 'Import failed, no files to import. (check extension to be .samlRaw.json)',\n 'warn'\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Saml2Ops.js","names":["fs","path","Saml2","ExportImportUtils","createObjectTable","createProgressBar","createTable","debugMessage","printMessage","showSpinner","stopProgressBar","stopSpinner","updateProgressBar","saveTextToFile","roleMap","exportSaml2Provider","exportSaml2Providers","getSaml2ProviderStubs","getProviderByLocationAndId","getProviderMetadata","getProviderMetadataUrl","getSaml2ProviderStub","getRawSaml2Providers","getRawSaml2Provider","importSaml2Provider","importSaml2Providers","putRawSaml2Provider","getTypedFilename","saveJsonToFile","getRealmString","saveToFile","validateImport","getOneLineDescription","saml2ProviderObj","roles","key","value","Object","entries","push","description","entityId","entityLocation","length","join","getTableHeaderMd","markdown","getTableRowMd","row","listSaml2Providers","long","providerList","sort","a","b","_id","localeCompare","provider","table","location","map","role","toString","describeSaml2Provider","stub","id","rawProviderData","_rev","metadataUrl","error","message","exportSaml2MetadataToFile","file","fileName","metaData","brightCyan","exportSaml2ProviderToFile","fileData","err","exportSaml2ProvidersToFile","exportData","response","status","exportSaml2ProvidersToFiles","stubs","importSaml2ProviderFromFile","readFile","data","JSON","parse","meta","importFirstSaml2ProviderFromFile","keys","saml","remote","hosted","importSaml2ProvidersFromFile","importSaml2ProvidersFromFiles","names","readdirSync","jsonFiles","filter","name","toLowerCase","endsWith","totalStatus","total","successes","warnings","failures","readFileSync","myStatus","listRawSaml2Providers","result","exportRawSaml2ProviderToFile","rawData","stringify","exportRawSaml2ProvidersToFile","samlApplicationList","exportRawSaml2ProvidersToFiles","hasError","exportedAmount","item","samlApplicationData","importRawSaml2ProviderFromFile","indexOf","samlEntityData","application","importFirstRawSaml2ProviderFromFile","importRawSaml2ProvidersFromFile","amountOfEntities","then","importRawSaml2ProvidersFromFiles","directory","files","filesToImport","forEach","filePathAbsolute"],"sources":["ops/Saml2Ops.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Saml2ProviderSkeleton } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport { Saml2, ExportImportUtils } from '@rockcarver/frodo-lib';\nimport {\n MultiOpStatusInterface,\n Saml2ExportInterface,\n} from '@rockcarver/frodo-lib/types/ops/OpsTypes';\nimport {\n createObjectTable,\n createProgressBar,\n createTable,\n debugMessage,\n printMessage,\n showSpinner,\n stopProgressBar,\n stopSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport { saveTextToFile } from '../utils/ExportImportUtils';\n\nconst {\n roleMap,\n exportSaml2Provider,\n exportSaml2Providers,\n getSaml2ProviderStubs,\n getProviderByLocationAndId,\n getProviderMetadata,\n getProviderMetadataUrl,\n getSaml2ProviderStub,\n getRawSaml2Providers,\n getRawSaml2Provider,\n importSaml2Provider,\n importSaml2Providers,\n putRawSaml2Provider,\n} = Saml2;\nconst {\n getTypedFilename,\n saveJsonToFile,\n getRealmString,\n saveToFile,\n validateImport,\n} = ExportImportUtils;\n\n/**\n * Get a one-line description of the saml2 provider object\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n saml2ProviderObj: Saml2ProviderSkeleton\n): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const description = `[${saml2ProviderObj.entityId['brightCyan']}]${\n ' (' + saml2ProviderObj.entityLocation\n }${roles.length ? ' ' + roles.join(', ') + ')' : ')'}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Entity Id | Location | Role(s) |\\n';\n markdown += '| --------- | -------- | ------- |';\n return markdown;\n}\n\n/**\n * Get a table-row of the saml2 provider in markdown\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a table-row of the saml2 provider in markdown\n */\nexport function getTableRowMd(saml2ProviderObj: Saml2ProviderSkeleton): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const row = `| ${saml2ProviderObj.entityId} | ${\n saml2ProviderObj.entityLocation\n } | ${roles.length ? roles.join(', ') : ''} |`;\n return row;\n}\n\n/**\n * List entity providers\n * @param {boolean} long Long list format with details\n */\nexport async function listSaml2Providers(long = false) {\n const providerList = await getSaml2ProviderStubs();\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const provider of providerList) {\n printMessage(`${provider.entityId}`, 'data');\n }\n } else {\n const table = createTable([\n 'Entity Id'['brightCyan'],\n 'Location'['brightCyan'],\n 'Role(s)'['brightCyan'],\n ]);\n for (const provider of providerList) {\n table.push([\n provider.entityId,\n provider.location,\n provider.roles.map((role) => roleMap[role]).join(', '),\n ]);\n }\n printMessage(table.toString());\n }\n}\n\n/**\n * Describe an entity provider's configuration\n * @param {String} entityId Provider entity id\n */\nexport async function describeSaml2Provider(entityId) {\n try {\n const stub = await getSaml2ProviderStub(entityId);\n printMessage(stub);\n const { location } = stub;\n const id = stub._id;\n const roles = stub.roles.map((role: string) => roleMap[role]).join(', ');\n const rawProviderData = await getProviderByLocationAndId(location, id);\n delete rawProviderData._id;\n delete rawProviderData._rev;\n rawProviderData.location = location;\n rawProviderData.roles = roles;\n rawProviderData.metadataUrl = getProviderMetadataUrl(entityId);\n const table = createObjectTable(rawProviderData);\n printMessage(table.toString());\n } catch (error) {\n printMessage(error.message, 'error');\n }\n}\n\n/**\n * Export provider metadata to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2MetadataToFile(entityId, file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'metadata', 'xml');\n }\n createProgressBar(1, `Exporting metadata for: ${entityId}`);\n try {\n updateProgressBar(`Writing file ${fileName}`);\n const metaData = await getProviderMetadata(entityId);\n saveTextToFile(metaData, fileName);\n stopProgressBar(\n `Exported ${entityId.brightCyan} metadata to ${fileName.brightCyan}.`\n );\n } catch (error) {\n stopProgressBar(`${error}`);\n printMessage(error, 'error');\n }\n}\n\n/**\n * Export a single entity provider to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProviderToFile(entityId, file = null) {\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: start [entityId=${entityId}, file=${file}]`\n );\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'saml');\n }\n try {\n createProgressBar(1, `Exporting provider ${entityId}`);\n const fileData = await exportSaml2Provider(entityId);\n saveJsonToFile(fileData, fileName);\n stopProgressBar(\n `Exported ${entityId.brightCyan} to ${fileName.brightCyan}.`\n );\n } catch (err) {\n stopProgressBar(`${err}`);\n printMessage(err, 'error');\n }\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: end [entityId=${entityId}, file=${fileName}]`\n );\n}\n\n/**\n * Export all entity providers to one file\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProvidersToFile(file = null) {\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: start [file=${file}]`);\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Providers`, 'saml');\n }\n try {\n const exportData = await exportSaml2Providers();\n saveJsonToFile(exportData, fileName);\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: end [file=${file}]`);\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportSaml2ProvidersToFiles() {\n const stubs = await getSaml2ProviderStubs();\n if (stubs.length > 0) {\n createProgressBar(stubs.length, 'Exporting providers');\n for (const stub of stubs) {\n updateProgressBar(`Exporting provider ${stub.entityId}`);\n const fileName = getTypedFilename(stub.entityId, 'saml');\n const fileData = await exportSaml2Provider(stub.entityId);\n saveJsonToFile(fileData, fileName);\n }\n stopProgressBar(`${stubs.length} providers exported.`);\n } else {\n printMessage('No entity providers found.', 'info');\n }\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} entityId Provider entity id\n * @param {String} file Import file name\n */\nexport async function importSaml2ProviderFromFile(\n entityId: string,\n file: string\n) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n stopSpinner(`Imported ${entityId}.`);\n } catch (error) {\n stopSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} file Import file name\n */\nexport async function importFirstSaml2ProviderFromFile(file: string) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data) as Saml2ExportInterface;\n // pick the first provider and run with it\n const entityId =\n Object.keys(fileData.saml.remote)[0] ||\n Object.keys(fileData.saml.hosted)[0];\n if (validateImport(fileData.meta)) {\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n stopSpinner(`Imported ${entityId}.`);\n } catch (error) {\n stopSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from file\n * @param {String} file Import file name\n */\nexport async function importSaml2ProvidersFromFile(file: string) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n await importSaml2Providers(fileData);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from all *.saml.json files in the current directory\n */\nexport async function importSaml2ProvidersFromFiles() {\n const names = fs.readdirSync('.');\n const jsonFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.saml.json')\n );\n createProgressBar(jsonFiles.length, 'Importing providers...');\n const totalStatus: MultiOpStatusInterface = {\n total: 0,\n successes: 0,\n warnings: 0,\n failures: 0,\n };\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n const myStatus = await importSaml2Providers(fileData);\n totalStatus.total += myStatus.total;\n totalStatus.successes += myStatus.successes;\n totalStatus.warnings += myStatus.warnings;\n totalStatus.failures += myStatus.failures;\n updateProgressBar(\n `Imported ${myStatus.successes}/${myStatus.total} provider(s) from ${file}.`\n );\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressBar(\n `Imported ${totalStatus.successes} of ${totalStatus.total} provider(s) from ${jsonFiles.length} file(s).`\n );\n}\n\n/**\n * List entity providers\n */\nexport async function listRawSaml2Providers() {\n const providerList = (await getRawSaml2Providers()).result;\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n for (const provider of providerList) {\n printMessage(`${provider._id}`, 'data');\n }\n}\n\n/**\n * Exports a RAW SAML entity, which means the raw xml is included.\n * @param {string} entityId Reference to the entity for export\n * @param {string} file Optional filename for the exported file\n */\nexport async function exportRawSaml2ProviderToFile(entityId, file = null) {\n printMessage(`Exporting raw SAML entity provider ${entityId}`, 'info');\n let fileName = file;\n if (!file) {\n fileName = getTypedFilename(`${entityId}`, 'raw.saml');\n }\n createProgressBar(1, `Exporting raw entity provider: ${entityId}`);\n try {\n const rawData = await getRawSaml2Provider(entityId);\n updateProgressBar(`Writing file ${fileName}`);\n saveTextToFile(JSON.stringify(rawData, null, 2), fileName);\n stopProgressBar(`Exported raw entity provider ${entityId} to ${fileName}.`);\n } catch (error) {\n stopProgressBar(`Error exporting raw entity ${entityId}: ${error.message}`);\n printMessage(error.response?.data, 'error');\n }\n}\n\n/**\n * Export all entity providers raw to one file\n * @param {String} file Optional filename\n */\nexport async function exportRawSaml2ProvidersToFile(file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(\n `all${getRealmString()}ProvidersRaw`,\n 'raw.saml'\n );\n }\n try {\n const samlApplicationList = (await getRawSaml2Providers()).result;\n\n saveToFile('application', samlApplicationList, '_id', fileName);\n printMessage(\n `All RAW saml entity providers exported to: ${fileName}`,\n 'info'\n );\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportRawSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportRawSaml2ProvidersToFiles() {\n const samlApplicationList = (await getRawSaml2Providers()).result;\n let hasError = false;\n createProgressBar(samlApplicationList.length, 'Exporting RAW providers');\n let exportedAmount = 0;\n for (const item of samlApplicationList) {\n updateProgressBar(`Exporting provider ${item.entityId}`);\n try {\n const samlApplicationData = await getRawSaml2Provider(item._id);\n const fileName = getTypedFilename(\n `${item._id}${getRealmString()}ProviderRaw`,\n 'raw.saml'\n );\n saveToFile('application', [samlApplicationData], '_id', fileName);\n exportedAmount++;\n } catch (error) {\n hasError = true;\n printMessage(`Unable to export: ${item._id}`, 'error');\n }\n }\n stopProgressBar(`${exportedAmount} providers exported.`);\n if (!hasError) {\n printMessage('All entities exported.', 'info');\n } else {\n printMessage('All other entities exported.', 'info');\n }\n}\n\n/**\n * Imports a raw SAML export file (containing one entity).\n * @param {string} file The import file\n */\nexport async function importRawSaml2ProviderFromFile(\n // entityId: string,\n file: string\n) {\n printMessage(`Importing SAML Entity ${file}...`, 'info');\n if (file.indexOf('.raw.saml.json') > -1) {\n const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n try {\n await putRawSaml2Provider(id, samlEntityData.application[id]);\n } catch (error) {\n printMessage(`Unable to import: ${id}`, 'error');\n }\n printMessage(`Imported ${id}`, 'info');\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n }\n}\n\n/**\n * Import first raw SAML entity provider from file\n * @param {String} file Import file name\n */\nexport async function importFirstRawSaml2ProviderFromFile(file) {\n printMessage(`Importing SAML Entity ${file}...`, 'info');\n if (file.indexOf('.raw.saml.json') > -1) {\n const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n try {\n await putRawSaml2Provider(id, samlEntityData.application[id]);\n } catch (error) {\n printMessage(`Unable to import: ${id}`, 'error');\n }\n printMessage(`Imported ${id}`, 'info');\n return;\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n }\n}\n\n/**\n * Imports the RAW provider info from a single file.\n * @param file Import file name\n */\nexport async function importRawSaml2ProvidersFromFile(file: string) {\n fs.readFile(file, 'utf8', async function (err, data) {\n if (err) throw err;\n const samlEntityData = JSON.parse(data);\n let amountOfEntities = 0;\n for (const id in samlEntityData.application) {\n if (id.length) {\n amountOfEntities++;\n }\n }\n if (validateImport(samlEntityData.meta)) {\n createProgressBar(amountOfEntities, 'Importing providers...');\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n await putRawSaml2Provider(id, samlEntityData.application[id]).then(\n (result) => {\n if (result === null) {\n printMessage(`Import validation failed for ${id}`, 'error');\n }\n }\n );\n updateProgressBar(`Imported ${id}...`);\n }\n stopProgressBar(`Import done`);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Whenever the SAML RAW file were exported using the exportRAW functionality this function\n * is used to read them back in. Only files with the .samlRaw.json extension will be imported.\n * @param {string} directory The directory from which to import the files\n */\nexport async function importRawSaml2ProvidersFromFiles(directory) {\n const files = fs.readdirSync(directory);\n const filesToImport = files.filter(\n (file) => file.indexOf('.samlRaw.json') > -1\n );\n\n if (filesToImport.length > 0) {\n createProgressBar(filesToImport.length, 'Importing providers...');\n filesToImport.forEach(async (file) => {\n const filePathAbsolute = path.join(directory, file);\n filesToImport.push(file);\n const samlEntityData = JSON.parse(\n fs.readFileSync(filePathAbsolute, 'utf8')\n );\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n await putRawSaml2Provider(id, samlEntityData.application[id]).then(\n (result) => {\n if (result === null) {\n printMessage(`Import validation failed for ${id}`, 'error');\n }\n }\n );\n updateProgressBar(`Imported ${id}...`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n stopProgressBar(`Import done`);\n } else {\n printMessage(\n 'Import failed, no files to import. (check extension to be .samlRaw.json)',\n 'warn'\n );\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
+ import { ExportImportUtils, Script, state } from '@rockcarver/frodo-lib';
2
+ import chokidar from 'chokidar';
1
3
  import fs from 'fs';
2
- import { Script, ExportImportUtils, state } from '@rockcarver/frodo-lib';
3
4
  import { createProgressBar, createTable, debugMessage, failSpinner, printMessage, showSpinner, spinSpinner, stopProgressBar, succeedSpinner, updateProgressBar } from '../utils/Console';
5
+ import { getTypedFilename, saveJsonToFile, saveTextToFile, titleCase } from '../utils/ExportImportUtils';
4
6
  import wordwrap from './utils/Wordwrap';
5
- import { getTypedFilename, saveJsonToFile, titleCase } from '../utils/ExportImportUtils';
6
7
  const {
7
8
  getScripts,
8
9
  exportScripts,
@@ -13,7 +14,7 @@ const {
13
14
 
14
15
  /**
15
16
  * Get a one-line description of the script object
16
- * @param {ScriptSkeleton} scriptObj script object to describe
17
+ * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe
17
18
  * @returns {string} a one-line description
18
19
  */
19
20
  export function getOneLineDescription(scriptObj) {
@@ -34,7 +35,7 @@ export function getTableHeaderMd() {
34
35
 
35
36
  /**
36
37
  * Get a one-line description of the script object in markdown
37
- * @param {ScriptSkeleton} scriptObj script object to describe
38
+ * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe
38
39
  * @returns {string} markdown table row
39
40
  */
40
41
  export function getTableRowMd(scriptObj) {
@@ -96,8 +97,8 @@ export async function exportScriptToFile(scriptId, file) {
96
97
  fileName = file;
97
98
  }
98
99
  spinSpinner(`Exporting script '${scriptId}' to '${fileName}'...`);
99
- const exportData = await exportScript(scriptId);
100
- saveJsonToFile(exportData, fileName);
100
+ const scriptExport = await exportScript(scriptId);
101
+ saveJsonToFile(scriptExport, fileName);
101
102
  succeedSpinner(`Exported script '${scriptId}' to '${fileName}'.`);
102
103
  debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);
103
104
  return true;
@@ -124,8 +125,8 @@ export async function exportScriptByNameToFile(name, file) {
124
125
  fileName = file;
125
126
  }
126
127
  spinSpinner(`Exporting script '${name}' to '${fileName}'...`);
127
- const exportData = await exportScriptByName(name);
128
- saveJsonToFile(exportData, fileName);
128
+ const scriptExport = await exportScriptByName(name);
129
+ saveJsonToFile(scriptExport, fileName);
129
130
  succeedSpinner(`Exported script '${name}' to '${fileName}'.`);
130
131
  debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);
131
132
  return true;
@@ -149,8 +150,8 @@ export async function exportScriptsToFile(file) {
149
150
  if (file) {
150
151
  fileName = file;
151
152
  }
152
- const exportData = await exportScripts();
153
- saveJsonToFile(exportData, fileName);
153
+ const scriptExport = await exportScripts();
154
+ saveJsonToFile(scriptExport, fileName);
154
155
  debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);
155
156
  return true;
156
157
  } catch (error) {
@@ -174,8 +175,8 @@ export async function exportScriptsToFiles() {
174
175
  try {
175
176
  updateProgressBar(`Reading script ${script.name}`);
176
177
  const fileName = getTypedFilename(script.name, 'script');
177
- const exportData = await exportScriptByName(script.name);
178
- saveJsonToFile(exportData, fileName);
178
+ const scriptExport = await exportScriptByName(script.name);
179
+ saveJsonToFile(scriptExport, fileName);
179
180
  } catch (error) {
180
181
  outcome = false;
181
182
  printMessage(`Error exporting script '${script.name}': ${error.message}`, 'error');
@@ -186,6 +187,33 @@ export async function exportScriptsToFiles() {
186
187
  debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);
187
188
  return outcome;
188
189
  }
190
+ export async function exportScriptsToFilesExtract() {
191
+ let outcome = true;
192
+ debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: start`);
193
+ const scriptList = await getScripts();
194
+ createProgressBar(scriptList.length, 'Exporting scripts to individual files...');
195
+ for (const script of scriptList) {
196
+ try {
197
+ updateProgressBar(`Reading script ${script.name}`);
198
+ const fileExtension = script.language === 'JAVASCRIPT' ? 'js' : 'groovy';
199
+ const scriptFileName = getTypedFilename(script.name, 'script', fileExtension);
200
+ const fileName = getTypedFilename(script.name, 'script');
201
+ const scriptExport = await exportScriptByName(script.name);
202
+ const scriptSkeleton = getScriptSkeleton(scriptExport);
203
+ const scriptText = Array.isArray(scriptSkeleton.script) ? scriptSkeleton.script.join('\n') : scriptSkeleton.script;
204
+ scriptSkeleton.script = `file://${scriptFileName}`;
205
+ saveTextToFile(scriptText, scriptFileName);
206
+ saveJsonToFile(scriptExport, fileName);
207
+ } catch (error) {
208
+ outcome = false;
209
+ printMessage(`Error exporting script '${script.name}': ${error.message}`, 'error');
210
+ debugMessage(error);
211
+ }
212
+ }
213
+ stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);
214
+ debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: end [${outcome}]`);
215
+ return outcome;
216
+ }
189
217
 
190
218
  /**
191
219
  * Import script(s) from file
@@ -210,4 +238,145 @@ export async function importScriptsFromFile(name, file, reUuid = false) {
210
238
  debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);
211
239
  return outcome;
212
240
  }
241
+
242
+ /**
243
+ * Import extracted scripts.
244
+ *
245
+ * @param watch whether or not to watch for file changes
246
+ */
247
+ export async function importScriptsFromFiles(watch, reUuid, validateScripts) {
248
+ // If watch is true, it doesn't make sense to reUuid.
249
+ reUuid = watch ? false : reUuid;
250
+
251
+ /**
252
+ * Run on file change detection, as well as on initial run.
253
+ */
254
+ function onChange(path, _stats) {
255
+ handleScriptFileImport(path, reUuid, validateScripts).catch(error => {
256
+ printMessage(`Error importing script: ${error.message}`, 'error');
257
+ debugMessage(error);
258
+ process.exit(1);
259
+ });
260
+ }
261
+
262
+ // We watch json files and script files.
263
+ const watcher = chokidar.watch([`./**/*.script.json`, `./**/*.script.js`, `./**/*.script.groovy`], {
264
+ persistent: watch
265
+ });
266
+ watcher.on('add', onChange).on('change', onChange).on('error', error => {
267
+ printMessage(`Watcher error: ${error}`, 'error');
268
+ watcher.close();
269
+ }).on('ready', () => {
270
+ if (watch) {
271
+ printMessage('Watching for changes...');
272
+ } else {
273
+ watcher.close();
274
+ printMessage('Done.');
275
+ }
276
+ });
277
+ }
278
+
279
+ /**
280
+ * Handle a script file import.
281
+ *
282
+ * @param file Either a script file or an extract file
283
+ * @param reUuid whether or not to generate a new uuid for each script on import
284
+ */
285
+ async function handleScriptFileImport(file, reUuid, validateScripts) {
286
+ debugMessage(`Cli.ScriptOps.handleScriptFileImport: start`);
287
+ const scriptFile = getScriptFile(file);
288
+ const script = getScriptExportByScriptFile(scriptFile);
289
+ const success = await importScripts('', script, reUuid, validateScripts);
290
+ if (success) {
291
+ printMessage(`Imported '${scriptFile}'`);
292
+ }
293
+ debugMessage(`Cli.ScriptOps.handleScriptFileImport: end`);
294
+ }
295
+
296
+ /**
297
+ * Get a script file from a file.
298
+ *
299
+ * @param file Either a script file or an extract file
300
+ * @returns The script file
301
+ */
302
+ function getScriptFile(file) {
303
+ if (file.endsWith('.script.json')) {
304
+ return file;
305
+ }
306
+ return file.replace(/\.script\.(js|groovy)/, '.script.json');
307
+ }
308
+
309
+ /**
310
+ * Get a script export from a script file.
311
+ *
312
+ * @param scriptFile The path to the script file
313
+ * @returns The script export
314
+ */
315
+ function getScriptExportByScriptFile(scriptFile) {
316
+ const scriptExport = getScriptExport(scriptFile);
317
+ const scriptSkeleton = getScriptSkeleton(scriptExport);
318
+ const extractFile = getExtractFile(scriptSkeleton);
319
+ if (!extractFile) {
320
+ return scriptExport;
321
+ }
322
+ const scriptRaw = fs.readFileSync(extractFile, 'utf8');
323
+ scriptSkeleton.script = scriptRaw.split('\n');
324
+ return scriptExport;
325
+ }
326
+
327
+ /**
328
+ * Get an extract file from a script skeleton.
329
+ *
330
+ * @param scriptSkeleton The script skeleton
331
+ * @returns The extract file or null if there is no extract file
332
+ */
333
+ function getExtractFile(scriptSkeleton) {
334
+ const extractFile = scriptSkeleton.script;
335
+ if (Array.isArray(extractFile)) {
336
+ return null;
337
+ }
338
+ if (extractFile.startsWith('file://') && (extractFile.endsWith('.js') || extractFile.endsWith('.groovy'))) {
339
+ return extractFile.replace('file://', '');
340
+ }
341
+ return null;
342
+ }
343
+
344
+ /**
345
+ * Get a script export from a file.
346
+ *
347
+ * @param file The path to a script export file
348
+ * @returns The script export
349
+ */
350
+ function getScriptExport(file) {
351
+ const scriptExportRaw = fs.readFileSync(file, 'utf8');
352
+ const scriptExport = JSON.parse(scriptExportRaw);
353
+ return scriptExport;
354
+ }
355
+
356
+ /**
357
+ * Get the main script skeleton from a script export. If there is more than one
358
+ * script, an error is thrown.
359
+ *
360
+ * @param script Get the main script skeleton from a script export
361
+ * @returns The main script skeleton
362
+ */
363
+ function getScriptSkeleton(script) {
364
+ const scriptId = getScriptId(script);
365
+ return script.script[scriptId];
366
+ }
367
+
368
+ /**
369
+ * Get the main script ID from a script export. If there is more than one
370
+ * script, an error is thrown.
371
+ *
372
+ * @param script The script export
373
+ * @returns The main script ID
374
+ */
375
+ function getScriptId(script) {
376
+ const scriptIds = Object.keys(script.script);
377
+ if (scriptIds.length !== 1) {
378
+ throw new Error(`Expected 1 script, found ${scriptIds.length}`);
379
+ }
380
+ return scriptIds[0];
381
+ }
213
382
  //# sourceMappingURL=ScriptOps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScriptOps.js","names":["fs","Script","ExportImportUtils","state","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","spinSpinner","stopProgressBar","succeedSpinner","updateProgressBar","wordwrap","getTypedFilename","saveJsonToFile","titleCase","getScripts","exportScripts","exportScript","exportScriptByName","importScripts","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","outcome","scripts","sort","a","b","localeCompare","table","forEach","script","push","toString","error","message","exportScriptToFile","scriptId","file","fileName","exportData","exportScriptByNameToFile","exportScriptsToFile","getRealm","exportScriptsToFiles","scriptList","length","importScriptsFromFile","reUuid","readFile","err","data","importData","JSON","parse"],"sources":["ops/ScriptOps.ts"],"sourcesContent":["import fs from 'fs';\nimport { ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport { Script, ExportImportUtils, state } from '@rockcarver/frodo-lib';\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport wordwrap from './utils/Wordwrap';\nimport {\n getTypedFilename,\n saveJsonToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\n\nconst {\n getScripts,\n exportScripts,\n exportScript,\n exportScriptByName,\n importScripts,\n} = Script;\n\n/**\n * Get a one-line description of the script object\n * @param {ScriptSkeleton} scriptObj script object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(scriptObj: ScriptSkeleton): string {\n const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Name | Language | Type | Id |\\n';\n markdown += '| ---- | -------- | ---- | ---|';\n return markdown;\n}\n\n/**\n * Get a one-line description of the script object in markdown\n * @param {ScriptSkeleton} scriptObj script object to describe\n * @returns {string} markdown table row\n */\nexport function getTableRowMd(scriptObj: ScriptSkeleton): string {\n const langMap = { JAVASCRIPT: 'JavaSscript', GROOVY: 'Groovy' };\n const description = `| ${scriptObj.name} | ${\n langMap[scriptObj.language]\n } | ${ExportImportUtils.titleCase(\n scriptObj.context.split('_').join(' ')\n )} | \\`${scriptObj._id}\\` |`;\n return description;\n}\n\n/**\n * List scripts\n * @param {boolean} long detail list\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function listScripts(long = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n const scripts = await getScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n if (long) {\n const table = createTable([\n 'Name',\n 'UUID',\n 'Language',\n 'Context',\n 'Description',\n ]);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n table.push([\n wordwrap(script.name, 25, ' '),\n script._id,\n langMap[script.language],\n wordwrap(titleCase(script.context.split('_').join(' ')), 25),\n wordwrap(script.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n }\n } catch (error) {\n outcome = false;\n printMessage(`Error listing scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptToFile: start`);\n try {\n showSpinner(`Exporting script '${scriptId}'...`);\n let fileName = getTypedFilename(scriptId, 'script');\n if (file) {\n fileName = file;\n }\n spinSpinner(`Exporting script '${scriptId}' to '${fileName}'...`);\n const exportData = await exportScript(scriptId);\n saveJsonToFile(exportData, fileName);\n succeedSpinner(`Exported script '${scriptId}' to '${fileName}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [false]`);\n return false;\n}\n\n/**\n * Export script by name to file\n * @param {string} name script name\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);\n try {\n showSpinner(`Exporting script '${name}'...`);\n let fileName = getTypedFilename(name, 'script');\n if (file) {\n fileName = file;\n }\n spinSpinner(`Exporting script '${name}' to '${fileName}'...`);\n const exportData = await exportScriptByName(name);\n saveJsonToFile(exportData, fileName);\n succeedSpinner(`Exported script '${name}' to '${fileName}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: start`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Scripts`,\n 'script'\n );\n if (file) {\n fileName = file;\n }\n const exportData = await exportScripts();\n saveJsonToFile(exportData, fileName);\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);\n return true;\n } catch (error) {\n printMessage(`Error exporting scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFiles(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const scriptList = await getScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileName = getTypedFilename(script.name, 'script');\n const exportData = await exportScriptByName(script.name);\n saveJsonToFile(exportData, fileName);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import script(s) from file\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {string} file file name\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 importScriptsFromFile(\n name: string,\n file: string,\n reUuid = false\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n fs.readFile(file, 'utf8', async (err, data) => {\n try {\n if (err) throw err;\n const importData = JSON.parse(data);\n outcome = await importScripts(name, importData, reUuid);\n } catch (error) {\n printMessage(\n `Error exporting script '${name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n });\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);\n return outcome;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScriptOps.js","names":["ExportImportUtils","Script","state","chokidar","fs","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","spinSpinner","stopProgressBar","succeedSpinner","updateProgressBar","getTypedFilename","saveJsonToFile","saveTextToFile","titleCase","wordwrap","getScripts","exportScripts","exportScript","exportScriptByName","importScripts","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","outcome","scripts","sort","a","b","localeCompare","table","forEach","script","push","toString","error","message","exportScriptToFile","scriptId","file","fileName","scriptExport","exportScriptByNameToFile","exportScriptsToFile","getRealm","exportScriptsToFiles","scriptList","length","exportScriptsToFilesExtract","fileExtension","scriptFileName","scriptSkeleton","getScriptSkeleton","scriptText","Array","isArray","importScriptsFromFile","reUuid","readFile","err","data","importData","JSON","parse","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","handleScriptFileImport","catch","process","exit","watcher","persistent","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","success","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","readFileSync","startsWith","scriptExportRaw","getScriptId","scriptIds","Object","keys","Error"],"sources":["ops/ScriptOps.ts"],"sourcesContent":["import {\n ExportImportUtils,\n Script,\n state,\n Types,\n TypesRaw,\n} from '@rockcarver/frodo-lib';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n getScripts,\n exportScripts,\n exportScript,\n exportScriptByName,\n importScripts,\n} = Script;\n\n/**\n * Get a one-line description of the script object\n * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n scriptObj: TypesRaw.ScriptSkeleton\n): string {\n const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Name | Language | Type | Id |\\n';\n markdown += '| ---- | -------- | ---- | ---|';\n return markdown;\n}\n\n/**\n * Get a one-line description of the script object in markdown\n * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe\n * @returns {string} markdown table row\n */\nexport function getTableRowMd(scriptObj: TypesRaw.ScriptSkeleton): string {\n const langMap = { JAVASCRIPT: 'JavaSscript', GROOVY: 'Groovy' };\n const description = `| ${scriptObj.name} | ${\n langMap[scriptObj.language]\n } | ${ExportImportUtils.titleCase(\n scriptObj.context.split('_').join(' ')\n )} | \\`${scriptObj._id}\\` |`;\n return description;\n}\n\n/**\n * List scripts\n * @param {boolean} long detail list\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function listScripts(long = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n const scripts = await getScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n if (long) {\n const table = createTable([\n 'Name',\n 'UUID',\n 'Language',\n 'Context',\n 'Description',\n ]);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n table.push([\n wordwrap(script.name, 25, ' '),\n script._id,\n langMap[script.language],\n wordwrap(titleCase(script.context.split('_').join(' ')), 25),\n wordwrap(script.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n }\n } catch (error) {\n outcome = false;\n printMessage(`Error listing scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptToFile: start`);\n try {\n showSpinner(`Exporting script '${scriptId}'...`);\n let fileName = getTypedFilename(scriptId, 'script');\n if (file) {\n fileName = file;\n }\n spinSpinner(`Exporting script '${scriptId}' to '${fileName}'...`);\n const scriptExport = await exportScript(scriptId);\n saveJsonToFile(scriptExport, fileName);\n succeedSpinner(`Exported script '${scriptId}' to '${fileName}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [false]`);\n return false;\n}\n\n/**\n * Export script by name to file\n * @param {string} name script name\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);\n try {\n showSpinner(`Exporting script '${name}'...`);\n let fileName = getTypedFilename(name, 'script');\n if (file) {\n fileName = file;\n }\n spinSpinner(`Exporting script '${name}' to '${fileName}'...`);\n const scriptExport = await exportScriptByName(name);\n saveJsonToFile(scriptExport, fileName);\n succeedSpinner(`Exported script '${name}' to '${fileName}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: start`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Scripts`,\n 'script'\n );\n if (file) {\n fileName = file;\n }\n const scriptExport = await exportScripts();\n saveJsonToFile(scriptExport, fileName);\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);\n return true;\n } catch (error) {\n printMessage(`Error exporting scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFiles(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const scriptList = await getScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileName = getTypedFilename(script.name, 'script');\n const scriptExport = await exportScriptByName(script.name);\n saveJsonToFile(scriptExport, fileName);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);\n return outcome;\n}\n\nexport async function exportScriptsToFilesExtract(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: start`);\n const scriptList = await getScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileExtension = script.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n script.name,\n 'script',\n fileExtension\n );\n const fileName = getTypedFilename(script.name, 'script');\n\n const scriptExport = await exportScriptByName(script.name);\n\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n\n scriptSkeleton.script = `file://${scriptFileName}`;\n\n saveTextToFile(scriptText, scriptFileName);\n saveJsonToFile(scriptExport, fileName);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import script(s) from file\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {string} file file name\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 importScriptsFromFile(\n name: string,\n file: string,\n reUuid = false\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n fs.readFile(file, 'utf8', async (err, data) => {\n try {\n if (err) throw err;\n const importData = JSON.parse(data);\n outcome = await importScripts(name, importData, reUuid);\n } catch (error) {\n printMessage(\n `Error exporting script '${name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n });\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param watch whether or not to watch for file changes\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n reUuid: boolean,\n validateScripts: boolean\n) {\n // If watch is true, it doesn't make sense to reUuid.\n reUuid = watch ? false : reUuid;\n\n /**\n * Run on file change detection, as well as on initial run.\n */\n function onChange(path: string, _stats?: fs.Stats): void {\n handleScriptFileImport(path, reUuid, validateScripts).catch((error) => {\n printMessage(`Error importing script: ${error.message}`, 'error');\n debugMessage(error);\n process.exit(1);\n });\n }\n\n // We watch json files and script files.\n const watcher = chokidar.watch(\n [`./**/*.script.json`, `./**/*.script.js`, `./**/*.script.groovy`],\n {\n persistent: watch,\n }\n );\n\n watcher\n .on('add', onChange)\n .on('change', onChange)\n .on('error', (error) => {\n printMessage(`Watcher error: ${error}`, 'error');\n watcher.close();\n })\n .on('ready', () => {\n if (watch) {\n printMessage('Watching for changes...');\n } else {\n watcher.close();\n printMessage('Done.');\n }\n });\n}\n\n/**\n * Handle a script file import.\n *\n * @param file Either a script file or an extract file\n * @param reUuid whether or not to generate a new uuid for each script on import\n */\nasync function handleScriptFileImport(\n file: string,\n reUuid: boolean,\n validateScripts: boolean\n) {\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: start`);\n const scriptFile = getScriptFile(file);\n const script = getScriptExportByScriptFile(scriptFile);\n\n const success = await importScripts('', script, reUuid, validateScripts);\n if (success) {\n printMessage(`Imported '${scriptFile}'`);\n }\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: end`);\n}\n\n/**\n * Get a script file from a file.\n *\n * @param file Either a script file or an extract file\n * @returns The script file\n */\nfunction getScriptFile(file: string) {\n if (file.endsWith('.script.json')) {\n return file;\n }\n return file.replace(/\\.script\\.(js|groovy)/, '.script.json');\n}\n\n/**\n * Get a script export from a script file.\n *\n * @param scriptFile The path to the script file\n * @returns The script export\n */\nfunction getScriptExportByScriptFile(\n scriptFile: string\n): Types.ScriptExportInterface {\n const scriptExport = getScriptExport(scriptFile);\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const extractFile = getExtractFile(scriptSkeleton);\n if (!extractFile) {\n return scriptExport;\n }\n\n const scriptRaw = fs.readFileSync(extractFile, 'utf8');\n scriptSkeleton.script = scriptRaw.split('\\n');\n\n return scriptExport;\n}\n\n/**\n * Get an extract file from a script skeleton.\n *\n * @param scriptSkeleton The script skeleton\n * @returns The extract file or null if there is no extract file\n */\nfunction getExtractFile(\n scriptSkeleton: TypesRaw.ScriptSkeleton\n): string | null {\n const extractFile = scriptSkeleton.script;\n if (Array.isArray(extractFile)) {\n return null;\n }\n if (\n extractFile.startsWith('file://') &&\n (extractFile.endsWith('.js') || extractFile.endsWith('.groovy'))\n ) {\n return extractFile.replace('file://', '');\n }\n return null;\n}\n\n/**\n * Get a script export from a file.\n *\n * @param file The path to a script export file\n * @returns The script export\n */\nfunction getScriptExport(file: string): Types.ScriptExportInterface {\n const scriptExportRaw = fs.readFileSync(file, 'utf8');\n const scriptExport = JSON.parse(\n scriptExportRaw\n ) as Types.ScriptExportInterface;\n\n return scriptExport;\n}\n\n/**\n * Get the main script skeleton from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script Get the main script skeleton from a script export\n * @returns The main script skeleton\n */\nfunction getScriptSkeleton(\n script: Types.ScriptExportInterface\n): TypesRaw.ScriptSkeleton {\n const scriptId = getScriptId(script);\n return script.script[scriptId];\n}\n\n/**\n * Get the main script ID from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script The script export\n * @returns The main script ID\n */\nfunction getScriptId(script: Types.ScriptExportInterface): string {\n const scriptIds = Object.keys(script.script);\n if (scriptIds.length !== 1) {\n throw new Error(`Expected 1 script, found ${scriptIds.length}`);\n }\n return scriptIds[0];\n}\n"],"mappings":"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"}
@@ -5,6 +5,15 @@ import { printMessage } from './Console';
5
5
  const {
6
6
  getMetadata
7
7
  } = ExportImportUtils;
8
+
9
+ /**
10
+ * Get a typed filename. E.g. "my-script.script.json"
11
+ *
12
+ * @param name The name of the file
13
+ * @param type The type of the file, e.g. script, idp, etc.
14
+ * @param suffix The suffix of the file, e.g. json, xml, etc. Defaults to json.
15
+ * @returns The typed filename
16
+ */
8
17
  export function getTypedFilename(name, type, suffix = 'json') {
9
18
  const slug = slugify(name.replace(/^http(s?):\/\//, ''));
10
19
  return `${slug}.${type}.${suffix}`;
@@ -12,12 +21,15 @@ export function getTypedFilename(name, type, suffix = 'json') {
12
21
 
13
22
  /**
14
23
  * Save JSON object to file
15
- * @param {Object} data data object
16
- * @param {String} filename file name
24
+ *
25
+ * @param data data object
26
+ * @param filename file name
17
27
  */
18
28
  export function saveJsonToFile(data, filename) {
19
29
  const exportData = data;
20
- if (!exportData.meta) exportData.meta = getMetadata();
30
+ if (!exportData.meta) {
31
+ exportData.meta = getMetadata();
32
+ }
21
33
  fs.writeFile(filename, JSON.stringify(exportData, null, 2), err => {
22
34
  if (err) {
23
35
  return printMessage(`ERROR - can't save ${filename}`, 'error');
@@ -44,6 +56,22 @@ export function saveToFile(type, data, identifier, filename) {
44
56
  });
45
57
  }
46
58
 
59
+ /**
60
+ * Save text data to file
61
+ * @param data text data
62
+ * @param filename file name
63
+ * @return true if successful, false otherwise
64
+ */
65
+ export function saveTextToFile(data, filename) {
66
+ try {
67
+ fs.writeFileSync(filename, data);
68
+ return true;
69
+ } catch (error) {
70
+ printMessage(`ERROR - can't save ${filename}`, 'error');
71
+ return false;
72
+ }
73
+ }
74
+
47
75
  /*
48
76
  * Output str in title case
49
77
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ExportImportUtils.js","names":["fs","slugify","ExportImportUtils","state","printMessage","getMetadata","getTypedFilename","name","type","suffix","slug","replace","saveJsonToFile","data","filename","exportData","meta","writeFile","JSON","stringify","err","saveToFile","identifier","Array","isArray","forEach","element","titleCase","input","str","toString","splitStr","toLowerCase","split","i","length","charAt","toUpperCase","slice","join","getRealmString","realm","getRealm","reduce","result","item"],"sources":["utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport slugify from 'slugify';\nimport { ExportImportUtils, state } from '@rockcarver/frodo-lib';\nimport { printMessage } from './Console';\n\nconst { getMetadata } = ExportImportUtils;\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\n/**\n * Save JSON object to file\n * @param {Object} data data object\n * @param {String} filename file name\n */\nexport function saveJsonToFile(data, filename) {\n const exportData = data;\n if (!exportData.meta) exportData.meta = getMetadata();\n fs.writeFile(filename, JSON.stringify(exportData, null, 2), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${filename}`, 'error');\n }\n return '';\n });\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 * 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"],"mappings":"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"}
1
+ {"version":3,"file":"ExportImportUtils.js","names":["fs","slugify","ExportImportUtils","state","printMessage","getMetadata","getTypedFilename","name","type","suffix","slug","replace","saveJsonToFile","data","filename","exportData","meta","writeFile","JSON","stringify","err","saveToFile","identifier","Array","isArray","forEach","element","saveTextToFile","writeFileSync","error","titleCase","input","str","toString","splitStr","toLowerCase","split","i","length","charAt","toUpperCase","slice","join","getRealmString","realm","getRealm","reduce","result","item"],"sources":["utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport slugify from 'slugify';\nimport { ExportImportUtils, state } from '@rockcarver/frodo-lib';\nimport { printMessage } from './Console';\n\nconst { getMetadata } = ExportImportUtils;\n\n/**\n * Get a typed filename. E.g. \"my-script.script.json\"\n *\n * @param name The name of the file\n * @param type The type of the file, e.g. script, idp, etc.\n * @param suffix The suffix of the file, e.g. json, xml, etc. Defaults to json.\n * @returns The typed filename\n */\nexport function getTypedFilename(\n name: string,\n type: string,\n suffix = 'json'\n): string {\n const slug = slugify(name.replace(/^http(s?):\\/\\//, ''));\n return `${slug}.${type}.${suffix}`;\n}\n\n/**\n * Save JSON object to file\n *\n * @param data data object\n * @param filename file name\n */\nexport function saveJsonToFile(data: any, filename: string) {\n const exportData = data;\n if (!exportData.meta) {\n exportData.meta = getMetadata();\n }\n fs.writeFile(filename, JSON.stringify(exportData, null, 2), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${filename}`, 'error');\n }\n return '';\n });\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 text data to file\n * @param data text data\n * @param filename file name\n * @return true if successful, false otherwise\n */\nexport function saveTextToFile(data: string, filename: string): boolean {\n try {\n fs.writeFileSync(filename, data);\n return true;\n } catch (error) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\n return false;\n }\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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rockcarver/frodo-cli",
3
- "version": "0.20.1-1",
3
+ "version": "0.20.2-0",
4
4
  "type": "module",
5
5
  "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.",
6
6
  "keywords": [
@@ -104,7 +104,8 @@
104
104
  ]
105
105
  },
106
106
  "dependencies": {
107
- "@rockcarver/frodo-lib": "0.18.1-0",
107
+ "@rockcarver/frodo-lib": "0.18.2-0",
108
+ "chokidar": "^3.5.3",
108
109
  "cli-progress": "^3.11.2",
109
110
  "cli-table3": "^0.6.3",
110
111
  "colors": "^1.4.0",