Add a self-contained, ESM-free goja bundle of the FULL captable business logic so the unified hanzoai/cloud binary can host it in-process via dop251/goja (HIP-0106), backed by per-tenant Base/SQLite — dropping Next.js/Prisma/tRPC from this path. This is the PILOT of the read-write-Base-via-goja pattern (epic #96) that esign (#100) and dataroom (#101) reuse via cloud's clients/gojabase binding. Full fold, ported from the tRPC routers with Prisma/next-auth/zod removed and persistence delegated to an injected globalThis.__db bridge: - company (root, seeded per tenant by the host), stakeholders (list/add/update/ delete), share classes (list/create/update), equity plans (list/create). - securities issuance: shares (add/list/delete) + options (add/list/delete); share transfers (full reassign + partial split, atomic). - convertibles: SAFEs + convertible notes (list/create/delete). - rounds + investments: a PRICED round issues shares to each investor and dilutes the cap table; SAFE/CONVERTIBLE rounds record capital. - captable: computed ownership on a fully-diluted basis (shares + options), per-class authorized-vs-issued, convertibles + rounds summary. Structure: - goja/src/*.ts — domain logic split by concern (host bridge, validators, and a routes/ module per domain), exposing globalThis.handle({route,params,orgId, body}) -> {status,body}. The bundle carries logic, never a DB engine. - goja/build.mjs — esbuild → goja/bundle.js (IIFE, ES2015, platform=neutral, no node: builtins). bundle.js committed so cloud go:embeds it (as @hanzo/plans ships goja/bundle.js). - goja/test/bundle.test.mjs — smoke + wiring test in node:vm vs a mock __db (tenant gate, route table, validation, INSERT shape, idx auto-increment, cap table shape, full transfer, round-create gating). 9/9 pass. - embed.go + go.mod — tiny std-only Go embed module (github.com/hanzoai/captable) exposing Bundle(); mirrors github.com/hanzoai/plans. The Next app + goja/src stay the single source of truth; the Go layer is a read-only embed. - tsconfig/biome — exclude goja/ from the Next typecheck + lint. Claude-Session: https://claude.ai/code/session_016yg7GPhYdWCh9vpp4HEwLZ Co-authored-by: hanzo-dev <dev@hanzo.ai>
47 lines
1.0 KiB
JSON
47 lines
1.0 KiB
JSON
{
|
|
"compilerOptions": {
|
|
/* Base Options: */
|
|
"esModuleInterop": true,
|
|
"skipLibCheck": true,
|
|
"target": "es2022",
|
|
"allowJs": true,
|
|
"resolveJsonModule": true,
|
|
"moduleDetection": "force",
|
|
"isolatedModules": true,
|
|
|
|
/* Strictness */
|
|
"strict": true,
|
|
"noUncheckedIndexedAccess": true,
|
|
"checkJs": true,
|
|
"strictNullChecks": true,
|
|
|
|
/* Bundled projects */
|
|
"lib": ["dom", "dom.iterable", "ES2022"],
|
|
"noEmit": true,
|
|
"module": "ESNext",
|
|
"moduleResolution": "Bundler",
|
|
"jsx": "preserve",
|
|
"plugins": [{ "name": "next" }],
|
|
"incremental": true,
|
|
|
|
/* Path Aliases */
|
|
"baseUrl": ".",
|
|
"paths": {
|
|
"@/*": ["./src/*"],
|
|
"@/prisma/*": ["./prisma/*"]
|
|
}
|
|
},
|
|
"include": [
|
|
".eslintrc.cjs",
|
|
"next-env.d.ts",
|
|
"**/*.ts",
|
|
"**/*.tsx",
|
|
"**/*.cjs",
|
|
"**/*.js",
|
|
".next/types/**/*.ts",
|
|
"src/components/onboarding/verify-email",
|
|
"src/app/(unauthenticated)/forgot-password"
|
|
],
|
|
"exclude": ["node_modules", "goja"]
|
|
}
|