Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,8 @@ docs/docs.backup.json

**/.cache/
perf-results.json

# Playwright
test-results/
playwright-report/
libs/browser/e2e/fixtures/enclave-browser-bundle.mjs
13 changes: 13 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# CLAUDE.md

## Verification

After every code change, the following commands must all pass before considering the work complete:

```bash
pnpm lint
pnpm format:check
pnpm build
```

Run these from the repository root. Use `npx nx` to target individual projects (e.g., `npx nx build browser`).
2 changes: 2 additions & 0 deletions apps/browser-demo/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Generated enclave bundle
vendor/enclave-browser-bundle.mjs
8 changes: 8 additions & 0 deletions apps/browser-demo/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import baseConfig from '../../eslint.config.mjs';

export default [
...baseConfig,
{
ignores: ['vendor/**'],
},
];
12 changes: 12 additions & 0 deletions apps/browser-demo/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Browser Enclave Demo</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
23 changes: 23 additions & 0 deletions apps/browser-demo/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "browser-demo",
"version": "0.0.1",
"private": true,
"type": "module",
"scripts": {
"prebuild": "node scripts/build-enclave-bundle.mjs",
"dev": "vite",
"build": "vite build"
},
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"@vitejs/plugin-react": "^4.5.2",
"esbuild": "^0.25.0",
"typescript": "~5.9.3",
"vite": "^6.3.5"
}
}
28 changes: 28 additions & 0 deletions apps/browser-demo/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "browser-demo",
"sourceRoot": "apps/browser-demo/src",
"projectType": "application",
"targets": {
"prebuild": {
"executor": "nx:run-commands",
"options": {
"command": "node apps/browser-demo/scripts/build-enclave-bundle.mjs"
}
},
"serve": {
"executor": "nx:run-commands",
"dependsOn": ["prebuild"],
"options": {
"command": "npx vite --config apps/browser-demo/vite.config.ts"
}
},
"build": {
"executor": "nx:run-commands",
"dependsOn": ["prebuild"],
"options": {
"command": "npx vite build --config apps/browser-demo/vite.config.ts"
},
"outputs": ["{workspaceRoot}/dist/apps/browser-demo"]
}
}
}
13 changes: 13 additions & 0 deletions apps/browser-demo/scripts/buffer-shim.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* Minimal Buffer shim for the browser test bundle.
* Only provides Buffer.byteLength which is used by @enclave-vm/ast's size-check.
*/
const encoder = new TextEncoder();

if (typeof globalThis.Buffer === 'undefined') {
globalThis.Buffer = {
byteLength(str) {
return encoder.encode(String(str)).byteLength;
},
};
}
30 changes: 30 additions & 0 deletions apps/browser-demo/scripts/build-enclave-bundle.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/**
* Build a self-contained ESM bundle of @enclave-vm/browser for the demo app.
*
* Inlines all dependencies (ast, acorn, astring, zod) into a single ESM file.
* Output goes to vendor/ so Vite can import it as a normal module.
*/

import { build } from 'esbuild';
import path from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const root = path.resolve(__dirname, '../../..');

await build({
entryPoints: [path.resolve(root, 'libs/browser/src/index.ts')],
bundle: true,
format: 'esm',
outfile: path.resolve(__dirname, '../vendor/enclave-browser-bundle.mjs'),
platform: 'browser',
target: 'es2022',
external: [],
alias: {
'@enclave-vm/ast': path.resolve(root, 'libs/ast/src/index.ts'),
},
inject: [path.resolve(__dirname, 'buffer-shim.mjs')],
sourcemap: false,
minify: false,
logLevel: 'info',
});
Loading
Loading