From b610ae34b7144adf43af7bb7ee472a85824a0254 Mon Sep 17 00:00:00 2001 From: Will Cory Date: Mon, 23 Oct 2023 18:24:50 -0700 Subject: [PATCH] :recycle: chore: Refactor bundler into smaller packages (#598) ## Description Break up bundler into smaller packages so it can build more incrementally and be easier to navigate. Bundler is currently the biggest package and the only package I struggle finding stuff in. - [x] keep bundler specific code in @evmts/bundler - [x] move runtime generation code to @evmts/runtime - [x] move solc compiler code and solidity resolution code to @evmts/solc - [ ] move unplugin to a seperate package from bundler ## Testing Explain the quality checks that have been done on the code changes ## Additional Information - [ ] I read the [contributing docs](../docs/contributing.md) (if this is your first contribution) Your ENS/address: --------- Co-authored-by: Will Cory --- bun.lockb | Bin 1197048 -> 1115560 bytes bundlers/bundler/package.json | 2 + bundlers/bundler/src/bundler.js | 13 +- bundlers/bundler/src/bundler.spec.ts | 13 +- bundlers/bundler/src/index.js | 12 - bundlers/bundler/src/solc/index.js | 2 - bundlers/bundler/src/types.ts | 21 +- bundlers/bundler/vitest.config.ts | 8 +- bundlers/esbuild/package.json | 2 +- bundlers/esbuild/src/index.js | 4 +- bundlers/esbuild/src/index.spec.ts | 2 +- bundlers/rollup/package.json | 2 +- bundlers/rollup/src/index.js | 4 +- bundlers/rspack/package.json | 2 +- bundlers/rspack/src/index.js | 4 +- bundlers/unplugin/.gitignore | 50 +++ bundlers/unplugin/LICENSE | 22 ++ bundlers/unplugin/README.md | 37 ++ bundlers/unplugin/package.json | 86 +++++ bundlers/unplugin/rome.json | 35 ++ .../src/evmtsUnplugin.js} | 24 +- .../src/evmtsUnplugin.spec.ts} | 32 +- bundlers/unplugin/src/index.js | 5 + bundlers/unplugin/tsconfig.json | 15 + bundlers/unplugin/tsup.config.ts | 13 + bundlers/unplugin/typedoc.json | 8 + bundlers/unplugin/vitest.config.ts | 17 + bundlers/vite/package.json | 2 +- bundlers/vite/src/index.js | 4 +- bundlers/webpack/package.json | 2 +- bundlers/webpack/src/index.js | 4 +- config/vitest.config.ts | 4 +- docs/reference/bundler/modules.md | 4 - docs/reference/bundler/modules/bundler.md | 2 +- docs/reference/bundler/modules/createCache.md | 4 +- docs/reference/bundler/modules/runtime.md | 113 ------ docs/reference/bundler/modules/solc.md | 72 ---- docs/reference/bundler/modules/unplugin.md | 154 -------- docs/reference/bundler/modules/utils.md | 154 -------- docs/reference/esbuild-plugin/modules.md | 2 +- docs/reference/rollup-plugin/modules.md | 2 +- docs/reference/rspack-plugin/modules.md | 2 +- docs/reference/unplugin/.nojekyll | 1 + docs/reference/unplugin/README.md | 39 ++ docs/reference/unplugin/modules.md | 72 ++++ docs/reference/vite-plugin/modules.md | 6 +- docs/reference/webpack-plugin/modules.md | 6 +- examples/esbuild/src/ExampleContract.sol | 2 +- nx.json | 9 + package.json | 4 +- pnpm-workspace.yaml | 2 + runtime/.gitignore | 50 +++ runtime/CHANGELOG.md | 361 ++++++++++++++++++ runtime/LICENSE | 22 ++ runtime/README.md | 50 +++ runtime/TestContract.d.ts | 129 +++++++ runtime/package.json | 91 +++++ runtime/rome.json | 35 ++ runtime/source.ts | 31 ++ .../src}/generateEvmtsBody.js | 2 +- .../src}/generateEvmtsBody.spec.ts | 2 +- .../src}/generateEvmtsBodyDts.js | 2 +- .../src}/generateEvmtsBodyDts.spec.ts | 2 +- .../src}/generateRuntime.js | 4 +- .../src}/generateRuntimeSync.js | 4 +- .../src}/generateRuntimeSync.spec.ts | 2 +- .../src/runtime => runtime/src}/index.js | 0 runtime/tsconfig.json | 15 + runtime/tsup.config.ts | 13 + runtime/typedoc.json | 8 + runtime/vitest.config.ts | 17 + solc/.gitignore | 50 +++ solc/CHANGELOG.md | 361 ++++++++++++++++++ solc/LICENSE | 22 ++ solc/README.md | 29 ++ solc/TestContract.d.ts | 129 +++++++ solc/package.json | 90 +++++ solc/rome.json | 35 ++ solc/source.ts | 31 ++ .../src/compiler}/compileContracts.js | 17 +- .../src/compiler}/compileContracts.spec.ts | 67 +--- .../src/compiler}/compileContractsSync.js | 17 +- .../compiler}/compileContractsSync.spec.ts | 41 +- solc/src/compiler/index.js | 2 + solc/src/importResolution/README.md | 28 ++ solc/src/importResolution/index.js | 2 + .../src/importResolution}/moduleFactory.js | 0 .../importResolution}/moduleFactory.spec.ts | 0 .../importResolution}/moduleFactorySync.js | 0 .../moduleFactorySync.spec.ts | 0 .../importResolution}/resolveImportPath.js | 0 .../resolveImportPath.spec.ts | 0 .../src/importResolution}/resolveImports.js | 0 .../importResolution}/resolveImports.spec.ts | 0 solc/src/index.js | 41 ++ .../solc => solc/src}/resolveArtifacts.d.ts | 10 +- .../src/solc => solc/src}/resolveArtifacts.js | 13 +- .../src}/resolveArtifacts.spec.ts | 6 +- .../src}/resolveArtifactsSync.d.ts | 16 +- .../solc => solc/src}/resolveArtifactsSync.js | 13 +- .../src}/resolveArtifactsSync.spec.ts | 6 +- .../bundler/src/solc => solc/src}/solc.js | 0 .../src/solc => solc/src}/solcTypes.ts | 0 solc/src/types.ts | 43 +++ .../bundler => solc}/src/utils/formatPath.js | 0 .../src/utils/formatPath.spec.ts | 0 {bundlers/bundler => solc}/src/utils/index.js | 0 .../bundler => solc}/src/utils/invariant.d.ts | 0 .../bundler => solc}/src/utils/invariant.js | 0 .../src/utils/invariant.spec.ts | 0 .../src/utils/isImportLocal.js | 0 .../src/utils/isImportLocal.spec.ts | 0 .../src/utils/isRelativeSolidity.js | 0 .../src/utils/isRelativeSolidity.spec.ts | 0 .../bundler => solc}/src/utils/isSolidity.js | 0 .../src/utils/isSolidity.spec.ts | 0 .../src/utils/resolvePromise.js | 0 .../src/utils/resolvePromise.spec.ts | 6 +- solc/tsconfig.json | 15 + solc/tsup.config.ts | 13 + solc/typedoc.json | 14 + solc/vitest.config.ts | 17 + 122 files changed, 2285 insertions(+), 790 deletions(-) delete mode 100644 bundlers/bundler/src/solc/index.js create mode 100644 bundlers/unplugin/.gitignore create mode 100644 bundlers/unplugin/LICENSE create mode 100644 bundlers/unplugin/README.md create mode 100644 bundlers/unplugin/package.json create mode 100644 bundlers/unplugin/rome.json rename bundlers/{bundler/src/unplugin.js => unplugin/src/evmtsUnplugin.js} (78%) rename bundlers/{bundler/src/unplugin.spec.ts => unplugin/src/evmtsUnplugin.spec.ts} (90%) create mode 100644 bundlers/unplugin/src/index.js create mode 100644 bundlers/unplugin/tsconfig.json create mode 100644 bundlers/unplugin/tsup.config.ts create mode 100644 bundlers/unplugin/typedoc.json create mode 100644 bundlers/unplugin/vitest.config.ts delete mode 100644 docs/reference/bundler/modules/runtime.md delete mode 100644 docs/reference/bundler/modules/solc.md delete mode 100644 docs/reference/bundler/modules/unplugin.md delete mode 100644 docs/reference/bundler/modules/utils.md create mode 100644 docs/reference/unplugin/.nojekyll create mode 100644 docs/reference/unplugin/README.md create mode 100644 docs/reference/unplugin/modules.md create mode 100644 runtime/.gitignore create mode 100644 runtime/CHANGELOG.md create mode 100644 runtime/LICENSE create mode 100644 runtime/README.md create mode 100644 runtime/TestContract.d.ts create mode 100644 runtime/package.json create mode 100644 runtime/rome.json create mode 100644 runtime/source.ts rename {bundlers/bundler/src/runtime => runtime/src}/generateEvmtsBody.js (95%) rename {bundlers/bundler/src/runtime => runtime/src}/generateEvmtsBody.spec.ts (97%) rename {bundlers/bundler/src/runtime => runtime/src}/generateEvmtsBodyDts.js (92%) rename {bundlers/bundler/src/runtime => runtime/src}/generateEvmtsBodyDts.spec.ts (95%) rename {bundlers/bundler/src/runtime => runtime/src}/generateRuntime.js (84%) rename {bundlers/bundler/src/runtime => runtime/src}/generateRuntimeSync.js (88%) rename {bundlers/bundler/src/runtime => runtime/src}/generateRuntimeSync.spec.ts (97%) rename {bundlers/bundler/src/runtime => runtime/src}/index.js (100%) create mode 100644 runtime/tsconfig.json create mode 100644 runtime/tsup.config.ts create mode 100644 runtime/typedoc.json create mode 100644 runtime/vitest.config.ts create mode 100644 solc/.gitignore create mode 100644 solc/CHANGELOG.md create mode 100644 solc/LICENSE create mode 100644 solc/README.md create mode 100644 solc/TestContract.d.ts create mode 100644 solc/package.json create mode 100644 solc/rome.json create mode 100644 solc/source.ts rename {bundlers/bundler/src/solc => solc/src/compiler}/compileContracts.js (86%) rename {bundlers/bundler/src/solc => solc/src/compiler}/compileContracts.spec.ts (86%) rename {bundlers/bundler/src/solc => solc/src/compiler}/compileContractsSync.js (85%) rename {bundlers/bundler/src/solc => solc/src/compiler}/compileContractsSync.spec.ts (93%) create mode 100644 solc/src/compiler/index.js create mode 100644 solc/src/importResolution/README.md create mode 100644 solc/src/importResolution/index.js rename {bundlers/bundler/src/solc => solc/src/importResolution}/moduleFactory.js (100%) rename {bundlers/bundler/src/solc => solc/src/importResolution}/moduleFactory.spec.ts (100%) rename {bundlers/bundler/src/solc => solc/src/importResolution}/moduleFactorySync.js (100%) rename {bundlers/bundler/src/solc => solc/src/importResolution}/moduleFactorySync.spec.ts (100%) rename {bundlers/bundler/src/solc => solc/src/importResolution}/resolveImportPath.js (100%) rename {bundlers/bundler/src/solc => solc/src/importResolution}/resolveImportPath.spec.ts (100%) rename {bundlers/bundler/src/solc => solc/src/importResolution}/resolveImports.js (100%) rename {bundlers/bundler/src/solc => solc/src/importResolution}/resolveImports.spec.ts (100%) create mode 100644 solc/src/index.js rename {bundlers/bundler/src/solc => solc/src}/resolveArtifacts.d.ts (77%) rename {bundlers/bundler/src/solc => solc/src}/resolveArtifacts.js (81%) rename {bundlers/bundler/src/solc => solc/src}/resolveArtifacts.spec.ts (91%) rename {bundlers/bundler/src/solc => solc/src}/resolveArtifactsSync.d.ts (67%) rename {bundlers/bundler/src/solc => solc/src}/resolveArtifactsSync.js (80%) rename {bundlers/bundler/src/solc => solc/src}/resolveArtifactsSync.spec.ts (95%) rename {bundlers/bundler/src/solc => solc/src}/solc.js (100%) rename {bundlers/bundler/src/solc => solc/src}/solcTypes.ts (100%) create mode 100644 solc/src/types.ts rename {bundlers/bundler => solc}/src/utils/formatPath.js (100%) rename {bundlers/bundler => solc}/src/utils/formatPath.spec.ts (100%) rename {bundlers/bundler => solc}/src/utils/index.js (100%) rename {bundlers/bundler => solc}/src/utils/invariant.d.ts (100%) rename {bundlers/bundler => solc}/src/utils/invariant.js (100%) rename {bundlers/bundler => solc}/src/utils/invariant.spec.ts (100%) rename {bundlers/bundler => solc}/src/utils/isImportLocal.js (100%) rename {bundlers/bundler => solc}/src/utils/isImportLocal.spec.ts (100%) rename {bundlers/bundler => solc}/src/utils/isRelativeSolidity.js (100%) rename {bundlers/bundler => solc}/src/utils/isRelativeSolidity.spec.ts (100%) rename {bundlers/bundler => solc}/src/utils/isSolidity.js (100%) rename {bundlers/bundler => solc}/src/utils/isSolidity.spec.ts (100%) rename {bundlers/bundler => solc}/src/utils/resolvePromise.js (100%) rename {bundlers/bundler => solc}/src/utils/resolvePromise.spec.ts (96%) create mode 100644 solc/tsconfig.json create mode 100644 solc/tsup.config.ts create mode 100644 solc/typedoc.json create mode 100644 solc/vitest.config.ts diff --git a/bun.lockb b/bun.lockb index e48e2a7ecd916cfdeed4e8286a11f56ad598a3fe..66b6cd539f6b5a57b32877523e206121ad360e2a 100755 GIT binary patch delta 246261 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 z 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 delta 294203 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

rFuo`Ady>|&F8H6Ndm5@PD+7(&fa)({vX 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 q(F#uTf~`7Z`B6YmI== { } resolver = bundler(config as any, logger, fao) - vi.mock('./solc', () => { + vi.mock('@evmts/solc', () => { return { resolveArtifacts: vi.fn(), resolveArtifactsSync: vi.fn(), diff --git a/bundlers/bundler/src/index.js b/bundlers/bundler/src/index.js index 791d6dc42f..480106f19b 100644 --- a/bundlers/bundler/src/index.js +++ b/bundlers/bundler/src/index.js @@ -3,10 +3,8 @@ * @typedef {import('./types.js').AsyncBundlerResult} AsyncBundlerResult * @typedef {import('./types.js').Bundler} Bundler * @typedef {import('./types.js').BundlerResult} BundlerResult - * @typedef {import('./types.js').CompiledContracts} CompiledContracts * @typedef {import('./types.js').FileAccessObject} FileAccessObject * @typedef {import('./types.js').Logger} Logger - * @typedef {import('./types.js').ModuleInfo} ModuleInfo * @typedef {import('./types.js').SolidityResolver} SolidityResolver * @typedef {import('./types.js').SyncBundlerResult} SyncBundlerResult * @@ -15,13 +13,3 @@ */ export { bundler } from './bundler.js' export { createCache } from './createCache.js' -export { resolveArtifacts, resolveArtifactsSync } from './solc/index.js' -export { - vitePluginEvmts, - rollupPluginEvmts, - rspackPluginEvmts, - esbuildPluginEvmts, - webpackPluginEvmts, -} from './unplugin.js' -// export * from './runtime/index.js' -// export * from './utils/index.js' diff --git a/bundlers/bundler/src/solc/index.js b/bundlers/bundler/src/solc/index.js deleted file mode 100644 index eda12d3e24..0000000000 --- a/bundlers/bundler/src/solc/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { resolveArtifacts } from './resolveArtifacts.js' -export { resolveArtifactsSync } from './resolveArtifactsSync.js' diff --git a/bundlers/bundler/src/types.ts b/bundlers/bundler/src/types.ts index 8b7f5775ce..b5039b476a 100644 --- a/bundlers/bundler/src/types.ts +++ b/bundlers/bundler/src/types.ts @@ -1,6 +1,6 @@ import type { Cache } from './createCache.js' -import type { SolcInputDescription, SolcOutput } from './solc/solcTypes.js' import type { ResolvedCompilerConfig } from '@evmts/config' +import type { ModuleInfo, SolcInputDescription, SolcOutput } from '@evmts/solc' import type { Node } from 'solidity-ast/node.js' export type BundlerResult = { @@ -85,17 +85,6 @@ export type Logger = { warn: (...message: string[]) => void log: (...message: string[]) => void } -/** - * Copied from rollup (kinda) - * @see https://rollupjs.org/plugin-development/#this-getmoduleinfo - */ -export interface ModuleInfo { - id: string // the id of the module, for convenience - rawCode: string | null // the source code of the module, `null` if external or not yet available - code: string | null // the code after transformed to correctly resolve remappings and node_module imports - importedIds: string[] // the module ids statically imported by this module - resolutions: ModuleInfo[] // how statically imported ids were resolved, for use with this.load -} export type SolidityResolver = ( config: ResolvedCompilerConfig, @@ -144,11 +133,3 @@ export type SolidityResolver = ( */ resolveEsmModuleSync: (module: string, basedir: string) => BundlerResult } - -export type CompiledContracts = { - artifacts: SolcOutput['contracts'][string] | undefined - modules: Record<'string', ModuleInfo> - asts: TIncludeAsts extends true ? Record : undefined - solcInput: SolcInputDescription - solcOutput: SolcOutput -} diff --git a/bundlers/bundler/vitest.config.ts b/bundlers/bundler/vitest.config.ts index b2e76b0ac9..2693e52525 100644 --- a/bundlers/bundler/vitest.config.ts +++ b/bundlers/bundler/vitest.config.ts @@ -7,10 +7,10 @@ export default defineConfig({ environment: 'node', coverage: { reporter: ['text', 'json-summary', 'json'], - lines: 99.53, - functions: 97.43, - branches: 97.18, - statements: 99.53, + lines: 100, + functions: 100, + branches: 100, + statements: 100, thresholdAutoUpdate: true, }, }, diff --git a/bundlers/esbuild/package.json b/bundlers/esbuild/package.json index e8d4d96d07..72ccecf778 100644 --- a/bundlers/esbuild/package.json +++ b/bundlers/esbuild/package.json @@ -41,7 +41,7 @@ "test:ui": "vitest --ui" }, "dependencies": { - "@evmts/bundler": "workspace:^" + "@evmts/unplugin": "workspace:^" }, "devDependencies": { "@evmts/tsconfig": "workspace:^", diff --git a/bundlers/esbuild/src/index.js b/bundlers/esbuild/src/index.js index c259746faf..4bdc851e3d 100644 --- a/bundlers/esbuild/src/index.js +++ b/bundlers/esbuild/src/index.js @@ -1 +1,3 @@ -export { esbuildPluginEvmts } from '@evmts/bundler' +import { createUnplugin, evmtsUnplugin } from '@evmts/unplugin' + +export const { esbuild: esbuildPluginEvmts } = createUnplugin(evmtsUnplugin) diff --git a/bundlers/esbuild/src/index.spec.ts b/bundlers/esbuild/src/index.spec.ts index 84a4c2b79a..c83f81b5a1 100644 --- a/bundlers/esbuild/src/index.spec.ts +++ b/bundlers/esbuild/src/index.spec.ts @@ -1,7 +1,7 @@ import { esbuildPluginEvmts } from './index.js' import { describe, expect, it, vi } from 'vitest' -describe(esbuildPluginEvmts.name, () => { +describe('esbuildPluginEvmts', () => { it('should properly export the unplugin bundler from @evmts/bundler', async () => { const plugin = esbuildPluginEvmts() diff --git a/bundlers/rollup/package.json b/bundlers/rollup/package.json index 1549cf99d0..72a3fd21b8 100644 --- a/bundlers/rollup/package.json +++ b/bundlers/rollup/package.json @@ -40,7 +40,7 @@ "lint:check": "rome check . --verbose" }, "dependencies": { - "@evmts/bundler": "workspace:^" + "@evmts/unplugin": "workspace:^" }, "devDependencies": { "@evmts/tsconfig": "workspace:^", diff --git a/bundlers/rollup/src/index.js b/bundlers/rollup/src/index.js index c7f7101098..f181136c8e 100644 --- a/bundlers/rollup/src/index.js +++ b/bundlers/rollup/src/index.js @@ -1 +1,3 @@ -export { rollupPluginEvmts } from '@evmts/bundler' +import { createUnplugin, evmtsUnplugin } from '@evmts/unplugin' + +export const { rollup: rollupPluginEvmts } = createUnplugin(evmtsUnplugin) diff --git a/bundlers/rspack/package.json b/bundlers/rspack/package.json index 449385c2c4..0e130a6749 100644 --- a/bundlers/rspack/package.json +++ b/bundlers/rspack/package.json @@ -40,7 +40,7 @@ "test:ui": "vitest --ui" }, "dependencies": { - "@evmts/bundler": "workspace:^" + "@evmts/unplugin": "workspace:^" }, "devDependencies": { "@evmts/tsconfig": "workspace:^", diff --git a/bundlers/rspack/src/index.js b/bundlers/rspack/src/index.js index 15b66bffb8..4265553709 100644 --- a/bundlers/rspack/src/index.js +++ b/bundlers/rspack/src/index.js @@ -1 +1,3 @@ -export { rspackPluginEvmts } from '@evmts/bundler' +import { createUnplugin, evmtsUnplugin } from '@evmts/unplugin' + +export const { rspack: rspackPluginEvmts } = createUnplugin(evmtsUnplugin) diff --git a/bundlers/unplugin/.gitignore b/bundlers/unplugin/.gitignore new file mode 100644 index 0000000000..f788c233f1 --- /dev/null +++ b/bundlers/unplugin/.gitignore @@ -0,0 +1,50 @@ +.env + +cache +forge-artifacts +broadcast +types + +# compiled output +dist +packages/*/dist +tmp +/out-tsc +**/tsconfig.tsbuildinfo + +# dependencies +node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +**/lcov.info + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +# My personal files +.zshrc diff --git a/bundlers/unplugin/LICENSE b/bundlers/unplugin/LICENSE new file mode 100644 index 0000000000..b5a4fa7a69 --- /dev/null +++ b/bundlers/unplugin/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2022 + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bundlers/unplugin/README.md b/bundlers/unplugin/README.md new file mode 100644 index 0000000000..0dfb0e6264 --- /dev/null +++ b/bundlers/unplugin/README.md @@ -0,0 +1,37 @@ +

+ + + + wagmi logo + + +

+ +

+ Execute solidity scripts in browser +

+ +[![CI](https://github.com/evmts/evmts-monorepo/actions/workflows/e2e.yml/badge.svg)](https://github.com/evmts/evmts-monorepo/actions/workflows/e2e.yml) +[![CI](https://github.com/evmts/evmts-monorepo/actions/workflows/unit.yml/badge.svg)](https://github.com/evmts/evmts-monorepo/actions/workflows/unit.yml) + + + + + + + +# @evmts/unplugin + +[unplugin](https://github.com/unjs/unplugin) plugin for EVMts. Unplugin allows us to build a rollup plugin once and reuse it for many different bundlers. + +Used in following packages + +- [@evmts/esbuild](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/esbuild) +- [@evmts/rollup](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/rollup) +- [@evmts/rspack](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/rspack) +- [@evmts/vite](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/vite) +- [@evmts/webpack](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/webpack) + +## License 📄 + + diff --git a/bundlers/unplugin/package.json b/bundlers/unplugin/package.json new file mode 100644 index 0000000000..5d16877df8 --- /dev/null +++ b/bundlers/unplugin/package.json @@ -0,0 +1,86 @@ +{ + "name": "@evmts/unplugin", + "version": "0.11.2", + "private": false, + "description": "Internal unplugin for Evmts", + "keywords": [ + "solidity", + "forge", + "foundry", + "sol", + "typescript", + "web3", + "blockchain" + ], + "repository": { + "type": "git", + "url": "https://github.com/evmts/evmts-monorepo.git", + "directory": "bundlers/unplugin" + }, + "license": "MIT", + "contributors": ["Will Cory "], + "type": "module", + "main": "dist/index.cjs", + "module": "src/index.js", + "types": "types/src/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "import": "./src/index.js", + "require": "./dist/index.cjs", + "types": "./types/src/index.d.ts", + "default": "./dist/index.cjs" + } + }, + "files": ["dist", "types", "src"], + "scripts": { + "build": "nx run-many --targets=build:dist,build:types --projects=@evmts/unplugin ", + "build:dist": "bun run tsup", + "build:types": "bun run tsc --emitDeclarationOnly", + "clean": "rm -rf node_modules && rm -rf artifacts && rm -rf dist && rm -rf cache", + "format": "rome format . --write", + "format:check": "rome format .", + "generate:docs": "bun run typedoc", + "lint": "rome check . --apply-unsafe", + "lint:check": "rome check . --verbose", + "test": "vitest --coverage", + "test:coverage": "vitest run --coverage", + "test:run": "vitest run", + "test:ui": "vitest --ui" + }, + "dependencies": { + "@evmts/config": "workspace:^", + "@evmts/runtime": "workspace:^", + "@evmts/solc": "workspace:^", + "@evmts/tsconfig": "workspace:^", + "@types/node": "^20.7.2", + "@types/resolve": "^1.20.3", + "effect": "2.0.0-next.50", + "glob": "^10.3.10", + "resolve": "^1.22.6", + "solidity-ast": "^0.4.52", + "unplugin": "^1.5.0" + }, + "devDependencies": { + "@vitest/coverage-v8": "^0.34.6", + "@vitest/ui": "^0.34.6", + "@evmts/core": "workspace:^", + "@evmts/bundler": "workspace:^", + "abitype": "^0.9.8", + "rome": "^12.1.3", + "solc": "0.8.21", + "tsup": "^7.2.0", + "typedoc": "^0.25.2", + "typedoc-plugin-markdown": "^3.16.0", + "typescript": "^5.2.2", + "vitest": "^0.34.6", + "wagmi": "^1.4.2", + "zod": "^3.22.2" + }, + "peerDependencies": { + "solc": ">0.8.10" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/bundlers/unplugin/rome.json b/bundlers/unplugin/rome.json new file mode 100644 index 0000000000..a63fed5a70 --- /dev/null +++ b/bundlers/unplugin/rome.json @@ -0,0 +1,35 @@ +{ + "organizeImports": { + "enabled": true + }, + "files": { + "ignore": ["coverage", "node_modules", "dist", "artifacts", "types"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "tab", + "indentSize": 2, + "lineWidth": 80 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "performance": { + "noDelete": "off" + }, + "suspicious": { + "noArrayIndexKey": "off", + "noExplicitAny": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "trailingComma": "all", + "semicolons": "asNeeded" + } + } +} diff --git a/bundlers/bundler/src/unplugin.js b/bundlers/unplugin/src/evmtsUnplugin.js similarity index 78% rename from bundlers/bundler/src/unplugin.js rename to bundlers/unplugin/src/evmtsUnplugin.js index 6742a477f3..ab3cb044aa 100644 --- a/bundlers/bundler/src/unplugin.js +++ b/bundlers/unplugin/src/evmtsUnplugin.js @@ -1,11 +1,9 @@ -import { bundler } from './bundler.js' -import { createCache } from './createCache.js' +import { bundler, createCache } from '@evmts/bundler' import { loadConfig } from '@evmts/config' import { runSync } from 'effect/Effect' import { existsSync, readFileSync } from 'fs' import { readFile } from 'fs/promises' import { createRequire } from 'module' -import { createUnplugin } from 'unplugin' import { z } from 'zod' const compilerOptionValidator = z @@ -24,7 +22,7 @@ const bundlers = { /** * @type {import("unplugin").UnpluginFactory<{compiler?: CompilerOption } | undefined, false>} */ -export const unpluginFn = (options = {}) => { +export const evmtsUnplugin = (options = {}) => { /** * @type {import("@evmts/config").ResolvedCompilerConfig} */ @@ -53,7 +51,7 @@ export const unpluginFn = (options = {}) => { let moduleResolver /** - * @type {import("./types.js").FileAccessObject} + * @type {import("@evmts/bundler").FileAccessObject} */ const fao = { existsSync, @@ -109,19 +107,3 @@ export const unpluginFn = (options = {}) => { ...{ version: '0.11.2' }, } } - -const evmtsUnplugin = createUnplugin(unpluginFn) - -// Hacks to make types portable -// we should manually type these at some point - -export const vitePluginEvmts = /** @type {typeof evmtsUnplugin.rollup} */ ( - /** @type {any} */ (evmtsUnplugin.vite) -) -export const rollupPluginEvmts = evmtsUnplugin.rollup -export const esbuildPluginEvmts = evmtsUnplugin.esbuild -export const webpackPluginEvmts = /** @type {typeof evmtsUnplugin.rspack} */ ( - evmtsUnplugin.webpack -) - -export const rspackPluginEvmts = evmtsUnplugin.rspack diff --git a/bundlers/bundler/src/unplugin.spec.ts b/bundlers/unplugin/src/evmtsUnplugin.spec.ts similarity index 90% rename from bundlers/bundler/src/unplugin.spec.ts rename to bundlers/unplugin/src/evmtsUnplugin.spec.ts index 01cb8e8dc1..57c29abbd3 100644 --- a/bundlers/bundler/src/unplugin.spec.ts +++ b/bundlers/unplugin/src/evmtsUnplugin.spec.ts @@ -1,6 +1,6 @@ import packageJson from '../package.json' -import { bundler } from './bundler.js' -import { unpluginFn } from './unplugin.js' +import { evmtsUnplugin } from './evmtsUnplugin.js' +import { bundler } from '@evmts/bundler' import { loadConfig } from '@evmts/config' import { succeed } from 'effect/Effect' import { existsSync } from 'fs' @@ -25,7 +25,8 @@ vi.mock('@evmts/config', async () => ({ ...((await vi.importActual('@evmts/config')) as {}), loadConfig: vi.fn(), })) -vi.mock('./bundler', () => ({ +vi.mock('@evmts/bundler', async () => ({ + ...((await vi.importActual('@evmts/bundler')) as {}), bundler: vi.fn(), })) @@ -73,7 +74,7 @@ describe('unpluginFn', () => { }) it('should create the plugin correctly', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) expect(plugin.name).toEqual('@evmts/rollup-plugin') expect((plugin as any).version).toEqual(packageJson.version) @@ -129,21 +130,22 @@ describe('unpluginFn', () => { }) it('should throw an error for invalid compiler option', () => { - const errorFn = () => unpluginFn({ compiler: 'invalid' as any }, {} as any) + const errorFn = () => + evmtsUnplugin({ compiler: 'invalid' as any }, {} as any) expect(errorFn).toThrowErrorMatchingInlineSnapshot( "\"Invalid compiler option: invalid. Valid options are 'solc' and 'foundry'\"", ) }) it('should throw an error if foundry compiler is set', () => { - const errorFn = () => unpluginFn({ compiler: 'foundry' }, {} as any) + const errorFn = () => evmtsUnplugin({ compiler: 'foundry' }, {} as any) expect(errorFn).toThrowErrorMatchingInlineSnapshot( '"We have abandoned the foundry option despite supporting it in the past. Please use solc instead. Foundry will be added back as a compiler at a later time."', ) }) it('should watch the tsconfig.json file', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) // call buildstart with mockPlugin as this await plugin.buildStart?.call(mockPlugin) @@ -153,7 +155,7 @@ describe('unpluginFn', () => { }) it('should add module id to watch files if it is a .sol file', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) const mockedModuleId = 'mockedModuleId' const mockedModule = { code: 'mockedCode', @@ -173,7 +175,7 @@ describe('unpluginFn', () => { }) it('should not add module id to watch files if it is a .sol file in node modules', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) const mockedModuleId = 'mockedModuleId' const mockedModule = { code: 'mockedCode', @@ -193,7 +195,7 @@ describe('unpluginFn', () => { }) it('should handle @evmts/core/runtime id correctly', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) // Insert logic here based on what the behavior should be when id.startsWith('@evmts/core/runtime') is true // For now, let's just call it and assert that it doesn't throw an error @@ -202,7 +204,7 @@ describe('unpluginFn', () => { }) it('should return undefined if .sol file has corresponding .ts file', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) mockExistsSync.mockReturnValueOnce(true) const result = await plugin.load?.call(mockPlugin, 'test.sol') @@ -212,7 +214,7 @@ describe('unpluginFn', () => { }) it('should return undefined if .sol file has corresponding .d.ts file', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) mockExistsSync.mockReturnValueOnce(false).mockReturnValueOnce(true) const result = await plugin.load?.call(mockPlugin, 'test.sol') @@ -222,7 +224,7 @@ describe('unpluginFn', () => { }) describe('unpluginFn.resolveId', () => { it('should resolve to local @evmts/core when id starts with @evmts/core', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) const mockCreateRequre = createRequire as MockedFunction< typeof createRequire > @@ -252,7 +254,7 @@ describe('unpluginFn', () => { }) it('should return null when id does not start with @evmts/core', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) const result = await plugin.resolveId?.call( mockPlugin, @@ -265,7 +267,7 @@ describe('unpluginFn', () => { }) it('should return null when id starts with @evmts/core but importer is in node_modules or the same workspace', async () => { - const plugin = unpluginFn({}, {} as any) + const plugin = evmtsUnplugin({}, {} as any) const resultInNodeModules = await plugin.resolveId?.call( mockPlugin, diff --git a/bundlers/unplugin/src/index.js b/bundlers/unplugin/src/index.js new file mode 100644 index 0000000000..af5ea0c187 --- /dev/null +++ b/bundlers/unplugin/src/index.js @@ -0,0 +1,5 @@ +/** + * @typedef {import("./evmtsUnplugin.js").CompilerOption} CompilerOption + */ +export { evmtsUnplugin } from './evmtsUnplugin.js' +export { createUnplugin } from 'unplugin' diff --git a/bundlers/unplugin/tsconfig.json b/bundlers/unplugin/tsconfig.json new file mode 100644 index 0000000000..e4a7b177b9 --- /dev/null +++ b/bundlers/unplugin/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@evmts/tsconfig/base.json", + "compilerOptions": { + "composite": true, + "outDir": "types", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true + }, + "include": [ + "src", + "src/**/*.json", + "package.json" + ] +} \ No newline at end of file diff --git a/bundlers/unplugin/tsup.config.ts b/bundlers/unplugin/tsup.config.ts new file mode 100644 index 0000000000..197bac356c --- /dev/null +++ b/bundlers/unplugin/tsup.config.ts @@ -0,0 +1,13 @@ +import packageJson from './package.json' +import { defineConfig } from 'tsup' + +export default defineConfig({ + name: packageJson.name, + entry: ['src/index.js'], + outDir: 'dist', + format: ['cjs'], + splitting: false, + sourcemap: true, + clean: true, + skipNodeModulesBundle: true, +}) diff --git a/bundlers/unplugin/typedoc.json b/bundlers/unplugin/typedoc.json new file mode 100644 index 0000000000..9a4629d28d --- /dev/null +++ b/bundlers/unplugin/typedoc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "out": "../../docs/reference/unplugin", + "entryPoints": ["./src/index.js"], + "publicPath": "/reference/unplugin/", + "plugin": ["typedoc-plugin-markdown"], + "gitRevision": "main" +} diff --git a/bundlers/unplugin/vitest.config.ts b/bundlers/unplugin/vitest.config.ts new file mode 100644 index 0000000000..2693e52525 --- /dev/null +++ b/bundlers/unplugin/vitest.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'vitest/config' + +// https://vitest.dev/config/ - for docs +export default defineConfig({ + test: { + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + environment: 'node', + coverage: { + reporter: ['text', 'json-summary', 'json'], + lines: 100, + functions: 100, + branches: 100, + statements: 100, + thresholdAutoUpdate: true, + }, + }, +}) diff --git a/bundlers/vite/package.json b/bundlers/vite/package.json index 57c3f5d009..8cda31763c 100644 --- a/bundlers/vite/package.json +++ b/bundlers/vite/package.json @@ -40,7 +40,7 @@ "lint:check": "rome check . --verbose" }, "dependencies": { - "@evmts/bundler": "workspace:^" + "@evmts/unplugin": "workspace:^" }, "devDependencies": { "@evmts/tsconfig": "workspace:^", diff --git a/bundlers/vite/src/index.js b/bundlers/vite/src/index.js index 38b397f7bb..94ee0b4e90 100644 --- a/bundlers/vite/src/index.js +++ b/bundlers/vite/src/index.js @@ -1 +1,3 @@ -export { vitePluginEvmts } from '@evmts/bundler' +import { createUnplugin, evmtsUnplugin } from '@evmts/unplugin' + +export const { vite: vitePluginEvmts } = createUnplugin(evmtsUnplugin) diff --git a/bundlers/webpack/package.json b/bundlers/webpack/package.json index 0c6902f0ee..9777728fe6 100644 --- a/bundlers/webpack/package.json +++ b/bundlers/webpack/package.json @@ -40,7 +40,7 @@ "test:ui": "vitest --ui" }, "dependencies": { - "@evmts/bundler": "workspace:^" + "@evmts/unplugin": "workspace:^" }, "devDependencies": { "@evmts/tsconfig": "workspace:^", diff --git a/bundlers/webpack/src/index.js b/bundlers/webpack/src/index.js index 4d670ce5f9..cb1ab6326c 100644 --- a/bundlers/webpack/src/index.js +++ b/bundlers/webpack/src/index.js @@ -1 +1,3 @@ -export { webpackPluginEvmts } from '@evmts/bundler' +import { createUnplugin, evmtsUnplugin } from '@evmts/unplugin' + +export const { webpack: webpackPluginEvmts } = createUnplugin(evmtsUnplugin) diff --git a/config/vitest.config.ts b/config/vitest.config.ts index d177173681..78b9585484 100644 --- a/config/vitest.config.ts +++ b/config/vitest.config.ts @@ -7,8 +7,8 @@ export default defineConfig({ environment: 'node', coverage: { reporter: ['text', 'json-summary', 'json'], - lines: 98.54, - statements: 98.54, + lines: 98.55, + statements: 98.55, functions: 100, branches: 98.83, thresholdAutoUpdate: true, diff --git a/docs/reference/bundler/modules.md b/docs/reference/bundler/modules.md index 87bbe6740b..cadf5697a9 100644 --- a/docs/reference/bundler/modules.md +++ b/docs/reference/bundler/modules.md @@ -8,7 +8,3 @@ - [bundler](/reference/bundler/modules/bundler.md) - [createCache](/reference/bundler/modules/createCache.md) -- [runtime](/reference/bundler/modules/runtime.md) -- [solc](/reference/bundler/modules/solc.md) -- [unplugin](/reference/bundler/modules/unplugin.md) -- [utils](/reference/bundler/modules/utils.md) diff --git a/docs/reference/bundler/modules/bundler.md b/docs/reference/bundler/modules/bundler.md index e3c42b6498..89c0d20de1 100644 --- a/docs/reference/bundler/modules/bundler.md +++ b/docs/reference/bundler/modules/bundler.md @@ -44,4 +44,4 @@ #### Defined in -[bundlers/bundler/src/types.ts:32](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/types.ts#L32) +[types.ts:32](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/types.ts#L32) diff --git a/docs/reference/bundler/modules/createCache.md b/docs/reference/bundler/modules/createCache.md index 70dc8fd01c..f47750d35d 100644 --- a/docs/reference/bundler/modules/createCache.md +++ b/docs/reference/bundler/modules/createCache.md @@ -28,7 +28,7 @@ #### Defined in -[bundlers/bundler/src/createCache.d.ts:8](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/createCache.d.ts#L8) +[createCache.d.ts:8](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/createCache.d.ts#L8) ## Functions @@ -48,4 +48,4 @@ #### Defined in -[bundlers/bundler/src/createCache.d.ts:17](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/createCache.d.ts#L17) +[createCache.d.ts:17](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/createCache.d.ts#L17) diff --git a/docs/reference/bundler/modules/runtime.md b/docs/reference/bundler/modules/runtime.md deleted file mode 100644 index 410b77c57b..0000000000 --- a/docs/reference/bundler/modules/runtime.md +++ /dev/null @@ -1,113 +0,0 @@ -[@evmts/bundler](/reference/bundler/README.md) / [Modules](/reference/bundler/modules.md) / runtime - -# Module: runtime - -## Table of contents - -### Type Aliases - -- [ModuleType](/reference/bundler/modules/runtime.md#moduletype) - -### Functions - -- [generateDtsBody](/reference/bundler/modules/runtime.md#generatedtsbody) -- [generateEvmtsBody](/reference/bundler/modules/runtime.md#generateevmtsbody) -- [generateRuntime](/reference/bundler/modules/runtime.md#generateruntime) -- [generateRuntimeSync](/reference/bundler/modules/runtime.md#generateruntimesync) - -## Type Aliases - -### ModuleType - -Ƭ **ModuleType**<\>: ``"cjs"`` \| ``"mjs"`` \| ``"ts"`` \| ``"dts"`` - -#### Defined in - -[bundlers/bundler/src/runtime/generateEvmtsBody.js:5](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/runtime/generateEvmtsBody.js#L5) - -## Functions - -### generateDtsBody - -▸ **generateDtsBody**(`artifacts`): `string` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `artifacts` | `Artifacts` | - -#### Returns - -`string` - -#### Defined in - -[bundlers/bundler/src/runtime/generateEvmtsBodyDts.js:7](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/runtime/generateEvmtsBodyDts.js#L7) - -___ - -### generateEvmtsBody - -▸ **generateEvmtsBody**(`artifacts`, `moduleType`): `string` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `artifacts` | `Artifacts` | -| `moduleType` | [`ModuleType`](/reference/bundler/modules/runtime.md#moduletype) | - -#### Returns - -`string` - -#### Defined in - -[bundlers/bundler/src/runtime/generateEvmtsBody.js:13](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/runtime/generateEvmtsBody.js#L13) - -___ - -### generateRuntime - -▸ **generateRuntime**(`artifacts`, `moduleType`, `logger`): `Promise`<`string`\> - -Generates the runtime code for the given artifacts. - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `artifacts` | `Artifacts` | -| `moduleType` | ``"cjs"`` \| ``"mjs"`` \| ``"ts"`` | -| `logger` | `Logger` | - -#### Returns - -`Promise`<`string`\> - -#### Defined in - -[bundlers/bundler/src/runtime/generateRuntime.js:10](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/runtime/generateRuntime.js#L10) - -___ - -### generateRuntimeSync - -▸ **generateRuntimeSync**(`artifacts`, `moduleType`, `logger`): `string` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `artifacts` | `Artifacts` | -| `moduleType` | ``"cjs"`` \| ``"mjs"`` \| ``"ts"`` \| ``"dts"`` | -| `logger` | `Logger` | - -#### Returns - -`string` - -#### Defined in - -[bundlers/bundler/src/runtime/generateRuntimeSync.js:9](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/runtime/generateRuntimeSync.js#L9) diff --git a/docs/reference/bundler/modules/solc.md b/docs/reference/bundler/modules/solc.md deleted file mode 100644 index 16f93dcac7..0000000000 --- a/docs/reference/bundler/modules/solc.md +++ /dev/null @@ -1,72 +0,0 @@ -[@evmts/bundler](/reference/bundler/README.md) / [Modules](/reference/bundler/modules.md) / solc - -# Module: solc - -## Table of contents - -### Functions - -- [resolveArtifacts](/reference/bundler/modules/solc.md#resolveartifacts) -- [resolveArtifactsSync](/reference/bundler/modules/solc.md#resolveartifactssync) - -## Functions - -### resolveArtifacts - -▸ **resolveArtifacts**(`solFile`, `basedir`, `logger`, `config`, `includeAst`, `fao`, `cache?`): `Promise`<{ `artifacts`: `Artifacts` ; `asts`: `undefined` \| `Record`<`string`, `Node`\> ; `modules`: `Record`<``"string"``, `ModuleInfo`\> ; `solcInput`: `SolcInputDescription` ; `solcOutput`: `SolcOutput` }\> - -Currently unimplemented just uses resolveArtifactsSync - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `solFile` | `string` | -| `basedir` | `string` | -| `logger` | `Logger` | -| `config` | `ResolvedCompilerConfig` | -| `includeAst` | `boolean` | -| `fao` | `FileAccessObject` | -| `cache?` | [`Cache`](/reference/bundler/modules/createCache.md#cache) | - -#### Returns - -`Promise`<{ `artifacts`: `Artifacts` ; `asts`: `undefined` \| `Record`<`string`, `Node`\> ; `modules`: `Record`<``"string"``, `ModuleInfo`\> ; `solcInput`: `SolcInputDescription` ; `solcOutput`: `SolcOutput` }\> - -#### Defined in - -[bundlers/bundler/src/solc/resolveArtifacts.d.ts:16](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/solc/resolveArtifacts.d.ts#L16) - -___ - -### resolveArtifactsSync - -▸ **resolveArtifactsSync**(`solFile`, `basedir`, `logger`, `config`, `includeAst`, `fao`, `cache?`): `Object` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `solFile` | `string` | -| `basedir` | `string` | -| `logger` | `Logger` | -| `config` | `ResolvedCompilerConfig` | -| `includeAst` | `boolean` | -| `fao` | `FileAccessObject` | -| `cache?` | [`Cache`](/reference/bundler/modules/createCache.md#cache) | - -#### Returns - -`Object` - -| Name | Type | -| :------ | :------ | -| `artifacts` | `Artifacts` | -| `asts` | `undefined` \| `Record`<`string`, `Node`\> | -| `modules` | `Record`<``"string"``, `ModuleInfo`\> | -| `solcInput` | `SolcInputDescription` | -| `solcOutput` | `SolcOutput` | - -#### Defined in - -[bundlers/bundler/src/solc/resolveArtifactsSync.d.ts:17](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/solc/resolveArtifactsSync.d.ts#L17) diff --git a/docs/reference/bundler/modules/unplugin.md b/docs/reference/bundler/modules/unplugin.md deleted file mode 100644 index ae47f0bf79..0000000000 --- a/docs/reference/bundler/modules/unplugin.md +++ /dev/null @@ -1,154 +0,0 @@ -[@evmts/bundler](/reference/bundler/README.md) / [Modules](/reference/bundler/modules.md) / unplugin - -# Module: unplugin - -## Table of contents - -### Type Aliases - -- [CompilerOption](/reference/bundler/modules/unplugin.md#compileroption) - -### Functions - -- [esbuildPluginEvmts](/reference/bundler/modules/unplugin.md#esbuildpluginevmts) -- [rollupPluginEvmts](/reference/bundler/modules/unplugin.md#rolluppluginevmts) -- [rspackPluginEvmts](/reference/bundler/modules/unplugin.md#rspackpluginevmts) -- [unpluginFn](/reference/bundler/modules/unplugin.md#unpluginfn) -- [vitePluginEvmts](/reference/bundler/modules/unplugin.md#vitepluginevmts) -- [webpackPluginEvmts](/reference/bundler/modules/unplugin.md#webpackpluginevmts) - -## Type Aliases - -### CompilerOption - -Ƭ **CompilerOption**<\>: `infer` - -#### Defined in - -[bundlers/bundler/src/unplugin.js:17](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/unplugin.js#L17) - -## Functions - -### esbuildPluginEvmts - -▸ **esbuildPluginEvmts**(`options?`): `Plugin` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options?` | `Object` | -| `options.compiler?` | ``"solc"`` \| ``"foundry"`` | - -#### Returns - -`Plugin` - -#### Defined in - -node_modules/unplugin/dist/index.d.mts:83 - -___ - -### rollupPluginEvmts - -▸ **rollupPluginEvmts**(`options?`): `Plugin`<`any`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options?` | `Object` | -| `options.compiler?` | ``"solc"`` \| ``"foundry"`` | - -#### Returns - -`Plugin`<`any`\> - -#### Defined in - -node_modules/unplugin/dist/index.d.mts:83 - -___ - -### rspackPluginEvmts - -▸ **rspackPluginEvmts**(`options?`): `RspackPluginInstance` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options?` | `Object` | -| `options.compiler?` | ``"solc"`` \| ``"foundry"`` | - -#### Returns - -`RspackPluginInstance` - -#### Defined in - -node_modules/unplugin/dist/index.d.mts:83 - -___ - -### unpluginFn - -▸ **unpluginFn**(`options`, `meta`): `UnpluginOptions` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options` | `undefined` \| { `compiler?`: ``"solc"`` \| ``"foundry"`` } | -| `meta` | `UnpluginContextMeta` | - -#### Returns - -`UnpluginOptions` - -#### Defined in - -node_modules/unplugin/dist/index.d.mts:82 - -___ - -### vitePluginEvmts - -▸ **vitePluginEvmts**(`options?`): `Plugin`<`any`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options?` | `Object` | -| `options.compiler?` | ``"solc"`` \| ``"foundry"`` | - -#### Returns - -`Plugin`<`any`\> - -#### Defined in - -node_modules/unplugin/dist/index.d.mts:83 - -___ - -### webpackPluginEvmts - -▸ **webpackPluginEvmts**(`options?`): `RspackPluginInstance` - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `options?` | `Object` | -| `options.compiler?` | ``"solc"`` \| ``"foundry"`` | - -#### Returns - -`RspackPluginInstance` - -#### Defined in - -node_modules/unplugin/dist/index.d.mts:83 diff --git a/docs/reference/bundler/modules/utils.md b/docs/reference/bundler/modules/utils.md deleted file mode 100644 index 57065afe3a..0000000000 --- a/docs/reference/bundler/modules/utils.md +++ /dev/null @@ -1,154 +0,0 @@ -[@evmts/bundler](/reference/bundler/README.md) / [Modules](/reference/bundler/modules.md) / utils - -# Module: utils - -## Table of contents - -### Functions - -- [formatPath](/reference/bundler/modules/utils.md#formatpath) -- [invariant](/reference/bundler/modules/utils.md#invariant) -- [isImportLocal](/reference/bundler/modules/utils.md#isimportlocal) -- [isRelativeSolidity](/reference/bundler/modules/utils.md#isrelativesolidity) -- [isSolidity](/reference/bundler/modules/utils.md#issolidity) -- [resolveEffect](/reference/bundler/modules/utils.md#resolveeffect) - -## Functions - -### formatPath - -▸ **formatPath**(`contractPath`): `string` - -Formats a path to be used in the contract loader - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `contractPath` | `string` | The path to the contract | - -#### Returns - -`string` - -- The formatted path - -#### Defined in - -[bundlers/bundler/src/utils/formatPath.js:6](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/utils/formatPath.js#L6) - -___ - -### invariant - -▸ **invariant**(`condition`, `message`): asserts condition - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `condition` | `any` | -| `message` | `string` | - -#### Returns - -asserts condition - -#### Defined in - -[bundlers/bundler/src/utils/invariant.d.ts:1](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/utils/invariant.d.ts#L1) - -___ - -### isImportLocal - -▸ **isImportLocal**(`importPath`): `boolean` - -Check if import path is local - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `importPath` | `string` | - -#### Returns - -`boolean` - -#### Defined in - -[bundlers/bundler/src/utils/isImportLocal.js:6](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/utils/isImportLocal.js#L6) - -___ - -### isRelativeSolidity - -▸ **isRelativeSolidity**(`fileName`): `boolean` - -Util to determine if a file path is a solidity file referenced via a relative import - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `fileName` | `string` | The file path to check | - -#### Returns - -`boolean` - -True if the file path is a solidity file referenced via a relative import - -#### Defined in - -[bundlers/bundler/src/utils/isRelativeSolidity.js:8](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/utils/isRelativeSolidity.js#L8) - -___ - -### isSolidity - -▸ **isSolidity**(`fileName`): `boolean` - -Util to determine if a file path is a solidity file - -#### Parameters - -| Name | Type | Description | -| :------ | :------ | :------ | -| `fileName` | `string` | The file name to check | - -#### Returns - -`boolean` - -- Whether or not the file is a solidity file - -#### Defined in - -[bundlers/bundler/src/utils/isSolidity.js:6](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/utils/isSolidity.js#L6) - -___ - -### resolveEffect - -▸ **resolveEffect**(`filePath`, `basedir`, `fao`, `logger`): `Effect`<`never`, `Error`, `string`\> - -import resolve from 'resolve wrapped in an effect - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `filePath` | `string` | -| `basedir` | `string` | -| `fao` | `FileAccessObject` | -| `logger` | `Logger` | - -#### Returns - -`Effect`<`never`, `Error`, `string`\> - -#### Defined in - -[bundlers/bundler/src/utils/resolvePromise.js:12](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/bundler/src/utils/resolvePromise.js#L12) diff --git a/docs/reference/esbuild-plugin/modules.md b/docs/reference/esbuild-plugin/modules.md index d12319a21b..b01bd7e01e 100644 --- a/docs/reference/esbuild-plugin/modules.md +++ b/docs/reference/esbuild-plugin/modules.md @@ -27,4 +27,4 @@ #### Defined in -bundler/types/src/unplugin.d.ts:13 +node_modules/unplugin/dist/index.d.mts:83 diff --git a/docs/reference/rollup-plugin/modules.md b/docs/reference/rollup-plugin/modules.md index 67000e2239..1341ce8551 100644 --- a/docs/reference/rollup-plugin/modules.md +++ b/docs/reference/rollup-plugin/modules.md @@ -27,4 +27,4 @@ #### Defined in -bundler/types/src/unplugin.d.ts:10 +node_modules/unplugin/dist/index.d.mts:83 diff --git a/docs/reference/rspack-plugin/modules.md b/docs/reference/rspack-plugin/modules.md index 49c7e10247..ee202b6314 100644 --- a/docs/reference/rspack-plugin/modules.md +++ b/docs/reference/rspack-plugin/modules.md @@ -27,4 +27,4 @@ #### Defined in -bundler/types/src/unplugin.d.ts:19 +node_modules/unplugin/dist/index.d.mts:83 diff --git a/docs/reference/unplugin/.nojekyll b/docs/reference/unplugin/.nojekyll new file mode 100644 index 0000000000..e2ac6616ad --- /dev/null +++ b/docs/reference/unplugin/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/reference/unplugin/README.md b/docs/reference/unplugin/README.md new file mode 100644 index 0000000000..52b381866f --- /dev/null +++ b/docs/reference/unplugin/README.md @@ -0,0 +1,39 @@ +@evmts/unplugin / [Exports](/reference/unplugin/modules.md) + +

+ + + + wagmi logo + + +

+ +

+ Execute solidity scripts in browser +

+ +[![CI](https://github.com/evmts/evmts-monorepo/actions/workflows/e2e.yml/badge.svg)](https://github.com/evmts/evmts-monorepo/actions/workflows/e2e.yml) +[![CI](https://github.com/evmts/evmts-monorepo/actions/workflows/unit.yml/badge.svg)](https://github.com/evmts/evmts-monorepo/actions/workflows/unit.yml) + + + + + + + +# @evmts/unplugin + +[unplugin](https://github.com/unjs/unplugin) plugin for EVMts. Unplugin allows us to build a rollup plugin once and reuse it for many different bundlers. + +Used in following packages + +- [@evmts/esbuild](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/esbuild) +- [@evmts/rollup](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/rollup) +- [@evmts/rspack](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/rspack) +- [@evmts/vite](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/vite) +- [@evmts/webpack](https://github.com/evmts/evmts-monorepo/tree/main/bundlers/webpack) + +## License 📄 + + diff --git a/docs/reference/unplugin/modules.md b/docs/reference/unplugin/modules.md new file mode 100644 index 0000000000..877422c778 --- /dev/null +++ b/docs/reference/unplugin/modules.md @@ -0,0 +1,72 @@ +[@evmts/unplugin](/reference/unplugin/README.md) / Exports + +# @evmts/unplugin + +## Table of contents + +### Type Aliases + +- [CompilerOption](/reference/unplugin/modules.md#compileroption) + +### Functions + +- [createUnplugin](/reference/unplugin/modules.md#createunplugin) +- [evmtsUnplugin](/reference/unplugin/modules.md#evmtsunplugin) + +## Type Aliases + +### CompilerOption + +Ƭ **CompilerOption**<\>: `infer` + +#### Defined in + +[bundlers/unplugin/src/evmtsUnplugin.js:15](https://github.com/evmts/evmts-monorepo/blob/main/bundlers/unplugin/src/evmtsUnplugin.js#L15) + +## Functions + +### createUnplugin + +▸ **createUnplugin**<`UserOptions`, `Nested`\>(`factory`): `UnpluginInstance`<`UserOptions`, `Nested`\> + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `UserOptions` | `UserOptions` | +| `Nested` | extends `boolean` = `boolean` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `factory` | `UnpluginFactory`<`UserOptions`, `Nested`\> | + +#### Returns + +`UnpluginInstance`<`UserOptions`, `Nested`\> + +#### Defined in + +node_modules/unplugin/dist/index.d.mts:120 + +___ + +### evmtsUnplugin + +▸ **evmtsUnplugin**(`options`, `meta`): `UnpluginOptions` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `options` | `undefined` \| { `compiler?`: ``"solc"`` \| ``"foundry"`` } | +| `meta` | `UnpluginContextMeta` | + +#### Returns + +`UnpluginOptions` + +#### Defined in + +node_modules/unplugin/dist/index.d.mts:82 diff --git a/docs/reference/vite-plugin/modules.md b/docs/reference/vite-plugin/modules.md index d05f043dfb..be5236cda3 100644 --- a/docs/reference/vite-plugin/modules.md +++ b/docs/reference/vite-plugin/modules.md @@ -12,7 +12,7 @@ ### vitePluginEvmts -▸ **vitePluginEvmts**(`options?`): `Plugin`<`any`\> +▸ **vitePluginEvmts**(`options?`): `Plugin_2` #### Parameters @@ -23,8 +23,8 @@ #### Returns -`Plugin`<`any`\> +`Plugin_2` #### Defined in -bundler/types/src/unplugin.d.ts:7 +node_modules/unplugin/dist/index.d.mts:83 diff --git a/docs/reference/webpack-plugin/modules.md b/docs/reference/webpack-plugin/modules.md index 5520cd4430..296020d0d0 100644 --- a/docs/reference/webpack-plugin/modules.md +++ b/docs/reference/webpack-plugin/modules.md @@ -12,7 +12,7 @@ ### webpackPluginEvmts -▸ **webpackPluginEvmts**(`options?`): `RspackPluginInstance` +▸ **webpackPluginEvmts**(`options?`): `WebpackPluginInstance` #### Parameters @@ -23,8 +23,8 @@ #### Returns -`RspackPluginInstance` +`WebpackPluginInstance` #### Defined in -bundler/types/src/unplugin.d.ts:16 +node_modules/unplugin/dist/index.d.mts:83 diff --git a/examples/esbuild/src/ExampleContract.sol b/examples/esbuild/src/ExampleContract.sol index 1c89c2d493..25a0042fcd 100644 --- a/examples/esbuild/src/ExampleContract.sol +++ b/examples/esbuild/src/ExampleContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity >0.8.20; +pragma solidity >0.8.10; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; diff --git a/nx.json b/nx.json index c4712939f1..384e9e36d1 100644 --- a/nx.json +++ b/nx.json @@ -57,8 +57,15 @@ "dependsOn": ["^build:dist"], "outputs": ["{projectRoot}/dist"] }, + "generate:docs": { + "dependsOn": ["^build"], + "outputs": ["{workspaceRoot}/docs/reference"] + }, "dev": { "dependsOn": ["^build", "predev"] + }, + "dev:run": { + "dependsOn": ["^build", "predev"] } }, "tasksRunnerOptions": { @@ -76,6 +83,8 @@ "e2e", "format:check", "lint:check", + "generate:docs", + "dev:run", "format:check" ] } diff --git a/package.json b/package.json index a60f25c03a..1890e93efc 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "docs", "e2e", "effect", + "runtime", + "solc", "schemas", "state", "revm", @@ -30,7 +32,7 @@ "ts-plugin" ], "scripts": { - "all": "nx run-many --targets=build:dist,build:types,typecheck,test:coverage && bun lint && bun sort-package-json && bun run generate:docs", + "all": "bun i && bun lint && bun sort-package-json && bun generate:docs && nx run-many --exclude=@evmts/docs --targets=build:dist,build:types,typecheck,test:coverage", "build": "nx run-many --targets=build:dist,build:types", "build:dist": "nx run-many --target=build:dist", "build:types": "nx run-many --targets=build:types,typecheck", diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index db61f70393..e60255be26 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,9 +11,11 @@ packages: - "ethers" - "examples/*" - "experimental/*" + - "runtime" - "schemas" - "revm" - "schemas" + - "solc" - "state" - "ts-plugin" - "tsconfig" diff --git a/runtime/.gitignore b/runtime/.gitignore new file mode 100644 index 0000000000..f788c233f1 --- /dev/null +++ b/runtime/.gitignore @@ -0,0 +1,50 @@ +.env + +cache +forge-artifacts +broadcast +types + +# compiled output +dist +packages/*/dist +tmp +/out-tsc +**/tsconfig.tsbuildinfo + +# dependencies +node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +**/lcov.info + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +# My personal files +.zshrc diff --git a/runtime/CHANGELOG.md b/runtime/CHANGELOG.md new file mode 100644 index 0000000000..980c76a30d --- /dev/null +++ b/runtime/CHANGELOG.md @@ -0,0 +1,361 @@ +# @evmts/core + +## 0.11.2 + +### Patch Changes + +- Updated dependencies [[`f3b2b21`](https://github.com/evmts/evmts-monorepo/commit/f3b2b2184aad4dbefd1c840bae72dcf9aff4a1fc)]: + - @evmts/core@0.11.2 + +## 0.10.0 + +### Patch Changes + +- [#469](https://github.com/evmts/evmts-monorepo/pull/469) [`dbc2da6`](https://github.com/evmts/evmts-monorepo/commit/dbc2da6092eae3a7ec2d2519ea8c04505aa911f6) Thanks [@roninjin10](https://github.com/roninjin10)! - Made @evmts/config loading async + +- [#466](https://github.com/evmts/evmts-monorepo/pull/466) [`1c4cbd2`](https://github.com/evmts/evmts-monorepo/commit/1c4cbd2b87abd1c2174fb0d2e7a684367e074440) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated @evmts/bundler to take a fileAccessObject as a parameter + + ### Context + + @evmts/bundler is the internal bundler for all other bundlers and the language server. We changed it to take fileAccessObject as a parameter instead of using `fs` and `fs/promises` + + ### Impact + + By taking in a file-access-object instead of using `fs` we can implement important features. + + - the ability to use virtual files in the typescript lsp before the user saves the file. + - the ability to use more peformant bun file read methods + +- [#468](https://github.com/evmts/evmts-monorepo/pull/468) [`e99fcd0`](https://github.com/evmts/evmts-monorepo/commit/e99fcd09e530a58fddb0d3fa19be0f5439e74f30) Thanks [@roninjin10](https://github.com/roninjin10)! - Improved peformance of bundler via enabling async mode + + Previously all bundlers including the Bun bundler ran with syncronous IO such as readFileSync. With the introduction of async mode the bundler now is more non blocking when it is bundling now. Solc is still syncronous but all IO is now async. + + @evmts/bundler now takes a File-Access-Object as a param. This FileAccessObject is the same shape as `node:fs` module. Bun uses this generic interace to use native Bun file access. + +- [#475](https://github.com/evmts/evmts-monorepo/pull/475) [`cb83c0c`](https://github.com/evmts/evmts-monorepo/commit/cb83c0c81fae63decd7bbdb79b9c3cce2c7e0b8e) Thanks [@roninjin10](https://github.com/roninjin10)! - Added snapshot test of vite bundler build outputs + +- Updated dependencies [[`dbc2da6`](https://github.com/evmts/evmts-monorepo/commit/dbc2da6092eae3a7ec2d2519ea8c04505aa911f6), [`cb83c0c`](https://github.com/evmts/evmts-monorepo/commit/cb83c0c81fae63decd7bbdb79b9c3cce2c7e0b8e)]: + - @evmts/config@0.10.0 + - @evmts/core@0.10.0 + +## 0.9.0 + +### Patch Changes + +- Updated dependencies [[`1f80589`](https://github.com/evmts/evmts-monorepo/commit/1f8058969e2b0290f5032166928f76cfc74e9d74)]: + - @evmts/config@0.9.0 + +## 0.8.1 + +### Patch Changes + +- [#453](https://github.com/evmts/evmts-monorepo/pull/453) [`c23302a`](https://github.com/evmts/evmts-monorepo/commit/c23302a9623a968917df19de8dfa2c56b4612712) Thanks [@roninjin10](https://github.com/roninjin10)! - Started publishing every commit to main so all EVMts changes can be used early. To use the latest main branch release install with `@main` tag. e.g. `npm install @evmts/ts-plugin@main` + +- Updated dependencies [[`c23302a`](https://github.com/evmts/evmts-monorepo/commit/c23302a9623a968917df19de8dfa2c56b4612712), [`ae772ac`](https://github.com/evmts/evmts-monorepo/commit/ae772ac62ad16d19c48b82dfd005458bf27200fe)]: + - @evmts/config@0.8.1 + - @evmts/core@0.8.1 + - @evmts/tsconfig@0.8.1 + +## 0.8.0 + +### Minor Changes + +- [#439](https://github.com/evmts/evmts-monorepo/pull/439) [`91e43e9`](https://github.com/evmts/evmts-monorepo/commit/91e43e952a440f037d52146511ed2508d289874e) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for natspec comments showing up in EVMts contracts LSP and bundled code. Now when you hover over an EVMts contract any natspec comments will be available as jsdoc comments. + + This support is limited based on what [solc](https://docs.soliditylang.org/en/v0.8.17/using-the-compiler.html) supports. In future more robust natspec parsing is expected to be added via [soldity-ast](Add function to parse NatSpec) + ![image](https://github.com/evmts/evmts-monorepo/assets/35039927/da3b2c70-f16d-4f47-9de8-c05b4442193f) + +- [#438](https://github.com/evmts/evmts-monorepo/pull/438) [`eedb7e0`](https://github.com/evmts/evmts-monorepo/commit/eedb7e0e8f853acf59c3f86c1d7317bad8ee7e2b) Thanks [@roninjin10](https://github.com/roninjin10)! - Improve peformance by 98% (5x) testing against 101 simple NFT contract imports + + Major change: remove bytecode from EVMts. Needing the bytecode is a niche use case and removing it improves peformance of the compiler significantly. In future bytecode will be brought back as an optional prop + + This improves peformance by 98% (50x) testing against 101 simple NFT contract imports + + Because EVMts is still considered in alpha this will not cause a major semver bump + +- [#440](https://github.com/evmts/evmts-monorepo/pull/440) [`8cceec7`](https://github.com/evmts/evmts-monorepo/commit/8cceec7409a5fc0e72168a10821a64203ba374ab) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for resolving an AST. + Passing in an optional flag to the bundler will return an ast along with comments and abi. By default it's turned off. This AST will be usable in future prs to implement advanced langauge features like goToDefinition + + To work with the AST we add [solidity-ast](https://github.com/OpenZeppelin/solidity-ast) from open-zeppelin. + +- [#444](https://github.com/evmts/evmts-monorepo/pull/444) [`793798e`](https://github.com/evmts/evmts-monorepo/commit/793798ec3782e4081840bcd77242104c9546e70c) Thanks [@roninjin10](https://github.com/roninjin10)! - Added solcInput and solcOutput to return objects for bundler. + + Now in addition to the compiled code and the modules solcInput and solcOutput are also added along with the recently added asts property + + ![image](https://github.com/evmts/evmts-monorepo/assets/35039927/57277b41-195c-4c54-ab70-a4e1ef3fceaa) + + This will be used internally to implement go-to-definition LSP support to [@evmts/ts-plugin](https://github.com/evmts/evmts-monorepo/tree/main/ts-plugin) + +### Patch Changes + +- [#436](https://github.com/evmts/evmts-monorepo/pull/436) [`e1903df`](https://github.com/evmts/evmts-monorepo/commit/e1903df625c54b2447ce2bc2318f4c74f9a02bb5) Thanks [@roninjin10](https://github.com/roninjin10)! - Internal change: Made usage of solc typesafe + + This change adds new solc types to the [solc](https://github.com/ethereum/solc-bin) peer dependency used by EVMts. This is used by @evmts/bundler to + + - includes type for SolcInputSources and outputsources + + ![image](https://github.com/evmts/evmts-monorepo/assets/35039927/1ee13b76-98ab-4f62-9266-6e4a972de223) + + These types were adapted from [solc documentation](https://docs.soliditylang.org/en/v0.8.17/using-the-compiler.html#compiler-input-and-output-json-description) + + Shout out @o-az who kicked off this improvement in #435 + +- [#442](https://github.com/evmts/evmts-monorepo/pull/442) [`b020298`](https://github.com/evmts/evmts-monorepo/commit/b020298f1acbfad396b0c1c9a1618e00bc750a43) Thanks [@roninjin10](https://github.com/roninjin10)! - ⬆️ Upgraded all npm packages to latest + Every package in EVMts is consistently updated to it's latest version using `pnpm up --latest` +- Updated dependencies [[`eedb7e0`](https://github.com/evmts/evmts-monorepo/commit/eedb7e0e8f853acf59c3f86c1d7317bad8ee7e2b), [`b020298`](https://github.com/evmts/evmts-monorepo/commit/b020298f1acbfad396b0c1c9a1618e00bc750a43)]: + - @evmts/core@0.8.0 + - @evmts/config@0.8.0 + +## 0.7.1 + +### Patch Changes + +- Updated dependencies [[`eb6ec5d`](https://github.com/evmts/evmts-monorepo/commit/eb6ec5dff13c51baa09f0019fb8b1b94a41108cb)]: + - @evmts/tsconfig@0.7.1 + - @evmts/config@0.7.0 + - @evmts/core@0.6.0 + +## 0.7.0 + +### Minor Changes + +- [#419](https://github.com/evmts/evmts-monorepo/pull/419) [`644e8fd`](https://github.com/evmts/evmts-monorepo/commit/644e8fda95d2824c9145f8d6278cbdb6272b0609) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for monorepo imports and node_module imports + + Previously, these use cases would fail because @evmts/core was not in scope. EVMts injects a module that uses the `@evmts/core` package to create the contract objects at runtime. These packages are installed to the users node_modules and thus were not in scope for sub dependencies and other workspaces. @evmts/core now handles this via always importing @evmts/core from the users main workspace. This feature enables 2 use cases. + + ## Use case 1 - Importing from Node Modules + + A solid way to use EVMts is to install a package that has contracts in it and import the contract from node module + + ``` + import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + import { viemPublicClient, Address } from './publicClient' + + const balanceOf = (address: Address) => viemPublicClient.readContract(ERC20.balanceOf( + ``` + + ## Use case 2 - Importing from PNPM monorepos + + Devs commonly use monorepo tools such as npm workspaces, yarn workspaces, or pnpm workspaces. Previously these tools failed to work correctly but are now supported. + +### Patch Changes + +- [#411](https://github.com/evmts/evmts-monorepo/pull/411) [`8dbc952`](https://github.com/evmts/evmts-monorepo/commit/8dbc952d2dc2ca97e89bad55b162056d4f6b31a6) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed a bug with stack too deep error. + + Error happens when recursive contract imports (e.g. contract a imports contract b which imports contract c etc.) go over the total amount of stack frames allowed by JS. When this happens the process would fail with a "stack too deep error". + +- [#408](https://github.com/evmts/evmts-monorepo/pull/408) [`d7e6158`](https://github.com/evmts/evmts-monorepo/commit/d7e61583dc1529569de92868ffe49d75c045dc1f) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with using '.' instead of process.cwd() + + This bug was unlikely to affect users and mostly a stylistic problem + +- [#402](https://github.com/evmts/evmts-monorepo/pull/402) [`4f532eb`](https://github.com/evmts/evmts-monorepo/commit/4f532ebab51004603b1a41f956729fec4a3dbd2d) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed version of plugin defaulting to 0.0.0 instead of the package.json version + + Previously the version of all evmts-plugins were hardcoded to 0.0.0. Now they will correctly show the correct version. + +- [#416](https://github.com/evmts/evmts-monorepo/pull/416) [`fc28f54`](https://github.com/evmts/evmts-monorepo/commit/fc28f545635a23a76e4acce0ff48d0902eed484c) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed another stack too deep bug from a recursive function in bundler + + - A previous fix fixed a stack too deep error but another one was discovered. + - Fixed via refactoring a recursive internal function to iterative. + - This bug affected projects importing solidity that imports other solidity deep enough to make the stack too deep + +- Updated dependencies [[`8f11961`](https://github.com/evmts/evmts-monorepo/commit/8f11961f6b3ebc5882a1e5403d3726df7ddee0d4), [`fa7555a`](https://github.com/evmts/evmts-monorepo/commit/fa7555a8b0bac268f5297544422c516dae4c5511), [`c71cd30`](https://github.com/evmts/evmts-monorepo/commit/c71cd30818b311c95852a720c170ef18915b750f)]: + - @evmts/config@0.7.0 + +## 0.6.0 + +### Minor Changes + +- [#372](https://github.com/evmts/evmts-monorepo/pull/372) [`0a87d1a`](https://github.com/evmts/evmts-monorepo/commit/0a87d1a290e6cdd6902d6c1c84ea56d8bc227c45) Thanks [@roninjin10](https://github.com/roninjin10)! - Generalize and export module creators that create .d.ts .ts .cjs and .mjs modules from abis. These were previously private. + +### Patch Changes + +- [#378](https://github.com/evmts/evmts-monorepo/pull/378) [`97d7aec`](https://github.com/evmts/evmts-monorepo/commit/97d7aec9844b370129b9c46ab8c19fe9d13880ec) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed type bug of config being falsely marked as required + +- [#379](https://github.com/evmts/evmts-monorepo/pull/379) [`0ff53e7`](https://github.com/evmts/evmts-monorepo/commit/0ff53e71ff792ed4df1fa180f5a72dd5d65f4142) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated build pipeline to generate .d.ts files + +- [#370](https://github.com/evmts/evmts-monorepo/pull/370) [`58862a6`](https://github.com/evmts/evmts-monorepo/commit/58862a6ebe6ec1e04961dbc2da6e846a02ef0692) Thanks [@roninjin10](https://github.com/roninjin10)! - Added 100% test coverage to bundler + +- Updated dependencies [[`6da3fe7`](https://github.com/evmts/evmts-monorepo/commit/6da3fe7fdec9bc2e4d35fc0558b79c65a105a516), [`6de12df`](https://github.com/evmts/evmts-monorepo/commit/6de12df39cf9da0635c246c685036e83a8e97255), [`0ff53e7`](https://github.com/evmts/evmts-monorepo/commit/0ff53e71ff792ed4df1fa180f5a72dd5d65f4142), [`e24901a`](https://github.com/evmts/evmts-monorepo/commit/e24901a7b503354af6174bac81a868a8598f143b), [`3a2dfae`](https://github.com/evmts/evmts-monorepo/commit/3a2dfae3a38ca7052b57b57e5c95a952a7f0be71), [`6dd223b`](https://github.com/evmts/evmts-monorepo/commit/6dd223b0b625bd7dcbea7537f053b32457761955), [`6da3fe7`](https://github.com/evmts/evmts-monorepo/commit/6da3fe7fdec9bc2e4d35fc0558b79c65a105a516)]: + - @evmts/core@0.6.0 + - @evmts/config@0.6.0 + +## 0.5.7 + +### Patch Changes + +- [#361](https://github.com/evmts/evmts-monorepo/pull/361) [`4fc4872`](https://github.com/evmts/evmts-monorepo/commit/4fc48722380d4390ef527ccbb27a63f73503c750) Thanks [@roninjin10](https://github.com/roninjin10)! - Added warning when solc version does not match config + +- [#353](https://github.com/evmts/evmts-monorepo/pull/353) [`97cb0c1`](https://github.com/evmts/evmts-monorepo/commit/97cb0c1381f3a0b3ffa92dfcb09c397cff3190dd) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with exporting private variables in .d.ts + +- [#351](https://github.com/evmts/evmts-monorepo/pull/351) [`ca58f7a`](https://github.com/evmts/evmts-monorepo/commit/ca58f7a66b01a68d93585d664a77a43f67ce5bbc) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for reload when any contract in the import graph changes + +## 0.5.6 + +### Patch Changes + +- [#345](https://github.com/evmts/evmts-monorepo/pull/345) [`31186f7`](https://github.com/evmts/evmts-monorepo/commit/31186f749ce5cd3c6e0ca4d4885975aa74512c45) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed typo breaking TS language server + +- [#346](https://github.com/evmts/evmts-monorepo/pull/346) [`6d9365d`](https://github.com/evmts/evmts-monorepo/commit/6d9365db3ab197ea4ad53f777d755ee3ad562b21) Thanks [@roninjin10](https://github.com/roninjin10)! - Change naming to Evmts from EVMts + +- Updated dependencies [[`6d9365d`](https://github.com/evmts/evmts-monorepo/commit/6d9365db3ab197ea4ad53f777d755ee3ad562b21)]: + - @evmts/config@0.5.6 + - @evmts/core@0.5.6 + +## 0.5.5 + +### Patch Changes + +- [#343](https://github.com/evmts/evmts-monorepo/pull/343) [`bec7e33`](https://github.com/evmts/evmts-monorepo/commit/bec7e3303e8b241213804c42f6673a38dc7a954c) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with generated .d.ts file name param + +## 0.5.4 + +### Patch Changes + +- [#339](https://github.com/evmts/evmts-monorepo/pull/339) [`c9dec08`](https://github.com/evmts/evmts-monorepo/commit/c9dec084df5c5a9999a8f917405a15b11a004c02) Thanks [@roninjin10](https://github.com/roninjin10)! - Upgraded all dependencies + +- Updated dependencies [[`0116537`](https://github.com/evmts/evmts-monorepo/commit/0116537d3423c8decfd0adaf490d37d33f8a540f), [`2b8b5ed`](https://github.com/evmts/evmts-monorepo/commit/2b8b5ed9852c32e15a7466f00f4ca9c0458cfeef)]: + - @evmts/config@0.5.4 + - @evmts/core@0.5.4 + +## 0.5.3 + +### Patch Changes + +- Updated dependencies [[`2dc1950`](https://github.com/evmts/evmts-monorepo/commit/2dc19507c9d957948dcff8f65a359fc25b0ceb10)]: + - @evmts/core@0.5.3 + +## 0.5.2 + +### Patch Changes + +- Updated dependencies [[`cdbe2b1`](https://github.com/evmts/evmts-monorepo/commit/cdbe2b14d3a9b40ea37898829bc982b5e76e3c4c)]: + - @evmts/core@0.5.2 + +## 0.5.1 + +### Patch Changes + +- Updated dependencies [[`cec44b5`](https://github.com/evmts/evmts-monorepo/commit/cec44b5042bc76c21a9b695383714642c2b44da6)]: + - @evmts/core@0.5.1 + +## 0.5.0 + +### Minor Changes + +- [#283](https://github.com/evmts/evmts-monorepo/pull/283) [`05a8efe`](https://github.com/evmts/evmts-monorepo/commit/05a8efede4acad157e3820bdba24d92f598699e5) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated config schema to support etherscan + - Solc version is now listed under `compiler.solcVersion` instead of `solc` + - Foundry projects are now listed under `compiler.foundryProject` instead of `forge` + - Local contracts are now specified under `localContracts.contracts` instead of `deployments` + - New external option (unimplemented) `externalContracts` which is used to specifify contracts imported from etherscan in the next release + +### Patch Changes + +- [#298](https://github.com/evmts/evmts-monorepo/pull/298) [`841d6a8`](https://github.com/evmts/evmts-monorepo/commit/841d6a89f4995e4f666902d27cb7dbfc3efd77e5) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with etherscan links showing as undefined if they didn't exist + +- [#301](https://github.com/evmts/evmts-monorepo/pull/301) [`83bf23b`](https://github.com/evmts/evmts-monorepo/commit/83bf23b0cb2eb5860f9dfb63a773541e48c62abc) Thanks [@roninjin10](https://github.com/roninjin10)! - Upgraded all dependencies + +- Updated dependencies [[`700b3d0`](https://github.com/evmts/evmts-monorepo/commit/700b3d0907df243b29e96b1b3246b8c75cfb9900), [`720bfdb`](https://github.com/evmts/evmts-monorepo/commit/720bfdba790699e388c5ec1c68630b9f0f077158), [`05a8efe`](https://github.com/evmts/evmts-monorepo/commit/05a8efede4acad157e3820bdba24d92f598699e5), [`85c340d`](https://github.com/evmts/evmts-monorepo/commit/85c340dc4a63afdbc6bd92fb4b2cf3fe0ffdc6e7), [`0bd5b45`](https://github.com/evmts/evmts-monorepo/commit/0bd5b4511e292380a7ac87a898d22dbd32df9e35), [`720bfdb`](https://github.com/evmts/evmts-monorepo/commit/720bfdba790699e388c5ec1c68630b9f0f077158), [`2ab7c02`](https://github.com/evmts/evmts-monorepo/commit/2ab7c022520fe3c03f337d51dc0f7875830492f1)]: + - @evmts/config@0.5.0 + - @evmts/core@0.5.0 + +## 0.4.2 + +### Patch Changes + +- [#279](https://github.com/evmts/evmts-monorepo/pull/279) [`fd6b482`](https://github.com/evmts/evmts-monorepo/commit/fd6b4825417fa81d601e9a3c5078131bc1f816c0) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed source file does not exist warning in @evmts/bundler + +## 0.4.1 + +### Patch Changes + +- Updated dependencies [[`2a89e13`](https://github.com/evmts/evmts-monorepo/commit/2a89e136d8dfcd997ae5ff227a96de4702dfbe19)]: + - @evmts/config@0.2.1 + +## 0.4.0 + +### Minor Changes + +- [#268](https://github.com/evmts/evmts-monorepo/pull/268) [`a37844f`](https://github.com/evmts/evmts-monorepo/commit/a37844faa425d1eaca112b9a09640b7ec7e288de) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for detecting foundry.toml and remappings as tsconfig option. Set forge: true in plugin tsconfig options or forge: '/path/to/binary/forge' for a custom forge binary + +### Patch Changes + +- Updated dependencies [[`1f6919c`](https://github.com/evmts/evmts-monorepo/commit/1f6919cfc54648499129d3642ddbb64568b1e798), [`a37844f`](https://github.com/evmts/evmts-monorepo/commit/a37844faa425d1eaca112b9a09640b7ec7e288de)]: + - @evmts/core@0.3.1 + - @evmts/config@0.2.0 + +## 0.3.0 + +### Minor Changes + +- [#259](https://github.com/evmts/evmts-monorepo/pull/259) [`7ad7463`](https://github.com/evmts/evmts-monorepo/commit/7ad746347d3e127f001abdc28fff2a10c1ffed65) Thanks [@roninjin10](https://github.com/roninjin10)! - Added bytecode to Evmts contracts + +### Patch Changes + +- [#258](https://github.com/evmts/evmts-monorepo/pull/258) [`9a9b963`](https://github.com/evmts/evmts-monorepo/commit/9a9b96327cd2f8415cf09a471a7589fa3df90394) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with handling overloaded functions + +- Updated dependencies [[`7ad7463`](https://github.com/evmts/evmts-monorepo/commit/7ad746347d3e127f001abdc28fff2a10c1ffed65), [`9a9b963`](https://github.com/evmts/evmts-monorepo/commit/9a9b96327cd2f8415cf09a471a7589fa3df90394)]: + - @evmts/core@0.3.0 + +## 0.2.0 + +### Minor Changes + +- [#252](https://github.com/evmts/evmts-monorepo/pull/252) [`4b361ea`](https://github.com/evmts/evmts-monorepo/commit/4b361ea43fb34541bee4f75c8bea9d93543b1813) Thanks [@roninjin10](https://github.com/roninjin10)! - Changed Evmts configuration to be purely from tsconfig + +### Patch Changes + +- [#251](https://github.com/evmts/evmts-monorepo/pull/251) [`52732a1`](https://github.com/evmts/evmts-monorepo/commit/52732a1bcd59faa7970e5298d1e71a61c687fd67) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed missing src folder in npm packages + +- Updated dependencies [[`52732a1`](https://github.com/evmts/evmts-monorepo/commit/52732a1bcd59faa7970e5298d1e71a61c687fd67), [`4b361ea`](https://github.com/evmts/evmts-monorepo/commit/4b361ea43fb34541bee4f75c8bea9d93543b1813)]: + - @evmts/config@0.1.0 + - @evmts/core@0.2.0 + +## 0.1.0 + +### Minor Changes + +- [#249](https://github.com/evmts/evmts-monorepo/pull/249) [`fda2523`](https://github.com/evmts/evmts-monorepo/commit/fda25237cea8a4e94fc6dc043174810ae441fb8e) Thanks [@roninjin10](https://github.com/roninjin10)! - Added etherscan links for most major EVM networks + +### Patch Changes + +- [#247](https://github.com/evmts/evmts-monorepo/pull/247) [`f7ba6e5`](https://github.com/evmts/evmts-monorepo/commit/f7ba6e5546263d7a94baf50ca1010a2b505580e0) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed incorrect peer dependency configuation for solc + +## 0.0.3 + +### Patch Changes + +- Updated dependencies [[`ab40941`](https://github.com/evmts/evmts-monorepo/commit/ab40941221c4edacce16659ef88bdfdb90c325bb), [`058d904`](https://github.com/evmts/evmts-monorepo/commit/058d90474598ea790d4de9fd8501381a77edbcb6)]: + - @evmts/core@0.1.2 + +## 0.0.2 + +### Patch Changes + +- Updated dependencies []: + - @evmts/core@0.1.1 + +## 0.0.1 + +### Patch Changes + +- [`2a31d64`](https://github.com/evmts/evmts-monorepo/commit/2a31d640b61a3e3eda63e0ca0442104ea27bfaec) - Init new changesets + +- Updated dependencies [[`e21f2f4`](https://github.com/evmts/evmts-monorepo/commit/e21f2f4fbdafc7d6d859f513afa319b9812826f0), [`88ec554`](https://github.com/evmts/evmts-monorepo/commit/88ec554a592d29aaba0a0d69ec61fd75118e817c), [`877c137`](https://github.com/evmts/evmts-monorepo/commit/877c137dfbe8a143099ddb0656236c35bceb2f87), [`2a31d64`](https://github.com/evmts/evmts-monorepo/commit/2a31d640b61a3e3eda63e0ca0442104ea27bfaec)]: + - @evmts/core@0.1.0 + - @evmts/config@0.0.1 + +## 0.0.1-next.0 + +### Patch Changes + +- [`2a31d64`](https://github.com/evmts/evmts-monorepo/commit/2a31d640b61a3e3eda63e0ca0442104ea27bfaec) - Init new changesets + +- Updated dependencies [[`2a31d64`](https://github.com/evmts/evmts-monorepo/commit/2a31d640b61a3e3eda63e0ca0442104ea27bfaec)]: + - @evmts/config@0.0.1-next.0 + - @evmts/core@0.0.4-next.0 + +## 0.0.2 + +### Patch Changes + +- Release working proof of concept diff --git a/runtime/LICENSE b/runtime/LICENSE new file mode 100644 index 0000000000..b5a4fa7a69 --- /dev/null +++ b/runtime/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2022 + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/runtime/README.md b/runtime/README.md new file mode 100644 index 0000000000..d778db6a37 --- /dev/null +++ b/runtime/README.md @@ -0,0 +1,50 @@ +

+ + + + wagmi logo + + +

+ +

+ Execute solidity scripts in browser +

+ +[![CI](https://github.com/evmts/evmts-monorepo/actions/workflows/e2e.yml/badge.svg)](https://github.com/evmts/evmts-monorepo/actions/workflows/e2e.yml) +[![CI](https://github.com/evmts/evmts-monorepo/actions/workflows/unit.yml/badge.svg)](https://github.com/evmts/evmts-monorepo/actions/workflows/unit.yml) + + + + + + + +# @evmts/bundler + +Internal bundler for Evmts + +Used in the LSP + +- @evmts/ts-plugin + +And all bundlers + +- @evmts/bun-plugin +- @evmts/esbuild-plugin +- @evmts/rollup-plugin +- @evmts/rspack-plugin +- @evmts/vite-plugin +- @evmts/webpack-plugin + +## API + +#### bundler + +## Visit [Docs](https://evmts.dev/) for docs, guides, API and more! + +## See [Evmts Beta project board](https://github.com/orgs/evmts/projects/1) for progress on the upcoming beta release + +## License 📄 + + diff --git a/runtime/TestContract.d.ts b/runtime/TestContract.d.ts new file mode 100644 index 0000000000..274c219ce6 --- /dev/null +++ b/runtime/TestContract.d.ts @@ -0,0 +1,129 @@ +import { EvmtsContract } from '@evmts/core' +const _abiTestContract = [ + { + constant: true, + inputs: [], + name: 'name', + outputs: [{ name: '', type: 'string' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { name: '_spender', type: 'address' }, + { name: '_value', type: 'uint256' }, + ], + name: 'approve', + outputs: [{ name: '', type: 'bool' }], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'totalSupply', + outputs: [{ name: '', type: 'uint256' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { name: '_from', type: 'address' }, + { name: '_to', type: 'address' }, + { name: '_value', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [{ name: '', type: 'bool' }], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'decimals', + outputs: [{ name: '', type: 'uint8' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [{ name: '_owner', type: 'address' }], + name: 'balanceOf', + outputs: [{ name: 'balance', type: 'uint256' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'symbol', + outputs: [{ name: '', type: 'string' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { name: '_to', type: 'address' }, + { name: '_value', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ name: '', type: 'bool' }], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [ + { name: '_owner', type: 'address' }, + { name: '_spender', type: 'address' }, + ], + name: 'allowance', + outputs: [{ name: '', type: 'uint256' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { payable: true, stateMutability: 'payable', type: 'fallback' }, + { + anonymous: false, + inputs: [ + { indexed: true, name: 'owner', type: 'address' }, + { indexed: true, name: 'spender', type: 'address' }, + { indexed: false, name: 'value', type: 'uint256' }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, name: 'from', type: 'address' }, + { indexed: true, name: 'to', type: 'address' }, + { indexed: false, name: 'value', type: 'uint256' }, + ], + name: 'Transfer', + type: 'event', + }, +] as const +const _chainAddressMapTestContract = { '10': '0x123' } as const +const _nameTestContract = 'TestContract' as const +/** + * TestContract EvmtsContract + * @etherscan-10 https://optimistic.etherscan.io/address/0x123 + */ +export const TestContract: EvmtsContract< + typeof _nameTestContract, + typeof _chainAddressMapTestContract, + typeof _abiTestContract +> diff --git a/runtime/package.json b/runtime/package.json new file mode 100644 index 0000000000..c2a3c4be89 --- /dev/null +++ b/runtime/package.json @@ -0,0 +1,91 @@ +{ + "name": "@evmts/runtime", + "version": "0.11.2", + "private": false, + "description": "Tools for generating the EVMts contract runtime", + "keywords": [ + "solidity", + "forge", + "foundry", + "sol", + "typescript", + "web3", + "blockchain" + ], + "repository": { + "type": "git", + "url": "https://github.com/evmts/evmts-monorepo.git", + "directory": "runtime" + }, + "license": "MIT", + "contributors": [ + "Will Cory " + ], + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": "./src/index.js", + "require": "./dist/index.cjs", + "types": "./types/src/index.d.ts", + "default": "./dist/index.cjs" + } + }, + "main": "dist/index.cjs", + "module": "src/index.js", + "types": "types/src/index.d.ts", + "files": [ + "dist", + "types", + "src" + ], + "scripts": { + "all": "bun i && bun run build && bun run lint && bun run lint:check && bun run format:check && bun run format && bun run test:coverage && bun run generate:docs", + "build": "nx run-many --targets=build:dist,build:types --projects=@evmts/runtime ", + "build:dist": "bun run tsup", + "build:types": "bun run tsc --emitDeclarationOnly", + "clean": "rm -rf node_modules && rm -rf artifacts && rm -rf dist && rm -rf cache", + "format": "rome format . --write", + "format:check": "rome format .", + "generate:docs": "bun run typedoc", + "lint": "rome check . --apply-unsafe", + "lint:check": "rome check . --verbose", + "test": "vitest --coverage", + "test:coverage": "vitest run --coverage", + "test:run": "vitest run", + "test:ui": "vitest --ui" + }, + "dependencies": { + "@evmts/config": "workspace:^", + "@evmts/tsconfig": "workspace:^", + "@types/node": "^20.7.2", + "@types/resolve": "^1.20.3", + "effect": "2.0.0-next.50", + "glob": "^10.3.10", + "resolve": "^1.22.6", + "solidity-ast": "^0.4.52", + "unplugin": "^1.5.0" + }, + "devDependencies": { + "@evmts/core": "workspace:^", + "@evmts/solc": "workspace:^", + "@vitest/coverage-v8": "^0.34.6", + "@vitest/ui": "^0.34.6", + "abitype": "^0.9.8", + "rome": "^12.1.3", + "solc": "0.8.21", + "tsup": "^7.2.0", + "typedoc": "^0.25.2", + "typedoc-plugin-markdown": "^3.16.0", + "typescript": "^5.2.2", + "vitest": "^0.34.6", + "wagmi": "^1.4.2", + "zod": "^3.22.2" + }, + "peerDependencies": { + "solc": ">0.8.10" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/runtime/rome.json b/runtime/rome.json new file mode 100644 index 0000000000..a63fed5a70 --- /dev/null +++ b/runtime/rome.json @@ -0,0 +1,35 @@ +{ + "organizeImports": { + "enabled": true + }, + "files": { + "ignore": ["coverage", "node_modules", "dist", "artifacts", "types"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "tab", + "indentSize": 2, + "lineWidth": 80 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "performance": { + "noDelete": "off" + }, + "suspicious": { + "noArrayIndexKey": "off", + "noExplicitAny": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "trailingComma": "all", + "semicolons": "asNeeded" + } + } +} diff --git a/runtime/source.ts b/runtime/source.ts new file mode 100644 index 0000000000..77166d7eee --- /dev/null +++ b/runtime/source.ts @@ -0,0 +1,31 @@ +import { TestContract } from './TestContract.js' +import { Address, useAccount, useContractRead } from 'wagmi' + +export const WagmiReads = () => { + const { address, isConnected } = useAccount() + + const { data: balance } = useContractRead({ + /** + * Spreading in a method will spread abi, address and args + * Hover over balanceOf and click go-to-definition should take you to the method definition in solidity if compiling from solidity + */ + ...TestContract.read().balanceOf(address as Address), + enabled: isConnected, + }) + const { data: totalSupply } = useContractRead({ + ...TestContract.read().totalSupply(), + enabled: isConnected, + }) + const { data: symbol } = useContractRead({ + ...TestContract.read().symbol(), + enabled: isConnected, + }) + const testBalance: bigint | undefined = balance + const testSymbol: string | undefined = symbol + const testTotalSupply: bigint | undefined = totalSupply + return { + testBalance, + symbol, + totalSupply, + } +} diff --git a/bundlers/bundler/src/runtime/generateEvmtsBody.js b/runtime/src/generateEvmtsBody.js similarity index 95% rename from bundlers/bundler/src/runtime/generateEvmtsBody.js rename to runtime/src/generateEvmtsBody.js index 46f5857893..4db600431f 100644 --- a/bundlers/bundler/src/runtime/generateEvmtsBody.js +++ b/runtime/src/generateEvmtsBody.js @@ -6,7 +6,7 @@ import { formatAbi } from 'abitype' */ /** - * @param {import("../solc/resolveArtifactsSync.js").Artifacts} artifacts + * @param {import("@evmts/solc").Artifacts} artifacts * @param {ModuleType} moduleType * @returns {string} */ diff --git a/bundlers/bundler/src/runtime/generateEvmtsBody.spec.ts b/runtime/src/generateEvmtsBody.spec.ts similarity index 97% rename from bundlers/bundler/src/runtime/generateEvmtsBody.spec.ts rename to runtime/src/generateEvmtsBody.spec.ts index cf169bffc7..e2c94ffe44 100644 --- a/bundlers/bundler/src/runtime/generateEvmtsBody.spec.ts +++ b/runtime/src/generateEvmtsBody.spec.ts @@ -1,4 +1,4 @@ -import { generateEvmtsBody } from './generateEvmtsBody.js' // replace with your actual module path +import { generateEvmtsBody } from './generateEvmtsBody.js' import { describe, expect, it } from 'vitest' describe('generateEvmtsBody', () => { diff --git a/bundlers/bundler/src/runtime/generateEvmtsBodyDts.js b/runtime/src/generateEvmtsBodyDts.js similarity index 92% rename from bundlers/bundler/src/runtime/generateEvmtsBodyDts.js rename to runtime/src/generateEvmtsBodyDts.js index 2a56edbbb8..aa2e6d261f 100644 --- a/bundlers/bundler/src/runtime/generateEvmtsBodyDts.js +++ b/runtime/src/generateEvmtsBodyDts.js @@ -1,7 +1,7 @@ import { formatAbi } from 'abitype' /** - * @param {import("../solc/resolveArtifactsSync.js").Artifacts} artifacts + * @param {import("@evmts/solc").Artifacts} artifacts * @returns {string} */ export const generateDtsBody = (artifacts) => { diff --git a/bundlers/bundler/src/runtime/generateEvmtsBodyDts.spec.ts b/runtime/src/generateEvmtsBodyDts.spec.ts similarity index 95% rename from bundlers/bundler/src/runtime/generateEvmtsBodyDts.spec.ts rename to runtime/src/generateEvmtsBodyDts.spec.ts index 5021cda2e7..d0e74a59bc 100644 --- a/bundlers/bundler/src/runtime/generateEvmtsBodyDts.spec.ts +++ b/runtime/src/generateEvmtsBodyDts.spec.ts @@ -1,4 +1,4 @@ -import { generateDtsBody } from './generateEvmtsBodyDts.js' // replace with your actual module path +import { generateDtsBody } from './generateEvmtsBodyDts.js' import { describe, expect, it } from 'vitest' describe('generateDtsBody', () => { diff --git a/bundlers/bundler/src/runtime/generateRuntime.js b/runtime/src/generateRuntime.js similarity index 84% rename from bundlers/bundler/src/runtime/generateRuntime.js rename to runtime/src/generateRuntime.js index 0bd2706161..16f984e923 100644 --- a/bundlers/bundler/src/runtime/generateRuntime.js +++ b/runtime/src/generateRuntime.js @@ -2,9 +2,9 @@ import { generateEvmtsBody } from './generateEvmtsBody.js' /** * Generates the runtime code for the given artifacts. - * @param {import("../solc/resolveArtifactsSync.js").Artifacts} artifacts + * @param {import("@evmts/solc").Artifacts} artifacts * @param {'cjs' | 'mjs' | 'ts'} moduleType - * @param {import("../types.js").Logger} logger + * @param {import("@evmts/solc").Logger} logger * @returns {Promise} */ export const generateRuntime = async (artifacts, moduleType, logger) => { diff --git a/bundlers/bundler/src/runtime/generateRuntimeSync.js b/runtime/src/generateRuntimeSync.js similarity index 88% rename from bundlers/bundler/src/runtime/generateRuntimeSync.js rename to runtime/src/generateRuntimeSync.js index 8286f06e08..870450d588 100644 --- a/bundlers/bundler/src/runtime/generateRuntimeSync.js +++ b/runtime/src/generateRuntimeSync.js @@ -1,9 +1,9 @@ import { generateEvmtsBody } from './generateEvmtsBody.js' /** - * @param {import("../solc/resolveArtifactsSync.js").Artifacts} artifacts + * @param {import("@evmts/solc").Artifacts} artifacts * @param {'cjs' | 'mjs' | 'ts' | 'dts'} moduleType - * @param {import("../types.js").Logger} logger + * @param {import("@evmts/solc").Logger} logger * @returns {string} */ export const generateRuntimeSync = (artifacts, moduleType, logger) => { diff --git a/bundlers/bundler/src/runtime/generateRuntimeSync.spec.ts b/runtime/src/generateRuntimeSync.spec.ts similarity index 97% rename from bundlers/bundler/src/runtime/generateRuntimeSync.spec.ts rename to runtime/src/generateRuntimeSync.spec.ts index 65fb22e7b6..a940ad1d75 100644 --- a/bundlers/bundler/src/runtime/generateRuntimeSync.spec.ts +++ b/runtime/src/generateRuntimeSync.spec.ts @@ -1,6 +1,6 @@ -import type { Artifacts } from '../solc/resolveArtifactsSync.js' import { generateEvmtsBody } from './generateEvmtsBody.js' import { generateRuntimeSync } from './generateRuntimeSync.js' +import type { Artifacts } from '@evmts/solc' import { type MockedFunction, beforeEach, diff --git a/bundlers/bundler/src/runtime/index.js b/runtime/src/index.js similarity index 100% rename from bundlers/bundler/src/runtime/index.js rename to runtime/src/index.js diff --git a/runtime/tsconfig.json b/runtime/tsconfig.json new file mode 100644 index 0000000000..e4a7b177b9 --- /dev/null +++ b/runtime/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@evmts/tsconfig/base.json", + "compilerOptions": { + "composite": true, + "outDir": "types", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true + }, + "include": [ + "src", + "src/**/*.json", + "package.json" + ] +} \ No newline at end of file diff --git a/runtime/tsup.config.ts b/runtime/tsup.config.ts new file mode 100644 index 0000000000..197bac356c --- /dev/null +++ b/runtime/tsup.config.ts @@ -0,0 +1,13 @@ +import packageJson from './package.json' +import { defineConfig } from 'tsup' + +export default defineConfig({ + name: packageJson.name, + entry: ['src/index.js'], + outDir: 'dist', + format: ['cjs'], + splitting: false, + sourcemap: true, + clean: true, + skipNodeModulesBundle: true, +}) diff --git a/runtime/typedoc.json b/runtime/typedoc.json new file mode 100644 index 0000000000..0c48e49c25 --- /dev/null +++ b/runtime/typedoc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "out": "../../docs/reference/runtime", + "entryPoints": ["./src/index.js"], + "publicPath": "/reference/runtime/", + "plugin": ["typedoc-plugin-markdown"], + "gitRevision": "main" +} diff --git a/runtime/vitest.config.ts b/runtime/vitest.config.ts new file mode 100644 index 0000000000..0448e75640 --- /dev/null +++ b/runtime/vitest.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'vitest/config' + +// https://vitest.dev/config/ - for docs +export default defineConfig({ + test: { + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + environment: 'node', + coverage: { + reporter: ['text', 'json-summary', 'json'], + lines: 100, + functions: 100, + branches: 91.66, + statements: 100, + thresholdAutoUpdate: true, + }, + }, +}) diff --git a/solc/.gitignore b/solc/.gitignore new file mode 100644 index 0000000000..f788c233f1 --- /dev/null +++ b/solc/.gitignore @@ -0,0 +1,50 @@ +.env + +cache +forge-artifacts +broadcast +types + +# compiled output +dist +packages/*/dist +tmp +/out-tsc +**/tsconfig.tsbuildinfo + +# dependencies +node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +**/lcov.info + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +# My personal files +.zshrc diff --git a/solc/CHANGELOG.md b/solc/CHANGELOG.md new file mode 100644 index 0000000000..980c76a30d --- /dev/null +++ b/solc/CHANGELOG.md @@ -0,0 +1,361 @@ +# @evmts/core + +## 0.11.2 + +### Patch Changes + +- Updated dependencies [[`f3b2b21`](https://github.com/evmts/evmts-monorepo/commit/f3b2b2184aad4dbefd1c840bae72dcf9aff4a1fc)]: + - @evmts/core@0.11.2 + +## 0.10.0 + +### Patch Changes + +- [#469](https://github.com/evmts/evmts-monorepo/pull/469) [`dbc2da6`](https://github.com/evmts/evmts-monorepo/commit/dbc2da6092eae3a7ec2d2519ea8c04505aa911f6) Thanks [@roninjin10](https://github.com/roninjin10)! - Made @evmts/config loading async + +- [#466](https://github.com/evmts/evmts-monorepo/pull/466) [`1c4cbd2`](https://github.com/evmts/evmts-monorepo/commit/1c4cbd2b87abd1c2174fb0d2e7a684367e074440) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated @evmts/bundler to take a fileAccessObject as a parameter + + ### Context + + @evmts/bundler is the internal bundler for all other bundlers and the language server. We changed it to take fileAccessObject as a parameter instead of using `fs` and `fs/promises` + + ### Impact + + By taking in a file-access-object instead of using `fs` we can implement important features. + + - the ability to use virtual files in the typescript lsp before the user saves the file. + - the ability to use more peformant bun file read methods + +- [#468](https://github.com/evmts/evmts-monorepo/pull/468) [`e99fcd0`](https://github.com/evmts/evmts-monorepo/commit/e99fcd09e530a58fddb0d3fa19be0f5439e74f30) Thanks [@roninjin10](https://github.com/roninjin10)! - Improved peformance of bundler via enabling async mode + + Previously all bundlers including the Bun bundler ran with syncronous IO such as readFileSync. With the introduction of async mode the bundler now is more non blocking when it is bundling now. Solc is still syncronous but all IO is now async. + + @evmts/bundler now takes a File-Access-Object as a param. This FileAccessObject is the same shape as `node:fs` module. Bun uses this generic interace to use native Bun file access. + +- [#475](https://github.com/evmts/evmts-monorepo/pull/475) [`cb83c0c`](https://github.com/evmts/evmts-monorepo/commit/cb83c0c81fae63decd7bbdb79b9c3cce2c7e0b8e) Thanks [@roninjin10](https://github.com/roninjin10)! - Added snapshot test of vite bundler build outputs + +- Updated dependencies [[`dbc2da6`](https://github.com/evmts/evmts-monorepo/commit/dbc2da6092eae3a7ec2d2519ea8c04505aa911f6), [`cb83c0c`](https://github.com/evmts/evmts-monorepo/commit/cb83c0c81fae63decd7bbdb79b9c3cce2c7e0b8e)]: + - @evmts/config@0.10.0 + - @evmts/core@0.10.0 + +## 0.9.0 + +### Patch Changes + +- Updated dependencies [[`1f80589`](https://github.com/evmts/evmts-monorepo/commit/1f8058969e2b0290f5032166928f76cfc74e9d74)]: + - @evmts/config@0.9.0 + +## 0.8.1 + +### Patch Changes + +- [#453](https://github.com/evmts/evmts-monorepo/pull/453) [`c23302a`](https://github.com/evmts/evmts-monorepo/commit/c23302a9623a968917df19de8dfa2c56b4612712) Thanks [@roninjin10](https://github.com/roninjin10)! - Started publishing every commit to main so all EVMts changes can be used early. To use the latest main branch release install with `@main` tag. e.g. `npm install @evmts/ts-plugin@main` + +- Updated dependencies [[`c23302a`](https://github.com/evmts/evmts-monorepo/commit/c23302a9623a968917df19de8dfa2c56b4612712), [`ae772ac`](https://github.com/evmts/evmts-monorepo/commit/ae772ac62ad16d19c48b82dfd005458bf27200fe)]: + - @evmts/config@0.8.1 + - @evmts/core@0.8.1 + - @evmts/tsconfig@0.8.1 + +## 0.8.0 + +### Minor Changes + +- [#439](https://github.com/evmts/evmts-monorepo/pull/439) [`91e43e9`](https://github.com/evmts/evmts-monorepo/commit/91e43e952a440f037d52146511ed2508d289874e) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for natspec comments showing up in EVMts contracts LSP and bundled code. Now when you hover over an EVMts contract any natspec comments will be available as jsdoc comments. + + This support is limited based on what [solc](https://docs.soliditylang.org/en/v0.8.17/using-the-compiler.html) supports. In future more robust natspec parsing is expected to be added via [soldity-ast](Add function to parse NatSpec) + ![image](https://github.com/evmts/evmts-monorepo/assets/35039927/da3b2c70-f16d-4f47-9de8-c05b4442193f) + +- [#438](https://github.com/evmts/evmts-monorepo/pull/438) [`eedb7e0`](https://github.com/evmts/evmts-monorepo/commit/eedb7e0e8f853acf59c3f86c1d7317bad8ee7e2b) Thanks [@roninjin10](https://github.com/roninjin10)! - Improve peformance by 98% (5x) testing against 101 simple NFT contract imports + + Major change: remove bytecode from EVMts. Needing the bytecode is a niche use case and removing it improves peformance of the compiler significantly. In future bytecode will be brought back as an optional prop + + This improves peformance by 98% (50x) testing against 101 simple NFT contract imports + + Because EVMts is still considered in alpha this will not cause a major semver bump + +- [#440](https://github.com/evmts/evmts-monorepo/pull/440) [`8cceec7`](https://github.com/evmts/evmts-monorepo/commit/8cceec7409a5fc0e72168a10821a64203ba374ab) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for resolving an AST. + Passing in an optional flag to the bundler will return an ast along with comments and abi. By default it's turned off. This AST will be usable in future prs to implement advanced langauge features like goToDefinition + + To work with the AST we add [solidity-ast](https://github.com/OpenZeppelin/solidity-ast) from open-zeppelin. + +- [#444](https://github.com/evmts/evmts-monorepo/pull/444) [`793798e`](https://github.com/evmts/evmts-monorepo/commit/793798ec3782e4081840bcd77242104c9546e70c) Thanks [@roninjin10](https://github.com/roninjin10)! - Added solcInput and solcOutput to return objects for bundler. + + Now in addition to the compiled code and the modules solcInput and solcOutput are also added along with the recently added asts property + + ![image](https://github.com/evmts/evmts-monorepo/assets/35039927/57277b41-195c-4c54-ab70-a4e1ef3fceaa) + + This will be used internally to implement go-to-definition LSP support to [@evmts/ts-plugin](https://github.com/evmts/evmts-monorepo/tree/main/ts-plugin) + +### Patch Changes + +- [#436](https://github.com/evmts/evmts-monorepo/pull/436) [`e1903df`](https://github.com/evmts/evmts-monorepo/commit/e1903df625c54b2447ce2bc2318f4c74f9a02bb5) Thanks [@roninjin10](https://github.com/roninjin10)! - Internal change: Made usage of solc typesafe + + This change adds new solc types to the [solc](https://github.com/ethereum/solc-bin) peer dependency used by EVMts. This is used by @evmts/bundler to + + - includes type for SolcInputSources and outputsources + + ![image](https://github.com/evmts/evmts-monorepo/assets/35039927/1ee13b76-98ab-4f62-9266-6e4a972de223) + + These types were adapted from [solc documentation](https://docs.soliditylang.org/en/v0.8.17/using-the-compiler.html#compiler-input-and-output-json-description) + + Shout out @o-az who kicked off this improvement in #435 + +- [#442](https://github.com/evmts/evmts-monorepo/pull/442) [`b020298`](https://github.com/evmts/evmts-monorepo/commit/b020298f1acbfad396b0c1c9a1618e00bc750a43) Thanks [@roninjin10](https://github.com/roninjin10)! - ⬆️ Upgraded all npm packages to latest + Every package in EVMts is consistently updated to it's latest version using `pnpm up --latest` +- Updated dependencies [[`eedb7e0`](https://github.com/evmts/evmts-monorepo/commit/eedb7e0e8f853acf59c3f86c1d7317bad8ee7e2b), [`b020298`](https://github.com/evmts/evmts-monorepo/commit/b020298f1acbfad396b0c1c9a1618e00bc750a43)]: + - @evmts/core@0.8.0 + - @evmts/config@0.8.0 + +## 0.7.1 + +### Patch Changes + +- Updated dependencies [[`eb6ec5d`](https://github.com/evmts/evmts-monorepo/commit/eb6ec5dff13c51baa09f0019fb8b1b94a41108cb)]: + - @evmts/tsconfig@0.7.1 + - @evmts/config@0.7.0 + - @evmts/core@0.6.0 + +## 0.7.0 + +### Minor Changes + +- [#419](https://github.com/evmts/evmts-monorepo/pull/419) [`644e8fd`](https://github.com/evmts/evmts-monorepo/commit/644e8fda95d2824c9145f8d6278cbdb6272b0609) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for monorepo imports and node_module imports + + Previously, these use cases would fail because @evmts/core was not in scope. EVMts injects a module that uses the `@evmts/core` package to create the contract objects at runtime. These packages are installed to the users node_modules and thus were not in scope for sub dependencies and other workspaces. @evmts/core now handles this via always importing @evmts/core from the users main workspace. This feature enables 2 use cases. + + ## Use case 1 - Importing from Node Modules + + A solid way to use EVMts is to install a package that has contracts in it and import the contract from node module + + ``` + import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + import { viemPublicClient, Address } from './publicClient' + + const balanceOf = (address: Address) => viemPublicClient.readContract(ERC20.balanceOf( + ``` + + ## Use case 2 - Importing from PNPM monorepos + + Devs commonly use monorepo tools such as npm workspaces, yarn workspaces, or pnpm workspaces. Previously these tools failed to work correctly but are now supported. + +### Patch Changes + +- [#411](https://github.com/evmts/evmts-monorepo/pull/411) [`8dbc952`](https://github.com/evmts/evmts-monorepo/commit/8dbc952d2dc2ca97e89bad55b162056d4f6b31a6) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed a bug with stack too deep error. + + Error happens when recursive contract imports (e.g. contract a imports contract b which imports contract c etc.) go over the total amount of stack frames allowed by JS. When this happens the process would fail with a "stack too deep error". + +- [#408](https://github.com/evmts/evmts-monorepo/pull/408) [`d7e6158`](https://github.com/evmts/evmts-monorepo/commit/d7e61583dc1529569de92868ffe49d75c045dc1f) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with using '.' instead of process.cwd() + + This bug was unlikely to affect users and mostly a stylistic problem + +- [#402](https://github.com/evmts/evmts-monorepo/pull/402) [`4f532eb`](https://github.com/evmts/evmts-monorepo/commit/4f532ebab51004603b1a41f956729fec4a3dbd2d) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed version of plugin defaulting to 0.0.0 instead of the package.json version + + Previously the version of all evmts-plugins were hardcoded to 0.0.0. Now they will correctly show the correct version. + +- [#416](https://github.com/evmts/evmts-monorepo/pull/416) [`fc28f54`](https://github.com/evmts/evmts-monorepo/commit/fc28f545635a23a76e4acce0ff48d0902eed484c) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed another stack too deep bug from a recursive function in bundler + + - A previous fix fixed a stack too deep error but another one was discovered. + - Fixed via refactoring a recursive internal function to iterative. + - This bug affected projects importing solidity that imports other solidity deep enough to make the stack too deep + +- Updated dependencies [[`8f11961`](https://github.com/evmts/evmts-monorepo/commit/8f11961f6b3ebc5882a1e5403d3726df7ddee0d4), [`fa7555a`](https://github.com/evmts/evmts-monorepo/commit/fa7555a8b0bac268f5297544422c516dae4c5511), [`c71cd30`](https://github.com/evmts/evmts-monorepo/commit/c71cd30818b311c95852a720c170ef18915b750f)]: + - @evmts/config@0.7.0 + +## 0.6.0 + +### Minor Changes + +- [#372](https://github.com/evmts/evmts-monorepo/pull/372) [`0a87d1a`](https://github.com/evmts/evmts-monorepo/commit/0a87d1a290e6cdd6902d6c1c84ea56d8bc227c45) Thanks [@roninjin10](https://github.com/roninjin10)! - Generalize and export module creators that create .d.ts .ts .cjs and .mjs modules from abis. These were previously private. + +### Patch Changes + +- [#378](https://github.com/evmts/evmts-monorepo/pull/378) [`97d7aec`](https://github.com/evmts/evmts-monorepo/commit/97d7aec9844b370129b9c46ab8c19fe9d13880ec) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed type bug of config being falsely marked as required + +- [#379](https://github.com/evmts/evmts-monorepo/pull/379) [`0ff53e7`](https://github.com/evmts/evmts-monorepo/commit/0ff53e71ff792ed4df1fa180f5a72dd5d65f4142) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated build pipeline to generate .d.ts files + +- [#370](https://github.com/evmts/evmts-monorepo/pull/370) [`58862a6`](https://github.com/evmts/evmts-monorepo/commit/58862a6ebe6ec1e04961dbc2da6e846a02ef0692) Thanks [@roninjin10](https://github.com/roninjin10)! - Added 100% test coverage to bundler + +- Updated dependencies [[`6da3fe7`](https://github.com/evmts/evmts-monorepo/commit/6da3fe7fdec9bc2e4d35fc0558b79c65a105a516), [`6de12df`](https://github.com/evmts/evmts-monorepo/commit/6de12df39cf9da0635c246c685036e83a8e97255), [`0ff53e7`](https://github.com/evmts/evmts-monorepo/commit/0ff53e71ff792ed4df1fa180f5a72dd5d65f4142), [`e24901a`](https://github.com/evmts/evmts-monorepo/commit/e24901a7b503354af6174bac81a868a8598f143b), [`3a2dfae`](https://github.com/evmts/evmts-monorepo/commit/3a2dfae3a38ca7052b57b57e5c95a952a7f0be71), [`6dd223b`](https://github.com/evmts/evmts-monorepo/commit/6dd223b0b625bd7dcbea7537f053b32457761955), [`6da3fe7`](https://github.com/evmts/evmts-monorepo/commit/6da3fe7fdec9bc2e4d35fc0558b79c65a105a516)]: + - @evmts/core@0.6.0 + - @evmts/config@0.6.0 + +## 0.5.7 + +### Patch Changes + +- [#361](https://github.com/evmts/evmts-monorepo/pull/361) [`4fc4872`](https://github.com/evmts/evmts-monorepo/commit/4fc48722380d4390ef527ccbb27a63f73503c750) Thanks [@roninjin10](https://github.com/roninjin10)! - Added warning when solc version does not match config + +- [#353](https://github.com/evmts/evmts-monorepo/pull/353) [`97cb0c1`](https://github.com/evmts/evmts-monorepo/commit/97cb0c1381f3a0b3ffa92dfcb09c397cff3190dd) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with exporting private variables in .d.ts + +- [#351](https://github.com/evmts/evmts-monorepo/pull/351) [`ca58f7a`](https://github.com/evmts/evmts-monorepo/commit/ca58f7a66b01a68d93585d664a77a43f67ce5bbc) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for reload when any contract in the import graph changes + +## 0.5.6 + +### Patch Changes + +- [#345](https://github.com/evmts/evmts-monorepo/pull/345) [`31186f7`](https://github.com/evmts/evmts-monorepo/commit/31186f749ce5cd3c6e0ca4d4885975aa74512c45) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed typo breaking TS language server + +- [#346](https://github.com/evmts/evmts-monorepo/pull/346) [`6d9365d`](https://github.com/evmts/evmts-monorepo/commit/6d9365db3ab197ea4ad53f777d755ee3ad562b21) Thanks [@roninjin10](https://github.com/roninjin10)! - Change naming to Evmts from EVMts + +- Updated dependencies [[`6d9365d`](https://github.com/evmts/evmts-monorepo/commit/6d9365db3ab197ea4ad53f777d755ee3ad562b21)]: + - @evmts/config@0.5.6 + - @evmts/core@0.5.6 + +## 0.5.5 + +### Patch Changes + +- [#343](https://github.com/evmts/evmts-monorepo/pull/343) [`bec7e33`](https://github.com/evmts/evmts-monorepo/commit/bec7e3303e8b241213804c42f6673a38dc7a954c) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with generated .d.ts file name param + +## 0.5.4 + +### Patch Changes + +- [#339](https://github.com/evmts/evmts-monorepo/pull/339) [`c9dec08`](https://github.com/evmts/evmts-monorepo/commit/c9dec084df5c5a9999a8f917405a15b11a004c02) Thanks [@roninjin10](https://github.com/roninjin10)! - Upgraded all dependencies + +- Updated dependencies [[`0116537`](https://github.com/evmts/evmts-monorepo/commit/0116537d3423c8decfd0adaf490d37d33f8a540f), [`2b8b5ed`](https://github.com/evmts/evmts-monorepo/commit/2b8b5ed9852c32e15a7466f00f4ca9c0458cfeef)]: + - @evmts/config@0.5.4 + - @evmts/core@0.5.4 + +## 0.5.3 + +### Patch Changes + +- Updated dependencies [[`2dc1950`](https://github.com/evmts/evmts-monorepo/commit/2dc19507c9d957948dcff8f65a359fc25b0ceb10)]: + - @evmts/core@0.5.3 + +## 0.5.2 + +### Patch Changes + +- Updated dependencies [[`cdbe2b1`](https://github.com/evmts/evmts-monorepo/commit/cdbe2b14d3a9b40ea37898829bc982b5e76e3c4c)]: + - @evmts/core@0.5.2 + +## 0.5.1 + +### Patch Changes + +- Updated dependencies [[`cec44b5`](https://github.com/evmts/evmts-monorepo/commit/cec44b5042bc76c21a9b695383714642c2b44da6)]: + - @evmts/core@0.5.1 + +## 0.5.0 + +### Minor Changes + +- [#283](https://github.com/evmts/evmts-monorepo/pull/283) [`05a8efe`](https://github.com/evmts/evmts-monorepo/commit/05a8efede4acad157e3820bdba24d92f598699e5) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated config schema to support etherscan + - Solc version is now listed under `compiler.solcVersion` instead of `solc` + - Foundry projects are now listed under `compiler.foundryProject` instead of `forge` + - Local contracts are now specified under `localContracts.contracts` instead of `deployments` + - New external option (unimplemented) `externalContracts` which is used to specifify contracts imported from etherscan in the next release + +### Patch Changes + +- [#298](https://github.com/evmts/evmts-monorepo/pull/298) [`841d6a8`](https://github.com/evmts/evmts-monorepo/commit/841d6a89f4995e4f666902d27cb7dbfc3efd77e5) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with etherscan links showing as undefined if they didn't exist + +- [#301](https://github.com/evmts/evmts-monorepo/pull/301) [`83bf23b`](https://github.com/evmts/evmts-monorepo/commit/83bf23b0cb2eb5860f9dfb63a773541e48c62abc) Thanks [@roninjin10](https://github.com/roninjin10)! - Upgraded all dependencies + +- Updated dependencies [[`700b3d0`](https://github.com/evmts/evmts-monorepo/commit/700b3d0907df243b29e96b1b3246b8c75cfb9900), [`720bfdb`](https://github.com/evmts/evmts-monorepo/commit/720bfdba790699e388c5ec1c68630b9f0f077158), [`05a8efe`](https://github.com/evmts/evmts-monorepo/commit/05a8efede4acad157e3820bdba24d92f598699e5), [`85c340d`](https://github.com/evmts/evmts-monorepo/commit/85c340dc4a63afdbc6bd92fb4b2cf3fe0ffdc6e7), [`0bd5b45`](https://github.com/evmts/evmts-monorepo/commit/0bd5b4511e292380a7ac87a898d22dbd32df9e35), [`720bfdb`](https://github.com/evmts/evmts-monorepo/commit/720bfdba790699e388c5ec1c68630b9f0f077158), [`2ab7c02`](https://github.com/evmts/evmts-monorepo/commit/2ab7c022520fe3c03f337d51dc0f7875830492f1)]: + - @evmts/config@0.5.0 + - @evmts/core@0.5.0 + +## 0.4.2 + +### Patch Changes + +- [#279](https://github.com/evmts/evmts-monorepo/pull/279) [`fd6b482`](https://github.com/evmts/evmts-monorepo/commit/fd6b4825417fa81d601e9a3c5078131bc1f816c0) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed source file does not exist warning in @evmts/bundler + +## 0.4.1 + +### Patch Changes + +- Updated dependencies [[`2a89e13`](https://github.com/evmts/evmts-monorepo/commit/2a89e136d8dfcd997ae5ff227a96de4702dfbe19)]: + - @evmts/config@0.2.1 + +## 0.4.0 + +### Minor Changes + +- [#268](https://github.com/evmts/evmts-monorepo/pull/268) [`a37844f`](https://github.com/evmts/evmts-monorepo/commit/a37844faa425d1eaca112b9a09640b7ec7e288de) Thanks [@roninjin10](https://github.com/roninjin10)! - Added support for detecting foundry.toml and remappings as tsconfig option. Set forge: true in plugin tsconfig options or forge: '/path/to/binary/forge' for a custom forge binary + +### Patch Changes + +- Updated dependencies [[`1f6919c`](https://github.com/evmts/evmts-monorepo/commit/1f6919cfc54648499129d3642ddbb64568b1e798), [`a37844f`](https://github.com/evmts/evmts-monorepo/commit/a37844faa425d1eaca112b9a09640b7ec7e288de)]: + - @evmts/core@0.3.1 + - @evmts/config@0.2.0 + +## 0.3.0 + +### Minor Changes + +- [#259](https://github.com/evmts/evmts-monorepo/pull/259) [`7ad7463`](https://github.com/evmts/evmts-monorepo/commit/7ad746347d3e127f001abdc28fff2a10c1ffed65) Thanks [@roninjin10](https://github.com/roninjin10)! - Added bytecode to Evmts contracts + +### Patch Changes + +- [#258](https://github.com/evmts/evmts-monorepo/pull/258) [`9a9b963`](https://github.com/evmts/evmts-monorepo/commit/9a9b96327cd2f8415cf09a471a7589fa3df90394) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed bug with handling overloaded functions + +- Updated dependencies [[`7ad7463`](https://github.com/evmts/evmts-monorepo/commit/7ad746347d3e127f001abdc28fff2a10c1ffed65), [`9a9b963`](https://github.com/evmts/evmts-monorepo/commit/9a9b96327cd2f8415cf09a471a7589fa3df90394)]: + - @evmts/core@0.3.0 + +## 0.2.0 + +### Minor Changes + +- [#252](https://github.com/evmts/evmts-monorepo/pull/252) [`4b361ea`](https://github.com/evmts/evmts-monorepo/commit/4b361ea43fb34541bee4f75c8bea9d93543b1813) Thanks [@roninjin10](https://github.com/roninjin10)! - Changed Evmts configuration to be purely from tsconfig + +### Patch Changes + +- [#251](https://github.com/evmts/evmts-monorepo/pull/251) [`52732a1`](https://github.com/evmts/evmts-monorepo/commit/52732a1bcd59faa7970e5298d1e71a61c687fd67) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed missing src folder in npm packages + +- Updated dependencies [[`52732a1`](https://github.com/evmts/evmts-monorepo/commit/52732a1bcd59faa7970e5298d1e71a61c687fd67), [`4b361ea`](https://github.com/evmts/evmts-monorepo/commit/4b361ea43fb34541bee4f75c8bea9d93543b1813)]: + - @evmts/config@0.1.0 + - @evmts/core@0.2.0 + +## 0.1.0 + +### Minor Changes + +- [#249](https://github.com/evmts/evmts-monorepo/pull/249) [`fda2523`](https://github.com/evmts/evmts-monorepo/commit/fda25237cea8a4e94fc6dc043174810ae441fb8e) Thanks [@roninjin10](https://github.com/roninjin10)! - Added etherscan links for most major EVM networks + +### Patch Changes + +- [#247](https://github.com/evmts/evmts-monorepo/pull/247) [`f7ba6e5`](https://github.com/evmts/evmts-monorepo/commit/f7ba6e5546263d7a94baf50ca1010a2b505580e0) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed incorrect peer dependency configuation for solc + +## 0.0.3 + +### Patch Changes + +- Updated dependencies [[`ab40941`](https://github.com/evmts/evmts-monorepo/commit/ab40941221c4edacce16659ef88bdfdb90c325bb), [`058d904`](https://github.com/evmts/evmts-monorepo/commit/058d90474598ea790d4de9fd8501381a77edbcb6)]: + - @evmts/core@0.1.2 + +## 0.0.2 + +### Patch Changes + +- Updated dependencies []: + - @evmts/core@0.1.1 + +## 0.0.1 + +### Patch Changes + +- [`2a31d64`](https://github.com/evmts/evmts-monorepo/commit/2a31d640b61a3e3eda63e0ca0442104ea27bfaec) - Init new changesets + +- Updated dependencies [[`e21f2f4`](https://github.com/evmts/evmts-monorepo/commit/e21f2f4fbdafc7d6d859f513afa319b9812826f0), [`88ec554`](https://github.com/evmts/evmts-monorepo/commit/88ec554a592d29aaba0a0d69ec61fd75118e817c), [`877c137`](https://github.com/evmts/evmts-monorepo/commit/877c137dfbe8a143099ddb0656236c35bceb2f87), [`2a31d64`](https://github.com/evmts/evmts-monorepo/commit/2a31d640b61a3e3eda63e0ca0442104ea27bfaec)]: + - @evmts/core@0.1.0 + - @evmts/config@0.0.1 + +## 0.0.1-next.0 + +### Patch Changes + +- [`2a31d64`](https://github.com/evmts/evmts-monorepo/commit/2a31d640b61a3e3eda63e0ca0442104ea27bfaec) - Init new changesets + +- Updated dependencies [[`2a31d64`](https://github.com/evmts/evmts-monorepo/commit/2a31d640b61a3e3eda63e0ca0442104ea27bfaec)]: + - @evmts/config@0.0.1-next.0 + - @evmts/core@0.0.4-next.0 + +## 0.0.2 + +### Patch Changes + +- Release working proof of concept diff --git a/solc/LICENSE b/solc/LICENSE new file mode 100644 index 0000000000..b5a4fa7a69 --- /dev/null +++ b/solc/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright 2020-2022 + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/solc/README.md b/solc/README.md new file mode 100644 index 0000000000..29329686eb --- /dev/null +++ b/solc/README.md @@ -0,0 +1,29 @@ +

+ + + + wagmi logo + + +

+ +

+ Execute solidity scripts in browser +

+ +[![CI](https://github.com/evmts/evmts-monorepo/actions/workflows/e2e.yml/badge.svg)](https://github.com/evmts/evmts-monorepo/actions/workflows/e2e.yml) +[![CI](https://github.com/evmts/evmts-monorepo/actions/workflows/unit.yml/badge.svg)](https://github.com/evmts/evmts-monorepo/actions/workflows/unit.yml) + + + + + + + +# @evmts/solc + +Utils built around solc + +## License 📄 + + diff --git a/solc/TestContract.d.ts b/solc/TestContract.d.ts new file mode 100644 index 0000000000..274c219ce6 --- /dev/null +++ b/solc/TestContract.d.ts @@ -0,0 +1,129 @@ +import { EvmtsContract } from '@evmts/core' +const _abiTestContract = [ + { + constant: true, + inputs: [], + name: 'name', + outputs: [{ name: '', type: 'string' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { name: '_spender', type: 'address' }, + { name: '_value', type: 'uint256' }, + ], + name: 'approve', + outputs: [{ name: '', type: 'bool' }], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'totalSupply', + outputs: [{ name: '', type: 'uint256' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { name: '_from', type: 'address' }, + { name: '_to', type: 'address' }, + { name: '_value', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [{ name: '', type: 'bool' }], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'decimals', + outputs: [{ name: '', type: 'uint8' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [{ name: '_owner', type: 'address' }], + name: 'balanceOf', + outputs: [{ name: 'balance', type: 'uint256' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'symbol', + outputs: [{ name: '', type: 'string' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { name: '_to', type: 'address' }, + { name: '_value', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ name: '', type: 'bool' }], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [ + { name: '_owner', type: 'address' }, + { name: '_spender', type: 'address' }, + ], + name: 'allowance', + outputs: [{ name: '', type: 'uint256' }], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { payable: true, stateMutability: 'payable', type: 'fallback' }, + { + anonymous: false, + inputs: [ + { indexed: true, name: 'owner', type: 'address' }, + { indexed: true, name: 'spender', type: 'address' }, + { indexed: false, name: 'value', type: 'uint256' }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, name: 'from', type: 'address' }, + { indexed: true, name: 'to', type: 'address' }, + { indexed: false, name: 'value', type: 'uint256' }, + ], + name: 'Transfer', + type: 'event', + }, +] as const +const _chainAddressMapTestContract = { '10': '0x123' } as const +const _nameTestContract = 'TestContract' as const +/** + * TestContract EvmtsContract + * @etherscan-10 https://optimistic.etherscan.io/address/0x123 + */ +export const TestContract: EvmtsContract< + typeof _nameTestContract, + typeof _chainAddressMapTestContract, + typeof _abiTestContract +> diff --git a/solc/package.json b/solc/package.json new file mode 100644 index 0000000000..9c77c4d20e --- /dev/null +++ b/solc/package.json @@ -0,0 +1,90 @@ +{ + "name": "@evmts/solc", + "version": "0.11.2", + "private": false, + "description": "Utilities around solc", + "keywords": [ + "solidity", + "forge", + "foundry", + "sol", + "typescript", + "web3", + "blockchain" + ], + "repository": { + "type": "git", + "url": "https://github.com/evmts/evmts-monorepo.git", + "directory": "solc" + }, + "license": "MIT", + "contributors": [ + "Will Cory " + ], + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": "./src/index.js", + "require": "./dist/index.cjs", + "types": "./types/src/index.d.ts", + "default": "./dist/index.cjs" + } + }, + "main": "dist/index.cjs", + "module": "src/index.js", + "types": "types/src/index.d.ts", + "files": [ + "dist", + "types", + "src" + ], + "scripts": { + "all": "bun i && bun run build && bun run lint && bun run lint:check && bun run format:check && bun run format && bun run test:coverage && bun run generate:docs", + "build": "nx run-many --targets=build:dist,build:types --projects=@evmts/solc ", + "build:dist": "bun run tsup", + "build:types": "bun run tsc --emitDeclarationOnly", + "clean": "rm -rf node_modules && rm -rf artifacts && rm -rf dist && rm -rf cache", + "format": "rome format . --write", + "format:check": "rome format .", + "generate:docs": "bun run typedoc", + "lint": "rome check . --apply-unsafe", + "lint:check": "rome check . --verbose", + "test": "vitest --coverage", + "test:coverage": "vitest run --coverage", + "test:run": "vitest run", + "test:ui": "vitest --ui" + }, + "dependencies": { + "@evmts/config": "workspace:^", + "@evmts/tsconfig": "workspace:^", + "@types/node": "^20.7.2", + "@types/resolve": "^1.20.3", + "effect": "2.0.0-next.50", + "glob": "^10.3.10", + "resolve": "^1.22.6", + "solidity-ast": "^0.4.52", + "unplugin": "^1.5.0" + }, + "devDependencies": { + "@evmts/core": "workspace:^", + "@vitest/coverage-v8": "^0.34.6", + "@vitest/ui": "^0.34.6", + "abitype": "^0.9.8", + "rome": "^12.1.3", + "solc": "0.8.21", + "tsup": "^7.2.0", + "typedoc": "^0.25.2", + "typedoc-plugin-markdown": "^3.16.0", + "typescript": "^5.2.2", + "vitest": "^0.34.6", + "wagmi": "^1.4.2", + "zod": "^3.22.2" + }, + "peerDependencies": { + "solc": ">0.8.10" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/solc/rome.json b/solc/rome.json new file mode 100644 index 0000000000..a63fed5a70 --- /dev/null +++ b/solc/rome.json @@ -0,0 +1,35 @@ +{ + "organizeImports": { + "enabled": true + }, + "files": { + "ignore": ["coverage", "node_modules", "dist", "artifacts", "types"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "tab", + "indentSize": 2, + "lineWidth": 80 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "performance": { + "noDelete": "off" + }, + "suspicious": { + "noArrayIndexKey": "off", + "noExplicitAny": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "trailingComma": "all", + "semicolons": "asNeeded" + } + } +} diff --git a/solc/source.ts b/solc/source.ts new file mode 100644 index 0000000000..77166d7eee --- /dev/null +++ b/solc/source.ts @@ -0,0 +1,31 @@ +import { TestContract } from './TestContract.js' +import { Address, useAccount, useContractRead } from 'wagmi' + +export const WagmiReads = () => { + const { address, isConnected } = useAccount() + + const { data: balance } = useContractRead({ + /** + * Spreading in a method will spread abi, address and args + * Hover over balanceOf and click go-to-definition should take you to the method definition in solidity if compiling from solidity + */ + ...TestContract.read().balanceOf(address as Address), + enabled: isConnected, + }) + const { data: totalSupply } = useContractRead({ + ...TestContract.read().totalSupply(), + enabled: isConnected, + }) + const { data: symbol } = useContractRead({ + ...TestContract.read().symbol(), + enabled: isConnected, + }) + const testBalance: bigint | undefined = balance + const testSymbol: string | undefined = symbol + const testTotalSupply: bigint | undefined = totalSupply + return { + testBalance, + symbol, + totalSupply, + } +} diff --git a/bundlers/bundler/src/solc/compileContracts.js b/solc/src/compiler/compileContracts.js similarity index 86% rename from bundlers/bundler/src/solc/compileContracts.js rename to solc/src/compiler/compileContracts.js index 3b3209c28f..d50fc9f3ef 100644 --- a/bundlers/bundler/src/solc/compileContracts.js +++ b/solc/src/compiler/compileContracts.js @@ -1,6 +1,6 @@ +import { moduleFactory } from '../importResolution/moduleFactory.js' +import { solcCompile } from '../solc.js' import { invariant, resolveEffect } from '../utils/index.js' -import { moduleFactory } from './moduleFactory.js' -import { solcCompile } from './solc.js' import { Effect } from 'effect' /** @@ -13,7 +13,6 @@ import { Effect } from 'effect' * @param {TIncludeAsts} includeAst * @param {import('../types.js').FileAccessObject} fao * @param {import('../types.js').Logger} logger - * @param {import('../createCache.js').Cache} [cache] * @returns {Promise>} * @example * const { artifacts, modules } = await compileContract( @@ -23,7 +22,6 @@ import { Effect } from 'effect' * true, * await import('fs'), * logger, - * cache, * ) */ export const compileContract = async ( @@ -33,7 +31,6 @@ export const compileContract = async ( includeAst, fao, logger, - cache, ) => { const entryModule = await moduleFactory( filePath, @@ -83,7 +80,7 @@ export const compileContract = async ( const emptyString = '' /** - * @type {import('./solcTypes.js').SolcInputDescription} + * @type {import('../solcTypes.js').SolcInputDescription} */ const input = { language: 'Solidity', @@ -99,13 +96,9 @@ export const compileContract = async ( } /** - * @type {import('./solcTypes.js').SolcOutput} + * @type {import('../solcTypes.js').SolcOutput} */ - const output = cache?.isCached(entryModule.id, sources) - ? cache.read(entryModule.id) - : solcCompile(input) - - cache?.write(entryModule.id, output) + const output = solcCompile(input) const warnings = output?.errors?.filter(({ type }) => type === 'Warning') const isErrors = (output?.errors?.length ?? 0) > (warnings?.length ?? 0) diff --git a/bundlers/bundler/src/solc/compileContracts.spec.ts b/solc/src/compiler/compileContracts.spec.ts similarity index 86% rename from bundlers/bundler/src/solc/compileContracts.spec.ts rename to solc/src/compiler/compileContracts.spec.ts index 8a6f33536b..9361ef88ec 100644 --- a/bundlers/bundler/src/solc/compileContracts.spec.ts +++ b/solc/src/compiler/compileContracts.spec.ts @@ -1,12 +1,11 @@ -import { createCache } from '../createCache.js' +import { solcCompile } from '../solc.js' import type { ModuleInfo } from '../types.js' import { compileContract } from './compileContracts.js' -import { solcCompile } from './solc.js' import resolve from 'resolve' import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest' vi.mock('resolve') -vi.mock('./solc.js') +vi.mock('../solc.js') describe('compileContract', () => { const mockFilePath = 'mockFilePath' @@ -356,66 +355,4 @@ describe('compileContract', () => { } `) }) - - it('should read from cache if cache exists', async () => { - const mockCache = createCache(mockLogger) - - await compileContract( - mockFilePath, - mockBaseDir, - mockConfig as any, - false, - mockFao as any, - mockLogger, - mockCache, - ) - - expect(mockCache.read(mockFilePath)).toEqual({ - contracts: { - [mockFilePath]: { mockContract: {} }, - }, - sources: { - [mockFilePath]: { ast: { mockAst: {} } }, - }, - errors: [], - }) - - mockCache.isCached = () => true - - await compileContract( - mockFilePath, - mockBaseDir, - mockConfig as any, - false, - mockFao as any, - mockLogger, - mockCache, - ) - - expect(mockSolcCompile).toHaveBeenCalledOnce() - }) - - it('should save to cache on successful compilation', async () => { - const mockCache = createCache(mockLogger) - - await compileContract( - mockFilePath, - mockBaseDir, - mockConfig as any, - false, - mockFao as any, - mockLogger, - mockCache, - ) - - expect(mockCache.read(mockFilePath)).toEqual({ - contracts: { - [mockFilePath]: { mockContract: {} }, - }, - sources: { - [mockFilePath]: { ast: { mockAst: {} } }, - }, - errors: [], - }) - }) }) diff --git a/bundlers/bundler/src/solc/compileContractsSync.js b/solc/src/compiler/compileContractsSync.js similarity index 85% rename from bundlers/bundler/src/solc/compileContractsSync.js rename to solc/src/compiler/compileContractsSync.js index f582ea57aa..9753aaf7fb 100644 --- a/bundlers/bundler/src/solc/compileContractsSync.js +++ b/solc/src/compiler/compileContractsSync.js @@ -1,6 +1,6 @@ +import { moduleFactorySync } from '../importResolution/moduleFactorySync.js' +import * as solc from '../solc.js' import { invariant } from '../utils/invariant.js' -import { moduleFactorySync } from './moduleFactorySync.js' -import * as solc from './solc.js' import resolve from 'resolve' /** @@ -13,7 +13,6 @@ import resolve from 'resolve' * @param {TIncludeAsts} includeAst * @param {import('../types.js').FileAccessObject} fao * @param {import('../types.js').Logger} logger - * @param {import('../createCache.js').Cache} [cache] * @returns {import('../types.js').CompiledContracts} * @example * const { artifacts, modules } = compileContractSync( @@ -23,7 +22,6 @@ import resolve from 'resolve' * true, * await import('fs'), * logger, - * cache, * ) */ export function compileContractSync( @@ -33,7 +31,6 @@ export function compileContractSync( includeAst, fao, logger, - cache, ) { const entryModule = moduleFactorySync( filePath, @@ -76,7 +73,7 @@ export function compileContractSync( ) /** - * @type {import('./solcTypes.js').SolcInputDescription} + * @type {import('../solcTypes.js').SolcInputDescription} */ const solcInput = { language: 'Solidity', @@ -91,13 +88,9 @@ export function compileContractSync( }, } /** - * @type {import('./solcTypes.js').SolcOutput} + * @type {import('../solcTypes.js').SolcOutput} */ - const solcOutput = cache?.isCached(entryModule.id, sources) - ? cache.read(entryModule.id) - : solc.solcCompile(solcInput) - - cache?.write(entryModule.id, solcOutput) + const solcOutput = solc.solcCompile(solcInput) const warnings = solcOutput?.errors?.filter(({ type }) => type === 'Warning') const isErrors = (solcOutput?.errors?.length ?? 0) > (warnings?.length ?? 0) diff --git a/bundlers/bundler/src/solc/compileContractsSync.spec.ts b/solc/src/compiler/compileContractsSync.spec.ts similarity index 93% rename from bundlers/bundler/src/solc/compileContractsSync.spec.ts rename to solc/src/compiler/compileContractsSync.spec.ts index cbac0f02d1..f74be2ce0c 100644 --- a/bundlers/bundler/src/solc/compileContractsSync.spec.ts +++ b/solc/src/compiler/compileContractsSync.spec.ts @@ -1,7 +1,6 @@ -import { createCache } from '../createCache.js' +import { moduleFactorySync } from '../importResolution/moduleFactorySync.js' import type { FileAccessObject, ModuleInfo } from '../types.js' import { compileContractSync } from './compileContractsSync.js' -import { moduleFactorySync } from './moduleFactorySync.js' import type { ResolvedCompilerConfig } from '@evmts/config' import resolve from 'resolve' // @ts-ignore @@ -23,7 +22,9 @@ vi.mock('solc', () => { const defaultExport = { compile: vi.fn() } return { default: defaultExport, ...defaultExport } }) -vi.mock('./moduleFactorySync', () => ({ moduleFactorySync: vi.fn() })) +vi.mock('../importResolution/moduleFactorySync', () => ({ + moduleFactorySync: vi.fn(), +})) const ConsoleMock = { log: vi.fn(), error: vi.fn(), @@ -216,40 +217,6 @@ describe('compileContractSync', () => { `) }) - it('should read from cache if already cached', () => { - const cache = createCache(console) - compileContractSync(filePath, basedir, config, true, fao, console, cache) - cache.isCached = () => true - compileContractSync(filePath, basedir, config, true, fao, console, cache) - expect(mockSolcCompile).toHaveBeenCalledOnce() - }) - - it('should cache compiled contracts', () => { - const cache = createCache(console) - compileContractSync(filePath, basedir, config, true, fao, console, cache) - expect(cache.read(filePath)).toMatchInlineSnapshot(` - { - "contracts": { - "test/path": { - "Test": { - "abi": [], - "evm": { - "bytecode": { - "object": "0x123", - }, - }, - }, - }, - }, - "sources": { - "test/path": { - "ast": "ast", - }, - }, - } - `) - }) - it('should compile a contract correctly', () => { const compiledContract = compileContractSync( filePath, diff --git a/solc/src/compiler/index.js b/solc/src/compiler/index.js new file mode 100644 index 0000000000..9b8d99c7a2 --- /dev/null +++ b/solc/src/compiler/index.js @@ -0,0 +1,2 @@ +export { compileContract } from './compileContracts.js' +export { compileContractSync } from './compileContractsSync.js' diff --git a/solc/src/importResolution/README.md b/solc/src/importResolution/README.md new file mode 100644 index 0000000000..127b5063dd --- /dev/null +++ b/solc/src/importResolution/README.md @@ -0,0 +1,28 @@ +## @evmts/config/src/importResolution + +Private internal code to handle import resolution + +EVMts resolves the module graph itself before passing off the modules to solc. This is to keep the module resolution fully `hackable` internally. + +Module resolution is done iteratively to avoid stack to deep errors + +## [moduleFactory](./moduleFactory.js) +## [moduleFactorySync](./moduleFactorySync.js) + +A moduleFactory takes props +- absolutePath - absolutePath of the solidity module +- rawCode - a string or buffer of the solidity source code +- remappings - any import remappings +- libs - any lib to resolve to (note node_module handled by default) + +It then builds a recursive structure of modules to be used by the [compiler](../compiler/) + +## [resolveImports](./resolveImports.js) + +A simple function that resolves imports. It expects remappings to already be applied + +## Warning about source maps + +Because of the way we handle remappings and import resolutions the solc input doesn't match the source code. This needs to be taken into account if using solc for source maps like in [@evmts/ts-plugin](../../ts-plugin/) + +This will get handled internally in future diff --git a/solc/src/importResolution/index.js b/solc/src/importResolution/index.js new file mode 100644 index 0000000000..4980586337 --- /dev/null +++ b/solc/src/importResolution/index.js @@ -0,0 +1,2 @@ +export { moduleFactory } from './moduleFactory.js' +export { moduleFactorySync } from './moduleFactorySync.js' diff --git a/bundlers/bundler/src/solc/moduleFactory.js b/solc/src/importResolution/moduleFactory.js similarity index 100% rename from bundlers/bundler/src/solc/moduleFactory.js rename to solc/src/importResolution/moduleFactory.js diff --git a/bundlers/bundler/src/solc/moduleFactory.spec.ts b/solc/src/importResolution/moduleFactory.spec.ts similarity index 100% rename from bundlers/bundler/src/solc/moduleFactory.spec.ts rename to solc/src/importResolution/moduleFactory.spec.ts diff --git a/bundlers/bundler/src/solc/moduleFactorySync.js b/solc/src/importResolution/moduleFactorySync.js similarity index 100% rename from bundlers/bundler/src/solc/moduleFactorySync.js rename to solc/src/importResolution/moduleFactorySync.js diff --git a/bundlers/bundler/src/solc/moduleFactorySync.spec.ts b/solc/src/importResolution/moduleFactorySync.spec.ts similarity index 100% rename from bundlers/bundler/src/solc/moduleFactorySync.spec.ts rename to solc/src/importResolution/moduleFactorySync.spec.ts diff --git a/bundlers/bundler/src/solc/resolveImportPath.js b/solc/src/importResolution/resolveImportPath.js similarity index 100% rename from bundlers/bundler/src/solc/resolveImportPath.js rename to solc/src/importResolution/resolveImportPath.js diff --git a/bundlers/bundler/src/solc/resolveImportPath.spec.ts b/solc/src/importResolution/resolveImportPath.spec.ts similarity index 100% rename from bundlers/bundler/src/solc/resolveImportPath.spec.ts rename to solc/src/importResolution/resolveImportPath.spec.ts diff --git a/bundlers/bundler/src/solc/resolveImports.js b/solc/src/importResolution/resolveImports.js similarity index 100% rename from bundlers/bundler/src/solc/resolveImports.js rename to solc/src/importResolution/resolveImports.js diff --git a/bundlers/bundler/src/solc/resolveImports.spec.ts b/solc/src/importResolution/resolveImports.spec.ts similarity index 100% rename from bundlers/bundler/src/solc/resolveImports.spec.ts rename to solc/src/importResolution/resolveImports.spec.ts diff --git a/solc/src/index.js b/solc/src/index.js new file mode 100644 index 0000000000..493652bea9 --- /dev/null +++ b/solc/src/index.js @@ -0,0 +1,41 @@ +/** + * ./types.ts + * @typedef {import('./types.js').Artifacts} Artifacts + * @typedef {import('./types.js').CompiledContracts} CompiledContracts + * @typedef {import('./types.js').FileAccessObject} FileAccessObject + * @typedef {import('./types.js').Logger} Logger + * @typedef {import('./types.js').ModuleInfo} ModuleInfo + */ +/** + * ./solcTypes.ts + * @typedef {import('./solcTypes.js').SolcOutput} SolcOutput + * @typedef {import('./solcTypes.js').SolcLanguage} SolcLanguage + * @typedef {import('./solcTypes.js').SolcSettings} SolcSettings + * @typedef {import('./solcTypes.js').SolcEVMOutput} SolcEVMOutput + * @typedef {import('./solcTypes.js').SolcOptimizer} SolcOptimizer + * @typedef {import('./solcTypes.js').SolcRemapping} SolcRemapping + * @typedef {import('./solcTypes.js').SolcErrorEntry} SolcErrorEntry + * @typedef {import('./solcTypes.js').SolcYulDetails} SolcYulDetails + * @typedef {import('./solcTypes.js').SolcEwasmOutput} SolcEwasmOutput + * @typedef {import('./solcTypes.js').SolcInputSource} SolcInputSource + * @typedef {import('./solcTypes.js').SolcSourceEntry} SolcSourceEntry + * @typedef {import('./solcTypes.js').SolcGasEstimates} SolcGasEstimates + * @typedef {import('./solcTypes.js').SolcInputSources} SolcInputSources + * @typedef {import('./solcTypes.js').SolcModelChecker} SolcModelChecker + * @typedef {import('./solcTypes.js').SolcDebugSettings} SolcDebugSettings + * @typedef {import('./solcTypes.js').SolcBytecodeOutput} SolcBytecodeOutput + * @typedef {import('./solcTypes.js').SolcContractOutput} SolcContractOutput + * @typedef {import('./solcTypes.js').SolcSourceLocation} SolcSourceLocation + * @typedef {import('./solcTypes.js').SolcOutputSelection} SolcOutputSelection + * @typedef {import('./solcTypes.js').SolcInputDescription} SolcInputDescription + * @typedef {import('./solcTypes.js').SolcMetadataSettings} SolcMetadataSettings + * @typedef {import('./solcTypes.js').SolcOptimizerDetails} SolcOptimizerDetails + * @typedef {import('./solcTypes.js').SolcFunctionDebugData} SolcFunctionDebugData + * @typedef {import('./solcTypes.js').SolcModelCheckerContracts} SolcModelCheckerContracts + * @typedef {import('./solcTypes.js').SolcDeployedBytecodeOutput} SolcDeployedBytecodeOutput + * @typedef {import('./solcTypes.js').SolcSecondarySourceLocation} SolcSecondarySourceLocation + * @typedef {import('./solcTypes.js').SolcInputSourcesDestructibleSettings} SolcInputSourcesDestructibleSettings + */ +export { resolveArtifacts } from './resolveArtifacts.js' +export { resolveArtifactsSync } from './resolveArtifactsSync.js' +export { solcCompile } from './solc.js' diff --git a/bundlers/bundler/src/solc/resolveArtifacts.d.ts b/solc/src/resolveArtifacts.d.ts similarity index 77% rename from bundlers/bundler/src/solc/resolveArtifacts.d.ts rename to solc/src/resolveArtifacts.d.ts index fce63d60d6..df4efc6f7c 100644 --- a/bundlers/bundler/src/solc/resolveArtifacts.d.ts +++ b/solc/src/resolveArtifacts.d.ts @@ -1,15 +1,18 @@ -import type { Cache } from '../createCache.js' -import type { FileAccessObject, Logger, ModuleInfo } from '../types.js' import { compileContract } from './compileContracts.js' import type { SolcContractOutput, SolcInputDescription, SolcOutput, } from './solc.js' +import type { + Artifacts, + FileAccessObject, + Logger, + ModuleInfo, +} from './types.js' import type { ResolvedCompilerConfig } from '@evmts/config' import type { Node } from 'solidity-ast/node.js' -type Artifacts = Record> /** * Currently unimplemented just uses resolveArtifactsSync */ @@ -20,7 +23,6 @@ export type ResolveArtifacts = ( config: ResolvedCompilerConfig, includeAst: boolean, fao: FileAccessObject, - cache?: Cache, ) => Promise<{ artifacts: Artifacts modules: Record<'string', ModuleInfo> diff --git a/bundlers/bundler/src/solc/resolveArtifacts.js b/solc/src/resolveArtifacts.js similarity index 81% rename from bundlers/bundler/src/solc/resolveArtifacts.js rename to solc/src/resolveArtifacts.js index 08e52f484e..e92028e6d0 100644 --- a/bundlers/bundler/src/solc/resolveArtifacts.js +++ b/solc/src/resolveArtifacts.js @@ -1,4 +1,4 @@ -import { compileContract } from './compileContracts.js' +import { compileContract } from './compiler/compileContracts.js' /** * Resolves artifacts with solc asyncronously @@ -11,21 +11,12 @@ export const resolveArtifacts = async ( config, includeAst, fao, - cache, ) => { if (!solFile.endsWith('.sol')) { throw new Error('Not a solidity file') } const { artifacts, modules, asts, solcInput, solcOutput } = - await compileContract( - solFile, - basedir, - config, - includeAst, - fao, - logger, - cache, - ) + await compileContract(solFile, basedir, config, includeAst, fao, logger) if (!artifacts) { logger.error(`Compilation failed for ${solFile}`) diff --git a/bundlers/bundler/src/solc/resolveArtifacts.spec.ts b/solc/src/resolveArtifacts.spec.ts similarity index 91% rename from bundlers/bundler/src/solc/resolveArtifacts.spec.ts rename to solc/src/resolveArtifacts.spec.ts index 1a6834d157..0758e64f92 100644 --- a/bundlers/bundler/src/solc/resolveArtifacts.spec.ts +++ b/solc/src/resolveArtifacts.spec.ts @@ -1,6 +1,6 @@ -import type { FileAccessObject, Logger, ModuleInfo } from '../types.js' -import { compileContract } from './compileContracts.js' +import { compileContract } from './compiler/compileContracts.js' import { resolveArtifacts } from './resolveArtifacts.js' +import type { FileAccessObject, Logger, ModuleInfo } from './types.js' import { type ResolvedCompilerConfig, defaultConfig } from '@evmts/config' import { type MockedFunction, @@ -11,7 +11,7 @@ import { vi, } from 'vitest' -vi.mock('./compileContracts', () => ({ +vi.mock('./compiler/compileContracts', () => ({ compileContract: vi.fn(), })) diff --git a/bundlers/bundler/src/solc/resolveArtifactsSync.d.ts b/solc/src/resolveArtifactsSync.d.ts similarity index 67% rename from bundlers/bundler/src/solc/resolveArtifactsSync.d.ts rename to solc/src/resolveArtifactsSync.d.ts index 166645cf27..4f5321a0e8 100644 --- a/bundlers/bundler/src/solc/resolveArtifactsSync.d.ts +++ b/solc/src/resolveArtifactsSync.d.ts @@ -1,19 +1,18 @@ -import type { Cache } from '../createCache.js' -import type { FileAccessObject, Logger, ModuleInfo } from '../types.js' -import { compileContractSync } from './compileContractsSync.js' import type { SolcContractOutput, SolcInputDescription, SolcOutput, } from './solc.js' +import { compileContractSync } from './solc/compileContractsSync.js' +import type { + Artifacts, + FileAccessObject, + Logger, + ModuleInfo, +} from './types.js' import type { ResolvedCompilerConfig } from '@evmts/config' import type { Node } from 'solidity-ast/node.js' -export type Artifacts = Record< - string, - Pick -> - export type ResolveArtifactsSync = ( solFile: string, basedir: string, @@ -21,7 +20,6 @@ export type ResolveArtifactsSync = ( config: ResolvedCompilerConfig, includeAst: boolean, fao: FileAccessObject, - cache?: Cache, ) => { artifacts: Artifacts modules: Record<'string', ModuleInfo> diff --git a/bundlers/bundler/src/solc/resolveArtifactsSync.js b/solc/src/resolveArtifactsSync.js similarity index 80% rename from bundlers/bundler/src/solc/resolveArtifactsSync.js rename to solc/src/resolveArtifactsSync.js index acd108bc56..bd247cface 100644 --- a/bundlers/bundler/src/solc/resolveArtifactsSync.js +++ b/solc/src/resolveArtifactsSync.js @@ -1,4 +1,4 @@ -import { compileContractSync } from './compileContractsSync.js' +import { compileContractSync } from './compiler/compileContractsSync.js' /** * @type {import('./resolveArtifactsSync.js').ResolveArtifactsSync} @@ -10,21 +10,12 @@ export const resolveArtifactsSync = ( config, includeAst, fao, - cache, ) => { if (!solFile.endsWith('.sol')) { throw new Error('Not a solidity file') } const { artifacts, modules, asts, solcInput, solcOutput } = - compileContractSync( - solFile, - basedir, - config, - includeAst, - fao, - logger, - cache, - ) + compileContractSync(solFile, basedir, config, includeAst, fao, logger) if (!artifacts) { logger.error(`Compilation failed for ${solFile}`) diff --git a/bundlers/bundler/src/solc/resolveArtifactsSync.spec.ts b/solc/src/resolveArtifactsSync.spec.ts similarity index 95% rename from bundlers/bundler/src/solc/resolveArtifactsSync.spec.ts rename to solc/src/resolveArtifactsSync.spec.ts index 30674f6202..8741bb2699 100644 --- a/bundlers/bundler/src/solc/resolveArtifactsSync.spec.ts +++ b/solc/src/resolveArtifactsSync.spec.ts @@ -1,6 +1,6 @@ -import type { FileAccessObject, Logger, ModuleInfo } from '../types.js' -import { compileContractSync } from './compileContractsSync.js' +import { compileContractSync } from './compiler/compileContractsSync.js' import { resolveArtifactsSync } from './resolveArtifactsSync.js' +import type { FileAccessObject, Logger, ModuleInfo } from './types.js' import { type ResolvedCompilerConfig, defaultConfig } from '@evmts/config' import { type MockedFunction, @@ -11,7 +11,7 @@ import { vi, } from 'vitest' -vi.mock('./compileContractsSync', () => ({ +vi.mock('./compiler/compileContractsSync', () => ({ compileContractSync: vi.fn(), })) diff --git a/bundlers/bundler/src/solc/solc.js b/solc/src/solc.js similarity index 100% rename from bundlers/bundler/src/solc/solc.js rename to solc/src/solc.js diff --git a/bundlers/bundler/src/solc/solcTypes.ts b/solc/src/solcTypes.ts similarity index 100% rename from bundlers/bundler/src/solc/solcTypes.ts rename to solc/src/solcTypes.ts diff --git a/solc/src/types.ts b/solc/src/types.ts new file mode 100644 index 0000000000..cca5b39a0d --- /dev/null +++ b/solc/src/types.ts @@ -0,0 +1,43 @@ +import type { + SolcContractOutput, + SolcInputDescription, + SolcOutput, +} from './solcTypes.js' +import type { Node } from 'solidity-ast/node.js' + +export type FileAccessObject = { + readFile: (path: string, encoding: BufferEncoding) => Promise + readFileSync: (path: string, encoding: BufferEncoding) => string + existsSync: (path: string) => boolean +} + +export type Logger = { + info: (...messages: string[]) => void + error: (...message: string[]) => void + warn: (...message: string[]) => void + log: (...message: string[]) => void +} +/** + * Copied from rollup (kinda) + * @see https://rollupjs.org/plugin-development/#this-getmoduleinfo + */ +export interface ModuleInfo { + id: string // the id of the module, for convenience + rawCode: string | null // the source code of the module, `null` if external or not yet available + code: string | null // the code after transformed to correctly resolve remappings and node_module imports + importedIds: string[] // the module ids statically imported by this module + resolutions: ModuleInfo[] // how statically imported ids were resolved, for use with this.load +} + +export type CompiledContracts = { + artifacts: SolcOutput['contracts'][string] | undefined + modules: Record<'string', ModuleInfo> + asts: TIncludeAsts extends true ? Record : undefined + solcInput: SolcInputDescription + solcOutput: SolcOutput +} + +export type Artifacts = Record< + string, + Pick +> diff --git a/bundlers/bundler/src/utils/formatPath.js b/solc/src/utils/formatPath.js similarity index 100% rename from bundlers/bundler/src/utils/formatPath.js rename to solc/src/utils/formatPath.js diff --git a/bundlers/bundler/src/utils/formatPath.spec.ts b/solc/src/utils/formatPath.spec.ts similarity index 100% rename from bundlers/bundler/src/utils/formatPath.spec.ts rename to solc/src/utils/formatPath.spec.ts diff --git a/bundlers/bundler/src/utils/index.js b/solc/src/utils/index.js similarity index 100% rename from bundlers/bundler/src/utils/index.js rename to solc/src/utils/index.js diff --git a/bundlers/bundler/src/utils/invariant.d.ts b/solc/src/utils/invariant.d.ts similarity index 100% rename from bundlers/bundler/src/utils/invariant.d.ts rename to solc/src/utils/invariant.d.ts diff --git a/bundlers/bundler/src/utils/invariant.js b/solc/src/utils/invariant.js similarity index 100% rename from bundlers/bundler/src/utils/invariant.js rename to solc/src/utils/invariant.js diff --git a/bundlers/bundler/src/utils/invariant.spec.ts b/solc/src/utils/invariant.spec.ts similarity index 100% rename from bundlers/bundler/src/utils/invariant.spec.ts rename to solc/src/utils/invariant.spec.ts diff --git a/bundlers/bundler/src/utils/isImportLocal.js b/solc/src/utils/isImportLocal.js similarity index 100% rename from bundlers/bundler/src/utils/isImportLocal.js rename to solc/src/utils/isImportLocal.js diff --git a/bundlers/bundler/src/utils/isImportLocal.spec.ts b/solc/src/utils/isImportLocal.spec.ts similarity index 100% rename from bundlers/bundler/src/utils/isImportLocal.spec.ts rename to solc/src/utils/isImportLocal.spec.ts diff --git a/bundlers/bundler/src/utils/isRelativeSolidity.js b/solc/src/utils/isRelativeSolidity.js similarity index 100% rename from bundlers/bundler/src/utils/isRelativeSolidity.js rename to solc/src/utils/isRelativeSolidity.js diff --git a/bundlers/bundler/src/utils/isRelativeSolidity.spec.ts b/solc/src/utils/isRelativeSolidity.spec.ts similarity index 100% rename from bundlers/bundler/src/utils/isRelativeSolidity.spec.ts rename to solc/src/utils/isRelativeSolidity.spec.ts diff --git a/bundlers/bundler/src/utils/isSolidity.js b/solc/src/utils/isSolidity.js similarity index 100% rename from bundlers/bundler/src/utils/isSolidity.js rename to solc/src/utils/isSolidity.js diff --git a/bundlers/bundler/src/utils/isSolidity.spec.ts b/solc/src/utils/isSolidity.spec.ts similarity index 100% rename from bundlers/bundler/src/utils/isSolidity.spec.ts rename to solc/src/utils/isSolidity.spec.ts diff --git a/bundlers/bundler/src/utils/resolvePromise.js b/solc/src/utils/resolvePromise.js similarity index 100% rename from bundlers/bundler/src/utils/resolvePromise.js rename to solc/src/utils/resolvePromise.js diff --git a/bundlers/bundler/src/utils/resolvePromise.spec.ts b/solc/src/utils/resolvePromise.spec.ts similarity index 96% rename from bundlers/bundler/src/utils/resolvePromise.spec.ts rename to solc/src/utils/resolvePromise.spec.ts index 8481a0bd16..b40c612798 100644 --- a/bundlers/bundler/src/utils/resolvePromise.spec.ts +++ b/solc/src/utils/resolvePromise.spec.ts @@ -34,11 +34,7 @@ describe('resolvePromise', () => { const resolvedPath = await Effect.runPromise( resolveEffect('./resolvePromise.spec.ts', __dirname, fao, logger), ) - expect( - resolvedPath.endsWith( - 'evmts-monorepo/bundlers/bundler/src/utils/resolvePromise.spec.ts', - ), - ).toBe(true) + expect(resolvedPath.endsWith('src/utils/resolvePromise.spec.ts')).toBe(true) }) it('should handle readFile throwing', async () => { diff --git a/solc/tsconfig.json b/solc/tsconfig.json new file mode 100644 index 0000000000..e4a7b177b9 --- /dev/null +++ b/solc/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@evmts/tsconfig/base.json", + "compilerOptions": { + "composite": true, + "outDir": "types", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true + }, + "include": [ + "src", + "src/**/*.json", + "package.json" + ] +} \ No newline at end of file diff --git a/solc/tsup.config.ts b/solc/tsup.config.ts new file mode 100644 index 0000000000..197bac356c --- /dev/null +++ b/solc/tsup.config.ts @@ -0,0 +1,13 @@ +import packageJson from './package.json' +import { defineConfig } from 'tsup' + +export default defineConfig({ + name: packageJson.name, + entry: ['src/index.js'], + outDir: 'dist', + format: ['cjs'], + splitting: false, + sourcemap: true, + clean: true, + skipNodeModulesBundle: true, +}) diff --git a/solc/typedoc.json b/solc/typedoc.json new file mode 100644 index 0000000000..890a7aed6e --- /dev/null +++ b/solc/typedoc.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "out": "../../docs/reference/solc", + "entryPoints": [ + "./src/resolveArtifacts.js", + "./src/resolveArtifactsSync.js", + "./src/solc.js", + "./src/solcTypes.js", + "./src/types.ts" + ], + "publicPath": "/reference/solc/", + "plugin": ["typedoc-plugin-markdown"], + "gitRevision": "main" +} diff --git a/solc/vitest.config.ts b/solc/vitest.config.ts new file mode 100644 index 0000000000..7fc009dfb2 --- /dev/null +++ b/solc/vitest.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'vitest/config' + +// https://vitest.dev/config/ - for docs +export default defineConfig({ + test: { + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + environment: 'node', + coverage: { + reporter: ['text', 'json-summary', 'json'], + lines: 99.19, + functions: 94.44, + branches: 94.64, + statements: 99.19, + thresholdAutoUpdate: true, + }, + }, +})