@atlasauth/cli 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +48 -0
- package/dist/args.d.ts +12 -0
- package/dist/args.js +5 -1
- package/dist/args.js.map +1 -1
- package/dist/commands/config.d.ts +24 -0
- package/dist/commands/config.js +172 -7
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/project-commands.js +9 -4
- package/dist/commands/project-commands.js.map +1 -1
- package/dist/commands/referrals.d.ts +12 -2
- package/dist/commands/referrals.js +329 -97
- package/dist/commands/referrals.js.map +1 -1
- package/dist/help.d.ts +1 -1
- package/dist/help.js +66 -12
- package/dist/help.js.map +1 -1
- package/dist/run.js +2 -0
- package/dist/run.js.map +1 -1
- package/dist/serialize.d.ts +3 -4
- package/dist/serialize.js +12 -129
- package/dist/serialize.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @atlasauth/cli changelog
|
|
2
2
|
|
|
3
|
+
## 0.18.0 — 2026-11-02
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- `atlas referrals connect --provider referalli` registers the two-way sync webhook limited to `--program` (`programIds: [<program>]`). It used to register it for every program, so a shared Referalli organization sent other products' referral events to the instance. A webhook an earlier run registered for every program is re-scoped in place.
|
|
8
|
+
- `connect` is idempotent: a second run reuses the instance's existing Referalli connection (one per instance) and sync webhook and updates them in place, never creating a duplicate. A secret the instance does not already hold is rotated on Referalli and saved (never printed). A connection for the instance in another program is refused with the program to use.
|
|
9
|
+
- `connect` sets `tracking_token` (from the Referalli organization) and `link_template` (`{link host}/go/{tracking token}/{code}`, on the active link domain when there is one); a link template set before is kept. What it cannot read is printed as the exact `PATCH /v1/instance/referrals` body left to send (`left_to_do` with `--json`).
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `connect --link-template <url>`.
|
|
14
|
+
- `atlas referrals status --json` prints a `status` object (connection id, program, webhook endpoint id, URL and program scope, `link_template_set`, `tracking_token_set`, last sync, last test) next to the raw `settings`. The webhook scope is read from Referalli when a merchant key is given (`--referalli-key-file` or `REFERALLI_API_KEY`); otherwise it is `unknown`. The text output shows the link template, tracking token and, when known, the webhook scope.
|
|
15
|
+
|
|
16
|
+
### Dependencies
|
|
17
|
+
|
|
18
|
+
- Pulls `@atlasauth/backend` 0.31.0, which depends on the published `@atlasauth/pca` ^0.4.3 instead of the deprecated 0.1.0, and `@atlasauth/upgrade` 0.7.0, which drops the deprecated `jscodeshift` 0.16 chain (`rimraf@2`, `glob@7`, `inflight`).
|
|
19
|
+
|
|
20
|
+
## 0.17.0 — 2026-10-30
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- `atlas referrals backfill --own-map <file.csv>` and `--own-metadata-path <path>`: keep each user's own referral code (the one they share) through a backfill. The command reports how many were kept and names the customer refs whose code another user already holds.
|
|
25
|
+
|
|
3
26
|
## 0.16.0 — 2026-10-30
|
|
4
27
|
|
|
5
28
|
### Fixed
|
package/README.md
CHANGED
|
@@ -44,6 +44,8 @@ atlas webhooks list | create --url <url> [--events a,b]
|
|
|
44
44
|
atlas sessions revoke <id>
|
|
45
45
|
atlas config export [--dir <path>] [--format json|yaml]
|
|
46
46
|
atlas config import [--dir <path>] [--format json|yaml] [--dry-run] [--prune]
|
|
47
|
+
atlas plan [<file|dir>] [--check] [--json] [--secrets-file <dotenv>]
|
|
48
|
+
atlas apply [<file|dir>] [--yes] [--check] [--prune] [--secrets-file <dotenv>] [--out <dir>]
|
|
47
49
|
atlas init --product <name> [--domain <d>] [--instance-env development|production] ...
|
|
48
50
|
atlas preflight [--instance <id> | --product <name>] [--fail-on error|warning]
|
|
49
51
|
atlas env --product <name> --format dotenv|coolify|vercel
|
|
@@ -133,4 +135,50 @@ Rules that make it safe and repeatable:
|
|
|
133
135
|
- **Non-destructive.** `import` never deletes without `--prune`, and a resource
|
|
134
136
|
type with no file is left untouched (only committed types are managed).
|
|
135
137
|
|
|
138
|
+
### One file: `atlas apply` and `atlas plan`
|
|
139
|
+
|
|
140
|
+
`atlas apply atlas.yaml` takes one JSON or YAML file whose top-level keys are
|
|
141
|
+
the resource types above (or a directory from `config export`), shows the plan,
|
|
142
|
+
asks before applying (`--yes` skips the question; needed without a terminal),
|
|
143
|
+
and applies. Re-running it is a no-op. `atlas plan atlas.yaml` shows the
|
|
144
|
+
field-level diff without writing.
|
|
145
|
+
|
|
146
|
+
```yaml
|
|
147
|
+
# atlas.yaml
|
|
148
|
+
instance:
|
|
149
|
+
allowed_origins: [https://app.example.com]
|
|
150
|
+
auth_config:
|
|
151
|
+
signUpMode: restricted
|
|
152
|
+
redirect_urls:
|
|
153
|
+
- url: https://app.example.com/auth/callback
|
|
154
|
+
webhook_endpoints:
|
|
155
|
+
- url: https://app.example.com/webhooks/atlas
|
|
156
|
+
enabled_events: [user.created, user.updated, session.revoked]
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
atlas plan atlas.yaml --check # CI: exit 2 when the instance differs
|
|
161
|
+
atlas apply atlas.yaml # plan, confirm, apply
|
|
162
|
+
atlas apply atlas.yaml --yes --secrets-file .atlas.secrets # non-interactive
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
- **CI gate.** `--check` (on `plan`, `apply` and `config plan`; alias `--exit-code`)
|
|
166
|
+
exits 2 when there is drift and never writes.
|
|
167
|
+
- **Secrets.** `${VAR}` placeholders resolve from the environment, then from
|
|
168
|
+
`--secrets-file` (a dotenv file). The file must be readable only by you
|
|
169
|
+
(`chmod 600`); anything looser is refused. `apply` stops before writing if a
|
|
170
|
+
placeholder is still unresolved.
|
|
171
|
+
- **New secrets.** When `apply` creates an OAuth client or a webhook endpoint,
|
|
172
|
+
the one-time `client_secret` / signing secret goes to a mode-0600 dotenv file
|
|
173
|
+
(`~/.config/atlas`, or `--out <dir>`) and the CLI prints the path.
|
|
174
|
+
- **Order.** The CLI applies resource types in a fixed order: `instance`,
|
|
175
|
+
`org_settings_schema`, `redirect_urls`, `oauth_clients`, `oauth_providers`,
|
|
176
|
+
`custom_oauth_providers`, `resource_servers`, `jwt_templates`, `permissions`,
|
|
177
|
+
`roles`, `webhook_endpoints`, `sso_connections`, `billing_plans`,
|
|
178
|
+
`notification_templates`, `email_templates`, `organization_policies`. The
|
|
179
|
+
ordering is done by the CLI, not by the server. The email provider and the
|
|
180
|
+
`before_user_create` hook are not part of config files: set up the email
|
|
181
|
+
provider (your own Resend or Brevo account) before you apply sign-in methods
|
|
182
|
+
that send email, or they stay listed as inactive until you do.
|
|
183
|
+
|
|
136
184
|
Ship it on push with the [`atlas-deploy` GitHub Action](../../actions/atlas-deploy).
|
package/dist/args.d.ts
CHANGED
|
@@ -241,6 +241,9 @@ declare const OPTIONS: {
|
|
|
241
241
|
readonly 'exit-code': {
|
|
242
242
|
readonly type: "boolean";
|
|
243
243
|
};
|
|
244
|
+
readonly check: {
|
|
245
|
+
readonly type: "boolean";
|
|
246
|
+
};
|
|
244
247
|
readonly provider: {
|
|
245
248
|
readonly type: "string";
|
|
246
249
|
};
|
|
@@ -286,6 +289,9 @@ declare const OPTIONS: {
|
|
|
286
289
|
readonly 'tracking-token': {
|
|
287
290
|
readonly type: "string";
|
|
288
291
|
};
|
|
292
|
+
readonly 'link-template': {
|
|
293
|
+
readonly type: "string";
|
|
294
|
+
};
|
|
289
295
|
readonly 'no-sync': {
|
|
290
296
|
readonly type: "boolean";
|
|
291
297
|
};
|
|
@@ -310,6 +316,12 @@ declare const OPTIONS: {
|
|
|
310
316
|
readonly 'metadata-path': {
|
|
311
317
|
readonly type: "string";
|
|
312
318
|
};
|
|
319
|
+
readonly 'own-map': {
|
|
320
|
+
readonly type: "string";
|
|
321
|
+
};
|
|
322
|
+
readonly 'own-metadata-path': {
|
|
323
|
+
readonly type: "string";
|
|
324
|
+
};
|
|
313
325
|
readonly wait: {
|
|
314
326
|
readonly type: "boolean";
|
|
315
327
|
};
|
package/dist/args.js
CHANGED
|
@@ -112,8 +112,9 @@ const OPTIONS = {
|
|
|
112
112
|
framework: { type: 'string' },
|
|
113
113
|
manifest: { type: 'string', multiple: true },
|
|
114
114
|
'no-atlas': { type: 'boolean' },
|
|
115
|
-
// config plan.
|
|
115
|
+
// config plan / plan / apply: exit 2 on drift (`--check` is the CI spelling).
|
|
116
116
|
'exit-code': { type: 'boolean' },
|
|
117
|
+
check: { type: 'boolean' },
|
|
117
118
|
// referrals connect / backfill.
|
|
118
119
|
provider: { type: 'string' },
|
|
119
120
|
program: { type: 'string' },
|
|
@@ -134,6 +135,7 @@ const OPTIONS = {
|
|
|
134
135
|
'auto-enroll': { type: 'boolean' },
|
|
135
136
|
destination: { type: 'string' },
|
|
136
137
|
'tracking-token': { type: 'string' },
|
|
138
|
+
'link-template': { type: 'string' },
|
|
137
139
|
'no-sync': { type: 'boolean' },
|
|
138
140
|
'allow-mode-mismatch': { type: 'boolean' },
|
|
139
141
|
endpoint: { type: 'string' },
|
|
@@ -142,6 +144,8 @@ const OPTIONS = {
|
|
|
142
144
|
since: { type: 'string' },
|
|
143
145
|
map: { type: 'string' },
|
|
144
146
|
'metadata-path': { type: 'string' },
|
|
147
|
+
'own-map': { type: 'string' },
|
|
148
|
+
'own-metadata-path': { type: 'string' },
|
|
145
149
|
wait: { type: 'boolean' },
|
|
146
150
|
// import --from <vendor>.
|
|
147
151
|
from: { type: 'string' },
|
package/dist/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,30 @@ export interface FieldDiff {
|
|
|
45
45
|
}
|
|
46
46
|
/** Leaf-level differences between two documents, as dotted paths (arrays compare whole). */
|
|
47
47
|
export declare function diffFields(before: Json | undefined, after: Json | undefined, path?: string): FieldDiff[];
|
|
48
|
+
/**
|
|
49
|
+
* The environment `${VAR}` placeholders resolve against: the process env, then
|
|
50
|
+
* `--secrets-file` (a dotenv file) on top. The file holds credentials, so it
|
|
51
|
+
* must be readable by its owner only (mode 0600 or stricter); anything looser
|
|
52
|
+
* is refused rather than read. POSIX only: Windows has no such mode bits.
|
|
53
|
+
*/
|
|
54
|
+
export declare function readSecretsEnv(ctx: RunContext, values: Values): NodeJS.ProcessEnv;
|
|
55
|
+
/** `${VAR}` placeholders still in a planned change (no env value and no --secrets-file entry). */
|
|
56
|
+
export declare function unresolvedPlaceholders(changes: Change[]): string[];
|
|
57
|
+
/** The resource types a single config file may hold, in the order they are applied. */
|
|
58
|
+
export declare function configTypes(): string[];
|
|
59
|
+
/**
|
|
60
|
+
* `atlas plan [<file|dir>]`: the read-only diff of `atlas config plan`, taking
|
|
61
|
+
* a single config file as well. `--check` exits 2 on drift for CI.
|
|
62
|
+
*/
|
|
63
|
+
export declare function planCommand(ctx: RunContext, args: ParsedArgs): Promise<number>;
|
|
64
|
+
/**
|
|
65
|
+
* `atlas apply [<file|dir>]`: plan, show it, confirm, then apply in the fixed
|
|
66
|
+
* resource order (see {@link configTypes}). `--yes` skips the question (needed
|
|
67
|
+
* when there is no terminal); `--check` only plans and exits 2 on drift.
|
|
68
|
+
* Refuses to apply while any `${VAR}` placeholder is unresolved, so a missing
|
|
69
|
+
* secret is never sent as the literal text.
|
|
70
|
+
*/
|
|
71
|
+
export declare function applyCommand(ctx: RunContext, args: ParsedArgs): Promise<number>;
|
|
48
72
|
export declare function printPlan(ctx: RunContext, changes: Change[], unchanged: number, skippedDeletes: Change[], opts: {
|
|
49
73
|
dryRun: boolean;
|
|
50
74
|
prune: boolean;
|
package/dist/commands/config.js
CHANGED
|
@@ -4,6 +4,11 @@ exports.config = config;
|
|
|
4
4
|
exports.resolveFormat = resolveFormat;
|
|
5
5
|
exports.planConfigImport = planConfigImport;
|
|
6
6
|
exports.diffFields = diffFields;
|
|
7
|
+
exports.readSecretsEnv = readSecretsEnv;
|
|
8
|
+
exports.unresolvedPlaceholders = unresolvedPlaceholders;
|
|
9
|
+
exports.configTypes = configTypes;
|
|
10
|
+
exports.planCommand = planCommand;
|
|
11
|
+
exports.applyCommand = applyCommand;
|
|
7
12
|
exports.printPlan = printPlan;
|
|
8
13
|
exports.interpolate = interpolate;
|
|
9
14
|
const node_fs_1 = require("node:fs");
|
|
@@ -15,6 +20,7 @@ const errors_1 = require("../errors");
|
|
|
15
20
|
const serialize_1 = require("../serialize");
|
|
16
21
|
const backend_1 = require("@atlasauth/backend");
|
|
17
22
|
const shared_1 = require("./shared");
|
|
23
|
+
const secrets_1 = require("../secrets");
|
|
18
24
|
// ───────────────────────────── small helpers ─────────────────────────────
|
|
19
25
|
/** GET a `{ data: [...] }` list envelope, tolerating an absent/garbled body. */
|
|
20
26
|
async function listData(http, path) {
|
|
@@ -621,7 +627,7 @@ async function config(ctx, args) {
|
|
|
621
627
|
case 'import':
|
|
622
628
|
return importConfig(ctx, args.values);
|
|
623
629
|
case 'plan':
|
|
624
|
-
return planConfig(ctx, args.values);
|
|
630
|
+
return planConfig(ctx, args.values, { dir: resolveDir(args.values), format: resolveFormat(args.values), env: readSecretsEnv(ctx, args.values) });
|
|
625
631
|
case 'promote':
|
|
626
632
|
return promoteConfig(ctx, args.values);
|
|
627
633
|
default:
|
|
@@ -817,7 +823,7 @@ async function importConfig(ctx, values) {
|
|
|
817
823
|
const format = resolveFormat(values);
|
|
818
824
|
const dryRun = values['dry-run'] === true;
|
|
819
825
|
const prune = values.prune === true;
|
|
820
|
-
const plan = await planConfigImport(http, { dir, format, env: ctx
|
|
826
|
+
const plan = await planConfigImport(http, { dir, format, env: readSecretsEnv(ctx, values), prune });
|
|
821
827
|
printPlan(ctx, plan.changes, plan.unchanged, plan.skippedDeletes, { dryRun, prune });
|
|
822
828
|
if (dryRun)
|
|
823
829
|
return 0;
|
|
@@ -849,12 +855,11 @@ const show = (v) => (v === undefined ? '(unset)' : typeof v === 'string' ? JSON.
|
|
|
849
855
|
* Field-level for updates, `--json` for tooling, and `--exit-code` to exit 2
|
|
850
856
|
* when there is drift so CI can gate on it. Never writes anything.
|
|
851
857
|
*/
|
|
852
|
-
async function planConfig(ctx, values) {
|
|
858
|
+
async function planConfig(ctx, values, source) {
|
|
853
859
|
const http = requireHttp(ctx, values);
|
|
854
|
-
const dir =
|
|
855
|
-
const format = resolveFormat(values);
|
|
860
|
+
const { dir, format, env } = source;
|
|
856
861
|
const prune = values.prune === true;
|
|
857
|
-
const plan = await planConfigImport(http, { dir, format, env
|
|
862
|
+
const plan = await planConfigImport(http, { dir, format, env, prune });
|
|
858
863
|
const deletes = prune ? [] : plan.skippedDeletes;
|
|
859
864
|
const all = plan.changes;
|
|
860
865
|
const rows = all.map((c) => ({
|
|
@@ -894,7 +899,167 @@ async function planConfig(ctx, values) {
|
|
|
894
899
|
if (pending === 0)
|
|
895
900
|
ctx.io.out('No drift: the instance matches the config directory.');
|
|
896
901
|
}
|
|
897
|
-
return values
|
|
902
|
+
return wantsCheck(values) && pending > 0 ? 2 : 0;
|
|
903
|
+
}
|
|
904
|
+
/** `--check` (CI) and `--exit-code` (Terraform's name) both mean: exit 2 when there is drift. */
|
|
905
|
+
const wantsCheck = (values) => values['exit-code'] === true || values.check === true;
|
|
906
|
+
/**
|
|
907
|
+
* The environment `${VAR}` placeholders resolve against: the process env, then
|
|
908
|
+
* `--secrets-file` (a dotenv file) on top. The file holds credentials, so it
|
|
909
|
+
* must be readable by its owner only (mode 0600 or stricter); anything looser
|
|
910
|
+
* is refused rather than read. POSIX only: Windows has no such mode bits.
|
|
911
|
+
*/
|
|
912
|
+
function readSecretsEnv(ctx, values) {
|
|
913
|
+
const file = (0, args_1.str)(values, 'secrets-file');
|
|
914
|
+
if (!file)
|
|
915
|
+
return ctx.env;
|
|
916
|
+
let mode;
|
|
917
|
+
try {
|
|
918
|
+
mode = (0, node_fs_1.statSync)(file).mode;
|
|
919
|
+
}
|
|
920
|
+
catch {
|
|
921
|
+
throw new errors_1.CliError(`--secrets-file not found: ${file}.`);
|
|
922
|
+
}
|
|
923
|
+
if (process.platform !== 'win32' && (mode & 0o077) !== 0) {
|
|
924
|
+
throw new errors_1.CliError(`--secrets-file ${file} is readable by others (mode ${(mode & 0o777).toString(8)}). Run 'chmod 600 ${file}' and try again.`);
|
|
925
|
+
}
|
|
926
|
+
return { ...ctx.env, ...(0, secrets_1.parseDotenv)(ctx.readFile(file)) };
|
|
927
|
+
}
|
|
928
|
+
/** `${VAR}` placeholders still in a planned change (no env value and no --secrets-file entry). */
|
|
929
|
+
function unresolvedPlaceholders(changes) {
|
|
930
|
+
const names = new Set();
|
|
931
|
+
for (const c of changes) {
|
|
932
|
+
for (const m of JSON.stringify(c.after ?? null).matchAll(/\$\{([A-Z0-9_]+)\}/g))
|
|
933
|
+
names.add(m[1]);
|
|
934
|
+
}
|
|
935
|
+
return [...names].sort();
|
|
936
|
+
}
|
|
937
|
+
/** The resource types a single config file may hold, in the order they are applied. */
|
|
938
|
+
function configTypes() {
|
|
939
|
+
return registry().map((s) => s.type);
|
|
940
|
+
}
|
|
941
|
+
/**
|
|
942
|
+
* Resolve `atlas plan|apply [<path>]`: a directory of per-type files (as
|
|
943
|
+
* `atlas config export` writes), or ONE file whose top-level keys are resource
|
|
944
|
+
* types (`instance`, `webhook_endpoints`, …), split into a temp directory.
|
|
945
|
+
* `cleanup` removes that temp directory.
|
|
946
|
+
*/
|
|
947
|
+
function resolveSource(ctx, args) {
|
|
948
|
+
const path = args.positionals[1] ?? resolveDir(args.values);
|
|
949
|
+
const env = readSecretsEnv(ctx, args.values);
|
|
950
|
+
let isFile = false;
|
|
951
|
+
try {
|
|
952
|
+
isFile = (0, node_fs_1.statSync)(path).isFile();
|
|
953
|
+
}
|
|
954
|
+
catch {
|
|
955
|
+
throw new errors_1.CliError(`Config not found: ${path}. Pass a config file (atlas.yaml / atlas.json) or a directory from 'atlas config export'.`);
|
|
956
|
+
}
|
|
957
|
+
if (!isFile)
|
|
958
|
+
return { dir: path, format: resolveFormat(args.values), env, cleanup: () => undefined };
|
|
959
|
+
const ext = (0, node_path_1.extname)(path).toLowerCase();
|
|
960
|
+
const format = ext === '.yaml' || ext === '.yml' ? 'yaml' : ext === '.json' ? 'json' : resolveFormat(args.values);
|
|
961
|
+
const doc = (0, serialize_1.deserialize)(ctx.readFile(path), format);
|
|
962
|
+
if (doc === null || typeof doc !== 'object' || Array.isArray(doc)) {
|
|
963
|
+
throw new errors_1.CliError(`${path} must be an object keyed by resource type (${configTypes().join(', ')}).`);
|
|
964
|
+
}
|
|
965
|
+
const known = new Set(configTypes());
|
|
966
|
+
const unknown = Object.keys(doc).filter((k) => !known.has(k));
|
|
967
|
+
if (unknown.length) {
|
|
968
|
+
throw new errors_1.CliError(`${path}: unknown resource type(s) ${unknown.join(', ')}. Known: ${configTypes().join(', ')}.`);
|
|
969
|
+
}
|
|
970
|
+
const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'atlas-apply-'));
|
|
971
|
+
for (const [type, value] of Object.entries(doc))
|
|
972
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, `${type}.json`), (0, serialize_1.serialize)(value, 'json'));
|
|
973
|
+
return { dir, format: 'json', env, cleanup: () => (0, node_fs_1.rmSync)(dir, { recursive: true, force: true }) };
|
|
974
|
+
}
|
|
975
|
+
/**
|
|
976
|
+
* `atlas plan [<file|dir>]`: the read-only diff of `atlas config plan`, taking
|
|
977
|
+
* a single config file as well. `--check` exits 2 on drift for CI.
|
|
978
|
+
*/
|
|
979
|
+
async function planCommand(ctx, args) {
|
|
980
|
+
const source = resolveSource(ctx, args);
|
|
981
|
+
try {
|
|
982
|
+
return await planConfig(ctx, args.values, source);
|
|
983
|
+
}
|
|
984
|
+
finally {
|
|
985
|
+
source.cleanup();
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
/**
|
|
989
|
+
* `atlas apply [<file|dir>]`: plan, show it, confirm, then apply in the fixed
|
|
990
|
+
* resource order (see {@link configTypes}). `--yes` skips the question (needed
|
|
991
|
+
* when there is no terminal); `--check` only plans and exits 2 on drift.
|
|
992
|
+
* Refuses to apply while any `${VAR}` placeholder is unresolved, so a missing
|
|
993
|
+
* secret is never sent as the literal text.
|
|
994
|
+
*/
|
|
995
|
+
async function applyCommand(ctx, args) {
|
|
996
|
+
const values = args.values;
|
|
997
|
+
if (values.check === true || values['exit-code'] === true)
|
|
998
|
+
return planCommand(ctx, args);
|
|
999
|
+
const source = resolveSource(ctx, args);
|
|
1000
|
+
try {
|
|
1001
|
+
const kept = keepingSecrets(requireHttp(ctx, values), (0, args_1.str)(values, 'out') || (0, secrets_1.productDir)(ctx.env, 'atlas'));
|
|
1002
|
+
const prune = values.prune === true;
|
|
1003
|
+
const plan = await planConfigImport(kept.http, { dir: source.dir, format: source.format, env: source.env, prune });
|
|
1004
|
+
printPlan(ctx, plan.changes, plan.unchanged, plan.skippedDeletes, { dryRun: false, prune });
|
|
1005
|
+
if (plan.changes.length === 0) {
|
|
1006
|
+
ctx.io.out('No changes to apply.');
|
|
1007
|
+
return 0;
|
|
1008
|
+
}
|
|
1009
|
+
const missing = unresolvedPlaceholders(plan.changes);
|
|
1010
|
+
if (missing.length) {
|
|
1011
|
+
throw new errors_1.CliError(`Unresolved placeholder(s): ${missing.map((n) => `\${${n}}`).join(', ')}. Set them in the environment or in --secrets-file.`);
|
|
1012
|
+
}
|
|
1013
|
+
if (values.yes !== true) {
|
|
1014
|
+
const answer = (await ctx.prompt.text(`Apply ${plan.changes.length} change(s)? [y/N]`, { default: 'n' })).trim().toLowerCase();
|
|
1015
|
+
if (answer !== 'y' && answer !== 'yes') {
|
|
1016
|
+
ctx.io.out('Nothing applied.');
|
|
1017
|
+
return 1;
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
for (const change of plan.changes)
|
|
1021
|
+
await change.apply();
|
|
1022
|
+
ctx.io.out(`Applied ${plan.changes.length} change(s).`);
|
|
1023
|
+
for (const path of kept.saved)
|
|
1024
|
+
ctx.io.out(`A new secret was written to ${path} (mode 0600). It is shown only once.`);
|
|
1025
|
+
return 0;
|
|
1026
|
+
}
|
|
1027
|
+
finally {
|
|
1028
|
+
source.cleanup();
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
/**
|
|
1032
|
+
* The API, but a create that answers with a one-time secret (a new OAuth
|
|
1033
|
+
* client's `client_secret`, a new webhook endpoint's `secret`) writes it to a
|
|
1034
|
+
* 0600 dotenv file in `dir` (default `~/.config/atlas`, or `--out`) instead of
|
|
1035
|
+
* dropping it. The file names are the hosted-redirect env names.
|
|
1036
|
+
*/
|
|
1037
|
+
function keepingSecrets(http, dir) {
|
|
1038
|
+
const saved = [];
|
|
1039
|
+
const wrapped = {
|
|
1040
|
+
get: (path) => http.get(path),
|
|
1041
|
+
put: (path, body) => http.put(path, body),
|
|
1042
|
+
patch: (path, body) => http.patch(path, body),
|
|
1043
|
+
delete: (path, body) => http.delete(path, body),
|
|
1044
|
+
async post(path, body) {
|
|
1045
|
+
const res = await http.post(path, body);
|
|
1046
|
+
const r = (res ?? {});
|
|
1047
|
+
const id = String(r.id ?? r.client_id ?? 'new').replace(/[^A-Za-z0-9_-]/g, '_');
|
|
1048
|
+
let entries = null;
|
|
1049
|
+
if (path === '/v1/oauth_clients' && typeof r.client_secret === 'string') {
|
|
1050
|
+
entries = { ATLAS_CLIENT_ID: String(r.client_id ?? ''), ATLAS_CLIENT_SECRET: r.client_secret };
|
|
1051
|
+
}
|
|
1052
|
+
else if (path === '/v1/webhook_endpoints' && typeof r.secret === 'string') {
|
|
1053
|
+
entries = { ATLAS_WEBHOOK_SECRET: r.secret };
|
|
1054
|
+
}
|
|
1055
|
+
if (entries) {
|
|
1056
|
+
const kind = path === '/v1/oauth_clients' ? 'oauth-client' : 'webhook';
|
|
1057
|
+
saved.push((0, secrets_1.writeSecretFile)(dir, `${kind}-${id}.env`, entries, { comment: `Written by atlas apply. ${kind} ${id}.` }).path);
|
|
1058
|
+
}
|
|
1059
|
+
return res;
|
|
1060
|
+
},
|
|
1061
|
+
};
|
|
1062
|
+
return { http: wrapped, saved };
|
|
898
1063
|
}
|
|
899
1064
|
function printPlan(ctx, changes, unchanged, skippedDeletes, opts) {
|
|
900
1065
|
const heading = opts.dryRun ? 'Plan (dry run — nothing applied):' : 'Plan:';
|