lib0 1.0.0-rc.4 → 1.0.0-rc.5
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 +2 -2
- package/src/delta/delta.js +1 -1
- package/src/diff/patience.js +11 -7
- package/src/schema.js +65 -65
- package/types/diff/patience.d.ts +3 -1
- package/types/schema.d.ts +10 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lib0",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.5",
|
|
4
4
|
"description": "",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -288,7 +288,7 @@
|
|
|
288
288
|
"trace-opt": "clear && node --trace-opt src/test.js",
|
|
289
289
|
"lint": "tsc && standard",
|
|
290
290
|
"gendocs": "node ./bin/gendocs.js",
|
|
291
|
-
"
|
|
291
|
+
"release": "np --test-script dist",
|
|
292
292
|
"version": "npm run clean && npm run dist && git add README.md",
|
|
293
293
|
"postpublish": "npm run clean",
|
|
294
294
|
"gentesthtml": "node ./src/bin/gentesthtml.js --script src/test.js > test.html"
|
package/src/delta/delta.js
CHANGED
|
@@ -2325,7 +2325,7 @@ export const diff = (d1, d2) => {
|
|
|
2325
2325
|
// split by alphanumerics and others
|
|
2326
2326
|
const changeset3 = diffChangesetWithSeparator(changeset2, patience.smartSplitRegex)
|
|
2327
2327
|
// split all
|
|
2328
|
-
const changeset4 = diffChangesetWithSeparator(changeset3, /./g)
|
|
2328
|
+
const changeset4 = diffChangesetWithSeparator(changeset3, /./g)
|
|
2329
2329
|
applyChangesetToDelta(d, changeset4)
|
|
2330
2330
|
if (formattingNeedsDiff) {
|
|
2331
2331
|
const formattingDiff = create()
|
package/src/diff/patience.js
CHANGED
|
@@ -16,7 +16,7 @@ import * as array from '../array.js'
|
|
|
16
16
|
*
|
|
17
17
|
* @param {Array<string>} as
|
|
18
18
|
* @param {Array<string>} bs
|
|
19
|
-
* @return {Array<{ index: number, remove: Array<string>, insert: Array<string>}>} changeset
|
|
19
|
+
* @return {Array<{ index: number, remove: Array<string>, insert: Array<string>}>} changeset
|
|
20
20
|
*/
|
|
21
21
|
export const diff = (as, bs) => {
|
|
22
22
|
const {
|
|
@@ -35,9 +35,11 @@ export const diff = (as, bs) => {
|
|
|
35
35
|
export const diffSplitBy = (a, b, regexp) => {
|
|
36
36
|
const isStringSeparator = typeof regexp === 'string'
|
|
37
37
|
const separator = /** @type {string} */ (isStringSeparator ? regexp : '')
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
if (isStringSeparator) {
|
|
39
|
+
regexp = new RegExp(regexp, 'g')
|
|
40
|
+
}
|
|
41
|
+
const as = splitByRegexp(a, /** @type {RegExp} */ (regexp), !isStringSeparator)
|
|
42
|
+
const bs = splitByRegexp(b, /** @type {RegExp} */ (regexp), !isStringSeparator)
|
|
41
43
|
const changes = diff(as, bs)
|
|
42
44
|
let prevSplitIndex = 0
|
|
43
45
|
let prevStringIndex = 0
|
|
@@ -54,11 +56,13 @@ export const diffSplitBy = (a, b, regexp) => {
|
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
/**
|
|
57
|
-
*
|
|
59
|
+
* Idea: match all "non-word" characters and keep them separate (spaces, comma, exclamation marks, ..).
|
|
60
|
+
* Anything that can be classivied as a word (emoji, char, number) will be bundled together. All other tokens are kept
|
|
61
|
+
* individually. "hello, world!!!!" => ['hello', ',', ' ', 'world', '!', '!']
|
|
58
62
|
*
|
|
59
63
|
* @experimental
|
|
60
64
|
*/
|
|
61
|
-
export const smartSplitRegex = /[^\p{L}\p{N}]
|
|
65
|
+
export const smartSplitRegex = /[^\p{L}\p{N}\p{Extended_Pictographic}\p{Emoji_Modifier}\u200D\uFE0F]/gu
|
|
62
66
|
|
|
63
67
|
/**
|
|
64
68
|
* Sensible default for diffing strings using patience (it's fast though).
|
|
@@ -76,7 +80,7 @@ export const diffAuto = (a, b) =>
|
|
|
76
80
|
remove: dd.remove,
|
|
77
81
|
index: dd.index + d.index
|
|
78
82
|
}))
|
|
79
|
-
).flat()
|
|
83
|
+
).flat(1)
|
|
80
84
|
|
|
81
85
|
/**
|
|
82
86
|
* @param {Array<string>} as
|
package/src/schema.js
CHANGED
|
@@ -876,12 +876,75 @@ export class $Union extends Schema {
|
|
|
876
876
|
*/
|
|
877
877
|
/* @__NO_SIDE_EFFECTS__ */
|
|
878
878
|
export const $union = (...schemas) => schemas.findIndex($s => $$union.check($s)) >= 0
|
|
879
|
-
? $union(...schemas.map($
|
|
879
|
+
? $union(...schemas.map($).map($s => $$union.check($s) ? $s.shape : [$s]).flat(1))
|
|
880
880
|
: (schemas.length === 1
|
|
881
881
|
? schemas[0]
|
|
882
|
-
: new $Union(schemas))
|
|
882
|
+
: new $Union(schemas.map($)))
|
|
883
883
|
export const $$union = /** @type {Schema<$Union<any>>} */ (/* @__PURE__ */$constructedBy($Union))
|
|
884
884
|
|
|
885
|
+
/**
|
|
886
|
+
* @template {any} IN
|
|
887
|
+
* @typedef {[Extract<IN,Schema<any>>,Extract<IN,string|number|boolean|null>,Extract<IN,new (...args:any[])=>any>,Extract<IN,any[]>,Extract<Exclude<IN,Schema<any>|string|number|boolean|null|(new (...args:any[])=>any)|any[]>,object>] extends [infer Schemas, infer Primitives, infer Constructors, infer Arrs, infer Obj]
|
|
888
|
+
* ? (
|
|
889
|
+
* (Schemas extends Schema<infer S> ? S : never)
|
|
890
|
+
* | Primitives
|
|
891
|
+
* | (Constructors extends new (...args:any[])=>any ? InstanceType<Constructors> : never)
|
|
892
|
+
* | (Arrs extends any[] ? { [K in keyof Arrs]: ReadSchemaUnwrapped<Arrs[K]> }[keyof Arrs & number] : never)
|
|
893
|
+
* | (Obj extends object ? _ObjectDefToSchema<{[K in keyof Obj]:Schema<ReadSchemaUnwrapped<Obj[K]>>}> : never))
|
|
894
|
+
* : never
|
|
895
|
+
* } ReadSchemaUnwrapped
|
|
896
|
+
*/
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* @template {any} IN
|
|
900
|
+
* @typedef {Schema<ReadSchemaUnwrapped<IN>>} ReadSchema
|
|
901
|
+
*/
|
|
902
|
+
|
|
903
|
+
/**
|
|
904
|
+
* @template IN
|
|
905
|
+
* @param {IN} o
|
|
906
|
+
* @return {Schema<import('./ts.js').TypeIsAny<IN,any,ReadSchemaUnwrapped<IN>>>}
|
|
907
|
+
*/
|
|
908
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
909
|
+
export const $ = o => {
|
|
910
|
+
if ($$schema.check(o)) {
|
|
911
|
+
return /** @type {any} */ (o)
|
|
912
|
+
} else if ($objectAny.check(o)) {
|
|
913
|
+
/**
|
|
914
|
+
* @type {any}
|
|
915
|
+
*/
|
|
916
|
+
const o2 = {}
|
|
917
|
+
for (const k in o) {
|
|
918
|
+
o2[k] = $(o[k])
|
|
919
|
+
}
|
|
920
|
+
return /** @type {any} */ ($object(o2))
|
|
921
|
+
} else if ($arrayAny.check(o)) {
|
|
922
|
+
return /** @type {any} */ ($union(...o.map($)))
|
|
923
|
+
} else if ($primitive.check(o)) {
|
|
924
|
+
return /** @type {any} */ ($literal(o))
|
|
925
|
+
} else if ($function.check(o)) {
|
|
926
|
+
return /** @type {any} */ ($constructedBy(/** @type {any} */ (o)))
|
|
927
|
+
}
|
|
928
|
+
/* c8 ignore next */
|
|
929
|
+
error.unexpectedCase()
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
/* c8 ignore start */
|
|
933
|
+
/**
|
|
934
|
+
* Assert that a variable is of this specific type.
|
|
935
|
+
* The assertion check is only performed in non-production environments.
|
|
936
|
+
*
|
|
937
|
+
* @type {<T>(o:any,schema:Schema<T>) => asserts o is T}
|
|
938
|
+
*/
|
|
939
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
940
|
+
export const assert = (o, schema) => {
|
|
941
|
+
const err = new ValidationError()
|
|
942
|
+
if (!schema.check(o, err)) {
|
|
943
|
+
throw error.create(`Expected value to be of type ${schema.constructor.name}.\n${err.toString()}`)
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
/* c8 ignore end */
|
|
947
|
+
|
|
885
948
|
/* @__NO_SIDE_EFFECTS__ */
|
|
886
949
|
const _t = () => true
|
|
887
950
|
/**
|
|
@@ -969,69 +1032,6 @@ export const $json = /* @__PURE__ */(() => {
|
|
|
969
1032
|
return $json
|
|
970
1033
|
})()
|
|
971
1034
|
|
|
972
|
-
/**
|
|
973
|
-
* @template {any} IN
|
|
974
|
-
* @typedef {[Extract<IN,Schema<any>>,Extract<IN,string|number|boolean|null>,Extract<IN,new (...args:any[])=>any>,Extract<IN,any[]>,Extract<Exclude<IN,Schema<any>|string|number|boolean|null|(new (...args:any[])=>any)|any[]>,object>] extends [infer Schemas, infer Primitives, infer Constructors, infer Arrs, infer Obj]
|
|
975
|
-
* ? (
|
|
976
|
-
* (Schemas extends Schema<infer S> ? S : never)
|
|
977
|
-
* | Primitives
|
|
978
|
-
* | (Constructors extends new (...args:any[])=>any ? InstanceType<Constructors> : never)
|
|
979
|
-
* | (Arrs extends any[] ? { [K in keyof Arrs]: ReadSchemaUnwrapped<Arrs[K]> }[keyof Arrs & number] : never)
|
|
980
|
-
* | (Obj extends object ? _ObjectDefToSchema<{[K in keyof Obj]:Schema<ReadSchemaUnwrapped<Obj[K]>>}> : never))
|
|
981
|
-
* : never
|
|
982
|
-
* } ReadSchemaUnwrapped
|
|
983
|
-
*/
|
|
984
|
-
|
|
985
|
-
/**
|
|
986
|
-
* @template {any} IN
|
|
987
|
-
* @typedef {Schema<ReadSchemaUnwrapped<IN>>} ReadSchema
|
|
988
|
-
*/
|
|
989
|
-
|
|
990
|
-
/**
|
|
991
|
-
* @template IN
|
|
992
|
-
* @param {IN} o
|
|
993
|
-
* @return {Schema<import('./ts.js').TypeIsAny<IN,any,ReadSchemaUnwrapped<IN>>>}
|
|
994
|
-
*/
|
|
995
|
-
/* @__NO_SIDE_EFFECTS__ */
|
|
996
|
-
export const $ = o => {
|
|
997
|
-
if ($$schema.check(o)) {
|
|
998
|
-
return /** @type {any} */ (o)
|
|
999
|
-
} else if ($objectAny.check(o)) {
|
|
1000
|
-
/**
|
|
1001
|
-
* @type {any}
|
|
1002
|
-
*/
|
|
1003
|
-
const o2 = {}
|
|
1004
|
-
for (const k in o) {
|
|
1005
|
-
o2[k] = $(o[k])
|
|
1006
|
-
}
|
|
1007
|
-
return /** @type {any} */ ($object(o2))
|
|
1008
|
-
} else if ($arrayAny.check(o)) {
|
|
1009
|
-
return /** @type {any} */ ($union(...o.map($)))
|
|
1010
|
-
} else if ($primitive.check(o)) {
|
|
1011
|
-
return /** @type {any} */ ($literal(o))
|
|
1012
|
-
} else if ($function.check(o)) {
|
|
1013
|
-
return /** @type {any} */ ($constructedBy(/** @type {any} */ (o)))
|
|
1014
|
-
}
|
|
1015
|
-
/* c8 ignore next */
|
|
1016
|
-
error.unexpectedCase()
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
|
-
/* c8 ignore start */
|
|
1020
|
-
/**
|
|
1021
|
-
* Assert that a variable is of this specific type.
|
|
1022
|
-
* The assertion check is only performed in non-production environments.
|
|
1023
|
-
*
|
|
1024
|
-
* @type {<T>(o:any,schema:Schema<T>) => asserts o is T}
|
|
1025
|
-
*/
|
|
1026
|
-
/* @__NO_SIDE_EFFECTS__ */
|
|
1027
|
-
export const assert = (o, schema) => {
|
|
1028
|
-
const err = new ValidationError()
|
|
1029
|
-
if (!schema.check(o, err)) {
|
|
1030
|
-
throw error.create(`Expected value to be of type ${schema.constructor.name}.\n${err.toString()}`)
|
|
1031
|
-
}
|
|
1032
|
-
}
|
|
1033
|
-
/* c8 ignore end */
|
|
1034
|
-
|
|
1035
1035
|
/**
|
|
1036
1036
|
* @template In
|
|
1037
1037
|
* @template Out
|
package/types/diff/patience.d.ts
CHANGED
|
@@ -9,7 +9,9 @@ export function diffSplitBy(a: string, b: string, regexp: RegExp | string): {
|
|
|
9
9
|
insert: string;
|
|
10
10
|
}[];
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Idea: match all "non-word" characters and keep them separate (spaces, comma, exclamation marks, ..).
|
|
13
|
+
* Anything that can be classivied as a word (emoji, char, number) will be bundled together. All other tokens are kept
|
|
14
|
+
* individually. "hello, world!!!!" => ['hello', ',', ' ', 'world', '!', '!']
|
|
13
15
|
*
|
|
14
16
|
* @experimental
|
|
15
17
|
*/
|
package/types/schema.d.ts
CHANGED
|
@@ -442,6 +442,14 @@ export class $Union<S> extends Schema<S> {
|
|
|
442
442
|
}
|
|
443
443
|
export function $union<T extends Array<any>>(...schemas: T): CastToSchema<$Union<ReadSchemaUnwrapped<T>>>;
|
|
444
444
|
export const $$union: Schema<$Union<any>>;
|
|
445
|
+
export function $<IN>(o: IN): Schema<import("./ts.js").TypeIsAny<IN, any, ReadSchemaUnwrapped<IN>>>;
|
|
446
|
+
/**
|
|
447
|
+
* Assert that a variable is of this specific type.
|
|
448
|
+
* The assertion check is only performed in non-production environments.
|
|
449
|
+
*
|
|
450
|
+
* @type {<T>(o:any,schema:Schema<T>) => asserts o is T}
|
|
451
|
+
*/
|
|
452
|
+
export const assert: <T>(o: any, schema: Schema<T>) => asserts o is T;
|
|
445
453
|
/**
|
|
446
454
|
* @type {Schema<any>}
|
|
447
455
|
*/
|
|
@@ -507,14 +515,6 @@ export const $primitive: Schema<Primitive>;
|
|
|
507
515
|
export const $json: Schema<null | number | string | boolean | JSON[] | {
|
|
508
516
|
[key: string]: JSON;
|
|
509
517
|
}>;
|
|
510
|
-
export function $<IN>(o: IN): Schema<import("./ts.js").TypeIsAny<IN, any, ReadSchemaUnwrapped<IN>>>;
|
|
511
|
-
/**
|
|
512
|
-
* Assert that a variable is of this specific type.
|
|
513
|
-
* The assertion check is only performed in non-production environments.
|
|
514
|
-
*
|
|
515
|
-
* @type {<T>(o:any,schema:Schema<T>) => asserts o is T}
|
|
516
|
-
*/
|
|
517
|
-
export const assert: <T>(o: any, schema: Schema<T>) => asserts o is T;
|
|
518
518
|
/**
|
|
519
519
|
* @todo move this to separate library
|
|
520
520
|
* @template {any} [State=undefined]
|
|
@@ -574,12 +574,12 @@ export type $ObjectToType<S extends {
|
|
|
574
574
|
}> = { [Key in keyof S as S[Key] extends $Optional<Schema<any>> ? Key : never]?: S[Key] extends $Optional<Schema<infer Type>> ? Type : never; } & { [Key in keyof S as S[Key] extends $Optional<Schema<any>> ? never : Key]: S[Key] extends Schema<infer Type> ? Type : never; };
|
|
575
575
|
export type _ObjectDefToSchema<S> = import("./ts.js").Prettify<{ [Key in keyof S as S[Key] extends $Optional<Schema<any>> ? Key : never]?: S[Key] extends $Optional<Schema<infer Type>> ? Type : never; } & { [Key in keyof S as S[Key] extends $Optional<Schema<any>> ? never : Key]: S[Key] extends Schema<infer Type> ? Type : never; }, 1>;
|
|
576
576
|
export type _LArgsToLambdaDef<Args extends Schema<any>[]> = (...args: UnwrapArray<TuplePop<Args>>) => Unwrap<TupleLast<Args>>;
|
|
577
|
+
export type ReadSchemaUnwrapped<IN extends unknown> = [Extract<IN, Schema<any>>, Extract<IN, string | number | boolean | null>, Extract<IN, new (...args: any[]) => any>, Extract<IN, any[]>, Extract<Exclude<IN, Schema<any> | string | number | boolean | null | (new (...args: any[]) => any) | any[]>, object>] extends [infer Schemas, infer Primitives, infer Constructors, infer Arrs, infer Obj] ? ((Schemas extends Schema<infer S> ? S : never) | Primitives | (Constructors extends new (...args: any[]) => any ? InstanceType<Constructors> : never) | (Arrs extends any[] ? { [K in keyof Arrs]: ReadSchemaUnwrapped<Arrs[K]>; }[keyof Arrs & number] : never) | (Obj extends object ? _ObjectDefToSchema<{ [K in keyof Obj]: Schema<ReadSchemaUnwrapped<Obj[K]>>; }> : never)) : never;
|
|
578
|
+
export type ReadSchema<IN extends unknown> = Schema<ReadSchemaUnwrapped<IN>>;
|
|
577
579
|
export type JSONArray = JSON[];
|
|
578
580
|
export type JSON = Primitive | JSONArray | {
|
|
579
581
|
[key: string]: JSON;
|
|
580
582
|
};
|
|
581
|
-
export type ReadSchemaUnwrapped<IN extends unknown> = [Extract<IN, Schema<any>>, Extract<IN, string | number | boolean | null>, Extract<IN, new (...args: any[]) => any>, Extract<IN, any[]>, Extract<Exclude<IN, Schema<any> | string | number | boolean | null | (new (...args: any[]) => any) | any[]>, object>] extends [infer Schemas, infer Primitives, infer Constructors, infer Arrs, infer Obj] ? ((Schemas extends Schema<infer S> ? S : never) | Primitives | (Constructors extends new (...args: any[]) => any ? InstanceType<Constructors> : never) | (Arrs extends any[] ? { [K in keyof Arrs]: ReadSchemaUnwrapped<Arrs[K]>; }[keyof Arrs & number] : never) | (Obj extends object ? _ObjectDefToSchema<{ [K in keyof Obj]: Schema<ReadSchemaUnwrapped<Obj[K]>>; }> : never)) : never;
|
|
582
|
-
export type ReadSchema<IN extends unknown> = Schema<ReadSchemaUnwrapped<IN>>;
|
|
583
583
|
export type Pattern<In, Out> = {
|
|
584
584
|
if: Schema<In>;
|
|
585
585
|
h: (o: In, state?: any) => Out;
|