pgpm 5.7.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,7 @@ const core_1 = require("@pgpmjs/core");
11
11
  const env_1 = require("@pgpmjs/env");
12
12
  const types_1 = require("@pgpmjs/types");
13
13
  const inquirerer_1 = require("inquirerer");
14
+ const utils_1 = require("../../utils");
14
15
  const boilerplate_1 = require("./boilerplate");
15
16
  const DEFAULT_MOTD = `
16
17
  | _ _
@@ -80,7 +81,7 @@ async function handleInit(argv, prompter) {
80
81
  pglite: Boolean(argv.pglite),
81
82
  });
82
83
  const branch = argv.fromBranch;
83
- const noTty = Boolean(argv.noTty || argv['no-tty'] || argv.tty === false || process.env.CI === 'true');
84
+ const noTty = (0, utils_1.isNoTtyRequested)(argv);
84
85
  const useBoilerplatePrompt = Boolean(argv.boilerplate);
85
86
  const createWorkspace = Boolean(argv.createWorkspace || argv['create-workspace'] || argv.w);
86
87
  const useNpxSkills = Boolean(argv.useSkills || argv['use-skills']);
@@ -437,7 +438,7 @@ async function handleModuleInit(argv, prompter, ctx, wasExplicitModuleRequest =
437
438
  workspaceTypeName = workspaceType.toUpperCase();
438
439
  }
439
440
  if (!resolvedWorkspacePath) {
440
- const noTty = Boolean(argv.noTty || argv['no-tty'] || argv.tty === false || process.env.CI === 'true');
441
+ const noTty = (0, utils_1.isNoTtyRequested)(argv);
441
442
  // Handle --create-workspace flag: create workspace first, then module
442
443
  if (ctx.createWorkspace && (workspaceType === 'pgpm' || workspaceType === 'pnpm')) {
443
444
  // Resolve workspace template repo with fallback to default
@@ -8,6 +8,7 @@ const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const core_1 = require("@pgpmjs/core");
10
10
  const inquirerer_1 = require("inquirerer");
11
+ const utils_1 = require("../../utils");
11
12
  const DEFAULT_MOTD = `
12
13
  | _ _
13
14
  === |.===. '\\-//\`
@@ -48,7 +49,7 @@ async function runWorkspaceSetup(argv, prompter) {
48
49
  workspaceName: answers.name
49
50
  },
50
51
  toolName: core_1.DEFAULT_TEMPLATE_TOOL_NAME,
51
- noTty: Boolean(argv.noTty || argv['no-tty'] || argv.tty === false || process.env.CI === 'true'),
52
+ noTty: (0, utils_1.isNoTtyRequested)(argv),
52
53
  cwd,
53
54
  prompter
54
55
  });
@@ -0,0 +1,3 @@
1
+ import { CLIOptions, Inquirerer } from 'inquirerer';
2
+ declare const _default: (argv: Partial<Record<string, any>>, _prompter: Inquirerer, _options: CLIOptions) => Promise<Partial<Record<string, any>>>;
3
+ export default _default;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@pgpmjs/core");
4
+ const syncVersionsUsageText = `
5
+ Sync Versions Command:
6
+
7
+ pgpm sync-versions [OPTIONS]
8
+
9
+ Sync extension metadata (.control default_version, Makefile sql filename,
10
+ and the sql/<name>--<version>.sql bundle) to each module's package.json
11
+ version. Inside a module, syncs just that module; at a workspace root,
12
+ syncs every workspace module.
13
+
14
+ Options:
15
+ --help, -h Show this help message
16
+ --check Report version skew without writing; exits non-zero if skewed
17
+ --cwd <directory> Working directory (default: current directory)
18
+
19
+ Examples:
20
+ pgpm sync-versions Sync all out-of-sync modules
21
+ pgpm sync-versions --check Fail if any module's metadata is out of sync (for CI)
22
+ `;
23
+ exports.default = async (argv, _prompter, _options) => {
24
+ // Show usage if explicitly requested
25
+ if (argv.help || argv.h) {
26
+ console.log(syncVersionsUsageText);
27
+ process.exit(0);
28
+ }
29
+ const cwd = argv.cwd ?? process.cwd();
30
+ const check = Boolean(argv.check);
31
+ const project = new core_1.PgpmPackage(cwd);
32
+ const result = await project.syncVersions({ check });
33
+ if (check) {
34
+ if (result.skewed.length > 0) {
35
+ console.log(`${result.skewed.length} module(s) out of sync:`);
36
+ for (const status of result.skewed) {
37
+ console.log(` ${status.name}: package.json ${status.packageVersion} != control ${status.controlVersion}` +
38
+ (status.sqlFileExists ? '' : ` (missing sql/${status.name}--${status.packageVersion}.sql)`));
39
+ }
40
+ process.exit(1);
41
+ }
42
+ console.log(`All ${result.ok.length} module(s) in sync.`);
43
+ return argv;
44
+ }
45
+ if (result.synced.length === 0) {
46
+ console.log(`All ${result.ok.length} module(s) already in sync.`);
47
+ }
48
+ else {
49
+ console.log(`Synced ${result.synced.length} module(s); ${result.ok.length} already in sync.`);
50
+ }
51
+ return argv;
52
+ };
package/commands.js CHANGED
@@ -29,6 +29,7 @@ const remove_1 = __importDefault(require("./commands/remove"));
29
29
  const rename_1 = __importDefault(require("./commands/rename"));
30
30
  const revert_1 = __importDefault(require("./commands/revert"));
31
31
  const slice_1 = __importDefault(require("./commands/slice"));
32
+ const sync_versions_1 = __importDefault(require("./commands/sync-versions"));
32
33
  const tag_1 = __importDefault(require("./commands/tag"));
33
34
  const test_packages_1 = __importDefault(require("./commands/test-packages"));
34
35
  const tune_1 = __importDefault(require("./commands/tune"));
@@ -72,6 +73,7 @@ const createPgpmCommandMap = (skipPgTeardown = false) => {
72
73
  analyze: pgt(analyze_1.default),
73
74
  rename: pgt(rename_1.default),
74
75
  slice: slice_1.default,
76
+ 'sync-versions': sync_versions_1.default,
75
77
  'test-packages': pgt(test_packages_1.default),
76
78
  tune: pgt(tune_1.default),
77
79
  upgrade: pgt(upgrade_1.default),
@@ -5,6 +5,7 @@ import { DEFAULT_TEMPLATE_REPO, DEFAULT_TEMPLATE_TOOL_NAME, inspectTemplate, Pgp
5
5
  import { resolveWorkspaceByType } from '@pgpmjs/env';
6
6
  import { errors } from '@pgpmjs/types';
7
7
  import { registerDefaultResolver } from 'inquirerer';
8
+ import { isNoTtyRequested } from '../../utils';
8
9
  import { persistBoilerplateSource, readBoilerplateSource, resolveInitTemplateRepo, } from './boilerplate';
9
10
  const DEFAULT_MOTD = `
10
11
  | _ _
@@ -73,7 +74,7 @@ async function handleInit(argv, prompter) {
73
74
  pglite: Boolean(argv.pglite),
74
75
  });
75
76
  const branch = argv.fromBranch;
76
- const noTty = Boolean(argv.noTty || argv['no-tty'] || argv.tty === false || process.env.CI === 'true');
77
+ const noTty = isNoTtyRequested(argv);
77
78
  const useBoilerplatePrompt = Boolean(argv.boilerplate);
78
79
  const createWorkspace = Boolean(argv.createWorkspace || argv['create-workspace'] || argv.w);
79
80
  const useNpxSkills = Boolean(argv.useSkills || argv['use-skills']);
@@ -430,7 +431,7 @@ async function handleModuleInit(argv, prompter, ctx, wasExplicitModuleRequest =
430
431
  workspaceTypeName = workspaceType.toUpperCase();
431
432
  }
432
433
  if (!resolvedWorkspacePath) {
433
- const noTty = Boolean(argv.noTty || argv['no-tty'] || argv.tty === false || process.env.CI === 'true');
434
+ const noTty = isNoTtyRequested(argv);
434
435
  // Handle --create-workspace flag: create workspace first, then module
435
436
  if (ctx.createWorkspace && (workspaceType === 'pgpm' || workspaceType === 'pnpm')) {
436
437
  // Resolve workspace template repo with fallback to default
@@ -2,6 +2,7 @@ import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { DEFAULT_TEMPLATE_REPO, DEFAULT_TEMPLATE_TOOL_NAME, scaffoldTemplate, sluggify } from '@pgpmjs/core';
4
4
  import { registerDefaultResolver } from 'inquirerer';
5
+ import { isNoTtyRequested } from '../../utils';
5
6
  const DEFAULT_MOTD = `
6
7
  | _ _
7
8
  === |.===. '\\-//\`
@@ -42,7 +43,7 @@ export default async function runWorkspaceSetup(argv, prompter) {
42
43
  workspaceName: answers.name
43
44
  },
44
45
  toolName: DEFAULT_TEMPLATE_TOOL_NAME,
45
- noTty: Boolean(argv.noTty || argv['no-tty'] || argv.tty === false || process.env.CI === 'true'),
46
+ noTty: isNoTtyRequested(argv),
46
47
  cwd,
47
48
  prompter
48
49
  });
@@ -0,0 +1,50 @@
1
+ import { PgpmPackage } from '@pgpmjs/core';
2
+ const syncVersionsUsageText = `
3
+ Sync Versions Command:
4
+
5
+ pgpm sync-versions [OPTIONS]
6
+
7
+ Sync extension metadata (.control default_version, Makefile sql filename,
8
+ and the sql/<name>--<version>.sql bundle) to each module's package.json
9
+ version. Inside a module, syncs just that module; at a workspace root,
10
+ syncs every workspace module.
11
+
12
+ Options:
13
+ --help, -h Show this help message
14
+ --check Report version skew without writing; exits non-zero if skewed
15
+ --cwd <directory> Working directory (default: current directory)
16
+
17
+ Examples:
18
+ pgpm sync-versions Sync all out-of-sync modules
19
+ pgpm sync-versions --check Fail if any module's metadata is out of sync (for CI)
20
+ `;
21
+ export default async (argv, _prompter, _options) => {
22
+ // Show usage if explicitly requested
23
+ if (argv.help || argv.h) {
24
+ console.log(syncVersionsUsageText);
25
+ process.exit(0);
26
+ }
27
+ const cwd = argv.cwd ?? process.cwd();
28
+ const check = Boolean(argv.check);
29
+ const project = new PgpmPackage(cwd);
30
+ const result = await project.syncVersions({ check });
31
+ if (check) {
32
+ if (result.skewed.length > 0) {
33
+ console.log(`${result.skewed.length} module(s) out of sync:`);
34
+ for (const status of result.skewed) {
35
+ console.log(` ${status.name}: package.json ${status.packageVersion} != control ${status.controlVersion}` +
36
+ (status.sqlFileExists ? '' : ` (missing sql/${status.name}--${status.packageVersion}.sql)`));
37
+ }
38
+ process.exit(1);
39
+ }
40
+ console.log(`All ${result.ok.length} module(s) in sync.`);
41
+ return argv;
42
+ }
43
+ if (result.synced.length === 0) {
44
+ console.log(`All ${result.ok.length} module(s) already in sync.`);
45
+ }
46
+ else {
47
+ console.log(`Synced ${result.synced.length} module(s); ${result.ok.length} already in sync.`);
48
+ }
49
+ return argv;
50
+ };
package/esm/commands.js CHANGED
@@ -23,6 +23,7 @@ import remove from './commands/remove';
23
23
  import renameCmd from './commands/rename';
24
24
  import revert from './commands/revert';
25
25
  import slice from './commands/slice';
26
+ import syncVersions from './commands/sync-versions';
26
27
  import tag from './commands/tag';
27
28
  import testPackages from './commands/test-packages';
28
29
  import tune from './commands/tune';
@@ -66,6 +67,7 @@ export const createPgpmCommandMap = (skipPgTeardown = false) => {
66
67
  analyze: pgt(analyze),
67
68
  rename: pgt(renameCmd),
68
69
  slice,
70
+ 'sync-versions': syncVersions,
69
71
  'test-packages': pgt(testPackages),
70
72
  tune: pgt(tune),
71
73
  upgrade: pgt(upgrade),
package/esm/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { CLI, getPackageJson } from 'inquirerer';
3
3
  import { commands, createPgpmCommandMap } from './commands';
4
+ import { detectNoTtyFromProcess } from './utils';
4
5
  export { createInitUsageText } from './commands/init';
5
6
  export { createPgpmCommandMap };
6
7
  export { default as add } from './commands/add';
@@ -49,7 +50,7 @@ if (require.main === module) {
49
50
  console.log(pkg.version);
50
51
  process.exit(0);
51
52
  }
52
- const app = new CLI(commands, options);
53
+ const app = new CLI(commands, { ...options, noTty: detectNoTtyFromProcess() });
53
54
  app.run().then(() => {
54
55
  }).catch(error => {
55
56
  console.error('Unexpected error:', error);
@@ -12,6 +12,7 @@ export const usageText = `
12
12
  extension Manage module dependencies
13
13
  plan Generate module deployment plans
14
14
  package Package module for distribution
15
+ sync-versions Sync .control/Makefile/sql metadata to package.json versions
15
16
  export Export database migrations from existing databases
16
17
  update Update pgpm to the latest version
17
18
  cache Manage cached templates (clean)
@@ -6,3 +6,4 @@ export * from './driver';
6
6
  export * from './module-utils';
7
7
  export * from './npm-version';
8
8
  export * from './package-alias';
9
+ export * from './tty';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Determine whether the CLI should run in non-interactive (noTty) mode from
3
+ * parsed argv and the environment. Minimist parses `--no-tty` as `tty: false`.
4
+ */
5
+ export const isNoTtyRequested = (argv) => Boolean(argv.noTty ||
6
+ argv['no-tty'] ||
7
+ argv.tty === false ||
8
+ process.env.CI === 'true');
9
+ /**
10
+ * Detect noTty mode from raw process argv, before minimist parsing. Used at
11
+ * CLI construction time so the shared prompter itself is non-interactive.
12
+ */
13
+ export const detectNoTtyFromProcess = (argv = process.argv) => argv.includes('--no-tty') ||
14
+ argv.includes('--noTty') ||
15
+ process.env.CI === 'true';
package/index.js CHANGED
@@ -22,6 +22,7 @@ exports.options = exports.verify = exports.testPackages = exports.tag = exports.
22
22
  const inquirerer_1 = require("inquirerer");
23
23
  const commands_1 = require("./commands");
24
24
  Object.defineProperty(exports, "createPgpmCommandMap", { enumerable: true, get: function () { return commands_1.createPgpmCommandMap; } });
25
+ const utils_1 = require("./utils");
25
26
  var init_1 = require("./commands/init");
26
27
  Object.defineProperty(exports, "createInitUsageText", { enumerable: true, get: function () { return init_1.createInitUsageText; } });
27
28
  var add_1 = require("./commands/add");
@@ -92,7 +93,7 @@ if (require.main === module) {
92
93
  console.log(pkg.version);
93
94
  process.exit(0);
94
95
  }
95
- const app = new inquirerer_1.CLI(commands_1.commands, exports.options);
96
+ const app = new inquirerer_1.CLI(commands_1.commands, { ...exports.options, noTty: (0, utils_1.detectNoTtyFromProcess)() });
96
97
  app.run().then(() => {
97
98
  }).catch(error => {
98
99
  console.error('Unexpected error:', error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pgpm",
3
- "version": "5.7.0",
3
+ "version": "5.8.1",
4
4
  "author": "Constructive <developers@constructive.io>",
5
5
  "description": "PostgreSQL Package Manager - Database migration and package management CLI",
6
6
  "main": "index.js",
@@ -46,9 +46,9 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@inquirerer/utils": "^3.3.9",
49
- "@pgpmjs/core": "^7.8.0",
49
+ "@pgpmjs/core": "^7.9.1",
50
50
  "@pgpmjs/env": "^2.33.0",
51
- "@pgpmjs/export": "^1.8.0",
51
+ "@pgpmjs/export": "^1.8.2",
52
52
  "@pgpmjs/logger": "^2.18.0",
53
53
  "@pgpmjs/slice": "^0.5.0",
54
54
  "@pgpmjs/types": "^2.40.0",
@@ -77,5 +77,5 @@
77
77
  "pg",
78
78
  "pgsql"
79
79
  ],
80
- "gitHead": "73f55ad24d9a92e7ef1e268526b31bfb7bb12b28"
80
+ "gitHead": "dd16395013ff8c9d5e4cd2f5f5bec72c46f4099b"
81
81
  }
@@ -1 +1 @@
1
- export declare const usageText = "\n Usage: pgpm <command> [options]\n\n Core Database Operations:\n add Add database changes to plans and create SQL files\n deploy Deploy database changes and migrations\n verify Verify database state and migrations\n revert Revert database changes and migrations\n\n Project Management:\n init Initialize workspace or module\n extension Manage module dependencies\n plan Generate module deployment plans\n package Package module for distribution\n export Export database migrations from existing databases\n update Update pgpm to the latest version\n cache Manage cached templates (clean)\n upgrade Upgrade installed pgpm modules to latest versions (alias: up)\n\n Database Administration:\n dump Dump a database to a sql file\n kill Terminate database connections and optionally drop databases\n install Install database modules\n tag Add tags to changes for versioning\n clear Clear database state\n remove Remove database changes\n analyze Analyze database structure\n rename Rename database changes\n admin-users Manage admin users\n tune Tune PostgreSQL for throwaway environments (CI/test)\n\n Testing:\n test-packages Run integration tests on all workspace packages\n\n Migration Tools:\n migrate Migration management subcommands\n init Initialize migration tracking\n status Show migration status\n list List all changes\n deps Show change dependencies\n \n Development Tools:\n docker Manage Docker containers (start/stop/ls, --minio)\n doctor Check local dependencies (node, docker, psql) with install guidance\n env Manage environment variables (--supabase, --minio)\n test-packages Run integration tests on workspace packages\n \n Global Options:\n -h, --help Display this help information\n -v, --version Display version information\n --cwd <directory> Working directory (default: current directory)\n\n Individual Command Help:\n pgpm <command> --help Display detailed help for specific command\n pgpm <command> -h Display detailed help for specific command\n\n Examples:\n pgpm deploy --help Show deploy command options\n pgpm init workspace Initialize new workspace\n pgpm install @pgpm/base32 Install a database module\n ";
1
+ export declare const usageText = "\n Usage: pgpm <command> [options]\n\n Core Database Operations:\n add Add database changes to plans and create SQL files\n deploy Deploy database changes and migrations\n verify Verify database state and migrations\n revert Revert database changes and migrations\n\n Project Management:\n init Initialize workspace or module\n extension Manage module dependencies\n plan Generate module deployment plans\n package Package module for distribution\n sync-versions Sync .control/Makefile/sql metadata to package.json versions\n export Export database migrations from existing databases\n update Update pgpm to the latest version\n cache Manage cached templates (clean)\n upgrade Upgrade installed pgpm modules to latest versions (alias: up)\n\n Database Administration:\n dump Dump a database to a sql file\n kill Terminate database connections and optionally drop databases\n install Install database modules\n tag Add tags to changes for versioning\n clear Clear database state\n remove Remove database changes\n analyze Analyze database structure\n rename Rename database changes\n admin-users Manage admin users\n tune Tune PostgreSQL for throwaway environments (CI/test)\n\n Testing:\n test-packages Run integration tests on all workspace packages\n\n Migration Tools:\n migrate Migration management subcommands\n init Initialize migration tracking\n status Show migration status\n list List all changes\n deps Show change dependencies\n \n Development Tools:\n docker Manage Docker containers (start/stop/ls, --minio)\n doctor Check local dependencies (node, docker, psql) with install guidance\n env Manage environment variables (--supabase, --minio)\n test-packages Run integration tests on workspace packages\n \n Global Options:\n -h, --help Display this help information\n -v, --version Display version information\n --cwd <directory> Working directory (default: current directory)\n\n Individual Command Help:\n pgpm <command> --help Display detailed help for specific command\n pgpm <command> -h Display detailed help for specific command\n\n Examples:\n pgpm deploy --help Show deploy command options\n pgpm init workspace Initialize new workspace\n pgpm install @pgpm/base32 Install a database module\n ";
package/utils/display.js CHANGED
@@ -15,6 +15,7 @@ exports.usageText = `
15
15
  extension Manage module dependencies
16
16
  plan Generate module deployment plans
17
17
  package Package module for distribution
18
+ sync-versions Sync .control/Makefile/sql metadata to package.json versions
18
19
  export Export database migrations from existing databases
19
20
  update Update pgpm to the latest version
20
21
  cache Manage cached templates (clean)
package/utils/index.d.ts CHANGED
@@ -6,3 +6,4 @@ export * from './driver';
6
6
  export * from './module-utils';
7
7
  export * from './npm-version';
8
8
  export * from './package-alias';
9
+ export * from './tty';
package/utils/index.js CHANGED
@@ -22,3 +22,4 @@ __exportStar(require("./driver"), exports);
22
22
  __exportStar(require("./module-utils"), exports);
23
23
  __exportStar(require("./npm-version"), exports);
24
24
  __exportStar(require("./package-alias"), exports);
25
+ __exportStar(require("./tty"), exports);
package/utils/tty.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Determine whether the CLI should run in non-interactive (noTty) mode from
3
+ * parsed argv and the environment. Minimist parses `--no-tty` as `tty: false`.
4
+ */
5
+ export declare const isNoTtyRequested: (argv: Partial<Record<string, any>>) => boolean;
6
+ /**
7
+ * Detect noTty mode from raw process argv, before minimist parsing. Used at
8
+ * CLI construction time so the shared prompter itself is non-interactive.
9
+ */
10
+ export declare const detectNoTtyFromProcess: (argv?: string[]) => boolean;
package/utils/tty.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectNoTtyFromProcess = exports.isNoTtyRequested = void 0;
4
+ /**
5
+ * Determine whether the CLI should run in non-interactive (noTty) mode from
6
+ * parsed argv and the environment. Minimist parses `--no-tty` as `tty: false`.
7
+ */
8
+ const isNoTtyRequested = (argv) => Boolean(argv.noTty ||
9
+ argv['no-tty'] ||
10
+ argv.tty === false ||
11
+ process.env.CI === 'true');
12
+ exports.isNoTtyRequested = isNoTtyRequested;
13
+ /**
14
+ * Detect noTty mode from raw process argv, before minimist parsing. Used at
15
+ * CLI construction time so the shared prompter itself is non-interactive.
16
+ */
17
+ const detectNoTtyFromProcess = (argv = process.argv) => argv.includes('--no-tty') ||
18
+ argv.includes('--noTty') ||
19
+ process.env.CI === 'true';
20
+ exports.detectNoTtyFromProcess = detectNoTtyFromProcess;