@byline/cli 4.9.0 → 4.10.1
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 +56 -15
- package/dist/cli.js +16 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +8 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +2 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/setup-checks.d.ts +2 -0
- package/dist/commands/setup-checks.d.ts.map +1 -1
- package/dist/commands/setup-checks.js +14 -6
- package/dist/commands/setup-checks.js.map +1 -1
- package/dist/commands/setup-flow.test.d.ts +2 -0
- package/dist/commands/setup-flow.test.d.ts.map +1 -0
- package/dist/commands/setup-flow.test.js +230 -0
- package/dist/commands/setup-flow.test.js.map +1 -0
- package/dist/commands/setup.d.ts +30 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +71 -35
- package/dist/commands/setup.js.map +1 -1
- package/dist/context.d.ts +4 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +3 -0
- package/dist/context.js.map +1 -1
- package/dist/lib/baseline-drift.test.d.ts +2 -0
- package/dist/lib/baseline-drift.test.d.ts.map +1 -0
- package/dist/lib/baseline-drift.test.js +97 -0
- package/dist/lib/baseline-drift.test.js.map +1 -0
- package/dist/lib/baseline.d.ts +10 -0
- package/dist/lib/baseline.d.ts.map +1 -0
- package/dist/lib/baseline.js +12 -0
- package/dist/lib/baseline.js.map +1 -0
- package/dist/lib/database/adapters.d.ts +54 -0
- package/dist/lib/database/adapters.d.ts.map +1 -0
- package/dist/lib/database/adapters.js +83 -0
- package/dist/lib/database/adapters.js.map +1 -0
- package/dist/lib/database/adapters.test.d.ts +2 -0
- package/dist/lib/database/adapters.test.d.ts.map +1 -0
- package/dist/lib/database/adapters.test.js +36 -0
- package/dist/lib/database/adapters.test.js.map +1 -0
- package/dist/lib/database/dialect.d.ts +12 -0
- package/dist/lib/database/dialect.d.ts.map +1 -0
- package/dist/lib/database/dialect.js +53 -0
- package/dist/lib/database/dialect.js.map +1 -0
- package/dist/lib/database/dialect.test.d.ts +2 -0
- package/dist/lib/database/dialect.test.d.ts.map +1 -0
- package/dist/lib/database/dialect.test.js +58 -0
- package/dist/lib/database/dialect.test.js.map +1 -0
- package/dist/lib/database/mysql.d.ts +21 -0
- package/dist/lib/database/mysql.d.ts.map +1 -0
- package/dist/lib/database/mysql.js +152 -0
- package/dist/lib/database/mysql.js.map +1 -0
- package/dist/lib/database/mysql.test.d.ts +2 -0
- package/dist/lib/database/mysql.test.d.ts.map +1 -0
- package/dist/lib/database/mysql.test.js +45 -0
- package/dist/lib/database/mysql.test.js.map +1 -0
- package/dist/lib/database/postgres.d.ts +8 -0
- package/dist/lib/database/postgres.d.ts.map +1 -0
- package/dist/lib/database/postgres.js +142 -0
- package/dist/lib/database/postgres.js.map +1 -0
- package/dist/lib/database/postgres.test.d.ts +2 -0
- package/dist/lib/database/postgres.test.d.ts.map +1 -0
- package/dist/lib/database/postgres.test.js +14 -0
- package/dist/lib/database/postgres.test.js.map +1 -0
- package/dist/lib/database/provisioner.d.ts +35 -0
- package/dist/lib/database/provisioner.d.ts.map +1 -0
- package/dist/lib/database/provisioner.js +20 -0
- package/dist/lib/database/provisioner.js.map +1 -0
- package/dist/lib/database/provisioner.test.d.ts +2 -0
- package/dist/lib/database/provisioner.test.d.ts.map +1 -0
- package/dist/lib/database/provisioner.test.js +32 -0
- package/dist/lib/database/provisioner.test.js.map +1 -0
- package/dist/lib/database/selection.d.ts +11 -0
- package/dist/lib/database/selection.d.ts.map +1 -0
- package/dist/lib/database/selection.js +52 -0
- package/dist/lib/database/selection.js.map +1 -0
- package/dist/lib/database/selection.test.d.ts +2 -0
- package/dist/lib/database/selection.test.d.ts.map +1 -0
- package/dist/lib/database/selection.test.js +58 -0
- package/dist/lib/database/selection.test.js.map +1 -0
- package/dist/lib/database/state.d.ts +4 -0
- package/dist/lib/database/state.d.ts.map +1 -0
- package/dist/lib/database/state.js +10 -0
- package/dist/lib/database/state.js.map +1 -0
- package/dist/lib/database/state.test.d.ts +2 -0
- package/dist/lib/database/state.test.d.ts.map +1 -0
- package/dist/lib/database/state.test.js +17 -0
- package/dist/lib/database/state.test.js.map +1 -0
- package/dist/lib/database/urls.d.ts +19 -0
- package/dist/lib/database/urls.d.ts.map +1 -0
- package/dist/lib/database/urls.js +14 -0
- package/dist/lib/database/urls.js.map +1 -0
- package/dist/lib/database/urls.test.d.ts +2 -0
- package/dist/lib/database/urls.test.d.ts.map +1 -0
- package/dist/lib/database/urls.test.js +31 -0
- package/dist/lib/database/urls.test.js.map +1 -0
- package/dist/lib/dependency-version.d.ts.map +1 -1
- package/dist/lib/dependency-version.js +5 -4
- package/dist/lib/dependency-version.js.map +1 -1
- package/dist/lib/template-hook-boundary.test.node.js +9 -4
- package/dist/lib/template-hook-boundary.test.node.js.map +1 -1
- package/dist/manifest/deps.d.ts +8 -1
- package/dist/manifest/deps.d.ts.map +1 -1
- package/dist/manifest/deps.js +40 -13
- package/dist/manifest/deps.js.map +1 -1
- package/dist/manifest/env.d.ts +4 -1
- package/dist/manifest/env.d.ts.map +1 -1
- package/dist/manifest/env.js +12 -6
- package/dist/manifest/env.js.map +1 -1
- package/dist/phases/db-init.d.ts +2 -1
- package/dist/phases/db-init.d.ts.map +1 -1
- package/dist/phases/db-init.js +141 -124
- package/dist/phases/db-init.js.map +1 -1
- package/dist/phases/db-init.test.d.ts +2 -0
- package/dist/phases/db-init.test.d.ts.map +1 -0
- package/dist/phases/db-init.test.js +144 -0
- package/dist/phases/db-init.test.js.map +1 -0
- package/dist/phases/db.d.ts +0 -8
- package/dist/phases/db.d.ts.map +1 -1
- package/dist/phases/db.js +69 -49
- package/dist/phases/db.js.map +1 -1
- package/dist/phases/db.test.d.ts +2 -0
- package/dist/phases/db.test.d.ts.map +1 -0
- package/dist/phases/db.test.js +69 -0
- package/dist/phases/db.test.js.map +1 -0
- package/dist/phases/deps.d.ts.map +1 -1
- package/dist/phases/deps.js +7 -4
- package/dist/phases/deps.js.map +1 -1
- package/dist/phases/deps.test.js +67 -5
- package/dist/phases/deps.test.js.map +1 -1
- package/dist/phases/env.d.ts.map +1 -1
- package/dist/phases/env.js +30 -21
- package/dist/phases/env.js.map +1 -1
- package/dist/phases/env.test.d.ts +2 -0
- package/dist/phases/env.test.d.ts.map +1 -0
- package/dist/phases/env.test.js +79 -0
- package/dist/phases/env.test.js.map +1 -0
- package/dist/phases/scaffold-smoke.test.js +44 -10
- package/dist/phases/scaffold-smoke.test.js.map +1 -1
- package/dist/phases/scaffold.d.ts.map +1 -1
- package/dist/phases/scaffold.js +32 -23
- package/dist/phases/scaffold.js.map +1 -1
- package/dist/phases/scaffold.test.js +22 -0
- package/dist/phases/scaffold.test.js.map +1 -1
- package/dist/phases/wire/index.d.ts.map +1 -1
- package/dist/phases/wire/index.js +5 -0
- package/dist/phases/wire/index.js.map +1 -1
- package/dist/phases/wire/vite-config-merge.d.ts +61 -0
- package/dist/phases/wire/vite-config-merge.d.ts.map +1 -0
- package/dist/phases/wire/vite-config-merge.js +319 -0
- package/dist/phases/wire/vite-config-merge.js.map +1 -0
- package/dist/phases/wire/vite-config-merge.test.d.ts +2 -0
- package/dist/phases/wire/vite-config-merge.test.d.ts.map +1 -0
- package/dist/phases/wire/vite-config-merge.test.js +134 -0
- package/dist/phases/wire/vite-config-merge.test.js.map +1 -0
- package/dist/phases/wire/vite-config.d.ts.map +1 -1
- package/dist/phases/wire/vite-config.js +68 -10
- package/dist/phases/wire/vite-config.js.map +1 -1
- package/dist/phases/wire/vite-config.test.js +82 -12
- package/dist/phases/wire/vite-config.test.js.map +1 -1
- package/dist/state.d.ts +6 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +40 -4
- package/dist/state.js.map +1 -1
- package/dist/state.test.d.ts +2 -0
- package/dist/state.test.d.ts.map +1 -0
- package/dist/state.test.js +77 -0
- package/dist/state.test.js.map +1 -0
- package/dist/templates/byline/seed-admin.ts +17 -0
- package/dist/templates/byline/seeds/admin.ts +6 -9
- package/dist/templates/byline-examples/collections/docs/schema.ts +7 -7
- package/dist/templates/byline-examples/collections/media/schema.ts +6 -6
- package/dist/templates/byline-examples/collections/news/schema.ts +6 -6
- package/dist/templates/byline-examples/collections/news-categories/schema.ts +6 -6
- package/dist/templates/byline-examples/collections/pages/schema.ts +6 -6
- package/dist/templates/byline-examples/scripts/import-docs.ts +9 -5
- package/dist/templates/byline-examples/seed-docs.ts +9 -0
- package/dist/templates/dialects/mysql/byline/server.config.ts +105 -0
- package/dist/templates/dialects/mysql/byline-examples/server.config.ts +115 -0
- package/dist/templates/host/vite.config.ts +4 -3
- package/dist/templates/migrations/mysql/0000_unknown_kulan_gath.sql +412 -0
- package/dist/templates/migrations/mysql/meta/_journal.json +13 -0
- package/dist/test-helpers.d.ts +14 -2
- package/dist/test-helpers.d.ts.map +1 -1
- package/dist/test-helpers.js +12 -9
- package/dist/test-helpers.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -2
- package/dist/templates/migrations/meta/0000_snapshot.json +0 -3471
- /package/dist/templates/{byline → dialects/postgres/byline}/server.config.ts +0 -0
- /package/dist/templates/{byline-examples → dialects/postgres/byline-examples}/scripts/backfill-version-locales.ts +0 -0
- /package/dist/templates/{byline-examples → dialects/postgres/byline-examples}/scripts/re-anchor.ts +0 -0
- /package/dist/templates/{byline-examples → dialects/postgres/byline-examples}/server.config.ts +0 -0
- /package/dist/templates/migrations/{0000_mushy_luckman.sql → postgres/0000_mushy_luckman.sql} +0 -0
- /package/dist/templates/migrations/{meta → postgres/meta}/_journal.json +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
3
|
+
import { DATABASE_ADAPTER_IDS, databaseAdapterDefinition } from '../../lib/database/adapters.js';
|
|
3
4
|
import { createTestContext } from '../../test-helpers.js';
|
|
4
5
|
import { wirePhase } from './index.js';
|
|
5
6
|
import { wireViteConfig } from './vite-config.js';
|
|
@@ -13,6 +14,13 @@ function fixture() {
|
|
|
13
14
|
contexts.push(ctx);
|
|
14
15
|
return ctx;
|
|
15
16
|
}
|
|
17
|
+
/** Backups are timestamped, so tests resolve them by prefix rather than name. */
|
|
18
|
+
function readBackup(ctx) {
|
|
19
|
+
const backups = readdirSync(ctx.cwd).filter((name) => name.startsWith('vite.config.ts.bak-'));
|
|
20
|
+
if (backups.length !== 1)
|
|
21
|
+
throw new Error(`expected one backup, found ${backups.length}`);
|
|
22
|
+
return readFileSync(ctx.resolve(backups[0]), 'utf8');
|
|
23
|
+
}
|
|
16
24
|
describe('Vite config safety', () => {
|
|
17
25
|
it('surfaces a missing Vite config in the parent wire plan', async () => {
|
|
18
26
|
const ctx = fixture();
|
|
@@ -32,6 +40,9 @@ describe('Vite config safety', () => {
|
|
|
32
40
|
expect(await wireViteConfig.apply(ctx, preview.writes)).toMatchObject({ status: 'done' });
|
|
33
41
|
expect(readFileSync(ctx.resolve('vite.config.ts'), 'utf8')).toBe(readFileSync(`${ctx.templatesDir()}/host/vite.config.ts`, 'utf8'));
|
|
34
42
|
expect(readFileSync(ctx.resolve('vite.config.ts'), 'utf8')).toContain('bylineClientHookBoundary()');
|
|
43
|
+
for (const adapter of DATABASE_ADAPTER_IDS) {
|
|
44
|
+
expect(readFileSync(ctx.resolve('vite.config.ts'), 'utf8')).toContain(databaseAdapterDefinition(adapter).packageName);
|
|
45
|
+
}
|
|
35
46
|
});
|
|
36
47
|
it('leaves a target changed after preview untouched', async () => {
|
|
37
48
|
const ctx = fixture();
|
|
@@ -44,7 +55,7 @@ describe('Vite config safety', () => {
|
|
|
44
55
|
it('plans backup and replacement writes for a recognized canonical predecessor', async () => {
|
|
45
56
|
const ctx = fixture();
|
|
46
57
|
const canonical = readFileSync(`${ctx.templatesDir()}/host/vite.config.ts`, 'utf8');
|
|
47
|
-
const predecessor = canonical
|
|
58
|
+
const predecessor = withoutMysqlExternalization(canonical)
|
|
48
59
|
.replace("import { bylineClientHookBoundary } from '@byline/host-tanstack-start/vite'\n", '')
|
|
49
60
|
.replace(' bylineClientHookBoundary(),\n', '')
|
|
50
61
|
.replace([
|
|
@@ -67,13 +78,25 @@ describe('Vite config safety', () => {
|
|
|
67
78
|
expect(preview.writes).toHaveLength(2);
|
|
68
79
|
expect(preview.writes?.find((write) => write.path.endsWith('vite.config.ts'))?.before).toBe(predecessor);
|
|
69
80
|
expect(await wireViteConfig.apply(ctx, preview.writes)).toMatchObject({ status: 'done' });
|
|
70
|
-
expect(
|
|
81
|
+
expect(readBackup(ctx)).toBe(predecessor);
|
|
82
|
+
expect(readFileSync(ctx.resolve('vite.config.ts'), 'utf8')).toBe(canonical);
|
|
83
|
+
});
|
|
84
|
+
it('replaces the exact canonical predecessor from before MySQL externalization', async () => {
|
|
85
|
+
const ctx = fixture();
|
|
86
|
+
const canonical = readFileSync(`${ctx.templatesDir()}/host/vite.config.ts`, 'utf8');
|
|
87
|
+
const predecessor = withoutMysqlExternalization(canonical);
|
|
88
|
+
writeFileSync(ctx.resolve('vite.config.ts'), predecessor);
|
|
89
|
+
const preview = await wireViteConfig.preview(ctx);
|
|
90
|
+
expect(preview).toMatchObject({ status: 'done' });
|
|
91
|
+
expect(preview.writes).toHaveLength(2);
|
|
92
|
+
expect(await wireViteConfig.apply(ctx, preview.writes)).toMatchObject({ status: 'done' });
|
|
93
|
+
expect(readBackup(ctx)).toBe(predecessor);
|
|
71
94
|
expect(readFileSync(ctx.resolve('vite.config.ts'), 'utf8')).toBe(canonical);
|
|
72
95
|
});
|
|
73
96
|
it('replaces the canonical config that carried an app-owned build guard', async () => {
|
|
74
97
|
const ctx = fixture();
|
|
75
98
|
const canonical = readFileSync(`${ctx.templatesDir()}/host/vite.config.ts`, 'utf8');
|
|
76
|
-
const predecessor = canonical
|
|
99
|
+
const predecessor = withoutMysqlExternalization(canonical)
|
|
77
100
|
.replace("import { bylineClientHookBoundary } from '@byline/host-tanstack-start/vite'\n", '')
|
|
78
101
|
.replace("import { defineConfig, type Plugin } from 'vite'\n", "import { defineConfig, type Plugin } from 'vite'\n\nimport { clientHookBuildBoundary } from './byline/collections/client-hook-build-boundary.js'\n")
|
|
79
102
|
.replace('bylineClientHookBoundary()', 'clientHookBuildBoundary()');
|
|
@@ -81,17 +104,64 @@ describe('Vite config safety', () => {
|
|
|
81
104
|
const preview = await wireViteConfig.preview(ctx);
|
|
82
105
|
expect(preview).toMatchObject({ status: 'done' });
|
|
83
106
|
expect(await wireViteConfig.apply(ctx, preview.writes)).toMatchObject({ status: 'done' });
|
|
84
|
-
expect(
|
|
107
|
+
expect(readBackup(ctx)).toBe(predecessor);
|
|
85
108
|
expect(readFileSync(ctx.resolve('vite.config.ts'), 'utf8')).toBe(canonical);
|
|
86
109
|
});
|
|
87
|
-
it('
|
|
110
|
+
it('merges Byline settings into a host config and backs up the original', async () => {
|
|
111
|
+
// The ordinary first-install case: a stock TanStack Start app brings its own
|
|
112
|
+
// vite.config.ts, matching neither the canonical config nor any predecessor
|
|
113
|
+
// hash. Byline's settings are merged in rather than replacing the file.
|
|
114
|
+
const ctx = fixture();
|
|
115
|
+
const host = `import { defineConfig } from 'vite'
|
|
116
|
+
import { nitro } from 'nitro/vite'
|
|
117
|
+
|
|
118
|
+
const config = defineConfig({
|
|
119
|
+
plugins: [nitro({ rollupConfig: { external: [/^@sentry\\//] } })],
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
export default config
|
|
123
|
+
`;
|
|
124
|
+
writeFileSync(ctx.resolve('vite.config.ts'), host);
|
|
125
|
+
const preview = await wireViteConfig.preview(ctx);
|
|
126
|
+
expect(preview).toMatchObject({ status: 'done' });
|
|
127
|
+
expect(await wireViteConfig.apply(ctx, preview.writes)).toMatchObject({ status: 'done' });
|
|
128
|
+
const merged = readFileSync(ctx.resolve('vite.config.ts'), 'utf8');
|
|
129
|
+
expect(merged).toContain('noExternal: bylineSsrNoExternal');
|
|
130
|
+
expect(merged).toContain('browserAsyncHooksAlias()');
|
|
131
|
+
// The host's own nitro option must survive — it lives under `rollupConfig`,
|
|
132
|
+
// a different key from the `rolldownConfig` Byline writes.
|
|
133
|
+
expect(merged).toContain('@sentry');
|
|
134
|
+
// The original is preserved under a timestamped name, so a later run cannot
|
|
135
|
+
// collide with it the way the old fixed `vite.config.bak` did.
|
|
136
|
+
const backups = readdirSync(ctx.cwd).filter((name) => name.startsWith('vite.config.ts.bak-'));
|
|
137
|
+
expect(backups).toHaveLength(1);
|
|
138
|
+
expect(readFileSync(ctx.resolve(backups[0]), 'utf8')).toBe(host);
|
|
139
|
+
});
|
|
140
|
+
it('blocks, without editing, on a config it cannot place settings into', async () => {
|
|
141
|
+
// No inline `defineConfig({ ... })` to work with. This must block rather
|
|
142
|
+
// than warn: `init` treats anything short of `blocked` as a soft warning and
|
|
143
|
+
// would go on to report "installation complete" over an app that cannot boot.
|
|
88
144
|
const ctx = fixture();
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
145
|
+
const opaque = `import { defineConfig } from 'vite'
|
|
146
|
+
const options = { plugins: [] }
|
|
147
|
+
export default defineConfig(options)
|
|
148
|
+
`;
|
|
149
|
+
writeFileSync(ctx.resolve('vite.config.ts'), opaque);
|
|
150
|
+
for (const result of [await wireViteConfig.preview(ctx), await wireViteConfig.apply(ctx)]) {
|
|
151
|
+
expect(result).toMatchObject({ status: 'blocked' });
|
|
152
|
+
// Blocking halts the run, so the snippet is the user's only instruction.
|
|
153
|
+
expect(result.snippet).toBeTruthy();
|
|
154
|
+
expect(result.message).toContain('byline init --from wire');
|
|
155
|
+
}
|
|
156
|
+
expect(readFileSync(ctx.resolve('vite.config.ts'), 'utf8')).toBe(opaque);
|
|
157
|
+
expect(readdirSync(ctx.cwd).some((name) => name.startsWith('vite.config.ts.bak-'))).toBe(false);
|
|
95
158
|
});
|
|
96
159
|
});
|
|
160
|
+
function withoutMysqlExternalization(canonical) {
|
|
161
|
+
return canonical
|
|
162
|
+
.replace('// database / storage adapters through composition at runtime, not', '// db-postgres / storage adapters through composition at runtime, not')
|
|
163
|
+
.replace('// - @byline/db-postgres + @byline/db-mysql — database drivers', '// - @byline/db-postgres — depends on `pg` native bindings')
|
|
164
|
+
.replace(" '@byline/db-mysql',\n", '')
|
|
165
|
+
.replace('/^@byline\\/(db-postgres|db-mysql|storage-local|storage-s3)/', '/^@byline\\/(db-postgres|storage-local|storage-s3)/');
|
|
166
|
+
}
|
|
97
167
|
//# sourceMappingURL=vite-config.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-config.test.js","sourceRoot":"","sources":["../../../src/phases/wire/vite-config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"vite-config.test.js","sourceRoot":"","sources":["../../../src/phases/wire/vite-config.test.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
CHANGED
|
@@ -12,6 +12,12 @@ export declare class StateStore {
|
|
|
12
12
|
* `flush()` rewrites the file without the secret.
|
|
13
13
|
*/
|
|
14
14
|
private stripPersistedSecrets;
|
|
15
|
+
/**
|
|
16
|
+
* Every CLI release before database selection existed installed PostgreSQL.
|
|
17
|
+
* Recover that implicit choice only when persisted database work proves this
|
|
18
|
+
* is an existing installation; a genuinely fresh state must still prompt.
|
|
19
|
+
*/
|
|
20
|
+
private migrateLegacyDatabaseAdapter;
|
|
15
21
|
private fresh;
|
|
16
22
|
private load;
|
|
17
23
|
get(): Readonly<InstallState>;
|
package/dist/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAIvD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,KAAK,CAAQ;IAErB,YAAY,GAAG,EAAE,MAAM,EAGtB;IAED;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAIvD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,KAAK,CAAQ;IAErB,YAAY,GAAG,EAAE,MAAM,EAGtB;IAED;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAa7B;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IA0BpC,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,IAAI;IAcZ,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAE5B;IAED,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAG1C;IAED,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI,CAGnD;IAED,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAKnC;IAED,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAE/B;IAED,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,IAAI,CAGnF;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,QAAQ,IAAI,MAAM,CAEjB;CACF"}
|
package/dist/state.js
CHANGED
|
@@ -18,11 +18,45 @@ export class StateStore {
|
|
|
18
18
|
*/
|
|
19
19
|
stripPersistedSecrets(raw) {
|
|
20
20
|
const answers = raw.answers;
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
let changed = false;
|
|
22
|
+
if (answers) {
|
|
23
|
+
for (const key of ['superuserUrl', 'adminUrl']) {
|
|
24
|
+
if (!(key in answers))
|
|
25
|
+
continue;
|
|
26
|
+
delete answers[key];
|
|
27
|
+
changed = true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return changed;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Every CLI release before database selection existed installed PostgreSQL.
|
|
34
|
+
* Recover that implicit choice only when persisted database work proves this
|
|
35
|
+
* is an existing installation; a genuinely fresh state must still prompt.
|
|
36
|
+
*/
|
|
37
|
+
migrateLegacyDatabaseAdapter(raw) {
|
|
38
|
+
const answers = raw.answers;
|
|
39
|
+
if (raw.answers.dbAdapter !== undefined) {
|
|
40
|
+
if (!('dbDialect' in answers))
|
|
41
|
+
return false;
|
|
42
|
+
delete answers.dbDialect;
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
if (answers.dbDialect !== undefined) {
|
|
46
|
+
answers.dbAdapter = answers.dbDialect;
|
|
47
|
+
delete answers.dbDialect;
|
|
23
48
|
return true;
|
|
24
49
|
}
|
|
25
|
-
|
|
50
|
+
const hasDatabaseWork = raw.completedPhases.includes('db') ||
|
|
51
|
+
raw.completedPhases.includes('db-init') ||
|
|
52
|
+
raw.answers.dbStrategy !== undefined ||
|
|
53
|
+
raw.answers.dbHost !== undefined ||
|
|
54
|
+
raw.answers.dbName !== undefined ||
|
|
55
|
+
raw.answers.dbUser !== undefined;
|
|
56
|
+
if (!hasDatabaseWork)
|
|
57
|
+
return false;
|
|
58
|
+
raw.answers.dbAdapter = 'postgres';
|
|
59
|
+
return true;
|
|
26
60
|
}
|
|
27
61
|
fresh() {
|
|
28
62
|
return {
|
|
@@ -40,7 +74,9 @@ export class StateStore {
|
|
|
40
74
|
const raw = JSON.parse(readFileSync(this.path, 'utf8'));
|
|
41
75
|
if (raw.version !== 1)
|
|
42
76
|
return null;
|
|
43
|
-
|
|
77
|
+
const strippedSecrets = this.stripPersistedSecrets(raw);
|
|
78
|
+
const migratedAdapter = this.migrateLegacyDatabaseAdapter(raw);
|
|
79
|
+
if (strippedSecrets || migratedAdapter)
|
|
44
80
|
this.dirty = true;
|
|
45
81
|
return raw;
|
|
46
82
|
}
|
package/dist/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,MAAM,UAAU,GAAG,sBAAsB,CAAA;AAEzC,MAAM,OAAO,UAAU;IACb,KAAK,CAAc;IACV,IAAI,CAAQ;IACrB,KAAK,GAAG,KAAK,CAAA;IAErB,YAAY,GAAW;QACrB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAA;IAC1C,CAAC;IAED;;;;;;OAMG;IACK,qBAAqB,CAAC,GAAiB;QAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,OAA8C,CAAA;QAClE,IAAI,OAAO,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../src/state.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { StateStore } from './state.js';
|
|
6
|
+
const roots = [];
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
for (const root of roots.splice(0))
|
|
9
|
+
rmSync(root, { recursive: true, force: true });
|
|
10
|
+
});
|
|
11
|
+
describe('StateStore database adapter migration', () => {
|
|
12
|
+
it('keeps a genuinely fresh state adapter-free', () => {
|
|
13
|
+
const root = temporaryRoot();
|
|
14
|
+
const state = new StateStore(root);
|
|
15
|
+
expect(state.get().answers.dbAdapter).toBeUndefined();
|
|
16
|
+
});
|
|
17
|
+
it('migrates a legacy database installation to PostgreSQL and strips old secrets', () => {
|
|
18
|
+
const root = temporaryRoot();
|
|
19
|
+
const path = join(root, '.byline-install.json');
|
|
20
|
+
writeFileSync(path, `${JSON.stringify({
|
|
21
|
+
version: 1,
|
|
22
|
+
startedAt: '2026-07-01T00:00:00.000Z',
|
|
23
|
+
completedPhases: ['db'],
|
|
24
|
+
answers: {
|
|
25
|
+
dbHost: '127.0.0.1',
|
|
26
|
+
dbPort: 5432,
|
|
27
|
+
dbName: 'byline',
|
|
28
|
+
dbUser: 'byline',
|
|
29
|
+
superuserUrl: 'postgresql://postgres:secret@127.0.0.1:5432/postgres',
|
|
30
|
+
},
|
|
31
|
+
wireSubEdits: {},
|
|
32
|
+
})}\n`);
|
|
33
|
+
const state = new StateStore(root);
|
|
34
|
+
expect(state.get().answers.dbAdapter).toBe('postgres');
|
|
35
|
+
expect(state.get().answers).not.toHaveProperty('superuserUrl');
|
|
36
|
+
state.flush();
|
|
37
|
+
const persisted = JSON.parse(readFileSync(path, 'utf8'));
|
|
38
|
+
expect(persisted.answers.dbAdapter).toBe('postgres');
|
|
39
|
+
expect(persisted.answers).not.toHaveProperty('superuserUrl');
|
|
40
|
+
});
|
|
41
|
+
it('does not infer PostgreSQL from unrelated persisted prompt answers', () => {
|
|
42
|
+
const root = temporaryRoot();
|
|
43
|
+
const path = join(root, '.byline-install.json');
|
|
44
|
+
writeFileSync(path, `${JSON.stringify({
|
|
45
|
+
version: 1,
|
|
46
|
+
startedAt: '2026-07-01T00:00:00.000Z',
|
|
47
|
+
completedPhases: ['prompts'],
|
|
48
|
+
answers: { adminPath: '/admin', examples: true },
|
|
49
|
+
wireSubEdits: {},
|
|
50
|
+
})}\n`);
|
|
51
|
+
const state = new StateStore(root);
|
|
52
|
+
expect(state.get().answers.dbAdapter).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
it('renames an unreleased dbDialect selection without changing its value', () => {
|
|
55
|
+
const root = temporaryRoot();
|
|
56
|
+
const path = join(root, '.byline-install.json');
|
|
57
|
+
writeFileSync(path, `${JSON.stringify({
|
|
58
|
+
version: 1,
|
|
59
|
+
startedAt: '2026-07-01T00:00:00.000Z',
|
|
60
|
+
completedPhases: [],
|
|
61
|
+
answers: { dbDialect: 'mysql' },
|
|
62
|
+
wireSubEdits: {},
|
|
63
|
+
})}\n`);
|
|
64
|
+
const state = new StateStore(root);
|
|
65
|
+
expect(state.get().answers.dbAdapter).toBe('mysql');
|
|
66
|
+
state.flush();
|
|
67
|
+
const persisted = JSON.parse(readFileSync(path, 'utf8'));
|
|
68
|
+
expect(persisted.answers.dbAdapter).toBe('mysql');
|
|
69
|
+
expect(persisted.answers).not.toHaveProperty('dbDialect');
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
function temporaryRoot() {
|
|
73
|
+
const root = mkdtempSync(join(tmpdir(), 'byline-cli-state-test-'));
|
|
74
|
+
roots.push(root);
|
|
75
|
+
return root;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../src/state.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,4 +16,21 @@ async function run() {
|
|
|
16
16
|
await seedAdmin()
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
// Exit explicitly rather than waiting for the event loop to drain. The
|
|
20
|
+
// configured adapter's connection pool holds a live timer, so the process
|
|
21
|
+
// stays alive long after the seed has committed:
|
|
22
|
+
//
|
|
23
|
+
// • `pgAdapter` defaults `idleTimeoutMillis: 2000`, so on Postgres the pool
|
|
24
|
+
// goes quiet after ~2s and the script appeared to exit on its own.
|
|
25
|
+
// • `mysqlAdapter` leaves mysql2's defaults in place — `idleTimeout` 60s with
|
|
26
|
+
// `maxIdle` equal to `connectionLimit` — and mysql2's idle-sweep timer is
|
|
27
|
+
// not unref'd, so the script looks frozen even though the work is done.
|
|
28
|
+
//
|
|
29
|
+
// The `.catch` also matters: `run()` called bare surfaces a rejected seed as an
|
|
30
|
+
// unhandled rejection rather than a non-zero exit.
|
|
19
31
|
run()
|
|
32
|
+
.then(() => process.exit(0))
|
|
33
|
+
.catch((err) => {
|
|
34
|
+
console.error(err)
|
|
35
|
+
process.exit(1)
|
|
36
|
+
})
|
|
@@ -48,15 +48,12 @@ export async function seedAdmin() {
|
|
|
48
48
|
)
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
console.log('Seeding super-admin')
|
|
52
|
+
|
|
51
53
|
const result = await seedSuperAdmin(bylineCore.adminStore, { email, password })
|
|
52
54
|
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (parts.length === 0) {
|
|
58
|
-
console.log(`Super-admin already present (${email}) — no changes.`)
|
|
59
|
-
} else {
|
|
60
|
-
console.log(`Super-admin seed: created ${parts.join(', ')} for ${email}.`)
|
|
61
|
-
}
|
|
55
|
+
const created = result.created.role || result.created.user || result.created.assignment
|
|
56
|
+
console.log(
|
|
57
|
+
created ? ` - seeded super-admin (${email})` : ` - super-admin already present (${email})`
|
|
58
|
+
)
|
|
62
59
|
}
|
|
@@ -42,19 +42,19 @@ export const Docs = defineCollection({
|
|
|
42
42
|
// byline/scripts/import-docs.ts --tree).
|
|
43
43
|
tree: true,
|
|
44
44
|
// Admin list-view quick-search. The collection list route's search box
|
|
45
|
-
// matches these top-level text-store fields with substring
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
//
|
|
45
|
+
// matches these top-level text-store fields with adapter-native substring
|
|
46
|
+
// queries against `store_text` — a lightweight "find the row I mean"
|
|
47
|
+
// affordance that needs no indexing and no lifecycle hooks. Falls back to
|
|
48
|
+
// `useAsTitle` when omitted; declared explicitly here for guidance.
|
|
49
49
|
listSearch: ['title'],
|
|
50
50
|
// Search-*provider* config (docs/06-search/index.md) —
|
|
51
51
|
// distinct from `listSearch` above. Each key names the part a field plays in
|
|
52
52
|
// the index: `body` fields feed the full-text search vector (`title` is
|
|
53
53
|
// display-only unless listed here, so we include it and boost it into the
|
|
54
54
|
// heaviest weight class); `facets`, `filters`, and `zones` round out the
|
|
55
|
-
// surface. This drives the
|
|
56
|
-
//
|
|
57
|
-
//
|
|
55
|
+
// surface. This drives the configured full-text SearchProvider and requires
|
|
56
|
+
// a `search` provider registered in byline/server.config.ts. Unlike
|
|
57
|
+
// `listSearch`, `search` is inert on its own
|
|
58
58
|
// — opting in here is what makes the index / reindex / deindex lifecycle
|
|
59
59
|
// hooks in ./hooks.ts keep this collection's provider index in sync.
|
|
60
60
|
// `content` is a container (blocks) field: naming it walks every text-bearing
|
|
@@ -51,14 +51,14 @@ export const Media = defineCollection({
|
|
|
51
51
|
}),
|
|
52
52
|
showStats: true,
|
|
53
53
|
// Admin list-view quick-search. The collection list route's search box
|
|
54
|
-
// matches these top-level text-store fields with substring
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
//
|
|
54
|
+
// matches these top-level text-store fields with adapter-native substring
|
|
55
|
+
// queries against `store_text` — a lightweight "find the row I mean"
|
|
56
|
+
// affordance that needs no indexing and no lifecycle hooks. Falls back to
|
|
57
|
+
// `useAsTitle` when omitted; declared explicitly here for guidance.
|
|
58
58
|
listSearch: ['title'],
|
|
59
59
|
// Search-*provider* config (docs/06-search/index.md) —
|
|
60
|
-
// distinct from `listSearch` above. This drives the
|
|
61
|
-
//
|
|
60
|
+
// distinct from `listSearch` above. This drives the configured full-text
|
|
61
|
+
// SearchProvider and offers richer options:
|
|
62
62
|
// per-field weighting/`boost`, `facets`, `filters`, and `zones`. Unlike
|
|
63
63
|
// `listSearch`, `search` is inert on its own — it MUST be paired with index /
|
|
64
64
|
// reindex / deindex document-lifecycle hooks that keep the provider index in
|
|
@@ -31,14 +31,14 @@ export const News = defineCollection({
|
|
|
31
31
|
}),
|
|
32
32
|
showStats: true,
|
|
33
33
|
// Admin list-view quick-search. The collection list route's search box
|
|
34
|
-
// matches these top-level text-store fields with substring
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
//
|
|
34
|
+
// matches these top-level text-store fields with adapter-native substring
|
|
35
|
+
// queries against `store_text` — a lightweight "find the row I mean"
|
|
36
|
+
// affordance that needs no indexing and no lifecycle hooks. Falls back to
|
|
37
|
+
// `useAsTitle` when omitted; declared explicitly here for guidance.
|
|
38
38
|
listSearch: ['title'],
|
|
39
39
|
// Search-*provider* config (docs/06-search/index.md) —
|
|
40
|
-
// distinct from `listSearch` above. This drives the
|
|
41
|
-
//
|
|
40
|
+
// distinct from `listSearch` above. This drives the configured full-text
|
|
41
|
+
// SearchProvider and offers richer options:
|
|
42
42
|
// per-field weighting/`boost`, `facets`, `filters`, and `zones`. Unlike
|
|
43
43
|
// `listSearch`, `search` is inert on its own — it MUST be paired with index /
|
|
44
44
|
// reindex / deindex document-lifecycle hooks that keep the provider index in
|
|
@@ -22,14 +22,14 @@ export const NewsCategories = defineCollection({
|
|
|
22
22
|
workflow: SINGLE_STATUS_WORKFLOW,
|
|
23
23
|
showStats: true,
|
|
24
24
|
// Admin list-view quick-search. The collection list route's search box
|
|
25
|
-
// matches these top-level text-store fields with substring
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
//
|
|
25
|
+
// matches these top-level text-store fields with adapter-native substring
|
|
26
|
+
// queries against `store_text` — a lightweight "find the row I mean"
|
|
27
|
+
// affordance that needs no indexing and no lifecycle hooks. Falls back to
|
|
28
|
+
// `useAsTitle` when omitted; declared explicitly here for guidance.
|
|
29
29
|
listSearch: ['name'],
|
|
30
30
|
// Search-*provider* config (docs/06-search/index.md) —
|
|
31
|
-
// distinct from `listSearch` above. This drives the
|
|
32
|
-
//
|
|
31
|
+
// distinct from `listSearch` above. This drives the configured full-text
|
|
32
|
+
// SearchProvider and offers richer options:
|
|
33
33
|
// per-field weighting/`boost`, `facets`, `filters`, and `zones`. Unlike
|
|
34
34
|
// `listSearch`, `search` is inert on its own — it MUST be paired with index /
|
|
35
35
|
// reindex / deindex document-lifecycle hooks that keep the provider index in
|
|
@@ -33,14 +33,14 @@ export const Pages = defineCollection({
|
|
|
33
33
|
}),
|
|
34
34
|
showStats: true,
|
|
35
35
|
// Admin list-view quick-search. The collection list route's search box
|
|
36
|
-
// matches these top-level text-store fields with substring
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
36
|
+
// matches these top-level text-store fields with adapter-native substring
|
|
37
|
+
// queries against `store_text` — a lightweight "find the row I mean"
|
|
38
|
+
// affordance that needs no indexing and no lifecycle hooks. Falls back to
|
|
39
|
+
// `useAsTitle` when omitted; declared explicitly here for guidance.
|
|
40
40
|
listSearch: ['title'],
|
|
41
41
|
// Search-*provider* config (docs/06-search/index.md) —
|
|
42
|
-
// distinct from `listSearch` above. This drives the
|
|
43
|
-
//
|
|
42
|
+
// distinct from `listSearch` above. This drives the configured full-text
|
|
43
|
+
// SearchProvider and offers richer options:
|
|
44
44
|
// per-field weighting/`boost`, `facets`, `filters`, and `zones`. Unlike
|
|
45
45
|
// `listSearch`, `search` is inert on its own — it MUST be paired with index /
|
|
46
46
|
// reindex / deindex document-lifecycle hooks that keep the provider index in
|
|
@@ -459,8 +459,12 @@ async function run(): Promise<void> {
|
|
|
459
459
|
if (failed > 0) process.exit(1)
|
|
460
460
|
}
|
|
461
461
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
process.exit(
|
|
466
|
-
|
|
462
|
+
// Exit explicitly on success too — the adapter's pool holds a live timer, so
|
|
463
|
+
// the process does not terminate on its own. See the note in `seed-admin.ts`.
|
|
464
|
+
run()
|
|
465
|
+
.then(() => process.exit(0))
|
|
466
|
+
.catch((err) => {
|
|
467
|
+
console.error('import-docs: fatal error')
|
|
468
|
+
console.error(err)
|
|
469
|
+
process.exit(1)
|
|
470
|
+
})
|
|
@@ -18,4 +18,13 @@ async function run() {
|
|
|
18
18
|
await seedDocs()
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
// Exit explicitly — the adapter's pool holds a live timer, so the process does
|
|
22
|
+
// not terminate on its own once the seed commits. See the fuller note in
|
|
23
|
+
// `seed-admin.ts`; the short version is that `pgAdapter`'s 2-second idle
|
|
24
|
+
// timeout masked this and mysql2's 60-second, non-unref'd idle sweep does not.
|
|
21
25
|
run()
|
|
26
|
+
.then(() => process.exit(0))
|
|
27
|
+
.catch((err) => {
|
|
28
|
+
console.error(err)
|
|
29
|
+
process.exit(1)
|
|
30
|
+
})
|