@balena/pinejs 21.6.8-build-renovate-major-14-commander-b5e9e5c6ae7855ecf7280d1aeec5fd2e61e4f2b1-1 → 21.6.8
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.
@@ -1,16 +1,19 @@
|
|
1
1
|
- commits:
|
2
|
-
- subject:
|
3
|
-
|
2
|
+
- subject: Handle computed fields in translated models where possible and throw
|
3
|
+
where not
|
4
|
+
hash: dfc34c70e4646fc95b64402a6db08aa7c2ff4daf
|
4
5
|
body: |
|
5
|
-
|
6
|
+
This avoids weird/unexpected/broken behaviors that can arise from using
|
7
|
+
computed fields in translated models whilst being minimally disruptive
|
8
|
+
for cases that can be handled
|
6
9
|
footer:
|
7
10
|
Change-type: patch
|
8
11
|
change-type: patch
|
9
|
-
author:
|
12
|
+
author: Pagan Gazzard
|
10
13
|
nested: []
|
11
14
|
version: 21.6.8
|
12
15
|
title: ""
|
13
|
-
date: 2025-06-
|
16
|
+
date: 2025-06-19T15:42:34.021Z
|
14
17
|
- commits:
|
15
18
|
- subject: Fix optimization for constrained abstract sql when having full access
|
16
19
|
hash: e31af5c072d7a2c5318465360c9941c1f786adcd
|
package/CHANGELOG.md
CHANGED
@@ -5,9 +5,9 @@ automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
7
|
# v21.6.8
|
8
|
-
## (2025-06-
|
8
|
+
## (2025-06-19)
|
9
9
|
|
10
|
-
*
|
10
|
+
* Handle computed fields in translated models where possible and throw where not [Pagan Gazzard]
|
11
11
|
|
12
12
|
# v21.6.7
|
13
13
|
## (2025-06-17)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import _ from 'lodash';
|
2
2
|
const aliasFields = (translationAbstractSqlModel, fromResourceName, toResource, aliases) => {
|
3
|
-
const
|
3
|
+
const fromFields = translationAbstractSqlModel.tables[fromResourceName].fields;
|
4
|
+
const fromFieldNames = fromFields.map(({ fieldName }) => fieldName);
|
4
5
|
const nonexistentFields = _.difference(Object.keys(aliases), fromFieldNames);
|
5
6
|
if (nonexistentFields.length > 0) {
|
6
7
|
throw new Error(`Tried to alias non-existent fields: '${nonexistentFields.join(', ')}'`);
|
@@ -11,9 +12,12 @@ const aliasFields = (translationAbstractSqlModel, fromResourceName, toResource,
|
|
11
12
|
throw new Error(`Tried to alias '${fromFieldName}' to the non-existent target field: '${toFieldName}'`);
|
12
13
|
}
|
13
14
|
};
|
14
|
-
return
|
15
|
+
return fromFields.map(({ fieldName, computed }) => {
|
15
16
|
const alias = aliases[fieldName];
|
16
17
|
if (alias) {
|
18
|
+
if (computed != null) {
|
19
|
+
throw new Error(`Cannot use a translation definition with a computed field for '${fromResourceName}'/'${fieldName}'. Please choose one or the other.`);
|
20
|
+
}
|
17
21
|
if (typeof alias === 'string') {
|
18
22
|
checkToFieldExists(fieldName, alias);
|
19
23
|
return ['Alias', ['Field', alias], fieldName];
|
@@ -21,6 +25,9 @@ const aliasFields = (translationAbstractSqlModel, fromResourceName, toResource,
|
|
21
25
|
return ['Alias', alias, fieldName];
|
22
26
|
}
|
23
27
|
checkToFieldExists(fieldName, fieldName);
|
28
|
+
if (computed != null) {
|
29
|
+
return ['Alias', computed, fieldName];
|
30
|
+
}
|
24
31
|
return ['Field', fieldName];
|
25
32
|
});
|
26
33
|
};
|
@@ -111,8 +118,12 @@ export const translateAbstractSqlModel = (fromAbstractSqlModel, toAbstractSqlMod
|
|
111
118
|
if (key.includes('$')) {
|
112
119
|
continue;
|
113
120
|
}
|
114
|
-
|
121
|
+
let translationDefinition = translationDefinitions[key];
|
115
122
|
const table = fromAbstractSqlModel.tables[key];
|
123
|
+
const hasComputedFields = table.fields.some((field) => field.computed != null);
|
124
|
+
if (hasComputedFields) {
|
125
|
+
translationDefinition ??= {};
|
126
|
+
}
|
116
127
|
if (translationDefinition) {
|
117
128
|
const { $toResource, ...definition } = translationDefinition;
|
118
129
|
const hasToResource = typeof $toResource === 'string';
|
@@ -136,11 +147,28 @@ export const translateAbstractSqlModel = (fromAbstractSqlModel, toAbstractSqlMod
|
|
136
147
|
table.modifyFields = _.cloneDeep(toTable.modifyFields ?? toTable.fields);
|
137
148
|
table.modifyName = toTable.modifyName ?? toTable.name;
|
138
149
|
if (isDefinition(definition)) {
|
150
|
+
if (hasComputedFields) {
|
151
|
+
throw new Error(`Cannot use a manual definition with computed fields for '${key}'. Please include the computed fields in the definition if they are needed.`);
|
152
|
+
}
|
139
153
|
table.definition = definition;
|
140
154
|
}
|
141
155
|
else if (Object.keys(definition).length === 0) {
|
156
|
+
let abstractSql = [
|
157
|
+
'Resource',
|
158
|
+
aliasedToResource,
|
159
|
+
];
|
160
|
+
if (hasComputedFields) {
|
161
|
+
abstractSql = [
|
162
|
+
'SelectQuery',
|
163
|
+
[
|
164
|
+
'Select',
|
165
|
+
aliasFields(fromAbstractSqlModel, key, aliasedToResource, {}),
|
166
|
+
],
|
167
|
+
['From', ['Alias', abstractSql, aliasedToResource]],
|
168
|
+
];
|
169
|
+
}
|
142
170
|
table.definition = {
|
143
|
-
abstractSql
|
171
|
+
abstractSql,
|
144
172
|
};
|
145
173
|
}
|
146
174
|
else {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"translations.js","sourceRoot":"","sources":["../../src/sbvr-api/translations.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;
|
1
|
+
{"version":3,"file":"translations.js","sourceRoot":"","sources":["../../src/sbvr-api/translations.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@balena/pinejs",
|
3
|
-
"version": "21.6.8
|
3
|
+
"version": "21.6.8",
|
4
4
|
"main": "out/server-glue/module.js",
|
5
5
|
"type": "module",
|
6
6
|
"repository": "git@github.com:balena-io/pinejs.git",
|
@@ -55,7 +55,7 @@
|
|
55
55
|
"@types/websql": "^0.0.30",
|
56
56
|
"ajv": "^8.17.1",
|
57
57
|
"busboy": "^1.6.0",
|
58
|
-
"commander": "^
|
58
|
+
"commander": "^13.1.0",
|
59
59
|
"cron-parser": "^5.3.0",
|
60
60
|
"deep-freeze": "^0.0.1",
|
61
61
|
"eventemitter3": "^5.0.1",
|
@@ -96,7 +96,7 @@
|
|
96
96
|
"husky": "^9.1.7",
|
97
97
|
"lint-staged": "^16.1.0",
|
98
98
|
"load-grunt-tasks": "^5.1.0",
|
99
|
-
"mocha": "
|
99
|
+
"mocha": "11.6.0",
|
100
100
|
"on-finished": "^2.4.1",
|
101
101
|
"pinejs-client-supertest": "^3.0.1",
|
102
102
|
"raw-loader": "^4.0.2",
|
@@ -149,6 +149,6 @@
|
|
149
149
|
"recursive": true
|
150
150
|
},
|
151
151
|
"versionist": {
|
152
|
-
"publishedAt": "2025-06-
|
152
|
+
"publishedAt": "2025-06-19T15:42:35.048Z"
|
153
153
|
}
|
154
154
|
}
|
@@ -13,6 +13,7 @@ import type {
|
|
13
13
|
UnknownTypeNodes,
|
14
14
|
NullNode,
|
15
15
|
FieldNode,
|
16
|
+
ResourceNode,
|
16
17
|
} from '@balena/abstract-sql-compiler';
|
17
18
|
import type { Dictionary } from './common-types.js';
|
18
19
|
|
@@ -28,9 +29,9 @@ const aliasFields = (
|
|
28
29
|
toResource: string,
|
29
30
|
aliases: Dictionary<string | AliasValidNodeType>,
|
30
31
|
): SelectNode[1] => {
|
31
|
-
const
|
32
|
-
fromResourceName
|
33
|
-
|
32
|
+
const fromFields =
|
33
|
+
translationAbstractSqlModel.tables[fromResourceName].fields;
|
34
|
+
const fromFieldNames = fromFields.map(({ fieldName }) => fieldName);
|
34
35
|
const nonexistentFields = _.difference(Object.keys(aliases), fromFieldNames);
|
35
36
|
if (nonexistentFields.length > 0) {
|
36
37
|
throw new Error(
|
@@ -47,10 +48,15 @@ const aliasFields = (
|
|
47
48
|
);
|
48
49
|
}
|
49
50
|
};
|
50
|
-
return
|
51
|
-
(fieldName): AliasNode<AliasValidNodeType> | FieldNode => {
|
51
|
+
return fromFields.map(
|
52
|
+
({ fieldName, computed }): AliasNode<AliasValidNodeType> | FieldNode => {
|
52
53
|
const alias = aliases[fieldName];
|
53
54
|
if (alias) {
|
55
|
+
if (computed != null) {
|
56
|
+
throw new Error(
|
57
|
+
`Cannot use a translation definition with a computed field for '${fromResourceName}'/'${fieldName}'. Please choose one or the other.`,
|
58
|
+
);
|
59
|
+
}
|
54
60
|
if (typeof alias === 'string') {
|
55
61
|
checkToFieldExists(fieldName, alias);
|
56
62
|
return ['Alias', ['Field', alias], fieldName];
|
@@ -58,6 +64,10 @@ const aliasFields = (
|
|
58
64
|
return ['Alias', alias, fieldName];
|
59
65
|
}
|
60
66
|
checkToFieldExists(fieldName, fieldName);
|
67
|
+
if (computed != null) {
|
68
|
+
// TODO: The computed field typing should be better so we don't need to cast
|
69
|
+
return ['Alias', computed as AliasValidNodeType, fieldName];
|
70
|
+
}
|
61
71
|
return ['Field', fieldName];
|
62
72
|
},
|
63
73
|
);
|
@@ -209,8 +219,15 @@ export const translateAbstractSqlModel = (
|
|
209
219
|
// Skip translated resources, eg `resource$v2`
|
210
220
|
continue;
|
211
221
|
}
|
212
|
-
|
222
|
+
let translationDefinition = translationDefinitions[key];
|
213
223
|
const table = fromAbstractSqlModel.tables[key];
|
224
|
+
const hasComputedFields = table.fields.some(
|
225
|
+
(field) => field.computed != null,
|
226
|
+
);
|
227
|
+
if (hasComputedFields) {
|
228
|
+
// If there are computed fields then make sure we generate a definition even if there is no explicit translation definition
|
229
|
+
translationDefinition ??= {};
|
230
|
+
}
|
214
231
|
if (translationDefinition) {
|
215
232
|
const { $toResource, ...definition } = translationDefinition;
|
216
233
|
const hasToResource = typeof $toResource === 'string';
|
@@ -237,11 +254,30 @@ export const translateAbstractSqlModel = (
|
|
237
254
|
table.modifyFields = _.cloneDeep(toTable.modifyFields ?? toTable.fields);
|
238
255
|
table.modifyName = toTable.modifyName ?? toTable.name;
|
239
256
|
if (isDefinition(definition)) {
|
257
|
+
if (hasComputedFields) {
|
258
|
+
throw new Error(
|
259
|
+
`Cannot use a manual definition with computed fields for '${key}'. Please include the computed fields in the definition if they are needed.`,
|
260
|
+
);
|
261
|
+
}
|
240
262
|
table.definition = definition;
|
241
263
|
} else if (Object.keys(definition).length === 0) {
|
242
|
-
// If there are no translation definitions, we can just target the `$toResource
|
264
|
+
// If there are no translation definitions, we can just target the `$toResource`, including computed fields if necessary
|
265
|
+
let abstractSql: ResourceNode | SelectQueryNode = [
|
266
|
+
'Resource',
|
267
|
+
aliasedToResource,
|
268
|
+
];
|
269
|
+
if (hasComputedFields) {
|
270
|
+
abstractSql = [
|
271
|
+
'SelectQuery',
|
272
|
+
[
|
273
|
+
'Select',
|
274
|
+
aliasFields(fromAbstractSqlModel, key, aliasedToResource, {}),
|
275
|
+
],
|
276
|
+
['From', ['Alias', abstractSql, aliasedToResource]],
|
277
|
+
];
|
278
|
+
}
|
243
279
|
table.definition = {
|
244
|
-
abstractSql
|
280
|
+
abstractSql,
|
245
281
|
};
|
246
282
|
} else {
|
247
283
|
table.definition = aliasResource(
|