Skip to content

Commit 8ac24af

Browse files
committed
Add static type assertions for schemas
1 parent 4d504de commit 8ac24af

File tree

4 files changed

+89
-24
lines changed

4 files changed

+89
-24
lines changed

packages/mcp/src/cairo/schemas.ts

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,25 @@ import {
1212
cairoMultisigDescriptions,
1313
cairoVestingDescriptions,
1414
} from '@openzeppelin/wizard-common';
15+
import type { KindedOptions } from '@openzeppelin/wizard-cairo';
16+
17+
/**
18+
* Static type assertions to ensure schemas satisfy the Wizard API types. Not called at runtime.
19+
*/
20+
function _typeAssertions() {
21+
const _assertions: {
22+
[K in keyof KindedOptions]: Omit<KindedOptions[K], 'kind'>;
23+
} = {
24+
ERC20: z.object(erc20Schema).parse({}),
25+
ERC721: z.object(erc721Schema).parse({}),
26+
ERC1155: z.object(erc1155Schema).parse({}),
27+
Account: z.object(accountSchema).parse({}),
28+
Multisig: z.object(multisigSchema).parse({}),
29+
Governor: z.object(governorSchema).parse({}),
30+
Vesting: z.object(vestingSchema).parse({}),
31+
Custom: z.object(customSchema).parse({}),
32+
};
33+
}
1534

1635
export const commonSchema = {
1736
access: z.literal('ownable').or(z.literal('roles')).optional().describe(cairoCommonDescriptions.access),
@@ -23,7 +42,7 @@ export const commonSchema = {
2342
})
2443
.optional()
2544
.describe(infoDescriptions.info),
26-
};
45+
} as const satisfies z.ZodRawShape;
2746

2847
export const erc20Schema = {
2948
name: z.string().describe(commonDescriptions.name),
@@ -36,7 +55,7 @@ export const erc20Schema = {
3655
appName: z.string().optional().describe(cairoCommonDescriptions.appName),
3756
appVersion: z.string().optional().describe(cairoCommonDescriptions.appVersion),
3857
...commonSchema,
39-
};
58+
} as const satisfies z.ZodRawShape;
4059

4160
export const erc721Schema = {
4261
name: z.string().describe(commonDescriptions.name),
@@ -58,7 +77,7 @@ export const erc721Schema = {
5877
appName: z.string().optional().describe(cairoCommonDescriptions.appName),
5978
appVersion: z.string().optional().describe(cairoCommonDescriptions.appVersion),
6079
...commonSchema,
61-
};
80+
} as const satisfies z.ZodRawShape;
6281

6382
export const erc1155Schema = {
6483
name: z.string().describe(commonDescriptions.name),
@@ -76,7 +95,7 @@ export const erc1155Schema = {
7695
.optional()
7796
.describe(cairoCommonDescriptions.royaltyInfo),
7897
...commonSchema,
79-
};
98+
} as const satisfies z.ZodRawShape;
8099

81100
export const accountSchema = {
82101
name: z.string().describe(commonDescriptions.name),
@@ -87,14 +106,14 @@ export const accountSchema = {
87106
outsideExecution: z.boolean().optional().describe(cairoAccountDescriptions.outsideExecution),
88107
upgradeable: commonSchema.upgradeable,
89108
info: commonSchema.info,
90-
};
109+
} as const satisfies z.ZodRawShape;
91110

92111
export const multisigSchema = {
93112
name: z.string().describe(commonDescriptions.name),
94113
quorum: z.string().describe(cairoMultisigDescriptions.quorum),
95114
upgradeable: commonSchema.upgradeable,
96115
info: commonSchema.info,
97-
};
116+
} as const satisfies z.ZodRawShape;
98117

99118
export const governorSchema = {
100119
name: z.string().describe(commonDescriptions.name),
@@ -116,7 +135,7 @@ export const governorSchema = {
116135
appName: z.string().optional().describe(cairoCommonDescriptions.appName),
117136
appVersion: z.string().optional().describe(cairoCommonDescriptions.appVersion),
118137
info: commonSchema.info,
119-
};
138+
} as const satisfies z.ZodRawShape;
120139

121140
export const vestingSchema = {
122141
name: z.string().describe(commonDescriptions.name),
@@ -125,10 +144,10 @@ export const vestingSchema = {
125144
cliffDuration: z.string().describe(cairoVestingDescriptions.cliffDuration),
126145
schedule: z.enum(['linear', 'custom']).describe(cairoVestingDescriptions.schedule),
127146
info: commonSchema.info,
128-
};
147+
} as const satisfies z.ZodRawShape;
129148

130149
export const customSchema = {
131150
name: z.string().describe(commonDescriptions.name),
132151
pausable: z.boolean().optional().describe(commonDescriptions.pausable),
133152
...commonSchema,
134-
};
153+
} as const satisfies z.ZodRawShape;

packages/mcp/src/solidity/schemas.ts

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,25 @@ import {
1010
solidityAccountDescriptions,
1111
solidityStablecoinDescriptions,
1212
} from '@openzeppelin/wizard-common';
13+
import type { KindedOptions } from '@openzeppelin/wizard';
14+
15+
/**
16+
* Static type assertions to ensure schemas satisfy the Wizard API types. Not called at runtime.
17+
*/
18+
function _typeAssertions() {
19+
const _assertions: {
20+
[K in keyof KindedOptions]: Omit<KindedOptions[K], 'kind'>;
21+
} = {
22+
ERC20: z.object(erc20Schema).parse({}),
23+
ERC721: z.object(erc721Schema).parse({}),
24+
ERC1155: z.object(erc1155Schema).parse({}),
25+
Stablecoin: z.object(stablecoinSchema).parse({}),
26+
RealWorldAsset: z.object(rwaSchema).parse({}),
27+
Account: z.object(accountSchema).parse({}),
28+
Governor: z.object(governorSchema).parse({}),
29+
Custom: z.object(customSchema).parse({}),
30+
};
31+
}
1332

1433
export const commonSchema = {
1534
access: z
@@ -30,7 +49,7 @@ export const commonSchema = {
3049
})
3150
.optional()
3251
.describe(infoDescriptions.info),
33-
};
52+
} as const satisfies z.ZodRawShape;
3453

3554
export const erc20Schema = {
3655
name: z.string().describe(commonDescriptions.name),
@@ -50,7 +69,7 @@ export const erc20Schema = {
5069
.optional()
5170
.describe(solidityERC20Descriptions.crossChainBridging),
5271
...commonSchema,
53-
};
72+
} as const satisfies z.ZodRawShape;
5473

5574
export const erc721Schema = {
5675
name: z.string().describe(commonDescriptions.name),
@@ -64,7 +83,7 @@ export const erc721Schema = {
6483
incremental: z.boolean().optional().describe(solidityERC721Descriptions.incremental),
6584
votes: z.literal('blocknumber').or(z.literal('timestamp')).optional().describe(solidityERC721Descriptions.votes),
6685
...commonSchema,
67-
};
86+
} as const satisfies z.ZodRawShape;
6887

6988
export const erc1155Schema = {
7089
name: z.string().describe(commonDescriptions.name),
@@ -75,7 +94,7 @@ export const erc1155Schema = {
7594
supply: z.boolean().optional().describe(solidityERC1155Descriptions.supply),
7695
updatableUri: z.boolean().optional().describe(solidityERC1155Descriptions.updatableUri),
7796
...commonSchema,
78-
};
97+
} as const satisfies z.ZodRawShape;
7998

8099
const { upgradeable: _, ...erc20SchemaOmitUpgradeable } = erc20Schema;
81100

@@ -88,7 +107,7 @@ export const stablecoinSchema = {
88107
.optional()
89108
.describe(solidityStablecoinDescriptions.limitations),
90109
custodian: z.boolean().optional().describe(solidityStablecoinDescriptions.custodian),
91-
};
110+
} as const satisfies z.ZodRawShape;
92111

93112
export const rwaSchema = stablecoinSchema;
94113

@@ -120,7 +139,7 @@ export const accountSchema = {
120139
.optional()
121140
.describe(solidityAccountDescriptions.ERC7579Modules),
122141
info: commonSchema.info,
123-
};
142+
} as const satisfies z.ZodRawShape;
124143

125144
export const governorSchema = {
126145
name: z.string().describe(commonDescriptions.name),
@@ -152,10 +171,10 @@ export const governorSchema = {
152171
settings: z.boolean().optional().describe(solidityGovernorDescriptions.settings),
153172
upgradeable: commonSchema.upgradeable,
154173
info: commonSchema.info,
155-
};
174+
} as const satisfies z.ZodRawShape;
156175

157176
export const customSchema = {
158177
name: z.string().describe(commonDescriptions.name),
159178
pausable: z.boolean().optional().describe(commonDescriptions.pausable),
160179
...commonSchema,
161-
};
180+
} as const satisfies z.ZodRawShape;

packages/mcp/src/stellar/schemas.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ import {
66
stellarFungibleDescriptions,
77
stellarNonFungibleDescriptions,
88
} from '@openzeppelin/wizard-common';
9+
import type { KindedOptions } from '@openzeppelin/wizard-stellar';
10+
11+
/**
12+
* Static type assertions to ensure schemas satisfy the Wizard API types. Not called at runtime.
13+
*/
14+
function _typeAssertions() {
15+
const _assertions: {
16+
[K in keyof KindedOptions]: Omit<KindedOptions[K], 'kind'>;
17+
} = {
18+
Fungible: z.object(fungibleSchema).parse({}),
19+
NonFungible: z.object(nonFungibleSchema).parse({}),
20+
};
21+
}
922

1023
export const commonSchema = {
1124
upgradeable: z.boolean().optional().describe(stellarCommonDescriptions.upgradeable),
@@ -15,7 +28,7 @@ export const commonSchema = {
1528
})
1629
.optional()
1730
.describe(infoDescriptions.info),
18-
};
31+
} as const satisfies z.ZodRawShape;
1932

2033
export const fungibleSchema = {
2134
name: z.string().describe(commonDescriptions.name),
@@ -25,7 +38,7 @@ export const fungibleSchema = {
2538
premint: z.string().optional().describe(stellarFungibleDescriptions.premint),
2639
mintable: z.boolean().optional().describe(commonDescriptions.mintable),
2740
...commonSchema,
28-
};
41+
} as const satisfies z.ZodRawShape;
2942

3043
export const nonFungibleSchema = {
3144
name: z.string().describe(commonDescriptions.name),
@@ -37,4 +50,4 @@ export const nonFungibleSchema = {
3750
mintable: z.boolean().optional().describe(commonDescriptions.mintable),
3851
sequential: z.boolean().optional().describe(stellarNonFungibleDescriptions.sequential),
3952
...commonSchema,
40-
};
53+
} as const satisfies z.ZodRawShape;

packages/mcp/src/stylus/schemas.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,20 @@ import {
66
stylusERC721Descriptions,
77
stylusERC1155Descriptions,
88
} from '@openzeppelin/wizard-common';
9+
import type { KindedOptions } from '@openzeppelin/wizard-stylus';
10+
11+
/**
12+
* Static type assertions to ensure schemas satisfy the Wizard API types. Not called at runtime.
13+
*/
14+
function _typeAssertions() {
15+
const _assertions: {
16+
[K in keyof KindedOptions]: Omit<KindedOptions[K], 'kind'>;
17+
} = {
18+
ERC20: z.object(erc20Schema).parse({}),
19+
ERC721: z.object(erc721Schema).parse({}),
20+
ERC1155: z.object(erc1155Schema).parse({}),
21+
};
22+
}
923

1024
export const commonSchema = {
1125
info: z
@@ -15,26 +29,26 @@ export const commonSchema = {
1529
})
1630
.optional()
1731
.describe(infoDescriptions.info),
18-
};
32+
} as const satisfies z.ZodRawShape;
1933

2034
export const erc20Schema = {
2135
name: z.string().describe(commonDescriptions.name),
2236
burnable: z.boolean().optional().describe(commonDescriptions.burnable),
2337
permit: z.boolean().optional().describe(stylusERC20Descriptions.permit),
2438
flashmint: z.boolean().optional().describe(stylusERC20Descriptions.flashmint),
2539
...commonSchema,
26-
};
40+
} as const satisfies z.ZodRawShape;
2741

2842
export const erc721Schema = {
2943
name: z.string().describe(commonDescriptions.name),
3044
burnable: z.boolean().optional().describe(commonDescriptions.burnable),
3145
enumerable: z.boolean().optional().describe(stylusERC721Descriptions.enumerable),
3246
...commonSchema,
33-
};
47+
} as const satisfies z.ZodRawShape;
3448

3549
export const erc1155Schema = {
3650
name: z.string().describe(commonDescriptions.name),
3751
burnable: z.boolean().optional().describe(commonDescriptions.burnable),
3852
supply: z.boolean().optional().describe(stylusERC1155Descriptions.supply),
3953
...commonSchema,
40-
};
54+
} as const satisfies z.ZodRawShape;

0 commit comments

Comments
 (0)