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.
Files changed (254) hide show
  1. package/lib/adapters/postgres/src/migrator/database.d.ts +3 -6
  2. package/lib/adapters/postgres/src/migrator/database.js +20 -20
  3. package/lib/adapters/postgres/src/migrator/generator/generator.d.ts +22 -0
  4. package/lib/adapters/postgres/src/migrator/generator/generator.js +326 -0
  5. package/lib/adapters/postgres/src/migrator/generator/migration.d.ts +66 -0
  6. package/lib/adapters/postgres/src/migrator/generator/migration.js +249 -0
  7. package/lib/adapters/postgres/src/migrator/generator/provider.d.ts +19 -0
  8. package/lib/adapters/postgres/src/migrator/{migrator.js → generator/provider.js} +23 -25
  9. package/lib/adapters/postgres/src/migrator/index.d.ts +47 -1
  10. package/lib/adapters/postgres/src/migrator/index.js +20 -3
  11. package/lib/adapters/postgres/src/migrator/runner/runner.d.ts +17 -0
  12. package/lib/adapters/postgres/src/migrator/runner/runner.js +249 -0
  13. package/lib/adapters/postgres/src/migrator/runner/status.d.ts +17 -0
  14. package/lib/adapters/postgres/src/migrator/runner/status.js +55 -0
  15. package/lib/adapters/postgres/src/postgres.cli.d.ts +11 -1
  16. package/lib/adapters/postgres/src/postgres.cli.js +34 -11
  17. package/lib/adapters/postgres/test/postgres.bucket_adapter.test.js +4 -4
  18. package/lib/compiler/apps/monolyth/stages/1_mkdir_stage.d.ts +3 -0
  19. package/lib/compiler/apps/monolyth/stages/1_mkdir_stage.js +3 -0
  20. package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.d.ts +3 -0
  21. package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.js +3 -0
  22. package/lib/compiler/apps/monolyth/stages/3_copy_types_stage.d.ts +3 -0
  23. package/lib/compiler/apps/monolyth/stages/3_copy_types_stage.js +3 -0
  24. package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.d.ts +3 -0
  25. package/lib/compiler/apps/monolyth/stages/4_dump_modules_stage.js +3 -0
  26. package/lib/compiler/apps/monolyth/stages/5_dump_cli_stage.d.ts +3 -0
  27. package/lib/compiler/apps/monolyth/stages/5_dump_cli_stage.js +3 -0
  28. package/lib/compiler/apps/monolyth/stages/6_dump_package_json_stage.d.ts +3 -0
  29. package/lib/compiler/apps/monolyth/stages/6_dump_package_json_stage.js +3 -0
  30. package/lib/compiler/elements/externals.element.d.ts +1 -1
  31. package/lib/compiler/module.js +1 -1
  32. package/lib/compiler/stages/1_scan_stage.d.ts +3 -0
  33. package/lib/compiler/stages/1_scan_stage.js +3 -0
  34. package/lib/compiler/stages/2_treeshake_stage.d.ts +3 -0
  35. package/lib/compiler/stages/2_treeshake_stage.js +3 -0
  36. package/lib/compiler/stages/3_extract_ts_stage.d.ts +3 -0
  37. package/lib/compiler/stages/3_extract_ts_stage.js +3 -0
  38. package/lib/compiler/stages/4_build_schemas_stage.d.ts +3 -0
  39. package/lib/compiler/stages/4_build_schemas_stage.js +3 -0
  40. package/lib/compiler/stages/5_inject_ts_stage.d.ts +3 -0
  41. package/lib/compiler/stages/5_inject_ts_stage.js +3 -0
  42. package/lib/compiler/stages/6_build_elements_stage.d.ts +3 -0
  43. package/lib/compiler/stages/6_build_elements_stage.js +3 -0
  44. package/lib/compiler/stages/7_dump_stage.d.ts +3 -0
  45. package/lib/compiler/stages/7_dump_stage.js +3 -0
  46. package/lib/compiler/stages/8_diagnose_stage.d.ts +3 -0
  47. package/lib/compiler/stages/8_diagnose_stage.js +3 -0
  48. package/lib/compiler/treeshake.js +3 -3
  49. package/lib/elements/blocks/block.builder.d.ts +6 -2
  50. package/lib/elements/blocks/block.builder.js +8 -4
  51. package/lib/elements/blocks/block.schema.d.ts +4 -0
  52. package/lib/elements/blocks/block.schema.js +4 -0
  53. package/lib/elements/blocks/job/internal/machine_job.builder.d.ts +6 -3
  54. package/lib/elements/blocks/job/internal/machine_job.builder.js +5 -2
  55. package/lib/elements/blocks/job/internal/machine_job.schema.d.ts +4 -0
  56. package/lib/elements/blocks/job/internal/machine_job.schema.js +4 -0
  57. package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +4 -0
  58. package/lib/elements/blocks/job/internal/resource_job.builder.js +4 -0
  59. package/lib/elements/blocks/job/internal/resource_job.d.ts +4 -0
  60. package/lib/elements/blocks/job/internal/resource_job.js +4 -0
  61. package/lib/elements/blocks/job/internal/resource_job.schema.d.ts +4 -0
  62. package/lib/elements/blocks/job/internal/resource_job.schema.js +4 -0
  63. package/lib/elements/blocks/job/job.builder.d.ts +4 -0
  64. package/lib/elements/blocks/job/job.builder.js +4 -0
  65. package/lib/elements/blocks/job/job.d.ts +4 -0
  66. package/lib/elements/blocks/job/job.js +4 -0
  67. package/lib/elements/blocks/job/job.schema.d.ts +4 -0
  68. package/lib/elements/blocks/job/job.schema.js +4 -0
  69. package/lib/elements/blocks/machine/machine.builder.d.ts +4 -0
  70. package/lib/elements/blocks/machine/machine.builder.js +4 -0
  71. package/lib/elements/blocks/machine/machine.d.ts +12 -0
  72. package/lib/elements/blocks/machine/machine.js +12 -0
  73. package/lib/elements/blocks/machine/machine.schema.d.ts +16 -0
  74. package/lib/elements/blocks/machine/machine.schema.js +16 -1
  75. package/lib/elements/blocks/machine/machine_state.builder.d.ts +4 -0
  76. package/lib/elements/blocks/machine/machine_state.builder.js +4 -0
  77. package/lib/elements/blocks/machine/machine_transition.builder.d.ts +4 -0
  78. package/lib/elements/blocks/machine/machine_transition.builder.js +4 -0
  79. package/lib/elements/blocks/queue/adapters/bucket.queue_adapter.d.ts +4 -0
  80. package/lib/elements/blocks/queue/adapters/bucket.queue_adapter.js +4 -0
  81. package/lib/elements/blocks/queue/adapters/queue_adapter.d.ts +4 -0
  82. package/lib/elements/blocks/queue/adapters/queue_adapter.js +4 -0
  83. package/lib/elements/blocks/queue/queue.builder.d.ts +4 -0
  84. package/lib/elements/blocks/queue/queue.builder.js +4 -0
  85. package/lib/elements/blocks/queue/queue.schema.d.ts +4 -0
  86. package/lib/elements/blocks/queue/queue.schema.js +4 -0
  87. package/lib/elements/blocks/resource/resource.builder.d.ts +4 -0
  88. package/lib/elements/blocks/resource/resource.builder.js +4 -0
  89. package/lib/elements/blocks/resource/resource.d.ts +4 -0
  90. package/lib/elements/blocks/resource/resource.js +4 -0
  91. package/lib/elements/blocks/resource/resource.schema.d.ts +4 -0
  92. package/lib/elements/blocks/resource/resource.schema.js +4 -0
  93. package/lib/elements/edge/controller/adapters/cli.controller_adapter.d.ts +4 -0
  94. package/lib/elements/edge/controller/adapters/cli.controller_adapter.js +4 -0
  95. package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +4 -0
  96. package/lib/elements/edge/controller/adapters/controller_adapter.js +4 -0
  97. package/lib/elements/edge/controller/controller.builder.d.ts +16 -0
  98. package/lib/elements/edge/controller/controller.builder.js +16 -0
  99. package/lib/elements/edge/controller/controller.d.ts +4 -0
  100. package/lib/elements/edge/controller/controller.js +4 -0
  101. package/lib/elements/edge/controller/controller.schema.d.ts +16 -0
  102. package/lib/elements/edge/controller/controller.schema.js +16 -0
  103. package/lib/elements/{blocks → edge}/externals/externals.builder.d.ts +4 -0
  104. package/lib/elements/{blocks → edge}/externals/externals.builder.js +4 -0
  105. package/lib/elements/{blocks → edge}/externals/externals.schema.d.ts +4 -0
  106. package/lib/elements/{blocks → edge}/externals/externals.schema.js +4 -0
  107. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +16 -11
  108. package/lib/elements/entities/bucket/adapters/bucket_adapter.js +5 -0
  109. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +4 -0
  110. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +4 -0
  111. package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +4 -1
  112. package/lib/elements/entities/bucket/adapters/memory.nql.js +4 -1
  113. package/lib/elements/entities/bucket/bucket.builder.d.ts +4 -0
  114. package/lib/elements/entities/bucket/bucket.builder.js +4 -0
  115. package/lib/elements/entities/bucket/bucket.d.ts +9 -2
  116. package/lib/elements/entities/bucket/bucket.js +14 -7
  117. package/lib/elements/entities/bucket/bucket.schema.d.ts +4 -0
  118. package/lib/elements/entities/bucket/bucket.schema.js +4 -0
  119. package/lib/elements/entities/bucket/cache/bucket_cache.d.ts +8 -0
  120. package/lib/elements/entities/bucket/cache/bucket_cache.js +8 -0
  121. package/lib/elements/entities/bucket/graph/bucket_graph.builder.d.ts +4 -0
  122. package/lib/elements/entities/bucket/graph/bucket_graph.builder.js +4 -0
  123. package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +4 -0
  124. package/lib/elements/entities/bucket/graph/bucket_graph.js +4 -0
  125. package/lib/elements/entities/bucket/graph/bucket_graph.schema.d.ts +8 -0
  126. package/lib/elements/entities/bucket/graph/bucket_graph.schema.js +8 -0
  127. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +8 -0
  128. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.js +8 -0
  129. package/lib/elements/entities/bucket/model/bucket_model.builder.d.ts +4 -0
  130. package/lib/elements/entities/bucket/model/bucket_model.builder.js +4 -0
  131. package/lib/elements/entities/bucket/model/bucket_model.convert.d.ts +8 -0
  132. package/lib/elements/entities/bucket/model/bucket_model.convert.js +8 -0
  133. package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +8 -0
  134. package/lib/elements/entities/bucket/model/bucket_model.schema.js +8 -0
  135. package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +8 -0
  136. package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +8 -0
  137. package/lib/elements/entities/bucket/query/nql_compiler.d.ts +9 -0
  138. package/lib/elements/entities/bucket/query/nql_compiler.js +9 -0
  139. package/lib/elements/entities/bucket/query/nql_engine.d.ts +6 -0
  140. package/lib/elements/entities/bucket/query/nql_engine.js +6 -0
  141. package/lib/elements/entities/bucket/view/bucket_view.builder.d.ts +4 -0
  142. package/lib/elements/entities/bucket/view/bucket_view.builder.js +4 -0
  143. package/lib/elements/entities/bucket/view/bucket_view.d.ts +4 -0
  144. package/lib/elements/entities/bucket/view/bucket_view.js +10 -2
  145. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +8 -0
  146. package/lib/elements/entities/bucket/view/bucket_view.schema.js +8 -0
  147. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +8 -0
  148. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +8 -0
  149. package/lib/elements/entities/constants/constants.builder.d.ts +21 -6
  150. package/lib/elements/entities/constants/constants.builder.js +21 -6
  151. package/lib/elements/entities/constants/constants.d.ts +4 -0
  152. package/lib/elements/entities/constants/constants.js +4 -0
  153. package/lib/elements/entities/constants/constants.schema.d.ts +16 -0
  154. package/lib/elements/entities/constants/constants.schema.js +16 -0
  155. package/lib/elements/entities/drive/drive_adapter.d.ts +15 -10
  156. package/lib/elements/entities/drive/drive_adapter.js +5 -2
  157. package/lib/elements/entities/drive/local.drive_adapter.d.ts +10 -4
  158. package/lib/elements/entities/drive/local.drive_adapter.js +23 -8
  159. package/lib/elements/entities/message/message.builder.d.ts +4 -0
  160. package/lib/elements/entities/message/message.builder.js +4 -0
  161. package/lib/elements/entities/message/message.d.ts +4 -0
  162. package/lib/elements/entities/message/message.js +4 -0
  163. package/lib/elements/entities/message/message.schema.d.ts +4 -0
  164. package/lib/elements/entities/message/message.schema.js +4 -0
  165. package/lib/elements/entities/message/message_parser.d.ts +4 -0
  166. package/lib/elements/entities/message/message_parser.js +4 -0
  167. package/lib/elements/entities/message/template/message_template.builder.d.ts +4 -0
  168. package/lib/elements/entities/message/template/message_template.builder.js +4 -0
  169. package/lib/elements/entities/message/template/message_template.schema.d.ts +9 -0
  170. package/lib/elements/entities/message/template/message_template.schema.js +25 -0
  171. package/lib/elements/entities/message/template/message_template_field.builder.d.ts +8 -0
  172. package/lib/elements/entities/message/template/message_template_field.builder.js +8 -0
  173. package/lib/elements/index.d.ts +1 -1
  174. package/lib/elements/index.js +1 -1
  175. package/lib/engine/apps/app.config.d.ts +3 -0
  176. package/lib/engine/apps/app.config.js +3 -0
  177. package/lib/engine/apps/app.d.ts +3 -0
  178. package/lib/engine/apps/app.js +4 -1
  179. package/lib/engine/apps/inline.app.d.ts +3 -0
  180. package/lib/engine/apps/inline.app.js +3 -0
  181. package/lib/engine/apps/monolyth/monolyth.app.d.ts +8 -0
  182. package/lib/engine/apps/monolyth/monolyth.app.js +8 -0
  183. package/lib/engine/auth/authn.d.ts +4 -0
  184. package/lib/engine/auth/authn.js +4 -0
  185. package/lib/engine/auth/zero.authn_provider.d.ts +4 -0
  186. package/lib/engine/auth/zero.authn_provider.js +4 -0
  187. package/lib/engine/cli/cli.d.ts +7 -1
  188. package/lib/engine/cli/cli.js +10 -1
  189. package/lib/engine/cli/cli_adapter.d.ts +11 -1
  190. package/lib/engine/cli/cli_adapter.js +10 -1
  191. package/lib/engine/cli/cli_input.d.ts +4 -0
  192. package/lib/engine/cli/cli_input.js +4 -0
  193. package/lib/engine/cli/ui.d.ts +14 -2
  194. package/lib/engine/cli/ui.js +10 -6
  195. package/lib/engine/daemon.d.ts +93 -6
  196. package/lib/engine/daemon.js +90 -7
  197. package/lib/engine/data/date.d.ts +4 -0
  198. package/lib/engine/data/date.js +4 -0
  199. package/lib/engine/data/datetime.d.ts +4 -0
  200. package/lib/engine/data/datetime.js +4 -0
  201. package/lib/engine/data/decimal.d.ts +4 -0
  202. package/lib/engine/data/decimal.js +4 -0
  203. package/lib/engine/data/file.d.ts +23 -23
  204. package/lib/engine/data/file.js +66 -29
  205. package/lib/engine/data/json.d.ts +4 -0
  206. package/lib/engine/data/json.js +4 -0
  207. package/lib/engine/data/tree.d.ts +4 -0
  208. package/lib/engine/data/tree.js +4 -0
  209. package/lib/engine/dependency.d.ts +63 -2
  210. package/lib/engine/dependency.js +52 -0
  211. package/lib/engine/module.d.ts +108 -8
  212. package/lib/engine/module.js +107 -22
  213. package/lib/engine/space.d.ts +163 -10
  214. package/lib/engine/space.js +184 -22
  215. package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +12 -0
  216. package/lib/engine/transaction/nodes/bucket.trx_node.js +12 -0
  217. package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +4 -0
  218. package/lib/engine/transaction/nodes/bucket_query.trx_node.js +4 -0
  219. package/lib/engine/transaction/nodes/job.trx_node.d.ts +4 -0
  220. package/lib/engine/transaction/nodes/job.trx_node.js +4 -0
  221. package/lib/engine/transaction/nodes/machine.trx_node.d.ts +4 -0
  222. package/lib/engine/transaction/nodes/machine.trx_node.js +4 -0
  223. package/lib/engine/transaction/nodes/queue.trx_node.d.ts +4 -0
  224. package/lib/engine/transaction/nodes/queue.trx_node.js +4 -0
  225. package/lib/engine/transaction/nodes/resource.trx_node.d.ts +4 -0
  226. package/lib/engine/transaction/nodes/resource.trx_node.js +4 -0
  227. package/lib/engine/transaction/trx.d.ts +8 -0
  228. package/lib/engine/transaction/trx.js +8 -0
  229. package/lib/engine/transaction/trx_engine.d.ts +4 -0
  230. package/lib/engine/transaction/trx_engine.js +4 -3
  231. package/lib/engine/transaction/trx_node.d.ts +4 -0
  232. package/lib/engine/transaction/trx_node.js +4 -0
  233. package/lib/engine/tree.d.ts +54 -2
  234. package/lib/engine/tree.js +54 -2
  235. package/lib/engine/util/mime.d.ts +4 -4
  236. package/lib/engine/util/mime.js +7 -9
  237. package/lib/schema.d.ts +1 -1
  238. package/package.json +1 -1
  239. package/tsconfig.build.tsbuildinfo +1 -1
  240. package/lib/adapters/postgres/src/migrator/bucket.d.ts +0 -20
  241. package/lib/adapters/postgres/src/migrator/bucket.js +0 -184
  242. package/lib/adapters/postgres/src/migrator/migration.d.ts +0 -57
  243. package/lib/adapters/postgres/src/migrator/migration.js +0 -203
  244. package/lib/adapters/postgres/src/migrator/migrator.d.ts +0 -21
  245. package/lib/adapters/postgres/src/migrator/runner.d.ts +0 -71
  246. package/lib/adapters/postgres/src/migrator/runner.js +0 -271
  247. package/lib/elements/entities/bucket/adapters/memory.bucket_query copy.d.ts +0 -0
  248. package/lib/elements/entities/bucket/adapters/memory.bucket_query copy.js +0 -218
  249. package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.d.ts +0 -0
  250. package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.js +0 -47
  251. package/lib/engine/apps/monolyth/monolyth.cli.d.ts +0 -45
  252. package/lib/engine/apps/monolyth/monolyth.cli.js +0 -362
  253. package/lib/engine/util/cache.d.ts +0 -6
  254. 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: *DROP DATABASE*
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
- * Read schema of table.
42
- * @param config
43
- */
44
- async getSchema(sql, tableName) {
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
- }));
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: *DROP DATABASE*
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
+ }