supabee 0.3.1 → 0.3.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,CAAC;AAC9D,MAAM,CAAC,MAAM,uBAAuB,GAAG,+BAA+B,CAAC;AAmCvE,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM,EAAE;QACN,KAAK,EAAE,mCAAmC;QAC1C,MAAM,EAAE,wBAAwB;QAChC,aAAa,EAAE,4CAA4C;QAC3D,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,EAAE;KACd;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,8BAA8B;QACrC,MAAM,EAAE,sBAAsB;QAC9B,aAAa,EAAE,uCAAuC;QACtD,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,IAAI;QACrB,oBAAoB,EAAE,EAAE;QACxB,gBAAgB,EAAE,GAAG;QACrB,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,mBAAmB,EAAE,EAAE;KACxB;CACF,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,CAAC;AAC9D,MAAM,CAAC,MAAM,uBAAuB,GAAG,+BAA+B,CAAC;AAsCvE,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM,EAAE;QACN,KAAK,EAAE,mCAAmC;QAC1C,MAAM,EAAE,wBAAwB;QAChC,aAAa,EAAE,4CAA4C;QAC3D,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,EAAE;KACd;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,8BAA8B;QACrC,MAAM,EAAE,sBAAsB;QAC9B,aAAa,EAAE,uCAAuC;QACtD,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,IAAI;QACrB,oBAAoB,EAAE,EAAE;QACxB,gBAAgB,EAAE,GAAG;QACrB,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,EAAE;QACb,mBAAmB,EAAE,EAAE;KACxB;CACF,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type MigrationClassification = 'data' | 'schema' | 'mixed' | 'unknown';
2
+ export type MigrationClassificationSource = 'marker' | 'heuristic';
3
+ export type RecommendedMarker = 'data' | 'schema' | null;
4
+ export type MigrationClassificationResult = {
5
+ fileName: string;
6
+ filePath: string;
7
+ timestamp: number;
8
+ classification: MigrationClassification;
9
+ source: MigrationClassificationSource;
10
+ reasons: string[];
11
+ hasDataMarker: boolean;
12
+ hasSchemaMarker: boolean;
13
+ recommendedMarker: RecommendedMarker;
14
+ };
15
+ export type MigrationClassifierOptions = {
16
+ migrationsDir: string;
17
+ };
18
+ export declare function classifyMigrations(options: MigrationClassifierOptions): Promise<MigrationClassificationResult[]>;
19
+ export declare function resolveMarkers(): {
20
+ dataMarker: string;
21
+ schemaMarker: string;
22
+ };
@@ -0,0 +1,240 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { readToolConfig } from './config.js';
4
+ const DEFAULT_DATA_MARKER = 'supabee:data-migration';
5
+ const DEFAULT_SCHEMA_MARKER = 'supabee:schema-migration';
6
+ const DDL_PATTERN = /\b(create|alter|drop)\s+(table|type|schema|extension|index|view|materialized|function|policy|trigger|publication|subscription)\b/i;
7
+ const DML_PATTERN = /\b(insert\s+into|update\s+\S+|delete\s+from|merge\s+into|truncate\s+table)\b/i;
8
+ function resolveDataMarker() {
9
+ const configured = readToolConfig().dataMigrationMarker;
10
+ if (typeof configured === 'string' && configured.trim())
11
+ return configured.trim();
12
+ return DEFAULT_DATA_MARKER;
13
+ }
14
+ function resolveSchemaMarker() {
15
+ const configured = readToolConfig().schemaMigrationMarker;
16
+ if (typeof configured === 'string' && configured.trim())
17
+ return configured.trim();
18
+ return DEFAULT_SCHEMA_MARKER;
19
+ }
20
+ function hasMarker(sql, marker) {
21
+ const escaped = marker.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
22
+ const regex = new RegExp(`^\\s*--\\s*${escaped}(?:\\s|$)`, 'im');
23
+ return regex.test(sql);
24
+ }
25
+ function stripCommentsAndStrings(sql) {
26
+ let result = '';
27
+ let i = 0;
28
+ let inSingle = false;
29
+ let inDouble = false;
30
+ let inLineComment = false;
31
+ let inBlockComment = false;
32
+ while (i < sql.length) {
33
+ const c = sql[i];
34
+ const n = i + 1 < sql.length ? sql[i + 1] : '';
35
+ if (inLineComment) {
36
+ if (c === '\n') {
37
+ inLineComment = false;
38
+ result += '\n';
39
+ }
40
+ else {
41
+ result += ' ';
42
+ }
43
+ i += 1;
44
+ continue;
45
+ }
46
+ if (inBlockComment) {
47
+ if (c === '*' && n === '/') {
48
+ inBlockComment = false;
49
+ result += ' ';
50
+ i += 2;
51
+ continue;
52
+ }
53
+ result += c === '\n' ? '\n' : ' ';
54
+ i += 1;
55
+ continue;
56
+ }
57
+ if (inSingle) {
58
+ if (c === "'" && n === "'") {
59
+ result += ' ';
60
+ i += 2;
61
+ continue;
62
+ }
63
+ if (c === "'") {
64
+ inSingle = false;
65
+ result += ' ';
66
+ i += 1;
67
+ continue;
68
+ }
69
+ result += c === '\n' ? '\n' : ' ';
70
+ i += 1;
71
+ continue;
72
+ }
73
+ if (inDouble) {
74
+ if (c === '"') {
75
+ inDouble = false;
76
+ result += ' ';
77
+ i += 1;
78
+ continue;
79
+ }
80
+ result += c === '\n' ? '\n' : ' ';
81
+ i += 1;
82
+ continue;
83
+ }
84
+ if (c === '-' && n === '-') {
85
+ inLineComment = true;
86
+ result += ' ';
87
+ i += 2;
88
+ continue;
89
+ }
90
+ if (c === '/' && n === '*') {
91
+ inBlockComment = true;
92
+ result += ' ';
93
+ i += 2;
94
+ continue;
95
+ }
96
+ if (c === "'") {
97
+ inSingle = true;
98
+ result += ' ';
99
+ i += 1;
100
+ continue;
101
+ }
102
+ if (c === '"') {
103
+ inDouble = true;
104
+ result += ' ';
105
+ i += 1;
106
+ continue;
107
+ }
108
+ result += c;
109
+ i += 1;
110
+ }
111
+ return result;
112
+ }
113
+ async function listMigrations(migrationsDir) {
114
+ const entries = await fs.promises.readdir(migrationsDir, { withFileTypes: true });
115
+ const files = [];
116
+ for (const entry of entries) {
117
+ if (!entry.isFile() || !entry.name.endsWith('.sql'))
118
+ continue;
119
+ const timestampPart = entry.name.split('_')[0];
120
+ if (!/^\d+$/.test(timestampPart))
121
+ continue;
122
+ files.push({ fileName: entry.name, timestamp: Number(timestampPart) });
123
+ }
124
+ files.sort((a, b) => (a.timestamp !== b.timestamp ? a.timestamp - b.timestamp : a.fileName.localeCompare(b.fileName)));
125
+ return files;
126
+ }
127
+ function classifySql(sql) {
128
+ const dataMarker = resolveDataMarker();
129
+ const schemaMarker = resolveSchemaMarker();
130
+ const hasData = hasMarker(sql, dataMarker);
131
+ const hasSchema = hasMarker(sql, schemaMarker);
132
+ const normalized = stripCommentsAndStrings(sql);
133
+ const hasDdl = DDL_PATTERN.test(normalized);
134
+ const hasDml = DML_PATTERN.test(normalized);
135
+ if (hasData && hasSchema) {
136
+ return {
137
+ classification: 'mixed',
138
+ source: 'marker',
139
+ reasons: [`Both markers found (${dataMarker}, ${schemaMarker}).`],
140
+ hasDataMarker: true,
141
+ hasSchemaMarker: true,
142
+ };
143
+ }
144
+ if (hasDdl && hasDml) {
145
+ const markerReason = hasData
146
+ ? ` Marker present: -- ${dataMarker}.`
147
+ : hasSchema
148
+ ? ` Marker present: -- ${schemaMarker}.`
149
+ : '';
150
+ return {
151
+ classification: 'mixed',
152
+ source: hasData || hasSchema ? 'marker' : 'heuristic',
153
+ reasons: [`Detected both schema DDL and data DML patterns.${markerReason}`],
154
+ hasDataMarker: hasData,
155
+ hasSchemaMarker: hasSchema,
156
+ };
157
+ }
158
+ if (hasData) {
159
+ return {
160
+ classification: 'data',
161
+ source: 'marker',
162
+ reasons: [`Marker found: -- ${dataMarker}`],
163
+ hasDataMarker: true,
164
+ hasSchemaMarker: false,
165
+ };
166
+ }
167
+ if (hasSchema) {
168
+ return {
169
+ classification: 'schema',
170
+ source: 'marker',
171
+ reasons: [`Marker found: -- ${schemaMarker}`],
172
+ hasDataMarker: false,
173
+ hasSchemaMarker: true,
174
+ };
175
+ }
176
+ if (hasDml) {
177
+ return {
178
+ classification: 'data',
179
+ source: 'heuristic',
180
+ reasons: ['Detected data DML patterns (INSERT/UPDATE/DELETE/MERGE/TRUNCATE).'],
181
+ hasDataMarker: false,
182
+ hasSchemaMarker: false,
183
+ };
184
+ }
185
+ if (hasDdl) {
186
+ return {
187
+ classification: 'schema',
188
+ source: 'heuristic',
189
+ reasons: ['Detected schema DDL patterns (CREATE/ALTER/DROP ...).'],
190
+ hasDataMarker: false,
191
+ hasSchemaMarker: false,
192
+ };
193
+ }
194
+ return {
195
+ classification: 'unknown',
196
+ source: 'heuristic',
197
+ reasons: ['No marker and no recognized DDL/DML patterns.'],
198
+ hasDataMarker: false,
199
+ hasSchemaMarker: false,
200
+ };
201
+ }
202
+ function recommendedMarkerFor(result) {
203
+ if (result.classification === 'data' && !result.hasDataMarker)
204
+ return 'data';
205
+ if (result.classification === 'schema' && !result.hasSchemaMarker)
206
+ return 'schema';
207
+ return null;
208
+ }
209
+ export async function classifyMigrations(options) {
210
+ const migrations = await listMigrations(options.migrationsDir);
211
+ const results = [];
212
+ for (const migration of migrations) {
213
+ const filePath = path.join(options.migrationsDir, migration.fileName);
214
+ const sql = await fs.promises.readFile(filePath, 'utf8');
215
+ const classified = classifySql(sql);
216
+ results.push({
217
+ fileName: migration.fileName,
218
+ filePath,
219
+ timestamp: migration.timestamp,
220
+ classification: classified.classification,
221
+ source: classified.source,
222
+ reasons: classified.reasons,
223
+ hasDataMarker: classified.hasDataMarker,
224
+ hasSchemaMarker: classified.hasSchemaMarker,
225
+ recommendedMarker: recommendedMarkerFor({
226
+ classification: classified.classification,
227
+ hasDataMarker: classified.hasDataMarker,
228
+ hasSchemaMarker: classified.hasSchemaMarker,
229
+ }),
230
+ });
231
+ }
232
+ return results;
233
+ }
234
+ export function resolveMarkers() {
235
+ return {
236
+ dataMarker: resolveDataMarker(),
237
+ schemaMarker: resolveSchemaMarker(),
238
+ };
239
+ }
240
+ //# sourceMappingURL=migration-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-classifier.js","sourceRoot":"","sources":["../../src/lib/migration-classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type MigrationListRow = {
2
+ local: string;
3
+ remote: string;
4
+ timeUtc: string;
5
+ };
6
+ export type CutoffSource = 'argument' | 'linked' | 'config';
7
+ export type ResolvedCutoff = {
8
+ value: string;
9
+ source: CutoffSource;
10
+ };
11
+ export type MigrationAlignment = {
12
+ latestLocal: string | null;
13
+ latestRemote: string | null;
14
+ latestAligned: string | null;
15
+ };
16
+ export declare function parseCutoffTimestamp(raw: string): number;
17
+ export declare function isValidMigrationVersion(raw: string): boolean;
18
+ export declare function compareMigrationVersions(a: string, b: string): number;
19
+ export declare function parseMigrationListOutput(output: string): MigrationListRow[];
20
+ export declare function summarizeMigrationAlignment(rows: MigrationListRow[]): MigrationAlignment;
21
+ export declare function readLinkedMigrationAlignment(): Promise<MigrationAlignment>;
22
+ export declare function resolvePostSeedCutoff(cutoffTimestampRaw: string | undefined, options?: {
23
+ env?: string;
24
+ }): Promise<ResolvedCutoff>;
@@ -0,0 +1,195 @@
1
+ import { runCommand, runCommandCapture } from './subprocess.js';
2
+ import { readToolConfig, updateToolConfig } from './config.js';
3
+ import { info, warn } from './ui.js';
4
+ export function parseCutoffTimestamp(raw) {
5
+ const value = raw.trim();
6
+ if (!/^\d+$/.test(value)) {
7
+ throw new Error(`Invalid cutoff timestamp "${raw}". Expected numeric format like 20260309180959.`);
8
+ }
9
+ const parsed = Number(value);
10
+ if (!Number.isFinite(parsed)) {
11
+ throw new Error(`Invalid cutoff timestamp "${raw}".`);
12
+ }
13
+ return parsed;
14
+ }
15
+ export function isValidMigrationVersion(raw) {
16
+ return /^\d+$/.test(raw.trim());
17
+ }
18
+ export function compareMigrationVersions(a, b) {
19
+ const trimmedA = a.trim();
20
+ const trimmedB = b.trim();
21
+ if (trimmedA.length !== trimmedB.length) {
22
+ return trimmedA.length - trimmedB.length;
23
+ }
24
+ return trimmedA.localeCompare(trimmedB);
25
+ }
26
+ export function parseMigrationListOutput(output) {
27
+ const rows = [];
28
+ const lines = output.split('\n');
29
+ for (const rawLine of lines) {
30
+ const line = rawLine.replaceAll('│', '|').trimEnd();
31
+ if (!line.includes('|'))
32
+ continue;
33
+ if (line.includes('Local') && line.includes('Remote'))
34
+ continue;
35
+ if (line.match(/^-+\|-+\|-+$/))
36
+ continue;
37
+ const parts = line.split('|').map((part) => part.trim());
38
+ if (parts.length < 3)
39
+ continue;
40
+ if (/^-+$/.test(parts[0]) && /^-+$/.test(parts[1]))
41
+ continue;
42
+ const local = parts[0];
43
+ const remote = parts[1];
44
+ const timeUtc = parts[2];
45
+ if (!local && !remote)
46
+ continue;
47
+ rows.push({ local, remote, timeUtc });
48
+ }
49
+ return rows;
50
+ }
51
+ function latestVersionFromSet(versions) {
52
+ let latest = null;
53
+ for (const version of versions) {
54
+ if (!latest || compareMigrationVersions(version, latest) > 0) {
55
+ latest = version;
56
+ }
57
+ }
58
+ return latest;
59
+ }
60
+ export function summarizeMigrationAlignment(rows) {
61
+ const localVersions = new Set();
62
+ const remoteVersions = new Set();
63
+ for (const row of rows) {
64
+ if (isValidMigrationVersion(row.local))
65
+ localVersions.add(row.local);
66
+ if (isValidMigrationVersion(row.remote))
67
+ remoteVersions.add(row.remote);
68
+ }
69
+ let latestAligned = null;
70
+ for (const localVersion of localVersions) {
71
+ if (!remoteVersions.has(localVersion))
72
+ continue;
73
+ if (!latestAligned || compareMigrationVersions(localVersion, latestAligned) > 0) {
74
+ latestAligned = localVersion;
75
+ }
76
+ }
77
+ return {
78
+ latestLocal: latestVersionFromSet(localVersions),
79
+ latestRemote: latestVersionFromSet(remoteVersions),
80
+ latestAligned,
81
+ };
82
+ }
83
+ export async function readLinkedMigrationAlignment() {
84
+ const { stdout } = await runCommandCapture('supabase', ['migration', 'list', '--linked']);
85
+ const rows = parseMigrationListOutput(stdout);
86
+ if (rows.length === 0) {
87
+ throw new Error('Could not read migration list from linked project. Provide cutoff timestamp explicitly or run `supabase link` first.');
88
+ }
89
+ return summarizeMigrationAlignment(rows);
90
+ }
91
+ async function detectCutoffFromLinkedProject() {
92
+ const alignment = await readLinkedMigrationAlignment();
93
+ if (!alignment.latestAligned) {
94
+ throw new Error('No common local/remote migration version found. Provide cutoff timestamp explicitly (e.g. `supabee db reset 20260309180959`).');
95
+ }
96
+ return alignment.latestAligned;
97
+ }
98
+ function isLikelyUnlinkedError(error) {
99
+ const message = (error instanceof Error ? error.message : String(error)).toLowerCase();
100
+ return (message.includes('supabase link') ||
101
+ message.includes('not linked') ||
102
+ message.includes('project ref') ||
103
+ message.includes('cannot find project'));
104
+ }
105
+ async function detectCutoffWithAutoLinkRetry() {
106
+ try {
107
+ return await detectCutoffFromLinkedProject();
108
+ }
109
+ catch (error) {
110
+ if (!isLikelyUnlinkedError(error)) {
111
+ throw error;
112
+ }
113
+ console.log(info('No linked Supabase project detected. Running `supabase link`...'));
114
+ await runCommand('supabase', ['link']);
115
+ return detectCutoffFromLinkedProject();
116
+ }
117
+ }
118
+ function readValidConfiguredCutoff(configured, label) {
119
+ if (typeof configured !== 'string')
120
+ return null;
121
+ const trimmed = configured.trim();
122
+ if (!trimmed)
123
+ return null;
124
+ if (!isValidMigrationVersion(trimmed)) {
125
+ console.log(warn(`Ignoring invalid ${label} value in config: ${configured}`));
126
+ return null;
127
+ }
128
+ return trimmed;
129
+ }
130
+ function readConfiguredPostSeedCutoff(envName) {
131
+ const config = readToolConfig();
132
+ if (envName) {
133
+ const byEnv = config.postSeedCutoffByEnv;
134
+ if (byEnv && typeof byEnv === 'object' && !Array.isArray(byEnv)) {
135
+ const envConfigured = byEnv[envName];
136
+ const fromEnv = readValidConfiguredCutoff(envConfigured, `postSeedCutoffByEnv.${envName}`);
137
+ if (fromEnv)
138
+ return fromEnv;
139
+ }
140
+ }
141
+ return readValidConfiguredCutoff(config.postSeedCutoff, 'postSeedCutoff');
142
+ }
143
+ function persistPostSeedCutoff(cutoffTimestamp, envName) {
144
+ try {
145
+ const configPath = updateToolConfig((current) => {
146
+ if (!envName) {
147
+ return { ...current, postSeedCutoff: cutoffTimestamp };
148
+ }
149
+ const currentByEnv = current.postSeedCutoffByEnv && typeof current.postSeedCutoffByEnv === 'object'
150
+ ? current.postSeedCutoffByEnv
151
+ : {};
152
+ return {
153
+ ...current,
154
+ postSeedCutoffByEnv: {
155
+ ...currentByEnv,
156
+ [envName]: cutoffTimestamp,
157
+ },
158
+ };
159
+ });
160
+ if (envName) {
161
+ console.log(info(`Saved postSeedCutoffByEnv.${envName} = ${cutoffTimestamp} in ${configPath}`));
162
+ }
163
+ else {
164
+ console.log(info(`Saved postSeedCutoff = ${cutoffTimestamp} in ${configPath}`));
165
+ }
166
+ }
167
+ catch (error) {
168
+ const message = error instanceof Error ? error.message : String(error);
169
+ console.log(warn(`Unable to persist postSeedCutoff: ${message}`));
170
+ }
171
+ }
172
+ export async function resolvePostSeedCutoff(cutoffTimestampRaw, options = {}) {
173
+ const envName = options.env?.trim() || undefined;
174
+ if (cutoffTimestampRaw && cutoffTimestampRaw.trim()) {
175
+ return { value: cutoffTimestampRaw.trim(), source: 'argument' };
176
+ }
177
+ try {
178
+ const detected = await detectCutoffWithAutoLinkRetry();
179
+ persistPostSeedCutoff(detected, envName);
180
+ return { value: detected, source: 'linked' };
181
+ }
182
+ catch (error) {
183
+ const fallback = readConfiguredPostSeedCutoff(envName);
184
+ if (fallback) {
185
+ const message = error instanceof Error ? error.message : String(error);
186
+ const fallbackLabel = envName ? `postSeedCutoffByEnv.${envName}` : 'postSeedCutoff';
187
+ console.log(warn(`Could not auto-detect cutoff from linked project. Falling back to ${fallbackLabel}: ${fallback}`));
188
+ console.log(info(message));
189
+ return { value: fallback, source: 'config' };
190
+ }
191
+ const message = error instanceof Error ? error.message : String(error);
192
+ throw new Error(`Could not auto-detect cutoff from linked project and no postSeedCutoff is configured.\n${message}`);
193
+ }
194
+ }
195
+ //# sourceMappingURL=post-seed-cutoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-seed-cutoff.js","sourceRoot":"","sources":["../../src/lib/post-seed-cutoff.ts"],"names":[],"mappings":"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"}
@@ -38,13 +38,13 @@ function withWindowsCommandNotFoundDiagnostic(command, error) {
38
38
  if (process.platform !== 'win32' || (!isCommandNotFoundError(error) && !error.message.includes('EINVAL'))) {
39
39
  return error;
40
40
  }
41
- return new Error(`${error.message}
42
-
43
- Windows diagnostic:
44
- - Tried command variants automatically: ${command}, ${command}.exe, ${command}.cmd, ${command}.bat
45
- - For .cmd/.bat variants, supabee now runs them via Windows shell automatically
46
- - In PowerShell, run \`where.exe ${command}\` (not \`where ${command}\`, which maps to Where-Object)
47
- - Check resolution in pnpm context: \`pnpm exec where.exe ${command}\`
41
+ return new Error(`${error.message}
42
+
43
+ Windows diagnostic:
44
+ - Tried command variants automatically: ${command}, ${command}.exe, ${command}.cmd, ${command}.bat
45
+ - For .cmd/.bat variants, supabee now runs them via Windows shell automatically
46
+ - In PowerShell, run \`where.exe ${command}\` (not \`where ${command}\`, which maps to Where-Object)
47
+ - Check resolution in pnpm context: \`pnpm exec where.exe ${command}\`
48
48
  - If still missing, reinstall the CLI and ensure its bin path is on PATH (common npm global bin: %AppData%\\npm)`);
49
49
  }
50
50
  async function runWithCommandFallback(command, args, runWithResolvedCommand) {
package/package.json CHANGED
@@ -1,53 +1,54 @@
1
- {
2
- "name": "supabee",
3
- "version": "0.3.1",
4
- "description": "CLI tools for local Supabase schema/data workflows",
5
- "license": "MIT",
6
- "author": "Kai Ho Chak",
7
- "repository": {
8
- "type": "git",
9
- "url": "https://github.com/kaihochak/supabee.git"
10
- },
11
- "homepage": "https://github.com/kaihochak/supabee",
12
- "bugs": {
13
- "url": "https://github.com/kaihochak/supabee/issues"
14
- },
15
- "keywords": [
16
- "supabase",
17
- "database",
18
- "schema",
19
- "sql",
20
- "cli",
21
- "devtools",
22
- "local"
23
- ],
24
- "type": "module",
25
- "bin": {
26
- "supabee": "dist/index.js",
27
- "supabase-splitter": "dist/index.js"
28
- },
29
- "files": [
30
- "dist",
31
- "supabase-splitter.config.example.json",
32
- "supabee.config.example.json",
33
- "README.md",
34
- "LICENSE"
35
- ],
36
- "engines": {
37
- "node": ">=20.11.0"
38
- },
39
- "scripts": {
40
- "build": "tsc -p tsconfig.json",
41
- "prepack": "npm run build",
42
- "typecheck": "tsc -p tsconfig.json --noEmit",
43
- "test": "npm run build && node dist/index.js --help",
44
- "pack:check": "npm run build && npm_config_cache=.npm-cache npm pack --dry-run"
45
- },
46
- "dependencies": {
47
- "commander": "^12.1.0"
48
- },
49
- "devDependencies": {
50
- "@types/node": "^22.19.15",
51
- "typescript": "^5.9.3"
52
- }
53
- }
1
+ {
2
+ "name": "supabee",
3
+ "version": "0.3.3",
4
+ "description": "CLI tools for local Supabase schema/data workflows",
5
+ "license": "MIT",
6
+ "author": "Kai Ho Chak",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/kaihochak/supabee.git"
10
+ },
11
+ "homepage": "https://github.com/kaihochak/supabee",
12
+ "bugs": {
13
+ "url": "https://github.com/kaihochak/supabee/issues"
14
+ },
15
+ "keywords": [
16
+ "supabase",
17
+ "database",
18
+ "schema",
19
+ "sql",
20
+ "cli",
21
+ "devtools",
22
+ "local"
23
+ ],
24
+ "type": "module",
25
+ "bin": {
26
+ "supabee": "dist/index.js",
27
+ "supabase-splitter": "dist/index.js"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "supabase-splitter.config.example.json",
32
+ "supabee.config.example.json",
33
+ "README.md",
34
+ "LICENSE"
35
+ ],
36
+ "engines": {
37
+ "node": ">=20.11.0"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc -p tsconfig.json",
41
+ "prepack": "npm run build",
42
+ "typecheck": "tsc -p tsconfig.json --noEmit",
43
+ "test": "npm run build && node dist/index.js --help",
44
+ "pack:check": "npm run build && cross-env npm_config_cache=.npm-cache npm pack --dry-run"
45
+ },
46
+ "dependencies": {
47
+ "commander": "^12.1.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^22.19.15",
51
+ "cross-env": "^7.0.3",
52
+ "typescript": "^5.9.3"
53
+ }
54
+ }