@hello.nrfcloud.com/proto-map 5.6.3 → 6.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 (42) hide show
  1. package/README.md +0 -16
  2. package/dist/generator/generateModels.js +0 -85
  3. package/dist/generator/models.js +1 -83
  4. package/dist/markdown/getCodeBlock.js +0 -26
  5. package/dist/models/check-model-rules.js +1 -91
  6. package/dist/models/models.js +5 -114
  7. package/dist/models/types.js +0 -12
  8. package/models/README.md +0 -4
  9. package/models/check-model-rules.ts +1 -90
  10. package/models/models.ts +1 -8
  11. package/models/types.ts +0 -16
  12. package/package.json +2 -3
  13. package/dist/generator/isDir.js +0 -163
  14. package/dist/generator/isDir.spec.js +0 -212
  15. package/dist/markdown/getFrontMatter.js +0 -15
  16. package/dist/models/asset_tracker_v2+AWS/examples/examples.spec.js +0 -489
  17. package/models/PCA20035+solar/README.md +0 -10
  18. package/models/PCA20035+solar/transforms/airQuality.md +0 -48
  19. package/models/PCA20035+solar/transforms/battery.md +0 -46
  20. package/models/PCA20035+solar/transforms/button.md +0 -45
  21. package/models/PCA20035+solar/transforms/deviceInfo.md +0 -72
  22. package/models/PCA20035+solar/transforms/gain.md +0 -45
  23. package/models/PCA20035+solar/transforms/geolocationFromGroundfix.md +0 -67
  24. package/models/PCA20035+solar/transforms/geolocationFromMessage.md +0 -80
  25. package/models/PCA20035+solar/transforms/humidity.md +0 -43
  26. package/models/PCA20035+solar/transforms/networkInfo.md +0 -84
  27. package/models/PCA20035+solar/transforms/pressure.md +0 -43
  28. package/models/PCA20035+solar/transforms/temperature.md +0 -43
  29. package/models/asset_tracker_v2+AWS/README.md +0 -6
  30. package/models/asset_tracker_v2+AWS/examples/examples.spec.ts +0 -229
  31. package/models/asset_tracker_v2+AWS/examples/shadow/example-1.json +0 -24
  32. package/models/asset_tracker_v2+AWS/examples/shadow/example-2.json +0 -30
  33. package/models/asset_tracker_v2+AWS/examples/shadow/example-3.json +0 -37
  34. package/models/asset_tracker_v2+AWS/examples/shadow/example-4.json +0 -48
  35. package/models/asset_tracker_v2+AWS/examples/shadow/example-5.json +0 -43
  36. package/models/asset_tracker_v2+AWS/transforms/GNSS.md +0 -66
  37. package/models/asset_tracker_v2+AWS/transforms/battery-voltage.md +0 -50
  38. package/models/asset_tracker_v2+AWS/transforms/device-info.md +0 -61
  39. package/models/asset_tracker_v2+AWS/transforms/env.md +0 -69
  40. package/models/asset_tracker_v2+AWS/transforms/fuel-gauge.md +0 -62
  41. package/models/asset_tracker_v2+AWS/transforms/roam.md +0 -100
  42. package/models/asset_tracker_v2+AWS/transforms/solar.md +0 -58
@@ -1,15 +1,8 @@
1
1
  import chalk from 'chalk'
2
- import jsonata from 'jsonata'
3
2
  import assert from 'node:assert/strict'
4
3
  import { readFile, readdir, stat } from 'node:fs/promises'
5
4
  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'
5
+ import { ModelIDRegExp } from './types.js'
13
6
  import { parseREADME } from 'markdown/parseREADME.js'
14
7
 
15
8
  console.log(chalk.gray('Models rules check'))
@@ -40,86 +33,4 @@ for (const model of await readdir(modelsDir)) {
40
33
  throw new Error(`README is not valid for ${model}!`)
41
34
  }
42
35
  console.log(chalk.green('✔'), chalk.gray(`README.md is valid`))
43
-
44
- // Validate jsonata expressions
45
- let hasTransforms = false
46
- const transformsFolder = path.join(modelDir, 'transforms')
47
- try {
48
- await stat(transformsFolder)
49
- hasTransforms = true
50
- console.log(' ', chalk.gray('Transforms:'))
51
- } catch {
52
- console.log(' ', chalk.gray('No transforms found.'))
53
- }
54
- if (hasTransforms) {
55
- for (const transform of (await readdir(transformsFolder)).filter((f) =>
56
- f.endsWith('.md'),
57
- )) {
58
- console.log(' ', chalk.white('·'), chalk.white.bold(transform))
59
- const markdown = await readFile(
60
- path.join(modelDir, 'transforms', transform),
61
- 'utf-8',
62
- )
63
-
64
- // Validate front-matter
65
- const type = getFrontMatter(markdown, FrontMatter).type
66
- console.log(' ', chalk.green('✔'), chalk.gray(`Type ${type} is valid`))
67
- const findBlock = getCodeBlock(markdown)
68
- const matchExpression = findBlock('jsonata', 'Match Expression')
69
- const transformExpression = findBlock('jsonata', 'Transform Expression')
70
- const inputExample = JSON.parse(findBlock('json', 'Input Example'))
71
- const resultExample = JSON.parse(findBlock('json', 'Result Example'))
72
-
73
- const selectResult = await jsonata(matchExpression).evaluate(inputExample)
74
- if (selectResult !== true) {
75
- throw new Error(
76
- `The select expression did not evaluate to true with the given example.`,
77
- )
78
- }
79
- console.log(
80
- ' ',
81
- chalk.green('✔'),
82
- chalk.gray('Select expression evaluated to true for the example input'),
83
- )
84
-
85
- const transformResult = await jsonata(
86
- // For testing purposes this function call result is hardcoded
87
- transformExpression.replace('$millis()', '1699999999999'),
88
- ).evaluate(inputExample)
89
-
90
- const maybeValidSenML = validateSenML(transformResult.filter(hasValue))
91
- if ('errors' in maybeValidSenML) {
92
- console.error(maybeValidSenML.errors)
93
- throw new Error('The JSONata expression must produce valid SenML')
94
- }
95
-
96
- assert.deepEqual(maybeValidSenML.value, resultExample)
97
- console.log(
98
- ' ',
99
- chalk.green('✔'),
100
- chalk.gray('Transformation result is valid SenML'),
101
- )
102
-
103
- assert.deepEqual(maybeValidSenML.value, resultExample)
104
- console.log(
105
- ' ',
106
- chalk.green('✔'),
107
- chalk.gray('The transformation result matches the example'),
108
- )
109
-
110
- // Validate
111
- for (const object of senMLtoLwM2M(maybeValidSenML.value)) {
112
- if (!isRegisteredLwM2MObject(object, console.error)) {
113
- throw new Error(
114
- 'The LwM2M object must follow LwM2M schema definition',
115
- )
116
- }
117
- console.log(
118
- ' ',
119
- chalk.green('✔'),
120
- chalk.gray('SenML object is valid LwM2M'),
121
- )
122
- }
123
- }
124
- }
125
36
  }
package/models/models.ts CHANGED
@@ -1,10 +1,7 @@
1
- import { type Transform, TransformType } from "./types.js";
2
1
  /**
3
2
  * The Model IDs defined in this repo.
4
3
  */
5
4
  export enum ModelID {
6
- PCA20035_solar = "PCA20035+solar",
7
- Asset_tracker_v2_AWS = "asset_tracker_v2+AWS",
8
5
  Kartverket_vasstandsdata = "kartverket-vasstandsdata"
9
6
  }
10
7
  export type Model = {
@@ -12,10 +9,6 @@ export type Model = {
12
9
  * The Model ID
13
10
  */
14
11
  "id": ModelID;
15
- /**
16
- * The transforms defined for this model.
17
- */
18
- "transforms": Array<Transform>;
19
12
  /**
20
13
  * Description of the Model from the README.md
21
14
  */
@@ -33,4 +26,4 @@ export type Model = {
33
26
  /**
34
27
  * The models defined for hello.nrfcloud.com
35
28
  */
36
- export const models: Readonly<Record<ModelID, Model>> = { [ModelID.PCA20035_solar]: { "id": ModelID.PCA20035_solar, "transforms": [{ "type": TransformType.Messages, "match": "appId = 'AIR_QUAL'", "transform": "[\n {\"bn\": \"14205/0/\", \"n\": \"10\", \"v\": $number(data), \"bt\": ts }\n]" }, { "type": TransformType.Messages, "match": "appId = 'BATTERY'", "transform": "[\n {\"bn\": \"14202/0/\", \"n\": \"0\", \"v\": $number(data), \"bt\": ts }\n]" }, { "type": TransformType.Messages, "match": "appId = 'BUTTON'", "transform": "[\n {\"bn\": \"14220/0/\", \"n\": \"0\", \"v\": $number(data), \"bt\": ts }\n]" }, { "type": TransformType.Messages, "match": "appId = 'DEVICE' and $exists(data.deviceInfo)", "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]" }, { "type": TransformType.Messages, "match": "appId = 'SOLAR'", "transform": "[\n {\"bn\": \"14210/0/\", \"n\": \"0\", \"v\": $number(data), \"bt\": ts }\n]" }, { "type": TransformType.Messages, "match": "appId = 'GROUND_FIX' and $exists(data.lat) and $exists(data.lon) and $exists(data.uncertainty) and $exists(data.fulfilledWith)", "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]" }, { "type": TransformType.Messages, "match": "appId = 'GNSS'", "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]" }, { "type": TransformType.Messages, "match": "appId = 'HUMID'", "transform": "[\n {\"bn\": \"14205/0/\", \"n\": \"1\", \"v\": $number(data), \"bt\": ts }\n]" }, { "type": TransformType.Messages, "match": "appId = 'DEVICE' and $exists(data.networkInfo)", "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]" }, { "type": TransformType.Messages, "match": "appId = 'AIR_PRESS'", "transform": "[\n {\"bn\": \"14205/0/\", \"n\": \"2\", \"v\": $number(data)*10, \"bt\": ts }\n]" }, { "type": TransformType.Messages, "match": "appId = 'TEMP'", "transform": "[\n {\"bn\": \"14205/0/\", \"n\": \"0\", \"v\": $number(data), \"bt\": ts }\n]" }], "about": { "title": "Thingy:91 with Solar Shield", "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.\u200B\nThe Thingy:91 runs the asset_tracker_v2 application and sends messages to nRF Cloud using MQTT." } }, [ModelID.Asset_tracker_v2_AWS]: { "id": ModelID.Asset_tracker_v2_AWS, "transforms": [{ "type": TransformType.Shadow, "match": "$exists(state.reported.gnss)", "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]" }, { "type": TransformType.Shadow, "match": "$exists(state.reported.bat)", "transform": "[\n {\"bn\": \"14202/0/\", \"n\": \"1\", \"v\": state.reported.bat.v/1000, \"bt\": state.reported.bat.ts }\n]" }, { "type": TransformType.Shadow, "match": "$exists(state.reported.dev)", "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]" }, { "type": TransformType.Shadow, "match": "$exists(state.reported.env)", "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]" }, { "type": TransformType.Shadow, "match": "$exists(state.reported.fg)", "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]" }, { "type": TransformType.Shadow, "match": "$exists(state.reported.roam)", "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]" }, { "type": TransformType.Shadow, "match": "$exists(state.reported.sol)", "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]" }], "about": { "title": "asset_tracker_v2 on AWS", "description": "This implements the conversion for the asset_tracker_v2 message protocol when connected to AWS IoT." } }, [ModelID.Kartverket_vasstandsdata]: { "id": ModelID.Kartverket_vasstandsdata, "transforms": [], "about": { "title": "Kartverket Vasstandsdata", "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\u2019s under the Creative Commons Attribution 4.0 International (CC BY 4.0) license." } } } as const;
29
+ export const models: Readonly<Record<ModelID, Model>> = { [ModelID.Kartverket_vasstandsdata]: { "id": ModelID.Kartverket_vasstandsdata, "about": { "title": "Kartverket Vasstandsdata", "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\u2019s under the Creative Commons Attribution 4.0 International (CC BY 4.0) license." } } } as const;
package/models/types.ts CHANGED
@@ -1,17 +1 @@
1
- import { Type } from '@sinclair/typebox'
2
-
3
1
  export const ModelIDRegExp = /^[A-Za-z0-9+_-]+$/
4
-
5
- export enum TransformType {
6
- Shadow = 'shadow',
7
- Messages = 'messages',
8
- }
9
- export type Transform = {
10
- type: TransformType
11
- match: string
12
- transform: string
13
- }
14
-
15
- export const FrontMatter = Type.Object({
16
- type: Type.Union([Type.Literal('shadow'), Type.Literal('messages')]),
17
- })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hello.nrfcloud.com/proto-map",
3
- "version": "5.6.3",
3
+ "version": "6.0.0",
4
4
  "description": "Documents the communication protocol between devices, the hello.nrfcloud.com/map backend and web application",
5
5
  "type": "module",
6
6
  "exports": {
@@ -105,7 +105,6 @@
105
105
  ],
106
106
  "peerDependencies": {
107
107
  "@sinclair/typebox": "^0.32.22",
108
- "ajv": "^8.12.0",
109
- "jsonata": "^2.0.4"
108
+ "ajv": "^8.12.0"
110
109
  }
111
110
  }
@@ -1,163 +0,0 @@
1
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
- try {
3
- var info = gen[key](arg);
4
- var value = info.value;
5
- } catch (error) {
6
- reject(error);
7
- return;
8
- }
9
- if (info.done) {
10
- resolve(value);
11
- } else {
12
- Promise.resolve(value).then(_next, _throw);
13
- }
14
- }
15
- function _async_to_generator(fn) {
16
- return function() {
17
- var self = this, args = arguments;
18
- return new Promise(function(resolve, reject) {
19
- var gen = fn.apply(self, args);
20
- function _next(value) {
21
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
- }
23
- function _throw(err) {
24
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
- }
26
- _next(undefined);
27
- });
28
- };
29
- }
30
- function _ts_generator(thisArg, body) {
31
- var f, y, t, g, _ = {
32
- label: 0,
33
- sent: function() {
34
- if (t[0] & 1) throw t[1];
35
- return t[1];
36
- },
37
- trys: [],
38
- ops: []
39
- };
40
- return g = {
41
- next: verb(0),
42
- "throw": verb(1),
43
- "return": verb(2)
44
- }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
45
- return this;
46
- }), g;
47
- function verb(n) {
48
- return function(v) {
49
- return step([
50
- n,
51
- v
52
- ]);
53
- };
54
- }
55
- function step(op) {
56
- if (f) throw new TypeError("Generator is already executing.");
57
- while(_)try {
58
- 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;
59
- if (y = 0, t) op = [
60
- op[0] & 2,
61
- t.value
62
- ];
63
- switch(op[0]){
64
- case 0:
65
- case 1:
66
- t = op;
67
- break;
68
- case 4:
69
- _.label++;
70
- return {
71
- value: op[1],
72
- done: false
73
- };
74
- case 5:
75
- _.label++;
76
- y = op[1];
77
- op = [
78
- 0
79
- ];
80
- continue;
81
- case 7:
82
- op = _.ops.pop();
83
- _.trys.pop();
84
- continue;
85
- default:
86
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
87
- _ = 0;
88
- continue;
89
- }
90
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
91
- _.label = op[1];
92
- break;
93
- }
94
- if (op[0] === 6 && _.label < t[1]) {
95
- _.label = t[1];
96
- t = op;
97
- break;
98
- }
99
- if (t && _.label < t[2]) {
100
- _.label = t[2];
101
- _.ops.push(op);
102
- break;
103
- }
104
- if (t[2]) _.ops.pop();
105
- _.trys.pop();
106
- continue;
107
- }
108
- op = body.call(thisArg, _);
109
- } catch (e) {
110
- op = [
111
- 6,
112
- e
113
- ];
114
- y = 0;
115
- } finally{
116
- f = t = 0;
117
- }
118
- if (op[0] & 5) throw op[1];
119
- return {
120
- value: op[0] ? op[1] : void 0,
121
- done: true
122
- };
123
- }
124
- }
125
- import { stat } from 'node:fs/promises';
126
- export var isDir = function() {
127
- var _ref = _async_to_generator(function(path) {
128
- var e;
129
- return _ts_generator(this, function(_state) {
130
- switch(_state.label){
131
- case 0:
132
- _state.trys.push([
133
- 0,
134
- 2,
135
- ,
136
- 3
137
- ]);
138
- return [
139
- 4,
140
- stat(path)
141
- ];
142
- case 1:
143
- return [
144
- 2,
145
- _state.sent().isDirectory()
146
- ];
147
- case 2:
148
- e = _state.sent();
149
- return [
150
- 2,
151
- false
152
- ];
153
- case 3:
154
- return [
155
- 2
156
- ];
157
- }
158
- });
159
- });
160
- return function isDir(path) {
161
- return _ref.apply(this, arguments);
162
- };
163
- }();
@@ -1,212 +0,0 @@
1
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
- try {
3
- var info = gen[key](arg);
4
- var value = info.value;
5
- } catch (error) {
6
- reject(error);
7
- return;
8
- }
9
- if (info.done) {
10
- resolve(value);
11
- } else {
12
- Promise.resolve(value).then(_next, _throw);
13
- }
14
- }
15
- function _async_to_generator(fn) {
16
- return function() {
17
- var self = this, args = arguments;
18
- return new Promise(function(resolve, reject) {
19
- var gen = fn.apply(self, args);
20
- function _next(value) {
21
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
- }
23
- function _throw(err) {
24
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
- }
26
- _next(undefined);
27
- });
28
- };
29
- }
30
- function _ts_generator(thisArg, body) {
31
- var f, y, t, g, _ = {
32
- label: 0,
33
- sent: function() {
34
- if (t[0] & 1) throw t[1];
35
- return t[1];
36
- },
37
- trys: [],
38
- ops: []
39
- };
40
- return g = {
41
- next: verb(0),
42
- "throw": verb(1),
43
- "return": verb(2)
44
- }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
45
- return this;
46
- }), g;
47
- function verb(n) {
48
- return function(v) {
49
- return step([
50
- n,
51
- v
52
- ]);
53
- };
54
- }
55
- function step(op) {
56
- if (f) throw new TypeError("Generator is already executing.");
57
- while(_)try {
58
- 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;
59
- if (y = 0, t) op = [
60
- op[0] & 2,
61
- t.value
62
- ];
63
- switch(op[0]){
64
- case 0:
65
- case 1:
66
- t = op;
67
- break;
68
- case 4:
69
- _.label++;
70
- return {
71
- value: op[1],
72
- done: false
73
- };
74
- case 5:
75
- _.label++;
76
- y = op[1];
77
- op = [
78
- 0
79
- ];
80
- continue;
81
- case 7:
82
- op = _.ops.pop();
83
- _.trys.pop();
84
- continue;
85
- default:
86
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
87
- _ = 0;
88
- continue;
89
- }
90
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
91
- _.label = op[1];
92
- break;
93
- }
94
- if (op[0] === 6 && _.label < t[1]) {
95
- _.label = t[1];
96
- t = op;
97
- break;
98
- }
99
- if (t && _.label < t[2]) {
100
- _.label = t[2];
101
- _.ops.push(op);
102
- break;
103
- }
104
- if (t[2]) _.ops.pop();
105
- _.trys.pop();
106
- continue;
107
- }
108
- op = body.call(thisArg, _);
109
- } catch (e) {
110
- op = [
111
- 6,
112
- e
113
- ];
114
- y = 0;
115
- } finally{
116
- f = t = 0;
117
- }
118
- if (op[0] & 5) throw op[1];
119
- return {
120
- value: op[0] ? op[1] : void 0,
121
- done: true
122
- };
123
- }
124
- }
125
- import { isDir } from './isDir.js';
126
- import { describe, it, before } from 'node:test';
127
- import assert from 'node:assert/strict';
128
- import os from 'node:os';
129
- import { mkdtemp } from 'node:fs/promises';
130
- import path from 'node:path';
131
- void describe('isDir()', function() {
132
- var dir;
133
- void before(/*#__PURE__*/ _async_to_generator(function() {
134
- return _ts_generator(this, function(_state) {
135
- switch(_state.label){
136
- case 0:
137
- return [
138
- 4,
139
- mkdtemp(path.join(os.tmpdir(), 'isdir-'))
140
- ];
141
- case 1:
142
- dir = _state.sent();
143
- return [
144
- 2
145
- ];
146
- }
147
- });
148
- }));
149
- void it('should return true if the path is a directory', /*#__PURE__*/ _async_to_generator(function() {
150
- var _;
151
- return _ts_generator(this, function(_state) {
152
- switch(_state.label){
153
- case 0:
154
- _ = assert.strictEqual;
155
- return [
156
- 4,
157
- isDir(dir)
158
- ];
159
- case 1:
160
- return [
161
- 2,
162
- _.apply(assert, [
163
- _state.sent(),
164
- true
165
- ])
166
- ];
167
- }
168
- });
169
- }));
170
- void it('should return false if the path is not a directory', /*#__PURE__*/ _async_to_generator(function() {
171
- var _;
172
- return _ts_generator(this, function(_state) {
173
- switch(_state.label){
174
- case 0:
175
- _ = assert.strictEqual;
176
- return [
177
- 4,
178
- isDir(path.join(dir, 'foo.txt'))
179
- ];
180
- case 1:
181
- return [
182
- 2,
183
- _.apply(assert, [
184
- _state.sent(),
185
- false
186
- ])
187
- ];
188
- }
189
- });
190
- }));
191
- void it('should return false if an error occurs', /*#__PURE__*/ _async_to_generator(function() {
192
- var _;
193
- return _ts_generator(this, function(_state) {
194
- switch(_state.label){
195
- case 0:
196
- _ = assert.strictEqual;
197
- return [
198
- 4,
199
- isDir(path.join(dir, 'foo'))
200
- ];
201
- case 1:
202
- return [
203
- 2,
204
- _.apply(assert, [
205
- _state.sent(),
206
- false
207
- ])
208
- ];
209
- }
210
- });
211
- }));
212
- });
@@ -1,15 +0,0 @@
1
- import { remark } from 'remark';
2
- import frontmatter from 'remark-frontmatter';
3
- import { validate } from '../validate.js';
4
- import yaml from 'yaml';
5
- export var getFrontMatter = function(markdown, schema) {
6
- var data = yaml.parse(remark().use(frontmatter, [
7
- 'yaml'
8
- ]).parse(markdown).children[0].value);
9
- var maybeValid = validate(schema)(data);
10
- if ('errors' in maybeValid) {
11
- console.error(maybeValid.errors);
12
- throw new Error("Frontmatter is not valid!");
13
- }
14
- return maybeValid.value;
15
- };