@schemalens/cli 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/commands/build.d.ts +6 -0
- package/dist/commands/build.js +148 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/ci.js +1 -1
- package/dist/commands/deploy.js +4 -4
- package/dist/commands/init-action.js +3 -3
- package/dist/commands/init.js +7 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.js +1 -1
- package/dist/commands/pull.js +4 -4
- package/dist/index.js +22 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/config.js +9 -9
- package/dist/lib/sync.d.ts +1 -1
- package/dist/lib/sync.js +3 -3
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -89,7 +89,7 @@ environments:
|
|
|
89
89
|
prod:
|
|
90
90
|
# Omit connection_string to use linked mode (see below)
|
|
91
91
|
|
|
92
|
-
#
|
|
92
|
+
# SchemaLens SaaS integration (optional)
|
|
93
93
|
project_id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
94
94
|
api_key: env(SCHEMALENS_API_KEY)
|
|
95
95
|
```
|
|
@@ -106,7 +106,7 @@ The CLI resolves `env(DATABASE_URL)` to the value of `$DATABASE_URL` at runtime.
|
|
|
106
106
|
|
|
107
107
|
### Linked mode (no local DATABASE_URL needed)
|
|
108
108
|
|
|
109
|
-
When `project_id` and `api_key` are both set, you can omit `connection_string` from any environment. The CLI will fetch the connection details from
|
|
109
|
+
When `project_id` and `api_key` are both set, you can omit `connection_string` from any environment. The CLI will fetch the connection details from SchemaLens SaaS using your API key.
|
|
110
110
|
|
|
111
111
|
```yaml
|
|
112
112
|
environments:
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildCommand = buildCommand;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const ora_1 = __importDefault(require("ora"));
|
|
11
|
+
const pg_1 = require("pg");
|
|
12
|
+
const introspector_1 = require("../lib/introspector");
|
|
13
|
+
const writer_1 = require("../lib/writer");
|
|
14
|
+
const META_DIR = path_1.default.join('schema', '_meta');
|
|
15
|
+
const MIGRATIONS_LOCK_FILE = path_1.default.join(META_DIR, 'migrations.lock.json');
|
|
16
|
+
function loadMigrationState() {
|
|
17
|
+
if (fs_1.default.existsSync(MIGRATIONS_LOCK_FILE)) {
|
|
18
|
+
const raw = fs_1.default.readFileSync(MIGRATIONS_LOCK_FILE, 'utf-8');
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
}
|
|
21
|
+
return { applied: [] };
|
|
22
|
+
}
|
|
23
|
+
function saveMigrationState(state) {
|
|
24
|
+
if (!fs_1.default.existsSync(META_DIR)) {
|
|
25
|
+
fs_1.default.mkdirSync(META_DIR, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
fs_1.default.writeFileSync(MIGRATIONS_LOCK_FILE, JSON.stringify(state, null, 2) + '\n', 'utf-8');
|
|
28
|
+
}
|
|
29
|
+
function getMigrationFiles(migrationsDir) {
|
|
30
|
+
const absDir = path_1.default.resolve(migrationsDir);
|
|
31
|
+
if (!fs_1.default.existsSync(absDir)) {
|
|
32
|
+
throw new Error(`Migrations directory not found: ${absDir}`);
|
|
33
|
+
}
|
|
34
|
+
const files = fs_1.default.readdirSync(absDir)
|
|
35
|
+
.filter(f => f.endsWith('.sql'))
|
|
36
|
+
.sort(); // lexicographic order: 001_init.sql, 002_add_users.sql, etc.
|
|
37
|
+
if (files.length === 0) {
|
|
38
|
+
throw new Error(`No .sql files found in ${absDir}`);
|
|
39
|
+
}
|
|
40
|
+
return files;
|
|
41
|
+
}
|
|
42
|
+
function resolveConnectionString(opts) {
|
|
43
|
+
if (opts.db)
|
|
44
|
+
return opts.db;
|
|
45
|
+
if (process.env.DATABASE_URL)
|
|
46
|
+
return process.env.DATABASE_URL;
|
|
47
|
+
throw new Error('No database connection provided.\n\n' +
|
|
48
|
+
'Provide one of:\n' +
|
|
49
|
+
' --db postgresql://user:pass@localhost:5432/mydb\n' +
|
|
50
|
+
' DATABASE_URL=postgresql://... schemalens build ...\n\n' +
|
|
51
|
+
'The target database should be empty (or a dedicated scratch/dev database).\n' +
|
|
52
|
+
'SchemaLens will apply your migrations to it, then introspect the result.\n\n' +
|
|
53
|
+
'Tip: create a blank local database with:\n' +
|
|
54
|
+
' createdb myapp_schema_scratch');
|
|
55
|
+
}
|
|
56
|
+
async function buildCommand(opts) {
|
|
57
|
+
console.log(chalk_1.default.bold(`\nSchemaLens Build — env: ${chalk_1.default.cyan(opts.env)}\n`));
|
|
58
|
+
const connectionString = resolveConnectionString(opts);
|
|
59
|
+
const migrationsDir = path_1.default.resolve(opts.migrations);
|
|
60
|
+
console.log(chalk_1.default.dim(` migrations: ${migrationsDir}`));
|
|
61
|
+
// 1. Discover migration files
|
|
62
|
+
const allFiles = getMigrationFiles(migrationsDir);
|
|
63
|
+
// 2. Load existing migration state and find unapplied migrations
|
|
64
|
+
const state = loadMigrationState();
|
|
65
|
+
const unapplied = allFiles.filter(f => !state.applied.includes(f));
|
|
66
|
+
if (unapplied.length === 0) {
|
|
67
|
+
console.log(chalk_1.default.dim(`\n All ${allFiles.length} migration(s) already applied — schema files are up to date.\n`));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(chalk_1.default.dim(` ${allFiles.length} migration(s) total, ${unapplied.length} to apply\n`));
|
|
71
|
+
// 3. Connect and apply unapplied migrations
|
|
72
|
+
const isLocal = connectionString.includes('localhost') ||
|
|
73
|
+
connectionString.includes('127.0.0.1');
|
|
74
|
+
const pool = new pg_1.Pool({
|
|
75
|
+
connectionString,
|
|
76
|
+
connectionTimeoutMillis: 15_000,
|
|
77
|
+
ssl: isLocal ? undefined : { rejectUnauthorized: false },
|
|
78
|
+
});
|
|
79
|
+
try {
|
|
80
|
+
const applySpinner = (0, ora_1.default)(`Applying ${unapplied.length} migration(s)...`).start();
|
|
81
|
+
for (const filename of unapplied) {
|
|
82
|
+
const filePath = path_1.default.join(migrationsDir, filename);
|
|
83
|
+
const sql = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
84
|
+
try {
|
|
85
|
+
await pool.query('BEGIN');
|
|
86
|
+
await pool.query(sql);
|
|
87
|
+
await pool.query('COMMIT');
|
|
88
|
+
state.applied.push(filename);
|
|
89
|
+
state.lastApplied = filename;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
await pool.query('ROLLBACK').catch(() => { });
|
|
93
|
+
applySpinner.fail(chalk_1.default.red(`Failed on migration: ${filename}`));
|
|
94
|
+
throw new Error(`Migration failed: ${filename}\n${err.message}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
applySpinner.succeed(chalk_1.default.green(`Applied ${unapplied.length} migration(s)`));
|
|
98
|
+
for (const f of unapplied) {
|
|
99
|
+
console.log(chalk_1.default.green(` + ${f}`));
|
|
100
|
+
}
|
|
101
|
+
// 4. Persist migration state before introspecting
|
|
102
|
+
saveMigrationState(state);
|
|
103
|
+
// 5. Introspect the resulting schema
|
|
104
|
+
const introspectSpinner = (0, ora_1.default)('Introspecting schema...').start();
|
|
105
|
+
let snapshot;
|
|
106
|
+
try {
|
|
107
|
+
snapshot = await (0, introspector_1.introspectSchema)(connectionString);
|
|
108
|
+
introspectSpinner.succeed(chalk_1.default.green('Schema introspected'));
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
introspectSpinner.fail(chalk_1.default.red('Failed to introspect schema'));
|
|
112
|
+
throw err;
|
|
113
|
+
}
|
|
114
|
+
console.log(chalk_1.default.dim(` ${snapshot.tables.length} tables, ` +
|
|
115
|
+
`${snapshot.views.length} views, ` +
|
|
116
|
+
`${snapshot.functions.length} functions, ` +
|
|
117
|
+
`${snapshot.enums.length} enums, ` +
|
|
118
|
+
`${snapshot.extensions.length} extensions`));
|
|
119
|
+
// 6. Write schema files
|
|
120
|
+
const writeSpinner = (0, ora_1.default)('Writing schema files...').start();
|
|
121
|
+
const result = (0, writer_1.writeSchemaFiles)(snapshot, opts.env);
|
|
122
|
+
writeSpinner.succeed(chalk_1.default.green('Schema files written'));
|
|
123
|
+
// 7. Summary
|
|
124
|
+
console.log('');
|
|
125
|
+
if (result.created.length > 0) {
|
|
126
|
+
console.log(chalk_1.default.green.bold(` + ${result.created.length} created`));
|
|
127
|
+
for (const f of result.created) {
|
|
128
|
+
console.log(chalk_1.default.green(` + ${f}`));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (result.updated.length > 0) {
|
|
132
|
+
console.log(chalk_1.default.yellow.bold(` ~ ${result.updated.length} updated`));
|
|
133
|
+
for (const f of result.updated) {
|
|
134
|
+
console.log(chalk_1.default.yellow(` ~ ${f}`));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (result.unchanged.length > 0) {
|
|
138
|
+
console.log(chalk_1.default.dim(` = ${result.unchanged.length} unchanged`));
|
|
139
|
+
}
|
|
140
|
+
const total = result.created.length + result.updated.length + result.unchanged.length;
|
|
141
|
+
console.log(chalk_1.default.bold(`\n Total: ${total} schema file(s)\n`));
|
|
142
|
+
console.log(chalk_1.default.dim(` Migration state saved → ${MIGRATIONS_LOCK_FILE}\n`));
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
await pool.end();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/ci.js
CHANGED
|
@@ -50,7 +50,7 @@ async function ciCommand(opts) {
|
|
|
50
50
|
const projectId = config.project_id;
|
|
51
51
|
const apiKey = (0, config_1.resolveEnvVar)(config.api_key);
|
|
52
52
|
if (projectId && apiKey) {
|
|
53
|
-
const syncSpinner = (0, ora_1.default)('Syncing to
|
|
53
|
+
const syncSpinner = (0, ora_1.default)('Syncing to SchemaLens cloud...').start();
|
|
54
54
|
const result = await (0, sync_1.syncToCloud)(projectId, apiKey, 'pull', env, gitContext);
|
|
55
55
|
if (result) {
|
|
56
56
|
syncSpinner.succeed(chalk_1.default.green(`Synced — ${result.object_count} objects, ${result.changed_count} changed`));
|
package/dist/commands/deploy.js
CHANGED
|
@@ -193,17 +193,17 @@ async function deployCommand(opts) {
|
|
|
193
193
|
await client.query('COMMIT');
|
|
194
194
|
writeDeployLog(env, applied, 'success');
|
|
195
195
|
console.log(chalk_1.default.green.bold(`\n Deploy successful! ${applied} changes applied.\n`));
|
|
196
|
-
// Auto-sync to
|
|
196
|
+
// Auto-sync to SchemaLens cloud if configured
|
|
197
197
|
const projectId = config.project_id;
|
|
198
198
|
const apiKey = (0, config_1.resolveEnvVar)(config.api_key);
|
|
199
199
|
if (projectId && apiKey) {
|
|
200
|
-
const syncSpinner = (0, ora_1.default)('Syncing snapshot to
|
|
200
|
+
const syncSpinner = (0, ora_1.default)('Syncing snapshot to SchemaLens...').start();
|
|
201
201
|
const syncResult = await (0, sync_1.syncToCloud)(projectId, apiKey, 'deploy', env, gitContext);
|
|
202
202
|
if (syncResult) {
|
|
203
|
-
syncSpinner.succeed(chalk_1.default.green(`Snapshot synced to
|
|
203
|
+
syncSpinner.succeed(chalk_1.default.green(`Snapshot synced to SchemaLens cloud (${syncResult.object_count} objects, ${syncResult.changed_count} changed)`));
|
|
204
204
|
}
|
|
205
205
|
else {
|
|
206
|
-
syncSpinner.warn(chalk_1.default.yellow('
|
|
206
|
+
syncSpinner.warn(chalk_1.default.yellow('SchemaLens sync skipped (see warning above)'));
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
}
|
|
@@ -22,7 +22,7 @@ async function initActionCommand() {
|
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
console.log(chalk_1.default.bold('\n
|
|
25
|
+
console.log(chalk_1.default.bold('\n SchemaLens — GitHub Action Setup\n'));
|
|
26
26
|
// Try to read existing config for environment defaults
|
|
27
27
|
let envNames = [];
|
|
28
28
|
try {
|
|
@@ -70,7 +70,7 @@ async function initActionCommand() {
|
|
|
70
70
|
const blockLine = blockDestructive
|
|
71
71
|
? ` block-destructive: 'true'`
|
|
72
72
|
: ` # block-destructive: 'true'`;
|
|
73
|
-
const workflowYaml = `name:
|
|
73
|
+
const workflowYaml = `name: SchemaLens Schema Check
|
|
74
74
|
|
|
75
75
|
on:
|
|
76
76
|
${onBlock}
|
|
@@ -81,7 +81,7 @@ jobs:
|
|
|
81
81
|
steps:
|
|
82
82
|
- uses: actions/checkout@v4
|
|
83
83
|
|
|
84
|
-
- name:
|
|
84
|
+
- name: SchemaLens Check
|
|
85
85
|
uses: schemalens/schemalens-check@v1
|
|
86
86
|
with:
|
|
87
87
|
api-key: \${{ secrets.SCHEMALENS_API_KEY }}
|
package/dist/commands/init.js
CHANGED
|
@@ -19,12 +19,12 @@ async function initCommand() {
|
|
|
19
19
|
console.error(chalk_1.default.red(`\nConfig already exists at ${fullPath}\n`));
|
|
20
20
|
process.exit(1);
|
|
21
21
|
}
|
|
22
|
-
console.log(chalk_1.default.bold('\n
|
|
22
|
+
console.log(chalk_1.default.bold('\n SchemaLens — Project Setup\n'));
|
|
23
23
|
console.log(chalk_1.default.dim(' This creates schema/_meta/.schemalens.yml in your repo.\n'));
|
|
24
24
|
// --- Phase A: SaaS Linking (asked first) ---
|
|
25
|
-
console.log(chalk_1.default.dim(' Optional: link to
|
|
25
|
+
console.log(chalk_1.default.dim(' Optional: link to SchemaLens SaaS for dashboard sync.\n'));
|
|
26
26
|
const linkToSaas = await (0, prompts_1.confirm)({
|
|
27
|
-
message: 'Link to
|
|
27
|
+
message: 'Link to SchemaLens SaaS project?',
|
|
28
28
|
default: true,
|
|
29
29
|
});
|
|
30
30
|
let projectId;
|
|
@@ -155,7 +155,7 @@ async function initCommand() {
|
|
|
155
155
|
// --- Success ---
|
|
156
156
|
console.log(chalk_1.default.green(`\n ✓ Created ${CONFIG_PATH}\n`));
|
|
157
157
|
if (useLinkedMode) {
|
|
158
|
-
console.log(chalk_1.default.dim(' Connection credentials will be fetched from
|
|
158
|
+
console.log(chalk_1.default.dim(' Connection credentials will be fetched from SchemaLens SaaS.\n'));
|
|
159
159
|
console.log(chalk_1.default.dim(' Make sure your API key is set:\n') +
|
|
160
160
|
chalk_1.default.cyan(` export ${apiKeyVarName}=slk_...\n`));
|
|
161
161
|
}
|
|
@@ -166,6 +166,9 @@ async function initCommand() {
|
|
|
166
166
|
console.log(chalk_1.default.bold(' Next steps:\n'));
|
|
167
167
|
console.log(` ${chalk_1.default.cyan(`schemalens pull --env ${firstEnv}`)} # snapshot your live database`);
|
|
168
168
|
console.log(` ${chalk_1.default.cyan(`schemalens status --env ${firstEnv}`)} # see what changed\n`);
|
|
169
|
+
console.log(chalk_1.default.bold(' AI Integration:\n'));
|
|
170
|
+
console.log(` Add the SchemaLens skill to your AI coding agent:`);
|
|
171
|
+
console.log(` ${chalk_1.default.cyan('https://www.schemalens.dev/skills/claude-code.md')}\n`);
|
|
169
172
|
}
|
|
170
173
|
/** Collects environments manually via interactive prompts. */
|
|
171
174
|
async function collectManualEnvironments(environments) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;AAiBA,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/migrate.js
CHANGED
|
@@ -20,7 +20,7 @@ function isLegacyLayout() {
|
|
|
20
20
|
return false;
|
|
21
21
|
}
|
|
22
22
|
async function migrateCommand() {
|
|
23
|
-
console.log(chalk_1.default.bold('\n
|
|
23
|
+
console.log(chalk_1.default.bold('\n SchemaLens Migrate — Schema Directory Layout\n'));
|
|
24
24
|
if (!isLegacyLayout()) {
|
|
25
25
|
console.log(chalk_1.default.green(' Already using environment-scoped layout. Nothing to do.\n'));
|
|
26
26
|
return;
|
package/dist/commands/pull.js
CHANGED
|
@@ -63,17 +63,17 @@ async function pullCommand(env) {
|
|
|
63
63
|
}
|
|
64
64
|
const total = result.created.length + result.updated.length + result.unchanged.length;
|
|
65
65
|
console.log(chalk_1.default.bold(`\n Total: ${total} files\n`));
|
|
66
|
-
// Auto-sync to
|
|
66
|
+
// Auto-sync to SchemaLens cloud if configured
|
|
67
67
|
const projectId = config.project_id;
|
|
68
68
|
const apiKey = (0, config_1.resolveEnvVar)(config.api_key);
|
|
69
69
|
if (projectId && apiKey) {
|
|
70
|
-
const syncSpinner = (0, ora_1.default)('Syncing snapshot to
|
|
70
|
+
const syncSpinner = (0, ora_1.default)('Syncing snapshot to SchemaLens...').start();
|
|
71
71
|
const syncResult = await (0, sync_1.syncToCloud)(projectId, apiKey, 'pull', env, gitContext);
|
|
72
72
|
if (syncResult) {
|
|
73
|
-
syncSpinner.succeed(chalk_1.default.green(`Snapshot synced to
|
|
73
|
+
syncSpinner.succeed(chalk_1.default.green(`Snapshot synced to SchemaLens cloud (${syncResult.object_count} objects, ${syncResult.changed_count} changed)`));
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
76
|
-
syncSpinner.warn(chalk_1.default.yellow('
|
|
76
|
+
syncSpinner.warn(chalk_1.default.yellow('SchemaLens sync skipped (see warning above)'));
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
}
|
package/dist/index.js
CHANGED
|
@@ -15,15 +15,19 @@ const deploy_1 = require("./commands/deploy");
|
|
|
15
15
|
const migrate_1 = require("./commands/migrate");
|
|
16
16
|
const ci_1 = require("./commands/ci");
|
|
17
17
|
const init_action_1 = require("./commands/init-action");
|
|
18
|
+
const build_1 = require("./commands/build");
|
|
19
|
+
const fs_1 = require("fs");
|
|
20
|
+
const path_1 = require("path");
|
|
21
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', 'package.json'), 'utf-8'));
|
|
18
22
|
const program = new commander_1.Command();
|
|
19
23
|
program
|
|
20
24
|
.name('schemalens')
|
|
21
25
|
.description('Schema version control for PostgreSQL / Supabase')
|
|
22
|
-
.version(
|
|
26
|
+
.version(pkg.version)
|
|
23
27
|
.option('--verbose', 'Show detailed output including skip reasons', false);
|
|
24
28
|
program
|
|
25
29
|
.command('init')
|
|
26
|
-
.description('Set up
|
|
30
|
+
.description('Set up SchemaLens in this repository (creates schema/_meta/.schemalens.yml)')
|
|
27
31
|
.action(async () => {
|
|
28
32
|
try {
|
|
29
33
|
await (0, init_1.initCommand)();
|
|
@@ -119,7 +123,7 @@ program
|
|
|
119
123
|
});
|
|
120
124
|
program
|
|
121
125
|
.command('init-action')
|
|
122
|
-
.description('Generate a GitHub Actions workflow for
|
|
126
|
+
.description('Generate a GitHub Actions workflow for SchemaLens CI checks')
|
|
123
127
|
.action(async () => {
|
|
124
128
|
try {
|
|
125
129
|
await (0, init_action_1.initActionCommand)();
|
|
@@ -149,5 +153,20 @@ program
|
|
|
149
153
|
process.exit(1);
|
|
150
154
|
}
|
|
151
155
|
});
|
|
156
|
+
program
|
|
157
|
+
.command('build')
|
|
158
|
+
.description('Apply migration files to a local database and snapshot the resulting schema')
|
|
159
|
+
.requiredOption('--migrations <path>', 'Directory containing .sql migration files (applied in lexicographic order)')
|
|
160
|
+
.option('--env <env>', 'Environment name for output schema files (default: local)', 'local')
|
|
161
|
+
.option('--db <connection-string>', 'Blank local database to apply migrations to (defaults to DATABASE_URL)')
|
|
162
|
+
.action(async (opts) => {
|
|
163
|
+
try {
|
|
164
|
+
await (0, build_1.buildCommand)({ migrations: opts.migrations, env: opts.env, db: opts.db });
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
console.error(chalk_1.default.red(`\nError: ${err.message}\n`));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
152
171
|
program.parse();
|
|
153
172
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yBAAuB;AACvB,yCAAoC;AACpC,kDAA0B;AAC1B,0CAA8C;AAC9C,0CAA8C;AAC9C,8CAAkD;AAClD,0CAA8C;AAC9C,8CAAkD;AAClD,gDAAoD;AACpD,sCAA0C;AAC1C,wDAA2D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -79,7 +79,7 @@ async function resolveConnectionString(config, env) {
|
|
|
79
79
|
}
|
|
80
80
|
// 3. Nothing configured
|
|
81
81
|
throw new Error(`No connection_string configured for environment "${env}".\n` +
|
|
82
|
-
`Either add a connection_string to .schemalens.yml, or link to
|
|
82
|
+
`Either add a connection_string to .schemalens.yml, or link to SchemaLens SaaS:\n` +
|
|
83
83
|
` - Set project_id and api_key in .schemalens.yml\n` +
|
|
84
84
|
` - Run 'schemalens init' to reconfigure`);
|
|
85
85
|
}
|
|
@@ -92,7 +92,7 @@ async function fetchEnvironmentsFromSaaS(projectId, apiKey) {
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
catch (err) {
|
|
95
|
-
throw new Error(`Could not reach
|
|
95
|
+
throw new Error(`Could not reach SchemaLens SaaS: ${err.message}`);
|
|
96
96
|
}
|
|
97
97
|
if (!response.ok) {
|
|
98
98
|
if (response.status === 401) {
|
|
@@ -102,7 +102,7 @@ async function fetchEnvironmentsFromSaaS(projectId, apiKey) {
|
|
|
102
102
|
throw new Error(`Project ${projectId} not found.`);
|
|
103
103
|
}
|
|
104
104
|
const body = await response.text().catch(() => '');
|
|
105
|
-
throw new Error(`
|
|
105
|
+
throw new Error(`SchemaLens returned ${response.status}: ${body}`);
|
|
106
106
|
}
|
|
107
107
|
const data = await response.json();
|
|
108
108
|
return Array.isArray(data) ? data : [];
|
|
@@ -116,22 +116,22 @@ async function fetchConnectionFromSaaS(projectId, apiKey, env) {
|
|
|
116
116
|
});
|
|
117
117
|
}
|
|
118
118
|
catch (err) {
|
|
119
|
-
throw new Error(`Could not reach
|
|
119
|
+
throw new Error(`Could not reach SchemaLens SaaS to fetch connection details: ${err.message}`);
|
|
120
120
|
}
|
|
121
121
|
if (!response.ok) {
|
|
122
122
|
const body = await response.text().catch(() => '');
|
|
123
123
|
if (response.status === 401) {
|
|
124
|
-
throw new Error(`
|
|
124
|
+
throw new Error(`SchemaLens API key is invalid or expired. Regenerate it in Project Settings.`);
|
|
125
125
|
}
|
|
126
126
|
if (response.status === 404) {
|
|
127
|
-
throw new Error(`Project ${projectId} not found in
|
|
127
|
+
throw new Error(`Project ${projectId} not found in SchemaLens. Check your project_id in .schemalens.yml.`);
|
|
128
128
|
}
|
|
129
|
-
throw new Error(`
|
|
129
|
+
throw new Error(`SchemaLens returned ${response.status}: ${body}`);
|
|
130
130
|
}
|
|
131
131
|
const data = await response.json();
|
|
132
132
|
if (!data.connection_string) {
|
|
133
|
-
throw new Error(`
|
|
134
|
-
`Add your database host and password in the
|
|
133
|
+
throw new Error(`SchemaLens project has no database credentials stored. ` +
|
|
134
|
+
`Add your database host and password in the SchemaLens dashboard → Project Settings.`);
|
|
135
135
|
}
|
|
136
136
|
return data.connection_string;
|
|
137
137
|
}
|
package/dist/lib/sync.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface SyncResult {
|
|
|
6
6
|
changed_count: number;
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
|
-
* Notify the
|
|
9
|
+
* Notify the SchemaLens SaaS to take a snapshot after a CLI operation.
|
|
10
10
|
* Silently skips if projectId or apiKey are missing.
|
|
11
11
|
* Never throws — errors are returned as warnings so the CLI command still succeeds.
|
|
12
12
|
*/
|
package/dist/lib/sync.js
CHANGED
|
@@ -7,7 +7,7 @@ const BASE_URL = process.env.SCHEMALENS_BASE_URL ??
|
|
|
7
7
|
: 'https://www.schemalens.dev');
|
|
8
8
|
const SYNC_URL = `${BASE_URL}/api/cli/sync`;
|
|
9
9
|
/**
|
|
10
|
-
* Notify the
|
|
10
|
+
* Notify the SchemaLens SaaS to take a snapshot after a CLI operation.
|
|
11
11
|
* Silently skips if projectId or apiKey are missing.
|
|
12
12
|
* Never throws — errors are returned as warnings so the CLI command still succeeds.
|
|
13
13
|
*/
|
|
@@ -33,13 +33,13 @@ async function syncToCloud(projectId, apiKey, trigger, environment, gitContext)
|
|
|
33
33
|
});
|
|
34
34
|
if (!response.ok) {
|
|
35
35
|
const body = await response.text();
|
|
36
|
-
process.stderr.write(` ⚠
|
|
36
|
+
process.stderr.write(` ⚠ SchemaLens sync warning: ${response.status} ${body}\n`);
|
|
37
37
|
return null;
|
|
38
38
|
}
|
|
39
39
|
return await response.json();
|
|
40
40
|
}
|
|
41
41
|
catch (err) {
|
|
42
|
-
process.stderr.write(` ⚠
|
|
42
|
+
process.stderr.write(` ⚠ SchemaLens sync warning: ${err.message}\n`);
|
|
43
43
|
return null;
|
|
44
44
|
}
|
|
45
45
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schemalens/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "SchemaLens CLI — pull, diff, and deploy PostgreSQL schemas",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,16 +13,18 @@
|
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@inquirer/prompts": "^8.3.2",
|
|
16
|
-
"@schemalens/introspector": "^0.
|
|
16
|
+
"@schemalens/introspector": "^0.5.0",
|
|
17
17
|
"chalk": "^4.1.2",
|
|
18
18
|
"commander": "^12.1.0",
|
|
19
19
|
"dotenv": "^16.4.7",
|
|
20
20
|
"js-yaml": "^4.1.0",
|
|
21
|
-
"ora": "^5.4.1"
|
|
21
|
+
"ora": "^5.4.1",
|
|
22
|
+
"pg": "^8.13.1"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
25
|
"@types/js-yaml": "^4.0.9",
|
|
25
26
|
"@types/node": "^22.0.0",
|
|
27
|
+
"@types/pg": "^8.11.10",
|
|
26
28
|
"tsx": "^4.19.0",
|
|
27
29
|
"typescript": "^5.7.0"
|
|
28
30
|
},
|