From 75ac23094bf736297fead5cf43c34e439a12c9d4 Mon Sep 17 00:00:00 2001 From: Ishaan Dey Date: Tue, 23 Apr 2024 17:46:51 -0400 Subject: [PATCH] somewhat working project initialization --- backend/storage/package-lock.json | 10 +++-- backend/storage/package.json | 3 ++ backend/storage/src/index.ts | 41 ++++++++++++++----- .../src/sandbox-starters/node/index.js | 1 + .../src/sandbox-starters/node/package.json | 12 ++++++ .../src/sandbox-starters/react/index.html | 13 ++++++ .../src/sandbox-starters/react/package.json | 26 ++++++++++++ .../src/sandbox-starters/react/src/App.css | 23 +++++++++++ .../src/sandbox-starters/react/src/App.jsx | 21 ++++++++++ .../src/sandbox-starters/react/src/main.jsx | 9 ++++ .../src/sandbox-starters/react/vite.config.js | 7 ++++ backend/storage/src/startercode.ts | 22 ++++++++++ frontend/app/globals.css | 6 +-- 13 files changed, 177 insertions(+), 17 deletions(-) create mode 100644 backend/storage/src/sandbox-starters/node/index.js create mode 100644 backend/storage/src/sandbox-starters/node/package.json create mode 100644 backend/storage/src/sandbox-starters/react/index.html create mode 100644 backend/storage/src/sandbox-starters/react/package.json create mode 100644 backend/storage/src/sandbox-starters/react/src/App.css create mode 100644 backend/storage/src/sandbox-starters/react/src/App.jsx create mode 100644 backend/storage/src/sandbox-starters/react/src/main.jsx create mode 100644 backend/storage/src/sandbox-starters/react/vite.config.js create mode 100644 backend/storage/src/startercode.ts diff --git a/backend/storage/package-lock.json b/backend/storage/package-lock.json index 07da92c..3b9a47e 100644 --- a/backend/storage/package-lock.json +++ b/backend/storage/package-lock.json @@ -7,6 +7,9 @@ "": { "name": "storage", "version": "0.0.0", + "dependencies": { + "zod": "^3.23.4" + }, "devDependencies": { "@cloudflare/vitest-pool-workers": "^0.1.0", "@cloudflare/workers-types": "^4.20240419.0", @@ -2990,10 +2993,9 @@ } }, "node_modules/zod": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.0.tgz", - "integrity": "sha512-OFLT+LTocvabn6q76BTwVB0hExEBS0IduTr3cqZyMqEDbOnYmcU+y0tUAYbND4uwclpBGi4I4UUBGzylWpjLGA==", - "dev": true, + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.4.tgz", + "integrity": "sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw==", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/backend/storage/package.json b/backend/storage/package.json index 9217961..10aebf3 100644 --- a/backend/storage/package.json +++ b/backend/storage/package.json @@ -15,5 +15,8 @@ "typescript": "^5.0.4", "vitest": "1.3.0", "wrangler": "^3.0.0" + }, + "dependencies": { + "zod": "^3.23.4" } } diff --git a/backend/storage/src/index.ts b/backend/storage/src/index.ts index 16e9145..7571ed6 100644 --- a/backend/storage/src/index.ts +++ b/backend/storage/src/index.ts @@ -1,22 +1,43 @@ -const success = new Response('Success', { status: 200 }); -const notFound = new Response('Not Found', { status: 404 }); -const methodNotAllowed = new Response('Method Not Allowed', { status: 405 }); +import { z } from 'zod'; +import startercode from './startercode'; export interface Env { - DB: D1Database; R2: R2Bucket; } export default { - async fetch( - request: Request, - env: Env, - ctx: ExecutionContext // : Promise - ) { + async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { + const success = new Response('Success', { status: 200 }); + const notFound = new Response('Not Found', { status: 404 }); + const methodNotAllowed = new Response('Method Not Allowed', { status: 405 }); + const url = new URL(request.url); const path = url.pathname; const method = request.method; - if (method === 'GET') { + + if (path === '/api/init' && method === 'POST') { + const initSchema = z.object({ + sandboxId: z.string(), + type: z.enum(['react', 'node']), + }); + + const body = await request.json(); + const { sandboxId, type } = initSchema.parse(body); + + // startercode.node.forEach(async (file) => { + // await env.R2.put(`${sandboxId}/${file.name}`, file.body); + // }); + + // parallel data fetching with promise.all: + await Promise.all( + startercode.node.map(async (file) => { + await env.R2.put(`projects/${sandboxId}/${file.name}`, file.body); + }) + ); + + return success; + } else { + return notFound; } }, }; diff --git a/backend/storage/src/sandbox-starters/node/index.js b/backend/storage/src/sandbox-starters/node/index.js new file mode 100644 index 0000000..a420803 --- /dev/null +++ b/backend/storage/src/sandbox-starters/node/index.js @@ -0,0 +1 @@ +console.log('Hello World!'); diff --git a/backend/storage/src/sandbox-starters/node/package.json b/backend/storage/src/sandbox-starters/node/package.json new file mode 100644 index 0000000..b16d2c7 --- /dev/null +++ b/backend/storage/src/sandbox-starters/node/package.json @@ -0,0 +1,12 @@ +{ + "name": "nodejs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@types/node": "^18.0.6" + } +} diff --git a/backend/storage/src/sandbox-starters/react/index.html b/backend/storage/src/sandbox-starters/react/index.html new file mode 100644 index 0000000..0c2cdb0 --- /dev/null +++ b/backend/storage/src/sandbox-starters/react/index.html @@ -0,0 +1,13 @@ + + + + + + + React Starter Code + + +
+ + + diff --git a/backend/storage/src/sandbox-starters/react/package.json b/backend/storage/src/sandbox-starters/react/package.json new file mode 100644 index 0000000..e608f06 --- /dev/null +++ b/backend/storage/src/sandbox-starters/react/package.json @@ -0,0 +1,26 @@ +{ + "name": "react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "vite": "^5.2.0" + } +} diff --git a/backend/storage/src/sandbox-starters/react/src/App.css b/backend/storage/src/sandbox-starters/react/src/App.css new file mode 100644 index 0000000..16d9202 --- /dev/null +++ b/backend/storage/src/sandbox-starters/react/src/App.css @@ -0,0 +1,23 @@ +div { + width: 100%; + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +h1 { + color: #fff; + margin: 0; +} + +p { + color: #777; + margin: 0; +} + +button { + padding: 8px 16px; + margin-top: 16px; +} \ No newline at end of file diff --git a/backend/storage/src/sandbox-starters/react/src/App.jsx b/backend/storage/src/sandbox-starters/react/src/App.jsx new file mode 100644 index 0000000..f588bc9 --- /dev/null +++ b/backend/storage/src/sandbox-starters/react/src/App.jsx @@ -0,0 +1,21 @@ +import './App.css' +import { useState } from 'react' + +function App() { + + const [count, setCount] = useState(0) + + return ( +
+

React Starter Code

+

+ Edit App.jsx to get started. +

+ +
+ ) +} + +export default App diff --git a/backend/storage/src/sandbox-starters/react/src/main.jsx b/backend/storage/src/sandbox-starters/react/src/main.jsx new file mode 100644 index 0000000..51a8c58 --- /dev/null +++ b/backend/storage/src/sandbox-starters/react/src/main.jsx @@ -0,0 +1,9 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) diff --git a/backend/storage/src/sandbox-starters/react/vite.config.js b/backend/storage/src/sandbox-starters/react/vite.config.js new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/backend/storage/src/sandbox-starters/react/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/backend/storage/src/startercode.ts b/backend/storage/src/startercode.ts new file mode 100644 index 0000000..11f5ead --- /dev/null +++ b/backend/storage/src/startercode.ts @@ -0,0 +1,22 @@ +const startercode = { + node: [ + { name: 'index.js', body: `console.log("Hello World!")` }, + { + name: 'package.json', + body: `{ + "name": "nodejs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@types/node": "^18.0.6" + } +}`, + }, + ], +}; + +export default startercode; diff --git a/frontend/app/globals.css b/frontend/app/globals.css index 2803169..8a2dcec 100644 --- a/frontend/app/globals.css +++ b/frontend/app/globals.css @@ -76,15 +76,15 @@ } .gradient-button-bg { - background: radial-gradient(circle at top, #a5b4fc 0%, #3730a3 50%); /* violet 300 -> 800 */ + background: radial-gradient(circle at top, #a5b4fc -10%, #3730a3 30%); /* violet 300 -> 800 */ } .gradient-button { - background: radial-gradient(circle at bottom, #312e81 0%, hsl(0 0% 3.9%) 80%); /* violet 900 -> bg */ + background: radial-gradient(circle at bottom, #312e81 -20%, hsl(0 0% 3.9%) 50%); /* violet 900 -> bg */ } .gradient-button-bg > div:hover { - background: radial-gradient(circle at bottom, #312e81 0%, hsl(0 0% 3.9%) 130%); /* violet 900 -> bg */ + background: radial-gradient(circle at bottom, #312e81 -20%, hsl(0 0% 3.9%) 100%); /* violet 900 -> bg */ } .gradient-project-card-bg {