@duplojs/utils 1.5.10 → 1.5.12

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.
@@ -1,6 +1,5 @@
1
1
  import type { IsEqual } from "../../common";
2
- import type { AtTuple } from "../types";
3
- export type AtArray<GenericArray extends readonly unknown[], GenericIndex extends number> = IsEqual<GenericArray["length"], number> extends true ? GenericArray[number] | undefined : AtTuple<GenericArray, GenericIndex>;
2
+ export type AtArray<GenericArray extends readonly unknown[], GenericIndex extends number> = IsEqual<GenericArray["length"], number> extends true ? GenericArray[number] | undefined : GenericIndex extends keyof GenericArray ? GenericArray[GenericIndex] : GenericArray[number] | undefined;
4
3
  /**
5
4
  * Accesses an element at a given index, supporting negative indices.
6
5
  *
@@ -1,3 +1,4 @@
1
+ import { type AnyTuple } from "../../common";
1
2
  /**
2
3
  * Gets the last element of an array.
3
4
  *
@@ -23,4 +24,4 @@
23
24
  * @namespace A
24
25
  *
25
26
  */
26
- export declare function last<GenericArray extends readonly unknown[]>(array: GenericArray): GenericArray extends readonly [...any[], infer InferredValue] ? InferredValue : GenericArray[number] | undefined;
27
+ export declare function last<GenericArray extends readonly unknown[]>(array: GenericArray): GenericArray extends readonly [...any[], infer InferredValue] ? InferredValue : GenericArray extends AnyTuple ? GenericArray[number] : GenericArray[number] | undefined;
@@ -1,5 +1,3 @@
1
- import { type AnyTuple } from "../common";
2
- import { type PopTuple } from "./types";
3
1
  /**
4
2
  * Removes the last element from an array.
5
3
  *
@@ -31,4 +29,4 @@ import { type PopTuple } from "./types";
31
29
  * @namespace A
32
30
  *
33
31
  */
34
- export declare function pop<const GenericArray extends readonly unknown[]>(array: GenericArray): GenericArray extends AnyTuple ? PopTuple<GenericArray> : GenericArray;
32
+ export declare function pop<const GenericArray extends readonly unknown[]>(array: GenericArray): GenericArray extends readonly [...infer InferredRest, any] ? InferredRest : GenericArray;
@@ -1,4 +1,4 @@
1
- import { type SimplifyTopLevel, type Kind, type RemoveKind } from "../../common";
1
+ import { type SimplifyTopLevel, type Kind, type RemoveKind, type GetKindValue } from "../../common";
2
2
  import * as DEither from "../../either";
3
3
  import * as DDataParser from "../../dataParser";
4
4
  import * as DObject from "../../object";
@@ -102,7 +102,7 @@ export interface EntityHandler<GenericName extends string = string, GenericPrope
102
102
  * ```
103
103
  *
104
104
  */
105
- update<const GenericEntity extends Entity<GenericName>, const GenericProperties extends Partial<EntityProperties<GenericPropertiesDefinition>>>(entity: GenericEntity, properties: GenericProperties): Entity<GenericName> & DObject.AssignObjects<RemoveKind<GenericEntity>, GenericProperties>;
105
+ update<const GenericEntity extends Entity<GenericName>, const GenericProperties extends Partial<EntityProperties<GenericPropertiesDefinition>>>(entity: GenericEntity, properties: GenericProperties): EntityUpdate<GenericEntity, GenericProperties>;
106
106
  }
107
107
  declare const CreateEntityError_base: new (params: {
108
108
  "@DuplojsUtilsError/create-entity-error"?: unknown;
@@ -220,3 +220,6 @@ export declare namespace createEntity {
220
220
  var overrideHandler: import("../../common").OverrideHandler<EntityHandler<string, Readonly<Record<string, EntityPropertyDefinition>>>>;
221
221
  }
222
222
  export type GetEntity<GenericEntityHandler extends EntityHandler<string, any>> = Extract<ReturnType<GenericEntityHandler["new"]>, any>;
223
+ export type EntityUpdate<GenericEntity extends Entity, GenericNewProperties extends Partial<RemoveKind<Entity>>> = Extract<(Entity<GetKindValue<typeof entityKind, GenericEntity>> & SimplifyTopLevel<RemoveKind<GenericEntity> extends infer InferredProperties ? {
224
+ [Prop in keyof InferredProperties]: Prop extends keyof GenericNewProperties ? GenericNewProperties[Prop] extends infer InferredNewValue ? InferredNewValue extends undefined ? InferredProperties[Prop] : InferredNewValue : never : InferredProperties[Prop];
225
+ } : never>), any>;
@@ -156,5 +156,5 @@ export declare function createNewType<GenericName extends string, GenericDataPar
156
156
  export declare namespace createNewType {
157
157
  var overrideHandler: import("..").OverrideHandler<NewTypeHandler<string, unknown, readonly ConstraintHandler<string, EligiblePrimitive, readonly DDataParser.DataParserChecker<DDataParser.DataParserCheckerDefinition, unknown>[], unknown>[], unknown>>;
158
158
  }
159
- export type GetNewType<GenericHandler extends NewTypeHandler<string, unknown, readonly any[]>> = Extract<GenericHandler extends any ? NewType<GenericHandler["name"], DDataParser.Output<GenericHandler["dataParser"]>, GenericHandler["constraints"][number]["name"]> : never, any>;
159
+ export type GetNewType<GenericHandler extends NewTypeHandler<string, unknown, readonly any[]>, GenericValue extends DDataParser.Output<GenericHandler["dataParser"]> = DDataParser.Output<GenericHandler["dataParser"]>> = Extract<GenericHandler extends any ? NewType<GenericHandler["name"], GenericValue, GenericHandler["constraints"][number]["name"]> : never, any>;
160
160
  export {};
@@ -12,36 +12,33 @@ var nil = require('../nil.cjs');
12
12
  var pipe = require('../../../common/pipe.cjs');
13
13
  var reduce = require('../../../array/reduce.cjs');
14
14
  var when = require('../../../pattern/when.cjs');
15
- var justReturn = require('../../../common/justReturn.cjs');
16
- var isType = require('../../../common/isType.cjs');
17
15
  var map = require('../../../array/map.cjs');
18
16
  var concat = require('../../../string/concat.cjs');
17
+ var isType = require('../../../common/isType.cjs');
19
18
  var flatMap = require('../../../array/flatMap.cjs');
20
19
  var prepend = require('../../../string/prepend.cjs');
21
20
  var exhaustive = require('../../../pattern/exhaustive.cjs');
22
21
  var innerPipe = require('../../../common/innerPipe.cjs');
23
- var notIncludes = require('../../../array/notIncludes.cjs');
24
22
  var flat = require('../../../array/flat.cjs');
25
- var otherwise = require('../../../pattern/otherwise.cjs');
23
+ var justReturn = require('../../../common/justReturn.cjs');
26
24
  var when$1 = require('../../../common/when.cjs');
25
+ var to = require('../../../string/to.cjs');
27
26
  var or = require('../../../common/or.cjs');
28
- var includes = require('../../../array/includes.cjs');
29
- var filter = require('../../../array/filter.cjs');
30
27
 
31
28
  function findRecordRequiredKeyOnTemplateLiteralPart(templatePart) {
32
29
  return pipe.pipe(templatePart, map.map(innerPipe.innerPipe(when.when((value) => index$1.stringKind.has(value)
33
30
  || index$2.numberKind.has(value)
34
- || index$3.bigIntKind.has(value), justReturn.justReturn(null)), when.when(or.or([
31
+ || index$3.bigIntKind.has(value), justReturn.justReturn([])), when.when(or.or([
35
32
  isType.isType("bigint"),
36
33
  isType.isType("boolean"),
37
34
  isType.isType("null"),
38
35
  isType.isType("number"),
39
36
  isType.isType("string"),
40
37
  isType.isType("undefined"),
41
- ]), innerPipe.innerPipe(when$1.when(isType.isType("bigint"), (value) => `${value}n`), String)), when.when(literal.literalKind.has, (value) => findRecordRequiredKey(value)), when.when(index.templateLiteralKind.has, (value) => findRecordRequiredKeyOnTemplateLiteralPart(value.definition.template)), when.when(boolean.booleanKind.has, justReturn.justReturn(["true", "false"])), when.when(empty.emptyKind.has, justReturn.justReturn("undefined")), when.when(nil.nilKind.has, justReturn.justReturn("null")), when.when(union.unionKind.has, (dataParser) => pipe.pipe(dataParser.definition.options, map.map((element) => findRecordRequiredKeyOnTemplateLiteralPart([element])), when.when(notIncludes.notIncludes(null), flat.flat), otherwise.otherwise(justReturn.justReturn(null)))), exhaustive.exhaustive)), reduce.reduce(reduce.reduceFrom([""]), ({ lastValue, element, exit, next }) => pipe.pipe(element, when.when(isType.isType("null"), justReturn.justReturn(exit(null))), when.when(isType.isType("string"), (element) => next(map.map(lastValue, concat.concat(element)))), when.when(isType.isType("array"), (elements) => next(flatMap.flatMap(lastValue, (value) => map.map(elements, prepend.prepend(value))))), exhaustive.exhaustive)));
38
+ ]), innerPipe.innerPipe(when$1.when(isType.isType("bigint"), (value) => `${value}n`), to.to)), when.when(literal.literalKind.has, (value) => pipe.pipe(value.definition.value, map.map((element) => findRecordRequiredKeyOnTemplateLiteralPart([element])), flat.flat)), when.when(index.templateLiteralKind.has, (value) => findRecordRequiredKeyOnTemplateLiteralPart(value.definition.template)), when.when(boolean.booleanKind.has, justReturn.justReturn(["true", "false"])), when.when(empty.emptyKind.has, justReturn.justReturn("undefined")), when.when(nil.nilKind.has, justReturn.justReturn("null")), when.when(union.unionKind.has, (dataParser) => pipe.pipe(dataParser.definition.options, map.map((element) => findRecordRequiredKeyOnTemplateLiteralPart([element])), flat.flat)), exhaustive.exhaustive)), reduce.reduce(reduce.reduceFrom([""]), ({ lastValue, element, next }) => pipe.pipe(element, when.when(isType.isType("string"), (element) => next(map.map(lastValue, concat.concat(element)))), when.when(isType.isType("array"), (elements) => next(flatMap.flatMap(lastValue, (value) => map.map(elements, prepend.prepend(value))))), exhaustive.exhaustive)));
42
39
  }
43
40
  function findRecordRequiredKey(keyParser) {
44
- return pipe.pipe(keyParser, when.when((value) => index$1.stringKind.has(value) || index$2.numberKind.has(value), justReturn.justReturn(null)), when.when(literal.literalKind.has, (dataParser) => pipe.pipe(dataParser.definition.value, map.map(innerPipe.innerPipe(when$1.when(isType.isType("bigint"), (value) => `${value}n`), String)))), when.when(union.unionKind.has, (dataParser) => pipe.pipe(dataParser.definition.options, map.map(findRecordRequiredKey), when.when(includes.includes(null), justReturn.justReturn(null)), otherwise.otherwise(innerPipe.innerPipe(filter.filter(isType.isType("array")), flat.flat)))), when.when(index.templateLiteralKind.has, (dataParser) => findRecordRequiredKeyOnTemplateLiteralPart(dataParser.definition.template)), exhaustive.exhaustive);
41
+ return pipe.pipe(keyParser, when.when((value) => index$1.stringKind.has(value) || index$2.numberKind.has(value), justReturn.justReturn([])), when.when(literal.literalKind.has, (dataParser) => dataParser.definition.value), when.when(union.unionKind.has, (dataParser) => pipe.pipe(dataParser.definition.options, map.map(findRecordRequiredKey), flat.flat)), when.when(index.templateLiteralKind.has, (dataParser) => findRecordRequiredKeyOnTemplateLiteralPart(dataParser.definition.template)), exhaustive.exhaustive);
45
42
  }
46
43
 
47
44
  exports.findRecordRequiredKey = findRecordRequiredKey;
@@ -1,4 +1,4 @@
1
1
  import { type DataParserRecordKey } from ".";
2
2
  import { type TemplateLiteralParts } from "../templateLiteral";
3
- export declare function findRecordRequiredKeyOnTemplateLiteralPart(templatePart: readonly TemplateLiteralParts[]): string[] | null;
4
- export declare function findRecordRequiredKey(keyParser: DataParserRecordKey): string[] | null;
3
+ export declare function findRecordRequiredKeyOnTemplateLiteralPart(templatePart: readonly TemplateLiteralParts[]): readonly string[];
4
+ export declare function findRecordRequiredKey(keyParser: DataParserRecordKey): readonly string[];
@@ -10,36 +10,33 @@ import { nilKind } from '../nil.mjs';
10
10
  import { pipe } from '../../../common/pipe.mjs';
11
11
  import { reduce, reduceFrom } from '../../../array/reduce.mjs';
12
12
  import { when } from '../../../pattern/when.mjs';
13
- import { justReturn } from '../../../common/justReturn.mjs';
14
- import { isType } from '../../../common/isType.mjs';
15
13
  import { map } from '../../../array/map.mjs';
16
14
  import { concat } from '../../../string/concat.mjs';
15
+ import { isType } from '../../../common/isType.mjs';
17
16
  import { flatMap } from '../../../array/flatMap.mjs';
18
17
  import { prepend } from '../../../string/prepend.mjs';
19
18
  import { exhaustive } from '../../../pattern/exhaustive.mjs';
20
19
  import { innerPipe } from '../../../common/innerPipe.mjs';
21
- import { notIncludes } from '../../../array/notIncludes.mjs';
22
20
  import { flat } from '../../../array/flat.mjs';
23
- import { otherwise } from '../../../pattern/otherwise.mjs';
21
+ import { justReturn } from '../../../common/justReturn.mjs';
24
22
  import { when as when$1 } from '../../../common/when.mjs';
23
+ import { to } from '../../../string/to.mjs';
25
24
  import { or } from '../../../common/or.mjs';
26
- import { includes } from '../../../array/includes.mjs';
27
- import { filter } from '../../../array/filter.mjs';
28
25
 
29
26
  function findRecordRequiredKeyOnTemplateLiteralPart(templatePart) {
30
27
  return pipe(templatePart, map(innerPipe(when((value) => stringKind.has(value)
31
28
  || numberKind.has(value)
32
- || bigIntKind.has(value), justReturn(null)), when(or([
29
+ || bigIntKind.has(value), justReturn([])), when(or([
33
30
  isType("bigint"),
34
31
  isType("boolean"),
35
32
  isType("null"),
36
33
  isType("number"),
37
34
  isType("string"),
38
35
  isType("undefined"),
39
- ]), innerPipe(when$1(isType("bigint"), (value) => `${value}n`), String)), when(literalKind.has, (value) => findRecordRequiredKey(value)), when(templateLiteralKind.has, (value) => findRecordRequiredKeyOnTemplateLiteralPart(value.definition.template)), when(booleanKind.has, justReturn(["true", "false"])), when(emptyKind.has, justReturn("undefined")), when(nilKind.has, justReturn("null")), when(unionKind.has, (dataParser) => pipe(dataParser.definition.options, map((element) => findRecordRequiredKeyOnTemplateLiteralPart([element])), when(notIncludes(null), flat), otherwise(justReturn(null)))), exhaustive)), reduce(reduceFrom([""]), ({ lastValue, element, exit, next }) => pipe(element, when(isType("null"), justReturn(exit(null))), when(isType("string"), (element) => next(map(lastValue, concat(element)))), when(isType("array"), (elements) => next(flatMap(lastValue, (value) => map(elements, prepend(value))))), exhaustive)));
36
+ ]), innerPipe(when$1(isType("bigint"), (value) => `${value}n`), to)), when(literalKind.has, (value) => pipe(value.definition.value, map((element) => findRecordRequiredKeyOnTemplateLiteralPart([element])), flat)), when(templateLiteralKind.has, (value) => findRecordRequiredKeyOnTemplateLiteralPart(value.definition.template)), when(booleanKind.has, justReturn(["true", "false"])), when(emptyKind.has, justReturn("undefined")), when(nilKind.has, justReturn("null")), when(unionKind.has, (dataParser) => pipe(dataParser.definition.options, map((element) => findRecordRequiredKeyOnTemplateLiteralPart([element])), flat)), exhaustive)), reduce(reduceFrom([""]), ({ lastValue, element, next }) => pipe(element, when(isType("string"), (element) => next(map(lastValue, concat(element)))), when(isType("array"), (elements) => next(flatMap(lastValue, (value) => map(elements, prepend(value))))), exhaustive)));
40
37
  }
41
38
  function findRecordRequiredKey(keyParser) {
42
- return pipe(keyParser, when((value) => stringKind.has(value) || numberKind.has(value), justReturn(null)), when(literalKind.has, (dataParser) => pipe(dataParser.definition.value, map(innerPipe(when$1(isType("bigint"), (value) => `${value}n`), String)))), when(unionKind.has, (dataParser) => pipe(dataParser.definition.options, map(findRecordRequiredKey), when(includes(null), justReturn(null)), otherwise(innerPipe(filter(isType("array")), flat)))), when(templateLiteralKind.has, (dataParser) => findRecordRequiredKeyOnTemplateLiteralPart(dataParser.definition.template)), exhaustive);
39
+ return pipe(keyParser, when((value) => stringKind.has(value) || numberKind.has(value), justReturn([])), when(literalKind.has, (dataParser) => dataParser.definition.value), when(unionKind.has, (dataParser) => pipe(dataParser.definition.options, map(findRecordRequiredKey), flat)), when(templateLiteralKind.has, (dataParser) => findRecordRequiredKeyOnTemplateLiteralPart(dataParser.definition.template)), exhaustive);
43
40
  }
44
41
 
45
42
  export { findRecordRequiredKey, findRecordRequiredKeyOnTemplateLiteralPart };
@@ -4,6 +4,10 @@ var base = require('../../base.cjs');
4
4
  var error = require('../../error.cjs');
5
5
  var kind = require('../../kind.cjs');
6
6
  var findRecordRequiredKey = require('./findRecordRequiredKey.cjs');
7
+ var pipe = require('../../../common/pipe.cjs');
8
+ var map = require('../../../array/map.cjs');
9
+ var entry = require('../../../object/entry.cjs');
10
+ var fromEntries = require('../../../object/fromEntries.cjs');
7
11
  var override = require('../../../common/override.cjs');
8
12
 
9
13
  const recordKind = kind.createDataParserKind("record");
@@ -11,12 +15,14 @@ const recordKind = kind.createDataParserKind("record");
11
15
  * {@include dataParser/classic/record/index.md}
12
16
  */
13
17
  function record(key, value, definition) {
18
+ const requireKey = findRecordRequiredKey.findRecordRequiredKey(key);
14
19
  const self = base.dataParserInit(recordKind, {
15
20
  errorMessage: definition?.errorMessage,
16
21
  checkers: definition?.checkers ?? [],
17
22
  key,
18
23
  value,
19
- requireKey: findRecordRequiredKey.findRecordRequiredKey(key),
24
+ requireKey,
25
+ baseData: pipe.pipe(requireKey, map.map((key) => entry.entry(key, undefined)), fromEntries.fromEntries),
20
26
  }, {
21
27
  sync: (data, error$1, self) => {
22
28
  if (!data
@@ -25,8 +31,12 @@ function record(key, value, definition) {
25
31
  return error.SymbolDataParserErrorIssue;
26
32
  }
27
33
  let output = {};
34
+ const fromData = {
35
+ ...self.definition.baseData,
36
+ ...data,
37
+ };
28
38
  const currentIndexPath = error$1.currentPath.length;
29
- for (const key in data) {
39
+ for (const key in fromData) {
30
40
  error.setErrorPath(error$1, key, currentIndexPath);
31
41
  const resultKey = self
32
42
  .definition
@@ -38,7 +48,7 @@ function record(key, value, definition) {
38
48
  const resultValue = self
39
49
  .definition
40
50
  .value
41
- .exec(data[key], error$1);
51
+ .exec(fromData[key], error$1);
42
52
  if (resultValue === base.SymbolDataParserError) {
43
53
  output = base.SymbolDataParserError;
44
54
  }
@@ -50,10 +60,6 @@ function record(key, value, definition) {
50
60
  if (output === base.SymbolDataParserError) {
51
61
  return output;
52
62
  }
53
- if (self.definition.requireKey
54
- && self.definition.requireKey.length !== Object.keys(output).length) {
55
- return error.SymbolDataParserErrorIssue;
56
- }
57
63
  return output;
58
64
  },
59
65
  async: async (data, error$1, self) => {
@@ -63,8 +69,12 @@ function record(key, value, definition) {
63
69
  return error.SymbolDataParserErrorIssue;
64
70
  }
65
71
  let output = {};
72
+ const fromData = {
73
+ ...self.definition.baseData,
74
+ ...data,
75
+ };
66
76
  const currentIndexPath = error$1.currentPath.length;
67
- for (const key in data) {
77
+ for (const key in fromData) {
68
78
  error.setErrorPath(error$1, key, currentIndexPath);
69
79
  const resultKey = await self
70
80
  .definition
@@ -76,7 +86,7 @@ function record(key, value, definition) {
76
86
  const resultValue = await self
77
87
  .definition
78
88
  .value
79
- .asyncExec(data[key], error$1);
89
+ .asyncExec(fromData[key], error$1);
80
90
  if (resultValue === base.SymbolDataParserError) {
81
91
  output = base.SymbolDataParserError;
82
92
  }
@@ -88,10 +98,6 @@ function record(key, value, definition) {
88
98
  if (output === base.SymbolDataParserError) {
89
99
  return output;
90
100
  }
91
- if (self.definition.requireKey
92
- && self.definition.requireKey.length !== Object.keys(output).length) {
93
- return error.SymbolDataParserErrorIssue;
94
- }
95
101
  return output;
96
102
  },
97
103
  isAsynchronous: (self) => self.definition.value.isAsynchronous(),
@@ -1,16 +1,17 @@
1
- import { type NeverCoalescing, type Kind, type FixDeepFunctionInfer, type Adaptor } from "../../../common";
1
+ import { type NeverCoalescing, type Kind, type FixDeepFunctionInfer, type IsEqual } from "../../../common";
2
2
  import { type DataParserDefinition, type DataParser, type Output, type Input, type DataParserChecker } from "../../base";
3
3
  import { type AddCheckersToDefinition, type MergeDefinition } from "../../../dataParser/types";
4
4
  import { type DataParserString } from "../string";
5
5
  import { type DataParserTemplateLiteral } from "../templateLiteral";
6
- import { type DataParserLiteral } from "../literal";
6
+ import { type DataParserDefinitionLiteral, type DataParserLiteral } from "../literal";
7
7
  import { type DataParserDefinitionNumber, type DataParserNumber } from "../number";
8
8
  import { type DataParserDefinitionUnion, type DataParserUnion } from "../union";
9
9
  import { type CheckerRefineImplementation } from "../refine";
10
- import { type TemplateLiteralContainLargeType } from "../../../string";
11
10
  import { type GetPropsWithValueExtends } from "../../../object";
12
11
  export * from "./findRecordRequiredKey";
13
- export type DataParserRecordKey = (DataParserString | DataParserTemplateLiteral | DataParserLiteral | DataParserNumber<DataParserDefinitionNumber & {
12
+ export type DataParserRecordKey = (DataParserString | DataParserTemplateLiteral | DataParserLiteral<DataParserDefinitionLiteral & {
13
+ value: readonly string[];
14
+ }> | DataParserNumber<DataParserDefinitionNumber & {
14
15
  coerce: true;
15
16
  }> | DataParserUnion<DataParserDefinitionUnion & {
16
17
  options: DataParserRecordKey[];
@@ -21,11 +22,12 @@ export type DataParserRecordCheckers<GenericInput extends Record<string, unknown
21
22
  export interface DataParserDefinitionRecord extends DataParserDefinition<DataParserRecordCheckers<Record<string, unknown>>> {
22
23
  readonly key: DataParserRecordKey;
23
24
  readonly value: DataParser;
24
- readonly requireKey: string[] | null;
25
+ readonly baseData: Partial<Record<string, undefined>>;
26
+ readonly requireKey: readonly string[];
25
27
  }
26
28
  export declare const recordKind: import("../../../common").KindHandler<import("../../../common").KindDefinition<"@DuplojsUtilsDataParser/record", unknown>>;
27
- export type DataParserRecordShapeOutput<GenericDataParserKey extends DataParserRecordKey, GenericDataParserValue extends DataParser> = Extract<Record<Output<GenericDataParserKey> extends infer InferredKey extends string | number ? `${InferredKey}` : never, Output<GenericDataParserValue> extends infer InferredValue ? InferredValue : never>, any> extends infer InferredOutput extends Record<string, unknown> ? TemplateLiteralContainLargeType<Adaptor<keyof InferredOutput, string>> extends true ? Partial<InferredOutput> : InferredOutput : never;
28
- export type DataParserRecordShapeInput<GenericDataParserKey extends DataParserRecordKey, GenericDataParserValue extends DataParser> = Extract<Record<Input<GenericDataParserKey> extends infer InferredKey extends string | number ? `${InferredKey}` : never, Input<GenericDataParserValue> extends infer InferredValue ? InferredValue : never>, any> extends infer InferredInput extends Record<string, unknown> ? TemplateLiteralContainLargeType<Adaptor<keyof InferredInput, string>> extends true ? Partial<InferredInput> : InferredInput : never;
29
+ export type DataParserRecordShapeOutput<GenericDataParserKey extends DataParserRecordKey, GenericDataParserValue extends DataParser> = Extract<Record<Output<GenericDataParserKey> extends infer InferredKey extends string | number ? `${InferredKey}` : never, Output<GenericDataParserValue> extends infer InferredValue ? InferredValue : never> extends infer InferredResult extends Record<string, unknown> ? IsEqual<Extract<InferredResult[keyof InferredResult], undefined>, never> extends true ? InferredResult : Partial<InferredResult> : never, any>;
30
+ export type DataParserRecordShapeInput<GenericDataParserKey extends DataParserRecordKey, GenericDataParserValue extends DataParser> = Extract<Record<Input<GenericDataParserKey> extends infer InferredKey extends string | number ? `${InferredKey}` : never, Input<GenericDataParserValue> extends infer InferredValue ? InferredValue : never> extends infer InferredResult extends Record<string, unknown> ? IsEqual<Extract<InferredResult[keyof InferredResult], undefined>, never> extends true ? InferredResult : Partial<InferredResult> : never, any>;
29
31
  type _DataParserRecord<GenericDefinition extends DataParserDefinitionRecord> = (DataParser<GenericDefinition, DataParserRecordShapeOutput<GenericDefinition["key"], GenericDefinition["value"]>, DataParserRecordShapeInput<GenericDefinition["key"], GenericDefinition["value"]>> & Kind<typeof recordKind.definition>);
30
32
  export interface DataParserRecord<GenericDefinition extends DataParserDefinitionRecord = DataParserDefinitionRecord> extends _DataParserRecord<GenericDefinition> {
31
33
  addChecker<GenericChecker extends readonly [
@@ -3,6 +3,10 @@ import { SymbolDataParserErrorIssue, setErrorPath, popErrorPath } from '../../er
3
3
  import { createDataParserKind } from '../../kind.mjs';
4
4
  import { findRecordRequiredKey } from './findRecordRequiredKey.mjs';
5
5
  export { findRecordRequiredKeyOnTemplateLiteralPart } from './findRecordRequiredKey.mjs';
6
+ import { pipe } from '../../../common/pipe.mjs';
7
+ import { map } from '../../../array/map.mjs';
8
+ import { entry } from '../../../object/entry.mjs';
9
+ import { fromEntries } from '../../../object/fromEntries.mjs';
6
10
  import { createOverride } from '../../../common/override.mjs';
7
11
 
8
12
  const recordKind = createDataParserKind("record");
@@ -10,12 +14,14 @@ const recordKind = createDataParserKind("record");
10
14
  * {@include dataParser/classic/record/index.md}
11
15
  */
12
16
  function record(key, value, definition) {
17
+ const requireKey = findRecordRequiredKey(key);
13
18
  const self = dataParserInit(recordKind, {
14
19
  errorMessage: definition?.errorMessage,
15
20
  checkers: definition?.checkers ?? [],
16
21
  key,
17
22
  value,
18
- requireKey: findRecordRequiredKey(key),
23
+ requireKey,
24
+ baseData: pipe(requireKey, map((key) => entry(key, undefined)), fromEntries),
19
25
  }, {
20
26
  sync: (data, error, self) => {
21
27
  if (!data
@@ -24,8 +30,12 @@ function record(key, value, definition) {
24
30
  return SymbolDataParserErrorIssue;
25
31
  }
26
32
  let output = {};
33
+ const fromData = {
34
+ ...self.definition.baseData,
35
+ ...data,
36
+ };
27
37
  const currentIndexPath = error.currentPath.length;
28
- for (const key in data) {
38
+ for (const key in fromData) {
29
39
  setErrorPath(error, key, currentIndexPath);
30
40
  const resultKey = self
31
41
  .definition
@@ -37,7 +47,7 @@ function record(key, value, definition) {
37
47
  const resultValue = self
38
48
  .definition
39
49
  .value
40
- .exec(data[key], error);
50
+ .exec(fromData[key], error);
41
51
  if (resultValue === SymbolDataParserError) {
42
52
  output = SymbolDataParserError;
43
53
  }
@@ -49,10 +59,6 @@ function record(key, value, definition) {
49
59
  if (output === SymbolDataParserError) {
50
60
  return output;
51
61
  }
52
- if (self.definition.requireKey
53
- && self.definition.requireKey.length !== Object.keys(output).length) {
54
- return SymbolDataParserErrorIssue;
55
- }
56
62
  return output;
57
63
  },
58
64
  async: async (data, error, self) => {
@@ -62,8 +68,12 @@ function record(key, value, definition) {
62
68
  return SymbolDataParserErrorIssue;
63
69
  }
64
70
  let output = {};
71
+ const fromData = {
72
+ ...self.definition.baseData,
73
+ ...data,
74
+ };
65
75
  const currentIndexPath = error.currentPath.length;
66
- for (const key in data) {
76
+ for (const key in fromData) {
67
77
  setErrorPath(error, key, currentIndexPath);
68
78
  const resultKey = await self
69
79
  .definition
@@ -75,7 +85,7 @@ function record(key, value, definition) {
75
85
  const resultValue = await self
76
86
  .definition
77
87
  .value
78
- .asyncExec(data[key], error);
88
+ .asyncExec(fromData[key], error);
79
89
  if (resultValue === SymbolDataParserError) {
80
90
  output = SymbolDataParserError;
81
91
  }
@@ -87,10 +97,6 @@ function record(key, value, definition) {
87
97
  if (output === SymbolDataParserError) {
88
98
  return output;
89
99
  }
90
- if (self.definition.requireKey
91
- && self.definition.requireKey.length !== Object.keys(output).length) {
92
- return SymbolDataParserErrorIssue;
93
- }
94
100
  return output;
95
101
  },
96
102
  isAsynchronous: (self) => self.definition.value.isAsynchronous(),
@@ -1,7 +1,6 @@
1
- import { type GetPropsWithValueExtends } from "../../object";
2
1
  import { type DataParserChecker } from "../base";
3
2
  import type * as AllDataParser from "../parsers";
4
3
  export interface CheckerCustom {
5
4
  base: DataParserChecker;
6
5
  }
7
- export type DataParserCheckers = (CheckerCustom[GetPropsWithValueExtends<CheckerCustom, DataParserChecker>] | AllDataParser.DataParserCheckerUrl | AllDataParser.DataParserCheckerArrayMax | AllDataParser.DataParserCheckerArrayMin | AllDataParser.DataParserCheckerBigIntMax | AllDataParser.DataParserCheckerBigIntMin | AllDataParser.DataParserCheckerNumberMax | AllDataParser.DataParserCheckerNumberMin | AllDataParser.DataParserCheckerInt | AllDataParser.DataParserCheckerEmail | AllDataParser.DataParserCheckerRefine | AllDataParser.DataParserCheckerTimeMin | AllDataParser.DataParserCheckerTimeMax);
6
+ export type DataParserCheckers = (CheckerCustom[keyof CheckerCustom] | AllDataParser.DataParserCheckerUrl | AllDataParser.DataParserCheckerArrayMax | AllDataParser.DataParserCheckerArrayMin | AllDataParser.DataParserCheckerBigIntMax | AllDataParser.DataParserCheckerBigIntMin | AllDataParser.DataParserCheckerNumberMax | AllDataParser.DataParserCheckerNumberMin | AllDataParser.DataParserCheckerInt | AllDataParser.DataParserCheckerEmail | AllDataParser.DataParserCheckerRefine | AllDataParser.DataParserCheckerTimeMin | AllDataParser.DataParserCheckerTimeMax);
@@ -1,3 +1,5 @@
1
1
  import type { IsEqual } from "../../common";
2
2
  import type { TemplateLiteralContainLargeType } from "./templateLiteralContainLargeType";
3
- export type Pop<GenericValue extends string> = TemplateLiteralContainLargeType<GenericValue> extends true ? string : IsEqual<GenericValue, ""> extends true ? "" : GenericValue extends `${infer InferredFirst}${infer InferredRest}` ? IsEqual<InferredRest, ""> extends true ? "" : Pop<InferredRest> extends infer InferredResult extends string ? `${InferredFirst}${InferredResult}` : never : string;
3
+ type _Pop<GenericValue extends string, GenericCount extends never[] = []> = IsEqual<GenericCount["length"], 250> extends true ? string : GenericValue extends `${infer InferredFirst}${infer InferredRest}` ? IsEqual<InferredRest, ""> extends true ? "" : _Pop<InferredRest, [...GenericCount, never]> extends infer InferredResult extends string ? `${InferredFirst}${InferredResult}` : never : string;
4
+ export type Pop<GenericValue extends string> = TemplateLiteralContainLargeType<GenericValue> extends true ? string : IsEqual<GenericValue, ""> extends true ? "" : _Pop<GenericValue>;
5
+ export {};
@@ -1,7 +1,9 @@
1
1
  import { type Or, type IsEqual } from "../../common";
2
2
  import { type Includes } from "./includes";
3
3
  import { type TemplateLiteralContainLargeType } from "./templateLiteralContainLargeType";
4
- export type Split<GenericString extends string, GenericSeparator extends string, GenericLimit extends number = number, GenericLastResult extends string[] = []> = IsEqual<GenericLimit, 0> extends true ? [] : Or<[
4
+ type _Split<GenericString extends string, GenericSeparator extends string, GenericLimit extends number = number, GenericLastResult extends string[] = []> = GenericString extends `${infer InferredBefore}${GenericSeparator}${infer InferredAfter}` ? [...GenericLastResult, InferredBefore] extends infer InferredResult extends any[] ? IsEqual<InferredAfter, ""> extends true ? InferredResult : IsEqual<InferredResult["length"], 250> extends true ? Includes<InferredAfter, GenericSeparator> extends true ? [...InferredResult, ...string[]] : InferredResult : IsEqual<InferredResult["length"], GenericLimit> extends true ? InferredResult : _Split<InferredAfter, GenericSeparator, GenericLimit, InferredResult> : never : [...GenericLastResult, GenericString];
5
+ export type Split<GenericString extends string, GenericSeparator extends string, GenericLimit extends number = number> = IsEqual<GenericLimit, 0> extends true ? [] : Or<[
5
6
  TemplateLiteralContainLargeType<GenericString>,
6
7
  TemplateLiteralContainLargeType<GenericSeparator>
7
- ]> extends true ? [string, ...string[]] : GenericString extends `${infer InferredBefore}${GenericSeparator}${infer InferredAfter}` ? [...GenericLastResult, InferredBefore] extends infer InferredResult extends any[] ? IsEqual<InferredAfter, ""> extends true ? InferredResult : IsEqual<InferredResult["length"], 250> extends true ? Includes<InferredAfter, GenericSeparator> extends true ? [...InferredResult, ...string[]] : InferredResult : IsEqual<InferredResult["length"], GenericLimit> extends true ? InferredResult : Split<InferredAfter, GenericSeparator, GenericLimit, InferredResult> : never : [...GenericLastResult, GenericString];
8
+ ]> extends true ? [string, ...string[]] : _Split<GenericString, GenericSeparator, GenericLimit>;
9
+ export {};
@@ -1,6 +1 @@
1
- import { type IsEqual, type Or } from "../../common";
2
- export type TemplateLiteralContainLargeType<GenericValue extends string> = (GenericValue extends `${infer InferredFirst}${infer InferredLast}` ? Or<[
3
- IsEqual<InferredFirst, `${number}`>,
4
- IsEqual<InferredFirst, `${bigint}`>,
5
- IsEqual<InferredFirst, string>
6
- ]> extends false ? TemplateLiteralContainLargeType<InferredLast> : true : GenericValue extends "" ? false : true) extends false ? false : true;
1
+ export type TemplateLiteralContainLargeType<GenericValue extends string> = (GenericValue extends string ? {} extends Record<GenericValue, never> ? true : false : never) extends false ? false : true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duplojs/utils",
3
- "version": "1.5.10",
3
+ "version": "1.5.12",
4
4
  "author": {
5
5
  "name": "mathcovax",
6
6
  "url": "https://github.com/mathcovax"