@pgpmjs/core 4.12.1 → 4.13.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/esm/export/export-meta.js +1 -11
- package/esm/export/export-migrations.js +87 -21
- package/export/export-meta.d.ts +2 -1
- package/export/export-meta.js +1 -11
- package/export/export-migrations.js +87 -21
- package/package.json +2 -2
|
@@ -226,15 +226,6 @@ const config = {
|
|
|
226
226
|
privilege: 'text'
|
|
227
227
|
}
|
|
228
228
|
},
|
|
229
|
-
extension: {
|
|
230
|
-
schema: 'metaschema_public',
|
|
231
|
-
table: 'extension',
|
|
232
|
-
fields: {
|
|
233
|
-
id: 'uuid',
|
|
234
|
-
database_id: 'uuid',
|
|
235
|
-
name: 'text'
|
|
236
|
-
}
|
|
237
|
-
},
|
|
238
229
|
// =============================================================================
|
|
239
230
|
// services_public tables
|
|
240
231
|
// =============================================================================
|
|
@@ -824,7 +815,6 @@ export const exportMeta = async ({ opts, dbname, database_id }) => {
|
|
|
824
815
|
await queryAndParse('full_text_search', `SELECT * FROM metaschema_public.full_text_search WHERE database_id = $1`);
|
|
825
816
|
await queryAndParse('schema_grant', `SELECT * FROM metaschema_public.schema_grant WHERE database_id = $1`);
|
|
826
817
|
await queryAndParse('table_grant', `SELECT * FROM metaschema_public.table_grant WHERE database_id = $1`);
|
|
827
|
-
await queryAndParse('extension', `SELECT * FROM metaschema_public.extension WHERE database_id = $1`);
|
|
828
818
|
// =============================================================================
|
|
829
819
|
// services_public tables
|
|
830
820
|
// =============================================================================
|
|
@@ -864,5 +854,5 @@ export const exportMeta = async ({ opts, dbname, database_id }) => {
|
|
|
864
854
|
await queryAndParse('uuid_module', `SELECT * FROM metaschema_modules_public.uuid_module WHERE database_id = $1`);
|
|
865
855
|
await queryAndParse('default_ids_module', `SELECT * FROM metaschema_modules_public.default_ids_module WHERE database_id = $1`);
|
|
866
856
|
await queryAndParse('denormalized_table_field', `SELECT * FROM metaschema_modules_public.denormalized_table_field WHERE database_id = $1`);
|
|
867
|
-
return
|
|
857
|
+
return sql;
|
|
868
858
|
};
|
|
@@ -155,12 +155,11 @@ const exportMigrationsToDisk = async ({ project, options, database, databaseId,
|
|
|
155
155
|
}
|
|
156
156
|
writePgpmPlan(results.rows, opts);
|
|
157
157
|
writePgpmFiles(results.rows, opts);
|
|
158
|
-
|
|
158
|
+
const metaResult = await exportMeta({
|
|
159
159
|
opts: options,
|
|
160
160
|
dbname: database,
|
|
161
161
|
database_id: databaseId
|
|
162
162
|
});
|
|
163
|
-
meta = replacer(meta);
|
|
164
163
|
// Build description for the meta/service extension package
|
|
165
164
|
const metaDesc = metaExtensionDesc || `${metaExtensionName} service utilities for managing domains, APIs, and services`;
|
|
166
165
|
// Detect missing modules at workspace level and prompt user
|
|
@@ -189,11 +188,10 @@ const exportMigrationsToDisk = async ({ project, options, database, databaseId,
|
|
|
189
188
|
schemas: metaSchemasForReplacement,
|
|
190
189
|
name: metaExtensionName
|
|
191
190
|
});
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
content: `SET session_replication_role TO replica;
|
|
191
|
+
// Create separate files for each table type
|
|
192
|
+
const metaPackage = [];
|
|
193
|
+
// Common header for all meta files
|
|
194
|
+
const commonHeader = `SET session_replication_role TO replica;
|
|
197
195
|
-- using replica in case we are deploying triggers to metaschema_public
|
|
198
196
|
|
|
199
197
|
-- unaccent, postgis affected and require grants
|
|
@@ -207,24 +205,92 @@ DO $LQLMIGRATION$
|
|
|
207
205
|
EXECUTE format('GRANT CONNECT ON DATABASE %I TO %I', current_database(), 'app_admin');
|
|
208
206
|
|
|
209
207
|
END;
|
|
210
|
-
$LQLMIGRATION
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
208
|
+
$LQLMIGRATION$;`;
|
|
209
|
+
const commonFooter = `
|
|
210
|
+
SET session_replication_role TO DEFAULT;`;
|
|
211
|
+
// Define table ordering with dependencies
|
|
212
|
+
// Tables that depend on 'database' being inserted first
|
|
213
|
+
const tableOrder = [
|
|
214
|
+
'database',
|
|
215
|
+
'database_extension',
|
|
216
|
+
'schema',
|
|
217
|
+
'table',
|
|
218
|
+
'field',
|
|
219
|
+
'policy',
|
|
220
|
+
'index',
|
|
221
|
+
'trigger',
|
|
222
|
+
'trigger_function',
|
|
223
|
+
'rls_function',
|
|
224
|
+
'limit_function',
|
|
225
|
+
'procedure',
|
|
226
|
+
'foreign_key_constraint',
|
|
227
|
+
'primary_key_constraint',
|
|
228
|
+
'unique_constraint',
|
|
229
|
+
'check_constraint',
|
|
230
|
+
'full_text_search',
|
|
231
|
+
'schema_grant',
|
|
232
|
+
'table_grant',
|
|
233
|
+
'domains',
|
|
234
|
+
'sites',
|
|
235
|
+
'apis',
|
|
236
|
+
'apps',
|
|
237
|
+
'site_modules',
|
|
238
|
+
'site_themes',
|
|
239
|
+
'site_metadata',
|
|
240
|
+
'api_modules',
|
|
241
|
+
'api_extensions',
|
|
242
|
+
'api_schemas',
|
|
243
|
+
'rls_module',
|
|
244
|
+
'user_auth_module',
|
|
245
|
+
'memberships_module',
|
|
246
|
+
'permissions_module',
|
|
247
|
+
'limits_module',
|
|
248
|
+
'levels_module',
|
|
249
|
+
'users_module',
|
|
250
|
+
'hierarchy_module',
|
|
251
|
+
'membership_types_module',
|
|
252
|
+
'invites_module',
|
|
253
|
+
'emails_module',
|
|
254
|
+
'tokens_module',
|
|
255
|
+
'secrets_module',
|
|
256
|
+
'profiles_module',
|
|
257
|
+
'encrypted_secrets_module',
|
|
258
|
+
'connected_accounts_module',
|
|
259
|
+
'phone_numbers_module',
|
|
260
|
+
'crypto_addresses_module',
|
|
261
|
+
'crypto_auth_module',
|
|
262
|
+
'field_module',
|
|
263
|
+
'uuid_module',
|
|
264
|
+
'default_ids_module',
|
|
265
|
+
'denormalized_table_field'
|
|
266
|
+
];
|
|
267
|
+
// Track which tables have content for dependency resolution
|
|
268
|
+
const tablesWithContent = [];
|
|
269
|
+
// Create a file for each table type that has content
|
|
270
|
+
for (const tableName of tableOrder) {
|
|
271
|
+
const tableSql = metaResult[tableName];
|
|
272
|
+
if (tableSql) {
|
|
273
|
+
const replacedSql = metaReplacer.replacer(tableSql);
|
|
274
|
+
// Determine dependencies - each table depends on the previous tables that have content
|
|
275
|
+
// This ensures proper ordering during deployment
|
|
276
|
+
const deps = tableName === 'database'
|
|
277
|
+
? []
|
|
278
|
+
: tablesWithContent.length > 0
|
|
279
|
+
? [`migrate/${tablesWithContent[tablesWithContent.length - 1]}`]
|
|
280
|
+
: [];
|
|
281
|
+
metaPackage.push({
|
|
282
|
+
deps,
|
|
283
|
+
deploy: `migrate/${tableName}`,
|
|
284
|
+
content: `${commonHeader}
|
|
220
285
|
|
|
221
|
-
|
|
222
|
-
-- SET dbname = current_database() WHERE TRUE;
|
|
286
|
+
${replacedSql}
|
|
223
287
|
|
|
224
|
-
|
|
288
|
+
${commonFooter}
|
|
225
289
|
`
|
|
290
|
+
});
|
|
291
|
+
tablesWithContent.push(tableName);
|
|
226
292
|
}
|
|
227
|
-
|
|
293
|
+
}
|
|
228
294
|
opts.replacer = metaReplacer.replacer;
|
|
229
295
|
opts.name = metaExtensionName;
|
|
230
296
|
opts.outdir = svcOutdir;
|
package/export/export-meta.d.ts
CHANGED
|
@@ -4,5 +4,6 @@ interface ExportMetaParams {
|
|
|
4
4
|
dbname: string;
|
|
5
5
|
database_id: string;
|
|
6
6
|
}
|
|
7
|
-
export
|
|
7
|
+
export type ExportMetaResult = Record<string, string>;
|
|
8
|
+
export declare const exportMeta: ({ opts, dbname, database_id }: ExportMetaParams) => Promise<ExportMetaResult>;
|
|
8
9
|
export {};
|
package/export/export-meta.js
CHANGED
|
@@ -229,15 +229,6 @@ const config = {
|
|
|
229
229
|
privilege: 'text'
|
|
230
230
|
}
|
|
231
231
|
},
|
|
232
|
-
extension: {
|
|
233
|
-
schema: 'metaschema_public',
|
|
234
|
-
table: 'extension',
|
|
235
|
-
fields: {
|
|
236
|
-
id: 'uuid',
|
|
237
|
-
database_id: 'uuid',
|
|
238
|
-
name: 'text'
|
|
239
|
-
}
|
|
240
|
-
},
|
|
241
232
|
// =============================================================================
|
|
242
233
|
// services_public tables
|
|
243
234
|
// =============================================================================
|
|
@@ -827,7 +818,6 @@ const exportMeta = async ({ opts, dbname, database_id }) => {
|
|
|
827
818
|
await queryAndParse('full_text_search', `SELECT * FROM metaschema_public.full_text_search WHERE database_id = $1`);
|
|
828
819
|
await queryAndParse('schema_grant', `SELECT * FROM metaschema_public.schema_grant WHERE database_id = $1`);
|
|
829
820
|
await queryAndParse('table_grant', `SELECT * FROM metaschema_public.table_grant WHERE database_id = $1`);
|
|
830
|
-
await queryAndParse('extension', `SELECT * FROM metaschema_public.extension WHERE database_id = $1`);
|
|
831
821
|
// =============================================================================
|
|
832
822
|
// services_public tables
|
|
833
823
|
// =============================================================================
|
|
@@ -867,6 +857,6 @@ const exportMeta = async ({ opts, dbname, database_id }) => {
|
|
|
867
857
|
await queryAndParse('uuid_module', `SELECT * FROM metaschema_modules_public.uuid_module WHERE database_id = $1`);
|
|
868
858
|
await queryAndParse('default_ids_module', `SELECT * FROM metaschema_modules_public.default_ids_module WHERE database_id = $1`);
|
|
869
859
|
await queryAndParse('denormalized_table_field', `SELECT * FROM metaschema_modules_public.denormalized_table_field WHERE database_id = $1`);
|
|
870
|
-
return
|
|
860
|
+
return sql;
|
|
871
861
|
};
|
|
872
862
|
exports.exportMeta = exportMeta;
|
|
@@ -161,12 +161,11 @@ const exportMigrationsToDisk = async ({ project, options, database, databaseId,
|
|
|
161
161
|
}
|
|
162
162
|
(0, files_1.writePgpmPlan)(results.rows, opts);
|
|
163
163
|
(0, files_1.writePgpmFiles)(results.rows, opts);
|
|
164
|
-
|
|
164
|
+
const metaResult = await (0, export_meta_1.exportMeta)({
|
|
165
165
|
opts: options,
|
|
166
166
|
dbname: database,
|
|
167
167
|
database_id: databaseId
|
|
168
168
|
});
|
|
169
|
-
meta = replacer(meta);
|
|
170
169
|
// Build description for the meta/service extension package
|
|
171
170
|
const metaDesc = metaExtensionDesc || `${metaExtensionName} service utilities for managing domains, APIs, and services`;
|
|
172
171
|
// Detect missing modules at workspace level and prompt user
|
|
@@ -195,11 +194,10 @@ const exportMigrationsToDisk = async ({ project, options, database, databaseId,
|
|
|
195
194
|
schemas: metaSchemasForReplacement,
|
|
196
195
|
name: metaExtensionName
|
|
197
196
|
});
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
content: `SET session_replication_role TO replica;
|
|
197
|
+
// Create separate files for each table type
|
|
198
|
+
const metaPackage = [];
|
|
199
|
+
// Common header for all meta files
|
|
200
|
+
const commonHeader = `SET session_replication_role TO replica;
|
|
203
201
|
-- using replica in case we are deploying triggers to metaschema_public
|
|
204
202
|
|
|
205
203
|
-- unaccent, postgis affected and require grants
|
|
@@ -213,24 +211,92 @@ DO $LQLMIGRATION$
|
|
|
213
211
|
EXECUTE format('GRANT CONNECT ON DATABASE %I TO %I', current_database(), 'app_admin');
|
|
214
212
|
|
|
215
213
|
END;
|
|
216
|
-
$LQLMIGRATION
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
214
|
+
$LQLMIGRATION$;`;
|
|
215
|
+
const commonFooter = `
|
|
216
|
+
SET session_replication_role TO DEFAULT;`;
|
|
217
|
+
// Define table ordering with dependencies
|
|
218
|
+
// Tables that depend on 'database' being inserted first
|
|
219
|
+
const tableOrder = [
|
|
220
|
+
'database',
|
|
221
|
+
'database_extension',
|
|
222
|
+
'schema',
|
|
223
|
+
'table',
|
|
224
|
+
'field',
|
|
225
|
+
'policy',
|
|
226
|
+
'index',
|
|
227
|
+
'trigger',
|
|
228
|
+
'trigger_function',
|
|
229
|
+
'rls_function',
|
|
230
|
+
'limit_function',
|
|
231
|
+
'procedure',
|
|
232
|
+
'foreign_key_constraint',
|
|
233
|
+
'primary_key_constraint',
|
|
234
|
+
'unique_constraint',
|
|
235
|
+
'check_constraint',
|
|
236
|
+
'full_text_search',
|
|
237
|
+
'schema_grant',
|
|
238
|
+
'table_grant',
|
|
239
|
+
'domains',
|
|
240
|
+
'sites',
|
|
241
|
+
'apis',
|
|
242
|
+
'apps',
|
|
243
|
+
'site_modules',
|
|
244
|
+
'site_themes',
|
|
245
|
+
'site_metadata',
|
|
246
|
+
'api_modules',
|
|
247
|
+
'api_extensions',
|
|
248
|
+
'api_schemas',
|
|
249
|
+
'rls_module',
|
|
250
|
+
'user_auth_module',
|
|
251
|
+
'memberships_module',
|
|
252
|
+
'permissions_module',
|
|
253
|
+
'limits_module',
|
|
254
|
+
'levels_module',
|
|
255
|
+
'users_module',
|
|
256
|
+
'hierarchy_module',
|
|
257
|
+
'membership_types_module',
|
|
258
|
+
'invites_module',
|
|
259
|
+
'emails_module',
|
|
260
|
+
'tokens_module',
|
|
261
|
+
'secrets_module',
|
|
262
|
+
'profiles_module',
|
|
263
|
+
'encrypted_secrets_module',
|
|
264
|
+
'connected_accounts_module',
|
|
265
|
+
'phone_numbers_module',
|
|
266
|
+
'crypto_addresses_module',
|
|
267
|
+
'crypto_auth_module',
|
|
268
|
+
'field_module',
|
|
269
|
+
'uuid_module',
|
|
270
|
+
'default_ids_module',
|
|
271
|
+
'denormalized_table_field'
|
|
272
|
+
];
|
|
273
|
+
// Track which tables have content for dependency resolution
|
|
274
|
+
const tablesWithContent = [];
|
|
275
|
+
// Create a file for each table type that has content
|
|
276
|
+
for (const tableName of tableOrder) {
|
|
277
|
+
const tableSql = metaResult[tableName];
|
|
278
|
+
if (tableSql) {
|
|
279
|
+
const replacedSql = metaReplacer.replacer(tableSql);
|
|
280
|
+
// Determine dependencies - each table depends on the previous tables that have content
|
|
281
|
+
// This ensures proper ordering during deployment
|
|
282
|
+
const deps = tableName === 'database'
|
|
283
|
+
? []
|
|
284
|
+
: tablesWithContent.length > 0
|
|
285
|
+
? [`migrate/${tablesWithContent[tablesWithContent.length - 1]}`]
|
|
286
|
+
: [];
|
|
287
|
+
metaPackage.push({
|
|
288
|
+
deps,
|
|
289
|
+
deploy: `migrate/${tableName}`,
|
|
290
|
+
content: `${commonHeader}
|
|
226
291
|
|
|
227
|
-
|
|
228
|
-
-- SET dbname = current_database() WHERE TRUE;
|
|
292
|
+
${replacedSql}
|
|
229
293
|
|
|
230
|
-
|
|
294
|
+
${commonFooter}
|
|
231
295
|
`
|
|
296
|
+
});
|
|
297
|
+
tablesWithContent.push(tableName);
|
|
232
298
|
}
|
|
233
|
-
|
|
299
|
+
}
|
|
234
300
|
opts.replacer = metaReplacer.replacer;
|
|
235
301
|
opts.name = metaExtensionName;
|
|
236
302
|
opts.outdir = svcOutdir;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pgpmjs/core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.13.0",
|
|
4
4
|
"author": "Constructive <developers@constructive.io>",
|
|
5
5
|
"description": "PGPM Package and Migration Tools",
|
|
6
6
|
"main": "index.js",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"pgsql-parser": "^17.9.11",
|
|
65
65
|
"yanse": "^0.1.11"
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "eff12e839462a1d5435f04318db1f44fc141e235"
|
|
68
68
|
}
|