decoders 2.0.0-beta6 → 2.0.0-beta7
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/NotSupportedTSVersion.d.ts +1 -0
- package/_guard.d.ts +7 -0
- package/_guard.js +2 -6
- package/_guard.js.flow +3 -3
- package/{_esm/_guard.js → _guard.mjs} +3 -3
- package/_types.d.ts +13 -0
- package/{_esm/_types.js → _types.mjs} +0 -0
- package/_utils.d.ts +10 -0
- package/{_esm/_utils.js → _utils.mjs} +0 -0
- package/annotate.d.ts +62 -0
- package/{_esm/annotate.js → annotate.mjs} +0 -0
- package/core/_helpers.d.ts +79 -0
- package/core/array.d.ts +5 -0
- package/core/array.js +5 -9
- package/core/array.js.flow +5 -5
- package/{_esm/core/array.js → core/array.mjs} +7 -7
- package/core/boolean.d.ts +5 -0
- package/core/boolean.js +4 -8
- package/core/boolean.js.flow +3 -5
- package/{_esm/core/boolean.js → core/boolean.mjs} +6 -6
- package/core/composition.d.ts +12 -0
- package/core/composition.js +6 -10
- package/core/composition.js.flow +6 -6
- package/{_esm/core/composition.js → core/composition.mjs} +7 -7
- package/core/constants.d.ts +11 -0
- package/core/constants.js +6 -10
- package/core/constants.js.flow +7 -9
- package/{_esm/core/constants.js → core/constants.mjs} +7 -7
- package/core/date.d.ts +4 -0
- package/core/date.js +3 -7
- package/core/date.js.flow +2 -4
- package/{_esm/core/date.js → core/date.mjs} +6 -6
- package/core/describe.d.ts +3 -0
- package/core/describe.js +2 -6
- package/core/describe.js.flow +2 -2
- package/{_esm/core/describe.js → core/describe.mjs} +3 -3
- package/core/dispatch.d.ts +8 -0
- package/core/dispatch.js +2 -6
- package/core/dispatch.js.flow +2 -2
- package/{_esm/core/dispatch.js → core/dispatch.mjs} +4 -4
- package/core/either.d.ts +61 -0
- package/core/either.js +7 -11
- package/core/either.js.flow +6 -6
- package/{_esm/core/either.js → core/either.mjs} +8 -8
- package/core/fail.d.ts +3 -0
- package/core/fail.js +2 -6
- package/core/fail.js.flow +2 -2
- package/{_esm/core/fail.js → core/fail.mjs} +3 -3
- package/core/instanceOf.d.ts +3 -0
- package/core/instanceOf.js +2 -6
- package/core/instanceOf.js.flow +3 -3
- package/core/instanceOf.mjs +8 -0
- package/core/json.d.ts +11 -0
- package/core/json.mjs +15 -0
- package/core/lazy.d.ts +3 -0
- package/{_esm/core/lazy.js → core/lazy.mjs} +0 -0
- package/core/mapping.d.ts +6 -0
- package/core/mapping.js +4 -8
- package/core/mapping.js.flow +3 -3
- package/{_esm/core/mapping.js → core/mapping.mjs} +7 -7
- package/core/number.d.ts +6 -0
- package/core/number.js +2 -6
- package/core/number.js.flow +3 -3
- package/{_esm/core/number.js → core/number.mjs} +4 -4
- package/core/object.d.ts +33 -0
- package/core/object.js +7 -11
- package/core/object.js.flow +7 -7
- package/{_esm/core/object.js → core/object.mjs} +9 -9
- package/core/optional.d.ts +5 -0
- package/core/optional.js +4 -8
- package/core/optional.js.flow +3 -3
- package/{_esm/core/optional.js → core/optional.mjs} +6 -6
- package/core/string.d.ts +7 -0
- package/core/string.js +5 -9
- package/core/string.js.flow +5 -7
- package/{_esm/core/string.js → core/string.mjs} +7 -7
- package/core/tuple.d.ts +30 -0
- package/{_esm/core/tuple.js → core/tuple.mjs} +4 -4
- package/format.d.ts +4 -0
- package/{format/inline.js → format.js} +6 -1
- package/{_esm/format/inline.js.flow → format.js.flow} +6 -2
- package/{_esm/format/inline.js → format.mjs} +4 -1
- package/{_esm/index.js.flow → index.d.ts} +3 -23
- package/{_esm/index.js → index.mjs} +19 -19
- package/package.json +15 -3
- package/result.d.ts +39 -0
- package/result.js +0 -62
- package/result.js.flow +0 -60
- package/{_esm/result.js → result.mjs} +0 -54
- package/_esm/_guard.js.flow +0 -20
- package/_esm/_types.js.flow +0 -20
- package/_esm/_utils.js.flow +0 -97
- package/_esm/annotate.js.flow +0 -218
- package/_esm/core/array.js.flow +0 -103
- package/_esm/core/boolean.js.flow +0 -29
- package/_esm/core/composition.js.flow +0 -43
- package/_esm/core/constants.js.flow +0 -46
- package/_esm/core/date.js.flow +0 -40
- package/_esm/core/describe.js.flow +0 -17
- package/_esm/core/dispatch.js.flow +0 -58
- package/_esm/core/either.js.flow +0 -151
- package/_esm/core/fail.js.flow +0 -12
- package/_esm/core/instanceOf.js +0 -8
- package/_esm/core/instanceOf.js.flow +0 -20
- package/_esm/core/json.js +0 -15
- package/_esm/core/json.js.flow +0 -28
- package/_esm/core/lazy.js.flow +0 -15
- package/_esm/core/mapping.js.flow +0 -54
- package/_esm/core/number.js.flow +0 -34
- package/_esm/core/object.js.flow +0 -203
- package/_esm/core/optional.js.flow +0 -41
- package/_esm/core/string.js.flow +0 -82
- package/_esm/core/tuple.js.flow +0 -214
- package/_esm/format/index.js +0 -2
- package/_esm/format/index.js.flow +0 -4
- package/_esm/format/short.js +0 -4
- package/_esm/format/short.js.flow +0 -8
- package/_esm/result.js.flow +0 -158
- package/format/index.js +0 -12
- package/format/index.js.flow +0 -4
- package/format/inline.js.flow +0 -122
- package/format/short.js +0 -10
- package/format/short.js.flow +0 -8
package/core/instanceOf.js
CHANGED
|
@@ -3,17 +3,13 @@
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.instanceOf = instanceOf;
|
|
5
5
|
|
|
6
|
-
var Result = _interopRequireWildcard(require("../result"));
|
|
7
|
-
|
|
8
6
|
var _annotate = require("../annotate");
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
8
|
+
var _result = require("../result");
|
|
13
9
|
|
|
14
10
|
function instanceOf(klass) {
|
|
15
11
|
return function (blob) {
|
|
16
|
-
return blob instanceof klass ?
|
|
12
|
+
return blob instanceof klass ? (0, _result.ok)(blob) : (0, _result.err)((0, _annotate.annotate)(blob, "Must be " + // $FlowFixMe[incompatible-use] - klass.name is fine?
|
|
17
13
|
klass.name + " instance"));
|
|
18
14
|
};
|
|
19
15
|
}
|
package/core/instanceOf.js.flow
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
|
|
3
|
-
import * as Result from '../result';
|
|
4
3
|
import { annotate } from '../annotate';
|
|
4
|
+
import { err, ok } from '../result';
|
|
5
5
|
import type { Decoder } from '../_types';
|
|
6
6
|
|
|
7
7
|
export function instanceOf<T>(klass: Class<T>): Decoder<T> {
|
|
8
8
|
return (blob: mixed) =>
|
|
9
9
|
blob instanceof klass
|
|
10
|
-
?
|
|
11
|
-
:
|
|
10
|
+
? ok(blob)
|
|
11
|
+
: err(
|
|
12
12
|
annotate(
|
|
13
13
|
blob,
|
|
14
14
|
`Must be ${
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { annotate } from '../annotate.mjs';
|
|
2
|
+
import { err, ok } from '../result.mjs';
|
|
3
|
+
export function instanceOf(klass) {
|
|
4
|
+
return function (blob) {
|
|
5
|
+
return blob instanceof klass ? ok(blob) : err(annotate(blob, "Must be " + // $FlowFixMe[incompatible-use] - klass.name is fine?
|
|
6
|
+
klass.name + " instance"));
|
|
7
|
+
};
|
|
8
|
+
}
|
package/core/json.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Decoder } from '../_types';
|
|
2
|
+
|
|
3
|
+
export type JSONValue = null | string | number | boolean | JSONObject | JSONArray;
|
|
4
|
+
export interface JSONObject {
|
|
5
|
+
[key: string]: JSONValue;
|
|
6
|
+
}
|
|
7
|
+
export type JSONArray = JSONValue[];
|
|
8
|
+
|
|
9
|
+
export const json: Decoder<JSONValue>;
|
|
10
|
+
export const jsonArray: Decoder<JSONArray>;
|
|
11
|
+
export const jsonObject: Decoder<JSONObject>;
|
package/core/json.mjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { array } from './array.mjs';
|
|
2
|
+
import { boolean as _boolean } from './boolean.mjs';
|
|
3
|
+
import { dict } from './mapping.mjs';
|
|
4
|
+
import { either6 } from './either.mjs';
|
|
5
|
+
import { lazy } from './lazy.mjs';
|
|
6
|
+
import { null_ } from './constants.mjs';
|
|
7
|
+
import { number } from './number.mjs';
|
|
8
|
+
import { string } from './string.mjs';
|
|
9
|
+
export var jsonObject = lazy(function () {
|
|
10
|
+
return dict(json);
|
|
11
|
+
});
|
|
12
|
+
export var jsonArray = lazy(function () {
|
|
13
|
+
return array(json);
|
|
14
|
+
});
|
|
15
|
+
export var json = either6(null_, string, number, _boolean, jsonObject, jsonArray);
|
package/core/lazy.d.ts
ADDED
|
File without changes
|
package/core/mapping.js
CHANGED
|
@@ -4,17 +4,13 @@ exports.__esModule = true;
|
|
|
4
4
|
exports.dict = dict;
|
|
5
5
|
exports.mapping = mapping;
|
|
6
6
|
|
|
7
|
-
var Result = _interopRequireWildcard(require("../result"));
|
|
8
|
-
|
|
9
7
|
var _annotate = require("../annotate");
|
|
10
8
|
|
|
11
9
|
var _composition = require("./composition");
|
|
12
10
|
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
11
|
+
var _result = require("../result");
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
var _object = require("./object");
|
|
18
14
|
|
|
19
15
|
/**
|
|
20
16
|
* Given an object, will decode a Map of string keys to whatever values.
|
|
@@ -49,9 +45,9 @@ function mapping(decoder) {
|
|
|
49
45
|
});
|
|
50
46
|
|
|
51
47
|
if (errors !== null) {
|
|
52
|
-
return
|
|
48
|
+
return (0, _result.err)((0, _annotate.merge)((0, _annotate.annotateObject)(blob), errors));
|
|
53
49
|
} else {
|
|
54
|
-
return
|
|
50
|
+
return (0, _result.ok)(new Map(tuples));
|
|
55
51
|
}
|
|
56
52
|
});
|
|
57
53
|
}
|
package/core/mapping.js.flow
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
|
|
3
|
-
import * as Result from '../result';
|
|
4
3
|
import { annotateObject } from '../annotate';
|
|
5
4
|
import { compose, map } from './composition';
|
|
5
|
+
import { err, ok } from '../result';
|
|
6
6
|
import { merge } from '../annotate';
|
|
7
7
|
import { pojo } from './object';
|
|
8
8
|
import type { Annotation } from '../annotate';
|
|
@@ -39,9 +39,9 @@ export function mapping<T>(decoder: Decoder<T>): Decoder<Map<string, T>> {
|
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
if (errors !== null) {
|
|
42
|
-
return
|
|
42
|
+
return err(merge(annotateObject(blob), errors));
|
|
43
43
|
} else {
|
|
44
|
-
return
|
|
44
|
+
return ok(new Map(tuples));
|
|
45
45
|
}
|
|
46
46
|
});
|
|
47
47
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { merge } from '../annotate';
|
|
5
|
-
import { pojo } from './object';
|
|
1
|
+
import { annotateObject } from '../annotate.mjs';
|
|
2
|
+
import { compose, map } from './composition.mjs';
|
|
3
|
+
import { err, ok } from '../result.mjs';
|
|
4
|
+
import { merge } from '../annotate.mjs';
|
|
5
|
+
import { pojo } from './object.mjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Given an object, will decode a Map of string keys to whatever values.
|
|
@@ -37,9 +37,9 @@ export function mapping(decoder) {
|
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
if (errors !== null) {
|
|
40
|
-
return
|
|
40
|
+
return err(merge(annotateObject(blob), errors));
|
|
41
41
|
} else {
|
|
42
|
-
return
|
|
42
|
+
return ok(new Map(tuples));
|
|
43
43
|
}
|
|
44
44
|
});
|
|
45
45
|
}
|
package/core/number.d.ts
ADDED
package/core/number.js
CHANGED
|
@@ -3,18 +3,14 @@
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.positiveNumber = exports.positiveInteger = exports.number = exports.integer = void 0;
|
|
5
5
|
|
|
6
|
-
var Result = _interopRequireWildcard(require("../result"));
|
|
7
|
-
|
|
8
6
|
var _annotate = require("../annotate");
|
|
9
7
|
|
|
10
8
|
var _composition = require("./composition");
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
10
|
+
var _result = require("../result");
|
|
15
11
|
|
|
16
12
|
var anyNumber = function anyNumber(blob) {
|
|
17
|
-
return typeof blob === 'number' && !Number.isNaN(blob) ?
|
|
13
|
+
return typeof blob === 'number' && !Number.isNaN(blob) ? (0, _result.ok)(blob) : (0, _result.err)((0, _annotate.annotate)(blob, 'Must be number'));
|
|
18
14
|
};
|
|
19
15
|
|
|
20
16
|
var isInteger = function isInteger(n) {
|
package/core/number.js.flow
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
|
|
3
|
-
import * as Result from '../result';
|
|
4
3
|
import { annotate } from '../annotate';
|
|
5
4
|
import { compose, predicate } from './composition';
|
|
5
|
+
import { err, ok } from '../result';
|
|
6
6
|
import type { Decoder } from '../_types';
|
|
7
7
|
|
|
8
8
|
const anyNumber: Decoder<number> = (blob: mixed) => {
|
|
9
9
|
return typeof blob === 'number' && !Number.isNaN(blob)
|
|
10
|
-
?
|
|
11
|
-
:
|
|
10
|
+
? ok(blob)
|
|
11
|
+
: err(annotate(blob, 'Must be number'));
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
const isInteger = (n: number) => Number.isInteger(n);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { annotate } from '../annotate.mjs';
|
|
2
|
+
import { compose, predicate } from './composition.mjs';
|
|
3
|
+
import { err, ok } from '../result.mjs';
|
|
4
4
|
|
|
5
5
|
var anyNumber = function anyNumber(blob) {
|
|
6
|
-
return typeof blob === 'number' && !Number.isNaN(blob) ?
|
|
6
|
+
return typeof blob === 'number' && !Number.isNaN(blob) ? ok(blob) : err(annotate(blob, 'Must be number'));
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
var isInteger = function isInteger(n) {
|
package/core/object.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Decoder, DecoderType } from '../_types';
|
|
2
|
+
import { AllowImplicit } from './_helpers';
|
|
3
|
+
|
|
4
|
+
export type ObjectDecoderType<T> = AllowImplicit<{
|
|
5
|
+
[key in keyof T]: DecoderType<T[key]>;
|
|
6
|
+
}>;
|
|
7
|
+
|
|
8
|
+
export const pojo: Decoder<{ [key: string]: unknown }>;
|
|
9
|
+
|
|
10
|
+
export function object<O extends { [key: string]: Decoder<any> }>(
|
|
11
|
+
mapping: O,
|
|
12
|
+
): Decoder<{ [K in keyof ObjectDecoderType<O>]: ObjectDecoderType<O>[K] }>;
|
|
13
|
+
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
14
|
+
// This is basically just equivalent to:
|
|
15
|
+
// ObjectDecoderType<O>
|
|
16
|
+
//
|
|
17
|
+
// But by "resolving" this with a mapped type, we remove the helper
|
|
18
|
+
// type names from the inferred type here, making this much easier to
|
|
19
|
+
// work with while developing.
|
|
20
|
+
|
|
21
|
+
export function exact<O extends { [key: string]: Decoder<any> }>(
|
|
22
|
+
mapping: O,
|
|
23
|
+
): Decoder<{ [K in keyof ObjectDecoderType<O>]: ObjectDecoderType<O>[K] }>;
|
|
24
|
+
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
25
|
+
// Ditto (see above)
|
|
26
|
+
|
|
27
|
+
export function inexact<O extends { [key: string]: Decoder<any> }>(
|
|
28
|
+
mapping: O,
|
|
29
|
+
): Decoder<
|
|
30
|
+
{ [K in keyof ObjectDecoderType<O>]: ObjectDecoderType<O>[K] } & {
|
|
31
|
+
[extra: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
>;
|
package/core/object.js
CHANGED
|
@@ -6,15 +6,11 @@ exports.inexact = inexact;
|
|
|
6
6
|
exports.object = object;
|
|
7
7
|
exports.pojo = void 0;
|
|
8
8
|
|
|
9
|
-
var Result = _interopRequireWildcard(require("../result"));
|
|
10
|
-
|
|
11
9
|
var _annotate = require("../annotate");
|
|
12
10
|
|
|
13
11
|
var _composition = require("./composition");
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
13
|
+
var _result = require("../result");
|
|
18
14
|
|
|
19
15
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
20
16
|
|
|
@@ -36,7 +32,7 @@ function subtract(xs, ys) {
|
|
|
36
32
|
}
|
|
37
33
|
|
|
38
34
|
var pojo = function pojo(blob) {
|
|
39
|
-
return isPojo(blob) ?
|
|
35
|
+
return isPojo(blob) ? (0, _result.ok)( // NOTE:
|
|
40
36
|
// Since Flow 0.98, typeof o === 'object' refines to
|
|
41
37
|
// {| +[string]: mixed |}
|
|
42
38
|
// instead of
|
|
@@ -50,7 +46,7 @@ var pojo = function pojo(blob) {
|
|
|
50
46
|
// way to turn a read-only Object to a writeable one in ES6 seems
|
|
51
47
|
// to be to use object-spread. (Going off this benchmark:
|
|
52
48
|
// https://thecodebarbarian.com/object-assign-vs-object-spread.html)
|
|
53
|
-
_extends({}, blob)) :
|
|
49
|
+
_extends({}, blob)) : (0, _result.err)((0, _annotate.annotate)(blob, 'Must be an object'));
|
|
54
50
|
};
|
|
55
51
|
/**
|
|
56
52
|
* Given a mapping of fields-to-decoders, builds a decoder for an object type.
|
|
@@ -139,10 +135,10 @@ function object(mapping) {
|
|
|
139
135
|
objAnn = (0, _annotate.updateText)(objAnn, "Missing " + pluralized + ": " + errMsg);
|
|
140
136
|
}
|
|
141
137
|
|
|
142
|
-
return
|
|
138
|
+
return (0, _result.err)(objAnn);
|
|
143
139
|
}
|
|
144
140
|
|
|
145
|
-
return
|
|
141
|
+
return (0, _result.ok)(record);
|
|
146
142
|
});
|
|
147
143
|
}
|
|
148
144
|
|
|
@@ -154,10 +150,10 @@ function exact(mapping) {
|
|
|
154
150
|
var superfluous = subtract(actual, allowed);
|
|
155
151
|
|
|
156
152
|
if (superfluous.size > 0) {
|
|
157
|
-
return
|
|
153
|
+
return (0, _result.err)((0, _annotate.annotate)(blob, "Superfluous keys: " + Array.from(superfluous).join(', ')));
|
|
158
154
|
}
|
|
159
155
|
|
|
160
|
-
return
|
|
156
|
+
return (0, _result.ok)(blob);
|
|
161
157
|
}); // Defer to the "object" decoder for doing the real decoding work. Since
|
|
162
158
|
// we made sure there are no superfluous keys in this structure, it's now
|
|
163
159
|
// safe to force-cast it to an $Exact<> type.
|
package/core/object.js.flow
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
|
|
3
|
-
import * as Result from '../result';
|
|
4
3
|
import { annotate, annotateObject, merge, updateText } from '../annotate';
|
|
5
4
|
import { compose, map } from './composition';
|
|
5
|
+
import { err, ok } from '../result';
|
|
6
6
|
import type { Annotation } from '../annotate';
|
|
7
7
|
import type { Decoder, DecoderType } from '../_types';
|
|
8
8
|
|
|
@@ -36,7 +36,7 @@ function subtract(xs: Set<string>, ys: Set<string>): Set<string> {
|
|
|
36
36
|
|
|
37
37
|
export const pojo: Decoder<{| [string]: mixed |}> = (blob: mixed) => {
|
|
38
38
|
return isPojo(blob)
|
|
39
|
-
?
|
|
39
|
+
? ok(
|
|
40
40
|
// NOTE:
|
|
41
41
|
// Since Flow 0.98, typeof o === 'object' refines to
|
|
42
42
|
// {| +[string]: mixed |}
|
|
@@ -53,7 +53,7 @@ export const pojo: Decoder<{| [string]: mixed |}> = (blob: mixed) => {
|
|
|
53
53
|
// https://thecodebarbarian.com/object-assign-vs-object-spread.html)
|
|
54
54
|
{ ...blob },
|
|
55
55
|
)
|
|
56
|
-
:
|
|
56
|
+
: err(annotate(blob, 'Must be an object'));
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
/**
|
|
@@ -144,10 +144,10 @@ export function object<O: { +[field: string]: AnyDecoder, ... }>(
|
|
|
144
144
|
objAnn = updateText(objAnn, `Missing ${pluralized}: ${errMsg}`);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
return
|
|
147
|
+
return err(objAnn);
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
return
|
|
150
|
+
return ok(record);
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -160,11 +160,11 @@ export function exact<O: { +[field: string]: AnyDecoder, ... }>(
|
|
|
160
160
|
const actual = new Set(Object.keys(blob));
|
|
161
161
|
const superfluous = subtract(actual, allowed);
|
|
162
162
|
if (superfluous.size > 0) {
|
|
163
|
-
return
|
|
163
|
+
return err(
|
|
164
164
|
annotate(blob, `Superfluous keys: ${Array.from(superfluous).join(', ')}`),
|
|
165
165
|
);
|
|
166
166
|
}
|
|
167
|
-
return
|
|
167
|
+
return ok(blob);
|
|
168
168
|
});
|
|
169
169
|
|
|
170
170
|
// Defer to the "object" decoder for doing the real decoding work. Since
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { annotate, annotateObject, merge, updateText } from '../annotate.mjs';
|
|
4
|
+
import { compose, map } from './composition.mjs';
|
|
5
|
+
import { err, ok } from '../result.mjs';
|
|
6
6
|
|
|
7
7
|
function isPojo(o) {
|
|
8
8
|
return o !== null && o !== undefined && typeof o === 'object' && // This still seems to be the only reliable way to determine whether
|
|
@@ -22,7 +22,7 @@ function subtract(xs, ys) {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export var pojo = function pojo(blob) {
|
|
25
|
-
return isPojo(blob) ?
|
|
25
|
+
return isPojo(blob) ? ok( // NOTE:
|
|
26
26
|
// Since Flow 0.98, typeof o === 'object' refines to
|
|
27
27
|
// {| +[string]: mixed |}
|
|
28
28
|
// instead of
|
|
@@ -36,7 +36,7 @@ export var pojo = function pojo(blob) {
|
|
|
36
36
|
// way to turn a read-only Object to a writeable one in ES6 seems
|
|
37
37
|
// to be to use object-spread. (Going off this benchmark:
|
|
38
38
|
// https://thecodebarbarian.com/object-assign-vs-object-spread.html)
|
|
39
|
-
_extends({}, blob)) :
|
|
39
|
+
_extends({}, blob)) : err(annotate(blob, 'Must be an object'));
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
42
|
* Given a mapping of fields-to-decoders, builds a decoder for an object type.
|
|
@@ -122,10 +122,10 @@ export function object(mapping) {
|
|
|
122
122
|
objAnn = updateText(objAnn, "Missing " + pluralized + ": " + errMsg);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
return
|
|
125
|
+
return err(objAnn);
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
return
|
|
128
|
+
return ok(record);
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
131
|
export function exact(mapping) {
|
|
@@ -136,10 +136,10 @@ export function exact(mapping) {
|
|
|
136
136
|
var superfluous = subtract(actual, allowed);
|
|
137
137
|
|
|
138
138
|
if (superfluous.size > 0) {
|
|
139
|
-
return
|
|
139
|
+
return err(annotate(blob, "Superfluous keys: " + Array.from(superfluous).join(', ')));
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
return
|
|
142
|
+
return ok(blob);
|
|
143
143
|
}); // Defer to the "object" decoder for doing the real decoding work. Since
|
|
144
144
|
// we made sure there are no superfluous keys in this structure, it's now
|
|
145
145
|
// safe to force-cast it to an $Exact<> type.
|
package/core/optional.js
CHANGED
|
@@ -5,17 +5,13 @@ exports.maybe = maybe;
|
|
|
5
5
|
exports.nullable = nullable;
|
|
6
6
|
exports.optional = optional;
|
|
7
7
|
|
|
8
|
-
var Result = _interopRequireWildcard(require("../result"));
|
|
9
|
-
|
|
10
8
|
var _annotate = require("../annotate");
|
|
11
9
|
|
|
12
10
|
var _either = require("./either");
|
|
13
11
|
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
12
|
+
var _result = require("../result");
|
|
17
13
|
|
|
18
|
-
|
|
14
|
+
var _constants = require("./constants");
|
|
19
15
|
|
|
20
16
|
/**
|
|
21
17
|
* Builds a Decoder that returns Ok for either `undefined` or `T` values,
|
|
@@ -41,8 +37,8 @@ function nullable(decoder) {
|
|
|
41
37
|
|
|
42
38
|
|
|
43
39
|
var undefined_or_null = function undefined_or_null(blob) {
|
|
44
|
-
return blob === undefined || blob === null ?
|
|
45
|
-
|
|
40
|
+
return blob === undefined || blob === null ? (0, _result.ok)(blob) : // Combine error message into a single line
|
|
41
|
+
(0, _result.err)((0, _annotate.annotate)(blob, 'Must be undefined or null'));
|
|
46
42
|
};
|
|
47
43
|
/**
|
|
48
44
|
* Decoder that only returns Ok for `null` or `undefined` inputs.
|
package/core/optional.js.flow
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
|
|
3
|
-
import * as Result from '../result';
|
|
4
3
|
import { annotate } from '../annotate';
|
|
5
4
|
import { either } from './either';
|
|
5
|
+
import { err, ok } from '../result';
|
|
6
6
|
import { null_, undefined_ } from './constants';
|
|
7
7
|
import type { Decoder } from '../_types';
|
|
8
8
|
|
|
@@ -29,9 +29,9 @@ export function nullable<T>(decoder: Decoder<T>): Decoder<null | T> {
|
|
|
29
29
|
*/
|
|
30
30
|
const undefined_or_null: Decoder<null | void> = (blob: mixed) =>
|
|
31
31
|
blob === undefined || blob === null
|
|
32
|
-
?
|
|
32
|
+
? ok(blob)
|
|
33
33
|
: // Combine error message into a single line
|
|
34
|
-
|
|
34
|
+
err(annotate(blob, 'Must be undefined or null'));
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Decoder that only returns Ok for `null` or `undefined` inputs.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { null_, undefined_ } from './constants';
|
|
1
|
+
import { annotate } from '../annotate.mjs';
|
|
2
|
+
import { either } from './either.mjs';
|
|
3
|
+
import { err, ok } from '../result.mjs';
|
|
4
|
+
import { null_, undefined_ } from './constants.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Builds a Decoder that returns Ok for either `undefined` or `T` values,
|
|
@@ -25,8 +25,8 @@ export function nullable(decoder) {
|
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
27
|
var undefined_or_null = function undefined_or_null(blob) {
|
|
28
|
-
return blob === undefined || blob === null ?
|
|
29
|
-
|
|
28
|
+
return blob === undefined || blob === null ? ok(blob) : // Combine error message into a single line
|
|
29
|
+
err(annotate(blob, 'Must be undefined or null'));
|
|
30
30
|
};
|
|
31
31
|
/**
|
|
32
32
|
* Decoder that only returns Ok for `null` or `undefined` inputs.
|
package/core/string.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Decoder } from '../_types';
|
|
2
|
+
|
|
3
|
+
export const string: Decoder<string>;
|
|
4
|
+
export const nonEmptyString: Decoder<string>;
|
|
5
|
+
export function regex(regex: RegExp, msg: string): Decoder<string>;
|
|
6
|
+
export const email: Decoder<string>;
|
|
7
|
+
export function url(schemes?: readonly string[]): Decoder<string>;
|
package/core/string.js
CHANGED
|
@@ -5,15 +5,11 @@ exports.nonEmptyString = exports.email = void 0;
|
|
|
5
5
|
exports.regex = regex;
|
|
6
6
|
exports.url = exports.string = void 0;
|
|
7
7
|
|
|
8
|
-
var Result = _interopRequireWildcard(require("../result"));
|
|
9
|
-
|
|
10
8
|
var _annotate = require("../annotate");
|
|
11
9
|
|
|
12
10
|
var _composition = require("./composition");
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
12
|
+
var _result = require("../result");
|
|
17
13
|
|
|
18
14
|
/** Match groups in this regex:
|
|
19
15
|
* \1 - the scheme
|
|
@@ -30,7 +26,7 @@ var DEFAULT_SCHEMES = ['https'];
|
|
|
30
26
|
*/
|
|
31
27
|
|
|
32
28
|
var string = function string(blob) {
|
|
33
|
-
return typeof blob === 'string' ?
|
|
29
|
+
return typeof blob === 'string' ? (0, _result.ok)(blob) : (0, _result.err)((0, _annotate.annotate)(blob, 'Must be string'));
|
|
34
30
|
};
|
|
35
31
|
/**
|
|
36
32
|
* Decoder that only returns Ok for non-empty string inputs. Err otherwise.
|
|
@@ -82,14 +78,14 @@ var url = function url(schemes) {
|
|
|
82
78
|
var matches = value.match(url_re);
|
|
83
79
|
|
|
84
80
|
if (!matches) {
|
|
85
|
-
return
|
|
81
|
+
return (0, _result.err)((0, _annotate.annotate)(value, 'Must be URL'));
|
|
86
82
|
} else {
|
|
87
83
|
var scheme = matches[1];
|
|
88
84
|
|
|
89
85
|
if (schemes.length === 0 || schemes.includes(scheme.toLowerCase())) {
|
|
90
|
-
return
|
|
86
|
+
return (0, _result.ok)(value);
|
|
91
87
|
} else {
|
|
92
|
-
return
|
|
88
|
+
return (0, _result.err)((0, _annotate.annotate)(value, "URL scheme must be any of: " + schemes.join(', ')));
|
|
93
89
|
}
|
|
94
90
|
}
|
|
95
91
|
});
|
package/core/string.js.flow
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
|
|
3
|
-
import * as Result from '../result';
|
|
4
3
|
import { annotate } from '../annotate';
|
|
5
4
|
import { compose, predicate } from './composition';
|
|
5
|
+
import { err, ok } from '../result';
|
|
6
6
|
import type { Decoder } from '../_types';
|
|
7
7
|
|
|
8
8
|
/** Match groups in this regex:
|
|
@@ -22,9 +22,7 @@ const DEFAULT_SCHEMES = ['https'];
|
|
|
22
22
|
* Decoder that only returns Ok for string inputs. Err otherwise.
|
|
23
23
|
*/
|
|
24
24
|
export const string: Decoder<string> = (blob: mixed) => {
|
|
25
|
-
return typeof blob === 'string'
|
|
26
|
-
? Result.ok(blob)
|
|
27
|
-
: Result.err(annotate(blob, 'Must be string'));
|
|
25
|
+
return typeof blob === 'string' ? ok(blob) : err(annotate(blob, 'Must be string'));
|
|
28
26
|
};
|
|
29
27
|
|
|
30
28
|
/**
|
|
@@ -68,13 +66,13 @@ export const url = (schemes: $ReadOnlyArray<string> = DEFAULT_SCHEMES): Decoder<
|
|
|
68
66
|
compose(string, (value: string) => {
|
|
69
67
|
const matches = value.match(url_re);
|
|
70
68
|
if (!matches) {
|
|
71
|
-
return
|
|
69
|
+
return err(annotate(value, 'Must be URL'));
|
|
72
70
|
} else {
|
|
73
71
|
const scheme = matches[1];
|
|
74
72
|
if (schemes.length === 0 || schemes.includes(scheme.toLowerCase())) {
|
|
75
|
-
return
|
|
73
|
+
return ok(value);
|
|
76
74
|
} else {
|
|
77
|
-
return
|
|
75
|
+
return err(
|
|
78
76
|
annotate(value, `URL scheme must be any of: ${schemes.join(', ')}`),
|
|
79
77
|
);
|
|
80
78
|
}
|