@squiz/dxp-cli-next 5.9.0 → 5.10.0-develop.10

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.
Files changed (66) hide show
  1. package/README.md +1 -0
  2. package/lib/__tests__/integration/main.spec.js +1 -0
  3. package/lib/datastore/blueprint/add/add.d.ts +3 -0
  4. package/lib/datastore/blueprint/add/add.js +109 -0
  5. package/lib/datastore/blueprint/add/add.spec.d.ts +1 -0
  6. package/lib/datastore/blueprint/add/add.spec.js +82 -0
  7. package/lib/datastore/blueprint/blueprintCommand.d.ts +3 -0
  8. package/lib/datastore/blueprint/blueprintCommand.js +21 -0
  9. package/lib/datastore/blueprint/list/list.d.ts +3 -0
  10. package/lib/datastore/blueprint/list/list.js +74 -0
  11. package/lib/datastore/blueprint/list/list.spec.d.ts +1 -0
  12. package/lib/datastore/blueprint/list/list.spec.js +50 -0
  13. package/lib/datastore/blueprint/rename/rename.d.ts +3 -0
  14. package/lib/datastore/blueprint/rename/rename.js +83 -0
  15. package/lib/datastore/blueprint/rename/rename.spec.d.ts +1 -0
  16. package/lib/datastore/blueprint/rename/rename.spec.js +92 -0
  17. package/lib/datastore/blueprint/update/update.d.ts +3 -0
  18. package/lib/datastore/blueprint/update/update.js +87 -0
  19. package/lib/datastore/blueprint/update/update.spec.d.ts +1 -0
  20. package/lib/datastore/blueprint/update/update.spec.js +99 -0
  21. package/lib/datastore/bundle/bundle.d.ts +3 -0
  22. package/lib/datastore/bundle/bundle.js +174 -0
  23. package/lib/datastore/bundle/bundle.spec.d.ts +1 -0
  24. package/lib/datastore/bundle/bundle.spec.js +93 -0
  25. package/lib/datastore/index.d.ts +3 -0
  26. package/lib/datastore/index.js +16 -0
  27. package/lib/datastore/simulator/add/add.d.ts +3 -0
  28. package/lib/datastore/simulator/add/add.js +138 -0
  29. package/lib/datastore/simulator/add/add.spec.d.ts +1 -0
  30. package/lib/datastore/simulator/add/add.spec.js +123 -0
  31. package/lib/datastore/simulator/clear/clear.d.ts +3 -0
  32. package/lib/datastore/simulator/clear/clear.js +70 -0
  33. package/lib/datastore/simulator/clear/clear.spec.d.ts +1 -0
  34. package/lib/datastore/simulator/clear/clear.spec.js +224 -0
  35. package/lib/datastore/simulator/list/list.d.ts +3 -0
  36. package/lib/datastore/simulator/list/list.js +118 -0
  37. package/lib/datastore/simulator/list/list.spec.d.ts +1 -0
  38. package/lib/datastore/simulator/list/list.spec.js +95 -0
  39. package/lib/datastore/simulator/pause/pause.d.ts +3 -0
  40. package/lib/datastore/simulator/pause/pause.js +85 -0
  41. package/lib/datastore/simulator/pause/pause.spec.d.ts +1 -0
  42. package/lib/datastore/simulator/pause/pause.spec.js +90 -0
  43. package/lib/datastore/simulator/remove/remove.d.ts +3 -0
  44. package/lib/datastore/simulator/remove/remove.js +68 -0
  45. package/lib/datastore/simulator/remove/remove.spec.d.ts +1 -0
  46. package/lib/datastore/simulator/remove/remove.spec.js +224 -0
  47. package/lib/datastore/simulator/resume/resume.d.ts +3 -0
  48. package/lib/datastore/simulator/resume/resume.js +85 -0
  49. package/lib/datastore/simulator/resume/resume.spec.d.ts +1 -0
  50. package/lib/datastore/simulator/resume/resume.spec.js +90 -0
  51. package/lib/datastore/simulator/simulatorCommand.d.ts +3 -0
  52. package/lib/datastore/simulator/simulatorCommand.js +27 -0
  53. package/lib/datastore/simulator/upgrade/upgrade.d.ts +3 -0
  54. package/lib/datastore/simulator/upgrade/upgrade.js +160 -0
  55. package/lib/datastore/simulator/upgrade/upgrade.spec.d.ts +1 -0
  56. package/lib/datastore/simulator/upgrade/upgrade.spec.js +204 -0
  57. package/lib/datastore/simulator/utils.d.ts +24 -0
  58. package/lib/datastore/simulator/utils.js +196 -0
  59. package/lib/datastore/simulator/utils.spec.d.ts +1 -0
  60. package/lib/datastore/simulator/utils.spec.js +165 -0
  61. package/lib/datastore/utils.d.ts +18 -0
  62. package/lib/datastore/utils.js +229 -0
  63. package/lib/datastore/utils.spec.d.ts +1 -0
  64. package/lib/datastore/utils.spec.js +92 -0
  65. package/lib/dxp.js +2 -0
  66. package/package.json +6 -4
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const commander_1 = require("commander");
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const ora_1 = __importDefault(require("ora"));
18
+ const utils_1 = require("../../utils");
19
+ const utils_2 = require("../utils");
20
+ const createPauseCommand = () => {
21
+ const pauseCommand = new commander_1.Command('pause')
22
+ .name('pause')
23
+ .description('Pauses the simulator')
24
+ .addOption(new commander_1.Option('-b, --blueprint <string>', 'Path to your datastore API yaml file.'))
25
+ .configureOutput({
26
+ outputError(str, write) {
27
+ write(chalk_1.default.red(str));
28
+ },
29
+ })
30
+ .action((options) => __awaiter(void 0, void 0, void 0, function* () {
31
+ yield (0, utils_1.throwErrorIfNotLoggedIn)(pauseCommand);
32
+ console.log('');
33
+ if (options.blueprint !== undefined) {
34
+ const { fullPath, dirPath, yamlFile, containerName } = (0, utils_2.getSimulatorDetails)(options.blueprint);
35
+ const command = `docker stop ${containerName}`;
36
+ const spinner = (0, ora_1.default)();
37
+ try {
38
+ yield (0, utils_2.checkUpdateAvailable)();
39
+ spinner.start('Pausing simulator.');
40
+ yield (0, utils_2.checkDockerInstalled)();
41
+ yield (0, utils_2.executeCommand)(command);
42
+ spinner.succeed(`Done! Container ID “${containerName}” paused.`);
43
+ return;
44
+ }
45
+ catch (error) {
46
+ const errorMsg = 'Did not pause because of an unexpected error. Ask for help in our support forums.';
47
+ (0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
48
+ spinner.fail(errorMsg);
49
+ (0, utils_1.handleCommandError)(pauseCommand, error);
50
+ }
51
+ }
52
+ else {
53
+ const command = 'docker ps --filter "name=datastore-sim-*" --filter "status=running" --format "{{.Names}}"';
54
+ const spinner = (0, ora_1.default)();
55
+ try {
56
+ yield (0, utils_2.checkUpdateAvailable)();
57
+ spinner.start('Pausing all simulators.');
58
+ yield (0, utils_2.checkDockerInstalled)();
59
+ const containerCommand = yield (0, utils_2.executeCommand)(command);
60
+ if (containerCommand === '') {
61
+ throw new Error('Sorry, all simulators are already paused.');
62
+ }
63
+ const containers = containerCommand.split(/\s+/).join(' ');
64
+ const results = yield (0, utils_2.executeCommand)(`docker stop ${containers}`);
65
+ results.split(/\s+/).forEach((result) => {
66
+ if (result !== '') {
67
+ spinner.succeed(`Done! Container ID “${result}” paused.`);
68
+ }
69
+ });
70
+ return;
71
+ }
72
+ catch (error) {
73
+ const errorMsg = 'Did not pause because of an unexpected error. Ask for help in our support forums.';
74
+ (0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
75
+ spinner.fail(errorMsg);
76
+ (0, utils_1.handleCommandError)(pauseCommand, error);
77
+ }
78
+ }
79
+ }));
80
+ if (process.env.ENABLE_OVERRIDE_DATASTORE_URL === 'true') {
81
+ pauseCommand.addOption(new commander_1.Option('-i, --image <string>', 'Override the docker image'));
82
+ }
83
+ return pauseCommand;
84
+ };
85
+ exports.default = createPauseCommand;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const pause_1 = __importDefault(require("./pause"));
39
+ const utils = __importStar(require("../utils"));
40
+ const logSpy = jest.spyOn(global.console, 'log');
41
+ const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
42
+ return undefined;
43
+ }); // prevent process exit on error
44
+ beforeEach(() => {
45
+ jest.resetAllMocks();
46
+ });
47
+ describe('datastoreSimulatorPause', () => {
48
+ it('should pause a simulator', () => __awaiter(void 0, void 0, void 0, function* () {
49
+ const checkUpdateAvailableSpy = jest
50
+ .spyOn(utils, 'checkUpdateAvailable')
51
+ .mockImplementation(() => {
52
+ return Promise.resolve(null);
53
+ });
54
+ const forcePromptSpy = jest
55
+ .spyOn(utils, 'forcePrompt')
56
+ .mockResolvedValue(true);
57
+ let executeCommandCount = 0;
58
+ const executeCommandSpy = jest
59
+ .spyOn(utils, 'executeCommand')
60
+ .mockImplementation((cmd, opt) => {
61
+ executeCommandCount++;
62
+ switch (executeCommandCount) {
63
+ case 1:
64
+ expect(cmd).toStrictEqual('docker -v');
65
+ return Promise.resolve('Docker version 20.10.23, build 7155243');
66
+ case 2:
67
+ expect(cmd).toStrictEqual('docker stop datastore-sim-119726bb');
68
+ return Promise.resolve('');
69
+ }
70
+ return Promise.reject(false);
71
+ });
72
+ const program = (0, pause_1.default)();
73
+ const commandErrorSpy = jest.spyOn(program, 'error');
74
+ yield program.parseAsync([
75
+ 'node',
76
+ 'dxp-cli',
77
+ 'datastore',
78
+ 'simulator',
79
+ 'pause',
80
+ '-b',
81
+ '/path/to/blueprint.yaml',
82
+ ]);
83
+ const opts = program.opts();
84
+ expect(opts.blueprint).toEqual('/path/to/blueprint.yaml');
85
+ expect(checkUpdateAvailableSpy).toHaveBeenCalledTimes(1);
86
+ expect(commandErrorSpy).not.toHaveBeenCalled();
87
+ expect(logSpy).toHaveBeenCalledTimes(1);
88
+ expect(executeCommandSpy).toHaveBeenCalledTimes(2);
89
+ }));
90
+ });
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ declare const createRemoveCommand: () => Command;
3
+ export default createRemoveCommand;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const commander_1 = require("commander");
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const ora_1 = __importDefault(require("ora"));
18
+ const utils_1 = require("../../utils");
19
+ const utils_2 = require("../utils");
20
+ const createRemoveCommand = () => {
21
+ const removeCommand = new commander_1.Command('remove')
22
+ .name('remove')
23
+ .description('Removes a datastore simulator')
24
+ .addOption(new commander_1.Option('-b, --blueprint <string>', 'Path to your datastore API yaml file.').makeOptionMandatory())
25
+ .addOption(new commander_1.Option('-f, --force', 'Force the removal of the datastore simulator'))
26
+ .configureOutput({
27
+ outputError(str, write) {
28
+ write(chalk_1.default.red(str));
29
+ },
30
+ })
31
+ .action((options) => __awaiter(void 0, void 0, void 0, function* () {
32
+ console.log('');
33
+ const spinner = (0, ora_1.default)();
34
+ try {
35
+ yield (0, utils_2.checkUpdateAvailable)();
36
+ yield (0, utils_2.checkDockerInstalled)();
37
+ const forceMessage = 'Removing a simulator can not be undone. Are you sure you want to continue? (y/N)';
38
+ if (!options.force) {
39
+ if ((yield (0, utils_2.forcePrompt)(forceMessage, false)) === false) {
40
+ const removeGuide = `To remove run:\n $ dxp-next datastore simulator remove --blueprint ${options.blueprint} --force\n`;
41
+ throw new Error(removeGuide);
42
+ }
43
+ }
44
+ spinner.start('Removing simulator blueprint.');
45
+ const { containerName } = (0, utils_2.getSimulatorDetails)(options.blueprint);
46
+ const containerCommand = yield (0, utils_2.executeCommand)(`docker ps -a --filter "name=${containerName}" --format "{{.Names}}"`);
47
+ if (containerCommand === '') {
48
+ throw new Error('Sorry, no simulator container found for that blueprint path. Please try again using a different path.');
49
+ }
50
+ try {
51
+ yield (0, utils_2.executeCommand)(`docker rm -f ${containerName}`);
52
+ }
53
+ catch (error) {
54
+ (0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
55
+ throw new Error('Unable to remove simulator.');
56
+ }
57
+ spinner.succeed(`Done! Completely removed container ID "${containerName}".`);
58
+ return;
59
+ }
60
+ catch (error) {
61
+ (0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
62
+ spinner.fail();
63
+ (0, utils_1.handleCommandError)(removeCommand, error);
64
+ }
65
+ }));
66
+ return removeCommand;
67
+ };
68
+ exports.default = createRemoveCommand;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const remove_1 = __importDefault(require("./remove"));
39
+ const utils = __importStar(require("../utils"));
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const logSpy = jest.spyOn(global.console, 'log');
42
+ const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
43
+ return undefined;
44
+ }); // prevent process exit on error
45
+ beforeEach(() => {
46
+ jest.resetAllMocks();
47
+ });
48
+ describe('datastoreSimulatorRemove', () => {
49
+ it('should not remove a simulator if prompt returns false', () => __awaiter(void 0, void 0, void 0, function* () {
50
+ const checkUpdateAvailableSpy = jest
51
+ .spyOn(utils, 'checkUpdateAvailable')
52
+ .mockImplementation(() => {
53
+ return Promise.resolve(null);
54
+ });
55
+ const forcePromptSpy = jest
56
+ .spyOn(utils, 'forcePrompt')
57
+ .mockResolvedValue(false);
58
+ let executeCommandCount = 0;
59
+ const executeCommandSpy = jest
60
+ .spyOn(utils, 'executeCommand')
61
+ .mockImplementation((cmd, opt) => {
62
+ executeCommandCount++;
63
+ switch (executeCommandCount) {
64
+ case 1:
65
+ expect(cmd).toStrictEqual('docker -v');
66
+ return Promise.resolve('Docker version 20.10.23, build 7155243');
67
+ }
68
+ return Promise.reject(false);
69
+ });
70
+ const program = (0, remove_1.default)();
71
+ const commandErrorSpy = jest.spyOn(program, 'error');
72
+ yield program.parseAsync([
73
+ 'node',
74
+ 'dxp-cli',
75
+ 'datastore',
76
+ 'simulator',
77
+ 'remove',
78
+ '-b',
79
+ '/path/to/blueprint.yaml',
80
+ ]);
81
+ const opts = program.opts();
82
+ expect(opts.blueprint).toEqual('/path/to/blueprint.yaml');
83
+ expect(checkUpdateAvailableSpy).toHaveBeenCalledTimes(1);
84
+ expect(commandErrorSpy).toHaveBeenCalledWith(chalk_1.default.red(`To remove run:
85
+ $ dxp-next datastore simulator remove --blueprint /path/to/blueprint.yaml --force
86
+ `));
87
+ expect(forcePromptSpy).toHaveBeenCalledWith('Removing a simulator can not be undone. Are you sure you want to continue? (y/N)', false);
88
+ expect(logSpy).toHaveBeenCalledTimes(1);
89
+ expect(executeCommandSpy).toHaveBeenCalledTimes(1);
90
+ }));
91
+ it('should remove a simulator if prompt returns true', () => __awaiter(void 0, void 0, void 0, function* () {
92
+ const checkUpdateAvailableSpy = jest
93
+ .spyOn(utils, 'checkUpdateAvailable')
94
+ .mockImplementation(() => {
95
+ return Promise.resolve(null);
96
+ });
97
+ const forcePromptSpy = jest
98
+ .spyOn(utils, 'forcePrompt')
99
+ .mockResolvedValue(true);
100
+ let executeCommandCount = 0;
101
+ const executeCommandSpy = jest
102
+ .spyOn(utils, 'executeCommand')
103
+ .mockImplementation((cmd, opt) => {
104
+ executeCommandCount++;
105
+ switch (executeCommandCount) {
106
+ case 1:
107
+ expect(cmd).toStrictEqual('docker -v');
108
+ return Promise.resolve('Docker version 20.10.23, build 7155243');
109
+ case 2:
110
+ expect(cmd).toStrictEqual('docker ps -a --filter "name=datastore-sim-119726bb" --format "{{.Names}}"');
111
+ return Promise.resolve('datastore-sim-119726bb');
112
+ case 3:
113
+ expect(cmd).toStrictEqual('docker rm -f datastore-sim-119726bb');
114
+ return Promise.resolve('');
115
+ }
116
+ return Promise.reject(false);
117
+ });
118
+ const program = (0, remove_1.default)();
119
+ const commandErrorSpy = jest.spyOn(program, 'error');
120
+ yield program.parseAsync([
121
+ 'node',
122
+ 'dxp-cli',
123
+ 'datastore',
124
+ 'simulator',
125
+ 'remove',
126
+ '-b',
127
+ '/path/to/blueprint.yaml',
128
+ ]);
129
+ const opts = program.opts();
130
+ expect(opts.blueprint).toEqual('/path/to/blueprint.yaml');
131
+ expect(checkUpdateAvailableSpy).toHaveBeenCalledTimes(1);
132
+ expect(commandErrorSpy).not.toHaveBeenCalled();
133
+ expect(forcePromptSpy).toHaveBeenCalledWith('Removing a simulator can not be undone. Are you sure you want to continue? (y/N)', false);
134
+ expect(logSpy).toHaveBeenCalledTimes(1);
135
+ expect(executeCommandSpy).toHaveBeenCalledTimes(3);
136
+ }));
137
+ it('should remove a simulator if --force set', () => __awaiter(void 0, void 0, void 0, function* () {
138
+ const checkUpdateAvailableSpy = jest
139
+ .spyOn(utils, 'checkUpdateAvailable')
140
+ .mockImplementation(() => {
141
+ return Promise.resolve(null);
142
+ });
143
+ const forcePromptSpy = jest
144
+ .spyOn(utils, 'forcePrompt')
145
+ .mockResolvedValue(true);
146
+ let executeCommandCount = 0;
147
+ const executeCommandSpy = jest
148
+ .spyOn(utils, 'executeCommand')
149
+ .mockImplementation((cmd, opt) => {
150
+ executeCommandCount++;
151
+ switch (executeCommandCount) {
152
+ case 1:
153
+ expect(cmd).toStrictEqual('docker -v');
154
+ return Promise.resolve('Docker version 20.10.23, build 7155243');
155
+ case 2:
156
+ expect(cmd).toStrictEqual('docker ps -a --filter "name=datastore-sim-119726bb" --format "{{.Names}}"');
157
+ return Promise.resolve('datastore-sim-119726bb');
158
+ case 3:
159
+ expect(cmd).toStrictEqual('docker rm -f datastore-sim-119726bb');
160
+ return Promise.resolve('');
161
+ }
162
+ return Promise.reject(false);
163
+ });
164
+ const program = (0, remove_1.default)();
165
+ const commandErrorSpy = jest.spyOn(program, 'error');
166
+ yield program.parseAsync([
167
+ 'node',
168
+ 'dxp-cli',
169
+ 'datastore',
170
+ 'simulator',
171
+ 'remove',
172
+ '-b',
173
+ '/path/to/blueprint.yaml',
174
+ '--force',
175
+ ]);
176
+ const opts = program.opts();
177
+ expect(opts.blueprint).toEqual('/path/to/blueprint.yaml');
178
+ expect(checkUpdateAvailableSpy).toHaveBeenCalledTimes(1);
179
+ expect(commandErrorSpy).not.toHaveBeenCalled();
180
+ expect(forcePromptSpy).not.toHaveBeenCalled();
181
+ expect(logSpy).toHaveBeenCalledTimes(1);
182
+ expect(executeCommandSpy).toHaveBeenCalledTimes(3);
183
+ }));
184
+ it('should not remove a simulator if no matching simulator found', () => __awaiter(void 0, void 0, void 0, function* () {
185
+ const checkUpdateAvailableSpy = jest
186
+ .spyOn(utils, 'checkUpdateAvailable')
187
+ .mockImplementation(() => {
188
+ return Promise.resolve(null);
189
+ });
190
+ let executeCommandCount = 0;
191
+ const executeCommandSpy = jest
192
+ .spyOn(utils, 'executeCommand')
193
+ .mockImplementation((cmd, opt) => {
194
+ executeCommandCount++;
195
+ switch (executeCommandCount) {
196
+ case 1:
197
+ expect(cmd).toStrictEqual('docker -v');
198
+ return Promise.resolve('Docker version 20.10.23, build 7155243');
199
+ case 2:
200
+ expect(cmd).toStrictEqual('docker ps -a --filter "name=datastore-sim-119726bb" --format "{{.Names}}"');
201
+ return Promise.resolve('');
202
+ }
203
+ return Promise.reject(false);
204
+ });
205
+ const program = (0, remove_1.default)();
206
+ const commandErrorSpy = jest.spyOn(program, 'error');
207
+ yield program.parseAsync([
208
+ 'node',
209
+ 'dxp-cli',
210
+ 'datastore',
211
+ 'simulator',
212
+ 'remove',
213
+ '-b',
214
+ '/path/to/blueprint.yaml',
215
+ '--force',
216
+ ]);
217
+ const opts = program.opts();
218
+ expect(opts.blueprint).toEqual('/path/to/blueprint.yaml');
219
+ expect(checkUpdateAvailableSpy).toHaveBeenCalledTimes(1);
220
+ expect(commandErrorSpy).toHaveBeenCalledWith(chalk_1.default.red('Sorry, no simulator container found for that blueprint path. Please try again using a different path.'));
221
+ expect(logSpy).toHaveBeenCalledTimes(1);
222
+ expect(executeCommandSpy).toHaveBeenCalledTimes(2);
223
+ }));
224
+ });
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ declare const createResumeCommand: () => Command;
3
+ export default createResumeCommand;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const commander_1 = require("commander");
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const ora_1 = __importDefault(require("ora"));
18
+ const utils_1 = require("../../utils");
19
+ const utils_2 = require("../utils");
20
+ const createResumeCommand = () => {
21
+ const resumeCommand = new commander_1.Command('resume')
22
+ .name('resume')
23
+ .description('Resumes the simulator')
24
+ .addOption(new commander_1.Option('-b, --blueprint <string>', 'Path to your datastore API yaml file.'))
25
+ .configureOutput({
26
+ outputError(str, write) {
27
+ write(chalk_1.default.red(str));
28
+ },
29
+ })
30
+ .action((options) => __awaiter(void 0, void 0, void 0, function* () {
31
+ yield (0, utils_1.throwErrorIfNotLoggedIn)(resumeCommand);
32
+ console.log('');
33
+ if (options.blueprint !== undefined) {
34
+ const { fullPath, dirPath, yamlFile, containerName } = (0, utils_2.getSimulatorDetails)(options.blueprint);
35
+ const command = `docker start ${containerName}`;
36
+ const spinner = (0, ora_1.default)();
37
+ try {
38
+ yield (0, utils_2.checkUpdateAvailable)();
39
+ spinner.start('Resuming simulator.');
40
+ yield (0, utils_2.checkDockerInstalled)();
41
+ yield (0, utils_2.executeCommand)(command);
42
+ spinner.succeed(`Done! Container ID “${containerName}” resumed.`);
43
+ return;
44
+ }
45
+ catch (error) {
46
+ const errorMsg = 'Did not resume because of an unexpected error. Ask for help in our support forums.';
47
+ (0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
48
+ spinner.fail(errorMsg);
49
+ (0, utils_1.handleCommandError)(resumeCommand, error);
50
+ }
51
+ }
52
+ else {
53
+ const command = 'docker ps --filter "name=datastore-sim-*" --filter "status=exited" --format "{{.Names}}"';
54
+ const spinner = (0, ora_1.default)();
55
+ try {
56
+ yield (0, utils_2.checkUpdateAvailable)();
57
+ spinner.start('Resuming all simulators.');
58
+ yield (0, utils_2.checkDockerInstalled)();
59
+ const containerCommand = yield (0, utils_2.executeCommand)(command);
60
+ if (containerCommand === '') {
61
+ throw new Error('Sorry, all simulators are already running.');
62
+ }
63
+ const containers = containerCommand.split(/\s+/).join(' ');
64
+ const results = yield (0, utils_2.executeCommand)(`docker start ${containers}`);
65
+ results.split(/\s+/).forEach((result) => {
66
+ if (result !== '') {
67
+ spinner.succeed(`Done! Container ID “${result}” paused.`);
68
+ }
69
+ });
70
+ return;
71
+ }
72
+ catch (error) {
73
+ const errorMsg = 'Did not resume because of an unexpected error. Ask for help in our support forums.';
74
+ (0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
75
+ spinner.fail(errorMsg);
76
+ (0, utils_1.handleCommandError)(resumeCommand, error);
77
+ }
78
+ }
79
+ }));
80
+ if (process.env.ENABLE_OVERRIDE_DATASTORE_URL === 'true') {
81
+ resumeCommand.addOption(new commander_1.Option('-i, --image <string>', 'Override the docker image'));
82
+ }
83
+ return resumeCommand;
84
+ };
85
+ exports.default = createResumeCommand;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const resume_1 = __importDefault(require("./resume"));
39
+ const utils = __importStar(require("../utils"));
40
+ const logSpy = jest.spyOn(global.console, 'log');
41
+ const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
42
+ return undefined;
43
+ }); // prevent process exit on error
44
+ beforeEach(() => {
45
+ jest.resetAllMocks();
46
+ });
47
+ describe('datastoreSimulatorResume', () => {
48
+ it('should resume a simulator', () => __awaiter(void 0, void 0, void 0, function* () {
49
+ const checkUpdateAvailableSpy = jest
50
+ .spyOn(utils, 'checkUpdateAvailable')
51
+ .mockImplementation(() => {
52
+ return Promise.resolve(null);
53
+ });
54
+ const forcePromptSpy = jest
55
+ .spyOn(utils, 'forcePrompt')
56
+ .mockResolvedValue(true);
57
+ let executeCommandCount = 0;
58
+ const executeCommandSpy = jest
59
+ .spyOn(utils, 'executeCommand')
60
+ .mockImplementation((cmd, opt) => {
61
+ executeCommandCount++;
62
+ switch (executeCommandCount) {
63
+ case 1:
64
+ expect(cmd).toStrictEqual('docker -v');
65
+ return Promise.resolve('Docker version 20.10.23, build 7155243');
66
+ case 2:
67
+ expect(cmd).toStrictEqual('docker start datastore-sim-119726bb');
68
+ return Promise.resolve('');
69
+ }
70
+ return Promise.reject(false);
71
+ });
72
+ const program = (0, resume_1.default)();
73
+ const commandErrorSpy = jest.spyOn(program, 'error');
74
+ yield program.parseAsync([
75
+ 'node',
76
+ 'dxp-cli',
77
+ 'datastore',
78
+ 'simulator',
79
+ 'resume',
80
+ '-b',
81
+ '/path/to/blueprint.yaml',
82
+ ]);
83
+ const opts = program.opts();
84
+ expect(opts.blueprint).toEqual('/path/to/blueprint.yaml');
85
+ expect(checkUpdateAvailableSpy).toHaveBeenCalledTimes(1);
86
+ expect(commandErrorSpy).not.toHaveBeenCalled();
87
+ expect(logSpy).toHaveBeenCalledTimes(1);
88
+ expect(executeCommandSpy).toHaveBeenCalledTimes(2);
89
+ }));
90
+ });
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ declare const createSimulatorCommand: () => Command;
3
+ export default createSimulatorCommand;