nesoi 3.0.0 → 3.0.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.
Files changed (185) hide show
  1. package/README.md +10 -0
  2. package/lib/adapters/postgres/src/migrator/bucket.d.ts +20 -0
  3. package/lib/adapters/postgres/src/migrator/bucket.js +184 -0
  4. package/lib/adapters/postgres/src/migrator/csv.d.ts +7 -0
  5. package/lib/adapters/postgres/src/migrator/csv.js +72 -0
  6. package/lib/adapters/postgres/src/migrator/migration.d.ts +2 -18
  7. package/lib/adapters/postgres/src/migrator/migration.js +10 -158
  8. package/lib/adapters/postgres/src/migrator/migrator.js +8 -5
  9. package/lib/adapters/postgres/src/migrator/runner.d.ts +16 -6
  10. package/lib/adapters/postgres/src/migrator/runner.js +103 -34
  11. package/lib/adapters/postgres/src/postgres.bucket_adapter.d.ts +19 -22
  12. package/lib/adapters/postgres/src/postgres.bucket_adapter.js +116 -100
  13. package/lib/adapters/postgres/src/postgres.cli.d.ts +23 -3
  14. package/lib/adapters/postgres/src/postgres.cli.js +70 -10
  15. package/lib/adapters/postgres/src/postgres.config.d.ts +5 -0
  16. package/lib/adapters/postgres/src/postgres.config.js +2 -0
  17. package/lib/adapters/postgres/src/postgres.nql.d.ts +7 -3
  18. package/lib/adapters/postgres/src/postgres.nql.js +86 -32
  19. package/lib/adapters/postgres/src/postgres.provider.d.ts +18 -0
  20. package/lib/adapters/postgres/src/postgres.provider.js +77 -0
  21. package/lib/adapters/postgres/test/postgres.bucket_adapter.test.js +76 -39
  22. package/lib/compiler/apps/monolyth/monolyth_compiler.d.ts +3 -0
  23. package/lib/compiler/apps/monolyth/monolyth_compiler.js +24 -0
  24. package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.js +2 -1
  25. package/lib/compiler/apps/monolyth/stages/5_dump_cli_stage.js +1 -1
  26. package/lib/compiler/elements/bucket.element.js +26 -11
  27. package/lib/compiler/elements/constants.element.js +1 -1
  28. package/lib/compiler/elements/element.d.ts +2 -0
  29. package/lib/compiler/elements/message.element.js +4 -4
  30. package/lib/compiler/helpers/dump_helpers.js +5 -2
  31. package/lib/compiler/stages/7_dump_stage.js +2 -0
  32. package/lib/compiler/treeshake.js +9 -37
  33. package/lib/compiler/typescript/bridge/extract.js +12 -0
  34. package/lib/compiler/typescript/bridge/inject.js +3 -0
  35. package/lib/compiler/typescript/bridge/organize.js +3 -3
  36. package/lib/elements/blocks/block.builder.js +4 -2
  37. package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +22 -20
  38. package/lib/elements/blocks/job/internal/resource_job.d.ts +2 -1
  39. package/lib/elements/blocks/job/internal/resource_job.js +17 -4
  40. package/lib/elements/blocks/job/job.js +3 -0
  41. package/lib/elements/blocks/job/job.types.d.ts +7 -0
  42. package/lib/elements/blocks/job/job.types.js +2 -0
  43. package/lib/elements/blocks/machine/machine.js +3 -2
  44. package/lib/elements/blocks/resource/resource.builder.js +2 -4
  45. package/lib/elements/blocks/resource/resource.d.ts +5 -3
  46. package/lib/elements/blocks/resource/resource.js +26 -17
  47. package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +2 -1
  48. package/lib/elements/edge/controller/adapters/controller_adapter.js +11 -2
  49. package/lib/elements/edge/controller/controller.builder.d.ts +4 -5
  50. package/lib/elements/edge/controller/controller.builder.js +7 -7
  51. package/lib/elements/edge/controller/controller.d.ts +2 -1
  52. package/lib/elements/edge/controller/controller.js +8 -6
  53. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +61 -23
  54. package/lib/elements/entities/bucket/adapters/bucket_adapter.js +22 -13
  55. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +21 -22
  56. package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +68 -2
  57. package/lib/elements/entities/bucket/adapters/memory.nql.d.ts +10 -6
  58. package/lib/elements/entities/bucket/adapters/memory.nql.js +38 -3
  59. package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.d.ts +0 -20
  60. package/lib/elements/entities/bucket/adapters/slow_memory.bucket_adapter.js +46 -30
  61. package/lib/elements/entities/bucket/bucket.builder.d.ts +8 -2
  62. package/lib/elements/entities/bucket/bucket.builder.js +13 -19
  63. package/lib/elements/entities/bucket/bucket.config.d.ts +5 -1
  64. package/lib/elements/entities/bucket/bucket.d.ts +180 -19
  65. package/lib/elements/entities/bucket/bucket.js +658 -48
  66. package/lib/elements/entities/bucket/bucket.schema.d.ts +7 -1
  67. package/lib/elements/entities/bucket/bucket.schema.js +2 -1
  68. package/lib/elements/entities/bucket/bucket.types.d.ts +2 -7
  69. package/lib/elements/entities/bucket/cache/bucket_cache.d.ts +6 -2
  70. package/lib/elements/entities/bucket/cache/bucket_cache.js +12 -12
  71. package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +32 -5
  72. package/lib/elements/entities/bucket/graph/bucket_graph.js +80 -111
  73. package/lib/elements/entities/bucket/graph/bucket_graph.schema.d.ts +3 -6
  74. package/lib/elements/entities/bucket/graph/bucket_graph.schema.js +1 -4
  75. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +3 -7
  76. package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.js +6 -2
  77. package/lib/elements/entities/bucket/model/bucket_model.builder.js +1 -1
  78. package/lib/elements/entities/bucket/model/bucket_model.convert.js +3 -3
  79. package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +37 -8
  80. package/lib/elements/entities/bucket/model/bucket_model.schema.js +25 -4
  81. package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +33 -14
  82. package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +56 -13
  83. package/lib/elements/entities/bucket/query/nql.schema.d.ts +1 -0
  84. package/lib/elements/entities/bucket/query/nql_compiler.js +13 -2
  85. package/lib/elements/entities/bucket/query/nql_engine.d.ts +11 -4
  86. package/lib/elements/entities/bucket/query/nql_engine.js +20 -11
  87. package/lib/elements/entities/bucket/view/bucket_view.js +63 -35
  88. package/lib/elements/entities/bucket/view/bucket_view.schema.d.ts +5 -2
  89. package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +6 -2
  90. package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +21 -15
  91. package/lib/elements/entities/constants/constants.schema.d.ts +1 -1
  92. package/lib/elements/entities/drive/drive_adapter.d.ts +36 -0
  93. package/lib/elements/entities/drive/drive_adapter.js +10 -0
  94. package/lib/elements/entities/drive/local.drive_adapter.d.ts +8 -0
  95. package/lib/elements/entities/drive/local.drive_adapter.js +28 -0
  96. package/lib/elements/entities/message/message.schema.d.ts +1 -0
  97. package/lib/elements/entities/message/message.schema.js +33 -0
  98. package/lib/elements/entities/message/message_parser.d.ts +5 -1
  99. package/lib/elements/entities/message/message_parser.js +56 -35
  100. package/lib/elements/entities/message/template/message_template.schema.d.ts +10 -8
  101. package/lib/elements/entities/message/template/message_template_field.builder.d.ts +16 -6
  102. package/lib/elements/entities/message/template/message_template_field.builder.js +25 -0
  103. package/lib/elements/entities/message/template/message_template_parser.js +2 -1
  104. package/lib/engine/apps/app.config.d.ts +32 -11
  105. package/lib/engine/apps/app.config.js +12 -0
  106. package/lib/engine/apps/app.d.ts +2 -0
  107. package/lib/engine/apps/app.js +3 -0
  108. package/lib/engine/apps/inline.app.d.ts +5 -3
  109. package/lib/engine/apps/inline.app.js +27 -12
  110. package/lib/engine/apps/monolyth/monolyth.app.d.ts +4 -2
  111. package/lib/engine/apps/monolyth/monolyth.app.js +22 -10
  112. package/lib/engine/auth/authn.d.ts +5 -1
  113. package/lib/engine/auth/zero.authn_provider.d.ts +4 -2
  114. package/lib/engine/auth/zero.authn_provider.js +2 -2
  115. package/lib/engine/cli/cli.d.ts +3 -1
  116. package/lib/engine/cli/cli.js +22 -3
  117. package/lib/engine/cli/cli_adapter.d.ts +2 -1
  118. package/lib/engine/cli/cli_adapter.js +2 -1
  119. package/lib/engine/cli/cli_input.d.ts +19 -0
  120. package/lib/engine/cli/cli_input.js +207 -0
  121. package/lib/engine/cli/ui.d.ts +1 -1
  122. package/lib/engine/cli/ui.js +2 -2
  123. package/lib/engine/daemon.d.ts +3 -2
  124. package/lib/engine/daemon.js +14 -2
  125. package/lib/engine/data/date.js +2 -2
  126. package/lib/engine/data/datetime.d.ts +40 -4
  127. package/lib/engine/data/datetime.js +70 -11
  128. package/lib/engine/data/decimal.d.ts +1 -1
  129. package/lib/engine/data/decimal.js +3 -3
  130. package/lib/engine/data/error.d.ts +21 -4
  131. package/lib/engine/data/error.js +23 -7
  132. package/lib/engine/data/file.d.ts +23 -0
  133. package/lib/engine/data/file.js +53 -0
  134. package/lib/engine/data/json.d.ts +6 -0
  135. package/lib/engine/data/json.js +26 -0
  136. package/lib/engine/data/obj.d.ts +1 -1
  137. package/lib/engine/data/trash.d.ts +14 -0
  138. package/lib/engine/data/trash.js +2 -0
  139. package/lib/engine/data/tree.d.ts +7 -12
  140. package/lib/engine/data/tree.js +101 -49
  141. package/lib/engine/module.d.ts +2 -1
  142. package/lib/engine/module.js +2 -5
  143. package/lib/engine/space.d.ts +1 -0
  144. package/lib/engine/space.js +6 -0
  145. package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +156 -24
  146. package/lib/engine/transaction/nodes/bucket.trx_node.js +297 -467
  147. package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +4 -2
  148. package/lib/engine/transaction/nodes/bucket_query.trx_node.js +27 -15
  149. package/lib/engine/transaction/nodes/job.trx_node.d.ts +2 -1
  150. package/lib/engine/transaction/nodes/job.trx_node.js +6 -0
  151. package/lib/engine/transaction/trx.d.ts +5 -2
  152. package/lib/engine/transaction/trx.js +2 -2
  153. package/lib/engine/transaction/trx_engine.config.d.ts +1 -3
  154. package/lib/engine/transaction/trx_engine.d.ts +2 -2
  155. package/lib/engine/transaction/trx_engine.js +14 -11
  156. package/lib/engine/transaction/trx_node.d.ts +14 -4
  157. package/lib/engine/transaction/trx_node.js +50 -8
  158. package/lib/engine/tree.d.ts +1 -1
  159. package/lib/engine/util/crypto.d.ts +50 -0
  160. package/lib/engine/util/crypto.js +89 -0
  161. package/lib/engine/util/deep.d.ts +5 -0
  162. package/lib/engine/util/deep.js +46 -0
  163. package/lib/engine/util/dotenv.d.ts +2 -8
  164. package/lib/engine/util/dotenv.js +14 -36
  165. package/lib/engine/util/hash.d.ts +3 -0
  166. package/lib/engine/util/hash.js +23 -0
  167. package/lib/engine/util/log.js +1 -1
  168. package/lib/engine/util/mime.d.ts +10 -0
  169. package/lib/engine/util/mime.js +389 -0
  170. package/lib/engine/util/parse.d.ts +6 -5
  171. package/lib/engine/util/parse.js +16 -15
  172. package/lib/engine/util/path.d.ts +3 -0
  173. package/lib/engine/util/path.js +92 -0
  174. package/lib/engine/util/rules.d.ts +4 -0
  175. package/lib/engine/util/rules.js +12 -0
  176. package/package.json +1 -1
  177. package/tools/compile.js +2 -2
  178. package/tools/dotenv.d.ts +1 -0
  179. package/tools/dotenv.js +4 -0
  180. package/tools/joaquin/job.d.ts +5 -5
  181. package/tools/joaquin/mock.d.ts +23 -2
  182. package/tools/joaquin/mock.js +127 -21
  183. package/tsconfig.build.tsbuildinfo +1 -1
  184. package/lib/adapters/postgres/test/postgres.bucket_query.test.d.ts +0 -0
  185. package/lib/adapters/postgres/test/postgres.bucket_query.test.js +0 -136
@@ -3,29 +3,33 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PostgresCLI = exports.cmd_migrate_one_up = exports.cmd_migrate_up = exports.cmd_make_migrations = exports.cmd_status = exports.cmd_create_db = exports.cmd_tables = exports.cmd_check = void 0;
6
+ exports.PostgresCLI = exports.cmd_import_csv = exports.cmd_query = exports.cmd_migrate_one_down = exports.cmd_migrate_down = exports.cmd_migrate_one_up = exports.cmd_migrate_up = exports.cmd_make_migrations = exports.cmd_status = exports.cmd_create_db = exports.cmd_tables = exports.cmd_check = void 0;
7
7
  const cli_adapter_1 = require("../../../engine/cli/cli_adapter");
8
8
  const database_1 = require("./migrator/database");
9
9
  const ui_1 = __importDefault(require("../../../engine/cli/ui"));
10
10
  const migrator_1 = require("./migrator");
11
+ const daemon_1 = require("../../../engine/daemon");
11
12
  const runner_1 = require("./migrator/runner");
13
+ const postgres_bucket_adapter_1 = require("./postgres.bucket_adapter");
14
+ const csv_1 = require("./migrator/csv");
12
15
  class cmd_check extends cli_adapter_1.CLICommand {
13
16
  constructor(provider) {
14
- super('check', 'check', 'Check if the connection to PostgreSQL is working properly');
17
+ super('any', 'check', 'check', 'Check if the connection to PostgreSQL is working properly');
15
18
  this.provider = provider;
16
19
  }
17
- async run() {
20
+ async run(daemon) {
18
21
  const res = await database_1.Database.checkConnection(this.provider.sql);
19
22
  if (res == true)
20
23
  ui_1.default.result('ok', 'Connection to PostgreSQL working.');
21
24
  else
22
25
  ui_1.default.result('error', 'Connection to PostgreSQL not working.', res);
26
+ await migrator_1.Migrator.prepare(daemon, this.provider.sql);
23
27
  }
24
28
  }
25
29
  exports.cmd_check = cmd_check;
26
30
  class cmd_tables extends cli_adapter_1.CLICommand {
27
31
  constructor(provider) {
28
- super('tables', 'tables', 'List the tables present on the database');
32
+ super('any', 'tables', 'tables', 'List the tables present on the database');
29
33
  this.provider = provider;
30
34
  }
31
35
  async run() {
@@ -36,10 +40,10 @@ class cmd_tables extends cli_adapter_1.CLICommand {
36
40
  exports.cmd_tables = cmd_tables;
37
41
  class cmd_create_db extends cli_adapter_1.CLICommand {
38
42
  constructor(provider) {
39
- super('create db', 'create db( NAME)', 'Create the database used by the application', /(\w*)/, ['name']);
43
+ super('any', 'create db', 'create db( NAME)', 'Create the database used by the application', /(\w*)/, ['name']);
40
44
  this.provider = provider;
41
45
  }
42
- async run(_, $) {
46
+ async run(daemon, $) {
43
47
  let name = $.name;
44
48
  const config = this.provider.config?.connection;
45
49
  if (!name) {
@@ -56,12 +60,13 @@ class cmd_create_db extends cli_adapter_1.CLICommand {
56
60
  catch (e) {
57
61
  ui_1.default.result('error', `Failed to create database ${name}`, e);
58
62
  }
63
+ await migrator_1.Migrator.prepare(daemon, this.provider.sql);
59
64
  }
60
65
  }
61
66
  exports.cmd_create_db = cmd_create_db;
62
67
  class cmd_status extends cli_adapter_1.CLICommand {
63
68
  constructor(provider) {
64
- super('status', 'status', 'Show the status of migrations on the current database');
69
+ super('any', 'status', 'status', 'Show the status of migrations on the current database');
65
70
  this.provider = provider;
66
71
  }
67
72
  async run(daemon) {
@@ -72,7 +77,7 @@ class cmd_status extends cli_adapter_1.CLICommand {
72
77
  exports.cmd_status = cmd_status;
73
78
  class cmd_make_migrations extends cli_adapter_1.CLICommand {
74
79
  constructor(provider) {
75
- super('make migrations', 'make migrations( TAG)', 'Generate migrations for the bucket(s) using PostgresBucketAdapter', /(\w*)/, ['tag']);
80
+ super('any', 'make migrations', 'make migrations( TAG)', 'Generate migrations for the bucket(s) using PostgresBucketAdapter', /(\w*)/, ['tag']);
76
81
  this.provider = provider;
77
82
  }
78
83
  async run(daemon, $) {
@@ -88,7 +93,7 @@ class cmd_make_migrations extends cli_adapter_1.CLICommand {
88
93
  exports.cmd_make_migrations = cmd_make_migrations;
89
94
  class cmd_migrate_up extends cli_adapter_1.CLICommand {
90
95
  constructor(provider) {
91
- super('migrate up', 'migrate up', 'Run ALL the pending migrations up (batch)');
96
+ super('any', 'migrate up', 'migrate up', 'Run ALL the pending migrations up (batch)');
92
97
  this.provider = provider;
93
98
  }
94
99
  async run(daemon) {
@@ -98,7 +103,7 @@ class cmd_migrate_up extends cli_adapter_1.CLICommand {
98
103
  exports.cmd_migrate_up = cmd_migrate_up;
99
104
  class cmd_migrate_one_up extends cli_adapter_1.CLICommand {
100
105
  constructor(provider) {
101
- super('migrate one up', 'migrate one up', 'Run ONE pending migration up');
106
+ super('any', 'migrate one up', 'migrate one up', 'Run ONE pending migration up');
102
107
  this.provider = provider;
103
108
  }
104
109
  async run(daemon) {
@@ -106,6 +111,57 @@ class cmd_migrate_one_up extends cli_adapter_1.CLICommand {
106
111
  }
107
112
  }
108
113
  exports.cmd_migrate_one_up = cmd_migrate_one_up;
114
+ class cmd_migrate_down extends cli_adapter_1.CLICommand {
115
+ constructor(provider) {
116
+ super('any', 'migrate down', 'migrate down', 'Rollback the last batch of migrations');
117
+ this.provider = provider;
118
+ }
119
+ async run(daemon) {
120
+ await runner_1.MigrationRunner.down(daemon, this.provider.sql, 'batch');
121
+ }
122
+ }
123
+ exports.cmd_migrate_down = cmd_migrate_down;
124
+ class cmd_migrate_one_down extends cli_adapter_1.CLICommand {
125
+ constructor(provider) {
126
+ super('any', 'migrate one down', 'migrate one down', 'Rollback the last migration');
127
+ this.provider = provider;
128
+ }
129
+ async run(daemon) {
130
+ await runner_1.MigrationRunner.down(daemon, this.provider.sql, 'one');
131
+ }
132
+ }
133
+ exports.cmd_migrate_one_down = cmd_migrate_one_down;
134
+ class cmd_query extends cli_adapter_1.CLICommand {
135
+ constructor(provider) {
136
+ super('any', 'query', 'query', 'Run a SQL query on the database server');
137
+ this.provider = provider;
138
+ }
139
+ async run() {
140
+ const query = await ui_1.default.question('SQL');
141
+ const res = await this.provider.sql.unsafe(query);
142
+ console.log(res);
143
+ }
144
+ }
145
+ exports.cmd_query = cmd_query;
146
+ class cmd_import_csv extends cli_adapter_1.CLICommand {
147
+ constructor(provider) {
148
+ super('any', 'import csv', 'import csv PATH', 'Run a SQL query on the database server', /(.+)/, ['path']);
149
+ this.provider = provider;
150
+ }
151
+ async run(daemon, input) {
152
+ const buckets = daemon_1.Daemon.getModules(daemon)
153
+ .map(module => Object.values(module.buckets)
154
+ .filter(bucket => bucket.adapter instanceof postgres_bucket_adapter_1.PostgresBucketAdapter)
155
+ .map(bucket => ({
156
+ name: `${module.name}::${bucket.schema.name}`,
157
+ tableName: bucket.adapter.tableName
158
+ })))
159
+ .flat(1);
160
+ const bucket = await ui_1.default.select('Bucket', buckets, b => b.name);
161
+ await csv_1.CSV.import(this.provider.sql, bucket.tableName, input.path);
162
+ }
163
+ }
164
+ exports.cmd_import_csv = cmd_import_csv;
109
165
  class PostgresCLI extends cli_adapter_1.CLIAdapter {
110
166
  constructor(provider) {
111
167
  super();
@@ -118,6 +174,10 @@ class PostgresCLI extends cli_adapter_1.CLIAdapter {
118
174
  'make migrations': new cmd_make_migrations(provider),
119
175
  'migrate up': new cmd_migrate_up(provider),
120
176
  'migrate one up': new cmd_migrate_one_up(provider),
177
+ 'migrate down': new cmd_migrate_down(provider),
178
+ 'migrate one down': new cmd_migrate_one_down(provider),
179
+ 'query': new cmd_query(provider),
180
+ 'import csv': new cmd_import_csv(provider),
121
181
  };
122
182
  }
123
183
  }
@@ -0,0 +1,5 @@
1
+ import { BucketAdapterConfig } from "../../../elements/entities/bucket/adapters/bucket_adapter";
2
+ import postgres from 'postgres';
3
+ export type PostgresConfig = BucketAdapterConfig & {
4
+ connection?: postgres.Options<any>;
5
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,12 +1,16 @@
1
1
  import { AnyTrxNode } from "../../../engine/transaction/trx_node";
2
2
  import { NQLRunner } from "../../../elements/entities/bucket/query/nql_engine";
3
- import { NQL_Part } from "../../../elements/entities/bucket/query/nql.schema";
3
+ import { NQL_Pagination, NQL_Part } from "../../../elements/entities/bucket/query/nql.schema";
4
4
  import postgres from 'postgres';
5
5
  type Obj = Record<string, any>;
6
6
  export declare class PostgresNQLRunner extends NQLRunner {
7
7
  protected sql?: postgres.Sql<any>;
8
8
  constructor();
9
- private guard;
10
- run(trx: AnyTrxNode, part: NQL_Part, params: Obj): Promise<any>;
9
+ run(trx: AnyTrxNode, part: NQL_Part, params: Obj, pagination?: NQL_Pagination): Promise<{
10
+ data: Obj[];
11
+ count: number | undefined;
12
+ page: number | undefined;
13
+ perPage: number | undefined;
14
+ }>;
11
15
  }
12
16
  export {};
@@ -9,52 +9,84 @@ class PostgresNQLRunner extends nql_engine_1.NQLRunner {
9
9
  constructor() {
10
10
  super();
11
11
  }
12
- guard(sql) {
13
- return (template, ...params) => {
14
- return sql.call(sql, template, ...params).catch(e => {
15
- log_1.Log.error('bucket', 'postgres', e.toString(), e);
16
- throw new Error('Database error.');
17
- });
18
- };
19
- }
20
- async run(trx, part, params) {
12
+ async run(trx, part, params, pagination) {
21
13
  const sql = trx_1.Trx.get(trx, 'sql');
22
- const tableName = postgres_bucket_adapter_1.PostgresBucketAdapter.getTableName(trx, part.union.meta);
23
- // console.log(NQL_RuleTree.describe(part.union));
14
+ const { tableName, meta } = postgres_bucket_adapter_1.PostgresBucketAdapter.getTableMeta(trx, part.union.meta);
15
+ const sql_params = [];
24
16
  const _sql = (part) => {
25
- return this.guard(sql) `SELECT * FROM ${sql(tableName)} WHERE ${sql.unsafe(_union(part.union))}`;
17
+ let where = _union(part.union);
18
+ if (where) {
19
+ where = 'WHERE ' + where;
20
+ }
21
+ const sql_str = `FROM ${tableName} ${where}`;
22
+ return sql_str;
26
23
  };
27
24
  const _union = (union) => {
28
- return `(${union.inters.map(i => _inter(i)).join(' OR ')})`;
25
+ const inters = union.inters.map(i => _inter(i)).filter(r => !!r).join(' OR ');
26
+ if (!inters)
27
+ return '';
28
+ return `(${inters})`;
29
29
  };
30
30
  const _inter = (inter) => {
31
- return `(${inter.rules.map(r => (('value' in r) ? _rule(r) : _union(r))).join(' AND ')})`;
31
+ const rules = inter.rules.map(r => (('value' in r) ? _rule(r) : _union(r))).filter(r => !!r).join(' AND ');
32
+ if (!rules)
33
+ return '';
34
+ return `(${rules})`;
32
35
  };
33
36
  const _rule = (rule) => {
34
37
  // Replace '.' of fieldpath with '->' (JSONB compatible)
35
- // TODO: process '.*'
36
- const column = rule.fieldpath.replace(/\./g, '->');
37
- const op = {
38
+ let column = rule.fieldpath.replace(/\./g, '->');
39
+ // TODO: handle '.#'
40
+ // Special case: "present" operation
41
+ if (rule.op === 'present') {
42
+ if (rule.not) {
43
+ return `"${column}" IS NULL`;
44
+ }
45
+ else {
46
+ return `"${column}" IS NOT NULL`;
47
+ }
48
+ }
49
+ // Fetch value
50
+ let value;
51
+ if ('static' in rule.value) {
52
+ value = rule.value.static;
53
+ }
54
+ else if ('param' in rule.value) {
55
+ value = params[rule.value.param]; // TODO: deal with param[]
56
+ }
57
+ else {
58
+ throw new Error('Sub-queries not implemented yet.'); // TODO: subquery
59
+ }
60
+ // Don't add condition if value is null
61
+ if (value === undefined) {
62
+ return '';
63
+ }
64
+ // Translate operation
65
+ let op = {
38
66
  '==': '=',
39
67
  '<': '<',
40
68
  '>': '>',
41
69
  '<=': '<=',
42
70
  '>=': '>=',
43
- 'in': 'in',
44
- 'contains': 'like',
45
- 'contains_any': 'like',
46
- 'present': ''
71
+ 'in': 'IN',
72
+ 'contains': 'LIKE',
73
+ 'contains_any': '' // TODO
47
74
  }[rule.op];
48
- let value;
49
- if ('static' in rule.value)
50
- value = rule.value.static;
51
- else if ('param' in rule.value)
52
- value = params[rule.value.param]; // TODO: deal with param[]
53
- else {
54
- // TODO: subquery
55
- throw new Error('Sub-queries not implemented yet.');
75
+ // Apply case insensitive modifier
76
+ if (rule.case_i) {
77
+ if (rule.op === '==') {
78
+ column = `LOWER(${column})`;
79
+ }
80
+ else if (rule.op === 'contains') {
81
+ op = 'ILIKE';
82
+ }
56
83
  }
57
- return `${column} ${op} ${value}`;
84
+ // Special case: "contains" operation
85
+ if (rule.op === 'contains') {
86
+ value = `%${value}%`;
87
+ }
88
+ sql_params.push(value);
89
+ return `${rule.not ? 'NOT ' : ''} "${column}" ${op} $${sql_params.length}`;
58
90
  };
59
91
  // Debug
60
92
  // const str = await _sql(part).describe().catch(e => {
@@ -62,8 +94,30 @@ class PostgresNQLRunner extends nql_engine_1.NQLRunner {
62
94
  // })
63
95
  // console.log((str as any).string);
64
96
  // End of Debug
65
- const out = await _sql(part);
66
- return Object.values(out);
97
+ const sql_str = await _sql(part);
98
+ const order = part.union.order;
99
+ const order_str = `ORDER BY ${order?.by || meta.updated_at} ${order?.dir === 'asc' ? 'ASC' : 'DESC'}`;
100
+ let limit_str = '';
101
+ if (pagination?.page || pagination?.perPage) {
102
+ const limit = pagination.perPage || 10;
103
+ const offset = ((pagination.page || 1) - 1) * limit;
104
+ limit_str = `OFFSET ${offset} LIMIT ${limit}`;
105
+ }
106
+ let count = undefined;
107
+ if (pagination?.count) {
108
+ const res_count = await sql.unsafe(`SELECT count(*) ${sql_str}`, sql_params);
109
+ count = parseInt(res_count[0].count);
110
+ }
111
+ const data = await sql.unsafe(`SELECT * ${sql_str} ${order_str} ${limit_str}`, sql_params).catch(e => {
112
+ log_1.Log.error('bucket', 'postgres', e.toString(), e);
113
+ throw new Error('Database error.');
114
+ });
115
+ return {
116
+ data,
117
+ count,
118
+ page: pagination?.page,
119
+ perPage: pagination?.perPage,
120
+ };
67
121
  }
68
122
  }
69
123
  exports.PostgresNQLRunner = PostgresNQLRunner;
@@ -0,0 +1,18 @@
1
+ import postgres from 'postgres';
2
+ import { PostgresNQLRunner } from './postgres.nql';
3
+ import { AnyTrx } from "../../../engine/transaction/trx";
4
+ import { TrxEngineWrapFn } from "../../../engine/transaction/trx_engine.config";
5
+ import { PostgresConfig } from './postgres.config';
6
+ export declare class PostgresProvider {
7
+ config?: PostgresConfig | undefined;
8
+ static make<Name extends string>(name: Name, config?: PostgresConfig): {
9
+ name: Name;
10
+ libPaths: string[];
11
+ up: () => PostgresProvider;
12
+ down: () => void;
13
+ };
14
+ sql: postgres.Sql<any>;
15
+ nql: PostgresNQLRunner;
16
+ private constructor();
17
+ static wrap(provider: string): (trx: AnyTrx, fn: TrxEngineWrapFn<any, any>, providers: Record<string, any>) => Promise<import("../../../engine/transaction/trx_node").TrxNodeStatus>;
18
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostgresProvider = void 0;
4
+ const log_1 = require("../../../engine/util/log");
5
+ const date_1 = require("../../../engine/data/date");
6
+ const datetime_1 = require("../../../engine/data/datetime");
7
+ const decimal_1 = require("../../../engine/data/decimal");
8
+ const postgres_nql_1 = require("./postgres.nql");
9
+ const trx_1 = require("../../../engine/transaction/trx");
10
+ const database_1 = require("./migrator/database");
11
+ class PostgresProvider {
12
+ static make(name, config) {
13
+ return {
14
+ name: name,
15
+ libPaths: [
16
+ 'modules/*/migrations'
17
+ ],
18
+ up: () => new PostgresProvider(config),
19
+ down: () => { }
20
+ };
21
+ }
22
+ constructor(config) {
23
+ this.config = config;
24
+ log_1.Log.info('postgres', 'provider', 'Connecting to Postgres database');
25
+ this.sql = database_1.Database.connect({
26
+ ...(config?.connection || {}),
27
+ debug: true,
28
+ types: {
29
+ char: {
30
+ to: 1042,
31
+ from: [1042],
32
+ serialize: (val) => val?.trim?.(),
33
+ parse: (val) => val?.trim?.()
34
+ },
35
+ date: {
36
+ to: 1082,
37
+ from: [1082],
38
+ serialize: (val) => val?.toISO(),
39
+ parse: (val) => val ? date_1.NesoiDate.fromISO(val) : undefined
40
+ },
41
+ datetime: {
42
+ to: 1114,
43
+ from: [1114],
44
+ serialize: (val) => typeof val === 'string'
45
+ ? val
46
+ : val?.toISO(),
47
+ parse: (val) => datetime_1.NesoiDatetime.fromISO(val?.replace(' ', 'T') + 'Z')
48
+ },
49
+ datetime_z: {
50
+ to: 1184,
51
+ from: [1184],
52
+ serialize: (val) => typeof val === 'string'
53
+ ? val
54
+ : val?.toISO(),
55
+ parse: (val) => datetime_1.NesoiDatetime.fromISO(val?.replace(' ', 'T') + 'Z')
56
+ },
57
+ decimal: {
58
+ to: 1700,
59
+ from: [1700],
60
+ serialize: (val) => val?.toString(),
61
+ parse: (val) => val ? new decimal_1.NesoiDecimal(val) : undefined
62
+ }
63
+ }
64
+ });
65
+ this.nql = new postgres_nql_1.PostgresNQLRunner();
66
+ }
67
+ static wrap(provider) {
68
+ return (trx, fn, providers) => {
69
+ const postgres = providers[provider].sql;
70
+ return postgres.begin(sql => {
71
+ trx_1.Trx.set(trx.root, 'sql', sql);
72
+ return fn(trx.root);
73
+ });
74
+ };
75
+ }
76
+ }
77
+ exports.PostgresProvider = PostgresProvider;
@@ -4,14 +4,20 @@ const mock_1 = require("../../../../tools/joaquin/mock");
4
4
  const bucket_builder_1 = require("../../../elements/entities/bucket/bucket.builder");
5
5
  const log_1 = require("../../../engine/util/log");
6
6
  const inline_app_1 = require("../../../engine/apps/inline.app");
7
+ const postgres_provider_1 = require("../src/postgres.provider");
7
8
  const postgres_bucket_adapter_1 = require("../src/postgres.bucket_adapter");
8
9
  const migrator_1 = require("../src/migrator");
9
10
  const runner_1 = require("../src/migrator/runner");
10
- const database_1 = require("../src/migrator/database");
11
+ const datetime_1 = require("../../../engine/data/datetime");
11
12
  log_1.Log.level = 'warn';
12
13
  // TODO: read this from env
13
14
  const PostgresConfig = {
14
- updatedAtField: 'updated_at',
15
+ meta: {
16
+ created_at: 'created_at',
17
+ created_by: 'created_by',
18
+ updated_at: 'updated_at',
19
+ updated_by: 'updated_by',
20
+ },
15
21
  connection: {
16
22
  host: 'localhost',
17
23
  port: 5432,
@@ -47,7 +53,7 @@ async function setup() {
47
53
  const app = new inline_app_1.InlineApp('RUNTIME', [
48
54
  bucket
49
55
  ])
50
- .provider(postgres_bucket_adapter_1.PostgresProvider.make('pg', PostgresConfig))
56
+ .provider(postgres_provider_1.PostgresProvider.make('pg', PostgresConfig))
51
57
  .config.buckets({
52
58
  'MODULE': {
53
59
  'BUCKET': {
@@ -57,22 +63,20 @@ async function setup() {
57
63
  })
58
64
  .config.trx({
59
65
  'MODULE': {
60
- trx: {
61
- wrap: postgres_bucket_adapter_1.PostgresProvider.wrap('pg')
62
- }
66
+ wrap: postgres_provider_1.PostgresProvider.wrap('pg')
63
67
  }
64
68
  });
65
69
  // Run test daemon
66
70
  daemon = await app.daemon();
67
71
  // Prepare database using daemon
68
72
  // TODO: encapsulate this
69
- // await Migrator.createDatabase('NESOI_TEST', PostgresConfig, { if_exists: 'delete' });
70
- const sql = database_1.Database.connect(PostgresConfig.connection);
71
- const migrator = await migrator_1.Migrator.prepare(daemon, sql);
73
+ // await Database.createDatabase('NESOI_TEST', PostgresConfig.connection, { if_exists: 'delete' });
74
+ const pg = postgres_provider_1.PostgresProvider.make('pg', PostgresConfig).up();
75
+ const migrator = await migrator_1.Migrator.prepare(daemon, pg.sql);
72
76
  const migration = await migrator.generateForBucket('MODULE', 'BUCKET', 'nesoi_test_table');
73
77
  if (migration) {
74
78
  migration.name = 'postgres.bucket_adapter.test';
75
- await runner_1.MigrationRunner.oneUp(daemon, sql, migration);
79
+ await runner_1.MigrationRunner.injectUp(daemon, pg.sql, migration);
76
80
  }
77
81
  // migration?.save();
78
82
  // await MigrationRunner.up(daemon, 'one', PostgresConfig);
@@ -88,34 +92,50 @@ describe('Postgres Bucket Adapter', () => {
88
92
  // })
89
93
  describe('CRUD', () => {
90
94
  it('create should return unmodified object', async () => {
91
- await daemon.trx('MODULE').run(async (trx) => {
95
+ const response = await daemon.trx('MODULE').run(async (trx) => {
92
96
  // given
93
97
  const BUCKET = trx.bucket('BUCKET');
94
98
  const input = mock.bucket('MODULE', 'BUCKET')
95
99
  .obj({ id: undefined }).raw(daemon);
96
100
  // when
97
- const { id, ...obj } = await BUCKET.create(input);
98
- // then
99
- expect(id).toBeTruthy();
100
- expect(obj).toEqual(input);
101
+ const created = await BUCKET.create(input);
102
+ return { input, created };
103
+ });
104
+ const { input, created: { id, ...obj } } = response.output;
105
+ // then
106
+ expect(id).toBeTruthy();
107
+ expect(obj).toEqual({
108
+ ...input,
109
+ created_at: expect.any(datetime_1.NesoiDatetime),
110
+ updated_at: expect.any(datetime_1.NesoiDatetime),
111
+ created_by: null,
112
+ updated_by: null
101
113
  });
102
114
  });
103
115
  it('read should return unmodified object after create', async () => {
104
- await daemon.trx('MODULE').run(async (trx) => {
116
+ const response = await daemon.trx('MODULE').run(async (trx) => {
105
117
  // given
106
118
  const BUCKET = trx.bucket('BUCKET');
107
119
  const input = mock.bucket('MODULE', 'BUCKET')
108
120
  .obj({ id: undefined }).raw(daemon);
109
121
  // when
110
122
  const created = await BUCKET.create(input);
111
- const { id, ...obj } = await BUCKET.readOneOrFail(created.id);
112
- // then
113
- expect(id).toBeTruthy();
114
- expect(obj).toEqual(input);
123
+ const updated = await BUCKET.readOneOrFail(created.id);
124
+ return { input, updated };
125
+ });
126
+ const { input, updated: { id, ...obj } } = response.output;
127
+ // then
128
+ expect(id).toBeTruthy();
129
+ expect(obj).toEqual({
130
+ ...input,
131
+ created_at: expect.any(datetime_1.NesoiDatetime),
132
+ updated_at: expect.any(datetime_1.NesoiDatetime),
133
+ created_by: null,
134
+ updated_by: null
115
135
  });
116
136
  });
117
137
  it('update should modify object after insert', async () => {
118
- await daemon.trx('MODULE').run(async (trx) => {
138
+ const response = await daemon.trx('MODULE').run(async (trx) => {
119
139
  // given
120
140
  const BUCKET = trx.bucket('BUCKET');
121
141
  const input1 = mock.bucket('MODULE', 'BUCKET')
@@ -123,20 +143,34 @@ describe('Postgres Bucket Adapter', () => {
123
143
  const input2 = mock.bucket('MODULE', 'BUCKET')
124
144
  .obj({ id: undefined }).raw(daemon);
125
145
  // when
126
- const { id: id_create, ...created } = await BUCKET.create(input1);
127
- const { id: id_update, ...updated } = await BUCKET.put({
146
+ const created = await BUCKET.create(input1);
147
+ const updated = await BUCKET.patch({
128
148
  ...input2,
129
- id: id_create
149
+ id: created.id
130
150
  });
131
- // then
132
- expect(id_create).toBeTruthy();
133
- expect(id_update).toEqual(id_create);
134
- expect(created).toEqual(input1);
135
- expect(updated).toEqual(input2);
151
+ return { input1, input2, created, updated };
152
+ });
153
+ const { input1, input2, created: { id: id_create, ...created }, updated: { id: id_update, ...updated }, } = response.output;
154
+ // then
155
+ expect(id_create).toBeTruthy();
156
+ expect(id_update).toEqual(id_create);
157
+ expect(created).toEqual({
158
+ ...input1,
159
+ created_at: expect.any(datetime_1.NesoiDatetime),
160
+ updated_at: expect.any(datetime_1.NesoiDatetime),
161
+ created_by: null,
162
+ updated_by: null
163
+ });
164
+ expect(updated).toEqual({
165
+ ...input2,
166
+ created_at: expect.any(datetime_1.NesoiDatetime),
167
+ updated_at: expect.any(datetime_1.NesoiDatetime),
168
+ created_by: null,
169
+ updated_by: null
136
170
  });
137
171
  });
138
172
  it('delete should remove object from database', async () => {
139
- await daemon.trx('MODULE').run(async (trx) => {
173
+ const response = await daemon.trx('MODULE').run(async (trx) => {
140
174
  // given
141
175
  const BUCKET = trx.bucket('BUCKET');
142
176
  const input = mock.bucket('MODULE', 'BUCKET')
@@ -144,30 +178,33 @@ describe('Postgres Bucket Adapter', () => {
144
178
  // when
145
179
  const created = await BUCKET.create(input);
146
180
  const read = await BUCKET.readOneOrFail(created.id);
147
- await BUCKET.deleteOrFail(read.id);
181
+ await BUCKET.delete(read.id);
148
182
  const read2 = await BUCKET.readOne(read.id);
149
- // then
150
- expect(read2).toBeUndefined();
183
+ return { read2 };
151
184
  });
185
+ const { read2 } = response.output;
186
+ // then
187
+ expect(read2).toBeUndefined();
152
188
  });
153
189
  });
154
190
  describe('Query', () => {
155
191
  it('query first by existing id should return object', async () => {
156
- let queried;
157
- await daemon.trx('MODULE').run(async (trx) => {
192
+ const response = await daemon.trx('MODULE').run(async (trx) => {
158
193
  // given
159
194
  const BUCKET = trx.bucket('BUCKET');
160
195
  const input = mock.bucket('MODULE', 'BUCKET')
161
196
  .obj({ id: undefined }).raw(daemon);
162
197
  // when
163
198
  const created = await BUCKET.create(input);
164
- queried = await BUCKET.query({
199
+ const queried = await BUCKET.query({
165
200
  'id': created.id
166
201
  }).all();
167
- // then
168
- expect(queried.length).toEqual(1);
169
- expect(queried[0].id).toEqual(created.id);
202
+ return { queried, created };
170
203
  });
204
+ const { queried, created } = response.output;
205
+ // then
206
+ expect(queried.length).toEqual(1);
207
+ expect(queried[0].id).toEqual(created.id);
171
208
  });
172
209
  });
173
210
  });
@@ -1,4 +1,5 @@
1
1
  import { Compiler } from "../../compiler";
2
+ import { AnyApp } from "../../../engine/apps/app";
2
3
  import { MonolythApp } from "../../../engine/apps/monolyth/monolyth.app";
3
4
  export type MonolythCompilerConfig = {
4
5
  libPaths?: string[];
@@ -17,5 +18,7 @@ export declare class MonolythCompiler {
17
18
  };
18
19
  constructor(compiler: Compiler, appPath: string, config?: MonolythCompilerConfig);
19
20
  run(): Promise<void>;
21
+ mergeProviderPaths(app: AnyApp): void;
22
+ expandLibPaths(): void;
20
23
  static scanAll(dir: string): Promise<MonolythApp<any, any, Record<string, any>>[] | undefined>;
21
24
  }