Files
low-code-react-app-b/src/hooks/use-project-state.ts
johndoe6345789 4dfded3533 Generated by Spark: @johndoe6345789 ➜ /workspaces/low-code-react-app-b (main) $ npm run build
> spark-template@0.0.0 prebuild
> mkdir -p /tmp/dist || true

> spark-template@0.0.0 build
> tsc -b --noCheck && vite build

vite v7.3.1 building client environment for production...
<script src="/runtime-config.js"> in "/index.html" can't be bundled without type="module" attribute
✓ 37 modules transformed.
✗ Build failed in 1.07s
error during build:
[vite]: Rollup failed to resolve import "@github/spark/hooks" from "/workspaces/low-code-react-app-b/src/hooks/use-project-state.ts".
This is most likely unintended because it can break your application at runtime.
If you do want to externalize this module explicitly add it to
`build.rollupOptions.external`
    at viteLog (file:///workspaces/low-code-react-app-b/node_modules/vite/dist/node/chunks/config.js:33635:57)
    at file:///workspaces/low-code-react-app-b/node_modules/vite/dist/node/chunks/config.js:33669:73
    at onwarn (file:///workspaces/low-code-react-app-b/node_modules/@vitejs/plugin-react-swc/index.js:76:7)
    at file:///workspaces/low-code-react-app-b/node_modules/vite/dist/node/chunks/config.js:33669:28
    at onRollupLog (file:///workspaces/low-code-react-app-b/node_modules/vite/dist/node/chunks/config.js:33664:63)
    at onLog (file:///workspaces/low-code-react-app-b/node_modules/vite/dist/node/chunks/config.js:33467:4)
    at file:///workspaces/low-code-react-app-b/node_modules/rollup/dist/es/shared/node-entry.js:20961:32
    at Object.logger [as onLog] (file:///workspaces/low-code-react-app-b/node_modules/rollup/dist/es/shared/node-entry.js:22848:9)
    at ModuleLoader.handleInvalidResolvedId (file:///workspaces/low-code-react-app-b/node_modules/rollup/dist/es/shared/node-entry.js:21592:26)
    at file:///workspaces/low-code-react-app-b/node_modules/rollup/dist/es/shared/node-entry.js:21550:26
@johndoe6345789 ➜ /workspaces/low-code-react-app-b (main) $
2026-01-17 19:39:46 +00:00

270 lines
9.4 KiB
TypeScript

import { useKV } from '@/hooks/use-kv'
import {
ProjectFile,
PrismaModel,
ComponentNode,
ComponentTree,
ThemeConfig,
PlaywrightTest,
StorybookStory,
UnitTest,
FlaskConfig,
NextJsConfig,
NpmSettings,
Workflow,
Lambda,
FeatureToggles
} from '@/types/project'
const DEFAULT_FLASK_CONFIG: FlaskConfig = {
blueprints: [],
corsOrigins: ['http://localhost:3000'],
enableSwagger: true,
port: 5000,
debug: true,
}
const DEFAULT_NEXTJS_CONFIG: NextJsConfig = {
appName: 'my-nextjs-app',
typescript: true,
eslint: true,
tailwind: true,
srcDirectory: true,
appRouter: true,
importAlias: '@/*',
turbopack: false,
githubRepo: {
owner: 'johndoe6345789',
repo: 'low-code-react-app-b',
},
}
const DEFAULT_NPM_SETTINGS: NpmSettings = {
packages: [
{ id: '1', name: 'react', version: '^18.2.0', isDev: false },
{ id: '2', name: 'react-dom', version: '^18.2.0', isDev: false },
{ id: '3', name: 'next', version: '^14.0.0', isDev: false },
{ id: '4', name: '@mui/material', version: '^5.14.0', isDev: false },
{ id: '5', name: 'typescript', version: '^5.0.0', isDev: true },
{ id: '6', name: '@types/react', version: '^18.2.0', isDev: true },
],
scripts: {
dev: 'next dev',
build: 'next build',
start: 'next start',
lint: 'next lint',
},
packageManager: 'npm',
}
const DEFAULT_FEATURE_TOGGLES: FeatureToggles = {
codeEditor: true,
models: true,
components: true,
componentTrees: true,
workflows: true,
lambdas: true,
styling: true,
flaskApi: true,
playwright: true,
storybook: true,
unitTests: true,
errorRepair: true,
documentation: true,
sassStyles: true,
faviconDesigner: true,
ideaCloud: true,
schemaEditor: true,
dataBinding: true,
}
const DEFAULT_THEME: ThemeConfig = {
variants: [
{
id: 'light',
name: 'Light',
colors: {
primaryColor: '#1976d2',
secondaryColor: '#dc004e',
errorColor: '#f44336',
warningColor: '#ff9800',
successColor: '#4caf50',
background: '#ffffff',
surface: '#f5f5f5',
text: '#000000',
textSecondary: '#666666',
border: '#e0e0e0',
customColors: {},
},
},
{
id: 'dark',
name: 'Dark',
colors: {
primaryColor: '#90caf9',
secondaryColor: '#f48fb1',
errorColor: '#f44336',
warningColor: '#ffa726',
successColor: '#66bb6a',
background: '#121212',
surface: '#1e1e1e',
text: '#ffffff',
textSecondary: '#b0b0b0',
border: '#333333',
customColors: {},
},
},
],
activeVariantId: 'light',
fontFamily: 'Roboto, Arial, sans-serif',
fontSize: { small: 12, medium: 14, large: 20 },
spacing: 8,
borderRadius: 4,
}
const DEFAULT_FILES: ProjectFile[] = [
{
id: 'file-1',
name: 'page.tsx',
path: '/src/app/page.tsx',
content: `'use client'\n\nimport { ThemeProvider } from '@mui/material/styles'\nimport CssBaseline from '@mui/material/CssBaseline'\nimport { theme } from '@/theme'\nimport { Box, Typography, Button } from '@mui/material'\n\nexport default function Home() {\n return (\n <ThemeProvider theme={theme}>\n <CssBaseline />\n <Box sx={{ p: 4 }}>\n <Typography variant="h3" gutterBottom>\n Welcome to Your App\n </Typography>\n <Button variant="contained" color="primary">\n Get Started\n </Button>\n </Box>\n </ThemeProvider>\n )\n}`,
language: 'typescript',
},
{
id: 'file-2',
name: 'layout.tsx',
path: '/src/app/layout.tsx',
content: `export const metadata = {\n title: 'My Next.js App',\n description: 'Generated with CodeForge',\n}\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang="en">\n <body>{children}</body>\n </html>\n )\n}`,
language: 'typescript',
},
]
export function useProjectState() {
console.log('[STATE] 🔧 useProjectState hook initializing')
console.time('[STATE] Project state initialization')
console.log('[STATE] 📁 Loading files from KV')
const [files, setFiles] = useKV<ProjectFile[]>('project-files', DEFAULT_FILES)
console.log('[STATE] ✅ Files loaded:', files?.length || 0, 'files')
console.log('[STATE] 🗃️ Loading models from KV')
const [models, setModels] = useKV<PrismaModel[]>('project-models', [])
console.log('[STATE] ✅ Models loaded:', models?.length || 0, 'models')
console.log('[STATE] 🧩 Loading components from KV')
const [components, setComponents] = useKV<ComponentNode[]>('project-components', [])
console.log('[STATE] ✅ Components loaded:', components?.length || 0, 'components')
console.log('[STATE] 🌳 Loading component trees from KV')
const [componentTrees, setComponentTrees] = useKV<ComponentTree[]>('project-component-trees', [
{
id: 'default-tree',
name: 'Main App',
description: 'Default component tree',
rootNodes: [],
createdAt: Date.now(),
updatedAt: Date.now(),
},
])
console.log('[STATE] ✅ Component trees loaded:', componentTrees?.length || 0, 'trees')
console.log('[STATE] 🔄 Loading workflows from KV')
const [workflows, setWorkflows] = useKV<Workflow[]>('project-workflows', [])
console.log('[STATE] ✅ Workflows loaded:', workflows?.length || 0, 'workflows')
console.log('[STATE] λ Loading lambdas from KV')
const [lambdas, setLambdas] = useKV<Lambda[]>('project-lambdas', [])
console.log('[STATE] ✅ Lambdas loaded:', lambdas?.length || 0, 'lambdas')
console.log('[STATE] 🎨 Loading theme from KV')
const [theme, setTheme] = useKV<ThemeConfig>('project-theme', DEFAULT_THEME)
console.log('[STATE] ✅ Theme loaded')
console.log('[STATE] 🎭 Loading Playwright tests from KV')
const [playwrightTests, setPlaywrightTests] = useKV<PlaywrightTest[]>('project-playwright-tests', [])
console.log('[STATE] ✅ Playwright tests loaded:', playwrightTests?.length || 0, 'tests')
console.log('[STATE] 📚 Loading Storybook stories from KV')
const [storybookStories, setStorybookStories] = useKV<StorybookStory[]>('project-storybook-stories', [])
console.log('[STATE] ✅ Storybook stories loaded:', storybookStories?.length || 0, 'stories')
console.log('[STATE] 🧪 Loading unit tests from KV')
const [unitTests, setUnitTests] = useKV<UnitTest[]>('project-unit-tests', [])
console.log('[STATE] ✅ Unit tests loaded:', unitTests?.length || 0, 'tests')
console.log('[STATE] 🐍 Loading Flask config from KV')
const [flaskConfig, setFlaskConfig] = useKV<FlaskConfig>('project-flask-config', DEFAULT_FLASK_CONFIG)
console.log('[STATE] ✅ Flask config loaded')
console.log('[STATE] ⚛️ Loading Next.js config from KV')
const [nextjsConfig, setNextjsConfig] = useKV<NextJsConfig>('project-nextjs-config', DEFAULT_NEXTJS_CONFIG)
console.log('[STATE] ✅ Next.js config loaded')
console.log('[STATE] 📦 Loading NPM settings from KV')
const [npmSettings, setNpmSettings] = useKV<NpmSettings>('project-npm-settings', DEFAULT_NPM_SETTINGS)
console.log('[STATE] ✅ NPM settings loaded')
console.log('[STATE] 🎚️ Loading feature toggles from KV')
const [featureToggles, setFeatureToggles] = useKV<FeatureToggles>('project-feature-toggles', DEFAULT_FEATURE_TOGGLES)
console.log('[STATE] ✅ Feature toggles loaded')
console.log('[STATE] 🛡️ Creating safe array wrappers')
const safeFiles = Array.isArray(files) ? files : []
const safeModels = Array.isArray(models) ? models : []
const safeComponents = Array.isArray(components) ? components : []
const safeComponentTrees = Array.isArray(componentTrees) ? componentTrees : []
const safeWorkflows = Array.isArray(workflows) ? workflows : []
const safeLambdas = Array.isArray(lambdas) ? lambdas : []
const safeTheme = (theme && theme.variants && Array.isArray(theme.variants) && theme.variants.length > 0) ? theme : DEFAULT_THEME
const safePlaywrightTests = Array.isArray(playwrightTests) ? playwrightTests : []
const safeStorybookStories = Array.isArray(storybookStories) ? storybookStories : []
const safeUnitTests = Array.isArray(unitTests) ? unitTests : []
const safeFlaskConfig = flaskConfig || DEFAULT_FLASK_CONFIG
const safeNextjsConfig = nextjsConfig || DEFAULT_NEXTJS_CONFIG
const safeNpmSettings = npmSettings || DEFAULT_NPM_SETTINGS
const safeFeatureToggles = featureToggles || DEFAULT_FEATURE_TOGGLES
console.log('[STATE] ✅ Safe wrappers created')
console.log('[STATE] 📤 Returning project state object')
console.timeEnd('[STATE] Project state initialization')
return {
files: safeFiles,
setFiles,
models: safeModels,
setModels,
components: safeComponents,
setComponents,
componentTrees: safeComponentTrees,
setComponentTrees,
workflows: safeWorkflows,
setWorkflows,
lambdas: safeLambdas,
setLambdas,
theme: safeTheme,
setTheme,
playwrightTests: safePlaywrightTests,
setPlaywrightTests,
storybookStories: safeStorybookStories,
setStorybookStories,
unitTests: safeUnitTests,
setUnitTests,
flaskConfig: safeFlaskConfig,
setFlaskConfig,
nextjsConfig: safeNextjsConfig,
setNextjsConfig,
npmSettings: safeNpmSettings,
setNpmSettings,
featureToggles: safeFeatureToggles,
setFeatureToggles,
defaults: {
DEFAULT_FLASK_CONFIG,
DEFAULT_NEXTJS_CONFIG,
DEFAULT_NPM_SETTINGS,
DEFAULT_FEATURE_TOGGLES,
DEFAULT_THEME,
DEFAULT_FILES,
}
}
}