From aa8ee9c034c6e085c51401bf675ff3709ff93f23 Mon Sep 17 00:00:00 2001 From: wass08 Date: Wed, 14 Jan 2026 11:14:31 +0900 Subject: [PATCH] project organization --- bun.lock | 14 +++- packages/core/src/index.ts | 6 +- packages/core/src/schema/index.ts | 16 ++++ packages/core/src/schema/nodes/level.ts | 2 +- packages/core/src/store/useScene.ts | 80 ++++--------------- packages/typescript-config/react-library.json | 4 +- 6 files changed, 54 insertions(+), 68 deletions(-) create mode 100644 packages/core/src/schema/index.ts diff --git a/bun.lock b/bun.lock index 6b59f76a..9fd63989 100644 --- a/bun.lock +++ b/bun.lock @@ -39,6 +39,12 @@ "packages/core": { "name": "@pascal-app/core", "version": "0.0.1", + "dependencies": { + "dedent": "^1.7.1", + "nanoid": "^5.1.6", + "zod": "^4.3.5", + "zustand": "^5.0.10", + }, "devDependencies": { "@react-three/drei": "^10", "@react-three/fiber": "^9", @@ -457,6 +463,8 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "dedent": ["dedent@1.7.1", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg=="], + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], @@ -741,7 +749,7 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], @@ -1011,6 +1019,8 @@ "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "sharp/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], "stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="], @@ -1024,5 +1034,7 @@ "web/three": ["three@0.182.0", "", {}, "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "next/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 336ce12b..e7e73ffe 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1 +1,5 @@ -export {} +// Store +export { default as useScene } from "./store/useScene" + +// Schema +export * from "./schema" diff --git a/packages/core/src/schema/index.ts b/packages/core/src/schema/index.ts new file mode 100644 index 00000000..326879ca --- /dev/null +++ b/packages/core/src/schema/index.ts @@ -0,0 +1,16 @@ +// Base +export { BaseNode, generateId, objectId, nodeType, Material } from "./base" + +// Nodes +export { SiteNode } from "./nodes/site" +export { BuildingNode } from "./nodes/building" +export { LevelNode } from "./nodes/level" +export { WallNode } from "./nodes/wall" +export { ItemNode } from "./nodes/item" + +// Union types +export { AnyNode } from "./types" +export type { AnyNodeType, AnyNodeId } from "./types" + +// Camera +export { CameraSchema } from "./camera" diff --git a/packages/core/src/schema/nodes/level.ts b/packages/core/src/schema/nodes/level.ts index 291c13f4..24ec738c 100644 --- a/packages/core/src/schema/nodes/level.ts +++ b/packages/core/src/schema/nodes/level.ts @@ -6,7 +6,7 @@ import { WallNode } from "./wall"; export const LevelNode = BaseNode.extend({ id: objectId("level"), type: nodeType("level"), - children: z.array(z.discriminatedUnion("type", [WallNode])).default([]), + children: z.array(WallNode.shape.id).default([]), // Specific props level: z.number().default(0), }).describe( diff --git a/packages/core/src/store/useScene.ts b/packages/core/src/store/useScene.ts index dd4882a2..2096ff9e 100644 --- a/packages/core/src/store/useScene.ts +++ b/packages/core/src/store/useScene.ts @@ -1,5 +1,6 @@ +"use client"; + import { create } from "zustand"; -import { ItemNode } from "../schema/nodes/item"; import { LevelNode } from "../schema/nodes/level"; import { WallNode } from "../schema/nodes/wall"; import { AnyNode, AnyNodeId } from "../schema/types"; @@ -75,79 +76,30 @@ const useScene = create()((set, get) => ({ // Define all nodes flat const nodes: Record = { - // Level 0 - - wall_0_0: WallNode.parse({ - id: "wall_0_0", - start: [0, 0], - end: [5, 0], - children: ["item_1_1", "item_1_2", "item_1_3"], - }), - wall_0_1: WallNode.parse({ - id: "wall_0_1", - start: [0, 0], - end: [0, 5], - }), - wall_0_2: WallNode.parse({ - id: "wall_0_2", - start: [5, 5], - end: [0, 5], - }), - wall_0_3: WallNode.parse({ - id: "wall_0_3", - start: [5, 5], - end: [5, 0], - }), - - // Level 1 - level_1: LevelNode.parse({ - id: "level_1", - level: 1, - children: ["item_1_0"], - }), - item_1_0: ItemNode.parse({ - id: "item_1_0", - position: [-1, 0, 0], - }), - item_1_1: ItemNode.parse({ - id: "item_1_1", - parentId: "wall_0_0", - position: [2.5, 0.8, 0], - }), - item_1_2: ItemNode.parse({ - id: "item_1_2", - parentId: "wall_0_0", - position: [1, 0.8, 0], - }), - item_1_3: ItemNode.parse({ - id: "item_1_3", - parentId: "wall_0_0", - position: [4, 0.8, 0], - }), - - // Level 2 - level_2: LevelNode.parse({ - id: "level_2", - level: 2, - children: [], - }), + [level0.id]: level0, + [level1.id]: level1, + [level2.id]: level2, + [wall0.id]: wall0, + [wall1.id]: wall1, + [wall2.id]: wall2, + [wall3.id]: wall3, }; // Root nodes are the levels - const rootNodeIds = ["level_0", "level_1", "level_2"]; + const rootNodeIds = [level0.id, level1.id, level2.id]; - get().dirtyNodes.add("wall_0_0"); - get().dirtyNodes.add("wall_0_1"); - get().dirtyNodes.add("wall_0_2"); - get().dirtyNodes.add("wall_0_3"); + get().dirtyNodes.add(wall0.id); + get().dirtyNodes.add(wall1.id); + get().dirtyNodes.add(wall2.id); + get().dirtyNodes.add(wall3.id); set({ nodes, rootNodeIds }); }, - markDirty: (id: string) => { + markDirty: (id) => { get().dirtyNodes.add(id); }, - clearDirty: (id: string) => { + clearDirty: (id) => { get().dirtyNodes.delete(id); }, diff --git a/packages/typescript-config/react-library.json b/packages/typescript-config/react-library.json index c3a1b26f..65c6292f 100644 --- a/packages/typescript-config/react-library.json +++ b/packages/typescript-config/react-library.json @@ -2,6 +2,8 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./base.json", "compilerOptions": { - "jsx": "react-jsx" + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler" } }