Skip to content

Commit 9827bc9

Browse files
authored
feat: scalar constructor with inference (#954)
1 parent c14e5b2 commit 9827bc9

File tree

8 files changed

+50
-34
lines changed

8 files changed

+50
-34
lines changed

src/entrypoints/alpha/_Graffle.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from '../../layers/5_client/client.js'
2+
export * as Scalars from './scalars.js'

src/entrypoints/alpha/__Graffle.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * as Graffle from './_Graffle.js'

src/entrypoints/alpha/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export { execute } from '../../layers/0_functions/execute.js'
22
export { request } from '../../layers/0_functions/request.js'
3-
export * as Graffle from '../../layers/5_client/client.js'
3+
export * from './__Graffle.js'

src/entrypoints/alpha/scalars.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export * from '../../layers/1_Schema/Hybrid/types/Scalar/Scalar.js'
1+
export { create } from '../../layers/1_Schema/Hybrid/types/Scalar/Scalar.js'

src/layers/1_Schema/Hybrid/types/Scalar/Scalar.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,28 @@
22

33
import type { GlobalRegistry } from '../../../../2_generator/globalRegistry.js'
44
import type { Codec } from './codec.js'
5-
import { nativeScalarCodecs } from './nativeScalarCodecs.js'
5+
import { JavaScriptScalarCodecs } from './nativeScalarCodecs.js'
66

7-
export { nativeScalarCodecs } from './nativeScalarCodecs.js'
7+
export { JavaScriptScalarCodecs } from './nativeScalarCodecs.js'
88

99
export const ScalarKind = `Scalar`
1010

1111
export type ScalarKind = typeof ScalarKind
1212

1313
export type StandardScalarRuntimeTypes = boolean | number | string
1414

15+
export const create = <$Name extends string, $Decoded, $Encoded extends StandardScalarRuntimeTypes>(
16+
name: $Name,
17+
codec: {
18+
encode: (value: $Decoded) => $Encoded
19+
decode: (value: $Encoded) => $Decoded
20+
},
21+
): Scalar<$Name, $Decoded, $Encoded> => ({
22+
kind: ScalarKind,
23+
name: name,
24+
codec: codec as any, // eslint-disable-line
25+
})
26+
1527
export const scalar = <$Name extends string, $Codec extends Codec<any, any>>(
1628
name: $Name,
1729
codec: $Codec,
@@ -23,22 +35,23 @@ export const scalar = <$Name extends string, $Codec extends Codec<any, any>>(
2335

2436
export interface Scalar<
2537
$Name extends string = string,
26-
$Codec extends Codec = Codec,
38+
$Decoded = unknown,
39+
$Encoded extends StandardScalarRuntimeTypes = StandardScalarRuntimeTypes,
2740
> {
2841
kind: ScalarKind
2942
name: $Name
30-
codec: $Codec
43+
codec: Codec<$Decoded, $Encoded>
3144
}
3245

33-
export const String = scalar(`String`, nativeScalarCodecs.String)
46+
export const String = create(`String`, JavaScriptScalarCodecs.String)
3447

35-
export const ID = scalar(`ID`, nativeScalarCodecs.String)
48+
export const ID = create(`ID`, JavaScriptScalarCodecs.String)
3649

37-
export const Int = scalar(`Int`, nativeScalarCodecs.Number)
50+
export const Int = create(`Int`, JavaScriptScalarCodecs.Number)
3851

39-
export const Float = scalar(`Float`, nativeScalarCodecs.Number)
52+
export const Float = create(`Float`, JavaScriptScalarCodecs.Number)
4053

41-
export const Boolean = scalar(`Boolean`, nativeScalarCodecs.Boolean)
54+
export const Boolean = create(`Boolean`, JavaScriptScalarCodecs.Boolean)
4255

4356
export type ID = typeof ID
4457

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import type { StandardScalarRuntimeTypes } from './Scalar.js'
22

3-
export const codec = <Decoded = any, Encoded extends StandardScalarRuntimeTypes = StandardScalarRuntimeTypes>(
4-
codec: Codec<Decoded, Encoded>,
5-
) => codec
6-
7-
export type Codec<Decoded = any, Encoded extends StandardScalarRuntimeTypes = StandardScalarRuntimeTypes> = {
8-
encode: (value: Decoded) => Encoded
9-
decode: (value: Encoded) => Decoded
3+
export type Codec<$Decoded = any, $Encoded extends StandardScalarRuntimeTypes = StandardScalarRuntimeTypes> = {
4+
encode: (value: $Decoded) => $Encoded
5+
decode: (value: $Encoded) => $Decoded
106
}
7+
8+
export const createCodec = <$Decoded, $Encoded extends StandardScalarRuntimeTypes>(codec: {
9+
encode: (value: $Decoded) => $Encoded
10+
decode: (value: $Encoded) => $Decoded
11+
}): Codec<$Decoded, $Encoded> => codec
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
import { codec } from './codec.js'
1+
import { createCodec } from './codec.js'
22

3-
export const nativeScalarCodecs = {
4-
String: codec<string, string>({
5-
encode: (value) => value,
6-
decode: (value) => value,
3+
export const JavaScriptScalarCodecs = {
4+
String: createCodec({
5+
encode: (value: string) => value,
6+
decode: (value: string) => value,
77
}),
8-
Number: codec<number, number>({
9-
encode: (value) => value,
10-
decode: (value) => value,
8+
Number: createCodec({
9+
encode: (value: number) => value,
10+
decode: (value: number) => value,
1111
}),
12-
Boolean: codec<boolean, boolean>({
13-
encode: (value) => value,
14-
decode: (value) => value,
12+
Boolean: createCodec({
13+
encode: (value: boolean) => value,
14+
decode: (value: boolean) => value,
1515
}),
1616
}

tests/_/customScalarCodecs.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import { Scalar } from '../../src/layers/1_Schema/__.js'
2-
import type { Codec } from '../../src/layers/1_Schema/Hybrid/types/Scalar/codec.js'
1+
import { Graffle } from '../../src/entrypoints/alpha/main.js'
32

4-
export const Date = Scalar.scalar<'Date', Codec<globalThis.Date, string>>(`Date`, {
5-
encode: value => value.toISOString(),
6-
decode: value => new globalThis.Date(value),
3+
export const Date = Graffle.Scalars.create(`Date`, {
4+
encode: (value: globalThis.Date) => value.toISOString(),
5+
decode: (value: string) => new globalThis.Date(value),
76
})
87

98
export type Date = typeof Date

0 commit comments

Comments
 (0)