@depup/netlify-cli 24.11.1-depup.1 → 26.2.0-depup.7
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 +49 -34
- package/bin/run.js +29 -9
- package/changes.json +116 -56
- package/dist/commands/base-command.d.ts.map +1 -1
- package/dist/commands/base-command.js +22 -6
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/create/create-action.js +1 -1
- package/dist/commands/create/create-action.js.map +1 -1
- package/dist/commands/database/database.d.ts +0 -15
- package/dist/commands/database/database.d.ts.map +1 -1
- package/dist/commands/database/database.js +104 -113
- package/dist/commands/database/database.js.map +1 -1
- package/dist/commands/database/{connect.d.ts → db-connect.d.ts} +1 -1
- package/dist/commands/database/db-connect.d.ts.map +1 -0
- package/dist/commands/database/{connect.js → db-connect.js} +4 -4
- package/dist/commands/database/db-connect.js.map +1 -0
- package/dist/commands/database/db-init.d.ts +6 -0
- package/dist/commands/database/db-init.d.ts.map +1 -0
- package/dist/commands/database/db-init.js +298 -0
- package/dist/commands/database/db-init.js.map +1 -0
- package/dist/commands/database/{migrate.d.ts → db-migrate.d.ts} +1 -1
- package/dist/commands/database/db-migrate.d.ts.map +1 -0
- package/dist/commands/database/{migrate.js → db-migrate.js} +13 -4
- package/dist/commands/database/db-migrate.js.map +1 -0
- package/dist/commands/database/{migration-new.d.ts → db-migration-new.d.ts} +1 -2
- package/dist/commands/database/db-migration-new.d.ts.map +1 -0
- package/dist/commands/database/{migration-new.js → db-migration-new.js} +43 -45
- package/dist/commands/database/db-migration-new.js.map +1 -0
- package/dist/commands/database/{migration-pull.d.ts → db-migration-pull.d.ts} +1 -1
- package/dist/commands/database/db-migration-pull.d.ts.map +1 -0
- package/dist/commands/database/{migration-pull.js → db-migration-pull.js} +49 -24
- package/dist/commands/database/db-migration-pull.js.map +1 -0
- package/dist/commands/database/db-migrations-reset.d.ts +7 -0
- package/dist/commands/database/db-migrations-reset.d.ts.map +1 -0
- package/dist/commands/database/db-migrations-reset.js +108 -0
- package/dist/commands/database/db-migrations-reset.js.map +1 -0
- package/dist/commands/database/{reset.d.ts → db-reset.d.ts} +1 -1
- package/dist/commands/database/db-reset.d.ts.map +1 -0
- package/dist/commands/database/{reset.js → db-reset.js} +2 -2
- package/dist/commands/database/db-reset.js.map +1 -0
- package/dist/commands/database/db-status.d.ts +24 -0
- package/dist/commands/database/db-status.d.ts.map +1 -0
- package/dist/commands/database/db-status.js +348 -0
- package/dist/commands/database/db-status.js.map +1 -0
- package/dist/commands/database/util/api-errors.d.ts +2 -0
- package/dist/commands/database/util/api-errors.d.ts.map +1 -0
- package/dist/commands/database/util/api-errors.js +17 -0
- package/dist/commands/database/util/api-errors.js.map +1 -0
- package/dist/commands/database/util/applied-migrations.d.ts +20 -0
- package/dist/commands/database/util/applied-migrations.d.ts.map +1 -0
- package/dist/commands/database/util/applied-migrations.js +44 -0
- package/dist/commands/database/util/applied-migrations.js.map +1 -0
- package/dist/commands/database/util/constants.d.ts +4 -0
- package/dist/commands/database/util/constants.d.ts.map +1 -0
- package/dist/commands/database/util/constants.js +4 -0
- package/dist/commands/database/util/constants.js.map +1 -0
- package/dist/commands/database/util/db-connection.d.ts +18 -0
- package/dist/commands/database/util/db-connection.d.ts.map +1 -0
- package/dist/commands/database/util/db-connection.js +117 -0
- package/dist/commands/database/util/db-connection.js.map +1 -0
- package/dist/commands/database/util/init-data.d.ts +8 -0
- package/dist/commands/database/util/init-data.d.ts.map +1 -0
- package/dist/commands/database/util/init-data.js +47 -0
- package/dist/commands/database/util/init-data.js.map +1 -0
- package/dist/commands/database/util/meta-commands.d.ts.map +1 -0
- package/dist/commands/database/{meta-commands.js → util/meta-commands.js} +1 -1
- package/dist/commands/database/util/meta-commands.js.map +1 -0
- package/dist/commands/database/util/migrations-path.d.ts +4 -0
- package/dist/commands/database/util/migrations-path.d.ts.map +1 -0
- package/dist/commands/database/util/migrations-path.js +19 -0
- package/dist/commands/database/util/migrations-path.js.map +1 -0
- package/dist/commands/database/util/package-json.d.ts +2 -0
- package/dist/commands/database/util/package-json.d.ts.map +1 -0
- package/dist/commands/database/util/package-json.js +16 -0
- package/dist/commands/database/util/package-json.js.map +1 -0
- package/dist/commands/database/util/packages.d.ts +15 -0
- package/dist/commands/database/util/packages.d.ts.map +1 -0
- package/dist/commands/database/util/packages.js +59 -0
- package/dist/commands/database/util/packages.js.map +1 -0
- package/dist/commands/database/util/paths.d.ts +2 -0
- package/dist/commands/database/util/paths.d.ts.map +1 -0
- package/dist/commands/database/util/paths.js +13 -0
- package/dist/commands/database/util/paths.js.map +1 -0
- package/dist/commands/database/util/pg-client-executor.d.ts.map +1 -0
- package/dist/commands/database/util/pg-client-executor.js.map +1 -0
- package/dist/commands/database/util/psql-formatter.d.ts.map +1 -0
- package/dist/commands/database/util/psql-formatter.js.map +1 -0
- package/dist/commands/database/util/spawn-async.d.ts +3 -0
- package/dist/commands/database/util/spawn-async.d.ts.map +1 -0
- package/dist/commands/database/util/spawn-async.js +16 -0
- package/dist/commands/database/util/spawn-async.js.map +1 -0
- package/dist/commands/database/util/timestamp.d.ts +2 -0
- package/dist/commands/database/util/timestamp.d.ts.map +1 -0
- package/dist/commands/database/util/timestamp.js +7 -0
- package/dist/commands/database/util/timestamp.js.map +1 -0
- package/dist/commands/deploy/deploy.d.ts.map +1 -1
- package/dist/commands/deploy/deploy.js +16 -5
- package/dist/commands/deploy/deploy.js.map +1 -1
- package/dist/commands/dev/dev.d.ts.map +1 -1
- package/dist/commands/dev/dev.js +2 -0
- package/dist/commands/dev/dev.js.map +1 -1
- package/dist/commands/dev/programmatic-netlify-dev.d.ts +2 -1
- package/dist/commands/dev/programmatic-netlify-dev.d.ts.map +1 -1
- package/dist/commands/dev/programmatic-netlify-dev.js +3 -4
- package/dist/commands/dev/programmatic-netlify-dev.js.map +1 -1
- package/dist/commands/functions/functions-create.d.ts +1 -1
- package/dist/commands/functions/functions-create.d.ts.map +1 -1
- package/dist/commands/functions/functions-create.js +80 -17
- package/dist/commands/functions/functions-create.js.map +1 -1
- package/dist/commands/functions/functions.d.ts.map +1 -1
- package/dist/commands/functions/functions.js +2 -0
- package/dist/commands/functions/functions.js.map +1 -1
- package/dist/commands/init/init.js +1 -1
- package/dist/commands/init/init.js.map +1 -1
- package/dist/commands/link/link.js +1 -1
- package/dist/commands/link/link.js.map +1 -1
- package/dist/commands/login/login.d.ts.map +1 -1
- package/dist/commands/login/login.js +0 -6
- package/dist/commands/login/login.js.map +1 -1
- package/dist/commands/logs/index.d.ts +0 -2
- package/dist/commands/logs/index.d.ts.map +1 -1
- package/dist/commands/logs/index.js +95 -29
- package/dist/commands/logs/index.js.map +1 -1
- package/dist/commands/logs/log-api.d.ts +64 -0
- package/dist/commands/logs/log-api.d.ts.map +1 -0
- package/dist/commands/logs/log-api.js +200 -0
- package/dist/commands/logs/log-api.js.map +1 -0
- package/dist/commands/logs/logs.d.ts +4 -0
- package/dist/commands/logs/logs.d.ts.map +1 -0
- package/dist/commands/logs/logs.js +302 -0
- package/dist/commands/logs/logs.js.map +1 -0
- package/dist/commands/logs/sources/deploy.d.ts +13 -0
- package/dist/commands/logs/sources/deploy.d.ts.map +1 -0
- package/dist/commands/logs/sources/deploy.js +71 -0
- package/dist/commands/logs/sources/deploy.js.map +1 -0
- package/dist/commands/logs/sources/edge-functions.d.ts +17 -0
- package/dist/commands/logs/sources/edge-functions.d.ts.map +1 -0
- package/dist/commands/logs/sources/edge-functions.js +71 -0
- package/dist/commands/logs/sources/edge-functions.js.map +1 -0
- package/dist/commands/logs/sources/functions.d.ts +22 -0
- package/dist/commands/logs/sources/functions.d.ts.map +1 -0
- package/dist/commands/logs/sources/functions.js +75 -0
- package/dist/commands/logs/sources/functions.js.map +1 -0
- package/dist/commands/main.d.ts.map +1 -1
- package/dist/commands/main.js +38 -19
- package/dist/commands/main.js.map +1 -1
- package/dist/commands/serve/serve.d.ts.map +1 -1
- package/dist/commands/serve/serve.js +1 -0
- package/dist/commands/serve/serve.js.map +1 -1
- package/dist/commands/sites/sites-create.js +1 -1
- package/dist/commands/sites/sites-create.js.map +1 -1
- package/dist/lib/blobs/blobs.js +2 -2
- package/dist/lib/blobs/blobs.js.map +1 -1
- package/dist/lib/edge-functions/proxy.d.ts +2 -1
- package/dist/lib/edge-functions/proxy.d.ts.map +1 -1
- package/dist/lib/edge-functions/proxy.js +6 -2
- package/dist/lib/edge-functions/proxy.js.map +1 -1
- package/dist/lib/edge-functions/registry.d.ts +5 -1
- package/dist/lib/edge-functions/registry.d.ts.map +1 -1
- package/dist/lib/edge-functions/registry.js +24 -3
- package/dist/lib/edge-functions/registry.js.map +1 -1
- package/dist/lib/extensions.js +1 -1
- package/dist/lib/extensions.js.map +1 -1
- package/dist/lib/functions/netlify-function.d.ts +2 -2
- package/dist/lib/functions/netlify-function.d.ts.map +1 -1
- package/dist/lib/functions/netlify-function.js +16 -5
- package/dist/lib/functions/netlify-function.js.map +1 -1
- package/dist/lib/functions/registry.d.ts.map +1 -1
- package/dist/lib/functions/registry.js +1 -1
- package/dist/lib/functions/registry.js.map +1 -1
- package/dist/lib/functions/runtimes/index.d.ts +1 -0
- package/dist/lib/functions/runtimes/index.d.ts.map +1 -1
- package/dist/lib/functions/runtimes/index.js.map +1 -1
- package/dist/lib/functions/runtimes/js/builders/zisi.d.ts +1 -0
- package/dist/lib/functions/runtimes/js/builders/zisi.d.ts.map +1 -1
- package/dist/lib/functions/runtimes/js/builders/zisi.js +2 -1
- package/dist/lib/functions/runtimes/js/builders/zisi.js.map +1 -1
- package/dist/lib/functions/runtimes/js/index.d.ts.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/deploy/hash-fns.d.ts.map +1 -1
- package/dist/utils/deploy/hash-fns.js +12 -1
- package/dist/utils/deploy/hash-fns.js.map +1 -1
- package/dist/utils/deploy/upload-source-zip.d.ts.map +1 -1
- package/dist/utils/deploy/upload-source-zip.js +20 -11
- package/dist/utils/deploy/upload-source-zip.js.map +1 -1
- package/dist/utils/dev.js +1 -1
- package/dist/utils/dev.js.map +1 -1
- package/dist/utils/framework-server.d.ts.map +1 -1
- package/dist/utils/framework-server.js +2 -1
- package/dist/utils/framework-server.js.map +1 -1
- package/dist/utils/init/utils.d.ts.map +1 -1
- package/dist/utils/live-tunnel.js +2 -2
- package/dist/utils/live-tunnel.js.map +1 -1
- package/dist/utils/object-utilities.d.ts +64 -0
- package/dist/utils/object-utilities.d.ts.map +1 -0
- package/dist/utils/object-utilities.js +93 -0
- package/dist/utils/object-utilities.js.map +1 -0
- package/dist/utils/open-browser.d.ts +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js +4 -2
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/proxy-server.d.ts +2 -1
- package/dist/utils/proxy-server.d.ts.map +1 -1
- package/dist/utils/proxy-server.js +2 -1
- package/dist/utils/proxy-server.js.map +1 -1
- package/dist/utils/proxy.d.ts +2 -1
- package/dist/utils/proxy.d.ts.map +1 -1
- package/dist/utils/proxy.js +11 -2
- package/dist/utils/proxy.js.map +1 -1
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +36 -7
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/telemetry/index.d.ts +1 -1
- package/dist/utils/telemetry/index.d.ts.map +1 -1
- package/dist/utils/telemetry/index.js +1 -1
- package/dist/utils/telemetry/index.js.map +1 -1
- package/dist/utils/telemetry/report-error.d.ts +1 -0
- package/dist/utils/telemetry/report-error.d.ts.map +1 -1
- package/dist/utils/telemetry/report-error.js +15 -2
- package/dist/utils/telemetry/report-error.js.map +1 -1
- package/dist/utils/zip.d.ts +4 -0
- package/dist/utils/zip.d.ts.map +1 -0
- package/dist/utils/zip.js +114 -0
- package/dist/utils/zip.js.map +1 -0
- package/functions-templates/javascript/scheduled-function/package.json +1 -1
- package/functions-templates/typescript/database/.netlify-function-template.mjs +5 -0
- package/functions-templates/typescript/database/package-lock.json +357 -0
- package/functions-templates/typescript/database/package.json +23 -0
- package/functions-templates/typescript/database/{{name}}.mts +24 -0
- package/functions-templates/typescript/database-drizzle/.netlify-function-template.mjs +5 -0
- package/functions-templates/typescript/database-drizzle/package-lock.json +520 -0
- package/functions-templates/typescript/database-drizzle/package.json +25 -0
- package/functions-templates/typescript/database-drizzle/{{name}}.mts +26 -0
- package/functions-templates/typescript/hello-world/package-lock.json +15 -15
- package/functions-templates/typescript/hello-world/package.json +1 -1
- package/functions-templates/typescript/scheduled-function/package.json +1 -1
- package/package.json +267 -150
- package/scripts/netlifyPackage.js +2 -26
- package/dist/commands/database/connect.d.ts.map +0 -1
- package/dist/commands/database/connect.js.map +0 -1
- package/dist/commands/database/constants.d.ts +0 -4
- package/dist/commands/database/constants.d.ts.map +0 -1
- package/dist/commands/database/constants.js +0 -4
- package/dist/commands/database/constants.js.map +0 -1
- package/dist/commands/database/db-connection.d.ts +0 -15
- package/dist/commands/database/db-connection.d.ts.map +0 -1
- package/dist/commands/database/db-connection.js +0 -65
- package/dist/commands/database/db-connection.js.map +0 -1
- package/dist/commands/database/drizzle.d.ts +0 -3
- package/dist/commands/database/drizzle.d.ts.map +0 -1
- package/dist/commands/database/drizzle.js +0 -96
- package/dist/commands/database/drizzle.js.map +0 -1
- package/dist/commands/database/init.d.ts +0 -9
- package/dist/commands/database/init.d.ts.map +0 -1
- package/dist/commands/database/init.js +0 -124
- package/dist/commands/database/init.js.map +0 -1
- package/dist/commands/database/meta-commands.d.ts.map +0 -1
- package/dist/commands/database/meta-commands.js.map +0 -1
- package/dist/commands/database/migrate.d.ts.map +0 -1
- package/dist/commands/database/migrate.js.map +0 -1
- package/dist/commands/database/migration-new.d.ts.map +0 -1
- package/dist/commands/database/migration-new.js.map +0 -1
- package/dist/commands/database/migration-pull.d.ts.map +0 -1
- package/dist/commands/database/migration-pull.js.map +0 -1
- package/dist/commands/database/pg-client-executor.d.ts.map +0 -1
- package/dist/commands/database/pg-client-executor.js.map +0 -1
- package/dist/commands/database/psql-formatter.d.ts.map +0 -1
- package/dist/commands/database/psql-formatter.js.map +0 -1
- package/dist/commands/database/reset.d.ts.map +0 -1
- package/dist/commands/database/reset.js.map +0 -1
- package/dist/commands/database/status.d.ts +0 -4
- package/dist/commands/database/status.d.ts.map +0 -1
- package/dist/commands/database/status.js +0 -71
- package/dist/commands/database/status.js.map +0 -1
- package/dist/commands/database/utils.d.ts +0 -75
- package/dist/commands/database/utils.d.ts.map +0 -1
- package/dist/commands/database/utils.js +0 -172
- package/dist/commands/database/utils.js.map +0 -1
- package/dist/commands/logs/functions.d.ts +0 -4
- package/dist/commands/logs/functions.d.ts.map +0 -1
- package/dist/commands/logs/functions.js +0 -79
- package/dist/commands/logs/functions.js.map +0 -1
- package/functions-templates/go/hello-world/.netlify-function-template.mjs +0 -6
- package/functions-templates/go/hello-world/go.mod +0 -5
- package/functions-templates/go/hello-world/go.sum +0 -22
- package/functions-templates/go/hello-world/main.go +0 -24
- package/functions-templates/rust/hello-world/.netlify-function-template.mjs +0 -6
- package/functions-templates/rust/hello-world/Cargo.lock +0 -1149
- package/functions-templates/rust/hello-world/Cargo.toml +0 -14
- package/functions-templates/rust/hello-world/src/main.rs +0 -29
- package/npm-shrinkwrap.json +0 -12720
- package/scripts/prepublishOnly.js +0 -29
- /package/dist/commands/database/{meta-commands.d.ts → util/meta-commands.d.ts} +0 -0
- /package/dist/commands/database/{pg-client-executor.d.ts → util/pg-client-executor.d.ts} +0 -0
- /package/dist/commands/database/{pg-client-executor.js → util/pg-client-executor.js} +0 -0
- /package/dist/commands/database/{psql-formatter.d.ts → util/psql-formatter.d.ts} +0 -0
- /package/dist/commands/database/{psql-formatter.js → util/psql-formatter.js} +0 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { readdir } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { chalk, log, logJson, netlifyCommand } from '../../utils/command-helpers.js';
|
|
4
|
+
import { localAppliedMigrations, remoteAppliedMigrations, } from './util/applied-migrations.js';
|
|
5
|
+
import { readApiErrorMessage } from './util/api-errors.js';
|
|
6
|
+
import { connectToDatabase, detectExistingLocalConnectionString } from './util/db-connection.js';
|
|
7
|
+
import { resolveMigrationsDirectory } from './util/migrations-path.js';
|
|
8
|
+
import { hasDependency } from './util/package-json.js';
|
|
9
|
+
import { relativeToProject } from './util/paths.js';
|
|
10
|
+
import { fileExistsAsync } from '../../lib/fs.js';
|
|
11
|
+
const DOCS_URL = 'https://ntl.fyi/database';
|
|
12
|
+
const NETLIFY_DATABASE_PACKAGE = '@netlify/database';
|
|
13
|
+
const formatCommand = (suffix) => chalk.cyanBright.bold(`${netlifyCommand()} ${suffix}`);
|
|
14
|
+
const logConnectCommands = () => {
|
|
15
|
+
secondary(`Run ${formatCommand('database connect')} to start an interactive database client`);
|
|
16
|
+
secondary(`Run ${formatCommand(`database connect --query "SELECT 'SQL goes here'"`)} to run a one-shot query`);
|
|
17
|
+
};
|
|
18
|
+
const parseVersion = (name) => {
|
|
19
|
+
const match = /^(\d+)_/.exec(name);
|
|
20
|
+
if (!match) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const parsed = Number.parseInt(match[1], 10);
|
|
24
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
25
|
+
};
|
|
26
|
+
const MIGRATION_NAME_PATTERN = /^\d+_[a-z0-9_-]+$/;
|
|
27
|
+
const readLocalMigrations = async (migrationsDirectory) => {
|
|
28
|
+
let entries;
|
|
29
|
+
try {
|
|
30
|
+
entries = await readdir(migrationsDirectory, { withFileTypes: true });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error.code === 'ENOENT') {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
// First pass is to extract migration names
|
|
39
|
+
const migrationNames = [];
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
if (entry.isDirectory()) {
|
|
42
|
+
if (MIGRATION_NAME_PATTERN.test(entry.name) &&
|
|
43
|
+
(await fileExistsAsync(join(migrationsDirectory, entry.name, 'migration.sql')))) {
|
|
44
|
+
migrationNames.push(entry.name);
|
|
45
|
+
}
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (entry.isFile() && entry.name.endsWith('.sql')) {
|
|
49
|
+
const migrationName = entry.name.replace(/\.sql$/, '');
|
|
50
|
+
if (MIGRATION_NAME_PATTERN.test(migrationName)) {
|
|
51
|
+
migrationNames.push(migrationName);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Second pass to parse version and create migration entries
|
|
56
|
+
const migrations = [];
|
|
57
|
+
for (const migrationName of migrationNames) {
|
|
58
|
+
const version = parseVersion(migrationName);
|
|
59
|
+
if (version === null) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
migrations.push({ name: migrationName, version });
|
|
63
|
+
}
|
|
64
|
+
migrations.sort((a, b) => a.version - b.version);
|
|
65
|
+
return migrations;
|
|
66
|
+
};
|
|
67
|
+
const toEntry = (m) => ({ version: m.version, name: m.name });
|
|
68
|
+
export const computeStatus = (applied, local) => {
|
|
69
|
+
const appliedEntries = applied.map(toEntry);
|
|
70
|
+
const appliedByName = new Map(appliedEntries.map((m) => [m.name, m]));
|
|
71
|
+
const localByName = new Map(local.map((m) => [m.name, m]));
|
|
72
|
+
const pending = local.filter((m) => !appliedByName.has(m.name));
|
|
73
|
+
const missingOnDisk = appliedEntries.filter((m) => !localByName.has(m.name));
|
|
74
|
+
const maxApplied = appliedEntries.reduce((max, m) => (m.version > max ? m.version : max), 0);
|
|
75
|
+
const outOfOrder = pending
|
|
76
|
+
.filter((m) => m.version <= maxApplied)
|
|
77
|
+
.map((m) => ({ name: m.name, version: m.version, maxApplied }));
|
|
78
|
+
return { applied: appliedEntries, pending, missingOnDisk, outOfOrder };
|
|
79
|
+
};
|
|
80
|
+
const redactConnectionString = (connectionString) => {
|
|
81
|
+
try {
|
|
82
|
+
const url = new URL(connectionString);
|
|
83
|
+
if (url.username) {
|
|
84
|
+
url.username = '***';
|
|
85
|
+
}
|
|
86
|
+
if (url.password) {
|
|
87
|
+
url.password = '***';
|
|
88
|
+
}
|
|
89
|
+
return url.toString();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return '***';
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const connectionStringHasCredentials = (connectionString) => {
|
|
96
|
+
try {
|
|
97
|
+
const url = new URL(connectionString);
|
|
98
|
+
return Boolean(url.username || url.password);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const fetchBranchConnectionString = async (ctx, branchId) => {
|
|
105
|
+
const token = ctx.accessToken.replace('Bearer ', '');
|
|
106
|
+
const url = new URL(`${ctx.basePath}/sites/${encodeURIComponent(ctx.siteId)}/database/branch/${encodeURIComponent(branchId)}`);
|
|
107
|
+
const response = await fetch(url, {
|
|
108
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
109
|
+
});
|
|
110
|
+
if (response.status === 404) {
|
|
111
|
+
throw new Error(`No database branch found for "${branchId}". Has a deploy been published for this branch?`);
|
|
112
|
+
}
|
|
113
|
+
if (!response.ok) {
|
|
114
|
+
const message = await readApiErrorMessage(response);
|
|
115
|
+
throw new Error(`Failed to fetch database branch "${branchId}" (${String(response.status)}): ${message}`);
|
|
116
|
+
}
|
|
117
|
+
const data = (await response.json());
|
|
118
|
+
if (!data.connection_string) {
|
|
119
|
+
throw new Error(`Database branch "${branchId}" has no connection string.`);
|
|
120
|
+
}
|
|
121
|
+
return data.connection_string;
|
|
122
|
+
};
|
|
123
|
+
const fetchSiteDatabase = async (ctx) => {
|
|
124
|
+
const token = ctx.accessToken.replace('Bearer ', '');
|
|
125
|
+
const url = new URL(`${ctx.basePath}/sites/${encodeURIComponent(ctx.siteId)}/database/`);
|
|
126
|
+
let response;
|
|
127
|
+
try {
|
|
128
|
+
response = await fetch(url, { headers: { Authorization: `Bearer ${token}` } });
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
if (response.status === 404) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
if (!response.ok) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const data = (await response.json());
|
|
140
|
+
if (!data.connection_string) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
return { connectionString: data.connection_string };
|
|
144
|
+
};
|
|
145
|
+
const renderList = (items, indent = ' ') => {
|
|
146
|
+
if (items.length === 0) {
|
|
147
|
+
return chalk.dim(`${indent}(none)`);
|
|
148
|
+
}
|
|
149
|
+
return items.map((m) => `${indent}• ${m.name}`).join('\n');
|
|
150
|
+
};
|
|
151
|
+
// INDENT clears the emoji column so secondary lines hang under the primary
|
|
152
|
+
// text. Width: 2-space section indent + 2-col emoji + 1 space = 5.
|
|
153
|
+
const INDENT = ' ';
|
|
154
|
+
const STATUS_GOOD = '🟢';
|
|
155
|
+
const STATUS_WARN = '🟡';
|
|
156
|
+
const STATUS_NONE = '⚪';
|
|
157
|
+
const STATUS_INFO = 'ℹ️ ';
|
|
158
|
+
const primary = (emoji, text) => {
|
|
159
|
+
log(` ${emoji} ${text}`);
|
|
160
|
+
};
|
|
161
|
+
const secondary = (text) => {
|
|
162
|
+
log(chalk.gray(`${INDENT}${text}`));
|
|
163
|
+
};
|
|
164
|
+
const renderPretty = (params) => {
|
|
165
|
+
const { enabled, packageInstalled, connectionString, showCredentials, status, isLocal, hasUrlOverride, migrationsDirectory, projectRoot, adminUrl, } = params;
|
|
166
|
+
log(chalk.bold('Netlify Database'));
|
|
167
|
+
log(chalk.gray('Managed Postgres databases that seamlessly integrate with the Netlify workflow'));
|
|
168
|
+
log('');
|
|
169
|
+
if (enabled) {
|
|
170
|
+
primary(STATUS_GOOD, 'Netlify Database is enabled for this project');
|
|
171
|
+
if (adminUrl) {
|
|
172
|
+
secondary(`Manage your database at ${adminUrl}/database`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
primary(STATUS_WARN, 'Netlify Database is not enabled for this project');
|
|
177
|
+
secondary(`Install the ${chalk.bold(NETLIFY_DATABASE_PACKAGE)} package and deploy your site to automatically`);
|
|
178
|
+
secondary(`provision a database. Refer to ${DOCS_URL} for more information.`);
|
|
179
|
+
}
|
|
180
|
+
log('');
|
|
181
|
+
if (packageInstalled) {
|
|
182
|
+
primary(STATUS_GOOD, `The ${chalk.bold(NETLIFY_DATABASE_PACKAGE)} package is installed`);
|
|
183
|
+
secondary(`For a full API reference, visit ${DOCS_URL}`);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
primary(STATUS_WARN, `The ${chalk.bold(NETLIFY_DATABASE_PACKAGE)} package is not installed`);
|
|
187
|
+
secondary(`Install it with \`npm install ${NETLIFY_DATABASE_PACKAGE}\``);
|
|
188
|
+
secondary(`Refer to ${DOCS_URL} for more information`);
|
|
189
|
+
}
|
|
190
|
+
log('');
|
|
191
|
+
if (connectionString) {
|
|
192
|
+
const displayed = showCredentials ? connectionString : redactConnectionString(connectionString);
|
|
193
|
+
primary(STATUS_GOOD, `Connected to database branch: ${displayed}`);
|
|
194
|
+
logConnectCommands();
|
|
195
|
+
if (!showCredentials && connectionStringHasCredentials(connectionString)) {
|
|
196
|
+
secondary(`To reveal the full connection string (including credentials), run ${formatCommand('database status --show-credentials')}`);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
secondary(`To connect to the database directly, use the connection string: ${displayed}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (isLocal) {
|
|
203
|
+
primary(STATUS_INFO, 'The local database is not running');
|
|
204
|
+
secondary(`It starts automatically when you run ${formatCommand('dev')}. Run that in a new terminal and try this command again`);
|
|
205
|
+
logConnectCommands();
|
|
206
|
+
}
|
|
207
|
+
log('');
|
|
208
|
+
log(chalk.bold('Migrations'));
|
|
209
|
+
log(chalk.gray('Database migrations managed by Netlify'));
|
|
210
|
+
log('');
|
|
211
|
+
log('');
|
|
212
|
+
const displayPath = relativeToProject(projectRoot, migrationsDirectory);
|
|
213
|
+
log(` ${STATUS_INFO} ${chalk.bold('Migrations directory')}`);
|
|
214
|
+
log(chalk.gray(`${INDENT}Migration files in this directory are automatically applied when deploying to Netlify.`));
|
|
215
|
+
log(`${INDENT}${displayPath}`);
|
|
216
|
+
if (status.missingOnDisk.length > 0 || status.outOfOrder.length > 0) {
|
|
217
|
+
log('');
|
|
218
|
+
log(chalk.bold.yellow('Issues'));
|
|
219
|
+
if (status.missingOnDisk.length > 0) {
|
|
220
|
+
log(` Applied but missing on disk: ${status.missingOnDisk.map((m) => chalk.red(m.name)).join(', ')}`);
|
|
221
|
+
}
|
|
222
|
+
if (status.outOfOrder.length > 0) {
|
|
223
|
+
log(` Out of order: ${status.outOfOrder
|
|
224
|
+
.map((m) => chalk.red(`${m.name} (version ${String(m.version)} <= max applied ${String(m.maxApplied)})`))
|
|
225
|
+
.join(', ')}`);
|
|
226
|
+
log('');
|
|
227
|
+
log(chalk.gray(`Run ${formatCommand('database migrations reset')} to delete these local-only migrations, then generate them again with a higher prefix.`));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const appliedEmoji = status.applied.length > 0 ? STATUS_GOOD : STATUS_NONE;
|
|
231
|
+
log('');
|
|
232
|
+
log(` ${appliedEmoji} ${chalk.bold(`Applied migrations (${String(status.applied.length)})`)}`);
|
|
233
|
+
log(chalk.gray(`${INDENT}These migrations have been applied and cannot be edited or deleted. Any changes to the schema must involve a new migration.`));
|
|
234
|
+
log(renderList(status.applied, INDENT));
|
|
235
|
+
log('');
|
|
236
|
+
const pendingEmoji = status.pending.length === 0 ? STATUS_GOOD : STATUS_WARN;
|
|
237
|
+
log(` ${pendingEmoji} ${chalk.bold(`Pending migrations (${String(status.pending.length)})`)}`);
|
|
238
|
+
log(chalk.gray(`${INDENT}These migrations are defined locally but haven't been applied, and you can change them or delete them.`));
|
|
239
|
+
log(renderList(status.pending, INDENT));
|
|
240
|
+
if (status.pending.length > 0 && status.outOfOrder.length === 0) {
|
|
241
|
+
const canApplyLocally = isLocal && !hasUrlOverride;
|
|
242
|
+
log('');
|
|
243
|
+
if (canApplyLocally) {
|
|
244
|
+
log(chalk.gray(`${INDENT}Run ${formatCommand('database migrations apply')} to apply them to the local database.`));
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
log(chalk.gray(`${INDENT}Deploy these files to apply the migrations.`));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
export const statusDb = async (options, command) => {
|
|
252
|
+
const buildDir = command.netlify.site.root ?? command.project.root ?? command.project.baseDirectory;
|
|
253
|
+
if (!buildDir) {
|
|
254
|
+
throw new Error('Could not determine the project root directory.');
|
|
255
|
+
}
|
|
256
|
+
const migrationsDirectory = resolveMigrationsDirectory(command);
|
|
257
|
+
const local = await readLocalMigrations(migrationsDirectory);
|
|
258
|
+
const packageInstalled = await hasDependency(NETLIFY_DATABASE_PACKAGE, buildDir);
|
|
259
|
+
const siteId = command.siteId;
|
|
260
|
+
const accessToken = command.netlify.api.accessToken;
|
|
261
|
+
const basePath = command.netlify.api.basePath;
|
|
262
|
+
// Enabled check: NETLIFY_DB_URL env OR site has a database configured.
|
|
263
|
+
const envUrl = process.env.NETLIFY_DB_URL;
|
|
264
|
+
let siteHasDatabase = false;
|
|
265
|
+
if (siteId && accessToken) {
|
|
266
|
+
const siteDb = await fetchSiteDatabase({ siteId, accessToken, basePath });
|
|
267
|
+
siteHasDatabase = siteDb !== null;
|
|
268
|
+
}
|
|
269
|
+
const enabled = Boolean(envUrl) || siteHasDatabase;
|
|
270
|
+
// `--branch` can also be supplied via the NETLIFY_DB_BRANCH env var.
|
|
271
|
+
const branch = options.branch ?? process.env.NETLIFY_DB_BRANCH;
|
|
272
|
+
// Resolve what database we're looking at and how to fetch applied migrations.
|
|
273
|
+
let branchLabel;
|
|
274
|
+
let connectionString = null;
|
|
275
|
+
let fetchApplied;
|
|
276
|
+
let cleanup;
|
|
277
|
+
let isLocal = false;
|
|
278
|
+
if (branch) {
|
|
279
|
+
if (!siteId) {
|
|
280
|
+
throw new Error(`The project must be linked with ${netlifyCommand()} link to target a remote branch.`);
|
|
281
|
+
}
|
|
282
|
+
if (!accessToken) {
|
|
283
|
+
throw new Error(`You must be logged in with ${netlifyCommand()} login to target a remote branch.`);
|
|
284
|
+
}
|
|
285
|
+
connectionString = await fetchBranchConnectionString({ siteId, accessToken, basePath }, branch);
|
|
286
|
+
fetchApplied = remoteAppliedMigrations({ siteId, accessToken, basePath, branch });
|
|
287
|
+
branchLabel = branch;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
isLocal = true;
|
|
291
|
+
branchLabel = 'local';
|
|
292
|
+
// If a local database is already running, its connection string is stable
|
|
293
|
+
// and safe to print. Otherwise we still connect (connectToDatabase starts
|
|
294
|
+
// one up) so we can read migration state — we just suppress the
|
|
295
|
+
// connection string in the output because it dies with this process.
|
|
296
|
+
const existing = detectExistingLocalConnectionString(buildDir);
|
|
297
|
+
const connection = await connectToDatabase(buildDir);
|
|
298
|
+
cleanup = connection.cleanup;
|
|
299
|
+
fetchApplied = localAppliedMigrations({ executor: connection.executor });
|
|
300
|
+
if (existing) {
|
|
301
|
+
connectionString = connection.connectionString;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
let status;
|
|
305
|
+
try {
|
|
306
|
+
const applied = await fetchApplied();
|
|
307
|
+
status = computeStatus(applied, local);
|
|
308
|
+
}
|
|
309
|
+
finally {
|
|
310
|
+
if (cleanup) {
|
|
311
|
+
await cleanup();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (options.json) {
|
|
315
|
+
const displayedConnection = connectionString
|
|
316
|
+
? options.showCredentials
|
|
317
|
+
? connectionString
|
|
318
|
+
: redactConnectionString(connectionString)
|
|
319
|
+
: null;
|
|
320
|
+
logJson({
|
|
321
|
+
enabled,
|
|
322
|
+
packageInstalled,
|
|
323
|
+
migrationsPath: migrationsDirectory,
|
|
324
|
+
target: branchLabel,
|
|
325
|
+
database: displayedConnection === null ? null : { connectionString: displayedConnection },
|
|
326
|
+
applied: status.applied.map((m) => ({ version: m.version, name: m.name })),
|
|
327
|
+
pending: status.pending.map((m) => ({ version: m.version, name: m.name })),
|
|
328
|
+
missingOnDisk: status.missingOnDisk.map((m) => ({ version: m.version, name: m.name })),
|
|
329
|
+
outOfOrder: status.outOfOrder,
|
|
330
|
+
});
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const siteInfo = command.netlify.siteInfo;
|
|
334
|
+
renderPretty({
|
|
335
|
+
enabled,
|
|
336
|
+
packageInstalled,
|
|
337
|
+
branchLabel,
|
|
338
|
+
connectionString,
|
|
339
|
+
showCredentials: options.showCredentials ?? false,
|
|
340
|
+
status,
|
|
341
|
+
isLocal,
|
|
342
|
+
hasUrlOverride: Boolean(envUrl),
|
|
343
|
+
migrationsDirectory,
|
|
344
|
+
projectRoot: buildDir,
|
|
345
|
+
adminUrl: siteInfo?.admin_url,
|
|
346
|
+
});
|
|
347
|
+
};
|
|
348
|
+
//# sourceMappingURL=db-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-status.js","sourceRoot":"","sources":["../../../src/commands/database/db-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-errors.d.ts","sourceRoot":"","sources":["../../../../src/commands/database/util/api-errors.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,GAAU,UAAU,QAAQ,KAAG,OAAO,CAAC,MAAM,CAc5E,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const readApiErrorMessage = async (response) => {
|
|
2
|
+
const text = await response.text();
|
|
3
|
+
if (!text) {
|
|
4
|
+
return '';
|
|
5
|
+
}
|
|
6
|
+
try {
|
|
7
|
+
const body = JSON.parse(text);
|
|
8
|
+
if (typeof body.message === 'string' && body.message.trim()) {
|
|
9
|
+
return body.message;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// body is not JSON; fall through to raw text
|
|
14
|
+
}
|
|
15
|
+
return text;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=api-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-errors.js","sourceRoot":"","sources":["../../../../src/commands/database/util/api-errors.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,QAAkB,EAAmB,EAAE;IAC/E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAA;QAC7C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC,OAAO,CAAA;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type SQLExecutor } from '@netlify/dev';
|
|
2
|
+
export interface MigrationFile {
|
|
3
|
+
version: number;
|
|
4
|
+
name: string;
|
|
5
|
+
path: string;
|
|
6
|
+
}
|
|
7
|
+
export type AppliedMigrationsFetcher = () => Promise<MigrationFile[]>;
|
|
8
|
+
interface RemoteOptions {
|
|
9
|
+
siteId: string;
|
|
10
|
+
accessToken: string;
|
|
11
|
+
basePath: string;
|
|
12
|
+
branch: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const remoteAppliedMigrations: (options: RemoteOptions) => AppliedMigrationsFetcher;
|
|
15
|
+
interface LocalOptions {
|
|
16
|
+
executor: SQLExecutor;
|
|
17
|
+
}
|
|
18
|
+
export declare const localAppliedMigrations: (options: LocalOptions) => AppliedMigrationsFetcher;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=applied-migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applied-migrations.d.ts","sourceRoot":"","sources":["../../../../src/commands/database/util/applied-migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAK/C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;AAarE,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAaD,eAAO,MAAM,uBAAuB,GACjC,SAAS,aAAa,KAAG,wBAmBzB,CAAA;AAEH,UAAU,YAAY;IACpB,QAAQ,EAAE,WAAW,CAAA;CACtB;AAED,eAAO,MAAM,sBAAsB,GAChC,SAAS,YAAY,KAAG,wBAmBxB,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { readApiErrorMessage } from './api-errors.js';
|
|
2
|
+
import { MIGRATIONS_TABLE } from './constants.js';
|
|
3
|
+
const MIGRATION_FILE_NAME = 'migration.sql';
|
|
4
|
+
const parseVersion = (name) => {
|
|
5
|
+
const match = /^(\d+)[_-]/.exec(name);
|
|
6
|
+
if (!match) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const parsed = Number.parseInt(match[1], 10);
|
|
10
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
11
|
+
};
|
|
12
|
+
export const remoteAppliedMigrations = (options) => async () => {
|
|
13
|
+
const token = options.accessToken.replace('Bearer ', '');
|
|
14
|
+
const url = new URL(`${options.basePath}/sites/${encodeURIComponent(options.siteId)}/database/migrations`);
|
|
15
|
+
url.searchParams.set('branch', options.branch);
|
|
16
|
+
const response = await fetch(url, {
|
|
17
|
+
headers: {
|
|
18
|
+
Authorization: `Bearer ${token}`,
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
const message = await readApiErrorMessage(response);
|
|
23
|
+
throw new Error(`Failed to fetch applied migrations (${String(response.status)}): ${message}`);
|
|
24
|
+
}
|
|
25
|
+
const data = (await response.json());
|
|
26
|
+
return data.migrations.filter((m) => m.applied).map((m) => ({ version: m.version, name: m.name, path: m.path }));
|
|
27
|
+
};
|
|
28
|
+
export const localAppliedMigrations = (options) => async () => {
|
|
29
|
+
const { rows } = await options.executor.query(`SELECT name FROM ${MIGRATIONS_TABLE} ORDER BY applied_at ASC, name ASC`);
|
|
30
|
+
const migrations = [];
|
|
31
|
+
for (const row of rows) {
|
|
32
|
+
const version = parseVersion(row.name);
|
|
33
|
+
if (version === null) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
migrations.push({
|
|
37
|
+
version,
|
|
38
|
+
name: row.name,
|
|
39
|
+
path: `${row.name}/${MIGRATION_FILE_NAME}`,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return migrations;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=applied-migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applied-migrations.js","sourceRoot":"","sources":["../../../../src/commands/database/util/applied-migrations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAUjD,MAAM,mBAAmB,GAAG,eAAe,CAAA;AAE3C,MAAM,YAAY,GAAG,CAAC,IAAY,EAAiB,EAAE;IACnD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC5C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAChD,CAAC,CAAA;AAoBD,MAAM,CAAC,MAAM,uBAAuB,GAClC,CAAC,OAAsB,EAA4B,EAAE,CACrD,KAAK,IAAI,EAAE;IACT,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,UAAU,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAA;IAC1G,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAE9C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAA;QACnD,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC,CAAA;IAChG,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA2B,CAAA;IAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;AAClH,CAAC,CAAA;AAMH,MAAM,CAAC,MAAM,sBAAsB,GACjC,CAAC,OAAqB,EAA4B,EAAE,CACpD,KAAK,IAAI,EAAE;IACT,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAC3C,oBAAoB,gBAAgB,oCAAoC,CACzE,CAAA;IAED,MAAM,UAAU,GAAoB,EAAE,CAAA;IACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,SAAQ;QACV,CAAC;QACD,UAAU,CAAC,IAAI,CAAC;YACd,OAAO;YACP,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,mBAAmB,EAAE;SAC3C,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/commands/database/util/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,YAAY,CAAA;AAC1C,eAAO,MAAM,gBAAgB,uBAAoC,CAAA;AACjE,eAAO,MAAM,iBAAiB,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/commands/database/util/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAA;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,iBAAiB,aAAa,CAAA;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Client } from 'pg';
|
|
2
|
+
import { type SQLExecutor } from '@netlify/dev';
|
|
3
|
+
interface DBConnection {
|
|
4
|
+
executor: SQLExecutor;
|
|
5
|
+
connectionString: string;
|
|
6
|
+
cleanup: () => Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function connectToDatabase(buildDir: string, urlOverride?: string): Promise<DBConnection>;
|
|
9
|
+
interface RawDBConnection {
|
|
10
|
+
client: Client;
|
|
11
|
+
connectionString: string;
|
|
12
|
+
cleanup: () => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare function detectExistingLocalConnectionString(buildDir: string): string | null;
|
|
15
|
+
export declare const describeError: (err: unknown) => string;
|
|
16
|
+
export declare function connectRawClient(buildDir: string, urlOverride?: string): Promise<RawDBConnection>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=db-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-connection.d.ts","sourceRoot":"","sources":["../../../../src/commands/database/util/db-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAE3B,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAK3D,UAAU,YAAY;IACpB,QAAQ,EAAE,WAAW,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAOrG;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAOD,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOnF;AAMD,eAAO,MAAM,aAAa,GAAI,KAAK,OAAO,KAAG,MAS5C,CAAA;AAeD,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAkEvG"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Client } from 'pg';
|
|
2
|
+
import { NetlifyDev } from '@netlify/dev';
|
|
3
|
+
import { LocalState } from '@netlify/dev-utils';
|
|
4
|
+
import { PgClientExecutor } from './pg-client-executor.js';
|
|
5
|
+
export async function connectToDatabase(buildDir, urlOverride) {
|
|
6
|
+
const { client, connectionString, cleanup } = await connectRawClient(buildDir, urlOverride);
|
|
7
|
+
return {
|
|
8
|
+
executor: new PgClientExecutor(client),
|
|
9
|
+
connectionString,
|
|
10
|
+
cleanup,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// detectExistingLocalConnectionString returns a connection string for an
|
|
14
|
+
// already-available local database (either the NETLIFY_DB_URL env override or
|
|
15
|
+
// the connection string persisted by a running local dev session) without
|
|
16
|
+
// starting a new dev database. Returns null when nothing's currently
|
|
17
|
+
// available — callers should decide whether starting one is worth the cost.
|
|
18
|
+
export function detectExistingLocalConnectionString(buildDir) {
|
|
19
|
+
if (process.env.NETLIFY_DB_URL) {
|
|
20
|
+
return process.env.NETLIFY_DB_URL;
|
|
21
|
+
}
|
|
22
|
+
const state = new LocalState(buildDir);
|
|
23
|
+
const stored = state.get('dbConnectionString');
|
|
24
|
+
return stored ?? null;
|
|
25
|
+
}
|
|
26
|
+
// Unwraps AggregateError's inner errors into a single readable string. pg's
|
|
27
|
+
// connection errors show up this way when the server resolves to multiple
|
|
28
|
+
// addresses (IPv4/IPv6) and every attempt fails — the outer message is empty
|
|
29
|
+
// without this.
|
|
30
|
+
export const describeError = (err) => {
|
|
31
|
+
if (err && typeof err === 'object' && 'errors' in err && Array.isArray(err.errors)) {
|
|
32
|
+
const inner = err.errors
|
|
33
|
+
.map((e) => (e instanceof Error ? e.message : String(e)))
|
|
34
|
+
.filter((msg) => msg.length > 0);
|
|
35
|
+
if (inner.length > 0)
|
|
36
|
+
return inner.join('; ');
|
|
37
|
+
}
|
|
38
|
+
if (err instanceof Error)
|
|
39
|
+
return err.message || err.name || 'unknown error';
|
|
40
|
+
return String(err);
|
|
41
|
+
};
|
|
42
|
+
// Detects pg "can't reach the server" errors. pg wraps multi-address attempts
|
|
43
|
+
// (IPv4 + IPv6) in an AggregateError whose outer message is empty, so we also
|
|
44
|
+
// unwrap .errors when present.
|
|
45
|
+
function isConnectionUnreachableError(err) {
|
|
46
|
+
if (!err || typeof err !== 'object')
|
|
47
|
+
return false;
|
|
48
|
+
const code = err.code;
|
|
49
|
+
if (code === 'ECONNREFUSED' || code === 'ENOTFOUND' || code === 'EHOSTUNREACH')
|
|
50
|
+
return true;
|
|
51
|
+
if ('errors' in err && Array.isArray(err.errors)) {
|
|
52
|
+
return err.errors.some(isConnectionUnreachableError);
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
export async function connectRawClient(buildDir, urlOverride) {
|
|
57
|
+
const existing = urlOverride ?? detectExistingLocalConnectionString(buildDir);
|
|
58
|
+
// Explicit overrides (NETLIFY_DB_URL env var, or a urlOverride argument) are
|
|
59
|
+
// user-supplied and should never be silently discarded on a connection
|
|
60
|
+
// failure — let the error propagate. A persisted `dbConnectionString` in
|
|
61
|
+
// LocalState is different: it's a stale record of a prior `netlify dev` run
|
|
62
|
+
// that may not be running anymore, and we should recover by falling back to
|
|
63
|
+
// starting a fresh NetlifyDev.
|
|
64
|
+
const isUserOverride = Boolean(urlOverride ?? process.env.NETLIFY_DB_URL);
|
|
65
|
+
if (existing) {
|
|
66
|
+
try {
|
|
67
|
+
const client = new Client({ connectionString: existing });
|
|
68
|
+
await client.connect();
|
|
69
|
+
return {
|
|
70
|
+
client,
|
|
71
|
+
connectionString: existing,
|
|
72
|
+
cleanup: () => client.end(),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (isUserOverride || !isConnectionUnreachableError(err)) {
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
// Persisted connection string points at a port that nothing is listening
|
|
80
|
+
// on. Drop the stale record so subsequent calls don't hit the same dead
|
|
81
|
+
// end, and fall through to the NetlifyDev.start() path.
|
|
82
|
+
new LocalState(buildDir).delete('dbConnectionString');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const state = new LocalState(buildDir);
|
|
86
|
+
const netlifyDev = new NetlifyDev({
|
|
87
|
+
projectRoot: buildDir,
|
|
88
|
+
aiGateway: { enabled: false },
|
|
89
|
+
blobs: { enabled: false },
|
|
90
|
+
edgeFunctions: { enabled: false },
|
|
91
|
+
environmentVariables: { enabled: false },
|
|
92
|
+
functions: { enabled: false },
|
|
93
|
+
geolocation: { enabled: false },
|
|
94
|
+
headers: { enabled: false },
|
|
95
|
+
images: { enabled: false },
|
|
96
|
+
redirects: { enabled: false },
|
|
97
|
+
staticFiles: { enabled: false },
|
|
98
|
+
serverAddress: null,
|
|
99
|
+
});
|
|
100
|
+
await netlifyDev.start();
|
|
101
|
+
const connectionString = state.get('dbConnectionString');
|
|
102
|
+
if (!connectionString) {
|
|
103
|
+
await netlifyDev.stop();
|
|
104
|
+
throw new Error('Local database failed to start.');
|
|
105
|
+
}
|
|
106
|
+
const client = new Client({ connectionString });
|
|
107
|
+
await client.connect();
|
|
108
|
+
return {
|
|
109
|
+
client,
|
|
110
|
+
connectionString,
|
|
111
|
+
cleanup: async () => {
|
|
112
|
+
await client.end();
|
|
113
|
+
await netlifyDev.stop();
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=db-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-connection.js","sourceRoot":"","sources":["../../../../src/commands/database/util/db-connection.ts"],"names":[],"mappings":"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"}
|