@atlasauth/cli 0.0.0-stage → 0.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.
Files changed (71) hide show
  1. package/README.md +91 -2
  2. package/dist/args.d.ts +84 -0
  3. package/dist/args.js +76 -0
  4. package/dist/args.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +19 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/actions.d.ts +11 -0
  9. package/dist/commands/actions.js +120 -0
  10. package/dist/commands/actions.js.map +1 -0
  11. package/dist/commands/api-keys.d.ts +4 -0
  12. package/dist/commands/api-keys.js +81 -0
  13. package/dist/commands/api-keys.js.map +1 -0
  14. package/dist/commands/auth.d.ts +25 -0
  15. package/dist/commands/auth.js +94 -0
  16. package/dist/commands/auth.js.map +1 -0
  17. package/dist/commands/config.d.ts +4 -0
  18. package/dist/commands/config.js +716 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/orgs.d.ts +4 -0
  21. package/dist/commands/orgs.js +72 -0
  22. package/dist/commands/orgs.js.map +1 -0
  23. package/dist/commands/sessions.d.ts +4 -0
  24. package/dist/commands/sessions.js +28 -0
  25. package/dist/commands/sessions.js.map +1 -0
  26. package/dist/commands/shared.d.ts +32 -0
  27. package/dist/commands/shared.js +60 -0
  28. package/dist/commands/shared.js.map +1 -0
  29. package/dist/commands/users.d.ts +4 -0
  30. package/dist/commands/users.js +87 -0
  31. package/dist/commands/users.js.map +1 -0
  32. package/dist/commands/webhooks.d.ts +4 -0
  33. package/dist/commands/webhooks.js +34 -0
  34. package/dist/commands/webhooks.js.map +1 -0
  35. package/dist/config-http.d.ts +27 -0
  36. package/dist/config-http.js +63 -0
  37. package/dist/config-http.js.map +1 -0
  38. package/dist/config.d.ts +48 -0
  39. package/dist/config.js +69 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/context.d.ts +51 -0
  42. package/dist/context.js +27 -0
  43. package/dist/context.js.map +1 -0
  44. package/dist/errors.d.ts +15 -0
  45. package/dist/errors.js +25 -0
  46. package/dist/errors.js.map +1 -0
  47. package/dist/help.d.ts +8 -0
  48. package/dist/help.js +114 -0
  49. package/dist/help.js.map +1 -0
  50. package/dist/index.d.ts +22 -0
  51. package/dist/index.js +49 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/io.d.ts +21 -0
  54. package/dist/io.js +28 -0
  55. package/dist/io.js.map +1 -0
  56. package/dist/output.d.ts +41 -0
  57. package/dist/output.js +72 -0
  58. package/dist/output.js.map +1 -0
  59. package/dist/prompt.d.ts +15 -0
  60. package/dist/prompt.js +46 -0
  61. package/dist/prompt.js.map +1 -0
  62. package/dist/run.d.ts +12 -0
  63. package/dist/run.js +94 -0
  64. package/dist/run.js.map +1 -0
  65. package/dist/serialize.d.ts +31 -0
  66. package/dist/serialize.js +248 -0
  67. package/dist/serialize.js.map +1 -0
  68. package/dist/version.d.ts +7 -0
  69. package/dist/version.js +21 -0
  70. package/dist/version.js.map +1 -0
  71. package/package.json +35 -3
package/dist/prompt.js ADDED
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultPrompter = defaultPrompter;
4
+ const node_readline_1 = require("node:readline");
5
+ function ask(input, output, query) {
6
+ const rl = (0, node_readline_1.createInterface)({ input, output });
7
+ return new Promise((resolve) => {
8
+ rl.question(query, (answer) => {
9
+ rl.close();
10
+ resolve(answer);
11
+ });
12
+ });
13
+ }
14
+ /** The real prompter, reading the TTY. Not exercised by unit tests (they inject). */
15
+ function defaultPrompter(input = process.stdin, output = process.stdout) {
16
+ return {
17
+ async text(query, opts) {
18
+ const suffix = opts?.default ? ` [${opts.default}]` : '';
19
+ const answer = (await ask(input, output, `${query}${suffix}: `)).trim();
20
+ return answer || opts?.default || '';
21
+ },
22
+ secret(query) {
23
+ // Echo the prompt, then mute readline's output so the secret never lands
24
+ // on screen or in scrollback. `_writeToOutput` is readline's own hook;
25
+ // overriding it is the standard way to hide typed input.
26
+ return new Promise((resolve) => {
27
+ const rl = (0, node_readline_1.createInterface)({ input, output, terminal: true });
28
+ let muted = false;
29
+ const rlInternal = rl;
30
+ rlInternal._writeToOutput = (s) => {
31
+ if (!muted)
32
+ output.write(s);
33
+ };
34
+ output.write(`${query}: `);
35
+ muted = true;
36
+ rl.question('', (answer) => {
37
+ muted = false;
38
+ output.write('\n');
39
+ rl.close();
40
+ resolve(answer.trim());
41
+ });
42
+ });
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":";;AAyBA,0CAiCC;AA1DD,iDAAgD;AAchD,SAAS,GAAG,CAAC,KAA4B,EAAE,MAA6B,EAAE,KAAa;IACrF,MAAM,EAAE,GAAG,IAAA,+BAAe,EAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACrC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;YAC5B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qFAAqF;AACrF,SAAgB,eAAe,CAC7B,QAA+B,OAAO,CAAC,KAAK,EAC5C,SAAgC,OAAO,CAAC,MAAM;IAE9C,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI;YACpB,MAAM,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACxE,OAAO,MAAM,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,CAAC,KAAK;YACV,yEAAyE;YACzE,uEAAuE;YACvE,yDAAyD;YACzD,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;gBACrC,MAAM,EAAE,GAAG,IAAA,+BAAe,EAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,IAAI,KAAK,GAAG,KAAK,CAAC;gBAClB,MAAM,UAAU,GAAG,EAAyD,CAAC;gBAC7E,UAAU,CAAC,cAAc,GAAG,CAAC,CAAS,EAAE,EAAE;oBACxC,IAAI,CAAC,KAAK;wBAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;gBAC3B,KAAK,GAAG,IAAI,CAAC;gBACb,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;oBACzB,KAAK,GAAG,KAAK,CAAC;oBACd,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACnB,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { type ParsedArgs } from './args';
2
+ import type { RunContext } from './context';
3
+ /** A command handler: given the context and parsed args, do the work; return an exit code. */
4
+ export type Handler = (ctx: RunContext, args: ParsedArgs) => Promise<number>;
5
+ /**
6
+ * The CLI's whole control flow, as a pure function of (argv, context) → exit
7
+ * code. It NEVER calls `process.exit` and NEVER throws: the bin calls it and
8
+ * exits with what it returns, and every test drives this same path with a
9
+ * captured IO. All error reporting funnels through the one try/catch so a user
10
+ * sees a clean message and a non-zero code — never a stack trace.
11
+ */
12
+ export declare function run(argv: string[], ctx: RunContext): Promise<number>;
package/dist/run.js ADDED
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.run = run;
4
+ const backend_1 = require("@atlasauth/backend");
5
+ const args_1 = require("./args");
6
+ const actions_1 = require("./commands/actions");
7
+ const api_keys_1 = require("./commands/api-keys");
8
+ const auth_1 = require("./commands/auth");
9
+ const config_1 = require("./commands/config");
10
+ const orgs_1 = require("./commands/orgs");
11
+ const sessions_1 = require("./commands/sessions");
12
+ const users_1 = require("./commands/users");
13
+ const webhooks_1 = require("./commands/webhooks");
14
+ const errors_1 = require("./errors");
15
+ const help_1 = require("./help");
16
+ const version_1 = require("./version");
17
+ /** The command table — the single place every top-level command is registered. */
18
+ const COMMANDS = {
19
+ login: auth_1.login,
20
+ logout: auth_1.logout,
21
+ whoami: auth_1.whoami,
22
+ users: users_1.users,
23
+ orgs: orgs_1.orgs,
24
+ 'api-keys': api_keys_1.apiKeys,
25
+ webhooks: webhooks_1.webhooks,
26
+ sessions: sessions_1.sessions,
27
+ config: config_1.config,
28
+ actions: actions_1.actions,
29
+ };
30
+ /**
31
+ * The CLI's whole control flow, as a pure function of (argv, context) → exit
32
+ * code. It NEVER calls `process.exit` and NEVER throws: the bin calls it and
33
+ * exits with what it returns, and every test drives this same path with a
34
+ * captured IO. All error reporting funnels through the one try/catch so a user
35
+ * sees a clean message and a non-zero code — never a stack trace.
36
+ */
37
+ async function run(argv, ctx) {
38
+ let args;
39
+ try {
40
+ args = (0, args_1.parse)(argv);
41
+ }
42
+ catch (err) {
43
+ return report(ctx, err);
44
+ }
45
+ // --version wins over everything, like most CLIs.
46
+ if (args.values.version) {
47
+ ctx.io.out((0, version_1.getVersion)());
48
+ return 0;
49
+ }
50
+ const command = args.positionals[0];
51
+ // Bare `atlas` or `atlas --help`: top-level help on stdout, success.
52
+ if (!command) {
53
+ ctx.io.out(help_1.TOP_HELP);
54
+ return 0;
55
+ }
56
+ const handler = COMMANDS[command];
57
+ if (!handler) {
58
+ ctx.io.err(`Unknown command '${command}'.`);
59
+ ctx.io.err("Run 'atlas --help' to see available commands.");
60
+ return 1;
61
+ }
62
+ // `atlas <command> --help`: command-specific help on stdout, success.
63
+ if (args.values.help) {
64
+ ctx.io.out(help_1.COMMAND_HELP[command] ?? help_1.TOP_HELP);
65
+ return 0;
66
+ }
67
+ try {
68
+ return await handler(ctx, args);
69
+ }
70
+ catch (err) {
71
+ return report(ctx, err);
72
+ }
73
+ }
74
+ /**
75
+ * Turn any thrown error into a clean stderr message + exit code. An
76
+ * {@link AtlasApiError} keeps its HTTP status and stable `code` so the user can
77
+ * act on it; a {@link CliError} carries its own code; anything else is an
78
+ * unexpected bug reported as its message (still no stack).
79
+ */
80
+ function report(ctx, err) {
81
+ if (err instanceof backend_1.AtlasApiError) {
82
+ const code = err.code ? ` [${err.code}]` : '';
83
+ ctx.io.err(`atlas: API error (HTTP ${err.status})${code}: ${err.message}`);
84
+ return 1;
85
+ }
86
+ if (err instanceof errors_1.CliError) {
87
+ ctx.io.err(`atlas: ${err.message}`);
88
+ return err.exitCode;
89
+ }
90
+ const message = err instanceof Error ? err.message : String(err);
91
+ ctx.io.err(`atlas: ${message}`);
92
+ return 1;
93
+ }
94
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;AAuCA,kBAwCC;AA/ED,gDAAmD;AACnD,iCAAgD;AAChD,gDAA6C;AAC7C,kDAA8C;AAC9C,0CAAwD;AACxD,8CAA2C;AAC3C,0CAAuC;AACvC,kDAA+C;AAC/C,4CAAyC;AACzC,kDAA+C;AAE/C,qCAAoC;AACpC,iCAAgD;AAChD,uCAAuC;AAKvC,kFAAkF;AAClF,MAAM,QAAQ,GAA4B;IACxC,KAAK,EAAL,YAAK;IACL,MAAM,EAAN,aAAM;IACN,MAAM,EAAN,aAAM;IACN,KAAK,EAAL,aAAK;IACL,IAAI,EAAJ,WAAI;IACJ,UAAU,EAAE,kBAAO;IACnB,QAAQ,EAAR,mBAAQ;IACR,QAAQ,EAAR,mBAAQ;IACR,MAAM,EAAN,eAAM;IACN,OAAO,EAAP,iBAAO;CACR,CAAC;AAEF;;;;;;GAMG;AACI,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,GAAe;IACvD,IAAI,IAAgB,CAAC;IACrB,IAAI,CAAC;QACH,IAAI,GAAG,IAAA,YAAK,EAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,kDAAkD;IAClD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAA,oBAAU,GAAE,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAEpC,qEAAqE;IACrE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,eAAQ,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,oBAAoB,OAAO,IAAI,CAAC,CAAC;QAC5C,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,sEAAsE;IACtE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,mBAAY,CAAC,OAAO,CAAC,IAAI,eAAQ,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,GAAe,EAAE,GAAY;IAC3C,IAAI,GAAG,YAAY,uBAAa,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,0BAA0B,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,YAAY,iBAAQ,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,OAAO,GAAG,CAAC,QAAQ,CAAC;IACtB,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The on-disk format for `atlas config` — the config-as-code layer. Two
3
+ * concerns live here, kept away from the command logic:
4
+ *
5
+ * 1. CANONICALIZATION. A value is normalised before it is written or compared
6
+ * so an export is byte-for-byte deterministic and a round-trip is a no-op
7
+ * diff. We sort object keys (the same rule Go's `json.Marshal` and the
8
+ * Terraform provider's `canonicalJSON` use) and PRESERVE array order — so a
9
+ * field whose order is meaningful (a claim mapping, an auth_config list) is
10
+ * never silently reordered.
11
+ *
12
+ * 2. THE CODEC. JSON is the robust default. YAML is offered for readable diffs
13
+ * in a repo; our YAML is a deliberately small, fully-specified subset where
14
+ * every map key and every scalar is JSON-encoded, so it is unambiguous to
15
+ * parse, round-trips exactly (newlines, URL-shaped keys, unicode and all),
16
+ * and is still valid YAML (JSON is a YAML subset).
17
+ */
18
+ export type Json = string | number | boolean | null | Json[] | {
19
+ [k: string]: Json;
20
+ };
21
+ export type Format = 'json' | 'yaml';
22
+ /** A plain JSON value with all object keys recursively sorted; arrays untouched. */
23
+ export declare function canonicalize(value: unknown): Json;
24
+ /** Canonical JSON string — the equality oracle for the diff engine. */
25
+ export declare function canonicalString(value: unknown): string;
26
+ /** True when two config values are equal after canonicalization. */
27
+ export declare function deepEqual(a: unknown, b: unknown): boolean;
28
+ /** Serialize a canonicalizable value to the chosen format, with a trailing newline. */
29
+ export declare function serialize(value: unknown, format: Format): string;
30
+ /** Parse a document written by {@link serialize}. */
31
+ export declare function deserialize(text: string, format: Format): Json;
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ /**
3
+ * The on-disk format for `atlas config` — the config-as-code layer. Two
4
+ * concerns live here, kept away from the command logic:
5
+ *
6
+ * 1. CANONICALIZATION. A value is normalised before it is written or compared
7
+ * so an export is byte-for-byte deterministic and a round-trip is a no-op
8
+ * diff. We sort object keys (the same rule Go's `json.Marshal` and the
9
+ * Terraform provider's `canonicalJSON` use) and PRESERVE array order — so a
10
+ * field whose order is meaningful (a claim mapping, an auth_config list) is
11
+ * never silently reordered.
12
+ *
13
+ * 2. THE CODEC. JSON is the robust default. YAML is offered for readable diffs
14
+ * in a repo; our YAML is a deliberately small, fully-specified subset where
15
+ * every map key and every scalar is JSON-encoded, so it is unambiguous to
16
+ * parse, round-trips exactly (newlines, URL-shaped keys, unicode and all),
17
+ * and is still valid YAML (JSON is a YAML subset).
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.canonicalize = canonicalize;
21
+ exports.canonicalString = canonicalString;
22
+ exports.deepEqual = deepEqual;
23
+ exports.serialize = serialize;
24
+ exports.deserialize = deserialize;
25
+ /** A plain JSON value with all object keys recursively sorted; arrays untouched. */
26
+ function canonicalize(value) {
27
+ if (value === null || value === undefined)
28
+ return null;
29
+ if (Array.isArray(value))
30
+ return value.map((v) => canonicalize(v));
31
+ if (typeof value === 'object') {
32
+ const out = {};
33
+ for (const key of Object.keys(value).sort()) {
34
+ const v = value[key];
35
+ if (v === undefined)
36
+ continue; // omit undefined so it never reaches disk
37
+ out[key] = canonicalize(v);
38
+ }
39
+ return out;
40
+ }
41
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {
42
+ return value;
43
+ }
44
+ // Functions, symbols, bigint: not part of a config document.
45
+ return null;
46
+ }
47
+ /** Canonical JSON string — the equality oracle for the diff engine. */
48
+ function canonicalString(value) {
49
+ return JSON.stringify(canonicalize(value));
50
+ }
51
+ /** True when two config values are equal after canonicalization. */
52
+ function deepEqual(a, b) {
53
+ return canonicalString(a) === canonicalString(b);
54
+ }
55
+ /** Serialize a canonicalizable value to the chosen format, with a trailing newline. */
56
+ function serialize(value, format) {
57
+ const canon = canonicalize(value);
58
+ if (format === 'json')
59
+ return JSON.stringify(canon, null, 2) + '\n';
60
+ return emitYaml(canon, 0) + '\n';
61
+ }
62
+ /** Parse a document written by {@link serialize}. */
63
+ function deserialize(text, format) {
64
+ if (format === 'json')
65
+ return JSON.parse(text);
66
+ return parseYaml(text);
67
+ }
68
+ // ─────────────────────────────── YAML emit ───────────────────────────────
69
+ const INDENT = ' ';
70
+ function emitYaml(value, depth) {
71
+ const pad = INDENT.repeat(depth);
72
+ if (Array.isArray(value)) {
73
+ if (value.length === 0)
74
+ return `${pad}[]`;
75
+ return value.map((item) => emitSeqItem(item, depth)).join('\n');
76
+ }
77
+ if (value !== null && typeof value === 'object') {
78
+ const keys = Object.keys(value);
79
+ if (keys.length === 0)
80
+ return `${pad}{}`;
81
+ return keys.map((key) => emitMapEntry(key, value[key], depth)).join('\n');
82
+ }
83
+ // A bare scalar document.
84
+ return `${pad}${JSON.stringify(value)}`;
85
+ }
86
+ function emitMapEntry(key, value, depth) {
87
+ const pad = INDENT.repeat(depth);
88
+ const k = JSON.stringify(key);
89
+ if (isContainer(value) && !isEmptyContainer(value)) {
90
+ return `${pad}${k}:\n${emitYaml(value, depth + 1)}`;
91
+ }
92
+ return `${pad}${k}: ${scalarOrEmpty(value)}`;
93
+ }
94
+ function emitSeqItem(value, depth) {
95
+ const pad = INDENT.repeat(depth);
96
+ if (isContainer(value) && !isEmptyContainer(value)) {
97
+ return `${pad}-\n${emitYaml(value, depth + 1)}`;
98
+ }
99
+ return `${pad}- ${scalarOrEmpty(value)}`;
100
+ }
101
+ function scalarOrEmpty(value) {
102
+ if (Array.isArray(value))
103
+ return '[]';
104
+ if (value !== null && typeof value === 'object')
105
+ return '{}';
106
+ return JSON.stringify(value);
107
+ }
108
+ function isContainer(v) {
109
+ return Array.isArray(v) || (v !== null && typeof v === 'object');
110
+ }
111
+ function isEmptyContainer(v) {
112
+ if (Array.isArray(v))
113
+ return v.length === 0;
114
+ if (v !== null && typeof v === 'object')
115
+ return Object.keys(v).length === 0;
116
+ return false;
117
+ }
118
+ function parseYaml(text) {
119
+ const lines = [];
120
+ for (const raw of text.split('\n')) {
121
+ if (raw.trim() === '')
122
+ continue;
123
+ const indent = raw.length - raw.replace(/^ +/, '').length;
124
+ lines.push({ indent, content: raw.slice(indent) });
125
+ }
126
+ if (lines.length === 0)
127
+ return null;
128
+ const first = lines[0];
129
+ // A whole-document scalar or empty container (`42`, `"x"`, `true`, `[]`, `{}`)
130
+ // is a single line that is neither a sequence item nor a `"key":` entry.
131
+ if (lines.length === 1 && !isSeqLine(first.content) && !looksLikeMapEntry(first.content)) {
132
+ return parseScalar(first.content, 0);
133
+ }
134
+ const [value, next] = parseBlock(lines, 0, first.indent);
135
+ if (next !== lines.length) {
136
+ throw new Error(`atlas config: malformed YAML near line ${next + 1}.`);
137
+ }
138
+ return value;
139
+ }
140
+ function isSeqLine(content) {
141
+ return content === '-' || content.startsWith('- ');
142
+ }
143
+ /** True when a line is a `"<json-key>":` map entry (vs. a bare scalar document). */
144
+ function looksLikeMapEntry(content) {
145
+ if (!content.startsWith('"'))
146
+ return false;
147
+ try {
148
+ return content[jsonStringEnd(content) + 1] === ':';
149
+ }
150
+ catch {
151
+ return false;
152
+ }
153
+ }
154
+ function parseBlock(lines, pos, indent) {
155
+ const first = lines[pos];
156
+ if (first.content === '-' || first.content.startsWith('- ')) {
157
+ return parseSeq(lines, pos, indent);
158
+ }
159
+ return parseMap(lines, pos, indent);
160
+ }
161
+ function parseMap(lines, pos, indent) {
162
+ const out = {};
163
+ let i = pos;
164
+ while (i < lines.length && lines[i].indent === indent) {
165
+ const line = lines[i];
166
+ if (line.content.startsWith('- ') || line.content === '-')
167
+ break;
168
+ const { key, rest } = splitKey(line.content, i);
169
+ if (rest === '') {
170
+ // Nested block on the following, more-indented lines.
171
+ if (i + 1 >= lines.length || lines[i + 1].indent <= indent) {
172
+ throw new Error(`atlas config: expected a nested block after '${key}:' (line ${i + 1}).`);
173
+ }
174
+ const [value, next] = parseBlock(lines, i + 1, lines[i + 1].indent);
175
+ out[key] = value;
176
+ i = next;
177
+ }
178
+ else {
179
+ out[key] = parseScalar(rest, i);
180
+ i += 1;
181
+ }
182
+ }
183
+ return [out, i];
184
+ }
185
+ function parseSeq(lines, pos, indent) {
186
+ const out = [];
187
+ let i = pos;
188
+ while (i < lines.length && lines[i].indent === indent) {
189
+ const line = lines[i];
190
+ if (!(line.content === '-' || line.content.startsWith('- ')))
191
+ break;
192
+ const rest = line.content === '-' ? '' : line.content.slice(2);
193
+ if (rest === '') {
194
+ if (i + 1 >= lines.length || lines[i + 1].indent <= indent) {
195
+ throw new Error(`atlas config: expected a nested block after '-' (line ${i + 1}).`);
196
+ }
197
+ const [value, next] = parseBlock(lines, i + 1, lines[i + 1].indent);
198
+ out.push(value);
199
+ i = next;
200
+ }
201
+ else {
202
+ out.push(parseScalar(rest, i));
203
+ i += 1;
204
+ }
205
+ }
206
+ return [out, i];
207
+ }
208
+ /** Split `"<json-key>": <rest>` (or `"<json-key>":`) into the decoded key and the rest. */
209
+ function splitKey(content, lineNo) {
210
+ if (!content.startsWith('"')) {
211
+ throw new Error(`atlas config: expected a quoted key (line ${lineNo + 1}): ${content}`);
212
+ }
213
+ const end = jsonStringEnd(content);
214
+ const key = JSON.parse(content.slice(0, end + 1));
215
+ let after = content.slice(end + 1);
216
+ if (!after.startsWith(':')) {
217
+ throw new Error(`atlas config: expected ':' after key (line ${lineNo + 1}): ${content}`);
218
+ }
219
+ after = after.slice(1);
220
+ return { key, rest: after.startsWith(' ') ? after.slice(1) : after };
221
+ }
222
+ /** Find the index of the closing quote of the JSON string that starts at index 0. */
223
+ function jsonStringEnd(s) {
224
+ let i = 1;
225
+ while (i < s.length) {
226
+ if (s[i] === '\\') {
227
+ i += 2;
228
+ continue;
229
+ }
230
+ if (s[i] === '"')
231
+ return i;
232
+ i += 1;
233
+ }
234
+ throw new Error(`atlas config: unterminated quoted string: ${s}`);
235
+ }
236
+ function parseScalar(rest, lineNo) {
237
+ if (rest === '[]')
238
+ return [];
239
+ if (rest === '{}')
240
+ return {};
241
+ try {
242
+ return JSON.parse(rest);
243
+ }
244
+ catch {
245
+ throw new Error(`atlas config: invalid scalar (line ${lineNo + 1}): ${rest}`);
246
+ }
247
+ }
248
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Read the package version from the shipped package.json at runtime rather than
3
+ * importing it — `src/` is the tsc rootDir, so a static `import ../package.json`
4
+ * would both break rootDir and bake a stale number into the bundle. At runtime
5
+ * `__dirname` is `dist/`, so `../package.json` is the real manifest beside it.
6
+ */
7
+ export declare function getVersion(): string;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getVersion = getVersion;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ /**
7
+ * Read the package version from the shipped package.json at runtime rather than
8
+ * importing it — `src/` is the tsc rootDir, so a static `import ../package.json`
9
+ * would both break rootDir and bake a stale number into the bundle. At runtime
10
+ * `__dirname` is `dist/`, so `../package.json` is the real manifest beside it.
11
+ */
12
+ function getVersion() {
13
+ try {
14
+ const manifest = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, '..', 'package.json'), 'utf8'));
15
+ return manifest.version ?? '0.0.0';
16
+ }
17
+ catch {
18
+ return '0.0.0';
19
+ }
20
+ }
21
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;AASA,gCASC;AAlBD,qCAAuC;AACvC,yCAAiC;AAEjC;;;;;GAKG;AACH,SAAgB,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAEtF,CAAC;QACF,OAAO,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,38 @@
1
1
  {
2
2
  "name": "@atlasauth/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "atlas — manage an Atlas instance from the terminal via the Backend API.",
5
+ "bin": {
6
+ "atlas": "dist/cli.js"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "dependencies": {
18
+ "@atlasauth/backend": "0.3.0",
19
+ "@atlasauth/actions": "0.1.0"
20
+ },
21
+ "devDependencies": {
22
+ "@types/node": "^22.9.0",
23
+ "typescript": "^5.6.3",
24
+ "vitest": "^2.1.4"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "README.md"
32
+ ],
33
+ "scripts": {
34
+ "build": "tsc -p tsconfig.build.json",
35
+ "typecheck": "tsc -p tsconfig.json --noEmit",
36
+ "test": "vitest run"
37
+ }
6
38
  }