@hestia-earth/utils 0.17.15 → 0.17.16
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/dist/esm/array.d.ts +20 -0
- package/dist/esm/array.js +49 -0
- package/dist/esm/bin/bin-validate-terms.d.ts +2 -0
- package/dist/esm/bin/bin-validate-terms.js +14 -0
- package/dist/esm/boolean.d.ts +1 -0
- package/dist/esm/boolean.js +3 -0
- package/dist/esm/date.d.ts +59 -0
- package/dist/esm/date.js +108 -0
- package/dist/esm/delta.d.ts +32 -0
- package/dist/esm/delta.js +78 -0
- package/dist/esm/form.d.ts +1 -0
- package/dist/esm/form.js +18 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/number.d.ts +89 -0
- package/dist/esm/number.js +218 -0
- package/dist/esm/string.d.ts +55 -0
- package/dist/esm/string.js +117 -0
- package/dist/esm/term.d.ts +21 -0
- package/dist/esm/term.js +52 -0
- package/dist/esm/utils.d.ts +5 -0
- package/dist/esm/utils.js +58 -0
- package/dist/esm/validate-terms.d.ts +13 -0
- package/dist/esm/validate-terms.js +267 -0
- package/dist/validate-terms.js +1 -1
- package/package.json +11 -2
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
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;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
38
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
39
|
+
if (!m) return o;
|
|
40
|
+
var i = m.call(o), r, ar = [], e;
|
|
41
|
+
try {
|
|
42
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
43
|
+
}
|
|
44
|
+
catch (error) { e = { error: error }; }
|
|
45
|
+
finally {
|
|
46
|
+
try {
|
|
47
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
48
|
+
}
|
|
49
|
+
finally { if (e) throw e.error; }
|
|
50
|
+
}
|
|
51
|
+
return ar;
|
|
52
|
+
};
|
|
53
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
54
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
55
|
+
if (ar || !(i in from)) {
|
|
56
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
57
|
+
ar[i] = from[i];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
61
|
+
};
|
|
62
|
+
import { promises } from 'fs';
|
|
63
|
+
import { join } from 'path';
|
|
64
|
+
import { request } from 'https';
|
|
65
|
+
import { unique } from './array';
|
|
66
|
+
var API_URL = process.env.API_URL || 'https://api.hestia.earth';
|
|
67
|
+
var _a = __read(process.argv.slice(2), 2), folder = _a[0], extension = _a[1];
|
|
68
|
+
var readdir = promises.readdir, lstat = promises.lstat, readFile = promises.readFile;
|
|
69
|
+
var encoding = 'utf8';
|
|
70
|
+
var Term = /** @class */ (function () {
|
|
71
|
+
function Term() {
|
|
72
|
+
}
|
|
73
|
+
return Term;
|
|
74
|
+
}());
|
|
75
|
+
var search = function (body) {
|
|
76
|
+
return new Promise(function (resolve, reject) {
|
|
77
|
+
var req = request("".concat(API_URL, "/terms/search"), {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: { 'Content-Type': 'application/json' }
|
|
80
|
+
}, function (res) {
|
|
81
|
+
res.setEncoding(encoding);
|
|
82
|
+
var data = [];
|
|
83
|
+
res.on('data', function (chunk) { return data.push(chunk); });
|
|
84
|
+
res.on('end', function () { return resolve(JSON.parse(data.join(''))); });
|
|
85
|
+
res.on('error', reject);
|
|
86
|
+
});
|
|
87
|
+
req.write(JSON.stringify(body));
|
|
88
|
+
req.end();
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
var recursiveFiles = function (directory) { return __awaiter(void 0, void 0, void 0, function () {
|
|
92
|
+
var _a, _b;
|
|
93
|
+
return __generator(this, function (_c) {
|
|
94
|
+
switch (_c.label) {
|
|
95
|
+
case 0:
|
|
96
|
+
_b = (_a = Promise).all;
|
|
97
|
+
return [4 /*yield*/, readdir(directory)];
|
|
98
|
+
case 1: return [4 /*yield*/, _b.apply(_a, [(_c.sent()).map(function (entry) { return __awaiter(void 0, void 0, void 0, function () {
|
|
99
|
+
var _a;
|
|
100
|
+
return __generator(this, function (_b) {
|
|
101
|
+
switch (_b.label) {
|
|
102
|
+
case 0: return [4 /*yield*/, lstat(join(directory, entry))];
|
|
103
|
+
case 1:
|
|
104
|
+
if (!(_b.sent()).isDirectory()) return [3 /*break*/, 3];
|
|
105
|
+
return [4 /*yield*/, recursiveFiles(join(directory, entry))];
|
|
106
|
+
case 2:
|
|
107
|
+
_a = _b.sent();
|
|
108
|
+
return [3 /*break*/, 4];
|
|
109
|
+
case 3:
|
|
110
|
+
_a = join(directory, entry).endsWith(".".concat(extension || 'jsonld'))
|
|
111
|
+
? [join(directory, entry)]
|
|
112
|
+
: [];
|
|
113
|
+
_b.label = 4;
|
|
114
|
+
case 4: return [2 /*return*/, _a];
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}); })])];
|
|
118
|
+
case 2: return [2 /*return*/, (_c.sent()).flat()];
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}); };
|
|
122
|
+
var getAllTerms = function (data) {
|
|
123
|
+
return Object.keys(data)
|
|
124
|
+
.filter(function (key) { return Array.isArray(data[key]) || (typeof data[key] === 'object' && '@type' in data[key]); })
|
|
125
|
+
.flatMap(function (key) {
|
|
126
|
+
var value = data[key];
|
|
127
|
+
var isArray = Array.isArray(value);
|
|
128
|
+
return isArray ? value.flatMap(getAllTerms) : value['@type'] === 'Term' ? value : getAllTerms(value);
|
|
129
|
+
})
|
|
130
|
+
.filter(function (term) { return !!term && term['@type'] === 'Term' && (!!term['@id'] || !!term.name); });
|
|
131
|
+
};
|
|
132
|
+
// search is limited to 1000 parameters
|
|
133
|
+
var searchLimit = 500;
|
|
134
|
+
var searchTerms = function (terms) { return __awaiter(void 0, void 0, void 0, function () {
|
|
135
|
+
var searchedTerms, results, _a, _b, _c;
|
|
136
|
+
return __generator(this, function (_d) {
|
|
137
|
+
switch (_d.label) {
|
|
138
|
+
case 0:
|
|
139
|
+
searchedTerms = terms.slice(0, searchLimit);
|
|
140
|
+
if (!searchedTerms.length) return [3 /*break*/, 2];
|
|
141
|
+
return [4 /*yield*/, search({
|
|
142
|
+
limit: searchLimit,
|
|
143
|
+
fields: ['@id', 'name'],
|
|
144
|
+
query: {
|
|
145
|
+
bool: {
|
|
146
|
+
must: [
|
|
147
|
+
{
|
|
148
|
+
match: { '@type': 'Term' }
|
|
149
|
+
}
|
|
150
|
+
],
|
|
151
|
+
should: searchedTerms.map(function (_a) {
|
|
152
|
+
var id = _a["@id"], name = _a.name;
|
|
153
|
+
return ({
|
|
154
|
+
match: id ? { '@id.keyword': id } : { 'name.keyword': name }
|
|
155
|
+
});
|
|
156
|
+
}),
|
|
157
|
+
minimum_should_match: 1
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
})];
|
|
161
|
+
case 1:
|
|
162
|
+
_a = _d.sent();
|
|
163
|
+
return [3 /*break*/, 3];
|
|
164
|
+
case 2:
|
|
165
|
+
_a = { results: [] };
|
|
166
|
+
_d.label = 3;
|
|
167
|
+
case 3:
|
|
168
|
+
results = (_a).results;
|
|
169
|
+
_b = [__spreadArray([], __read(results), false)];
|
|
170
|
+
if (!(terms.length > searchLimit)) return [3 /*break*/, 5];
|
|
171
|
+
return [4 /*yield*/, searchTerms(terms.slice(searchLimit))];
|
|
172
|
+
case 4:
|
|
173
|
+
_c = _d.sent();
|
|
174
|
+
return [3 /*break*/, 6];
|
|
175
|
+
case 5:
|
|
176
|
+
_c = [];
|
|
177
|
+
_d.label = 6;
|
|
178
|
+
case 6: return [2 /*return*/, __spreadArray.apply(void 0, _b.concat([__read.apply(void 0, [(_c)]), false]))];
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}); };
|
|
182
|
+
/**
|
|
183
|
+
* Validate a list of Terms.
|
|
184
|
+
*
|
|
185
|
+
* @param terms The list of Terms to validate.
|
|
186
|
+
* @returns The list of ids/names that could not be found (invalid).
|
|
187
|
+
*/
|
|
188
|
+
export var validateTerms = function (terms) { return __awaiter(void 0, void 0, void 0, function () {
|
|
189
|
+
var results;
|
|
190
|
+
return __generator(this, function (_a) {
|
|
191
|
+
switch (_a.label) {
|
|
192
|
+
case 0: return [4 /*yield*/, searchTerms(terms)];
|
|
193
|
+
case 1:
|
|
194
|
+
results = _a.sent();
|
|
195
|
+
return [2 /*return*/, terms
|
|
196
|
+
.map(function (_a) {
|
|
197
|
+
var id = _a["@id"], name = _a.name;
|
|
198
|
+
var exists = results.find(function (res) { return res['@id'] === id || res.name === name; });
|
|
199
|
+
return exists ? true : id || name;
|
|
200
|
+
})
|
|
201
|
+
.filter(function (val) { return val !== true; })];
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}); };
|
|
205
|
+
var validateFile = function (existingTerms) {
|
|
206
|
+
return function (_a) {
|
|
207
|
+
var filepath = _a.filepath, terms = _a.terms;
|
|
208
|
+
return ({
|
|
209
|
+
filepath: filepath,
|
|
210
|
+
missing: terms
|
|
211
|
+
.map(function (_a) {
|
|
212
|
+
var id = _a["@id"], name = _a.name;
|
|
213
|
+
return existingTerms.find(function (res) { return res['@id'] === id || res.name === name; }) ? true : id || name;
|
|
214
|
+
})
|
|
215
|
+
.filter(function (val) { return val !== true; })
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
var loadFile = function (filepath) { return __awaiter(void 0, void 0, void 0, function () {
|
|
220
|
+
var _a, _b, _c;
|
|
221
|
+
var _d;
|
|
222
|
+
return __generator(this, function (_e) {
|
|
223
|
+
switch (_e.label) {
|
|
224
|
+
case 0:
|
|
225
|
+
_d = {
|
|
226
|
+
filepath: filepath
|
|
227
|
+
};
|
|
228
|
+
_a = getAllTerms;
|
|
229
|
+
_c = (_b = JSON).parse;
|
|
230
|
+
return [4 /*yield*/, readFile(filepath, encoding)];
|
|
231
|
+
case 1: return [2 /*return*/, (_d.terms = _a.apply(void 0, [_c.apply(_b, [_e.sent()])]),
|
|
232
|
+
_d)];
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}); };
|
|
236
|
+
export var run = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
237
|
+
var filepaths, fileData, allTerms, existingTerms, results, missingFiles;
|
|
238
|
+
return __generator(this, function (_a) {
|
|
239
|
+
switch (_a.label) {
|
|
240
|
+
case 0: return [4 /*yield*/, recursiveFiles(folder)];
|
|
241
|
+
case 1:
|
|
242
|
+
filepaths = _a.sent();
|
|
243
|
+
return [4 /*yield*/, Promise.all(filepaths.map(loadFile))];
|
|
244
|
+
case 2:
|
|
245
|
+
fileData = _a.sent();
|
|
246
|
+
allTerms = unique(fileData.flatMap(function (_a) {
|
|
247
|
+
var terms = _a.terms;
|
|
248
|
+
return terms;
|
|
249
|
+
}));
|
|
250
|
+
return [4 /*yield*/, searchTerms(allTerms)];
|
|
251
|
+
case 3:
|
|
252
|
+
existingTerms = _a.sent();
|
|
253
|
+
results = fileData.map(validateFile(existingTerms)).filter(Boolean);
|
|
254
|
+
missingFiles = results.filter(function (_a) {
|
|
255
|
+
var missing = _a.missing;
|
|
256
|
+
return missing.length;
|
|
257
|
+
});
|
|
258
|
+
if (missingFiles.length) {
|
|
259
|
+
throw new Error("\n Terms not found:\n \t".concat(missingFiles.map(function (_a) {
|
|
260
|
+
var filepath = _a.filepath, missing = _a.missing;
|
|
261
|
+
return "- ".concat(filepath, ": ").concat(missing.join(', '));
|
|
262
|
+
}).join('\n\t'), "\n ").trim());
|
|
263
|
+
}
|
|
264
|
+
return [2 /*return*/, filepaths];
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
}); };
|
package/dist/validate-terms.js
CHANGED
|
@@ -77,7 +77,7 @@ var Term = /** @class */ (function () {
|
|
|
77
77
|
}());
|
|
78
78
|
var search = function (body) {
|
|
79
79
|
return new Promise(function (resolve, reject) {
|
|
80
|
-
var req = (0, https_1.request)("".concat(API_URL, "/search"), {
|
|
80
|
+
var req = (0, https_1.request)("".concat(API_URL, "/terms/search"), {
|
|
81
81
|
method: 'POST',
|
|
82
82
|
headers: { 'Content-Type': 'application/json' }
|
|
83
83
|
}, function (res) {
|
package/package.json
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hestia-earth/utils",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.16",
|
|
4
4
|
"description": "HESTIA Utils library",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
6
7
|
"typings": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/esm/index.js",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"sideEffects": false,
|
|
7
16
|
"bin": {
|
|
8
17
|
"hestia-validate-terms": "dist/bin/bin-validate-terms.js"
|
|
9
18
|
},
|
|
10
19
|
"scripts": {
|
|
11
|
-
"build": "rm -rf dist && tsc -p tsconfig.dist.json",
|
|
20
|
+
"build": "rm -rf dist && tsc -p tsconfig.dist.json && tsc -p tsconfig.dist.esm.json",
|
|
12
21
|
"lint": "eslint \"src/**/*.ts\"",
|
|
13
22
|
"lint:fix": "npm run lint -- --fix",
|
|
14
23
|
"test": "jest",
|