{"version":3,"file":"index.mjs","names":[],"sources":["../../cli/src/actions/templates.ts","../src/index.ts"],"sourcesContent":["export const STARTER_ZMODEL = `// This is a sample model to get you started.\n\n/// A sample data source using local sqlite db.\ndatasource db {\n    provider = 'sqlite'\n    url = 'file:./dev.db'\n}\n\n/// User model\nmodel User {\n    id       String @id @default(cuid())\n    email    String @unique @email @length(6, 32)\n    posts    Post[]\n}\n\n/// Post model\nmodel Post {\n    id        String   @id @default(cuid())\n    createdAt DateTime @default(now())\n    updatedAt DateTime @updatedAt\n    title     String   @length(1, 256)\n    content   String\n    published Boolean  @default(false)\n    author    User     @relation(fields: [authorId], references: [id], onDelete: Cascade)\n    authorId  String\n}\n`;\n\nexport const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/orm';\nimport { SqliteDialect } from '@zenstackhq/orm/dialects/sqlite';\nimport SQLite from 'better-sqlite3';\nimport { schema } from './zenstack/schema';\n\nasync function main() {\n    const db = new ZenStackClient(schema, {\n        dialect: new SqliteDialect({\n            database: new SQLite('./zenstack/dev.db'),\n        }),\n    });\n    const user = await db.user.create({\n        data: {\n            email: 'test@zenstack.dev',\n            posts: {\n                create: [\n                    {\n                        title: 'Hello World',\n                        content: 'This is a test post',\n                    },\n                ],\n            },\n        },\n        include: { posts: true }\n    });\n    console.log('User created:', user);\n}\n\nmain();\n`;\n","import colors from 'colors';\nimport { Command } from 'commander';\nimport { execSync, type StdioOptions } from 'node:child_process';\nimport fs from 'node:fs';\nimport ora from 'ora';\nimport { STARTER_MAIN_TS, STARTER_ZMODEL } from './templates';\n\n// detect package manager\nconst npmAgent = process.env['npm_config_user_agent'];\nlet agent = 'npm';\nlet agentExec = 'npx';\nlet saveDev = '--save-dev';\n\nif (npmAgent?.includes('pnpm')) {\n    agent = 'pnpm';\n    agentExec = 'pnpm';\n} else if (npmAgent?.includes('yarn')) {\n    agent = 'yarn';\n    agentExec = 'npx';\n    saveDev = '--dev';\n} else if (npmAgent?.includes('bun')) {\n    agent = 'bun';\n    agentExec = 'bun';\n}\n\nconst program = new Command('create-zenstack');\n\nprogram.arguments('<project-name>').action((projectName) => {\n    initProject(projectName);\n});\n\nprogram.parse(process.argv);\n\nfunction initProject(name: string) {\n    // create folder\n    if (fs.existsSync(name)) {\n        console.log(colors.red(`Directory ${name} already exists.`));\n        process.exit(1);\n    }\n    fs.mkdirSync(name);\n    process.chdir(name);\n\n    console.log(colors.gray(`Using package manager: ${agent}`));\n\n    // create package.json\n    fs.writeFileSync(\n        'package.json',\n        JSON.stringify(\n            {\n                name: 'zenstack-app',\n                version: '1.0.0',\n                description: 'Scaffolded with create-zenstack',\n                type: 'module',\n                scripts: {\n                    dev: 'tsx main.ts',\n                },\n                license: 'ISC',\n            },\n            null,\n            2,\n        ),\n    );\n\n    // create VSCode config files\n    createVsCodeConfig();\n\n    // install packages\n    const packages = [\n        { name: '@zenstackhq/cli@latest', dev: true },\n        { name: '@zenstackhq/schema@latest', dev: false },\n        { name: '@zenstackhq/orm@latest', dev: false },\n        { name: 'better-sqlite3', dev: false },\n        { name: '@types/better-sqlite3', dev: true },\n        { name: 'typescript', dev: true },\n        { name: 'tsx', dev: true },\n        { name: '@types/node', dev: true },\n    ];\n    for (const pkg of packages) {\n        installPackage(pkg);\n    }\n\n    // create tsconfig.json\n    fs.writeFileSync(\n        'tsconfig.json',\n        JSON.stringify(\n            {\n                compilerOptions: {\n                    module: 'esnext',\n                    target: 'esnext',\n                    moduleResolution: 'bundler',\n                    sourceMap: true,\n                    outDir: 'dist',\n                    strict: true,\n                    skipLibCheck: true,\n                    esModuleInterop: true,\n                },\n            },\n            null,\n            2,\n        ),\n    );\n\n    // create schema.zmodel\n    fs.mkdirSync('zenstack');\n    fs.writeFileSync('zenstack/schema.zmodel', STARTER_ZMODEL);\n\n    // create main.ts\n    fs.writeFileSync('main.ts', STARTER_MAIN_TS);\n\n    // run `zen generate`\n    runCommand(`${agentExec} zen generate`, 'Running `zen generate`');\n\n    // run `zen db push`\n    runCommand(`${agentExec} zen db push`, 'Running `zen db push`');\n\n    // run `$agent run dev`\n    console.log(`Running \\`${agent} run dev\\``);\n    execSync(`${agent} run dev`, { stdio: 'inherit' });\n    console.log(colors.green('Project setup completed!'));\n}\n\nfunction installPackage(pkg: { name: string; dev: boolean }) {\n    runCommand(`${agent} install ${pkg.name} ${pkg.dev ? saveDev : ''}`, `Installing \"${pkg.name}\"`);\n}\n\nfunction runCommand(cmd: string, status: string, stdio: StdioOptions = 'ignore') {\n    const spinner = ora(status).start();\n    try {\n        execSync(cmd, { stdio });\n        spinner.succeed();\n    } catch (e) {\n        spinner.fail();\n        throw e;\n    }\n}\n\nfunction createVsCodeConfig() {\n    fs.mkdirSync('.vscode', { recursive: true });\n    fs.writeFileSync(\n        '.vscode/settings.json',\n        JSON.stringify(\n            {\n                'files.associations': {\n                    '*.zmodel': 'zmodel-v3',\n                },\n            },\n            null,\n            4,\n        ),\n    );\n    fs.writeFileSync('.vscode/extensions.json', JSON.stringify({ recommendations: ['zenstack.zenstack-v3'] }, null, 4));\n}\n"],"mappings":"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"}