@depup/netlify-cli 24.11.1-depup.0 → 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.
Files changed (298) hide show
  1. package/README.md +49 -33
  2. package/bin/run.js +29 -9
  3. package/changes.json +119 -55
  4. package/dist/commands/base-command.d.ts.map +1 -1
  5. package/dist/commands/base-command.js +22 -6
  6. package/dist/commands/base-command.js.map +1 -1
  7. package/dist/commands/create/create-action.js +1 -1
  8. package/dist/commands/create/create-action.js.map +1 -1
  9. package/dist/commands/database/database.d.ts +0 -15
  10. package/dist/commands/database/database.d.ts.map +1 -1
  11. package/dist/commands/database/database.js +104 -113
  12. package/dist/commands/database/database.js.map +1 -1
  13. package/dist/commands/database/{connect.d.ts → db-connect.d.ts} +1 -1
  14. package/dist/commands/database/db-connect.d.ts.map +1 -0
  15. package/dist/commands/database/{connect.js → db-connect.js} +4 -4
  16. package/dist/commands/database/db-connect.js.map +1 -0
  17. package/dist/commands/database/db-init.d.ts +6 -0
  18. package/dist/commands/database/db-init.d.ts.map +1 -0
  19. package/dist/commands/database/db-init.js +298 -0
  20. package/dist/commands/database/db-init.js.map +1 -0
  21. package/dist/commands/database/{migrate.d.ts → db-migrate.d.ts} +1 -1
  22. package/dist/commands/database/db-migrate.d.ts.map +1 -0
  23. package/dist/commands/database/{migrate.js → db-migrate.js} +13 -4
  24. package/dist/commands/database/db-migrate.js.map +1 -0
  25. package/dist/commands/database/{migration-new.d.ts → db-migration-new.d.ts} +1 -2
  26. package/dist/commands/database/db-migration-new.d.ts.map +1 -0
  27. package/dist/commands/database/{migration-new.js → db-migration-new.js} +43 -45
  28. package/dist/commands/database/db-migration-new.js.map +1 -0
  29. package/dist/commands/database/{migration-pull.d.ts → db-migration-pull.d.ts} +1 -1
  30. package/dist/commands/database/db-migration-pull.d.ts.map +1 -0
  31. package/dist/commands/database/{migration-pull.js → db-migration-pull.js} +49 -24
  32. package/dist/commands/database/db-migration-pull.js.map +1 -0
  33. package/dist/commands/database/db-migrations-reset.d.ts +7 -0
  34. package/dist/commands/database/db-migrations-reset.d.ts.map +1 -0
  35. package/dist/commands/database/db-migrations-reset.js +108 -0
  36. package/dist/commands/database/db-migrations-reset.js.map +1 -0
  37. package/dist/commands/database/{reset.d.ts → db-reset.d.ts} +1 -1
  38. package/dist/commands/database/db-reset.d.ts.map +1 -0
  39. package/dist/commands/database/{reset.js → db-reset.js} +2 -2
  40. package/dist/commands/database/db-reset.js.map +1 -0
  41. package/dist/commands/database/db-status.d.ts +24 -0
  42. package/dist/commands/database/db-status.d.ts.map +1 -0
  43. package/dist/commands/database/db-status.js +348 -0
  44. package/dist/commands/database/db-status.js.map +1 -0
  45. package/dist/commands/database/util/api-errors.d.ts +2 -0
  46. package/dist/commands/database/util/api-errors.d.ts.map +1 -0
  47. package/dist/commands/database/util/api-errors.js +17 -0
  48. package/dist/commands/database/util/api-errors.js.map +1 -0
  49. package/dist/commands/database/util/applied-migrations.d.ts +20 -0
  50. package/dist/commands/database/util/applied-migrations.d.ts.map +1 -0
  51. package/dist/commands/database/util/applied-migrations.js +44 -0
  52. package/dist/commands/database/util/applied-migrations.js.map +1 -0
  53. package/dist/commands/database/util/constants.d.ts +4 -0
  54. package/dist/commands/database/util/constants.d.ts.map +1 -0
  55. package/dist/commands/database/util/constants.js +4 -0
  56. package/dist/commands/database/util/constants.js.map +1 -0
  57. package/dist/commands/database/util/db-connection.d.ts +18 -0
  58. package/dist/commands/database/util/db-connection.d.ts.map +1 -0
  59. package/dist/commands/database/util/db-connection.js +117 -0
  60. package/dist/commands/database/util/db-connection.js.map +1 -0
  61. package/dist/commands/database/util/init-data.d.ts +8 -0
  62. package/dist/commands/database/util/init-data.d.ts.map +1 -0
  63. package/dist/commands/database/util/init-data.js +47 -0
  64. package/dist/commands/database/util/init-data.js.map +1 -0
  65. package/dist/commands/database/util/meta-commands.d.ts.map +1 -0
  66. package/dist/commands/database/{meta-commands.js → util/meta-commands.js} +1 -1
  67. package/dist/commands/database/util/meta-commands.js.map +1 -0
  68. package/dist/commands/database/util/migrations-path.d.ts +4 -0
  69. package/dist/commands/database/util/migrations-path.d.ts.map +1 -0
  70. package/dist/commands/database/util/migrations-path.js +19 -0
  71. package/dist/commands/database/util/migrations-path.js.map +1 -0
  72. package/dist/commands/database/util/package-json.d.ts +2 -0
  73. package/dist/commands/database/util/package-json.d.ts.map +1 -0
  74. package/dist/commands/database/util/package-json.js +16 -0
  75. package/dist/commands/database/util/package-json.js.map +1 -0
  76. package/dist/commands/database/util/packages.d.ts +15 -0
  77. package/dist/commands/database/util/packages.d.ts.map +1 -0
  78. package/dist/commands/database/util/packages.js +59 -0
  79. package/dist/commands/database/util/packages.js.map +1 -0
  80. package/dist/commands/database/util/paths.d.ts +2 -0
  81. package/dist/commands/database/util/paths.d.ts.map +1 -0
  82. package/dist/commands/database/util/paths.js +13 -0
  83. package/dist/commands/database/util/paths.js.map +1 -0
  84. package/dist/commands/database/util/pg-client-executor.d.ts.map +1 -0
  85. package/dist/commands/database/util/pg-client-executor.js.map +1 -0
  86. package/dist/commands/database/util/psql-formatter.d.ts.map +1 -0
  87. package/dist/commands/database/util/psql-formatter.js.map +1 -0
  88. package/dist/commands/database/util/spawn-async.d.ts +3 -0
  89. package/dist/commands/database/util/spawn-async.d.ts.map +1 -0
  90. package/dist/commands/database/util/spawn-async.js +16 -0
  91. package/dist/commands/database/util/spawn-async.js.map +1 -0
  92. package/dist/commands/database/util/timestamp.d.ts +2 -0
  93. package/dist/commands/database/util/timestamp.d.ts.map +1 -0
  94. package/dist/commands/database/util/timestamp.js +7 -0
  95. package/dist/commands/database/util/timestamp.js.map +1 -0
  96. package/dist/commands/deploy/deploy.d.ts.map +1 -1
  97. package/dist/commands/deploy/deploy.js +16 -5
  98. package/dist/commands/deploy/deploy.js.map +1 -1
  99. package/dist/commands/dev/dev.d.ts.map +1 -1
  100. package/dist/commands/dev/dev.js +2 -0
  101. package/dist/commands/dev/dev.js.map +1 -1
  102. package/dist/commands/dev/programmatic-netlify-dev.d.ts +2 -1
  103. package/dist/commands/dev/programmatic-netlify-dev.d.ts.map +1 -1
  104. package/dist/commands/dev/programmatic-netlify-dev.js +3 -4
  105. package/dist/commands/dev/programmatic-netlify-dev.js.map +1 -1
  106. package/dist/commands/functions/functions-create.d.ts +1 -1
  107. package/dist/commands/functions/functions-create.d.ts.map +1 -1
  108. package/dist/commands/functions/functions-create.js +80 -17
  109. package/dist/commands/functions/functions-create.js.map +1 -1
  110. package/dist/commands/functions/functions.d.ts.map +1 -1
  111. package/dist/commands/functions/functions.js +2 -0
  112. package/dist/commands/functions/functions.js.map +1 -1
  113. package/dist/commands/init/init.js +1 -1
  114. package/dist/commands/init/init.js.map +1 -1
  115. package/dist/commands/link/link.js +1 -1
  116. package/dist/commands/link/link.js.map +1 -1
  117. package/dist/commands/login/login.d.ts.map +1 -1
  118. package/dist/commands/login/login.js +0 -6
  119. package/dist/commands/login/login.js.map +1 -1
  120. package/dist/commands/logs/index.d.ts +0 -2
  121. package/dist/commands/logs/index.d.ts.map +1 -1
  122. package/dist/commands/logs/index.js +95 -29
  123. package/dist/commands/logs/index.js.map +1 -1
  124. package/dist/commands/logs/log-api.d.ts +64 -0
  125. package/dist/commands/logs/log-api.d.ts.map +1 -0
  126. package/dist/commands/logs/log-api.js +200 -0
  127. package/dist/commands/logs/log-api.js.map +1 -0
  128. package/dist/commands/logs/logs.d.ts +4 -0
  129. package/dist/commands/logs/logs.d.ts.map +1 -0
  130. package/dist/commands/logs/logs.js +302 -0
  131. package/dist/commands/logs/logs.js.map +1 -0
  132. package/dist/commands/logs/sources/deploy.d.ts +13 -0
  133. package/dist/commands/logs/sources/deploy.d.ts.map +1 -0
  134. package/dist/commands/logs/sources/deploy.js +71 -0
  135. package/dist/commands/logs/sources/deploy.js.map +1 -0
  136. package/dist/commands/logs/sources/edge-functions.d.ts +17 -0
  137. package/dist/commands/logs/sources/edge-functions.d.ts.map +1 -0
  138. package/dist/commands/logs/sources/edge-functions.js +71 -0
  139. package/dist/commands/logs/sources/edge-functions.js.map +1 -0
  140. package/dist/commands/logs/sources/functions.d.ts +22 -0
  141. package/dist/commands/logs/sources/functions.d.ts.map +1 -0
  142. package/dist/commands/logs/sources/functions.js +75 -0
  143. package/dist/commands/logs/sources/functions.js.map +1 -0
  144. package/dist/commands/main.d.ts.map +1 -1
  145. package/dist/commands/main.js +38 -19
  146. package/dist/commands/main.js.map +1 -1
  147. package/dist/commands/serve/serve.d.ts.map +1 -1
  148. package/dist/commands/serve/serve.js +1 -0
  149. package/dist/commands/serve/serve.js.map +1 -1
  150. package/dist/commands/sites/sites-create.js +1 -1
  151. package/dist/commands/sites/sites-create.js.map +1 -1
  152. package/dist/lib/blobs/blobs.js +2 -2
  153. package/dist/lib/blobs/blobs.js.map +1 -1
  154. package/dist/lib/edge-functions/proxy.d.ts +2 -1
  155. package/dist/lib/edge-functions/proxy.d.ts.map +1 -1
  156. package/dist/lib/edge-functions/proxy.js +6 -2
  157. package/dist/lib/edge-functions/proxy.js.map +1 -1
  158. package/dist/lib/edge-functions/registry.d.ts +5 -1
  159. package/dist/lib/edge-functions/registry.d.ts.map +1 -1
  160. package/dist/lib/edge-functions/registry.js +24 -3
  161. package/dist/lib/edge-functions/registry.js.map +1 -1
  162. package/dist/lib/extensions.js +1 -1
  163. package/dist/lib/extensions.js.map +1 -1
  164. package/dist/lib/functions/netlify-function.d.ts +2 -2
  165. package/dist/lib/functions/netlify-function.d.ts.map +1 -1
  166. package/dist/lib/functions/netlify-function.js +16 -5
  167. package/dist/lib/functions/netlify-function.js.map +1 -1
  168. package/dist/lib/functions/registry.d.ts.map +1 -1
  169. package/dist/lib/functions/registry.js +1 -1
  170. package/dist/lib/functions/registry.js.map +1 -1
  171. package/dist/lib/functions/runtimes/index.d.ts +1 -0
  172. package/dist/lib/functions/runtimes/index.d.ts.map +1 -1
  173. package/dist/lib/functions/runtimes/index.js.map +1 -1
  174. package/dist/lib/functions/runtimes/js/builders/zisi.d.ts +1 -0
  175. package/dist/lib/functions/runtimes/js/builders/zisi.d.ts.map +1 -1
  176. package/dist/lib/functions/runtimes/js/builders/zisi.js +2 -1
  177. package/dist/lib/functions/runtimes/js/builders/zisi.js.map +1 -1
  178. package/dist/lib/functions/runtimes/js/index.d.ts.map +1 -1
  179. package/dist/tsconfig.build.tsbuildinfo +1 -1
  180. package/dist/utils/deploy/hash-fns.d.ts.map +1 -1
  181. package/dist/utils/deploy/hash-fns.js +12 -1
  182. package/dist/utils/deploy/hash-fns.js.map +1 -1
  183. package/dist/utils/deploy/upload-source-zip.d.ts.map +1 -1
  184. package/dist/utils/deploy/upload-source-zip.js +20 -11
  185. package/dist/utils/deploy/upload-source-zip.js.map +1 -1
  186. package/dist/utils/dev.js +1 -1
  187. package/dist/utils/dev.js.map +1 -1
  188. package/dist/utils/framework-server.d.ts.map +1 -1
  189. package/dist/utils/framework-server.js +2 -1
  190. package/dist/utils/framework-server.js.map +1 -1
  191. package/dist/utils/init/utils.d.ts.map +1 -1
  192. package/dist/utils/live-tunnel.js +2 -2
  193. package/dist/utils/live-tunnel.js.map +1 -1
  194. package/dist/utils/object-utilities.d.ts +64 -0
  195. package/dist/utils/object-utilities.d.ts.map +1 -0
  196. package/dist/utils/object-utilities.js +93 -0
  197. package/dist/utils/object-utilities.js.map +1 -0
  198. package/dist/utils/open-browser.d.ts +1 -1
  199. package/dist/utils/open-browser.d.ts.map +1 -1
  200. package/dist/utils/open-browser.js +4 -2
  201. package/dist/utils/open-browser.js.map +1 -1
  202. package/dist/utils/proxy-server.d.ts +2 -1
  203. package/dist/utils/proxy-server.d.ts.map +1 -1
  204. package/dist/utils/proxy-server.js +2 -1
  205. package/dist/utils/proxy-server.js.map +1 -1
  206. package/dist/utils/proxy.d.ts +2 -1
  207. package/dist/utils/proxy.d.ts.map +1 -1
  208. package/dist/utils/proxy.js +11 -2
  209. package/dist/utils/proxy.js.map +1 -1
  210. package/dist/utils/shell.d.ts +7 -0
  211. package/dist/utils/shell.d.ts.map +1 -1
  212. package/dist/utils/shell.js +36 -7
  213. package/dist/utils/shell.js.map +1 -1
  214. package/dist/utils/telemetry/index.d.ts +1 -1
  215. package/dist/utils/telemetry/index.d.ts.map +1 -1
  216. package/dist/utils/telemetry/index.js +1 -1
  217. package/dist/utils/telemetry/index.js.map +1 -1
  218. package/dist/utils/telemetry/report-error.d.ts +1 -0
  219. package/dist/utils/telemetry/report-error.d.ts.map +1 -1
  220. package/dist/utils/telemetry/report-error.js +15 -2
  221. package/dist/utils/telemetry/report-error.js.map +1 -1
  222. package/dist/utils/zip.d.ts +4 -0
  223. package/dist/utils/zip.d.ts.map +1 -0
  224. package/dist/utils/zip.js +114 -0
  225. package/dist/utils/zip.js.map +1 -0
  226. package/functions-templates/javascript/scheduled-function/package.json +1 -1
  227. package/functions-templates/typescript/database/.netlify-function-template.mjs +5 -0
  228. package/functions-templates/typescript/database/package-lock.json +357 -0
  229. package/functions-templates/typescript/database/package.json +23 -0
  230. package/functions-templates/typescript/database/{{name}}.mts +24 -0
  231. package/functions-templates/typescript/database-drizzle/.netlify-function-template.mjs +5 -0
  232. package/functions-templates/typescript/database-drizzle/package-lock.json +520 -0
  233. package/functions-templates/typescript/database-drizzle/package.json +25 -0
  234. package/functions-templates/typescript/database-drizzle/{{name}}.mts +26 -0
  235. package/functions-templates/typescript/hello-world/package-lock.json +15 -15
  236. package/functions-templates/typescript/hello-world/package.json +1 -1
  237. package/functions-templates/typescript/scheduled-function/package.json +1 -1
  238. package/package.json +271 -150
  239. package/scripts/netlifyPackage.js +2 -26
  240. package/dist/commands/database/connect.d.ts.map +0 -1
  241. package/dist/commands/database/connect.js.map +0 -1
  242. package/dist/commands/database/constants.d.ts +0 -4
  243. package/dist/commands/database/constants.d.ts.map +0 -1
  244. package/dist/commands/database/constants.js +0 -4
  245. package/dist/commands/database/constants.js.map +0 -1
  246. package/dist/commands/database/db-connection.d.ts +0 -15
  247. package/dist/commands/database/db-connection.d.ts.map +0 -1
  248. package/dist/commands/database/db-connection.js +0 -65
  249. package/dist/commands/database/db-connection.js.map +0 -1
  250. package/dist/commands/database/drizzle.d.ts +0 -3
  251. package/dist/commands/database/drizzle.d.ts.map +0 -1
  252. package/dist/commands/database/drizzle.js +0 -96
  253. package/dist/commands/database/drizzle.js.map +0 -1
  254. package/dist/commands/database/init.d.ts +0 -9
  255. package/dist/commands/database/init.d.ts.map +0 -1
  256. package/dist/commands/database/init.js +0 -124
  257. package/dist/commands/database/init.js.map +0 -1
  258. package/dist/commands/database/meta-commands.d.ts.map +0 -1
  259. package/dist/commands/database/meta-commands.js.map +0 -1
  260. package/dist/commands/database/migrate.d.ts.map +0 -1
  261. package/dist/commands/database/migrate.js.map +0 -1
  262. package/dist/commands/database/migration-new.d.ts.map +0 -1
  263. package/dist/commands/database/migration-new.js.map +0 -1
  264. package/dist/commands/database/migration-pull.d.ts.map +0 -1
  265. package/dist/commands/database/migration-pull.js.map +0 -1
  266. package/dist/commands/database/pg-client-executor.d.ts.map +0 -1
  267. package/dist/commands/database/pg-client-executor.js.map +0 -1
  268. package/dist/commands/database/psql-formatter.d.ts.map +0 -1
  269. package/dist/commands/database/psql-formatter.js.map +0 -1
  270. package/dist/commands/database/reset.d.ts.map +0 -1
  271. package/dist/commands/database/reset.js.map +0 -1
  272. package/dist/commands/database/status.d.ts +0 -4
  273. package/dist/commands/database/status.d.ts.map +0 -1
  274. package/dist/commands/database/status.js +0 -71
  275. package/dist/commands/database/status.js.map +0 -1
  276. package/dist/commands/database/utils.d.ts +0 -75
  277. package/dist/commands/database/utils.d.ts.map +0 -1
  278. package/dist/commands/database/utils.js +0 -172
  279. package/dist/commands/database/utils.js.map +0 -1
  280. package/dist/commands/logs/functions.d.ts +0 -4
  281. package/dist/commands/logs/functions.d.ts.map +0 -1
  282. package/dist/commands/logs/functions.js +0 -79
  283. package/dist/commands/logs/functions.js.map +0 -1
  284. package/functions-templates/go/hello-world/.netlify-function-template.mjs +0 -6
  285. package/functions-templates/go/hello-world/go.mod +0 -5
  286. package/functions-templates/go/hello-world/go.sum +0 -22
  287. package/functions-templates/go/hello-world/main.go +0 -24
  288. package/functions-templates/rust/hello-world/.netlify-function-template.mjs +0 -6
  289. package/functions-templates/rust/hello-world/Cargo.lock +0 -1149
  290. package/functions-templates/rust/hello-world/Cargo.toml +0 -14
  291. package/functions-templates/rust/hello-world/src/main.rs +0 -29
  292. package/npm-shrinkwrap.json +0 -12720
  293. package/scripts/prepublishOnly.js +0 -29
  294. /package/dist/commands/database/{meta-commands.d.ts → util/meta-commands.d.ts} +0 -0
  295. /package/dist/commands/database/{pg-client-executor.d.ts → util/pg-client-executor.d.ts} +0 -0
  296. /package/dist/commands/database/{pg-client-executor.js → util/pg-client-executor.js} +0 -0
  297. /package/dist/commands/database/{psql-formatter.d.ts → util/psql-formatter.d.ts} +0 -0
  298. /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,2 @@
1
+ export declare const readApiErrorMessage: (response: Response) => Promise<string>;
2
+ //# sourceMappingURL=api-errors.d.ts.map
@@ -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,4 @@
1
+ export declare const MIGRATIONS_SCHEMA = "netlify";
2
+ export declare const MIGRATIONS_TABLE = "netlify.migrations";
3
+ export declare const PRODUCTION_BRANCH = "production";
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -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,4 @@
1
+ export const MIGRATIONS_SCHEMA = 'netlify';
2
+ export const MIGRATIONS_TABLE = `${MIGRATIONS_SCHEMA}.migrations`;
3
+ export const PRODUCTION_BRANCH = 'production';
4
+ //# sourceMappingURL=constants.js.map
@@ -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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAE3B,OAAO,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAQ1D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,WAAoB;IAC5E,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAC3F,OAAO;QACL,QAAQ,EAAE,IAAI,gBAAgB,CAAC,MAAM,CAAC;QACtC,gBAAgB;QAChB,OAAO;KACR,CAAA;AACH,CAAC;AAQD,yEAAyE;AACzE,8EAA8E;AAC9E,0EAA0E;AAC1E,qEAAqE;AACrE,4EAA4E;AAC5E,MAAM,UAAU,mCAAmC,CAAC,QAAgB;IAClE,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;IACnC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IAC9C,OAAO,MAAM,IAAI,IAAI,CAAA;AACvB,CAAC;AAED,4EAA4E;AAC5E,0EAA0E;AAC1E,6EAA6E;AAC7E,gBAAgB;AAChB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAY,EAAU,EAAE;IACpD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,CAAE,GAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACvG,MAAM,KAAK,GAAI,GAAsB,CAAC,MAAM;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aACxD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC;IACD,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,eAAe,CAAA;IAC3E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;AACpB,CAAC,CAAA;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,+BAA+B;AAC/B,SAAS,4BAA4B,CAAC,GAAY;IAChD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACjD,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAA;IAChD,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,IAAI,CAAA;IAC3F,IAAI,QAAQ,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,CAAE,GAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACrE,OAAQ,GAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;IAC1E,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,WAAoB;IAC3E,MAAM,QAAQ,GAAG,WAAW,IAAI,mCAAmC,CAAC,QAAQ,CAAC,CAAA;IAC7E,6EAA6E;IAC7E,uEAAuE;IACvE,yEAAyE;IACzE,4EAA4E;IAC5E,4EAA4E;IAC5E,+BAA+B;IAC/B,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAEzE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAA;YACzD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;YACtB,OAAO;gBACL,MAAM;gBACN,gBAAgB,EAAE,QAAQ;gBAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;aAC5B,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,cAAc,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzD,MAAM,GAAG,CAAA;YACX,CAAC;YACD,yEAAyE;YACzE,wEAAwE;YACxE,wDAAwD;YACxD,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAA;IAEtC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC;QAChC,WAAW,EAAE,QAAQ;QACrB,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC7B,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QACzB,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QACjC,oBAAoB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QACxC,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC7B,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC/B,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3B,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC1B,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC7B,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QAC/B,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IAEF,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;IAExB,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACxD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,UAAU,CAAC,IAAI,EAAE,CAAA;QACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAC/C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;IAEtB,OAAO;QACL,MAAM;QACN,gBAAgB;QAChB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,MAAM,CAAC,GAAG,EAAE,CAAA;YAClB,MAAM,UAAU,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;KACF,CAAA;AACH,CAAC"}