@balena/pinejs 21.6.7 → 21.6.8-build-fix-translated-computed-fields-8d924f01ea995eb4a6b3e8021dbc3cd1d12b759d-1
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.
- package/.pinejs-cache.json +1 -1
- package/.versionbot/CHANGELOG.yml +33 -1
- package/CHANGELOG.md +5 -0
- package/VERSION +1 -1
- package/out/sbvr-api/translations.js +32 -4
- package/out/sbvr-api/translations.js.map +1 -1
- package/package.json +3 -3
- package/src/sbvr-api/translations.ts +44 -8
@@ -1,3 +1,19 @@
|
|
1
|
+
- commits:
|
2
|
+
- subject: Handle computed fields in translated models where possible and throw
|
3
|
+
where not
|
4
|
+
hash: dfc34c70e4646fc95b64402a6db08aa7c2ff4daf
|
5
|
+
body: |
|
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
|
9
|
+
footer:
|
10
|
+
Change-type: patch
|
11
|
+
change-type: patch
|
12
|
+
author: Pagan Gazzard
|
13
|
+
nested: []
|
14
|
+
version: 21.6.8
|
15
|
+
title: ""
|
16
|
+
date: 2025-06-19T15:42:34.021Z
|
1
17
|
- commits:
|
2
18
|
- subject: Fix optimization for constrained abstract sql when having full access
|
3
19
|
hash: e31af5c072d7a2c5318465360c9941c1f786adcd
|
@@ -29,7 +45,7 @@
|
|
29
45
|
date: 2025-06-17T15:49:14.203Z
|
30
46
|
version: 21.6.7
|
31
47
|
title: ""
|
32
|
-
date: 2025-06-
|
48
|
+
date: 2025-06-17T16:12:22.302Z
|
33
49
|
- commits:
|
34
50
|
- subject: Update dependencies
|
35
51
|
hash: a45fe4a9d75c60e930f3dffb6862cf1511606d20
|
@@ -3131,6 +3147,7 @@
|
|
3131
3147
|
|
3132
3148
|
|
3133
3149
|
|
3150
|
+
|
3134
3151
|
|
3135
3152
|
|
3136
3153
|
As balena-lint
|
@@ -3183,6 +3200,7 @@
|
|
3183
3200
|
|
3184
3201
|
|
3185
3202
|
|
3203
|
+
|
3186
3204
|
|
3187
3205
|
|
3188
3206
|
As engine and npm is
|
@@ -3250,6 +3268,7 @@
|
|
3250
3268
|
|
3251
3269
|
|
3252
3270
|
|
3271
|
+
|
3253
3272
|
|
3254
3273
|
|
3255
3274
|
Ensure that the
|
@@ -3380,6 +3399,7 @@
|
|
3380
3399
|
|
3381
3400
|
|
3382
3401
|
|
3402
|
+
|
3383
3403
|
|
3384
3404
|
|
3385
3405
|
This also deprecates
|
@@ -3438,6 +3458,7 @@
|
|
3438
3458
|
|
3439
3459
|
|
3440
3460
|
|
3461
|
+
|
3441
3462
|
|
3442
3463
|
|
3443
3464
|
It can in fact be a
|
@@ -3497,6 +3518,7 @@
|
|
3497
3518
|
|
3498
3519
|
|
3499
3520
|
|
3521
|
+
|
3500
3522
|
|
3501
3523
|
|
3502
3524
|
We know what type
|
@@ -3561,6 +3583,7 @@
|
|
3561
3583
|
|
3562
3584
|
|
3563
3585
|
|
3586
|
+
|
3564
3587
|
|
3565
3588
|
|
3566
3589
|
Update
|
@@ -3736,6 +3759,7 @@
|
|
3736
3759
|
|
3737
3760
|
|
3738
3761
|
|
3762
|
+
|
3739
3763
|
|
3740
3764
|
|
3741
3765
|
This also deprecates
|
@@ -6884,6 +6908,7 @@
|
|
6884
6908
|
|
6885
6909
|
|
6886
6910
|
|
6911
|
+
|
6887
6912
|
|
6888
6913
|
|
6889
6914
|
As balena-lint
|
@@ -6964,6 +6989,7 @@
|
|
6964
6989
|
|
6965
6990
|
|
6966
6991
|
|
6992
|
+
|
6967
6993
|
|
6968
6994
|
|
6969
6995
|
As engine and npm is
|
@@ -7059,6 +7085,7 @@
|
|
7059
7085
|
|
7060
7086
|
|
7061
7087
|
|
7088
|
+
|
7062
7089
|
|
7063
7090
|
|
7064
7091
|
Ensure that the
|
@@ -7217,6 +7244,7 @@
|
|
7217
7244
|
|
7218
7245
|
|
7219
7246
|
|
7247
|
+
|
7220
7248
|
|
7221
7249
|
|
7222
7250
|
This also deprecates
|
@@ -7303,6 +7331,7 @@
|
|
7303
7331
|
|
7304
7332
|
|
7305
7333
|
|
7334
|
+
|
7306
7335
|
|
7307
7336
|
|
7308
7337
|
It can in fact be a
|
@@ -7390,6 +7419,7 @@
|
|
7390
7419
|
|
7391
7420
|
|
7392
7421
|
|
7422
|
+
|
7393
7423
|
|
7394
7424
|
|
7395
7425
|
We know what type
|
@@ -7482,6 +7512,7 @@
|
|
7482
7512
|
|
7483
7513
|
|
7484
7514
|
|
7515
|
+
|
7485
7516
|
|
7486
7517
|
|
7487
7518
|
Update
|
@@ -7685,6 +7716,7 @@
|
|
7685
7716
|
|
7686
7717
|
|
7687
7718
|
|
7719
|
+
|
7688
7720
|
|
7689
7721
|
|
7690
7722
|
This also deprecates
|
package/CHANGELOG.md
CHANGED
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
+
# v21.6.8
|
8
|
+
## (2025-06-19)
|
9
|
+
|
10
|
+
* Handle computed fields in translated models where possible and throw where not [Pagan Gazzard]
|
11
|
+
|
7
12
|
# v21.6.7
|
8
13
|
## (2025-06-17)
|
9
14
|
|
package/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
21.6.
|
1
|
+
21.6.8
|
@@ -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.
|
3
|
+
"version": "21.6.8-build-fix-translated-computed-fields-8d924f01ea995eb4a6b3e8021dbc3cd1d12b759d-1",
|
4
4
|
"main": "out/server-glue/module.js",
|
5
5
|
"type": "module",
|
6
6
|
"repository": "git@github.com:balena-io/pinejs.git",
|
@@ -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(
|