Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: change zod schemas inputs/outputs to readonly to match abitype #194

Merged
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/seven-planes-deliver.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"abitype": patch
---

Changed the following types to readonly in zod package:

- `AbiContructor.inputs`
- `AbiError.inputs`
- `AbiEvent.inputs`
- `AbiFunction.inputs` / `AbiFunction.outputs`
5 changes: 4 additions & 1 deletion .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,14 @@ gh repo clone wagmi-dev/abitype

## Installing Node.js and pnpm

ABIType uses [pnpm](https://pnpm.io) as its package manager. You need to install **Node.js v16 or higher** and **pnpm v7 or higher**.
ABIType uses [pnpm](https://pnpm.io) as its package manager. You need to install **Node.js v16 or higher**, **pnpm exactly v8.3.1** and **TypeScript exactly v5.0.4**.
Raiden1411 marked this conversation as resolved.
Show resolved Hide resolved

You can run the following commands in your terminal to check your local Node.js and npm versions:

```bash
node -v
pnpm -v
pnpm tsc -v
```

If the versions are not correct or you don't have Node.js or pnpm installed, download and follow their setup instructions:
Expand Down Expand Up @@ -95,6 +96,8 @@ pnpm test
pnpm test:typecheck
```

> **Note** Ensure to build the package (`pnpm build`) before running the `test:typecheck` suite.

<div align="right">
<a href="#basic-guide">&uarr; back to top</a></b>
</div>
Expand Down
33 changes: 8 additions & 25 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,20 +70,14 @@
},
"typesVersions": {
"*": {
"config": [
"./dist/types/config.d.ts"
],
"test": [
"./dist/types/test.d.ts"
],
"zod": [
"./dist/types/zod.d.ts"
]
"config": ["./dist/types/config.d.ts"],
"test": ["./dist/types/test.d.ts"],
"zod": ["./dist/types/zod.d.ts"]
}
},
"peerDependencies": {
Raiden1411 marked this conversation as resolved.
Show resolved Hide resolved
"typescript": ">=5.0.4",
"zod": "^3 >=3.19.1"
"zod": "^3 >=3.22.0"
},
"peerDependenciesMeta": {
"typescript": {
Expand All @@ -109,25 +103,16 @@
"typescript": "5.0.4",
"typescript@5.1.3": "npm:typescript@5.1.3",
"vitest": "^0.30.1",
"zod": "^3.20.6"
"zod": "^3.22.4"
},
"contributors": [
"jxom.eth <j@wagmi.sh>",
"awkweb.eth <t@wagmi.sh>"
],
"contributors": ["jxom.eth <j@wagmi.sh>", "awkweb.eth <t@wagmi.sh>"],
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/wagmi-dev"
}
],
"keywords": [
"abi",
"eth",
"ethereum",
"typescript",
"web3"
],
"keywords": ["abi", "eth", "ethereum", "typescript", "web3"],
"simple-git-hooks": {
"pre-commit": "pnpm format && pnpm lint:fix"
},
Expand All @@ -138,9 +123,7 @@
"shiki-twoslash>shiki": "^0.14.1"
},
"peerDependencyRules": {
"ignoreMissing": [
"@algolia/client-search"
]
"ignoreMissing": ["@algolia/client-search"]
}
}
}
8 changes: 4 additions & 4 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

109 changes: 99 additions & 10 deletions src/zod.test-d.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,106 @@
import type { Abi } from './abi.js'
import { Abi as AbiSchema } from './zod.js'
import type {
Abi,
AbiConstructor,
AbiError,
AbiEvent,
AbiParameter,
} from './abi.js'
import {
customSolidityErrorsAbi,
ensRegistryWithFallbackAbi,
erc20Abi,
} from './test/abis.js'
import {
Abi as AbiSchema,
AbiConstructor as AbiConstructorSchema,
AbiError as AbiErrorSchema,
AbiEvent as AbiEventSchema,
AbiParameter as AbiParameterSchema,
} from './zod.js'
import { describe, expectTypeOf, test } from 'vitest'

describe('Zod Types', () => {
test('assignable to Abi', () => {
const parsed: Abi = AbiSchema.parse([])
type Result = typeof parsed extends Abi ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
describe('Abi', () => {
test('assignable to Abi', () => {
const parsed: Abi = AbiSchema.parse(erc20Abi)
type Result = typeof parsed extends Abi ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})

test('extends Abi', () => {
const parsed = AbiSchema.parse(erc20Abi)
type Result = typeof parsed extends Abi ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})
})

describe('AbiConstructor', () => {
const ensRegistryConstructor = ensRegistryWithFallbackAbi[0]

test('assignable to AbiConstructor', () => {
const parsed: AbiConstructor = AbiConstructorSchema.parse(
ensRegistryConstructor,
)
type Result = typeof parsed extends AbiConstructor ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})

test('extends AbiConstructor', () => {
const parsed = AbiConstructorSchema.parse(ensRegistryConstructor)
type Result = typeof parsed extends AbiConstructor ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})
})

test('extends Abi', () => {
const parsed = AbiSchema.parse([])
type Result = typeof parsed extends Abi ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
describe('AbiError', () => {
const approvalCallerNotOwnerNorApproved = customSolidityErrorsAbi[1]

test('assignable to AbiError', () => {
const parsed: AbiError = AbiErrorSchema.parse(
approvalCallerNotOwnerNorApproved,
)
type Result = typeof parsed extends AbiError ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})

test('extends AbiError', () => {
const parsed = AbiErrorSchema.parse(approvalCallerNotOwnerNorApproved)
type Result = typeof parsed extends AbiError ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})
})

describe('AbiEvent', () => {
const approvalEvent = erc20Abi[0]

test('assignable to AbiEvent', () => {
const parsed: AbiEvent = AbiEventSchema.parse(approvalEvent)
type Result = typeof parsed extends AbiEvent ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})

test('extends AbiEvent', () => {
const parsed = AbiEventSchema.parse(approvalEvent)
type Result = typeof parsed extends AbiEvent ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})
})

describe('AbiParameter', () => {
const approvalOwnerParameter = erc20Abi[0].inputs[0]

test('assignable to AbiParameter', () => {
const parsed: AbiParameter = AbiParameterSchema.parse(
approvalOwnerParameter,
)
type Result = typeof parsed extends AbiParameter ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})

test('extends AbiParameter', () => {
const parsed = AbiParameterSchema.parse(approvalOwnerParameter)
type Result = typeof parsed extends AbiParameter ? true : false
expectTypeOf<Result>().toEqualTypeOf<true>()
})
})
})
18 changes: 9 additions & 9 deletions src/zod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export const AbiParameter: z.ZodType<AbiParameterType> = z.lazy(() =>
}),
z.object({
type: z.union([SolidityTuple, SolidityArrayWithTuple]),
components: z.array(AbiParameter),
components: z.array(AbiParameter).readonly(),
}),
]),
),
Expand Down Expand Up @@ -110,9 +110,9 @@ export const AbiFunction = z.preprocess(
* https://github.com/vyperlang/vyper/issues/2151
*/
gas: z.number().optional(),
inputs: z.array(AbiParameter),
inputs: z.array(AbiParameter).readonly(),
name: Identifier,
outputs: z.array(AbiParameter),
outputs: z.array(AbiParameter).readonly(),
/**
* @deprecated use `payable` or `nonpayable` from {@link AbiStateMutability} instead
* https://github.com/ethereum/solidity/issues/992
Expand All @@ -138,7 +138,7 @@ export const AbiConstructor = z.preprocess(
* @deprecated use `pure` or `view` from {@link AbiStateMutability} instead
* https://github.com/ethereum/solidity/issues/992
*/
inputs: z.array(AbiParameter),
inputs: z.array(AbiParameter).readonly(),
/**
* @deprecated use `payable` or `nonpayable` from {@link AbiStateMutability} instead
* https://github.com/ethereum/solidity/issues/992
Expand Down Expand Up @@ -182,13 +182,13 @@ export const AbiReceive = z.object({
export const AbiEvent = z.object({
type: z.literal('event'),
anonymous: z.boolean().optional(),
inputs: z.array(AbiEventParameter),
inputs: z.array(AbiEventParameter).readonly(),
name: Identifier,
})

export const AbiError = z.object({
type: z.literal('error'),
inputs: z.array(AbiParameter),
inputs: z.array(AbiParameter).readonly(),
name: z.string(),
})

Expand Down Expand Up @@ -263,14 +263,14 @@ export const Abi = z.array(
z.discriminatedUnion('type', [
z.object({
type: z.literal('function'),
inputs: z.array(AbiParameter),
inputs: z.array(AbiParameter).readonly(),
name: z.string().regex(/[a-zA-Z$_][a-zA-Z0-9$_]*/),
outputs: z.array(AbiParameter),
outputs: z.array(AbiParameter).readonly(),
stateMutability: AbiStateMutability,
}),
z.object({
type: z.literal('constructor'),
inputs: z.array(AbiParameter),
inputs: z.array(AbiParameter).readonly(),
stateMutability: z.union([
z.literal('payable'),
z.literal('nonpayable'),
Expand Down