nesoi 3.0.9 → 3.0.10

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 (83) 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/machine/machine.builder.js +12 -1
  4. package/lib/elements/blocks/machine/machine.schema.d.ts +2 -1
  5. package/lib/elements/blocks/machine/machine.schema.js +2 -1
  6. package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +3 -1
  7. package/lib/elements/edge/controller/adapters/controller_adapter.js +2 -1
  8. package/lib/elements/edge/controller/controller.config.d.ts +3 -2
  9. package/lib/elements/edge/controller/controller.d.ts +3 -3
  10. package/lib/elements/edge/controller/controller.js +3 -3
  11. package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +2 -1
  12. package/lib/elements/entities/bucket/bucket.config.d.ts +3 -3
  13. package/lib/elements/entities/bucket/bucket.d.ts +3 -2
  14. package/lib/elements/entities/bucket/bucket.js +4 -4
  15. package/lib/engine/apps/app.config.d.ts +12 -11
  16. package/lib/engine/apps/app.d.ts +11 -22
  17. package/lib/engine/apps/app.js +9 -9
  18. package/lib/engine/apps/inline.app.d.ts +9 -8
  19. package/lib/engine/apps/inline.app.js +24 -24
  20. package/lib/engine/apps/monolyth/monolyth.app.d.ts +5 -5
  21. package/lib/engine/apps/monolyth/monolyth.app.js +6 -6
  22. package/lib/engine/apps/service.d.ts +30 -0
  23. package/lib/engine/apps/service.js +15 -0
  24. package/lib/engine/auth/authn.d.ts +10 -1
  25. package/lib/engine/auth/zero.authn_provider.d.ts +7 -3
  26. package/lib/engine/auth/zero.authn_provider.js +9 -2
  27. package/lib/engine/cli/cli.d.ts +2 -2
  28. package/lib/engine/cli/cli.js +1 -1
  29. package/lib/engine/cli/ui.js +1 -1
  30. package/lib/engine/daemon.d.ts +11 -11
  31. package/lib/engine/daemon.js +18 -18
  32. package/lib/engine/dependency.d.ts +2 -1
  33. package/lib/engine/dependency.js +18 -0
  34. package/lib/engine/module.d.ts +6 -4
  35. package/lib/engine/module.js +25 -10
  36. package/lib/engine/transaction/nodes/bucket.trx_node.js +1 -2
  37. package/lib/engine/transaction/nodes/bucket_query.trx_node.js +5 -10
  38. package/lib/engine/transaction/nodes/job.trx_node.js +2 -4
  39. package/lib/engine/transaction/nodes/machine.trx_node.js +2 -4
  40. package/lib/engine/transaction/nodes/queue.trx_node.js +1 -2
  41. package/lib/engine/transaction/nodes/resource.trx_node.js +2 -4
  42. package/lib/engine/transaction/trx.d.ts +6 -4
  43. package/lib/engine/transaction/trx.js +2 -1
  44. package/lib/engine/transaction/trx_engine.config.d.ts +2 -2
  45. package/lib/engine/transaction/trx_engine.d.ts +4 -3
  46. package/lib/engine/transaction/trx_engine.js +20 -17
  47. package/lib/engine/transaction/trx_node.d.ts +4 -2
  48. package/lib/engine/transaction/trx_node.js +13 -1
  49. package/lib/engine/tree.js +6 -17
  50. package/lib/schema.d.ts +1 -1
  51. package/package.json +2 -3
  52. package/tools/joaquin/job.js +2 -2
  53. package/tools/joaquin/message.js +2 -2
  54. package/tools/joaquin/mock.d.ts +6 -6
  55. package/tsconfig.build.tsbuildinfo +1 -1
  56. package/lib/adapters/postgres/src/migrator/csv.d.ts +0 -7
  57. package/lib/adapters/postgres/src/migrator/csv.js +0 -72
  58. package/lib/adapters/postgres/src/migrator/database.d.ts +0 -34
  59. package/lib/adapters/postgres/src/migrator/database.js +0 -88
  60. package/lib/adapters/postgres/src/migrator/generator/generator.d.ts +0 -22
  61. package/lib/adapters/postgres/src/migrator/generator/generator.js +0 -326
  62. package/lib/adapters/postgres/src/migrator/generator/migration.d.ts +0 -66
  63. package/lib/adapters/postgres/src/migrator/generator/migration.js +0 -249
  64. package/lib/adapters/postgres/src/migrator/generator/provider.d.ts +0 -19
  65. package/lib/adapters/postgres/src/migrator/generator/provider.js +0 -74
  66. package/lib/adapters/postgres/src/migrator/index.d.ts +0 -47
  67. package/lib/adapters/postgres/src/migrator/index.js +0 -22
  68. package/lib/adapters/postgres/src/migrator/runner/runner.d.ts +0 -17
  69. package/lib/adapters/postgres/src/migrator/runner/runner.js +0 -249
  70. package/lib/adapters/postgres/src/migrator/runner/status.d.ts +0 -17
  71. package/lib/adapters/postgres/src/migrator/runner/status.js +0 -55
  72. package/lib/adapters/postgres/src/postgres.bucket_adapter.d.ts +0 -42
  73. package/lib/adapters/postgres/src/postgres.bucket_adapter.js +0 -294
  74. package/lib/adapters/postgres/src/postgres.cli.d.ts +0 -76
  75. package/lib/adapters/postgres/src/postgres.cli.js +0 -207
  76. package/lib/adapters/postgres/src/postgres.config.d.ts +0 -5
  77. package/lib/adapters/postgres/src/postgres.config.js +0 -2
  78. package/lib/adapters/postgres/src/postgres.nql.d.ts +0 -16
  79. package/lib/adapters/postgres/src/postgres.nql.js +0 -123
  80. package/lib/adapters/postgres/src/postgres.provider.d.ts +0 -18
  81. package/lib/adapters/postgres/src/postgres.provider.js +0 -77
  82. package/lib/adapters/postgres/test/postgres.bucket_adapter.test.d.ts +0 -1
  83. package/lib/adapters/postgres/test/postgres.bucket_adapter.test.js +0 -210
@@ -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
- });