envprism 0.1.0-dev.11-c6859e8 → 0.1.0-dev.12-c99a64a

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 CHANGED
@@ -91,6 +91,82 @@ bunx envprism diff --check; echo $? # exits 1 if any file drifts from base
91
91
 
92
92
  Inside the TUI, press `?` for the full keybinding reference.
93
93
 
94
+ ## ⚙️ Configuration
95
+
96
+ envprism runs zero-config. To tune defaults, drop an `envprism.config.{ts,js,mjs,json}` in your project — manage it with the `config` commands:
97
+
98
+ ```bash
99
+ bunx envprism config init # scaffold envprism.config.ts (--force to overwrite)
100
+ bunx envprism config path # print the resolved config file (or note defaults)
101
+ bunx envprism config show # print the effective merged config as JSON
102
+ bunx envprism config edit # open it in $EDITOR (creates one in cwd if absent)
103
+ ```
104
+
105
+ **Discovery & precedence.** The config file is resolved by walking **up from the current working directory** (not from the scanned `--paths` directory). Override the location with the `--config <path>` flag or the `ENVPRISM_CONFIG` env var. For any individual setting, a CLI flag beats the config file, which beats the built-in default (`flag > config > default`).
106
+
107
+ For type-safe authoring:
108
+
109
+ ```ts
110
+ // envprism.config.ts
111
+ import { defineEnvprismConfig } from 'envprism/config';
112
+
113
+ export default defineEnvprismConfig({
114
+ heuristics: { secretTokensExtra: ['WEBHOOK'], grouping: 'banner' },
115
+ tui: { theme: { fgSection: '#5fd7d7' } }
116
+ });
117
+ ```
118
+
119
+ List fields come in two flavours: the base field (e.g. `secretTokens`) **replaces** the built-in list, while the `…Extra` variant (e.g. `secretTokensExtra`) **appends** to it.
120
+
121
+ ### `discovery`
122
+
123
+ | Option | Default | What it does |
124
+ | :------------------ | :--------------------- | :------------------------------------------------------ |
125
+ | `paths` | `['.']` | Directories scanned when none are passed on the CLI. |
126
+ | `skipSuffixes` | `['.swp', '~', '.bak']`| Filename suffixes to skip (replaces the default list). |
127
+ | `skipSuffixesExtra` | `[]` | Suffixes appended to `skipSuffixes`. |
128
+ | `exampleFirst` | `true` | Sort `.env.example` first in the discovered file order. |
129
+
130
+ ### `base`
131
+
132
+ | Option | Default | What it does |
133
+ | :--------- | :--------------- | :----------------------------------------------------------------- |
134
+ | `name` | `'.env.example'` | Filename used as the diff base when present (overridden by `--base`). |
135
+ | `priority` | `[]` | Ordered basenames tried as base before falling back to the first file. |
136
+
137
+ Base resolution order: `--base` flag → `base.name` → `base.priority` (in order) → first discovered file.
138
+
139
+ ### `heuristics`
140
+
141
+ | Option | Default | What it does |
142
+ | :------------------ | :------------------------------- | :-------------------------------------------------------- |
143
+ | `secretTokens` | `SECRET, TOKEN, PASSWORD, …` | Key segments that mark a value as a secret (replaces). |
144
+ | `secretTokensExtra` | `[]` | Secret tokens appended to the defaults. |
145
+ | `placeholders` | `todo, fixme, changeme, …` | Regex atoms flagging placeholder values (replaces). |
146
+ | `placeholdersExtra` | `[]` | Placeholder atoms appended to the defaults. |
147
+ | `grouping` | `'auto'` | TUI grouping: `auto` (banner if present, else prefix), `banner`, or `prefix`. |
148
+
149
+ ### `diff`
150
+
151
+ | Option | Default | What it does |
152
+ | :-------------- | :------ | :---------------------------------------------------- |
153
+ | `json` | `false` | Emit JSON instead of the text table by default. |
154
+ | `checkExitCode` | `1` | Exit code used by `diff --check` when files drift. |
155
+
156
+ ### `tui`
157
+
158
+ | Option | Default | What it does |
159
+ | :------------ | :------ | :-------------------------------------------------------------- |
160
+ | `theme` | `{}` | Partial `#rrggbb` overrides for the palette (see keys below). |
161
+ | `layout` | — | Column/sidebar widths: `keyColWidth` (22), `valueColMin` (18), `sidebarWidth` (30), `rowGap` (0), `cellPadX` (1). |
162
+ | `undoLimit` | `50` | Max entries in the undo stack. |
163
+ | `maskSecrets` | `true` | Start with secret-suspect values masked (toggle in-app with `Ctrl-T`). |
164
+
165
+ Theme keys (all optional hex strings): `fg`, `fgDim`, `fgHeader`, `fgBase`, `fgSection`, `differs`, `extra`, `placeholder`, `modified`, `fgDirty`, `missing`, `focusBg`. Invalid hex values are ignored with a warning and fall back to the default.
166
+
167
+ > [!NOTE]
168
+ > The TypeScript types exported from `envprism/config` (`EnvprismUserConfig` and friends) are the canonical, always-current reference. A worked example lives in [`examples/envprism.config.ts`](examples/envprism.config.ts).
169
+
94
170
  ## 🤝 Contributing
95
171
 
96
172
  PRs welcome. Conventional Commits required (enforced via commitlint). Husky runs the project's linters/formatters on `git commit`.
@@ -1,78 +1,11 @@
1
1
  #!/usr/bin/env bun
2
2
  import { defineCommand, runMain } from "citty";
3
+ import { spawn } from "node:child_process";
4
+ import { writeFile } from "node:fs/promises";
3
5
  import consola from "consola";
4
6
  import { resolve, join } from "pathe";
5
- import { l as loadEnvprismConfig, e as discoverEnvFiles, r as resolveBase, b as buildMatrix, c as computeDiff, g as formatDiffText } from "../chunks/matrix-CQv-scUc.mjs";
6
- import { writeFile } from "node:fs/promises";
7
- const diffCommand = defineCommand({
8
- meta: {
9
- name: "diff",
10
- description: "Print the drift between .env* files compared to a base."
11
- },
12
- args: {
13
- paths: {
14
- type: "positional",
15
- required: false,
16
- description: "Directory or files to scan (defaults to cwd)."
17
- },
18
- base: {
19
- type: "string",
20
- description: "Base file to diff against (defaults to .env.example)."
21
- },
22
- json: {
23
- type: "boolean",
24
- description: "Emit JSON instead of a text table."
25
- },
26
- check: {
27
- type: "boolean",
28
- description: "Suppress output and exit 1 when any file drifts from the base."
29
- },
30
- config: {
31
- type: "string",
32
- description: "Path to an envprism.config file (default: walk up from cwd)."
33
- }
34
- },
35
- async run({ args }) {
36
- const { config } = await loadEnvprismConfig({ configFile: args.config });
37
- const inputs = collectPaths$1(args.paths, config.discovery.paths);
38
- const files = await discoverEnvFiles(
39
- inputs.map((p) => resolve(p)),
40
- {
41
- skipSuffixes: config.discovery.skipSuffixes,
42
- exampleFirst: config.discovery.exampleFirst
43
- }
44
- );
45
- if (files.length === 0) {
46
- if (!args.check) consola.warn("No .env* files found.");
47
- process.exit(args.check ? 0 : 1);
48
- }
49
- const base = resolveBase(files, args.base, {
50
- exampleName: config.base.exampleName,
51
- priority: config.base.priority
52
- });
53
- if (!base) {
54
- consola.error("Could not resolve a base file.");
55
- process.exit(1);
56
- }
57
- const matrix = buildMatrix(files, base);
58
- const report = computeDiff(matrix);
59
- if (args.check) {
60
- process.exit(report.inSync ? 0 : config.diff.checkExitCode);
61
- }
62
- const json = args.json ?? config.diff.json;
63
- if (json) {
64
- process.stdout.write(JSON.stringify(report, null, 2) + "\n");
65
- return;
66
- }
67
- process.stdout.write(formatDiffText(report));
68
- }
69
- });
70
- function collectPaths$1(arg, fallback) {
71
- if (Array.isArray(arg)) return arg.map(String);
72
- if (typeof arg === "string" && arg.length > 0) return [arg];
73
- return fallback;
74
- }
75
- const TEMPLATE = `/**
7
+ import { l as loadEnvprismConfig, e as discoverEnvFiles, r as resolveBase, b as buildMatrix, c as computeDiff, g as formatDiffText } from "../chunks/matrix-C1pErf9Z.mjs";
8
+ const CONFIG_TEMPLATE = `/**
76
9
  * envprism configuration.
77
10
  *
78
11
  * For type-safe authoring, install envprism and switch to:
@@ -88,7 +21,7 @@ export default {
88
21
  // exampleFirst: true
89
22
  },
90
23
  base: {
91
- exampleName: '.env.example'
24
+ name: '.env.example'
92
25
  // priority: ['.env.shared']
93
26
  },
94
27
  heuristics: {
@@ -136,7 +69,7 @@ const initCommand = defineCommand({
136
69
  const dir = resolve(typeof args.out === "string" ? args.out : ".");
137
70
  const target = join(dir, "envprism.config.ts");
138
71
  try {
139
- await writeFile(target, TEMPLATE, {
72
+ await writeFile(target, CONFIG_TEMPLATE, {
140
73
  encoding: "utf8",
141
74
  flag: args.force ? "w" : "wx"
142
75
  });
@@ -151,6 +84,163 @@ const initCommand = defineCommand({
151
84
  consola.success(`Wrote ${target}`);
152
85
  }
153
86
  });
87
+ const editCommand = defineCommand({
88
+ meta: {
89
+ name: "edit",
90
+ description: "Open the config in $EDITOR (creates it in cwd if none exists)."
91
+ },
92
+ args: {
93
+ config: {
94
+ type: "string",
95
+ description: "Path to an envprism.config file (default: walk up from cwd)."
96
+ }
97
+ },
98
+ async run({ args }) {
99
+ let { configFile } = await loadEnvprismConfig({ configFile: args.config });
100
+ if (!configFile) {
101
+ configFile = resolve("envprism.config.ts");
102
+ try {
103
+ await writeFile(configFile, CONFIG_TEMPLATE, {
104
+ encoding: "utf8",
105
+ flag: "wx"
106
+ });
107
+ consola.info(`Created ${configFile}`);
108
+ } catch {
109
+ }
110
+ }
111
+ const editor = process.env.VISUAL || process.env.EDITOR || "nano";
112
+ await new Promise((res, rej) => {
113
+ const child = spawn(editor, [configFile], { stdio: "inherit" });
114
+ child.on("error", rej);
115
+ child.on("exit", (code) => {
116
+ if (code && code !== 0) {
117
+ consola.warn(`${editor} exited with code ${code}.`);
118
+ }
119
+ res();
120
+ });
121
+ });
122
+ }
123
+ });
124
+ const pathCommand = defineCommand({
125
+ meta: {
126
+ name: "path",
127
+ description: "Print the resolved config file path (or note that defaults are used)."
128
+ },
129
+ args: {
130
+ config: {
131
+ type: "string",
132
+ description: "Path to an envprism.config file (default: walk up from cwd)."
133
+ }
134
+ },
135
+ async run({ args }) {
136
+ const { configFile, cwd } = await loadEnvprismConfig({
137
+ configFile: args.config
138
+ });
139
+ if (configFile) {
140
+ process.stdout.write(configFile + "\n");
141
+ } else {
142
+ consola.info(
143
+ `No envprism.config found (searched up from ${cwd}); using built-in defaults.`
144
+ );
145
+ }
146
+ }
147
+ });
148
+ const showCommand = defineCommand({
149
+ meta: {
150
+ name: "show",
151
+ description: "Print the effective (merged) config as JSON."
152
+ },
153
+ args: {
154
+ config: {
155
+ type: "string",
156
+ description: "Path to an envprism.config file (default: walk up from cwd)."
157
+ }
158
+ },
159
+ async run({ args }) {
160
+ const { config } = await loadEnvprismConfig({ configFile: args.config });
161
+ process.stdout.write(JSON.stringify(config, null, 2) + "\n");
162
+ }
163
+ });
164
+ const configCommand = defineCommand({
165
+ meta: {
166
+ name: "config",
167
+ description: "Inspect and manage the envprism config."
168
+ },
169
+ subCommands: {
170
+ init: initCommand,
171
+ path: pathCommand,
172
+ show: showCommand,
173
+ edit: editCommand
174
+ }
175
+ });
176
+ const diffCommand = defineCommand({
177
+ meta: {
178
+ name: "diff",
179
+ description: "Print the drift between .env* files compared to a base."
180
+ },
181
+ args: {
182
+ paths: {
183
+ type: "positional",
184
+ required: false,
185
+ description: "Directory or files to scan (defaults to cwd)."
186
+ },
187
+ base: {
188
+ type: "string",
189
+ description: "Base file to diff against (defaults to .env.example)."
190
+ },
191
+ json: {
192
+ type: "boolean",
193
+ description: "Emit JSON instead of a text table."
194
+ },
195
+ check: {
196
+ type: "boolean",
197
+ description: "Suppress output and exit 1 when any file drifts from the base."
198
+ },
199
+ config: {
200
+ type: "string",
201
+ description: "Path to an envprism.config file (default: walk up from cwd)."
202
+ }
203
+ },
204
+ async run({ args }) {
205
+ const { config } = await loadEnvprismConfig({ configFile: args.config });
206
+ const inputs = collectPaths$1(args.paths, config.discovery.paths);
207
+ const files = await discoverEnvFiles(
208
+ inputs.map((p) => resolve(p)),
209
+ {
210
+ skipSuffixes: config.discovery.skipSuffixes,
211
+ exampleFirst: config.discovery.exampleFirst
212
+ }
213
+ );
214
+ if (files.length === 0) {
215
+ if (!args.check) consola.warn("No .env* files found.");
216
+ process.exit(args.check ? 0 : 1);
217
+ }
218
+ const base = resolveBase(files, args.base, {
219
+ name: config.base.name,
220
+ priority: config.base.priority
221
+ });
222
+ if (!base) {
223
+ consola.error("Could not resolve a base file.");
224
+ process.exit(1);
225
+ }
226
+ const matrix = buildMatrix(files, base);
227
+ const report = computeDiff(matrix);
228
+ if (args.check) {
229
+ process.exit(report.inSync ? 0 : config.diff.checkExitCode);
230
+ }
231
+ const json = args.json ?? config.diff.json;
232
+ if (json) {
233
+ process.stdout.write(JSON.stringify(report, null, 2) + "\n");
234
+ return;
235
+ }
236
+ process.stdout.write(formatDiffText(report));
237
+ }
238
+ });
239
+ function collectPaths$1(arg, fallback) {
240
+ if (Array.isArray(arg)) return arg.map(String);
241
+ if (typeof arg === "string" && arg.length > 0) return [arg];
242
+ return fallback;
243
+ }
154
244
  async function runTui(args) {
155
245
  const { config } = await loadEnvprismConfig({ configFile: args.config });
156
246
  const inputs = collectPaths(args.paths, config.discovery.paths);
@@ -166,7 +256,7 @@ async function runTui(args) {
166
256
  process.exit(1);
167
257
  }
168
258
  const base = resolveBase(files, args.base, {
169
- exampleName: config.base.exampleName,
259
+ name: config.base.name,
170
260
  priority: config.base.priority
171
261
  });
172
262
  if (!base) {
@@ -174,7 +264,7 @@ async function runTui(args) {
174
264
  process.exit(1);
175
265
  }
176
266
  const matrix = buildMatrix(files, base);
177
- const { runMatrixTui } = await import("../chunks/app-BtsPqDdo.mjs");
267
+ const { runMatrixTui } = await import("../chunks/app-DgjyG_HE.mjs");
178
268
  await runMatrixTui(matrix, config);
179
269
  }
180
270
  const tuiCommand = defineCommand({
@@ -206,7 +296,7 @@ function collectPaths(arg, fallback) {
206
296
  if (typeof arg === "string" && arg.length > 0) return [arg];
207
297
  return fallback;
208
298
  }
209
- const SUBCOMMANDS = /* @__PURE__ */ new Set(["tui", "diff", "init"]);
299
+ const SUBCOMMANDS = /* @__PURE__ */ new Set(["tui", "diff", "config"]);
210
300
  const rootCommand = defineCommand({
211
301
  meta: {
212
302
  name: "envprism",
@@ -215,7 +305,7 @@ const rootCommand = defineCommand({
215
305
  subCommands: {
216
306
  tui: tuiCommand,
217
307
  diff: diffCommand,
218
- init: initCommand
308
+ config: configCommand
219
309
  },
220
310
  // citty 0.1.6 invokes the root `run` after a matched subcommand returns,
221
311
  // so guard against double-execution by bailing when the first positional
@@ -1 +1 @@
1
- {"version":3,"file":"envprism.mjs","sources":["../../src/commands/diff.ts","../../src/commands/init.ts","../../src/commands/tui.ts","../../src/cli.ts","../../src/bin/envprism.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { loadEnvprismConfig } from '@/config/load.ts';\nimport { resolveBase } from '@/core/base.ts';\nimport { computeDiff, formatDiffText } from '@/core/diff.ts';\nimport { discoverEnvFiles } from '@/core/discover.ts';\nimport { buildMatrix } from '@/core/matrix.ts';\n\nexport const diffCommand = defineCommand({\n meta: {\n name: 'diff',\n description: 'Print the drift between .env* files compared to a base.'\n },\n args: {\n paths: {\n type: 'positional',\n required: false,\n description: 'Directory or files to scan (defaults to cwd).'\n },\n base: {\n type: 'string',\n description: 'Base file to diff against (defaults to .env.example).'\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of a text table.'\n },\n check: {\n type: 'boolean',\n description:\n 'Suppress output and exit 1 when any file drifts from the base.'\n },\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n const inputs = collectPaths(args.paths, config.discovery.paths);\n const files = await discoverEnvFiles(\n inputs.map((p) => resolve(p)),\n {\n skipSuffixes: config.discovery.skipSuffixes,\n exampleFirst: config.discovery.exampleFirst\n }\n );\n\n if (files.length === 0) {\n if (!args.check) consola.warn('No .env* files found.');\n process.exit(args.check ? 0 : 1);\n }\n\n const base = resolveBase(files, args.base, {\n exampleName: config.base.exampleName,\n priority: config.base.priority\n });\n if (!base) {\n consola.error('Could not resolve a base file.');\n process.exit(1);\n }\n\n const matrix = buildMatrix(files, base);\n const report = computeDiff(matrix);\n\n if (args.check) {\n process.exit(report.inSync ? 0 : config.diff.checkExitCode);\n }\n\n const json = args.json ?? config.diff.json;\n if (json) {\n process.stdout.write(JSON.stringify(report, null, 2) + '\\n');\n return;\n }\n\n process.stdout.write(formatDiffText(report));\n }\n});\n\nfunction collectPaths(arg: unknown, fallback: string[]): string[] {\n if (Array.isArray(arg)) return arg.map(String);\n if (typeof arg === 'string' && arg.length > 0) return [arg];\n return fallback;\n}\n","import { writeFile } from 'node:fs/promises';\nimport { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { join, resolve } from 'pathe';\n\nconst TEMPLATE = `/**\n * envprism configuration.\n *\n * For type-safe authoring, install envprism and switch to:\n * import { defineEnvprismConfig } from 'envprism/config';\n * export default defineEnvprismConfig({ ... });\n *\n * @type {import('envprism/config').EnvprismUserConfig}\n */\nexport default {\n discovery: {\n // paths: ['.'],\n // skipSuffixesExtra: ['.tmp'],\n // exampleFirst: true\n },\n base: {\n exampleName: '.env.example'\n // priority: ['.env.shared']\n },\n heuristics: {\n // secretTokensExtra: ['JWT'],\n // placeholdersExtra: ['set[_-]?me'],\n grouping: 'auto'\n },\n diff: {\n json: false,\n checkExitCode: 1\n },\n tui: {\n theme: {\n // fgBase: '#82aaff'\n },\n layout: {\n keyColWidth: 22,\n valueColMin: 18,\n sidebarWidth: 30,\n rowGap: 0,\n cellPadX: 1\n },\n undoLimit: 50,\n maskSecrets: true\n }\n};\n`;\n\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description: 'Scaffold an envprism.config.ts with documented defaults.'\n },\n args: {\n out: {\n type: 'positional',\n required: false,\n description: 'Directory to write envprism.config.ts into (default: cwd).'\n },\n force: {\n type: 'boolean',\n description: 'Overwrite an existing config file.'\n }\n },\n async run({ args }) {\n const dir = resolve(typeof args.out === 'string' ? args.out : '.');\n const target = join(dir, 'envprism.config.ts');\n try {\n await writeFile(target, TEMPLATE, {\n encoding: 'utf8',\n flag: args.force ? 'w' : 'wx'\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n consola.error(`${target} already exists. Use --force to overwrite.`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n consola.success(`Wrote ${target}`);\n }\n});\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { loadEnvprismConfig } from '@/config/load.ts';\nimport { resolveBase } from '@/core/base.ts';\nimport { discoverEnvFiles } from '@/core/discover.ts';\nimport { buildMatrix } from '@/core/matrix.ts';\n\ninterface TuiInvocation {\n paths?: string | string[];\n base?: string;\n config?: string;\n}\n\n/**\n * Resolve the matrix and boot the TUI. Shared between the explicit `tui`\n * subcommand and the default-no-subcommand path in `rootCommand`.\n */\nexport async function runTui(args: TuiInvocation): Promise<void> {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n const inputs = collectPaths(args.paths, config.discovery.paths);\n const files = await discoverEnvFiles(\n inputs.map((p) => resolve(p)),\n {\n skipSuffixes: config.discovery.skipSuffixes,\n exampleFirst: config.discovery.exampleFirst\n }\n );\n\n if (files.length === 0) {\n consola.warn('No .env* files found.');\n process.exit(1);\n }\n\n const base = resolveBase(files, args.base, {\n exampleName: config.base.exampleName,\n priority: config.base.priority\n });\n if (!base) {\n consola.error('Could not resolve a base file.');\n process.exit(1);\n }\n\n const matrix = buildMatrix(files, base);\n\n // Dynamic import keeps @opentui/core out of the bundle path used by the\n // `diff` subcommand, so users running diff on Node never hit Bun-only code.\n const { runMatrixTui } = await import('../tui/app.ts');\n await runMatrixTui(matrix, config);\n}\n\nexport const tuiCommand = defineCommand({\n meta: {\n name: 'tui',\n description: 'Open the interactive matrix view (default command).'\n },\n args: {\n paths: {\n type: 'positional',\n required: false,\n description: 'Directory or files to scan (defaults to cwd).'\n },\n base: {\n type: 'string',\n description: 'Base file to diff against (defaults to .env.example).'\n },\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n await runTui({ paths: args.paths, base: args.base, config: args.config });\n }\n});\n\nfunction collectPaths(arg: unknown, fallback: string[]): string[] {\n if (Array.isArray(arg)) return arg.map(String);\n if (typeof arg === 'string' && arg.length > 0) return [arg];\n return fallback;\n}\n","import { defineCommand } from 'citty';\nimport { diffCommand } from '@/commands/diff.ts';\nimport { initCommand } from '@/commands/init.ts';\nimport { runTui, tuiCommand } from '@/commands/tui.ts';\n\nconst SUBCOMMANDS = new Set(['tui', 'diff', 'init']);\n\nexport const rootCommand = defineCommand({\n meta: {\n name: 'envprism',\n description:\n 'TUI-based env file manager — refract one set of variables into many environment views.'\n },\n subCommands: {\n tui: tuiCommand,\n diff: diffCommand,\n init: initCommand\n },\n // citty 0.1.6 invokes the root `run` after a matched subcommand returns,\n // so guard against double-execution by bailing when the first positional\n // arg names a known subcommand. With no args at all we launch the TUI in\n // the cwd, which is the documented default.\n async run({ rawArgs }) {\n const firstPositional = rawArgs.find((a) => !a.startsWith('-'));\n if (firstPositional && SUBCOMMANDS.has(firstPositional)) return;\n await runTui({});\n }\n});\n","import { runMain } from 'citty';\nimport { rootCommand } from '@/cli.ts';\n\nrunMain(rootCommand);\n"],"names":["collectPaths"],"mappings":"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"}
1
+ {"version":3,"file":"envprism.mjs","sources":["../../src/commands/config/init.ts","../../src/commands/config/edit.ts","../../src/commands/config/path.ts","../../src/commands/config/show.ts","../../src/commands/config/index.ts","../../src/commands/diff.ts","../../src/commands/tui.ts","../../src/cli.ts","../../src/bin/envprism.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\nimport { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { join, resolve } from 'pathe';\n\n/** Scaffold template, shared with `config edit` for first-time creation. */\nexport const CONFIG_TEMPLATE = `/**\n * envprism configuration.\n *\n * For type-safe authoring, install envprism and switch to:\n * import { defineEnvprismConfig } from 'envprism/config';\n * export default defineEnvprismConfig({ ... });\n *\n * @type {import('envprism/config').EnvprismUserConfig}\n */\nexport default {\n discovery: {\n // paths: ['.'],\n // skipSuffixesExtra: ['.tmp'],\n // exampleFirst: true\n },\n base: {\n name: '.env.example'\n // priority: ['.env.shared']\n },\n heuristics: {\n // secretTokensExtra: ['JWT'],\n // placeholdersExtra: ['set[_-]?me'],\n grouping: 'auto'\n },\n diff: {\n json: false,\n checkExitCode: 1\n },\n tui: {\n theme: {\n // fgBase: '#82aaff'\n },\n layout: {\n keyColWidth: 22,\n valueColMin: 18,\n sidebarWidth: 30,\n rowGap: 0,\n cellPadX: 1\n },\n undoLimit: 50,\n maskSecrets: true\n }\n};\n`;\n\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description: 'Scaffold an envprism.config.ts with documented defaults.'\n },\n args: {\n out: {\n type: 'positional',\n required: false,\n description: 'Directory to write envprism.config.ts into (default: cwd).'\n },\n force: {\n type: 'boolean',\n description: 'Overwrite an existing config file.'\n }\n },\n async run({ args }) {\n const dir = resolve(typeof args.out === 'string' ? args.out : '.');\n const target = join(dir, 'envprism.config.ts');\n try {\n await writeFile(target, CONFIG_TEMPLATE, {\n encoding: 'utf8',\n flag: args.force ? 'w' : 'wx'\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n consola.error(`${target} already exists. Use --force to overwrite.`);\n process.exitCode = 1;\n return;\n }\n throw err;\n }\n consola.success(`Wrote ${target}`);\n }\n});\n","import { spawn } from 'node:child_process';\nimport { writeFile } from 'node:fs/promises';\nimport { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { CONFIG_TEMPLATE } from '@/commands/config/init.ts';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const editCommand = defineCommand({\n meta: {\n name: 'edit',\n description:\n 'Open the config in $EDITOR (creates it in cwd if none exists).'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n let { configFile } = await loadEnvprismConfig({ configFile: args.config });\n\n if (!configFile) {\n configFile = resolve('envprism.config.ts');\n try {\n await writeFile(configFile, CONFIG_TEMPLATE, {\n encoding: 'utf8',\n flag: 'wx'\n });\n consola.info(`Created ${configFile}`);\n } catch {\n // Created concurrently or already present — open whatever is there.\n }\n }\n\n const editor = process.env.VISUAL || process.env.EDITOR || 'nano';\n await new Promise<void>((res, rej) => {\n const child = spawn(editor, [configFile!], { stdio: 'inherit' });\n child.on('error', rej);\n child.on('exit', (code) => {\n if (code && code !== 0) {\n consola.warn(`${editor} exited with code ${code}.`);\n }\n res();\n });\n });\n }\n});\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const pathCommand = defineCommand({\n meta: {\n name: 'path',\n description:\n 'Print the resolved config file path (or note that defaults are used).'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { configFile, cwd } = await loadEnvprismConfig({\n configFile: args.config\n });\n if (configFile) {\n // Path goes to stdout so it can be piped; the not-found note is on stderr.\n process.stdout.write(configFile + '\\n');\n } else {\n consola.info(\n `No envprism.config found (searched up from ${cwd}); using built-in defaults.`\n );\n }\n }\n});\n","import { defineCommand } from 'citty';\nimport { loadEnvprismConfig } from '@/config/load.ts';\n\nexport const showCommand = defineCommand({\n meta: {\n name: 'show',\n description: 'Print the effective (merged) config as JSON.'\n },\n args: {\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n process.stdout.write(JSON.stringify(config, null, 2) + '\\n');\n }\n});\n","import { defineCommand } from 'citty';\nimport { editCommand } from '@/commands/config/edit.ts';\nimport { initCommand } from '@/commands/config/init.ts';\nimport { pathCommand } from '@/commands/config/path.ts';\nimport { showCommand } from '@/commands/config/show.ts';\n\nexport const configCommand = defineCommand({\n meta: {\n name: 'config',\n description: 'Inspect and manage the envprism config.'\n },\n subCommands: {\n init: initCommand,\n path: pathCommand,\n show: showCommand,\n edit: editCommand\n }\n});\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { loadEnvprismConfig } from '@/config/load.ts';\nimport { resolveBase } from '@/core/base.ts';\nimport { computeDiff, formatDiffText } from '@/core/diff.ts';\nimport { discoverEnvFiles } from '@/core/discover.ts';\nimport { buildMatrix } from '@/core/matrix.ts';\n\nexport const diffCommand = defineCommand({\n meta: {\n name: 'diff',\n description: 'Print the drift between .env* files compared to a base.'\n },\n args: {\n paths: {\n type: 'positional',\n required: false,\n description: 'Directory or files to scan (defaults to cwd).'\n },\n base: {\n type: 'string',\n description: 'Base file to diff against (defaults to .env.example).'\n },\n json: {\n type: 'boolean',\n description: 'Emit JSON instead of a text table.'\n },\n check: {\n type: 'boolean',\n description:\n 'Suppress output and exit 1 when any file drifts from the base.'\n },\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n const inputs = collectPaths(args.paths, config.discovery.paths);\n const files = await discoverEnvFiles(\n inputs.map((p) => resolve(p)),\n {\n skipSuffixes: config.discovery.skipSuffixes,\n exampleFirst: config.discovery.exampleFirst\n }\n );\n\n if (files.length === 0) {\n if (!args.check) consola.warn('No .env* files found.');\n process.exit(args.check ? 0 : 1);\n }\n\n const base = resolveBase(files, args.base, {\n name: config.base.name,\n priority: config.base.priority\n });\n if (!base) {\n consola.error('Could not resolve a base file.');\n process.exit(1);\n }\n\n const matrix = buildMatrix(files, base);\n const report = computeDiff(matrix);\n\n if (args.check) {\n process.exit(report.inSync ? 0 : config.diff.checkExitCode);\n }\n\n const json = args.json ?? config.diff.json;\n if (json) {\n process.stdout.write(JSON.stringify(report, null, 2) + '\\n');\n return;\n }\n\n process.stdout.write(formatDiffText(report));\n }\n});\n\nfunction collectPaths(arg: unknown, fallback: string[]): string[] {\n if (Array.isArray(arg)) return arg.map(String);\n if (typeof arg === 'string' && arg.length > 0) return [arg];\n return fallback;\n}\n","import { defineCommand } from 'citty';\nimport consola from 'consola';\nimport { resolve } from 'pathe';\nimport { loadEnvprismConfig } from '@/config/load.ts';\nimport { resolveBase } from '@/core/base.ts';\nimport { discoverEnvFiles } from '@/core/discover.ts';\nimport { buildMatrix } from '@/core/matrix.ts';\n\ninterface TuiInvocation {\n paths?: string | string[];\n base?: string;\n config?: string;\n}\n\n/**\n * Resolve the matrix and boot the TUI. Shared between the explicit `tui`\n * subcommand and the default-no-subcommand path in `rootCommand`.\n */\nexport async function runTui(args: TuiInvocation): Promise<void> {\n const { config } = await loadEnvprismConfig({ configFile: args.config });\n const inputs = collectPaths(args.paths, config.discovery.paths);\n const files = await discoverEnvFiles(\n inputs.map((p) => resolve(p)),\n {\n skipSuffixes: config.discovery.skipSuffixes,\n exampleFirst: config.discovery.exampleFirst\n }\n );\n\n if (files.length === 0) {\n consola.warn('No .env* files found.');\n process.exit(1);\n }\n\n const base = resolveBase(files, args.base, {\n name: config.base.name,\n priority: config.base.priority\n });\n if (!base) {\n consola.error('Could not resolve a base file.');\n process.exit(1);\n }\n\n const matrix = buildMatrix(files, base);\n\n // Dynamic import keeps @opentui/core out of the bundle path used by the\n // `diff` subcommand, so users running diff on Node never hit Bun-only code.\n const { runMatrixTui } = await import('../tui/app.ts');\n await runMatrixTui(matrix, config);\n}\n\nexport const tuiCommand = defineCommand({\n meta: {\n name: 'tui',\n description: 'Open the interactive matrix view (default command).'\n },\n args: {\n paths: {\n type: 'positional',\n required: false,\n description: 'Directory or files to scan (defaults to cwd).'\n },\n base: {\n type: 'string',\n description: 'Base file to diff against (defaults to .env.example).'\n },\n config: {\n type: 'string',\n description:\n 'Path to an envprism.config file (default: walk up from cwd).'\n }\n },\n async run({ args }) {\n await runTui({ paths: args.paths, base: args.base, config: args.config });\n }\n});\n\nfunction collectPaths(arg: unknown, fallback: string[]): string[] {\n if (Array.isArray(arg)) return arg.map(String);\n if (typeof arg === 'string' && arg.length > 0) return [arg];\n return fallback;\n}\n","import { defineCommand } from 'citty';\nimport { configCommand } from '@/commands/config/index.ts';\nimport { diffCommand } from '@/commands/diff.ts';\nimport { runTui, tuiCommand } from '@/commands/tui.ts';\n\nconst SUBCOMMANDS = new Set(['tui', 'diff', 'config']);\n\nexport const rootCommand = defineCommand({\n meta: {\n name: 'envprism',\n description:\n 'TUI-based env file manager — refract one set of variables into many environment views.'\n },\n subCommands: {\n tui: tuiCommand,\n diff: diffCommand,\n config: configCommand\n },\n // citty 0.1.6 invokes the root `run` after a matched subcommand returns,\n // so guard against double-execution by bailing when the first positional\n // arg names a known subcommand. With no args at all we launch the TUI in\n // the cwd, which is the documented default.\n async run({ rawArgs }) {\n const firstPositional = rawArgs.find((a) => !a.startsWith('-'));\n if (firstPositional && SUBCOMMANDS.has(firstPositional)) return;\n await runTui({});\n }\n});\n","import { runMain } from 'citty';\nimport { rootCommand } from '@/cli.ts';\n\nrunMain(rootCommand);\n"],"names":["collectPaths"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { BoxRenderable, ScrollBoxRenderable, TextRenderable, RGBA, createCliRenderer } from "@opentui/core";
2
- import { j as matchesFilter, b as buildMatrix, f as findKvEntry, t as truncate, h as formatValue, n as resolveThemeHex, a as DEFAULT_THEME_HEX, D as DEFAULT_CONFIG, k as resolveHeuristics } from "./matrix-CQv-scUc.mjs";
2
+ import { j as matchesFilter, b as buildMatrix, f as findKvEntry, t as truncate, h as formatValue, n as resolveThemeHex, a as DEFAULT_THEME_HEX, D as DEFAULT_CONFIG, k as resolveHeuristics } from "./matrix-C1pErf9Z.mjs";
3
3
  import { r as rebuildKvLine, s as serializeEnv } from "./serialize-D_ZNIgRa.mjs";
4
4
  import { basename, join, dirname } from "pathe";
5
5
  import { writeFile } from "node:fs/promises";
@@ -1797,4 +1797,4 @@ async function runMatrixTui(initialMatrix, config = DEFAULT_CONFIG) {
1797
1797
  export {
1798
1798
  runMatrixTui
1799
1799
  };
1800
- //# sourceMappingURL=app-BtsPqDdo.mjs.map
1800
+ //# sourceMappingURL=app-DgjyG_HE.mjs.map