create-lego-one 2.0.14 → 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +36 -4
- package/dist/index.cjs.map +1 -1
- package/package.json +1 -1
- package/template/.env.example +27 -11
- package/template/host/package.json +1 -1
- package/template/package.json +6 -6
- package/template/packages/plugins/@lego/plugin-dashboard/package.json +1 -1
- package/template/packages/plugins/@lego/plugin-todo/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -304,13 +304,16 @@ async function updateProject(projectDir, options) {
|
|
|
304
304
|
// Merge host updates (skip user configs)
|
|
305
305
|
{ source: "packages/plugins/@lego", target: "packages/plugins/@lego", strategy: "merge" },
|
|
306
306
|
// Add new plugins only
|
|
307
|
+
// Root files
|
|
308
|
+
{ source: "README.md", target: "README.md", strategy: "add-if-missing" },
|
|
309
|
+
// Add if doesn't exist (user-specific)
|
|
307
310
|
// Configuration files
|
|
308
311
|
{ source: "package.json", target: "package.json", strategy: "merge-json" },
|
|
309
312
|
// Merge package.json
|
|
310
313
|
{ source: "pnpm-workspace.yaml", target: "pnpm-workspace.yaml", strategy: "replace" },
|
|
311
314
|
// Replace workspace config
|
|
312
|
-
{ source: ".gitignore", target: ".gitignore", strategy: "merge" },
|
|
313
|
-
// Merge gitignore
|
|
315
|
+
{ source: ".gitignore", target: ".gitignore", strategy: "merge-gitignore" },
|
|
316
|
+
// Merge gitignore intelligently
|
|
314
317
|
{ source: "tsconfig.json", target: "tsconfig.json", strategy: "merge-json" },
|
|
315
318
|
// Merge tsconfig
|
|
316
319
|
{ source: "tsconfig.base.json", target: "tsconfig.base.json", strategy: "replace" },
|
|
@@ -323,9 +326,14 @@ async function updateProject(projectDir, options) {
|
|
|
323
326
|
// Replace Prettier config
|
|
324
327
|
{ source: ".prettierignore", target: ".prettierignore", strategy: "replace" },
|
|
325
328
|
// Replace Prettier ignore
|
|
326
|
-
// Environment
|
|
327
|
-
{ source: ".env.example", target: ".env.example", strategy: "
|
|
329
|
+
// Environment files (examples - users create their own from these)
|
|
330
|
+
{ source: ".env.example", target: ".env.example", strategy: "replace" },
|
|
331
|
+
// Replace example file
|
|
332
|
+
{ source: ".env.development", target: ".env.development", strategy: "add-if-missing" },
|
|
328
333
|
// Add if doesn't exist
|
|
334
|
+
{ source: ".env.production", target: ".env.production", strategy: "add-if-missing" },
|
|
335
|
+
// Add if doesn't exist
|
|
336
|
+
// Deployment files
|
|
329
337
|
{ source: "Dockerfile", target: "Dockerfile", strategy: "replace" },
|
|
330
338
|
// Replace Dockerfile
|
|
331
339
|
{ source: "docker-compose.yml", target: "docker-compose.yml", strategy: "replace" },
|
|
@@ -374,6 +382,15 @@ async function updateProject(projectDir, options) {
|
|
|
374
382
|
await mergeDirectory(sourcePath, targetPath, updates, options.dryRun);
|
|
375
383
|
}
|
|
376
384
|
}
|
|
385
|
+
} else if (item.strategy === "merge-gitignore") {
|
|
386
|
+
if (targetExists) {
|
|
387
|
+
await mergeGitignoreFile(sourcePath, targetPath, updates, options.dryRun);
|
|
388
|
+
} else {
|
|
389
|
+
updates.push({ file: item.target, action: "created" });
|
|
390
|
+
if (!options.dryRun) {
|
|
391
|
+
await import_fs_extra.default.copy(sourcePath, targetPath);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
377
394
|
} else if (item.strategy === "add-if-missing") {
|
|
378
395
|
if (!targetExists) {
|
|
379
396
|
updates.push({ file: item.target, action: "created" });
|
|
@@ -519,6 +536,21 @@ async function mergeJsonFile(sourcePath, targetPath, updates, dryRun = false) {
|
|
|
519
536
|
}
|
|
520
537
|
}
|
|
521
538
|
}
|
|
539
|
+
async function mergeGitignoreFile(sourcePath, targetPath, updates, dryRun = false) {
|
|
540
|
+
const sourceContent = await import_fs_extra.default.readFile(sourcePath, "utf-8");
|
|
541
|
+
const targetContent = await import_fs_extra.default.readFile(targetPath, "utf-8");
|
|
542
|
+
const sourceLines = sourceContent.split("\n").map((line) => line.trim()).filter((line) => line && !line.startsWith("#"));
|
|
543
|
+
const targetLines = targetContent.split("\n").map((line) => line.trim()).filter((line) => line && !line.startsWith("#"));
|
|
544
|
+
const existingEntries = new Set(targetLines);
|
|
545
|
+
const newEntries = sourceLines.filter((line) => !existingEntries.has(line));
|
|
546
|
+
if (newEntries.length > 0) {
|
|
547
|
+
updates.push({ file: import_path.default.basename(targetPath), action: "updated" });
|
|
548
|
+
if (!dryRun) {
|
|
549
|
+
const updatedContent = targetContent + (targetContent.endsWith("\n") ? "" : "\n") + (newEntries.length > 0 ? "\n# Added by framework update\n" + newEntries.join("\n") + "\n" : "");
|
|
550
|
+
await import_fs_extra.default.writeFile(targetPath, updatedContent, "utf-8");
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
522
554
|
init().catch((error) => {
|
|
523
555
|
console.error(kleur.red("Unexpected error:"));
|
|
524
556
|
console.error(error);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.8_4981d554a2757e4ed25c3ad5a773b01f/node_modules/tsup/assets/cjs_shims.js","../src/index.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\n\n/**\n * create-lego-one CLI\n * Create a new Lego-One SaaS application from template\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport { fileURLToPath } from 'url';\nimport { program } from 'commander';\nimport * as kleur from 'kleur';\nimport fsExtra from 'fs-extra';\nimport validateProjectName from 'validate-npm-package-name';\nimport prompts from 'prompts';\nimport { execSync } from 'child_process';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ninterface CreateOptions {\n appName?: string;\n interactive: boolean;\n git: boolean;\n branch?: string;\n template?: string;\n description?: string;\n author?: string;\n}\n\ninterface ProjectConfig {\n appName: string;\n description: string;\n author: string;\n git: boolean;\n}\n\n// ASCII art banner\nconst banner = `\n${kleur.cyan('┌─────────────────────────────────────────────────────────┐')}\n${kleur.cyan('│')} ${kleur.bold().white('Lego-One')} SaaS Boilerplate ${kleur.cyan('│')}\n${kleur.cyan('│')} ${kleur.gray('Microkernel architecture with Modern.js + Garfish')} ${kleur.cyan('│')}\n${kleur.cyan('└─────────────────────────────────────────────────────────┘')}\n`;\n\nasync function init() {\n console.log(banner);\n\n const version = getVersion();\n console.log(kleur.gray(`create-lego-one v${version}\\n`));\n\n program\n .name('create-lego-one')\n .description('Create a new Lego-One SaaS application')\n .version(version)\n .argument('[app-name]', 'Name of your application')\n .option('-i, --interactive', 'Use interactive prompts (default when no app name provided)')\n .option('--no-interactive', 'Skip interactive prompts')\n .option('--git', 'Initialize git repository', true)\n .option('--no-git', 'Skip git initialization')\n .option('--description <description>', 'Project description')\n .option('--author <author>', 'Author name')\n .option('--branch <branch>', 'Use specific branch')\n .option('--template <template>', 'Use specific template')\n .action(async (appName: string | undefined, options) => {\n // Default to interactive mode if no app name provided\n const isInteractive = options.interactive !== false && (!appName || options.interactive === true);\n \n const opts: CreateOptions = {\n appName,\n interactive: isInteractive,\n git: options.git !== false,\n branch: options.branch,\n template: options.template,\n description: options.description,\n author: options.author,\n };\n await createApp(opts);\n });\n\n // Add update command\n program\n .command('update')\n .description('Update existing Lego-One project with latest framework changes')\n .option('--dry-run', 'Show what would be updated without making changes')\n .option('--force', 'Force update even if conflicts detected')\n .action(async (options) => {\n await updateProject(process.cwd(), options);\n });\n\n await program.parseAsync(process.argv);\n}\n\nfunction getVersion(): string {\n const pkgPath = path.join(__dirname, '../package.json');\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n return pkg.version || '1.0.0';\n } catch {\n return '1.0.0';\n }\n}\n\nasync function createApp(options: CreateOptions) {\n try {\n let projectConfig: ProjectConfig;\n\n // Interactive mode - collect all project information\n if (options.interactive) {\n const responses = await prompts([\n {\n type: 'text',\n name: 'appName',\n message: 'What is your app named?',\n initial: options.appName || 'my-saas-app',\n validate: (value: string) => {\n if (!value) return 'App name is required';\n const validation = validateProjectName(value);\n if (validation.validForNewPackages) return true;\n const errorMsg = validation.errors?.join(', ') || validation.warnings?.join(', ') || 'unknown error';\n return 'Invalid app name: ' + errorMsg;\n },\n },\n {\n type: 'text',\n name: 'description',\n message: 'Project description (optional)',\n initial: options.description || 'A SaaS application built with Lego-One',\n },\n {\n type: 'text',\n name: 'author',\n message: 'Author name (optional)',\n initial: options.author || '',\n },\n {\n type: 'confirm',\n name: 'git',\n message: 'Initialize git repository?',\n initial: options.git !== false,\n },\n ]);\n\n projectConfig = {\n appName: responses.appName || options.appName || 'my-saas-app',\n description: responses.description || options.description || 'A SaaS application built with Lego-One',\n author: responses.author || options.author || '',\n git: responses.git !== false,\n };\n } else {\n // Non-interactive mode - use provided values or defaults\n if (!options.appName) {\n console.error(kleur.red('Please specify an app name or use interactive mode (default)'));\n process.exit(1);\n }\n\n projectConfig = {\n appName: options.appName,\n description: options.description || 'A SaaS application built with Lego-One',\n author: options.author || '',\n git: options.git !== false,\n };\n }\n\n // Validate app name\n const validation = validateProjectName(projectConfig.appName);\n if (!validation.validForNewPackages) {\n const errorMsg = validation.errors?.join(', ') || validation.warnings?.join(', ') || 'unknown error';\n console.error(kleur.red(`Invalid app name: ${errorMsg}`));\n if (validation.warnings && validation.warnings.length > 0) {\n console.error(kleur.yellow(`Warnings: ${validation.warnings.join(', ')}`));\n }\n process.exit(1);\n }\n\n const appName = projectConfig.appName;\n\n const targetDir = path.resolve(process.cwd(), appName);\n\n // Check if directory exists\n if (await fsExtra.pathExists(targetDir)) {\n const files = await fsExtra.readdir(targetDir);\n if (files.length > 0) {\n console.error(kleur.red(`Directory \"${appName}\" already exists and is not empty`));\n process.exit(1);\n }\n }\n\n console.log(kleur.cyan('Creating your Lego-One application...'));\n\n // Create target directory\n await fsExtra.ensureDir(targetDir);\n\n // Copy template files\n console.log(kleur.gray('Copying template files...'));\n const templateDir = path.join(__dirname, '../template');\n if (await fsExtra.pathExists(templateDir)) {\n await fsExtra.copy(templateDir, targetDir);\n } else {\n // Fallback: copy from root (development mode)\n const rootDir = path.join(__dirname, '../../..');\n await copyTemplateFiles(rootDir, targetDir);\n }\n\n // Update package.json with project configuration\n console.log(kleur.gray('Configuring project...'));\n await updatePackageJson(targetDir, projectConfig);\n\n // Update README.md with project-specific information\n await updateReadme(targetDir, projectConfig);\n\n // Ensure PocketBase directory structure exists\n await ensurePocketBaseStructure(targetDir);\n\n // Initialize git if requested\n if (projectConfig.git) {\n console.log(kleur.gray('Initializing git repository...'));\n try {\n execSync('git init', { cwd: targetDir });\n execSync('git add .', { cwd: targetDir });\n execSync('git commit -m \"Initial commit from Lego-One\"', {\n cwd: targetDir,\n });\n } catch (error) {\n console.warn(kleur.yellow('Could not initialize git repository'));\n }\n }\n\n console.log(kleur.green('Application created successfully!'));\n\n // Print success message\n console.log('\\n' + kleur.bold('Next steps:'));\n console.log(` ${kleur.cyan('cd')} ${appName}`);\n console.log(` ${kleur.cyan('pnpm install')}`);\n console.log(` ${kleur.cyan('pnpm run dev')}`);\n console.log('\\n' + kleur.gray('To start developing:'));\n console.log(` ${kleur.cyan('pnpm run dev')} - Start development server`);\n console.log(` ${kleur.cyan('pnpm run dev:all')} - Start all services`);\n console.log('\\n' + kleur.gray('To build for production:'));\n console.log(` ${kleur.cyan('pnpm run build')} - Build application`);\n console.log(` ${kleur.cyan('pnpm run start')} - Start production server`);\n console.log('\\n' + kleur.gray('Documentation:'));\n console.log(` ${kleur.cyan('https://lego-one.dev/docs')} - Full documentation`);\n console.log('\\n' + kleur.yellow('Happy coding! 🚀\\n'));\n } catch (error) {\n console.error(kleur.red('Failed to create application'));\n if (error instanceof Error) {\n console.error(kleur.red(error.message));\n }\n process.exit(1);\n }\n}\n\nasync function updatePackageJson(targetDir: string, config: ProjectConfig) {\n const packageJsonPath = path.join(targetDir, 'package.json');\n \n if (await fsExtra.pathExists(packageJsonPath)) {\n const packageJson = JSON.parse(await fsExtra.readFile(packageJsonPath, 'utf-8'));\n \n // Update package name\n packageJson.name = config.appName;\n \n // Update description if provided\n if (config.description) {\n packageJson.description = config.description;\n }\n \n // Update author if provided\n if (config.author) {\n packageJson.author = config.author;\n }\n \n // Write updated package.json\n await fsExtra.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n}\n\nasync function updateReadme(targetDir: string, config: ProjectConfig) {\n const readmePath = path.join(targetDir, 'README.md');\n \n if (await fsExtra.pathExists(readmePath)) {\n let readmeContent = await fsExtra.readFile(readmePath, 'utf-8');\n \n // Replace placeholders\n readmeContent = readmeContent.replace(/{APP_NAME}/g, config.appName);\n readmeContent = readmeContent.replace(/{DESCRIPTION}/g, config.description);\n \n // Write updated README\n await fsExtra.writeFile(readmePath, readmeContent, 'utf-8');\n }\n}\n\nasync function ensurePocketBaseStructure(targetDir: string) {\n const pocketbaseDir = path.join(targetDir, 'pocketbase');\n \n // Ensure directory exists\n await fsExtra.ensureDir(pocketbaseDir);\n \n // Create .gitignore for PocketBase data\n const gitignorePath = path.join(pocketbaseDir, '.gitignore');\n const gitignoreContent = `# PocketBase data files (do not commit)\npb_data/\n*.db\n*.db-shm\n*.db-wal\nlogs.db\nlogs.db-shm\nlogs.db-wal\n\n# PocketBase executable (users download separately)\npocketbase\npocketbase.exe\npocketbase.exe.gz\n*.zip\n`;\n \n if (!(await fsExtra.pathExists(gitignorePath))) {\n await fsExtra.writeFile(gitignorePath, gitignoreContent, 'utf-8');\n }\n}\n\nasync function copyTemplateFiles(sourceDir: string, targetDir: string) {\n // Files to copy\n const filesToCopy = [\n 'host',\n 'packages/plugins',\n 'package.json',\n 'pnpm-lock.yaml',\n 'pnpm-workspace.yaml',\n '.gitignore',\n 'tsconfig.json',\n ];\n\n // Files to exclude\n const excludePatterns = [\n 'node_modules',\n 'dist',\n '.next',\n 'coverage',\n '.cache',\n '*.log',\n ];\n\n for (const file of filesToCopy) {\n const srcPath = path.join(sourceDir, file);\n const destPath = path.join(targetDir, file);\n\n if (await fsExtra.pathExists(srcPath)) {\n await fsExtra.copy(srcPath, destPath, {\n filter: (src) => {\n const relativePath = path.relative(sourceDir, src);\n return !excludePatterns.some((pattern) =>\n relativePath.includes(pattern)\n );\n },\n });\n }\n }\n}\n\nasync function updateProject(projectDir: string, options: { dryRun?: boolean; force?: boolean }) {\n try {\n console.log(kleur.cyan('🔄 Updating Lego-One project...\\n'));\n\n // Check if this is a lego-one project\n const packageJsonPath = path.join(projectDir, 'package.json');\n if (!(await fsExtra.pathExists(packageJsonPath))) {\n console.error(kleur.red('❌ This does not appear to be a Lego-One project (package.json not found)'));\n process.exit(1);\n }\n\n const packageJson = JSON.parse(await fsExtra.readFile(packageJsonPath, 'utf-8'));\n const isLegoOneProject = \n packageJson.name === 'lego-one' || \n packageJson.description?.includes('Lego-One') ||\n await fsExtra.pathExists(path.join(projectDir, 'host')) ||\n await fsExtra.pathExists(path.join(projectDir, 'packages/plugins/@lego'));\n\n if (!isLegoOneProject) {\n console.error(kleur.red('❌ This does not appear to be a Lego-One project'));\n process.exit(1);\n }\n\n // Get template directory from installed package\n const templateDir = path.join(__dirname, '../template');\n \n if (!(await fsExtra.pathExists(templateDir))) {\n console.error(kleur.red('❌ Template directory not found. Please reinstall create-lego-one.'));\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.log(kleur.yellow('🔍 Dry run mode - no changes will be made\\n'));\n }\n\n // Files/directories to update (must match sync-template.js filesToSync)\n const updateItems = [\n // Core application structure\n { source: 'host', target: 'host', strategy: 'merge-host' }, // Merge host updates (skip user configs)\n { source: 'packages/plugins/@lego', target: 'packages/plugins/@lego', strategy: 'merge' }, // Add new plugins only\n \n // Configuration files\n { source: 'package.json', target: 'package.json', strategy: 'merge-json' }, // Merge package.json\n { source: 'pnpm-workspace.yaml', target: 'pnpm-workspace.yaml', strategy: 'replace' }, // Replace workspace config\n { source: '.gitignore', target: '.gitignore', strategy: 'merge' }, // Merge gitignore\n { source: 'tsconfig.json', target: 'tsconfig.json', strategy: 'merge-json' }, // Merge tsconfig\n { source: 'tsconfig.base.json', target: 'tsconfig.base.json', strategy: 'replace' }, // Replace base config\n { source: '.eslintrc.js', target: '.eslintrc.js', strategy: 'replace' }, // Replace ESLint config\n { source: '.eslintignore', target: '.eslintignore', strategy: 'replace' }, // Replace ESLint ignore\n { source: '.prettierrc', target: '.prettierrc', strategy: 'replace' }, // Replace Prettier config\n { source: '.prettierignore', target: '.prettierignore', strategy: 'replace' }, // Replace Prettier ignore\n \n // Environment and deployment\n { source: '.env.example', target: '.env.example', strategy: 'add-if-missing' }, // Add if doesn't exist\n { source: 'Dockerfile', target: 'Dockerfile', strategy: 'replace' }, // Replace Dockerfile\n { source: 'docker-compose.yml', target: 'docker-compose.yml', strategy: 'replace' }, // Replace docker-compose\n { source: 'docker-entrypoint.sh', target: 'docker-entrypoint.sh', strategy: 'replace' }, // Replace entrypoint\n { source: 'nginx.conf', target: 'nginx.conf', strategy: 'replace' }, // Replace nginx config\n { source: '.dockerignore', target: '.dockerignore', strategy: 'replace' }, // Replace dockerignore\n \n // Documentation (for AI-assisted development)\n { source: 'docs', target: 'docs', strategy: 'merge' }, // Merge docs (add new, don't overwrite user docs)\n { source: 'CLAUDE.md', target: 'CLAUDE.md', strategy: 'add-if-missing' }, // Add if doesn't exist\n { source: 'PROMPT.md', target: 'PROMPT.md', strategy: 'add-if-missing' }, // Add if doesn't exist\n { source: '.cursor', target: '.cursor', strategy: 'merge' }, // Merge cursor rules\n \n // Scripts (for users to create plugins)\n { source: 'scripts', target: 'scripts', strategy: 'merge' }, // Merge scripts (add new, don't overwrite user scripts)\n \n // PocketBase structure\n { source: 'pocketbase', target: 'pocketbase', strategy: 'merge-pocketbase' }, // Merge PocketBase (skip executable)\n ];\n\n const updates: Array<{ file: string; action: string }> = [];\n\n for (const item of updateItems) {\n const sourcePath = path.join(templateDir, item.source);\n const targetPath = path.join(projectDir, item.target);\n\n if (!(await fsExtra.pathExists(sourcePath))) {\n continue;\n }\n\n const sourceStat = await fsExtra.stat(sourcePath);\n const targetExists = await fsExtra.pathExists(targetPath);\n\n if (item.strategy === 'skip') {\n continue;\n }\n\n if (item.strategy === 'merge' || item.strategy === 'merge-host' || item.strategy === 'merge-pocketbase') {\n // For directories, add new files only (don't overwrite existing)\n if (sourceStat.isDirectory()) {\n if (item.strategy === 'merge-host') {\n await mergeHostDirectory(sourcePath, targetPath, updates, options.dryRun);\n } else if (item.strategy === 'merge-pocketbase') {\n await mergePocketBaseDirectory(sourcePath, targetPath, updates, options.dryRun);\n } else {\n await mergeDirectory(sourcePath, targetPath, updates, options.dryRun);\n }\n }\n } else if (item.strategy === 'add-if-missing') {\n // Only add if file doesn't exist\n if (!targetExists) {\n updates.push({ file: item.target, action: 'created' });\n if (!options.dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n } else if (item.strategy === 'merge-json') {\n if (targetExists) {\n await mergeJsonFile(sourcePath, targetPath, updates, options.dryRun);\n } else {\n updates.push({ file: item.target, action: 'created' });\n if (!options.dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n } else if (item.strategy === 'replace') {\n updates.push({ file: item.target, action: 'updated' });\n if (!options.dryRun) {\n await fsExtra.copy(sourcePath, targetPath, { overwrite: true });\n }\n }\n }\n\n // Summary\n console.log('\\n' + kleur.bold('Update Summary:'));\n if (updates.length === 0) {\n console.log(kleur.gray(' No updates needed'));\n } else {\n updates.forEach(({ file, action }) => {\n const icon = action === 'created' ? '➕' : action === 'updated' ? '🔄' : '✨';\n console.log(` ${icon} ${file} (${action})`);\n });\n }\n\n if (options.dryRun) {\n console.log('\\n' + kleur.yellow('💡 Run without --dry-run to apply updates'));\n } else {\n console.log('\\n' + kleur.green('✅ Project updated successfully!'));\n console.log(kleur.gray('\\nNext steps:'));\n console.log(` ${kleur.cyan('pnpm install')} - Install/update dependencies`);\n console.log(` ${kleur.cyan('pnpm run dev')} - Start development server`);\n }\n } catch (error) {\n console.error(kleur.red('❌ Failed to update project'));\n if (error instanceof Error) {\n console.error(kleur.red(error.message));\n }\n process.exit(1);\n }\n}\n\nasync function mergeDirectory(\n sourceDir: string,\n targetDir: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false\n) {\n await fsExtra.ensureDir(targetDir);\n const entries = await fsExtra.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n await mergeDirectory(sourcePath, targetPath, updates, dryRun);\n } else {\n // Only add files that don't exist (new plugins, new kernel files)\n const targetExists = await fsExtra.pathExists(targetPath);\n if (!targetExists) {\n const relativePath = path.relative(targetDir, targetPath);\n updates.push({ file: relativePath, action: 'created' });\n if (!dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n }\n }\n}\n\nasync function mergeHostDirectory(\n sourceDir: string,\n targetDir: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false,\n hostRootDir?: string\n) {\n // Track the host root directory for relative path calculation\n if (!hostRootDir) {\n hostRootDir = sourceDir;\n }\n\n await fsExtra.ensureDir(targetDir);\n const entries = await fsExtra.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n const relativeToHostRoot = path.relative(hostRootDir, sourcePath).replace(/\\\\/g, '/');\n\n // Skip user-specific config files\n // modern.config.ts is at host root\n // saas.config.ts is at host/src/\n if (relativeToHostRoot === 'modern.config.ts' || relativeToHostRoot === 'src/saas.config.ts') {\n continue;\n }\n\n if (entry.isDirectory()) {\n await mergeHostDirectory(sourcePath, targetPath, updates, dryRun, hostRootDir);\n } else {\n // Only add files that don't exist\n const targetExists = await fsExtra.pathExists(targetPath);\n if (!targetExists) {\n const relativeTargetPath = path.relative(targetDir, targetPath).replace(/\\\\/g, '/');\n updates.push({ file: relativeTargetPath, action: 'created' });\n if (!dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n }\n }\n}\n\nasync function mergePocketBaseDirectory(\n sourceDir: string,\n targetDir: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false\n) {\n // Files to skip (executable and data)\n const skipFiles = [\n 'pocketbase.exe',\n 'pocketbase',\n 'pocketbase.exe.gz',\n 'pb_data',\n ];\n\n await fsExtra.ensureDir(targetDir);\n const entries = await fsExtra.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n // Skip executable and data files\n if (skipFiles.includes(entry.name)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await mergePocketBaseDirectory(sourcePath, targetPath, updates, dryRun);\n } else {\n // Only add files that don't exist\n const targetExists = await fsExtra.pathExists(targetPath);\n if (!targetExists) {\n const relativePath = path.relative(targetDir, targetPath);\n updates.push({ file: relativePath, action: 'created' });\n if (!dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n }\n }\n}\n\nasync function mergeJsonFile(\n sourcePath: string,\n targetPath: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false\n) {\n const sourceJson = JSON.parse(await fsExtra.readFile(sourcePath, 'utf-8'));\n const targetJson = JSON.parse(await fsExtra.readFile(targetPath, 'utf-8'));\n\n // Merge dependencies and devDependencies\n const merged = { ...targetJson };\n \n if (sourceJson.dependencies) {\n merged.dependencies = { ...targetJson.dependencies, ...sourceJson.dependencies };\n }\n if (sourceJson.devDependencies) {\n merged.devDependencies = { ...targetJson.devDependencies, ...sourceJson.devDependencies };\n }\n if (sourceJson.scripts) {\n // Merge scripts, but keep user's custom scripts\n merged.scripts = { ...sourceJson.scripts, ...targetJson.scripts };\n }\n\n // Check if there are actual changes\n const hasChanges = JSON.stringify(merged) !== JSON.stringify(targetJson);\n \n if (hasChanges) {\n updates.push({ file: path.basename(targetPath), action: 'updated' });\n if (!dryRun) {\n await fsExtra.writeFile(targetPath, JSON.stringify(merged, null, 2) + '\\n', 'utf-8');\n }\n }\n}\n\n// Run the CLI\ninit().catch((error) => {\n console.error(kleur.red('Unexpected error:'));\n console.error(error);\n process.exit(1);\n});\n"],"mappings":"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","names":["path","fs","prompts","validation","validateProjectName","fsExtra"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.8_4981d554a2757e4ed25c3ad5a773b01f/node_modules/tsup/assets/cjs_shims.js","../src/index.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\n\n/**\n * create-lego-one CLI\n * Create a new Lego-One SaaS application from template\n */\n\nimport path from 'path';\nimport fs from 'fs';\nimport { fileURLToPath } from 'url';\nimport { program } from 'commander';\nimport * as kleur from 'kleur';\nimport fsExtra from 'fs-extra';\nimport validateProjectName from 'validate-npm-package-name';\nimport prompts from 'prompts';\nimport { execSync } from 'child_process';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ninterface CreateOptions {\n appName?: string;\n interactive: boolean;\n git: boolean;\n branch?: string;\n template?: string;\n description?: string;\n author?: string;\n}\n\ninterface ProjectConfig {\n appName: string;\n description: string;\n author: string;\n git: boolean;\n}\n\n// ASCII art banner\nconst banner = `\n${kleur.cyan('┌─────────────────────────────────────────────────────────┐')}\n${kleur.cyan('│')} ${kleur.bold().white('Lego-One')} SaaS Boilerplate ${kleur.cyan('│')}\n${kleur.cyan('│')} ${kleur.gray('Microkernel architecture with Modern.js + Garfish')} ${kleur.cyan('│')}\n${kleur.cyan('└─────────────────────────────────────────────────────────┘')}\n`;\n\nasync function init() {\n console.log(banner);\n\n const version = getVersion();\n console.log(kleur.gray(`create-lego-one v${version}\\n`));\n\n program\n .name('create-lego-one')\n .description('Create a new Lego-One SaaS application')\n .version(version)\n .argument('[app-name]', 'Name of your application')\n .option('-i, --interactive', 'Use interactive prompts (default when no app name provided)')\n .option('--no-interactive', 'Skip interactive prompts')\n .option('--git', 'Initialize git repository', true)\n .option('--no-git', 'Skip git initialization')\n .option('--description <description>', 'Project description')\n .option('--author <author>', 'Author name')\n .option('--branch <branch>', 'Use specific branch')\n .option('--template <template>', 'Use specific template')\n .action(async (appName: string | undefined, options) => {\n // Default to interactive mode if no app name provided\n const isInteractive = options.interactive !== false && (!appName || options.interactive === true);\n \n const opts: CreateOptions = {\n appName,\n interactive: isInteractive,\n git: options.git !== false,\n branch: options.branch,\n template: options.template,\n description: options.description,\n author: options.author,\n };\n await createApp(opts);\n });\n\n // Add update command\n program\n .command('update')\n .description('Update existing Lego-One project with latest framework changes')\n .option('--dry-run', 'Show what would be updated without making changes')\n .option('--force', 'Force update even if conflicts detected')\n .action(async (options) => {\n await updateProject(process.cwd(), options);\n });\n\n await program.parseAsync(process.argv);\n}\n\nfunction getVersion(): string {\n const pkgPath = path.join(__dirname, '../package.json');\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n return pkg.version || '1.0.0';\n } catch {\n return '1.0.0';\n }\n}\n\nasync function createApp(options: CreateOptions) {\n try {\n let projectConfig: ProjectConfig;\n\n // Interactive mode - collect all project information\n if (options.interactive) {\n const responses = await prompts([\n {\n type: 'text',\n name: 'appName',\n message: 'What is your app named?',\n initial: options.appName || 'my-saas-app',\n validate: (value: string) => {\n if (!value) return 'App name is required';\n const validation = validateProjectName(value);\n if (validation.validForNewPackages) return true;\n const errorMsg = validation.errors?.join(', ') || validation.warnings?.join(', ') || 'unknown error';\n return 'Invalid app name: ' + errorMsg;\n },\n },\n {\n type: 'text',\n name: 'description',\n message: 'Project description (optional)',\n initial: options.description || 'A SaaS application built with Lego-One',\n },\n {\n type: 'text',\n name: 'author',\n message: 'Author name (optional)',\n initial: options.author || '',\n },\n {\n type: 'confirm',\n name: 'git',\n message: 'Initialize git repository?',\n initial: options.git !== false,\n },\n ]);\n\n projectConfig = {\n appName: responses.appName || options.appName || 'my-saas-app',\n description: responses.description || options.description || 'A SaaS application built with Lego-One',\n author: responses.author || options.author || '',\n git: responses.git !== false,\n };\n } else {\n // Non-interactive mode - use provided values or defaults\n if (!options.appName) {\n console.error(kleur.red('Please specify an app name or use interactive mode (default)'));\n process.exit(1);\n }\n\n projectConfig = {\n appName: options.appName,\n description: options.description || 'A SaaS application built with Lego-One',\n author: options.author || '',\n git: options.git !== false,\n };\n }\n\n // Validate app name\n const validation = validateProjectName(projectConfig.appName);\n if (!validation.validForNewPackages) {\n const errorMsg = validation.errors?.join(', ') || validation.warnings?.join(', ') || 'unknown error';\n console.error(kleur.red(`Invalid app name: ${errorMsg}`));\n if (validation.warnings && validation.warnings.length > 0) {\n console.error(kleur.yellow(`Warnings: ${validation.warnings.join(', ')}`));\n }\n process.exit(1);\n }\n\n const appName = projectConfig.appName;\n\n const targetDir = path.resolve(process.cwd(), appName);\n\n // Check if directory exists\n if (await fsExtra.pathExists(targetDir)) {\n const files = await fsExtra.readdir(targetDir);\n if (files.length > 0) {\n console.error(kleur.red(`Directory \"${appName}\" already exists and is not empty`));\n process.exit(1);\n }\n }\n\n console.log(kleur.cyan('Creating your Lego-One application...'));\n\n // Create target directory\n await fsExtra.ensureDir(targetDir);\n\n // Copy template files\n console.log(kleur.gray('Copying template files...'));\n const templateDir = path.join(__dirname, '../template');\n if (await fsExtra.pathExists(templateDir)) {\n await fsExtra.copy(templateDir, targetDir);\n } else {\n // Fallback: copy from root (development mode)\n const rootDir = path.join(__dirname, '../../..');\n await copyTemplateFiles(rootDir, targetDir);\n }\n\n // Update package.json with project configuration\n console.log(kleur.gray('Configuring project...'));\n await updatePackageJson(targetDir, projectConfig);\n\n // Update README.md with project-specific information\n await updateReadme(targetDir, projectConfig);\n\n // Ensure PocketBase directory structure exists\n await ensurePocketBaseStructure(targetDir);\n\n // Initialize git if requested\n if (projectConfig.git) {\n console.log(kleur.gray('Initializing git repository...'));\n try {\n execSync('git init', { cwd: targetDir });\n execSync('git add .', { cwd: targetDir });\n execSync('git commit -m \"Initial commit from Lego-One\"', {\n cwd: targetDir,\n });\n } catch (error) {\n console.warn(kleur.yellow('Could not initialize git repository'));\n }\n }\n\n console.log(kleur.green('Application created successfully!'));\n\n // Print success message\n console.log('\\n' + kleur.bold('Next steps:'));\n console.log(` ${kleur.cyan('cd')} ${appName}`);\n console.log(` ${kleur.cyan('pnpm install')}`);\n console.log(` ${kleur.cyan('pnpm run dev')}`);\n console.log('\\n' + kleur.gray('To start developing:'));\n console.log(` ${kleur.cyan('pnpm run dev')} - Start development server`);\n console.log(` ${kleur.cyan('pnpm run dev:all')} - Start all services`);\n console.log('\\n' + kleur.gray('To build for production:'));\n console.log(` ${kleur.cyan('pnpm run build')} - Build application`);\n console.log(` ${kleur.cyan('pnpm run start')} - Start production server`);\n console.log('\\n' + kleur.gray('Documentation:'));\n console.log(` ${kleur.cyan('https://lego-one.dev/docs')} - Full documentation`);\n console.log('\\n' + kleur.yellow('Happy coding! 🚀\\n'));\n } catch (error) {\n console.error(kleur.red('Failed to create application'));\n if (error instanceof Error) {\n console.error(kleur.red(error.message));\n }\n process.exit(1);\n }\n}\n\nasync function updatePackageJson(targetDir: string, config: ProjectConfig) {\n const packageJsonPath = path.join(targetDir, 'package.json');\n \n if (await fsExtra.pathExists(packageJsonPath)) {\n const packageJson = JSON.parse(await fsExtra.readFile(packageJsonPath, 'utf-8'));\n \n // Update package name\n packageJson.name = config.appName;\n \n // Update description if provided\n if (config.description) {\n packageJson.description = config.description;\n }\n \n // Update author if provided\n if (config.author) {\n packageJson.author = config.author;\n }\n \n // Write updated package.json\n await fsExtra.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n }\n}\n\nasync function updateReadme(targetDir: string, config: ProjectConfig) {\n const readmePath = path.join(targetDir, 'README.md');\n \n if (await fsExtra.pathExists(readmePath)) {\n let readmeContent = await fsExtra.readFile(readmePath, 'utf-8');\n \n // Replace placeholders\n readmeContent = readmeContent.replace(/{APP_NAME}/g, config.appName);\n readmeContent = readmeContent.replace(/{DESCRIPTION}/g, config.description);\n \n // Write updated README\n await fsExtra.writeFile(readmePath, readmeContent, 'utf-8');\n }\n}\n\nasync function ensurePocketBaseStructure(targetDir: string) {\n const pocketbaseDir = path.join(targetDir, 'pocketbase');\n \n // Ensure directory exists\n await fsExtra.ensureDir(pocketbaseDir);\n \n // Create .gitignore for PocketBase data\n const gitignorePath = path.join(pocketbaseDir, '.gitignore');\n const gitignoreContent = `# PocketBase data files (do not commit)\npb_data/\n*.db\n*.db-shm\n*.db-wal\nlogs.db\nlogs.db-shm\nlogs.db-wal\n\n# PocketBase executable (users download separately)\npocketbase\npocketbase.exe\npocketbase.exe.gz\n*.zip\n`;\n \n if (!(await fsExtra.pathExists(gitignorePath))) {\n await fsExtra.writeFile(gitignorePath, gitignoreContent, 'utf-8');\n }\n}\n\nasync function copyTemplateFiles(sourceDir: string, targetDir: string) {\n // Files to copy\n const filesToCopy = [\n 'host',\n 'packages/plugins',\n 'package.json',\n 'pnpm-lock.yaml',\n 'pnpm-workspace.yaml',\n '.gitignore',\n 'tsconfig.json',\n ];\n\n // Files to exclude\n const excludePatterns = [\n 'node_modules',\n 'dist',\n '.next',\n 'coverage',\n '.cache',\n '*.log',\n ];\n\n for (const file of filesToCopy) {\n const srcPath = path.join(sourceDir, file);\n const destPath = path.join(targetDir, file);\n\n if (await fsExtra.pathExists(srcPath)) {\n await fsExtra.copy(srcPath, destPath, {\n filter: (src) => {\n const relativePath = path.relative(sourceDir, src);\n return !excludePatterns.some((pattern) =>\n relativePath.includes(pattern)\n );\n },\n });\n }\n }\n}\n\nasync function updateProject(projectDir: string, options: { dryRun?: boolean; force?: boolean }) {\n try {\n console.log(kleur.cyan('🔄 Updating Lego-One project...\\n'));\n\n // Check if this is a lego-one project\n const packageJsonPath = path.join(projectDir, 'package.json');\n if (!(await fsExtra.pathExists(packageJsonPath))) {\n console.error(kleur.red('❌ This does not appear to be a Lego-One project (package.json not found)'));\n process.exit(1);\n }\n\n const packageJson = JSON.parse(await fsExtra.readFile(packageJsonPath, 'utf-8'));\n const isLegoOneProject = \n packageJson.name === 'lego-one' || \n packageJson.description?.includes('Lego-One') ||\n await fsExtra.pathExists(path.join(projectDir, 'host')) ||\n await fsExtra.pathExists(path.join(projectDir, 'packages/plugins/@lego'));\n\n if (!isLegoOneProject) {\n console.error(kleur.red('❌ This does not appear to be a Lego-One project'));\n process.exit(1);\n }\n\n // Get template directory from installed package\n const templateDir = path.join(__dirname, '../template');\n \n if (!(await fsExtra.pathExists(templateDir))) {\n console.error(kleur.red('❌ Template directory not found. Please reinstall create-lego-one.'));\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.log(kleur.yellow('🔍 Dry run mode - no changes will be made\\n'));\n }\n\n // Files/directories to update (must match sync-template.js filesToSync)\n const updateItems = [\n // Core application structure\n { source: 'host', target: 'host', strategy: 'merge-host' }, // Merge host updates (skip user configs)\n { source: 'packages/plugins/@lego', target: 'packages/plugins/@lego', strategy: 'merge' }, // Add new plugins only\n \n // Root files\n { source: 'README.md', target: 'README.md', strategy: 'add-if-missing' }, // Add if doesn't exist (user-specific)\n \n // Configuration files\n { source: 'package.json', target: 'package.json', strategy: 'merge-json' }, // Merge package.json\n { source: 'pnpm-workspace.yaml', target: 'pnpm-workspace.yaml', strategy: 'replace' }, // Replace workspace config\n { source: '.gitignore', target: '.gitignore', strategy: 'merge-gitignore' }, // Merge gitignore intelligently\n { source: 'tsconfig.json', target: 'tsconfig.json', strategy: 'merge-json' }, // Merge tsconfig\n { source: 'tsconfig.base.json', target: 'tsconfig.base.json', strategy: 'replace' }, // Replace base config\n { source: '.eslintrc.js', target: '.eslintrc.js', strategy: 'replace' }, // Replace ESLint config\n { source: '.eslintignore', target: '.eslintignore', strategy: 'replace' }, // Replace ESLint ignore\n { source: '.prettierrc', target: '.prettierrc', strategy: 'replace' }, // Replace Prettier config\n { source: '.prettierignore', target: '.prettierignore', strategy: 'replace' }, // Replace Prettier ignore\n \n // Environment files (examples - users create their own from these)\n { source: '.env.example', target: '.env.example', strategy: 'replace' }, // Replace example file\n { source: '.env.development', target: '.env.development', strategy: 'add-if-missing' }, // Add if doesn't exist\n { source: '.env.production', target: '.env.production', strategy: 'add-if-missing' }, // Add if doesn't exist\n \n // Deployment files\n { source: 'Dockerfile', target: 'Dockerfile', strategy: 'replace' }, // Replace Dockerfile\n { source: 'docker-compose.yml', target: 'docker-compose.yml', strategy: 'replace' }, // Replace docker-compose\n { source: 'docker-entrypoint.sh', target: 'docker-entrypoint.sh', strategy: 'replace' }, // Replace entrypoint\n { source: 'nginx.conf', target: 'nginx.conf', strategy: 'replace' }, // Replace nginx config\n { source: '.dockerignore', target: '.dockerignore', strategy: 'replace' }, // Replace dockerignore\n \n // Documentation (for AI-assisted development)\n { source: 'docs', target: 'docs', strategy: 'merge' }, // Merge docs (add new, don't overwrite user docs)\n { source: 'CLAUDE.md', target: 'CLAUDE.md', strategy: 'add-if-missing' }, // Add if doesn't exist\n { source: 'PROMPT.md', target: 'PROMPT.md', strategy: 'add-if-missing' }, // Add if doesn't exist\n { source: '.cursor', target: '.cursor', strategy: 'merge' }, // Merge cursor rules\n \n // Scripts (for users to create plugins)\n { source: 'scripts', target: 'scripts', strategy: 'merge' }, // Merge scripts (add new, don't overwrite user scripts)\n \n // PocketBase structure\n { source: 'pocketbase', target: 'pocketbase', strategy: 'merge-pocketbase' }, // Merge PocketBase (skip executable)\n ];\n\n const updates: Array<{ file: string; action: string }> = [];\n\n for (const item of updateItems) {\n const sourcePath = path.join(templateDir, item.source);\n const targetPath = path.join(projectDir, item.target);\n\n if (!(await fsExtra.pathExists(sourcePath))) {\n continue;\n }\n\n const sourceStat = await fsExtra.stat(sourcePath);\n const targetExists = await fsExtra.pathExists(targetPath);\n\n if (item.strategy === 'skip') {\n continue;\n }\n\n if (item.strategy === 'merge' || item.strategy === 'merge-host' || item.strategy === 'merge-pocketbase') {\n // For directories, add new files only (don't overwrite existing)\n if (sourceStat.isDirectory()) {\n if (item.strategy === 'merge-host') {\n await mergeHostDirectory(sourcePath, targetPath, updates, options.dryRun);\n } else if (item.strategy === 'merge-pocketbase') {\n await mergePocketBaseDirectory(sourcePath, targetPath, updates, options.dryRun);\n } else {\n await mergeDirectory(sourcePath, targetPath, updates, options.dryRun);\n }\n }\n } else if (item.strategy === 'merge-gitignore') {\n // Merge .gitignore intelligently (combine entries, avoid duplicates)\n if (targetExists) {\n await mergeGitignoreFile(sourcePath, targetPath, updates, options.dryRun);\n } else {\n updates.push({ file: item.target, action: 'created' });\n if (!options.dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n } else if (item.strategy === 'add-if-missing') {\n // Only add if file doesn't exist\n if (!targetExists) {\n updates.push({ file: item.target, action: 'created' });\n if (!options.dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n } else if (item.strategy === 'merge-json') {\n if (targetExists) {\n await mergeJsonFile(sourcePath, targetPath, updates, options.dryRun);\n } else {\n updates.push({ file: item.target, action: 'created' });\n if (!options.dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n } else if (item.strategy === 'replace') {\n updates.push({ file: item.target, action: 'updated' });\n if (!options.dryRun) {\n await fsExtra.copy(sourcePath, targetPath, { overwrite: true });\n }\n }\n }\n\n // Summary\n console.log('\\n' + kleur.bold('Update Summary:'));\n if (updates.length === 0) {\n console.log(kleur.gray(' No updates needed'));\n } else {\n updates.forEach(({ file, action }) => {\n const icon = action === 'created' ? '➕' : action === 'updated' ? '🔄' : '✨';\n console.log(` ${icon} ${file} (${action})`);\n });\n }\n\n if (options.dryRun) {\n console.log('\\n' + kleur.yellow('💡 Run without --dry-run to apply updates'));\n } else {\n console.log('\\n' + kleur.green('✅ Project updated successfully!'));\n console.log(kleur.gray('\\nNext steps:'));\n console.log(` ${kleur.cyan('pnpm install')} - Install/update dependencies`);\n console.log(` ${kleur.cyan('pnpm run dev')} - Start development server`);\n }\n } catch (error) {\n console.error(kleur.red('❌ Failed to update project'));\n if (error instanceof Error) {\n console.error(kleur.red(error.message));\n }\n process.exit(1);\n }\n}\n\nasync function mergeDirectory(\n sourceDir: string,\n targetDir: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false\n) {\n await fsExtra.ensureDir(targetDir);\n const entries = await fsExtra.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n await mergeDirectory(sourcePath, targetPath, updates, dryRun);\n } else {\n // Only add files that don't exist (new plugins, new kernel files)\n const targetExists = await fsExtra.pathExists(targetPath);\n if (!targetExists) {\n const relativePath = path.relative(targetDir, targetPath);\n updates.push({ file: relativePath, action: 'created' });\n if (!dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n }\n }\n}\n\nasync function mergeHostDirectory(\n sourceDir: string,\n targetDir: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false,\n hostRootDir?: string\n) {\n // Track the host root directory for relative path calculation\n if (!hostRootDir) {\n hostRootDir = sourceDir;\n }\n\n await fsExtra.ensureDir(targetDir);\n const entries = await fsExtra.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n const relativeToHostRoot = path.relative(hostRootDir, sourcePath).replace(/\\\\/g, '/');\n\n // Skip user-specific config files\n // modern.config.ts is at host root\n // saas.config.ts is at host/src/\n if (relativeToHostRoot === 'modern.config.ts' || relativeToHostRoot === 'src/saas.config.ts') {\n continue;\n }\n\n if (entry.isDirectory()) {\n await mergeHostDirectory(sourcePath, targetPath, updates, dryRun, hostRootDir);\n } else {\n // Only add files that don't exist\n const targetExists = await fsExtra.pathExists(targetPath);\n if (!targetExists) {\n const relativeTargetPath = path.relative(targetDir, targetPath).replace(/\\\\/g, '/');\n updates.push({ file: relativeTargetPath, action: 'created' });\n if (!dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n }\n }\n}\n\nasync function mergePocketBaseDirectory(\n sourceDir: string,\n targetDir: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false\n) {\n // Files to skip (executable and data)\n const skipFiles = [\n 'pocketbase.exe',\n 'pocketbase',\n 'pocketbase.exe.gz',\n 'pb_data',\n ];\n\n await fsExtra.ensureDir(targetDir);\n const entries = await fsExtra.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = path.join(sourceDir, entry.name);\n const targetPath = path.join(targetDir, entry.name);\n\n // Skip executable and data files\n if (skipFiles.includes(entry.name)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await mergePocketBaseDirectory(sourcePath, targetPath, updates, dryRun);\n } else {\n // Only add files that don't exist\n const targetExists = await fsExtra.pathExists(targetPath);\n if (!targetExists) {\n const relativePath = path.relative(targetDir, targetPath);\n updates.push({ file: relativePath, action: 'created' });\n if (!dryRun) {\n await fsExtra.copy(sourcePath, targetPath);\n }\n }\n }\n }\n}\n\nasync function mergeJsonFile(\n sourcePath: string,\n targetPath: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false\n) {\n const sourceJson = JSON.parse(await fsExtra.readFile(sourcePath, 'utf-8'));\n const targetJson = JSON.parse(await fsExtra.readFile(targetPath, 'utf-8'));\n\n // Merge dependencies and devDependencies\n const merged = { ...targetJson };\n \n if (sourceJson.dependencies) {\n merged.dependencies = { ...targetJson.dependencies, ...sourceJson.dependencies };\n }\n if (sourceJson.devDependencies) {\n merged.devDependencies = { ...targetJson.devDependencies, ...sourceJson.devDependencies };\n }\n if (sourceJson.scripts) {\n // Merge scripts, but keep user's custom scripts\n merged.scripts = { ...sourceJson.scripts, ...targetJson.scripts };\n }\n\n // Check if there are actual changes\n const hasChanges = JSON.stringify(merged) !== JSON.stringify(targetJson);\n \n if (hasChanges) {\n updates.push({ file: path.basename(targetPath), action: 'updated' });\n if (!dryRun) {\n await fsExtra.writeFile(targetPath, JSON.stringify(merged, null, 2) + '\\n', 'utf-8');\n }\n }\n}\n\nasync function mergeGitignoreFile(\n sourcePath: string,\n targetPath: string,\n updates: Array<{ file: string; action: string }>,\n dryRun: boolean = false\n) {\n const sourceContent = await fsExtra.readFile(sourcePath, 'utf-8');\n const targetContent = await fsExtra.readFile(targetPath, 'utf-8');\n\n // Split into lines and normalize\n const sourceLines = sourceContent.split('\\n').map(line => line.trim()).filter(line => line && !line.startsWith('#'));\n const targetLines = targetContent.split('\\n').map(line => line.trim()).filter(line => line && !line.startsWith('#'));\n\n // Get existing entries as a set\n const existingEntries = new Set(targetLines);\n\n // Find new entries from source\n const newEntries = sourceLines.filter(line => !existingEntries.has(line));\n\n if (newEntries.length > 0) {\n updates.push({ file: path.basename(targetPath), action: 'updated' });\n if (!dryRun) {\n // Append new entries to target file\n const updatedContent = targetContent + (targetContent.endsWith('\\n') ? '' : '\\n') + \n (newEntries.length > 0 ? '\\n# Added by framework update\\n' + newEntries.join('\\n') + '\\n' : '');\n await fsExtra.writeFile(targetPath, updatedContent, 'utf-8');\n }\n }\n}\n\n// Run the CLI\ninit().catch((error) => {\n console.error(kleur.red('Unexpected error:'));\n console.error(error);\n process.exit(1);\n});\n"],"mappings":"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","names":["path","fs","prompts","validation","validateProjectName","fsExtra"]}
|
package/package.json
CHANGED
package/template/.env.example
CHANGED
|
@@ -1,18 +1,34 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# ============================================
|
|
2
|
+
# Lego-One Environment Variables
|
|
3
|
+
# ============================================
|
|
4
|
+
# Copy this file to .env for local development
|
|
5
|
+
# Or copy .env.development to .env
|
|
6
|
+
# ============================================
|
|
3
7
|
|
|
4
8
|
# Application Configuration
|
|
5
9
|
VITE_APP_NAME=Lego-One
|
|
6
10
|
VITE_APP_URL=http://localhost:8080
|
|
7
11
|
|
|
8
|
-
#
|
|
9
|
-
|
|
12
|
+
# PocketBase Configuration
|
|
13
|
+
# URL where PocketBase is running (default: http://localhost:8090)
|
|
14
|
+
VITE_POCKETBASE_URL=http://localhost:8090
|
|
15
|
+
|
|
16
|
+
# PocketBase Admin Credentials
|
|
17
|
+
# These are used for server-side operations (migrations, seeding)
|
|
18
|
+
# IMPORTANT: Change these in production!
|
|
19
|
+
VITE_POCKETBASE_ADMIN_EMAIL=admin@lego-one.dev
|
|
20
|
+
VITE_POCKETBASE_ADMIN_PASSWORD=admin123456
|
|
10
21
|
|
|
11
|
-
#
|
|
12
|
-
|
|
13
|
-
|
|
22
|
+
# Seed Admin (for development only)
|
|
23
|
+
# These credentials are used to create the initial admin user and organization
|
|
24
|
+
# Only used during first-time setup or when running migrations
|
|
25
|
+
VITE_SEED_ADMIN_EMAIL=admin@lego-one.dev
|
|
26
|
+
VITE_SEED_ADMIN_PASSWORD=admin123456
|
|
27
|
+
VITE_SEED_ADMIN_NAME=Super Admin
|
|
28
|
+
VITE_SEED_ORG_NAME=Demo Organization
|
|
14
29
|
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
-
|
|
30
|
+
# Plugin Development Ports
|
|
31
|
+
# These ports are used when running plugins in development mode
|
|
32
|
+
VITE_DEV_HOST_PORT=8080
|
|
33
|
+
VITE_DEV_DASHBOARD_PORT=3001
|
|
34
|
+
VITE_DEV_TODO_PORT=3002
|
package/template/package.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lego-one",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.15",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Microkernel SaaS OS with Modern.js + Garfish + PocketBase",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"dev": "pnpm --filter
|
|
9
|
-
"dev:host": "pnpm --filter
|
|
8
|
+
"dev": "pnpm --filter host dev",
|
|
9
|
+
"dev:host": "pnpm --filter host dev",
|
|
10
10
|
"dev:plugins": "pnpm -r --filter './packages/plugins/@lego/*' dev",
|
|
11
|
-
"dev:all": "pnpm --filter
|
|
12
|
-
"build": "pnpm --filter
|
|
11
|
+
"dev:all": "pnpm --filter host dev & pnpm -r --filter './packages/plugins/@lego/*' dev",
|
|
12
|
+
"build": "pnpm --filter host build && pnpm -r --filter './packages/plugins/@lego/*' build",
|
|
13
13
|
"lint": "pnpm -r lint",
|
|
14
14
|
"lint:fix": "pnpm -r lint:fix",
|
|
15
15
|
"format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"",
|
|
16
16
|
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md}\"",
|
|
17
17
|
"typecheck": "pnpm -r typecheck",
|
|
18
18
|
"test": "pnpm -r test",
|
|
19
|
-
"test:e2e": "pnpm --filter
|
|
19
|
+
"test:e2e": "pnpm --filter host test:e2e",
|
|
20
20
|
"clean": "pnpm -r exec rm -rf dist node_modules",
|
|
21
21
|
"create-plugin": "node scripts/create-plugin.js",
|
|
22
22
|
"version:patch": "node scripts/version.js patch",
|