@byline/cli 1.12.1 → 2.1.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/README.md +15 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/setup-checks.d.ts +17 -0
- package/dist/commands/setup-checks.d.ts.map +1 -0
- package/dist/commands/setup-checks.js +117 -0
- package/dist/commands/setup-checks.js.map +1 -0
- package/dist/commands/setup.d.ts +24 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +97 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/templates/byline-examples/collections/docs/schema.ts +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,3 +21,18 @@ byline doctor Inspect the current app and report what's wired.
|
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
See `byline init --help` for the full flag list.
|
|
24
|
+
|
|
25
|
+
### Already-wired apps (post-manual-config)
|
|
26
|
+
|
|
27
|
+
If you wired Byline into your app by hand (collections, `server.config.ts`, env, routes, scaffold files all in place) and just need to provision the database and seed, use `setup` instead of `init`:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
byline setup Provision DB, then seed super-admin and example docs.
|
|
31
|
+
byline setup --no-seed-admin Provision DB and seed docs only.
|
|
32
|
+
byline setup --no-seed-docs Provision DB and seed super-admin only.
|
|
33
|
+
byline setup --no-seed-admin --no-seed-docs
|
|
34
|
+
Provision DB only.
|
|
35
|
+
byline setup --reset --i-mean-it Destructive: drop and recreate the database.
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`setup` runs only the `db` → `db-init` → `seed-admin` → `seed-docs` phases — it does not touch project files. For new TanStack Start apps that need the full scaffold, use `byline init`.
|
package/dist/cli.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { runDoctor } from './commands/doctor.js';
|
|
4
4
|
import { runInit } from './commands/init.js';
|
|
5
|
+
import { runSetup } from './commands/setup.js';
|
|
5
6
|
import { PHASE_IDS } from './phases/index.js';
|
|
6
7
|
const PACKAGE_MANAGERS = ['pnpm', 'npm', 'yarn', 'bun'];
|
|
7
8
|
const program = new Command();
|
|
@@ -47,6 +48,37 @@ program
|
|
|
47
48
|
noColor: opts.color === false,
|
|
48
49
|
});
|
|
49
50
|
});
|
|
51
|
+
program
|
|
52
|
+
.command('setup')
|
|
53
|
+
.description('Prepare DB and seed admin/docs for an app that is already wired (post-manual-config)')
|
|
54
|
+
.option('--no-seed-admin', 'skip the super-admin seed')
|
|
55
|
+
.option('--no-seed-docs', 'skip the example docs seed')
|
|
56
|
+
.option('--apply', 'skip per-phase confirmation prompts (still prints diffs)')
|
|
57
|
+
.option('--dry-run', 'show every change but write nothing')
|
|
58
|
+
.option('-y, --yes', 'assume yes to non-write prompts')
|
|
59
|
+
.option('--reset', 'destructive: drop existing database in db-init')
|
|
60
|
+
.option('--i-mean-it', 'second confirmation required by --reset')
|
|
61
|
+
.option('--pm <pm>', `force package manager: ${PACKAGE_MANAGERS.join('|')}`)
|
|
62
|
+
.option('-q, --quiet', 'suppress decorative output')
|
|
63
|
+
.option('--no-color', 'disable color output')
|
|
64
|
+
.action(async (raw) => {
|
|
65
|
+
const opts = raw;
|
|
66
|
+
if (opts.pm)
|
|
67
|
+
assertPackageManager(opts.pm);
|
|
68
|
+
await runSetup({
|
|
69
|
+
// commander flips `--no-seed-admin` to `seedAdmin: false`
|
|
70
|
+
noSeedAdmin: opts.seedAdmin === false,
|
|
71
|
+
noSeedDocs: opts.seedDocs === false,
|
|
72
|
+
apply: opts.apply,
|
|
73
|
+
dryRun: opts.dryRun,
|
|
74
|
+
yes: opts.yes,
|
|
75
|
+
reset: opts.reset,
|
|
76
|
+
resetIMeanIt: opts.iMeanIt,
|
|
77
|
+
pm: opts.pm,
|
|
78
|
+
quiet: opts.quiet,
|
|
79
|
+
noColor: opts.color === false,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
50
82
|
program
|
|
51
83
|
.command('doctor')
|
|
52
84
|
.description('Inspect the current app and report which install phases are wired')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Context } from '../context.js';
|
|
2
|
+
export type SetupCheckResult = 'proceed' | 'aborted';
|
|
3
|
+
/**
|
|
4
|
+
* Pre-flight gate for `byline setup`. Policy:
|
|
5
|
+
*
|
|
6
|
+
* - Missing core `@byline/*` deps → hard bail (seeds will throw on import).
|
|
7
|
+
* - Missing `.env` file → hard bail (every downstream phase reads it).
|
|
8
|
+
* - Missing keys inside `.env` → warn and confirm (default No). Some keys
|
|
9
|
+
* may legitimately be supplied via shell env;
|
|
10
|
+
* the user is best placed to judge.
|
|
11
|
+
*
|
|
12
|
+
* `--yes` does NOT auto-confirm the soft warning — the default is No, so
|
|
13
|
+
* `-y` against a partial `.env` aborts. That matches the intent: `-y` is
|
|
14
|
+
* "I don't want to type defaults," not "I don't care if my env is broken."
|
|
15
|
+
*/
|
|
16
|
+
export declare function runSetupChecks(ctx: Context): Promise<SetupCheckResult>;
|
|
17
|
+
//# sourceMappingURL=setup-checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-checks.d.ts","sourceRoot":"","sources":["../../src/commands/setup-checks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAE5C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAA;AAEpD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0C5E"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { DEP_SPECS } from '../manifest/deps.js';
|
|
3
|
+
import { ENV_SPECS } from '../manifest/env.js';
|
|
4
|
+
/**
|
|
5
|
+
* Pre-flight gate for `byline setup`. Policy:
|
|
6
|
+
*
|
|
7
|
+
* - Missing core `@byline/*` deps → hard bail (seeds will throw on import).
|
|
8
|
+
* - Missing `.env` file → hard bail (every downstream phase reads it).
|
|
9
|
+
* - Missing keys inside `.env` → warn and confirm (default No). Some keys
|
|
10
|
+
* may legitimately be supplied via shell env;
|
|
11
|
+
* the user is best placed to judge.
|
|
12
|
+
*
|
|
13
|
+
* `--yes` does NOT auto-confirm the soft warning — the default is No, so
|
|
14
|
+
* `-y` against a partial `.env` aborts. That matches the intent: `-y` is
|
|
15
|
+
* "I don't want to type defaults," not "I don't care if my env is broken."
|
|
16
|
+
*/
|
|
17
|
+
export async function runSetupChecks(ctx) {
|
|
18
|
+
const missingDeps = findMissingBylineDeps(ctx);
|
|
19
|
+
if (missingDeps === null) {
|
|
20
|
+
ctx.logger.error('package.json not found or unreadable — run `byline init` first');
|
|
21
|
+
return 'aborted';
|
|
22
|
+
}
|
|
23
|
+
if (missingDeps.length > 0) {
|
|
24
|
+
ctx.logger.error('core @byline/* packages are not installed in this app:');
|
|
25
|
+
for (const spec of missingDeps) {
|
|
26
|
+
ctx.logger.raw(` - ${spec.name}@${spec.version}`);
|
|
27
|
+
}
|
|
28
|
+
ctx.logger.info(`install them with: ${installHint(ctx)}`);
|
|
29
|
+
ctx.logger.info('or run the full wizard: byline init');
|
|
30
|
+
return 'aborted';
|
|
31
|
+
}
|
|
32
|
+
if (!existsSync(ctx.resolve('.env'))) {
|
|
33
|
+
ctx.logger.error('.env not found — run `byline init --only env` to scaffold it');
|
|
34
|
+
return 'aborted';
|
|
35
|
+
}
|
|
36
|
+
const missingEnvKeys = findMissingEnvKeys(ctx);
|
|
37
|
+
if (missingEnvKeys.length > 0) {
|
|
38
|
+
ctx.logger.warn('.env is missing keys Byline expects:');
|
|
39
|
+
for (const key of missingEnvKeys) {
|
|
40
|
+
const spec = ENV_SPECS.find((s) => s.key === key);
|
|
41
|
+
ctx.logger.raw(` - ${key} (${spec?.group}) — ${spec?.description}`);
|
|
42
|
+
}
|
|
43
|
+
ctx.logger.info('these may be supplied via shell env instead; otherwise downstream phases will fail');
|
|
44
|
+
const ok = await ctx.prompter.confirm({
|
|
45
|
+
message: 'Proceed anyway?',
|
|
46
|
+
defaultValue: false,
|
|
47
|
+
});
|
|
48
|
+
if (!ok) {
|
|
49
|
+
ctx.logger.info('aborted — fill in the missing keys (or set them in your shell) and re-run');
|
|
50
|
+
return 'aborted';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return 'proceed';
|
|
54
|
+
}
|
|
55
|
+
function findMissingBylineDeps(ctx) {
|
|
56
|
+
const pkgPath = ctx.resolve('package.json');
|
|
57
|
+
if (!existsSync(pkgPath))
|
|
58
|
+
return null;
|
|
59
|
+
let pkg;
|
|
60
|
+
try {
|
|
61
|
+
pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const declared = new Set([
|
|
67
|
+
...Object.keys(pkg.dependencies ?? {}),
|
|
68
|
+
...Object.keys(pkg.devDependencies ?? {}),
|
|
69
|
+
]);
|
|
70
|
+
return DEP_SPECS.filter((s) => s.group === 'byline' && !declared.has(s.name));
|
|
71
|
+
}
|
|
72
|
+
function findMissingEnvKeys(ctx) {
|
|
73
|
+
const envPath = ctx.resolve('.env');
|
|
74
|
+
let contents;
|
|
75
|
+
try {
|
|
76
|
+
contents = readFileSync(envPath, 'utf8');
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return ENV_SPECS.map((s) => s.key);
|
|
80
|
+
}
|
|
81
|
+
const present = parseEnvKeys(contents);
|
|
82
|
+
return ENV_SPECS.filter((s) => !present.has(s.key)).map((s) => s.key);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Minimal `.env` key extractor — we only need to know which keys are
|
|
86
|
+
* declared with a non-empty value, so quotes/escapes/multiline don't
|
|
87
|
+
* matter. Treats `KEY=` (empty) as missing.
|
|
88
|
+
*/
|
|
89
|
+
function parseEnvKeys(contents) {
|
|
90
|
+
const keys = new Set();
|
|
91
|
+
for (const rawLine of contents.split(/\r?\n/)) {
|
|
92
|
+
const line = rawLine.trim();
|
|
93
|
+
if (!line || line.startsWith('#'))
|
|
94
|
+
continue;
|
|
95
|
+
const eq = line.indexOf('=');
|
|
96
|
+
if (eq <= 0)
|
|
97
|
+
continue;
|
|
98
|
+
const key = line.slice(0, eq).trim();
|
|
99
|
+
const value = line.slice(eq + 1).trim();
|
|
100
|
+
if (key && value)
|
|
101
|
+
keys.add(key);
|
|
102
|
+
}
|
|
103
|
+
return keys;
|
|
104
|
+
}
|
|
105
|
+
function installHint(ctx) {
|
|
106
|
+
switch (ctx.pm) {
|
|
107
|
+
case 'pnpm':
|
|
108
|
+
return 'pnpm add @byline/admin @byline/auth @byline/client @byline/core @byline/db-postgres @byline/host-tanstack-start @byline/richtext-lexical @byline/storage-local @byline/ui';
|
|
109
|
+
case 'yarn':
|
|
110
|
+
return 'yarn add @byline/admin @byline/auth @byline/client @byline/core @byline/db-postgres @byline/host-tanstack-start @byline/richtext-lexical @byline/storage-local @byline/ui';
|
|
111
|
+
case 'bun':
|
|
112
|
+
return 'bun add @byline/admin @byline/auth @byline/client @byline/core @byline/db-postgres @byline/host-tanstack-start @byline/richtext-lexical @byline/storage-local @byline/ui';
|
|
113
|
+
case 'npm':
|
|
114
|
+
return 'npm install @byline/admin @byline/auth @byline/client @byline/core @byline/db-postgres @byline/host-tanstack-start @byline/richtext-lexical @byline/storage-local @byline/ui';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=setup-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-checks.js","sourceRoot":"","sources":["../../src/commands/setup-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PackageManager } from '../types.js';
|
|
2
|
+
export interface SetupOptions {
|
|
3
|
+
noSeedAdmin?: boolean;
|
|
4
|
+
noSeedDocs?: boolean;
|
|
5
|
+
apply?: boolean;
|
|
6
|
+
dryRun?: boolean;
|
|
7
|
+
yes?: boolean;
|
|
8
|
+
reset?: boolean;
|
|
9
|
+
resetIMeanIt?: boolean;
|
|
10
|
+
pm?: PackageManager;
|
|
11
|
+
quiet?: boolean;
|
|
12
|
+
noColor?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Post-manual-config flow: prepare the database and (optionally) seed
|
|
16
|
+
* the super-admin and example docs. Skips every phase that mutates
|
|
17
|
+
* project files (env, deps, wire, routes, scaffold, ui) — those are
|
|
18
|
+
* assumed to be in place already.
|
|
19
|
+
*
|
|
20
|
+
* Runs db → db-init → seed-admin → seed-docs, honouring `--no-seed-*`
|
|
21
|
+
* toggles. Reuses the same Phase + runner machinery as `byline init`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runSetup(opts: SetupOptions): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,aAAa,CAAA;AAExD,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,EAAE,CAAC,EAAE,cAAc,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiFhE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Context } from '../context.js';
|
|
2
|
+
import { dbPhase } from '../phases/db.js';
|
|
3
|
+
import { dbInitPhase } from '../phases/db-init.js';
|
|
4
|
+
import { preflightPhase } from '../phases/preflight.js';
|
|
5
|
+
import { seedAdminPhase } from '../phases/seed-admin.js';
|
|
6
|
+
import { seedDocsPhase } from '../phases/seed-docs.js';
|
|
7
|
+
import { createPrompter } from '../prompts.js';
|
|
8
|
+
import { runPhase } from '../runner.js';
|
|
9
|
+
import { StateStore } from '../state.js';
|
|
10
|
+
import { createLogger } from '../ui/logger.js';
|
|
11
|
+
import { runSetupChecks } from './setup-checks.js';
|
|
12
|
+
/**
|
|
13
|
+
* Post-manual-config flow: prepare the database and (optionally) seed
|
|
14
|
+
* the super-admin and example docs. Skips every phase that mutates
|
|
15
|
+
* project files (env, deps, wire, routes, scaffold, ui) — those are
|
|
16
|
+
* assumed to be in place already.
|
|
17
|
+
*
|
|
18
|
+
* Runs db → db-init → seed-admin → seed-docs, honouring `--no-seed-*`
|
|
19
|
+
* toggles. Reuses the same Phase + runner machinery as `byline init`.
|
|
20
|
+
*/
|
|
21
|
+
export async function runSetup(opts) {
|
|
22
|
+
const cwd = process.cwd();
|
|
23
|
+
const logger = createLogger({ quiet: opts.quiet, noColor: opts.noColor });
|
|
24
|
+
const prompter = createPrompter({ yes: opts.yes });
|
|
25
|
+
const state = new StateStore(cwd);
|
|
26
|
+
const ctx = new Context({
|
|
27
|
+
cwd,
|
|
28
|
+
apply: opts.apply ?? false,
|
|
29
|
+
dryRun: opts.dryRun ?? false,
|
|
30
|
+
yes: opts.yes ?? false,
|
|
31
|
+
reset: opts.reset ?? false,
|
|
32
|
+
resetConfirmed: opts.resetIMeanIt ?? false,
|
|
33
|
+
pm: opts.pm,
|
|
34
|
+
cliFlags: { ...opts },
|
|
35
|
+
logger,
|
|
36
|
+
prompter,
|
|
37
|
+
state,
|
|
38
|
+
});
|
|
39
|
+
prompter.intro('Byline CMS setup');
|
|
40
|
+
prompter.note([
|
|
41
|
+
'Prepares the database and seeds the super-admin / example docs.',
|
|
42
|
+
'Use this when you have already wired Byline into your TanStack',
|
|
43
|
+
'Start app by hand (collections, server.config.ts, env, routes,',
|
|
44
|
+
'scaffold all in place) and just need to provision and seed.',
|
|
45
|
+
'',
|
|
46
|
+
'For new TanStack Start apps, run `byline init` instead.',
|
|
47
|
+
].join('\n'), 'Setup (post-manual-config)');
|
|
48
|
+
// Run the existing preflight phase first so Node version + git + the
|
|
49
|
+
// package manager are resolved before any setup-specific checks read
|
|
50
|
+
// ctx.pm. Preflight is `defaultMode: 'auto'`, so it just runs.
|
|
51
|
+
let preflightState;
|
|
52
|
+
try {
|
|
53
|
+
preflightState = await runPhase(preflightPhase, ctx);
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
logger.error(`preflight failed: ${e.message}`);
|
|
57
|
+
state.flush();
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
if (preflightState === 'blocked' || preflightState === 'pending') {
|
|
61
|
+
state.flush();
|
|
62
|
+
prompter.outro('setup halted — preflight checks failed');
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
const checks = await runSetupChecks(ctx);
|
|
66
|
+
if (checks === 'aborted') {
|
|
67
|
+
state.flush();
|
|
68
|
+
prompter.outro('setup halted — pre-flight checks failed');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
const phases = [dbPhase, dbInitPhase];
|
|
72
|
+
if (!opts.noSeedAdmin)
|
|
73
|
+
phases.push(seedAdminPhase);
|
|
74
|
+
if (!opts.noSeedDocs)
|
|
75
|
+
phases.push(seedDocsPhase);
|
|
76
|
+
for (const phase of phases) {
|
|
77
|
+
let state_;
|
|
78
|
+
try {
|
|
79
|
+
state_ = await runPhase(phase, ctx);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
logger.error(`${phase.id} failed: ${e.message}`);
|
|
83
|
+
logger.info(`re-run with: byline setup (resumes from this phase)`);
|
|
84
|
+
state.flush();
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
if (state_ === 'blocked') {
|
|
88
|
+
logger.info(`re-run with: byline setup (resumes from this phase)`);
|
|
89
|
+
state.flush();
|
|
90
|
+
prompter.outro('setup halted — fix the issue above and re-run');
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
state.flush();
|
|
95
|
+
prompter.outro('Byline setup complete — see byline doctor for status');
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|