@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,690 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "The Vite plugin"
|
|
3
|
+
description: "@ic-reactor/vite-plugin: generation through @meantjs/cli in a child process, the ic_env cookie and /api proxy, and its options"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`@ic-reactor/vite-plugin` is for an app built on a module that
|
|
7
|
+
`meant gen` generates from a `.did` file. It does two things, and it
|
|
8
|
+
exports only `icReactor` and the type `IcReactorPluginOptions`:
|
|
9
|
+
|
|
10
|
+
- **Generation.** It runs `meant gen` on each configured `.did` file
|
|
11
|
+
when a build or the dev server starts, and again when that file changes. The
|
|
12
|
+
module is the generator's, as it wrote it: the plugin adds no wrapper files,
|
|
13
|
+
hooks or reactors. A `.did` that is not on disk yet can be
|
|
14
|
+
[fetched from the live canister](#fetch-a-did-from-a-live-canister) first.
|
|
15
|
+
- **Environment.** Under `vite dev` and `vite preview` it sets the `ic_env`
|
|
16
|
+
cookie and proxies `/api` to the local IC network, so the app finds its
|
|
17
|
+
canister ids and the replica's root key without configuration.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
The plugin runs the `@meantjs/cli` that your app installs, and that CLI has
|
|
22
|
+
to pair with the `@meantjs/schema` runtime the generated modules import.
|
|
23
|
+
Both are pinned to one exact release, as Meant asks of every release before
|
|
24
|
+
1.0, and so is the plugin's peer on the CLI:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
npm install --save-exact @meantjs/schema@0.6.0
|
|
28
|
+
npm install --save-dev --save-exact @meantjs/cli@0.5.1
|
|
29
|
+
npm install --save-dev @ic-reactor/vite-plugin
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The plugin imports neither package, and no `@ic-reactor` runtime. Its peers are
|
|
33
|
+
the CLI, Vite 4.2 up to 8, and `@icp-sdk/core` 6.1 or later, which is optional:
|
|
34
|
+
the plugin loads it only to [fetch a `.did`](#fetch-a-did-from-a-live-canister),
|
|
35
|
+
and an app on `@ic-reactor/core` has it installed already. See
|
|
36
|
+
[@ic-reactor/vite-plugin](/v4/packages/vite-plugin/).
|
|
37
|
+
|
|
38
|
+
## Quick start
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
// vite.config.ts
|
|
42
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
43
|
+
import { defineConfig } from "vite"
|
|
44
|
+
|
|
45
|
+
export default defineConfig({
|
|
46
|
+
plugins: [
|
|
47
|
+
icReactor({
|
|
48
|
+
canisters: {
|
|
49
|
+
icrc1: { didFile: "did/icrc1.did" },
|
|
50
|
+
},
|
|
51
|
+
}),
|
|
52
|
+
],
|
|
53
|
+
})
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
On `vite dev` and `vite build` this writes `src/canisters/icrc1.ts`, the
|
|
57
|
+
generated module (it exports `actor` and the type `Actor`), and
|
|
58
|
+
`src/canisters/icrc1.envelope.json` beside it. The generator names its output
|
|
59
|
+
after the `.did` file, its name without the final `.did`, not after the key in
|
|
60
|
+
`canisters`, and it reads only a file whose name ends in `.did`. The app
|
|
61
|
+
imports it:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { createClient } from "@ic-reactor/core"
|
|
65
|
+
import { actor, type Actor } from "./canisters/icrc1"
|
|
66
|
+
|
|
67
|
+
const client = createClient({ network: "ic", identity: "anonymous" })
|
|
68
|
+
const ledger = client.canister<Actor>(actor, {
|
|
69
|
+
id: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
70
|
+
})
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Without an `outDir` the plugin writes to `src/canisters`. To match the
|
|
74
|
+
`./generated/...` imports of [Getting started](/v4/guides/getting-started/), set
|
|
75
|
+
`outDir: "src/generated"`.
|
|
76
|
+
|
|
77
|
+
The first line the plugin logs says where an agent reads how to use the
|
|
78
|
+
library: `ic-reactor: agent guide at node_modules/@ic-reactor/core/llms.txt`.
|
|
79
|
+
|
|
80
|
+
## Options
|
|
81
|
+
|
|
82
|
+
| Option | Default | Meaning |
|
|
83
|
+
| ------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------- |
|
|
84
|
+
| `canisters` | `{}` | The app's canisters, by their name in the `icp` project |
|
|
85
|
+
| `injectEnvironment` | `true` | Set the cookie and the `/api` proxy under `vite dev` and `vite preview` |
|
|
86
|
+
| `failOnError` | build and Vitest `true`, dev `false` | Abort the Vite run when a canister fails to generate. See [Failures](#when-generation-fails) |
|
|
87
|
+
| `onGenerated` | none | Called after each generated module. See [After each generation](#after-each-generation) |
|
|
88
|
+
|
|
89
|
+
Each entry of `canisters` takes:
|
|
90
|
+
|
|
91
|
+
| Field | Default | Meaning |
|
|
92
|
+
| ------------ | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
93
|
+
| `didFile` | none | The canister's Candid file, relative to the Vite root. Without it nothing is generated |
|
|
94
|
+
| `outDir` | `"src/canisters"` | Where the generator writes, relative to the Vite root |
|
|
95
|
+
| `canisterId` | none | A fixed id for the cookie, which wins over the one `icp` reports, and the canister a missing `didFile` is [fetched](#fetch-a-did-from-a-live-canister) from |
|
|
96
|
+
| `network` | `"ic"` | Where that canister is, for the fetch: `"ic"`, `"local"` or `{ host }` |
|
|
97
|
+
| `methods` | none | The methods the app calls: a fetched `didFile` is written as the [projection](#only-the-methods-the-app-calls) of the interface to them |
|
|
98
|
+
| `verify` | none | `"live"`: [check](#the-live-check) the `didFile` against the live canister when a build or dev server starts |
|
|
99
|
+
|
|
100
|
+
The key of an entry is the canister's name in the `icp` project, and it is the
|
|
101
|
+
name the cookie carries its id under, kept as given: `__proto__` or
|
|
102
|
+
`constructor` (from a JSON config, or a computed key) is a name as any other,
|
|
103
|
+
and so is a name that begins with `-`. The cookie joins its entries with `&`
|
|
104
|
+
and each name to its id with `=`, as the asset canister writes it, so a name
|
|
105
|
+
that holds either, which no name `icp` gives a canister does, is left out of
|
|
106
|
+
the cookie, with a warning under `vite dev`, and the canister is generated as
|
|
107
|
+
any other. A canister without a `didFile` generates nothing and is only named
|
|
108
|
+
in the cookie.
|
|
109
|
+
|
|
110
|
+
Every value given is checked when the plugin is made, on every canister (one
|
|
111
|
+
without a `didFile` included) and whether or not a build would use it: only an
|
|
112
|
+
omitted field is one not given. A canister whose entry is not a plain object,
|
|
113
|
+
or whose field holds a value that is not one (a `didFile` or `outDir` that is
|
|
114
|
+
not a path, a `canisterId` that is not the text of a principal, a `network`,
|
|
115
|
+
`methods` or `verify` that is none of the values above, or a getter that
|
|
116
|
+
throws) fails, under `failOnError`, with a message that quotes the value as
|
|
117
|
+
given, whatever its kind. The plugin fetches, writes, runs and requests
|
|
118
|
+
nothing to generate it, nor fetches a `didFile` it shares with other
|
|
119
|
+
canisters, and the others build as they would. So does a canister whose
|
|
120
|
+
module a canister before it writes (see
|
|
121
|
+
[below](#canisters-that-share-an-interface)), and one that `IC_REACTOR_FETCH`
|
|
122
|
+
or `IC_REACTOR_VERIFY` names but that has no `canisterId`. Under `vite dev`, a
|
|
123
|
+
save of its file, and the file's deletion, leave it failed for the same reason
|
|
124
|
+
and run nothing for it. Such a canister is still named in the cookie, as every
|
|
125
|
+
entry is (but one whose name the cookie cannot carry, above), and under
|
|
126
|
+
`vite dev` `icp` is still asked for its id: the app may still call it. A
|
|
127
|
+
`canisters`, `injectEnvironment` or `failOnError` that is not one, `null`
|
|
128
|
+
included, throws when the config loads: only an omitted option takes its
|
|
129
|
+
default.
|
|
130
|
+
|
|
131
|
+
Every key is checked too, whatever its value, `undefined` included. A key of
|
|
132
|
+
an entry that is none of the fields above (a misspelled `didfile` or
|
|
133
|
+
`canisterID`), or a key of a `network` of `{ host }` other than `host`, fails
|
|
134
|
+
its canister, and a key of the options that is none of `canisters`,
|
|
135
|
+
`injectEnvironment`, `failOnError` and `onGenerated` throws when the config loads. The
|
|
136
|
+
message names the option the key may misspell:
|
|
137
|
+
|
|
138
|
+
```text
|
|
139
|
+
ic-reactor: could not generate 1 of 1 canisters:
|
|
140
|
+
- ledger (did/icp_ledger.did): "canisterID" (did you mean canisterId?) is not an option of a canister: its options are didFile, outDir, canisterId, network, methods and verify
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Never read, a misspelled key would leave a canister ungenerated, or generated
|
|
144
|
+
without its id, without a word.
|
|
145
|
+
|
|
146
|
+
The options, `canisters`, each entry and a `network` of `{ host }` are plain
|
|
147
|
+
objects: written `{ … }`, or made by `JSON.parse`, `Object.fromEntries` or
|
|
148
|
+
`Object.create(null)`. A `Map`, a `Promise` (a loader that was not awaited),
|
|
149
|
+
an instance of a class or an object that inherits from another is refused as
|
|
150
|
+
any other value that is not one: read for its keys, it would be read as none.
|
|
151
|
+
|
|
152
|
+
### Canisters that share an interface
|
|
153
|
+
|
|
154
|
+
An ICP ledger and a ckBTC ledger can both use `icrc1.did`. They are two
|
|
155
|
+
entries, so that the cookie carries each id, and one generated module:
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
// vite.config.ts
|
|
159
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
160
|
+
import { defineConfig } from "vite"
|
|
161
|
+
|
|
162
|
+
export default defineConfig({
|
|
163
|
+
plugins: [
|
|
164
|
+
icReactor({
|
|
165
|
+
canisters: {
|
|
166
|
+
icp_ledger: { didFile: "did/icrc1.did" },
|
|
167
|
+
ckbtc_ledger: { didFile: "did/icrc1.did" },
|
|
168
|
+
},
|
|
169
|
+
}),
|
|
170
|
+
],
|
|
171
|
+
})
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
The generator is given `icrc1.did` once, writes `src/canisters/icrc1.ts` once,
|
|
175
|
+
and a save of the file regenerates it once.
|
|
176
|
+
|
|
177
|
+
Different `.did` files that name the same module cannot share an `outDir`:
|
|
178
|
+
`a/ledger.did` and `b/ledger.did` both mean `ledger.ts`. The entry later in
|
|
179
|
+
`canisters` fails, with a message naming both, at the start of each build and
|
|
180
|
+
dev server and before anything is fetched, run or written for it, and a save of
|
|
181
|
+
its file does not generate it either. Give one an `outDir` of its own. Names
|
|
182
|
+
that differ only in case (`Ledger.did`, `ledger.did`) collide only where the
|
|
183
|
+
filesystem of the `outDir` ignores case, as macOS and Windows do by default.
|
|
184
|
+
|
|
185
|
+
## Fetch a .did from a live canister
|
|
186
|
+
|
|
187
|
+
A canister can publish its Candid interface as `candid:service` metadata. Give
|
|
188
|
+
its entry a `canisterId`, and a `didFile` that is not on disk is written from
|
|
189
|
+
the live canister before it is generated:
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
// vite.config.ts
|
|
193
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
194
|
+
import { defineConfig } from "vite"
|
|
195
|
+
|
|
196
|
+
export default defineConfig({
|
|
197
|
+
plugins: [
|
|
198
|
+
icReactor({
|
|
199
|
+
canisters: {
|
|
200
|
+
ledger: {
|
|
201
|
+
didFile: "did/icp_ledger.did", // written when missing: commit it
|
|
202
|
+
canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
203
|
+
network: "ic",
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
}),
|
|
207
|
+
],
|
|
208
|
+
})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
- **`didFile` on disk:** the plugin generates from it and makes no network
|
|
212
|
+
request for the canister, under `vite build` and `vite dev` alike. Builds
|
|
213
|
+
stay reproducible and work offline. Commit the file.
|
|
214
|
+
- **`didFile` missing:** the plugin reads `candid:service` from certified
|
|
215
|
+
state (`HttpAgent.readState`, the certificate checked against the network's
|
|
216
|
+
root key), writes it to `didFile` as the canister publishes it, then
|
|
217
|
+
generates. It logs
|
|
218
|
+
`ic-reactor: wrote did/icp_ledger.did from the certified candid:service of ryjl3-tyaaa-aaaaa-aaaba-cai on ic (17368 bytes): commit it with the app`.
|
|
219
|
+
The next build reads the file and makes no request.
|
|
220
|
+
- **Fetching again** happens only when asked: run the build or the dev server
|
|
221
|
+
with `IC_REACTOR_FETCH=ledger` (names separated by commas, or `all`). A build
|
|
222
|
+
without it never rewrites a `didFile`. Under `vite dev` it is served once,
|
|
223
|
+
when the server starts.
|
|
224
|
+
- Canisters that name one `didFile` share one fetch. It is one file however
|
|
225
|
+
it is named: through a symlinked directory, or in another case where the
|
|
226
|
+
filesystem ignores case (macOS and Windows by default). When they name
|
|
227
|
+
different canisters, or one canister on different networks, which one's
|
|
228
|
+
interface the file holds cannot be told: nothing is fetched, and each of
|
|
229
|
+
them fails with a message naming them and the file. Give each its own
|
|
230
|
+
`didFile`, or write the file yourself. A `didFile` on disk is theirs to
|
|
231
|
+
share, whatever their `canisterId`s, since nothing is fetched for it. A
|
|
232
|
+
`didFile` that is a symlink is written through: the fetch goes to the file
|
|
233
|
+
it links to. The sharing is the fetch's only: the generator
|
|
234
|
+
(`@meantjs/cli` 0.5.1) reads a `didFile` only by its exact name on disk,
|
|
235
|
+
and not through a symlink to a file, so an entry that names it either way
|
|
236
|
+
fails with `did_source_not_found`. In each entry, name the file as it is on
|
|
237
|
+
disk.
|
|
238
|
+
|
|
239
|
+
`network` says where the canister is:
|
|
240
|
+
|
|
241
|
+
| `network` | Host | Root key the certificate is checked against |
|
|
242
|
+
| ---------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
243
|
+
| `"ic"` | `https://icp-api.io` | Mainnet's, which the agent ships with. The default |
|
|
244
|
+
| `"local"` | `http://127.0.0.1:8000` | Fetched from the replica: icp-cli's local network |
|
|
245
|
+
| `{ host }` | `host` | Fetched from the replica only when `host` is local (`localhost`, `*.localhost` or a loopback address), and mainnet's otherwise |
|
|
246
|
+
|
|
247
|
+
These are the rules `createClient` follows: a root key is fetched only from a
|
|
248
|
+
local host, so a host that is not local cannot hand over a key of its own. The
|
|
249
|
+
fetch needs `@icp-sdk/core`, an optional peer of the plugin. An app whose
|
|
250
|
+
`.did` files are all on disk never loads it.
|
|
251
|
+
|
|
252
|
+
`canisterId` is also the id the cookie carries under `vite dev` (see
|
|
253
|
+
[The local environment](#the-local-environment)). A canister deployed to the
|
|
254
|
+
local network under an id of its own, whose interface you want from mainnet,
|
|
255
|
+
keeps its committed `didFile`, or fetches it once and drops `canisterId`.
|
|
256
|
+
|
|
257
|
+
### When a fetch fails
|
|
258
|
+
|
|
259
|
+
Each failure says what happened to which canister, and what to do next:
|
|
260
|
+
|
|
261
|
+
- **The network cannot be reached** (no connection, or the local network is
|
|
262
|
+
not running): the message names the host. Under `"local"` it says to start
|
|
263
|
+
the network with `icp network start`.
|
|
264
|
+
- **The read is refused:** the canister keeps its interface private, and only
|
|
265
|
+
its controllers can read it (HTTP 403). Get the `.did` from the canister's
|
|
266
|
+
developers.
|
|
267
|
+
- **No metadata:** the canister publishes no `candid:service`, so there is no
|
|
268
|
+
interface to fetch.
|
|
269
|
+
- **No such canister** on that network: check `canisterId` and `network`.
|
|
270
|
+
- **The certificate does not verify** against the root key in the table above:
|
|
271
|
+
the message names that key. A `{ host }` that is not local is checked against
|
|
272
|
+
mainnet's key, so a testnet's own certificates fail there.
|
|
273
|
+
- **No answer within 30 seconds**, retries included: the message names the
|
|
274
|
+
host.
|
|
275
|
+
- **The file cannot be written** (a read-only directory, say): only the
|
|
276
|
+
canisters that name it fail, and the others generate.
|
|
277
|
+
|
|
278
|
+
A canister whose fetch failed is not generated, and the failure follows
|
|
279
|
+
`failOnError` as a generation failure does: under `vite build` it fails the
|
|
280
|
+
build, under Vitest the run's startup, and under `vite dev` it is logged and
|
|
281
|
+
shown in the overlay. A fetch that
|
|
282
|
+
failed, one that `IC_REACTOR_FETCH` asked for included, is tried again at the
|
|
283
|
+
next `buildStart`: each rebuild of
|
|
284
|
+
`vite build --watch`, and each Vite environment that starts one. Writing the
|
|
285
|
+
`didFile` yourself always works instead: the plugin reads a file on disk and
|
|
286
|
+
fetches nothing.
|
|
287
|
+
|
|
288
|
+
### Only the methods the app calls
|
|
289
|
+
|
|
290
|
+
A canister's interface can be far larger than what the app calls: the ICP
|
|
291
|
+
ledger's is 17 kB. With `methods`, the fetched `didFile` holds only those
|
|
292
|
+
methods and every type they reach, so the generated module has only them:
|
|
293
|
+
|
|
294
|
+
```ts
|
|
295
|
+
// vite.config.ts
|
|
296
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
297
|
+
import { defineConfig } from "vite"
|
|
298
|
+
|
|
299
|
+
export default defineConfig({
|
|
300
|
+
plugins: [
|
|
301
|
+
icReactor({
|
|
302
|
+
canisters: {
|
|
303
|
+
ledger: {
|
|
304
|
+
didFile: "did/icp_ledger.did", // the projection: commit it
|
|
305
|
+
canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
306
|
+
methods: ["icrc1_balance_of", "icrc1_fee", "icrc1_transfer"],
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
}),
|
|
310
|
+
],
|
|
311
|
+
})
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
The plugin fetches the certified `candid:service` as above, and writes its
|
|
315
|
+
projection to `methods` (`meant project`) instead of the whole
|
|
316
|
+
interface. It logs
|
|
317
|
+
`ic-reactor: wrote did/icp_ledger.did from the certified candid:service of ryjl3-tyaaa-aaaaa-aaaba-cai on ic, projected to icrc1_balance_of, icrc1_fee, icrc1_transfer (1327 bytes): commit it with the app`.
|
|
318
|
+
The projection keeps the canister's type names and doc comments, and prints
|
|
319
|
+
methods in name order. The same interface and the same list give the same
|
|
320
|
+
bytes, so `IC_REACTOR_FETCH` rewrites the file only when the canister changed.
|
|
321
|
+
|
|
322
|
+
- **A name the canister does not have** fails the canister, naming it and
|
|
323
|
+
listing the methods the canister has. Nothing is written.
|
|
324
|
+
- **A `didFile` on disk** is not fetched again when `methods` changes. The
|
|
325
|
+
plugin compares the two, with no network access, when the build starts and
|
|
326
|
+
when the file is saved. A name of `methods` that the file does not hold
|
|
327
|
+
fails the canister, since its module would lack the method. A method the
|
|
328
|
+
file holds that `methods` does not name is a warning, and the module keeps
|
|
329
|
+
it. Both say to run `IC_REACTOR_FETCH=<name>`, which writes the projection to
|
|
330
|
+
the new list. A file whose methods cannot be listed (it does not compile, or
|
|
331
|
+
`meant` fails) fails the canister: a comparison that did not run
|
|
332
|
+
does not pass. A file saved after its methods were listed, before its module
|
|
333
|
+
is generated, is not generated by that run (see
|
|
334
|
+
[A .did saved while the plugin reads it](#a-did-saved-while-the-plugin-reads-it)).
|
|
335
|
+
- Canisters that name one `didFile` share its fetch only when they name one
|
|
336
|
+
list. Every one of them generates from the file, so an entry with no
|
|
337
|
+
`canisterId` counts as much as the one it is fetched for: its `methods`, or
|
|
338
|
+
the whole interface when it names none. With different lists, or when one
|
|
339
|
+
of them fails for a value of its own (a list that cannot be projected to,
|
|
340
|
+
say), nothing is fetched and no request is made: each fails with one
|
|
341
|
+
message naming the entries and the file, and their lists when they differ,
|
|
342
|
+
or the reasons of the one that fails. A `didFile` on disk that nobody asked
|
|
343
|
+
to fetch again is read by them all, and compared with the list of each as
|
|
344
|
+
above.
|
|
345
|
+
- `methods` is a list of names: an empty list, or a name with a comma (which
|
|
346
|
+
`meant project` cannot take), fails the canister before any request. Only an
|
|
347
|
+
omitted `methods` is the whole interface: any other value a JavaScript config
|
|
348
|
+
gives (`null`, `false`, `0`, `""`) fails the canister too. Likewise only an
|
|
349
|
+
omitted `canisterId` is none: one given as `""` or `null`, or as text with a
|
|
350
|
+
letter wrong (its checksum tells) or of more than 63 characters (a principal
|
|
351
|
+
of the IC is at most 29 bytes), fails the canister, whether or not a fetch or
|
|
352
|
+
a check would use it, and is left out of the `ic_env` cookie with a warning
|
|
353
|
+
(see [Options](#options)).
|
|
354
|
+
|
|
355
|
+
### The live check
|
|
356
|
+
|
|
357
|
+
A committed `didFile` is what the app was compiled against. To find out whether
|
|
358
|
+
the live canister still answers it, ask for the live check: `verify: "live"` on
|
|
359
|
+
an entry, or the variable `IC_REACTOR_VERIFY` for a run: `1` (or `true`, or
|
|
360
|
+
`all`) for every entry with a `canisterId`, or canister names separated by
|
|
361
|
+
commas. The plugin fetches the certified interface as above and checks the
|
|
362
|
+
`didFile` on disk against it (`meant check`) when a build or the dev server
|
|
363
|
+
starts. Each check is a network request, so `verify: "live"` makes every build
|
|
364
|
+
need the network. `IC_REACTOR_VERIFY=1 vite build` in CI keeps the other builds
|
|
365
|
+
offline, and `IC_REACTOR_VERIFY=0` (or `false`) turns the check off for a run,
|
|
366
|
+
`verify: "live"` included, so a project that checks every build can still build
|
|
367
|
+
offline.
|
|
368
|
+
|
|
369
|
+
The check asks whether every method of the file is still in the live service,
|
|
370
|
+
with the same mode, its arguments accepted and its results readable. Methods
|
|
371
|
+
only the canister has are not checked: a projection checks only the methods
|
|
372
|
+
the app calls.
|
|
373
|
+
|
|
374
|
+
| Live canister | Outcome |
|
|
375
|
+
| -------------------------------------------------------------------------- | --------------------------------------------------------- |
|
|
376
|
+
| Unchanged for the file's methods (new methods beside them included) | Logged: `did/icp_ledger.did matches the live interface …` |
|
|
377
|
+
| Changed compatibly for those methods (an optional field added to a result) | A warning, and the canister generates |
|
|
378
|
+
| Compatible only by reading a value as `null` (`special_opt_rule`) | A warning naming each method and path |
|
|
379
|
+
| A method missing (`method_missing`) or of another mode (`mode_changed`) | The canister fails |
|
|
380
|
+
| A method whose types no longer match (`method_incompatible`) | The canister fails, with the path into the type |
|
|
381
|
+
|
|
382
|
+
A failure lists each finding (up to 20) and says to fetch the file again,
|
|
383
|
+
regenerate, and fix the calls the type checker then reports:
|
|
384
|
+
|
|
385
|
+
```text
|
|
386
|
+
ic-reactor: could not generate 1 of 1 canisters:
|
|
387
|
+
- ledger (did/icp_ledger.did): the live check found ryjl3-tyaaa-aaaaa-aaaba-cai on ic incompatible with did/icp_ledger.did (1 error):
|
|
388
|
+
icrc1_gone: method_missing: the live service has no method "icrc1_gone"
|
|
389
|
+
The generated module no longer matches the canister for these methods: fetch did/icp_ledger.did again with IC_REACTOR_FETCH=ledger, regenerate, and fix the calls the type checker then reports.
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
A canister that fails the check is not generated, and the failure follows
|
|
393
|
+
`failOnError` as a failed fetch does. A check that cannot be made (the network
|
|
394
|
+
cannot be reached, the canister keeps its interface private, a side does not
|
|
395
|
+
compile) fails the canister too, with the fetch's own message and how to turn
|
|
396
|
+
the check off (`IC_REACTOR_VERIFY=0`): a check that was asked for and did not
|
|
397
|
+
run does not pass. A
|
|
398
|
+
file the same build just fetched is the live interface: it is not checked, and
|
|
399
|
+
passes as fetched.
|
|
400
|
+
|
|
401
|
+
Within one build or dev server, a check that passed is not made again for the
|
|
402
|
+
same text by a rebuild (`vite build --watch`) or by another Vite environment.
|
|
403
|
+
A check of that canister that fails, or cannot be made, drops the pass, and
|
|
404
|
+
so does a fetch of its file that fails or reads another interface. Restoring
|
|
405
|
+
a text that passed earlier then checks it again rather than standing in for a
|
|
406
|
+
check. What passes or fails is the text the run read when it began: the check
|
|
407
|
+
of a file saved before the check is done (even saved back) counts for nothing,
|
|
408
|
+
passed or failed. It records no pass, neither sets nor clears a failure that
|
|
409
|
+
stands, and that run does not generate the file (see
|
|
410
|
+
[A .did saved while the plugin reads it](#a-did-saved-while-the-plugin-reads-it)).
|
|
411
|
+
Each build and each start of the dev server, a restart included, checks every
|
|
412
|
+
canister again, so a restart finds a canister that changed since its last
|
|
413
|
+
check.
|
|
414
|
+
|
|
415
|
+
A save under `vite dev` never makes a request. So under `vite dev` a canister
|
|
416
|
+
whose check failed (or could not be made, as with the network down) stays
|
|
417
|
+
failed after a save, whatever the save changed, and is not generated, until a
|
|
418
|
+
start checks it again and the check passes, fetches the file again
|
|
419
|
+
(`IC_REACTOR_FETCH`), or runs with the check off. Restart the dev server (`r`
|
|
420
|
+
and Enter in its terminal) to check again.
|
|
421
|
+
|
|
422
|
+
`verify` takes only `"live"`: any other value, `true` or `false` included,
|
|
423
|
+
fails the canister, under `IC_REACTOR_VERIFY=0` too, before anything is
|
|
424
|
+
fetched for it, and so does `"live"` with no `canisterId`. Remove `verify` for
|
|
425
|
+
no check.
|
|
426
|
+
|
|
427
|
+
### How the plugin runs Meant
|
|
428
|
+
|
|
429
|
+
The projection, the comparison of `methods` with a file on disk, and the check
|
|
430
|
+
run `meant project` and `meant check` in a child process, as generation runs
|
|
431
|
+
`gen` (see [Generation](#generation)): the app's own CLI, killed after 60
|
|
432
|
+
seconds, so a bad interface ends that process and not the dev server. Each run
|
|
433
|
+
costs a Node process (under 0.1 s on the ledger's interface), and runs only when
|
|
434
|
+
a file is fetched, when a `methods` entry's file changed, and in a live check.
|
|
435
|
+
|
|
436
|
+
### A .did saved while the plugin reads it
|
|
437
|
+
|
|
438
|
+
Each step reads the `didFile` itself: listing its methods, the live check, and
|
|
439
|
+
generation each run `meant` on the file as it is then. A file saved
|
|
440
|
+
between two steps would let one step approve a text and another generate a
|
|
441
|
+
different one. So a run (the start of a build or dev server, or the
|
|
442
|
+
regeneration a save starts) reads each `didFile` once, when its steps start,
|
|
443
|
+
and reads it again after each step. A file written before the run is done
|
|
444
|
+
with it (even saved back as it was) is not taken: the run does not generate
|
|
445
|
+
it, reports nothing its steps found of it, and puts back a module the
|
|
446
|
+
generator wrote while the file was written. Then:
|
|
447
|
+
|
|
448
|
+
- Under `vite build`, the canister fails for that reason alone, and follows
|
|
449
|
+
`failOnError`:
|
|
450
|
+
`did/icp_ledger.did changed during the build, after the build read it: … Build again.`
|
|
451
|
+
- Under `vite dev`, the file is queued again, as a save is, and that run
|
|
452
|
+
reports the file as it is then. Until it does, the overlay is left as it
|
|
453
|
+
was: the run that took nothing says nothing of the canister, not even that
|
|
454
|
+
it is fixed. Like any save, the queued run makes no request, so a text saved
|
|
455
|
+
while the start's live check ran is not checked.
|
|
456
|
+
|
|
457
|
+
A live check whose file was saved before the check was done counts for
|
|
458
|
+
nothing, passed or failed: it records no pass, and under `vite dev` it neither
|
|
459
|
+
sets nor clears a failure that stands. One that read the file before it was
|
|
460
|
+
saved keeps its result, as for a save made just after the run.
|
|
461
|
+
|
|
462
|
+
Only the `didFile` itself is read again. `meant` also reads every `.did` beneath
|
|
463
|
+
its directory, for the files it imports; a change to one of those during a run
|
|
464
|
+
is not seen.
|
|
465
|
+
|
|
466
|
+
## Generation
|
|
467
|
+
|
|
468
|
+
The generator is WebAssembly, so the plugin does not load it. It runs the bin
|
|
469
|
+
script of the `@meantjs/cli` installed for your app (resolved from the Vite
|
|
470
|
+
root, so a monorepo's hoisted copy is found) with the running Node binary, in a
|
|
471
|
+
child process and not through a shell. A trap, a crash or a runaway loop on a
|
|
472
|
+
bad `.did` ends that process, and the plugin reports it. The dev server is not
|
|
473
|
+
affected. The command it runs is
|
|
474
|
+
`gen <didFiles...> -o <outDir> --json`.
|
|
475
|
+
|
|
476
|
+
- Canisters that write into one `outDir` share one process, and each `outDir`
|
|
477
|
+
has its own. A process that dies without a report is run again, one canister
|
|
478
|
+
at a time, so the failure lands on the canister that caused it.
|
|
479
|
+
- A process that runs longer than 60 seconds is killed. A hang therefore costs
|
|
480
|
+
up to two timeouts (120 seconds) before the others are generated.
|
|
481
|
+
- What the generator writes to stderr is logged as a warning, a line at a time.
|
|
482
|
+
Past 200 lines from one process the rest is not logged.
|
|
483
|
+
- A declaration the generator cannot represent is left out of the module, and
|
|
484
|
+
the plugin logs each one as a warning, for example
|
|
485
|
+
`ic-reactor: ledger: omitted declaration Bad (reserved_field_name)`.
|
|
486
|
+
- Closing the dev server (or restarting it, as a `vite.config` edit does)
|
|
487
|
+
kills a generator of that server that is still running and drops its runs
|
|
488
|
+
still waiting, so none outlives the server it belonged to or runs beside the
|
|
489
|
+
next one. A server restarted with the same plugin object (an inline config,
|
|
490
|
+
which `server.restart()` keeps) has runs of its own: Vite starts it before
|
|
491
|
+
it closes the old one, and the old server's close does not stop them. Its
|
|
492
|
+
overlay starts as the old one's, and its runs change it.
|
|
493
|
+
- Editing a `.did` regenerates only the canisters that name it. Under
|
|
494
|
+
`vite build --watch`, a canister is regenerated only when its `.did` text
|
|
495
|
+
changed, or its module or envelope is missing.
|
|
496
|
+
- Deleting a `.did` under `vite dev` fails the canisters that name it at once,
|
|
497
|
+
because the module it generated is still on disk and would look current.
|
|
498
|
+
Putting the file back regenerates them.
|
|
499
|
+
|
|
500
|
+
### When generation fails
|
|
501
|
+
|
|
502
|
+
A failed canister costs that canister, and nothing else:
|
|
503
|
+
|
|
504
|
+
- Under `vite build`, the build fails with the generator's diagnostics (or its
|
|
505
|
+
stderr, if it crashed) in the error message. A build that exits 0 would ship
|
|
506
|
+
the bindings left over from the last good run.
|
|
507
|
+
- Under `vite dev`, the failure is logged and shown in the browser's error
|
|
508
|
+
overlay, and the server keeps serving. Fixing the last broken canister clears
|
|
509
|
+
the overlay. Vite's client clears an error overlay whenever it applies a hot
|
|
510
|
+
update, so a canister that is still broken can drop out of the overlay after
|
|
511
|
+
you save another file. Its error stays in the terminal log, and a full
|
|
512
|
+
reload shows the overlay again.
|
|
513
|
+
- Under Vitest (mode `test`), the run fails at startup, as a build does: tests
|
|
514
|
+
that pass against the modules left over from the last good run prove
|
|
515
|
+
nothing.
|
|
516
|
+
- `failOnError` overrides each default. It takes `true` or `false`: any
|
|
517
|
+
other value (`null`, `0`, `"false"`) throws when the config loads, as does
|
|
518
|
+
one for `injectEnvironment`.
|
|
519
|
+
|
|
520
|
+
### After each generation
|
|
521
|
+
|
|
522
|
+
`onGenerated` is called once for each module a run generated, after the
|
|
523
|
+
generator wrote or checked it and its envelope, under `vite build` and
|
|
524
|
+
`vite dev` alike. Use it for a step that reads the generated output and must
|
|
525
|
+
run after every generation:
|
|
526
|
+
|
|
527
|
+
```ts
|
|
528
|
+
import { readFile } from "node:fs/promises"
|
|
529
|
+
import { icReactor } from "@ic-reactor/vite-plugin"
|
|
530
|
+
|
|
531
|
+
icReactor({
|
|
532
|
+
canisters: { ledger: { didFile: "did/ledger.did" } },
|
|
533
|
+
onGenerated: async ({ names, envelope, status }) => {
|
|
534
|
+
const text = await readFile(envelope, "utf-8")
|
|
535
|
+
// check it, or write derived files; throw to fail the run
|
|
536
|
+
console.log(names, status, text.length)
|
|
537
|
+
},
|
|
538
|
+
})
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
- It is handed `names` (canisters that share a `didFile` and an `outDir`
|
|
542
|
+
share one module and one call), the absolute paths `didFile`, `module` and
|
|
543
|
+
`envelope`, `status` (`"written"`, or `"unchanged"` when the module on disk
|
|
544
|
+
was already what the generator would write), and a `signal` that aborts
|
|
545
|
+
when the build or dev server closes. A close stops waiting for the hook,
|
|
546
|
+
and the next run generates the module again and calls the hook again.
|
|
547
|
+
- It runs inside the plugin's one queue of runs: it never overlaps a
|
|
548
|
+
generation, and `buildStart` waits for it, so under `vite build` a hook
|
|
549
|
+
that never settles holds the build.
|
|
550
|
+
- It is not called for a canister that failed or was refused, nor for a run
|
|
551
|
+
that does not generate the module again (the second `buildStart` of
|
|
552
|
+
Vite 6 and later, a `vite build --watch` rebuild not caused by a `.did`
|
|
553
|
+
or by a missing module or envelope).
|
|
554
|
+
A save under `vite dev` always generates again, so saving the same text
|
|
555
|
+
calls it with `"unchanged"`.
|
|
556
|
+
- A throw or a rejection fails the module's canisters as a failed generation
|
|
557
|
+
does: the build or the Vitest run fails unless `failOnError` is `false`, and
|
|
558
|
+
otherwise the failure is logged and, under `vite dev`, shown in the error
|
|
559
|
+
overlay. The
|
|
560
|
+
next run generates them again and calls the hook again.
|
|
561
|
+
- A value that is not a function throws when the config loads.
|
|
562
|
+
|
|
563
|
+
### In CI
|
|
564
|
+
|
|
565
|
+
`meant gen --check` compares the generated files with the ones on disk, writes
|
|
566
|
+
nothing, and exits 1 on any difference. Run it with the arguments the plugin
|
|
567
|
+
uses, to fail a pipeline when the committed output is stale:
|
|
568
|
+
|
|
569
|
+
```json
|
|
570
|
+
{
|
|
571
|
+
"scripts": {
|
|
572
|
+
"gen:check": "meant gen did/icrc1.did -o src/canisters --check"
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
## The local environment
|
|
578
|
+
|
|
579
|
+
When `injectEnvironment` is on, under `vite dev` and `vite preview`, the plugin:
|
|
580
|
+
|
|
581
|
+
1. asks `icp` for the local network's status (`icp network status`);
|
|
582
|
+
2. resolves canister ids: the keys of `canisters`, and `internet_identity`,
|
|
583
|
+
which is added if it is not listed;
|
|
584
|
+
3. sets the `ic_env` cookie on each response;
|
|
585
|
+
4. proxies `/api` to the local replica.
|
|
586
|
+
|
|
587
|
+
A `canisterId` in the plugin config is used for that canister, and `icp` is not
|
|
588
|
+
asked for its id. `internet_identity` is asked for even then: what `icp`
|
|
589
|
+
reports decides whether the cookie also names icp-cli's built-in Internet
|
|
590
|
+
Identity. Set the `ICP_ENVIRONMENT` environment variable to use a network other
|
|
591
|
+
than `"local"`.
|
|
592
|
+
|
|
593
|
+
The plugin runs `icp` from `PATH`, with no shell. On Windows, where npm links
|
|
594
|
+
icp-cli's npm package as `icp.cmd`, it runs `@icp-sdk/icp-cli` with Node
|
|
595
|
+
instead: the app's own install, else a global npm install, else an `icp.exe`
|
|
596
|
+
on `PATH`.
|
|
597
|
+
|
|
598
|
+
### The cookie
|
|
599
|
+
|
|
600
|
+
The cookie is `ic_env`, set with `Path=/; SameSite=Lax`. Its value is URI-encoded
|
|
601
|
+
text of this form:
|
|
602
|
+
|
|
603
|
+
```text
|
|
604
|
+
ic_root_key=<hex key>&PUBLIC_CANISTER_ID:<name>=<id>&...&INTERNET_IDENTITY_PROVIDER=<url>
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
It carries the replica's root key, one `PUBLIC_CANISTER_ID:<name>` for each
|
|
608
|
+
canister, and the local Internet Identity's url when there is one. A client
|
|
609
|
+
that trusts the cookie hands that url to its `auth` factory, so
|
|
610
|
+
`auth: (network) => new AuthClient(network)` signs in with the local Internet
|
|
611
|
+
Identity (see [Auth](/v4/guides/auth/#the-network-the-factory-is-handed)).
|
|
612
|
+
|
|
613
|
+
### Detection
|
|
614
|
+
|
|
615
|
+
- If detection fails, the plugin falls back to proxying `/api` to icp-cli's
|
|
616
|
+
local network, `http://127.0.0.1:8000`, and sets no cookie (a page load
|
|
617
|
+
clears one the browser kept), or with no canisters configured, one that
|
|
618
|
+
names only the built-in Internet Identity. It warns when that
|
|
619
|
+
happens with canisters configured, and when a configured canister has no id.
|
|
620
|
+
Run with `DEBUG=ic-reactor` to see the `icp` output behind the warning.
|
|
621
|
+
- Detection is complete once `icp` reports the network and every configured
|
|
622
|
+
canister has an id. Until then the plugin asks `icp` again on each page load,
|
|
623
|
+
so start `vite dev` first, run `icp network start` and `icp deploy`, and
|
|
624
|
+
reload the page.
|
|
625
|
+
- Once detection is complete, page loads run no more `icp` commands, so any
|
|
626
|
+
network restart (`icp network stop`, then `start` and `icp deploy`) needs a
|
|
627
|
+
restart of the dev server, even when the root key stays the same: icp-cli
|
|
628
|
+
1.2.0's managed network kept its root key across starts while a new deploy
|
|
629
|
+
gave the names other ids.
|
|
630
|
+
- While it serves, the plugin holds a connection to the detected network, so
|
|
631
|
+
it notices the network stop when it stops, whether or not a request reaches
|
|
632
|
+
it. From then on it no longer vouches for the ids it detected, which a
|
|
633
|
+
network started again may have given to other canisters: it warns once,
|
|
634
|
+
page loads get the cookie without those ids and that root key, and
|
|
635
|
+
`vite dev` reloads the pages it has open so that they drop the old cookie.
|
|
636
|
+
`{ name }` canisters then reject `canister_id_unresolved` until the dev
|
|
637
|
+
server restarts. Under `vite preview`, which has no HMR connection, reload
|
|
638
|
+
open pages yourself.
|
|
639
|
+
- A configured canister you never deploy locally keeps detection incomplete.
|
|
640
|
+
Set its `canisterId` and it counts as resolved. If you never run a local
|
|
641
|
+
network, set `injectEnvironment: false`.
|
|
642
|
+
- If your Vite config or another plugin sets `server.proxy["/api"]`, the plugin
|
|
643
|
+
leaves it alone.
|
|
644
|
+
|
|
645
|
+
### How the app reads it
|
|
646
|
+
|
|
647
|
+
The app reads the cookie through `network: "env"` and calls canisters by name:
|
|
648
|
+
|
|
649
|
+
```ts
|
|
650
|
+
import { createClient } from "@ic-reactor/core"
|
|
651
|
+
import { actor, type Actor } from "./canisters/backend"
|
|
652
|
+
|
|
653
|
+
const client = createClient({ network: "env", identity: "anonymous" })
|
|
654
|
+
const backend = client.canister<Actor>(actor, { name: "backend" })
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
On a local page the client trusts the cookie, so `{ name: "backend" }` finds the
|
|
658
|
+
id that `icp deploy` gave the backend. `"env"` is for `localhost` pages: opened
|
|
659
|
+
by a LAN address (`vite --host`), a Docker host name or a tunnel, the page
|
|
660
|
+
still sends only to the dev server, but the client does not believe the
|
|
661
|
+
cookie there, so `{ name }` targets do not resolve and certified calls fail.
|
|
662
|
+
The plugin warns once when a page is loaded by a host that is not loopback.
|
|
663
|
+
See [The client](/v4/guides/client/#env-off-localhost). Nothing in the code names a host, a port
|
|
664
|
+
or an id. Deployed with `icp deploy -e ic`, `"env"` still sends through the
|
|
665
|
+
page's origin on `<id>.icp0.io`, where the client believes the asset
|
|
666
|
+
canister's cookie for canister ids, and for nothing else, so `{ name }`
|
|
667
|
+
resolves and sign-in uses mainnet's Internet Identity. On `<id>.ic0.app` and
|
|
668
|
+
on a custom domain it does not resolve: give the canister an `{ id }` baked in
|
|
669
|
+
at build time, as a mainnet build should on every domain.
|
|
670
|
+
`allowEnvConfig: true` is refused on `ic0.app`, because every other canister's
|
|
671
|
+
page can set a cookie there. See
|
|
672
|
+
[Deploy to mainnet](/v4/guides/client/#deploy-to-mainnet) for each domain and
|
|
673
|
+
[The client](/v4/guides/client/#the-ic_env-cookie) for when the cookie is
|
|
674
|
+
trusted. The [Vite wallet example](/v4/examples/vite-wallet/) is built this way
|
|
675
|
+
for a local network.
|
|
676
|
+
|
|
677
|
+
## Tests
|
|
678
|
+
|
|
679
|
+
Vitest runs the plugin in mode `test`. There it injects no environment and
|
|
680
|
+
never runs `icp`, whatever `injectEnvironment` says. Generation is not an
|
|
681
|
+
environment concern and still runs, so the modules a test imports exist. A
|
|
682
|
+
canister that fails to generate fails the run at startup, unless `failOnError`
|
|
683
|
+
is `false`: a `.did` that does not parse, a fetch that fails, a live check
|
|
684
|
+
(`verify: "live"`, `IC_REACTOR_VERIFY`) that fails or cannot reach the
|
|
685
|
+
network, an `onGenerated` that throws. For an offline test run with the live
|
|
686
|
+
check on, set `IC_REACTOR_VERIFY=0`. A `.did` that stops generating after
|
|
687
|
+
startup, in watch mode, is logged, as under `vite dev`. A Vitest run in
|
|
688
|
+
another mode (`--mode`, `test.mode`) keeps the dev default, and a Vitest
|
|
689
|
+
config that does not load the plugin generates nothing. To test
|
|
690
|
+
canister code, see [Testing](/v4/guides/testing/).
|