@ic-reactor/mcp 0.0.0-stage → 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.yml +108 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +77 -0
- package/.github/actions/setup-rust-wasm/action.yml +25 -0
- package/.github/dependabot.yml +107 -0
- package/.github/workflows/auth-latest.yml +67 -0
- package/.github/workflows/b3pay-site.yml +49 -0
- package/.github/workflows/ci.yml +430 -0
- package/.github/workflows/codeql.yml +41 -0
- package/.github/workflows/dependency-review.yml +68 -0
- package/.github/workflows/docs-check.yml +98 -0
- package/.github/workflows/docs.yml +265 -0
- package/.github/workflows/e2e.yml +90 -0
- package/.github/workflows/examples-published.yml +97 -0
- package/.github/workflows/release.yml +326 -0
- package/.husky/pre-commit +12 -0
- package/.prettierignore +109 -0
- package/.prettierrc +6 -0
- package/AGENTS.md +103 -0
- package/CHANGELOG.md +3268 -0
- package/CLAUDE.md +93 -0
- package/CNAME +1 -0
- package/CODE_OF_CONDUCT.md +7 -0
- package/CONTRIBUTING.md +433 -0
- package/LICENSE +21 -0
- package/README.md +2 -2
- package/SECURITY.md +74 -0
- package/b3pay-module.json +194 -0
- package/docs/.remarkrc.json +10 -0
- package/docs/README.md +64 -0
- package/docs/astro.config.mjs +205 -0
- package/docs/favicon.svg +15 -0
- package/docs/package.json +39 -0
- package/docs/public/favicon.svg +15 -0
- package/docs/public/ic-reactor-social-card.png +0 -0
- package/docs/scripts/b3pay-static.mjs +22 -0
- package/docs/scripts/check-example-docs.mjs +214 -0
- package/docs/scripts/check-links.mjs +212 -0
- package/docs/scripts/fix-dist-links.js +125 -0
- package/docs/scripts/fix-frontmatter.js +71 -0
- package/docs/scripts/remove-redundant-h1.cjs +48 -0
- package/docs/scripts/rewrite-typedoc-links.js +110 -0
- package/docs/scripts/split-index.js +69 -0
- package/docs/src/assets/ic-reactor-hero-dark.svg +23 -0
- package/docs/src/assets/ic-reactor-hero-light.svg +23 -0
- package/docs/src/assets/ic-reactor-lockup-dark.svg +15 -0
- package/docs/src/assets/ic-reactor-lockup-light.svg +15 -0
- package/docs/src/assets/ic-reactor-mark-dark.svg +14 -0
- package/docs/src/assets/ic-reactor-mark-light.svg +14 -0
- package/docs/src/assets/layers/candid-core-layer-icon-dark.svg +4 -0
- package/docs/src/assets/layers/candid-core-layer-icon-light.svg +4 -0
- package/docs/src/assets/layers/candid-profile-layer-icon-dark.svg +4 -0
- package/docs/src/assets/layers/candid-profile-layer-icon-light.svg +4 -0
- package/docs/src/assets/layers/ic-reactor-layer-icon-dark.svg +4 -0
- package/docs/src/assets/layers/ic-reactor-layer-icon-light.svg +4 -0
- package/docs/src/components/LibraryCards.astro +172 -0
- package/docs/src/components/LibraryIcon.astro +28 -0
- package/docs/src/components/SiteTitle.astro +241 -0
- package/docs/src/content/docs/404.mdx +19 -0
- package/docs/src/content/docs/build/agent-tools.mdx +593 -0
- package/docs/src/content/docs/build/icrc1-wallet.mdx +619 -0
- package/docs/src/content/docs/build/ssr-per-user.mdx +552 -0
- package/docs/src/content/docs/examples/canister-studio.mdx +95 -0
- package/docs/src/content/docs/examples/icrc-ledger.mdx +45 -0
- package/docs/src/content/docs/examples/index.mdx +38 -0
- package/docs/src/content/docs/examples/next-ssr.mdx +73 -0
- package/docs/src/content/docs/examples/node-agent-tool.mdx +80 -0
- package/docs/src/content/docs/examples/vite-wallet.mdx +71 -0
- package/docs/src/content/docs/guides/auth.mdx +1181 -0
- package/docs/src/content/docs/guides/client.mdx +551 -0
- package/docs/src/content/docs/guides/deploy.mdx +180 -0
- package/docs/src/content/docs/guides/errors.mdx +475 -0
- package/docs/src/content/docs/guides/getting-started.mdx +620 -0
- package/docs/src/content/docs/guides/reads.mdx +586 -0
- package/docs/src/content/docs/guides/ssr.mdx +529 -0
- package/docs/src/content/docs/guides/testing.mdx +401 -0
- package/docs/src/content/docs/guides/values.mdx +261 -0
- package/docs/src/content/docs/guides/vite-plugin.mdx +690 -0
- package/docs/src/content/docs/guides/writes.mdx +572 -0
- package/docs/src/content/docs/ic-reactor/index.mdx +167 -0
- package/docs/src/content/docs/index.mdx +65 -0
- package/docs/src/content/docs/migrating-from-3.mdx +535 -0
- package/docs/src/content/docs/packages/core.mdx +186 -0
- package/docs/src/content/docs/packages/mcp.mdx +163 -0
- package/docs/src/content/docs/packages/react.mdx +207 -0
- package/docs/src/content/docs/packages/vite-plugin.mdx +73 -0
- package/docs/src/content/docs/versioning.mdx +104 -0
- package/docs/src/content.config.ts +7 -0
- package/docs/src/styles/custom.css +189 -0
- package/docs/tsconfig.typedoc.json +26 -0
- package/docs/typedoc-entry.ts +17 -0
- package/docs/typedoc.json +37 -0
- package/e2e/Cargo.lock +646 -0
- package/e2e/Cargo.toml +3 -0
- package/e2e/README.md +101 -0
- package/e2e/frontends/build.mjs +94 -0
- package/e2e/frontends/index.html +10 -0
- package/e2e/global-setup.ts +65 -0
- package/e2e/icp.yaml +38 -0
- package/e2e/package.json +40 -0
- package/e2e/setup.ts +6 -0
- package/e2e/src/actor/Cargo.toml +14 -0
- package/e2e/src/actor/hello_actor.did +10 -0
- package/e2e/src/actor/src/lib.rs +73 -0
- package/e2e/src/calls.test.ts +132 -0
- package/e2e/src/declarations/hello_actor.envelope.json +175 -0
- package/e2e/src/declarations/hello_actor.ts +15 -0
- package/e2e/src/errors.test.ts +107 -0
- package/e2e/src/frontend-headers.test.ts +253 -0
- package/e2e/src/identity.test.ts +61 -0
- package/e2e/src/react.test.tsx +59 -0
- package/e2e/src/replica.ts +70 -0
- package/e2e/src/vite-env.test.ts +108 -0
- package/e2e/test.sh +47 -0
- package/e2e/tsconfig.json +20 -0
- package/e2e/tsconfig.typecheck.json +9 -0
- package/e2e/vitest.config.ts +22 -0
- package/eslint.config.mjs +100 -0
- package/evals/PREREGISTRATION.md +1346 -0
- package/evals/README.md +756 -0
- package/evals/conditions/thin/condition.json +8 -0
- package/evals/conditions/thin/docs/candid-core-cli.README.md +90 -0
- package/evals/conditions/thin/docs/candid-core-schema.README.md +339 -0
- package/evals/conditions/thin/package.json +25 -0
- package/evals/conditions/thin/starter/src/generated/icrc1.ts +57 -0
- package/evals/conditions/thin-guide/condition.json +10 -0
- package/evals/conditions/thin-guide/docs/llms.txt +292 -0
- package/evals/conditions/v3/condition.json +9 -0
- package/evals/conditions/v3/docs/ic-reactor-core.llms.txt +232 -0
- package/evals/conditions/v3/docs/ic-reactor-react.llms.txt +280 -0
- package/evals/conditions/v3/docs/llms-full.txt +1053 -0
- package/evals/conditions/v3/package.json +26 -0
- package/evals/conditions/v3/starter/src/declarations/icrc1.did.d.ts +95 -0
- package/evals/conditions/v3/starter/src/declarations/icrc1.did.js +140 -0
- package/evals/conditions/v4/PORTING.md +384 -0
- package/evals/conditions/v4/README.md +106 -0
- package/evals/conditions/v4/condition.json +5 -0
- package/evals/conditions/v4/docs/llms.txt +323 -0
- package/evals/conditions/v4/package.json +27 -0
- package/evals/conditions/v4/starter/src/generated/icrc1.ts +78 -0
- package/evals/conditions/v4-proto/condition.json +6 -0
- package/evals/conditions/v4-proto/docs/llms.txt +291 -0
- package/evals/conditions/v4-proto/lib/SHIM-NOTES.md +20 -0
- package/evals/conditions/v4-proto/lib/package.json +27 -0
- package/evals/conditions/v4-proto/lib/src/client.ts +471 -0
- package/evals/conditions/v4-proto/lib/src/errors.ts +214 -0
- package/evals/conditions/v4-proto/lib/src/index.ts +36 -0
- package/evals/conditions/v4-proto/lib/src/principal.ts +175 -0
- package/evals/conditions/v4-proto/lib/src/service.ts +69 -0
- package/evals/conditions/v4-proto/lib/src/types.ts +174 -0
- package/evals/conditions/v4-proto/lib/test/runtime.test.ts +170 -0
- package/evals/conditions/v4-proto/lib/test/tsconfig.json +10 -0
- package/evals/conditions/v4-proto/lib/test/types.test-d.ts +145 -0
- package/evals/conditions/v4-proto/lib/test/vitest.config.mjs +8 -0
- package/evals/conditions/v4-proto/lib/tsconfig.json +17 -0
- package/evals/conditions/v4-proto/package.json +26 -0
- package/evals/conditions/v4-proto/starter/src/generated/icrc1.service.ts +19 -0
- package/evals/conditions/v4-proto/starter/src/generated/icrc1.ts +57 -0
- package/evals/drive.mjs +1221 -0
- package/evals/gate.mjs +161 -0
- package/evals/harness/aggregate.mjs +534 -0
- package/evals/harness/aggregate.test.mjs +344 -0
- package/evals/harness/assemble.mjs +216 -0
- package/evals/harness/assemble.test.mjs +143 -0
- package/evals/harness/auth.mjs +91 -0
- package/evals/harness/check-docs.mjs +157 -0
- package/evals/harness/declarations/icrc1.did.d.ts +95 -0
- package/evals/harness/declarations/icrc1.did.js +140 -0
- package/evals/harness/drive-auth.test.mjs +584 -0
- package/evals/harness/drive.test.mjs +509 -0
- package/evals/harness/fake-auth.ts +67 -0
- package/evals/harness/fake-ledger.ts +178 -0
- package/evals/harness/gate-plan.mjs +104 -0
- package/evals/harness/gate-plan.test.mjs +243 -0
- package/evals/harness/icrc1.did +88 -0
- package/evals/harness/judge.mjs +63 -0
- package/evals/harness/judge.test.mjs +81 -0
- package/evals/harness/leak-scan.mjs +1373 -0
- package/evals/harness/leak-scan.test.mjs +1300 -0
- package/evals/harness/probes/amounts.ts +14 -0
- package/evals/harness/probes/node-tool.probe.ts +48 -0
- package/evals/harness/probes/probe.mjs +149 -0
- package/evals/harness/probes/react-wallet.probe.ts +96 -0
- package/evals/harness/public/support/auth.ts +38 -0
- package/evals/harness/public/support/fake-replica.d.ts +28 -0
- package/evals/harness/public/support/fake-replica.js +434 -0
- package/evals/harness/public/support/ledger.idl.d.ts +95 -0
- package/evals/harness/public/support/ledger.idl.js +140 -0
- package/evals/harness/public/support/world.ts +179 -0
- package/evals/harness/runs.mjs +139 -0
- package/evals/harness/sandbox.mjs +88 -0
- package/evals/harness/sandbox.test.mjs +134 -0
- package/evals/harness/ship.mjs +264 -0
- package/evals/harness/ship.test.mjs +552 -0
- package/evals/harness/world.ts +291 -0
- package/evals/package.json +26 -0
- package/evals/pnpm-lock.yaml +1537 -0
- package/evals/pnpm-workspace.yaml +12 -0
- package/evals/results/2026-09-30T14-22-05-924Z/pilot.json +384 -0
- package/evals/results/2026-09-30T14-22-05-924Z/pilot.rescanned.json +404 -0
- package/evals/results/2026-09-30T14-22-05-924Z/pilot.rescanned.rescored.json +404 -0
- package/evals/results/2026-09-30T14-22-05-924Z/plan.json +240 -0
- package/evals/results/2026-09-30T14-22-05-924Z/summary.json +1800 -0
- package/evals/results/2026-09-30T14-22-05-924Z/summary.rescanned.json +1843 -0
- package/evals/results/2026-09-30T14-22-05-924Z/summary.rescanned.rescored.json +2100 -0
- package/evals/results/2026-09-30T15-48-23-343Z/pilot.json +404 -0
- package/evals/results/2026-09-30T15-48-23-343Z/pilot.rescored.json +404 -0
- package/evals/results/2026-09-30T15-48-23-343Z/plan.json +242 -0
- package/evals/results/2026-09-30T15-48-23-343Z/summary.json +1843 -0
- package/evals/results/2026-09-30T15-48-23-343Z/summary.rescored.json +2195 -0
- package/evals/results/2026-10-03-beta1-gate/pilot.json +162 -0
- package/evals/results/2026-10-03-beta1-gate/plan.json +141 -0
- package/evals/results/2026-10-03-beta1-gate/summary.json +983 -0
- package/evals/results/2026-10-05-ga-gate/contaminated-run.json +55 -0
- package/evals/results/2026-10-05-ga-gate/pilot.json +162 -0
- package/evals/results/2026-10-05-ga-gate/plan.json +457 -0
- package/evals/results/2026-10-05-ga-gate/summary.json +1037 -0
- package/evals/results/2026-10-05-ga-gate/summary.rescanned.json +1037 -0
- package/evals/results/README.md +31 -0
- package/evals/runs-pilot.log +150 -0
- package/evals/runs-pilot2.log +150 -0
- package/evals/score.mjs +256 -0
- package/evals/setup.mjs +547 -0
- package/evals/tasks/node-tool/faulty/thin-accepts-exponent/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-accepts-exponent/src/index.ts +121 -0
- package/evals/tasks/node-tool/faulty/thin-anonymous-transfer/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-anonymous-transfer/src/index.ts +116 -0
- package/evals/tasks/node-tool/faulty/thin-every-reject-may-have-executed/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/thin-every-reject-may-have-executed/src/index.ts +118 -0
- package/evals/tasks/node-tool/faulty/thin-fetches-root-key-off-local/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-fetches-root-key-off-local/src/index.ts +118 -0
- package/evals/tasks/node-tool/faulty/thin-ignores-root-key/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-ignores-root-key/src/index.ts +117 -0
- package/evals/tasks/node-tool/faulty/thin-misclassifies-reject-codes/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/thin-misclassifies-reject-codes/src/index.ts +119 -0
- package/evals/tasks/node-tool/faulty/thin-no-nat64-cap/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/thin-no-nat64-cap/src/index.ts +118 -0
- package/evals/tasks/node-tool/faulty/thin-number-amount/meta.json +10 -0
- package/evals/tasks/node-tool/faulty/thin-number-amount/src/index.ts +117 -0
- package/evals/tasks/node-tool/faulty/thin-truncates-fraction-digits/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-truncates-fraction-digits/src/index.ts +120 -0
- package/evals/tasks/node-tool/faulty/thin-unvalidated-recipient/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/thin-unvalidated-recipient/src/index.ts +118 -0
- package/evals/tasks/node-tool/faulty/v3-retry-call-errors/meta.json +11 -0
- package/evals/tasks/node-tool/faulty/v3-retry-call-errors/src/index.ts +149 -0
- package/evals/tasks/node-tool/faulty/v4-anonymous-identity-sent/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/v4-anonymous-identity-sent/src/index.ts +71 -0
- package/evals/tasks/node-tool/faulty/v4-never-may-have-executed/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/v4-never-may-have-executed/src/index.ts +84 -0
- package/evals/tasks/node-tool/faulty/v4-proto-never-may-have-executed/meta.json +9 -0
- package/evals/tasks/node-tool/faulty/v4-proto-never-may-have-executed/src/index.ts +72 -0
- package/evals/tasks/node-tool/faulty/v4-proto-refuses-nat64-max/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/v4-proto-refuses-nat64-max/src/index.ts +72 -0
- package/evals/tasks/node-tool/faulty/v4-refuses-nat64-max/meta.json +5 -0
- package/evals/tasks/node-tool/faulty/v4-refuses-nat64-max/src/index.ts +84 -0
- package/evals/tasks/node-tool/hidden/node-tool.test.ts +312 -0
- package/evals/tasks/node-tool/prompt.md +55 -0
- package/evals/tasks/node-tool/prompt.minimal.md +30 -0
- package/evals/tasks/node-tool/solutions/thin/reference/src/index.ts +118 -0
- package/evals/tasks/node-tool/solutions/thin/reference-module-scope/src/index.ts +145 -0
- package/evals/tasks/node-tool/solutions/thin-guide/reference/src/index.ts +118 -0
- package/evals/tasks/node-tool/solutions/thin-guide/reference-module-scope/src/index.ts +145 -0
- package/evals/tasks/node-tool/solutions/v3/reference/src/index.ts +140 -0
- package/evals/tasks/node-tool/solutions/v3/reference-module-scope/src/index.ts +153 -0
- package/evals/tasks/node-tool/solutions/v4/reference/src/index.ts +84 -0
- package/evals/tasks/node-tool/solutions/v4/reference-module-scope/src/index.ts +105 -0
- package/evals/tasks/node-tool/solutions/v4-proto/reference/src/index.ts +72 -0
- package/evals/tasks/node-tool/solutions/v4-proto/reference-module-scope/src/index.ts +87 -0
- package/evals/tasks/node-tool/starter/src/contract.ts +31 -0
- package/evals/tasks/node-tool/starter/src/index.ts +7 -0
- package/evals/tasks/node-tool/starter/test/smoke.test.ts +22 -0
- package/evals/tasks/node-tool/starter/tsconfig.json +17 -0
- package/evals/tasks/node-tool/task.json +63 -0
- package/evals/tasks/react-wallet/faulty/thin-accepts-exponent/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-accepts-exponent/src/Wallet.tsx +216 -0
- package/evals/tasks/react-wallet/faulty/thin-anonymous-transfer/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-anonymous-transfer/src/Wallet.tsx +212 -0
- package/evals/tasks/react-wallet/faulty/thin-both-auth-buttons/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-both-auth-buttons/src/Wallet.tsx +210 -0
- package/evals/tasks/react-wallet/faulty/thin-constant-balance-key/meta.json +8 -0
- package/evals/tasks/react-wallet/faulty/thin-constant-balance-key/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/faulty/thin-no-nat64-cap/meta.json +9 -0
- package/evals/tasks/react-wallet/faulty/thin-no-nat64-cap/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/faulty/thin-number-balance/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-number-balance/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/faulty/thin-transfer-as-query/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-transfer-as-query/src/Wallet.tsx +254 -0
- package/evals/tasks/react-wallet/faulty/thin-truncates-fraction-digits/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-truncates-fraction-digits/src/Wallet.tsx +215 -0
- package/evals/tasks/react-wallet/faulty/thin-unguarded-balance-effect/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/thin-unguarded-balance-effect/src/Wallet.tsx +214 -0
- package/evals/tasks/react-wallet/faulty/v3-http-4xx-unknown/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v3-http-4xx-unknown/src/Wallet.tsx +224 -0
- package/evals/tasks/react-wallet/faulty/v3-mutation-retry-3/meta.json +12 -0
- package/evals/tasks/react-wallet/faulty/v3-mutation-retry-3/src/Wallet.tsx +225 -0
- package/evals/tasks/react-wallet/faulty/v3-unknown-as-error/meta.json +11 -0
- package/evals/tasks/react-wallet/faulty/v3-unknown-as-error/src/Wallet.tsx +182 -0
- package/evals/tasks/react-wallet/faulty/v4-every-reject-unknown/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-every-reject-unknown/src/Wallet.tsx +160 -0
- package/evals/tasks/react-wallet/faulty/v4-keep-previous-data/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-keep-previous-data/src/Wallet.tsx +166 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-every-reject-unknown/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-every-reject-unknown/src/Wallet.tsx +161 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-keep-previous-data/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-keep-previous-data/src/Wallet.tsx +163 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-retry-spread/meta.json +12 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-retry-spread/src/Wallet.tsx +162 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-status-not-idle/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-proto-status-not-idle/src/Wallet.tsx +163 -0
- package/evals/tasks/react-wallet/faulty/v4-retry-spread/meta.json +12 -0
- package/evals/tasks/react-wallet/faulty/v4-retry-spread/src/Wallet.tsx +163 -0
- package/evals/tasks/react-wallet/faulty/v4-status-not-idle/meta.json +5 -0
- package/evals/tasks/react-wallet/faulty/v4-status-not-idle/src/Wallet.tsx +162 -0
- package/evals/tasks/react-wallet/hidden/react-wallet.test.ts +536 -0
- package/evals/tasks/react-wallet/prompt.md +88 -0
- package/evals/tasks/react-wallet/prompt.minimal.md +51 -0
- package/evals/tasks/react-wallet/solutions/thin/reference/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/solutions/thin/reference-module-scope/src/Wallet.tsx +227 -0
- package/evals/tasks/react-wallet/solutions/thin-guide/reference/src/Wallet.tsx +213 -0
- package/evals/tasks/react-wallet/solutions/thin-guide/reference-module-scope/src/Wallet.tsx +227 -0
- package/evals/tasks/react-wallet/solutions/v3/reference/src/Wallet.tsx +224 -0
- package/evals/tasks/react-wallet/solutions/v3/reference-module-scope/src/Wallet.tsx +230 -0
- package/evals/tasks/react-wallet/solutions/v4/reference/src/Wallet.tsx +160 -0
- package/evals/tasks/react-wallet/solutions/v4/reference-module-scope/src/Wallet.tsx +178 -0
- package/evals/tasks/react-wallet/solutions/v4-proto/reference/src/Wallet.tsx +161 -0
- package/evals/tasks/react-wallet/solutions/v4-proto/reference-module-scope/src/Wallet.tsx +161 -0
- package/evals/tasks/react-wallet/starter/src/Wallet.tsx +12 -0
- package/evals/tasks/react-wallet/starter/src/auth.ts +16 -0
- package/evals/tasks/react-wallet/starter/src/config.ts +14 -0
- package/evals/tasks/react-wallet/starter/src/ii-auth.ts +43 -0
- package/evals/tasks/react-wallet/starter/src/main.tsx +15 -0
- package/evals/tasks/react-wallet/starter/test/smoke.test.ts +34 -0
- package/evals/tasks/react-wallet/starter/tsconfig.json +18 -0
- package/evals/tasks/react-wallet/task.json +84 -0
- package/examples/canister-studio/.stackblitzrc +4 -0
- package/examples/canister-studio/README.md +183 -0
- package/examples/canister-studio/did/ckbtc_minter.did +806 -0
- package/examples/canister-studio/did/icp_ledger.did +586 -0
- package/examples/canister-studio/did/icrc1.did +88 -0
- package/examples/canister-studio/package.json +45 -0
- package/examples/canister-studio/scripts/smoke.ts +188 -0
- package/examples/canister-studio/src/calls/CacheKeyPanel.tsx +104 -0
- package/examples/canister-studio/src/calls/ConfirmWrite.tsx +265 -0
- package/examples/canister-studio/src/calls/ErrorPanel.test.tsx +113 -0
- package/examples/canister-studio/src/calls/ErrorPanel.tsx +214 -0
- package/examples/canister-studio/src/calls/MethodRunner.test.tsx +354 -0
- package/examples/canister-studio/src/calls/MethodRunner.tsx +57 -0
- package/examples/canister-studio/src/calls/ReadRunner.tsx +244 -0
- package/examples/canister-studio/src/calls/ResendPanel.tsx +165 -0
- package/examples/canister-studio/src/calls/ShareLink.tsx +59 -0
- package/examples/canister-studio/src/calls/WriteRunner.test.tsx +678 -0
- package/examples/canister-studio/src/calls/WriteRunner.tsx +670 -0
- package/examples/canister-studio/src/calls/dedupe.ts +189 -0
- package/examples/canister-studio/src/calls/error-info.ts +168 -0
- package/examples/canister-studio/src/calls/history.test.ts +284 -0
- package/examples/canister-studio/src/calls/history.ts +287 -0
- package/examples/canister-studio/src/calls/kinds.ts +68 -0
- package/examples/canister-studio/src/calls/prepare.ts +32 -0
- package/examples/canister-studio/src/calls/query-options.ts +30 -0
- package/examples/canister-studio/src/calls/read.ts +47 -0
- package/examples/canister-studio/src/calls/readback.ts +100 -0
- package/examples/canister-studio/src/calls/record.ts +123 -0
- package/examples/canister-studio/src/calls/safe-calls.test.ts +299 -0
- package/examples/canister-studio/src/calls/share.ts +46 -0
- package/examples/canister-studio/src/calls/testing/doubles.tsx +108 -0
- package/examples/canister-studio/src/calls/testing/fixtures.ts +185 -0
- package/examples/canister-studio/src/calls/useCanisterHandle.ts +35 -0
- package/examples/canister-studio/src/canisters/ckbtc_minter.envelope.json +4228 -0
- package/examples/canister-studio/src/canisters/ckbtc_minter.ts +868 -0
- package/examples/canister-studio/src/canisters/icp_ledger.envelope.json +3454 -0
- package/examples/canister-studio/src/canisters/icp_ledger.ts +584 -0
- package/examples/canister-studio/src/canisters/icrc1.envelope.json +840 -0
- package/examples/canister-studio/src/canisters/icrc1.ts +78 -0
- package/examples/canister-studio/src/components/ActionButton.tsx +32 -0
- package/examples/canister-studio/src/components/AppHeader.tsx +83 -0
- package/examples/canister-studio/src/components/AppShell.tsx +29 -0
- package/examples/canister-studio/src/components/AuthButton.tsx +79 -0
- package/examples/canister-studio/src/components/Badge.tsx +79 -0
- package/examples/canister-studio/src/components/CanisterHeader.tsx +200 -0
- package/examples/canister-studio/src/components/CanisterJump.tsx +130 -0
- package/examples/canister-studio/src/components/Card.tsx +64 -0
- package/examples/canister-studio/src/components/Code.tsx +101 -0
- package/examples/canister-studio/src/components/CopyButton.tsx +126 -0
- package/examples/canister-studio/src/components/Disclosure.tsx +34 -0
- package/examples/canister-studio/src/components/EmptyState.tsx +34 -0
- package/examples/canister-studio/src/components/MethodList.test.tsx +137 -0
- package/examples/canister-studio/src/components/MethodList.tsx +244 -0
- package/examples/canister-studio/src/components/Notice.tsx +36 -0
- package/examples/canister-studio/src/components/ProvenanceBadge.tsx +44 -0
- package/examples/canister-studio/src/components/RouteError.tsx +42 -0
- package/examples/canister-studio/src/components/SectionBoundary.tsx +76 -0
- package/examples/canister-studio/src/components/Spinner.tsx +33 -0
- package/examples/canister-studio/src/components/Tabs.tsx +96 -0
- package/examples/canister-studio/src/components/canister/CanisterLoadFailure.test.tsx +56 -0
- package/examples/canister-studio/src/components/canister/CanisterLoadFailure.tsx +165 -0
- package/examples/canister-studio/src/components/canister/CanisterNotFound.tsx +59 -0
- package/examples/canister-studio/src/components/canister/CanisterPending.tsx +33 -0
- package/examples/canister-studio/src/components/canister/MethodOverview.tsx +93 -0
- package/examples/canister-studio/src/components/canister/MethodWorkspace.test.tsx +201 -0
- package/examples/canister-studio/src/components/canister/MethodWorkspace.tsx +187 -0
- package/examples/canister-studio/src/components/canister/shared-call.test.ts +186 -0
- package/examples/canister-studio/src/components/canister/shared-call.ts +133 -0
- package/examples/canister-studio/src/components/canister/shared-link-loader.test.ts +116 -0
- package/examples/canister-studio/src/components/canister/use-canister-page.ts +44 -0
- package/examples/canister-studio/src/components/canister/workspace-key.test.ts +27 -0
- package/examples/canister-studio/src/components/canister/workspace-key.ts +36 -0
- package/examples/canister-studio/src/components/canister-id-input.ts +69 -0
- package/examples/canister-studio/src/components/canister-names.ts +11 -0
- package/examples/canister-studio/src/components/download.ts +34 -0
- package/examples/canister-studio/src/components/fallbacks.tsx +33 -0
- package/examples/canister-studio/src/components/helpers.test.ts +107 -0
- package/examples/canister-studio/src/components/history/HistoryList.tsx +284 -0
- package/examples/canister-studio/src/components/home/FeaturedLedger.tsx +149 -0
- package/examples/canister-studio/src/components/home/OpenCanister.tsx +99 -0
- package/examples/canister-studio/src/components/home/featured.test.tsx +92 -0
- package/examples/canister-studio/src/components/home/featured.ts +64 -0
- package/examples/canister-studio/src/components/interface/CandidTab.tsx +38 -0
- package/examples/canister-studio/src/components/interface/CompatReport.tsx +92 -0
- package/examples/canister-studio/src/components/interface/CompatibilityTab.tsx +190 -0
- package/examples/canister-studio/src/components/interface/ProjectTab.tsx +196 -0
- package/examples/canister-studio/src/components/interface/TypeScriptTab.tsx +114 -0
- package/examples/canister-studio/src/components/interface/tools.test.tsx +169 -0
- package/examples/canister-studio/src/components/modes.ts +31 -0
- package/examples/canister-studio/src/components/playground/MethodPicker.tsx +67 -0
- package/examples/canister-studio/src/components/playground/PlaygroundForms.tsx +112 -0
- package/examples/canister-studio/src/components/playground/PlaygroundTools.tsx +219 -0
- package/examples/canister-studio/src/components/playground/sample.ts +43 -0
- package/examples/canister-studio/src/components/playground/target.test.tsx +86 -0
- package/examples/canister-studio/src/components/primitives.test.tsx +121 -0
- package/examples/canister-studio/src/components/provenance.ts +38 -0
- package/examples/canister-studio/src/components/route-render.test.tsx +71 -0
- package/examples/canister-studio/src/components/use-task.ts +56 -0
- package/examples/canister-studio/src/components/wallet/BalancePanel.tsx +110 -0
- package/examples/canister-studio/src/components/wallet/LedgerSummary.tsx +63 -0
- package/examples/canister-studio/src/components/wallet/MinterPanel.tsx +255 -0
- package/examples/canister-studio/src/components/wallet/SendPanel.test.tsx +297 -0
- package/examples/canister-studio/src/components/wallet/SendPanel.tsx +446 -0
- package/examples/canister-studio/src/components/wallet/ledgers.test.ts +36 -0
- package/examples/canister-studio/src/components/wallet/ledgers.ts +111 -0
- package/examples/canister-studio/src/forms/JsonPanel.tsx +157 -0
- package/examples/canister-studio/src/forms/MethodForm.test.tsx +369 -0
- package/examples/canister-studio/src/forms/MethodForm.tsx +368 -0
- package/examples/canister-studio/src/forms/TypedForm.tsx +55 -0
- package/examples/canister-studio/src/forms/context.ts +62 -0
- package/examples/canister-studio/src/forms/convert.ts +131 -0
- package/examples/canister-studio/src/forms/edge.test.ts +252 -0
- package/examples/canister-studio/src/forms/engine.test.ts +358 -0
- package/examples/canister-studio/src/forms/engine.ts +1492 -0
- package/examples/canister-studio/src/forms/fields/BytesField.tsx +210 -0
- package/examples/canister-studio/src/forms/fields/Field.tsx +106 -0
- package/examples/canister-studio/src/forms/fields/FieldShell.tsx +101 -0
- package/examples/canister-studio/src/forms/fields/Group.tsx +74 -0
- package/examples/canister-studio/src/forms/fields/ListField.tsx +256 -0
- package/examples/canister-studio/src/forms/fields/Segmented.tsx +78 -0
- package/examples/canister-studio/src/forms/fields/TimestampField.tsx +108 -0
- package/examples/canister-studio/src/forms/fields/UnitsField.tsx +119 -0
- package/examples/canister-studio/src/forms/fields/composites.tsx +389 -0
- package/examples/canister-studio/src/forms/fields/leaves.tsx +350 -0
- package/examples/canister-studio/src/forms/fields.test.tsx +396 -0
- package/examples/canister-studio/src/forms/helpers.test.ts +225 -0
- package/examples/canister-studio/src/forms/hints.ts +128 -0
- package/examples/canister-studio/src/forms/json.ts +119 -0
- package/examples/canister-studio/src/forms/parsing.test.ts +217 -0
- package/examples/canister-studio/src/forms/useMethodForm.ts +251 -0
- package/examples/canister-studio/src/interface/browser.test.ts +23 -0
- package/examples/canister-studio/src/interface/browser.ts +153 -0
- package/examples/canister-studio/src/interface/cache.ts +68 -0
- package/examples/canister-studio/src/interface/cli-cache.test.ts +155 -0
- package/examples/canister-studio/src/interface/cli-cache.ts +125 -0
- package/examples/canister-studio/src/interface/compile.server.test.ts +198 -0
- package/examples/canister-studio/src/interface/compile.server.ts +262 -0
- package/examples/canister-studio/src/interface/compile.test.ts +108 -0
- package/examples/canister-studio/src/interface/compile.ts +305 -0
- package/examples/canister-studio/src/interface/docs.test.ts +75 -0
- package/examples/canister-studio/src/interface/docs.ts +100 -0
- package/examples/canister-studio/src/interface/functions.test.ts +42 -0
- package/examples/canister-studio/src/interface/functions.ts +200 -0
- package/examples/canister-studio/src/interface/live-candid.server.ts +91 -0
- package/examples/canister-studio/src/interface/live-loader.test.ts +515 -0
- package/examples/canister-studio/src/interface/live-loader.ts +364 -0
- package/examples/canister-studio/src/interface/load.test.ts +328 -0
- package/examples/canister-studio/src/interface/load.ts +249 -0
- package/examples/canister-studio/src/interface/read-candid.test.ts +185 -0
- package/examples/canister-studio/src/interface/read-candid.ts +233 -0
- package/examples/canister-studio/src/interface/server-result.ts +42 -0
- package/examples/canister-studio/src/interface/typed.ts +68 -0
- package/examples/canister-studio/src/interface/types.ts +121 -0
- package/examples/canister-studio/src/lib/format.test.ts +107 -0
- package/examples/canister-studio/src/lib/format.ts +139 -0
- package/examples/canister-studio/src/lib/hex.test.ts +43 -0
- package/examples/canister-studio/src/lib/hex.ts +33 -0
- package/examples/canister-studio/src/lib/ids.test.ts +70 -0
- package/examples/canister-studio/src/lib/ids.ts +93 -0
- package/examples/canister-studio/src/lib/reactor.test.ts +55 -0
- package/examples/canister-studio/src/lib/reactor.ts +55 -0
- package/examples/canister-studio/src/lib/registry.test.ts +74 -0
- package/examples/canister-studio/src/lib/registry.ts +238 -0
- package/examples/canister-studio/src/lib/schema.ts +148 -0
- package/examples/canister-studio/src/routeTree.gen.ts +227 -0
- package/examples/canister-studio/src/router.test.ts +290 -0
- package/examples/canister-studio/src/router.tsx +127 -0
- package/examples/canister-studio/src/routes/__root.tsx +58 -0
- package/examples/canister-studio/src/routes/canister.$canisterId.index.tsx +172 -0
- package/examples/canister-studio/src/routes/canister.$canisterId.interface.tsx +98 -0
- package/examples/canister-studio/src/routes/canister.$canisterId.tsx +91 -0
- package/examples/canister-studio/src/routes/history.tsx +55 -0
- package/examples/canister-studio/src/routes/index.tsx +169 -0
- package/examples/canister-studio/src/routes/playground.tsx +286 -0
- package/examples/canister-studio/src/routes/safety.tsx +57 -0
- package/examples/canister-studio/src/routes/wallet.tsx +213 -0
- package/examples/canister-studio/src/safety/LabTransferForm.tsx +84 -0
- package/examples/canister-studio/src/safety/RequestLog.tsx +79 -0
- package/examples/canister-studio/src/safety/SafetyLab.test.tsx +89 -0
- package/examples/canister-studio/src/safety/SafetyLab.tsx +140 -0
- package/examples/canister-studio/src/safety/ScenarioCard.tsx +262 -0
- package/examples/canister-studio/src/safety/lab-run.ts +283 -0
- package/examples/canister-studio/src/safety/mock-ledger.test.ts +99 -0
- package/examples/canister-studio/src/safety/mock-ledger.ts +263 -0
- package/examples/canister-studio/src/safety/scenarios.test.ts +157 -0
- package/examples/canister-studio/src/safety/scenarios.ts +924 -0
- package/examples/canister-studio/src/styles.css +3453 -0
- package/examples/canister-studio/src/styles.test.ts +46 -0
- package/examples/canister-studio/src/values/CallPreview.test.tsx +86 -0
- package/examples/canister-studio/src/values/CallPreview.tsx +148 -0
- package/examples/canister-studio/src/values/ErrValueView.tsx +66 -0
- package/examples/canister-studio/src/values/Inspector.tsx +133 -0
- package/examples/canister-studio/src/values/ReplyView.test.tsx +341 -0
- package/examples/canister-studio/src/values/ReplyView.tsx +164 -0
- package/examples/canister-studio/src/values/candid-text.test.ts +516 -0
- package/examples/canister-studio/src/values/candid-text.ts +479 -0
- package/examples/canister-studio/src/values/hints.ts +58 -0
- package/examples/canister-studio/src/values/json.test.ts +66 -0
- package/examples/canister-studio/src/values/json.ts +31 -0
- package/examples/canister-studio/src/values/leaves.tsx +309 -0
- package/examples/canister-studio/src/values/schema.test.ts +123 -0
- package/examples/canister-studio/src/values/schema.ts +78 -0
- package/examples/canister-studio/src/values/test-router.tsx +21 -0
- package/examples/canister-studio/src/values/tree.tsx +670 -0
- package/examples/canister-studio/src/values/use-sha256.ts +29 -0
- package/examples/canister-studio/tsconfig.json +20 -0
- package/examples/canister-studio/vite.config.ts +50 -0
- package/examples/canister-studio/vitest.config.ts +20 -0
- package/examples/icrc-ledger/.stackblitzrc +4 -0
- package/examples/icrc-ledger/README.md +100 -0
- package/examples/icrc-ledger/ckbtc_minter.did +12 -0
- package/examples/icrc-ledger/icp_ledger.did +147 -0
- package/examples/icrc-ledger/icrc1.did +88 -0
- package/examples/icrc-ledger/index.html +13 -0
- package/examples/icrc-ledger/package.json +40 -0
- package/examples/icrc-ledger/scripts/smoke.ts +151 -0
- package/examples/icrc-ledger/src/App.tsx +71 -0
- package/examples/icrc-ledger/src/ErrorPanel.tsx +105 -0
- package/examples/icrc-ledger/src/MainnetTab.tsx +450 -0
- package/examples/icrc-ledger/src/SandboxTab.test.tsx +379 -0
- package/examples/icrc-ledger/src/SandboxTab.tsx +761 -0
- package/examples/icrc-ledger/src/blocks.test.ts +247 -0
- package/examples/icrc-ledger/src/blocks.ts +140 -0
- package/examples/icrc-ledger/src/canisters/ckbtc_minter.envelope.json +96 -0
- package/examples/icrc-ledger/src/canisters/ckbtc_minter.ts +16 -0
- package/examples/icrc-ledger/src/canisters/icp_ledger.envelope.json +690 -0
- package/examples/icrc-ledger/src/canisters/icp_ledger.ts +223 -0
- package/examples/icrc-ledger/src/canisters/icrc1.envelope.json +840 -0
- package/examples/icrc-ledger/src/canisters/icrc1.ts +78 -0
- package/examples/icrc-ledger/src/format.test.ts +41 -0
- package/examples/icrc-ledger/src/format.ts +68 -0
- package/examples/icrc-ledger/src/ledger.ts +15 -0
- package/examples/icrc-ledger/src/main.tsx +10 -0
- package/examples/icrc-ledger/src/minter.ts +16 -0
- package/examples/icrc-ledger/src/sandbox.test.ts +464 -0
- package/examples/icrc-ledger/src/sandbox.ts +281 -0
- package/examples/icrc-ledger/src/styles.css +391 -0
- package/examples/icrc-ledger/src/transfer-form.test.ts +62 -0
- package/examples/icrc-ledger/src/transfer-form.ts +97 -0
- package/examples/icrc-ledger/tsconfig.json +19 -0
- package/examples/icrc-ledger/vite.config.ts +44 -0
- package/examples/icrc-ledger/vitest.config.ts +12 -0
- package/examples/next-ssr/.stackblitzrc +4 -0
- package/examples/next-ssr/README.md +112 -0
- package/examples/next-ssr/icrc1.did +88 -0
- package/examples/next-ssr/next.config.ts +10 -0
- package/examples/next-ssr/package.json +41 -0
- package/examples/next-ssr/scripts/smoke.ts +169 -0
- package/examples/next-ssr/src/app/account/CertifiedBalances.tsx +58 -0
- package/examples/next-ssr/src/app/account/account.test.tsx +165 -0
- package/examples/next-ssr/src/app/account/page.tsx +82 -0
- package/examples/next-ssr/src/app/api/balance/[ledger]/[principal]/route.ts +10 -0
- package/examples/next-ssr/src/app/globals.css +278 -0
- package/examples/next-ssr/src/app/layout.tsx +34 -0
- package/examples/next-ssr/src/app/page.tsx +46 -0
- package/examples/next-ssr/src/app/providers.browser.test.tsx +127 -0
- package/examples/next-ssr/src/app/providers.test.tsx +73 -0
- package/examples/next-ssr/src/app/providers.tsx +60 -0
- package/examples/next-ssr/src/canisters/icrc1.envelope.json +840 -0
- package/examples/next-ssr/src/canisters/icrc1.ts +78 -0
- package/examples/next-ssr/src/components/BalanceTable.tsx +43 -0
- package/examples/next-ssr/src/components/LedgerCard.test.tsx +96 -0
- package/examples/next-ssr/src/components/LedgerCard.tsx +230 -0
- package/examples/next-ssr/src/components/LedgerError.tsx +32 -0
- package/examples/next-ssr/src/components/LedgerSections.tsx +22 -0
- package/examples/next-ssr/src/components/MyBalances.test.tsx +253 -0
- package/examples/next-ssr/src/components/MyBalances.tsx +129 -0
- package/examples/next-ssr/src/components/SessionBadge.tsx +18 -0
- package/examples/next-ssr/src/components/hydration.test.tsx +259 -0
- package/examples/next-ssr/src/components/server-data.ts +10 -0
- package/examples/next-ssr/src/format.ts +46 -0
- package/examples/next-ssr/src/ledgers.ts +38 -0
- package/examples/next-ssr/src/server/balance-route.test.ts +151 -0
- package/examples/next-ssr/src/server/balance-route.ts +157 -0
- package/examples/next-ssr/src/server/error-summary.test.ts +34 -0
- package/examples/next-ssr/src/server/error-summary.ts +37 -0
- package/examples/next-ssr/src/server/parse-owner.test.ts +39 -0
- package/examples/next-ssr/src/server/parse-owner.ts +34 -0
- package/examples/next-ssr/src/server/prefetch-ledgers.test.ts +137 -0
- package/examples/next-ssr/src/server/prefetch-ledgers.ts +70 -0
- package/examples/next-ssr/src/server/read-balances.test.ts +103 -0
- package/examples/next-ssr/src/server/read-balances.ts +78 -0
- package/examples/next-ssr/src/server/request-client.rsc.test.tsx +110 -0
- package/examples/next-ssr/src/server/request-client.ts +24 -0
- package/examples/next-ssr/src/testing/mock-ledgers.ts +115 -0
- package/examples/next-ssr/src/testing/react-server-dom-turbopack.d.ts +15 -0
- package/examples/next-ssr/src/testing/setup.ts +10 -0
- package/examples/next-ssr/tsconfig.json +31 -0
- package/examples/next-ssr/vitest.config.ts +59 -0
- package/examples/node-agent-tool/.stackblitzrc +4 -0
- package/examples/node-agent-tool/README.md +165 -0
- package/examples/node-agent-tool/icp.yaml +11 -0
- package/examples/node-agent-tool/icrc1.did +88 -0
- package/examples/node-agent-tool/package.json +32 -0
- package/examples/node-agent-tool/src/canisters/icrc1.envelope.json +840 -0
- package/examples/node-agent-tool/src/canisters/icrc1.ts +78 -0
- package/examples/node-agent-tool/src/cli.test.ts +64 -0
- package/examples/node-agent-tool/src/cli.ts +23 -0
- package/examples/node-agent-tool/src/command-line.ts +159 -0
- package/examples/node-agent-tool/src/commands/balance.ts +73 -0
- package/examples/node-agent-tool/src/commands/demo.test.ts +51 -0
- package/examples/node-agent-tool/src/commands/demo.ts +359 -0
- package/examples/node-agent-tool/src/commands/info.ts +69 -0
- package/examples/node-agent-tool/src/commands/reads.test.ts +133 -0
- package/examples/node-agent-tool/src/commands/resend.test.ts +363 -0
- package/examples/node-agent-tool/src/commands/transfer.test.ts +313 -0
- package/examples/node-agent-tool/src/commands/transfer.ts +415 -0
- package/examples/node-agent-tool/src/commands/watch.test.ts +159 -0
- package/examples/node-agent-tool/src/commands/watch.ts +135 -0
- package/examples/node-agent-tool/src/commands/whoami.ts +36 -0
- package/examples/node-agent-tool/src/context.ts +20 -0
- package/examples/node-agent-tool/src/dispatch.ts +70 -0
- package/examples/node-agent-tool/src/failure.test.ts +59 -0
- package/examples/node-agent-tool/src/failure.ts +176 -0
- package/examples/node-agent-tool/src/identity.test.ts +242 -0
- package/examples/node-agent-tool/src/identity.ts +228 -0
- package/examples/node-agent-tool/src/input.ts +110 -0
- package/examples/node-agent-tool/src/ledgers.test.ts +74 -0
- package/examples/node-agent-tool/src/ledgers.ts +62 -0
- package/examples/node-agent-tool/src/mock-ledger.ts +211 -0
- package/examples/node-agent-tool/src/network.test.ts +128 -0
- package/examples/node-agent-tool/src/network.ts +101 -0
- package/examples/node-agent-tool/src/output.test.ts +208 -0
- package/examples/node-agent-tool/src/output.ts +163 -0
- package/examples/node-agent-tool/src/run.ts +73 -0
- package/examples/node-agent-tool/src/test-kit.ts +167 -0
- package/examples/node-agent-tool/tsconfig.json +18 -0
- package/examples/node-agent-tool/vitest.config.ts +8 -0
- package/examples/vite-wallet/.stackblitzrc +4 -0
- package/examples/vite-wallet/Cargo.lock +646 -0
- package/examples/vite-wallet/Cargo.toml +5 -0
- package/examples/vite-wallet/README.md +107 -0
- package/examples/vite-wallet/backend/Cargo.toml +12 -0
- package/examples/vite-wallet/backend/backend.did +37 -0
- package/examples/vite-wallet/backend/src/lib.rs +133 -0
- package/examples/vite-wallet/icp.yaml +44 -0
- package/examples/vite-wallet/index.html +13 -0
- package/examples/vite-wallet/ledger.did +54 -0
- package/examples/vite-wallet/package.json +46 -0
- package/examples/vite-wallet/public/.ic-assets.json5 +26 -0
- package/examples/vite-wallet/scripts/faucet-args.test.ts +30 -0
- package/examples/vite-wallet/scripts/faucet-args.ts +41 -0
- package/examples/vite-wallet/scripts/faucet.ts +41 -0
- package/examples/vite-wallet/src/AddressBook.test.tsx +191 -0
- package/examples/vite-wallet/src/AddressBook.tsx +147 -0
- package/examples/vite-wallet/src/App.tsx +53 -0
- package/examples/vite-wallet/src/Balance.test.tsx +57 -0
- package/examples/vite-wallet/src/Balance.tsx +58 -0
- package/examples/vite-wallet/src/EnvironmentPanel.test.tsx +83 -0
- package/examples/vite-wallet/src/EnvironmentPanel.tsx +103 -0
- package/examples/vite-wallet/src/ErrorNote.tsx +70 -0
- package/examples/vite-wallet/src/Profile.test.tsx +145 -0
- package/examples/vite-wallet/src/Profile.tsx +92 -0
- package/examples/vite-wallet/src/SendIcp.test.tsx +231 -0
- package/examples/vite-wallet/src/SendIcp.tsx +244 -0
- package/examples/vite-wallet/src/SendToContact.test.tsx +113 -0
- package/examples/vite-wallet/src/SendToContact.tsx +102 -0
- package/examples/vite-wallet/src/SignIn.test.tsx +106 -0
- package/examples/vite-wallet/src/SignIn.tsx +120 -0
- package/examples/vite-wallet/src/Wallet.test.tsx +89 -0
- package/examples/vite-wallet/src/account-switch.test.tsx +108 -0
- package/examples/vite-wallet/src/auth/dev-accounts.test.ts +113 -0
- package/examples/vite-wallet/src/auth/dev-accounts.ts +216 -0
- package/examples/vite-wallet/src/auth/local-page.test.ts +28 -0
- package/examples/vite-wallet/src/auth/local-page.ts +20 -0
- package/examples/vite-wallet/src/auth/wallet-auth.test.ts +159 -0
- package/examples/vite-wallet/src/auth/wallet-auth.ts +131 -0
- package/examples/vite-wallet/src/canisters/backend.envelope.json +275 -0
- package/examples/vite-wallet/src/canisters/backend.ts +58 -0
- package/examples/vite-wallet/src/canisters/ledger.envelope.json +451 -0
- package/examples/vite-wallet/src/canisters/ledger.ts +56 -0
- package/examples/vite-wallet/src/client.ts +45 -0
- package/examples/vite-wallet/src/main.tsx +18 -0
- package/examples/vite-wallet/src/optimistic-contacts.ts +113 -0
- package/examples/vite-wallet/src/refusal.ts +17 -0
- package/examples/vite-wallet/src/styles.css +282 -0
- package/examples/vite-wallet/src/test/test-wallet.tsx +322 -0
- package/examples/vite-wallet/src/token.ts +50 -0
- package/examples/vite-wallet/src/transfer.test.ts +178 -0
- package/examples/vite-wallet/src/transfer.ts +110 -0
- package/examples/vite-wallet/src/use-canisters.ts +49 -0
- package/examples/vite-wallet/tsconfig.json +19 -0
- package/examples/vite-wallet/vite.config.ts +47 -0
- package/examples/vite-wallet/vitest.config.ts +17 -0
- package/package.json +9 -4
- package/packages/core/.size-limit.js +47 -0
- package/packages/core/LICENSE +21 -0
- package/packages/core/README.md +84 -0
- package/packages/core/llms.txt +610 -0
- package/packages/core/package.json +89 -0
- package/packages/core/src/call.ts +961 -0
- package/packages/core/src/canister.ts +259 -0
- package/packages/core/src/client.ts +2061 -0
- package/packages/core/src/errors.ts +1079 -0
- package/packages/core/src/hydration.ts +239 -0
- package/packages/core/src/index.ts +23 -0
- package/packages/core/src/keys.ts +108 -0
- package/packages/core/src/management.ts +138 -0
- package/packages/core/src/network.ts +1020 -0
- package/packages/core/src/options.ts +1000 -0
- package/packages/core/src/runtime.ts +50 -0
- package/packages/core/src/testing/fake-replica.ts +1166 -0
- package/packages/core/src/testing/index.ts +16 -0
- package/packages/core/src/testing/test-auth.ts +340 -0
- package/packages/core/src/testing/test-client.ts +559 -0
- package/packages/core/src/types.ts +541 -0
- package/packages/core/src/units.ts +299 -0
- package/packages/core/src/version.ts +4 -0
- package/packages/core/tests/canister-helpers.ts +187 -0
- package/packages/core/tests/canister-id.test.ts +158 -0
- package/packages/core/tests/canister-unwrap.test.ts +94 -0
- package/packages/core/tests/canister.test-d.ts +406 -0
- package/packages/core/tests/canister.test.ts +1921 -0
- package/packages/core/tests/client-account-change.test.ts +131 -0
- package/packages/core/tests/client-agents.test.ts +402 -0
- package/packages/core/tests/client-auth-network.test.ts +719 -0
- package/packages/core/tests/client-disposed.test.ts +403 -0
- package/packages/core/tests/client-helpers.ts +136 -0
- package/packages/core/tests/client-hydration.test.ts +166 -0
- package/packages/core/tests/client-pinned.test.ts +626 -0
- package/packages/core/tests/client-session.test.ts +348 -0
- package/packages/core/tests/client.test-d.ts +181 -0
- package/packages/core/tests/client.test.ts +1162 -0
- package/packages/core/tests/encode.test.ts +171 -0
- package/packages/core/tests/env-canister-id.test.ts +666 -0
- package/packages/core/tests/env-cookie-copies.test.ts +182 -0
- package/packages/core/tests/error-guard.test.ts +222 -0
- package/packages/core/tests/errors.test-d.ts +280 -0
- package/packages/core/tests/errors.test.ts +1359 -0
- package/packages/core/tests/fixtures/README.md +28 -0
- package/packages/core/tests/fixtures/accounts.did +21 -0
- package/packages/core/tests/fixtures/accounts.envelope.json +367 -0
- package/packages/core/tests/fixtures/accounts.ts +26 -0
- package/packages/core/tests/fixtures/archive.did +31 -0
- package/packages/core/tests/fixtures/archive.envelope.json +259 -0
- package/packages/core/tests/fixtures/archive.ts +55 -0
- package/packages/core/tests/fixtures/icrc1.did +88 -0
- package/packages/core/tests/fixtures/icrc1.envelope.json +840 -0
- package/packages/core/tests/fixtures/icrc1.ts +78 -0
- package/packages/core/tests/fixtures/management.did +724 -0
- package/packages/core/tests/fixtures/management.envelope.json +4455 -0
- package/packages/core/tests/fixtures/management.ts +486 -0
- package/packages/core/tests/fixtures/shapes.did +33 -0
- package/packages/core/tests/fixtures/shapes.envelope.json +440 -0
- package/packages/core/tests/fixtures/shapes.ts +56 -0
- package/packages/core/tests/fixtures/skippable.did +15 -0
- package/packages/core/tests/fixtures/skippable.envelope.json +182 -0
- package/packages/core/tests/fixtures/skippable.ts +33 -0
- package/packages/core/tests/func.test.ts +154 -0
- package/packages/core/tests/identity-attributes.test.ts +214 -0
- package/packages/core/tests/keys.test.ts +289 -0
- package/packages/core/tests/management.test.ts +206 -0
- package/packages/core/tests/network-helpers.ts +121 -0
- package/packages/core/tests/network.test-d.ts +78 -0
- package/packages/core/tests/network.test.ts +1051 -0
- package/packages/core/tests/options.test.ts +1594 -0
- package/packages/core/tests/redirect-sign-in.test.ts +393 -0
- package/packages/core/tests/resend.test-d.ts +81 -0
- package/packages/core/tests/resend.test.ts +723 -0
- package/packages/core/tests/skip.test-d.ts +125 -0
- package/packages/core/tests/testing-entry.test.ts +73 -0
- package/packages/core/tests/testing-fake-replica.test.ts +1242 -0
- package/packages/core/tests/testing-test-auth.test-d.ts +84 -0
- package/packages/core/tests/testing-test-auth.test.ts +483 -0
- package/packages/core/tests/testing-test-client.test-d.ts +184 -0
- package/packages/core/tests/testing-test-client.test.ts +1272 -0
- package/packages/core/tests/time-realm.test.ts +63 -0
- package/packages/core/tests/time.test.ts +238 -0
- package/packages/core/tests/traps/README.md +39 -0
- package/packages/core/tests/traps/anonymous-write.test.ts +145 -0
- package/packages/core/tests/traps/classification-table.test.ts +256 -0
- package/packages/core/tests/traps/err-arm.test.ts +144 -0
- package/packages/core/tests/traps/fetch-spy.ts +39 -0
- package/packages/core/tests/traps/invalidation-after-write.test.ts +178 -0
- package/packages/core/tests/traps/ledger.ts +248 -0
- package/packages/core/tests/traps/root-key-off-local.test.ts +130 -0
- package/packages/core/tests/traps/stale-data-across-users.test.ts +173 -0
- package/packages/core/tests/traps/unresolved-name.test.ts +155 -0
- package/packages/core/tests/traps/update-as-query.test.ts +244 -0
- package/packages/core/tests/traps/update-not-resent.test.ts +126 -0
- package/packages/core/tests/traps/update-resent-when-never-delivered.test.ts +159 -0
- package/packages/core/tests/traps.test-d.ts +476 -0
- package/packages/core/tests/units.test-d.ts +118 -0
- package/packages/core/tests/units.test.ts +634 -0
- package/packages/core/tsconfig.json +19 -0
- package/packages/core/tsconfig.typecheck.json +16 -0
- package/packages/core/vitest.config.ts +13 -0
- package/packages/mcp/LICENSE +21 -0
- package/packages/mcp/README.md +189 -0
- package/packages/mcp/package.json +62 -0
- package/packages/mcp/src/candid/candid-text.test.ts +455 -0
- package/packages/mcp/src/candid/candid-text.ts +501 -0
- package/packages/mcp/src/candid/contract.test.ts +398 -0
- package/packages/mcp/src/candid/formats.ts +155 -0
- package/packages/mcp/src/candid/hex.ts +29 -0
- package/packages/mcp/src/candid/json-schema.test.ts +758 -0
- package/packages/mcp/src/candid/json-schema.ts +454 -0
- package/packages/mcp/src/candid/json.test.ts +1207 -0
- package/packages/mcp/src/candid/json.ts +1053 -0
- package/packages/mcp/src/candid/schema-walk.ts +189 -0
- package/packages/mcp/src/candid/type-text.test.ts +179 -0
- package/packages/mcp/src/candid/type-text.ts +238 -0
- package/packages/mcp/src/cli.ts +134 -0
- package/packages/mcp/src/identity.ts +188 -0
- package/packages/mcp/src/interface/cache.test.ts +48 -0
- package/packages/mcp/src/interface/cache.ts +68 -0
- package/packages/mcp/src/interface/cli-cache.test.ts +150 -0
- package/packages/mcp/src/interface/cli-cache.ts +122 -0
- package/packages/mcp/src/interface/compile-worker.test.ts +246 -0
- package/packages/mcp/src/interface/compile-worker.ts +290 -0
- package/packages/mcp/src/interface/compile.test.ts +155 -0
- package/packages/mcp/src/interface/compile.ts +281 -0
- package/packages/mcp/src/interface/docs.test.ts +105 -0
- package/packages/mcp/src/interface/docs.ts +86 -0
- package/packages/mcp/src/interface/fixtures/icrc1.did +88 -0
- package/packages/mcp/src/interface/hex.ts +8 -0
- package/packages/mcp/src/interface/ids.test.ts +71 -0
- package/packages/mcp/src/interface/ids.ts +87 -0
- package/packages/mcp/src/interface/loader.test.ts +804 -0
- package/packages/mcp/src/interface/loader.ts +519 -0
- package/packages/mcp/src/interface/read-candid.test.ts +300 -0
- package/packages/mcp/src/interface/read-candid.ts +259 -0
- package/packages/mcp/src/interface/types.ts +113 -0
- package/packages/mcp/src/network.ts +122 -0
- package/packages/mcp/src/options.ts +149 -0
- package/packages/mcp/src/server/approval.ts +159 -0
- package/packages/mcp/src/server/naming.ts +43 -0
- package/packages/mcp/src/server/results.ts +102 -0
- package/packages/mcp/src/server/server.ts +797 -0
- package/packages/mcp/src/server/tools.ts +116 -0
- package/packages/mcp/src/usage.ts +40 -0
- package/packages/mcp/tests/approval.test.ts +60 -0
- package/packages/mcp/tests/identity.test.ts +234 -0
- package/packages/mcp/tests/naming.test.ts +62 -0
- package/packages/mcp/tests/options.test.ts +140 -0
- package/packages/mcp/tests/server.test.ts +997 -0
- package/packages/mcp/tsconfig.json +19 -0
- package/packages/mcp/tsconfig.typecheck.json +10 -0
- package/packages/mcp/vitest.config.ts +10 -0
- package/packages/react/LICENSE +21 -0
- package/packages/react/README.md +328 -0
- package/packages/react/llms.txt +95 -0
- package/packages/react/package.json +95 -0
- package/packages/react/src/index.tsx +678 -0
- package/packages/react/tests/abandoned-render.test.tsx +816 -0
- package/packages/react/tests/auth.test.tsx +315 -0
- package/packages/react/tests/caller-keys.test.tsx +2334 -0
- package/packages/react/tests/client-time.test.ts +40 -0
- package/packages/react/tests/entry.test.ts +52 -0
- package/packages/react/tests/helpers.tsx +291 -0
- package/packages/react/tests/hydration.test.tsx +262 -0
- package/packages/react/tests/ownership.test.tsx +260 -0
- package/packages/react/tests/provider.server.test.tsx +169 -0
- package/packages/react/tests/query-client.test.tsx +107 -0
- package/packages/react/tests/strict-mode.test.tsx +288 -0
- package/packages/react/tests/suspense.test-d.tsx +357 -0
- package/packages/react/tests/two-query-cores.test.tsx +135 -0
- package/packages/react/tests/types.test-d.tsx +63 -0
- package/packages/react/tsconfig.json +23 -0
- package/packages/react/tsconfig.test.json +8 -0
- package/packages/react/tsconfig.typecheck.json +16 -0
- package/packages/react/vitest.config.ts +39 -0
- package/packages/vite-plugin/LICENSE +21 -0
- package/packages/vite-plugin/README.md +532 -0
- package/packages/vite-plugin/package.json +76 -0
- package/packages/vite-plugin/src/describe-value.test.ts +43 -0
- package/packages/vite-plugin/src/describe-value.ts +167 -0
- package/packages/vite-plugin/src/dev-environment.test.ts +747 -0
- package/packages/vite-plugin/src/dev-environment.ts +510 -0
- package/packages/vite-plugin/src/env.ts +431 -0
- package/packages/vite-plugin/src/fetch.ts +348 -0
- package/packages/vite-plugin/src/file-identity.ts +106 -0
- package/packages/vite-plugin/src/generate.ts +691 -0
- package/packages/vite-plugin/src/index.test.ts +1243 -0
- package/packages/vite-plugin/src/index.ts +2565 -0
- package/packages/vite-plugin/src/interface.ts +339 -0
- package/packages/vite-plugin/src/local-host.ts +34 -0
- package/packages/vite-plugin/src/options.ts +641 -0
- package/packages/vite-plugin/src/principal-text.test.ts +87 -0
- package/packages/vite-plugin/src/principal-text.ts +98 -0
- package/packages/vite-plugin/tests/close.test.ts +141 -0
- package/packages/vite-plugin/tests/environment-mode.test.ts +136 -0
- package/packages/vite-plugin/tests/fake-ic.ts +214 -0
- package/packages/vite-plugin/tests/fetch-sdk.test.ts +27 -0
- package/packages/vite-plugin/tests/fetch.test.ts +1196 -0
- package/packages/vite-plugin/tests/fixtures/fake-cli/bin.js +90 -0
- package/packages/vite-plugin/tests/fixtures/fake-cli/package.json +8 -0
- package/packages/vite-plugin/tests/fixtures/icrc1.did +88 -0
- package/packages/vite-plugin/tests/generation.test.ts +1036 -0
- package/packages/vite-plugin/tests/icp-command.test.ts +194 -0
- package/packages/vite-plugin/tests/icp-timeout.test.ts +83 -0
- package/packages/vite-plugin/tests/no-process-exit.test.ts +83 -0
- package/packages/vite-plugin/tests/on-generated.test.ts +323 -0
- package/packages/vite-plugin/tests/output-collision.test.ts +329 -0
- package/packages/vite-plugin/tests/package.test.ts +62 -0
- package/packages/vite-plugin/tests/project.test.ts +2993 -0
- package/packages/vite-plugin/tests/support.ts +339 -0
- package/packages/vite-plugin/tests/timeout.test.ts +107 -0
- package/packages/vite-plugin/tsconfig.json +23 -0
- package/packages/vite-plugin/tsconfig.typecheck.json +16 -0
- package/packages/vite-plugin/vitest.config.ts +9 -0
- package/pnpm-workspace.yaml +23 -0
- package/scripts/ai-context-files.js +72 -0
- package/scripts/assemble-docs-site.mjs +485 -0
- package/scripts/assemble-docs-site.test.mjs +568 -0
- package/scripts/build-examples.js +58 -0
- package/scripts/check-ai-context.js +963 -0
- package/scripts/check-ai-context.test.mjs +811 -0
- package/scripts/check-exports.mjs +767 -0
- package/scripts/check-exports.test.mjs +1136 -0
- package/scripts/check-snippets/ambient.d.ts +428 -0
- package/scripts/check-snippets/app/generated/backend.did +7 -0
- package/scripts/check-snippets/app/generated/backend.ts +15 -0
- package/scripts/check-snippets/app/generated/icrc1.did +88 -0
- package/scripts/check-snippets/app/generated/icrc1.ts +78 -0
- package/scripts/check-snippets/app/globals.ts +26 -0
- package/scripts/check-snippets/docs/guides/App.tsx +21 -0
- package/scripts/check-snippets/docs/guides/app/providers.tsx +23 -0
- package/scripts/check-snippets/docs/guides/auth-client.ts +47 -0
- package/scripts/check-snippets/docs/guides/canisters/backend.ts +3 -0
- package/scripts/check-snippets/docs/guides/canisters/icrc1.ts +3 -0
- package/scripts/check-snippets/docs/guides/components/LedgerCard.tsx +26 -0
- package/scripts/check-snippets/docs/guides/components/shell.tsx +11 -0
- package/scripts/check-snippets/docs/guides/components/sign-in-page.tsx +29 -0
- package/scripts/check-snippets/docs/guides/components/slow-section.tsx +5 -0
- package/scripts/check-snippets/docs/guides/generated/accounts.ts +95 -0
- package/scripts/check-snippets/docs/guides/generated/ckbtc_minter.ts +40 -0
- package/scripts/check-snippets/docs/guides/generated/icp_ledger.ts +267 -0
- package/scripts/check-snippets/docs/guides/ledger.ts +10 -0
- package/scripts/check-snippets/docs/guides/server/request-client.ts +8 -0
- package/scripts/check-snippets.mjs +993 -0
- package/scripts/check-snippets.test.mjs +338 -0
- package/scripts/check-stack.mjs +501 -0
- package/scripts/check-stack.test.mjs +800 -0
- package/scripts/clean-node-modules.js +67 -0
- package/scripts/example-projects.js +58 -0
- package/scripts/export-budget.mjs +145 -0
- package/scripts/faults.json +6749 -0
- package/scripts/lib/fault-workspace.mjs +210 -0
- package/scripts/lib/io.mjs +29 -0
- package/scripts/lib/io.test.mjs +38 -0
- package/scripts/lib/markdown-fences.mjs +56 -0
- package/scripts/lib/markdown-fences.test.mjs +84 -0
- package/scripts/lib/package-exports.mjs +54 -0
- package/scripts/lib/package-exports.test.mjs +66 -0
- package/scripts/lib/release-pr-steps.mjs +47 -0
- package/scripts/release-tag.mjs +95 -0
- package/scripts/release-tag.test.mjs +278 -0
- package/scripts/release-workflow.test.mjs +98 -0
- package/scripts/release.js +167 -0
- package/scripts/release.test.mjs +347 -0
- package/scripts/removed-v3-names.js +125 -0
- package/scripts/size-app/.size-limit.js +90 -0
- package/scripts/size-app/core.js +3 -0
- package/scripts/size-app/package.json +24 -0
- package/scripts/size-app/react.js +4 -0
- package/scripts/size-app.test.mjs +73 -0
- package/scripts/sync-ai-context-versions.js +102 -0
- package/scripts/sync-example-versions.js +151 -0
- package/scripts/test-examples-published.mjs +1585 -0
- package/scripts/test-examples-published.test.mjs +1586 -0
- package/scripts/traps/any-method-vars-not-a-list.json +5 -0
- package/scripts/traps/canister-method-unknown.json +5 -0
- package/scripts/traps/client-says-who-calls-once.json +5 -0
- package/scripts/traps/client-says-who-calls.json +5 -0
- package/scripts/traps/err-only-on-canister-err.json +14 -0
- package/scripts/traps/format-units-refuses-missing-value.json +5 -0
- package/scripts/traps/format-units-refuses-number.json +5 -0
- package/scripts/traps/format-units-unknown-option.json +5 -0
- package/scripts/traps/guard-err-is-the-methods.json +5 -0
- package/scripts/traps/guard-false-keeps-every-kind.json +5 -0
- package/scripts/traps/internals-not-exported.json +9 -0
- package/scripts/traps/network-refuses-unknown-name.json +5 -0
- package/scripts/traps/never-err-has-no-type.json +5 -0
- package/scripts/traps/options-method-unknown.json +5 -0
- package/scripts/traps/options-vars-wrong-type.json +5 -0
- package/scripts/traps/parse-units-refuses-number.json +5 -0
- package/scripts/traps/parse-units-unknown-option.json +5 -0
- package/scripts/traps/principal-is-not-plain-text.json +14 -0
- package/scripts/traps/query-options-refuses-oneway.json +5 -0
- package/scripts/traps/query-options-refuses-update.json +5 -0
- package/scripts/traps/refuse-next-unknown-option.json +5 -0
- package/scripts/traps/resend-key-reads-the-methods-arg.json +5 -0
- package/scripts/traps/resend-states-its-dedupe-key.json +5 -0
- package/scripts/traps/suspense-refuses-argument-skip.json +5 -0
- package/scripts/traps/suspense-refuses-skippable-read.json +5 -0
- package/scripts/traps/suspense-refuses-vars-skip-fits.json +5 -0
- package/scripts/traps/test-handler-method-unknown.json +5 -0
- package/scripts/traps/test-handler-nat-is-bigint.json +5 -0
- package/scripts/traps/test-handler-takes-the-domain-value.json +5 -0
- package/scripts/traps/vars-of-two-arguments-are-the-tuple.json +5 -0
- package/scripts/typecheck-examples.js +122 -0
- package/scripts/verify-faults.mjs +375 -0
- package/scripts/verify-faults.test.mjs +402 -0
- package/scripts/verify-package-artifacts.mjs +590 -0
- package/scripts/verify-peer-floors.js +399 -0
- package/scripts/verify-peer-floors.test.mjs +422 -0
- package/scripts/verify-test-fails-rules.mjs +104 -0
- package/scripts/verify-test-fails-rules.test.mjs +215 -0
- package/scripts/verify-test-fails.js +371 -0
- package/scripts/verify-traps.mjs +505 -0
- package/scripts/verify-traps.test.mjs +521 -0
- package/scripts/verify-typescript-floor.js +239 -0
- package/skill-packages/ic-reactor/SKILL.md +103 -0
- package/stack.json +8 -0
- package/tsconfig.base.json +23 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
# @ic-reactor/vite-plugin
|
|
2
|
+
|
|
3
|
+
> **This is the plugin of ic-reactor 4.** It replaces the 0.15 plugin of the
|
|
4
|
+
> 3.x line, which generates reactor bindings with `@ic-reactor/codegen`, is
|
|
5
|
+
> documented at https://ic-reactor.b3pay.net/v3/packages/vite-plugin, and takes
|
|
6
|
+
> security fixes until 90 days after the 4.0 release.
|
|
7
|
+
|
|
8
|
+
A Vite plugin for an app built on a module that `meant gen` generates
|
|
9
|
+
from a `.did` file. It does two things, and exports only `icReactor` and the
|
|
10
|
+
type `IcReactorPluginOptions`:
|
|
11
|
+
|
|
12
|
+
- **Generation.** It runs `meant gen` on each configured `.did` file
|
|
13
|
+
when a build or the dev server starts, and again when that file changes. The
|
|
14
|
+
generated module is Meant's, as the generator wrote it: the plugin
|
|
15
|
+
adds no wrapper files, hooks or reactors. A `.did` that is not on disk yet
|
|
16
|
+
can be fetched from the live canister first (see "Fetch a .did from a live
|
|
17
|
+
canister").
|
|
18
|
+
- **Environment.** Under `vite dev` and `vite preview` it sets the `ic_env`
|
|
19
|
+
cookie and proxies `/api` to the local IC network, so the app finds its
|
|
20
|
+
canister IDs and the replica's root key without configuration.
|
|
21
|
+
|
|
22
|
+
The docs site's [Vite plugin guide](https://ic-reactor.b3pay.net/v4/guides/vite-plugin/)
|
|
23
|
+
covers the same ground, and
|
|
24
|
+
[Getting started](https://ic-reactor.b3pay.net/v4/guides/getting-started/)
|
|
25
|
+
uses the plugin in a new app.
|
|
26
|
+
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
The plugin runs the `@meantjs/cli` your app installs, and that CLI has to
|
|
30
|
+
pair with the `@meantjs/schema` runtime the generated modules import. Both
|
|
31
|
+
are pinned to one exact release, as Meant asks of every release before 1.0,
|
|
32
|
+
and so is the plugin's peer on the CLI:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
npm install --save-exact @meantjs/schema@0.6.0
|
|
36
|
+
npm install --save-dev --save-exact @meantjs/cli@0.5.1
|
|
37
|
+
npm install --save-dev @ic-reactor/vite-plugin
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Install the CLI at the version above: without a version, npm installs the
|
|
41
|
+
newest CLI, and when that one pairs with another schema, npm stops with
|
|
42
|
+
`ERESOLVE`.
|
|
43
|
+
|
|
44
|
+
`@icp-sdk/core` 6.1 or later is an optional peer: the plugin loads it only to
|
|
45
|
+
fetch a `.did` from a live canister, and an app on `@ic-reactor/core` has it
|
|
46
|
+
installed already.
|
|
47
|
+
|
|
48
|
+
## Quick Start
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
// vite.config.ts
|
|
52
|
+
import { defineConfig } from "vite"
|
|
53
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
54
|
+
|
|
55
|
+
export default defineConfig({
|
|
56
|
+
plugins: [
|
|
57
|
+
icReactor({
|
|
58
|
+
canisters: {
|
|
59
|
+
ledger: { didFile: "../backend/ledger.did" },
|
|
60
|
+
},
|
|
61
|
+
}),
|
|
62
|
+
],
|
|
63
|
+
})
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
On `vite dev` and `vite build` this writes `src/canisters/ledger.ts`, the
|
|
67
|
+
generated module (it exports `actor` and the type `Actor`), and
|
|
68
|
+
`src/canisters/ledger.envelope.json` next to it. The generator names its output
|
|
69
|
+
after the `.did` file, its name without the final `.did`, not after the key in
|
|
70
|
+
`canisters`, and it reads only a file whose name ends in `.did`.
|
|
71
|
+
|
|
72
|
+
The first line the plugin logs says where an agent reads how to use the
|
|
73
|
+
library: `ic-reactor: agent guide at node_modules/@ic-reactor/core/llms.txt`.
|
|
74
|
+
|
|
75
|
+
## Options
|
|
76
|
+
|
|
77
|
+
| Option | Default | Meaning |
|
|
78
|
+
| ------------------- | ------------------------------------ | --------------------------------------------------------------------------------- |
|
|
79
|
+
| `canisters` | `{}` | The app's canisters, by their name in the `icp` project; see below |
|
|
80
|
+
| `injectEnvironment` | `true` | Set the cookie and the `/api` proxy under `vite dev` and `vite preview` |
|
|
81
|
+
| `failOnError` | build and Vitest `true`, dev `false` | Abort the Vite run when a canister fails to generate; see "When generation fails" |
|
|
82
|
+
| `onGenerated` | none | Called after each generated module; see "After each generation" |
|
|
83
|
+
|
|
84
|
+
Each entry of `canisters` takes:
|
|
85
|
+
|
|
86
|
+
| Field | Default | Meaning |
|
|
87
|
+
| ------------ | ----------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
88
|
+
| `didFile` | none | The canister's Candid file, relative to the Vite root. Without it nothing is generated |
|
|
89
|
+
| `outDir` | `"src/canisters"` | Where the generator writes, relative to the Vite root |
|
|
90
|
+
| `canisterId` | none | A fixed ID for the cookie, which wins over the one `icp` reports, and the canister a missing `didFile` is fetched from |
|
|
91
|
+
| `network` | `"ic"` | Where that canister is, for the fetch: `"ic"`, `"local"` or `{ host }` |
|
|
92
|
+
| `methods` | none | The methods the app calls: a fetched `didFile` is written as the projection of the interface to them |
|
|
93
|
+
| `verify` | none | `"live"` checks the `didFile` against the live canister at each build and dev server start |
|
|
94
|
+
|
|
95
|
+
Every value given is checked when the plugin is made, on every canister (one
|
|
96
|
+
without a `didFile` included) and whether or not a build would use it: only an
|
|
97
|
+
omitted field is one not given. A canister whose entry is not a plain object,
|
|
98
|
+
or whose field holds a value that is not one (a `didFile` or `outDir` that is
|
|
99
|
+
not a path, a `canisterId` that is not the text of a principal, a `network`,
|
|
100
|
+
`methods` or `verify` that is none of the values above, or a getter that
|
|
101
|
+
throws) fails, under `failOnError`, with a message that quotes the value as
|
|
102
|
+
given, whatever its kind. The plugin fetches, writes, runs and requests
|
|
103
|
+
nothing to generate it, nor fetches a `didFile` it shares with other
|
|
104
|
+
canisters, and the others build as they would. So does a canister whose
|
|
105
|
+
module a canister before it writes (below), and one that `IC_REACTOR_FETCH` or
|
|
106
|
+
`IC_REACTOR_VERIFY` names but that has no `canisterId`. Under `vite dev`, a
|
|
107
|
+
save of its file, and the file's deletion, leave it failed for the same reason
|
|
108
|
+
and run nothing for it. Such a canister is still named in the `ic_env` cookie,
|
|
109
|
+
as every entry is (but one whose name the cookie cannot carry, below), and
|
|
110
|
+
under `vite dev` `icp` is still asked for its ID: the app may still call it. A
|
|
111
|
+
`canisters`, `injectEnvironment` or `failOnError` that is not one, `null`
|
|
112
|
+
included, throws when the config loads: only an omitted option takes its
|
|
113
|
+
default.
|
|
114
|
+
|
|
115
|
+
Every key is checked too, whatever its value, `undefined` included. A key of
|
|
116
|
+
an entry that is none of the fields above (a misspelled `didfile` or
|
|
117
|
+
`canisterID`), or a key of a `network` of `{ host }` other than `host`, fails
|
|
118
|
+
its canister, and a key of the options that is none of `canisters`,
|
|
119
|
+
`injectEnvironment`, `failOnError` and `onGenerated` throws when the config loads. The
|
|
120
|
+
message names the option the key may misspell. Never read, a misspelled key
|
|
121
|
+
would leave a canister ungenerated, or generated without its ID, without a
|
|
122
|
+
word.
|
|
123
|
+
|
|
124
|
+
The options, `canisters`, each entry and a `network` of `{ host }` are plain
|
|
125
|
+
objects: written `{ … }`, or made by `JSON.parse`, `Object.fromEntries` or
|
|
126
|
+
`Object.create(null)`. A `Map`, a `Promise` (a loader that was not awaited),
|
|
127
|
+
an instance of a class or an object that inherits from another is refused as
|
|
128
|
+
any other value that is not one: read for its keys, it would be read as none.
|
|
129
|
+
|
|
130
|
+
An entry's key is the canister's name in the `icp` project, kept as given:
|
|
131
|
+
`__proto__` or `constructor` (from a JSON config, or a computed key) names a
|
|
132
|
+
canister as any other name does, and so does a name that begins with `-`. The
|
|
133
|
+
cookie joins its entries with `&` and each name to its ID with `=`, as the
|
|
134
|
+
asset canister writes it, so a name that holds either, which no name `icp`
|
|
135
|
+
gives a canister does, is left out of the cookie, with a warning under
|
|
136
|
+
`vite dev`; such a canister is generated as any other.
|
|
137
|
+
|
|
138
|
+
Canisters that share one interface share one module. An ICP ledger and a ckBTC
|
|
139
|
+
ledger both on `icrc1.did` are two entries, so that the `ic_env` cookie carries
|
|
140
|
+
each ID, and one generated module:
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
// vite.config.ts
|
|
144
|
+
import { defineConfig } from "vite"
|
|
145
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
146
|
+
|
|
147
|
+
export default defineConfig({
|
|
148
|
+
plugins: [
|
|
149
|
+
icReactor({
|
|
150
|
+
canisters: {
|
|
151
|
+
icp_ledger: { didFile: "did/icrc1.did" },
|
|
152
|
+
ckbtc_ledger: { didFile: "did/icrc1.did" },
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
],
|
|
156
|
+
})
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
The generator is given `icrc1.did` once, writes `src/canisters/icrc1.ts` once,
|
|
160
|
+
and a save of the file regenerates it once. (Naming a canister without a
|
|
161
|
+
`didFile` is the same thing when only the cookie is wanted.) Different `.did`
|
|
162
|
+
files that name the same module cannot share an `outDir`: `a/ledger.did` and
|
|
163
|
+
`b/ledger.did` both mean `ledger.ts`. The entry later in `canisters` fails,
|
|
164
|
+
with a message naming both, at the start of each build and dev server and
|
|
165
|
+
before anything is fetched, run or written for it, and a save of its file
|
|
166
|
+
does not generate it either. Give one an `outDir` of its own. Names that
|
|
167
|
+
differ only in case (`Ledger.did` and `ledger.did`) collide only where the
|
|
168
|
+
filesystem of the `outDir` ignores case, as macOS and Windows do by default:
|
|
169
|
+
the plugin checks the filesystem and does not refuse them where it tells them
|
|
170
|
+
apart.
|
|
171
|
+
|
|
172
|
+
## Fetch a .did from a live canister
|
|
173
|
+
|
|
174
|
+
Give an entry a `canisterId`, and a `didFile` that is not on disk is written
|
|
175
|
+
from the live canister's `candid:service` metadata, read from certified state
|
|
176
|
+
with `HttpAgent.readState`, before it is generated:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
// vite.config.ts
|
|
180
|
+
import { defineConfig } from "vite"
|
|
181
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
182
|
+
|
|
183
|
+
export default defineConfig({
|
|
184
|
+
plugins: [
|
|
185
|
+
icReactor({
|
|
186
|
+
canisters: {
|
|
187
|
+
ledger: {
|
|
188
|
+
didFile: "did/icp_ledger.did", // written when missing: commit it
|
|
189
|
+
canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
190
|
+
network: "ic",
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
}),
|
|
194
|
+
],
|
|
195
|
+
})
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
- A `didFile` on disk is generated with no network request, under `vite build`
|
|
199
|
+
and `vite dev`. Commit the file the plugin writes, and builds stay
|
|
200
|
+
reproducible and work offline.
|
|
201
|
+
- It is fetched again only on request: `IC_REACTOR_FETCH=ledger vite build`
|
|
202
|
+
(names separated by commas, or `all`). A build without it never rewrites a
|
|
203
|
+
`didFile`.
|
|
204
|
+
- `network` is `"ic"` (mainnet, checked against the mainnet root key; the
|
|
205
|
+
default), `"local"` (icp-cli's local network on `http://127.0.0.1:8000`,
|
|
206
|
+
whose root key is fetched from it), or `{ host }`, whose root key is fetched
|
|
207
|
+
only when the host is local (`localhost`, `*.localhost` or a loopback
|
|
208
|
+
address) and is mainnet's otherwise, as `createClient` decides.
|
|
209
|
+
- An unreachable network, a refused read (the canister keeps its interface
|
|
210
|
+
private), a canister that publishes no `candid:service`, a canister that
|
|
211
|
+
does not exist on that network, a certificate that does not verify against
|
|
212
|
+
the root key (the message names the key), and a network that does not answer
|
|
213
|
+
within 30 seconds each fail with a message of their own, naming the canister
|
|
214
|
+
and what to do next. A `didFile` that cannot be written fails only the
|
|
215
|
+
canisters that name it. A failed fetch follows `failOnError` as a failed
|
|
216
|
+
generation does, and is tried again at the next build.
|
|
217
|
+
- Canisters that name one `didFile` (under any path to it: through a
|
|
218
|
+
symlinked directory, or in another case where the filesystem ignores case)
|
|
219
|
+
share one fetch. When they name different canisters or networks to fetch it
|
|
220
|
+
from, none is fetched and each fails, naming them and the file: give each
|
|
221
|
+
its own `didFile`, or write the file yourself. A `didFile` on disk is shared
|
|
222
|
+
whatever their `canisterId`s. A `didFile` that is a symlink is written
|
|
223
|
+
through, to the file it links to. Only the fetch is shared: the generator
|
|
224
|
+
(`@meantjs/cli` 0.5.1) reads a `didFile` only by its exact name on disk,
|
|
225
|
+
and not through a symlink to a file, so an entry that names it either way
|
|
226
|
+
fails with `did_source_not_found`. Name the file as it is on disk in each
|
|
227
|
+
entry.
|
|
228
|
+
- `canisterId` is also the ID the `ic_env` cookie carries under `vite dev`.
|
|
229
|
+
|
|
230
|
+
### Only the methods the app calls
|
|
231
|
+
|
|
232
|
+
With `methods`, the fetched `didFile` holds only those methods and every type
|
|
233
|
+
they reach: the projection of the live interface, written by
|
|
234
|
+
`meant project`, so the generated module has only them.
|
|
235
|
+
|
|
236
|
+
```ts
|
|
237
|
+
// vite.config.ts
|
|
238
|
+
import { defineConfig } from "vite"
|
|
239
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
240
|
+
|
|
241
|
+
export default defineConfig({
|
|
242
|
+
plugins: [
|
|
243
|
+
icReactor({
|
|
244
|
+
canisters: {
|
|
245
|
+
ledger: {
|
|
246
|
+
didFile: "did/icp_ledger.did", // the projection: commit it
|
|
247
|
+
canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
248
|
+
methods: ["icrc1_balance_of", "icrc1_fee", "icrc1_transfer"],
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
}),
|
|
252
|
+
],
|
|
253
|
+
})
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
- A name the live interface does not have fails the canister, naming it and
|
|
257
|
+
listing the methods the canister has, and nothing is written.
|
|
258
|
+
- A `didFile` on disk is not fetched again when `methods` changes. The plugin
|
|
259
|
+
compares the two with no network access: a name of `methods` that the file
|
|
260
|
+
does not hold fails the canister, and a method the file holds that `methods`
|
|
261
|
+
does not name is a warning. Both say to fetch the file again with
|
|
262
|
+
`IC_REACTOR_FETCH=<name>`, which writes the projection to the new list. A
|
|
263
|
+
file whose methods cannot be listed (it does not compile, or
|
|
264
|
+
`meant` fails) fails the canister. A file saved after its methods
|
|
265
|
+
were listed, before its module is generated, is not taken by that run (see
|
|
266
|
+
[Generation](#generation)).
|
|
267
|
+
- Canisters that name one `didFile` to be fetched must name one list to share
|
|
268
|
+
its fetch, and an entry with no `canisterId` counts too, since it generates
|
|
269
|
+
from the same file: its `methods`, or the whole interface when it names
|
|
270
|
+
none. With different lists, or when one of them fails for a value of its
|
|
271
|
+
own (a list that cannot be projected to, say), nothing is fetched and no
|
|
272
|
+
request is made: each fails with one message naming the entries and the
|
|
273
|
+
file, and their lists when they differ, or the reasons of the one that
|
|
274
|
+
fails. A `didFile` on disk that is not fetched again is read by them all,
|
|
275
|
+
and compared with the list of each as above.
|
|
276
|
+
- Only an omitted `methods` is the whole interface. Any other value given
|
|
277
|
+
that is not a list of method names (`null`, `false`, `""`, an empty list,
|
|
278
|
+
or a name with a comma) fails the canister before any request. Likewise
|
|
279
|
+
only an omitted `canisterId` is none: one given as `""` or `null`, or as
|
|
280
|
+
text with a letter wrong (its checksum tells) or of more than 63
|
|
281
|
+
characters (a principal of the IC is at most 29 bytes), fails the canister,
|
|
282
|
+
whether or not a fetch or a check would use it, and is left out of the
|
|
283
|
+
`ic_env` cookie with a warning (see [Options](#options)).
|
|
284
|
+
|
|
285
|
+
### The live check
|
|
286
|
+
|
|
287
|
+
`verify: "live"` on an entry, or `IC_REACTOR_VERIFY=1 vite build` (or `true`,
|
|
288
|
+
`all`, or canister names separated by commas) for every entry with a
|
|
289
|
+
`canisterId`, checks the `didFile` on disk against the live canister's certified
|
|
290
|
+
interface with `meant check`, at the start of each build and dev server. Each
|
|
291
|
+
check is a network request, so `verify: "live"` makes every build need the
|
|
292
|
+
network; `IC_REACTOR_VERIFY=1` in CI keeps other builds offline.
|
|
293
|
+
`IC_REACTOR_VERIFY=0` (or `false`) turns the check off for a run, over
|
|
294
|
+
`verify: "live"`.
|
|
295
|
+
|
|
296
|
+
- A method of the file that the canister no longer has (`method_missing`),
|
|
297
|
+
whose mode changed (`mode_changed`), or whose types are no longer compatible
|
|
298
|
+
(`method_incompatible`, with the path into the type) fails the canister,
|
|
299
|
+
which is not generated, and the failure follows `failOnError`.
|
|
300
|
+
- A compatible change is a warning, and the canister generates: one Candid
|
|
301
|
+
accepts only by reading a value as `null` (`special_opt_rule`), and one that
|
|
302
|
+
changed the types of the file's methods compatibly. Methods the file does
|
|
303
|
+
not hold are not checked.
|
|
304
|
+
- A check that cannot read the canister (the network, a private interface)
|
|
305
|
+
fails the canister too, and says to build with `IC_REACTOR_VERIFY=0`: a
|
|
306
|
+
check that was asked for and did not run does not pass.
|
|
307
|
+
- A file the build just fetched is the live interface: it is not checked,
|
|
308
|
+
and passes as fetched. Within one build or dev server, a check that passed
|
|
309
|
+
is not repeated for the same text by a rebuild (`vite build --watch`) or by
|
|
310
|
+
another Vite environment, until a check of that canister fails or cannot be
|
|
311
|
+
made, or a fetch of its file fails or reads another interface: restoring a
|
|
312
|
+
text that passed earlier then checks it again. The check of a file saved
|
|
313
|
+
before the check is done (even saved back) counts for nothing, passed or
|
|
314
|
+
failed: it records no pass, neither sets nor clears a failure that stands,
|
|
315
|
+
and that run does not take the file: a build fails it, and `vite dev`
|
|
316
|
+
queues it again as a save, which makes no request (see
|
|
317
|
+
[Generation](#generation)). Each build
|
|
318
|
+
and each start of the dev server, a restart included, checks every
|
|
319
|
+
canister again, so a restart finds a canister that changed since its last
|
|
320
|
+
check.
|
|
321
|
+
- A save under `vite dev` never makes a request. So a canister whose check
|
|
322
|
+
failed (or could not be made, as with the network down) stays failed after
|
|
323
|
+
a save, whatever the save changed, and is not generated, until a start
|
|
324
|
+
checks it again and the check passes, fetches the file again
|
|
325
|
+
(`IC_REACTOR_FETCH`), or runs with the check off: restart the dev server
|
|
326
|
+
(`r` and Enter in its terminal) to check again.
|
|
327
|
+
- `verify` takes only `"live"`: any other value, `true` or `false` included,
|
|
328
|
+
fails the canister before anything is fetched for it, and so does `"live"`
|
|
329
|
+
with no `canisterId`. Remove `verify` for no check.
|
|
330
|
+
|
|
331
|
+
## Generation
|
|
332
|
+
|
|
333
|
+
The generator is WebAssembly, so the plugin does not load it: it runs the bin
|
|
334
|
+
script of the `@meantjs/cli` installed for your app (resolved from the Vite
|
|
335
|
+
root, so a monorepo's hoisted copy is found) with the running Node binary, in a
|
|
336
|
+
child process and not through a shell. A trap, a crash or a runaway loop on a
|
|
337
|
+
bad `.did` ends that process and the plugin reports it. The dev server is not
|
|
338
|
+
affected.
|
|
339
|
+
|
|
340
|
+
- Canisters that write into one `outDir` share one process, and each `outDir`
|
|
341
|
+
has its own. A process that dies without a report is run again, one
|
|
342
|
+
canister at a time and side by side, so the failure lands on the canister
|
|
343
|
+
that caused it.
|
|
344
|
+
- A process that runs longer than 60 seconds is killed, and counts as one that
|
|
345
|
+
died: when it was generating several canisters, each is run again alone and
|
|
346
|
+
only the one that hangs fails. A hang therefore costs up to two timeouts
|
|
347
|
+
(120 seconds) before the others are generated.
|
|
348
|
+
- What the generator writes to stderr is logged as a warning, a line at a time
|
|
349
|
+
and as it arrives, naming the `.did` files its process is generating. With
|
|
350
|
+
`--json` the generator reports in its JSON document, so what shows up here
|
|
351
|
+
is a crash's output or a warning from the runtime. When a process fails, its
|
|
352
|
+
stderr is also in the error message, so that text appears twice. Past 200
|
|
353
|
+
lines from one process the rest is not logged, so a runaway generator does
|
|
354
|
+
not flood the terminal.
|
|
355
|
+
- Closing the dev server (or restarting it, as a `vite.config` edit does) kills
|
|
356
|
+
a generator of that server that is still running and drops its runs still
|
|
357
|
+
waiting, so none outlives the server it belonged to or runs beside the next
|
|
358
|
+
one. A server restarted with the same plugin object (an inline config, which
|
|
359
|
+
`server.restart()` keeps) has runs of its own: Vite starts it before it
|
|
360
|
+
closes the old one, and the old server's close does not stop them. Its
|
|
361
|
+
overlay starts as the old one's, and its runs change it.
|
|
362
|
+
- A declaration the generator cannot represent is left out of the module, and
|
|
363
|
+
the plugin logs each one as a warning, for example
|
|
364
|
+
`ic-reactor: ledger: omitted declaration Bad (reserved_field_name)`.
|
|
365
|
+
- Editing a `.did` regenerates only the canisters that name it. Saves that
|
|
366
|
+
arrive while it runs collapse into one more run. `vite build --watch`
|
|
367
|
+
regenerates a canister only when its `.did` text changed, or its module or
|
|
368
|
+
envelope is missing.
|
|
369
|
+
- A run (the start of a build or dev server, or a save's regeneration) reads
|
|
370
|
+
each `didFile` once, and again after each step that runs `meant` on it
|
|
371
|
+
(listing its methods, the live check, generation), since each of those reads
|
|
372
|
+
the file itself. A file written before the run is done with it (even saved
|
|
373
|
+
back) is not taken: the run does not generate it, reports nothing its steps
|
|
374
|
+
found of it, and puts back a module the generator wrote while the file was
|
|
375
|
+
written. Under `vite build` the canister fails for that reason alone
|
|
376
|
+
(`did/ledger.did changed during the build, after the build read it: … Build again.`);
|
|
377
|
+
under `vite dev` the file is queued again, as a save is, and until that run
|
|
378
|
+
reports it the overlay is left as it was. Only the `didFile` is read again,
|
|
379
|
+
not a `.did` it imports from its directory.
|
|
380
|
+
- Deleting a `.did` under `vite dev` fails the canisters that name it at once,
|
|
381
|
+
in the log and the overlay: the module it generated is still on disk, and
|
|
382
|
+
would otherwise look current. Putting the file back regenerates them.
|
|
383
|
+
|
|
384
|
+
### When generation fails
|
|
385
|
+
|
|
386
|
+
A failed canister costs that canister, and nothing else:
|
|
387
|
+
|
|
388
|
+
- Under `vite build` the build fails, with the generator's diagnostics (or its
|
|
389
|
+
stderr, if it crashed) in the error message. A build that exits 0 would ship
|
|
390
|
+
the bindings left over from the last good run.
|
|
391
|
+
- Under `vite dev` the failure is logged and shown in the browser's error
|
|
392
|
+
overlay, and the server keeps serving. The overlay lists the canisters that
|
|
393
|
+
are still broken: fixing one of several updates it, and fixing the last
|
|
394
|
+
clears it. Vite's client clears an error overlay whenever it applies a hot
|
|
395
|
+
update, as it does for Vite's own errors, so a canister that is still broken
|
|
396
|
+
can drop out of the browser's overlay after you save some other file. Its
|
|
397
|
+
error stays in the terminal log, and a full reload shows the overlay again.
|
|
398
|
+
- Under Vitest (mode `test`) the run fails at startup, as a build does: tests
|
|
399
|
+
that pass against the modules left over from the last good run prove
|
|
400
|
+
nothing.
|
|
401
|
+
- `failOnError` overrides each default. It takes `true` or `false`: any
|
|
402
|
+
other value (`null`, `0`, `"false"`) throws when the config loads, as does
|
|
403
|
+
one for `injectEnvironment`.
|
|
404
|
+
|
|
405
|
+
### After each generation
|
|
406
|
+
|
|
407
|
+
`onGenerated` is called once for each module a run generated, after the
|
|
408
|
+
generator wrote or checked it and its envelope, under `vite build` and
|
|
409
|
+
`vite dev` alike. Use it for a step that reads the generated output and must
|
|
410
|
+
run after every generation:
|
|
411
|
+
|
|
412
|
+
```ts
|
|
413
|
+
import { readFile } from "node:fs/promises"
|
|
414
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
415
|
+
|
|
416
|
+
icReactor({
|
|
417
|
+
canisters: { ledger: { didFile: "did/ledger.did" } },
|
|
418
|
+
onGenerated: async ({ names, envelope, status }) => {
|
|
419
|
+
const text = await readFile(envelope, "utf-8")
|
|
420
|
+
// check it, or write derived files; throw to fail the run
|
|
421
|
+
console.log(names, status, text.length)
|
|
422
|
+
},
|
|
423
|
+
})
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
- It is handed `names` (canisters that share a `didFile` and an `outDir`
|
|
427
|
+
share one module and one call), the absolute paths `didFile`, `module` and
|
|
428
|
+
`envelope`, `status` (`"written"`, or `"unchanged"` when the module on disk
|
|
429
|
+
was already what the generator would write), and a `signal` that aborts
|
|
430
|
+
when the build or dev server closes. A close stops waiting for the hook,
|
|
431
|
+
and the next run generates the module again and calls the hook again.
|
|
432
|
+
- It runs inside the plugin's one queue of runs: it never overlaps a
|
|
433
|
+
generation, and `buildStart` waits for it, so under `vite build` a hook
|
|
434
|
+
that never settles holds the build.
|
|
435
|
+
- It is not called for a canister that failed or was refused, nor for a run
|
|
436
|
+
that does not generate the module again (the second `buildStart` of
|
|
437
|
+
Vite 6 and later, a `vite build --watch` rebuild not caused by a `.did`
|
|
438
|
+
or by a missing module or envelope).
|
|
439
|
+
A save under `vite dev` always generates again, so saving the same text
|
|
440
|
+
calls it with `"unchanged"`.
|
|
441
|
+
- A throw or a rejection fails the module's canisters as a failed generation
|
|
442
|
+
does: the build or the Vitest run fails unless `failOnError` is `false`, and
|
|
443
|
+
otherwise the failure is logged and, under `vite dev`, shown in the error
|
|
444
|
+
overlay. The
|
|
445
|
+
next run generates them again and calls the hook again.
|
|
446
|
+
- A value that is not a function throws when the config loads.
|
|
447
|
+
|
|
448
|
+
### In CI
|
|
449
|
+
|
|
450
|
+
`meant gen --check` compares the generated files with the ones on disk, writes
|
|
451
|
+
nothing, and exits 1 on any difference. Run it with the same arguments the
|
|
452
|
+
plugin uses to fail a pipeline when committed output is stale:
|
|
453
|
+
|
|
454
|
+
```json
|
|
455
|
+
{
|
|
456
|
+
"scripts": {
|
|
457
|
+
"gen:check": "meant gen ../backend/ledger.did -o src/canisters --check"
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
## Local Development Behavior
|
|
463
|
+
|
|
464
|
+
When `injectEnvironment` is enabled during `vite dev` or `vite preview`, the
|
|
465
|
+
plugin:
|
|
466
|
+
|
|
467
|
+
1. asks `icp` for the local network status
|
|
468
|
+
2. resolves canister IDs: the keys of `canisters`, and `internet_identity`,
|
|
469
|
+
which is added automatically if not already listed
|
|
470
|
+
3. sets the `ic_env` cookie on each response
|
|
471
|
+
4. proxies `/api` to the local replica
|
|
472
|
+
|
|
473
|
+
If a canister has a `canisterId` set in the plugin config, that value is used
|
|
474
|
+
for it, and `icp` is not asked for its ID. `internet_identity` is asked for
|
|
475
|
+
even then: what `icp` reports decides whether the cookie also names icp-cli's
|
|
476
|
+
built-in Internet Identity.
|
|
477
|
+
|
|
478
|
+
Set the `ICP_ENVIRONMENT` environment variable to target a non-default network
|
|
479
|
+
(defaults to `"local"`).
|
|
480
|
+
|
|
481
|
+
If environment detection fails, the plugin falls back to proxying `/api` to
|
|
482
|
+
icp-cli's local network, `http://127.0.0.1:8000`, and sets no cookie (a page
|
|
483
|
+
load clears one the browser kept), or with no canisters configured one that
|
|
484
|
+
names only icp-cli's built-in Internet Identity. It warns when that happens with canisters configured, and when a
|
|
485
|
+
configured canister has no ID, because the failure is otherwise
|
|
486
|
+
indistinguishable from success until the app breaks on an undefined canister
|
|
487
|
+
id. Run with `DEBUG=ic-reactor` to see the `icp` output
|
|
488
|
+
behind the warning.
|
|
489
|
+
|
|
490
|
+
Detection is complete once `icp` reports the network and every configured
|
|
491
|
+
canister has an ID. Until then the plugin asks `icp` again on each page load,
|
|
492
|
+
and that page gets the answer: start `vite dev` first, then run
|
|
493
|
+
`icp network start` and `icp deploy`, and reload the page. The `/api` proxy
|
|
494
|
+
moves to the network `icp` reports, the fallback included. Once detection is
|
|
495
|
+
complete, page loads run no further `icp` commands, so any network restart
|
|
496
|
+
(`icp network stop`, then `start` and `icp deploy`) needs a dev server
|
|
497
|
+
restart, even when the root key stays the same. icp-cli 1.2.0's managed
|
|
498
|
+
network kept its root key across starts while a new deploy gave the names
|
|
499
|
+
other canister IDs.
|
|
500
|
+
|
|
501
|
+
While it serves, the plugin holds a connection to the detected network, so it
|
|
502
|
+
notices the network stop when it stops, whether or not a request reaches it.
|
|
503
|
+
From then on it no longer vouches for the IDs it detected, which a network
|
|
504
|
+
started again may have given to other canisters. It warns once, page loads get
|
|
505
|
+
the cookie without those IDs and that root key (with canisters configured, no
|
|
506
|
+
cookie at all), and `vite dev` reloads the pages it has open so that they drop
|
|
507
|
+
the old cookie. `{ name }` canisters then reject `canister_id_unresolved`
|
|
508
|
+
instead of reaching another canister, until the dev server restarts. Under
|
|
509
|
+
`vite preview`, which has no HMR connection, reload open pages yourself.
|
|
510
|
+
|
|
511
|
+
A configured canister you never deploy locally keeps detection
|
|
512
|
+
incomplete, so every page load runs `icp` for it; set its `canisterId` and it
|
|
513
|
+
counts as resolved. If you never run a local network, set
|
|
514
|
+
`injectEnvironment: false` and page loads run no `icp`.
|
|
515
|
+
|
|
516
|
+
If your Vite config or another plugin sets `server.proxy["/api"]`, the plugin
|
|
517
|
+
leaves that entry alone, whether detection succeeds or not, and that proxy does
|
|
518
|
+
not follow detection.
|
|
519
|
+
|
|
520
|
+
## Tests
|
|
521
|
+
|
|
522
|
+
Vitest runs the plugin in mode `test`. There the plugin injects no environment
|
|
523
|
+
and never runs `icp`, whatever `injectEnvironment` says. Generation is not an
|
|
524
|
+
environment concern and still runs, so the modules a test imports exist. A
|
|
525
|
+
canister that fails to generate fails the run at startup, unless `failOnError`
|
|
526
|
+
is `false`: a `.did` that does not parse, a fetch that fails, a live check
|
|
527
|
+
(`verify: "live"`, `IC_REACTOR_VERIFY`) that fails or cannot reach the
|
|
528
|
+
network, an `onGenerated` that throws. For an offline test run with the live
|
|
529
|
+
check on, set `IC_REACTOR_VERIFY=0`. A `.did` that stops generating after
|
|
530
|
+
startup, in watch mode, is logged, as under `vite dev`. A Vitest run in
|
|
531
|
+
another mode (`--mode`, `test.mode`) keeps the dev default, and a Vitest
|
|
532
|
+
config that does not load the plugin generates nothing.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ic-reactor/vite-plugin",
|
|
3
|
+
"version": "4.1.1",
|
|
4
|
+
"description": "Vite plugin that generates modules from .did files with @meantjs/cli and injects the local IC environment (ic_env cookie and /api proxy) in development",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22.12.0"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.cjs",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"require": {
|
|
19
|
+
"types": "./dist/index.d.cts",
|
|
20
|
+
"default": "./dist/index.cjs"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsup src/index.ts --format esm,cjs --dts --clean --tsconfig tsconfig.json",
|
|
31
|
+
"dev": "tsup src/index.ts --format esm,cjs --dts --watch --tsconfig tsconfig.json",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"typecheck": "tsc --noEmit -p tsconfig.typecheck.json"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"vite",
|
|
37
|
+
"vite-plugin",
|
|
38
|
+
"internet-computer",
|
|
39
|
+
"candid",
|
|
40
|
+
"ic-reactor",
|
|
41
|
+
"dfinity",
|
|
42
|
+
"icp",
|
|
43
|
+
"llms",
|
|
44
|
+
"ai-friendly"
|
|
45
|
+
],
|
|
46
|
+
"author": "Behrad Deylami",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/B3Pay/ic-reactor",
|
|
51
|
+
"directory": "packages/vite-plugin"
|
|
52
|
+
},
|
|
53
|
+
"bugs": {
|
|
54
|
+
"url": "https://github.com/B3Pay/ic-reactor/issues"
|
|
55
|
+
},
|
|
56
|
+
"homepage": "https://ic-reactor.b3pay.net/v4/packages/vite-plugin/",
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"@meantjs/cli": "0.5.1",
|
|
59
|
+
"@icp-sdk/core": "^6.1.0",
|
|
60
|
+
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
|
|
61
|
+
},
|
|
62
|
+
"peerDependenciesMeta": {
|
|
63
|
+
"@icp-sdk/core": {
|
|
64
|
+
"optional": true
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@meantjs/cli": "0.5.1",
|
|
69
|
+
"@icp-sdk/core": "^6.1.0",
|
|
70
|
+
"@noble/curves": "^2.2.0",
|
|
71
|
+
"@types/node": "^26.5.1",
|
|
72
|
+
"tsup": "^8.5.1",
|
|
73
|
+
"typescript": "^6.0.3",
|
|
74
|
+
"vitest": "^5.0.0"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest"
|
|
2
|
+
import { describeError } from "./describe-value.js"
|
|
3
|
+
|
|
4
|
+
describe("describeError", () => {
|
|
5
|
+
// Node keeps a DOMException's message behind a getter of its class, not on
|
|
6
|
+
// the error: read as an own property only, an AbortError was quoted as
|
|
7
|
+
// `DOMException {}`.
|
|
8
|
+
it("gives the message of a DOMException, as an abort or a timeout throws it", () => {
|
|
9
|
+
expect(
|
|
10
|
+
describeError(
|
|
11
|
+
new DOMException("This operation was aborted", "AbortError")
|
|
12
|
+
)
|
|
13
|
+
).toBe("This operation was aborted")
|
|
14
|
+
expect(describeError(AbortSignal.abort().reason)).toBe(
|
|
15
|
+
"This operation was aborted"
|
|
16
|
+
)
|
|
17
|
+
expect(
|
|
18
|
+
describeError(
|
|
19
|
+
new DOMException(
|
|
20
|
+
"The operation was aborted due to timeout",
|
|
21
|
+
"TimeoutError"
|
|
22
|
+
)
|
|
23
|
+
)
|
|
24
|
+
).toBe("The operation was aborted due to timeout")
|
|
25
|
+
expect(describeError(new TypeError("fetch failed"))).toBe("fetch failed")
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
// Read through the error, the message of a class that makes it a getter
|
|
29
|
+
// would run that getter: code of the value's.
|
|
30
|
+
it("runs no getter that a class of the error's own makes of its message, and quotes the error instead", () => {
|
|
31
|
+
let read = 0
|
|
32
|
+
class Quiet extends Error {}
|
|
33
|
+
Object.defineProperty(Quiet.prototype, "message", {
|
|
34
|
+
get() {
|
|
35
|
+
read += 1
|
|
36
|
+
return "read"
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
expect(describeError(new Quiet())).toBe("Quiet {}")
|
|
41
|
+
expect(read).toBe(0)
|
|
42
|
+
})
|
|
43
|
+
})
|