@codemarc/blt 1.8.2 → 1.8.4
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/README.md +5 -4
- package/dist/blt +19 -19
- package/dist/blt.js.map +1 -1
- package/dist/commands/app/env-check.d.ts +24 -6
- package/dist/commands/app/env-check.d.ts.map +1 -1
- package/dist/commands/app/env-check.js +94 -31
- package/dist/commands/app/env-check.js.map +1 -1
- package/dist/commands/app/pos.d.ts.map +1 -1
- package/dist/commands/app/pos.js +15 -8
- package/dist/commands/app/pos.js.map +1 -1
- package/dist/commands/app.js +1 -1
- package/dist/commands/env/get.d.ts +8 -3
- package/dist/commands/env/get.d.ts.map +1 -1
- package/dist/commands/env/get.js +18 -16
- package/dist/commands/env/get.js.map +1 -1
- package/dist/commands/env/list.d.ts +8 -0
- package/dist/commands/env/list.d.ts.map +1 -0
- package/dist/commands/env/list.js +21 -0
- package/dist/commands/env/list.js.map +1 -0
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +18 -6
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/init/script.d.ts +1 -0
- package/dist/commands/init/script.d.ts.map +1 -1
- package/dist/commands/init/script.js +33 -11
- package/dist/commands/init/script.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/show/env.d.ts.map +1 -1
- package/dist/commands/show/env.js +7 -25
- package/dist/commands/show/env.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +1 -7
- package/dist/commands/workflow.js.map +1 -1
- package/dist/lib/github.d.ts +17 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +53 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/repositories.d.ts +1 -0
- package/dist/lib/repositories.d.ts.map +1 -1
- package/dist/lib/repositories.js +30 -14
- package/dist/lib/repositories.js.map +1 -1
- package/package.json +11 -10
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
- **Bucket**: Supabase storage — list buckets, list/upload/download files, get URLs
|
|
19
19
|
- **Workflow**: List, show, delete, reload, and deploy GitHub Actions workflows (requires `gh`)
|
|
20
20
|
- **Show**: Schema info, row counts, env vars, DB version, repo list
|
|
21
|
-
- **Env**: Decrypt trailz `.trailz/env
|
|
21
|
+
- **Env**: Decrypt trailz `.trailz/env/env.<name>.bin` to `.env` via smash (`blt env get`; expands `$VAR` by default; requires `SMASH_KEY`)
|
|
22
22
|
- **Spin**: Manage DigitalOcean droplets and DNS for BLT test environments
|
|
23
23
|
- **App**: Developer-triggered POS deployment and test data refresh workflows
|
|
24
24
|
- **Cleanup**: Remove generated SQL/instance files, clean infrequently used YAML tags
|
|
@@ -447,7 +447,7 @@ Pull a data snapshot from one environment and apply it to another.
|
|
|
447
447
|
blt app data refresh --from laf --to test-laf
|
|
448
448
|
```
|
|
449
449
|
|
|
450
|
-
This command uses `.trailz/env
|
|
450
|
+
This command uses `.trailz/env/env.<name>.bin` bundles in the **current working directory** (for example a deploy site checkout) and the existing `blt data pull` / `blt data apply` implementation. Snapshots default to `<cwd>/snapshots/` in **toon** format (override with `--out` / `--format`).
|
|
451
451
|
|
|
452
452
|
---
|
|
453
453
|
|
|
@@ -959,13 +959,14 @@ blt spin setup test-laf --user root
|
|
|
959
959
|
|
|
960
960
|
### `blt env get <name>`
|
|
961
961
|
|
|
962
|
-
Decrypt using `smash -n`. Ciphertext must be at `.trailz/env
|
|
962
|
+
Decrypt using `smash -n`. Ciphertext must be at `.trailz/env/env.<name>.bin`; the CLI invokes smash with **`env.<name>` (no `.bin`)** — that matches `@codemarc/smashdata`, which reads `${path}.bin` for decrypt. Set **`SMASH_KEY`** in your environment (same as when you encrypted). Writes plaintext to `.env` in the current directory. **`$VAR` references in the trailz file are expanded by default** (e.g. `SUPABASE_URL=https://$SUPABASE_PROJECT_REF.supabase.co`); use `--no-expand` to keep references verbatim.
|
|
963
963
|
|
|
964
964
|
```bash
|
|
965
965
|
blt env get laf
|
|
966
|
+
blt env get bae --no-expand
|
|
966
967
|
```
|
|
967
968
|
|
|
968
|
-
Equivalent to `smash -n .trailz/env
|
|
969
|
+
Equivalent to `smash -n .trailz/env/env.laf >.env` from the project root when `.trailz/env/env.laf.bin` exists.
|
|
969
970
|
|
|
970
971
|
---
|
|
971
972
|
|
package/dist/blt
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
import { program } from "@caporal/core";
|
|
3
|
+
import appCommand from "./commands/app";
|
|
3
4
|
import bucketCommand from "./commands/bucket";
|
|
4
5
|
import buildCommand from "./commands/build";
|
|
6
|
+
import cleanupCommand from "./commands/cleanup";
|
|
7
|
+
import dataCommand from "./commands/data";
|
|
5
8
|
import deployCommand from "./commands/deploy";
|
|
9
|
+
import envCommand from "./commands/env";
|
|
6
10
|
import imageCommand from "./commands/image";
|
|
7
11
|
import initCommand from "./commands/init";
|
|
8
12
|
import pdfCommand from "./commands/pdf";
|
|
9
|
-
import versionCommand from "./commands/version";
|
|
10
13
|
import showCommand from "./commands/show";
|
|
11
|
-
import cleanupCommand from "./commands/cleanup";
|
|
12
|
-
import workflowCommand from "./commands/workflow";
|
|
13
|
-
import waiCommand from "./commands/wai";
|
|
14
|
-
import templateCommand from "./commands/template";
|
|
15
|
-
import envCommand from "./commands/env";
|
|
16
|
-
import dataCommand from "./commands/data";
|
|
17
14
|
import spinCommand from "./commands/spin";
|
|
18
|
-
import
|
|
15
|
+
import templateCommand from "./commands/template";
|
|
16
|
+
import versionCommand from "./commands/version";
|
|
17
|
+
import waiCommand from "./commands/wai";
|
|
18
|
+
import workflowCommand from "./commands/workflow";
|
|
19
19
|
import { join, dirname } from "node:path";
|
|
20
20
|
import { readFileSync } from "node:fs";
|
|
21
21
|
import { fileURLToPath } from "node:url";
|
|
@@ -29,22 +29,22 @@ export function getPackageVersion() {
|
|
|
29
29
|
program.name("blt")
|
|
30
30
|
.version(getPackageVersion())
|
|
31
31
|
.description("BLT Core Cli");
|
|
32
|
+
appCommand(program);
|
|
33
|
+
bucketCommand(program);
|
|
34
|
+
buildCommand(program);
|
|
35
|
+
cleanupCommand(program);
|
|
36
|
+
dataCommand(program);
|
|
37
|
+
deployCommand(program);
|
|
38
|
+
envCommand(program);
|
|
32
39
|
imageCommand(program);
|
|
33
40
|
initCommand(program);
|
|
34
41
|
pdfCommand(program);
|
|
35
|
-
versionCommand(program);
|
|
36
|
-
buildCommand(program);
|
|
37
|
-
deployCommand(program);
|
|
38
|
-
bucketCommand(program);
|
|
39
42
|
showCommand(program);
|
|
40
|
-
cleanupCommand(program);
|
|
41
|
-
workflowCommand(program);
|
|
42
|
-
waiCommand(program);
|
|
43
|
-
templateCommand(program);
|
|
44
|
-
envCommand(program);
|
|
45
|
-
dataCommand(program);
|
|
46
43
|
spinCommand(program);
|
|
47
|
-
|
|
44
|
+
templateCommand(program);
|
|
45
|
+
versionCommand(program);
|
|
46
|
+
waiCommand(program);
|
|
47
|
+
workflowCommand(program);
|
|
48
48
|
// If no command is provided, show help
|
|
49
49
|
const args = process.argv.slice(2);
|
|
50
50
|
if (args.length === 0) {
|
package/dist/blt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blt.js","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"blt.js","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,eAAe,MAAM,qBAAqB,CAAC;AAClD,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,eAAe,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAG,IAAI,EAAE,cAAc,CAAC,CAAC;AAE/D,MAAM,UAAU,iBAAiB;IAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;KACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC;KAC5B,WAAW,CAAC,cAAc,CAAC,CAAC;AAE5B,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,eAAe,CAAC,OAAO,CAAC,CAAC;AAE3B,uCAAuC;AACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AACD,OAAO,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { Logger } from "@caporal/core";
|
|
2
2
|
/** Canonical tag written by `blt env get` and recognized on preflight. */
|
|
3
3
|
export declare const BLT_ENV_NAME_KEY = "BLT_ENV_NAME";
|
|
4
|
-
/**
|
|
4
|
+
/** Human-readable header written by `blt env get` (parsed on preflight). */
|
|
5
5
|
export declare const ENV_FROM_COMMENT_RE: RegExp;
|
|
6
|
+
/** Pre-rename trailz bundles (`.env.<name>.bin`); still parsed from older `.env` files. */
|
|
7
|
+
export declare const LEGACY_ENV_FROM_COMMENT_RE: RegExp;
|
|
6
8
|
export type AppEnvSource = "local-dotenv" | "trailz-bundle";
|
|
7
9
|
export type AppEnvAvailability = {
|
|
8
10
|
envName: string;
|
|
@@ -12,16 +14,32 @@ export type AppEnvAvailability = {
|
|
|
12
14
|
bundlePath: string;
|
|
13
15
|
};
|
|
14
16
|
export declare function trailzEnvBasePath(cwd: string, envName: string): string;
|
|
17
|
+
export declare function legacyTrailzEnvBasePath(cwd: string, envName: string): string;
|
|
15
18
|
export declare function trailzEnvBundlePath(cwd: string, envName: string): string;
|
|
19
|
+
export declare function legacyTrailzEnvBundlePath(cwd: string, envName: string): string;
|
|
20
|
+
/** Smash plaintext path + ciphertext path; prefers `env.<name>.bin`, falls back to legacy `.env.<name>.bin`. */
|
|
21
|
+
export declare function resolveTrailzEnvPaths(cwd: string, envName: string): {
|
|
22
|
+
basePath: string;
|
|
23
|
+
bundlePath: string;
|
|
24
|
+
} | null;
|
|
25
|
+
/** Names with a trailz ciphertext bundle in `cwd/.trailz/env/` (sorted). */
|
|
26
|
+
export declare function listTrailzEnvNames(cwd?: string): string[];
|
|
16
27
|
/** Device-manager bundle name paired with a site env (e.g. test1 → test1-dm). */
|
|
17
28
|
export declare function siteDmEnvName(siteEnvName: string): string;
|
|
18
29
|
export declare function appDmEnvPath(cwd: string): string;
|
|
19
30
|
export declare function dotEnvPathFor(cwd: string): string;
|
|
20
|
-
/**
|
|
21
|
-
export declare function formatEnvFileHeader(envName: string): string;
|
|
22
|
-
/** Parse `BLT_ENV_NAME` or `# from .trailz/env/.env.<name>.bin` from a `.env` body. */
|
|
31
|
+
/** Parse `BLT_ENV_NAME` or `# from .trailz/env/env.<name>.bin` from a `.env` body. */
|
|
23
32
|
export declare function parseEnvNameFromDotEnv(content: string): string | null;
|
|
24
|
-
|
|
33
|
+
/** Parse assignment lines from `.env` text (skips comments and `BLT_ENV_NAME`). */
|
|
34
|
+
export declare function parseDotEnvAssignments(content: string): Record<string, string>;
|
|
35
|
+
/** Expand `$VAR` / `${VAR}` references within a parsed env map. */
|
|
36
|
+
export declare function expandDotEnvAssignments(parsed: Record<string, string>): Record<string, string>;
|
|
37
|
+
/**
|
|
38
|
+
* Expand variable references in `.env` body text, preserving comments and line order.
|
|
39
|
+
* Used by `blt env get` so the written `.env` is runnable without runtime expansion.
|
|
40
|
+
*/
|
|
41
|
+
export declare function expandDotEnvBody(content: string): string;
|
|
42
|
+
export declare function parseDotEnvContent(content: string, baseEnv?: NodeJS.ProcessEnv, expand?: boolean): NodeJS.ProcessEnv;
|
|
25
43
|
/**
|
|
26
44
|
* Fail fast when the requested env is not available in `cwd`.
|
|
27
45
|
* Accepts a loaded, tagged `.env` or a trailz ciphertext bundle (+ SMASH_KEY).
|
|
@@ -30,7 +48,7 @@ export declare function ensureAppEnv(opts: {
|
|
|
30
48
|
envName: string;
|
|
31
49
|
cwd: string;
|
|
32
50
|
logger?: Logger;
|
|
33
|
-
/** When true, skip cwd `.env` and require `.trailz/env
|
|
51
|
+
/** When true, skip cwd `.env` and require `.trailz/env/env.<name>.bin` (app data workflows). */
|
|
34
52
|
trailzOnly?: boolean;
|
|
35
53
|
}): AppEnvAvailability;
|
|
36
54
|
//# sourceMappingURL=env-check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-check.d.ts","sourceRoot":"","sources":["../../../src/commands/app/env-check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"env-check.d.ts","sourceRoot":"","sources":["../../../src/commands/app/env-check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,QAA2E,CAAC;AAE5G,2FAA2F;AAC3F,eAAO,MAAM,0BAA0B,QACoC,CAAC;AAM5E,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,eAAe,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,gHAAgH;AAChH,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAcjD;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,EAAE,CAoBxE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAarE;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI9E;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI9F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBxD;AAED,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAM,CAAC,UAAwB,EACxC,MAAM,UAAO,GACX,MAAM,CAAC,UAAU,CAInB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gGAAgG;IAChG,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,kBAAkB,CAuDrB"}
|
|
@@ -1,15 +1,62 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import dotenv from "dotenv";
|
|
4
|
+
import dotenvExpand from "dotenv-expand";
|
|
3
5
|
/** Canonical tag written by `blt env get` and recognized on preflight. */
|
|
4
6
|
export const BLT_ENV_NAME_KEY = "BLT_ENV_NAME";
|
|
5
|
-
/**
|
|
6
|
-
export const ENV_FROM_COMMENT_RE = /^#\s*from\s+\.trailz\/env
|
|
7
|
+
/** Human-readable header written by `blt env get` (parsed on preflight). */
|
|
8
|
+
export const ENV_FROM_COMMENT_RE = /^#\s*from\s+\.trailz\/env\/env\.([a-zA-Z0-9][a-zA-Z0-9._-]*)\.bin\s*$/m;
|
|
9
|
+
/** Pre-rename trailz bundles (`.env.<name>.bin`); still parsed from older `.env` files. */
|
|
10
|
+
export const LEGACY_ENV_FROM_COMMENT_RE = /^#\s*from\s+\.trailz\/env\/\.env\.([a-zA-Z0-9][a-zA-Z0-9._-]*)\.bin\s*$/m;
|
|
11
|
+
/** Ciphertext filenames under `.trailz/env/` (basename only). */
|
|
12
|
+
const TRAILZ_ENV_BUNDLE_RE = /^env\.([a-zA-Z0-9][a-zA-Z0-9._-]*)\.bin$/;
|
|
13
|
+
const LEGACY_TRAILZ_ENV_BUNDLE_RE = /^\.env\.([a-zA-Z0-9][a-zA-Z0-9._-]*)\.bin$/;
|
|
7
14
|
export function trailzEnvBasePath(cwd, envName) {
|
|
15
|
+
return join(cwd, ".trailz", "env", `env.${envName}`);
|
|
16
|
+
}
|
|
17
|
+
export function legacyTrailzEnvBasePath(cwd, envName) {
|
|
8
18
|
return join(cwd, ".trailz", "env", `.env.${envName}`);
|
|
9
19
|
}
|
|
10
20
|
export function trailzEnvBundlePath(cwd, envName) {
|
|
11
21
|
return `${trailzEnvBasePath(cwd, envName)}.bin`;
|
|
12
22
|
}
|
|
23
|
+
export function legacyTrailzEnvBundlePath(cwd, envName) {
|
|
24
|
+
return `${legacyTrailzEnvBasePath(cwd, envName)}.bin`;
|
|
25
|
+
}
|
|
26
|
+
/** Smash plaintext path + ciphertext path; prefers `env.<name>.bin`, falls back to legacy `.env.<name>.bin`. */
|
|
27
|
+
export function resolveTrailzEnvPaths(cwd, envName) {
|
|
28
|
+
const newBase = trailzEnvBasePath(cwd, envName);
|
|
29
|
+
const newBin = `${newBase}.bin`;
|
|
30
|
+
if (existsSync(newBin)) {
|
|
31
|
+
return { basePath: newBase, bundlePath: newBin };
|
|
32
|
+
}
|
|
33
|
+
const legacyBase = legacyTrailzEnvBasePath(cwd, envName);
|
|
34
|
+
const legacyBin = `${legacyBase}.bin`;
|
|
35
|
+
if (existsSync(legacyBin)) {
|
|
36
|
+
return { basePath: legacyBase, bundlePath: legacyBin };
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/** Names with a trailz ciphertext bundle in `cwd/.trailz/env/` (sorted). */
|
|
41
|
+
export function listTrailzEnvNames(cwd = process.cwd()) {
|
|
42
|
+
const envDir = join(cwd, ".trailz", "env");
|
|
43
|
+
if (!existsSync(envDir)) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const names = new Set();
|
|
47
|
+
for (const file of readdirSync(envDir)) {
|
|
48
|
+
const current = TRAILZ_ENV_BUNDLE_RE.exec(file);
|
|
49
|
+
if (current) {
|
|
50
|
+
names.add(current[1]);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const legacy = LEGACY_TRAILZ_ENV_BUNDLE_RE.exec(file);
|
|
54
|
+
if (legacy) {
|
|
55
|
+
names.add(legacy[1]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return [...names].sort();
|
|
59
|
+
}
|
|
13
60
|
/** Device-manager bundle name paired with a site env (e.g. test1 → test1-dm). */
|
|
14
61
|
export function siteDmEnvName(siteEnvName) {
|
|
15
62
|
return `${siteEnvName}-dm`;
|
|
@@ -20,16 +67,7 @@ export function appDmEnvPath(cwd) {
|
|
|
20
67
|
export function dotEnvPathFor(cwd) {
|
|
21
68
|
return join(cwd, ".env");
|
|
22
69
|
}
|
|
23
|
-
/**
|
|
24
|
-
export function formatEnvFileHeader(envName) {
|
|
25
|
-
return [
|
|
26
|
-
`# BLT environment: ${envName}`,
|
|
27
|
-
`# from .trailz/env/.env.${envName}.bin`,
|
|
28
|
-
`${BLT_ENV_NAME_KEY}=${envName}`,
|
|
29
|
-
"",
|
|
30
|
-
].join("\n");
|
|
31
|
-
}
|
|
32
|
-
/** Parse `BLT_ENV_NAME` or `# from .trailz/env/.env.<name>.bin` from a `.env` body. */
|
|
70
|
+
/** Parse `BLT_ENV_NAME` or `# from .trailz/env/env.<name>.bin` from a `.env` body. */
|
|
33
71
|
export function parseEnvNameFromDotEnv(content) {
|
|
34
72
|
for (const rawLine of content.split("\n")) {
|
|
35
73
|
const line = rawLine.trim();
|
|
@@ -40,32 +78,57 @@ export function parseEnvNameFromDotEnv(content) {
|
|
|
40
78
|
return value.length > 0 ? value : null;
|
|
41
79
|
}
|
|
42
80
|
}
|
|
43
|
-
const commentMatch = ENV_FROM_COMMENT_RE.exec(content);
|
|
81
|
+
const commentMatch = ENV_FROM_COMMENT_RE.exec(content) ?? LEGACY_ENV_FROM_COMMENT_RE.exec(content);
|
|
44
82
|
return commentMatch?.[1] ?? null;
|
|
45
83
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
84
|
+
/** Parse assignment lines from `.env` text (skips comments and `BLT_ENV_NAME`). */
|
|
85
|
+
export function parseDotEnvAssignments(content) {
|
|
86
|
+
const parsed = dotenv.parse(content);
|
|
87
|
+
delete parsed[BLT_ENV_NAME_KEY];
|
|
88
|
+
return parsed;
|
|
89
|
+
}
|
|
90
|
+
/** Expand `$VAR` / `${VAR}` references within a parsed env map. */
|
|
91
|
+
export function expandDotEnvAssignments(parsed) {
|
|
92
|
+
const expanded = { ...parsed };
|
|
93
|
+
dotenvExpand.expand({ parsed: expanded, processEnv: {} });
|
|
94
|
+
return expanded;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Expand variable references in `.env` body text, preserving comments and line order.
|
|
98
|
+
* Used by `blt env get` so the written `.env` is runnable without runtime expansion.
|
|
99
|
+
*/
|
|
100
|
+
export function expandDotEnvBody(content) {
|
|
101
|
+
const expanded = expandDotEnvAssignments(parseDotEnvAssignments(content));
|
|
102
|
+
return content
|
|
103
|
+
.split("\n")
|
|
104
|
+
.map((rawLine) => {
|
|
105
|
+
const trimmed = rawLine.trim();
|
|
106
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
107
|
+
return rawLine;
|
|
108
|
+
if (trimmed.startsWith(`${BLT_ENV_NAME_KEY}=`))
|
|
109
|
+
return rawLine;
|
|
110
|
+
const eq = rawLine.indexOf("=");
|
|
55
111
|
if (eq <= 0)
|
|
56
|
-
|
|
57
|
-
const key =
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
112
|
+
return rawLine;
|
|
113
|
+
const key = rawLine.slice(0, eq).trim();
|
|
114
|
+
if (!(key in expanded))
|
|
115
|
+
return rawLine;
|
|
116
|
+
return `${rawLine.slice(0, eq + 1)}${expanded[key]}`;
|
|
117
|
+
})
|
|
118
|
+
.join("\n");
|
|
119
|
+
}
|
|
120
|
+
export function parseDotEnvContent(content, baseEnv = process.env, expand = true) {
|
|
121
|
+
const parsed = parseDotEnvAssignments(content);
|
|
122
|
+
const resolved = expand ? expandDotEnvAssignments(parsed) : parsed;
|
|
123
|
+
return { ...baseEnv, ...resolved };
|
|
62
124
|
}
|
|
63
125
|
/**
|
|
64
126
|
* Fail fast when the requested env is not available in `cwd`.
|
|
65
127
|
* Accepts a loaded, tagged `.env` or a trailz ciphertext bundle (+ SMASH_KEY).
|
|
66
128
|
*/
|
|
67
129
|
export function ensureAppEnv(opts) {
|
|
68
|
-
const
|
|
130
|
+
const resolved = resolveTrailzEnvPaths(opts.cwd, opts.envName);
|
|
131
|
+
const bundlePath = resolved?.bundlePath ?? trailzEnvBundlePath(opts.cwd, opts.envName);
|
|
69
132
|
const dotEnvPath = dotEnvPathFor(opts.cwd);
|
|
70
133
|
if (!opts.trailzOnly && existsSync(dotEnvPath)) {
|
|
71
134
|
const content = readFileSync(dotEnvPath, "utf8");
|
|
@@ -88,7 +151,7 @@ export function ensureAppEnv(opts) {
|
|
|
88
151
|
opts.logger?.info(`Local .env exists in ${opts.cwd} but is not tagged with ${BLT_ENV_NAME_KEY}; checking trailz bundle`);
|
|
89
152
|
}
|
|
90
153
|
}
|
|
91
|
-
if (!
|
|
154
|
+
if (!resolved) {
|
|
92
155
|
throw new Error(`Environment "${opts.envName}" is not available in ${opts.cwd}.\n` +
|
|
93
156
|
` Expected tagged .env (${BLT_ENV_NAME_KEY}=${opts.envName}) or ciphertext at:\n` +
|
|
94
157
|
` ${bundlePath}\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-check.js","sourceRoot":"","sources":["../../../src/commands/app/env-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"env-check.js","sourceRoot":"","sources":["../../../src/commands/app/env-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pos.d.ts","sourceRoot":"","sources":["../../../src/commands/app/pos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"pos.d.ts","sourceRoot":"","sources":["../../../src/commands/app/pos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAU5C,MAAM,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC;AAgBF,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoF3F"}
|
package/dist/commands/app/pos.js
CHANGED
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
import { existsSync, rmSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
3
|
import { findWorkspaceRoot, resolveDeploySiteDir } from "./paths";
|
|
4
|
-
import { appDmEnvPath, ensureAppEnv, siteDmEnvName,
|
|
4
|
+
import { appDmEnvPath, ensureAppEnv, resolveTrailzEnvPaths, siteDmEnvName, } from "./env-check";
|
|
5
5
|
import { runCommand } from "./shell";
|
|
6
6
|
function removeIfExists(path) {
|
|
7
7
|
if (existsSync(path)) {
|
|
8
8
|
rmSync(path, { recursive: true, force: true });
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
+
function trailzSmashRelPath(cwd, envName) {
|
|
12
|
+
const resolved = resolveTrailzEnvPaths(cwd, envName);
|
|
13
|
+
if (resolved) {
|
|
14
|
+
return relative(cwd, resolved.basePath);
|
|
15
|
+
}
|
|
16
|
+
return join(".trailz", "env", `env.${envName}`);
|
|
17
|
+
}
|
|
11
18
|
export async function deployPosApp(opts, logger) {
|
|
12
19
|
const workspaceRoot = findWorkspaceRoot();
|
|
13
20
|
const siteDir = resolveDeploySiteDir(opts.target, workspaceRoot);
|
|
14
21
|
const envPlain = join(siteDir, ".env");
|
|
15
22
|
const appZip = join(siteDir, "app.zip");
|
|
16
|
-
const siteEnvRel = `.trailz/env/.env.${opts.env}`;
|
|
17
23
|
ensureAppEnv({ envName: opts.env, cwd: siteDir, logger });
|
|
24
|
+
const siteEnvRel = trailzSmashRelPath(siteDir, opts.env);
|
|
18
25
|
logger.info(`Deploying POS branch "${opts.branch}" with env "${opts.env}" to "${opts.target}"`);
|
|
19
26
|
logger.info(`Site directory: ${siteDir}`);
|
|
20
27
|
runCommand("bash", ["-lc", `smash -n ../../../.trailz/keys | grep GITHUB_TOKEN > .env`], logger, {
|
|
@@ -43,17 +50,17 @@ export async function deployPosApp(opts, logger) {
|
|
|
43
50
|
"/home/blt/buildcore.sh",
|
|
44
51
|
], logger, { cwd: siteDir });
|
|
45
52
|
const dmEnvName = siteDmEnvName(opts.env);
|
|
46
|
-
const
|
|
53
|
+
const dmResolved = resolveTrailzEnvPaths(siteDir, dmEnvName);
|
|
47
54
|
const dmEnvOut = appDmEnvPath(siteDir);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
logger.info(`Writing gateway env from .
|
|
55
|
+
if (dmResolved) {
|
|
56
|
+
const dmSiteEnvRel = relative(siteDir, dmResolved.basePath);
|
|
57
|
+
logger.info(`Writing gateway env from ${dmResolved.bundlePath} → app/.dm.env`);
|
|
51
58
|
runCommand("bash", ["-lc", `smash -n ${dmSiteEnvRel} > app/.dm.env`], logger, {
|
|
52
59
|
cwd: siteDir,
|
|
53
60
|
});
|
|
54
61
|
}
|
|
55
62
|
else {
|
|
56
|
-
logger.info(`No DM env bundle
|
|
63
|
+
logger.info(`No DM env bundle for "${dmEnvName}" in ${siteDir}/.trailz/env; skipping app/.dm.env`);
|
|
57
64
|
if (existsSync(dmEnvOut)) {
|
|
58
65
|
rmSync(dmEnvOut, { force: true });
|
|
59
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pos.js","sourceRoot":"","sources":["../../../src/commands/app/pos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pos.js","sourceRoot":"","sources":["../../../src/commands/app/pos.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/app.js
CHANGED
|
@@ -10,7 +10,7 @@ Usage:
|
|
|
10
10
|
|
|
11
11
|
Defaults: --out <cwd>/snapshots, --format toon
|
|
12
12
|
|
|
13
|
-
Env credentials come from ./.trailz/env
|
|
13
|
+
Env credentials come from ./.trailz/env/env.<name>.bin in the current directory (not repo-root .env).
|
|
14
14
|
`;
|
|
15
15
|
const appHelp = `
|
|
16
16
|
Developer app deployment and test data workflows
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { Logger } from "@caporal/core";
|
|
2
|
+
export type EnvGetOptions = {
|
|
3
|
+
/** When false, write decrypted body verbatim (no `$VAR` expansion). */
|
|
4
|
+
expand?: boolean;
|
|
5
|
+
};
|
|
2
6
|
/**
|
|
3
|
-
* Decrypt `.trailz/env
|
|
4
|
-
* Invokes smash with path `.trailz/env
|
|
7
|
+
* Decrypt `.trailz/env/env.<name>.bin` with smash (`-n`) and write plaintext to `.env`.
|
|
8
|
+
* Invokes smash with path `.trailz/env/env.<name>` (no `.bin`) so smash reads `${path}.bin`.
|
|
9
|
+
* Legacy `.trailz/env/.env.<name>.bin` bundles are still accepted.
|
|
5
10
|
*/
|
|
6
|
-
export declare function envGet(name: string, logger: Logger): Promise<void>;
|
|
11
|
+
export declare function envGet(name: string, logger: Logger, opts?: EnvGetOptions): Promise<void>;
|
|
7
12
|
//# sourceMappingURL=get.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/env/get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/env/get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAK5C,MAAM,MAAM,aAAa,GAAG;IAC3B,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAsBF;;;;GAIG;AACH,wBAAsB,MAAM,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,aAAkB,GACtB,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
|
package/dist/commands/env/get.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
/** Single path segment for
|
|
3
|
+
import { BLT_ENV_NAME_KEY, expandDotEnvBody, resolveTrailzEnvPaths, trailzEnvBundlePath } from "../app/env-check";
|
|
4
|
+
/** Single path segment for `env.<name>` under `.trailz/env/`. */
|
|
5
5
|
const NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
|
|
6
6
|
/**
|
|
7
|
-
* `@codemarc/smashdata` `smash` expects the **plaintext path** `tf` (e.g.
|
|
8
|
-
* Ciphertext must live at `${tf}.bin`. If you pass `tf` =
|
|
7
|
+
* `@codemarc/smashdata` `smash` expects the **plaintext path** `tf` (e.g. `env.laf`).
|
|
8
|
+
* Ciphertext must live at `${tf}.bin`. If you pass `tf` = `env.laf.bin`, that file
|
|
9
9
|
* exists as `tf`, so smash treats it as plaintext and **re-encrypts** — output is garbage.
|
|
10
10
|
*/
|
|
11
11
|
function resolveSmashCommand(cwd) {
|
|
@@ -20,24 +20,25 @@ function resolveSmashCommand(cwd) {
|
|
|
20
20
|
return ["bunx", "@codemarc/smashdata"];
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
* Decrypt `.trailz/env
|
|
24
|
-
* Invokes smash with path `.trailz/env
|
|
23
|
+
* Decrypt `.trailz/env/env.<name>.bin` with smash (`-n`) and write plaintext to `.env`.
|
|
24
|
+
* Invokes smash with path `.trailz/env/env.<name>` (no `.bin`) so smash reads `${path}.bin`.
|
|
25
|
+
* Legacy `.trailz/env/.env.<name>.bin` bundles are still accepted.
|
|
25
26
|
*/
|
|
26
|
-
export async function envGet(name, logger) {
|
|
27
|
+
export async function envGet(name, logger, opts = {}) {
|
|
28
|
+
const expand = opts.expand ?? true;
|
|
27
29
|
if (!NAME_RE.test(name)) {
|
|
28
30
|
logger.error("Invalid environment name: use one segment (letters, numbers, . _ -).");
|
|
29
31
|
process.exit(1);
|
|
30
32
|
}
|
|
31
33
|
const cwd = process.cwd();
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const binPath = `${basePath}.bin`;
|
|
36
|
-
if (!existsSync(binPath)) {
|
|
34
|
+
const resolved = resolveTrailzEnvPaths(cwd, name);
|
|
35
|
+
const binPath = resolved?.bundlePath ?? trailzEnvBundlePath(cwd, name);
|
|
36
|
+
if (!resolved) {
|
|
37
37
|
logger.error(`Encrypted env not found (need ciphertext at):\n ${binPath}\n` +
|
|
38
|
-
`Smash stores secrets in
|
|
38
|
+
`Smash stores secrets in env.<name>.bin; the argument to smash is env.<name> without .bin.`);
|
|
39
39
|
process.exit(1);
|
|
40
40
|
}
|
|
41
|
+
const basePath = resolved.basePath;
|
|
41
42
|
const smashCmd = resolveSmashCommand(cwd);
|
|
42
43
|
const proc = Bun.spawnSync({
|
|
43
44
|
cmd: [...smashCmd, "-n", basePath],
|
|
@@ -50,8 +51,9 @@ export async function envGet(name, logger) {
|
|
|
50
51
|
process.exit(proc.exitCode ?? 1);
|
|
51
52
|
}
|
|
52
53
|
const outPath = join(cwd, ".env");
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
const decrypted = proc.stdout.toString().replace(/^\uFEFF/, "").trimStart();
|
|
55
|
+
const body = expand ? expandDotEnvBody(decrypted) : decrypted;
|
|
56
|
+
await Bun.write(outPath, `${body}\n`);
|
|
57
|
+
logger.info(`Wrote ${outPath} (${BLT_ENV_NAME_KEY}=${name}${expand ? ", expanded" : ""})`);
|
|
56
58
|
}
|
|
57
59
|
//# sourceMappingURL=get.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/env/get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/env/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Logger } from "@caporal/core";
|
|
2
|
+
export type EnvListOptions = {
|
|
3
|
+
json?: boolean;
|
|
4
|
+
cwd?: string;
|
|
5
|
+
};
|
|
6
|
+
/** List trailz env bundle names available in `cwd/.trailz/env/`. */
|
|
7
|
+
export declare function envList(logger: Logger, opts?: EnvListOptions): void;
|
|
8
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/env/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,MAAM,cAAc,GAAG;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,oEAAoE;AACpE,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,IAAI,CAoBvE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { listTrailzEnvNames } from "../app/env-check";
|
|
2
|
+
/** List trailz env bundle names available in `cwd/.trailz/env/`. */
|
|
3
|
+
export function envList(logger, opts = {}) {
|
|
4
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
5
|
+
const names = listTrailzEnvNames(cwd);
|
|
6
|
+
if (opts.json) {
|
|
7
|
+
console.log(JSON.stringify(names, null, 2));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (names.length === 0) {
|
|
11
|
+
logger.info(`No environment bundles in ${cwd}/.trailz/env/`);
|
|
12
|
+
logger.info("Usage: blt env get <name>");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
logger.info(`Available environments (${cwd}/.trailz/env):`);
|
|
16
|
+
for (const name of names) {
|
|
17
|
+
logger.info(` ${name}`);
|
|
18
|
+
}
|
|
19
|
+
logger.info("\nUsage: blt env get <name>");
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/env/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAOtD,oEAAoE;AACpE,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,OAAuB,EAAE;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;IACR,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,6BAA6B,GAAG,eAAe,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO;IACR,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,GAAG,gBAAgB,CAAC,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,OAAO,EAAE,MAAM,eAAe,CAAC;AAI5E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,EAAE,OAAO,QAyDlD"}
|