@linkurious/ogma-linkurious-parser 3.1.13 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/captions/captions.js +42 -54
- package/dist/captions/captions.js.map +1 -1
- package/dist/filters/filters.d.ts +1 -1
- package/dist/filters/filters.js +55 -76
- package/dist/filters/filters.js.map +1 -1
- package/dist/index.js +34 -33
- package/dist/index.js.map +1 -1
- package/dist/ogma/features/OgmaStore.js +16 -30
- package/dist/ogma/features/OgmaStore.js.map +1 -1
- package/dist/ogma/features/captions.js +43 -87
- package/dist/ogma/features/captions.js.map +1 -1
- package/dist/ogma/features/reactive.js +58 -75
- package/dist/ogma/features/reactive.js.map +1 -1
- package/dist/ogma/features/selectors.d.ts +5 -5
- package/dist/ogma/features/selectors.js +25 -16
- package/dist/ogma/features/selectors.js.map +1 -1
- package/dist/ogma/features/styles.js +115 -137
- package/dist/ogma/features/styles.js.map +1 -1
- package/dist/ogma/features/transformations.js +39 -87
- package/dist/ogma/features/transformations.js.map +1 -1
- package/dist/ogma/index.js +140 -230
- package/dist/ogma/index.js.map +1 -1
- package/dist/styles/edgeAttributes.js +31 -47
- package/dist/styles/edgeAttributes.js.map +1 -1
- package/dist/styles/itemAttributes.js +33 -42
- package/dist/styles/itemAttributes.js.map +1 -1
- package/dist/styles/nodeAttributes.js +49 -71
- package/dist/styles/nodeAttributes.js.map +1 -1
- package/dist/styles/styleRule.js +57 -68
- package/dist/styles/styleRule.js.map +1 -1
- package/dist/styles/styleRules.js +150 -192
- package/dist/styles/styleRules.js.map +1 -1
- package/dist/tools/colorPalette.js +1 -0
- package/dist/tools/colorPalette.js.map +1 -1
- package/dist/tools/ogmaTool.js +28 -30
- package/dist/tools/ogmaTool.js.map +1 -1
- package/dist/tools/tools.js +88 -91
- package/dist/tools/tools.js.map +1 -1
- package/package.json +7 -7
package/dist/tools/tools.js
CHANGED
|
@@ -3,12 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
exports.Tools = exports.CAPTION_HEURISTIC = exports.sortBy = void 0;
|
|
7
|
+
const isEqual_1 = __importDefault(require("lodash/isEqual"));
|
|
8
|
+
const sortBy_1 = __importDefault(require("lodash/sortBy"));
|
|
8
9
|
exports.sortBy = sortBy_1.default;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const rest_client_1 = require("@linkurious/rest-client");
|
|
11
|
+
const URL_PATTERN = /([a-zA-Z][a-zA-Z0-9\+\-\.]*:\/\/[^\s]+)/i;
|
|
12
|
+
const IMAGE_PATTERN = /\S+\.(gif|jpe?g|tiff|png|bmp|svg)$/i;
|
|
12
13
|
exports.CAPTION_HEURISTIC = [
|
|
13
14
|
'label',
|
|
14
15
|
'Label',
|
|
@@ -18,35 +19,32 @@ exports.CAPTION_HEURISTIC = [
|
|
|
18
19
|
'Title',
|
|
19
20
|
'rdfs:label'
|
|
20
21
|
];
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
class Tools {
|
|
23
|
+
static isEqual(v1, v2) {
|
|
24
|
+
return (0, isEqual_1.default)(v1, v2);
|
|
23
25
|
}
|
|
24
|
-
Tools.isEqual = function (v1, v2) {
|
|
25
|
-
return isEqual_1.default(v1, v2);
|
|
26
|
-
};
|
|
27
26
|
/**
|
|
28
27
|
* Check that a value is defined : not null and not undefined
|
|
29
28
|
*
|
|
30
29
|
* @param {any} value
|
|
31
30
|
* @return {boolean}
|
|
32
31
|
*/
|
|
33
|
-
|
|
32
|
+
static isDefined(value) {
|
|
34
33
|
return value !== undefined && value !== null;
|
|
35
|
-
}
|
|
34
|
+
}
|
|
36
35
|
/**
|
|
37
36
|
* Truncate a text
|
|
38
37
|
*/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
var suffix = '\u2026';
|
|
38
|
+
static truncate(value, position, limit = 0) {
|
|
39
|
+
const suffix = '\u2026';
|
|
42
40
|
if (!Tools.isDefined(value)) {
|
|
43
|
-
return
|
|
41
|
+
return ``;
|
|
44
42
|
}
|
|
45
|
-
|
|
43
|
+
const valueToTruncate = `${value}`;
|
|
46
44
|
if (valueToTruncate.length <= limit + 1) {
|
|
47
45
|
return valueToTruncate;
|
|
48
46
|
}
|
|
49
|
-
|
|
47
|
+
const fixedLimit = limit - 1;
|
|
50
48
|
switch (position) {
|
|
51
49
|
case 'middle':
|
|
52
50
|
return (valueToTruncate.substring(0, Math.ceil(fixedLimit / 2)) +
|
|
@@ -55,33 +53,33 @@ var Tools = /** @class */ (function () {
|
|
|
55
53
|
case 'end':
|
|
56
54
|
return valueToTruncate.substring(0, fixedLimit) + suffix;
|
|
57
55
|
}
|
|
58
|
-
}
|
|
56
|
+
}
|
|
59
57
|
/**
|
|
60
58
|
* Return a value from a nested object depending on a keyPath
|
|
61
59
|
*/
|
|
62
|
-
|
|
63
|
-
return path.reduce(
|
|
64
|
-
}
|
|
60
|
+
static getIn(ref, path) {
|
|
61
|
+
return path.reduce((p, c) => (p && p[c] !== undefined ? p[c] : undefined), ref);
|
|
62
|
+
}
|
|
65
63
|
/**
|
|
66
64
|
* Return a clone of an object
|
|
67
65
|
*/
|
|
68
|
-
|
|
66
|
+
static clone(o) {
|
|
69
67
|
return typeof o === 'object'
|
|
70
|
-
? JSON.parse(JSON.stringify(o,
|
|
68
|
+
? JSON.parse(JSON.stringify(o, (k, v) => {
|
|
71
69
|
return v instanceof Set ? {} : v;
|
|
72
70
|
}))
|
|
73
71
|
: o;
|
|
74
|
-
}
|
|
72
|
+
}
|
|
75
73
|
/**
|
|
76
74
|
* Get the amount of hidden neighbors from a list of nodes
|
|
77
75
|
*
|
|
78
76
|
* @param nodes
|
|
79
77
|
*/
|
|
80
|
-
|
|
81
|
-
return nodes.reduce(
|
|
82
|
-
|
|
78
|
+
static getHiddenNeighbors(nodes) {
|
|
79
|
+
return nodes.reduce((result, node) => {
|
|
80
|
+
const statistics = node.getData('statistics');
|
|
83
81
|
if (statistics !== undefined) {
|
|
84
|
-
|
|
82
|
+
const hiddenNeighbors = statistics.degree !== undefined && !statistics.supernode
|
|
85
83
|
? statistics.degree - Tools.getDegreeWithoutSelfConnection(node)
|
|
86
84
|
: statistics.supernodeDegree;
|
|
87
85
|
if (hiddenNeighbors !== undefined && hiddenNeighbors > 0) {
|
|
@@ -90,23 +88,23 @@ var Tools = /** @class */ (function () {
|
|
|
90
88
|
}
|
|
91
89
|
return result;
|
|
92
90
|
}, 0);
|
|
93
|
-
}
|
|
91
|
+
}
|
|
94
92
|
/**
|
|
95
93
|
* Return the visible degree of a node without self connection (self edge)
|
|
96
94
|
*
|
|
97
95
|
* @param {Node} node
|
|
98
96
|
* @return {number}
|
|
99
97
|
*/
|
|
100
|
-
|
|
98
|
+
static getDegreeWithoutSelfConnection(node) {
|
|
101
99
|
return node.getAdjacentNodes({ policy: 'exclude-sources', filter: 'raw' }).size;
|
|
102
|
-
}
|
|
100
|
+
}
|
|
103
101
|
/**
|
|
104
102
|
* Return a formatted version of a number
|
|
105
103
|
*/
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
104
|
+
static formatNumber(number) {
|
|
105
|
+
let div = 1;
|
|
106
|
+
let suffix = '';
|
|
107
|
+
const sign = number < 0 ? '-' : '';
|
|
110
108
|
number = Math.abs(number);
|
|
111
109
|
if (number >= 1000000) {
|
|
112
110
|
div = 1000000;
|
|
@@ -116,7 +114,7 @@ var Tools = /** @class */ (function () {
|
|
|
116
114
|
div = 1000;
|
|
117
115
|
suffix = 'k';
|
|
118
116
|
}
|
|
119
|
-
|
|
117
|
+
const nn = number / div;
|
|
120
118
|
// if there is a decimal value and nn < 10
|
|
121
119
|
if (nn < 10 && nn % 1 !== 0) {
|
|
122
120
|
return sign + nn.toFixed(1) + suffix;
|
|
@@ -124,44 +122,44 @@ var Tools = /** @class */ (function () {
|
|
|
124
122
|
else {
|
|
125
123
|
return sign + Math.floor(nn) + suffix;
|
|
126
124
|
}
|
|
127
|
-
}
|
|
125
|
+
}
|
|
128
126
|
/**
|
|
129
127
|
* Return true if a string is not composed only by invisible char
|
|
130
128
|
*
|
|
131
129
|
* @param {string} value
|
|
132
130
|
* @return {boolean}
|
|
133
131
|
*/
|
|
134
|
-
|
|
132
|
+
static isStringFilled(value) {
|
|
135
133
|
return value.trim() !== '';
|
|
136
|
-
}
|
|
137
|
-
|
|
134
|
+
}
|
|
135
|
+
static getValueFromLkProperty(property) {
|
|
138
136
|
if (typeof property === 'object' && 'type' in property) {
|
|
139
137
|
if (!('original' in property) && !('value' in property)) {
|
|
140
138
|
return null;
|
|
141
139
|
}
|
|
142
140
|
if ('original' in property) {
|
|
143
|
-
return
|
|
141
|
+
return `${property.original}`;
|
|
144
142
|
}
|
|
145
143
|
if ('value' in property) {
|
|
146
144
|
return Tools.formatDate(new Date(new Date(property.value).getTime() + Tools.timezoneToMilliseconds(property.timezone)).toISOString());
|
|
147
145
|
}
|
|
148
146
|
}
|
|
149
147
|
return property;
|
|
150
|
-
}
|
|
148
|
+
}
|
|
151
149
|
/**
|
|
152
150
|
* Return a formatted date as a string
|
|
153
151
|
*/
|
|
154
|
-
|
|
152
|
+
static formatDate(isoString, isDatetime, timezone) {
|
|
155
153
|
// The date received from the server will be always in seconds
|
|
156
|
-
|
|
154
|
+
let offsetDate = isoString;
|
|
157
155
|
if (timezone !== undefined) {
|
|
158
156
|
offsetDate = new Date(isoString).getTime() + timezone * 1000;
|
|
159
157
|
}
|
|
160
|
-
|
|
158
|
+
const dateObject = new Date(offsetDate);
|
|
161
159
|
if (isNaN(dateObject.getUTCFullYear())) {
|
|
162
160
|
return null;
|
|
163
161
|
}
|
|
164
|
-
|
|
162
|
+
let formattedDate = dateObject.getFullYear() +
|
|
165
163
|
'-' +
|
|
166
164
|
((dateObject.getUTCMonth() + 1).toString().length === 1
|
|
167
165
|
? '0' + (dateObject.getUTCMonth() + 1)
|
|
@@ -186,39 +184,39 @@ var Tools = /** @class */ (function () {
|
|
|
186
184
|
: dateObject.getUTCSeconds());
|
|
187
185
|
}
|
|
188
186
|
return formattedDate;
|
|
189
|
-
}
|
|
187
|
+
}
|
|
190
188
|
/**
|
|
191
189
|
* From "+03:00" return the offset in milliseconds
|
|
192
190
|
* @param timezone
|
|
193
191
|
*/
|
|
194
|
-
|
|
192
|
+
static timezoneToMilliseconds(timezone) {
|
|
195
193
|
if (timezone === undefined) {
|
|
196
194
|
return 0;
|
|
197
195
|
}
|
|
198
196
|
if (timezone === 'Z') {
|
|
199
197
|
return 0;
|
|
200
198
|
}
|
|
201
|
-
|
|
202
|
-
|
|
199
|
+
const sign = timezone[0];
|
|
200
|
+
const [hours, minutes] = timezone.slice(1).split(':');
|
|
203
201
|
return sign === '+'
|
|
204
202
|
? this.sanitizeFormattedNumber(hours) * 3.6e6 + this.sanitizeFormattedNumber(minutes) * 60000
|
|
205
203
|
: (this.sanitizeFormattedNumber(hours) * 3.6e6 +
|
|
206
204
|
this.sanitizeFormattedNumber(minutes) * 60000) *
|
|
207
205
|
-1;
|
|
208
|
-
}
|
|
209
|
-
|
|
206
|
+
}
|
|
207
|
+
static sanitizeFormattedNumber(str) {
|
|
210
208
|
if (str.length === 2 && str.startsWith('0')) {
|
|
211
209
|
return Tools.parseNumber(str[1]);
|
|
212
210
|
}
|
|
213
211
|
return Tools.parseNumber(str);
|
|
214
|
-
}
|
|
212
|
+
}
|
|
215
213
|
/**
|
|
216
214
|
* Return true if `n` is (or can be parsed as) a float, but is NOT an integer
|
|
217
215
|
*
|
|
218
216
|
* @param {any} n
|
|
219
217
|
* @return {number} a number (NaN is `n` cannot be parsed as a number)
|
|
220
218
|
*/
|
|
221
|
-
|
|
219
|
+
static parseNumber(n) {
|
|
222
220
|
// string: try to parse as number (allow ',' as decimal separator)
|
|
223
221
|
if (typeof n === 'string') {
|
|
224
222
|
// prevent the empty string to be parsed as 0
|
|
@@ -236,7 +234,7 @@ var Tools = /** @class */ (function () {
|
|
|
236
234
|
return Number.NaN;
|
|
237
235
|
}
|
|
238
236
|
return n;
|
|
239
|
-
}
|
|
237
|
+
}
|
|
240
238
|
/**
|
|
241
239
|
* Return an Array without duplicated keys
|
|
242
240
|
*
|
|
@@ -244,11 +242,11 @@ var Tools = /** @class */ (function () {
|
|
|
244
242
|
* @param {string} key
|
|
245
243
|
* @return {Array<any>}
|
|
246
244
|
*/
|
|
247
|
-
|
|
248
|
-
|
|
245
|
+
static uniqBy(arr, key) {
|
|
246
|
+
const seen = new Set();
|
|
249
247
|
if (key) {
|
|
250
|
-
|
|
251
|
-
for (
|
|
248
|
+
const result = [];
|
|
249
|
+
for (let i = 0; i < arr.length; ++i) {
|
|
252
250
|
if (arr[i] && arr[i][key] && !seen.has(arr[i][key])) {
|
|
253
251
|
seen.add(arr[i][key]);
|
|
254
252
|
result.push(arr[i]);
|
|
@@ -260,16 +258,16 @@ var Tools = /** @class */ (function () {
|
|
|
260
258
|
return result;
|
|
261
259
|
}
|
|
262
260
|
return typeof arr[0] === 'object'
|
|
263
|
-
? Array.from(new Set(arr.map(
|
|
261
|
+
? Array.from(new Set(arr.map((v) => JSON.stringify(v)))).map((v) => JSON.parse(v))
|
|
264
262
|
: Array.from(new Set(arr));
|
|
265
|
-
}
|
|
263
|
+
}
|
|
266
264
|
/**
|
|
267
265
|
* Return 'image' or 'url' depending on the given string
|
|
268
266
|
*
|
|
269
267
|
* @param {string} value
|
|
270
268
|
* @return {"image" | "url"}
|
|
271
269
|
*/
|
|
272
|
-
|
|
270
|
+
static getType(value) {
|
|
273
271
|
if (Tools.isImage(value) && Tools.isUrl(value)) {
|
|
274
272
|
return 'imageUrl';
|
|
275
273
|
}
|
|
@@ -280,42 +278,42 @@ var Tools = /** @class */ (function () {
|
|
|
280
278
|
return 'url';
|
|
281
279
|
}
|
|
282
280
|
return undefined;
|
|
283
|
-
}
|
|
281
|
+
}
|
|
284
282
|
/**
|
|
285
283
|
* Return true if the given string is an url that match the schema handled by LKE
|
|
286
284
|
*
|
|
287
285
|
* @param {string} value
|
|
288
286
|
* @return {boolean}
|
|
289
287
|
*/
|
|
290
|
-
|
|
288
|
+
static isUrl(value) {
|
|
291
289
|
return URL_PATTERN.test(value);
|
|
292
|
-
}
|
|
290
|
+
}
|
|
293
291
|
/**
|
|
294
292
|
* Return true if the given string is an url with an image extension
|
|
295
293
|
*
|
|
296
294
|
* @param {string} value
|
|
297
295
|
* @return {boolean}
|
|
298
296
|
*/
|
|
299
|
-
|
|
297
|
+
static isImage(value) {
|
|
300
298
|
return IMAGE_PATTERN.test(value);
|
|
301
|
-
}
|
|
299
|
+
}
|
|
302
300
|
/**
|
|
303
301
|
* Return true if a value is not undefined, not null and not an empty string
|
|
304
302
|
*/
|
|
305
|
-
|
|
303
|
+
static valueExists(value) {
|
|
306
304
|
return Tools.isDefined(value) && (typeof value !== 'string' || Tools.isStringFilled(value));
|
|
307
|
-
}
|
|
305
|
+
}
|
|
308
306
|
/**
|
|
309
307
|
* Return true if `n` is (or can be parsed as) a number
|
|
310
308
|
*/
|
|
311
|
-
|
|
309
|
+
static isNumber(n) {
|
|
312
310
|
n = Tools.parseNumber(n);
|
|
313
311
|
return Tools.isDefined(n) && n === n;
|
|
314
|
-
}
|
|
312
|
+
}
|
|
315
313
|
/**
|
|
316
314
|
* return the correct property value
|
|
317
315
|
*/
|
|
318
|
-
|
|
316
|
+
static getPropertyValue(property, invalidAsString, formattedDates) {
|
|
319
317
|
if (typeof property === 'object' && !Array.isArray(property)) {
|
|
320
318
|
if (!('status' in property)) {
|
|
321
319
|
if ((property.type === 'date' || property.type === 'datetime') && formattedDates) {
|
|
@@ -333,52 +331,51 @@ var Tools = /** @class */ (function () {
|
|
|
333
331
|
}
|
|
334
332
|
}
|
|
335
333
|
return property;
|
|
336
|
-
}
|
|
334
|
+
}
|
|
337
335
|
/**
|
|
338
336
|
* Parse the given value and return a float number or NaN
|
|
339
337
|
*
|
|
340
338
|
* @param {any} n
|
|
341
339
|
* @return {number}
|
|
342
340
|
*/
|
|
343
|
-
|
|
341
|
+
static parseFloat(n) {
|
|
344
342
|
return Tools.parseNumber(n);
|
|
345
|
-
}
|
|
343
|
+
}
|
|
346
344
|
/**
|
|
347
345
|
* Format a currency value to string.
|
|
348
346
|
*
|
|
349
347
|
* eg: 4123 -> 4.123,00 $
|
|
350
348
|
*/
|
|
351
|
-
|
|
352
|
-
|
|
349
|
+
static formatCurrencyValue(value, options) {
|
|
350
|
+
const sign = value < 0 ? '- ' : '';
|
|
353
351
|
switch (options.format) {
|
|
354
352
|
case rest_client_1.CurrencyFormat.SYMBOL_COMMAS_DOT:
|
|
355
|
-
return
|
|
353
|
+
return `${sign}${options.symbol} ${Tools.formatNumberToCurrency(value, ',', '.')}`;
|
|
356
354
|
case rest_client_1.CurrencyFormat.DOTS_COMMA_SYMBOL:
|
|
357
|
-
return
|
|
355
|
+
return `${sign}${Tools.formatNumberToCurrency(value, '.', ',')} ${options.symbol}`;
|
|
358
356
|
case rest_client_1.CurrencyFormat.SPACES_COMMA_DOT:
|
|
359
|
-
return
|
|
357
|
+
return `${sign}${Tools.formatNumberToCurrency(value, ' ', ',')} ${options.symbol}`;
|
|
360
358
|
default:
|
|
361
|
-
throw Error(
|
|
359
|
+
throw Error(`Cannot format property value ${value}, unknown format ${options.format}.`);
|
|
362
360
|
}
|
|
363
|
-
}
|
|
364
|
-
|
|
361
|
+
}
|
|
362
|
+
static formatNumberToCurrency(value, thousandSeparator, decimalSeparator) {
|
|
365
363
|
if (!Number.isFinite(value)) {
|
|
366
364
|
return value.toString();
|
|
367
365
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
366
|
+
const [integerPart, fractionalPart] = Math.abs(value).toFixed(2).split('.');
|
|
367
|
+
let i = -1;
|
|
368
|
+
const thousands = integerPart
|
|
371
369
|
.split('')
|
|
372
370
|
.reverse()
|
|
373
|
-
.map(
|
|
371
|
+
.map((digit) => {
|
|
374
372
|
i++;
|
|
375
373
|
return i > 0 && i % 3 === 0 ? digit + thousandSeparator : digit;
|
|
376
374
|
})
|
|
377
375
|
.reverse()
|
|
378
376
|
.join('');
|
|
379
377
|
return thousands + decimalSeparator + fractionalPart;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
}());
|
|
378
|
+
}
|
|
379
|
+
}
|
|
383
380
|
exports.Tools = Tools;
|
|
384
381
|
//# sourceMappingURL=tools.js.map
|
package/dist/tools/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools/tools.ts"],"names":[],"mappings":"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","sourcesContent":["'use strict';\n\nimport isEqual from 'lodash/isEqual';\nimport sortBy from 'lodash/sortBy';\nimport {Node, NodeList} from '@linkurious/ogma';\nimport {CurrencyFormat, ICurrencyOptions, LkNodeData, LkProperty} from '@linkurious/rest-client';\n\nexport {sortBy};\nconst URL_PATTERN = /([a-zA-Z][a-zA-Z0-9\\+\\-\\.]*:\\/\\/[^\\s]+)/i;\nconst IMAGE_PATTERN = /\\S+\\.(gif|jpe?g|tiff|png|bmp|svg)$/i;\nexport const CAPTION_HEURISTIC: string[] = [\n 'label',\n 'Label',\n 'name',\n 'Name',\n 'title',\n 'Title',\n 'rdfs:label'\n];\n\nexport class Tools {\n public static isEqual(v1: unknown, v2: unknown): boolean {\n return isEqual(v1, v2);\n }\n\n /**\n * Check that a value is defined : not null and not undefined\n *\n * @param {any} value\n * @return {boolean}\n */\n public static isDefined<T>(value: T): value is NonNullable<T> {\n return value !== undefined && value !== null;\n }\n\n /**\n * Truncate a text\n */\n public static truncate(value: unknown, position: 'middle' | 'end', limit = 0): string {\n const suffix = '\\u2026';\n if (!Tools.isDefined(value)) {\n return ``;\n }\n const valueToTruncate = `${value}`;\n if (valueToTruncate.length <= limit + 1) {\n return valueToTruncate;\n }\n const fixedLimit = limit - 1;\n switch (position) {\n case 'middle':\n return (\n valueToTruncate.substring(0, Math.ceil(fixedLimit / 2)) +\n suffix +\n valueToTruncate.substring(valueToTruncate.length - Math.floor(fixedLimit / 2))\n );\n\n case 'end':\n return valueToTruncate.substring(0, fixedLimit) + suffix;\n }\n }\n\n /**\n * Return a value from a nested object depending on a keyPath\n */\n public static getIn(ref: any, path: Array<string | number>): any {\n return path.reduce((p, c) => (p && p[c] !== undefined ? p[c] : undefined), ref);\n }\n\n /**\n * Return a clone of an object\n */\n public static clone(o: any) {\n return typeof o === 'object'\n ? JSON.parse(\n JSON.stringify(o, (k, v) => {\n return v instanceof Set ? {} : v;\n })\n )\n : o;\n }\n\n /**\n * Get the amount of hidden neighbors from a list of nodes\n *\n * @param nodes\n */\n public static getHiddenNeighbors(nodes: NodeList<LkNodeData>): number {\n return nodes.reduce((result: number, node: Node<LkNodeData>) => {\n const statistics = node.getData('statistics');\n if (statistics !== undefined) {\n const hiddenNeighbors =\n statistics.degree !== undefined && !statistics.supernode\n ? statistics.degree - Tools.getDegreeWithoutSelfConnection(node)\n : statistics.supernodeDegree;\n if (hiddenNeighbors !== undefined && hiddenNeighbors > 0) {\n return (result += hiddenNeighbors);\n }\n }\n return result;\n }, 0);\n }\n\n /**\n * Return the visible degree of a node without self connection (self edge)\n *\n * @param {Node} node\n * @return {number}\n */\n public static getDegreeWithoutSelfConnection(node: Node<LkNodeData>): number {\n return node.getAdjacentNodes({policy: 'exclude-sources', filter: 'raw'}).size;\n }\n\n /**\n * Return a formatted version of a number\n */\n public static formatNumber(number: number): string {\n let div = 1;\n let suffix = '';\n const sign = number < 0 ? '-' : '';\n number = Math.abs(number);\n\n if (number >= 1000000) {\n div = 1000000;\n suffix = 'M';\n } else if (number >= 1000) {\n div = 1000;\n suffix = 'k';\n }\n const nn = number / div;\n // if there is a decimal value and nn < 10\n if (nn < 10 && nn % 1 !== 0) {\n return sign + nn.toFixed(1) + suffix;\n } else {\n return sign + Math.floor(nn) + suffix;\n }\n }\n\n /**\n * Return true if a string is not composed only by invisible char\n *\n * @param {string} value\n * @return {boolean}\n */\n public static isStringFilled(value: string): boolean {\n return value.trim() !== '';\n }\n\n public static getValueFromLkProperty(property: LkProperty): null | string | number | boolean {\n if (typeof property === 'object' && 'type' in property) {\n if (!('original' in property) && !('value' in property)) {\n return null;\n }\n if ('original' in property) {\n return `${property.original}`;\n }\n if ('value' in property) {\n return Tools.formatDate(\n new Date(\n new Date(property.value).getTime() + Tools.timezoneToMilliseconds(property.timezone)\n ).toISOString()\n );\n }\n }\n return property;\n }\n\n /**\n * Return a formatted date as a string\n */\n public static formatDate(\n isoString: string,\n isDatetime?: boolean,\n timezone?: number\n ): string | null {\n // The date received from the server will be always in seconds\n let offsetDate: string | number = isoString;\n if (timezone !== undefined) {\n offsetDate = new Date(isoString).getTime() + timezone * 1000;\n }\n const dateObject = new Date(offsetDate);\n\n if (isNaN(dateObject.getUTCFullYear())) {\n return null;\n }\n let formattedDate =\n dateObject.getFullYear() +\n '-' +\n ((dateObject.getUTCMonth() + 1).toString().length === 1\n ? '0' + (dateObject.getUTCMonth() + 1)\n : dateObject.getUTCMonth() + 1) +\n '-' +\n (dateObject.getUTCDate().toString().length === 1\n ? '0' + dateObject.getUTCDate()\n : dateObject.getUTCDate());\n\n if (isDatetime) {\n formattedDate +=\n ' ' +\n (dateObject.getUTCHours().toString().length === 1\n ? '0' + dateObject.getUTCHours()\n : dateObject.getUTCHours()) +\n ':' +\n (dateObject.getUTCMinutes().toString().length === 1\n ? '0' + dateObject.getUTCMinutes()\n : dateObject.getUTCMinutes()) +\n ':' +\n (dateObject.getUTCSeconds().toString().length === 1\n ? '0' + dateObject.getUTCSeconds()\n : dateObject.getUTCSeconds());\n }\n return formattedDate;\n }\n\n /**\n * From \"+03:00\" return the offset in milliseconds\n * @param timezone\n */\n public static timezoneToMilliseconds(timezone: string | undefined): number {\n if (timezone === undefined) {\n return 0;\n }\n if (timezone === 'Z') {\n return 0;\n }\n const sign = timezone[0];\n const [hours, minutes] = timezone.slice(1).split(':');\n return sign === '+'\n ? this.sanitizeFormattedNumber(hours) * 3.6e6 + this.sanitizeFormattedNumber(minutes) * 60000\n : (this.sanitizeFormattedNumber(hours) * 3.6e6 +\n this.sanitizeFormattedNumber(minutes) * 60000) *\n -1;\n }\n\n public static sanitizeFormattedNumber(str: string): number {\n if (str.length === 2 && str.startsWith('0')) {\n return Tools.parseNumber(str[1]);\n }\n return Tools.parseNumber(str);\n }\n\n /**\n * Return true if `n` is (or can be parsed as) a float, but is NOT an integer\n *\n * @param {any} n\n * @return {number} a number (NaN is `n` cannot be parsed as a number)\n */\n public static parseNumber(n: unknown): number {\n // string: try to parse as number (allow ',' as decimal separator)\n if (typeof n === 'string') {\n // prevent the empty string to be parsed as 0\n if (n.trim() === '') {\n return Number.NaN;\n }\n\n n = +n.replace(',', '.').replace(' ', '');\n }\n\n // (the string could not be parsed) OR (it was neither string nor number)\n if (typeof n !== 'number') {\n return Number.NaN;\n }\n\n // false for NaN, +Infinity, -Infinity\n if (!isFinite(n)) {\n return Number.NaN;\n }\n\n return n;\n }\n\n /**\n * Return an Array without duplicated keys\n *\n * @param {Array<any>} arr\n * @param {string} key\n * @return {Array<any>}\n */\n public static uniqBy(arr: Array<any>, key?: string): Array<any> {\n const seen = new Set();\n if (key) {\n const result = [];\n for (let i = 0; i < arr.length; ++i) {\n if (arr[i] && arr[i][key] && !seen.has(arr[i][key])) {\n seen.add(arr[i][key]);\n result.push(arr[i]);\n } else if (!arr[i][key]) {\n result.push(arr[i]);\n }\n }\n return result;\n }\n return typeof arr[0] === 'object'\n ? Array.from(new Set(arr.map((v) => JSON.stringify(v)))).map((v) => JSON.parse(v))\n : Array.from(new Set(arr));\n }\n\n /**\n * Return 'image' or 'url' depending on the given string\n *\n * @param {string} value\n * @return {\"image\" | \"url\"}\n */\n public static getType(value: string): 'image' | 'url' | 'imageUrl' | undefined {\n if (Tools.isImage(value) && Tools.isUrl(value)) {\n return 'imageUrl';\n }\n\n if (Tools.isImage(value)) {\n return 'image';\n }\n\n if (Tools.isUrl(value)) {\n return 'url';\n }\n\n return undefined;\n }\n\n /**\n * Return true if the given string is an url that match the schema handled by LKE\n *\n * @param {string} value\n * @return {boolean}\n */\n private static isUrl(value: string): boolean {\n return URL_PATTERN.test(value);\n }\n\n /**\n * Return true if the given string is an url with an image extension\n *\n * @param {string} value\n * @return {boolean}\n */\n private static isImage(value: string): boolean {\n return IMAGE_PATTERN.test(value);\n }\n\n /**\n * Return true if a value is not undefined, not null and not an empty string\n */\n public static valueExists(value: LkProperty): boolean {\n return Tools.isDefined(value) && (typeof value !== 'string' || Tools.isStringFilled(value));\n }\n\n /**\n * Return true if `n` is (or can be parsed as) a number\n */\n public static isNumber(n: unknown): boolean {\n n = Tools.parseNumber(n);\n return Tools.isDefined(n) && n === n;\n }\n\n /**\n * return the correct property value\n */\n public static getPropertyValue(\n property: LkProperty,\n invalidAsString?: boolean,\n formattedDates?: boolean\n ): undefined | null | string | number | boolean | Array<string> {\n if (typeof property === 'object' && !Array.isArray(property)) {\n if (!('status' in property)) {\n if ((property.type === 'date' || property.type === 'datetime') && formattedDates) {\n return Tools.formatDate(property.value, property.type === 'datetime');\n } else if (property.type === 'date' || property.type === 'datetime') {\n return new Date(property.value).getTime();\n }\n } else if (invalidAsString) {\n return 'original' in property ? property.original : undefined;\n } else {\n return undefined;\n }\n }\n return property;\n }\n\n /**\n * Parse the given value and return a float number or NaN\n *\n * @param {any} n\n * @return {number}\n */\n public static parseFloat(n: unknown): number {\n return Tools.parseNumber(n);\n }\n\n /**\n * Format a currency value to string.\n *\n * eg: 4123 -> 4.123,00 $\n */\n public static formatCurrencyValue(value: number, options: ICurrencyOptions): string {\n const sign = value < 0 ? '- ' : '';\n switch (options.format) {\n case CurrencyFormat.SYMBOL_COMMAS_DOT:\n return `${sign}${options.symbol} ${Tools.formatNumberToCurrency(value, ',', '.')}`;\n\n case CurrencyFormat.DOTS_COMMA_SYMBOL:\n return `${sign}${Tools.formatNumberToCurrency(value, '.', ',')} ${options.symbol}`;\n\n case CurrencyFormat.SPACES_COMMA_DOT:\n return `${sign}${Tools.formatNumberToCurrency(value, ' ', ',')} ${options.symbol}`;\n\n default:\n throw Error(`Cannot format property value ${value}, unknown format ${options.format}.`);\n }\n }\n\n private static formatNumberToCurrency(\n value: number,\n thousandSeparator: string,\n decimalSeparator: string\n ): string {\n if (!Number.isFinite(value)) {\n return value.toString();\n }\n\n const [integerPart, fractionalPart] = Math.abs(value).toFixed(2).split('.');\n\n let i = -1;\n const thousands = integerPart\n .split('')\n .reverse()\n .map((digit) => {\n i++;\n return i > 0 && i % 3 === 0 ? digit + thousandSeparator : digit;\n })\n .reverse()\n .join('');\n\n return thousands + decimalSeparator + fractionalPart;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools/tools.ts"],"names":[],"mappings":"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","sourcesContent":["'use strict';\n\nimport isEqual from 'lodash/isEqual';\nimport sortBy from 'lodash/sortBy';\nimport {Node, NodeList} from '@linkurious/ogma';\nimport {CurrencyFormat, ICurrencyOptions, LkNodeData, LkProperty} from '@linkurious/rest-client';\n\nexport {sortBy};\nconst URL_PATTERN = /([a-zA-Z][a-zA-Z0-9\\+\\-\\.]*:\\/\\/[^\\s]+)/i;\nconst IMAGE_PATTERN = /\\S+\\.(gif|jpe?g|tiff|png|bmp|svg)$/i;\nexport const CAPTION_HEURISTIC: string[] = [\n 'label',\n 'Label',\n 'name',\n 'Name',\n 'title',\n 'Title',\n 'rdfs:label'\n];\n\nexport class Tools {\n public static isEqual(v1: unknown, v2: unknown): boolean {\n return isEqual(v1, v2);\n }\n\n /**\n * Check that a value is defined : not null and not undefined\n *\n * @param {any} value\n * @return {boolean}\n */\n public static isDefined<T>(value: T): value is NonNullable<T> {\n return value !== undefined && value !== null;\n }\n\n /**\n * Truncate a text\n */\n public static truncate(value: unknown, position: 'middle' | 'end', limit = 0): string {\n const suffix = '\\u2026';\n if (!Tools.isDefined(value)) {\n return ``;\n }\n const valueToTruncate = `${value}`;\n if (valueToTruncate.length <= limit + 1) {\n return valueToTruncate;\n }\n const fixedLimit = limit - 1;\n switch (position) {\n case 'middle':\n return (\n valueToTruncate.substring(0, Math.ceil(fixedLimit / 2)) +\n suffix +\n valueToTruncate.substring(valueToTruncate.length - Math.floor(fixedLimit / 2))\n );\n\n case 'end':\n return valueToTruncate.substring(0, fixedLimit) + suffix;\n }\n }\n\n /**\n * Return a value from a nested object depending on a keyPath\n */\n public static getIn(ref: any, path: Array<string | number>): any {\n return path.reduce((p, c) => (p && p[c] !== undefined ? p[c] : undefined), ref);\n }\n\n /**\n * Return a clone of an object\n */\n public static clone(o: any) {\n return typeof o === 'object'\n ? JSON.parse(\n JSON.stringify(o, (k, v) => {\n return v instanceof Set ? {} : v;\n })\n )\n : o;\n }\n\n /**\n * Get the amount of hidden neighbors from a list of nodes\n *\n * @param nodes\n */\n public static getHiddenNeighbors(nodes: NodeList<LkNodeData>): number {\n return nodes.reduce((result: number, node: Node<LkNodeData>) => {\n const statistics = node.getData('statistics');\n if (statistics !== undefined) {\n const hiddenNeighbors =\n statistics.degree !== undefined && !statistics.supernode\n ? statistics.degree - Tools.getDegreeWithoutSelfConnection(node)\n : statistics.supernodeDegree;\n if (hiddenNeighbors !== undefined && hiddenNeighbors > 0) {\n return (result += hiddenNeighbors);\n }\n }\n return result;\n }, 0);\n }\n\n /**\n * Return the visible degree of a node without self connection (self edge)\n *\n * @param {Node} node\n * @return {number}\n */\n public static getDegreeWithoutSelfConnection(node: Node<LkNodeData>): number {\n return node.getAdjacentNodes({policy: 'exclude-sources', filter: 'raw'}).size;\n }\n\n /**\n * Return a formatted version of a number\n */\n public static formatNumber(number: number): string {\n let div = 1;\n let suffix = '';\n const sign = number < 0 ? '-' : '';\n number = Math.abs(number);\n\n if (number >= 1000000) {\n div = 1000000;\n suffix = 'M';\n } else if (number >= 1000) {\n div = 1000;\n suffix = 'k';\n }\n const nn = number / div;\n // if there is a decimal value and nn < 10\n if (nn < 10 && nn % 1 !== 0) {\n return sign + nn.toFixed(1) + suffix;\n } else {\n return sign + Math.floor(nn) + suffix;\n }\n }\n\n /**\n * Return true if a string is not composed only by invisible char\n *\n * @param {string} value\n * @return {boolean}\n */\n public static isStringFilled(value: string): boolean {\n return value.trim() !== '';\n }\n\n public static getValueFromLkProperty(property: LkProperty): null | string | number | boolean {\n if (typeof property === 'object' && 'type' in property) {\n if (!('original' in property) && !('value' in property)) {\n return null;\n }\n if ('original' in property) {\n return `${property.original}`;\n }\n if ('value' in property) {\n return Tools.formatDate(\n new Date(\n new Date(property.value).getTime() + Tools.timezoneToMilliseconds(property.timezone)\n ).toISOString()\n );\n }\n }\n return property;\n }\n\n /**\n * Return a formatted date as a string\n */\n public static formatDate(\n isoString: string,\n isDatetime?: boolean,\n timezone?: number\n ): string | null {\n // The date received from the server will be always in seconds\n let offsetDate: string | number = isoString;\n if (timezone !== undefined) {\n offsetDate = new Date(isoString).getTime() + timezone * 1000;\n }\n const dateObject = new Date(offsetDate);\n\n if (isNaN(dateObject.getUTCFullYear())) {\n return null;\n }\n let formattedDate =\n dateObject.getFullYear() +\n '-' +\n ((dateObject.getUTCMonth() + 1).toString().length === 1\n ? '0' + (dateObject.getUTCMonth() + 1)\n : dateObject.getUTCMonth() + 1) +\n '-' +\n (dateObject.getUTCDate().toString().length === 1\n ? '0' + dateObject.getUTCDate()\n : dateObject.getUTCDate());\n\n if (isDatetime) {\n formattedDate +=\n ' ' +\n (dateObject.getUTCHours().toString().length === 1\n ? '0' + dateObject.getUTCHours()\n : dateObject.getUTCHours()) +\n ':' +\n (dateObject.getUTCMinutes().toString().length === 1\n ? '0' + dateObject.getUTCMinutes()\n : dateObject.getUTCMinutes()) +\n ':' +\n (dateObject.getUTCSeconds().toString().length === 1\n ? '0' + dateObject.getUTCSeconds()\n : dateObject.getUTCSeconds());\n }\n return formattedDate;\n }\n\n /**\n * From \"+03:00\" return the offset in milliseconds\n * @param timezone\n */\n public static timezoneToMilliseconds(timezone: string | undefined): number {\n if (timezone === undefined) {\n return 0;\n }\n if (timezone === 'Z') {\n return 0;\n }\n const sign = timezone[0];\n const [hours, minutes] = timezone.slice(1).split(':');\n return sign === '+'\n ? this.sanitizeFormattedNumber(hours) * 3.6e6 + this.sanitizeFormattedNumber(minutes) * 60000\n : (this.sanitizeFormattedNumber(hours) * 3.6e6 +\n this.sanitizeFormattedNumber(minutes) * 60000) *\n -1;\n }\n\n public static sanitizeFormattedNumber(str: string): number {\n if (str.length === 2 && str.startsWith('0')) {\n return Tools.parseNumber(str[1]);\n }\n return Tools.parseNumber(str);\n }\n\n /**\n * Return true if `n` is (or can be parsed as) a float, but is NOT an integer\n *\n * @param {any} n\n * @return {number} a number (NaN is `n` cannot be parsed as a number)\n */\n public static parseNumber(n: unknown): number {\n // string: try to parse as number (allow ',' as decimal separator)\n if (typeof n === 'string') {\n // prevent the empty string to be parsed as 0\n if (n.trim() === '') {\n return Number.NaN;\n }\n\n n = +n.replace(',', '.').replace(' ', '');\n }\n\n // (the string could not be parsed) OR (it was neither string nor number)\n if (typeof n !== 'number') {\n return Number.NaN;\n }\n\n // false for NaN, +Infinity, -Infinity\n if (!isFinite(n)) {\n return Number.NaN;\n }\n\n return n;\n }\n\n /**\n * Return an Array without duplicated keys\n *\n * @param {Array<any>} arr\n * @param {string} key\n * @return {Array<any>}\n */\n public static uniqBy(arr: Array<any>, key?: string): Array<any> {\n const seen = new Set();\n if (key) {\n const result = [];\n for (let i = 0; i < arr.length; ++i) {\n if (arr[i] && arr[i][key] && !seen.has(arr[i][key])) {\n seen.add(arr[i][key]);\n result.push(arr[i]);\n } else if (!arr[i][key]) {\n result.push(arr[i]);\n }\n }\n return result;\n }\n return typeof arr[0] === 'object'\n ? Array.from(new Set(arr.map((v) => JSON.stringify(v)))).map((v) => JSON.parse(v))\n : Array.from(new Set(arr));\n }\n\n /**\n * Return 'image' or 'url' depending on the given string\n *\n * @param {string} value\n * @return {\"image\" | \"url\"}\n */\n public static getType(value: string): 'image' | 'url' | 'imageUrl' | undefined {\n if (Tools.isImage(value) && Tools.isUrl(value)) {\n return 'imageUrl';\n }\n\n if (Tools.isImage(value)) {\n return 'image';\n }\n\n if (Tools.isUrl(value)) {\n return 'url';\n }\n\n return undefined;\n }\n\n /**\n * Return true if the given string is an url that match the schema handled by LKE\n *\n * @param {string} value\n * @return {boolean}\n */\n private static isUrl(value: string): boolean {\n return URL_PATTERN.test(value);\n }\n\n /**\n * Return true if the given string is an url with an image extension\n *\n * @param {string} value\n * @return {boolean}\n */\n private static isImage(value: string): boolean {\n return IMAGE_PATTERN.test(value);\n }\n\n /**\n * Return true if a value is not undefined, not null and not an empty string\n */\n public static valueExists(value: LkProperty): boolean {\n return Tools.isDefined(value) && (typeof value !== 'string' || Tools.isStringFilled(value));\n }\n\n /**\n * Return true if `n` is (or can be parsed as) a number\n */\n public static isNumber(n: unknown): boolean {\n n = Tools.parseNumber(n);\n return Tools.isDefined(n) && n === n;\n }\n\n /**\n * return the correct property value\n */\n public static getPropertyValue(\n property: LkProperty,\n invalidAsString?: boolean,\n formattedDates?: boolean\n ): undefined | null | string | number | boolean | Array<string> {\n if (typeof property === 'object' && !Array.isArray(property)) {\n if (!('status' in property)) {\n if ((property.type === 'date' || property.type === 'datetime') && formattedDates) {\n return Tools.formatDate(property.value, property.type === 'datetime');\n } else if (property.type === 'date' || property.type === 'datetime') {\n return new Date(property.value).getTime();\n }\n } else if (invalidAsString) {\n return 'original' in property ? property.original : undefined;\n } else {\n return undefined;\n }\n }\n return property;\n }\n\n /**\n * Parse the given value and return a float number or NaN\n *\n * @param {any} n\n * @return {number}\n */\n public static parseFloat(n: unknown): number {\n return Tools.parseNumber(n);\n }\n\n /**\n * Format a currency value to string.\n *\n * eg: 4123 -> 4.123,00 $\n */\n public static formatCurrencyValue(value: number, options: ICurrencyOptions): string {\n const sign = value < 0 ? '- ' : '';\n switch (options.format) {\n case CurrencyFormat.SYMBOL_COMMAS_DOT:\n return `${sign}${options.symbol} ${Tools.formatNumberToCurrency(value, ',', '.')}`;\n\n case CurrencyFormat.DOTS_COMMA_SYMBOL:\n return `${sign}${Tools.formatNumberToCurrency(value, '.', ',')} ${options.symbol}`;\n\n case CurrencyFormat.SPACES_COMMA_DOT:\n return `${sign}${Tools.formatNumberToCurrency(value, ' ', ',')} ${options.symbol}`;\n\n default:\n throw Error(`Cannot format property value ${value}, unknown format ${options.format}.`);\n }\n }\n\n private static formatNumberToCurrency(\n value: number,\n thousandSeparator: string,\n decimalSeparator: string\n ): string {\n if (!Number.isFinite(value)) {\n return value.toString();\n }\n\n const [integerPart, fractionalPart] = Math.abs(value).toFixed(2).split('.');\n\n let i = -1;\n const thousands = integerPart\n .split('')\n .reverse()\n .map((digit) => {\n i++;\n return i > 0 && i % 3 === 0 ? digit + thousandSeparator : digit;\n })\n .reverse()\n .join('');\n\n return thousands + decimalSeparator + fractionalPart;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linkurious/ogma-linkurious-parser",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"author": "Linkurious SAS",
|
|
5
5
|
"description": "Parse and load a Linkurious visualization in Ogma with one line of code ",
|
|
6
6
|
"files": [
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"main": "./dist/index.js",
|
|
14
14
|
"types": "./dist/index.d.ts",
|
|
15
15
|
"engines": {
|
|
16
|
-
"node": "
|
|
16
|
+
"node": "18.13.0"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
19
|
"prepare": "tsc -b",
|
|
@@ -49,11 +49,11 @@
|
|
|
49
49
|
"sha1": "1.1.1"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"@linkurious/ogma": "4.
|
|
52
|
+
"@linkurious/ogma": "4.3.9"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@linkurious/ogma": "4.
|
|
56
|
-
"@linkurious/rest-client": "
|
|
55
|
+
"@linkurious/ogma": "4.3.9",
|
|
56
|
+
"@linkurious/rest-client": "4.0.1",
|
|
57
57
|
"@rollup/plugin-buble": "0.21.3",
|
|
58
58
|
"@rollup/plugin-commonjs": "17.0.0",
|
|
59
59
|
"@rollup/plugin-json": "4.1.0",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"rollup-plugin-node-globals": "1.4.0",
|
|
79
79
|
"rollup-plugin-typescript2": "0.29.0",
|
|
80
80
|
"should": "11.1.0",
|
|
81
|
-
"ts-node": "
|
|
82
|
-
"typescript": "
|
|
81
|
+
"ts-node": "10.9.1",
|
|
82
|
+
"typescript": "4.9.4"
|
|
83
83
|
}
|
|
84
84
|
}
|