nesoi 3.0.9 → 3.0.11

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 (99) hide show
  1. package/lib/compiler/apps/monolyth/monolyth_compiler.d.ts +1 -1
  2. package/lib/compiler/apps/monolyth/monolyth_compiler.js +7 -7
  3. package/lib/elements/blocks/block.builder.js +1 -1
  4. package/lib/elements/blocks/job/job.builder.js +3 -2
  5. package/lib/elements/blocks/machine/machine.builder.js +12 -1
  6. package/lib/elements/blocks/machine/machine.schema.d.ts +2 -1
  7. package/lib/elements/blocks/machine/machine.schema.js +2 -1
  8. package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +3 -1
  9. package/lib/elements/edge/controller/adapters/controller_adapter.js +2 -1
  10. package/lib/elements/edge/controller/controller.config.d.ts +3 -2
  11. package/lib/elements/edge/controller/controller.d.ts +3 -3
  12. package/lib/elements/edge/controller/controller.js +3 -3
  13. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +2 -1
  14. package/lib/elements/entities/bucket/bucket.config.d.ts +3 -3
  15. package/lib/elements/entities/bucket/bucket.d.ts +3 -2
  16. package/lib/elements/entities/bucket/bucket.js +4 -4
  17. package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +1 -1
  18. package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +4 -0
  19. package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +3 -0
  20. package/lib/elements/entities/bucket/query/nql_compiler.js +2 -1
  21. package/lib/elements/entities/message/template/message_template_field.builder.d.ts +6 -0
  22. package/lib/elements/entities/message/template/message_template_field.builder.js +3 -0
  23. package/lib/elements/entities/message/template/message_template_parser.js +5 -0
  24. package/lib/engine/apps/app.config.d.ts +12 -11
  25. package/lib/engine/apps/app.d.ts +11 -22
  26. package/lib/engine/apps/app.js +9 -9
  27. package/lib/engine/apps/inline.app.d.ts +9 -8
  28. package/lib/engine/apps/inline.app.js +24 -24
  29. package/lib/engine/apps/monolyth/monolyth.app.d.ts +5 -5
  30. package/lib/engine/apps/monolyth/monolyth.app.js +6 -6
  31. package/lib/engine/apps/service.d.ts +30 -0
  32. package/lib/engine/apps/service.js +15 -0
  33. package/lib/engine/auth/authn.d.ts +10 -1
  34. package/lib/engine/auth/zero.authn_provider.d.ts +7 -3
  35. package/lib/engine/auth/zero.authn_provider.js +9 -2
  36. package/lib/engine/cli/cli.d.ts +2 -2
  37. package/lib/engine/cli/cli.js +1 -1
  38. package/lib/engine/cli/ui.js +1 -1
  39. package/lib/engine/daemon.d.ts +12 -12
  40. package/lib/engine/daemon.js +18 -18
  41. package/lib/engine/data/duration.d.ts +53 -0
  42. package/lib/engine/data/duration.js +62 -0
  43. package/lib/engine/data/error.d.ts +7 -0
  44. package/lib/engine/data/error.js +9 -1
  45. package/lib/engine/dependency.d.ts +2 -1
  46. package/lib/engine/dependency.js +18 -0
  47. package/lib/engine/module.d.ts +6 -4
  48. package/lib/engine/module.js +25 -10
  49. package/lib/engine/transaction/nodes/bucket.trx_node.js +1 -2
  50. package/lib/engine/transaction/nodes/bucket_query.trx_node.js +5 -10
  51. package/lib/engine/transaction/nodes/job.trx_node.js +2 -4
  52. package/lib/engine/transaction/nodes/machine.trx_node.js +2 -4
  53. package/lib/engine/transaction/nodes/queue.trx_node.js +1 -2
  54. package/lib/engine/transaction/nodes/resource.trx_node.js +2 -4
  55. package/lib/engine/transaction/trx.d.ts +6 -4
  56. package/lib/engine/transaction/trx.js +2 -1
  57. package/lib/engine/transaction/trx_engine.config.d.ts +2 -2
  58. package/lib/engine/transaction/trx_engine.d.ts +4 -3
  59. package/lib/engine/transaction/trx_engine.js +20 -17
  60. package/lib/engine/transaction/trx_node.d.ts +4 -2
  61. package/lib/engine/transaction/trx_node.js +13 -1
  62. package/lib/engine/tree.js +6 -17
  63. package/lib/engine/util/i18n.js +3 -3
  64. package/lib/engine/util/parse.d.ts +5 -0
  65. package/lib/engine/util/parse.js +10 -0
  66. package/lib/schema.d.ts +1 -1
  67. package/package.json +2 -3
  68. package/tools/joaquin/job.js +2 -2
  69. package/tools/joaquin/message.js +2 -2
  70. package/tools/joaquin/mock.d.ts +6 -6
  71. package/tsconfig.build.tsbuildinfo +1 -1
  72. package/lib/adapters/postgres/src/migrator/csv.d.ts +0 -7
  73. package/lib/adapters/postgres/src/migrator/csv.js +0 -72
  74. package/lib/adapters/postgres/src/migrator/database.d.ts +0 -34
  75. package/lib/adapters/postgres/src/migrator/database.js +0 -88
  76. package/lib/adapters/postgres/src/migrator/generator/generator.d.ts +0 -22
  77. package/lib/adapters/postgres/src/migrator/generator/generator.js +0 -326
  78. package/lib/adapters/postgres/src/migrator/generator/migration.d.ts +0 -66
  79. package/lib/adapters/postgres/src/migrator/generator/migration.js +0 -249
  80. package/lib/adapters/postgres/src/migrator/generator/provider.d.ts +0 -19
  81. package/lib/adapters/postgres/src/migrator/generator/provider.js +0 -74
  82. package/lib/adapters/postgres/src/migrator/index.d.ts +0 -47
  83. package/lib/adapters/postgres/src/migrator/index.js +0 -22
  84. package/lib/adapters/postgres/src/migrator/runner/runner.d.ts +0 -17
  85. package/lib/adapters/postgres/src/migrator/runner/runner.js +0 -249
  86. package/lib/adapters/postgres/src/migrator/runner/status.d.ts +0 -17
  87. package/lib/adapters/postgres/src/migrator/runner/status.js +0 -55
  88. package/lib/adapters/postgres/src/postgres.bucket_adapter.d.ts +0 -42
  89. package/lib/adapters/postgres/src/postgres.bucket_adapter.js +0 -294
  90. package/lib/adapters/postgres/src/postgres.cli.d.ts +0 -76
  91. package/lib/adapters/postgres/src/postgres.cli.js +0 -207
  92. package/lib/adapters/postgres/src/postgres.config.d.ts +0 -5
  93. package/lib/adapters/postgres/src/postgres.config.js +0 -2
  94. package/lib/adapters/postgres/src/postgres.nql.d.ts +0 -16
  95. package/lib/adapters/postgres/src/postgres.nql.js +0 -123
  96. package/lib/adapters/postgres/src/postgres.provider.d.ts +0 -18
  97. package/lib/adapters/postgres/src/postgres.provider.js +0 -77
  98. package/lib/adapters/postgres/test/postgres.bucket_adapter.test.d.ts +0 -1
  99. package/lib/adapters/postgres/test/postgres.bucket_adapter.test.js +0 -210
@@ -1,207 +0,0 @@
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.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_make_empty_migration = exports.cmd_status = exports.cmd_create_db = exports.cmd_tables = exports.cmd_check = void 0;
7
- const cli_adapter_1 = require("../../../engine/cli/cli_adapter");
8
- const database_1 = require("./migrator/database");
9
- const provider_1 = require("./migrator/generator/provider");
10
- const ui_1 = __importDefault(require("../../../engine/cli/ui"));
11
- const daemon_1 = require("../../../engine/daemon");
12
- const postgres_bucket_adapter_1 = require("./postgres.bucket_adapter");
13
- const csv_1 = require("./migrator/csv");
14
- const runner_1 = require("./migrator/runner/runner");
15
- const migration_1 = require("./migrator/generator/migration");
16
- class cmd_check extends cli_adapter_1.CLICommand {
17
- constructor(provider) {
18
- super('any', 'check', 'check', 'Check if the connection to PostgreSQL is working properly');
19
- this.provider = provider;
20
- }
21
- async run(daemon) {
22
- const res = await database_1.Database.checkConnection(this.provider.sql);
23
- if (res == true)
24
- ui_1.default.result('ok', 'Connection to PostgreSQL working.');
25
- else
26
- ui_1.default.result('error', 'Connection to PostgreSQL not working.', res);
27
- await provider_1.MigrationProvider.create(daemon, this.provider.sql);
28
- }
29
- }
30
- exports.cmd_check = cmd_check;
31
- class cmd_tables extends cli_adapter_1.CLICommand {
32
- constructor(provider) {
33
- super('any', 'tables', 'tables', 'List the tables present on the database');
34
- this.provider = provider;
35
- }
36
- async run() {
37
- const res = await database_1.Database.listTables(this.provider.sql);
38
- ui_1.default.list(res);
39
- }
40
- }
41
- exports.cmd_tables = cmd_tables;
42
- class cmd_create_db extends cli_adapter_1.CLICommand {
43
- constructor(provider) {
44
- super('any', 'create db', 'create db( NAME)', 'Create the database used by the application', /(\w*)/, ['name']);
45
- this.provider = provider;
46
- }
47
- async run(daemon, $) {
48
- let name = $.name;
49
- const config = this.provider.config?.connection;
50
- if (!name) {
51
- if (!config?.db) {
52
- ui_1.default.result('error', 'Database name not configured on PostgresConfig used', config);
53
- return;
54
- }
55
- name = config.db;
56
- }
57
- try {
58
- await database_1.Database.createDatabase(name, config);
59
- ui_1.default.result('ok', `Database ${name} created`);
60
- }
61
- catch (e) {
62
- ui_1.default.result('error', `Failed to create database ${name}`, e);
63
- }
64
- await provider_1.MigrationProvider.create(daemon, this.provider.sql);
65
- }
66
- }
67
- exports.cmd_create_db = cmd_create_db;
68
- class cmd_status extends cli_adapter_1.CLICommand {
69
- constructor(provider) {
70
- super('any', 'status', 'status', 'Show the status of migrations on the current database');
71
- this.provider = provider;
72
- }
73
- async run(daemon) {
74
- const migrator = await provider_1.MigrationProvider.create(daemon, this.provider.sql);
75
- console.log(migrator.status.describe());
76
- }
77
- }
78
- exports.cmd_status = cmd_status;
79
- class cmd_make_empty_migration extends cli_adapter_1.CLICommand {
80
- constructor(cli, provider) {
81
- super('any', 'make empty migration', 'make empty migration( NAME)', 'Generate an empty migration to be filled by the user', /(\w*)/, ['name']);
82
- this.cli = cli;
83
- this.provider = provider;
84
- }
85
- async run(daemon, $) {
86
- const module = await ui_1.default.select('Pick a module to create the migration into:', daemon_1.Daemon.getModules(daemon).map(m => m.name));
87
- const name = $.name || await ui_1.default.question('Migration name');
88
- const migration = migration_1.$Migration.empty(module.value, name);
89
- const filepath = migration.save();
90
- this.cli.openEditor(filepath);
91
- }
92
- }
93
- exports.cmd_make_empty_migration = cmd_make_empty_migration;
94
- class cmd_make_migrations extends cli_adapter_1.CLICommand {
95
- constructor(provider) {
96
- super('any', 'make migrations', 'make migrations( TAG)', 'Generate migrations for the bucket(s) using PostgresBucketAdapter', /(\w*)/, ['tag']);
97
- this.provider = provider;
98
- }
99
- async run(daemon, $) {
100
- console.clear();
101
- // TODO: restrict by tag
102
- const migrator = await provider_1.MigrationProvider.create(daemon, this.provider.sql);
103
- const migrations = await migrator.generate();
104
- for (const migration of migrations) {
105
- migration.save();
106
- }
107
- await runner_1.MigrationRunner.up(daemon, this.provider.sql, 'batch');
108
- }
109
- }
110
- exports.cmd_make_migrations = cmd_make_migrations;
111
- class cmd_migrate_up extends cli_adapter_1.CLICommand {
112
- constructor(provider) {
113
- super('any', 'migrate up', 'migrate up', 'Run ALL the pending migrations up (batch)');
114
- this.provider = provider;
115
- }
116
- async run(daemon) {
117
- console.clear();
118
- await runner_1.MigrationRunner.up(daemon, this.provider.sql, 'batch');
119
- }
120
- }
121
- exports.cmd_migrate_up = cmd_migrate_up;
122
- class cmd_migrate_one_up extends cli_adapter_1.CLICommand {
123
- constructor(provider) {
124
- super('any', 'migrate one up', 'migrate one up', 'Run ONE pending migration up');
125
- this.provider = provider;
126
- }
127
- async run(daemon) {
128
- console.clear();
129
- await runner_1.MigrationRunner.up(daemon, this.provider.sql, 'one');
130
- }
131
- }
132
- exports.cmd_migrate_one_up = cmd_migrate_one_up;
133
- class cmd_migrate_down extends cli_adapter_1.CLICommand {
134
- constructor(provider) {
135
- super('any', 'migrate down', 'migrate down', 'Rollback the last batch of migrations');
136
- this.provider = provider;
137
- }
138
- async run(daemon) {
139
- console.clear();
140
- await runner_1.MigrationRunner.down(daemon, this.provider.sql, 'batch');
141
- }
142
- }
143
- exports.cmd_migrate_down = cmd_migrate_down;
144
- class cmd_migrate_one_down extends cli_adapter_1.CLICommand {
145
- constructor(provider) {
146
- super('any', 'migrate one down', 'migrate one down', 'Rollback the last migration');
147
- this.provider = provider;
148
- }
149
- async run(daemon) {
150
- console.clear();
151
- await runner_1.MigrationRunner.down(daemon, this.provider.sql, 'one');
152
- }
153
- }
154
- exports.cmd_migrate_one_down = cmd_migrate_one_down;
155
- class cmd_query extends cli_adapter_1.CLICommand {
156
- constructor(provider) {
157
- super('any', 'query', 'query', 'Run a SQL query on the database server');
158
- this.provider = provider;
159
- }
160
- async run() {
161
- const query = await ui_1.default.question('SQL');
162
- const res = await this.provider.sql.unsafe(query);
163
- console.log(res);
164
- }
165
- }
166
- exports.cmd_query = cmd_query;
167
- class cmd_import_csv extends cli_adapter_1.CLICommand {
168
- constructor(provider) {
169
- super('any', 'import csv', 'import csv PATH', 'Run a SQL query on the database server', /(.+)/, ['path']);
170
- this.provider = provider;
171
- }
172
- async run(daemon, input) {
173
- const buckets = daemon_1.Daemon.getModules(daemon)
174
- .map(module => Object.values(module.buckets)
175
- .filter(bucket => bucket.adapter instanceof postgres_bucket_adapter_1.PostgresBucketAdapter)
176
- .map(bucket => ({
177
- name: `${module.name}::${bucket.schema.name}`,
178
- tableName: bucket.adapter.tableName
179
- })))
180
- .flat(1);
181
- const bucket = await ui_1.default.select('Bucket', buckets, b => b.name);
182
- await csv_1.CSV.import(this.provider.sql, bucket.value.tableName, input.path);
183
- }
184
- }
185
- exports.cmd_import_csv = cmd_import_csv;
186
- class PostgresCLI extends cli_adapter_1.CLIAdapter {
187
- constructor(cli, provider) {
188
- super(cli);
189
- this.cli = cli;
190
- this.provider = provider;
191
- this.commands = {
192
- 'check': new cmd_check(provider),
193
- 'tables': new cmd_tables(provider),
194
- 'create db': new cmd_create_db(provider),
195
- 'status': new cmd_status(provider),
196
- 'make migrations': new cmd_make_migrations(provider),
197
- 'make empty migration': new cmd_make_empty_migration(cli, provider),
198
- 'migrate up': new cmd_migrate_up(provider),
199
- 'migrate one up': new cmd_migrate_one_up(provider),
200
- 'migrate down': new cmd_migrate_down(provider),
201
- 'migrate one down': new cmd_migrate_one_down(provider),
202
- 'query': new cmd_query(provider),
203
- 'import csv': new cmd_import_csv(provider),
204
- };
205
- }
206
- }
207
- exports.PostgresCLI = PostgresCLI;
@@ -1,5 +0,0 @@
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
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,16 +0,0 @@
1
- import { AnyTrxNode } from "../../../engine/transaction/trx_node";
2
- import { NQLRunner } from "../../../elements/entities/bucket/query/nql_engine";
3
- import { NQL_Pagination, NQL_Part } from "../../../elements/entities/bucket/query/nql.schema";
4
- import postgres from 'postgres';
5
- type Obj = Record<string, any>;
6
- export declare class PostgresNQLRunner extends NQLRunner {
7
- protected sql?: postgres.Sql<any>;
8
- constructor();
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
- }>;
15
- }
16
- export {};
@@ -1,123 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PostgresNQLRunner = void 0;
4
- const nql_engine_1 = require("../../../elements/entities/bucket/query/nql_engine");
5
- const trx_1 = require("../../../engine/transaction/trx");
6
- const postgres_bucket_adapter_1 = require("./postgres.bucket_adapter");
7
- const log_1 = require("../../../engine/util/log");
8
- class PostgresNQLRunner extends nql_engine_1.NQLRunner {
9
- constructor() {
10
- super();
11
- }
12
- async run(trx, part, params, pagination) {
13
- const sql = trx_1.Trx.get(trx, 'sql');
14
- const { tableName, meta } = postgres_bucket_adapter_1.PostgresBucketAdapter.getTableMeta(trx, part.union.meta);
15
- const sql_params = [];
16
- const _sql = (part) => {
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;
23
- };
24
- const _union = (union) => {
25
- const inters = union.inters.map(i => _inter(i)).filter(r => !!r).join(' OR ');
26
- if (!inters)
27
- return '';
28
- return `(${inters})`;
29
- };
30
- const _inter = (inter) => {
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})`;
35
- };
36
- const _rule = (rule) => {
37
- // Replace '.' of fieldpath with '->' (JSONB compatible)
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 = {
66
- '==': '=',
67
- '<': '<',
68
- '>': '>',
69
- '<=': '<=',
70
- '>=': '>=',
71
- 'in': 'IN',
72
- 'contains': 'LIKE',
73
- 'contains_any': '' // TODO
74
- }[rule.op];
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
- }
83
- }
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}`;
90
- };
91
- // Debug
92
- // const str = await _sql(part).describe().catch(e => {
93
- // Log.error('postgres' as any, 'nql', e.query, e);
94
- // })
95
- // console.log((str as any).string);
96
- // End of Debug
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
- };
121
- }
122
- }
123
- exports.PostgresNQLRunner = PostgresNQLRunner;
@@ -1,18 +0,0 @@
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
- }
@@ -1,77 +0,0 @@
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;
@@ -1,210 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const mock_1 = require("../../../../tools/joaquin/mock");
4
- const bucket_builder_1 = require("../../../elements/entities/bucket/bucket.builder");
5
- const log_1 = require("../../../engine/util/log");
6
- const inline_app_1 = require("../../../engine/apps/inline.app");
7
- const postgres_provider_1 = require("../src/postgres.provider");
8
- const postgres_bucket_adapter_1 = require("../src/postgres.bucket_adapter");
9
- const datetime_1 = require("../../../engine/data/datetime");
10
- const provider_1 = require("../src/migrator/generator/provider");
11
- const runner_1 = require("../src/migrator/runner/runner");
12
- log_1.Log.level = 'warn';
13
- // TODO: read this from env
14
- const PostgresConfig = {
15
- meta: {
16
- created_at: 'created_at',
17
- created_by: 'created_by',
18
- updated_at: 'updated_at',
19
- updated_by: 'updated_by',
20
- },
21
- connection: {
22
- host: 'localhost',
23
- port: 5432,
24
- user: 'postgres',
25
- pass: 'postgres',
26
- db: 'NESOI_TEST',
27
- }
28
- };
29
- let daemon;
30
- async function setup() {
31
- if (daemon) {
32
- return daemon;
33
- }
34
- // Build bucket used for test
35
- const bucket = new bucket_builder_1.BucketBuilder('MODULE', 'BUCKET')
36
- .model($ => ({
37
- id: $.int,
38
- p_boolean: $.boolean,
39
- p_date: $.date,
40
- p_datetime: $.datetime,
41
- p_decimal: $.decimal(),
42
- p_enum: $.enum(['a', 'b', 'c']),
43
- p_int: $.int,
44
- p_float: $.float,
45
- p_string: $.string,
46
- p_obj: $.obj({
47
- a: $.int,
48
- b: $.string
49
- }),
50
- p_dict: $.dict($.boolean)
51
- }));
52
- // Build test app
53
- const app = new inline_app_1.InlineApp('RUNTIME', [
54
- bucket
55
- ])
56
- .provider(postgres_provider_1.PostgresProvider.make('pg', PostgresConfig))
57
- .config.buckets({
58
- 'MODULE': {
59
- 'BUCKET': {
60
- adapter: ($, { pg }) => new postgres_bucket_adapter_1.PostgresBucketAdapter($, pg, 'nesoi_test_table')
61
- }
62
- }
63
- })
64
- .config.trx({
65
- 'MODULE': {
66
- wrap: postgres_provider_1.PostgresProvider.wrap('pg')
67
- }
68
- });
69
- // Run test daemon
70
- daemon = await app.daemon();
71
- // Prepare database using daemon
72
- // TODO: encapsulate this
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 provider_1.MigrationProvider.create(daemon, pg.sql);
76
- const migration = await migrator.generateForBucket('MODULE', 'BUCKET', 'nesoi_test_table');
77
- if (migration) {
78
- migration.name = 'postgres.bucket_adapter.test';
79
- await runner_1.MigrationRunner.fromSchema.up(daemon, pg.sql, migration);
80
- }
81
- // migration?.save();
82
- // await MigrationRunner.up(daemon, 'one', PostgresConfig);
83
- return daemon;
84
- }
85
- const mock = new mock_1.Mock();
86
- beforeAll(async () => {
87
- await setup();
88
- }, 30000);
89
- describe('Postgres Bucket Adapter', () => {
90
- // it ('!', () => {
91
- // expect(1+1).toEqual(2);
92
- // })
93
- describe('CRUD', () => {
94
- it('create should return unmodified object', async () => {
95
- const response = await daemon.trx('MODULE').run(async (trx) => {
96
- // given
97
- const BUCKET = trx.bucket('BUCKET');
98
- const input = mock.bucket('MODULE', 'BUCKET')
99
- .obj({ id: undefined }).raw(daemon);
100
- // when
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
113
- });
114
- });
115
- it('read should return unmodified object after create', async () => {
116
- const response = await daemon.trx('MODULE').run(async (trx) => {
117
- // given
118
- const BUCKET = trx.bucket('BUCKET');
119
- const input = mock.bucket('MODULE', 'BUCKET')
120
- .obj({ id: undefined }).raw(daemon);
121
- // when
122
- const created = await BUCKET.create(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
135
- });
136
- });
137
- it('update should modify object after insert', async () => {
138
- const response = await daemon.trx('MODULE').run(async (trx) => {
139
- // given
140
- const BUCKET = trx.bucket('BUCKET');
141
- const input1 = mock.bucket('MODULE', 'BUCKET')
142
- .obj({ id: undefined }).raw(daemon);
143
- const input2 = mock.bucket('MODULE', 'BUCKET')
144
- .obj({ id: undefined }).raw(daemon);
145
- // when
146
- const created = await BUCKET.create(input1);
147
- const updated = await BUCKET.patch({
148
- ...input2,
149
- id: created.id
150
- });
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
170
- });
171
- });
172
- it('delete should remove object from database', async () => {
173
- const response = await daemon.trx('MODULE').run(async (trx) => {
174
- // given
175
- const BUCKET = trx.bucket('BUCKET');
176
- const input = mock.bucket('MODULE', 'BUCKET')
177
- .obj({ id: undefined }).raw(daemon);
178
- // when
179
- const created = await BUCKET.create(input);
180
- const read = await BUCKET.readOneOrFail(created.id);
181
- await BUCKET.delete(read.id);
182
- const read2 = await BUCKET.readOne(read.id);
183
- return { read2 };
184
- });
185
- const { read2 } = response.output;
186
- // then
187
- expect(read2).toBeUndefined();
188
- });
189
- });
190
- describe('Query', () => {
191
- it('query first by existing id should return object', async () => {
192
- const response = await daemon.trx('MODULE').run(async (trx) => {
193
- // given
194
- const BUCKET = trx.bucket('BUCKET');
195
- const input = mock.bucket('MODULE', 'BUCKET')
196
- .obj({ id: undefined }).raw(daemon);
197
- // when
198
- const created = await BUCKET.create(input);
199
- const queried = await BUCKET.query({
200
- 'id': created.id
201
- }).all();
202
- return { queried, created };
203
- });
204
- const { queried, created } = response.output;
205
- // then
206
- expect(queried.length).toEqual(1);
207
- expect(queried[0].id).toEqual(created.id);
208
- });
209
- });
210
- });