@govuk-pay/cli 0.0.30 → 0.0.32

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 (57) hide show
  1. package/package.json +4 -2
  2. package/resources/pay-local/config/localstack/init-aws.sh +70 -0
  3. package/resources/pay-local/config/postgres/docker-entrypoint-initdb.d/make_payments_databases.sql +26 -0
  4. package/resources/pay-local/config/service_config.yaml +193 -0
  5. package/resources/pay-local/config/services/adminusers.env +49 -0
  6. package/resources/pay-local/config/services/cardid.env +2 -0
  7. package/resources/pay-local/config/services/connector.env +70 -0
  8. package/resources/pay-local/config/services/demo-service.env +10 -0
  9. package/resources/pay-local/config/services/egress/squid.conf +47 -0
  10. package/resources/pay-local/config/services/frontend.env +12 -0
  11. package/resources/pay-local/config/services/java_app.env +1 -0
  12. package/resources/pay-local/config/services/ledger.env +10 -0
  13. package/resources/pay-local/config/services/products-ui.env +14 -0
  14. package/resources/pay-local/config/services/products.env +25 -0
  15. package/resources/pay-local/config/services/publicapi.env +13 -0
  16. package/resources/pay-local/config/services/publicauth.env +13 -0
  17. package/resources/pay-local/config/services/selfservice.env +21 -0
  18. package/resources/pay-local/config/services/ssl/certs/frontend-proxy.crt +18 -0
  19. package/resources/pay-local/config/services/ssl/certs/products-ui-proxy.crt +20 -0
  20. package/resources/pay-local/config/services/ssl/certs/publicapi-proxy.crt +18 -0
  21. package/resources/pay-local/config/services/ssl/certs/selfservice-proxy.crt +20 -0
  22. package/resources/pay-local/config/services/ssl/certs/stubs-proxy.crt +18 -0
  23. package/resources/pay-local/config/services/ssl/keys/frontend-proxy.key +28 -0
  24. package/resources/pay-local/config/services/ssl/keys/products-ui-proxy.key +28 -0
  25. package/resources/pay-local/config/services/ssl/keys/publicapi-proxy.key +28 -0
  26. package/resources/pay-local/config/services/ssl/keys/selfservice-proxy.key +28 -0
  27. package/resources/pay-local/config/services/ssl/keys/stubs-proxy.key +28 -0
  28. package/resources/pay-local/config/services/ssl/make-selfsigned.sh +2 -0
  29. package/resources/pay-local/config/services/stubs.env +12 -0
  30. package/resources/pay-local/config/services/toolbox.env +6 -0
  31. package/resources/pay-local/config/services/webhooks.env +9 -0
  32. package/resources/pay-local/templates/docker-compose.hbs +276 -0
  33. package/resources/usageDetails.txt +1 -0
  34. package/src/commands/local/app_client/app_client.js +232 -0
  35. package/src/commands/local/app_client/fetch_wrapper.js +106 -0
  36. package/src/commands/local/config/default_config_setup.js +13 -0
  37. package/src/commands/local/config/last_up_record.js +50 -0
  38. package/src/commands/local/config/pay_local_cluster.js +225 -0
  39. package/src/commands/local/config/renderer.js +46 -0
  40. package/src/commands/local/docker_compose_controller.js +24 -0
  41. package/src/commands/local/subcommands/account.js +51 -0
  42. package/src/commands/local/subcommands/browse.js +39 -0
  43. package/src/commands/local/subcommands/db.js +82 -0
  44. package/src/commands/local/subcommands/down.js +56 -0
  45. package/src/commands/local/subcommands/nuke.js +28 -0
  46. package/src/commands/local/subcommands/otp.js +27 -0
  47. package/src/commands/local/subcommands/payment.js +68 -0
  48. package/src/commands/local/subcommands/paymentlink.js +41 -0
  49. package/src/commands/local/subcommands/restart.js +35 -0
  50. package/src/commands/local/subcommands/token.js +66 -0
  51. package/src/commands/local/subcommands/up.js +55 -0
  52. package/src/commands/local/subcommands/url.js +44 -0
  53. package/src/commands/local/subcommands/user.js +91 -0
  54. package/src/commands/local.js +136 -0
  55. package/src/core/commandRouter.js +4 -0
  56. package/src/util/configs.js +47 -0
  57. package/src/util/md5.js +16 -0
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const app_client_js_1 = __importDefault(require("../app_client/app_client.js"));
7
+ const totp_generator_1 = require("totp-generator");
8
+ const node_child_process_1 = require("node:child_process");
9
+ async function UserHandler(options) {
10
+ const args = parseArguments(options);
11
+ if (await app_client_js_1.default.isUnhealthy('adminusers')) {
12
+ console.error('The adminusers service is unhealthy, so a user cannot be created');
13
+ return;
14
+ }
15
+ if (await app_client_js_1.default.isUnhealthy('connector')) {
16
+ console.error('The connector service is unhealthy, so a user cannot be created');
17
+ return;
18
+ }
19
+ console.warn('Creating card gateway account and API token');
20
+ const serviceExternalID = await app_client_js_1.default.createService();
21
+ if (serviceExternalID === undefined) {
22
+ console.error('Service creation failed');
23
+ return;
24
+ }
25
+ const account = await app_client_js_1.default.createAccountInServiceWithEmailCollectionMode(serviceExternalID, 'MANDATORY');
26
+ if (account === undefined) {
27
+ console.error('Failed to create a fully set up account');
28
+ return;
29
+ }
30
+ const apiToken = await app_client_js_1.default.createToken(account.gateway_account_id);
31
+ if (apiToken === undefined) {
32
+ console.error('Failed to create an API token');
33
+ return;
34
+ }
35
+ if (args.createPayments !== undefined && args.createPayments) {
36
+ console.warn('💸 Creating 10 payments in card sandbox gateway account (each . is a success, each ! is a failure)');
37
+ let createPaymentResult;
38
+ for (let i = 0; i < 10; i++) {
39
+ createPaymentResult = await app_client_js_1.default.createPayment(apiToken);
40
+ if (createPaymentResult === undefined) {
41
+ process.stderr.write('!');
42
+ }
43
+ else {
44
+ process.stderr.write('.');
45
+ }
46
+ }
47
+ }
48
+ console.warn('🤓 Creating admin user for service');
49
+ const user = await app_client_js_1.default.createUser([account.gateway_account_id], 'admin');
50
+ if (user === undefined) {
51
+ console.error('Failed to create an admin user');
52
+ return;
53
+ }
54
+ console.warn('😎 Creating view-only user for service');
55
+ const viewOnlyUser = await app_client_js_1.default.createUser([account.gateway_account_id], 'view-only');
56
+ if (viewOnlyUser === undefined) {
57
+ console.error('Failed to create a view-only user, continuing anyway since the admin user was successfully created');
58
+ }
59
+ const { otp } = totp_generator_1.TOTP.generate(user.otp_key);
60
+ console.log(`📧 Email: ${user.email}`);
61
+ console.log(`🛂 Password: ${user.password}`);
62
+ console.log(`🔑 OTP key: ${user.otp_key}`);
63
+ console.log(`📱 OTP token: ${otp}`);
64
+ console.log(`💁 Service ID: ${serviceExternalID}`);
65
+ console.log(`💳 Card gateway account ID: ${account.external_id}`);
66
+ console.log(`🎫 Card API token: ${apiToken}`);
67
+ console.log();
68
+ let selfserviceUrl;
69
+ if (await app_client_js_1.default.isProxyHealthy('selfservice')) {
70
+ selfserviceUrl = app_client_js_1.default.externalUrlFor('selfservice', '/', true);
71
+ }
72
+ else {
73
+ selfserviceUrl = app_client_js_1.default.externalUrlFor('selfservice', '/', false);
74
+ }
75
+ copyToClipboard(user.email);
76
+ console.log(`📋 “${user.email}” copied to clipboard`);
77
+ console.log(`🌎 Opening selfservice (${selfserviceUrl}) browser`);
78
+ console.log();
79
+ (0, node_child_process_1.spawn)('open', [selfserviceUrl]);
80
+ }
81
+ exports.default = UserHandler;
82
+ function copyToClipboard(email) {
83
+ const proc = (0, node_child_process_1.spawn)('pbcopy');
84
+ proc.stdin.write(email);
85
+ proc.stdin.end();
86
+ }
87
+ function parseArguments(_options) {
88
+ return {
89
+ createPayments: false
90
+ };
91
+ }
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const standardContent_js_1 = require("../core/standardContent.js");
7
+ const otp_js_1 = __importDefault(require("./local/subcommands/otp.js"));
8
+ const up_js_1 = __importDefault(require("./local/subcommands/up.js"));
9
+ const down_js_1 = __importDefault(require("./local/subcommands/down.js"));
10
+ const nuke_js_1 = __importDefault(require("./local/subcommands/nuke.js"));
11
+ const restart_js_1 = __importDefault(require("./local/subcommands/restart.js"));
12
+ const paymentlink_js_1 = __importDefault(require("./local/subcommands/paymentlink.js"));
13
+ const url_js_1 = __importDefault(require("./local/subcommands/url.js"));
14
+ const browse_js_1 = __importDefault(require("./local/subcommands/browse.js"));
15
+ const db_js_1 = __importDefault(require("./local/subcommands/db.js"));
16
+ const account_js_1 = __importDefault(require("./local/subcommands/account.js"));
17
+ const token_js_1 = __importDefault(require("./local/subcommands/token.js"));
18
+ const payment_js_1 = __importDefault(require("./local/subcommands/payment.js"));
19
+ const user_js_1 = __importDefault(require("./local/subcommands/user.js"));
20
+ var LocalCommand;
21
+ (function (LocalCommand) {
22
+ LocalCommand["OTP"] = "otp";
23
+ LocalCommand["Up"] = "up";
24
+ LocalCommand["Launch"] = "launch";
25
+ LocalCommand["Down"] = "down";
26
+ LocalCommand["Restart"] = "restart";
27
+ LocalCommand["Nuke"] = "nuke";
28
+ LocalCommand["PaymentLink"] = "paymentlink";
29
+ LocalCommand["Browse"] = "browse";
30
+ LocalCommand["Url"] = "url";
31
+ LocalCommand["DB"] = "db";
32
+ LocalCommand["Token"] = "token";
33
+ LocalCommand["Payment"] = "payment";
34
+ LocalCommand["Account"] = "account";
35
+ LocalCommand["User"] = "user";
36
+ LocalCommand["Help"] = "help";
37
+ LocalCommand["Unknown"] = "Unknown";
38
+ })(LocalCommand || (LocalCommand = {}));
39
+ async function localHandler(options) {
40
+ await (0, standardContent_js_1.showHeader)();
41
+ const { subcommand, subcommandOptions } = parseArguments(options);
42
+ switch (subcommand) {
43
+ case LocalCommand.OTP: {
44
+ await (0, otp_js_1.default)(subcommandOptions);
45
+ break;
46
+ }
47
+ case LocalCommand.PaymentLink: {
48
+ await (0, paymentlink_js_1.default)(subcommandOptions);
49
+ break;
50
+ }
51
+ case LocalCommand.Browse: {
52
+ await (0, browse_js_1.default)(subcommandOptions);
53
+ break;
54
+ }
55
+ case LocalCommand.Account: {
56
+ await (0, account_js_1.default)(subcommandOptions);
57
+ break;
58
+ }
59
+ case LocalCommand.Url: {
60
+ await (0, url_js_1.default)(subcommandOptions);
61
+ break;
62
+ }
63
+ case LocalCommand.DB: {
64
+ await (0, db_js_1.default)(subcommandOptions);
65
+ break;
66
+ }
67
+ case LocalCommand.Token: {
68
+ await (0, token_js_1.default)(subcommandOptions);
69
+ break;
70
+ }
71
+ case LocalCommand.Payment: {
72
+ await (0, payment_js_1.default)(subcommandOptions);
73
+ break;
74
+ }
75
+ case LocalCommand.User: {
76
+ await (0, user_js_1.default)(subcommandOptions);
77
+ break;
78
+ }
79
+ case LocalCommand.Up: {
80
+ await (0, up_js_1.default)(subcommandOptions);
81
+ break;
82
+ }
83
+ case LocalCommand.Launch: {
84
+ await (0, up_js_1.default)(subcommandOptions);
85
+ break;
86
+ }
87
+ case LocalCommand.Down: {
88
+ await (0, down_js_1.default)(subcommandOptions);
89
+ break;
90
+ }
91
+ case LocalCommand.Restart: {
92
+ await (0, restart_js_1.default)(subcommandOptions);
93
+ break;
94
+ }
95
+ case LocalCommand.Nuke: {
96
+ await (0, nuke_js_1.default)();
97
+ break;
98
+ }
99
+ case LocalCommand.Help:
100
+ case LocalCommand.Unknown: {
101
+ help();
102
+ break;
103
+ }
104
+ default: {
105
+ help();
106
+ break;
107
+ }
108
+ }
109
+ }
110
+ exports.default = localHandler;
111
+ // TODO: Replace this with yargs
112
+ function parseArguments(options) {
113
+ const subcommandOptions = options.arguments;
114
+ const subcommand = subcommandOptions.shift();
115
+ switch (subcommand) {
116
+ case LocalCommand.OTP: return { subcommand, subcommandOptions };
117
+ case LocalCommand.PaymentLink: return { subcommand, subcommandOptions };
118
+ case LocalCommand.Url: return { subcommand, subcommandOptions };
119
+ case LocalCommand.Browse: return { subcommand, subcommandOptions };
120
+ case LocalCommand.Account: return { subcommand, subcommandOptions };
121
+ case LocalCommand.Up: return { subcommand, subcommandOptions };
122
+ case LocalCommand.DB: return { subcommand, subcommandOptions };
123
+ case LocalCommand.Token: return { subcommand, subcommandOptions };
124
+ case LocalCommand.Payment: return { subcommand, subcommandOptions };
125
+ case LocalCommand.User: return { subcommand, subcommandOptions };
126
+ case LocalCommand.Launch: return { subcommand, subcommandOptions };
127
+ case LocalCommand.Down: return { subcommand, subcommandOptions };
128
+ case LocalCommand.Restart: return { subcommand, subcommandOptions };
129
+ case LocalCommand.Nuke: return { subcommand, subcommandOptions };
130
+ case LocalCommand.Help: return { subcommand, subcommandOptions };
131
+ default: return { subcommand: LocalCommand.Unknown, subcommandOptions };
132
+ }
133
+ }
134
+ function help() {
135
+ console.error('USAGE FOLLOWS');
136
+ }
@@ -7,6 +7,7 @@ const standardContent_js_1 = require("./standardContent.js");
7
7
  const browse_js_1 = __importDefault(require("../commands/browse.js"));
8
8
  const demo_js_1 = __importDefault(require("../commands/demo.js"));
9
9
  const legacy_1 = __importDefault(require("../commands/legacy"));
10
+ const local_js_1 = __importDefault(require("../commands/local.js"));
10
11
  const help_1 = __importDefault(require("../commands/help"));
11
12
  const tunnel_js_1 = __importDefault(require("../commands/tunnel.js"));
12
13
  const package_json_1 = __importDefault(require("../../package.json"));
@@ -30,6 +31,9 @@ handlers.set('help', {
30
31
  handlers.set('local', {
31
32
  handler: legacy_1.default
32
33
  });
34
+ handlers.set('localx', {
35
+ handler: local_js_1.default
36
+ });
33
37
  handlers.set('schema', {
34
38
  handler: legacy_1.default
35
39
  });
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.workspaceEnvVar = exports.ensureConfigDirectory = exports.PAY_CLI_CONFIG_PATH = void 0;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = require("node:os");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ exports.PAY_CLI_CONFIG_PATH = node_path_1.default.join((0, node_os_1.homedir)(), '.pay-cli');
11
+ /**
12
+ * This function validates a config path within the pay cli config dir exists, if it does then it creates it.
13
+ * It does this by joining all the subPath param elements onto the end of the default config path
14
+ * using path.join.
15
+ *
16
+ * Returns the absolute file path
17
+ */
18
+ function ensureConfigDirectory(...subPath) {
19
+ const fullConfigDirPath = node_path_1.default.resolve(node_path_1.default.join(exports.PAY_CLI_CONFIG_PATH, ...subPath));
20
+ const configPathStat = node_fs_1.default.statSync(fullConfigDirPath, { throwIfNoEntry: false });
21
+ if (configPathStat === undefined) {
22
+ node_fs_1.default.mkdirSync(fullConfigDirPath, { mode: 0o770, recursive: true });
23
+ }
24
+ else if (!configPathStat.isDirectory()) {
25
+ throw new Error(`pay local config path ${fullConfigDirPath} already exists and is not a directory, cannot continue`);
26
+ }
27
+ return fullConfigDirPath;
28
+ }
29
+ exports.ensureConfigDirectory = ensureConfigDirectory;
30
+ /**
31
+ * This function validates the the WORKSPACE env var is set, and that it is directory that exists.
32
+ */
33
+ function workspaceEnvVar() {
34
+ const workspacePath = process.env.WORKSPACE;
35
+ if (workspacePath === undefined) {
36
+ throw new Error('Error, the WORKSPACE env var must be set to the parent directory of where you check out your pay repositories');
37
+ }
38
+ const workspacePathStat = node_fs_1.default.statSync(workspacePath, { throwIfNoEntry: false });
39
+ if (workspacePathStat === undefined) {
40
+ throw new Error(`Error, the WORKSPACE env var is set to '${workspacePath}' which doesn't exist. This must be set to the parent directory of where you check out your pay repositories`);
41
+ }
42
+ if (!workspacePathStat.isDirectory()) {
43
+ throw new Error(`Error, the WORKSPACE env var is set to '${workspacePath}' which exists, but is not a directory. This must be set to the parent directory of where you check out your pay repositories`);
44
+ }
45
+ return workspacePath;
46
+ }
47
+ exports.workspaceEnvVar = workspaceEnvVar;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.md5File = exports.md5String = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const node_fs_1 = require("node:fs");
6
+ function md5String(str) {
7
+ return md5Of(str);
8
+ }
9
+ exports.md5String = md5String;
10
+ function md5File(filePath) {
11
+ return md5Of((0, node_fs_1.readFileSync)(filePath));
12
+ }
13
+ exports.md5File = md5File;
14
+ function md5Of(data) {
15
+ return (0, node_crypto_1.createHash)('md5').update(data).digest('hex');
16
+ }