@hello.nrfcloud.com/proto-map 4.0.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.
- package/LICENSE +29 -0
- package/README.md +122 -0
- package/dist/generator/addDocBlock.js +5 -0
- package/dist/generator/generateLwM2MDefinitions.js +82 -0
- package/dist/generator/generateLwM2MDefinitions.spec.js +91 -0
- package/dist/generator/generateLwm2mTimestampResources.js +69 -0
- package/dist/generator/generateModels.js +142 -0
- package/dist/generator/generateType.js +90 -0
- package/dist/generator/generateValidator.js +132 -0
- package/dist/generator/generateValidators.js +63 -0
- package/dist/generator/isDir.js +163 -0
- package/dist/generator/isDir.spec.js +212 -0
- package/dist/generator/lwm2m.js +106 -0
- package/dist/generator/models.js +306 -0
- package/dist/generator/printNode.js +8 -0
- package/dist/generator/tokenizeName.js +5 -0
- package/dist/generator/tokenizeName.spec.js +98 -0
- package/dist/generator/types.js +140 -0
- package/dist/lwm2m/LWM2MObjectDefinition.js +88 -0
- package/dist/lwm2m/LWM2MObjectInfo.js +9 -0
- package/dist/lwm2m/LwM2MObject.d.js +1 -0
- package/dist/lwm2m/LwM2MObjectID.js +57 -0
- package/dist/lwm2m/ParsedLwM2MObjectDefinition.js +1 -0
- package/dist/lwm2m/check-lwm2m-rules.js +480 -0
- package/dist/lwm2m/definitions.js +596 -0
- package/dist/lwm2m/fromXML2JSON.js +194 -0
- package/dist/lwm2m/instanceTs.js +9 -0
- package/dist/lwm2m/instanceTs.spec.js +16 -0
- package/dist/lwm2m/isRegisteredLwM2MObject.js +3 -0
- package/dist/lwm2m/isRegisteredLwM2MObject.spec.js +45 -0
- package/dist/lwm2m/object/14201.d.js +5 -0
- package/dist/lwm2m/object/14202.d.js +5 -0
- package/dist/lwm2m/object/14203.d.js +5 -0
- package/dist/lwm2m/object/14204.d.js +5 -0
- package/dist/lwm2m/object/14205.d.js +5 -0
- package/dist/lwm2m/object/14210.d.js +5 -0
- package/dist/lwm2m/object/14220.d.js +5 -0
- package/dist/lwm2m/object/14230.d.js +5 -0
- package/dist/lwm2m/object/validate14201.js +18 -0
- package/dist/lwm2m/object/validate14202.js +17 -0
- package/dist/lwm2m/object/validate14203.js +19 -0
- package/dist/lwm2m/object/validate14204.js +17 -0
- package/dist/lwm2m/object/validate14205.js +15 -0
- package/dist/lwm2m/object/validate14210.js +13 -0
- package/dist/lwm2m/object/validate14220.js +12 -0
- package/dist/lwm2m/object/validate14230.js +13 -0
- package/dist/lwm2m/objects.js +8 -0
- package/dist/lwm2m/parseRangeEnumeration.js +20 -0
- package/dist/lwm2m/parseRangeEnumeration.spec.js +27 -0
- package/dist/lwm2m/resourceType.js +12 -0
- package/dist/lwm2m/timestampResources.js +12 -0
- package/dist/lwm2m/unwrapNestedArray.js +114 -0
- package/dist/lwm2m/unwrapNestedArray.spec.js +374 -0
- package/dist/lwm2m/validate.js +14 -0
- package/dist/lwm2m/validation.js +146 -0
- package/dist/lwm2m/validators.js +20 -0
- package/dist/markdown/getCodeBlock.js +74 -0
- package/dist/markdown/getFrontMatter.js +15 -0
- package/dist/markdown/parseREADME.js +19 -0
- package/dist/models/asset_tracker_v2+AWS/examples/examples.spec.js +489 -0
- package/dist/models/check-model-rules.js +137 -0
- package/dist/models/models.js +137 -0
- package/dist/models/types.js +13 -0
- package/dist/senml/SenMLSchema.js +79 -0
- package/dist/senml/SenMLSchema.spec.js +23 -0
- package/dist/senml/hasValue.js +8 -0
- package/dist/senml/hasValue.spec.js +103 -0
- package/dist/senml/lwm2mToSenML.js +137 -0
- package/dist/senml/lwm2mToSenML.spec.js +104 -0
- package/dist/senml/parseResourceId.js +58 -0
- package/dist/senml/parseResourceId.spec.js +13 -0
- package/dist/senml/senMLtoLwM2M.js +126 -0
- package/dist/senml/senMLtoLwM2M.spec.js +226 -0
- package/dist/senml/validateSenML.js +6 -0
- package/dist/senml/validateSenML.spec.js +31 -0
- package/export.js +13 -0
- package/index.d.ts +14 -0
- package/lwm2m/14201.xml +94 -0
- package/lwm2m/14202.xml +84 -0
- package/lwm2m/14203.xml +104 -0
- package/lwm2m/14204.xml +84 -0
- package/lwm2m/14205.xml +64 -0
- package/lwm2m/14210.xml +44 -0
- package/lwm2m/14220.xml +34 -0
- package/lwm2m/14230.xml +44 -0
- package/lwm2m/LWM2M-v1_1.xsd +168 -0
- package/lwm2m/LWM2MObjectDefinition.ts +84 -0
- package/lwm2m/LWM2MObjectInfo.ts +42 -0
- package/lwm2m/LwM2MObject.d.ts +19 -0
- package/lwm2m/LwM2MObjectID.ts +73 -0
- package/lwm2m/ParsedLwM2MObjectDefinition.ts +28 -0
- package/lwm2m/check-lwm2m-rules.ts +160 -0
- package/lwm2m/definitions.ts +278 -0
- package/lwm2m/format.sh +3 -0
- package/lwm2m/fromXML2JSON.ts +44 -0
- package/lwm2m/instanceTs.spec.ts +19 -0
- package/lwm2m/instanceTs.ts +10 -0
- package/lwm2m/isRegisteredLwM2MObject.spec.ts +48 -0
- package/lwm2m/isRegisteredLwM2MObject.ts +4 -0
- package/lwm2m/object/14201.d.ts +73 -0
- package/lwm2m/object/14202.d.ts +59 -0
- package/lwm2m/object/14203.d.ts +67 -0
- package/lwm2m/object/14204.d.ts +55 -0
- package/lwm2m/object/14205.d.ts +43 -0
- package/lwm2m/object/14210.d.ts +31 -0
- package/lwm2m/object/14220.d.ts +25 -0
- package/lwm2m/object/14230.d.ts +31 -0
- package/lwm2m/object/validate14201.ts +10 -0
- package/lwm2m/object/validate14202.ts +10 -0
- package/lwm2m/object/validate14203.ts +10 -0
- package/lwm2m/object/validate14204.ts +10 -0
- package/lwm2m/object/validate14205.ts +10 -0
- package/lwm2m/object/validate14210.ts +10 -0
- package/lwm2m/object/validate14220.ts +10 -0
- package/lwm2m/object/validate14230.ts +10 -0
- package/lwm2m/objects.ts +16 -0
- package/lwm2m/parseRangeEnumeration.spec.ts +34 -0
- package/lwm2m/parseRangeEnumeration.ts +29 -0
- package/lwm2m/resourceType.ts +11 -0
- package/lwm2m/timestampResources.ts +4 -0
- package/lwm2m/unwrapNestedArray.spec.ts +241 -0
- package/lwm2m/unwrapNestedArray.ts +27 -0
- package/lwm2m/validate.ts +30 -0
- package/lwm2m/validation.ts +120 -0
- package/lwm2m/validators.ts +21 -0
- package/models/PCA20035+solar/README.md +10 -0
- package/models/PCA20035+solar/transforms/airQuality.md +48 -0
- package/models/PCA20035+solar/transforms/battery.md +46 -0
- package/models/PCA20035+solar/transforms/button.md +45 -0
- package/models/PCA20035+solar/transforms/deviceInfo.md +72 -0
- package/models/PCA20035+solar/transforms/gain.md +45 -0
- package/models/PCA20035+solar/transforms/geolocationFromGroundfix.md +67 -0
- package/models/PCA20035+solar/transforms/geolocationFromMessage.md +80 -0
- package/models/PCA20035+solar/transforms/humidity.md +43 -0
- package/models/PCA20035+solar/transforms/networkInfo.md +84 -0
- package/models/PCA20035+solar/transforms/pressure.md +43 -0
- package/models/PCA20035+solar/transforms/temperature.md +43 -0
- package/models/README.md +10 -0
- package/models/asset_tracker_v2+AWS/README.md +6 -0
- package/models/asset_tracker_v2+AWS/examples/examples.spec.ts +229 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-1.json +24 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-2.json +30 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-3.json +37 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-4.json +48 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-5.json +43 -0
- package/models/asset_tracker_v2+AWS/transforms/GNSS.md +66 -0
- package/models/asset_tracker_v2+AWS/transforms/battery-voltage.md +50 -0
- package/models/asset_tracker_v2+AWS/transforms/device-info.md +61 -0
- package/models/asset_tracker_v2+AWS/transforms/env.md +69 -0
- package/models/asset_tracker_v2+AWS/transforms/fuel-gauge.md +62 -0
- package/models/asset_tracker_v2+AWS/transforms/roam.md +100 -0
- package/models/asset_tracker_v2+AWS/transforms/solar.md +58 -0
- package/models/check-model-rules.ts +125 -0
- package/models/kartverket-vasstandsdata/README.md +13 -0
- package/models/models.ts +36 -0
- package/models/types.ts +17 -0
- package/package.json +111 -0
- package/senml/SenMLSchema.spec.ts +21 -0
- package/senml/SenMLSchema.ts +74 -0
- package/senml/hasValue.spec.ts +19 -0
- package/senml/hasValue.ts +12 -0
- package/senml/lwm2mToSenML.spec.ts +74 -0
- package/senml/lwm2mToSenML.ts +62 -0
- package/senml/parseResourceId.spec.ts +13 -0
- package/senml/parseResourceId.ts +23 -0
- package/senml/senMLtoLwM2M.spec.ts +181 -0
- package/senml/senMLtoLwM2M.ts +121 -0
- package/senml/validateSenML.spec.ts +16 -0
- package/senml/validateSenML.ts +8 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_with_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return arr;
|
|
8
|
+
}
|
|
9
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
10
|
+
try {
|
|
11
|
+
var info = gen[key](arg);
|
|
12
|
+
var value = info.value;
|
|
13
|
+
} catch (error) {
|
|
14
|
+
reject(error);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (info.done) {
|
|
18
|
+
resolve(value);
|
|
19
|
+
} else {
|
|
20
|
+
Promise.resolve(value).then(_next, _throw);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function _async_to_generator(fn) {
|
|
24
|
+
return function() {
|
|
25
|
+
var self = this, args = arguments;
|
|
26
|
+
return new Promise(function(resolve, reject) {
|
|
27
|
+
var gen = fn.apply(self, args);
|
|
28
|
+
function _next(value) {
|
|
29
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
30
|
+
}
|
|
31
|
+
function _throw(err) {
|
|
32
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
33
|
+
}
|
|
34
|
+
_next(undefined);
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function _iterable_to_array_limit(arr, i) {
|
|
39
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
40
|
+
if (_i == null) return;
|
|
41
|
+
var _arr = [];
|
|
42
|
+
var _n = true;
|
|
43
|
+
var _d = false;
|
|
44
|
+
var _s, _e;
|
|
45
|
+
try {
|
|
46
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
47
|
+
_arr.push(_s.value);
|
|
48
|
+
if (i && _arr.length === i) break;
|
|
49
|
+
}
|
|
50
|
+
} catch (err) {
|
|
51
|
+
_d = true;
|
|
52
|
+
_e = err;
|
|
53
|
+
} finally{
|
|
54
|
+
try {
|
|
55
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
56
|
+
} finally{
|
|
57
|
+
if (_d) throw _e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return _arr;
|
|
61
|
+
}
|
|
62
|
+
function _non_iterable_rest() {
|
|
63
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
64
|
+
}
|
|
65
|
+
function _sliced_to_array(arr, i) {
|
|
66
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
67
|
+
}
|
|
68
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
69
|
+
if (!o) return;
|
|
70
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
71
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
72
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
73
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
74
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
75
|
+
}
|
|
76
|
+
function _ts_generator(thisArg, body) {
|
|
77
|
+
var f, y, t, g, _ = {
|
|
78
|
+
label: 0,
|
|
79
|
+
sent: function() {
|
|
80
|
+
if (t[0] & 1) throw t[1];
|
|
81
|
+
return t[1];
|
|
82
|
+
},
|
|
83
|
+
trys: [],
|
|
84
|
+
ops: []
|
|
85
|
+
};
|
|
86
|
+
return g = {
|
|
87
|
+
next: verb(0),
|
|
88
|
+
"throw": verb(1),
|
|
89
|
+
"return": verb(2)
|
|
90
|
+
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
91
|
+
return this;
|
|
92
|
+
}), g;
|
|
93
|
+
function verb(n) {
|
|
94
|
+
return function(v) {
|
|
95
|
+
return step([
|
|
96
|
+
n,
|
|
97
|
+
v
|
|
98
|
+
]);
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function step(op) {
|
|
102
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
103
|
+
while(_)try {
|
|
104
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
105
|
+
if (y = 0, t) op = [
|
|
106
|
+
op[0] & 2,
|
|
107
|
+
t.value
|
|
108
|
+
];
|
|
109
|
+
switch(op[0]){
|
|
110
|
+
case 0:
|
|
111
|
+
case 1:
|
|
112
|
+
t = op;
|
|
113
|
+
break;
|
|
114
|
+
case 4:
|
|
115
|
+
_.label++;
|
|
116
|
+
return {
|
|
117
|
+
value: op[1],
|
|
118
|
+
done: false
|
|
119
|
+
};
|
|
120
|
+
case 5:
|
|
121
|
+
_.label++;
|
|
122
|
+
y = op[1];
|
|
123
|
+
op = [
|
|
124
|
+
0
|
|
125
|
+
];
|
|
126
|
+
continue;
|
|
127
|
+
case 7:
|
|
128
|
+
op = _.ops.pop();
|
|
129
|
+
_.trys.pop();
|
|
130
|
+
continue;
|
|
131
|
+
default:
|
|
132
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
133
|
+
_ = 0;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
137
|
+
_.label = op[1];
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
141
|
+
_.label = t[1];
|
|
142
|
+
t = op;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
if (t && _.label < t[2]) {
|
|
146
|
+
_.label = t[2];
|
|
147
|
+
_.ops.push(op);
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
if (t[2]) _.ops.pop();
|
|
151
|
+
_.trys.pop();
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
op = body.call(thisArg, _);
|
|
155
|
+
} catch (e) {
|
|
156
|
+
op = [
|
|
157
|
+
6,
|
|
158
|
+
e
|
|
159
|
+
];
|
|
160
|
+
y = 0;
|
|
161
|
+
} finally{
|
|
162
|
+
f = t = 0;
|
|
163
|
+
}
|
|
164
|
+
if (op[0] & 5) throw op[1];
|
|
165
|
+
return {
|
|
166
|
+
value: op[0] ? op[1] : void 0,
|
|
167
|
+
done: true
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
import { describe, it } from "node:test";
|
|
172
|
+
import { senMLtoLwM2M } from "../../../senml/senMLtoLwM2M.js";
|
|
173
|
+
import { TransformType } from "../../types.js";
|
|
174
|
+
import jsonata from "jsonata";
|
|
175
|
+
import { arrayContaining, check } from "tsmatchers";
|
|
176
|
+
import { models } from "../../../models/models.js";
|
|
177
|
+
void describe("asset_tracker_v2+AWS examples", function() {
|
|
178
|
+
var _loop = function(_i, _iter) {
|
|
179
|
+
var _iter__i = _sliced_to_array(_iter[_i], 2), input = _iter__i[0], expected = _iter__i[1];
|
|
180
|
+
void it(input, /*#__PURE__*/ _async_to_generator(function() {
|
|
181
|
+
var _models_asset_tracker_v2AWS, _models_asset_tracker_v2AWS_transforms, result, _, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, expectedObject;
|
|
182
|
+
return _ts_generator(this, function(_state) {
|
|
183
|
+
switch(_state.label){
|
|
184
|
+
case 0:
|
|
185
|
+
_ = transformShadowUpdateToLwM2M(((_models_asset_tracker_v2AWS_transforms = (_models_asset_tracker_v2AWS = models["asset_tracker_v2+AWS"]) === null || _models_asset_tracker_v2AWS === void 0 ? void 0 : _models_asset_tracker_v2AWS.transforms) !== null && _models_asset_tracker_v2AWS_transforms !== void 0 ? _models_asset_tracker_v2AWS_transforms : []).filter(function(param) {
|
|
186
|
+
var type = param.type;
|
|
187
|
+
return type === TransformType.Shadow;
|
|
188
|
+
}));
|
|
189
|
+
return [
|
|
190
|
+
4,
|
|
191
|
+
import(input, {
|
|
192
|
+
assert: {
|
|
193
|
+
type: "json"
|
|
194
|
+
}
|
|
195
|
+
})
|
|
196
|
+
];
|
|
197
|
+
case 1:
|
|
198
|
+
return [
|
|
199
|
+
4,
|
|
200
|
+
_.apply(void 0, [
|
|
201
|
+
_state.sent()
|
|
202
|
+
])
|
|
203
|
+
];
|
|
204
|
+
case 2:
|
|
205
|
+
result = _state.sent();
|
|
206
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
207
|
+
try {
|
|
208
|
+
for(_iterator = expected[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
209
|
+
expectedObject = _step.value;
|
|
210
|
+
check(result).is(arrayContaining(expectedObject));
|
|
211
|
+
}
|
|
212
|
+
} catch (err) {
|
|
213
|
+
_didIteratorError = true;
|
|
214
|
+
_iteratorError = err;
|
|
215
|
+
} finally{
|
|
216
|
+
try {
|
|
217
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
218
|
+
_iterator.return();
|
|
219
|
+
}
|
|
220
|
+
} finally{
|
|
221
|
+
if (_didIteratorError) {
|
|
222
|
+
throw _iteratorError;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return [
|
|
227
|
+
2
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}));
|
|
232
|
+
};
|
|
233
|
+
for(var _i = 0, _iter = [
|
|
234
|
+
[
|
|
235
|
+
"./shadow/example-1.json",
|
|
236
|
+
[
|
|
237
|
+
{
|
|
238
|
+
ObjectID: 14202,
|
|
239
|
+
Resources: {
|
|
240
|
+
1: 4.398,
|
|
241
|
+
99: new Date(1699050063028)
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
ObjectID: 14205,
|
|
246
|
+
Resources: {
|
|
247
|
+
0: 27.06,
|
|
248
|
+
1: 31.125,
|
|
249
|
+
2: 97.748,
|
|
250
|
+
99: new Date(1699050061608)
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
ObjectID: 14203,
|
|
255
|
+
Resources: {
|
|
256
|
+
11: 8,
|
|
257
|
+
99: new Date(1699050062990)
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
],
|
|
262
|
+
[
|
|
263
|
+
"./shadow/example-2.json",
|
|
264
|
+
[
|
|
265
|
+
{
|
|
266
|
+
ObjectID: 14201,
|
|
267
|
+
Resources: {
|
|
268
|
+
0: 33.98771459323253,
|
|
269
|
+
1: -84.50632147267358,
|
|
270
|
+
2: 241.9342498779297,
|
|
271
|
+
3: 11.317643165588379,
|
|
272
|
+
4: 0.03478508070111275,
|
|
273
|
+
5: 90.31222534179688,
|
|
274
|
+
6: "GNSS",
|
|
275
|
+
99: new Date(1699049744000)
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
ObjectID: 14202,
|
|
280
|
+
Resources: {
|
|
281
|
+
1: 4.414,
|
|
282
|
+
99: new Date(1699049729959)
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
ObjectID: 14205,
|
|
287
|
+
Resources: {
|
|
288
|
+
0: 21.915307998657227,
|
|
289
|
+
1: 34.569278717041016,
|
|
290
|
+
2: 98.846,
|
|
291
|
+
10: 148,
|
|
292
|
+
99: new Date(1699049729518)
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
]
|
|
296
|
+
],
|
|
297
|
+
[
|
|
298
|
+
"./shadow/example-3.json",
|
|
299
|
+
[
|
|
300
|
+
{
|
|
301
|
+
ObjectID: 14203,
|
|
302
|
+
Resources: {
|
|
303
|
+
2: -95,
|
|
304
|
+
11: 7,
|
|
305
|
+
99: new Date(1699049610301)
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
]
|
|
309
|
+
],
|
|
310
|
+
[
|
|
311
|
+
"./shadow/example-4.json",
|
|
312
|
+
[
|
|
313
|
+
{
|
|
314
|
+
ObjectID: 14204,
|
|
315
|
+
Resources: {
|
|
316
|
+
0: "358299840016535",
|
|
317
|
+
1: "89450421180216254864",
|
|
318
|
+
2: "mfw_nrf91x1_2.0.0-77.beta",
|
|
319
|
+
3: "0.0.0-development",
|
|
320
|
+
4: "thingy91x_nrf9161",
|
|
321
|
+
99: new Date(1699284007851)
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
ObjectID: 14202,
|
|
326
|
+
Resources: {
|
|
327
|
+
0: 99,
|
|
328
|
+
1: 4.179,
|
|
329
|
+
2: 0,
|
|
330
|
+
3: 25.7,
|
|
331
|
+
99: new Date(1699049685992)
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
]
|
|
335
|
+
],
|
|
336
|
+
[
|
|
337
|
+
"./shadow/example-5.json",
|
|
338
|
+
[
|
|
339
|
+
{
|
|
340
|
+
ObjectID: 14202,
|
|
341
|
+
Resources: {
|
|
342
|
+
0: 89,
|
|
343
|
+
1: 4.161,
|
|
344
|
+
99: new Date(1701900277007)
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
]
|
|
348
|
+
]
|
|
349
|
+
]; _i < _iter.length; _i++)_loop(_i, _iter);
|
|
350
|
+
});
|
|
351
|
+
/**
|
|
352
|
+
* Very simple implementation of a converter.
|
|
353
|
+
*/ var transformShadowUpdateToLwM2M = function(transforms) {
|
|
354
|
+
// Turn the JSONata in the transforms into executable functions
|
|
355
|
+
var transformFns = [];
|
|
356
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
357
|
+
try {
|
|
358
|
+
for(var _iterator = transforms[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
359
|
+
var _step_value = _step.value, matchExpression = _step_value.match, transformExpression = _step_value.transform;
|
|
360
|
+
var match = void 0;
|
|
361
|
+
var transform = void 0;
|
|
362
|
+
try {
|
|
363
|
+
match = jsonata(matchExpression);
|
|
364
|
+
} catch (e) {
|
|
365
|
+
throw new Error("Failed to parse match expression '".concat(matchExpression, "'"));
|
|
366
|
+
}
|
|
367
|
+
try {
|
|
368
|
+
transform = jsonata(transformExpression);
|
|
369
|
+
} catch (e) {
|
|
370
|
+
throw new Error("Failed to parse match expression '".concat(transformExpression, "'"));
|
|
371
|
+
}
|
|
372
|
+
transformFns.push({
|
|
373
|
+
match: match,
|
|
374
|
+
matchExpression: matchExpression,
|
|
375
|
+
transform: transform,
|
|
376
|
+
transformExpression: transformExpression
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
} catch (err) {
|
|
380
|
+
_didIteratorError = true;
|
|
381
|
+
_iteratorError = err;
|
|
382
|
+
} finally{
|
|
383
|
+
try {
|
|
384
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
385
|
+
_iterator.return();
|
|
386
|
+
}
|
|
387
|
+
} finally{
|
|
388
|
+
if (_didIteratorError) {
|
|
389
|
+
throw _iteratorError;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return function() {
|
|
394
|
+
var _ref = _async_to_generator(function(input) {
|
|
395
|
+
return _ts_generator(this, function(_state) {
|
|
396
|
+
return [
|
|
397
|
+
2,
|
|
398
|
+
Promise.all(transformFns.map(function() {
|
|
399
|
+
var _ref = _async_to_generator(function(param) {
|
|
400
|
+
var match, matchExpression, transform, transformExpression, matched, err, err1;
|
|
401
|
+
return _ts_generator(this, function(_state) {
|
|
402
|
+
switch(_state.label){
|
|
403
|
+
case 0:
|
|
404
|
+
match = param.match, matchExpression = param.matchExpression, transform = param.transform, transformExpression = param.transformExpression;
|
|
405
|
+
_state.label = 1;
|
|
406
|
+
case 1:
|
|
407
|
+
_state.trys.push([
|
|
408
|
+
1,
|
|
409
|
+
3,
|
|
410
|
+
,
|
|
411
|
+
4
|
|
412
|
+
]);
|
|
413
|
+
return [
|
|
414
|
+
4,
|
|
415
|
+
match.evaluate(input)
|
|
416
|
+
];
|
|
417
|
+
case 2:
|
|
418
|
+
matched = _state.sent();
|
|
419
|
+
if (typeof matched !== "boolean") return [
|
|
420
|
+
2,
|
|
421
|
+
null
|
|
422
|
+
];
|
|
423
|
+
if (matched === false) return [
|
|
424
|
+
2,
|
|
425
|
+
null
|
|
426
|
+
];
|
|
427
|
+
return [
|
|
428
|
+
3,
|
|
429
|
+
4
|
|
430
|
+
];
|
|
431
|
+
case 3:
|
|
432
|
+
err = _state.sent();
|
|
433
|
+
console.error(err);
|
|
434
|
+
console.error("Failed to match ".concat(JSON.stringify(input), " using expression '").concat(matchExpression, "'!"));
|
|
435
|
+
return [
|
|
436
|
+
2,
|
|
437
|
+
false
|
|
438
|
+
];
|
|
439
|
+
case 4:
|
|
440
|
+
_state.trys.push([
|
|
441
|
+
4,
|
|
442
|
+
6,
|
|
443
|
+
,
|
|
444
|
+
7
|
|
445
|
+
]);
|
|
446
|
+
return [
|
|
447
|
+
4,
|
|
448
|
+
transform.evaluate(input)
|
|
449
|
+
];
|
|
450
|
+
case 5:
|
|
451
|
+
return [
|
|
452
|
+
2,
|
|
453
|
+
_state.sent()
|
|
454
|
+
];
|
|
455
|
+
case 6:
|
|
456
|
+
err1 = _state.sent();
|
|
457
|
+
console.error(err1);
|
|
458
|
+
console.error("Failed to transform ".concat(JSON.stringify(input), " using expression '").concat(transformExpression, "'!"));
|
|
459
|
+
return [
|
|
460
|
+
2,
|
|
461
|
+
null
|
|
462
|
+
];
|
|
463
|
+
case 7:
|
|
464
|
+
return [
|
|
465
|
+
2
|
|
466
|
+
];
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
return function(_) {
|
|
471
|
+
return _ref.apply(this, arguments);
|
|
472
|
+
};
|
|
473
|
+
}())).then(function(result) {
|
|
474
|
+
return result.flat();
|
|
475
|
+
})// Ignore unmatched transforms
|
|
476
|
+
.then(function(result) {
|
|
477
|
+
return result.filter(function(item) {
|
|
478
|
+
return item !== null;
|
|
479
|
+
});
|
|
480
|
+
})// Convert it to LwM2M
|
|
481
|
+
.then(senMLtoLwM2M)
|
|
482
|
+
];
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
return function(input) {
|
|
486
|
+
return _ref.apply(this, arguments);
|
|
487
|
+
};
|
|
488
|
+
}();
|
|
489
|
+
};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import jsonata from "jsonata";
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { FrontMatter, ModelIDRegExp } from "./types.js";
|
|
7
|
+
import { senMLtoLwM2M } from "../senml/senMLtoLwM2M.js";
|
|
8
|
+
import { getCodeBlock } from "../markdown/getCodeBlock.js";
|
|
9
|
+
import { getFrontMatter } from "../markdown/getFrontMatter.js";
|
|
10
|
+
import { validateSenML } from "../senml/validateSenML.js";
|
|
11
|
+
import { isRegisteredLwM2MObject } from "../lwm2m/isRegisteredLwM2MObject.js";
|
|
12
|
+
import { hasValue } from "../senml/hasValue.js";
|
|
13
|
+
import { parseREADME } from "markdown/parseREADME.js";
|
|
14
|
+
console.log(chalk.gray("Models rules check"));
|
|
15
|
+
console.log("");
|
|
16
|
+
var modelsDir = path.join(process.cwd(), "models");
|
|
17
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
18
|
+
try {
|
|
19
|
+
for(var _iterator = (await readdir(modelsDir))[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
20
|
+
var model = _step.value;
|
|
21
|
+
var modelDir = path.join(modelsDir, model);
|
|
22
|
+
if (!(await stat(modelDir)).isDirectory()) continue;
|
|
23
|
+
console.log(chalk.white("\xb7"), chalk.white.bold(model));
|
|
24
|
+
assert.match(model, ModelIDRegExp, "Model identifiers must consist of numbers, letters, dash, plus, and underscore only");
|
|
25
|
+
console.log(chalk.green("✔"), chalk.gray("Model name is correct"));
|
|
26
|
+
// A README.md should exist
|
|
27
|
+
try {
|
|
28
|
+
await stat(path.join(modelDir, "README.md"));
|
|
29
|
+
} catch (e) {
|
|
30
|
+
throw new Error("No README.md defined for model ".concat(model, "!"));
|
|
31
|
+
}
|
|
32
|
+
console.log(chalk.green("✔"), chalk.gray("README.md exists"));
|
|
33
|
+
try {
|
|
34
|
+
parseREADME(await readFile(path.join(modelDir, "README.md"), "utf-8"));
|
|
35
|
+
} catch (err) {
|
|
36
|
+
console.error(err);
|
|
37
|
+
throw new Error("README is not valid for ".concat(model, "!"));
|
|
38
|
+
}
|
|
39
|
+
console.log(chalk.green("✔"), chalk.gray("README.md is valid"));
|
|
40
|
+
// Validate jsonata expressions
|
|
41
|
+
var hasTransforms = false;
|
|
42
|
+
var transformsFolder = path.join(modelDir, "transforms");
|
|
43
|
+
try {
|
|
44
|
+
await stat(transformsFolder);
|
|
45
|
+
hasTransforms = true;
|
|
46
|
+
console.log(" ", chalk.gray("Transforms:"));
|
|
47
|
+
} catch (e) {
|
|
48
|
+
console.log(" ", chalk.gray("No transforms found."));
|
|
49
|
+
}
|
|
50
|
+
if (hasTransforms) {
|
|
51
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
52
|
+
try {
|
|
53
|
+
for(var _iterator1 = (await readdir(transformsFolder)).filter(function(f) {
|
|
54
|
+
return f.endsWith(".md");
|
|
55
|
+
})[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
56
|
+
var transform = _step1.value;
|
|
57
|
+
console.log(" ", chalk.white("\xb7"), chalk.white.bold(transform));
|
|
58
|
+
var markdown = await readFile(path.join(modelDir, "transforms", transform), "utf-8");
|
|
59
|
+
// Validate front-matter
|
|
60
|
+
var type = getFrontMatter(markdown, FrontMatter).type;
|
|
61
|
+
console.log(" ", chalk.green("✔"), chalk.gray("Type ".concat(type, " is valid")));
|
|
62
|
+
var findBlock = getCodeBlock(markdown);
|
|
63
|
+
var matchExpression = findBlock("jsonata", "Match Expression");
|
|
64
|
+
var transformExpression = findBlock("jsonata", "Transform Expression");
|
|
65
|
+
var inputExample = JSON.parse(findBlock("json", "Input Example"));
|
|
66
|
+
var resultExample = JSON.parse(findBlock("json", "Result Example"));
|
|
67
|
+
var selectResult = await jsonata(matchExpression).evaluate(inputExample);
|
|
68
|
+
if (selectResult !== true) {
|
|
69
|
+
throw new Error("The select expression did not evaluate to true with the given example.");
|
|
70
|
+
}
|
|
71
|
+
console.log(" ", chalk.green("✔"), chalk.gray("Select expression evaluated to true for the example input"));
|
|
72
|
+
var transformResult = await jsonata(// For testing purposes this function call result is hardcoded
|
|
73
|
+
transformExpression.replace("$millis()", "1699999999999")).evaluate(inputExample);
|
|
74
|
+
var maybeValidSenML = validateSenML(transformResult.filter(hasValue));
|
|
75
|
+
if ("errors" in maybeValidSenML) {
|
|
76
|
+
console.error(maybeValidSenML.errors);
|
|
77
|
+
throw new Error("The JSONata expression must produce valid SenML");
|
|
78
|
+
}
|
|
79
|
+
assert.deepEqual(maybeValidSenML.value, resultExample);
|
|
80
|
+
console.log(" ", chalk.green("✔"), chalk.gray("Transformation result is valid SenML"));
|
|
81
|
+
assert.deepEqual(maybeValidSenML.value, resultExample);
|
|
82
|
+
console.log(" ", chalk.green("✔"), chalk.gray("The transformation result matches the example"));
|
|
83
|
+
var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
|
|
84
|
+
try {
|
|
85
|
+
// Validate
|
|
86
|
+
for(var _iterator2 = senMLtoLwM2M(maybeValidSenML.value)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
|
|
87
|
+
var object = _step2.value;
|
|
88
|
+
if (!isRegisteredLwM2MObject(object, console.error)) {
|
|
89
|
+
throw new Error("The LwM2M object must follow LwM2M schema definition");
|
|
90
|
+
}
|
|
91
|
+
console.log(" ", chalk.green("✔"), chalk.gray("SenML object is valid LwM2M"));
|
|
92
|
+
}
|
|
93
|
+
} catch (err) {
|
|
94
|
+
_didIteratorError2 = true;
|
|
95
|
+
_iteratorError2 = err;
|
|
96
|
+
} finally{
|
|
97
|
+
try {
|
|
98
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
99
|
+
_iterator2.return();
|
|
100
|
+
}
|
|
101
|
+
} finally{
|
|
102
|
+
if (_didIteratorError2) {
|
|
103
|
+
throw _iteratorError2;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
} catch (err) {
|
|
109
|
+
_didIteratorError1 = true;
|
|
110
|
+
_iteratorError1 = err;
|
|
111
|
+
} finally{
|
|
112
|
+
try {
|
|
113
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
114
|
+
_iterator1.return();
|
|
115
|
+
}
|
|
116
|
+
} finally{
|
|
117
|
+
if (_didIteratorError1) {
|
|
118
|
+
throw _iteratorError1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
} catch (err) {
|
|
125
|
+
_didIteratorError = true;
|
|
126
|
+
_iteratorError = err;
|
|
127
|
+
} finally{
|
|
128
|
+
try {
|
|
129
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
130
|
+
_iterator.return();
|
|
131
|
+
}
|
|
132
|
+
} finally{
|
|
133
|
+
if (_didIteratorError) {
|
|
134
|
+
throw _iteratorError;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|