nesoi 3.0.8 → 3.0.9
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/lib/adapters/postgres/src/migrator/database.d.ts +3 -6
- package/lib/adapters/postgres/src/migrator/database.js +20 -20
- package/lib/adapters/postgres/src/migrator/generator/generator.d.ts +22 -0
- package/lib/adapters/postgres/src/migrator/generator/generator.js +326 -0
- package/lib/adapters/postgres/src/migrator/generator/migration.d.ts +66 -0
- package/lib/adapters/postgres/src/migrator/generator/migration.js +249 -0
- package/lib/adapters/postgres/src/migrator/generator/provider.d.ts +19 -0
- package/lib/adapters/postgres/src/migrator/{migrator.js → generator/provider.js} +23 -25
- package/lib/adapters/postgres/src/migrator/index.d.ts +47 -1
- package/lib/adapters/postgres/src/migrator/index.js +20 -3
- package/lib/adapters/postgres/src/migrator/runner/runner.d.ts +17 -0
- package/lib/adapters/postgres/src/migrator/runner/runner.js +249 -0
- package/lib/adapters/postgres/src/migrator/runner/status.d.ts +17 -0
- package/lib/adapters/postgres/src/migrator/runner/status.js +55 -0
- package/lib/adapters/postgres/src/postgres.cli.d.ts +11 -1
- package/lib/adapters/postgres/src/postgres.cli.js +34 -11
- package/lib/adapters/postgres/test/postgres.bucket_adapter.test.js +4 -4
- package/lib/compiler/apps/monolyth/stages/1_mkdir_stage.d.ts +3 -0
- package/lib/compiler/apps/monolyth/stages/1_mkdir_stage.js +3 -0
- package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.d.ts +3 -0
- package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.js +3 -0
- package/lib/compiler/apps/monolyth/stages/3_copy_types_stage.d.ts +3 -0
- package/lib/compiler/apps/monolyth/stages/3_copy_types_stage.js +3 -0
- package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.d.ts +3 -0
- package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.js +3 -0
- package/lib/compiler/apps/monolyth/stages/5_dump_cli_stage.d.ts +3 -0
- package/lib/compiler/apps/monolyth/stages/5_dump_cli_stage.js +3 -0
- package/lib/compiler/apps/monolyth/stages/6_dump_package_json_stage.d.ts +3 -0
- package/lib/compiler/apps/monolyth/stages/6_dump_package_json_stage.js +3 -0
- package/lib/compiler/elements/externals.element.d.ts +1 -1
- package/lib/compiler/module.js +1 -1
- package/lib/compiler/stages/1_scan_stage.d.ts +3 -0
- package/lib/compiler/stages/1_scan_stage.js +3 -0
- package/lib/compiler/stages/2_treeshake_stage.d.ts +3 -0
- package/lib/compiler/stages/2_treeshake_stage.js +3 -0
- package/lib/compiler/stages/3_extract_ts_stage.d.ts +3 -0
- package/lib/compiler/stages/3_extract_ts_stage.js +3 -0
- package/lib/compiler/stages/4_build_schemas_stage.d.ts +3 -0
- package/lib/compiler/stages/4_build_schemas_stage.js +3 -0
- package/lib/compiler/stages/5_inject_ts_stage.d.ts +3 -0
- package/lib/compiler/stages/5_inject_ts_stage.js +3 -0
- package/lib/compiler/stages/6_build_elements_stage.d.ts +3 -0
- package/lib/compiler/stages/6_build_elements_stage.js +3 -0
- package/lib/compiler/stages/7_dump_stage.d.ts +3 -0
- package/lib/compiler/stages/7_dump_stage.js +3 -0
- package/lib/compiler/stages/8_diagnose_stage.d.ts +3 -0
- package/lib/compiler/stages/8_diagnose_stage.js +3 -0
- package/lib/compiler/treeshake.js +3 -3
- package/lib/elements/blocks/block.builder.d.ts +6 -2
- package/lib/elements/blocks/block.builder.js +8 -4
- package/lib/elements/blocks/block.schema.d.ts +4 -0
- package/lib/elements/blocks/block.schema.js +4 -0
- package/lib/elements/blocks/job/internal/machine_job.builder.d.ts +6 -3
- package/lib/elements/blocks/job/internal/machine_job.builder.js +5 -2
- package/lib/elements/blocks/job/internal/machine_job.schema.d.ts +4 -0
- package/lib/elements/blocks/job/internal/machine_job.schema.js +4 -0
- package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +4 -0
- package/lib/elements/blocks/job/internal/resource_job.builder.js +4 -0
- package/lib/elements/blocks/job/internal/resource_job.d.ts +4 -0
- package/lib/elements/blocks/job/internal/resource_job.js +4 -0
- package/lib/elements/blocks/job/internal/resource_job.schema.d.ts +4 -0
- package/lib/elements/blocks/job/internal/resource_job.schema.js +4 -0
- package/lib/elements/blocks/job/job.builder.d.ts +4 -0
- package/lib/elements/blocks/job/job.builder.js +4 -0
- package/lib/elements/blocks/job/job.d.ts +4 -0
- package/lib/elements/blocks/job/job.js +4 -0
- package/lib/elements/blocks/job/job.schema.d.ts +4 -0
- package/lib/elements/blocks/job/job.schema.js +4 -0
- package/lib/elements/blocks/machine/machine.builder.d.ts +4 -0
- package/lib/elements/blocks/machine/machine.builder.js +4 -0
- package/lib/elements/blocks/machine/machine.d.ts +12 -0
- package/lib/elements/blocks/machine/machine.js +12 -0
- package/lib/elements/blocks/machine/machine.schema.d.ts +16 -0
- package/lib/elements/blocks/machine/machine.schema.js +16 -1
- package/lib/elements/blocks/machine/machine_state.builder.d.ts +4 -0
- package/lib/elements/blocks/machine/machine_state.builder.js +4 -0
- package/lib/elements/blocks/machine/machine_transition.builder.d.ts +4 -0
- package/lib/elements/blocks/machine/machine_transition.builder.js +4 -0
- package/lib/elements/blocks/queue/adapters/bucket.queue_adapter.d.ts +4 -0
- package/lib/elements/blocks/queue/adapters/bucket.queue_adapter.js +4 -0
- package/lib/elements/blocks/queue/adapters/queue_adapter.d.ts +4 -0
- package/lib/elements/blocks/queue/adapters/queue_adapter.js +4 -0
- package/lib/elements/blocks/queue/queue.builder.d.ts +4 -0
- package/lib/elements/blocks/queue/queue.builder.js +4 -0
- package/lib/elements/blocks/queue/queue.schema.d.ts +4 -0
- package/lib/elements/blocks/queue/queue.schema.js +4 -0
- package/lib/elements/blocks/resource/resource.builder.d.ts +4 -0
- package/lib/elements/blocks/resource/resource.builder.js +4 -0
- package/lib/elements/blocks/resource/resource.d.ts +4 -0
- package/lib/elements/blocks/resource/resource.js +4 -0
- package/lib/elements/blocks/resource/resource.schema.d.ts +4 -0
- package/lib/elements/blocks/resource/resource.schema.js +4 -0
- package/lib/elements/edge/controller/adapters/cli.controller_adapter.d.ts +4 -0
- package/lib/elements/edge/controller/adapters/cli.controller_adapter.js +4 -0
- package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +4 -0
- package/lib/elements/edge/controller/adapters/controller_adapter.js +4 -0
- package/lib/elements/edge/controller/controller.builder.d.ts +16 -0
- package/lib/elements/edge/controller/controller.builder.js +16 -0
- package/lib/elements/edge/controller/controller.d.ts +4 -0
- package/lib/elements/edge/controller/controller.js +4 -0
- package/lib/elements/edge/controller/controller.schema.d.ts +16 -0
- package/lib/elements/edge/controller/controller.schema.js +16 -0
- package/lib/elements/{blocks → edge}/externals/externals.builder.d.ts +4 -0
- package/lib/elements/{blocks → edge}/externals/externals.builder.js +4 -0
- package/lib/elements/{blocks → edge}/externals/externals.schema.d.ts +4 -0
- package/lib/elements/{blocks → edge}/externals/externals.schema.js +4 -0
- package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +16 -11
- package/lib/elements/entities/bucket/adapters/bucket_adapter.js +5 -0
- package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +4 -0
- package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +4 -0
- package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +4 -1
- package/lib/elements/entities/bucket/adapters/memory.nql.js +4 -1
- package/lib/elements/entities/bucket/bucket.builder.d.ts +4 -0
- package/lib/elements/entities/bucket/bucket.builder.js +4 -0
- package/lib/elements/entities/bucket/bucket.d.ts +9 -2
- package/lib/elements/entities/bucket/bucket.js +14 -7
- package/lib/elements/entities/bucket/bucket.schema.d.ts +4 -0
- package/lib/elements/entities/bucket/bucket.schema.js +4 -0
- package/lib/elements/entities/bucket/cache/bucket_cache.d.ts +8 -0
- package/lib/elements/entities/bucket/cache/bucket_cache.js +8 -0
- package/lib/elements/entities/bucket/graph/bucket_graph.builder.d.ts +4 -0
- package/lib/elements/entities/bucket/graph/bucket_graph.builder.js +4 -0
- package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +4 -0
- package/lib/elements/entities/bucket/graph/bucket_graph.js +4 -0
- package/lib/elements/entities/bucket/graph/bucket_graph.schema.d.ts +8 -0
- package/lib/elements/entities/bucket/graph/bucket_graph.schema.js +8 -0
- package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +8 -0
- package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.js +8 -0
- package/lib/elements/entities/bucket/model/bucket_model.builder.d.ts +4 -0
- package/lib/elements/entities/bucket/model/bucket_model.builder.js +4 -0
- package/lib/elements/entities/bucket/model/bucket_model.convert.d.ts +8 -0
- package/lib/elements/entities/bucket/model/bucket_model.convert.js +8 -0
- package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +8 -0
- package/lib/elements/entities/bucket/model/bucket_model.schema.js +8 -0
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +8 -0
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +8 -0
- package/lib/elements/entities/bucket/query/nql_compiler.d.ts +9 -0
- package/lib/elements/entities/bucket/query/nql_compiler.js +9 -0
- package/lib/elements/entities/bucket/query/nql_engine.d.ts +6 -0
- package/lib/elements/entities/bucket/query/nql_engine.js +6 -0
- package/lib/elements/entities/bucket/view/bucket_view.builder.d.ts +4 -0
- package/lib/elements/entities/bucket/view/bucket_view.builder.js +4 -0
- package/lib/elements/entities/bucket/view/bucket_view.d.ts +4 -0
- package/lib/elements/entities/bucket/view/bucket_view.js +10 -2
- package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +8 -0
- package/lib/elements/entities/bucket/view/bucket_view.schema.js +8 -0
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +8 -0
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +8 -0
- package/lib/elements/entities/constants/constants.builder.d.ts +21 -6
- package/lib/elements/entities/constants/constants.builder.js +21 -6
- package/lib/elements/entities/constants/constants.d.ts +4 -0
- package/lib/elements/entities/constants/constants.js +4 -0
- package/lib/elements/entities/constants/constants.schema.d.ts +16 -0
- package/lib/elements/entities/constants/constants.schema.js +16 -0
- package/lib/elements/entities/drive/drive_adapter.d.ts +15 -10
- package/lib/elements/entities/drive/drive_adapter.js +5 -2
- package/lib/elements/entities/drive/local.drive_adapter.d.ts +10 -4
- package/lib/elements/entities/drive/local.drive_adapter.js +23 -8
- package/lib/elements/entities/message/message.builder.d.ts +4 -0
- package/lib/elements/entities/message/message.builder.js +4 -0
- package/lib/elements/entities/message/message.d.ts +4 -0
- package/lib/elements/entities/message/message.js +4 -0
- package/lib/elements/entities/message/message.schema.d.ts +4 -0
- package/lib/elements/entities/message/message.schema.js +4 -0
- package/lib/elements/entities/message/message_parser.d.ts +4 -0
- package/lib/elements/entities/message/message_parser.js +4 -0
- package/lib/elements/entities/message/template/message_template.builder.d.ts +4 -0
- package/lib/elements/entities/message/template/message_template.builder.js +4 -0
- package/lib/elements/entities/message/template/message_template.schema.d.ts +9 -0
- package/lib/elements/entities/message/template/message_template.schema.js +25 -0
- package/lib/elements/entities/message/template/message_template_field.builder.d.ts +8 -0
- package/lib/elements/entities/message/template/message_template_field.builder.js +8 -0
- package/lib/elements/index.d.ts +1 -1
- package/lib/elements/index.js +1 -1
- package/lib/engine/apps/app.config.d.ts +3 -0
- package/lib/engine/apps/app.config.js +3 -0
- package/lib/engine/apps/app.d.ts +3 -0
- package/lib/engine/apps/app.js +4 -1
- package/lib/engine/apps/inline.app.d.ts +3 -0
- package/lib/engine/apps/inline.app.js +3 -0
- package/lib/engine/apps/monolyth/monolyth.app.d.ts +8 -0
- package/lib/engine/apps/monolyth/monolyth.app.js +8 -0
- package/lib/engine/auth/authn.d.ts +4 -0
- package/lib/engine/auth/authn.js +4 -0
- package/lib/engine/auth/zero.authn_provider.d.ts +4 -0
- package/lib/engine/auth/zero.authn_provider.js +4 -0
- package/lib/engine/cli/cli.d.ts +7 -1
- package/lib/engine/cli/cli.js +10 -1
- package/lib/engine/cli/cli_adapter.d.ts +11 -1
- package/lib/engine/cli/cli_adapter.js +10 -1
- package/lib/engine/cli/cli_input.d.ts +4 -0
- package/lib/engine/cli/cli_input.js +4 -0
- package/lib/engine/cli/ui.d.ts +14 -2
- package/lib/engine/cli/ui.js +10 -6
- package/lib/engine/daemon.d.ts +93 -6
- package/lib/engine/daemon.js +90 -7
- package/lib/engine/data/date.d.ts +4 -0
- package/lib/engine/data/date.js +4 -0
- package/lib/engine/data/datetime.d.ts +4 -0
- package/lib/engine/data/datetime.js +4 -0
- package/lib/engine/data/decimal.d.ts +4 -0
- package/lib/engine/data/decimal.js +4 -0
- package/lib/engine/data/file.d.ts +23 -23
- package/lib/engine/data/file.js +66 -29
- package/lib/engine/data/json.d.ts +4 -0
- package/lib/engine/data/json.js +4 -0
- package/lib/engine/data/tree.d.ts +4 -0
- package/lib/engine/data/tree.js +4 -0
- package/lib/engine/dependency.d.ts +63 -2
- package/lib/engine/dependency.js +52 -0
- package/lib/engine/module.d.ts +108 -8
- package/lib/engine/module.js +107 -22
- package/lib/engine/space.d.ts +163 -10
- package/lib/engine/space.js +184 -22
- package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +12 -0
- package/lib/engine/transaction/nodes/bucket.trx_node.js +12 -0
- package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +4 -0
- package/lib/engine/transaction/nodes/bucket_query.trx_node.js +4 -0
- package/lib/engine/transaction/nodes/job.trx_node.d.ts +4 -0
- package/lib/engine/transaction/nodes/job.trx_node.js +4 -0
- package/lib/engine/transaction/nodes/machine.trx_node.d.ts +4 -0
- package/lib/engine/transaction/nodes/machine.trx_node.js +4 -0
- package/lib/engine/transaction/nodes/queue.trx_node.d.ts +4 -0
- package/lib/engine/transaction/nodes/queue.trx_node.js +4 -0
- package/lib/engine/transaction/nodes/resource.trx_node.d.ts +4 -0
- package/lib/engine/transaction/nodes/resource.trx_node.js +4 -0
- package/lib/engine/transaction/trx.d.ts +8 -0
- package/lib/engine/transaction/trx.js +8 -0
- package/lib/engine/transaction/trx_engine.d.ts +4 -0
- package/lib/engine/transaction/trx_engine.js +4 -3
- package/lib/engine/transaction/trx_node.d.ts +4 -0
- package/lib/engine/transaction/trx_node.js +4 -0
- package/lib/engine/tree.d.ts +54 -2
- package/lib/engine/tree.js +54 -2
- package/lib/engine/util/mime.d.ts +4 -4
- package/lib/engine/util/mime.js +7 -9
- package/lib/schema.d.ts +1 -1
- package/package.json +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/lib/adapters/postgres/src/migrator/bucket.d.ts +0 -20
- package/lib/adapters/postgres/src/migrator/bucket.js +0 -184
- package/lib/adapters/postgres/src/migrator/migration.d.ts +0 -57
- package/lib/adapters/postgres/src/migrator/migration.js +0 -203
- package/lib/adapters/postgres/src/migrator/migrator.d.ts +0 -21
- package/lib/adapters/postgres/src/migrator/runner.d.ts +0 -71
- package/lib/adapters/postgres/src/migrator/runner.js +0 -271
- package/lib/elements/entities/bucket/adapters/memory.bucket_query copy.d.ts +0 -0
- package/lib/elements/entities/bucket/adapters/memory.bucket_query copy.js +0 -218
- package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.d.ts +0 -0
- package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.js +0 -47
- package/lib/engine/apps/monolyth/monolyth.cli.d.ts +0 -45
- package/lib/engine/apps/monolyth/monolyth.cli.js +0 -362
- package/lib/engine/util/cache.d.ts +0 -6
- package/lib/engine/util/cache.js +0 -20
|
@@ -2,6 +2,7 @@ import postgres from 'postgres';
|
|
|
2
2
|
export type TableColumn = {
|
|
3
3
|
column_name: string;
|
|
4
4
|
data_type: string;
|
|
5
|
+
udt_name: string;
|
|
5
6
|
nullable: boolean;
|
|
6
7
|
field_exists: boolean;
|
|
7
8
|
};
|
|
@@ -18,20 +19,16 @@ export declare class Database {
|
|
|
18
19
|
* @param config
|
|
19
20
|
*/
|
|
20
21
|
static listTables(sql: postgres.Sql<any>): Promise<any[]>;
|
|
21
|
-
/**
|
|
22
|
-
* Read schema of table.
|
|
23
|
-
* @param config
|
|
24
|
-
*/
|
|
25
|
-
private getSchema;
|
|
26
22
|
/**
|
|
27
23
|
* Connect to PostgreSQL and create a database.
|
|
28
24
|
*
|
|
29
25
|
* The `if_exists` flag controls what happens if the database already exists
|
|
30
26
|
* - fail: Throw an exception
|
|
31
27
|
* - keep: Do nothing
|
|
32
|
-
* - delete:
|
|
28
|
+
* - delete: **DROP DATABASE**
|
|
33
29
|
*/
|
|
34
30
|
static createDatabase(name: string, config?: postgres.Options<any>, $?: {
|
|
31
|
+
default_db?: string;
|
|
35
32
|
if_exists: 'fail' | 'keep' | 'delete';
|
|
36
33
|
}): Promise<void>;
|
|
37
34
|
}
|
|
@@ -37,35 +37,35 @@ class Database {
|
|
|
37
37
|
`;
|
|
38
38
|
return columns.map(col => col.table_name);
|
|
39
39
|
}
|
|
40
|
-
/**
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
async getSchema(sql
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
40
|
+
// /**
|
|
41
|
+
// * Read schema of a table.
|
|
42
|
+
// * @param config
|
|
43
|
+
// */
|
|
44
|
+
// private async getSchema(sql: postgres.Sql<any>, tableName: string): Promise<TableColumn[] | undefined> {
|
|
45
|
+
// const columns = await sql`
|
|
46
|
+
// SELECT column_name, data_type, is_nullable
|
|
47
|
+
// FROM information_schema.columns
|
|
48
|
+
// WHERE table_name = ${tableName}`;
|
|
49
|
+
// if (!columns.length) {
|
|
50
|
+
// return
|
|
51
|
+
// }
|
|
52
|
+
// return columns.map(col => ({
|
|
53
|
+
// ...col,
|
|
54
|
+
// nullable: col.is_nullable === 'YES',
|
|
55
|
+
// field_exists: false
|
|
56
|
+
// }) as TableColumn);
|
|
57
|
+
// }
|
|
58
58
|
/**
|
|
59
59
|
* Connect to PostgreSQL and create a database.
|
|
60
60
|
*
|
|
61
61
|
* The `if_exists` flag controls what happens if the database already exists
|
|
62
62
|
* - fail: Throw an exception
|
|
63
63
|
* - keep: Do nothing
|
|
64
|
-
* - delete:
|
|
64
|
+
* - delete: **DROP DATABASE**
|
|
65
65
|
*/
|
|
66
66
|
static async createDatabase(name, config, $) {
|
|
67
67
|
const sql = (0, postgres_1.default)(Object.assign({}, config, {
|
|
68
|
-
db: 'postgres'
|
|
68
|
+
db: $?.default_db || 'postgres'
|
|
69
69
|
}));
|
|
70
70
|
const dbs = await sql `SELECT datname FROM pg_database`;
|
|
71
71
|
const alreadyExists = dbs.some(db => db.datname === name);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { $Bucket, $Space } from "../../../../../elements";
|
|
2
|
+
import postgres from 'postgres';
|
|
3
|
+
import { AnyDaemon } from "../../../../../engine/daemon";
|
|
4
|
+
import { BucketAdapterConfig } from "../../../../../elements/entities/bucket/adapters/bucket_adapter";
|
|
5
|
+
import { $Migration } from './migration';
|
|
6
|
+
export declare class MigrationGenerator<S extends $Space, D extends AnyDaemon, ModuleName extends NoInfer<keyof S['modules']>> {
|
|
7
|
+
private sql;
|
|
8
|
+
private module;
|
|
9
|
+
private tableName;
|
|
10
|
+
protected schema: $Bucket;
|
|
11
|
+
protected config?: BucketAdapterConfig;
|
|
12
|
+
constructor(daemon: D, sql: postgres.Sql<any>, module: ModuleName, bucketName: NoInfer<keyof S['modules'][ModuleName]['buckets']>, tableName: string);
|
|
13
|
+
generate(): Promise<$Migration | undefined>;
|
|
14
|
+
private getCurrentSchema;
|
|
15
|
+
private generateDrops;
|
|
16
|
+
private generateSteps;
|
|
17
|
+
private generateFieldSteps;
|
|
18
|
+
private fieldUdt;
|
|
19
|
+
private fieldTypeFromUdt;
|
|
20
|
+
private fieldType;
|
|
21
|
+
private manualReview;
|
|
22
|
+
}
|
|
@@ -0,0 +1,326 @@
|
|
|
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.MigrationGenerator = void 0;
|
|
7
|
+
const daemon_1 = require("../../../../../engine/daemon");
|
|
8
|
+
const migration_1 = require("./migration");
|
|
9
|
+
const string_1 = require("../../../../../engine/util/string");
|
|
10
|
+
const ui_1 = __importDefault(require("../../../../../engine/cli/ui"));
|
|
11
|
+
const log_1 = require("../../../../../engine/util/log");
|
|
12
|
+
class MigrationOption {
|
|
13
|
+
constructor(schema) {
|
|
14
|
+
this.schema = schema;
|
|
15
|
+
this.selected = false;
|
|
16
|
+
this.excluded_by = [];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
class MigrationGenerator {
|
|
20
|
+
constructor(daemon, sql, module, bucketName, tableName) {
|
|
21
|
+
this.sql = sql;
|
|
22
|
+
this.module = module;
|
|
23
|
+
this.tableName = tableName;
|
|
24
|
+
const bucket = daemon_1.Daemon.getModule(daemon, module).buckets[bucketName];
|
|
25
|
+
this.schema = bucket.schema;
|
|
26
|
+
this.config = bucket.adapter.config;
|
|
27
|
+
}
|
|
28
|
+
async generate() {
|
|
29
|
+
const current = await this.getCurrentSchema();
|
|
30
|
+
const drops = current ? this.generateDrops(current.columns) : {};
|
|
31
|
+
const steps = this.generateSteps(current?.mapped, drops);
|
|
32
|
+
steps.push(...Object.values(drops).map(d => ({
|
|
33
|
+
options: [d]
|
|
34
|
+
})));
|
|
35
|
+
if (!steps.length) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const type = current ? 'alter' : 'create';
|
|
39
|
+
const migration = await this.manualReview(type, steps);
|
|
40
|
+
return migration;
|
|
41
|
+
}
|
|
42
|
+
async getCurrentSchema() {
|
|
43
|
+
const rawColumns = await this.sql `
|
|
44
|
+
SELECT column_name, udt_name, is_nullable, numeric_precision, numeric_scale
|
|
45
|
+
FROM information_schema.columns
|
|
46
|
+
WHERE table_name = ${this.tableName}`;
|
|
47
|
+
if (!rawColumns.length) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const columns = rawColumns.map(col => ({
|
|
51
|
+
column_name: col.column_name,
|
|
52
|
+
udt_name: col.udt_name,
|
|
53
|
+
data_type: this.fieldTypeFromUdt(col.udt_name, {
|
|
54
|
+
n0: col.numeric_precision,
|
|
55
|
+
n1: col.numeric_scale,
|
|
56
|
+
}),
|
|
57
|
+
nullable: col.is_nullable === 'YES',
|
|
58
|
+
field_exists: false
|
|
59
|
+
}));
|
|
60
|
+
// Map current columns by name, and flag if they already exist
|
|
61
|
+
const mapped = {};
|
|
62
|
+
columns.forEach(col => {
|
|
63
|
+
mapped[col.column_name] = col;
|
|
64
|
+
const created_by = this.config?.meta.created_by || 'created_by';
|
|
65
|
+
const created_at = this.config?.meta.created_at || 'created_at';
|
|
66
|
+
const updated_by = this.config?.meta.updated_by || 'updated_by';
|
|
67
|
+
const updated_at = this.config?.meta.updated_at || 'updated_at';
|
|
68
|
+
if (col.column_name === created_by
|
|
69
|
+
|| col.column_name === created_at
|
|
70
|
+
|| col.column_name === updated_by
|
|
71
|
+
|| col.column_name === updated_at) {
|
|
72
|
+
mapped[col.column_name].field_exists = true;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
Object.keys(this.schema.model.fields)
|
|
76
|
+
.forEach(name => {
|
|
77
|
+
if (mapped[name]) {
|
|
78
|
+
mapped[name].field_exists = true;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return { columns, mapped };
|
|
82
|
+
}
|
|
83
|
+
generateDrops(columns) {
|
|
84
|
+
const drops = {};
|
|
85
|
+
for (const col of columns) {
|
|
86
|
+
if (col.field_exists)
|
|
87
|
+
continue;
|
|
88
|
+
drops[col.column_name] = new MigrationOption(new migration_1.$MigrationField(col.column_name, {
|
|
89
|
+
drop: {
|
|
90
|
+
type: col.data_type,
|
|
91
|
+
nullable: col.nullable
|
|
92
|
+
}
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
return drops;
|
|
96
|
+
}
|
|
97
|
+
generateSteps(current, drops = {}) {
|
|
98
|
+
const steps = [];
|
|
99
|
+
// Generate migration step for each field
|
|
100
|
+
Object.values(this.schema.model.fields)
|
|
101
|
+
.forEach(field => {
|
|
102
|
+
const fieldSteps = this.generateFieldSteps(field, current, drops);
|
|
103
|
+
if (fieldSteps.length) {
|
|
104
|
+
steps.push(...fieldSteps);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// Add meta fields when creating table
|
|
108
|
+
if (!current) {
|
|
109
|
+
const created_by = this.config?.meta.created_by || 'created_by';
|
|
110
|
+
const created_at = this.config?.meta.created_at || 'created_at';
|
|
111
|
+
const updated_by = this.config?.meta.updated_by || 'updated_by';
|
|
112
|
+
const updated_at = this.config?.meta.updated_at || 'updated_at';
|
|
113
|
+
steps.push({ options: [new MigrationOption(new migration_1.$MigrationField(created_by, {
|
|
114
|
+
create: { type: 'character(64)', nullable: true }
|
|
115
|
+
}))] });
|
|
116
|
+
steps.push({ options: [new MigrationOption(new migration_1.$MigrationField(created_at, {
|
|
117
|
+
create: { type: 'timestamp without time zone' }
|
|
118
|
+
}))] });
|
|
119
|
+
steps.push({ options: [new MigrationOption(new migration_1.$MigrationField(updated_by, {
|
|
120
|
+
create: { type: 'character(64)', nullable: true }
|
|
121
|
+
}))] });
|
|
122
|
+
steps.push({ options: [new MigrationOption(new migration_1.$MigrationField(updated_at, {
|
|
123
|
+
create: { type: 'timestamp without time zone' }
|
|
124
|
+
}))] });
|
|
125
|
+
}
|
|
126
|
+
return steps;
|
|
127
|
+
}
|
|
128
|
+
generateFieldSteps($, current, drops = {}) {
|
|
129
|
+
const type = this.fieldType($);
|
|
130
|
+
const pk = $.name === 'id';
|
|
131
|
+
const nullable = !$.required;
|
|
132
|
+
// Table doesn't exist yet, only option is to create the field
|
|
133
|
+
if (!current) {
|
|
134
|
+
const options = [
|
|
135
|
+
new MigrationOption(new migration_1.$MigrationField($.name, {
|
|
136
|
+
create: { type, pk, nullable }
|
|
137
|
+
}))
|
|
138
|
+
];
|
|
139
|
+
return [{ options }];
|
|
140
|
+
}
|
|
141
|
+
// Table exists, evaluate options
|
|
142
|
+
else {
|
|
143
|
+
const col = current[$.name];
|
|
144
|
+
// Field exists in columns, alter only what changed
|
|
145
|
+
if (col) {
|
|
146
|
+
if ($.name === 'id') {
|
|
147
|
+
// Id can't be modified for now.
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
// TODO: check details such as
|
|
151
|
+
// - changes in decimal precision
|
|
152
|
+
// - changes in maxLength
|
|
153
|
+
const typeChanged = !type.startsWith(col.data_type);
|
|
154
|
+
const nullableChanged = col.nullable !== nullable;
|
|
155
|
+
const steps = [];
|
|
156
|
+
if (typeChanged) {
|
|
157
|
+
const options = [
|
|
158
|
+
new MigrationOption(new migration_1.$MigrationField($.name, {
|
|
159
|
+
alter_type: { from: col.data_type, to: type, using: {} }
|
|
160
|
+
}))
|
|
161
|
+
];
|
|
162
|
+
steps.push({ options });
|
|
163
|
+
}
|
|
164
|
+
if (nullableChanged) {
|
|
165
|
+
const options = [
|
|
166
|
+
new MigrationOption(new migration_1.$MigrationField($.name, {
|
|
167
|
+
alter_null: { from: col.nullable, to: nullable }
|
|
168
|
+
}))
|
|
169
|
+
];
|
|
170
|
+
steps.push({ options });
|
|
171
|
+
}
|
|
172
|
+
return steps;
|
|
173
|
+
}
|
|
174
|
+
// Field doesn't exists in columns, it might:
|
|
175
|
+
// - 1: be a new field
|
|
176
|
+
// - 2: be a field of the same type being renamed
|
|
177
|
+
else {
|
|
178
|
+
const options = [];
|
|
179
|
+
// Option 1
|
|
180
|
+
const createOption = new MigrationOption(new migration_1.$MigrationField($.name, {
|
|
181
|
+
create: { type, pk, nullable }
|
|
182
|
+
}));
|
|
183
|
+
options.push(createOption);
|
|
184
|
+
const deletedColumnsOfSameType = Object.values(current)
|
|
185
|
+
.filter(col => !col.field_exists)
|
|
186
|
+
.filter(col => type.startsWith(col.data_type));
|
|
187
|
+
if (deletedColumnsOfSameType.length) {
|
|
188
|
+
// TODO: check details such as
|
|
189
|
+
// - changes in decimal precision
|
|
190
|
+
// - changes in maxLength
|
|
191
|
+
deletedColumnsOfSameType.forEach(col => {
|
|
192
|
+
// Option 2
|
|
193
|
+
const renameOption = new MigrationOption(new migration_1.$MigrationField(col.column_name, {
|
|
194
|
+
rename: { name: $.name }
|
|
195
|
+
}));
|
|
196
|
+
options.push(renameOption);
|
|
197
|
+
// If this option is picked, the drop option for this column is no longer valid
|
|
198
|
+
drops[col.column_name].excluded_by.push(renameOption);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return [{ options }];
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
fieldUdt($) {
|
|
206
|
+
if ($.name === 'id') {
|
|
207
|
+
if ($.type === 'string') {
|
|
208
|
+
return 'bpchar';
|
|
209
|
+
}
|
|
210
|
+
return 'int4';
|
|
211
|
+
}
|
|
212
|
+
let type = {
|
|
213
|
+
'boolean': () => 'bool',
|
|
214
|
+
'date': () => 'date',
|
|
215
|
+
'datetime': () => 'timestamp',
|
|
216
|
+
'decimal': () => 'numeric',
|
|
217
|
+
'dict': () => 'jsonb',
|
|
218
|
+
'enum': () => 'bpchar', // TODO: read from schema maxLength
|
|
219
|
+
'file': () => 'jsonb',
|
|
220
|
+
'float': () => 'float8',
|
|
221
|
+
'int': () => 'int4',
|
|
222
|
+
'obj': () => 'jsonb',
|
|
223
|
+
'string': () => 'varchar', // TODO: char() if maxLength
|
|
224
|
+
'unknown': () => { throw new Error('An unknown field shouldn\'t be stored on SQL'); },
|
|
225
|
+
}[$.type]();
|
|
226
|
+
if ($.array) {
|
|
227
|
+
type = '_' + type;
|
|
228
|
+
}
|
|
229
|
+
return type;
|
|
230
|
+
}
|
|
231
|
+
fieldTypeFromUdt(udt, extra) {
|
|
232
|
+
const array = udt.startsWith('_');
|
|
233
|
+
if (array)
|
|
234
|
+
udt = udt.slice(1);
|
|
235
|
+
let type = {
|
|
236
|
+
'bool': () => 'boolean',
|
|
237
|
+
'date': () => 'date',
|
|
238
|
+
'timestamp': () => 'timestamp',
|
|
239
|
+
'numeric': () => `numeric(${extra.n0},${extra.n1})`,
|
|
240
|
+
'jsonb': () => 'jsonb',
|
|
241
|
+
'bpchar': () => 'character(64)', // TODO: read from schema maxLength
|
|
242
|
+
'float8': () => 'double precision',
|
|
243
|
+
'int4': () => 'integer',
|
|
244
|
+
'varchar': () => 'character varying', // TODO: char() if maxLength
|
|
245
|
+
'unknown': () => { throw new Error('An unknown field shouldn\'t be stored on SQL'); },
|
|
246
|
+
}[udt]();
|
|
247
|
+
if (array)
|
|
248
|
+
type += '[]';
|
|
249
|
+
return type;
|
|
250
|
+
}
|
|
251
|
+
fieldType($) {
|
|
252
|
+
const udt = this.fieldUdt($);
|
|
253
|
+
return this.fieldTypeFromUdt(udt, {
|
|
254
|
+
n0: ($.meta?.decimal?.left || 9) + ($.meta?.decimal?.right || 9),
|
|
255
|
+
n1: $.meta?.decimal?.right || 9
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
async manualReview(type, steps) {
|
|
259
|
+
let header_shown = false;
|
|
260
|
+
const header = () => {
|
|
261
|
+
if (header_shown)
|
|
262
|
+
return;
|
|
263
|
+
let str = '';
|
|
264
|
+
str += '┌\n';
|
|
265
|
+
str += `│ module: ${(0, string_1.colored)(this.module, 'cyan')}\n`;
|
|
266
|
+
str += `│ table: ${(0, string_1.colored)(this.tableName, 'lightcyan')}\n`;
|
|
267
|
+
str += `│ ${(0, string_1.colored)('⚠ Requires manual review.', 'red')}\n`;
|
|
268
|
+
str += '└\n\n';
|
|
269
|
+
console.clear();
|
|
270
|
+
console.log(str);
|
|
271
|
+
header_shown = true;
|
|
272
|
+
};
|
|
273
|
+
const fields = [];
|
|
274
|
+
for (const step of steps) {
|
|
275
|
+
const stepFields = step.options.filter(field => {
|
|
276
|
+
if (field.excluded_by.length === 0)
|
|
277
|
+
return true;
|
|
278
|
+
return !field.excluded_by.some(field => field.selected);
|
|
279
|
+
});
|
|
280
|
+
let schema;
|
|
281
|
+
if (stepFields.length === 0) {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
else if (stepFields.length === 1) {
|
|
285
|
+
schema = stepFields[0].schema;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
header();
|
|
289
|
+
const opt = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
290
|
+
const selected = await ui_1.default.select('Pick one of the options below:\n', stepFields.map((s, i) => `${(0, string_1.colored)(opt[i], 'lightcyan')} ${stepFields[i].schema.describe()}`));
|
|
291
|
+
console.log();
|
|
292
|
+
stepFields[selected.i].selected = true;
|
|
293
|
+
schema = stepFields[selected.i].schema;
|
|
294
|
+
}
|
|
295
|
+
if ('drop' in schema.operation && !schema.operation.drop.nullable) {
|
|
296
|
+
header();
|
|
297
|
+
const defaul = await ui_1.default.question(`Column '${schema.column}' is NOT NULL and is being deleted. What should be the default value on rollback?\n`);
|
|
298
|
+
schema.operation.drop.default = defaul;
|
|
299
|
+
}
|
|
300
|
+
if ('alter_type' in schema.operation) {
|
|
301
|
+
header();
|
|
302
|
+
const from = (0, string_1.colored)(schema.operation.alter_type.from, 'lightcyan');
|
|
303
|
+
const to = (0, string_1.colored)(schema.operation.alter_type.to, 'lightcyan');
|
|
304
|
+
const up = (0, string_1.colored)('▲ UP', 'lightgreen');
|
|
305
|
+
const down = (0, string_1.colored)('▼ DOWN', 'yellow');
|
|
306
|
+
const defaultUp = `${schema.column}::${schema.operation.alter_type.to}`;
|
|
307
|
+
const defaultDown = `${schema.column}::${schema.operation.alter_type.from}`;
|
|
308
|
+
const usingUp = await ui_1.default.question(`Column '${schema.column}' is changing from ${from} to ${to}. Write a cast expression for the ${up} migration.\n`, defaultUp);
|
|
309
|
+
const usingDown = await ui_1.default.question(`Column '${schema.column}' is changing from ${from} to ${to}. Write a cast expression for the ${down} migration.\n`, defaultDown);
|
|
310
|
+
schema.operation.alter_type.using.up = usingUp;
|
|
311
|
+
schema.operation.alter_type.using.down = usingDown;
|
|
312
|
+
}
|
|
313
|
+
fields.push(schema);
|
|
314
|
+
}
|
|
315
|
+
const migration = new migration_1.$Migration(this.module, type, this.tableName, fields);
|
|
316
|
+
console.clear();
|
|
317
|
+
console.log(migration.describe());
|
|
318
|
+
const proceed = await ui_1.default.yesOrNo('Is everything OK with the migration above?');
|
|
319
|
+
if (!proceed) {
|
|
320
|
+
log_1.Log.warn('migrator', 'generator', 'Migration rejected by manual review.');
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
return migration;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
exports.MigrationGenerator = MigrationGenerator;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export type $MigrationFieldOperation = {
|
|
2
|
+
create: {
|
|
3
|
+
type: string;
|
|
4
|
+
nullable?: boolean;
|
|
5
|
+
pk?: boolean;
|
|
6
|
+
};
|
|
7
|
+
} | {
|
|
8
|
+
rename: {
|
|
9
|
+
name: string;
|
|
10
|
+
};
|
|
11
|
+
} | {
|
|
12
|
+
alter_type: {
|
|
13
|
+
from: string;
|
|
14
|
+
to: string;
|
|
15
|
+
using: {
|
|
16
|
+
up: string;
|
|
17
|
+
down: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
} | {
|
|
21
|
+
alter_null: {
|
|
22
|
+
from: boolean;
|
|
23
|
+
to: boolean;
|
|
24
|
+
};
|
|
25
|
+
} | {
|
|
26
|
+
drop: {
|
|
27
|
+
type: string;
|
|
28
|
+
nullable: boolean;
|
|
29
|
+
default?: string;
|
|
30
|
+
};
|
|
31
|
+
} | {
|
|
32
|
+
create_fk: {
|
|
33
|
+
table: string;
|
|
34
|
+
field: string;
|
|
35
|
+
};
|
|
36
|
+
} | {
|
|
37
|
+
drop_fk: {
|
|
38
|
+
table: string;
|
|
39
|
+
field: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export declare class $MigrationField {
|
|
43
|
+
column: string;
|
|
44
|
+
operation: $MigrationFieldOperation;
|
|
45
|
+
constructor(column: string, operation: $MigrationFieldOperation);
|
|
46
|
+
describe(): string;
|
|
47
|
+
sqlUp(table_op: 'create' | 'alter'): string;
|
|
48
|
+
sqlDown(): string;
|
|
49
|
+
}
|
|
50
|
+
export declare class $Migration {
|
|
51
|
+
module: string;
|
|
52
|
+
private type;
|
|
53
|
+
private tableName;
|
|
54
|
+
private fields;
|
|
55
|
+
description?: string | undefined;
|
|
56
|
+
name: string;
|
|
57
|
+
constructor(module: string, type: 'create' | 'alter' | 'custom', tableName: string, fields: $MigrationField[], description?: string | undefined);
|
|
58
|
+
describe(): string;
|
|
59
|
+
sqlUp(): string[];
|
|
60
|
+
sqlDown(): string[];
|
|
61
|
+
save(dirpath?: string): string;
|
|
62
|
+
private fnUp;
|
|
63
|
+
private fnDown;
|
|
64
|
+
hash(): string;
|
|
65
|
+
static empty(module: string, name: string): $Migration;
|
|
66
|
+
}
|