@bessemer/cornerstone 0.5.109 → 0.5.110
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/array.d.ts +2 -1
- package/dist/array.d.ts.map +1 -1
- package/dist/array.js +11 -0
- package/dist/array.js.map +1 -1
- package/dist/either.d.ts +23 -40
- package/dist/either.d.ts.map +1 -1
- package/dist/either.js +50 -88
- package/dist/either.js.map +1 -1
- package/dist/error/error-event.d.ts.map +1 -1
- package/dist/error/error-event.js +3 -2
- package/dist/error/error-event.js.map +1 -1
- package/dist/error/error.d.ts +10 -0
- package/dist/error/error.d.ts.map +1 -1
- package/dist/error/error.js +21 -2
- package/dist/error/error.js.map +1 -1
- package/dist/generators.d.ts +2 -0
- package/dist/generators.d.ts.map +1 -0
- package/dist/generators.js +14 -0
- package/dist/generators.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +2 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js.map +1 -1
- package/dist/math.d.ts +2 -0
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +9 -1
- package/dist/math.js.map +1 -1
- package/dist/mime-type.d.ts +4 -3
- package/dist/mime-type.d.ts.map +1 -1
- package/dist/mime-type.js +9 -6
- package/dist/mime-type.js.map +1 -1
- package/dist/net/content-type.d.ts +21 -0
- package/dist/net/content-type.d.ts.map +1 -0
- package/dist/net/content-type.js +120 -0
- package/dist/net/content-type.js.map +1 -0
- package/dist/net/fetch.d.ts +18 -0
- package/dist/net/fetch.d.ts.map +1 -0
- package/dist/net/fetch.js +65 -0
- package/dist/net/fetch.js.map +1 -0
- package/dist/net/http-method.d.ts +18 -0
- package/dist/net/http-method.d.ts.map +1 -0
- package/dist/net/http-method.js +37 -0
- package/dist/net/http-method.js.map +1 -0
- package/dist/net/http-request.d.ts +12 -0
- package/dist/net/http-request.d.ts.map +1 -0
- package/dist/net/http-request.js +1 -0
- package/dist/net/http-request.js.map +1 -0
- package/dist/net/uri-host-name.d.ts +1 -1
- package/dist/net/uri-host-name.d.ts.map +1 -1
- package/dist/net/uri-host-name.js +6 -6
- package/dist/net/uri-host-name.js.map +1 -1
- package/dist/net/uri.d.ts +12 -4
- package/dist/net/uri.d.ts.map +1 -1
- package/dist/net/uri.js +87 -36
- package/dist/net/uri.js.map +1 -1
- package/dist/net/url.d.ts +9 -6
- package/dist/net/url.d.ts.map +1 -1
- package/dist/net/url.js +58 -21
- package/dist/net/url.js.map +1 -1
- package/dist/object/object-diff.d.ts.map +1 -1
- package/dist/object/object-diff.js.map +1 -1
- package/dist/object/type-path.d.ts.map +1 -1
- package/dist/object/type-path.js +12 -14
- package/dist/object/type-path.js.map +1 -1
- package/dist/object.d.ts +2 -0
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +17 -1
- package/dist/object.js.map +1 -1
- package/dist/promise.d.ts +3 -1
- package/dist/promise.d.ts.map +1 -1
- package/dist/promise.js +9 -0
- package/dist/promise.js.map +1 -1
- package/dist/proxy.d.ts +2 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +20 -0
- package/dist/proxy.js.map +1 -0
- package/dist/result.d.ts +18 -20
- package/dist/result.d.ts.map +1 -1
- package/dist/result.js +41 -61
- package/dist/result.js.map +1 -1
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +3 -3
- package/dist/retry.js.map +1 -1
- package/dist/sql/sql-expression-parser.d.ts.map +1 -1
- package/dist/sql/sql-expression-parser.js +5 -5
- package/dist/sql/sql-expression-parser.js.map +1 -1
- package/dist/string.d.ts +1 -0
- package/dist/string.d.ts.map +1 -1
- package/dist/string.js +4 -0
- package/dist/string.js.map +1 -1
- package/dist/temporal/duration.d.ts.map +1 -1
- package/dist/temporal/duration.js +2 -1
- package/dist/temporal/duration.js.map +1 -1
- package/dist/temporal/instant.d.ts.map +1 -1
- package/dist/temporal/instant.js +2 -1
- package/dist/temporal/instant.js.map +1 -1
- package/dist/temporal/plain-date-time.d.ts.map +1 -1
- package/dist/temporal/plain-date-time.js +2 -1
- package/dist/temporal/plain-date-time.js.map +1 -1
- package/dist/temporal/plain-date.d.ts.map +1 -1
- package/dist/temporal/plain-date.js +2 -1
- package/dist/temporal/plain-date.js.map +1 -1
- package/dist/temporal/plain-time.d.ts.map +1 -1
- package/dist/temporal/plain-time.js +2 -1
- package/dist/temporal/plain-time.js.map +1 -1
- package/dist/temporal/zoned-date-time.d.ts.map +1 -1
- package/dist/temporal/zoned-date-time.js +2 -1
- package/dist/temporal/zoned-date-time.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/zod-util.d.ts +55 -6
- package/dist/zod-util.d.ts.map +1 -1
- package/dist/zod-util.js +99 -11
- package/dist/zod-util.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/object/type-path.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport Zod from 'zod'\nimport {\n IndexSelector,\n InferTypePath,\n NameSelector,\n ParseTypePath,\n TypePathConcreteType,\n TypePathGet,\n TypePathSelector,\n TypePathType,\n WildcardSelector,\n} from '@bessemer/cornerstone/object/type-path-type'\nimport { isNil, isObject } from '@bessemer/cornerstone/object'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { contains, containsAll, isEmpty, only } from '@bessemer/cornerstone/array'\nimport { failure, Result, success } from '@bessemer/cornerstone/result'\n\n// JOHN this probably should be brought into the structured transform regime\nexport type TypePath<T extends TypePathType = TypePathType> = TaggedType<TypePathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends TypePathConcreteType>(value: T): TypePath<InferTypePath<T>> => {\n return value as TypePath<InferTypePath<T>>\n}\n\nconst TypePathRegex =\n /^(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])(?:\\.(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+)|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])*$|^$/\n\nexport const from = <T extends string>(path: T): TypePath<ParseTypePath<T>> => {\n assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`)\n\n if (path === '') {\n return [] as TypePath<ParseTypePath<T>>\n }\n\n const segments: Array<string | Array<string | number>> = []\n let current = ''\n let i = 0\n\n while (i < path.length) {\n const char = path[i]\n\n if (char === '.') {\n if (current) {\n segments.push(current)\n current = ''\n }\n i++\n } else if (char === '[') {\n if (current) {\n segments.push(current)\n current = ''\n }\n\n // Find the matching closing bracket\n let bracketContent = ''\n i++ // Skip opening bracket\n let depth = 1\n\n while (i < path.length && depth > 0) {\n const bracketChar = path[i]\n if (bracketChar === '[') {\n depth++\n } else if (bracketChar === ']') {\n depth--\n }\n\n if (depth > 0) {\n bracketContent += bracketChar\n }\n i++\n }\n\n if (bracketContent === '*') {\n segments.push('*')\n } else {\n const indices = bracketContent\n .split(',')\n .map((s) => s.trim())\n .map((s) => parseInt(s, 10))\n\n segments.push(indices)\n }\n } else {\n current += char\n i++\n }\n }\n\n // Add any remaining current segment\n if (current) {\n segments.push(current)\n }\n\n return segments as TypePath<ParseTypePath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return from(it)\n }\n})\n\nexport const getValue = <T extends TypePathType, N>(path: TypePath<T>, object: N): TypePathGet<T, N> => {\n let current: unknown = object\n let collectorMode = false\n\n for (const selector of path) {\n if (isNil(current)) {\n return undefined as TypePathGet<T, N>\n }\n\n if (collectorMode) {\n if (!Array.isArray(current)) {\n throw new Error('Illegal State - in collectorMode but current value is not an Array')\n }\n\n const result = current.flatMap((it) => {\n const [value, isCollecting] = evaluateSelector(selector, it)\n if (isCollecting) {\n return value\n } else {\n return [value]\n }\n })\n\n current = result\n } else {\n const [result, isCollecting] = evaluateSelector(selector, current)\n current = result\n collectorMode = isCollecting\n }\n }\n\n return current as TypePathGet<T, N>\n}\n\nconst evaluateSelector = (selector: TypePathSelector, current: unknown): [unknown, boolean] => {\n if (isWildcardSelector(selector)) {\n return evaluateWildcardSelector(current)\n }\n\n if (Array.isArray(selector)) {\n return evaluateIndexSelector(selector as IndexSelector, current)\n }\n\n return evaluateNameSelector(selector, current)\n}\n\nconst evaluateNameSelector = (selector: NameSelector, current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n const numberSelector = Number(selector)\n assert(isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`)\n return evaluateIndexSelector([numberSelector], current)\n }\n\n if (!isObject(current)) {\n return [undefined, false]\n }\n\n return [current[selector], false]\n}\n\nconst evaluateWildcardSelector = (current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n return [current, true]\n }\n\n if (isObject(current)) {\n throw new Error('Wildcard operations on Objects is not yet supported')\n }\n\n throw new Error(`Unable to apply wildcard operator to value: ${current}`)\n}\n\nconst evaluateIndexSelector = (selector: IndexSelector, current: unknown): [unknown, boolean] => {\n if (!Array.isArray(current)) {\n throw new Error(`Unable to apply index operator to value: ${current}`)\n }\n\n if (selector.length === 1) {\n return [current[only(selector)], false]\n }\n\n const indexSelector = selector as IndexSelector\n const result = indexSelector.map((it) => current[it])\n return [result, true]\n}\n\nexport const isWildcardSelector = (selector: TypePathSelector): selector is WildcardSelector => {\n return selector === '*'\n}\n\nexport const matches = <MatchingPath extends TypePathType>(\n targetPath: TypePath,\n matchingPath: TypePath<MatchingPath>\n): targetPath is TypePath<MatchingPath> => {\n if (targetPath.length < matchingPath.length) {\n return false\n }\n\n let index = 0\n for (const targetPathSelector of targetPath) {\n const matchingPathSelector = matchingPath[index]\n\n if (isNil(matchingPathSelector)) {\n return true\n } else if (isWildcardSelector(matchingPathSelector)) {\n // Matching path wildcards always match - they're wild\n } else if (isWildcardSelector(targetPathSelector)) {\n return false\n } else if (Array.isArray(matchingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n if (!containsAll(matchingPathSelector, targetPathSelector)) {\n return false\n }\n } else {\n if (!contains(matchingPathSelector, Number(targetPathSelector))) {\n return false\n }\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return false\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(matchingPathSelector)) {\n return false\n }\n } else {\n if (targetPathSelector !== matchingPathSelector) {\n return false\n }\n }\n }\n\n index++\n }\n\n return true\n}\n\nexport const intersectAny = (targetPath: TypePath, intersectingPath: TypePath): Result<TypePath> => {\n if (targetPath.length < intersectingPath.length) {\n return failure(new Error(`TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`))\n }\n\n let index = 0\n let result: TypePathConcreteType = []\n for (const targetPathSelector of targetPath) {\n const intersectingPathSelector = intersectingPath[index]\n const makeError = () =>\n new Error(`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`)\n\n if (isNil(intersectingPathSelector)) {\n return success(of(result))\n } else if (isWildcardSelector(intersectingPathSelector)) {\n result.push(targetPathSelector)\n } else if (isWildcardSelector(targetPathSelector)) {\n return failure(makeError())\n } else if (Array.isArray(intersectingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n const filteredTargetPaths = targetPathSelector.filter((it) => contains(intersectingPathSelector, it))\n if (isEmpty(filteredTargetPaths)) {\n return failure(makeError())\n }\n\n result.push(filteredTargetPaths)\n } else {\n if (!contains(intersectingPathSelector, Number(targetPathSelector))) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return failure(makeError())\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n } else {\n if (targetPathSelector !== intersectingPathSelector) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n }\n\n index++\n }\n\n return success(of(result))\n}\n\n// JOHN this needs to do a type resolution step...\nexport const intersect = <TargetPath extends TypePathType, IntersectingPath extends TypePathType>(\n targetPath: TypePath<TargetPath>,\n intersectingPath: TypePath<IntersectingPath>\n): TypePath => {\n const result = intersectAny(targetPath, intersectingPath)\n if (!result.isSuccess) {\n throw result.value\n }\n\n return result.value\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/object/type-path.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport Zod from 'zod'\nimport {\n IndexSelector,\n InferTypePath,\n NameSelector,\n ParseTypePath,\n TypePathConcreteType,\n TypePathGet,\n TypePathSelector,\n TypePathType,\n WildcardSelector,\n} from '@bessemer/cornerstone/object/type-path-type'\nimport { isNil, isObject } from '@bessemer/cornerstone/object'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { contains, containsAll, isEmpty, only } from '@bessemer/cornerstone/array'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { Result } from '@bessemer/cornerstone/result'\n\n// JOHN this probably should be brought into the structured transform regime\nexport type TypePath<T extends TypePathType = TypePathType> = TaggedType<TypePathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends TypePathConcreteType>(value: T): TypePath<InferTypePath<T>> => {\n return value as TypePath<InferTypePath<T>>\n}\n\nconst TypePathRegex =\n /^(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])(?:\\.(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+)|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])*$|^$/\n\nexport const from = <T extends string>(path: T): TypePath<ParseTypePath<T>> => {\n assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`)\n\n if (path === '') {\n return [] as TypePath<ParseTypePath<T>>\n }\n\n const segments: Array<string | Array<string | number>> = []\n let current = ''\n let i = 0\n\n while (i < path.length) {\n const char = path[i]\n\n if (char === '.') {\n if (current) {\n segments.push(current)\n current = ''\n }\n i++\n } else if (char === '[') {\n if (current) {\n segments.push(current)\n current = ''\n }\n\n // Find the matching closing bracket\n let bracketContent = ''\n i++ // Skip opening bracket\n let depth = 1\n\n while (i < path.length && depth > 0) {\n const bracketChar = path[i]\n if (bracketChar === '[') {\n depth++\n } else if (bracketChar === ']') {\n depth--\n }\n\n if (depth > 0) {\n bracketContent += bracketChar\n }\n i++\n }\n\n if (bracketContent === '*') {\n segments.push('*')\n } else {\n const indices = bracketContent\n .split(',')\n .map((s) => s.trim())\n .map((s) => parseInt(s, 10))\n\n segments.push(indices)\n }\n } else {\n current += char\n i++\n }\n }\n\n // Add any remaining current segment\n if (current) {\n segments.push(current)\n }\n\n return segments as TypePath<ParseTypePath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return from(it)\n }\n})\n\nexport const getValue = <T extends TypePathType, N>(path: TypePath<T>, object: N): TypePathGet<T, N> => {\n let current: unknown = object\n let collectorMode = false\n\n for (const selector of path) {\n if (isNil(current)) {\n return undefined as TypePathGet<T, N>\n }\n\n if (collectorMode) {\n if (!Array.isArray(current)) {\n throw new Error('Illegal State - in collectorMode but current value is not an Array')\n }\n\n const result = current.flatMap((it) => {\n const [value, isCollecting] = evaluateSelector(selector, it)\n if (isCollecting) {\n return value\n } else {\n return [value]\n }\n })\n\n current = result\n } else {\n const [result, isCollecting] = evaluateSelector(selector, current)\n current = result\n collectorMode = isCollecting\n }\n }\n\n return current as TypePathGet<T, N>\n}\n\nconst evaluateSelector = (selector: TypePathSelector, current: unknown): [unknown, boolean] => {\n if (isWildcardSelector(selector)) {\n return evaluateWildcardSelector(current)\n }\n\n if (Array.isArray(selector)) {\n return evaluateIndexSelector(selector as IndexSelector, current)\n }\n\n return evaluateNameSelector(selector, current)\n}\n\nconst evaluateNameSelector = (selector: NameSelector, current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n const numberSelector = Number(selector)\n assert(isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`)\n return evaluateIndexSelector([numberSelector], current)\n }\n\n if (!isObject(current)) {\n return [undefined, false]\n }\n\n return [current[selector], false]\n}\n\nconst evaluateWildcardSelector = (current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n return [current, true]\n }\n\n if (isObject(current)) {\n throw new Error('Wildcard operations on Objects is not yet supported')\n }\n\n throw new Error(`Unable to apply wildcard operator to value: ${current}`)\n}\n\nconst evaluateIndexSelector = (selector: IndexSelector, current: unknown): [unknown, boolean] => {\n if (!Array.isArray(current)) {\n throw new Error(`Unable to apply index operator to value: ${current}`)\n }\n\n if (selector.length === 1) {\n return [current[only(selector)], false]\n }\n\n const indexSelector = selector as IndexSelector\n const result = indexSelector.map((it) => current[it])\n return [result, true]\n}\n\nexport const isWildcardSelector = (selector: TypePathSelector): selector is WildcardSelector => {\n return selector === '*'\n}\n\nexport const matches = <MatchingPath extends TypePathType>(\n targetPath: TypePath,\n matchingPath: TypePath<MatchingPath>\n): targetPath is TypePath<MatchingPath> => {\n if (targetPath.length < matchingPath.length) {\n return false\n }\n\n let index = 0\n for (const targetPathSelector of targetPath) {\n const matchingPathSelector = matchingPath[index]\n\n if (isNil(matchingPathSelector)) {\n return true\n } else if (isWildcardSelector(matchingPathSelector)) {\n // Matching path wildcards always match - they're wild\n } else if (isWildcardSelector(targetPathSelector)) {\n return false\n } else if (Array.isArray(matchingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n if (!containsAll(matchingPathSelector, targetPathSelector)) {\n return false\n }\n } else {\n if (!contains(matchingPathSelector, Number(targetPathSelector))) {\n return false\n }\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return false\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(matchingPathSelector)) {\n return false\n }\n } else {\n if (targetPathSelector !== matchingPathSelector) {\n return false\n }\n }\n }\n\n index++\n }\n\n return true\n}\n\nexport const intersectAny = (targetPath: TypePath, intersectingPath: TypePath): Result<TypePath> => {\n if (targetPath.length < intersectingPath.length) {\n return Results.failure(new Error(`TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`))\n }\n\n let index = 0\n let result: TypePathConcreteType = []\n for (const targetPathSelector of targetPath) {\n const intersectingPathSelector = intersectingPath[index]\n const makeError = () =>\n new Error(`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`)\n\n if (isNil(intersectingPathSelector)) {\n return Results.success(of(result))\n } else if (isWildcardSelector(intersectingPathSelector)) {\n result.push(targetPathSelector)\n } else if (isWildcardSelector(targetPathSelector)) {\n return Results.failure(makeError())\n } else if (Array.isArray(intersectingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n const filteredTargetPaths = targetPathSelector.filter((it) => contains(intersectingPathSelector, it))\n if (isEmpty(filteredTargetPaths)) {\n return Results.failure(makeError())\n }\n\n result.push(filteredTargetPaths)\n } else {\n if (!contains(intersectingPathSelector, Number(targetPathSelector))) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return Results.failure(makeError())\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n } else {\n if (targetPathSelector !== intersectingPathSelector) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n }\n\n index++\n }\n\n return Results.success(of(result))\n}\n\n// JOHN this needs to do a type resolution step...\nexport const intersect = <TargetPath extends TypePathType, IntersectingPath extends TypePathType>(\n targetPath: TypePath<TargetPath>,\n intersectingPath: TypePath<IntersectingPath>\n): TypePath => {\n const result = intersectAny(targetPath, intersectingPath)\n Results.assertSuccess(result)\n return result\n}\n"],"mappings":"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","names":[]}
|
package/dist/object.d.ts
CHANGED
|
@@ -51,5 +51,7 @@ export type RecordAttribute<Type = unknown, Class extends string = 'RecordAttrib
|
|
|
51
51
|
type RecordAttributeType<Attribute> = Attribute extends RecordAttribute<infer Type, string> ? Type : never;
|
|
52
52
|
export declare const getAttribute: <T extends RecordAttribute<unknown, string>>(record: UnknownRecord, attribute: T) => RecordAttributeType<T> | undefined;
|
|
53
53
|
export declare const coerceNil: <T>(value: T | null | undefined) => T | undefined;
|
|
54
|
+
export declare const omit: <T, K extends keyof T>(obj: T, keys: K[]) => Omit<T, K>;
|
|
55
|
+
export declare const pick: <T, K extends keyof T>(obj: T, keys: K[]) => Pick<T, K>;
|
|
54
56
|
export {};
|
|
55
57
|
//# sourceMappingURL=object.d.ts.map
|
package/dist/object.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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"}
|
package/dist/object.js
CHANGED
|
@@ -126,6 +126,20 @@ var getAttribute = (record, attribute) => {
|
|
|
126
126
|
var coerceNil = (value) => {
|
|
127
127
|
return isNil(value) ? void 0 : value;
|
|
128
128
|
};
|
|
129
|
+
var omit = (obj, keys) => {
|
|
130
|
+
const ret = { ...obj };
|
|
131
|
+
for (const key of keys) {
|
|
132
|
+
delete ret[key];
|
|
133
|
+
}
|
|
134
|
+
return ret;
|
|
135
|
+
};
|
|
136
|
+
var pick = (obj, keys) => {
|
|
137
|
+
const ret = {};
|
|
138
|
+
for (const key of keys) {
|
|
139
|
+
ret[key] = obj[key];
|
|
140
|
+
}
|
|
141
|
+
return ret;
|
|
142
|
+
};
|
|
129
143
|
export {
|
|
130
144
|
cloneDeep,
|
|
131
145
|
coerceNil,
|
|
@@ -147,6 +161,8 @@ export {
|
|
|
147
161
|
isPrimitive,
|
|
148
162
|
isUndefined,
|
|
149
163
|
isValidKey,
|
|
150
|
-
mapValues
|
|
164
|
+
mapValues,
|
|
165
|
+
omit,
|
|
166
|
+
pick
|
|
151
167
|
};
|
|
152
168
|
//# sourceMappingURL=object.js.map
|
package/dist/object.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/object.ts"],"sourcesContent":["import { cloneDeep as _cloneDeep, mapValues as _mapValues, merge as unsafeMerge, mergeWith as unsafeMergeWith } from 'lodash-es'\n\nimport { BasicType, Dictionary, TaggedType } from '@bessemer/cornerstone/types'\nimport { Primitive, UnknownRecord } from 'type-fest'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { isString } from '@bessemer/cornerstone/string'\nimport { isDate } from '@bessemer/cornerstone/temporal/date'\nimport { _isInstant } from '@bessemer/cornerstone/temporal/chrono'\n\nexport const isUndefined = (value: unknown): value is undefined => {\n return value === undefined\n}\n\nexport const isNull = (value: unknown): value is null => {\n return value === null\n}\n\nexport const isNil = (value: unknown): value is null | undefined => {\n return isNull(value) || isUndefined(value)\n}\n\nexport const isPresent = <T>(value: T): value is NonNullable<T> => {\n return !isNil(value)\n}\n\nexport const isObject = (value?: any): value is Dictionary<unknown> => {\n if (value === null || value === undefined || typeof value !== 'object') {\n return false\n }\n\n const proto = Object.getPrototypeOf(value)\n return proto !== null && Object.getPrototypeOf(proto) === null\n}\n\n// JOHN should this also check for the nil case?\nexport const isEmpty = (value: Record<string | number | symbol, unknown>): boolean => {\n return Object.keys(value).length === 0\n}\n\nexport const deepEqual = (value1: unknown, value2: unknown): boolean => {\n if (value1 === value2) {\n return true\n }\n\n // If either value is null or undefined, they're not equal (since we already checked ===)\n if (isNil(value1) || isNil(value2)) {\n return false\n }\n\n if (isDate(value1) && isDate(value2)) {\n return value1.getTime() === value2.getTime()\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString()\n }\n\n if (typeof value1 !== typeof value2) {\n return false\n }\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n if (value1.length !== value2.length) {\n return false\n }\n\n for (let i = 0; i < value1.length; i++) {\n if (!deepEqual(value1[i], value2[i])) {\n return false\n }\n }\n\n return true\n }\n\n if (isObject(value1) && isObject(value2)) {\n const keys1 = Object.keys(value1)\n const keys2 = Object.keys(value2)\n\n if (keys1.length !== keys2.length) {\n return false\n }\n\n for (const key of keys1) {\n if (!deepEqual(value1[key], value2[key])) {\n return false\n }\n }\n\n return true\n }\n\n return false\n}\n\nexport const mapValues = _mapValues\n\nexport const cloneDeep = _cloneDeep\n\nexport function deepMerge<TObject, TSource>(object: TObject, source: TSource): TObject & TSource\nexport function deepMerge<TObject, TSource1, TSource2>(object: TObject, source1: TSource1, source2: TSource2): TObject & TSource1 & TSource2\nexport function deepMerge<TObject, TSource1, TSource2, TSource3>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3\n): TObject & TSource1 & TSource2 & TSource3\nexport function deepMerge<TObject, TSource1, TSource2, TSource3, TSource4>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3,\n source4: TSource4\n): TObject & TSource1 & TSource2 & TSource3 & TSource4\nexport function deepMerge(object: any, ...otherArgs: any[]): any {\n return unsafeMerge({}, object, ...otherArgs)\n}\n\nexport const deepMergeAll = <T>(objects: Array<T>): T => {\n return objects.reduce((x, y) => deepMerge(x, y))\n}\n\nexport function deepMergeInto<Source1, Source2>(source: Source1, values: Source2): asserts source is Source1 & Source2 {\n unsafeMerge(source, values)\n}\n\nexport const deepMergeWith: typeof unsafeMergeWith = (...args: Array<any>) => {\n const clone = cloneDeep(args[0])\n return unsafeMergeWith.apply(null, [clone, ...args.slice(1)])\n}\n\nexport type ObjectDiffResult = {\n elementsUpdated: Record<string, { originalValue: unknown; updatedValue: unknown }>\n elementsAdded: UnknownRecord\n elementsRemoved: UnknownRecord\n}\n\nexport function diffShallow(original: UnknownRecord, updated: UnknownRecord): ObjectDiffResult {\n const result: ObjectDiffResult = {\n elementsUpdated: {},\n elementsAdded: {},\n elementsRemoved: {},\n }\n\n for (const [key, originalValue] of Object.entries(original)) {\n const updatedValue = updated[key]\n if (updatedValue === undefined) {\n result.elementsRemoved[key] = originalValue\n } else if (!deepEqual(originalValue, updatedValue)) {\n result.elementsUpdated[key] = { originalValue: originalValue, updatedValue: updatedValue }\n }\n }\n\n for (const [key, updatedValue] of Object.entries(updated)) {\n const originalValue = original[key]\n if (originalValue === undefined) {\n result.elementsAdded[key] = updatedValue\n }\n }\n return result\n}\n\nexport const isValidKey = (field: PropertyKey, obj: object): field is keyof typeof obj => {\n return field in obj\n}\n\n/** Determines if the list of fields are present on the object (not null or undefined), with type inference */\nexport function fieldsPresent<T extends object, K extends keyof T>(\n object: T,\n fields: Array<K>\n): object is Exclude<T, K> & Required<{ [P in K]: NonNullable<T[P]> }> {\n return fields.every((field) => isPresent(object[field]))\n}\n\nexport const isPrimitive = (value: any): value is Primitive => {\n return value === null || (typeof value !== 'object' && typeof value !== 'function')\n}\n\nexport const isBasic = (value: any): value is BasicType => {\n return isNumber(value) || isString(value) || isDate(value) || isBoolean(value) || _isInstant(value)\n}\n\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === 'boolean'\n}\n\ntype TransformFunction = (value: any, path: (string | number)[], key: string | number, parent: any) => any\n\nconst walk = (value: any, transform: TransformFunction, path: (string | number)[] = []): any => {\n if (isNil(value) || isPrimitive(value)) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((value, index) => {\n const currentPath = [...path, index]\n return walk(transform(value, currentPath, index, value), transform, currentPath)\n })\n }\n\n const result: any = {}\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const currentPath = [...path, key]\n const transformedValue = transform(value[key], currentPath, key, value)\n result[key] = walk(transformedValue, transform, currentPath)\n }\n }\n\n return result\n}\n\nexport type RecordAttribute<Type = unknown, Class extends string = 'RecordAttribute'> = TaggedType<string, [Type, Class]>\ntype RecordAttributeType<Attribute> = Attribute extends RecordAttribute<infer Type, string> ? Type : never\n\nexport const getAttribute = <T extends RecordAttribute<unknown, string>>(record: UnknownRecord, attribute: T): RecordAttributeType<T> | undefined => {\n return record[attribute] as RecordAttributeType<T> | undefined\n}\n\nexport const coerceNil = <T>(value: T | null | undefined): T | undefined => {\n return isNil(value) ? undefined : value\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/object.ts"],"sourcesContent":["import { cloneDeep as _cloneDeep, mapValues as _mapValues, merge as unsafeMerge, mergeWith as unsafeMergeWith } from 'lodash-es'\n\nimport { BasicType, Dictionary, TaggedType } from '@bessemer/cornerstone/types'\nimport { Primitive, UnknownRecord } from 'type-fest'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { isString } from '@bessemer/cornerstone/string'\nimport { isDate } from '@bessemer/cornerstone/temporal/date'\nimport { _isInstant } from '@bessemer/cornerstone/temporal/chrono'\n\nexport const isUndefined = (value: unknown): value is undefined => {\n return value === undefined\n}\n\nexport const isNull = (value: unknown): value is null => {\n return value === null\n}\n\nexport const isNil = (value: unknown): value is null | undefined => {\n return isNull(value) || isUndefined(value)\n}\n\nexport const isPresent = <T>(value: T): value is NonNullable<T> => {\n return !isNil(value)\n}\n\nexport const isObject = (value?: any): value is Dictionary<unknown> => {\n if (value === null || value === undefined || typeof value !== 'object') {\n return false\n }\n\n const proto = Object.getPrototypeOf(value)\n return proto !== null && Object.getPrototypeOf(proto) === null\n}\n\n// JOHN should this also check for the nil case?\nexport const isEmpty = (value: Record<string | number | symbol, unknown>): boolean => {\n return Object.keys(value).length === 0\n}\n\nexport const deepEqual = (value1: unknown, value2: unknown): boolean => {\n if (value1 === value2) {\n return true\n }\n\n // If either value is null or undefined, they're not equal (since we already checked ===)\n if (isNil(value1) || isNil(value2)) {\n return false\n }\n\n if (isDate(value1) && isDate(value2)) {\n return value1.getTime() === value2.getTime()\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString()\n }\n\n if (typeof value1 !== typeof value2) {\n return false\n }\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n if (value1.length !== value2.length) {\n return false\n }\n\n for (let i = 0; i < value1.length; i++) {\n if (!deepEqual(value1[i], value2[i])) {\n return false\n }\n }\n\n return true\n }\n\n if (isObject(value1) && isObject(value2)) {\n const keys1 = Object.keys(value1)\n const keys2 = Object.keys(value2)\n\n if (keys1.length !== keys2.length) {\n return false\n }\n\n for (const key of keys1) {\n if (!deepEqual(value1[key], value2[key])) {\n return false\n }\n }\n\n return true\n }\n\n return false\n}\n\nexport const mapValues = _mapValues\n\nexport const cloneDeep = _cloneDeep\n\nexport function deepMerge<TObject, TSource>(object: TObject, source: TSource): TObject & TSource\nexport function deepMerge<TObject, TSource1, TSource2>(object: TObject, source1: TSource1, source2: TSource2): TObject & TSource1 & TSource2\nexport function deepMerge<TObject, TSource1, TSource2, TSource3>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3\n): TObject & TSource1 & TSource2 & TSource3\nexport function deepMerge<TObject, TSource1, TSource2, TSource3, TSource4>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3,\n source4: TSource4\n): TObject & TSource1 & TSource2 & TSource3 & TSource4\nexport function deepMerge(object: any, ...otherArgs: any[]): any {\n return unsafeMerge({}, object, ...otherArgs)\n}\n\nexport const deepMergeAll = <T>(objects: Array<T>): T => {\n return objects.reduce((x, y) => deepMerge(x, y))\n}\n\nexport function deepMergeInto<Source1, Source2>(source: Source1, values: Source2): asserts source is Source1 & Source2 {\n unsafeMerge(source, values)\n}\n\nexport const deepMergeWith: typeof unsafeMergeWith = (...args: Array<any>) => {\n const clone = cloneDeep(args[0])\n return unsafeMergeWith.apply(null, [clone, ...args.slice(1)])\n}\n\nexport type ObjectDiffResult = {\n elementsUpdated: Record<string, { originalValue: unknown; updatedValue: unknown }>\n elementsAdded: UnknownRecord\n elementsRemoved: UnknownRecord\n}\n\nexport function diffShallow(original: UnknownRecord, updated: UnknownRecord): ObjectDiffResult {\n const result: ObjectDiffResult = {\n elementsUpdated: {},\n elementsAdded: {},\n elementsRemoved: {},\n }\n\n for (const [key, originalValue] of Object.entries(original)) {\n const updatedValue = updated[key]\n if (updatedValue === undefined) {\n result.elementsRemoved[key] = originalValue\n } else if (!deepEqual(originalValue, updatedValue)) {\n result.elementsUpdated[key] = { originalValue: originalValue, updatedValue: updatedValue }\n }\n }\n\n for (const [key, updatedValue] of Object.entries(updated)) {\n const originalValue = original[key]\n if (originalValue === undefined) {\n result.elementsAdded[key] = updatedValue\n }\n }\n return result\n}\n\nexport const isValidKey = (field: PropertyKey, obj: object): field is keyof typeof obj => {\n return field in obj\n}\n\n/** Determines if the list of fields are present on the object (not null or undefined), with type inference */\nexport function fieldsPresent<T extends object, K extends keyof T>(\n object: T,\n fields: Array<K>\n): object is Exclude<T, K> & Required<{ [P in K]: NonNullable<T[P]> }> {\n return fields.every((field) => isPresent(object[field]))\n}\n\nexport const isPrimitive = (value: any): value is Primitive => {\n return value === null || (typeof value !== 'object' && typeof value !== 'function')\n}\n\nexport const isBasic = (value: any): value is BasicType => {\n return isNumber(value) || isString(value) || isDate(value) || isBoolean(value) || _isInstant(value)\n}\n\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === 'boolean'\n}\n\ntype TransformFunction = (value: any, path: (string | number)[], key: string | number, parent: any) => any\n\nconst walk = (value: any, transform: TransformFunction, path: (string | number)[] = []): any => {\n if (isNil(value) || isPrimitive(value)) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((value, index) => {\n const currentPath = [...path, index]\n return walk(transform(value, currentPath, index, value), transform, currentPath)\n })\n }\n\n const result: any = {}\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const currentPath = [...path, key]\n const transformedValue = transform(value[key], currentPath, key, value)\n result[key] = walk(transformedValue, transform, currentPath)\n }\n }\n\n return result\n}\n\nexport type RecordAttribute<Type = unknown, Class extends string = 'RecordAttribute'> = TaggedType<string, [Type, Class]>\ntype RecordAttributeType<Attribute> = Attribute extends RecordAttribute<infer Type, string> ? Type : never\n\nexport const getAttribute = <T extends RecordAttribute<unknown, string>>(record: UnknownRecord, attribute: T): RecordAttributeType<T> | undefined => {\n return record[attribute] as RecordAttributeType<T> | undefined\n}\n\nexport const coerceNil = <T>(value: T | null | undefined): T | undefined => {\n return isNil(value) ? undefined : value\n}\n\nexport const omit = <T, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> => {\n const ret = { ...obj }\n for (const key of keys) {\n delete ret[key]\n }\n return ret\n}\n\nexport const pick = <T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> => {\n const ret = {} as Pick<T, K>\n for (const key of keys) {\n ret[key] = obj[key]\n }\n return ret\n}\n"],"mappings":"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","names":[]}
|
package/dist/promise.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { Promisable } from 'type-fest';
|
|
1
2
|
export type PromiseContext<T> = {
|
|
2
3
|
promise: Promise<T>;
|
|
3
4
|
resolve: (value: T) => void;
|
|
4
5
|
reject: (reason?: any) => void;
|
|
5
6
|
};
|
|
6
|
-
export declare const isPromise: <T>(element:
|
|
7
|
+
export declare const isPromise: <T>(element: Promisable<T>) => element is PromiseLike<T>;
|
|
8
|
+
export declare const map: <T, N>(value: Promisable<T>, mapper: (value: T) => N) => Promisable<N>;
|
|
7
9
|
export declare const toPromise: <T>(element: T | Promise<T>) => Promise<T>;
|
|
8
10
|
export declare const create: <T>() => PromiseContext<T>;
|
|
9
11
|
//# sourceMappingURL=promise.d.ts.map
|
package/dist/promise.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAGtC,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAAE,CAAA;AAEpH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC,KAAG,OAAO,IAAI,WAAW,CAAC,CAAC,CAM7E,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAG,UAAU,CAAC,CAAC,CAMrF,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAQ/D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,CAAC,OAAK,cAAc,CAAC,CAAC,CAS5C,CAAA"}
|
package/dist/promise.js
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
// src/promise.ts
|
|
2
2
|
import { isNil } from "@bessemer/cornerstone/object";
|
|
3
|
+
import { executeAsync } from "@bessemer/cornerstone/internal";
|
|
3
4
|
var isPromise = (element) => {
|
|
4
5
|
if (isNil(element)) {
|
|
5
6
|
return false;
|
|
6
7
|
}
|
|
7
8
|
return typeof element.then === "function";
|
|
8
9
|
};
|
|
10
|
+
var map = (value, mapper) => {
|
|
11
|
+
if (isPromise(value)) {
|
|
12
|
+
return executeAsync(async () => mapper(await value));
|
|
13
|
+
} else {
|
|
14
|
+
return mapper(value);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
9
17
|
var toPromise = (element) => {
|
|
10
18
|
if (isPromise(element)) {
|
|
11
19
|
return element;
|
|
@@ -26,6 +34,7 @@ var create = () => {
|
|
|
26
34
|
export {
|
|
27
35
|
create,
|
|
28
36
|
isPromise,
|
|
37
|
+
map,
|
|
29
38
|
toPromise
|
|
30
39
|
};
|
|
31
40
|
//# sourceMappingURL=promise.js.map
|
package/dist/promise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/promise.ts"],"sourcesContent":["import { isNil } from '@bessemer/cornerstone/object'\n\nexport type PromiseContext<T> = { promise: Promise<T>; resolve: (value: T) => void; reject: (reason?: any) => void }\n\nexport const isPromise = <T>(element:
|
|
1
|
+
{"version":3,"sources":["../src/promise.ts"],"sourcesContent":["import { isNil } from '@bessemer/cornerstone/object'\nimport { Promisable } from 'type-fest'\nimport { executeAsync } from '@bessemer/cornerstone/internal'\n\nexport type PromiseContext<T> = { promise: Promise<T>; resolve: (value: T) => void; reject: (reason?: any) => void }\n\nexport const isPromise = <T>(element: Promisable<T>): element is PromiseLike<T> => {\n if (isNil(element)) {\n return false\n }\n\n return typeof (element as Promise<T>).then === 'function'\n}\n\nexport const map = <T, N>(value: Promisable<T>, mapper: (value: T) => N): Promisable<N> => {\n if (isPromise(value)) {\n return executeAsync(async () => mapper(await value))\n } else {\n return mapper(value)\n }\n}\n\nexport const toPromise = <T>(element: T | Promise<T>): Promise<T> => {\n if (isPromise(element)) {\n return element\n }\n\n const { resolve, promise } = create<T>()\n resolve(element)\n return promise\n}\n\nexport const create = <T>(): PromiseContext<T> => {\n let resolveVar\n let rejectVar\n const promise = new Promise<T>((resolve, reject) => {\n resolveVar = resolve\n rejectVar = reject\n })\n\n return { promise, resolve: resolveVar!, reject: rejectVar! }\n}\n"],"mappings":";AAAA,SAAS,aAAa;AAEtB,SAAS,oBAAoB;AAItB,IAAM,YAAY,CAAI,YAAsD;AACjF,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,OAAQ,QAAuB,SAAS;AACjD;AAEO,IAAM,MAAM,CAAO,OAAsB,WAA2C;AACzF,MAAI,UAAU,KAAK,GAAG;AACpB,WAAO,aAAa,YAAY,OAAO,MAAM,KAAK,CAAC;AAAA,EACrD,OAAO;AACL,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEO,IAAM,YAAY,CAAI,YAAwC;AACnE,MAAI,UAAU,OAAO,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,QAAQ,IAAI,OAAU;AACvC,UAAQ,OAAO;AACf,SAAO;AACT;AAEO,IAAM,SAAS,MAA4B;AAChD,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AAClD,iBAAa;AACb,gBAAY;AAAA,EACd,CAAC;AAED,SAAO,EAAE,SAAS,SAAS,YAAa,QAAQ,UAAW;AAC7D;","names":[]}
|
package/dist/proxy.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,GAAI,MAAM,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,MAAM,EAAE,YAAY,CAAC,KAAG,MAAM,GAAG,CAezH,CAAA"}
|
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// src/proxy.ts
|
|
2
|
+
import { isFunction } from "@bessemer/cornerstone/function";
|
|
3
|
+
var extend = (target, extensions) => {
|
|
4
|
+
return new Proxy(target, {
|
|
5
|
+
get(target2, prop, receiver) {
|
|
6
|
+
if (prop in extensions) {
|
|
7
|
+
return extensions[prop];
|
|
8
|
+
}
|
|
9
|
+
const value = Reflect.get(target2, prop, receiver);
|
|
10
|
+
if (isFunction(value)) {
|
|
11
|
+
return value.bind(target2);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
export {
|
|
18
|
+
extend
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/proxy.ts"],"sourcesContent":["import { isFunction } from '@bessemer/cornerstone/function'\n\nexport const extend = <Target extends object, E extends Record<string, unknown>>(target: Target, extensions: E): Target & E => {\n return new Proxy(target, {\n get(target, prop, receiver) {\n if (prop in extensions) {\n return extensions[prop as string]\n }\n\n const value = Reflect.get(target, prop, receiver)\n if (isFunction(value)) {\n return value.bind(target)\n }\n\n return value\n },\n }) as Target & E\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAEpB,IAAM,SAAS,CAA2D,QAAgB,eAA8B;AAC7H,SAAO,IAAI,MAAM,QAAQ;AAAA,IACvB,IAAIA,SAAQ,MAAM,UAAU;AAC1B,UAAI,QAAQ,YAAY;AACtB,eAAO,WAAW,IAAc;AAAA,MAClC;AAEA,YAAM,QAAQ,QAAQ,IAAIA,SAAQ,MAAM,QAAQ;AAChD,UAAI,WAAW,KAAK,GAAG;AACrB,eAAO,MAAM,KAAKA,OAAM;AAAA,MAC1B;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;","names":["target"]}
|
package/dist/result.d.ts
CHANGED
|
@@ -1,28 +1,26 @@
|
|
|
1
1
|
import { Left, Right } from '@bessemer/cornerstone/either';
|
|
2
|
-
|
|
3
|
-
export type
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
mapLeft: () => Success<SuccessType>;
|
|
8
|
-
[Symbol.iterator](): Generator<Result<SuccessType, never>, SuccessType>;
|
|
9
|
-
};
|
|
10
|
-
export type Failure<FailureType = unknown> = Omit<Left<FailureType>, 'map' | 'mapLeft'> & {
|
|
11
|
-
isSuccess: false;
|
|
12
|
-
getOrThrow: () => never;
|
|
13
|
-
map: () => Failure<FailureType>;
|
|
14
|
-
mapLeft: <T>(mapper: (element: FailureType) => T) => T extends Promise<infer U> ? Promise<Failure<U>> : Failure<T>;
|
|
15
|
-
[Symbol.iterator](): Generator<Result<never, FailureType>, never>;
|
|
16
|
-
};
|
|
17
|
-
export type Result<SuccessType, FailureType = unknown> = Failure<FailureType> | Success<SuccessType>;
|
|
18
|
-
export type AsyncResult<T, N = Throwable> = Promise<Result<T, N>>;
|
|
19
|
-
export declare const success: <T>(value: T) => Success<T>;
|
|
2
|
+
export type Success<SuccessType> = Left<SuccessType>;
|
|
3
|
+
export type Failure<FailureType = unknown> = Right<FailureType>;
|
|
4
|
+
export type Result<SuccessType, FailureType = unknown> = Success<SuccessType> | Failure<FailureType>;
|
|
5
|
+
export type AsyncResult<SuccessType, FailureType = unknown> = Promise<Result<SuccessType, FailureType>>;
|
|
6
|
+
export declare const success: <SuccessType>(value: SuccessType) => Success<SuccessType>;
|
|
20
7
|
export declare function failure(): Failure<never>;
|
|
21
8
|
export declare function failure<N>(failure: N): Failure<N>;
|
|
9
|
+
export declare const isSuccess: <SuccessType, FailureType>(value: Result<SuccessType, FailureType>) => value is Success<SuccessType>;
|
|
10
|
+
export declare const isFailure: <SuccessType, FailureType>(value: Result<SuccessType, FailureType>) => value is Failure<FailureType>;
|
|
11
|
+
export declare function assertSuccess<SuccessType, FailureType>(value: Result<SuccessType, FailureType>): asserts value is Success<SuccessType>;
|
|
12
|
+
export declare function assertFailure<SuccessType, FailureType>(value: Result<SuccessType, FailureType>): asserts value is Failure<FailureType>;
|
|
13
|
+
export declare function map<SuccessType, FailureType, MappedType>(value: Result<SuccessType, FailureType>, mapper: (value: SuccessType) => Promise<MappedType>): Promise<Result<MappedType, FailureType>>;
|
|
14
|
+
export declare function map<SuccessType, FailureType, MappedType>(value: Result<SuccessType, FailureType>, mapper: (value: SuccessType) => MappedType): Result<MappedType, FailureType>;
|
|
15
|
+
export declare function flatMap<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(value: Result<SuccessType, FailureType>, mapper: (value: SuccessType) => Promise<Result<MappedSuccessType, MappedFailureType>>): Promise<Result<MappedSuccessType, FailureType | MappedFailureType>>;
|
|
16
|
+
export declare function flatMap<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(value: Result<SuccessType, FailureType>, mapper: (value: SuccessType) => Result<MappedSuccessType, MappedFailureType>): Result<MappedSuccessType, FailureType | MappedFailureType>;
|
|
17
|
+
export declare function mapFailure<SuccessType, FailureType, MappedType>(value: Result<SuccessType, FailureType>, mapper: (value: FailureType) => Promise<MappedType>): Promise<Result<SuccessType, MappedType>>;
|
|
18
|
+
export declare function mapFailure<SuccessType, FailureType, MappedType>(value: Result<SuccessType, FailureType>, mapper: (value: FailureType) => MappedType): Result<SuccessType, MappedType>;
|
|
19
|
+
export declare function flatMapFailure<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(value: Result<SuccessType, FailureType>, mapper: (value: FailureType) => Promise<Result<MappedSuccessType, MappedFailureType>>): Promise<Result<SuccessType | MappedSuccessType, MappedFailureType>>;
|
|
20
|
+
export declare function flatMapFailure<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(value: Result<SuccessType, FailureType>, mapper: (value: FailureType) => Result<MappedSuccessType, MappedFailureType>): Result<SuccessType | MappedSuccessType, MappedFailureType>;
|
|
21
|
+
export declare const split: <SuccessType, FailureType>(array: Array<Result<SuccessType, FailureType>>) => [Array<SuccessType>, Array<FailureType>];
|
|
22
22
|
export declare function tryValue<SOURCE_VALUE>(resolver: () => Promise<SOURCE_VALUE>): AsyncResult<SOURCE_VALUE>;
|
|
23
23
|
export declare function tryValue<SOURCE_VALUE>(resolver: () => SOURCE_VALUE): Result<SOURCE_VALUE>;
|
|
24
24
|
export declare function tryResult<SOURCE_VALUE>(resolver: () => Result<SOURCE_VALUE>): Result<SOURCE_VALUE>;
|
|
25
25
|
export declare function tryResult<SOURCE_VALUE>(resolver: () => AsyncResult<SOURCE_VALUE>): AsyncResult<SOURCE_VALUE>;
|
|
26
|
-
export declare function gen<TGen extends () => Generator<Result<any, any>>>(generatorFn: TGen): TGen extends () => Generator<Result<any, infer L>, infer R> ? Result<R, L> : never;
|
|
27
|
-
export declare function gen<TGen extends () => AsyncGenerator<Result<any, any>>>(generatorFn: TGen): Promise<TGen extends () => AsyncGenerator<Result<any, infer L>, infer R> ? Result<R, L> : never>;
|
|
28
26
|
//# sourceMappingURL=result.d.ts.map
|
package/dist/result.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
|
package/dist/result.js
CHANGED
|
@@ -1,64 +1,40 @@
|
|
|
1
1
|
// src/result.ts
|
|
2
|
-
import { buildGenerator, LeftImpl, RightImpl } from "@bessemer/cornerstone/either";
|
|
3
2
|
import { isPromise } from "@bessemer/cornerstone/promise";
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
map = (mapper) => {
|
|
14
|
-
const mappedValue = mapper(this.value);
|
|
15
|
-
if (isPromise(mappedValue)) {
|
|
16
|
-
return executeAsync(async () => success(await mappedValue));
|
|
17
|
-
} else {
|
|
18
|
-
return success(mappedValue);
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
mapLeft = () => {
|
|
22
|
-
return this;
|
|
23
|
-
};
|
|
24
|
-
[Symbol.iterator]() {
|
|
25
|
-
return function* () {
|
|
26
|
-
return this.value;
|
|
27
|
-
}.call(this);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
var FailureImpl = class extends LeftImpl {
|
|
31
|
-
isSuccess = false;
|
|
32
|
-
constructor(value) {
|
|
33
|
-
super(value);
|
|
34
|
-
}
|
|
35
|
-
getOrThrow() {
|
|
36
|
-
throw this.value;
|
|
37
|
-
}
|
|
38
|
-
map = () => {
|
|
39
|
-
return this;
|
|
40
|
-
};
|
|
41
|
-
mapLeft = (mapper) => {
|
|
42
|
-
const mappedValue = mapper(this.value);
|
|
43
|
-
if (isPromise(mappedValue)) {
|
|
44
|
-
return executeAsync(async () => failure(await mappedValue));
|
|
45
|
-
} else {
|
|
46
|
-
return failure(mappedValue);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
[Symbol.iterator]() {
|
|
50
|
-
return function* () {
|
|
51
|
-
yield this;
|
|
52
|
-
throw new Error("Illegal State");
|
|
53
|
-
}.call(this);
|
|
54
|
-
}
|
|
3
|
+
import * as Eithers from "@bessemer/cornerstone/either";
|
|
4
|
+
import { assert } from "@bessemer/cornerstone/assertion";
|
|
5
|
+
var success = (value) => Eithers.left(value);
|
|
6
|
+
function failure(failure2) {
|
|
7
|
+
return Eithers.right(failure2);
|
|
8
|
+
}
|
|
9
|
+
var isSuccess = (value) => {
|
|
10
|
+
return Eithers.isLeft(value);
|
|
55
11
|
};
|
|
56
|
-
var
|
|
57
|
-
return
|
|
12
|
+
var isFailure = (value) => {
|
|
13
|
+
return Eithers.isRight(value);
|
|
58
14
|
};
|
|
59
|
-
function
|
|
60
|
-
|
|
15
|
+
function assertSuccess(value) {
|
|
16
|
+
if (isFailure(value)) {
|
|
17
|
+
throw value.value;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function assertFailure(value) {
|
|
21
|
+
assert(isFailure(value));
|
|
22
|
+
}
|
|
23
|
+
function map2(value, mapper) {
|
|
24
|
+
return Eithers.map(value, mapper);
|
|
61
25
|
}
|
|
26
|
+
function flatMap2(value, mapper) {
|
|
27
|
+
return Eithers.flatMap(value, mapper);
|
|
28
|
+
}
|
|
29
|
+
function mapFailure(value, mapper) {
|
|
30
|
+
return Eithers.mapRight(value, mapper);
|
|
31
|
+
}
|
|
32
|
+
function flatMapFailure(value, mapper) {
|
|
33
|
+
return Eithers.flatMapRight(value, mapper);
|
|
34
|
+
}
|
|
35
|
+
var split2 = (array) => {
|
|
36
|
+
return Eithers.split(array);
|
|
37
|
+
};
|
|
62
38
|
function tryValue(resolver) {
|
|
63
39
|
try {
|
|
64
40
|
let result = resolver();
|
|
@@ -83,13 +59,17 @@ function tryResult(resolver) {
|
|
|
83
59
|
return failure(e);
|
|
84
60
|
}
|
|
85
61
|
}
|
|
86
|
-
var generator = buildGenerator((it) => success(it));
|
|
87
|
-
function gen(generatorFn) {
|
|
88
|
-
return generator(generatorFn);
|
|
89
|
-
}
|
|
90
62
|
export {
|
|
63
|
+
assertFailure,
|
|
64
|
+
assertSuccess,
|
|
91
65
|
failure,
|
|
92
|
-
|
|
66
|
+
flatMap2 as flatMap,
|
|
67
|
+
flatMapFailure,
|
|
68
|
+
isFailure,
|
|
69
|
+
isSuccess,
|
|
70
|
+
map2 as map,
|
|
71
|
+
mapFailure,
|
|
72
|
+
split2 as split,
|
|
93
73
|
success,
|
|
94
74
|
tryResult,
|
|
95
75
|
tryValue
|
package/dist/result.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/result.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../src/result.ts"],"sourcesContent":["import { isPromise } from '@bessemer/cornerstone/promise'\nimport * as Eithers from '@bessemer/cornerstone/either'\nimport { Left, Right } from '@bessemer/cornerstone/either'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport { Promisable } from 'type-fest'\n\nexport type Success<SuccessType> = Left<SuccessType>\nexport type Failure<FailureType = unknown> = Right<FailureType>\nexport type Result<SuccessType, FailureType = unknown> = Success<SuccessType> | Failure<FailureType>\nexport type AsyncResult<SuccessType, FailureType = unknown> = Promise<Result<SuccessType, FailureType>>\n\nexport const success = <SuccessType>(value: SuccessType): Success<SuccessType> => Eithers.left(value)\n\nexport function failure(): Failure<never>\nexport function failure<N>(failure: N): Failure<N>\nexport function failure(failure?: unknown): Failure {\n return Eithers.right(failure)\n}\n\nexport const isSuccess = <SuccessType, FailureType>(value: Result<SuccessType, FailureType>): value is Success<SuccessType> => {\n return Eithers.isLeft(value)\n}\nexport const isFailure = <SuccessType, FailureType>(value: Result<SuccessType, FailureType>): value is Failure<FailureType> => {\n return Eithers.isRight(value)\n}\n\nexport function assertSuccess<SuccessType, FailureType>(value: Result<SuccessType, FailureType>): asserts value is Success<SuccessType> {\n if (isFailure(value)) {\n throw value.value\n }\n}\nexport function assertFailure<SuccessType, FailureType>(value: Result<SuccessType, FailureType>): asserts value is Failure<FailureType> {\n assert(isFailure(value))\n}\n\nexport function map<SuccessType, FailureType, MappedType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: SuccessType) => Promise<MappedType>\n): Promise<Result<MappedType, FailureType>>\nexport function map<SuccessType, FailureType, MappedType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: SuccessType) => MappedType\n): Result<MappedType, FailureType>\nexport function map<SuccessType, FailureType, MappedType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: SuccessType) => MappedType\n): Promisable<Result<MappedType, FailureType>> {\n return Eithers.map(value, mapper)\n}\n\nexport function flatMap<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: SuccessType) => Promise<Result<MappedSuccessType, MappedFailureType>>\n): Promise<Result<MappedSuccessType, FailureType | MappedFailureType>>\nexport function flatMap<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: SuccessType) => Result<MappedSuccessType, MappedFailureType>\n): Result<MappedSuccessType, FailureType | MappedFailureType>\nexport function flatMap<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: SuccessType) => Result<MappedSuccessType, MappedFailureType>\n): Promisable<Result<MappedSuccessType, FailureType | MappedFailureType>> {\n return Eithers.flatMap(value, mapper)\n}\n\nexport function mapFailure<SuccessType, FailureType, MappedType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: FailureType) => Promise<MappedType>\n): Promise<Result<SuccessType, MappedType>>\nexport function mapFailure<SuccessType, FailureType, MappedType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: FailureType) => MappedType\n): Result<SuccessType, MappedType>\nexport function mapFailure<SuccessType, FailureType, MappedType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: FailureType) => MappedType\n): Promisable<Result<SuccessType, MappedType>> {\n return Eithers.mapRight(value, mapper)\n}\n\nexport function flatMapFailure<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: FailureType) => Promise<Result<MappedSuccessType, MappedFailureType>>\n): Promise<Result<SuccessType | MappedSuccessType, MappedFailureType>>\nexport function flatMapFailure<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: FailureType) => Result<MappedSuccessType, MappedFailureType>\n): Result<SuccessType | MappedSuccessType, MappedFailureType>\nexport function flatMapFailure<SuccessType, FailureType, MappedSuccessType, MappedFailureType>(\n value: Result<SuccessType, FailureType>,\n mapper: (value: FailureType) => Result<MappedSuccessType, MappedFailureType>\n): Promisable<Result<SuccessType | MappedSuccessType, MappedFailureType>> {\n return Eithers.flatMapRight(value, mapper)\n}\n\nexport const split = <SuccessType, FailureType>(array: Array<Result<SuccessType, FailureType>>): [Array<SuccessType>, Array<FailureType>] => {\n return Eithers.split(array)\n}\n\nexport function tryValue<SOURCE_VALUE>(resolver: () => Promise<SOURCE_VALUE>): AsyncResult<SOURCE_VALUE>\nexport function tryValue<SOURCE_VALUE>(resolver: () => SOURCE_VALUE): Result<SOURCE_VALUE>\nexport function tryValue<SOURCE_VALUE>(resolver: () => SOURCE_VALUE | Promise<SOURCE_VALUE>): Result<SOURCE_VALUE> | Promise<Result<SOURCE_VALUE>> {\n try {\n let result = resolver()\n if (isPromise(result)) {\n return result.then((it) => success(it)).catch((it) => failure(it))\n } else {\n return success(result)\n }\n } catch (e: any) {\n return failure(e)\n }\n}\n\nexport function tryResult<SOURCE_VALUE>(resolver: () => Result<SOURCE_VALUE>): Result<SOURCE_VALUE>\nexport function tryResult<SOURCE_VALUE>(resolver: () => AsyncResult<SOURCE_VALUE>): AsyncResult<SOURCE_VALUE>\nexport function tryResult<SOURCE_VALUE>(resolver: () => Result<SOURCE_VALUE> | AsyncResult<SOURCE_VALUE>): ReturnType<typeof resolver> {\n try {\n let result = resolver()\n if (isPromise(result)) {\n return result.catch((it) => failure(it))\n } else {\n return result\n }\n } catch (e: any) {\n return failure(e)\n }\n}\n\n// const generator = buildGenerator((it) => success(it) as Result<any, any>)\n//\n// export function gen<TGen extends () => Generator<Result<any, any>>>(\n// generatorFn: TGen\n// ): TGen extends () => Generator<Result<any, infer L>, infer R> ? Result<R, L> : never\n// export function gen<TGen extends () => AsyncGenerator<Result<any, any>>>(\n// generatorFn: TGen\n// ): Promise<TGen extends () => AsyncGenerator<Result<any, infer L>, infer R> ? Result<R, L> : never>\n// export function gen<TGen extends () => Generator<Result<any, any>> | AsyncGenerator<Result<any, any>>>(\n// generatorFn: TGen\n// ): TGen extends () => Generator<Result<any, infer L>, infer R>\n// ? Result<R, L>\n// : TGen extends () => AsyncGenerator<Result<any, infer L>, infer R>\n// ? Promise<Result<R, L>>\n// : never {\n// return generator(generatorFn)\n// }\n"],"mappings":";AAAA,SAAS,iBAAiB;AAC1B,YAAY,aAAa;AAEzB,SAAS,cAAc;AAQhB,IAAM,UAAU,CAAc,UAAqD,aAAK,KAAK;AAI7F,SAAS,QAAQA,UAA4B;AAClD,SAAe,cAAMA,QAAO;AAC9B;AAEO,IAAM,YAAY,CAA2B,UAA2E;AAC7H,SAAe,eAAO,KAAK;AAC7B;AACO,IAAM,YAAY,CAA2B,UAA2E;AAC7H,SAAe,gBAAQ,KAAK;AAC9B;AAEO,SAAS,cAAwC,OAAgF;AACtI,MAAI,UAAU,KAAK,GAAG;AACpB,UAAM,MAAM;AAAA,EACd;AACF;AACO,SAAS,cAAwC,OAAgF;AACtI,SAAO,UAAU,KAAK,CAAC;AACzB;AAUO,SAASC,KACd,OACA,QAC6C;AAC7C,SAAe,YAAI,OAAO,MAAM;AAClC;AAUO,SAASC,SACd,OACA,QACwE;AACxE,SAAe,gBAAQ,OAAO,MAAM;AACtC;AAUO,SAAS,WACd,OACA,QAC6C;AAC7C,SAAe,iBAAS,OAAO,MAAM;AACvC;AAUO,SAAS,eACd,OACA,QACwE;AACxE,SAAe,qBAAa,OAAO,MAAM;AAC3C;AAEO,IAAMC,SAAQ,CAA2B,UAA6F;AAC3I,SAAe,cAAM,KAAK;AAC5B;AAIO,SAAS,SAAuB,UAA4G;AACjJ,MAAI;AACF,QAAI,SAAS,SAAS;AACtB,QAAI,UAAU,MAAM,GAAG;AACrB,aAAO,OAAO,KAAK,CAAC,OAAO,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,IACnE,OAAO;AACL,aAAO,QAAQ,MAAM;AAAA,IACvB;AAAA,EACF,SAAS,GAAQ;AACf,WAAO,QAAQ,CAAC;AAAA,EAClB;AACF;AAIO,SAAS,UAAwB,UAA+F;AACrI,MAAI;AACF,QAAI,SAAS,SAAS;AACtB,QAAI,UAAU,MAAM,GAAG;AACrB,aAAO,OAAO,MAAM,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,IACzC,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,SAAS,GAAQ;AACf,WAAO,QAAQ,CAAC;AAAA,EAClB;AACF;","names":["failure","map","flatMap","split"]}
|
package/dist/retry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA0C,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA0C,MAAM,yCAAyC,CAAA;AAE1G,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAMvC,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,QAAQ,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;AAElD,eAAO,MAAM,IAAI,EAAE,UAGlB,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,UAAU,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,iBAAiB,YAAY,KAAG,UAQ1D,CAAA;AAED,eAAO,MAAM,KAAK,GAAU,OAAO,UAAU,KAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAa7E,CAAA;AAED,eAAO,MAAM,UAAU,GAAU,CAAC,EAAE,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,YAAY,KAAG,WAAW,CAAC,CAAC,CAiBpH,CAAA"}
|
package/dist/retry.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/retry.ts
|
|
2
2
|
import { fromMilliseconds, toMilliseconds, Zero } from "@bessemer/cornerstone/temporal/duration";
|
|
3
|
-
import
|
|
3
|
+
import * as Results from "@bessemer/cornerstone/result";
|
|
4
4
|
import { deepMerge, isUndefined } from "@bessemer/cornerstone/object";
|
|
5
5
|
import { sleep } from "@bessemer/cornerstone/async";
|
|
6
6
|
import { random } from "@bessemer/cornerstone/math";
|
|
@@ -35,11 +35,11 @@ var retry = async (state) => {
|
|
|
35
35
|
};
|
|
36
36
|
var usingRetry = async (runnable, initialOptions) => {
|
|
37
37
|
let retryState = initialize(initialOptions);
|
|
38
|
-
let previousResult = failure();
|
|
38
|
+
let previousResult = Results.failure();
|
|
39
39
|
do {
|
|
40
40
|
const result = await runnable();
|
|
41
41
|
previousResult = result;
|
|
42
|
-
if (
|
|
42
|
+
if (Results.isSuccess(result)) {
|
|
43
43
|
return result;
|
|
44
44
|
}
|
|
45
45
|
retryState = await retry(retryState);
|
package/dist/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/retry.ts"],"sourcesContent":["import { Duration, fromMilliseconds, toMilliseconds, Zero } from '@bessemer/cornerstone/temporal/duration'\nimport { AsyncResult,
|
|
1
|
+
{"version":3,"sources":["../src/retry.ts"],"sourcesContent":["import { Duration, fromMilliseconds, toMilliseconds, Zero } from '@bessemer/cornerstone/temporal/duration'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { AsyncResult, Result } from '@bessemer/cornerstone/result'\nimport { PartialDeep } from 'type-fest'\nimport { deepMerge, isUndefined } from '@bessemer/cornerstone/object'\nimport { sleep } from '@bessemer/cornerstone/async'\nimport { random } from '@bessemer/cornerstone/math'\nimport { assert } from '@bessemer/cornerstone/assertion'\n\nexport type RetryProps = {\n attempts: number\n delay: Duration\n}\n\nexport type RetryOptions = PartialDeep<RetryProps>\n\nexport const None: RetryProps = {\n attempts: 0,\n delay: Zero,\n}\n\nexport const DefaultRetryProps: RetryProps = {\n attempts: 3,\n delay: fromMilliseconds(500),\n}\n\nexport type RetryState = {\n attempt: number\n props: RetryProps\n}\n\nexport const initialize = (initialOptions?: RetryOptions): RetryState => {\n const props = deepMerge(DefaultRetryProps, initialOptions)\n assert(props.attempts >= 0, () => 'usingRetry attempts must be >= 0')\n\n return {\n attempt: 0,\n props,\n }\n}\n\nexport const retry = async (state: RetryState): Promise<RetryState | undefined> => {\n if (state.attempt >= state.props.attempts - 1) {\n return undefined\n }\n\n const delayMs = toMilliseconds(state.props.delay)\n const maxJitterMs = delayMs * 0.3 // We calculate max jitter as 30% of the delay\n await sleep(fromMilliseconds(delayMs + random(0, maxJitterMs)))\n\n return {\n props: state.props,\n attempt: state.attempt + 1,\n }\n}\n\nexport const usingRetry = async <T>(runnable: () => Promise<Result<T>>, initialOptions?: RetryOptions): AsyncResult<T> => {\n let retryState: RetryState | undefined = initialize(initialOptions)\n let previousResult: Result<T> = Results.failure()\n\n do {\n // JOHN Should this be a try/catch? it was causing debugging problems\n const result = await runnable()\n previousResult = result\n\n if (Results.isSuccess(result)) {\n return result\n }\n\n retryState = await retry(retryState)\n } while (!isUndefined(retryState))\n\n return previousResult\n}\n"],"mappings":";AAAA,SAAmB,kBAAkB,gBAAgB,YAAY;AACjE,YAAY,aAAa;AAGzB,SAAS,WAAW,mBAAmB;AACvC,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,cAAc;AAShB,IAAM,OAAmB;AAAA,EAC9B,UAAU;AAAA,EACV,OAAO;AACT;AAEO,IAAM,oBAAgC;AAAA,EAC3C,UAAU;AAAA,EACV,OAAO,iBAAiB,GAAG;AAC7B;AAOO,IAAM,aAAa,CAAC,mBAA8C;AACvE,QAAM,QAAQ,UAAU,mBAAmB,cAAc;AACzD,SAAO,MAAM,YAAY,GAAG,MAAM,kCAAkC;AAEpE,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,OAAO,UAAuD;AACjF,MAAI,MAAM,WAAW,MAAM,MAAM,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,eAAe,MAAM,MAAM,KAAK;AAChD,QAAM,cAAc,UAAU;AAC9B,QAAM,MAAM,iBAAiB,UAAU,OAAO,GAAG,WAAW,CAAC,CAAC;AAE9D,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,SAAS,MAAM,UAAU;AAAA,EAC3B;AACF;AAEO,IAAM,aAAa,OAAU,UAAoC,mBAAkD;AACxH,MAAI,aAAqC,WAAW,cAAc;AAClE,MAAI,iBAAoC,gBAAQ;AAEhD,KAAG;AAED,UAAM,SAAS,MAAM,SAAS;AAC9B,qBAAiB;AAEjB,QAAY,kBAAU,MAAM,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,iBAAa,MAAM,MAAM,UAAU;AAAA,EACrC,SAAS,CAAC,YAAY,UAAU;AAEhC,SAAO;AACT;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-expression-parser.d.ts","sourceRoot":"","sources":["../../src/sql/sql-expression-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAA;AAErF,OAAO,EAAa,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAgBnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAGxE,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,eAAe,CAAA;CAC5B,CAAA;AACD,qBAAa,mBAAoB,SAAQ,gBAAgB,CAAC,WAAW,EAAE,0BAA0B,CAAC;CAAG;
|
|
1
|
+
{"version":3,"file":"sql-expression-parser.d.ts","sourceRoot":"","sources":["../../src/sql/sql-expression-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAA;AAErF,OAAO,EAAa,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAgBnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAGxE,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,eAAe,CAAA;CAC5B,CAAA;AACD,qBAAa,mBAAoB,SAAQ,gBAAgB,CAAC,WAAW,EAAE,0BAA0B,CAAC;CAAG;AAyDrG,eAAO,MAAM,0BAA0B,qBAA4B,CAAA"}
|