@byline/cli 4.8.0 → 4.10.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 +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/vite-config.d.ts.map +1 -1
- package/dist/phases/wire/vite-config.js +2 -0
- package/dist/phases/wire/vite-config.js.map +1 -1
- package/dist/phases/wire/vite-config.test.js +25 -2
- 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-examples/collections/docs/admin.tsx +1 -1
- package/dist/templates/byline-examples/collections/docs/hooks.ts +1 -1
- package/dist/templates/byline-examples/collections/docs/schema.ts +8 -8
- package/dist/templates/byline-examples/collections/media/schema.ts +7 -7
- package/dist/templates/byline-examples/collections/news/schema.ts +7 -7
- package/dist/templates/byline-examples/collections/news-categories/schema.ts +7 -7
- package/dist/templates/byline-examples/collections/pages/schema.ts +7 -7
- package/dist/templates/byline-examples/scripts/import-docs.ts +1 -1
- 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/{byline-examples → dialects/postgres/byline-examples}/scripts/backfill-version-locales.ts +1 -1
- package/dist/templates/{byline-examples → dialects/postgres/byline-examples}/scripts/re-anchor.ts +1 -1
- package/dist/templates/{byline-examples → dialects/postgres/byline-examples}/server.config.ts +2 -2
- 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/migrations/{0000_mushy_luckman.sql → postgres/0000_mushy_luckman.sql} +0 -0
- /package/dist/templates/migrations/{meta → postgres/meta}/_journal.json +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Client } from 'pg';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { postgresProvisioner, postgresRoleStatements } from './postgres.js';
|
|
4
|
+
describe('PostgreSQL provisioner', () => {
|
|
5
|
+
it('registers for PostgreSQL', () => {
|
|
6
|
+
expect(postgresProvisioner.adapter).toBe('postgres');
|
|
7
|
+
});
|
|
8
|
+
it('escapes role identifiers and password literals', () => {
|
|
9
|
+
const statements = postgresRoleStatements(new Client(), 'role"name', "p'ass\\word");
|
|
10
|
+
expect(statements.create).toBe('CREATE ROLE "role""name" WITH LOGIN');
|
|
11
|
+
expect(statements.alter).toBe('ALTER ROLE "role""name" WITH PASSWORD E\'p\'\'ass\\\\word\'');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=postgres.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.test.js","sourceRoot":"","sources":["../../../src/lib/database/postgres.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3E,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,MAAM,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,CAAA;QAEnF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;QACrE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;IAC/F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { DatabaseAdapterId } from '../../types.js';
|
|
2
|
+
import type { Logger } from '../../ui/logger.js';
|
|
3
|
+
export interface DbTargetInspection {
|
|
4
|
+
exists: boolean;
|
|
5
|
+
objects: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface ProvisionArgs {
|
|
8
|
+
adminUrl: string;
|
|
9
|
+
database: string;
|
|
10
|
+
user: string;
|
|
11
|
+
password: string;
|
|
12
|
+
reset: boolean;
|
|
13
|
+
logger: Pick<Logger, 'step' | 'success'>;
|
|
14
|
+
}
|
|
15
|
+
export interface BaselineArgs {
|
|
16
|
+
applicationUrl: string;
|
|
17
|
+
migrationsFolder: string;
|
|
18
|
+
logger: Pick<Logger, 'step' | 'success'>;
|
|
19
|
+
}
|
|
20
|
+
export interface DbProvisioner {
|
|
21
|
+
readonly adapter: DatabaseAdapterId;
|
|
22
|
+
verifyAdminConnection(adminUrl: string): Promise<string>;
|
|
23
|
+
inspectTarget(adminUrl: string, database: string): Promise<DbTargetInspection>;
|
|
24
|
+
provisionTarget(args: ProvisionArgs): Promise<void>;
|
|
25
|
+
applyBaseline(args: BaselineArgs): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export type DatabaseProvisionerRegistry = Readonly<Record<DatabaseAdapterId, DbProvisioner>>;
|
|
28
|
+
export declare const DATABASE_PROVISIONERS: {
|
|
29
|
+
readonly postgres: DbProvisioner;
|
|
30
|
+
readonly mysql: DbProvisioner;
|
|
31
|
+
};
|
|
32
|
+
export declare function databaseProvisioner(adapter: DatabaseAdapterId, registry?: DatabaseProvisionerRegistry): DbProvisioner;
|
|
33
|
+
export declare function isValidDatabaseIdentifier(adapter: DatabaseAdapterId, kind: 'database' | 'user', value: string): boolean;
|
|
34
|
+
export declare function databaseIdentifierRequirement(adapter: DatabaseAdapterId, kind: 'database' | 'user'): string;
|
|
35
|
+
//# sourceMappingURL=provisioner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner.d.ts","sourceRoot":"","sources":["../../../src/lib/database/provisioner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACxD,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAC9E,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjD;AAED,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAA;AAE5F,eAAO,MAAM,qBAAqB;;;CAGc,CAAA;AAEhD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,GAAE,2BAAmD,GAC5D,aAAa,CAEf;AAKD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,UAAU,GAAG,MAAM,EACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAGT;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,UAAU,GAAG,MAAM,GACxB,MAAM,CAGR"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { mysqlProvisioner } from './mysql.js';
|
|
2
|
+
import { postgresProvisioner } from './postgres.js';
|
|
3
|
+
export const DATABASE_PROVISIONERS = {
|
|
4
|
+
postgres: postgresProvisioner,
|
|
5
|
+
mysql: mysqlProvisioner,
|
|
6
|
+
};
|
|
7
|
+
export function databaseProvisioner(adapter, registry = DATABASE_PROVISIONERS) {
|
|
8
|
+
return registry[adapter];
|
|
9
|
+
}
|
|
10
|
+
const IDENTIFIER_START = '[a-z_]';
|
|
11
|
+
const IDENTIFIER_REST = '[a-z0-9_]';
|
|
12
|
+
export function isValidDatabaseIdentifier(adapter, kind, value) {
|
|
13
|
+
const maxLength = adapter === 'mysql' ? (kind === 'user' ? 32 : 64) : 63;
|
|
14
|
+
return new RegExp(`^${IDENTIFIER_START}${IDENTIFIER_REST}{0,${maxLength - 1}}$`).test(value);
|
|
15
|
+
}
|
|
16
|
+
export function databaseIdentifierRequirement(adapter, kind) {
|
|
17
|
+
const maxLength = adapter === 'mysql' ? (kind === 'user' ? 32 : 64) : 63;
|
|
18
|
+
return `lowercase letters, digits, and underscores; start with a letter or underscore; max ${maxLength} characters`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=provisioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner.js","sourceRoot":"","sources":["../../../src/lib/database/provisioner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAkCnD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,gBAAgB;CACuB,CAAA;AAEhD,MAAM,UAAU,mBAAmB,CACjC,OAA0B,EAC1B,QAAQ,GAAgC,qBAAqB;IAE7D,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,gBAAgB,GAAG,QAAQ,CAAA;AACjC,MAAM,eAAe,GAAG,WAAW,CAAA;AAEnC,MAAM,UAAU,yBAAyB,CACvC,OAA0B,EAC1B,IAAyB,EACzB,KAAa;IAEb,MAAM,SAAS,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACxE,OAAO,IAAI,MAAM,CAAC,IAAI,gBAAgB,GAAG,eAAe,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC9F,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,OAA0B,EAC1B,IAAyB;IAEzB,MAAM,SAAS,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACxE,OAAO,sFAAsF,SAAS,aAAa,CAAA;AACrH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner.test.d.ts","sourceRoot":"","sources":["../../../src/lib/database/provisioner.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { DATABASE_PROVISIONERS, databaseIdentifierRequirement, isValidDatabaseIdentifier, } from './provisioner.js';
|
|
5
|
+
describe('database provisioner registry', () => {
|
|
6
|
+
it('registers both supported adapters', () => {
|
|
7
|
+
expect(DATABASE_PROVISIONERS.postgres.adapter).toBe('postgres');
|
|
8
|
+
expect(DATABASE_PROVISIONERS.mysql.adapter).toBe('mysql');
|
|
9
|
+
});
|
|
10
|
+
it.each(['postgres.ts', 'mysql.ts'])('%s never shells out', (filename) => {
|
|
11
|
+
const source = readFileSync(fileURLToPath(new URL(`./${filename}`, import.meta.url)), 'utf8');
|
|
12
|
+
expect(source).not.toMatch(/from\s+['"](?:node:child_process|child_process|execa)['"]/);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe('database identifier policy', () => {
|
|
16
|
+
it.each([
|
|
17
|
+
['postgres', 'database', 'a'.repeat(63), true],
|
|
18
|
+
['postgres', 'database', 'a'.repeat(64), false],
|
|
19
|
+
['mysql', 'database', 'a'.repeat(64), true],
|
|
20
|
+
['mysql', 'database', 'a'.repeat(65), false],
|
|
21
|
+
['mysql', 'user', 'a'.repeat(32), true],
|
|
22
|
+
['mysql', 'user', 'a'.repeat(33), false],
|
|
23
|
+
['mysql', 'user', "editor'ops", false],
|
|
24
|
+
['postgres', 'user', 'Editor', false],
|
|
25
|
+
])('%s %s identifier %j is valid=%s', (adapter, kind, value, valid) => {
|
|
26
|
+
expect(isValidDatabaseIdentifier(adapter, kind, value)).toBe(valid);
|
|
27
|
+
});
|
|
28
|
+
it('describes the MySQL account-name limit', () => {
|
|
29
|
+
expect(databaseIdentifierRequirement('mysql', 'user')).toContain('max 32');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=provisioner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner.test.js","sourceRoot":"","sources":["../../../src/lib/database/provisioner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,kBAAkB,CAAA;AAEzB,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/D,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,EAAE;QACvE,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,QAAQ,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAC7F,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QAC9C,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;QAC/C,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QAC3C,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;QAC5C,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QACvC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;QACxC,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC;QACtC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;KAC7B,CAAC,CAAC,iCAAiC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7E,MAAM,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,6BAA6B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Context } from '../../context.js';
|
|
2
|
+
import type { DatabaseAdapterId } from '../../types.js';
|
|
3
|
+
export interface DatabaseAdapterInspection {
|
|
4
|
+
state: 'resolved' | 'pending' | 'blocked';
|
|
5
|
+
adapter?: DatabaseAdapterId;
|
|
6
|
+
reason?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function isDatabaseAdapterId(value: unknown): value is DatabaseAdapterId;
|
|
9
|
+
export declare function inspectDatabaseAdapter(ctx: Context): DatabaseAdapterInspection;
|
|
10
|
+
export declare function resolveDatabaseAdapter(ctx: Context): Promise<DatabaseAdapterId | null>;
|
|
11
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/lib/database/selection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAA;IACzC,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,yBAAyB,CA0B9E;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAsB5F"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { DATABASE_ADAPTER_IDS, DATABASE_ADAPTERS, DEFAULT_DATABASE_ADAPTER } from './adapters.js';
|
|
2
|
+
export function isDatabaseAdapterId(value) {
|
|
3
|
+
return typeof value === 'string' && DATABASE_ADAPTER_IDS.includes(value);
|
|
4
|
+
}
|
|
5
|
+
export function inspectDatabaseAdapter(ctx) {
|
|
6
|
+
const persisted = ctx.state.get().answers.dbAdapter;
|
|
7
|
+
const requested = ctx.cliFlags.database;
|
|
8
|
+
if (requested !== undefined && !isDatabaseAdapterId(requested)) {
|
|
9
|
+
return {
|
|
10
|
+
state: 'blocked',
|
|
11
|
+
reason: `invalid database adapter "${String(requested)}"; expected ${DATABASE_ADAPTER_IDS.join(' or ')}`,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
if (persisted !== undefined && !isDatabaseAdapterId(persisted)) {
|
|
15
|
+
return {
|
|
16
|
+
state: 'blocked',
|
|
17
|
+
reason: `persisted database adapter "${String(persisted)}" is invalid`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (persisted && requested && persisted !== requested) {
|
|
21
|
+
return {
|
|
22
|
+
state: 'blocked',
|
|
23
|
+
reason: `this installation is already configured for ${persisted}; ` +
|
|
24
|
+
`changing it to ${requested} is a data migration, not an installer re-run`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const adapter = persisted ?? requested;
|
|
28
|
+
return adapter ? { state: 'resolved', adapter } : { state: 'pending' };
|
|
29
|
+
}
|
|
30
|
+
export async function resolveDatabaseAdapter(ctx) {
|
|
31
|
+
const inspection = inspectDatabaseAdapter(ctx);
|
|
32
|
+
if (inspection.state === 'blocked') {
|
|
33
|
+
ctx.logger.error(inspection.reason ?? 'database adapter selection is invalid');
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (inspection.adapter) {
|
|
37
|
+
if (!ctx.state.get().answers.dbAdapter) {
|
|
38
|
+
ctx.state.patchAnswers({ dbAdapter: inspection.adapter });
|
|
39
|
+
}
|
|
40
|
+
return inspection.adapter;
|
|
41
|
+
}
|
|
42
|
+
const adapter = await ctx.prompter.select({
|
|
43
|
+
message: 'Which database should Byline use?',
|
|
44
|
+
options: DATABASE_ADAPTER_IDS.map((id) => ({
|
|
45
|
+
value: id,
|
|
46
|
+
label: `${DATABASE_ADAPTERS[id].selectionLabel}${id === DEFAULT_DATABASE_ADAPTER ? ' (default)' : ''}`,
|
|
47
|
+
})),
|
|
48
|
+
});
|
|
49
|
+
ctx.state.patchAnswers({ dbAdapter: adapter });
|
|
50
|
+
return adapter;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/lib/database/selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAUjG,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,oBAA0C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AACjG,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAA;IACnD,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAA;IAEvC,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,6BAA6B,MAAM,CAAC,SAAS,CAAC,eAAe,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;SACzG,CAAA;IACH,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,+BAA+B,MAAM,CAAC,SAAS,CAAC,cAAc;SACvE,CAAA;IACH,CAAC;IACD,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM,EACJ,+CAA+C,SAAS,IAAI;gBAC5D,kBAAkB,SAAS,+CAA+C;SAC7E,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,IAAI,SAAS,CAAA;IACtC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAY;IACvD,MAAM,UAAU,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;IAC9C,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACnC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,uCAAuC,CAAC,CAAA;QAC9E,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,UAAU,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAoB;QAC3D,OAAO,EAAE,mCAAmC;QAC5C,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC,cAAc,GAAG,EAAE,KAAK,wBAAwB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;SACvG,CAAC,CAAC;KACJ,CAAC,CAAA;IACF,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;IAC9C,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.test.d.ts","sourceRoot":"","sources":["../../../src/lib/database/selection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { rmSync } from 'node:fs';
|
|
2
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
3
|
+
import { createTestContext } from '../../test-helpers.js';
|
|
4
|
+
import { inspectDatabaseAdapter, isDatabaseAdapterId, resolveDatabaseAdapter } from './selection.js';
|
|
5
|
+
const contexts = [];
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
for (const ctx of contexts.splice(0))
|
|
8
|
+
rmSync(ctx.cwd, { recursive: true, force: true });
|
|
9
|
+
});
|
|
10
|
+
describe('database adapter selection', () => {
|
|
11
|
+
it.each([
|
|
12
|
+
['postgres', true],
|
|
13
|
+
['mysql', true],
|
|
14
|
+
['sqlite', false],
|
|
15
|
+
['', false],
|
|
16
|
+
[true, false],
|
|
17
|
+
])('classifies %j as a supported adapter=%s', (value, supported) => {
|
|
18
|
+
expect(isDatabaseAdapterId(value)).toBe(supported);
|
|
19
|
+
});
|
|
20
|
+
it('persists a command-line selection into fresh state', async () => {
|
|
21
|
+
const ctx = createTestContext({ dbAdapter: undefined });
|
|
22
|
+
contexts.push(ctx);
|
|
23
|
+
ctx.cliFlags.database = 'mysql';
|
|
24
|
+
expect(await resolveDatabaseAdapter(ctx)).toBe('mysql');
|
|
25
|
+
expect(ctx.state.get().answers.dbAdapter).toBe('mysql');
|
|
26
|
+
});
|
|
27
|
+
it('prompts for a fresh state and uses PostgreSQL as the first/default choice', async () => {
|
|
28
|
+
const ctx = createTestContext({ dbAdapter: undefined });
|
|
29
|
+
contexts.push(ctx);
|
|
30
|
+
expect(await resolveDatabaseAdapter(ctx)).toBe('postgres');
|
|
31
|
+
expect(ctx.state.get().answers.dbAdapter).toBe('postgres');
|
|
32
|
+
});
|
|
33
|
+
it('reuses the persisted adapter when the matching flag is supplied', async () => {
|
|
34
|
+
const ctx = createTestContext({ dbAdapter: 'mysql' });
|
|
35
|
+
contexts.push(ctx);
|
|
36
|
+
ctx.cliFlags.database = 'mysql';
|
|
37
|
+
expect(inspectDatabaseAdapter(ctx)).toEqual({ state: 'resolved', adapter: 'mysql' });
|
|
38
|
+
expect(await resolveDatabaseAdapter(ctx)).toBe('mysql');
|
|
39
|
+
});
|
|
40
|
+
it('blocks a conflicting flag without changing persisted state', async () => {
|
|
41
|
+
const ctx = createTestContext({ dbAdapter: 'postgres' });
|
|
42
|
+
contexts.push(ctx);
|
|
43
|
+
ctx.cliFlags.database = 'mysql';
|
|
44
|
+
expect(inspectDatabaseAdapter(ctx)).toMatchObject({ state: 'blocked' });
|
|
45
|
+
expect(await resolveDatabaseAdapter(ctx)).toBeNull();
|
|
46
|
+
expect(ctx.state.get().answers.dbAdapter).toBe('postgres');
|
|
47
|
+
});
|
|
48
|
+
it('blocks an invalid value even when a caller bypasses CLI validation', () => {
|
|
49
|
+
const ctx = createTestContext({ dbAdapter: undefined });
|
|
50
|
+
contexts.push(ctx);
|
|
51
|
+
ctx.cliFlags.database = 'sqlite';
|
|
52
|
+
expect(inspectDatabaseAdapter(ctx)).toMatchObject({
|
|
53
|
+
state: 'blocked',
|
|
54
|
+
reason: expect.stringContaining('sqlite'),
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=selection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.test.js","sourceRoot":"","sources":["../../../src/lib/database/selection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DbTargetInspection } from './provisioner.js';
|
|
2
|
+
export type DbTargetState = 'missing' | 'empty' | 'byline-schema' | 'occupied-schema';
|
|
3
|
+
export declare function classifyDbTarget(inspection: DbTargetInspection): DbTargetState;
|
|
4
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/lib/database/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,eAAe,GAAG,iBAAiB,CAAA;AAErF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,kBAAkB,GAAG,aAAa,CAM9E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function classifyDbTarget(inspection) {
|
|
2
|
+
if (!inspection.exists)
|
|
3
|
+
return 'missing';
|
|
4
|
+
if (inspection.objects.length === 0)
|
|
5
|
+
return 'empty';
|
|
6
|
+
return inspection.objects.some((name) => name.toLowerCase().startsWith('byline_'))
|
|
7
|
+
? 'byline-schema'
|
|
8
|
+
: 'occupied-schema';
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/lib/database/state.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,gBAAgB,CAAC,UAA8B;IAC7D,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IACxC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IACnD,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChF,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,iBAAiB,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../../../src/lib/database/state.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { classifyDbTarget } from './state.js';
|
|
3
|
+
describe.each([
|
|
4
|
+
[{ exists: false, objects: [] }, 'missing'],
|
|
5
|
+
[{ exists: true, objects: [] }, 'empty'],
|
|
6
|
+
[{ exists: true, objects: ['byline_documents'] }, 'byline-schema'],
|
|
7
|
+
[{ exists: true, objects: ['BYLINE_DOCUMENTS'] }, 'byline-schema'],
|
|
8
|
+
[{ exists: true, objects: ['posts'] }, 'occupied-schema'],
|
|
9
|
+
[{ exists: true, objects: ['posts', 'byline_documents'] }, 'byline-schema'],
|
|
10
|
+
[{ exists: true, objects: ['current_documents_view'] }, 'occupied-schema'],
|
|
11
|
+
[{ exists: true, objects: ['__drizzle_migrations'] }, 'occupied-schema'],
|
|
12
|
+
])('database target classification', (inspection, expected) => {
|
|
13
|
+
it(`classifies ${JSON.stringify(inspection)} as ${expected}`, () => {
|
|
14
|
+
expect(classifyDbTarget({ ...inspection, objects: [...inspection.objects] })).toBe(expected);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../../src/lib/database/state.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,QAAQ,CAAC,IAAI,CAAC;IACZ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC;IAC3C,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC;IACxC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,eAAe,CAAC;IAClE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,eAAe,CAAC;IAClE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,iBAAiB,CAAC;IACzD,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,EAAE,eAAe,CAAC;IAC3E,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC1E,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,EAAE,EAAE,iBAAiB,CAAC;CAChE,CAAC,CAAC,gCAAgC,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;IACrE,EAAE,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,QAAQ,EAAE,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,gBAAgB,CAAC,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DatabaseAdapterId } from '../../types.js';
|
|
2
|
+
export interface DbConnectionParts {
|
|
3
|
+
host: string;
|
|
4
|
+
port?: number;
|
|
5
|
+
user: string;
|
|
6
|
+
password: string;
|
|
7
|
+
database: string;
|
|
8
|
+
}
|
|
9
|
+
export interface DatabaseUrlCodec {
|
|
10
|
+
acceptedProtocols: readonly string[];
|
|
11
|
+
defaultPort?: number;
|
|
12
|
+
build(connection: DbConnectionParts): string;
|
|
13
|
+
parse(raw: string): DbConnectionParts;
|
|
14
|
+
}
|
|
15
|
+
export declare function defaultDbPort(adapter: DatabaseAdapterId): number | undefined;
|
|
16
|
+
export declare function buildDbUrl(adapter: DatabaseAdapterId, connection: DbConnectionParts): string;
|
|
17
|
+
export declare function parseDbUrl(raw: string, adapter: DatabaseAdapterId): DbConnectionParts;
|
|
18
|
+
export declare function withDbDatabase(connection: DbConnectionParts, database: string): DbConnectionParts;
|
|
19
|
+
//# sourceMappingURL=urls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../../src/lib/database/urls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAAA;IAC5C,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAA;CACtC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAE5F;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,iBAAiB,CAErF;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAEjG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { databaseAdapterDefinition } from './adapters.js';
|
|
2
|
+
export function defaultDbPort(adapter) {
|
|
3
|
+
return databaseAdapterDefinition(adapter).url.defaultPort;
|
|
4
|
+
}
|
|
5
|
+
export function buildDbUrl(adapter, connection) {
|
|
6
|
+
return databaseAdapterDefinition(adapter).url.build(connection);
|
|
7
|
+
}
|
|
8
|
+
export function parseDbUrl(raw, adapter) {
|
|
9
|
+
return databaseAdapterDefinition(adapter).url.parse(raw);
|
|
10
|
+
}
|
|
11
|
+
export function withDbDatabase(connection, database) {
|
|
12
|
+
return { ...connection, database };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../src/lib/database/urls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAkBzD,MAAM,UAAU,aAAa,CAAC,OAA0B;IACtD,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA0B,EAAE,UAA6B;IAClF,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,OAA0B;IAChE,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAA6B,EAAE,QAAgB;IAC5E,OAAO,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,CAAA;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.test.d.ts","sourceRoot":"","sources":["../../../src/lib/database/urls.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { buildDbUrl, defaultDbPort, parseDbUrl, withDbDatabase } from './urls.js';
|
|
3
|
+
describe.each([
|
|
4
|
+
['postgres', 'postgresql', 5432],
|
|
5
|
+
['mysql', 'mysql', 3306],
|
|
6
|
+
])('%s database URLs', (adapter, protocol, defaultPort) => {
|
|
7
|
+
it('round-trips encoded credentials and database names', () => {
|
|
8
|
+
const parts = {
|
|
9
|
+
host: 'db.example.test',
|
|
10
|
+
port: defaultPort,
|
|
11
|
+
user: "by/line'editor",
|
|
12
|
+
password: 'p@ss/#% word',
|
|
13
|
+
database: 'byline content',
|
|
14
|
+
};
|
|
15
|
+
const rendered = buildDbUrl(adapter, parts);
|
|
16
|
+
expect(rendered).toMatch(new RegExp(`^${protocol}://`));
|
|
17
|
+
expect(rendered).not.toContain(parts.password);
|
|
18
|
+
expect(parseDbUrl(rendered, adapter)).toEqual(parts);
|
|
19
|
+
});
|
|
20
|
+
it('uses the dialect default port and can replace the database', () => {
|
|
21
|
+
const parsed = parseDbUrl(`${protocol}://root:secret@localhost/system`, adapter);
|
|
22
|
+
expect(parsed.port).toBe(defaultPort);
|
|
23
|
+
expect(defaultDbPort(adapter)).toBe(defaultPort);
|
|
24
|
+
expect(withDbDatabase(parsed, 'byline')).toMatchObject({ database: 'byline' });
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
it('rejects a connection URL for the wrong dialect', () => {
|
|
28
|
+
expect(() => parseDbUrl('mysql://root:secret@localhost/mysql', 'postgres')).toThrow('expected postgres connection URL');
|
|
29
|
+
expect(() => parseDbUrl('postgresql://root:secret@localhost/postgres', 'mysql')).toThrow('expected mysql connection URL');
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=urls.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.test.js","sourceRoot":"","sources":["../../../src/lib/database/urls.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEjF,QAAQ,CAAC,IAAI,CAAC;IACZ,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC;IAChC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;CAChB,CAAC,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE;IACjE,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,gBAAgB;SAC3B,CAAA;QACD,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAE3C,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAA;QACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC9C,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,QAAQ,iCAAiC,EAAE,OAAO,CAAC,CAAA;QAChF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACrC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;IACxD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,qCAAqC,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACjF,kCAAkC,CACnC,CAAA;IACD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,6CAA6C,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CACtF,+BAA+B,CAChC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-version.d.ts","sourceRoot":"","sources":["../../src/lib/dependency-version.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,GAAG,cAAc,GAAG,SAAS,CAAA;IACjD,gBAAgB,EAAE,OAAO,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GACf,uBAAuB,CAMzB;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"dependency-version.d.ts","sourceRoot":"","sources":["../../src/lib/dependency-version.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,GAAG,cAAc,GAAG,SAAS,CAAA;IACjD,gBAAgB,EAAE,OAAO,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GACf,uBAAuB,CAMzB;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,uBAAuB,CAgDzB;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtF"}
|
|
@@ -17,6 +17,7 @@ export function checkDependencyVersion(spec, declared, actualVersion) {
|
|
|
17
17
|
return { status: 'compatible', preserveDeclared: false, reason: 'not a Byline package' };
|
|
18
18
|
}
|
|
19
19
|
const trimmed = declared.trim();
|
|
20
|
+
const supportedRange = spec.versionPolicy === 'exact' ? spec.version : BYLINE_RELEASE_POLICY.supportedRange;
|
|
20
21
|
if (BARE_WORKSPACE_RANGES.has(trimmed)) {
|
|
21
22
|
if (!actualVersion) {
|
|
22
23
|
return {
|
|
@@ -25,12 +26,12 @@ export function checkDependencyVersion(spec, declared, actualVersion) {
|
|
|
25
26
|
reason: `${trimmed} target version could not be resolved locally`,
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
|
-
if (!valid(actualVersion) || !satisfies(actualVersion,
|
|
29
|
+
if (!valid(actualVersion) || !satisfies(actualVersion, supportedRange)) {
|
|
29
30
|
return {
|
|
30
31
|
status: 'incompatible',
|
|
31
32
|
preserveDeclared: true,
|
|
32
33
|
actualVersion,
|
|
33
|
-
reason: `${trimmed} resolves to
|
|
34
|
+
reason: `${trimmed} resolves to ${actualVersion}, expected ${supportedRange}`,
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
37
|
return {
|
|
@@ -45,13 +46,13 @@ export function checkDependencyVersion(spec, declared, actualVersion) {
|
|
|
45
46
|
return { status: 'incompatible', preserveDeclared: false, reason: 'invalid version range' };
|
|
46
47
|
}
|
|
47
48
|
try {
|
|
48
|
-
const compatible = validRange(range) !== null && subset(range,
|
|
49
|
+
const compatible = validRange(range) !== null && subset(range, supportedRange);
|
|
49
50
|
return compatible
|
|
50
51
|
? { status: 'compatible', preserveDeclared: trimmed.startsWith('workspace:'), reason: range }
|
|
51
52
|
: {
|
|
52
53
|
status: 'incompatible',
|
|
53
54
|
preserveDeclared: trimmed.startsWith('workspace:'),
|
|
54
|
-
reason: `${range} is not wholly within ${
|
|
55
|
+
reason: `${range} is not wholly within ${supportedRange}`,
|
|
55
56
|
};
|
|
56
57
|
}
|
|
57
58
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-version.js","sourceRoot":"","sources":["../../src/lib/dependency-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AAI5F,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAA;AACpF,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAA4C,CAAA;AAShF,MAAM,UAAU,+BAA+B,CAC7C,GAAY,EACZ,IAAa,EACb,QAAgB;IAEhB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC/B,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC;QACtD,CAAC,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;QACvC,CAAC,CAAC,SAAS,CAAA;IACb,OAAO,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAa,EACb,QAAgB,EAChB,aAAsB;IAEtB,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAA;IAC1F,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC/B,IAAI,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,MAAM,EAAE,GAAG,OAAO,+CAA+C;aAClE,CAAA;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"dependency-version.js","sourceRoot":"","sources":["../../src/lib/dependency-version.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { readFileSync } from 'node:fs';
|
|
|
2
2
|
import { dirname, resolve } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { DATABASE_ADAPTER_IDS } from './database/adapters.js';
|
|
5
6
|
const templates = resolve(dirname(fileURLToPath(import.meta.url)), '../templates');
|
|
6
7
|
function source(path) {
|
|
7
8
|
return readFileSync(resolve(templates, path), 'utf8');
|
|
@@ -10,18 +11,22 @@ describe('scaffold server hook boundary', () => {
|
|
|
10
11
|
it('keeps the example schema host-agnostic and registers its hooks from the server graph', () => {
|
|
11
12
|
const schema = source('byline-examples/collections/docs/schema.ts');
|
|
12
13
|
const registry = source('byline-examples/collections/server-hooks.ts');
|
|
13
|
-
const serverConfig = source('byline-examples/server.config.ts');
|
|
14
14
|
expect(schema).not.toContain('@tanstack/react-start');
|
|
15
15
|
expect(schema).not.toContain('createServerOnlyFn');
|
|
16
16
|
expect(schema).not.toContain("'./hooks.js'");
|
|
17
17
|
expect(registry).toContain("docs: () => import('./docs/hooks.js')");
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
for (const adapter of DATABASE_ADAPTER_IDS) {
|
|
19
|
+
const serverConfig = source(`dialects/${adapter}/byline-examples/server.config.ts`);
|
|
20
|
+
expect(serverConfig).toContain("import { serverHooks } from './collections/server-hooks.js'");
|
|
21
|
+
expect(serverConfig).toContain('hooks: serverHooks');
|
|
22
|
+
}
|
|
20
23
|
});
|
|
21
24
|
it('ships the registry seam in both scaffold flavors and configures the host build guard', () => {
|
|
22
25
|
for (const flavor of ['byline', 'byline-examples']) {
|
|
23
26
|
expect(source(`${flavor}/collections/server-hooks.ts`)).toContain('satisfies ServerHooksConfig');
|
|
24
|
-
|
|
27
|
+
for (const adapter of DATABASE_ADAPTER_IDS) {
|
|
28
|
+
expect(source(`dialects/${adapter}/${flavor}/server.config.ts`)).toContain('hooks: serverHooks');
|
|
29
|
+
}
|
|
25
30
|
}
|
|
26
31
|
expect(source('host/vite.config.ts')).toContain("import { bylineClientHookBoundary } from '@byline/host-tanstack-start/vite'");
|
|
27
32
|
expect(source('host/vite.config.ts')).toContain('bylineClientHookBoundary()');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-hook-boundary.test.node.js","sourceRoot":"","sources":["../../src/lib/template-hook-boundary.test.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;AAElF,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;AACvD,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,MAAM,GAAG,MAAM,CAAC,4CAA4C,CAAC,CAAA;QACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,6CAA6C,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"template-hook-boundary.test.node.js","sourceRoot":"","sources":["../../src/lib/template-hook-boundary.test.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;AAElF,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;AACvD,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,MAAM,GAAG,MAAM,CAAC,4CAA4C,CAAC,CAAA;QACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,6CAA6C,CAAC,CAAA;QAEtE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAA;QACnE,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;YAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,OAAO,mCAAmC,CAAC,CAAA;YACnF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,6DAA6D,CAAC,CAAA;YAC7F,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QACtD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,8BAA8B,CAAC,CAAC,CAAC,SAAS,CAC/D,6BAA6B,CAC9B,CAAA;YACD,KAAK,MAAM,OAAO,IAAI,oBAAoB,EAAE,CAAC;gBAC3C,MAAM,CAAC,MAAM,CAAC,YAAY,OAAO,IAAI,MAAM,mBAAmB,CAAC,CAAC,CAAC,SAAS,CACxE,oBAAoB,CACrB,CAAA;YACH,CAAC;QACH,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAC7C,6EAA6E,CAC9E,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;IAC/E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/manifest/deps.d.ts
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* `src/routes/_byline/`, `src/ui/byline/`). Transitive deps reach the
|
|
15
15
|
* user via the `@byline/*` package boundary and don't need declaring.
|
|
16
16
|
*/
|
|
17
|
+
import type { Answers, DatabaseAdapterId } from '../types.js';
|
|
17
18
|
export type DepGroup = 'byline' | 'runtime' | 'dev';
|
|
18
19
|
/**
|
|
19
20
|
* Tag for opt-in deps. When set, the `deps` phase only installs the
|
|
@@ -21,7 +22,7 @@ export type DepGroup = 'byline' | 'runtime' | 'dev';
|
|
|
21
22
|
* of dependencies they didn't ask for (e.g. the markdown ingestion stack
|
|
22
23
|
* that exists only to serve `byline/scripts/import-docs.ts`).
|
|
23
24
|
*/
|
|
24
|
-
export type DepOptionalFlag = 'importDocs';
|
|
25
|
+
export type DepOptionalFlag = 'examples' | 'importDocs';
|
|
25
26
|
export interface DepSpec {
|
|
26
27
|
name: string;
|
|
27
28
|
version: string;
|
|
@@ -30,7 +31,13 @@ export interface DepSpec {
|
|
|
30
31
|
note: string;
|
|
31
32
|
/** When set, only install if the matching `answers` flag is true. */
|
|
32
33
|
optional?: DepOptionalFlag;
|
|
34
|
+
/** Database adapters for which this dependency is required. */
|
|
35
|
+
adapters?: readonly DatabaseAdapterId[];
|
|
36
|
+
/** Byline compatibility rule. Defaults to the supported release range. */
|
|
37
|
+
versionPolicy?: 'supported-range' | 'exact';
|
|
33
38
|
}
|
|
34
39
|
export declare const BYLINE_VERSION: string;
|
|
40
|
+
export declare const BYLINE_ADAPTER_VERSION: string;
|
|
35
41
|
export declare const DEP_SPECS: readonly DepSpec[];
|
|
42
|
+
export declare function dependencySpecsFor(answers: Answers): readonly DepSpec[];
|
|
36
43
|
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/manifest/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/manifest/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE7D,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,YAAY,CAAA;AAEvD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,CAAA;IACf,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACvC,0EAA0E;IAC1E,aAAa,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAA;CAC5C;AAKD,eAAO,MAAM,cAAc,QAAwC,CAAA;AACnE,eAAO,MAAM,sBAAsB,QAAsB,CAAA;AA2BzD,eAAO,MAAM,SAAS,EAAE,SAAS,OAAO,EAgL9B,CAAA;AAEV,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,OAAO,EAAE,CAQvE"}
|