@ethlete/cli 2.1.0-next.5 → 2.1.0-next.6

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 (73) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +22 -2
  3. package/package.json +1 -1
  4. package/src/index.js +51 -11
  5. package/src/index.js.map +1 -1
  6. package/src/lib/api/api-command.d.ts +2 -1
  7. package/src/lib/api/api-command.js +2 -2
  8. package/src/lib/api/api-command.js.map +1 -1
  9. package/src/lib/api/auth-hint.d.ts +2 -0
  10. package/src/lib/api/auth-hint.js +15 -1
  11. package/src/lib/api/auth-hint.js.map +1 -1
  12. package/src/lib/api/clear.d.ts +36 -0
  13. package/src/lib/api/clear.js +121 -0
  14. package/src/lib/api/clear.js.map +1 -0
  15. package/src/lib/api/compose.d.ts +29 -0
  16. package/src/lib/api/compose.js +44 -1
  17. package/src/lib/api/compose.js.map +1 -1
  18. package/src/lib/api/definition.d.ts +8 -3
  19. package/src/lib/api/definition.js +28 -4
  20. package/src/lib/api/definition.js.map +1 -1
  21. package/src/lib/api/git.d.ts +4 -0
  22. package/src/lib/api/git.js +14 -2
  23. package/src/lib/api/git.js.map +1 -1
  24. package/src/lib/api/help.d.ts +9 -1
  25. package/src/lib/api/help.js +43 -10
  26. package/src/lib/api/help.js.map +1 -1
  27. package/src/lib/api/index.d.ts +5 -0
  28. package/src/lib/api/index.js +5 -0
  29. package/src/lib/api/index.js.map +1 -1
  30. package/src/lib/api/ports.d.ts +13 -0
  31. package/src/lib/api/ports.js +98 -0
  32. package/src/lib/api/ports.js.map +1 -0
  33. package/src/lib/api/resolve-checkout.d.ts +19 -9
  34. package/src/lib/api/resolve-checkout.js +18 -5
  35. package/src/lib/api/resolve-checkout.js.map +1 -1
  36. package/src/lib/api/run.js +240 -57
  37. package/src/lib/api/run.js.map +1 -1
  38. package/src/lib/api/setup.d.ts +15 -0
  39. package/src/lib/api/setup.js +41 -0
  40. package/src/lib/api/setup.js.map +1 -0
  41. package/src/lib/api/state.d.ts +20 -0
  42. package/src/lib/api/state.js +33 -0
  43. package/src/lib/api/state.js.map +1 -0
  44. package/src/lib/api/suggest.d.ts +7 -0
  45. package/src/lib/api/suggest.js +35 -0
  46. package/src/lib/api/suggest.js.map +1 -0
  47. package/src/lib/auth/auth-command.d.ts +11 -0
  48. package/src/lib/auth/auth-command.js +137 -0
  49. package/src/lib/auth/auth-command.js.map +1 -0
  50. package/src/lib/auth/composer-auth.d.ts +25 -0
  51. package/src/lib/auth/composer-auth.js +63 -0
  52. package/src/lib/auth/composer-auth.js.map +1 -0
  53. package/src/lib/auth/composer-repositories.d.ts +5 -0
  54. package/src/lib/auth/composer-repositories.js +33 -0
  55. package/src/lib/auth/composer-repositories.js.map +1 -0
  56. package/src/lib/auth/gitlab-token.d.ts +43 -0
  57. package/src/lib/auth/gitlab-token.js +72 -0
  58. package/src/lib/auth/gitlab-token.js.map +1 -0
  59. package/src/lib/auth/index.d.ts +4 -0
  60. package/src/lib/auth/index.js +8 -0
  61. package/src/lib/auth/index.js.map +1 -0
  62. package/src/lib/doctor/doctor-command.d.ts +2 -1
  63. package/src/lib/doctor/doctor-command.js +4 -7
  64. package/src/lib/doctor/doctor-command.js.map +1 -1
  65. package/src/lib/index.d.ts +2 -0
  66. package/src/lib/index.js +2 -0
  67. package/src/lib/index.js.map +1 -1
  68. package/src/lib/invocation.d.ts +9 -0
  69. package/src/lib/invocation.js +47 -0
  70. package/src/lib/invocation.js.map +1 -0
  71. package/src/lib/utils.d.ts +14 -0
  72. package/src/lib/utils.js +14 -1
  73. package/src/lib/utils.js.map +1 -1
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pullApiBranch = exports.checkoutApiBranch = exports.hasUncommittedChanges = exports.currentBranch = void 0;
3
+ exports.pullApiBranch = exports.checkoutApiBranch = exports.unpushedCommits = exports.hasUncommittedChanges = exports.uncommittedChanges = exports.currentBranch = void 0;
4
4
  const child_process_1 = require("child_process");
5
5
  const git = (cwd, args) => {
6
6
  var _a, _b, _c;
@@ -17,8 +17,20 @@ const currentBranch = (cwd) => {
17
17
  return result.status === 0 ? result.stdout : undefined;
18
18
  };
19
19
  exports.currentBranch = currentBranch;
20
- const hasUncommittedChanges = (cwd) => git(cwd, ['status', '--porcelain']).stdout.length > 0;
20
+ /** Modified tracked files and untracked files, as git's own porcelain lines. */
21
+ const uncommittedChanges = (cwd) => {
22
+ const { stdout } = git(cwd, ['status', '--porcelain']);
23
+ return stdout.length > 0 ? stdout.split('\n') : [];
24
+ };
25
+ exports.uncommittedChanges = uncommittedChanges;
26
+ const hasUncommittedChanges = (cwd) => (0, exports.uncommittedChanges)(cwd).length > 0;
21
27
  exports.hasUncommittedChanges = hasUncommittedChanges;
28
+ /** Commits on any local branch that no remote holds, so work is never removed with a checkout. */
29
+ const unpushedCommits = (cwd) => {
30
+ const { status, stdout } = git(cwd, ['log', '--branches', '--not', '--remotes', '--oneline']);
31
+ return status === 0 && stdout.length > 0 ? stdout.split('\n') : [];
32
+ };
33
+ exports.unpushedCommits = unpushedCommits;
22
34
  /** Switches the API checkout to the branch configured for it. Git's own refusal is passed through. */
23
35
  const checkoutApiBranch = (options) => {
24
36
  const { repoPath, branch } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/git.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,11 @@
1
- import { ApiDefinitions } from './definition';
1
+ import { ApiDefinition, ApiDefinitions } from './definition';
2
2
  /** The help text for `et api`, listing the built-in commands and what each API adds to them. */
3
3
  export declare const apiHelp: (apis: ApiDefinitions, invocation: string) => string;
4
+ /** The help text for one API: every command it accepts, what each one runs, and where its files are. */
5
+ export declare const singleApiHelp: (options: {
6
+ name: string;
7
+ api: ApiDefinition;
8
+ invocation: string;
9
+ /** Where the checkout is, or what is wrong with it. */
10
+ checkout?: string;
11
+ }) => string;
@@ -1,39 +1,72 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.apiHelp = void 0;
3
+ exports.singleApiHelp = exports.apiHelp = void 0;
4
4
  const definition_1 = require("./definition");
5
5
  const BUILT_IN_DESCRIPTIONS = {
6
6
  up: 'Start the containers of the API',
7
7
  down: 'Stop them',
8
- logs: 'Follow the log of the API container',
9
- shell: 'Open a shell in the API container',
8
+ logs: 'Follow the log of the API container, or of a service you name',
9
+ shell: 'Open a shell in the API container, or in a service you name',
10
10
  clone: 'Clone the API into .ethlete/<name> from its repoUrl',
11
+ clear: 'Remove the managed checkout in .ethlete/<name>',
11
12
  checkout: 'Switch the checkout to the branch apiRepoBranches names',
12
13
  pull: 'Fetch and fast-forward the checked-out branch',
14
+ setup: "Run the API's own setupCommand in its compose directory",
13
15
  };
14
16
  const pad = (text, width) => text.padEnd(width);
15
17
  /** The help text for `et api`, listing the built-in commands and what each API adds to them. */
16
18
  const apiHelp = (apis, invocation) => {
17
19
  const entries = Object.entries(apis);
18
20
  const width = Math.max(8, ...entries.map(([name]) => name.length));
21
+ const commandWidth = Math.max(8, ...definition_1.BUILT_IN_API_COMMANDS.map((command) => command.length), ...entries.flatMap(([, api]) => { var _a; return Object.keys((_a = api.exec) !== null && _a !== void 0 ? _a : {}).map((command) => command.length); }));
19
22
  const apiLines = entries.map(([name, api]) => ` ${pad(name, width)} ${(0, definition_1.apiCommandNames)(api).join(', ')}`);
20
23
  const execNames = [...new Set(entries.flatMap(([, api]) => { var _a; return Object.keys((_a = api.exec) !== null && _a !== void 0 ? _a : {}); }))];
21
24
  return [
22
- `Usage: ${invocation} <command> <api> [--host]`,
25
+ `Usage: ${invocation} <command> <api>[,<api>] [--host]`,
23
26
  '',
24
27
  'Commands',
25
- ...definition_1.BUILT_IN_API_COMMANDS.map((command) => ` ${pad(command, 8)} ${BUILT_IN_DESCRIPTIONS[command]}`),
26
- ...execNames.map((command) => ` ${pad(command, 8)} Declared by the API itself`),
28
+ ...definition_1.BUILT_IN_API_COMMANDS.map((command) => ` ${pad(command, commandWidth)} ${BUILT_IN_DESCRIPTIONS[command]}`),
29
+ ...execNames.map((command) => ` ${pad(command, commandWidth)} Declared by the API itself`),
30
+ ` ${pad('help', commandWidth)} What one API accepts, and where its checkout is`,
27
31
  '',
28
32
  'APIs',
29
33
  ...(apiLines.length > 0 ? apiLines : [' none — declare them in ethlete.apis.js']),
30
34
  '',
31
35
  'Options',
32
- ` ${pad('--host', 8)} Also print the address another device on this network can use`,
33
- ` ${pad('--force', 8)} With pull: discard local commits and tracked changes on the branch`,
34
- ` ${pad('--clone', 8)} Clone a missing checkout without asking first`,
35
- ` ${pad('--help', 8)} Show this text`,
36
+ ` ${pad('--host', commandWidth)} Also print the address another device on this network can use`,
37
+ ` ${pad('--force', commandWidth)} With up: start even when a port is taken. With pull or clear: lose local work`,
38
+ ` ${pad('--all', commandWidth)} With clear: every API at once`,
39
+ ` ${pad('--clone', commandWidth)} Clone a missing checkout without asking first`,
40
+ ` ${pad('--setup', commandWidth)} Run the setup command for a missing env file without asking first`,
41
+ ` ${pad('--help', commandWidth)} Show this text`,
36
42
  ].join('\n');
37
43
  };
38
44
  exports.apiHelp = apiHelp;
45
+ const commandDescription = (api, command) => {
46
+ var _a, _b;
47
+ if (command === 'setup' && api.setupCommand)
48
+ return `Run "${api.setupCommand}" in ${api.composeDir}`;
49
+ const builtIn = definition_1.BUILT_IN_API_COMMANDS.find((candidate) => candidate === command);
50
+ return builtIn ? BUILT_IN_DESCRIPTIONS[builtIn] : ((_b = (_a = api.exec) === null || _a === void 0 ? void 0 : _a[command]) !== null && _b !== void 0 ? _b : []).join(' ');
51
+ };
52
+ /** The help text for one API: every command it accepts, what each one runs, and where its files are. */
53
+ const singleApiHelp = (options) => {
54
+ const { name, api, invocation, checkout } = options;
55
+ const commands = (0, definition_1.apiCommandNames)(api);
56
+ const width = Math.max(8, ...commands.map((command) => command.length));
57
+ return [
58
+ `Usage: ${invocation} <command> ${name} [--host]`,
59
+ '',
60
+ 'Commands',
61
+ ...commands.map((command) => ` ${pad(command, width)} ${commandDescription(api, command)}`),
62
+ '',
63
+ 'This API',
64
+ ` ${pad('url', width)} http://localhost:${api.port}`,
65
+ ` ${pad('services', width)} ${api.services.join(', ')}`,
66
+ ...(api.envFile ? [` ${pad('env file', width)} ${api.composeDir}/${api.envFile}`] : []),
67
+ ...(api.envKey ? [` ${pad('envKey', width)} ${api.envKey}`] : []),
68
+ ...(checkout ? ['', 'Checkout', ...checkout.split('\n').map((line) => ` ${line}`)] : []),
69
+ ].join('\n');
70
+ };
71
+ exports.singleApiHelp = singleApiHelp;
39
72
  //# sourceMappingURL=help.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/help.ts"],"names":[],"mappings":";;;AAAA,6CAAsF;AAEtF,MAAM,qBAAqB,GAA2D;IACpF,EAAE,EAAE,iCAAiC;IACrC,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,qCAAqC;IAC3C,KAAK,EAAE,mCAAmC;IAC1C,KAAK,EAAE,qDAAqD;IAC5D,QAAQ,EAAE,yDAAyD;IACnE,IAAI,EAAE,+CAA+C;CACtD,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEhE,gGAAgG;AACzF,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAE,UAAkB,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE3G,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,WAAC,OAAA,MAAM,CAAC,IAAI,CAAC,MAAA,GAAG,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAA,EAAA,CAAC,CAAC,CAAC,CAAC;IAE1F,OAAO;QACL,UAAU,UAAU,2BAA2B;QAC/C,EAAE;QACF,UAAU;QACV,GAAG,kCAAqB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,8BAA8B,CAAC;QACjF,EAAE;QACF,MAAM;QACN,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;QAClF,EAAE;QACF,SAAS;QACT,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,iEAAiE;QACtF,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,sEAAsE;QAC5F,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,iDAAiD;QACvE,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,kBAAkB;KACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAxBW,QAAA,OAAO,WAwBlB"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/help.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
1
  export * from './api-command';
2
2
  export * from './compose';
3
3
  export * from './auth-hint';
4
+ export * from './clear';
4
5
  export * from './clone';
5
6
  export * from './definition';
6
7
  export * from './git';
7
8
  export * from './help';
8
9
  export * from './load-definitions';
10
+ export * from './ports';
9
11
  export * from './resolve-checkout';
10
12
  export * from './run';
13
+ export * from './setup';
14
+ export * from './state';
15
+ export * from './suggest';
@@ -4,11 +4,16 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./api-command"), exports);
5
5
  tslib_1.__exportStar(require("./compose"), exports);
6
6
  tslib_1.__exportStar(require("./auth-hint"), exports);
7
+ tslib_1.__exportStar(require("./clear"), exports);
7
8
  tslib_1.__exportStar(require("./clone"), exports);
8
9
  tslib_1.__exportStar(require("./definition"), exports);
9
10
  tslib_1.__exportStar(require("./git"), exports);
10
11
  tslib_1.__exportStar(require("./help"), exports);
11
12
  tslib_1.__exportStar(require("./load-definitions"), exports);
13
+ tslib_1.__exportStar(require("./ports"), exports);
12
14
  tslib_1.__exportStar(require("./resolve-checkout"), exports);
13
15
  tslib_1.__exportStar(require("./run"), exports);
16
+ tslib_1.__exportStar(require("./setup"), exports);
17
+ tslib_1.__exportStar(require("./state"), exports);
18
+ tslib_1.__exportStar(require("./suggest"), exports);
14
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/index.ts"],"names":[],"mappings":";;;AAAA,wDAA8B;AAC9B,oDAA0B;AAC1B,sDAA4B;AAC5B,kDAAwB;AACxB,uDAA6B;AAC7B,gDAAsB;AACtB,iDAAuB;AACvB,6DAAmC;AACnC,6DAAmC;AACnC,gDAAsB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/index.ts"],"names":[],"mappings":";;;AAAA,wDAA8B;AAC9B,oDAA0B;AAC1B,sDAA4B;AAC5B,kDAAwB;AACxB,kDAAwB;AACxB,uDAA6B;AAC7B,gDAAsB;AACtB,iDAAuB;AACvB,6DAAmC;AACnC,kDAAwB;AACxB,6DAAmC;AACnC,gDAAsB;AACtB,kDAAwB;AACxB,kDAAwB;AACxB,oDAA0B"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Host ports the named services publish, read from the resolved output of `compose config`. It
3
+ * accepts the short form podman-compose prints and the long form docker compose prints.
4
+ *
5
+ * Only the named services are read. A compose file usually declares more than an app needs, and a
6
+ * service that never starts must not make a port look taken.
7
+ */
8
+ export declare const publishedPorts: (options: {
9
+ config: string;
10
+ services: readonly string[];
11
+ }) => number[];
12
+ /** The ports nothing else may bind right now, so `up` cannot publish them. */
13
+ export declare const portsInUse: (ports: readonly number[]) => Promise<number[]>;
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.portsInUse = exports.publishedPorts = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const net_1 = require("net");
6
+ const indentOf = (line) => line.length - line.trimStart().length;
7
+ const PUBLISHED_KEY = /^published:\s*['"]?(\d+)/;
8
+ /**
9
+ * Host port of a short-form entry such as `8040:80`, `127.0.0.1:8040:80` or `[::1]:8040:80/udp`.
10
+ * It is the second-to-last segment, so a bind address of any shape stays out of the way. An entry
11
+ * that names only a container port, or a port range, has no single host port to check.
12
+ */
13
+ const shortFormHostPort = (entry) => {
14
+ var _a, _b, _c;
15
+ const parts = (_b = (_a = entry.replace(/['"]/g, '').split('/')[0]) === null || _a === void 0 ? void 0 : _a.split(':')) !== null && _b !== void 0 ? _b : [];
16
+ if (parts.length < 2)
17
+ return undefined;
18
+ const host = (_c = parts[parts.length - 2]) !== null && _c !== void 0 ? _c : '';
19
+ return /^\d+$/.test(host) ? Number(host) : undefined;
20
+ };
21
+ /**
22
+ * Host ports the named services publish, read from the resolved output of `compose config`. It
23
+ * accepts the short form podman-compose prints and the long form docker compose prints.
24
+ *
25
+ * Only the named services are read. A compose file usually declares more than an app needs, and a
26
+ * service that never starts must not make a port look taken.
27
+ */
28
+ const publishedPorts = (options) => {
29
+ var _a;
30
+ const { config, services } = options;
31
+ const wanted = new Set(services);
32
+ const ports = new Set();
33
+ let servicesIndent;
34
+ let serviceIndent;
35
+ let portsIndent;
36
+ let inWantedService = false;
37
+ for (const line of config.split('\n')) {
38
+ const text = line.trim();
39
+ if (text === '' || text.startsWith('#'))
40
+ continue;
41
+ const indent = indentOf(line);
42
+ if (servicesIndent === undefined) {
43
+ if (text === 'services:')
44
+ servicesIndent = indent;
45
+ continue;
46
+ }
47
+ if (indent <= servicesIndent && !text.startsWith('-')) {
48
+ servicesIndent = text === 'services:' ? indent : undefined;
49
+ serviceIndent = undefined;
50
+ portsIndent = undefined;
51
+ inWantedService = false;
52
+ continue;
53
+ }
54
+ serviceIndent !== null && serviceIndent !== void 0 ? serviceIndent : (serviceIndent = indent);
55
+ if (indent === serviceIndent) {
56
+ inWantedService = wanted.has(text.replace(/:$/, ''));
57
+ portsIndent = undefined;
58
+ continue;
59
+ }
60
+ if (!inWantedService)
61
+ continue;
62
+ if (text === 'ports:') {
63
+ portsIndent = indent;
64
+ continue;
65
+ }
66
+ if (portsIndent === undefined)
67
+ continue;
68
+ if (indent < portsIndent || (indent === portsIndent && !text.startsWith('-'))) {
69
+ portsIndent = undefined;
70
+ continue;
71
+ }
72
+ const published = (_a = PUBLISHED_KEY.exec(text)) === null || _a === void 0 ? void 0 : _a[1];
73
+ if (published !== undefined) {
74
+ ports.add(Number(published));
75
+ continue;
76
+ }
77
+ if (!text.startsWith('-'))
78
+ continue;
79
+ const short = shortFormHostPort(text.slice(1).trim());
80
+ if (short !== undefined)
81
+ ports.add(short);
82
+ }
83
+ return [...ports].sort((a, b) => a - b);
84
+ };
85
+ exports.publishedPorts = publishedPorts;
86
+ const isPortFree = (port) => new Promise((resolve) => {
87
+ const server = (0, net_1.createServer)();
88
+ server.once('error', () => resolve(false));
89
+ server.once('listening', () => server.close(() => resolve(true)));
90
+ server.listen(port, '0.0.0.0');
91
+ });
92
+ /** The ports nothing else may bind right now, so `up` cannot publish them. */
93
+ const portsInUse = (ports) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
94
+ const checked = yield Promise.all(ports.map((port) => tslib_1.__awaiter(void 0, void 0, void 0, function* () { return ({ port, free: yield isPortFree(port) }); })));
95
+ return checked.filter(({ free }) => !free).map(({ port }) => port);
96
+ });
97
+ exports.portsInUse = portsInUse;
98
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/ports.ts"],"names":[],"mappings":";;;;AAAA,6BAAmC;AAEnC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;AAEzE,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAEjD;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,EAAE;;IAC1C,MAAM,KAAK,GAAG,MAAA,MAAA,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0CAAE,KAAK,CAAC,GAAG,CAAC,mCAAI,EAAE,CAAC;IAEzE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEvC,MAAM,IAAI,GAAG,MAAA,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,mCAAI,EAAE,CAAC;IAE3C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,cAAc,GAAG,CAAC,OAAwD,EAAE,EAAE;;IACzF,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,IAAI,cAAkC,CAAC;IACvC,IAAI,aAAiC,CAAC;IACtC,IAAI,WAA+B,CAAC;IACpC,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAEzB,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,IAAI,KAAK,WAAW;gBAAE,cAAc,GAAG,MAAM,CAAC;YAElD,SAAS;QACX,CAAC;QAED,IAAI,MAAM,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,cAAc,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3D,aAAa,GAAG,SAAS,CAAC;YAC1B,WAAW,GAAG,SAAS,CAAC;YACxB,eAAe,GAAG,KAAK,CAAC;YAExB,SAAS;QACX,CAAC;QAED,aAAa,aAAb,aAAa,cAAb,aAAa,IAAb,aAAa,GAAK,MAAM,EAAC;QAEzB,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;YAC7B,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YACrD,WAAW,GAAG,SAAS,CAAC;YAExB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,eAAe;YAAE,SAAS;QAE/B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,WAAW,GAAG,MAAM,CAAC;YAErB,SAAS;QACX,CAAC;QAED,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QAExC,IAAI,MAAM,GAAG,WAAW,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9E,WAAW,GAAG,SAAS,CAAC;YAExB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAA,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,0CAAG,CAAC,CAAC,CAAC;QAEhD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAE7B,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAEpC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAEtD,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAzEW,QAAA,cAAc,kBAyEzB;AAEF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAClC,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;IAC/B,MAAM,MAAM,GAAG,IAAA,kBAAY,GAAE,CAAC;IAE9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEL,8EAA8E;AACvE,MAAM,UAAU,GAAG,CAAO,KAAwB,EAAE,EAAE;IAC3D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAO,IAAI,EAAE,EAAE,0DAAC,OAAA,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,GAAA,CAAC,CAAC,CAAC;IAEvG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC,CAAA,CAAC;AAJW,QAAA,UAAU,cAIrB"}
@@ -1,10 +1,19 @@
1
1
  import { CloneRequest } from './clone';
2
2
  import { ApiDefinition } from './definition';
3
+ import { SetupRequest } from './setup';
3
4
  export type ApiCheckout = {
4
5
  repoPath: string;
5
6
  /** The directory the compose commands run in. */
6
7
  composePath: string;
7
8
  };
9
+ export type ApiCheckoutFailure = {
10
+ ok: false;
11
+ problem: string;
12
+ /** Set when the managed directory is empty and the API declares where to clone from. */
13
+ clonable?: CloneRequest;
14
+ /** Set when the env file is missing and the API declares a `setupCommand` that creates it. */
15
+ setupable?: SetupRequest;
16
+ };
8
17
  /**
9
18
  * `legacyConfigWarning` is set on failure too. A wrong path is exactly when the developer needs to
10
19
  * know which file the value actually came from.
@@ -14,12 +23,13 @@ export type ApiCheckoutResult = {
14
23
  } & ({
15
24
  ok: true;
16
25
  checkout: ApiCheckout;
17
- } | {
18
- ok: false;
19
- problem: string;
20
- /** Set when the managed directory is empty and the API declares where to clone from. */
21
- clonable?: CloneRequest;
22
- });
26
+ } | ApiCheckoutFailure);
27
+ /** The problem, plus the `et api` command that fixes it, so no message sends the reader to a Makefile. */
28
+ export declare const checkoutProblem: (options: {
29
+ failure: ApiCheckoutFailure;
30
+ name: string;
31
+ invocation: string;
32
+ }) => string;
23
33
  /** Where an API's managed checkout goes when the developer configured no path of their own. */
24
34
  export declare const managedCheckoutPath: (root: string, name: string) => string;
25
35
  /** Resolves where an API's containers live, with the one message that explains each way it can fail. */
@@ -28,8 +38,8 @@ export declare const resolveApiCheckout: (options: {
28
38
  name: string;
29
39
  api: ApiDefinition;
30
40
  /**
31
- * The git commands act on the checkout itself, so they must not demand a compose directory or the
32
- * output of `setupCommand` — both can legitimately be absent on a checkout that was just cloned.
41
+ * How much of the checkout the command needs. The git commands act on the checkout itself, and
42
+ * `setup` writes the env file, so neither can demand what it is there to produce.
33
43
  */
34
- requireCompose?: boolean;
44
+ needs?: "repo" | "compose" | "env";
35
45
  }) => ApiCheckoutResult;
@@ -1,10 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveApiCheckout = exports.managedCheckoutPath = void 0;
3
+ exports.resolveApiCheckout = exports.managedCheckoutPath = exports.checkoutProblem = void 0;
4
4
  const fs_1 = require("fs");
5
5
  const path_1 = require("path");
6
6
  const local_config_1 = require("../config/local-config");
7
7
  const clone_1 = require("./clone");
8
+ /** The problem, plus the `et api` command that fixes it, so no message sends the reader to a Makefile. */
9
+ const checkoutProblem = (options) => {
10
+ const { failure, name, invocation } = options;
11
+ if (failure.clonable)
12
+ return `${failure.problem} Run "${invocation} clone ${name}".`;
13
+ if (failure.setupable)
14
+ return `${failure.problem} Run "${invocation} setup ${name}".`;
15
+ return failure.problem;
16
+ };
17
+ exports.checkoutProblem = checkoutProblem;
8
18
  const isDirectory = (path) => (0, fs_1.existsSync)(path) && (0, fs_1.statSync)(path).isDirectory();
9
19
  const missingPathProblem = (options) => {
10
20
  var _a;
@@ -18,7 +28,7 @@ const managedCheckoutPath = (root, name) => (0, path_1.join)(root, clone_1.DEFAU
18
28
  exports.managedCheckoutPath = managedCheckoutPath;
19
29
  /** Resolves where an API's containers live, with the one message that explains each way it can fail. */
20
30
  const resolveApiCheckout = (options) => {
21
- const { root, name, api, requireCompose = true } = options;
31
+ const { root, name, api, needs = 'env' } = options;
22
32
  const { config, fileName, isLegacy } = (0, local_config_1.readLocalConfig)(root);
23
33
  const configured = (0, local_config_1.configuredApiRepoPath)(config, name);
24
34
  const legacyConfigWarning = isLegacy
@@ -58,18 +68,21 @@ const resolveApiCheckout = (options) => {
58
68
  };
59
69
  }
60
70
  const composePath = (0, path_1.join)(repoPath, api.composeDir);
61
- if (requireCompose && !isDirectory(composePath)) {
71
+ if (needs === 'repo')
72
+ return { ok: true, legacyConfigWarning, checkout: { repoPath, composePath } };
73
+ if (!isDirectory(composePath)) {
62
74
  return {
63
75
  ok: false,
64
76
  legacyConfigWarning,
65
77
  problem: `${repoPath} has no ${api.composeDir} directory. Is apiRepoPaths.${name} the right checkout?`,
66
78
  };
67
79
  }
68
- if (requireCompose && api.envFile && !(0, fs_1.existsSync)((0, path_1.join)(composePath, api.envFile))) {
80
+ if (needs === 'env' && api.envFile && !(0, fs_1.existsSync)((0, path_1.join)(composePath, api.envFile))) {
69
81
  return {
70
82
  ok: false,
71
83
  legacyConfigWarning,
72
- problem: `Missing ${api.envFile} in ${composePath}.${api.setupCommand ? ` Run "${api.setupCommand}" there first.` : ''}`,
84
+ problem: `Missing ${api.envFile} in ${composePath}.`,
85
+ setupable: api.setupCommand ? { setupCommand: api.setupCommand, composePath, envFile: api.envFile } : undefined,
73
86
  };
74
87
  }
75
88
  return { ok: true, legacyConfigWarning, checkout: { repoPath, composePath } };
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-checkout.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/resolve-checkout.ts"],"names":[],"mappings":";;;AAAA,2BAA0C;AAC1C,+BAA4B;AAC5B,yDAOgC;AAChC,mCAA6D;AAuB7D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,IAAI,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAEvF,MAAM,kBAAkB,GAAG,CAAC,OAA6D,EAAE,EAAE;;IAC3F,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEtC,OAAO,CACL,GAAG,MAAM,4BAA4B,IAAI,oBAAoB,qCAAsB,eAAe;QAClG,0EAA0E;QAC1E,sCAAsC,IAAI,OAAO,MAAA,GAAG,CAAC,WAAW,mCAAI,MAAM,IAAI,MAAM,eAAe,CACpG,CAAC;AACJ,CAAC,CAAC;AAEF,+FAA+F;AACxF,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,IAAA,WAAI,EAAC,IAAI,EAAE,4BAAoB,EAAE,IAAI,CAAC,CAAC;AAA7F,QAAA,mBAAmB,uBAA0E;AAE1G,wGAAwG;AACjG,MAAM,kBAAkB,GAAG,CAAC,OASlC,EAAqB,EAAE;IACtB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAA,8BAAe,EAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAA,oCAAqB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,mBAAmB,GAAG,QAAQ;QAClC,CAAC,CAAC,GAAG,4CAA6B,2CAA2C,qCAAsB,GAAG;QACtG,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAA,oCAAqB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAA,2BAAmB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAExG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,mBAAmB;gBACnB,OAAO,EAAE,gBAAgB,IAAI,cAAc,QAAQ,yCAAyC;aAC7F,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,mBAAmB;gBACnB,OAAO,EAAE,kBAAkB,CAAC;oBAC1B,IAAI;oBACJ,GAAG;oBACH,MAAM,EAAE,QAAQ;wBACd,CAAC,CAAC,GAAG,QAAQ,mCAAmC,IAAI,qCAAqC;wBACzF,CAAC,CAAC,GAAG,IAAI,oDAAoD;iBAChE,CAAC;aACH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE,EAAE,KAAK;YACT,mBAAmB;YACnB,OAAO,EAAE,GAAG,IAAI,uBAAuB,QAAQ,GAAG;YAClD,QAAQ,EAAE;gBACR,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAA,sCAAuB,EAAC,MAAM,EAAE,IAAI,CAAC;aAC9C;SACF,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,cAAc,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,mBAAmB;YACnB,OAAO,EAAE,GAAG,QAAQ,WAAW,GAAG,CAAC,UAAU,+BAA+B,IAAI,sBAAsB;SACvG,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO;YACL,EAAE,EAAE,KAAK;YACT,mBAAmB;YACnB,OAAO,EAAE,WAAW,GAAG,CAAC,OAAO,OAAO,WAAW,IAC/C,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,EACjE,EAAE;SACH,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC;AAChF,CAAC,CAAC;AA3EW,QAAA,kBAAkB,sBA2E7B"}
1
+ {"version":3,"file":"resolve-checkout.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/lib/api/resolve-checkout.ts"],"names":[],"mappings":"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"}