wao 0.41.3 → 0.41.5
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/.babelrc-cjs +5 -0
- package/.babelrc-esm +5 -0
- package/.gitmodules +4 -0
- package/.prettierrc +6 -0
- package/README.md +90 -0
- package/app/.eslintrc.json +3 -0
- package/app/.mocharc.cjs +6 -0
- package/app/arweave.mjs +87 -0
- package/app/components/Footer.js +76 -0
- package/app/components/Global.js +1128 -0
- package/app/components/Header.js +306 -0
- package/app/components/Left.js +28 -0
- package/app/components/Logo.js +34 -0
- package/app/components/Middle.js +37 -0
- package/app/components/Sidebar.js +93 -0
- package/app/components/Tags.js +42 -0
- package/app/components/editor/Editor.js +322 -0
- package/app/components/editor/FilePath.js +42 -0
- package/app/components/editor/MonacoEditor.js +44 -0
- package/app/components/left/LeftMessages.js +85 -0
- package/app/components/left/LeftModules.js +86 -0
- package/app/components/left/LeftNetworks.js +438 -0
- package/app/components/left/LeftProcesses.js +98 -0
- package/app/components/left/LeftProjects.js +397 -0
- package/app/components/left/LeftTests.js +189 -0
- package/app/components/middle/MiddleBlocks.js +79 -0
- package/app/components/middle/MiddleEntity.js +16 -0
- package/app/components/middle/MiddleEntityAccount.js +264 -0
- package/app/components/middle/MiddleEntityAssignment.js +104 -0
- package/app/components/middle/MiddleEntityBlock.js +148 -0
- package/app/components/middle/MiddleEntityMessage.js +430 -0
- package/app/components/middle/MiddleEntityModule.js +183 -0
- package/app/components/middle/MiddleEntityProcess.js +323 -0
- package/app/components/middle/MiddleEntityTx.js +211 -0
- package/app/components/middle/MiddleMessages.js +87 -0
- package/app/components/middle/MiddleModules.js +89 -0
- package/app/components/middle/MiddleNetworks.js +516 -0
- package/app/components/middle/MiddleProcesses.js +87 -0
- package/app/components/middle/MiddleTests.js +134 -0
- package/app/components/modals/CreateFileModal.js +115 -0
- package/app/components/modals/CreateFolderModal.js +83 -0
- package/app/components/modals/CreateProjectModal.js +63 -0
- package/app/components/modals/FSModal.js +141 -0
- package/app/components/modals/ImportModal.js +105 -0
- package/app/components/modals/LaunchNetworkModal.js +95 -0
- package/app/components/modals/Modal.js +38 -0
- package/app/components/modals/ProxyModal.js +122 -0
- package/app/components/modals/RenameFileModal.js +95 -0
- package/app/components/styles/EditorScrollbarStyle.js +29 -0
- package/app/components/styles/EntityScrollbarStyle.js +29 -0
- package/app/components/styles/GlobalStyle.js +102 -0
- package/app/components/styles/XtermStyle.js +37 -0
- package/app/components/terminal/Terminal.js +132 -0
- package/app/components/terminal/Xterm.js +160 -0
- package/app/components/ui/avatar.jsx +49 -0
- package/app/components/ui/checkbox.jsx +17 -0
- package/app/components/ui/close-button.jsx +20 -0
- package/app/components/ui/color-mode.jsx +61 -0
- package/app/components/ui/dialog.jsx +54 -0
- package/app/components/ui/drawer.jsx +44 -0
- package/app/components/ui/field.jsx +22 -0
- package/app/components/ui/input-group.jsx +39 -0
- package/app/components/ui/popover.jsx +49 -0
- package/app/components/ui/provider.jsx +12 -0
- package/app/components/ui/radio.jsx +17 -0
- package/app/components/ui/slider.jsx +107 -0
- package/app/components/ui/toaster.jsx +69 -0
- package/app/components/ui/tooltip.jsx +35 -0
- package/app/index.js +10 -0
- package/app/jsconfig.json +7 -0
- package/app/lib/GithubCSS.js +1218 -0
- package/app/lib/addon-fit.js +72 -0
- package/app/lib/data.js +31 -0
- package/app/lib/github-markdown.css +1169 -0
- package/app/lib/global.js +1 -0
- package/app/lib/guide.js +82 -0
- package/app/lib/hub.js +109 -0
- package/app/lib/scripts.js +47 -0
- package/app/lib/store.js +34 -0
- package/app/lib/use.js +64 -0
- package/app/lib/utils.js +387 -0
- package/app/lib/webrtc.js +217 -0
- package/app/next.config.js +25 -0
- package/app/package.json +62 -0
- package/app/pages/404.js +9 -0
- package/app/pages/_app.js +10 -0
- package/app/pages/_document.js +14 -0
- package/app/pages/index.js +121 -0
- package/app/playwright.config.mjs +41 -0
- package/app/proxy.mjs +21 -0
- package/app/public/assets/cover.png +0 -0
- package/app/public/blueprints/apm.lua +91 -0
- package/app/public/blueprints/arena.lua +345 -0
- package/app/public/blueprints/arns.lua +318 -0
- package/app/public/blueprints/chat.lua +210 -0
- package/app/public/blueprints/chatroom.lua +56 -0
- package/app/public/blueprints/patch-legacy-reply.lua +13 -0
- package/app/public/blueprints/staking.lua +93 -0
- package/app/public/blueprints/token.lua +298 -0
- package/app/public/blueprints/voting.lua +45 -0
- package/app/public/favicon.ico +0 -0
- package/app/public/logo.png +0 -0
- package/cli-esm.js +55 -0
- package/cli.js +54 -0
- package/devnet/app/api.js +129 -0
- package/devnet/app/components/layout.js +89 -0
- package/devnet/app/components/pagination.js +144 -0
- package/devnet/app/components/search.js +159 -0
- package/devnet/app/components/table.js +124 -0
- package/devnet/app/components/tags.js +89 -0
- package/devnet/app/index.html +14 -0
- package/devnet/app/main.js +215 -0
- package/devnet/app/router.js +59 -0
- package/devnet/app/state.js +19 -0
- package/devnet/app/style.css +1606 -0
- package/devnet/app/utils.js +77 -0
- package/devnet/app/views/blocks.js +75 -0
- package/devnet/app/views/dashboard.js +127 -0
- package/devnet/app/views/entity.js +1473 -0
- package/devnet/app/views/messages.js +90 -0
- package/devnet/app/views/modules.js +165 -0
- package/devnet/app/views/processes.js +90 -0
- package/devnet/app/views/schedulers.js +90 -0
- package/devnet/app/views/transactions.js +88 -0
- package/devnet/migrations/0001_initial.sql +51 -0
- package/devnet/package.json +26 -0
- package/devnet/playwright.config.js +7 -0
- package/devnet/src/cu-worker.js +166 -0
- package/devnet/src/index.js +309 -0
- package/devnet/vite.config.js +17 -0
- package/devnet/vitest.config.js +10 -0
- package/devnet/wrangler-cu.toml +32 -0
- package/devnet/wrangler.toml +38 -0
- package/dhfs-tutorial-app/package.json +15 -0
- package/dist/esm/workspace/dashboard/public/favicon.png +0 -0
- package/dist/esm/workspace/src/counter.lua +14 -0
- package/dist/package.json +82 -0
- package/hb.sh +18 -0
- package/hbsig/.babelrc-cjs +5 -0
- package/hbsig/.babelrc-esm +5 -0
- package/hbsig/README.md +1 -0
- package/hbsig/dist/cjs/bin_to_str.js +44 -0
- package/hbsig/dist/cjs/collect-body-keys.js +470 -0
- package/hbsig/dist/cjs/commit.js +330 -0
- package/hbsig/dist/cjs/encode-array-item.js +110 -0
- package/hbsig/dist/cjs/encode-utils.js +242 -0
- package/hbsig/dist/cjs/encode.js +1365 -0
- package/hbsig/dist/cjs/erl_json.js +326 -0
- package/hbsig/dist/cjs/erl_str.js +1042 -0
- package/hbsig/dist/cjs/flat.js +279 -0
- package/hbsig/dist/cjs/http-message-signatures/httpbis.js +489 -0
- package/hbsig/dist/cjs/http-message-signatures/index.js +25 -0
- package/hbsig/dist/cjs/http-message-signatures/structured-header.js +129 -0
- package/hbsig/dist/cjs/httpsig.js +861 -0
- package/hbsig/dist/cjs/id.js +470 -0
- package/hbsig/dist/cjs/index.js +174 -0
- package/hbsig/dist/cjs/nocrypto.js +51 -0
- package/hbsig/dist/cjs/parser.js +201 -0
- package/hbsig/dist/cjs/send-utils.js +1231 -0
- package/hbsig/dist/cjs/send.js +211 -0
- package/hbsig/dist/cjs/signer-utils.js +494 -0
- package/hbsig/dist/cjs/signer.js +436 -0
- package/hbsig/dist/cjs/structured.js +515 -0
- package/hbsig/dist/cjs/test.js +12 -0
- package/hbsig/dist/cjs/utils.js +44 -0
- package/hbsig/dist/esm/bin_to_str.js +46 -0
- package/hbsig/dist/esm/collect-body-keys.js +436 -0
- package/hbsig/dist/esm/commit.js +219 -0
- package/hbsig/dist/esm/encode-array-item.js +112 -0
- package/hbsig/dist/esm/encode-utils.js +191 -0
- package/hbsig/dist/esm/encode.js +1256 -0
- package/hbsig/dist/esm/erl_json.js +292 -0
- package/hbsig/dist/esm/erl_str.js +1144 -0
- package/hbsig/dist/esm/flat.js +250 -0
- package/hbsig/dist/esm/http-message-signatures/httpbis.js +438 -0
- package/hbsig/dist/esm/http-message-signatures/index.js +4 -0
- package/hbsig/dist/esm/http-message-signatures/structured-header.js +105 -0
- package/hbsig/dist/esm/httpsig.js +866 -0
- package/hbsig/dist/esm/id.js +459 -0
- package/hbsig/dist/esm/index.js +13 -0
- package/hbsig/dist/esm/nocrypto.js +4 -0
- package/hbsig/dist/esm/package.json +3 -0
- package/hbsig/dist/esm/parser.js +171 -0
- package/hbsig/dist/esm/send-utils.js +1132 -0
- package/hbsig/dist/esm/send.js +142 -0
- package/hbsig/dist/esm/signer-utils.js +375 -0
- package/hbsig/dist/esm/signer.js +312 -0
- package/hbsig/dist/esm/structured.js +496 -0
- package/hbsig/dist/esm/test.js +2 -0
- package/hbsig/dist/esm/utils.js +29 -0
- package/hbsig/dist/package.json +39 -0
- package/hbsig/make.js +36 -0
- package/hbsig/package.json +39 -0
- package/hbsig/src/bin_to_str.js +46 -0
- package/hbsig/src/collect-body-keys.js +436 -0
- package/hbsig/src/commit.js +219 -0
- package/hbsig/src/encode-array-item.js +112 -0
- package/hbsig/src/encode-utils.js +191 -0
- package/hbsig/src/encode.js +1256 -0
- package/hbsig/src/erl_json.js +292 -0
- package/hbsig/src/erl_str.js +1144 -0
- package/hbsig/src/flat.js +250 -0
- package/hbsig/src/http-message-signatures/httpbis.js +438 -0
- package/hbsig/src/http-message-signatures/index.js +4 -0
- package/hbsig/src/http-message-signatures/structured-header.js +105 -0
- package/hbsig/src/httpsig.js +866 -0
- package/hbsig/src/id.js +459 -0
- package/hbsig/src/index.js +13 -0
- package/hbsig/src/nocrypto.js +4 -0
- package/hbsig/src/parser.js +171 -0
- package/hbsig/src/send-utils.js +1132 -0
- package/hbsig/src/send.js +142 -0
- package/hbsig/src/signer-utils.js +375 -0
- package/hbsig/src/signer.js +312 -0
- package/hbsig/src/structured.js +496 -0
- package/hbsig/src/test.js +2 -0
- package/hbsig/src/utils.js +29 -0
- package/lp/index.html +25 -0
- package/lp/package.json +19 -0
- package/lp/public/cover.png +0 -0
- package/lp/public/favicon.ico +0 -0
- package/lp/public/favicon.png +0 -0
- package/lp/public/images/book.jpg +0 -0
- package/lp/public/images/dashboard.png +0 -0
- package/lp/public/images/devnet.png +0 -0
- package/lp/public/images/hero-bg.png +0 -0
- package/lp/public/images/hyperadd.png +0 -0
- package/lp/public/images/message-flow.png +0 -0
- package/lp/public/images/mobile.png +0 -0
- package/lp/public/images/og-cover.png +0 -0
- package/lp/public/images/scan.png +0 -0
- package/lp/public/images/wao-hub.png +0 -0
- package/lp/public/images/wao-web.png +0 -0
- package/lp/public/logo.png +0 -0
- package/lp/src/App.jsx +29 -0
- package/lp/src/components/CodeBlock.jsx +37 -0
- package/lp/src/components/CodeBlock.module.css +89 -0
- package/lp/src/components/Footer.jsx +22 -0
- package/lp/src/components/Footer.module.css +60 -0
- package/lp/src/components/Nav.jsx +80 -0
- package/lp/src/components/Nav.module.css +177 -0
- package/lp/src/components/SectionWrapper.jsx +15 -0
- package/lp/src/hooks/useReveal.js +25 -0
- package/lp/src/hooks/useScrolled.js +14 -0
- package/lp/src/main.jsx +10 -0
- package/lp/src/sections/Book.jsx +60 -0
- package/lp/src/sections/Book.module.css +204 -0
- package/lp/src/sections/Browser.jsx +46 -0
- package/lp/src/sections/Browser.module.css +67 -0
- package/lp/src/sections/Devnet.jsx +55 -0
- package/lp/src/sections/Devnet.module.css +136 -0
- package/lp/src/sections/GetStarted.jsx +51 -0
- package/lp/src/sections/GetStarted.module.css +128 -0
- package/lp/src/sections/Hero.jsx +67 -0
- package/lp/src/sections/Hero.module.css +202 -0
- package/lp/src/sections/HyperADD.jsx +46 -0
- package/lp/src/sections/HyperADD.module.css +113 -0
- package/lp/src/sections/SDK.jsx +90 -0
- package/lp/src/sections/SDK.module.css +122 -0
- package/lp/src/sections/Testing.jsx +47 -0
- package/lp/src/sections/Testing.module.css +124 -0
- package/lp/src/sections/Vision.jsx +93 -0
- package/lp/src/sections/Vision.module.css +147 -0
- package/lp/src/styles/globals.css +285 -0
- package/lp/src/utils/scrollTo.js +4 -0
- package/lp/vite.config.js +7 -0
- package/make.js +39 -0
- package/package.json +17 -12
- package/patches/@permaweb+ao-loader+0.0.44.patch +64 -0
- package/plan.md +435 -0
- package/rebar.lock +1 -0
- package/src/accounts-web.js +128 -0
- package/src/accounts.js +124 -0
- package/src/adaptor-base.js +622 -0
- package/src/adaptor-cf.js +11 -0
- package/src/adaptor-web.js +11 -0
- package/src/adaptor.js +10 -0
- package/src/ao-loader.js +30660 -0
- package/src/ao.js +1173 -0
- package/src/aoconnect-base.js +1098 -0
- package/src/aoconnect-cf.js +9 -0
- package/src/aoconnect-web.js +8 -0
- package/src/aoconnect.js +8 -0
- package/src/aos_wamr.js +1 -0
- package/src/ar-remote.js +87 -0
- package/src/ar.js +276 -0
- package/src/armem-base.js +529 -0
- package/src/armem-cf.js +67 -0
- package/src/armem-web.js +19 -0
- package/src/armem.js +26 -0
- package/src/bao.js +141 -0
- package/src/bar.js +366 -0
- package/src/build.js +7 -0
- package/src/bundler.js +119 -0
- package/src/car.js +10 -0
- package/src/cf-env.js +29 -0
- package/src/cf.js +11 -0
- package/src/cli.js +561 -0
- package/src/compress.js +112 -0
- package/src/create.js +415 -0
- package/src/devs.js +86 -0
- package/src/dirname.js +1 -0
- package/src/dodb.js +26 -0
- package/src/erl_json.js +289 -0
- package/src/erl_str.js +1139 -0
- package/src/gql.js +229 -0
- package/src/hb.js +967 -0
- package/src/helpers.js +203 -0
- package/src/http.js +619 -0
- package/src/hub/bundler.js +123 -0
- package/src/hub/cu.js +74 -0
- package/src/hub/fs.js +157 -0
- package/src/hub/index.js +85 -0
- package/src/hub/utils.js +64 -0
- package/src/hub/ws-proxy.js +67 -0
- package/src/hyper-aos.js +1 -0
- package/src/hyperbeam-server.js +21 -0
- package/src/hyperbeam.js +585 -0
- package/src/index.js +5 -0
- package/src/keygen.js +47 -0
- package/src/lfdb.js +67 -0
- package/src/lua/aos.wasm +0 -0
- package/src/lua/aos2_0_1.js +1 -0
- package/src/lua/aos2_0_1.wasm +0 -0
- package/src/lua/aos2_0_3.js +1 -0
- package/src/lua/aos2_0_3.wasm +0 -0
- package/src/lua/aos2_0_4_32.js +1 -0
- package/src/lua/aos2_0_4_32.wasm +0 -0
- package/src/lua/aos2_0_6.wasm +0 -0
- package/src/lua/apm.lua +61 -0
- package/src/lua/llama.wasm +0 -0
- package/src/lua/process.wasm +0 -0
- package/src/lua/sqlite.js +1 -0
- package/src/lua/sqlite.wasm +0 -0
- package/src/lua/weavedb_mock.lua +44 -0
- package/src/lua/weavedrive.lua +53 -0
- package/src/run.js +25 -0
- package/src/server.js +173 -0
- package/src/storage-multi.js +183 -0
- package/src/tao.js +12 -0
- package/src/tar.js +10 -0
- package/src/test.js +42 -0
- package/src/tgql-d1.js +407 -0
- package/src/tgql.js +310 -0
- package/src/toerl.js +162 -0
- package/src/utils.js +777 -0
- package/src/wao.js +29 -0
- package/src/waosm/README.md +81 -0
- package/src/waosm/waosm.d.ts +40 -0
- package/src/waosm/waosm.js +240 -0
- package/src/waosm/waosm_bg.wasm +0 -0
- package/src/waosm/waosm_bg.wasm.d.ts +8 -0
- package/src/waosm-node/README.md +81 -0
- package/src/waosm-node/waosm.d.ts +8 -0
- package/src/waosm-node/waosm.js +4 -0
- package/src/waosm-node/waosm_bg.js +147 -0
- package/src/waosm-node/waosm_bg.wasm +0 -0
- package/src/waosm-node/waosm_bg.wasm.d.ts +8 -0
- package/src/waosm-node/waosm_bg.wasm.js +14 -0
- package/src/waosm-node.js +9 -0
- package/src/war.js +10 -0
- package/src/weavedrive.js +376 -0
- package/src/web.js +11 -0
- package/src/workspace/.mcp.json +8 -0
- package/src/workspace/CLAUDE.md +258 -0
- package/src/workspace/README.md +85 -0
- package/src/workspace/dashboard/index.html +163 -0
- package/src/workspace/dashboard/package.json +18 -0
- package/src/workspace/dashboard/public/favicon.ico +0 -0
- package/src/workspace/dashboard/public/favicon.png +0 -0
- package/src/workspace/dashboard/server.js +224 -0
- package/src/workspace/dashboard/src/App.jsx +2350 -0
- package/{cjs/workspace/frontend → src/workspace/dashboard}/vite.config.js +6 -0
- package/src/workspace/package.json +18 -0
- package/src/workspace/src/counter.lua +14 -0
- package/tsconfig.json +18 -0
- package/types/index.d.ts +329 -0
- package/waollama/.eslintrc.json +3 -0
- package/waollama/README.md +19 -0
- package/waollama/arweave.mjs +87 -0
- package/waollama/components/ui/avatar.jsx +49 -0
- package/waollama/components/ui/checkbox.jsx +17 -0
- package/waollama/components/ui/close-button.jsx +20 -0
- package/waollama/components/ui/color-mode.jsx +61 -0
- package/waollama/components/ui/dialog.jsx +54 -0
- package/waollama/components/ui/drawer.jsx +44 -0
- package/waollama/components/ui/field.jsx +22 -0
- package/waollama/components/ui/input-group.jsx +39 -0
- package/waollama/components/ui/popover.jsx +49 -0
- package/waollama/components/ui/provider.jsx +12 -0
- package/waollama/components/ui/radio.jsx +17 -0
- package/waollama/components/ui/slider.jsx +107 -0
- package/waollama/components/ui/tooltip.jsx +35 -0
- package/waollama/index.js +10 -0
- package/waollama/jsconfig.json +7 -0
- package/waollama/lib/ao-loader.js +30654 -0
- package/waollama/lib/client.js +1 -0
- package/waollama/lib/wasm.js +1 -0
- package/waollama/next.config.js +25 -0
- package/waollama/package.json +43 -0
- package/waollama/pages/404.js +9 -0
- package/waollama/pages/_app.js +9 -0
- package/waollama/pages/_document.js +14 -0
- package/waollama/pages/index.js +212 -0
- package/waollama/playwright.config.js +31 -0
- package/waollama/proxy.mjs +21 -0
- package/waollama/public/favicon.ico +0 -0
- package/waollama/public/human.png +0 -0
- package/waollama/public/llama.png +0 -0
- package/waosm/Cargo.toml +11 -0
- package/waosm/README.md +81 -0
- package/waosm/compress.js +112 -0
- package/waosm/make.js +33 -0
- package/waosm/package.json +10 -0
- package/waosm/src/lib.rs +180 -0
- package/waosm/test.js +16 -0
- package/cjs/workspace/.claude/agents/builder.md +0 -99
- package/cjs/workspace/.claude/agents/device-builder.md +0 -86
- package/cjs/workspace/.claude/agents/tester.md +0 -90
- package/cjs/workspace/.claude/mcp/dashboard/server.js +0 -128
- package/cjs/workspace/.claude/rules/deploy.md +0 -45
- package/cjs/workspace/.claude/rules/frontend.md +0 -69
- package/cjs/workspace/.claude/rules/hyperbeam.md +0 -104
- package/cjs/workspace/.claude/rules/lua.md +0 -108
- package/cjs/workspace/.claude/rules/testing.md +0 -257
- package/cjs/workspace/.claude/settings.json +0 -109
- package/cjs/workspace/.claude/skills/build/SKILL.md +0 -214
- package/cjs/workspace/.claude/skills/build-aos/SKILL.md +0 -129
- package/cjs/workspace/.claude/skills/build-device/SKILL.md +0 -192
- package/cjs/workspace/.claude/skills/build-frontend/SKILL.md +0 -134
- package/cjs/workspace/.claude/skills/build-module/SKILL.md +0 -281
- package/cjs/workspace/.claude/skills/create-aos/SKILL.md +0 -63
- package/cjs/workspace/.claude/skills/create-device/SKILL.md +0 -87
- package/cjs/workspace/.claude/skills/create-module/SKILL.md +0 -162
- package/cjs/workspace/.claude/skills/debug/SKILL.md +0 -57
- package/cjs/workspace/.claude/skills/deploy/SKILL.md +0 -85
- package/cjs/workspace/.claude/skills/dev/SKILL.md +0 -32
- package/cjs/workspace/.claude/skills/plan/SKILL.md +0 -176
- package/cjs/workspace/.claude/skills/readme/SKILL.md +0 -186
- package/cjs/workspace/.claude/skills/report/SKILL.md +0 -49
- package/cjs/workspace/.claude/skills/team/SKILL.md +0 -101
- package/cjs/workspace/.claude/skills/test/SKILL.md +0 -56
- package/cjs/workspace/.claude/skills/test-device/SKILL.md +0 -114
- package/cjs/workspace/.claude/skills/test-e2e/SKILL.md +0 -103
- package/cjs/workspace/.claude/skills/test-hb/SKILL.md +0 -76
- package/cjs/workspace/.claude/skills/validate/SKILL.md +0 -96
- package/cjs/workspace/.claude/skills/validate/scripts/check-lua.sh +0 -41
- package/cjs/workspace/docs/aos-lua.md +0 -428
- package/cjs/workspace/docs/debug.md +0 -230
- package/cjs/workspace/docs/hyperbeam-dev.md +0 -606
- package/cjs/workspace/docs/hyperbeam-devices.md +0 -618
- package/cjs/workspace/docs/wao-sdk.md +0 -807
- package/cjs/workspace/frontend/e2e/.gitkeep +0 -0
- package/cjs/workspace/frontend/index.html +0 -12
- package/cjs/workspace/frontend/package.json +0 -24
- package/cjs/workspace/frontend/playwright.config.js +0 -10
- package/cjs/workspace/frontend/src/App.jsx +0 -24
- package/cjs/workspace/frontend/test/.gitkeep +0 -0
- package/cjs/workspace/frontend/vitest.config.js +0 -10
- package/cjs/workspace/scripts/deploy.js +0 -140
- package/cjs/workspace/scripts/keygen.js +0 -52
- package/cjs/workspace/test/aos.test.js +0 -98
- package/cjs/workspace/test/hyperbeam.test.js +0 -80
- package/esm/compiler/native +0 -0
- package/esm/workspace/.claude/agents/builder.md +0 -99
- package/esm/workspace/.claude/agents/device-builder.md +0 -86
- package/esm/workspace/.claude/agents/tester.md +0 -90
- package/esm/workspace/.claude/mcp/dashboard/server.js +0 -128
- package/esm/workspace/.claude/rules/deploy.md +0 -45
- package/esm/workspace/.claude/rules/frontend.md +0 -69
- package/esm/workspace/.claude/rules/hyperbeam.md +0 -104
- package/esm/workspace/.claude/rules/lua.md +0 -108
- package/esm/workspace/.claude/rules/testing.md +0 -257
- package/esm/workspace/.claude/settings.json +0 -109
- package/esm/workspace/.claude/skills/build/SKILL.md +0 -214
- package/esm/workspace/.claude/skills/build-aos/SKILL.md +0 -129
- package/esm/workspace/.claude/skills/build-device/SKILL.md +0 -192
- package/esm/workspace/.claude/skills/build-frontend/SKILL.md +0 -134
- package/esm/workspace/.claude/skills/build-module/SKILL.md +0 -281
- package/esm/workspace/.claude/skills/create-aos/SKILL.md +0 -63
- package/esm/workspace/.claude/skills/create-device/SKILL.md +0 -87
- package/esm/workspace/.claude/skills/create-module/SKILL.md +0 -162
- package/esm/workspace/.claude/skills/debug/SKILL.md +0 -57
- package/esm/workspace/.claude/skills/deploy/SKILL.md +0 -85
- package/esm/workspace/.claude/skills/dev/SKILL.md +0 -32
- package/esm/workspace/.claude/skills/plan/SKILL.md +0 -176
- package/esm/workspace/.claude/skills/readme/SKILL.md +0 -186
- package/esm/workspace/.claude/skills/report/SKILL.md +0 -49
- package/esm/workspace/.claude/skills/team/SKILL.md +0 -101
- package/esm/workspace/.claude/skills/test/SKILL.md +0 -56
- package/esm/workspace/.claude/skills/test-device/SKILL.md +0 -114
- package/esm/workspace/.claude/skills/test-e2e/SKILL.md +0 -103
- package/esm/workspace/.claude/skills/test-hb/SKILL.md +0 -76
- package/esm/workspace/.claude/skills/validate/SKILL.md +0 -96
- package/esm/workspace/.claude/skills/validate/scripts/check-lua.sh +0 -41
- package/esm/workspace/docs/aos-lua.md +0 -428
- package/esm/workspace/docs/debug.md +0 -230
- package/esm/workspace/docs/hyperbeam-dev.md +0 -606
- package/esm/workspace/docs/hyperbeam-devices.md +0 -618
- package/esm/workspace/docs/wao-sdk.md +0 -807
- package/esm/workspace/frontend/e2e/.gitkeep +0 -0
- package/esm/workspace/frontend/index.html +0 -12
- package/esm/workspace/frontend/package.json +0 -24
- package/esm/workspace/frontend/playwright.config.js +0 -10
- package/esm/workspace/frontend/src/App.jsx +0 -24
- package/esm/workspace/frontend/src/main.jsx +0 -9
- package/esm/workspace/frontend/test/.gitkeep +0 -0
- package/esm/workspace/frontend/vite.config.js +0 -6
- package/esm/workspace/frontend/vitest.config.js +0 -10
- package/esm/workspace/scripts/deploy.js +0 -140
- package/esm/workspace/scripts/keygen.js +0 -52
- package/esm/workspace/test/aos.test.js +0 -98
- package/esm/workspace/test/hyperbeam.test.js +0 -80
- /package/{cjs/workspace/dashboard/public → devnet/app}/favicon.ico +0 -0
- /package/{cjs/workspace → dhfs-tutorial-app}/src/counter.lua +0 -0
- /package/{cjs → dist/cjs}/accounts-web.js +0 -0
- /package/{cjs → dist/cjs}/accounts.js +0 -0
- /package/{cjs → dist/cjs}/adaptor-base.js +0 -0
- /package/{cjs → dist/cjs}/adaptor-cf.js +0 -0
- /package/{cjs → dist/cjs}/adaptor-web.js +0 -0
- /package/{cjs → dist/cjs}/adaptor.js +0 -0
- /package/{cjs → dist/cjs}/ao-loader.js +0 -0
- /package/{cjs → dist/cjs}/ao.js +0 -0
- /package/{cjs → dist/cjs}/aoconnect-base.js +0 -0
- /package/{cjs → dist/cjs}/aoconnect-cf.js +0 -0
- /package/{cjs → dist/cjs}/aoconnect-web.js +0 -0
- /package/{cjs → dist/cjs}/aoconnect.js +0 -0
- /package/{cjs → dist/cjs}/aos_wamr.js +0 -0
- /package/{cjs → dist/cjs}/ar-remote.js +0 -0
- /package/{cjs → dist/cjs}/ar.js +0 -0
- /package/{cjs → dist/cjs}/armem-base.js +0 -0
- /package/{cjs → dist/cjs}/armem-cf.js +0 -0
- /package/{cjs → dist/cjs}/armem-web.js +0 -0
- /package/{cjs → dist/cjs}/armem.js +0 -0
- /package/{cjs → dist/cjs}/bao.js +0 -0
- /package/{cjs → dist/cjs}/bar.js +0 -0
- /package/{cjs → dist/cjs}/build.js +0 -0
- /package/{cjs → dist/cjs}/bundler.js +0 -0
- /package/{cjs → dist/cjs}/car.js +0 -0
- /package/{cjs → dist/cjs}/cf-env.js +0 -0
- /package/{cjs → dist/cjs}/cf.js +0 -0
- /package/{cjs → dist/cjs}/cli.js +0 -0
- /package/{cjs → dist/cjs}/compress.js +0 -0
- /package/{cjs → dist/cjs}/create.js +0 -0
- /package/{cjs → dist/cjs}/devs.js +0 -0
- /package/{cjs → dist/cjs}/dirname.js +0 -0
- /package/{cjs → dist/cjs}/dodb.js +0 -0
- /package/{cjs → dist/cjs}/erl_json.js +0 -0
- /package/{cjs → dist/cjs}/erl_str.js +0 -0
- /package/{cjs → dist/cjs}/gql.js +0 -0
- /package/{cjs → dist/cjs}/hb.js +0 -0
- /package/{cjs → dist/cjs}/helpers.js +0 -0
- /package/{cjs → dist/cjs}/http.js +0 -0
- /package/{cjs → dist/cjs}/hub/bundler.js +0 -0
- /package/{cjs → dist/cjs}/hub/cu.js +0 -0
- /package/{cjs → dist/cjs}/hub/fs.js +0 -0
- /package/{cjs → dist/cjs}/hub/index.js +0 -0
- /package/{cjs → dist/cjs}/hub/utils.js +0 -0
- /package/{cjs → dist/cjs}/hub/ws-proxy.js +0 -0
- /package/{cjs → dist/cjs}/hyper-aos.js +0 -0
- /package/{cjs → dist/cjs}/hyperbeam-server.js +0 -0
- /package/{cjs → dist/cjs}/hyperbeam.js +0 -0
- /package/{cjs → dist/cjs}/index.js +0 -0
- /package/{cjs → dist/cjs}/keygen.js +0 -0
- /package/{cjs → dist/cjs}/lfdb.js +0 -0
- /package/{cjs → dist/cjs}/lua/aos.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_1.js +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_1.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_3.js +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_3.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_4_32.js +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_4_32.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_6.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/apm.lua +0 -0
- /package/{cjs → dist/cjs}/lua/llama.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/process.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/sqlite.js +0 -0
- /package/{cjs → dist/cjs}/lua/sqlite.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/weavedb_mock.lua +0 -0
- /package/{cjs → dist/cjs}/lua/weavedrive.lua +0 -0
- /package/{cjs → dist/cjs}/run.js +0 -0
- /package/{cjs → dist/cjs}/server.js +0 -0
- /package/{cjs → dist/cjs}/storage-multi.js +0 -0
- /package/{cjs → dist/cjs}/tao.js +0 -0
- /package/{cjs → dist/cjs}/tar.js +0 -0
- /package/{cjs → dist/cjs}/test.js +0 -0
- /package/{cjs → dist/cjs}/tgql-d1.js +0 -0
- /package/{cjs → dist/cjs}/tgql.js +0 -0
- /package/{cjs → dist/cjs}/toerl.js +0 -0
- /package/{cjs → dist/cjs}/utils.js +0 -0
- /package/{cjs → dist/cjs}/wao.js +0 -0
- /package/{cjs → dist/cjs}/waosm/waosm.js +0 -0
- /package/{cjs → dist/cjs}/waosm-node/waosm.js +0 -0
- /package/{cjs → dist/cjs}/waosm-node/waosm_bg.js +0 -0
- /package/{cjs → dist/cjs}/waosm-node/waosm_bg.wasm +0 -0
- /package/{cjs → dist/cjs}/waosm-node/waosm_bg.wasm.js +0 -0
- /package/{cjs → dist/cjs}/waosm-node.js +0 -0
- /package/{cjs → dist/cjs}/war.js +0 -0
- /package/{cjs → dist/cjs}/weavedrive.js +0 -0
- /package/{cjs → dist/cjs}/web.js +0 -0
- /package/{cjs → dist/cjs}/workspace/.mcp.json +0 -0
- /package/{cjs → dist/cjs}/workspace/CLAUDE.md +0 -0
- /package/{cjs → dist/cjs}/workspace/README.md +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/index.html +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/package.json +0 -0
- /package/{esm → dist/cjs}/workspace/dashboard/public/favicon.ico +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/public/favicon.png +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/server.js +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/src/App.jsx +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/src/main.jsx +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/vite.config.js +0 -0
- /package/{cjs → dist/cjs}/workspace/package.json +0 -0
- /package/{esm → dist/cjs}/workspace/src/counter.lua +0 -0
- /package/{esm → dist/esm}/accounts-web.js +0 -0
- /package/{esm → dist/esm}/accounts.js +0 -0
- /package/{esm → dist/esm}/adaptor-base.js +0 -0
- /package/{esm → dist/esm}/adaptor-cf.js +0 -0
- /package/{esm → dist/esm}/adaptor-web.js +0 -0
- /package/{esm → dist/esm}/adaptor.js +0 -0
- /package/{esm → dist/esm}/ao-loader.js +0 -0
- /package/{esm → dist/esm}/ao.js +0 -0
- /package/{esm → dist/esm}/aoconnect-base.js +0 -0
- /package/{esm → dist/esm}/aoconnect-cf.js +0 -0
- /package/{esm → dist/esm}/aoconnect-web.js +0 -0
- /package/{esm → dist/esm}/aoconnect.js +0 -0
- /package/{esm → dist/esm}/aos_wamr.js +0 -0
- /package/{esm → dist/esm}/ar-remote.js +0 -0
- /package/{esm → dist/esm}/ar.js +0 -0
- /package/{esm → dist/esm}/armem-base.js +0 -0
- /package/{esm → dist/esm}/armem-cf.js +0 -0
- /package/{esm → dist/esm}/armem-web.js +0 -0
- /package/{esm → dist/esm}/armem.js +0 -0
- /package/{esm → dist/esm}/bao.js +0 -0
- /package/{esm → dist/esm}/bar.js +0 -0
- /package/{esm → dist/esm}/build.js +0 -0
- /package/{esm → dist/esm}/bundler.js +0 -0
- /package/{esm → dist/esm}/car.js +0 -0
- /package/{esm → dist/esm}/cf-env.js +0 -0
- /package/{esm → dist/esm}/cf.js +0 -0
- /package/{esm → dist/esm}/cli.js +0 -0
- /package/{esm → dist/esm}/compress.js +0 -0
- /package/{esm → dist/esm}/create.js +0 -0
- /package/{esm → dist/esm}/devs.js +0 -0
- /package/{esm → dist/esm}/dirname.js +0 -0
- /package/{esm → dist/esm}/dodb.js +0 -0
- /package/{esm → dist/esm}/erl_json.js +0 -0
- /package/{esm → dist/esm}/erl_str.js +0 -0
- /package/{esm → dist/esm}/gql.js +0 -0
- /package/{esm → dist/esm}/hb.js +0 -0
- /package/{esm → dist/esm}/helpers.js +0 -0
- /package/{esm → dist/esm}/http.js +0 -0
- /package/{esm → dist/esm}/hub/bundler.js +0 -0
- /package/{esm → dist/esm}/hub/cu.js +0 -0
- /package/{esm → dist/esm}/hub/fs.js +0 -0
- /package/{esm → dist/esm}/hub/index.js +0 -0
- /package/{esm → dist/esm}/hub/utils.js +0 -0
- /package/{esm → dist/esm}/hub/ws-proxy.js +0 -0
- /package/{esm → dist/esm}/hyper-aos.js +0 -0
- /package/{esm → dist/esm}/hyperbeam-server.js +0 -0
- /package/{esm → dist/esm}/hyperbeam.js +0 -0
- /package/{esm → dist/esm}/index.js +0 -0
- /package/{esm → dist/esm}/keygen.js +0 -0
- /package/{esm → dist/esm}/lfdb.js +0 -0
- /package/{esm → dist/esm}/lua/aos.wasm +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_1.js +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_1.wasm +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_3.js +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_3.wasm +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_4_32.js +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_4_32.wasm +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_6.wasm +0 -0
- /package/{esm → dist/esm}/lua/apm.lua +0 -0
- /package/{esm → dist/esm}/lua/llama.wasm +0 -0
- /package/{esm → dist/esm}/lua/process.wasm +0 -0
- /package/{esm → dist/esm}/lua/sqlite.js +0 -0
- /package/{esm → dist/esm}/lua/sqlite.wasm +0 -0
- /package/{esm → dist/esm}/lua/weavedb_mock.lua +0 -0
- /package/{esm → dist/esm}/lua/weavedrive.lua +0 -0
- /package/{esm → dist/esm}/package.json +0 -0
- /package/{esm → dist/esm}/run.js +0 -0
- /package/{esm → dist/esm}/server.js +0 -0
- /package/{esm → dist/esm}/storage-multi.js +0 -0
- /package/{esm → dist/esm}/tao.js +0 -0
- /package/{esm → dist/esm}/tar.js +0 -0
- /package/{esm → dist/esm}/test.js +0 -0
- /package/{esm → dist/esm}/tgql-d1.js +0 -0
- /package/{esm → dist/esm}/tgql.js +0 -0
- /package/{esm → dist/esm}/toerl.js +0 -0
- /package/{esm → dist/esm}/utils.js +0 -0
- /package/{esm → dist/esm}/wao.js +0 -0
- /package/{esm → dist/esm}/waosm/README.md +0 -0
- /package/{esm → dist/esm}/waosm/waosm.d.ts +0 -0
- /package/{esm → dist/esm}/waosm/waosm.js +0 -0
- /package/{esm → dist/esm}/waosm/waosm_bg.wasm +0 -0
- /package/{esm → dist/esm}/waosm/waosm_bg.wasm.d.ts +0 -0
- /package/{esm → dist/esm}/waosm-node/README.md +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm.d.ts +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm.js +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm_bg.js +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm.d.ts +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm.js +0 -0
- /package/{esm → dist/esm}/waosm-node.js +0 -0
- /package/{esm → dist/esm}/war.js +0 -0
- /package/{esm → dist/esm}/weavedrive.js +0 -0
- /package/{esm → dist/esm}/web.js +0 -0
- /package/{esm → dist/esm}/workspace/.mcp.json +0 -0
- /package/{esm → dist/esm}/workspace/CLAUDE.md +0 -0
- /package/{esm → dist/esm}/workspace/README.md +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/index.html +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/package.json +0 -0
- /package/{esm/workspace/dashboard/public/favicon.png → dist/esm/workspace/dashboard/public/favicon.ico} +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/server.js +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/src/App.jsx +0 -0
- /package/{cjs/workspace/frontend → dist/esm/workspace/dashboard}/src/main.jsx +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/vite.config.js +0 -0
- /package/{esm → dist/esm}/workspace/package.json +0 -0
- /package/{postinstall.cjs → dist/postinstall.cjs} +0 -0
- /package/{esm → src}/workspace/dashboard/src/main.jsx +0 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured field codec for JavaScript-Erlang interoperability
|
|
3
|
+
* Implements the same behavior as dev_codec_structured.erl
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { erl_str_from } from "./erl_str.js"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Convert from structured format (rich message to TABM)
|
|
10
|
+
* Mirrors Erlang's from/1 function
|
|
11
|
+
* @param {*} obj - Rich message object
|
|
12
|
+
* @returns {*} - TABM object
|
|
13
|
+
*/
|
|
14
|
+
export function structured_from(obj) {
|
|
15
|
+
// Handle binary input
|
|
16
|
+
if (
|
|
17
|
+
typeof obj === "string" ||
|
|
18
|
+
obj instanceof Buffer ||
|
|
19
|
+
obj instanceof Uint8Array
|
|
20
|
+
) {
|
|
21
|
+
return obj
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Handle non-object input
|
|
25
|
+
if (typeof obj !== "object" || obj === null || Array.isArray(obj)) {
|
|
26
|
+
return obj
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Convert rich message to TABM
|
|
30
|
+
return from(obj)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Convert to structured format (TABM to rich message)
|
|
35
|
+
* Mirrors Erlang's to/1 function
|
|
36
|
+
* @param {string|object} input - Erlang term string or TABM object
|
|
37
|
+
* @returns {object} - Rich message object
|
|
38
|
+
*/
|
|
39
|
+
export function structured_to(input) {
|
|
40
|
+
// If input is a string (Erlang response), parse it
|
|
41
|
+
if (typeof input === "string") {
|
|
42
|
+
return erl_str_from(input, false)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Otherwise convert TABM to rich message
|
|
46
|
+
return to(input)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Convert a TABM into a rich message (mirrors Erlang's to/1)
|
|
51
|
+
* @param {*} tabm - Type-Annotated-Binary-Message
|
|
52
|
+
* @returns {*} - Rich message
|
|
53
|
+
*/
|
|
54
|
+
function to(tabm) {
|
|
55
|
+
// Handle binary input
|
|
56
|
+
if (
|
|
57
|
+
typeof tabm === "string" ||
|
|
58
|
+
tabm instanceof Buffer ||
|
|
59
|
+
tabm instanceof Uint8Array
|
|
60
|
+
) {
|
|
61
|
+
return tabm
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Handle non-object input
|
|
65
|
+
if (typeof tabm !== "object" || tabm === null || Array.isArray(tabm)) {
|
|
66
|
+
return tabm
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Parse ao-types if present
|
|
70
|
+
const aoTypesStr = tabm["ao-types"] || ""
|
|
71
|
+
const types = parseAoTypes(aoTypesStr)
|
|
72
|
+
|
|
73
|
+
// Build result with empty values first
|
|
74
|
+
const result = {}
|
|
75
|
+
|
|
76
|
+
// Add empty values based on their types (these may be overwritten if data exists)
|
|
77
|
+
for (const [key, type] of Object.entries(types)) {
|
|
78
|
+
if (type === "empty-binary") {
|
|
79
|
+
result[key] = ""
|
|
80
|
+
} else if (type === "empty-list") {
|
|
81
|
+
result[key] = []
|
|
82
|
+
} else if (type === "empty-message") {
|
|
83
|
+
result[key] = {}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Process all other key-value pairs
|
|
88
|
+
for (const [rawKey, value] of Object.entries(tabm)) {
|
|
89
|
+
// Skip ao-types field
|
|
90
|
+
if (rawKey === "ao-types") {
|
|
91
|
+
continue
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const normalizedKey = rawKey.toLowerCase()
|
|
95
|
+
|
|
96
|
+
if (
|
|
97
|
+
typeof value === "string" ||
|
|
98
|
+
value instanceof Buffer ||
|
|
99
|
+
value instanceof Uint8Array
|
|
100
|
+
) {
|
|
101
|
+
const type = types[normalizedKey]
|
|
102
|
+
if (type) {
|
|
103
|
+
// Decode according to type
|
|
104
|
+
result[rawKey] = decodeValue(type, value)
|
|
105
|
+
} else {
|
|
106
|
+
// No type info, keep as binary/string
|
|
107
|
+
result[rawKey] = value
|
|
108
|
+
}
|
|
109
|
+
} else if (
|
|
110
|
+
typeof value === "object" &&
|
|
111
|
+
value !== null &&
|
|
112
|
+
!Array.isArray(value)
|
|
113
|
+
) {
|
|
114
|
+
// Check if the child object itself indicates it's a list via .="list" in its ao-types
|
|
115
|
+
const childAoTypes = value["ao-types"] || ""
|
|
116
|
+
const childTypes = parseAoTypes(childAoTypes)
|
|
117
|
+
const isChildList = childTypes["."] === "list"
|
|
118
|
+
|
|
119
|
+
// Recursively decode child TABM
|
|
120
|
+
const childDecoded = to(value)
|
|
121
|
+
|
|
122
|
+
// Only convert numbered map to array if the child object itself
|
|
123
|
+
// declares it's a list via .="list" in its ao-types.
|
|
124
|
+
// This preserves original keys when the parent declares the type
|
|
125
|
+
// but the child doesn't have the list marker.
|
|
126
|
+
if (isChildList) {
|
|
127
|
+
// Convert numbered map back to ordered list
|
|
128
|
+
result[rawKey] = messageToOrderedList(childDecoded)
|
|
129
|
+
} else {
|
|
130
|
+
result[rawKey] = childDecoded
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
// Value already has converted type
|
|
134
|
+
result[rawKey] = value
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return filterDefaultKeys(result)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Parse ao-types field and return map of keys to types
|
|
143
|
+
* @param {string} aoTypesStr - ao-types field content
|
|
144
|
+
* @returns {object} - Map of normalized keys to types
|
|
145
|
+
*/
|
|
146
|
+
function parseAoTypes(aoTypesStr) {
|
|
147
|
+
if (!aoTypesStr) {
|
|
148
|
+
return {}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const types = {}
|
|
152
|
+
|
|
153
|
+
// Simple parser for "key1=\"type1\", key2=\"type2\"" format
|
|
154
|
+
const pairs = aoTypesStr.split(", ")
|
|
155
|
+
|
|
156
|
+
for (const pair of pairs) {
|
|
157
|
+
const match = pair.match(/^(.+?)="(.+?)"$/)
|
|
158
|
+
if (match) {
|
|
159
|
+
const [, key, type] = match
|
|
160
|
+
// Decode escaped key and normalize
|
|
161
|
+
const decodedKey = decodeEscapedKey(key)
|
|
162
|
+
types[decodedKey.toLowerCase()] = type
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return types
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Decode escaped key (simplified version)
|
|
171
|
+
* @param {string} key - Escaped key
|
|
172
|
+
* @returns {string} - Decoded key
|
|
173
|
+
*/
|
|
174
|
+
function decodeEscapedKey(key) {
|
|
175
|
+
// This is a simplified decoder - in practice you'd want more robust escaping
|
|
176
|
+
return key.replace(/\\"/g, '"').replace(/\\\\/g, "\\")
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Convert numbered map back to ordered list
|
|
181
|
+
* @param {object} numberedMap - Map with numeric string keys
|
|
182
|
+
* @returns {Array} - Ordered array
|
|
183
|
+
*/
|
|
184
|
+
function messageToOrderedList(numberedMap) {
|
|
185
|
+
const keys = Object.keys(numberedMap)
|
|
186
|
+
.filter(key => /^\d+$/.test(key))
|
|
187
|
+
.map(key => parseInt(key, 10))
|
|
188
|
+
.sort((a, b) => a - b)
|
|
189
|
+
|
|
190
|
+
return keys.map(key => numberedMap[key.toString()])
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Filter default keys (simplified - removes common defaults)
|
|
195
|
+
* @param {object} message - Message object
|
|
196
|
+
* @returns {object} - Filtered message
|
|
197
|
+
*/
|
|
198
|
+
function filterDefaultKeys(message) {
|
|
199
|
+
// This is a placeholder - implement based on your needs
|
|
200
|
+
return message
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Decode a value based on its type
|
|
205
|
+
* @param {string} type - Type identifier
|
|
206
|
+
* @param {*} value - Encoded value
|
|
207
|
+
* @returns {*} - Decoded value
|
|
208
|
+
*/
|
|
209
|
+
function decodeValue(type, value) {
|
|
210
|
+
switch (type.toLowerCase()) {
|
|
211
|
+
case "integer":
|
|
212
|
+
return parseInt(parseStructuredItem(value), 10)
|
|
213
|
+
|
|
214
|
+
case "float":
|
|
215
|
+
return parseFloat(value)
|
|
216
|
+
|
|
217
|
+
case "boolean":
|
|
218
|
+
// SF boolean format: ?1 = true, ?0 = false
|
|
219
|
+
// Convert to native boolean, will be encoded as "atom" type
|
|
220
|
+
if (value === "?1") return true
|
|
221
|
+
if (value === "?0") return false
|
|
222
|
+
// Fallback for other formats
|
|
223
|
+
return value === "true" || value === "1"
|
|
224
|
+
|
|
225
|
+
case "atom":
|
|
226
|
+
const atomItem = parseStructuredItem(value)
|
|
227
|
+
const atomName = atomItem.replace(/^"|"$/g, "") // Remove quotes
|
|
228
|
+
// Convert to Symbol to preserve atom type through round-trip
|
|
229
|
+
// Special cases for common atoms that JS has native types for
|
|
230
|
+
if (atomName === "true") return true
|
|
231
|
+
if (atomName === "false") return false
|
|
232
|
+
if (atomName === "null") return null
|
|
233
|
+
return Symbol.for(atomName)
|
|
234
|
+
|
|
235
|
+
case "list":
|
|
236
|
+
return parseStructuredList(value).map(item => {
|
|
237
|
+
if (typeof item === "string" && item.startsWith("(ao-type-")) {
|
|
238
|
+
const match = item.match(/^\(ao-type-(.+?)\) (.+)$/)
|
|
239
|
+
if (match) {
|
|
240
|
+
const [, itemType, itemValue] = match
|
|
241
|
+
return decodeValue(itemType, itemValue)
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return item
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
case "binary":
|
|
248
|
+
return value
|
|
249
|
+
|
|
250
|
+
default:
|
|
251
|
+
return value
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Parse structured field item (simplified)
|
|
257
|
+
* @param {string} value - Structured field value
|
|
258
|
+
* @returns {*} - Parsed value
|
|
259
|
+
*/
|
|
260
|
+
function parseStructuredItem(value) {
|
|
261
|
+
// Handle non-string values (e.g., numbers from HyperBEAM responses)
|
|
262
|
+
if (typeof value !== "string") return String(value)
|
|
263
|
+
if (value.startsWith('"') && value.endsWith('"')) {
|
|
264
|
+
return value.slice(1, -1) // Remove quotes
|
|
265
|
+
}
|
|
266
|
+
return value
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Parse structured field list (simplified)
|
|
271
|
+
* @param {string} value - Structured field list
|
|
272
|
+
* @returns {Array} - Parsed list
|
|
273
|
+
*/
|
|
274
|
+
function parseStructuredList(value) {
|
|
275
|
+
if (typeof value !== "string") return [value]
|
|
276
|
+
return value.split(", ").map(item => {
|
|
277
|
+
if (item.startsWith('"') && item.endsWith('"')) {
|
|
278
|
+
// Remove quotes and unescape SF string escapes
|
|
279
|
+
// In SF strings: \" = " and \\ = \
|
|
280
|
+
return item.slice(1, -1)
|
|
281
|
+
.replace(/\\"/g, '"') // \" -> "
|
|
282
|
+
.replace(/\\\\/g, '\\') // \\ -> \
|
|
283
|
+
}
|
|
284
|
+
return item
|
|
285
|
+
})
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Convert rich message to TABM (mirrors Erlang's from/1)
|
|
290
|
+
* @param {object} msg - Rich message
|
|
291
|
+
* @returns {object} - TABM
|
|
292
|
+
*/
|
|
293
|
+
function from(msg) {
|
|
294
|
+
// Handle binary input - passthrough
|
|
295
|
+
if (msg instanceof Buffer || msg instanceof Uint8Array) {
|
|
296
|
+
return msg
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Handle non-object values - passthrough
|
|
300
|
+
if (typeof msg !== "object" || msg === null) {
|
|
301
|
+
return msg
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Handle arrays - convert to numbered map with .="list" in ao-types
|
|
305
|
+
// Mirrors Erlang: from(List, Req, Opts) when is_list(List)
|
|
306
|
+
if (Array.isArray(msg)) {
|
|
307
|
+
// Convert to numbered map (1-based indexing like Erlang)
|
|
308
|
+
const numberedMap = {}
|
|
309
|
+
msg.forEach((item, idx) => {
|
|
310
|
+
numberedMap[(idx + 1).toString()] = item
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
// Recursively process the numbered map
|
|
314
|
+
const result = from(numberedMap)
|
|
315
|
+
|
|
316
|
+
// Add .="list" to ao-types to indicate this message is a list
|
|
317
|
+
const existingAoTypes = result["ao-types"] || ""
|
|
318
|
+
if (existingAoTypes) {
|
|
319
|
+
result["ao-types"] = '.="list", ' + existingAoTypes
|
|
320
|
+
} else {
|
|
321
|
+
result["ao-types"] = '.="list"'
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return result
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Process keys - preserve original case to match Erlang behavior
|
|
328
|
+
// HTTP headers are case-insensitive but JSON/map keys preserve case
|
|
329
|
+
const keysMap = {}
|
|
330
|
+
for (const [key, value] of Object.entries(msg)) {
|
|
331
|
+
keysMap[key] = value
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Get sorted keys (preserving case)
|
|
335
|
+
const sortedKeys = Object.keys(keysMap).sort()
|
|
336
|
+
|
|
337
|
+
const types = []
|
|
338
|
+
const values = []
|
|
339
|
+
|
|
340
|
+
// Process each key in sorted order
|
|
341
|
+
for (const key of sortedKeys) {
|
|
342
|
+
const value = keysMap[key]
|
|
343
|
+
|
|
344
|
+
// Handle empty binaries/strings - just include as-is, no type annotation
|
|
345
|
+
// (Erlang doesn't add empty-binary type, it just keeps the empty binary)
|
|
346
|
+
if (value === "" || (value instanceof Buffer && value.length === 0)) {
|
|
347
|
+
values.push([key, value])
|
|
348
|
+
continue
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// Empty arrays - convert to numbered map with .="list" in ao-types
|
|
352
|
+
// (Erlang doesn't add empty-list type, just the list marker)
|
|
353
|
+
if (Array.isArray(value) && value.length === 0) {
|
|
354
|
+
values.push([key, from(value)])
|
|
355
|
+
continue
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Empty objects - just include as-is, no type annotation
|
|
359
|
+
// (Erlang doesn't add empty-message type, it just keeps the empty map)
|
|
360
|
+
if (
|
|
361
|
+
typeof value === "object" &&
|
|
362
|
+
value !== null &&
|
|
363
|
+
!Array.isArray(value) &&
|
|
364
|
+
!(value instanceof Buffer) &&
|
|
365
|
+
Object.keys(value).length === 0
|
|
366
|
+
) {
|
|
367
|
+
values.push([key, value])
|
|
368
|
+
continue
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Handle binary/string values
|
|
372
|
+
if (value instanceof Buffer || value instanceof Uint8Array) {
|
|
373
|
+
values.push([key, value])
|
|
374
|
+
continue
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (typeof value === "string") {
|
|
378
|
+
values.push([key, value])
|
|
379
|
+
continue
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Handle nested maps
|
|
383
|
+
if (typeof value === "object" && !Array.isArray(value) && value !== null) {
|
|
384
|
+
values.push([key, from(value)])
|
|
385
|
+
continue
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Handle arrays - from() converts to numbered map with .="list" in ao-types
|
|
389
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
390
|
+
values.push([key, from(value)])
|
|
391
|
+
continue
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Handle typed values (need encoding)
|
|
395
|
+
if (
|
|
396
|
+
typeof value === "symbol" ||
|
|
397
|
+
typeof value === "number" ||
|
|
398
|
+
typeof value === "boolean" ||
|
|
399
|
+
value === null
|
|
400
|
+
) {
|
|
401
|
+
const [type, encoded] = encodeValue(value)
|
|
402
|
+
types.push([key, type])
|
|
403
|
+
values.push([key, encoded])
|
|
404
|
+
continue
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Build result
|
|
409
|
+
const result = {}
|
|
410
|
+
|
|
411
|
+
// Add ao-types if present
|
|
412
|
+
if (types.length > 0) {
|
|
413
|
+
result["ao-types"] = types.map(([k, t]) => `${k}="${t}"`).join(", ")
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Add values (but NOT empty values)
|
|
417
|
+
for (const [k, v] of values) {
|
|
418
|
+
result[k] = v
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return result
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Encode a value with its type
|
|
426
|
+
*/
|
|
427
|
+
function encodeValue(value) {
|
|
428
|
+
// Null (as atom) - use token format (unquoted)
|
|
429
|
+
if (value === null) {
|
|
430
|
+
return ["atom", "null"]
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Integer
|
|
434
|
+
if (typeof value === "number" && Number.isInteger(value)) {
|
|
435
|
+
return ["integer", value.toString()]
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Float
|
|
439
|
+
if (typeof value === "number") {
|
|
440
|
+
// Format like Erlang's float_to_binary - scientific notation with full precision
|
|
441
|
+
// Erlang's float_to_binary/1 uses ~20 decimal digits and keeps trailing zeros
|
|
442
|
+
let str = value.toExponential(20)
|
|
443
|
+
// Ensure 2-digit exponent with sign
|
|
444
|
+
str = str.replace(/e([+-])(\d)$/, "e$10$2")
|
|
445
|
+
return ["float", str]
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Boolean (as atom) - use token format (unquoted)
|
|
449
|
+
if (typeof value === "boolean") {
|
|
450
|
+
return ["atom", value.toString()]
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// Symbol (as atom) - use token format (unquoted)
|
|
454
|
+
if (typeof value === "symbol") {
|
|
455
|
+
const name = Symbol.keyFor(value) || value.description || ""
|
|
456
|
+
return ["atom", name]
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// List
|
|
460
|
+
if (Array.isArray(value)) {
|
|
461
|
+
const parts = []
|
|
462
|
+
|
|
463
|
+
for (const item of value) {
|
|
464
|
+
if (item instanceof Buffer) {
|
|
465
|
+
// Empty buffer => empty string
|
|
466
|
+
parts.push(item.length === 0 ? '""' : `"${item.toString()}"`)
|
|
467
|
+
} else if (typeof item === "string") {
|
|
468
|
+
parts.push(`"${item}"`)
|
|
469
|
+
} else {
|
|
470
|
+
const [itemType, itemEncoded] = encodeValue(item)
|
|
471
|
+
|
|
472
|
+
if (itemType === "list") {
|
|
473
|
+
// Escape nested list quotes
|
|
474
|
+
const escaped = itemEncoded
|
|
475
|
+
.replace(/\\/g, "\\\\")
|
|
476
|
+
.replace(/"/g, '\\"')
|
|
477
|
+
parts.push(`"(ao-type-list) ${escaped}"`)
|
|
478
|
+
} else if (itemType === "atom") {
|
|
479
|
+
// Escape atom quotes
|
|
480
|
+
const escaped = itemEncoded.replace(/"/g, '\\"')
|
|
481
|
+
parts.push(`"(ao-type-atom) ${escaped}"`)
|
|
482
|
+
} else {
|
|
483
|
+
parts.push(`"(ao-type-${itemType}) ${itemEncoded}"`)
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
return ["list", parts.join(", ")]
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
if (value instanceof Buffer) {
|
|
492
|
+
return ["binary", value]
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
return ["unknown", String(value)]
|
|
496
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import sha256 from "fast-sha256"
|
|
2
|
+
|
|
3
|
+
function base64urlDecode(str) {
|
|
4
|
+
str = str.replace(/-/g, "+").replace(/_/g, "/")
|
|
5
|
+
const pad = str.length % 4
|
|
6
|
+
if (pad === 2) str += "=="
|
|
7
|
+
else if (pad === 3) str += "="
|
|
8
|
+
else if (pad !== 0) throw new Error("Invalid base64url string")
|
|
9
|
+
const bin = atob(str)
|
|
10
|
+
const bytes = new Uint8Array(bin.length)
|
|
11
|
+
for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)
|
|
12
|
+
return bytes
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function base64urlEncode(bytes) {
|
|
16
|
+
let bin = ""
|
|
17
|
+
for (const b of bytes) bin += String.fromCharCode(b)
|
|
18
|
+
let b64 = btoa(bin)
|
|
19
|
+
return b64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "")
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function toAddr(n) {
|
|
23
|
+
if (typeof n === "object" && typeof n.n === "string") n = n.n
|
|
24
|
+
const pubBytes = base64urlDecode(n)
|
|
25
|
+
const hash = sha256(pubBytes)
|
|
26
|
+
return base64urlEncode(hash)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { toAddr }
|
package/lp/index.html
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>WizardAO — Build the New Verifiable Internet</title>
|
|
8
|
+
<meta name="description" content="From learning HyperBEAM to shipping production apps — WizardAO gives you SDK, testing framework, devnet, AI agents, and 139 documented modules for building on AO and Arweave." />
|
|
9
|
+
<meta property="og:title" content="WizardAO — Build the New Verifiable Internet" />
|
|
10
|
+
<meta property="og:description" content="From learning HyperBEAM to shipping production apps. SDK, testing framework, devnet, documentation, and AI agents." />
|
|
11
|
+
<meta property="og:image" content="/images/og-cover.png" />
|
|
12
|
+
<meta property="og:type" content="website" />
|
|
13
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
14
|
+
<meta name="twitter:title" content="WizardAO — Build the New Verifiable Internet" />
|
|
15
|
+
<meta name="twitter:description" content="From learning HyperBEAM to shipping production apps on AO and Arweave." />
|
|
16
|
+
<meta name="twitter:image" content="/images/og-cover.png" />
|
|
17
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
18
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
19
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Orbitron:wght@700;900&display=swap" rel="stylesheet" />
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<div id="root"></div>
|
|
23
|
+
<script type="module" src="/src/main.jsx"></script>
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
package/lp/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "wao-landing",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "vite build",
|
|
9
|
+
"preview": "vite preview"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"react": "^18",
|
|
13
|
+
"react-dom": "^18"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@vitejs/plugin-react": "^4",
|
|
17
|
+
"vite": "^6"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lp/src/App.jsx
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Nav from './components/Nav'
|
|
2
|
+
import Footer from './components/Footer'
|
|
3
|
+
import Hero from './sections/Hero'
|
|
4
|
+
import Vision from './sections/Vision'
|
|
5
|
+
import Book from './sections/Book'
|
|
6
|
+
import SDK from './sections/SDK'
|
|
7
|
+
import Testing from './sections/Testing'
|
|
8
|
+
import HyperADD from './sections/HyperADD'
|
|
9
|
+
import Devnet from './sections/Devnet'
|
|
10
|
+
import GetStarted from './sections/GetStarted'
|
|
11
|
+
|
|
12
|
+
export default function App() {
|
|
13
|
+
return (
|
|
14
|
+
<>
|
|
15
|
+
<Nav />
|
|
16
|
+
<main>
|
|
17
|
+
<Hero />
|
|
18
|
+
<Vision />
|
|
19
|
+
<Book />
|
|
20
|
+
<SDK />
|
|
21
|
+
<Testing />
|
|
22
|
+
<HyperADD />
|
|
23
|
+
<Devnet />
|
|
24
|
+
<GetStarted />
|
|
25
|
+
</main>
|
|
26
|
+
<Footer />
|
|
27
|
+
</>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import s from './CodeBlock.module.css'
|
|
3
|
+
|
|
4
|
+
export default function CodeBlock({ tabs }) {
|
|
5
|
+
const [active, setActive] = useState(0)
|
|
6
|
+
const [copied, setCopied] = useState(false)
|
|
7
|
+
|
|
8
|
+
const copy = () => {
|
|
9
|
+
const text = tabs[active].raw || tabs[active].code
|
|
10
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
11
|
+
setCopied(true)
|
|
12
|
+
setTimeout(() => setCopied(false), 2000)
|
|
13
|
+
})
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<div className={s.wrapper}>
|
|
18
|
+
<div className={s.header}>
|
|
19
|
+
<div className={s.tabs}>
|
|
20
|
+
{tabs.map((tab, i) => (
|
|
21
|
+
<button
|
|
22
|
+
key={tab.label}
|
|
23
|
+
className={`${s.tab} ${i === active ? s.tabActive : ''}`}
|
|
24
|
+
onClick={() => setActive(i)}
|
|
25
|
+
>
|
|
26
|
+
{tab.label}
|
|
27
|
+
</button>
|
|
28
|
+
))}
|
|
29
|
+
</div>
|
|
30
|
+
<button className={s.copyBtn} onClick={copy}>
|
|
31
|
+
{copied ? 'Copied!' : 'Copy'}
|
|
32
|
+
</button>
|
|
33
|
+
</div>
|
|
34
|
+
<div className={s.code} dangerouslySetInnerHTML={{ __html: tabs[active].code }} />
|
|
35
|
+
</div>
|
|
36
|
+
)
|
|
37
|
+
}
|