Skip to content

Commit 053ac4f

Browse files
authored
Merge pull request #38 from duplojs/feat/37
feat(37): suggest params path
2 parents 3b8b97c + 6e80dc8 commit 053ac4f

22 files changed

Lines changed: 163 additions & 158 deletions

File tree

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
"peerDependencies": {
9191
"@duplojs/data-parser-tools": ">=0.2.9 <1.0.0",
9292
"@duplojs/server-utils": ">=0.2.2 <1.0.0",
93-
"@duplojs/utils": ">=1.5.15 <2.0.0"
93+
"@duplojs/utils": ">=1.7.0 <2.0.0"
9494
},
9595
"devDependencies": {
9696
"@commitlint/cli": "19.8.1",

scripts/core/builders/route/checker.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { type O, type MaybeArray, type NeverCoalescing, type FixDeepFunctionInfe
55
import { routeBuilderHandler } from "./builder";
66
import { type GetCheckerInput, type Checker, type GetCheckerResult, type GetCheckerOptions } from "@core/checker";
77
import { type ClientErrorResponseCode, type ResponseContract } from "@core/response";
8-
import { type Request } from "@core/request";
98
import { type Metadata } from "@core/metadata";
109

1110
declare module "./builder" {

scripts/core/builders/route/extract.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,23 @@ import { routeBuilderHandler } from "./builder";
66
import { type ClientErrorResponseCode, type ResponseContract } from "@core/response";
77
import { type Request } from "@core/request";
88
import { type Metadata } from "@core/metadata";
9+
import { type ExtractParamsKeyFromPath } from "@core/types";
10+
11+
type HandleParamsInference<
12+
GenericShape extends ExtractShape,
13+
GenericPath extends string,
14+
> = (
15+
& GenericShape
16+
& {
17+
params?: ExtractParamsKeyFromPath<GenericPath> extends infer InferredKey extends string
18+
? (
19+
& Partial<Record<InferredKey, DP.DataParser>>
20+
& Record<string, DP.DataParser>
21+
& Record<Exclude<keyof GenericShape["params"], InferredKey>, never>
22+
)
23+
: {};
24+
}
25+
);
926

1027
declare module "./builder" {
1128
interface RouteBuilder<
@@ -20,7 +37,10 @@ declare module "./builder" {
2037
) = never,
2138
const GenericMetadata extends readonly Metadata[] = readonly [],
2239
>(
23-
shape: GenericShape,
40+
shape: HandleParamsInference<
41+
GenericShape,
42+
GenericDefinition["paths"][number]
43+
>,
2444
responseContract?: GenericResponseContract,
2545
...metadata: GenericMetadata,
2646
): RouteBuilder<

scripts/core/clean/constraint.ts

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1-
import { type DP, DPE, keyWrappedValue } from "@duplojs/utils";
2-
import { type ConstrainedType, constrainedTypeKind, createConstraint, type EligiblePrimitive } from "@duplojs/utils/clean";
1+
import { type DP, DPE, C } from "@duplojs/utils";
2+
import "@duplojs/utils/clean";
3+
4+
interface ToExtractParserParams {
5+
coerce?: boolean;
6+
}
37

48
declare module "@duplojs/utils/clean" {
59
interface ConstraintHandler<
610
GenericName extends string = string,
7-
GenericPrimitiveValue extends EligiblePrimitive = EligiblePrimitive,
11+
GenericPrimitiveValue extends C.EligiblePrimitive = C.EligiblePrimitive,
812
GenericCheckers extends readonly DP.DataParserChecker[] = readonly DP.DataParserChecker[],
913
> {
10-
toExtractParser(): DPE.ContractExtended<
11-
ConstrainedType<
14+
toExtractParser(params?: ToExtractParserParams): DPE.ContractExtended<
15+
C.ConstrainedType<
1216
GenericName,
1317
GenericPrimitiveValue
1418
>,
@@ -19,39 +23,27 @@ declare module "@duplojs/utils/clean" {
1923
}
2024
}
2125

22-
createConstraint.overrideHandler.setMethod(
26+
C.createConstraint.overrideHandler.setMethod(
2327
"toExtractParser",
24-
(self) => {
25-
const dataParserWithCheckers = self
26-
.primitiveHandler
27-
.dataParser
28-
.addChecker(...self.checkers as never);
29-
30-
const valueContainer = constrainedTypeKind.setTo(
31-
{},
32-
{ [self.name]: null },
33-
);
34-
35-
const dataParser = DPE.transform(
36-
dataParserWithCheckers,
37-
(input) => ({
38-
...valueContainer,
39-
[keyWrappedValue]: input,
40-
}) as never,
28+
(self, params) => {
29+
const innerDataParser = C.toMapDataParser(
30+
self,
31+
params,
4132
);
4233

43-
return dataParser;
34+
return DPE.lazy(
35+
() => innerDataParser,
36+
) as never;
4437
},
4538
);
4639

47-
createConstraint.overrideHandler.setMethod(
40+
C.createConstraint.overrideHandler.setMethod(
4841
"toEndpointSchema",
4942
(self) => {
50-
const dataParser = self
51-
.primitiveHandler
52-
.dataParser
53-
.addChecker(...self.checkers as never) as never;
43+
const innerDataParser = self.internal.dataParser;
5444

55-
return DPE.lazy(() => dataParser);
45+
return DPE.lazy(
46+
() => innerDataParser,
47+
) as never;
5648
},
5749
);
Lines changed: 22 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
1-
import { A, DPE, keyWrappedValue, O, pipe, type UnionToIntersection } from "@duplojs/utils";
2-
import { constrainedTypeKind, createConstraintsSet, type EligiblePrimitive, type GetConstraint, type Primitive } from "@duplojs/utils/clean";
1+
import { DPE, type UnionToIntersection, C } from "@duplojs/utils";
2+
import "@duplojs/utils/clean";
3+
4+
interface ToExtractParserParams {
5+
coerce?: boolean;
6+
}
37

48
declare module "@duplojs/utils/clean" {
59
interface ConstraintsSetHandler<
6-
GenericPrimitiveValue extends EligiblePrimitive = EligiblePrimitive,
10+
GenericPrimitiveValue extends C.EligiblePrimitive = C.EligiblePrimitive,
711
GenericConstraintsHandler extends readonly ConstraintHandler[] = readonly [],
812
> {
9-
toExtractParser(): DPE.ContractExtended<
13+
toExtractParser(params?: ToExtractParserParams): DPE.ContractExtended<
1014
(
11-
& Primitive<GenericPrimitiveValue>
15+
& C.Primitive<GenericPrimitiveValue>
1216
& UnionToIntersection<
1317
GenericConstraintsHandler[number] extends infer InferredConstraint
1418
? InferredConstraint extends ConstraintHandler
15-
? GetConstraint<InferredConstraint>
19+
? C.GetConstraint<InferredConstraint>
1620
: never
1721
: never
1822
>
@@ -24,57 +28,27 @@ declare module "@duplojs/utils/clean" {
2428
}
2529
}
2630

27-
createConstraintsSet.overrideHandler.setMethod(
31+
C.createConstraintsSet.overrideHandler.setMethod(
2832
"toExtractParser",
29-
(self) => {
30-
const checkers = A.flatMap(
31-
self.constraints,
32-
({ checkers }) => checkers,
33-
);
34-
35-
const dataParserWithCheckers = self
36-
.primitiveHandler
37-
.dataParser
38-
.addChecker(...checkers as never);
39-
40-
const constraintsKindValue = pipe(
41-
self.constraints,
42-
A.map(({ name }) => O.entry(name, null)),
43-
O.fromEntries,
44-
);
45-
46-
const valueContainer = constrainedTypeKind.setTo(
47-
{},
48-
constraintsKindValue,
49-
);
50-
51-
const dataParser = DPE.transform(
52-
dataParserWithCheckers,
53-
(input) => ({
54-
...valueContainer,
55-
[keyWrappedValue]: input,
56-
}) as never,
33+
(self, params) => {
34+
const innerDataParser = C.toMapDataParser(
35+
self,
36+
params,
5737
);
5838

59-
return dataParser;
39+
return DPE.lazy(
40+
() => innerDataParser,
41+
) as never;
6042
},
6143
);
6244

63-
createConstraintsSet.overrideHandler.setMethod(
45+
C.createConstraintsSet.overrideHandler.setMethod(
6446
"toEndpointSchema",
6547
(self) => {
66-
const checkers = A.flatMap(
67-
self.constraints,
68-
({ checkers }) => checkers,
69-
);
70-
71-
const dataParserWithCheckers = self
72-
.primitiveHandler
73-
.dataParser
74-
.addChecker(...checkers as never) as never;
48+
const innerDataParser = self.internal.dataParser;
7549

7650
return DPE.lazy(
77-
() => dataParserWithCheckers,
78-
);
51+
() => innerDataParser,
52+
) as never;
7953
},
8054
);

scripts/core/clean/entity.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { DP, DPE, type IsEqual, type SimplifyTopLevel, type IsExtends, pipe, O, A, C, type MaybeArray } from "@duplojs/utils";
22
import "@duplojs/utils/clean";
33

4+
interface ToExtractParserParams {
5+
coerce?: boolean;
6+
}
7+
48
interface ToEndpointSchemaParams {
59
addEntityName?: boolean | string;
610
}
@@ -16,7 +20,8 @@ declare module "@duplojs/utils/clean" {
1620
const GenericKey extends MaybeArray<keyof GenericEntityProperties>
1721
= readonly (keyof GenericEntityProperties)[],
1822
>(
19-
keys?: GenericKey
23+
keys?: GenericKey,
24+
params?: ToExtractParserParams
2025
): GenericKey extends readonly any[]
2126
? ReturnType<
2227
typeof DPE.object<
@@ -67,11 +72,11 @@ declare module "@duplojs/utils/clean" {
6772

6873
C.createEntity.overrideHandler.setMethod(
6974
"toExtractParser",
70-
(self, keys) => {
75+
(self, keys, params) => {
7176
if (typeof keys === "string") {
7277
return C.entityPropertyDefinitionToDataParser(
7378
self.propertiesDefinition[keys]!,
74-
(newTypeHandler) => newTypeHandler.toExtractParser(),
79+
(newTypeHandler) => newTypeHandler.toExtractParser(params),
7580
);
7681
}
7782

@@ -84,7 +89,7 @@ C.createEntity.overrideHandler.setMethod(
8489
key,
8590
C.entityPropertyDefinitionToDataParser(
8691
value,
87-
(newTypeHandler) => newTypeHandler.toExtractParser(),
92+
(newTypeHandler) => newTypeHandler.toExtractParser(params),
8893
),
8994
),
9095
),

scripts/core/clean/newType.ts

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
import { A, DPE, keyWrappedValue, O, pipe } from "@duplojs/utils";
2-
import { constrainedTypeKind, createNewType, type NewType, newTypeKind } from "@duplojs/utils/clean";
1+
import { C, DPE } from "@duplojs/utils";
2+
import "@duplojs/utils/clean";
3+
4+
interface ToExtractParserParams {
5+
coerce?: boolean;
6+
}
37

48
declare module "@duplojs/utils/clean" {
59
interface NewTypeHandler<
@@ -8,8 +12,8 @@ declare module "@duplojs/utils/clean" {
812
GenericConstraintsHandler extends readonly ConstraintHandler[] = readonly ConstraintHandler[],
913
GenericInput extends unknown = unknown,
1014
> {
11-
toExtractParser(): DPE.ContractExtended<
12-
NewType<
15+
toExtractParser(params?: ToExtractParserParams): DPE.ContractExtended<
16+
C.NewType<
1317
GenericName,
1418
GenericValue,
1519
GenericConstraintsHandler[number]["name"]
@@ -21,36 +25,27 @@ declare module "@duplojs/utils/clean" {
2125
}
2226
}
2327

24-
createNewType.overrideHandler.setMethod(
28+
C.createNewType.overrideHandler.setMethod(
2529
"toExtractParser",
26-
(self) => {
27-
const constraintsKindValue = pipe(
28-
self.constraints,
29-
A.map(({ name }) => O.entry(name, null)),
30-
O.fromEntries,
31-
);
32-
33-
const valueContainer = newTypeKind.setTo(
34-
constrainedTypeKind.setTo(
35-
{},
36-
constraintsKindValue,
37-
),
38-
self.name,
30+
(self, params) => {
31+
const innerDataParser = C.toMapDataParser(
32+
self,
33+
params,
3934
);
4035

41-
const dataParser = DPE.transform(
42-
self.dataParser,
43-
(input) => ({
44-
...valueContainer,
45-
[keyWrappedValue]: input,
46-
}) as never,
47-
);
48-
49-
return dataParser;
36+
return DPE.lazy(
37+
() => innerDataParser,
38+
) as never;
5039
},
5140
);
5241

53-
createNewType.overrideHandler.setMethod(
42+
C.createNewType.overrideHandler.setMethod(
5443
"toEndpointSchema",
55-
(self) => DPE.lazy(() => self.dataParser),
44+
(self) => {
45+
const innerDataParser = self.internal.dataParser;
46+
47+
return DPE.lazy(
48+
() => innerDataParser,
49+
) as never;
50+
},
5651
);

0 commit comments

Comments
 (0)