@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.
Files changed (169) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +122 -0
  3. package/dist/generator/addDocBlock.js +5 -0
  4. package/dist/generator/generateLwM2MDefinitions.js +82 -0
  5. package/dist/generator/generateLwM2MDefinitions.spec.js +91 -0
  6. package/dist/generator/generateLwm2mTimestampResources.js +69 -0
  7. package/dist/generator/generateModels.js +142 -0
  8. package/dist/generator/generateType.js +90 -0
  9. package/dist/generator/generateValidator.js +132 -0
  10. package/dist/generator/generateValidators.js +63 -0
  11. package/dist/generator/isDir.js +163 -0
  12. package/dist/generator/isDir.spec.js +212 -0
  13. package/dist/generator/lwm2m.js +106 -0
  14. package/dist/generator/models.js +306 -0
  15. package/dist/generator/printNode.js +8 -0
  16. package/dist/generator/tokenizeName.js +5 -0
  17. package/dist/generator/tokenizeName.spec.js +98 -0
  18. package/dist/generator/types.js +140 -0
  19. package/dist/lwm2m/LWM2MObjectDefinition.js +88 -0
  20. package/dist/lwm2m/LWM2MObjectInfo.js +9 -0
  21. package/dist/lwm2m/LwM2MObject.d.js +1 -0
  22. package/dist/lwm2m/LwM2MObjectID.js +57 -0
  23. package/dist/lwm2m/ParsedLwM2MObjectDefinition.js +1 -0
  24. package/dist/lwm2m/check-lwm2m-rules.js +480 -0
  25. package/dist/lwm2m/definitions.js +596 -0
  26. package/dist/lwm2m/fromXML2JSON.js +194 -0
  27. package/dist/lwm2m/instanceTs.js +9 -0
  28. package/dist/lwm2m/instanceTs.spec.js +16 -0
  29. package/dist/lwm2m/isRegisteredLwM2MObject.js +3 -0
  30. package/dist/lwm2m/isRegisteredLwM2MObject.spec.js +45 -0
  31. package/dist/lwm2m/object/14201.d.js +5 -0
  32. package/dist/lwm2m/object/14202.d.js +5 -0
  33. package/dist/lwm2m/object/14203.d.js +5 -0
  34. package/dist/lwm2m/object/14204.d.js +5 -0
  35. package/dist/lwm2m/object/14205.d.js +5 -0
  36. package/dist/lwm2m/object/14210.d.js +5 -0
  37. package/dist/lwm2m/object/14220.d.js +5 -0
  38. package/dist/lwm2m/object/14230.d.js +5 -0
  39. package/dist/lwm2m/object/validate14201.js +18 -0
  40. package/dist/lwm2m/object/validate14202.js +17 -0
  41. package/dist/lwm2m/object/validate14203.js +19 -0
  42. package/dist/lwm2m/object/validate14204.js +17 -0
  43. package/dist/lwm2m/object/validate14205.js +15 -0
  44. package/dist/lwm2m/object/validate14210.js +13 -0
  45. package/dist/lwm2m/object/validate14220.js +12 -0
  46. package/dist/lwm2m/object/validate14230.js +13 -0
  47. package/dist/lwm2m/objects.js +8 -0
  48. package/dist/lwm2m/parseRangeEnumeration.js +20 -0
  49. package/dist/lwm2m/parseRangeEnumeration.spec.js +27 -0
  50. package/dist/lwm2m/resourceType.js +12 -0
  51. package/dist/lwm2m/timestampResources.js +12 -0
  52. package/dist/lwm2m/unwrapNestedArray.js +114 -0
  53. package/dist/lwm2m/unwrapNestedArray.spec.js +374 -0
  54. package/dist/lwm2m/validate.js +14 -0
  55. package/dist/lwm2m/validation.js +146 -0
  56. package/dist/lwm2m/validators.js +20 -0
  57. package/dist/markdown/getCodeBlock.js +74 -0
  58. package/dist/markdown/getFrontMatter.js +15 -0
  59. package/dist/markdown/parseREADME.js +19 -0
  60. package/dist/models/asset_tracker_v2+AWS/examples/examples.spec.js +489 -0
  61. package/dist/models/check-model-rules.js +137 -0
  62. package/dist/models/models.js +137 -0
  63. package/dist/models/types.js +13 -0
  64. package/dist/senml/SenMLSchema.js +79 -0
  65. package/dist/senml/SenMLSchema.spec.js +23 -0
  66. package/dist/senml/hasValue.js +8 -0
  67. package/dist/senml/hasValue.spec.js +103 -0
  68. package/dist/senml/lwm2mToSenML.js +137 -0
  69. package/dist/senml/lwm2mToSenML.spec.js +104 -0
  70. package/dist/senml/parseResourceId.js +58 -0
  71. package/dist/senml/parseResourceId.spec.js +13 -0
  72. package/dist/senml/senMLtoLwM2M.js +126 -0
  73. package/dist/senml/senMLtoLwM2M.spec.js +226 -0
  74. package/dist/senml/validateSenML.js +6 -0
  75. package/dist/senml/validateSenML.spec.js +31 -0
  76. package/export.js +13 -0
  77. package/index.d.ts +14 -0
  78. package/lwm2m/14201.xml +94 -0
  79. package/lwm2m/14202.xml +84 -0
  80. package/lwm2m/14203.xml +104 -0
  81. package/lwm2m/14204.xml +84 -0
  82. package/lwm2m/14205.xml +64 -0
  83. package/lwm2m/14210.xml +44 -0
  84. package/lwm2m/14220.xml +34 -0
  85. package/lwm2m/14230.xml +44 -0
  86. package/lwm2m/LWM2M-v1_1.xsd +168 -0
  87. package/lwm2m/LWM2MObjectDefinition.ts +84 -0
  88. package/lwm2m/LWM2MObjectInfo.ts +42 -0
  89. package/lwm2m/LwM2MObject.d.ts +19 -0
  90. package/lwm2m/LwM2MObjectID.ts +73 -0
  91. package/lwm2m/ParsedLwM2MObjectDefinition.ts +28 -0
  92. package/lwm2m/check-lwm2m-rules.ts +160 -0
  93. package/lwm2m/definitions.ts +278 -0
  94. package/lwm2m/format.sh +3 -0
  95. package/lwm2m/fromXML2JSON.ts +44 -0
  96. package/lwm2m/instanceTs.spec.ts +19 -0
  97. package/lwm2m/instanceTs.ts +10 -0
  98. package/lwm2m/isRegisteredLwM2MObject.spec.ts +48 -0
  99. package/lwm2m/isRegisteredLwM2MObject.ts +4 -0
  100. package/lwm2m/object/14201.d.ts +73 -0
  101. package/lwm2m/object/14202.d.ts +59 -0
  102. package/lwm2m/object/14203.d.ts +67 -0
  103. package/lwm2m/object/14204.d.ts +55 -0
  104. package/lwm2m/object/14205.d.ts +43 -0
  105. package/lwm2m/object/14210.d.ts +31 -0
  106. package/lwm2m/object/14220.d.ts +25 -0
  107. package/lwm2m/object/14230.d.ts +31 -0
  108. package/lwm2m/object/validate14201.ts +10 -0
  109. package/lwm2m/object/validate14202.ts +10 -0
  110. package/lwm2m/object/validate14203.ts +10 -0
  111. package/lwm2m/object/validate14204.ts +10 -0
  112. package/lwm2m/object/validate14205.ts +10 -0
  113. package/lwm2m/object/validate14210.ts +10 -0
  114. package/lwm2m/object/validate14220.ts +10 -0
  115. package/lwm2m/object/validate14230.ts +10 -0
  116. package/lwm2m/objects.ts +16 -0
  117. package/lwm2m/parseRangeEnumeration.spec.ts +34 -0
  118. package/lwm2m/parseRangeEnumeration.ts +29 -0
  119. package/lwm2m/resourceType.ts +11 -0
  120. package/lwm2m/timestampResources.ts +4 -0
  121. package/lwm2m/unwrapNestedArray.spec.ts +241 -0
  122. package/lwm2m/unwrapNestedArray.ts +27 -0
  123. package/lwm2m/validate.ts +30 -0
  124. package/lwm2m/validation.ts +120 -0
  125. package/lwm2m/validators.ts +21 -0
  126. package/models/PCA20035+solar/README.md +10 -0
  127. package/models/PCA20035+solar/transforms/airQuality.md +48 -0
  128. package/models/PCA20035+solar/transforms/battery.md +46 -0
  129. package/models/PCA20035+solar/transforms/button.md +45 -0
  130. package/models/PCA20035+solar/transforms/deviceInfo.md +72 -0
  131. package/models/PCA20035+solar/transforms/gain.md +45 -0
  132. package/models/PCA20035+solar/transforms/geolocationFromGroundfix.md +67 -0
  133. package/models/PCA20035+solar/transforms/geolocationFromMessage.md +80 -0
  134. package/models/PCA20035+solar/transforms/humidity.md +43 -0
  135. package/models/PCA20035+solar/transforms/networkInfo.md +84 -0
  136. package/models/PCA20035+solar/transforms/pressure.md +43 -0
  137. package/models/PCA20035+solar/transforms/temperature.md +43 -0
  138. package/models/README.md +10 -0
  139. package/models/asset_tracker_v2+AWS/README.md +6 -0
  140. package/models/asset_tracker_v2+AWS/examples/examples.spec.ts +229 -0
  141. package/models/asset_tracker_v2+AWS/examples/shadow/example-1.json +24 -0
  142. package/models/asset_tracker_v2+AWS/examples/shadow/example-2.json +30 -0
  143. package/models/asset_tracker_v2+AWS/examples/shadow/example-3.json +37 -0
  144. package/models/asset_tracker_v2+AWS/examples/shadow/example-4.json +48 -0
  145. package/models/asset_tracker_v2+AWS/examples/shadow/example-5.json +43 -0
  146. package/models/asset_tracker_v2+AWS/transforms/GNSS.md +66 -0
  147. package/models/asset_tracker_v2+AWS/transforms/battery-voltage.md +50 -0
  148. package/models/asset_tracker_v2+AWS/transforms/device-info.md +61 -0
  149. package/models/asset_tracker_v2+AWS/transforms/env.md +69 -0
  150. package/models/asset_tracker_v2+AWS/transforms/fuel-gauge.md +62 -0
  151. package/models/asset_tracker_v2+AWS/transforms/roam.md +100 -0
  152. package/models/asset_tracker_v2+AWS/transforms/solar.md +58 -0
  153. package/models/check-model-rules.ts +125 -0
  154. package/models/kartverket-vasstandsdata/README.md +13 -0
  155. package/models/models.ts +36 -0
  156. package/models/types.ts +17 -0
  157. package/package.json +111 -0
  158. package/senml/SenMLSchema.spec.ts +21 -0
  159. package/senml/SenMLSchema.ts +74 -0
  160. package/senml/hasValue.spec.ts +19 -0
  161. package/senml/hasValue.ts +12 -0
  162. package/senml/lwm2mToSenML.spec.ts +74 -0
  163. package/senml/lwm2mToSenML.ts +62 -0
  164. package/senml/parseResourceId.spec.ts +13 -0
  165. package/senml/parseResourceId.ts +23 -0
  166. package/senml/senMLtoLwM2M.spec.ts +181 -0
  167. package/senml/senMLtoLwM2M.ts +121 -0
  168. package/senml/validateSenML.spec.ts +16 -0
  169. package/senml/validateSenML.ts +8 -0
@@ -0,0 +1,137 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ import { TransformType } from "./types.js";
15
+ export var ModelID;
16
+ (function(ModelID) {
17
+ ModelID["PCA20035_solar"] = "PCA20035+solar";
18
+ ModelID["Asset_tracker_v2_AWS"] = "asset_tracker_v2+AWS";
19
+ ModelID["Kartverket_vasstandsdata"] = "kartverket-vasstandsdata";
20
+ })(ModelID || (ModelID = {}));
21
+ var _obj;
22
+ /**
23
+ * The models defined for hello.nrfcloud.com
24
+ */ export var models = (_obj = {}, _define_property(_obj, "PCA20035+solar", {
25
+ "id": "PCA20035+solar",
26
+ "transforms": [
27
+ {
28
+ "type": TransformType.Messages,
29
+ "match": "appId = 'AIR_QUAL'",
30
+ "transform": '[\n {"bn": "/14205/0/", "n": "10", "v": $number(data), "bt": ts }\n]'
31
+ },
32
+ {
33
+ "type": TransformType.Messages,
34
+ "match": "appId = 'BATTERY'",
35
+ "transform": '[\n {"bn": "/14202/0/", "n": "0", "v": $number(data), "bt": ts }\n]'
36
+ },
37
+ {
38
+ "type": TransformType.Messages,
39
+ "match": "appId = 'BUTTON'",
40
+ "transform": '[\n {"bn": "/14220/0/", "n": "0", "v": $number(data), "bt": ts }\n]'
41
+ },
42
+ {
43
+ "type": TransformType.Messages,
44
+ "match": "appId = 'DEVICE' and $exists(data.deviceInfo)",
45
+ "transform": '[\n {"bn": "/14204/0/", "n": "0", "vs": data.deviceInfo.imei, "bt": ts },\n {"n": "1", "vs": data.deviceInfo.iccid },\n {"n": "2", "vs": data.deviceInfo.modemFirmware },\n {"n": "3", "vs": data.deviceInfo.appVersion },\n {"n": "4", "vs": data.deviceInfo.board },\n {"n": "5", "vs": data.deviceInfo.bat }\n]'
46
+ },
47
+ {
48
+ "type": TransformType.Messages,
49
+ "match": "appId = 'SOLAR'",
50
+ "transform": '[\n {"bn": "/14210/0/", "n": "0", "v": $number(data), "bt": ts }\n]'
51
+ },
52
+ {
53
+ "type": TransformType.Messages,
54
+ "match": "appId = 'GROUND_FIX' and $exists(data.lat) and $exists(data.lon) and $exists(data.uncertainty) and $exists(data.fulfilledWith)",
55
+ "transform": '[\n {"bn": "/14201/1/", "n": "0", "v": data.lat, "bt": $millis() },\n {"n": "1", "v": data.lon },\n {"n": "3", "v": data.uncertainty },\n {"n": "6", "vs": data.fulfilledWith }\n]'
56
+ },
57
+ {
58
+ "type": TransformType.Messages,
59
+ "match": "appId = 'GNSS'",
60
+ "transform": '[\n {"bn": "/14201/0/", "n": "0", "v": data.lat, "bt": ts },\n {"n": "1", "v": data.lng },\n {"n": "2", "v": data.alt },\n {"n": "3", "v": data.acc },\n {"n": "4", "v": data.spd },\n {"n": "5", "v": data.hdg },\n {"n": "6", "vs": "GNSS" }\n]'
61
+ },
62
+ {
63
+ "type": TransformType.Messages,
64
+ "match": "appId = 'HUMID'",
65
+ "transform": '[\n {"bn": "/14205/0/", "n": "1", "v": $number(data), "bt": ts }\n]'
66
+ },
67
+ {
68
+ "type": TransformType.Messages,
69
+ "match": "appId = 'DEVICE' and $exists(data.networkInfo)",
70
+ "transform": '[\n {"bn": "/14203/0/", "n": "0", "vs": data.networkInfo.networkMode, "bt": ts },\n {"n": "1", "v": data.networkInfo.currentBand },\n {"n": "2", "v": data.networkInfo.rsrp },\n {"n": "3", "v": data.networkInfo.areaCode },\n {"n": "4", "v": data.networkInfo.cellID },\n {"n": "5", "v": data.networkInfo.mccmnc },\n {"n": "6", "vs": data.networkInfo.ipAddress },\n {"n": "11", "v": data.networkInfo.eest }\n]'
71
+ },
72
+ {
73
+ "type": TransformType.Messages,
74
+ "match": "appId = 'AIR_PRESS'",
75
+ "transform": '[\n {"bn": "/14205/0/", "n": "2", "v": $number(data)*10, "bt": ts }\n]'
76
+ },
77
+ {
78
+ "type": TransformType.Messages,
79
+ "match": "appId = 'TEMP'",
80
+ "transform": '[\n {"bn": "/14205/0/", "n": "0", "v": $number(data), "bt": ts }\n]'
81
+ }
82
+ ],
83
+ "about": {
84
+ "title": "Thingy:91 with Solar Shield",
85
+ "description": "The Nordic Thingy:91 Solar Shield is a plug-and-play prototyping platform. Powerfoyle solar cell is mounted onto the Thingy to quickly get started exploring the endless possibilities with solar powered IoT applications and to develop products with eternal life or even battery-free products.​\nThe Thingy:91 runs the asset_tracker_v2 application and sends messages to nRF Cloud using MQTT."
86
+ }
87
+ }), _define_property(_obj, "asset_tracker_v2+AWS", {
88
+ "id": "asset_tracker_v2+AWS",
89
+ "transforms": [
90
+ {
91
+ "type": TransformType.Shadow,
92
+ "match": "$exists(state.reported.gnss)",
93
+ "transform": '[\n {"bn": "/14201/0/", "n": "0", "v": state.reported.gnss.v.lat, "bt": state.reported.gnss.ts },\n {"n": "1", "v": state.reported.gnss.v.lng },\n {"n": "2", "v": state.reported.gnss.v.alt },\n {"n": "3", "v": state.reported.gnss.v.acc },\n {"n": "4", "v": state.reported.gnss.v.spd },\n {"n": "5", "v": state.reported.gnss.v.hdg },\n {"n": "6", "vs": "GNSS" }\n]'
94
+ },
95
+ {
96
+ "type": TransformType.Shadow,
97
+ "match": "$exists(state.reported.bat)",
98
+ "transform": '[\n {"bn": "/14202/0/", "n": "1", "v": state.reported.bat.v/1000, "bt": state.reported.bat.ts }\n]'
99
+ },
100
+ {
101
+ "type": TransformType.Shadow,
102
+ "match": "$exists(state.reported.dev)",
103
+ "transform": '[\n {"bn": "/14204/0/", "n": "0", "vs": state.reported.dev.v.imei, "bt": state.reported.dev.ts },\n {"n": "1", "vs": state.reported.dev.v.iccid },\n {"n": "2", "vs": state.reported.dev.v.modV },\n {"n": "3", "vs": state.reported.dev.v.appV },\n {"n": "4", "vs": state.reported.dev.v.brdV }\n]'
104
+ },
105
+ {
106
+ "type": TransformType.Shadow,
107
+ "match": "$exists(state.reported.env)",
108
+ "transform": '[\n {"bn": "/14205/0/", "n": "0", "v": state.reported.env.v.temp, "bt": state.reported.env.ts },\n {"n": "1", "v": state.reported.env.v.hum },\n {"n": "2", "v": state.reported.env.v.atmp },\n {"n": "10", "v": state.reported.env.v.bsec_iaq }\n]'
109
+ },
110
+ {
111
+ "type": TransformType.Shadow,
112
+ "match": "$exists(state.reported.fg)",
113
+ "transform": '[\n {"bn": "/14202/0/", "n": "0", "v": state.reported.fg.v.SoC, "bt": state.reported.fg.ts },\n {"n": "1", "v": state.reported.fg.v.V/1000 },\n {"n": "2", "v": state.reported.fg.v.I },\n {"n": "3", "v": state.reported.fg.v.T = null ? null : state.reported.fg.v.T/10 },\n {"n": "4", "v": state.reported.fg.v.TTF },\n {"n": "5", "v": state.reported.fg.v.TTE }\n]'
114
+ },
115
+ {
116
+ "type": TransformType.Shadow,
117
+ "match": "$exists(state.reported.roam)",
118
+ "transform": '[\n {"bn": "/14203/0/", "n": "0", "vs": state.reported.roam.v.nw, "bt": state.reported.roam.ts },\n {"n": "1", "v": state.reported.roam.v.band },\n {"bn": "/14203/0/", "n": "2", "v": state.reported.roam.v.rsrp, "bt": state.reported.roam.ts },\n {"n": "3", "v": state.reported.roam.v.area },\n {"n": "4", "v": state.reported.roam.v.cell },\n {"n": "5", "v": state.reported.roam.v.mccmnc },\n {"n": "6", "vs": state.reported.roam.v.ip },\n {"bn": "/14203/0/", "n": "11", "v": state.reported.roam.v.eest, "bt": state.reported.roam.ts }\n]'
119
+ },
120
+ {
121
+ "type": TransformType.Shadow,
122
+ "match": "$exists(state.reported.sol)",
123
+ "transform": '[\n {"bn": "/14210/0/", "n": "0", "v": state.reported.sol.v.gain, "bt": state.reported.sol.ts },\n {"n": "1", "v": state.reported.sol.v.bat }\n]'
124
+ }
125
+ ],
126
+ "about": {
127
+ "title": "asset_tracker_v2 on AWS",
128
+ "description": "This implements the conversion for the asset_tracker_v2 message protocol when connected to AWS IoT."
129
+ }
130
+ }), _define_property(_obj, "kartverket-vasstandsdata", {
131
+ "id": "kartverket-vasstandsdata",
132
+ "transforms": [],
133
+ "about": {
134
+ "title": "Kartverket Vasstandsdata",
135
+ "description": "A simulated device reporting the current sea level as provided by the Kartverket's (Norwegian Mapping Authority) API for vasstandsdata (API for water level data).\nReports sea water level using the Object 14230.\nThe data is licensed by the Norwegian Mapping Authority’s under the Creative Commons Attribution 4.0 International (CC BY 4.0) license."
136
+ }
137
+ }), _obj);
@@ -0,0 +1,13 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ export var ModelIDRegExp = /^[A-Za-z0-9+_-]+$/;
3
+ export var TransformType;
4
+ (function(TransformType) {
5
+ TransformType["Shadow"] = "shadow";
6
+ TransformType["Messages"] = "messages";
7
+ })(TransformType || (TransformType = {}));
8
+ export var FrontMatter = Type.Object({
9
+ type: Type.Union([
10
+ Type.Literal("shadow"),
11
+ Type.Literal("messages")
12
+ ])
13
+ });
@@ -0,0 +1,79 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ var ResourceIDPart = Type.RegExp(/^[0-9/]+$/, {
3
+ title: "ResourceIDPart",
4
+ description: "Combines `bn` and `n` to a fully qualified resource identifier in the form of `/<object ID>/<object instance ID>/<resource ID>/0`. (Multiple resource instances are not supported right now.).",
5
+ examples: [
6
+ "/",
7
+ "/14201/0/",
8
+ "5"
9
+ ]
10
+ });
11
+ var BaseValue = Type.Number({
12
+ title: "Base Value"
13
+ });
14
+ var Value = Type.Number({
15
+ title: "Value"
16
+ });
17
+ var Time = Type.Integer({
18
+ minimum: 0,
19
+ title: "Time"
20
+ });
21
+ /**
22
+ * Defines a SenML type with some unsupported elements removed: Sum, Base Sum, Update Time
23
+ *
24
+ * @see https://datatracker.ietf.org/doc/html/rfc8428
25
+ */ export var Measurement = Type.Intersect([
26
+ Type.Union([
27
+ Type.Object({
28
+ n: ResourceIDPart
29
+ }),
30
+ Type.Object({
31
+ bn: ResourceIDPart,
32
+ n: ResourceIDPart,
33
+ blv: Type.String({
34
+ minLength: 1,
35
+ description: "The LwM2M object version used",
36
+ default: "1.0"
37
+ }),
38
+ bt: Type.Optional(Time)
39
+ })
40
+ ]),
41
+ // Value combinations
42
+ Type.Union([
43
+ Type.Union([
44
+ Type.Object({
45
+ bv: BaseValue
46
+ }),
47
+ Type.Object({
48
+ bv: BaseValue,
49
+ v: Value
50
+ }),
51
+ Type.Object({
52
+ // Value can be undefined, if it is not mandatory
53
+ v: Type.Optional(Value)
54
+ })
55
+ ]),
56
+ Type.Object({
57
+ vs: Type.String({
58
+ minLength: 1,
59
+ title: "String Value"
60
+ })
61
+ }),
62
+ Type.Object({
63
+ vb: Type.Boolean({
64
+ title: "Boolean Value"
65
+ })
66
+ }),
67
+ Type.Object({
68
+ vd: Type.String({
69
+ title: "Data Value.",
70
+ description: "Octets in the Data Value are base64 encoded with the URL-safe alphabet as defined in Section 5 of [RFC4648], with padding omitted."
71
+ })
72
+ })
73
+ ])
74
+ ], {
75
+ description: "SenML schema for conversion results. This is limited to properties useful for the hello.nrfcloud.com/map application."
76
+ });
77
+ export var SenML = Type.Array(Measurement, {
78
+ minItems: 1
79
+ });
@@ -0,0 +1,23 @@
1
+ import { describe, it } from "node:test";
2
+ import { SenML } from "./SenMLSchema.js";
3
+ import assert from "node:assert/strict";
4
+ import { validate } from "../validate.js";
5
+ void describe("SenMLType", function() {
6
+ void it("it should validate a SenML payload", function() {
7
+ var example = [
8
+ {
9
+ bn: "/14201/0/",
10
+ n: "0",
11
+ v: 33.98755678796222,
12
+ bt: 1698155694999
13
+ },
14
+ {
15
+ n: "1",
16
+ v: -84.506132079174634
17
+ }
18
+ ];
19
+ var res = validate(SenML)(example);
20
+ assert.equal("errors" in res, false);
21
+ assert.deepEqual("value" in res && res.value, example);
22
+ });
23
+ });
@@ -0,0 +1,8 @@
1
+ export var hasValue = function(m) {
2
+ if (m === null) return false;
3
+ if (typeof m !== "object") return false;
4
+ var _ref, _ref1, _ref2, _ref3;
5
+ var v = (_ref3 = (_ref2 = (_ref1 = (_ref = "bv" in m ? m.bv : undefined) !== null && _ref !== void 0 ? _ref : "v" in m ? m.v : undefined) !== null && _ref1 !== void 0 ? _ref1 : "vs" in m ? m.vs : undefined) !== null && _ref2 !== void 0 ? _ref2 : "vb" in m ? m.vb : undefined) !== null && _ref3 !== void 0 ? _ref3 : "vd" in m ? m.vd : undefined;
6
+ if (v === null || v === undefined) return false;
7
+ return true;
8
+ };
@@ -0,0 +1,103 @@
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 _iterable_to_array_limit(arr, i) {
10
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
11
+ if (_i == null) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _s, _e;
16
+ try {
17
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
18
+ _arr.push(_s.value);
19
+ if (i && _arr.length === i) break;
20
+ }
21
+ } catch (err) {
22
+ _d = true;
23
+ _e = err;
24
+ } finally{
25
+ try {
26
+ if (!_n && _i["return"] != null) _i["return"]();
27
+ } finally{
28
+ if (_d) throw _e;
29
+ }
30
+ }
31
+ return _arr;
32
+ }
33
+ function _non_iterable_rest() {
34
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
35
+ }
36
+ function _sliced_to_array(arr, i) {
37
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
38
+ }
39
+ function _unsupported_iterable_to_array(o, minLen) {
40
+ if (!o) return;
41
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
42
+ var n = Object.prototype.toString.call(o).slice(8, -1);
43
+ if (n === "Object" && o.constructor) n = o.constructor.name;
44
+ if (n === "Map" || n === "Set") return Array.from(n);
45
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
46
+ }
47
+ import { describe, it } from "node:test";
48
+ import assert from "node:assert/strict";
49
+ import { hasValue } from "./hasValue.js";
50
+ void describe("hasValue() should determine whether an object has a value", function() {
51
+ var _loop = function(_i, _iter) {
52
+ var _iter__i = _sliced_to_array(_iter[_i], 2), record = _iter__i[0], expected = _iter__i[1];
53
+ void it("should determine that ".concat(JSON.stringify(record), " has a value: ").concat(JSON.stringify(expected)), function() {
54
+ return assert.equal(hasValue(record), expected);
55
+ });
56
+ };
57
+ for(var _i = 0, _iter = [
58
+ [
59
+ {
60
+ bn: 14202,
61
+ n: 0,
62
+ v: 99,
63
+ bt: 1699049685992
64
+ },
65
+ true
66
+ ],
67
+ [
68
+ {
69
+ n: 1,
70
+ v: 4.179
71
+ },
72
+ true
73
+ ],
74
+ [
75
+ {
76
+ n: 2,
77
+ v: 0
78
+ },
79
+ true
80
+ ],
81
+ [
82
+ {
83
+ n: 3,
84
+ v: 25.7
85
+ },
86
+ true
87
+ ],
88
+ [
89
+ {
90
+ n: 4,
91
+ v: null
92
+ },
93
+ false
94
+ ],
95
+ [
96
+ {
97
+ n: 5,
98
+ v: null
99
+ },
100
+ false
101
+ ]
102
+ ]; _i < _iter.length; _i++)_loop(_i, _iter);
103
+ });
@@ -0,0 +1,137 @@
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 _array_without_holes(arr) {
10
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
11
+ }
12
+ function _define_property(obj, key, value) {
13
+ if (key in obj) {
14
+ Object.defineProperty(obj, key, {
15
+ value: value,
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true
19
+ });
20
+ } else {
21
+ obj[key] = value;
22
+ }
23
+ return obj;
24
+ }
25
+ function _iterable_to_array(iter) {
26
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
27
+ }
28
+ function _non_iterable_rest() {
29
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
30
+ }
31
+ function _non_iterable_spread() {
32
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
33
+ }
34
+ function _object_spread(target) {
35
+ for(var i = 1; i < arguments.length; i++){
36
+ var source = arguments[i] != null ? arguments[i] : {};
37
+ var ownKeys = Object.keys(source);
38
+ if (typeof Object.getOwnPropertySymbols === "function") {
39
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
40
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
41
+ }));
42
+ }
43
+ ownKeys.forEach(function(key) {
44
+ _define_property(target, key, source[key]);
45
+ });
46
+ }
47
+ return target;
48
+ }
49
+ function ownKeys(object, enumerableOnly) {
50
+ var keys = Object.keys(object);
51
+ if (Object.getOwnPropertySymbols) {
52
+ var symbols = Object.getOwnPropertySymbols(object);
53
+ if (enumerableOnly) {
54
+ symbols = symbols.filter(function(sym) {
55
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
56
+ });
57
+ }
58
+ keys.push.apply(keys, symbols);
59
+ }
60
+ return keys;
61
+ }
62
+ function _object_spread_props(target, source) {
63
+ source = source != null ? source : {};
64
+ if (Object.getOwnPropertyDescriptors) {
65
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
66
+ } else {
67
+ ownKeys(Object(source)).forEach(function(key) {
68
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
69
+ });
70
+ }
71
+ return target;
72
+ }
73
+ function _to_array(arr) {
74
+ return _array_with_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_rest();
75
+ }
76
+ function _to_consumable_array(arr) {
77
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
78
+ }
79
+ function _unsupported_iterable_to_array(o, minLen) {
80
+ if (!o) return;
81
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
82
+ var n = Object.prototype.toString.call(o).slice(8, -1);
83
+ if (n === "Object" && o.constructor) n = o.constructor.name;
84
+ if (n === "Map" || n === "Set") return Array.from(n);
85
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
86
+ }
87
+ import { instanceTs } from "../lwm2m/instanceTs.js";
88
+ import { timestampResources } from "../lwm2m/timestampResources.js";
89
+ import { definitions } from "../lwm2m/definitions.js";
90
+ import { ResourceType } from "../lwm2m/LWM2MObjectInfo.js";
91
+ /**
92
+ * Convert LwM2M Object Instances to senML
93
+ */ export var lwm2mToSenML = function(lwm2m) {
94
+ return lwm2m.map(asSenML).flat().filter(function(v) {
95
+ return v !== null;
96
+ });
97
+ };
98
+ var asSenML = function(lwm2m) {
99
+ var def = definitions[lwm2m.ObjectID];
100
+ var i = instanceTs(lwm2m);
101
+ var tsResourceId = timestampResources[lwm2m.ObjectID]// All registered objects must have a timestamp resource
102
+ ;
103
+ var _Object_entries_filter = _to_array(Object.entries(_object_spread_props(_object_spread({}, lwm2m.Resources), _define_property({}, tsResourceId, undefined)))// Filter out undefined values (and timestamp resource)
104
+ .filter(function(r) {
105
+ return r[1] !== undefined;
106
+ })), first = _Object_entries_filter[0], rest = _Object_entries_filter.slice(1);
107
+ if (first === undefined) return null;
108
+ var _lwm2m_ObjectInstanceID;
109
+ var _obj;
110
+ return [
111
+ (_obj = {
112
+ bn: "/".concat(lwm2m.ObjectID, "/").concat((_lwm2m_ObjectInstanceID = lwm2m.ObjectInstanceID) !== null && _lwm2m_ObjectInstanceID !== void 0 ? _lwm2m_ObjectInstanceID : 0, "/"),
113
+ n: first[0]
114
+ }, _define_property(_obj, toKey(def, parseInt(first[0], 10)), first[1]), _define_property(_obj, "bt", i.getTime()), _obj)
115
+ ].concat(_to_consumable_array(rest.map(function(r) {
116
+ return _define_property({
117
+ n: r[0]
118
+ }, toKey(def, parseInt(r[0], 10)), r[1]);
119
+ })));
120
+ };
121
+ var toKey = function(def, resourceId) {
122
+ var _def_Resources_resourceId;
123
+ switch((_def_Resources_resourceId = def.Resources[resourceId]) === null || _def_Resources_resourceId === void 0 ? void 0 : _def_Resources_resourceId.Type){
124
+ case ResourceType.String:
125
+ return "vs";
126
+ case ResourceType.Boolean:
127
+ return "vb";
128
+ case ResourceType.Float:
129
+ case ResourceType.Integer:
130
+ case ResourceType.Time:
131
+ return "v";
132
+ case ResourceType.Opaque:
133
+ return "vd";
134
+ default:
135
+ throw new Error("Unknown ResourceID ".concat(resourceId, " for LwM2M Object ").concat(def.ObjectID, "!"));
136
+ }
137
+ };
@@ -0,0 +1,104 @@
1
+ import { it, describe } from "node:test";
2
+ import { LwM2MObjectID } from "../lwm2m/LwM2MObjectID.js";
3
+ import assert from "node:assert/strict";
4
+ import { lwm2mToSenML } from "./lwm2mToSenML.js";
5
+ void describe("lwm2mToSenML()", function() {
6
+ void it("should convert LwM2M to SenML", function() {
7
+ var location = {
8
+ ObjectID: LwM2MObjectID.Geolocation_14201,
9
+ ObjectVersion: "1.0",
10
+ Resources: {
11
+ "0": 62.469414,
12
+ "1": 6.151946,
13
+ "6": "Fixed",
14
+ "3": 1,
15
+ "99": new Date(1710147413003)
16
+ }
17
+ };
18
+ var level1 = {
19
+ ObjectID: LwM2MObjectID.SeaWaterLevel_14230,
20
+ ObjectVersion: "1.0",
21
+ Resources: {
22
+ "0": 84.3,
23
+ "1": "AES",
24
+ "99": new Date(1710140400000)
25
+ }
26
+ };
27
+ var level2 = {
28
+ ObjectID: LwM2MObjectID.SeaWaterLevel_14230,
29
+ ObjectVersion: "1.0",
30
+ Resources: {
31
+ "0": 140.4,
32
+ "1": "AES",
33
+ "99": new Date(1710144000000)
34
+ }
35
+ };
36
+ var level3 = {
37
+ ObjectID: LwM2MObjectID.SeaWaterLevel_14230,
38
+ ObjectVersion: "1.0",
39
+ ObjectInstanceID: 1,
40
+ Resources: {
41
+ "0": 140.7,
42
+ "1": "AES",
43
+ "99": new Date(1710144001000)
44
+ }
45
+ };
46
+ var lwm2m = [
47
+ location,
48
+ level1,
49
+ level2,
50
+ level3
51
+ ];
52
+ var expected = [
53
+ {
54
+ bn: "/14201/0/",
55
+ n: "0",
56
+ v: 62.469414,
57
+ bt: 1710147413003
58
+ },
59
+ {
60
+ n: "1",
61
+ v: 6.151946
62
+ },
63
+ {
64
+ n: "3",
65
+ v: 1
66
+ },
67
+ {
68
+ n: "6",
69
+ vs: "Fixed"
70
+ },
71
+ {
72
+ bn: "/14230/0/",
73
+ n: "0",
74
+ v: 84.3,
75
+ bt: 1710140400000
76
+ },
77
+ {
78
+ n: "1",
79
+ vs: "AES"
80
+ },
81
+ {
82
+ bn: "/14230/0/",
83
+ n: "0",
84
+ v: 140.4,
85
+ bt: 1710144000000
86
+ },
87
+ {
88
+ n: "1",
89
+ vs: "AES"
90
+ },
91
+ {
92
+ bn: "/14230/1/",
93
+ n: "0",
94
+ v: 140.7,
95
+ bt: 1710144001000
96
+ },
97
+ {
98
+ n: "1",
99
+ vs: "AES"
100
+ }
101
+ ];
102
+ assert.deepEqual(lwm2mToSenML(lwm2m), expected);
103
+ });
104
+ });
@@ -0,0 +1,58 @@
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 _iterable_to_array_limit(arr, i) {
10
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
11
+ if (_i == null) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _s, _e;
16
+ try {
17
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
18
+ _arr.push(_s.value);
19
+ if (i && _arr.length === i) break;
20
+ }
21
+ } catch (err) {
22
+ _d = true;
23
+ _e = err;
24
+ } finally{
25
+ try {
26
+ if (!_n && _i["return"] != null) _i["return"]();
27
+ } finally{
28
+ if (_d) throw _e;
29
+ }
30
+ }
31
+ return _arr;
32
+ }
33
+ function _non_iterable_rest() {
34
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
35
+ }
36
+ function _sliced_to_array(arr, i) {
37
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
38
+ }
39
+ function _unsupported_iterable_to_array(o, minLen) {
40
+ if (!o) return;
41
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
42
+ var n = Object.prototype.toString.call(o).slice(8, -1);
43
+ if (n === "Object" && o.constructor) n = o.constructor.name;
44
+ if (n === "Map" || n === "Set") return Array.from(n);
45
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
46
+ }
47
+ export var parseResourceId = function(resourceId) {
48
+ if (!/^\/\d+\/\d+\/\d+\/\d+$/.test(resourceId)) return null;
49
+ var _resourceId_slice_split_map = _sliced_to_array(resourceId.slice(1).split("/").map(function(s) {
50
+ return parseInt(s, 10);
51
+ }), 4), ObjectID = _resourceId_slice_split_map[0], ObjectInstanceID = _resourceId_slice_split_map[1], ResourceID = _resourceId_slice_split_map[2], ResourceInstanceId = _resourceId_slice_split_map[3];
52
+ return {
53
+ ObjectID: ObjectID,
54
+ ObjectInstanceID: ObjectInstanceID,
55
+ ResourceID: ResourceID,
56
+ ResourceInstanceId: ResourceInstanceId
57
+ };
58
+ };