@agoric/internal 0.3.3-dev-abe0c45.0.abe0c45 → 0.3.3-dev-3dd4164.0.3dd4164
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/package.json +4 -4
- package/src/natural-sort.d.ts.map +1 -1
- package/src/natural-sort.js +47 -12
- package/src/ses-utils.d.ts +1 -0
- package/src/ses-utils.d.ts.map +1 -1
- package/src/ses-utils.js +12 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agoric/internal",
|
|
3
|
-
"version": "0.3.3-dev-
|
|
3
|
+
"version": "0.3.3-dev-3dd4164.0.3dd4164",
|
|
4
4
|
"description": "Externally unsupported utilities internal to agoric-sdk",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"lint:types": "yarn run -T tsc"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@agoric/base-zone": "0.1.1-dev-
|
|
23
|
+
"@agoric/base-zone": "0.1.1-dev-3dd4164.0.3dd4164",
|
|
24
24
|
"@endo/common": "^1.2.13",
|
|
25
25
|
"@endo/compartment-mapper": "^1.6.3",
|
|
26
26
|
"@endo/errors": "^1.2.13",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"jessie.js": "^0.3.4"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@agoric/cosmic-proto": "0.4.1-dev-
|
|
40
|
+
"@agoric/cosmic-proto": "0.4.1-dev-3dd4164.0.3dd4164",
|
|
41
41
|
"@endo/exo": "^1.5.12",
|
|
42
42
|
"@endo/init": "^1.1.12",
|
|
43
43
|
"@endo/ses-ava": "^1.3.2",
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"typeCoverage": {
|
|
66
66
|
"atLeast": 93.02
|
|
67
67
|
},
|
|
68
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "3dd416469e808e8dfaace7dc598c7251f6ef3ad4"
|
|
69
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"natural-sort.d.ts","sourceRoot":"","sources":["natural-sort.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"natural-sort.d.ts","sourceRoot":"","sources":["natural-sort.js"],"names":[],"mappings":"AAgDO,kCAJI,MAAM,KACN,MAAM,GACJ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAmCtB"}
|
package/src/natural-sort.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { provideLazyMap } from './js-utils.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* @param {string} a
|
|
3
5
|
* @param {string} b
|
|
@@ -22,27 +24,60 @@ const compareNats = (a, b) => {
|
|
|
22
24
|
// eslint-disable-next-line no-nested-ternary
|
|
23
25
|
const compareStrings = (a, b) => (a > b ? 1 : a < b ? -1 : 0);
|
|
24
26
|
|
|
25
|
-
const
|
|
27
|
+
const rCaptureDigits = /([0-9]+)/;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Splitting by regular expression can be expensive; we don't want to repeat
|
|
31
|
+
* that for every comparison against the same string.
|
|
32
|
+
*
|
|
33
|
+
* @type {Map<string, string[]>}
|
|
34
|
+
*/
|
|
35
|
+
const partsCache = new Map();
|
|
26
36
|
|
|
27
37
|
/**
|
|
28
|
-
* Perform a
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* ['ko', 100]
|
|
38
|
+
* Perform a multi-level natural-sort comparison, finding the decimal digit
|
|
39
|
+
* sequences in each operand and comparing first by each ([possibly empty]
|
|
40
|
+
* string prefix, integer) pair in turn, with a final comparision by string
|
|
41
|
+
* suffix as necessary (e.g., sorting 'ko42' before 'ko100' as ['ko', 42] vs.
|
|
42
|
+
* ['ko', 100] and 'parent1.child8' before 'parent1.child10' as ['parent', 1,
|
|
43
|
+
* 'child', 8] vs. ['parent', 1, 'child', 10]).
|
|
33
44
|
*
|
|
34
45
|
* @param {string} a
|
|
35
46
|
* @param {string} b
|
|
36
47
|
* @returns {-1 | 0 | 1}
|
|
37
48
|
*/
|
|
38
49
|
export const naturalCompare = (a, b) => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
50
|
+
// We want to maintain a cache only for the duration of each call to
|
|
51
|
+
// array.sort, and leverage the synchronous nature of that method in the first
|
|
52
|
+
// invocation of each turn (indicated by an empty cache) to schedule cache
|
|
53
|
+
// clearing in the *next* turn.
|
|
54
|
+
if (!partsCache.size) void Promise.resolve().then(() => partsCache.clear());
|
|
55
|
+
|
|
56
|
+
const aParts = provideLazyMap(partsCache, a, () => a.split(rCaptureDigits));
|
|
57
|
+
const bParts = provideLazyMap(partsCache, b, () => b.split(rCaptureDigits));
|
|
58
|
+
|
|
59
|
+
// An even index corresponds with a string part; an odd one with a digit part.
|
|
60
|
+
let i = 0;
|
|
61
|
+
for (; i + 1 < aParts.length; i += 2) {
|
|
62
|
+
if (i + 1 < bParts.length) {
|
|
63
|
+
// Both `a` and `b` have a digit part here, but we compare the preceding
|
|
64
|
+
// string part first in case those are unequal.
|
|
65
|
+
const result =
|
|
66
|
+
compareStrings(aParts[i], bParts[i]) ||
|
|
67
|
+
compareNats(aParts[i + 1], bParts[i + 1]);
|
|
68
|
+
if (result) return result;
|
|
69
|
+
} else {
|
|
70
|
+
// After a (possibly empty) common prefix, `a` has digits where `b` does
|
|
71
|
+
// not, so we use string comparison of `${aString}${aDigits}` vs.
|
|
72
|
+
// `${bString}`.
|
|
73
|
+
return compareStrings(`${aParts[i]}${aParts[i + 1]}`, bParts[i]);
|
|
44
74
|
}
|
|
45
75
|
}
|
|
46
|
-
|
|
76
|
+
if (bParts.length > aParts.length) {
|
|
77
|
+
// `b` has digits where `a` does not.
|
|
78
|
+
return compareStrings(aParts[i], `${bParts[i]}${bParts[i + 1]}`);
|
|
79
|
+
}
|
|
80
|
+
// If `a` and `b` differ, it's only in the final string suffix.
|
|
81
|
+
return compareStrings(aParts[i], bParts[i]);
|
|
47
82
|
};
|
|
48
83
|
harden(naturalCompare);
|
package/src/ses-utils.d.ts
CHANGED
|
@@ -30,6 +30,7 @@ export function makeLimitedConsole(makeLogger: (level: string) => (...args: unkn
|
|
|
30
30
|
* @type {<T extends {}>(unfulfilledTerms: T) => Promise<DeeplyAwaited<T>>}
|
|
31
31
|
*/
|
|
32
32
|
export const deeplyFulfilledObject: <T extends {}>(unfulfilledTerms: T) => Promise<DeeplyAwaited<T>>;
|
|
33
|
+
export function stripPrefix(prefix: string, str: string): string;
|
|
33
34
|
export function throwErrorCode<Code extends string>(details: Parameters<typeof makeError>[0], code: Code, opts?: Parameters<typeof makeError>[2] & {
|
|
34
35
|
constructor?: Parameters<typeof makeError>[1];
|
|
35
36
|
}): never;
|
package/src/ses-utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ses-utils.d.ts","sourceRoot":"","sources":["ses-utils.js"],"names":[],"mappings":"AA8BO,+CADK,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAKvC,cAAc,CACjC;AAGD;;;;;GAKG;AAEH;;GAEG;AAEH;;;;;GAKG;AAEH;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,oCAFU,CAAC,CAAC,SAAS,EAAE,EAAE,gBAAgB,EAAE,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAKxE;
|
|
1
|
+
{"version":3,"file":"ses-utils.d.ts","sourceRoot":"","sources":["ses-utils.js"],"names":[],"mappings":"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"}
|
package/src/ses-utils.js
CHANGED
|
@@ -90,6 +90,18 @@ const makeAggregateError =
|
|
|
90
90
|
});
|
|
91
91
|
};
|
|
92
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Assert that a string has a prefix, and return the part that follows it.
|
|
95
|
+
*
|
|
96
|
+
* @param {string} prefix
|
|
97
|
+
* @param {string} str
|
|
98
|
+
* @returns {string}
|
|
99
|
+
*/
|
|
100
|
+
export const stripPrefix = (prefix, str) => {
|
|
101
|
+
str.startsWith(prefix) || Fail`${str} is missing prefix ${q(prefix)}`;
|
|
102
|
+
return str.slice(prefix.length);
|
|
103
|
+
};
|
|
104
|
+
|
|
93
105
|
/**
|
|
94
106
|
* Throw an error with an own "code" data property, supporting identification
|
|
95
107
|
* without parsing `message`. Note that such errors are not Passable and thus
|