a
This commit is contained in:
parent
0dc50b636a
commit
86a2fabfcf
12 changed files with 1401 additions and 232 deletions
16
index.html
Normal file
16
index.html
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta name="theme-color" content="#000000" />
|
||||||
|
<link rel="shortcut icon" type="image/ico" href="/src/assets/favicon.ico" />
|
||||||
|
<title>Solid App</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
|
||||||
|
<script src="/src/client/index.tsx" type="module"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
1459
package-lock.json
generated
1459
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -4,7 +4,7 @@
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"dev": "vite"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
|
@ -15,11 +15,14 @@
|
||||||
"prisma": "^4.11.0",
|
"prisma": "^4.11.0",
|
||||||
"ts-node": "^10.9.1",
|
"ts-node": "^10.9.1",
|
||||||
"typescript": "^5.0.2",
|
"typescript": "^5.0.2",
|
||||||
"wetzel": "^0.2.3"
|
"wetzel": "^0.2.3",
|
||||||
|
"vite": "^4.2.1",
|
||||||
|
"vite-plugin-solid": "^2.6.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "^4.11.0",
|
"@prisma/client": "^4.11.0",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"solid-js": "^1.6.15",
|
||||||
"vm2": "^3.9.14"
|
"vm2": "^3.9.14"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
24
src/client/App.tsx
Normal file
24
src/client/App.tsx
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import Todos from "./Todos";
|
||||||
|
|
||||||
|
function App() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<header>
|
||||||
|
<p>
|
||||||
|
Edit <code>src/App.jsx</code> and save to reload.
|
||||||
|
</p>
|
||||||
|
<a
|
||||||
|
href="https://github.com/solidjs/solid"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
Learn Solid
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<Todos />
|
||||||
|
</header>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
72
src/client/Todos.tsx
Normal file
72
src/client/Todos.tsx
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
import { For, batch, createEffect, createSignal } from "solid-js";
|
||||||
|
import { SetStoreFunction, Store, createStore } from "solid-js/store";
|
||||||
|
|
||||||
|
type TodoItem = { title: string; done: boolean };
|
||||||
|
|
||||||
|
const Todos = () => {
|
||||||
|
const [newTitle, setTitle] = createSignal("");
|
||||||
|
const [todos, setTodos] = createLocalStore<TodoItem[]>("todos", []);
|
||||||
|
|
||||||
|
const addTodo = (e: SubmitEvent) => {
|
||||||
|
e.preventDefault();
|
||||||
|
batch(() => {
|
||||||
|
setTodos(todos.length, {
|
||||||
|
title: newTitle(),
|
||||||
|
done: false,
|
||||||
|
});
|
||||||
|
setTitle("");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<h3>Simple Todos Example</h3>
|
||||||
|
<form onSubmit={addTodo}>
|
||||||
|
<input
|
||||||
|
placeholder="enter todo and click +"
|
||||||
|
required
|
||||||
|
value={newTitle()}
|
||||||
|
onInput={(e) => setTitle(e.currentTarget.value)}
|
||||||
|
/>
|
||||||
|
<button>+</button>
|
||||||
|
</form>
|
||||||
|
<For each={todos}>
|
||||||
|
{(todo, i) => (
|
||||||
|
<div>
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
checked={todo.done}
|
||||||
|
onChange={(e) => setTodos(i(), "done", e.currentTarget.checked)}
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={todo.title}
|
||||||
|
onChange={(e) => setTodos(i(), "title", e.currentTarget.value)}
|
||||||
|
/>
|
||||||
|
<button onClick={() => setTodos((t) => removeIndex(t, i()))}>
|
||||||
|
x
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</For>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Todos;
|
||||||
|
|
||||||
|
export function createLocalStore<T extends object>(
|
||||||
|
name: string,
|
||||||
|
init: T
|
||||||
|
): [Store<T>, SetStoreFunction<T>] {
|
||||||
|
const localState = localStorage.getItem(name);
|
||||||
|
const [state, setState] = createStore<T>(
|
||||||
|
localState ? JSON.parse(localState) : init
|
||||||
|
);
|
||||||
|
createEffect(() => localStorage.setItem(name, JSON.stringify(state)));
|
||||||
|
return [state, setState];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function removeIndex<T>(array: readonly T[], index: number): T[] {
|
||||||
|
return [...array.slice(0, index), ...array.slice(index + 1)];
|
||||||
|
}
|
12
src/client/index.tsx
Normal file
12
src/client/index.tsx
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import { render } from "solid-js/web";
|
||||||
|
import App from "./App";
|
||||||
|
|
||||||
|
const root = document.getElementById("root");
|
||||||
|
|
||||||
|
if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
|
||||||
|
throw new Error(
|
||||||
|
"Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got mispelled?"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
render(() => <App />, root);
|
|
@ -1 +1 @@
|
||||||
import { Database } from "./db.ts";
|
import Database from "./db";
|
||||||
|
|
|
@ -8,7 +8,8 @@ app.get("/", (req, res) => {
|
||||||
res.send("Welcome to the Dinosaur API!");
|
res.send("Welcome to the Dinosaur API!");
|
||||||
});
|
});
|
||||||
|
|
||||||
app.post("/node", async (req, res) => {
|
// Create a node
|
||||||
|
app.post("/api/node", async (req, res) => {
|
||||||
const node = await Database.createNode({
|
const node = await Database.createNode({
|
||||||
label: "hellosu",
|
label: "hellosu",
|
||||||
other_nodes: new Map(),
|
other_nodes: new Map(),
|
||||||
|
@ -20,5 +21,8 @@ app.post("/node", async (req, res) => {
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
import todos from "./todos";
|
||||||
|
app.use("/api/todos", todos);
|
||||||
|
|
||||||
console.log("Listening.");
|
console.log("Listening.");
|
||||||
app.listen(8605, "0.0.0.0");
|
app.listen(8605, "0.0.0.0");
|
||||||
|
|
8
src/server/todos.ts
Normal file
8
src/server/todos.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import {Router} from "express";
|
||||||
|
|
||||||
|
const router = Router();
|
||||||
|
|
||||||
|
router.get("/", async (req, res) => {
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
15
tsconfig.json
Normal file
15
tsconfig.json
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"strict": true,
|
||||||
|
"target": "ESNext",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"jsx": "preserve",
|
||||||
|
"jsxImportSource": "solid-js",
|
||||||
|
"types": ["vite/client"],
|
||||||
|
"noEmit": true,
|
||||||
|
"isolatedModules": true
|
||||||
|
}
|
||||||
|
}
|
12
vite.config.js
Normal file
12
vite.config.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import { defineConfig } from "vite";
|
||||||
|
import solidPlugin from "vite-plugin-solid";
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [solidPlugin()],
|
||||||
|
server: {
|
||||||
|
port: 3000,
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
target: "esnext",
|
||||||
|
},
|
||||||
|
});
|
Loading…
Reference in a new issue