@opra/sqb 1.21.0 → 1.22.0

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 (34) hide show
  1. package/package.json +10 -27
  2. package/{esm/sqb-collection-service.js → sqb-collection-service.js} +4 -0
  3. package/{esm/sqb-entity-service.js → sqb-entity-service.js} +29 -2
  4. package/{esm/sqb-service-base.js → sqb-service-base.js} +4 -0
  5. package/{esm/sqb-singleton-service.js → sqb-singleton-service.js} +5 -0
  6. package/cjs/adapter-utils/prepare-filter.js +0 -108
  7. package/cjs/augmentation/datatype-factory.augmentation.js +0 -90
  8. package/cjs/augmentation/mapped-type.augmentation.js +0 -14
  9. package/cjs/augmentation/mixin-type.augmentation.js +0 -11
  10. package/cjs/index.js +0 -11
  11. package/cjs/package.json +0 -3
  12. package/cjs/sqb-adapter.js +0 -130
  13. package/cjs/sqb-collection-service.js +0 -355
  14. package/cjs/sqb-entity-service.js +0 -642
  15. package/cjs/sqb-service-base.js +0 -88
  16. package/cjs/sqb-singleton-service.js +0 -172
  17. package/esm/package.json +0 -3
  18. package/types/index.d.cts +0 -8
  19. /package/{types/adapter-utils → adapter-utils}/prepare-filter.d.ts +0 -0
  20. /package/{esm/adapter-utils → adapter-utils}/prepare-filter.js +0 -0
  21. /package/{types/augmentation → augmentation}/datatype-factory.augmentation.d.ts +0 -0
  22. /package/{esm/augmentation → augmentation}/datatype-factory.augmentation.js +0 -0
  23. /package/{types/augmentation → augmentation}/mapped-type.augmentation.d.ts +0 -0
  24. /package/{esm/augmentation → augmentation}/mapped-type.augmentation.js +0 -0
  25. /package/{types/augmentation → augmentation}/mixin-type.augmentation.d.ts +0 -0
  26. /package/{esm/augmentation → augmentation}/mixin-type.augmentation.js +0 -0
  27. /package/{types/index.d.ts → index.d.ts} +0 -0
  28. /package/{esm/index.js → index.js} +0 -0
  29. /package/{types/sqb-adapter.d.ts → sqb-adapter.d.ts} +0 -0
  30. /package/{esm/sqb-adapter.js → sqb-adapter.js} +0 -0
  31. /package/{types/sqb-collection-service.d.ts → sqb-collection-service.d.ts} +0 -0
  32. /package/{types/sqb-entity-service.d.ts → sqb-entity-service.d.ts} +0 -0
  33. /package/{types/sqb-service-base.d.ts → sqb-service-base.d.ts} +0 -0
  34. /package/{types/sqb-singleton-service.d.ts → sqb-singleton-service.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opra/sqb",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "Opra SQB adapter package",
5
5
  "author": "Panates",
6
6
  "license": "MIT",
@@ -10,45 +10,28 @@
10
10
  "valgen": "^5.18.2"
11
11
  },
12
12
  "peerDependencies": {
13
- "@opra/core": "^1.21.0",
14
- "@opra/http": "^1.21.0",
13
+ "@opra/core": "^1.22.0",
14
+ "@opra/http": "^1.22.0",
15
15
  "@sqb/connect": "^4.20.4"
16
16
  },
17
17
  "type": "module",
18
+ "module": "./index.js",
19
+ "types": "./index.d.ts",
18
20
  "exports": {
19
21
  ".": {
20
- "import": {
21
- "types": "./types/index.d.ts",
22
- "default": "./esm/index.js"
23
- },
24
- "require": {
25
- "types": "./types/index.d.cts",
26
- "default": "./cjs/index.js"
27
- },
28
- "default": "./esm/index.js"
22
+ "types": "./index.d.ts",
23
+ "default": "./index.js"
29
24
  },
30
25
  "./package.json": "./package.json"
31
26
  },
32
- "main": "./cjs/index.js",
33
- "module": "./esm/index.js",
34
- "types": "./types/index.d.ts",
27
+ "engines": {
28
+ "node": ">=20.0"
29
+ },
35
30
  "repository": {
36
31
  "type": "git",
37
32
  "url": "git+https://github.com/panates/opra.git",
38
33
  "directory": "packages/sqb"
39
34
  },
40
- "engines": {
41
- "node": ">=16.0",
42
- "npm": ">=7.0.0"
43
- },
44
- "files": [
45
- "bin/",
46
- "cjs/",
47
- "esm/",
48
- "types/",
49
- "LICENSE",
50
- "README.md"
51
- ],
52
35
  "keywords": [
53
36
  "opra",
54
37
  "sqb",
@@ -6,6 +6,10 @@ import { SqbEntityService } from './sqb-entity-service.js';
6
6
  * @template T - The data type class type of the resource
7
7
  */
8
8
  export class SqbCollectionService extends SqbEntityService {
9
+ /**
10
+ * Represents default limit for findMany operation
11
+ */
12
+ defaultLimit;
9
13
  /**
10
14
  * Constructs a new instance
11
15
  *
@@ -9,6 +9,35 @@ import { SqbServiceBase } from './sqb-service-base.js';
9
9
  * @template T - The data type class type of the resource
10
10
  */
11
11
  export class SqbEntityService extends SqbServiceBase {
12
+ _dataTypeScope;
13
+ _dataType_;
14
+ _dataType;
15
+ _dataTypeClass;
16
+ _entityMetadata;
17
+ _inputCodecs = {};
18
+ _outputCodecs = {};
19
+ /**
20
+ * Defines comma delimited scopes for api document
21
+ */
22
+ scope;
23
+ /**
24
+ * Represents the name of a resource.
25
+ * @type {string}
26
+ */
27
+ resourceName;
28
+ /**
29
+ * Represents a common filter function for a service.
30
+ *
31
+ * @type {SqbEntityService.Filter | Function}
32
+ */
33
+ commonFilter;
34
+ /**
35
+ * Callback function for handling errors.
36
+ *
37
+ * @param {unknown} error - The error object.
38
+ * @param {SqbEntityService} _this - The context object.
39
+ */
40
+ onError;
12
41
  /**
13
42
  * Constructs a new instance
14
43
  *
@@ -18,8 +47,6 @@ export class SqbEntityService extends SqbServiceBase {
18
47
  */
19
48
  constructor(dataType, options) {
20
49
  super(options);
21
- this._inputCodecs = {};
22
- this._outputCodecs = {};
23
50
  this._dataType_ = dataType;
24
51
  this.resourceName = options?.resourceName;
25
52
  this.commonFilter = options?.commonFilter;
@@ -6,6 +6,10 @@ const transactionKey = Symbol.for('transaction');
6
6
  * @template T - The data type class type of the resource
7
7
  */
8
8
  export class SqbServiceBase extends ServiceBase {
9
+ /**
10
+ * Represents a SqbClient or SqbConnection object
11
+ */
12
+ db;
9
13
  /**
10
14
  * Constructs a new instance
11
15
  *
@@ -7,6 +7,11 @@ import { SqbEntityService } from './sqb-entity-service.js';
7
7
  * @template T - The data type class type of the resource
8
8
  */
9
9
  export class SqbSingletonService extends SqbEntityService {
10
+ /**
11
+ * Represents a unique identifier for singleton record
12
+ * @property {SQBAdapter.IdOrIds}
13
+ */
14
+ id;
10
15
  /**
11
16
  * Constructs a new instance
12
17
  *
@@ -1,108 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = prepareFilter;
4
- const tslib_1 = require("tslib");
5
- require("@opra/core");
6
- const common_1 = require("@opra/common");
7
- const sqb = tslib_1.__importStar(require("@sqb/builder"));
8
- const valgen_1 = require("valgen");
9
- /**
10
- * Prepare the SQB filter based on the provided filters and options.
11
- *
12
- * @param {SQBAdapter.FilterInput|SQBAdapter.FilterInput[]} filters - The filter(s) to be applied.
13
- *
14
- * @returns {Expression} - The prepared SQB Expression.
15
- */
16
- function prepareFilter(filters) {
17
- const filtersArray = Array.isArray(filters) ? filters : [filters];
18
- if (!filtersArray.length)
19
- return undefined;
20
- const arr = [];
21
- for (const filter of filtersArray) {
22
- if (!filter)
23
- continue;
24
- let ast;
25
- if (typeof filter === 'string')
26
- ast = prepareFilterAst(common_1.OpraFilter.parse(filter));
27
- else if (filter instanceof common_1.OpraFilter.Expression)
28
- ast = prepareFilterAst(filter);
29
- else
30
- ast = filter;
31
- if (ast)
32
- arr.push(ast);
33
- }
34
- return arr.length > 1 ? sqb.And(...arr) : arr[0];
35
- }
36
- const _isDate = valgen_1.vg.isDate({ trim: 'day' });
37
- const _isDateTime = valgen_1.vg.isDate();
38
- function prepareFilterAst(ast) {
39
- if (!ast)
40
- return;
41
- if (ast instanceof common_1.OpraFilter.DateLiteral) {
42
- return _isDate(ast.value, { coerce: true });
43
- }
44
- if (ast instanceof common_1.OpraFilter.DateTimeLiteral) {
45
- return _isDateTime(ast.value, { coerce: true });
46
- }
47
- if (ast instanceof common_1.OpraFilter.ArrayExpression) {
48
- return ast.items.map(prepareFilterAst);
49
- }
50
- if (ast instanceof common_1.OpraFilter.NegativeExpression) {
51
- return sqb.Not(prepareFilterAst(ast.expression));
52
- }
53
- if (ast instanceof common_1.OpraFilter.LogicalExpression) {
54
- if (ast.op === 'or')
55
- return sqb.Or(...ast.items.map(prepareFilterAst));
56
- return sqb.And(...ast.items.map(prepareFilterAst));
57
- }
58
- if (ast instanceof common_1.OpraFilter.ParenthesizedExpression) {
59
- return prepareFilterAst(ast.expression);
60
- }
61
- if (ast instanceof common_1.OpraFilter.ComparisonExpression) {
62
- const left = String(ast.left);
63
- const right = prepareFilterAst(ast.right);
64
- if (ast.prepare) {
65
- const x = ast.prepare({
66
- left,
67
- right,
68
- op: ast.op,
69
- adapter: 'sqb',
70
- });
71
- if (x)
72
- return x;
73
- }
74
- switch (ast.op) {
75
- case '=':
76
- return sqb.Eq(left, right);
77
- case '!=':
78
- return sqb.Ne(left, right);
79
- case '>':
80
- return sqb.Gt(left, right);
81
- case '>=':
82
- return sqb.Gte(left, right);
83
- case '<':
84
- return sqb.Lt(left, right);
85
- case '<=':
86
- return sqb.Lte(left, right);
87
- case 'in':
88
- return sqb.In(left, right);
89
- case '!in':
90
- return sqb.Nin(left, right);
91
- case 'like':
92
- return sqb.Like(left, String(right).replace(/\*/g, '%'));
93
- case 'ilike':
94
- return sqb.Ilike(left, String(right).replace(/\*/g, '%'));
95
- case '!like':
96
- return sqb.NotLike(left, String(right).replace(/\*/g, '%'));
97
- case '!ilike':
98
- return sqb.NotILike(left, String(right).replace(/\*/g, '%'));
99
- default:
100
- throw new Error(`ComparisonExpression operator (${ast.op}) not implemented yet`);
101
- }
102
- }
103
- if (ast instanceof common_1.OpraFilter.QualifiedIdentifier ||
104
- ast instanceof common_1.OpraFilter.Literal) {
105
- return ast.value;
106
- }
107
- throw new Error(`${ast.kind} is not implemented yet`);
108
- }
@@ -1,90 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const common_1 = require("@opra/common");
4
- const connect_1 = require("@sqb/connect");
5
- var DataTypeFactory = common_1.classes.DataTypeFactory;
6
- const _prepareComplexTypeArgs = DataTypeFactory
7
- ._prepareComplexTypeArgs;
8
- DataTypeFactory._prepareComplexTypeArgs = async function (context, owner, initArgs, metadata) {
9
- let sqbMeta;
10
- if (initArgs.ctor &&
11
- metadata.fields &&
12
- (sqbMeta = connect_1.EntityMetadata.get(initArgs.ctor))) {
13
- metadata = (0, common_1.cloneObject)(metadata);
14
- for (const [fieldName, fieldSchema] of Object.entries(metadata.fields)) {
15
- const sqbField = sqbMeta && connect_1.EntityMetadata.getField(sqbMeta, fieldName);
16
- if (!sqbField)
17
- continue;
18
- /** Copy type information from sqb metadata to opra */
19
- if (!fieldSchema.type || fieldSchema.type === Object) {
20
- if ((0, connect_1.isAssociationField)(sqbField)) {
21
- if (!fieldSchema.type) {
22
- const trg = await sqbField.association.resolveTarget();
23
- if (trg?.ctor)
24
- fieldSchema.type = trg.ctor;
25
- }
26
- }
27
- else if ((0, connect_1.isColumnField)(sqbField)) {
28
- fieldSchema.type = sqbField.enum || sqbField.type;
29
- }
30
- }
31
- if ((0, connect_1.isColumnField)(sqbField)) {
32
- const hasNoType = !fieldSchema.type || fieldSchema.type === Object;
33
- switch (sqbField.dataType) {
34
- case connect_1.DataType.INTEGER:
35
- case connect_1.DataType.SMALLINT:
36
- if (hasNoType || fieldSchema.type === Number)
37
- fieldSchema.type = 'integer';
38
- break;
39
- case connect_1.DataType.GUID:
40
- if (hasNoType || fieldSchema.type === String)
41
- fieldSchema.type = 'uuid';
42
- break;
43
- case connect_1.DataType.DATE:
44
- if (hasNoType ||
45
- fieldSchema.type === String ||
46
- fieldSchema.type === Date) {
47
- fieldSchema.type = 'date';
48
- }
49
- break;
50
- case connect_1.DataType.TIMESTAMP:
51
- if (hasNoType ||
52
- fieldSchema.type === String ||
53
- fieldSchema.type === Date) {
54
- fieldSchema.type = 'datetime';
55
- }
56
- break;
57
- case connect_1.DataType.TIMESTAMPTZ:
58
- if (hasNoType ||
59
- fieldSchema.type === String ||
60
- fieldSchema.type === Date) {
61
- fieldSchema.type = 'datetimetz';
62
- }
63
- break;
64
- case connect_1.DataType.TIME:
65
- if (hasNoType || fieldSchema.type === String)
66
- fieldSchema.type = 'time';
67
- break;
68
- default:
69
- break;
70
- }
71
- }
72
- if ((0, connect_1.isAssociationField)(sqbField)) {
73
- if (sqbField.association.returnsMany())
74
- fieldSchema.isArray = true;
75
- if (!Object.prototype.hasOwnProperty.call(fieldSchema, 'exclusive'))
76
- fieldSchema.exclusive = true;
77
- }
78
- if (!Object.prototype.hasOwnProperty.call(fieldSchema, 'exclusive') &&
79
- Object.prototype.hasOwnProperty.call(sqbField, 'exclusive')) {
80
- fieldSchema.exclusive = sqbField.exclusive;
81
- }
82
- }
83
- }
84
- return _prepareComplexTypeArgs.apply(DataTypeFactory, [
85
- context,
86
- owner,
87
- initArgs,
88
- metadata,
89
- ]);
90
- };
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const common_1 = require("@opra/common");
4
- const connect_1 = require("@sqb/connect");
5
- const _applyMixin = common_1.MappedType._applyMixin;
6
- common_1.MappedType._applyMixin = function (targetType, sourceType, options) {
7
- _applyMixin.call(null, targetType, sourceType, options);
8
- const srcMeta = connect_1.Entity.getMetadata(sourceType);
9
- if (srcMeta) {
10
- const trgMeta = connect_1.EntityMetadata.define(targetType);
11
- const { isInheritedPredicate } = options;
12
- connect_1.EntityMetadata.mixin(trgMeta, srcMeta, k => isInheritedPredicate(k));
13
- }
14
- };
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const common_1 = require("@opra/common");
4
- const connect_1 = require("@sqb/connect");
5
- const oldDecorator = common_1.MixinType[common_1.DECORATOR];
6
- common_1.MixinType[common_1.DECORATOR] = function (...args) {
7
- const filteredSources = args[0].filter(x => typeof x === 'function');
8
- const target = oldDecorator(...args);
9
- connect_1.Entity.mixin(target, ...filteredSources);
10
- return target;
11
- };
package/cjs/index.js DELETED
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- require("./augmentation/datatype-factory.augmentation.js");
5
- require("./augmentation/mapped-type.augmentation.js");
6
- require("./augmentation/mixin-type.augmentation.js");
7
- tslib_1.__exportStar(require("./sqb-adapter.js"), exports);
8
- tslib_1.__exportStar(require("./sqb-collection-service.js"), exports);
9
- tslib_1.__exportStar(require("./sqb-entity-service.js"), exports);
10
- tslib_1.__exportStar(require("./sqb-service-base.js"), exports);
11
- tslib_1.__exportStar(require("./sqb-singleton-service.js"), exports);
package/cjs/package.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "type": "commonjs"
3
- }
@@ -1,130 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SQBAdapter = void 0;
4
- const tslib_1 = require("tslib");
5
- const connect_1 = require("@sqb/connect");
6
- const prepare_filter_js_1 = tslib_1.__importDefault(require("./adapter-utils/prepare-filter.js"));
7
- var SQBAdapter;
8
- (function (SQBAdapter) {
9
- /**
10
- * @deprecated Use prepareFilter instead
11
- */
12
- SQBAdapter.parseFilter = prepare_filter_js_1.default;
13
- SQBAdapter.prepareFilter = prepare_filter_js_1.default;
14
- async function parseRequest(context) {
15
- if (context.transport !== 'http') {
16
- throw new TypeError('SQBAdapter can parse only HttpContext');
17
- }
18
- const ctx = context;
19
- const { __oprDef } = ctx;
20
- if (__oprDef?.composition?.startsWith('Entity.') &&
21
- __oprDef.compositionOptions?.type) {
22
- const dataType = ctx.__docNode.getComplexType(__oprDef.compositionOptions?.type);
23
- const entityMetadata = connect_1.EntityMetadata.get(dataType.ctor);
24
- if (!entityMetadata)
25
- throw new Error(`Type class "${dataType.ctor}" is not an SQB entity`);
26
- const controller = __oprDef.owner;
27
- switch (__oprDef.composition) {
28
- case 'Entity.Create': {
29
- const data = await ctx.getBody();
30
- const options = {
31
- projection: ctx.queryParams.projection,
32
- };
33
- return {
34
- method: 'create',
35
- data,
36
- options,
37
- };
38
- }
39
- case 'Entity.Delete': {
40
- const keyParam = __oprDef.parameters.find(p => p.keyParam) ||
41
- controller.parameters.find(p => p.keyParam);
42
- const key = keyParam && ctx.pathParams[String(keyParam.name)];
43
- const options = {
44
- filter: SQBAdapter.parseFilter(ctx.queryParams.filter),
45
- };
46
- return {
47
- method: 'delete',
48
- key,
49
- options,
50
- };
51
- }
52
- case 'Entity.DeleteMany': {
53
- const options = {
54
- filter: SQBAdapter.parseFilter(ctx.queryParams.filter),
55
- };
56
- return { method: 'deleteMany', options };
57
- }
58
- case 'Entity.FindMany': {
59
- const options = {
60
- count: ctx.queryParams.count,
61
- filter: SQBAdapter.parseFilter(ctx.queryParams.filter),
62
- projection: ctx.queryParams.projection ||
63
- __oprDef.compositionOptions.defaultProjection,
64
- limit: ctx.queryParams.limit || __oprDef.compositionOptions.defaultLimit,
65
- skip: ctx.queryParams.skip,
66
- sort: ctx.queryParams.sort || __oprDef.compositionOptions.defaultSort,
67
- };
68
- return { method: 'findMany', options };
69
- }
70
- case 'Entity.Get': {
71
- const keyParam = __oprDef.parameters.find(p => p.keyParam) ||
72
- controller.parameters.find(p => p.keyParam);
73
- const key = keyParam && ctx.pathParams[String(keyParam.name)];
74
- const options = {
75
- projection: ctx.queryParams.projection,
76
- filter: SQBAdapter.parseFilter(ctx.queryParams.filter),
77
- };
78
- return { method: 'get', key, options };
79
- }
80
- case 'Entity.Replace': {
81
- const data = await ctx.getBody();
82
- const keyParam = __oprDef.parameters.find(p => p.keyParam) ||
83
- controller.parameters.find(p => p.keyParam);
84
- const key = keyParam && ctx.pathParams[String(keyParam.name)];
85
- const options = {
86
- projection: ctx.queryParams.projection,
87
- filter: ctx.queryParams.filter,
88
- };
89
- return {
90
- method: 'replace',
91
- key,
92
- data,
93
- options,
94
- };
95
- }
96
- case 'Entity.Update': {
97
- const data = await ctx.getBody();
98
- const keyParam = __oprDef.parameters.find(p => p.keyParam) ||
99
- controller.parameters.find(p => p.keyParam);
100
- const key = keyParam && ctx.pathParams[String(keyParam.name)];
101
- const options = {
102
- projection: ctx.queryParams.projection,
103
- filter: SQBAdapter.parseFilter(ctx.queryParams.filter),
104
- };
105
- return {
106
- method: 'update',
107
- key,
108
- data,
109
- options,
110
- };
111
- }
112
- case 'Entity.UpdateMany': {
113
- const data = await ctx.getBody();
114
- const options = {
115
- filter: SQBAdapter.parseFilter(ctx.queryParams.filter),
116
- };
117
- return {
118
- method: 'updateMany',
119
- data,
120
- options,
121
- };
122
- }
123
- default:
124
- break;
125
- }
126
- }
127
- throw new Error(`This operation is not compatible to SQB Adapter`);
128
- }
129
- SQBAdapter.parseRequest = parseRequest;
130
- })(SQBAdapter || (exports.SQBAdapter = SQBAdapter = {}));