create-arkstack 0.2.6 → 0.3.1

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/bin/run.cjs CHANGED
@@ -123,14 +123,14 @@ const depsToRemove = [
123
123
  "prisma",
124
124
  "arkormx"
125
125
  ];
126
- const depsToAdd = { "@arkstack/console-slim": "^0.2.4" };
126
+ const depsToAdd = { "@arkstack/console-slim": "^0.3.1" };
127
127
  const depsList = {
128
- "@arkstack/common": "^0.2.4",
129
- "@arkstack/console": "^0.2.4",
130
- "@arkstack/contract": "^0.2.4",
131
- "@arkstack/driver-h3": "^0.2.4",
132
- "@arkstack/filesystem": "^0.2.4",
133
- "@arkstack/driver-express": "^0.2.4"
128
+ "@arkstack/common": "^0.3.1",
129
+ "@arkstack/console": "^0.3.1",
130
+ "@arkstack/contract": "^0.3.1",
131
+ "@arkstack/driver-h3": "^0.3.1",
132
+ "@arkstack/filesystem": "^0.3.1",
133
+ "@arkstack/driver-express": "^0.3.1"
134
134
  };
135
135
 
136
136
  //#endregion
@@ -226,9 +226,9 @@ var actions_default = class {
226
226
  delete pkg.scripts.predev;
227
227
  delete pkg.scripts.prebuild;
228
228
  delete pkg.scripts.precmd;
229
- delete pkg.scripts.build;
230
- delete pkg.scripts.dev;
231
229
  delete pkg.scripts.cmd;
230
+ pkg.scripts.dev = "ark dev";
231
+ pkg.scripts.build = "ark build";
232
232
  pkg.scripts.postinstall = "prepare";
233
233
  pkg.name = __h3ravel_support.Str.slugify(this.appName ?? (0, node_path.basename)(this.location).replace(".", ""), "-");
234
234
  if (this.description) pkg.description = this.description;
@@ -287,7 +287,7 @@ var actions_default = class {
287
287
  const filePath = (0, node_path.join)(this.location, file);
288
288
  if (!(0, node_fs.existsSync)(filePath)) continue;
289
289
  let content = await (0, node_fs_promises.readFile)(filePath, "utf-8");
290
- content = content.replace("import { ValidatorDBDriver } from './utils/drivers/ValidatorDBDriver'\n", "").replace("import { ModelNotFoundException } from 'arkormx'\n", "").replace("import { prisma } from 'src/core/database'\n", "").replace("import { Prisma } from '@prisma/client'\n", "").replace("Validator.useDatabase(new ValidatorDBDriver())", "").replace(" async shutdown () {\n await prisma.$disconnect()\n process.exit(0)\n }", " async shutdown () {\n process.exit(0)\n }").replace(" * Shuts down the application by disconnecting from the database and exiting the process.", " * Shuts down the application and exits the process.").replace(/\n\s*if \((?:err|cause) instanceof Prisma\.PrismaClientKnownRequestError && (?:err|cause)\.code === "P2025"\) \{\n\s*error\.code = 404\n\s*error\.message = `\$\{(?:err|cause)\.meta\?\.modelName\} not found!`\n\s*\}\n/g, "\n").replace(/\n\s*if \((?:err|cause) instanceof ModelNotFoundException\) \{\n\s*error\.code = 404\n\s*error\.message = `\$\{(?:err|cause)\.getModelName\(\)\} not found!`\n\s*\}\n/g, "\n").replace(/\s*\/\/ Register API routes\s*await ClearRouter\.group\('\/api', async \(\) => \{\s*await import\(pathToFileURL\(join\(process\.cwd\(\), 'src\/routes\/api\.ts'\)\)\.href\)\s*\}\)\s*/g, "\n");
290
+ content = content.replace("import { ValidatorDBDriver } from './utils/drivers/ValidatorDBDriver'\n", "").replace("import { ModelNotFoundException } from 'arkormx'\n", "").replace("import { prisma } from 'src/core/database'\n", "").replace("import { Prisma } from '@prisma/client'\n", "").replace("Validator.useDatabase(new ValidatorDBDriver())", "").replace(" async shutdown () {\n await prisma.$disconnect()\n process.exit(0)\n }", " async shutdown () {\n process.exit(0)\n }").replace(" * Shuts down the application by disconnecting from the database and exiting the process.", " * Shuts down the application and exits the process.").replace(/\n\s*if \((?:err|cause) instanceof Prisma\.PrismaClientKnownRequestError && (?:err|cause)\.code === "P2025"\) \{\n\s*error\.code = 404\n\s*error\.message = `\$\{(?:err|cause)\.meta\?\.modelName\} not found!`\n\s*\}\n/g, "\n").replace(/\n\s*if \((?:err|cause) instanceof ModelNotFoundException\) \{\n\s*error\.code = 404\n\s*error\.message = `\$\{(?:err|cause)\.getModelName\(\)\} not found!`\n\s*\}\n/g, "\n").replace(/if \(\!\(err instanceof ValidationException\) &&\n\s*!\(err instanceof ModelNotFoundException\)\) {/g, "if (!(err instanceof ValidationException)) {").replace(/\s*\/\/ Register API routes\s*await ClearRouter\.group\('\/api', async \(\) => \{\s*await import\(pathToFileURL\(join\(process\.cwd\(\), 'src\/routes\/api\.ts'\)\)\.href\)\s*\}\)\s*/g, "\n\n ");
291
291
  await (0, node_fs_promises.writeFile)(filePath, content, "utf-8");
292
292
  }
293
293
  }
package/bin/run.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.cjs","names":["templates: Template[]","depsList: Record<string, string>","location?: string","appName?: string","description?: string","Resolver","path","Str","path","Command","AbortPromptError","ExitPromptError","Str","source: string","Actions","Logger","Kernel"],"sources":["../src/logo.ts","../src/templates.ts","../src/data.ts","../src/actions.ts","../src/utils.ts","../src/Commands/CreateArkstackCommand.ts","../src/run.ts"],"sourcesContent":["export const altLogo = String.raw`%c\n _ __ _ _ \n /_\\ _ __ ___/ _\\ |_ __ _ ___| | __\n //_\\\\| '__/ __\\ \\| __/ _\\ |/ __| |/ /\n/ _ \\ | | (___\\ \\ || (_| | (__| < \n\\_/ \\_/_| \\___\\__/\\__\\__,_|\\___|_|\\_\\\n \n`\n","/*\n * create-arkstack - A CLI tool to create Arkstack applications\n *\n * (c) Toneflix\n *\n * The Arkstack framework and all its base packages unless otherwise stated, are\n * open-sourced software licensed under the MIT license.\n */\nimport { Template } from './types'\n\n/**\n * List of first party templates\n */\nexport const templates: Template[] = [\n {\n name: 'Express Starter Kit',\n alias: 'express',\n hint: 'An Express application starter kit',\n source: 'github:arkstack-hq/arkstack',\n },\n {\n name: 'Express Lean Starter Kit',\n alias: 'express-lean',\n hint: 'A minimal Express application starter kit',\n source: 'github:arkstack-hq/arkstack',\n lean: true,\n baseAlias: 'express',\n },\n {\n name: 'H3 Starter Kit',\n alias: 'h3',\n hint: 'A H3 application starter kit',\n source: 'github:arkstack-hq/arkstack',\n },\n {\n name: 'H3 Lean Starter Kit',\n alias: 'h3-lean',\n hint: 'A minimal H3 application starter kit',\n source: 'github:arkstack-hq/arkstack',\n lean: true,\n baseAlias: 'h3',\n },\n]","export const filesToRemove = [\n 'src/app/http/controllers',\n 'src/app/http/resources',\n 'src/models',\n 'database',\n 'src/routes/api.ts',\n 'src/core/database.ts',\n 'src/core/utils/drivers/ValidatorDBDriver.ts',\n 'prisma',\n 'prisma.config.ts',\n 'arkorm.config.ts',\n 'arkormx.config.ts',\n 'arkorm.config.js',\n 'arkormx.config.js',\n 'arkorm.config.mjs',\n 'arkormx.config.mjs',\n]\n\nexport const depsToRemove = [\n '@prisma/adapter-pg',\n '@arkstack/console',\n '@prisma/client',\n '@types/pg',\n 'pg',\n 'prisma',\n 'arkormx',\n]\n\nexport const depsToAdd = {\n '@arkstack/console-slim': '^0.2.4',\n}\n\nexport const depsList: Record<string, string> = {\n '@arkstack/common': '^0.2.4',\n '@arkstack/console': '^0.2.4',\n '@arkstack/contract': '^0.2.4',\n '@arkstack/driver-h3': '^0.2.4',\n '@arkstack/filesystem': '^0.2.4',\n '@arkstack/driver-express': '^0.2.4',\n}","import { Logger, Resolver } from '@h3ravel/shared'\nimport { copyFile, readFile, readdir, rm, unlink, writeFile } from 'node:fs/promises'\nimport { depsToAdd, depsToRemove, filesToRemove } from './data'\nimport path, { basename, join, relative } from 'node:path'\n\nimport type { KitName } from './types'\nimport { Str } from '@h3ravel/support'\nimport { chdir } from 'node:process'\nimport { depsList } from './data'\nimport { detectPackageManager } from '@antfu/install-pkg'\nimport { downloadTemplate } from 'giget'\nimport { existsSync } from 'node:fs'\nimport { spawnSync } from 'node:child_process'\n\nexport default class {\n skipInstallation?: boolean\n\n constructor(\n private location?: string,\n private appName?: string,\n private description?: string,\n ) {\n if (!this.location) {\n this.location = join(process.cwd(), '.temp')\n }\n }\n\n async pm () {\n return (await detectPackageManager()) ?? 'npm'\n }\n\n async runCmd (npx: boolean = false) {\n if (npx) return 'npx'\n\n const pm = await this.pm()\n\n return pm === 'npm' ? 'npm run' : pm\n }\n\n async download (template: string, install = false, auth?: string, overwrite = false) {\n if (this.location?.includes('.temp') || (overwrite && existsSync(this.location!))) {\n await rm(this.location!, { force: true, recursive: true })\n } else if (existsSync(this.location!)) {\n const files = await readdir(this.location ?? './')\n if (files?.length > 0) {\n console.log('\\n')\n Logger.parse(\n [\n [' ERROR ', 'bgRed'],\n [this.location!, ['gray', 'italic']],\n ['is not empty.', 'white'],\n ],\n ' ',\n )\n console.log('')\n process.exit(0)\n }\n }\n\n this.skipInstallation = !install\n this.removeLockFile()\n\n const status = await downloadTemplate(template, {\n dir: this.location,\n auth,\n provider: 'github',\n registry: await this.pm(),\n forceClean: false,\n })\n\n return status\n }\n\n /**\n * Installs the project dependencies using the detected package manager. \n * If a specific package name is provided, it will install that package \n * instead of all dependencies.\n * \n * @param name \n * @param args \n * @returns \n */\n async installPackage (name?: string, args: string[] = []) {\n const bcmd = await Resolver.getPakageInstallCommand() + (name ? ` ${name}` : '')\n const cmd = bcmd.split(' ')[0]\n if (bcmd.includes(' ')) {\n args.unshift(...bcmd.split(' ').slice(1))\n }\n\n const child = spawnSync(cmd, args, {\n cwd: process.cwd(),\n stdio: 'ignore',\n })\n\n if (child.error) {\n return child.status\n }\n\n return 0\n }\n\n async complete (install = false) {\n let installed = false\n if (install) {\n installed = await this.installPackage() === 0\n }\n\n console.log('')\n\n const installPath = './' + relative(process.cwd(), this.location!)\n\n try {\n chdir(path.join(process.cwd(), installPath))\n } catch {\n /** */\n }\n\n Logger.success('Your Arkstack project has been created successfully')\n Logger.parse(\n [\n ['cd', 'cyan'],\n [installPath, 'yellow'],\n installPath === process.cwd() ? ['✔', 'green'] : ['', 'green'],\n ],\n ' ',\n )\n\n if (!installed) {\n Logger.parse([[await Resolver.getPakageInstallCommand(), 'cyan']])\n }\n\n Logger.parse(\n [\n [await this.runCmd(), 'cyan'],\n ['dev', 'yellow'],\n ],\n ' ',\n )\n Logger.parse([\n ['Open', 'cyan'],\n ['http://localhost:3000', 'yellow'],\n ])\n\n console.log('')\n\n Logger.parse([['Have any questions', 'white']])\n // Logger.parse([\n // [\"Join our Discord server -\", \"white\"],\n // [\"https://discord.gg/hsG2A8PuGb\", \"yellow\"],\n // ]);\n Logger.parse([\n ['Checkout our other projects -', 'white'],\n ['https://toneflix.net/open-source', 'yellow'],\n ])\n }\n\n async cleanup (kit: KitName) {\n const pkgPath = join(this.location!, 'package.json')\n const pkg = await readFile(pkgPath!, 'utf-8').then(JSON.parse)\n\n delete pkg.packageManager\n delete pkg.scripts.predev\n delete pkg.scripts.prebuild\n delete pkg.scripts.precmd\n delete pkg.scripts.build\n delete pkg.scripts.dev\n delete pkg.scripts.cmd\n\n pkg.scripts.postinstall = 'prepare'\n\n pkg.name = Str.slugify(\n this.appName ?? basename(this.location!).replace('.', ''), '-'\n )\n\n if (this.description) {\n pkg.description = this.description\n }\n\n for (const [name, version] of Object.entries(depsList)) {\n if (name.includes('@arkstack/driver')) continue\n pkg.dependencies[name] = version\n }\n\n pkg.dependencies['@arkstack/driver-' + kit] = depsList[('@arkstack/driver-' + kit)]\n\n await Promise.allSettled([\n writeFile(pkgPath, JSON.stringify(pkg, null, 2)),\n this.removeLockFile(),\n rm(join(this.location!, 'pnpm-workspace.yaml'), { force: true }),\n rm(join(this.location!, '.github'), { force: true, recursive: true }),\n ])\n }\n\n async removeLockFile () {\n if (!this.skipInstallation) {\n return\n }\n\n await Promise.allSettled([\n unlink(join(this.location!, 'package-lock.json')),\n unlink(join(this.location!, 'yarn.lock')),\n unlink(join(this.location!, 'pnpm-lock.yaml')),\n ])\n }\n\n async getBanner () {\n return await readFile(join(process.cwd(), './logo.txt'), 'utf-8')\n }\n\n async copyExampleEnv () {\n const envPath = join(this.location!, '.env')\n const exampleEnvPath = join(this.location!, '.env.example')\n\n if (existsSync(exampleEnvPath)) {\n await copyFile(exampleEnvPath, envPath)\n }\n }\n\n async makeLeanProfile (_kit: KitName) {\n await Promise.allSettled(\n filesToRemove.map((file) => rm(join(this.location!, file), { force: true, recursive: true })),\n )\n\n const pkgPath = join(this.location!, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = await readFile(pkgPath, 'utf-8').then(JSON.parse)\n\n for (const dep of depsToRemove) {\n delete pkg.dependencies?.[dep]\n delete pkg.devDependencies?.[dep]\n }\n\n for (const [name, version] of Object.entries(depsToAdd)) {\n pkg.dependencies[name] = version\n }\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2))\n }\n\n const filesToPatch = [\n 'src/core/app.ts',\n 'src/core/router.ts',\n 'src/core/bootstrap.ts',\n 'src/core/utils/request-handlers.ts',\n ]\n\n for (const file of filesToPatch) {\n const filePath = join(this.location!, file)\n\n if (!existsSync(filePath)) {\n continue\n }\n\n let content = await readFile(filePath, 'utf-8')\n\n content = content\n .replace('import { ValidatorDBDriver } from \\'./utils/drivers/ValidatorDBDriver\\'\\n', '')\n .replace('import { ModelNotFoundException } from \\'arkormx\\'\\n', '')\n .replace('import { prisma } from \\'src/core/database\\'\\n', '')\n .replace('import { Prisma } from \\'@prisma/client\\'\\n', '')\n .replace('Validator.useDatabase(new ValidatorDBDriver())', '')\n .replace(' async shutdown () {\\n await prisma.$disconnect()\\n process.exit(0)\\n }', ' async shutdown () {\\n process.exit(0)\\n }')\n .replace(\n ' * Shuts down the application by disconnecting from the database and exiting the process.',\n ' * Shuts down the application and exits the process.',\n )\n .replace(\n /\\n\\s*if \\((?:err|cause) instanceof Prisma\\.PrismaClientKnownRequestError && (?:err|cause)\\.code === \"P2025\"\\) \\{\\n\\s*error\\.code = 404\\n\\s*error\\.message = `\\$\\{(?:err|cause)\\.meta\\?\\.modelName\\} not found!`\\n\\s*\\}\\n/g,\n '\\n',\n )\n .replace(\n /\\n\\s*if \\((?:err|cause) instanceof ModelNotFoundException\\) \\{\\n\\s*error\\.code = 404\\n\\s*error\\.message = `\\$\\{(?:err|cause)\\.getModelName\\(\\)\\} not found!`\\n\\s*\\}\\n/g,\n '\\n',\n )\n .replace(\n /\\s*\\/\\/ Register API routes\\s*await ClearRouter\\.group\\('\\/api', async \\(\\) => \\{\\s*await import\\(pathToFileURL\\(join\\(process\\.cwd\\(\\), 'src\\/routes\\/api\\.ts'\\)\\)\\.href\\)\\s*\\}\\)\\s*/g,\n '\\n',\n )\n\n await writeFile(filePath, content, 'utf-8')\n }\n\n }\n}\n","import { readdir, rename, rm } from 'node:fs/promises'\n\nimport path from 'node:path'\n\n/**\n * Removes all files in dirPath except the one specified by keepFileName\n *\n * @param dirPath\n * @param keepFileName\n */\nexport async function cleanDirectoryExcept (dirPath: string, keepFileName: string) {\n const files = await readdir(dirPath)\n\n for (const file of files) {\n if (file === keepFileName) continue\n\n const fullPath = path.join(dirPath, file)\n\n await rm(fullPath, { recursive: true, force: true })\n }\n}\n\n/**\n * Moves all files from dirPath to parent directory and removes dirPath\n *\n * @param dirPath\n * @param parent\n */\nexport async function hoistDirectoryContents (parent: string, dirPath: string) {\n const source = path.isAbsolute(dirPath) ? dirPath : path.join(process.cwd(), dirPath)\n\n const targetParent = path.isAbsolute(parent) ? parent : path.join(process.cwd(), parent)\n\n if (!source.startsWith(targetParent)) {\n throw new Error('Source must be inside the parent directory')\n }\n\n const entries = await readdir(source)\n\n for (const entry of entries) {\n const from = path.join(source, entry)\n const to = path.join(targetParent, entry)\n\n await rename(from, to)\n }\n\n await rm(source, { recursive: true })\n}\n","import { Command } from '@h3ravel/musket'\nimport { altLogo } from 'src/logo'\nimport inquirer from 'inquirer'\nimport { AbortPromptError, ExitPromptError } from '@inquirer/core'\nimport { basename, join } from 'node:path'\nimport { templates } from 'src/templates'\nimport { Str } from '@h3ravel/support'\nimport Actions from 'src/actions'\nimport ora from 'ora'\nimport { Logger } from '@h3ravel/shared'\nimport { cleanDirectoryExcept, hoistDirectoryContents } from 'src/utils'\nimport type { KitName } from 'src/types'\n\nexport class CreateArkstackCommand extends Command {\n protected signature = `create-arkstack\n {location?: The location where this project should be created relative to the current dir.}\n {--n|name?: The name of your project.}\n {--i|install: Install node_modules right away}\n {--t|token?: Kit repo authentication token.}\n {--d|desc?: Project Description.}\n {--k|kit?: Starter template kit.}\n {--p|pre: Download prerelease version if available.}\n {--o|overwrite: Overwrite the installation directory if it is not empty.}\n `\n protected description = 'Display a personalized greeting.'\n\n async handle () {\n const options = this.options()\n const pathName = this.argument('location')\n // const defaultName = pathName ? Str.of(pathName).afterLast(\"/\") : undefined;\n\n console.log(altLogo, 'font-family: monospace')\n\n let { template } = await inquirer\n .prompt([\n {\n type: 'list',\n name: 'template',\n message: 'Choose starter template kit:',\n choices: <never>templates.map((e) => ({\n name: e.name,\n value: e.alias,\n disabled: !e.source ? '(Unavailable at this time)' : false,\n })),\n default: 'full',\n when: () => !options.kit,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n let { appName, description } = await inquirer\n .prompt([\n {\n type: 'input',\n name: 'appName',\n message: 'What is the name of your project:',\n default: `arkstack-${template}`,\n // default: defaultName ?? `arkstack-${template}`,\n when: () => !options.name,\n },\n {\n type: 'input',\n name: 'description',\n message: 'Project Description:',\n default: `Simple ${Str.of(template).ucfirst()}.js project created with Arkstack.`,\n when: () => !options.desc,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n let { location } = await inquirer\n .prompt([\n {\n type: 'input',\n name: 'location',\n message: 'Installation location relative to the current dir:',\n default: Str.slugify(options.name ?? appName ?? basename(process.cwd()), '-'),\n when: () => !pathName,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n /**\n * Find selected template kit\n */\n const kit = templates.find((e) => e.alias === template)!\n\n let { install, token, pre } = await inquirer\n .prompt([\n {\n type: 'confirm',\n name: 'pre',\n message: `An alpha version of the ${kit.name.replace(/\\s*kit$/i, '').trim()} kit is available. Would you like to use it instead?`,\n default: false,\n when: () => kit.prereleaseSource && !options.pre,\n } as never,\n {\n type: 'input',\n name: 'token',\n message: 'Authentication token:',\n when: () => options.kit && !options.token,\n },\n {\n type: 'confirm',\n name: 'install',\n message: 'Would you like to install node_modules right away?:',\n default: true,\n when: () => !options.install,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n pre = options.pre ?? pre\n token = options.token ?? token\n appName = options.name ?? appName\n install = options.install ?? install\n template = options.kit ?? template\n location = pathName ?? location\n description = options.description ?? description\n\n /**\n * Validate selected kit\n */\n if (kit && !kit.source) {\n this.error(`ERROR: The ${kit.name} kit is not currently available`)\n process.exit(1)\n }\n\n const kitName = (kit.baseAlias ?? kit.alias).replace(/-lean$/i, '') as KitName\n const source: string = pre && kit.prereleaseSource ? kit.prereleaseSource! : kit.source\n const actions = new Actions(join(process.cwd(), location), appName, description)\n const spinner = ora('Loading Template...').start()\n\n const result = await actions.download(source, install, token, options.overwrite)\n\n if (result.dir && kitName) {\n await cleanDirectoryExcept(result.dir, kitName)\n await hoistDirectoryContents(result.dir, join(result.dir, kitName))\n }\n\n if (kit.lean) {\n spinner.info(Logger.parse([[\n 'Applying lean profile...',\n 'green',\n ]], '', false)).start()\n await actions.makeLeanProfile(kitName)\n }\n\n spinner.info(Logger.parse([['Cleaning Up...', 'green']], '', false)).start()\n await actions.cleanup(kitName)\n\n spinner.info(Logger.parse([['Initializing Project...', 'green']], '', false)).start()\n await actions.copyExampleEnv()\n\n spinner.succeed(Logger.parse([['Project initialization complete!', 'green']], '', false))\n\n await actions.complete(install)\n }\n}\n","#!/usr/bin/env node\n\nimport { CreateArkstackCommand } from './Commands/CreateArkstackCommand'\nimport { Kernel } from '@h3ravel/musket'\n\nclass Application { }\n\nKernel.init(new Application(), {\n rootCommand: CreateArkstackCommand,\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"run.cjs","names":["templates: Template[]","depsList: Record<string, string>","location?: string","appName?: string","description?: string","Resolver","path","Str","path","Command","AbortPromptError","ExitPromptError","Str","source: string","Actions","Logger","Kernel"],"sources":["../src/logo.ts","../src/templates.ts","../src/data.ts","../src/actions.ts","../src/utils.ts","../src/Commands/CreateArkstackCommand.ts","../src/run.ts"],"sourcesContent":["export const altLogo = String.raw`%c\n _ __ _ _ \n /_\\ _ __ ___/ _\\ |_ __ _ ___| | __\n //_\\\\| '__/ __\\ \\| __/ _\\ |/ __| |/ /\n/ _ \\ | | (___\\ \\ || (_| | (__| < \n\\_/ \\_/_| \\___\\__/\\__\\__,_|\\___|_|\\_\\\n \n`\n","/*\n * create-arkstack - A CLI tool to create Arkstack applications\n *\n * (c) Toneflix\n *\n * The Arkstack framework and all its base packages unless otherwise stated, are\n * open-sourced software licensed under the MIT license.\n */\nimport { Template } from './types'\n\n/**\n * List of first party templates\n */\nexport const templates: Template[] = [\n {\n name: 'Express Starter Kit',\n alias: 'express',\n hint: 'An Express application starter kit',\n source: 'github:arkstack-hq/arkstack',\n },\n {\n name: 'Express Lean Starter Kit',\n alias: 'express-lean',\n hint: 'A minimal Express application starter kit',\n source: 'github:arkstack-hq/arkstack',\n lean: true,\n baseAlias: 'express',\n },\n {\n name: 'H3 Starter Kit',\n alias: 'h3',\n hint: 'A H3 application starter kit',\n source: 'github:arkstack-hq/arkstack',\n },\n {\n name: 'H3 Lean Starter Kit',\n alias: 'h3-lean',\n hint: 'A minimal H3 application starter kit',\n source: 'github:arkstack-hq/arkstack',\n lean: true,\n baseAlias: 'h3',\n },\n]","export const filesToRemove = [\n 'src/app/http/controllers',\n 'src/app/http/resources',\n 'src/models',\n 'database',\n 'src/routes/api.ts',\n 'src/core/database.ts',\n 'src/core/utils/drivers/ValidatorDBDriver.ts',\n 'prisma',\n 'prisma.config.ts',\n 'arkorm.config.ts',\n 'arkormx.config.ts',\n 'arkorm.config.js',\n 'arkormx.config.js',\n 'arkorm.config.mjs',\n 'arkormx.config.mjs',\n]\n\nexport const depsToRemove = [\n '@prisma/adapter-pg',\n '@arkstack/console',\n '@prisma/client',\n '@types/pg',\n 'pg',\n 'prisma',\n 'arkormx',\n]\n\nexport const depsToAdd = {\n '@arkstack/console-slim': '^0.3.1',\n}\n\nexport const depsList: Record<string, string> = {\n '@arkstack/common': '^0.3.1',\n '@arkstack/console': '^0.3.1',\n '@arkstack/contract': '^0.3.1',\n '@arkstack/driver-h3': '^0.3.1',\n '@arkstack/filesystem': '^0.3.1',\n '@arkstack/driver-express': '^0.3.1',\n}","import { Logger, Resolver } from '@h3ravel/shared'\nimport { copyFile, readFile, readdir, rm, unlink, writeFile } from 'node:fs/promises'\nimport { depsToAdd, depsToRemove, filesToRemove } from './data'\nimport path, { basename, join, relative } from 'node:path'\n\nimport type { KitName } from './types'\nimport { Str } from '@h3ravel/support'\nimport { chdir } from 'node:process'\nimport { depsList } from './data'\nimport { detectPackageManager } from '@antfu/install-pkg'\nimport { downloadTemplate } from 'giget'\nimport { existsSync } from 'node:fs'\nimport { spawnSync } from 'node:child_process'\n\nexport default class {\n skipInstallation?: boolean\n\n constructor(\n private location?: string,\n private appName?: string,\n private description?: string,\n ) {\n if (!this.location) {\n this.location = join(process.cwd(), '.temp')\n }\n }\n\n async pm () {\n return (await detectPackageManager()) ?? 'npm'\n }\n\n async runCmd (npx: boolean = false) {\n if (npx) return 'npx'\n\n const pm = await this.pm()\n\n return pm === 'npm' ? 'npm run' : pm\n }\n\n async download (template: string, install = false, auth?: string, overwrite = false) {\n if (this.location?.includes('.temp') || (overwrite && existsSync(this.location!))) {\n await rm(this.location!, { force: true, recursive: true })\n } else if (existsSync(this.location!)) {\n const files = await readdir(this.location ?? './')\n if (files?.length > 0) {\n console.log('\\n')\n Logger.parse(\n [\n [' ERROR ', 'bgRed'],\n [this.location!, ['gray', 'italic']],\n ['is not empty.', 'white'],\n ],\n ' ',\n )\n console.log('')\n process.exit(0)\n }\n }\n\n this.skipInstallation = !install\n this.removeLockFile()\n\n const status = await downloadTemplate(template, {\n dir: this.location,\n auth,\n provider: 'github',\n registry: await this.pm(),\n forceClean: false,\n })\n\n return status\n }\n\n /**\n * Installs the project dependencies using the detected package manager. \n * If a specific package name is provided, it will install that package \n * instead of all dependencies.\n * \n * @param name \n * @param args \n * @returns \n */\n async installPackage (name?: string, args: string[] = []) {\n const bcmd = await Resolver.getPakageInstallCommand() + (name ? ` ${name}` : '')\n const cmd = bcmd.split(' ')[0]\n if (bcmd.includes(' ')) {\n args.unshift(...bcmd.split(' ').slice(1))\n }\n\n const child = spawnSync(cmd, args, {\n cwd: process.cwd(),\n stdio: 'ignore',\n })\n\n if (child.error) {\n return child.status\n }\n\n return 0\n }\n\n async complete (install = false) {\n let installed = false\n if (install) {\n installed = await this.installPackage() === 0\n }\n\n console.log('')\n\n const installPath = './' + relative(process.cwd(), this.location!)\n\n try {\n chdir(path.join(process.cwd(), installPath))\n } catch {\n /** */\n }\n\n Logger.success('Your Arkstack project has been created successfully')\n Logger.parse(\n [\n ['cd', 'cyan'],\n [installPath, 'yellow'],\n installPath === process.cwd() ? ['✔', 'green'] : ['', 'green'],\n ],\n ' ',\n )\n\n if (!installed) {\n Logger.parse([[await Resolver.getPakageInstallCommand(), 'cyan']])\n }\n\n Logger.parse(\n [\n [await this.runCmd(), 'cyan'],\n ['dev', 'yellow'],\n ],\n ' ',\n )\n Logger.parse([\n ['Open', 'cyan'],\n ['http://localhost:3000', 'yellow'],\n ])\n\n console.log('')\n\n Logger.parse([['Have any questions', 'white']])\n // Logger.parse([\n // [\"Join our Discord server -\", \"white\"],\n // [\"https://discord.gg/hsG2A8PuGb\", \"yellow\"],\n // ]);\n Logger.parse([\n ['Checkout our other projects -', 'white'],\n ['https://toneflix.net/open-source', 'yellow'],\n ])\n }\n\n async cleanup (kit: KitName) {\n const pkgPath = join(this.location!, 'package.json')\n const pkg = await readFile(pkgPath!, 'utf-8').then(JSON.parse)\n\n delete pkg.packageManager\n delete pkg.scripts.predev\n delete pkg.scripts.prebuild\n delete pkg.scripts.precmd\n delete pkg.scripts.cmd\n\n pkg.scripts.dev = 'ark dev'\n pkg.scripts.build = 'ark build'\n pkg.scripts.postinstall = 'prepare'\n\n pkg.name = Str.slugify(\n this.appName ?? basename(this.location!).replace('.', ''), '-'\n )\n\n if (this.description) {\n pkg.description = this.description\n }\n\n for (const [name, version] of Object.entries(depsList)) {\n if (name.includes('@arkstack/driver')) continue\n pkg.dependencies[name] = version\n }\n\n pkg.dependencies['@arkstack/driver-' + kit] = depsList[('@arkstack/driver-' + kit)]\n\n await Promise.allSettled([\n writeFile(pkgPath, JSON.stringify(pkg, null, 2)),\n this.removeLockFile(),\n rm(join(this.location!, 'pnpm-workspace.yaml'), { force: true }),\n rm(join(this.location!, '.github'), { force: true, recursive: true }),\n ])\n }\n\n async removeLockFile () {\n if (!this.skipInstallation) {\n return\n }\n\n await Promise.allSettled([\n unlink(join(this.location!, 'package-lock.json')),\n unlink(join(this.location!, 'yarn.lock')),\n unlink(join(this.location!, 'pnpm-lock.yaml')),\n ])\n }\n\n async getBanner () {\n return await readFile(join(process.cwd(), './logo.txt'), 'utf-8')\n }\n\n async copyExampleEnv () {\n const envPath = join(this.location!, '.env')\n const exampleEnvPath = join(this.location!, '.env.example')\n\n if (existsSync(exampleEnvPath)) {\n await copyFile(exampleEnvPath, envPath)\n }\n }\n\n async makeLeanProfile (_kit: KitName) {\n await Promise.allSettled(\n filesToRemove.map((file) => rm(join(this.location!, file), { force: true, recursive: true })),\n )\n\n const pkgPath = join(this.location!, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = await readFile(pkgPath, 'utf-8').then(JSON.parse)\n\n for (const dep of depsToRemove) {\n delete pkg.dependencies?.[dep]\n delete pkg.devDependencies?.[dep]\n }\n\n for (const [name, version] of Object.entries(depsToAdd)) {\n pkg.dependencies[name] = version\n }\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2))\n }\n\n const filesToPatch = [\n 'src/core/app.ts',\n 'src/core/router.ts',\n 'src/core/bootstrap.ts',\n 'src/core/utils/request-handlers.ts',\n ]\n\n for (const file of filesToPatch) {\n const filePath = join(this.location!, file)\n\n if (!existsSync(filePath)) {\n continue\n }\n\n let content = await readFile(filePath, 'utf-8')\n\n content = content\n .replace('import { ValidatorDBDriver } from \\'./utils/drivers/ValidatorDBDriver\\'\\n', '')\n .replace('import { ModelNotFoundException } from \\'arkormx\\'\\n', '')\n .replace('import { prisma } from \\'src/core/database\\'\\n', '')\n .replace('import { Prisma } from \\'@prisma/client\\'\\n', '')\n .replace('Validator.useDatabase(new ValidatorDBDriver())', '')\n .replace(' async shutdown () {\\n await prisma.$disconnect()\\n process.exit(0)\\n }', ' async shutdown () {\\n process.exit(0)\\n }')\n .replace(\n ' * Shuts down the application by disconnecting from the database and exiting the process.',\n ' * Shuts down the application and exits the process.',\n )\n .replace(\n /\\n\\s*if \\((?:err|cause) instanceof Prisma\\.PrismaClientKnownRequestError && (?:err|cause)\\.code === \"P2025\"\\) \\{\\n\\s*error\\.code = 404\\n\\s*error\\.message = `\\$\\{(?:err|cause)\\.meta\\?\\.modelName\\} not found!`\\n\\s*\\}\\n/g,\n '\\n',\n )\n .replace(\n /\\n\\s*if \\((?:err|cause) instanceof ModelNotFoundException\\) \\{\\n\\s*error\\.code = 404\\n\\s*error\\.message = `\\$\\{(?:err|cause)\\.getModelName\\(\\)\\} not found!`\\n\\s*\\}\\n/g,\n '\\n',\n )\n .replace(\n /if \\(\\!\\(err instanceof ValidationException\\) &&\\n\\s*!\\(err instanceof ModelNotFoundException\\)\\) {/g,\n 'if (!(err instanceof ValidationException)) {'\n )\n .replace(\n /\\s*\\/\\/ Register API routes\\s*await ClearRouter\\.group\\('\\/api', async \\(\\) => \\{\\s*await import\\(pathToFileURL\\(join\\(process\\.cwd\\(\\), 'src\\/routes\\/api\\.ts'\\)\\)\\.href\\)\\s*\\}\\)\\s*/g,\n '\\n\\n ',\n )\n\n await writeFile(filePath, content, 'utf-8')\n }\n\n }\n}\n","import { readdir, rename, rm } from 'node:fs/promises'\n\nimport path from 'node:path'\n\n/**\n * Removes all files in dirPath except the one specified by keepFileName\n *\n * @param dirPath\n * @param keepFileName\n */\nexport async function cleanDirectoryExcept (dirPath: string, keepFileName: string) {\n const files = await readdir(dirPath)\n\n for (const file of files) {\n if (file === keepFileName) continue\n\n const fullPath = path.join(dirPath, file)\n\n await rm(fullPath, { recursive: true, force: true })\n }\n}\n\n/**\n * Moves all files from dirPath to parent directory and removes dirPath\n *\n * @param dirPath\n * @param parent\n */\nexport async function hoistDirectoryContents (parent: string, dirPath: string) {\n const source = path.isAbsolute(dirPath) ? dirPath : path.join(process.cwd(), dirPath)\n\n const targetParent = path.isAbsolute(parent) ? parent : path.join(process.cwd(), parent)\n\n if (!source.startsWith(targetParent)) {\n throw new Error('Source must be inside the parent directory')\n }\n\n const entries = await readdir(source)\n\n for (const entry of entries) {\n const from = path.join(source, entry)\n const to = path.join(targetParent, entry)\n\n await rename(from, to)\n }\n\n await rm(source, { recursive: true })\n}\n","import { Command } from '@h3ravel/musket'\nimport { altLogo } from 'src/logo'\nimport inquirer from 'inquirer'\nimport { AbortPromptError, ExitPromptError } from '@inquirer/core'\nimport { basename, join } from 'node:path'\nimport { templates } from 'src/templates'\nimport { Str } from '@h3ravel/support'\nimport Actions from 'src/actions'\nimport ora from 'ora'\nimport { Logger } from '@h3ravel/shared'\nimport { cleanDirectoryExcept, hoistDirectoryContents } from 'src/utils'\nimport type { KitName } from 'src/types'\n\nexport class CreateArkstackCommand extends Command {\n protected signature = `create-arkstack\n {location?: The location where this project should be created relative to the current dir.}\n {--n|name?: The name of your project.}\n {--i|install: Install node_modules right away}\n {--t|token?: Kit repo authentication token.}\n {--d|desc?: Project Description.}\n {--k|kit?: Starter template kit.}\n {--p|pre: Download prerelease version if available.}\n {--o|overwrite: Overwrite the installation directory if it is not empty.}\n `\n protected description = 'Display a personalized greeting.'\n\n async handle () {\n const options = this.options()\n const pathName = this.argument('location')\n // const defaultName = pathName ? Str.of(pathName).afterLast(\"/\") : undefined;\n\n console.log(altLogo, 'font-family: monospace')\n\n let { template } = await inquirer\n .prompt([\n {\n type: 'list',\n name: 'template',\n message: 'Choose starter template kit:',\n choices: <never>templates.map((e) => ({\n name: e.name,\n value: e.alias,\n disabled: !e.source ? '(Unavailable at this time)' : false,\n })),\n default: 'full',\n when: () => !options.kit,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n let { appName, description } = await inquirer\n .prompt([\n {\n type: 'input',\n name: 'appName',\n message: 'What is the name of your project:',\n default: `arkstack-${template}`,\n // default: defaultName ?? `arkstack-${template}`,\n when: () => !options.name,\n },\n {\n type: 'input',\n name: 'description',\n message: 'Project Description:',\n default: `Simple ${Str.of(template).ucfirst()}.js project created with Arkstack.`,\n when: () => !options.desc,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n let { location } = await inquirer\n .prompt([\n {\n type: 'input',\n name: 'location',\n message: 'Installation location relative to the current dir:',\n default: Str.slugify(options.name ?? appName ?? basename(process.cwd()), '-'),\n when: () => !pathName,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n /**\n * Find selected template kit\n */\n const kit = templates.find((e) => e.alias === template)!\n\n let { install, token, pre } = await inquirer\n .prompt([\n {\n type: 'confirm',\n name: 'pre',\n message: `An alpha version of the ${kit.name.replace(/\\s*kit$/i, '').trim()} kit is available. Would you like to use it instead?`,\n default: false,\n when: () => kit.prereleaseSource && !options.pre,\n } as never,\n {\n type: 'input',\n name: 'token',\n message: 'Authentication token:',\n when: () => options.kit && !options.token,\n },\n {\n type: 'confirm',\n name: 'install',\n message: 'Would you like to install node_modules right away?:',\n default: true,\n when: () => !options.install,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n pre = options.pre ?? pre\n token = options.token ?? token\n appName = options.name ?? appName\n install = options.install ?? install\n template = options.kit ?? template\n location = pathName ?? location\n description = options.description ?? description\n\n /**\n * Validate selected kit\n */\n if (kit && !kit.source) {\n this.error(`ERROR: The ${kit.name} kit is not currently available`)\n process.exit(1)\n }\n\n const kitName = (kit.baseAlias ?? kit.alias).replace(/-lean$/i, '') as KitName\n const source: string = pre && kit.prereleaseSource ? kit.prereleaseSource! : kit.source\n const actions = new Actions(join(process.cwd(), location), appName, description)\n const spinner = ora('Loading Template...').start()\n\n const result = await actions.download(source, install, token, options.overwrite)\n\n if (result.dir && kitName) {\n await cleanDirectoryExcept(result.dir, kitName)\n await hoistDirectoryContents(result.dir, join(result.dir, kitName))\n }\n\n if (kit.lean) {\n spinner.info(Logger.parse([[\n 'Applying lean profile...',\n 'green',\n ]], '', false)).start()\n await actions.makeLeanProfile(kitName)\n }\n\n spinner.info(Logger.parse([['Cleaning Up...', 'green']], '', false)).start()\n await actions.cleanup(kitName)\n\n spinner.info(Logger.parse([['Initializing Project...', 'green']], '', false)).start()\n await actions.copyExampleEnv()\n\n spinner.succeed(Logger.parse([['Project initialization complete!', 'green']], '', false))\n\n await actions.complete(install)\n }\n}\n","#!/usr/bin/env node\n\nimport { CreateArkstackCommand } from './Commands/CreateArkstackCommand'\nimport { Kernel } from '@h3ravel/musket'\n\nclass Application { }\n\nKernel.init(new Application(), {\n rootCommand: CreateArkstackCommand,\n})\n"],"mappings":"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"}
package/bin/run.js CHANGED
@@ -87,14 +87,14 @@ const depsToRemove = [
87
87
  "prisma",
88
88
  "arkormx"
89
89
  ];
90
- const depsToAdd = { "@arkstack/console-slim": "^0.2.4" };
90
+ const depsToAdd = { "@arkstack/console-slim": "^0.3.1" };
91
91
  const depsList = {
92
- "@arkstack/common": "^0.2.4",
93
- "@arkstack/console": "^0.2.4",
94
- "@arkstack/contract": "^0.2.4",
95
- "@arkstack/driver-h3": "^0.2.4",
96
- "@arkstack/filesystem": "^0.2.4",
97
- "@arkstack/driver-express": "^0.2.4"
92
+ "@arkstack/common": "^0.3.1",
93
+ "@arkstack/console": "^0.3.1",
94
+ "@arkstack/contract": "^0.3.1",
95
+ "@arkstack/driver-h3": "^0.3.1",
96
+ "@arkstack/filesystem": "^0.3.1",
97
+ "@arkstack/driver-express": "^0.3.1"
98
98
  };
99
99
 
100
100
  //#endregion
@@ -190,9 +190,9 @@ var actions_default = class {
190
190
  delete pkg.scripts.predev;
191
191
  delete pkg.scripts.prebuild;
192
192
  delete pkg.scripts.precmd;
193
- delete pkg.scripts.build;
194
- delete pkg.scripts.dev;
195
193
  delete pkg.scripts.cmd;
194
+ pkg.scripts.dev = "ark dev";
195
+ pkg.scripts.build = "ark build";
196
196
  pkg.scripts.postinstall = "prepare";
197
197
  pkg.name = Str.slugify(this.appName ?? basename(this.location).replace(".", ""), "-");
198
198
  if (this.description) pkg.description = this.description;
@@ -251,7 +251,7 @@ var actions_default = class {
251
251
  const filePath = join(this.location, file);
252
252
  if (!existsSync(filePath)) continue;
253
253
  let content = await readFile(filePath, "utf-8");
254
- content = content.replace("import { ValidatorDBDriver } from './utils/drivers/ValidatorDBDriver'\n", "").replace("import { ModelNotFoundException } from 'arkormx'\n", "").replace("import { prisma } from 'src/core/database'\n", "").replace("import { Prisma } from '@prisma/client'\n", "").replace("Validator.useDatabase(new ValidatorDBDriver())", "").replace(" async shutdown () {\n await prisma.$disconnect()\n process.exit(0)\n }", " async shutdown () {\n process.exit(0)\n }").replace(" * Shuts down the application by disconnecting from the database and exiting the process.", " * Shuts down the application and exits the process.").replace(/\n\s*if \((?:err|cause) instanceof Prisma\.PrismaClientKnownRequestError && (?:err|cause)\.code === "P2025"\) \{\n\s*error\.code = 404\n\s*error\.message = `\$\{(?:err|cause)\.meta\?\.modelName\} not found!`\n\s*\}\n/g, "\n").replace(/\n\s*if \((?:err|cause) instanceof ModelNotFoundException\) \{\n\s*error\.code = 404\n\s*error\.message = `\$\{(?:err|cause)\.getModelName\(\)\} not found!`\n\s*\}\n/g, "\n").replace(/\s*\/\/ Register API routes\s*await ClearRouter\.group\('\/api', async \(\) => \{\s*await import\(pathToFileURL\(join\(process\.cwd\(\), 'src\/routes\/api\.ts'\)\)\.href\)\s*\}\)\s*/g, "\n");
254
+ content = content.replace("import { ValidatorDBDriver } from './utils/drivers/ValidatorDBDriver'\n", "").replace("import { ModelNotFoundException } from 'arkormx'\n", "").replace("import { prisma } from 'src/core/database'\n", "").replace("import { Prisma } from '@prisma/client'\n", "").replace("Validator.useDatabase(new ValidatorDBDriver())", "").replace(" async shutdown () {\n await prisma.$disconnect()\n process.exit(0)\n }", " async shutdown () {\n process.exit(0)\n }").replace(" * Shuts down the application by disconnecting from the database and exiting the process.", " * Shuts down the application and exits the process.").replace(/\n\s*if \((?:err|cause) instanceof Prisma\.PrismaClientKnownRequestError && (?:err|cause)\.code === "P2025"\) \{\n\s*error\.code = 404\n\s*error\.message = `\$\{(?:err|cause)\.meta\?\.modelName\} not found!`\n\s*\}\n/g, "\n").replace(/\n\s*if \((?:err|cause) instanceof ModelNotFoundException\) \{\n\s*error\.code = 404\n\s*error\.message = `\$\{(?:err|cause)\.getModelName\(\)\} not found!`\n\s*\}\n/g, "\n").replace(/if \(\!\(err instanceof ValidationException\) &&\n\s*!\(err instanceof ModelNotFoundException\)\) {/g, "if (!(err instanceof ValidationException)) {").replace(/\s*\/\/ Register API routes\s*await ClearRouter\.group\('\/api', async \(\) => \{\s*await import\(pathToFileURL\(join\(process\.cwd\(\), 'src\/routes\/api\.ts'\)\)\.href\)\s*\}\)\s*/g, "\n\n ");
255
255
  await writeFile(filePath, content, "utf-8");
256
256
  }
257
257
  }
package/bin/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","names":["templates: Template[]","depsList: Record<string, string>","location?: string","appName?: string","description?: string","source: string","Actions"],"sources":["../src/logo.ts","../src/templates.ts","../src/data.ts","../src/actions.ts","../src/utils.ts","../src/Commands/CreateArkstackCommand.ts","../src/run.ts"],"sourcesContent":["export const altLogo = String.raw`%c\n _ __ _ _ \n /_\\ _ __ ___/ _\\ |_ __ _ ___| | __\n //_\\\\| '__/ __\\ \\| __/ _\\ |/ __| |/ /\n/ _ \\ | | (___\\ \\ || (_| | (__| < \n\\_/ \\_/_| \\___\\__/\\__\\__,_|\\___|_|\\_\\\n \n`\n","/*\n * create-arkstack - A CLI tool to create Arkstack applications\n *\n * (c) Toneflix\n *\n * The Arkstack framework and all its base packages unless otherwise stated, are\n * open-sourced software licensed under the MIT license.\n */\nimport { Template } from './types'\n\n/**\n * List of first party templates\n */\nexport const templates: Template[] = [\n {\n name: 'Express Starter Kit',\n alias: 'express',\n hint: 'An Express application starter kit',\n source: 'github:arkstack-hq/arkstack',\n },\n {\n name: 'Express Lean Starter Kit',\n alias: 'express-lean',\n hint: 'A minimal Express application starter kit',\n source: 'github:arkstack-hq/arkstack',\n lean: true,\n baseAlias: 'express',\n },\n {\n name: 'H3 Starter Kit',\n alias: 'h3',\n hint: 'A H3 application starter kit',\n source: 'github:arkstack-hq/arkstack',\n },\n {\n name: 'H3 Lean Starter Kit',\n alias: 'h3-lean',\n hint: 'A minimal H3 application starter kit',\n source: 'github:arkstack-hq/arkstack',\n lean: true,\n baseAlias: 'h3',\n },\n]","export const filesToRemove = [\n 'src/app/http/controllers',\n 'src/app/http/resources',\n 'src/models',\n 'database',\n 'src/routes/api.ts',\n 'src/core/database.ts',\n 'src/core/utils/drivers/ValidatorDBDriver.ts',\n 'prisma',\n 'prisma.config.ts',\n 'arkorm.config.ts',\n 'arkormx.config.ts',\n 'arkorm.config.js',\n 'arkormx.config.js',\n 'arkorm.config.mjs',\n 'arkormx.config.mjs',\n]\n\nexport const depsToRemove = [\n '@prisma/adapter-pg',\n '@arkstack/console',\n '@prisma/client',\n '@types/pg',\n 'pg',\n 'prisma',\n 'arkormx',\n]\n\nexport const depsToAdd = {\n '@arkstack/console-slim': '^0.2.4',\n}\n\nexport const depsList: Record<string, string> = {\n '@arkstack/common': '^0.2.4',\n '@arkstack/console': '^0.2.4',\n '@arkstack/contract': '^0.2.4',\n '@arkstack/driver-h3': '^0.2.4',\n '@arkstack/filesystem': '^0.2.4',\n '@arkstack/driver-express': '^0.2.4',\n}","import { Logger, Resolver } from '@h3ravel/shared'\nimport { copyFile, readFile, readdir, rm, unlink, writeFile } from 'node:fs/promises'\nimport { depsToAdd, depsToRemove, filesToRemove } from './data'\nimport path, { basename, join, relative } from 'node:path'\n\nimport type { KitName } from './types'\nimport { Str } from '@h3ravel/support'\nimport { chdir } from 'node:process'\nimport { depsList } from './data'\nimport { detectPackageManager } from '@antfu/install-pkg'\nimport { downloadTemplate } from 'giget'\nimport { existsSync } from 'node:fs'\nimport { spawnSync } from 'node:child_process'\n\nexport default class {\n skipInstallation?: boolean\n\n constructor(\n private location?: string,\n private appName?: string,\n private description?: string,\n ) {\n if (!this.location) {\n this.location = join(process.cwd(), '.temp')\n }\n }\n\n async pm () {\n return (await detectPackageManager()) ?? 'npm'\n }\n\n async runCmd (npx: boolean = false) {\n if (npx) return 'npx'\n\n const pm = await this.pm()\n\n return pm === 'npm' ? 'npm run' : pm\n }\n\n async download (template: string, install = false, auth?: string, overwrite = false) {\n if (this.location?.includes('.temp') || (overwrite && existsSync(this.location!))) {\n await rm(this.location!, { force: true, recursive: true })\n } else if (existsSync(this.location!)) {\n const files = await readdir(this.location ?? './')\n if (files?.length > 0) {\n console.log('\\n')\n Logger.parse(\n [\n [' ERROR ', 'bgRed'],\n [this.location!, ['gray', 'italic']],\n ['is not empty.', 'white'],\n ],\n ' ',\n )\n console.log('')\n process.exit(0)\n }\n }\n\n this.skipInstallation = !install\n this.removeLockFile()\n\n const status = await downloadTemplate(template, {\n dir: this.location,\n auth,\n provider: 'github',\n registry: await this.pm(),\n forceClean: false,\n })\n\n return status\n }\n\n /**\n * Installs the project dependencies using the detected package manager. \n * If a specific package name is provided, it will install that package \n * instead of all dependencies.\n * \n * @param name \n * @param args \n * @returns \n */\n async installPackage (name?: string, args: string[] = []) {\n const bcmd = await Resolver.getPakageInstallCommand() + (name ? ` ${name}` : '')\n const cmd = bcmd.split(' ')[0]\n if (bcmd.includes(' ')) {\n args.unshift(...bcmd.split(' ').slice(1))\n }\n\n const child = spawnSync(cmd, args, {\n cwd: process.cwd(),\n stdio: 'ignore',\n })\n\n if (child.error) {\n return child.status\n }\n\n return 0\n }\n\n async complete (install = false) {\n let installed = false\n if (install) {\n installed = await this.installPackage() === 0\n }\n\n console.log('')\n\n const installPath = './' + relative(process.cwd(), this.location!)\n\n try {\n chdir(path.join(process.cwd(), installPath))\n } catch {\n /** */\n }\n\n Logger.success('Your Arkstack project has been created successfully')\n Logger.parse(\n [\n ['cd', 'cyan'],\n [installPath, 'yellow'],\n installPath === process.cwd() ? ['✔', 'green'] : ['', 'green'],\n ],\n ' ',\n )\n\n if (!installed) {\n Logger.parse([[await Resolver.getPakageInstallCommand(), 'cyan']])\n }\n\n Logger.parse(\n [\n [await this.runCmd(), 'cyan'],\n ['dev', 'yellow'],\n ],\n ' ',\n )\n Logger.parse([\n ['Open', 'cyan'],\n ['http://localhost:3000', 'yellow'],\n ])\n\n console.log('')\n\n Logger.parse([['Have any questions', 'white']])\n // Logger.parse([\n // [\"Join our Discord server -\", \"white\"],\n // [\"https://discord.gg/hsG2A8PuGb\", \"yellow\"],\n // ]);\n Logger.parse([\n ['Checkout our other projects -', 'white'],\n ['https://toneflix.net/open-source', 'yellow'],\n ])\n }\n\n async cleanup (kit: KitName) {\n const pkgPath = join(this.location!, 'package.json')\n const pkg = await readFile(pkgPath!, 'utf-8').then(JSON.parse)\n\n delete pkg.packageManager\n delete pkg.scripts.predev\n delete pkg.scripts.prebuild\n delete pkg.scripts.precmd\n delete pkg.scripts.build\n delete pkg.scripts.dev\n delete pkg.scripts.cmd\n\n pkg.scripts.postinstall = 'prepare'\n\n pkg.name = Str.slugify(\n this.appName ?? basename(this.location!).replace('.', ''), '-'\n )\n\n if (this.description) {\n pkg.description = this.description\n }\n\n for (const [name, version] of Object.entries(depsList)) {\n if (name.includes('@arkstack/driver')) continue\n pkg.dependencies[name] = version\n }\n\n pkg.dependencies['@arkstack/driver-' + kit] = depsList[('@arkstack/driver-' + kit)]\n\n await Promise.allSettled([\n writeFile(pkgPath, JSON.stringify(pkg, null, 2)),\n this.removeLockFile(),\n rm(join(this.location!, 'pnpm-workspace.yaml'), { force: true }),\n rm(join(this.location!, '.github'), { force: true, recursive: true }),\n ])\n }\n\n async removeLockFile () {\n if (!this.skipInstallation) {\n return\n }\n\n await Promise.allSettled([\n unlink(join(this.location!, 'package-lock.json')),\n unlink(join(this.location!, 'yarn.lock')),\n unlink(join(this.location!, 'pnpm-lock.yaml')),\n ])\n }\n\n async getBanner () {\n return await readFile(join(process.cwd(), './logo.txt'), 'utf-8')\n }\n\n async copyExampleEnv () {\n const envPath = join(this.location!, '.env')\n const exampleEnvPath = join(this.location!, '.env.example')\n\n if (existsSync(exampleEnvPath)) {\n await copyFile(exampleEnvPath, envPath)\n }\n }\n\n async makeLeanProfile (_kit: KitName) {\n await Promise.allSettled(\n filesToRemove.map((file) => rm(join(this.location!, file), { force: true, recursive: true })),\n )\n\n const pkgPath = join(this.location!, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = await readFile(pkgPath, 'utf-8').then(JSON.parse)\n\n for (const dep of depsToRemove) {\n delete pkg.dependencies?.[dep]\n delete pkg.devDependencies?.[dep]\n }\n\n for (const [name, version] of Object.entries(depsToAdd)) {\n pkg.dependencies[name] = version\n }\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2))\n }\n\n const filesToPatch = [\n 'src/core/app.ts',\n 'src/core/router.ts',\n 'src/core/bootstrap.ts',\n 'src/core/utils/request-handlers.ts',\n ]\n\n for (const file of filesToPatch) {\n const filePath = join(this.location!, file)\n\n if (!existsSync(filePath)) {\n continue\n }\n\n let content = await readFile(filePath, 'utf-8')\n\n content = content\n .replace('import { ValidatorDBDriver } from \\'./utils/drivers/ValidatorDBDriver\\'\\n', '')\n .replace('import { ModelNotFoundException } from \\'arkormx\\'\\n', '')\n .replace('import { prisma } from \\'src/core/database\\'\\n', '')\n .replace('import { Prisma } from \\'@prisma/client\\'\\n', '')\n .replace('Validator.useDatabase(new ValidatorDBDriver())', '')\n .replace(' async shutdown () {\\n await prisma.$disconnect()\\n process.exit(0)\\n }', ' async shutdown () {\\n process.exit(0)\\n }')\n .replace(\n ' * Shuts down the application by disconnecting from the database and exiting the process.',\n ' * Shuts down the application and exits the process.',\n )\n .replace(\n /\\n\\s*if \\((?:err|cause) instanceof Prisma\\.PrismaClientKnownRequestError && (?:err|cause)\\.code === \"P2025\"\\) \\{\\n\\s*error\\.code = 404\\n\\s*error\\.message = `\\$\\{(?:err|cause)\\.meta\\?\\.modelName\\} not found!`\\n\\s*\\}\\n/g,\n '\\n',\n )\n .replace(\n /\\n\\s*if \\((?:err|cause) instanceof ModelNotFoundException\\) \\{\\n\\s*error\\.code = 404\\n\\s*error\\.message = `\\$\\{(?:err|cause)\\.getModelName\\(\\)\\} not found!`\\n\\s*\\}\\n/g,\n '\\n',\n )\n .replace(\n /\\s*\\/\\/ Register API routes\\s*await ClearRouter\\.group\\('\\/api', async \\(\\) => \\{\\s*await import\\(pathToFileURL\\(join\\(process\\.cwd\\(\\), 'src\\/routes\\/api\\.ts'\\)\\)\\.href\\)\\s*\\}\\)\\s*/g,\n '\\n',\n )\n\n await writeFile(filePath, content, 'utf-8')\n }\n\n }\n}\n","import { readdir, rename, rm } from 'node:fs/promises'\n\nimport path from 'node:path'\n\n/**\n * Removes all files in dirPath except the one specified by keepFileName\n *\n * @param dirPath\n * @param keepFileName\n */\nexport async function cleanDirectoryExcept (dirPath: string, keepFileName: string) {\n const files = await readdir(dirPath)\n\n for (const file of files) {\n if (file === keepFileName) continue\n\n const fullPath = path.join(dirPath, file)\n\n await rm(fullPath, { recursive: true, force: true })\n }\n}\n\n/**\n * Moves all files from dirPath to parent directory and removes dirPath\n *\n * @param dirPath\n * @param parent\n */\nexport async function hoistDirectoryContents (parent: string, dirPath: string) {\n const source = path.isAbsolute(dirPath) ? dirPath : path.join(process.cwd(), dirPath)\n\n const targetParent = path.isAbsolute(parent) ? parent : path.join(process.cwd(), parent)\n\n if (!source.startsWith(targetParent)) {\n throw new Error('Source must be inside the parent directory')\n }\n\n const entries = await readdir(source)\n\n for (const entry of entries) {\n const from = path.join(source, entry)\n const to = path.join(targetParent, entry)\n\n await rename(from, to)\n }\n\n await rm(source, { recursive: true })\n}\n","import { Command } from '@h3ravel/musket'\nimport { altLogo } from 'src/logo'\nimport inquirer from 'inquirer'\nimport { AbortPromptError, ExitPromptError } from '@inquirer/core'\nimport { basename, join } from 'node:path'\nimport { templates } from 'src/templates'\nimport { Str } from '@h3ravel/support'\nimport Actions from 'src/actions'\nimport ora from 'ora'\nimport { Logger } from '@h3ravel/shared'\nimport { cleanDirectoryExcept, hoistDirectoryContents } from 'src/utils'\nimport type { KitName } from 'src/types'\n\nexport class CreateArkstackCommand extends Command {\n protected signature = `create-arkstack\n {location?: The location where this project should be created relative to the current dir.}\n {--n|name?: The name of your project.}\n {--i|install: Install node_modules right away}\n {--t|token?: Kit repo authentication token.}\n {--d|desc?: Project Description.}\n {--k|kit?: Starter template kit.}\n {--p|pre: Download prerelease version if available.}\n {--o|overwrite: Overwrite the installation directory if it is not empty.}\n `\n protected description = 'Display a personalized greeting.'\n\n async handle () {\n const options = this.options()\n const pathName = this.argument('location')\n // const defaultName = pathName ? Str.of(pathName).afterLast(\"/\") : undefined;\n\n console.log(altLogo, 'font-family: monospace')\n\n let { template } = await inquirer\n .prompt([\n {\n type: 'list',\n name: 'template',\n message: 'Choose starter template kit:',\n choices: <never>templates.map((e) => ({\n name: e.name,\n value: e.alias,\n disabled: !e.source ? '(Unavailable at this time)' : false,\n })),\n default: 'full',\n when: () => !options.kit,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n let { appName, description } = await inquirer\n .prompt([\n {\n type: 'input',\n name: 'appName',\n message: 'What is the name of your project:',\n default: `arkstack-${template}`,\n // default: defaultName ?? `arkstack-${template}`,\n when: () => !options.name,\n },\n {\n type: 'input',\n name: 'description',\n message: 'Project Description:',\n default: `Simple ${Str.of(template).ucfirst()}.js project created with Arkstack.`,\n when: () => !options.desc,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n let { location } = await inquirer\n .prompt([\n {\n type: 'input',\n name: 'location',\n message: 'Installation location relative to the current dir:',\n default: Str.slugify(options.name ?? appName ?? basename(process.cwd()), '-'),\n when: () => !pathName,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n /**\n * Find selected template kit\n */\n const kit = templates.find((e) => e.alias === template)!\n\n let { install, token, pre } = await inquirer\n .prompt([\n {\n type: 'confirm',\n name: 'pre',\n message: `An alpha version of the ${kit.name.replace(/\\s*kit$/i, '').trim()} kit is available. Would you like to use it instead?`,\n default: false,\n when: () => kit.prereleaseSource && !options.pre,\n } as never,\n {\n type: 'input',\n name: 'token',\n message: 'Authentication token:',\n when: () => options.kit && !options.token,\n },\n {\n type: 'confirm',\n name: 'install',\n message: 'Would you like to install node_modules right away?:',\n default: true,\n when: () => !options.install,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n pre = options.pre ?? pre\n token = options.token ?? token\n appName = options.name ?? appName\n install = options.install ?? install\n template = options.kit ?? template\n location = pathName ?? location\n description = options.description ?? description\n\n /**\n * Validate selected kit\n */\n if (kit && !kit.source) {\n this.error(`ERROR: The ${kit.name} kit is not currently available`)\n process.exit(1)\n }\n\n const kitName = (kit.baseAlias ?? kit.alias).replace(/-lean$/i, '') as KitName\n const source: string = pre && kit.prereleaseSource ? kit.prereleaseSource! : kit.source\n const actions = new Actions(join(process.cwd(), location), appName, description)\n const spinner = ora('Loading Template...').start()\n\n const result = await actions.download(source, install, token, options.overwrite)\n\n if (result.dir && kitName) {\n await cleanDirectoryExcept(result.dir, kitName)\n await hoistDirectoryContents(result.dir, join(result.dir, kitName))\n }\n\n if (kit.lean) {\n spinner.info(Logger.parse([[\n 'Applying lean profile...',\n 'green',\n ]], '', false)).start()\n await actions.makeLeanProfile(kitName)\n }\n\n spinner.info(Logger.parse([['Cleaning Up...', 'green']], '', false)).start()\n await actions.cleanup(kitName)\n\n spinner.info(Logger.parse([['Initializing Project...', 'green']], '', false)).start()\n await actions.copyExampleEnv()\n\n spinner.succeed(Logger.parse([['Project initialization complete!', 'green']], '', false))\n\n await actions.complete(install)\n }\n}\n","#!/usr/bin/env node\n\nimport { CreateArkstackCommand } from './Commands/CreateArkstackCommand'\nimport { Kernel } from '@h3ravel/musket'\n\nclass Application { }\n\nKernel.init(new Application(), {\n rootCommand: CreateArkstackCommand,\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"run.js","names":["templates: Template[]","depsList: Record<string, string>","location?: string","appName?: string","description?: string","source: string","Actions"],"sources":["../src/logo.ts","../src/templates.ts","../src/data.ts","../src/actions.ts","../src/utils.ts","../src/Commands/CreateArkstackCommand.ts","../src/run.ts"],"sourcesContent":["export const altLogo = String.raw`%c\n _ __ _ _ \n /_\\ _ __ ___/ _\\ |_ __ _ ___| | __\n //_\\\\| '__/ __\\ \\| __/ _\\ |/ __| |/ /\n/ _ \\ | | (___\\ \\ || (_| | (__| < \n\\_/ \\_/_| \\___\\__/\\__\\__,_|\\___|_|\\_\\\n \n`\n","/*\n * create-arkstack - A CLI tool to create Arkstack applications\n *\n * (c) Toneflix\n *\n * The Arkstack framework and all its base packages unless otherwise stated, are\n * open-sourced software licensed under the MIT license.\n */\nimport { Template } from './types'\n\n/**\n * List of first party templates\n */\nexport const templates: Template[] = [\n {\n name: 'Express Starter Kit',\n alias: 'express',\n hint: 'An Express application starter kit',\n source: 'github:arkstack-hq/arkstack',\n },\n {\n name: 'Express Lean Starter Kit',\n alias: 'express-lean',\n hint: 'A minimal Express application starter kit',\n source: 'github:arkstack-hq/arkstack',\n lean: true,\n baseAlias: 'express',\n },\n {\n name: 'H3 Starter Kit',\n alias: 'h3',\n hint: 'A H3 application starter kit',\n source: 'github:arkstack-hq/arkstack',\n },\n {\n name: 'H3 Lean Starter Kit',\n alias: 'h3-lean',\n hint: 'A minimal H3 application starter kit',\n source: 'github:arkstack-hq/arkstack',\n lean: true,\n baseAlias: 'h3',\n },\n]","export const filesToRemove = [\n 'src/app/http/controllers',\n 'src/app/http/resources',\n 'src/models',\n 'database',\n 'src/routes/api.ts',\n 'src/core/database.ts',\n 'src/core/utils/drivers/ValidatorDBDriver.ts',\n 'prisma',\n 'prisma.config.ts',\n 'arkorm.config.ts',\n 'arkormx.config.ts',\n 'arkorm.config.js',\n 'arkormx.config.js',\n 'arkorm.config.mjs',\n 'arkormx.config.mjs',\n]\n\nexport const depsToRemove = [\n '@prisma/adapter-pg',\n '@arkstack/console',\n '@prisma/client',\n '@types/pg',\n 'pg',\n 'prisma',\n 'arkormx',\n]\n\nexport const depsToAdd = {\n '@arkstack/console-slim': '^0.3.1',\n}\n\nexport const depsList: Record<string, string> = {\n '@arkstack/common': '^0.3.1',\n '@arkstack/console': '^0.3.1',\n '@arkstack/contract': '^0.3.1',\n '@arkstack/driver-h3': '^0.3.1',\n '@arkstack/filesystem': '^0.3.1',\n '@arkstack/driver-express': '^0.3.1',\n}","import { Logger, Resolver } from '@h3ravel/shared'\nimport { copyFile, readFile, readdir, rm, unlink, writeFile } from 'node:fs/promises'\nimport { depsToAdd, depsToRemove, filesToRemove } from './data'\nimport path, { basename, join, relative } from 'node:path'\n\nimport type { KitName } from './types'\nimport { Str } from '@h3ravel/support'\nimport { chdir } from 'node:process'\nimport { depsList } from './data'\nimport { detectPackageManager } from '@antfu/install-pkg'\nimport { downloadTemplate } from 'giget'\nimport { existsSync } from 'node:fs'\nimport { spawnSync } from 'node:child_process'\n\nexport default class {\n skipInstallation?: boolean\n\n constructor(\n private location?: string,\n private appName?: string,\n private description?: string,\n ) {\n if (!this.location) {\n this.location = join(process.cwd(), '.temp')\n }\n }\n\n async pm () {\n return (await detectPackageManager()) ?? 'npm'\n }\n\n async runCmd (npx: boolean = false) {\n if (npx) return 'npx'\n\n const pm = await this.pm()\n\n return pm === 'npm' ? 'npm run' : pm\n }\n\n async download (template: string, install = false, auth?: string, overwrite = false) {\n if (this.location?.includes('.temp') || (overwrite && existsSync(this.location!))) {\n await rm(this.location!, { force: true, recursive: true })\n } else if (existsSync(this.location!)) {\n const files = await readdir(this.location ?? './')\n if (files?.length > 0) {\n console.log('\\n')\n Logger.parse(\n [\n [' ERROR ', 'bgRed'],\n [this.location!, ['gray', 'italic']],\n ['is not empty.', 'white'],\n ],\n ' ',\n )\n console.log('')\n process.exit(0)\n }\n }\n\n this.skipInstallation = !install\n this.removeLockFile()\n\n const status = await downloadTemplate(template, {\n dir: this.location,\n auth,\n provider: 'github',\n registry: await this.pm(),\n forceClean: false,\n })\n\n return status\n }\n\n /**\n * Installs the project dependencies using the detected package manager. \n * If a specific package name is provided, it will install that package \n * instead of all dependencies.\n * \n * @param name \n * @param args \n * @returns \n */\n async installPackage (name?: string, args: string[] = []) {\n const bcmd = await Resolver.getPakageInstallCommand() + (name ? ` ${name}` : '')\n const cmd = bcmd.split(' ')[0]\n if (bcmd.includes(' ')) {\n args.unshift(...bcmd.split(' ').slice(1))\n }\n\n const child = spawnSync(cmd, args, {\n cwd: process.cwd(),\n stdio: 'ignore',\n })\n\n if (child.error) {\n return child.status\n }\n\n return 0\n }\n\n async complete (install = false) {\n let installed = false\n if (install) {\n installed = await this.installPackage() === 0\n }\n\n console.log('')\n\n const installPath = './' + relative(process.cwd(), this.location!)\n\n try {\n chdir(path.join(process.cwd(), installPath))\n } catch {\n /** */\n }\n\n Logger.success('Your Arkstack project has been created successfully')\n Logger.parse(\n [\n ['cd', 'cyan'],\n [installPath, 'yellow'],\n installPath === process.cwd() ? ['✔', 'green'] : ['', 'green'],\n ],\n ' ',\n )\n\n if (!installed) {\n Logger.parse([[await Resolver.getPakageInstallCommand(), 'cyan']])\n }\n\n Logger.parse(\n [\n [await this.runCmd(), 'cyan'],\n ['dev', 'yellow'],\n ],\n ' ',\n )\n Logger.parse([\n ['Open', 'cyan'],\n ['http://localhost:3000', 'yellow'],\n ])\n\n console.log('')\n\n Logger.parse([['Have any questions', 'white']])\n // Logger.parse([\n // [\"Join our Discord server -\", \"white\"],\n // [\"https://discord.gg/hsG2A8PuGb\", \"yellow\"],\n // ]);\n Logger.parse([\n ['Checkout our other projects -', 'white'],\n ['https://toneflix.net/open-source', 'yellow'],\n ])\n }\n\n async cleanup (kit: KitName) {\n const pkgPath = join(this.location!, 'package.json')\n const pkg = await readFile(pkgPath!, 'utf-8').then(JSON.parse)\n\n delete pkg.packageManager\n delete pkg.scripts.predev\n delete pkg.scripts.prebuild\n delete pkg.scripts.precmd\n delete pkg.scripts.cmd\n\n pkg.scripts.dev = 'ark dev'\n pkg.scripts.build = 'ark build'\n pkg.scripts.postinstall = 'prepare'\n\n pkg.name = Str.slugify(\n this.appName ?? basename(this.location!).replace('.', ''), '-'\n )\n\n if (this.description) {\n pkg.description = this.description\n }\n\n for (const [name, version] of Object.entries(depsList)) {\n if (name.includes('@arkstack/driver')) continue\n pkg.dependencies[name] = version\n }\n\n pkg.dependencies['@arkstack/driver-' + kit] = depsList[('@arkstack/driver-' + kit)]\n\n await Promise.allSettled([\n writeFile(pkgPath, JSON.stringify(pkg, null, 2)),\n this.removeLockFile(),\n rm(join(this.location!, 'pnpm-workspace.yaml'), { force: true }),\n rm(join(this.location!, '.github'), { force: true, recursive: true }),\n ])\n }\n\n async removeLockFile () {\n if (!this.skipInstallation) {\n return\n }\n\n await Promise.allSettled([\n unlink(join(this.location!, 'package-lock.json')),\n unlink(join(this.location!, 'yarn.lock')),\n unlink(join(this.location!, 'pnpm-lock.yaml')),\n ])\n }\n\n async getBanner () {\n return await readFile(join(process.cwd(), './logo.txt'), 'utf-8')\n }\n\n async copyExampleEnv () {\n const envPath = join(this.location!, '.env')\n const exampleEnvPath = join(this.location!, '.env.example')\n\n if (existsSync(exampleEnvPath)) {\n await copyFile(exampleEnvPath, envPath)\n }\n }\n\n async makeLeanProfile (_kit: KitName) {\n await Promise.allSettled(\n filesToRemove.map((file) => rm(join(this.location!, file), { force: true, recursive: true })),\n )\n\n const pkgPath = join(this.location!, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = await readFile(pkgPath, 'utf-8').then(JSON.parse)\n\n for (const dep of depsToRemove) {\n delete pkg.dependencies?.[dep]\n delete pkg.devDependencies?.[dep]\n }\n\n for (const [name, version] of Object.entries(depsToAdd)) {\n pkg.dependencies[name] = version\n }\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2))\n }\n\n const filesToPatch = [\n 'src/core/app.ts',\n 'src/core/router.ts',\n 'src/core/bootstrap.ts',\n 'src/core/utils/request-handlers.ts',\n ]\n\n for (const file of filesToPatch) {\n const filePath = join(this.location!, file)\n\n if (!existsSync(filePath)) {\n continue\n }\n\n let content = await readFile(filePath, 'utf-8')\n\n content = content\n .replace('import { ValidatorDBDriver } from \\'./utils/drivers/ValidatorDBDriver\\'\\n', '')\n .replace('import { ModelNotFoundException } from \\'arkormx\\'\\n', '')\n .replace('import { prisma } from \\'src/core/database\\'\\n', '')\n .replace('import { Prisma } from \\'@prisma/client\\'\\n', '')\n .replace('Validator.useDatabase(new ValidatorDBDriver())', '')\n .replace(' async shutdown () {\\n await prisma.$disconnect()\\n process.exit(0)\\n }', ' async shutdown () {\\n process.exit(0)\\n }')\n .replace(\n ' * Shuts down the application by disconnecting from the database and exiting the process.',\n ' * Shuts down the application and exits the process.',\n )\n .replace(\n /\\n\\s*if \\((?:err|cause) instanceof Prisma\\.PrismaClientKnownRequestError && (?:err|cause)\\.code === \"P2025\"\\) \\{\\n\\s*error\\.code = 404\\n\\s*error\\.message = `\\$\\{(?:err|cause)\\.meta\\?\\.modelName\\} not found!`\\n\\s*\\}\\n/g,\n '\\n',\n )\n .replace(\n /\\n\\s*if \\((?:err|cause) instanceof ModelNotFoundException\\) \\{\\n\\s*error\\.code = 404\\n\\s*error\\.message = `\\$\\{(?:err|cause)\\.getModelName\\(\\)\\} not found!`\\n\\s*\\}\\n/g,\n '\\n',\n )\n .replace(\n /if \\(\\!\\(err instanceof ValidationException\\) &&\\n\\s*!\\(err instanceof ModelNotFoundException\\)\\) {/g,\n 'if (!(err instanceof ValidationException)) {'\n )\n .replace(\n /\\s*\\/\\/ Register API routes\\s*await ClearRouter\\.group\\('\\/api', async \\(\\) => \\{\\s*await import\\(pathToFileURL\\(join\\(process\\.cwd\\(\\), 'src\\/routes\\/api\\.ts'\\)\\)\\.href\\)\\s*\\}\\)\\s*/g,\n '\\n\\n ',\n )\n\n await writeFile(filePath, content, 'utf-8')\n }\n\n }\n}\n","import { readdir, rename, rm } from 'node:fs/promises'\n\nimport path from 'node:path'\n\n/**\n * Removes all files in dirPath except the one specified by keepFileName\n *\n * @param dirPath\n * @param keepFileName\n */\nexport async function cleanDirectoryExcept (dirPath: string, keepFileName: string) {\n const files = await readdir(dirPath)\n\n for (const file of files) {\n if (file === keepFileName) continue\n\n const fullPath = path.join(dirPath, file)\n\n await rm(fullPath, { recursive: true, force: true })\n }\n}\n\n/**\n * Moves all files from dirPath to parent directory and removes dirPath\n *\n * @param dirPath\n * @param parent\n */\nexport async function hoistDirectoryContents (parent: string, dirPath: string) {\n const source = path.isAbsolute(dirPath) ? dirPath : path.join(process.cwd(), dirPath)\n\n const targetParent = path.isAbsolute(parent) ? parent : path.join(process.cwd(), parent)\n\n if (!source.startsWith(targetParent)) {\n throw new Error('Source must be inside the parent directory')\n }\n\n const entries = await readdir(source)\n\n for (const entry of entries) {\n const from = path.join(source, entry)\n const to = path.join(targetParent, entry)\n\n await rename(from, to)\n }\n\n await rm(source, { recursive: true })\n}\n","import { Command } from '@h3ravel/musket'\nimport { altLogo } from 'src/logo'\nimport inquirer from 'inquirer'\nimport { AbortPromptError, ExitPromptError } from '@inquirer/core'\nimport { basename, join } from 'node:path'\nimport { templates } from 'src/templates'\nimport { Str } from '@h3ravel/support'\nimport Actions from 'src/actions'\nimport ora from 'ora'\nimport { Logger } from '@h3ravel/shared'\nimport { cleanDirectoryExcept, hoistDirectoryContents } from 'src/utils'\nimport type { KitName } from 'src/types'\n\nexport class CreateArkstackCommand extends Command {\n protected signature = `create-arkstack\n {location?: The location where this project should be created relative to the current dir.}\n {--n|name?: The name of your project.}\n {--i|install: Install node_modules right away}\n {--t|token?: Kit repo authentication token.}\n {--d|desc?: Project Description.}\n {--k|kit?: Starter template kit.}\n {--p|pre: Download prerelease version if available.}\n {--o|overwrite: Overwrite the installation directory if it is not empty.}\n `\n protected description = 'Display a personalized greeting.'\n\n async handle () {\n const options = this.options()\n const pathName = this.argument('location')\n // const defaultName = pathName ? Str.of(pathName).afterLast(\"/\") : undefined;\n\n console.log(altLogo, 'font-family: monospace')\n\n let { template } = await inquirer\n .prompt([\n {\n type: 'list',\n name: 'template',\n message: 'Choose starter template kit:',\n choices: <never>templates.map((e) => ({\n name: e.name,\n value: e.alias,\n disabled: !e.source ? '(Unavailable at this time)' : false,\n })),\n default: 'full',\n when: () => !options.kit,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n let { appName, description } = await inquirer\n .prompt([\n {\n type: 'input',\n name: 'appName',\n message: 'What is the name of your project:',\n default: `arkstack-${template}`,\n // default: defaultName ?? `arkstack-${template}`,\n when: () => !options.name,\n },\n {\n type: 'input',\n name: 'description',\n message: 'Project Description:',\n default: `Simple ${Str.of(template).ucfirst()}.js project created with Arkstack.`,\n when: () => !options.desc,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n let { location } = await inquirer\n .prompt([\n {\n type: 'input',\n name: 'location',\n message: 'Installation location relative to the current dir:',\n default: Str.slugify(options.name ?? appName ?? basename(process.cwd()), '-'),\n when: () => !pathName,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n /**\n * Find selected template kit\n */\n const kit = templates.find((e) => e.alias === template)!\n\n let { install, token, pre } = await inquirer\n .prompt([\n {\n type: 'confirm',\n name: 'pre',\n message: `An alpha version of the ${kit.name.replace(/\\s*kit$/i, '').trim()} kit is available. Would you like to use it instead?`,\n default: false,\n when: () => kit.prereleaseSource && !options.pre,\n } as never,\n {\n type: 'input',\n name: 'token',\n message: 'Authentication token:',\n when: () => options.kit && !options.token,\n },\n {\n type: 'confirm',\n name: 'install',\n message: 'Would you like to install node_modules right away?:',\n default: true,\n when: () => !options.install,\n },\n ])\n .catch((err) => {\n if (err instanceof AbortPromptError || err instanceof ExitPromptError) {\n this.info('Thanks for trying out our starter kit.')\n process.exit(0)\n }\n\n return err\n })\n\n pre = options.pre ?? pre\n token = options.token ?? token\n appName = options.name ?? appName\n install = options.install ?? install\n template = options.kit ?? template\n location = pathName ?? location\n description = options.description ?? description\n\n /**\n * Validate selected kit\n */\n if (kit && !kit.source) {\n this.error(`ERROR: The ${kit.name} kit is not currently available`)\n process.exit(1)\n }\n\n const kitName = (kit.baseAlias ?? kit.alias).replace(/-lean$/i, '') as KitName\n const source: string = pre && kit.prereleaseSource ? kit.prereleaseSource! : kit.source\n const actions = new Actions(join(process.cwd(), location), appName, description)\n const spinner = ora('Loading Template...').start()\n\n const result = await actions.download(source, install, token, options.overwrite)\n\n if (result.dir && kitName) {\n await cleanDirectoryExcept(result.dir, kitName)\n await hoistDirectoryContents(result.dir, join(result.dir, kitName))\n }\n\n if (kit.lean) {\n spinner.info(Logger.parse([[\n 'Applying lean profile...',\n 'green',\n ]], '', false)).start()\n await actions.makeLeanProfile(kitName)\n }\n\n spinner.info(Logger.parse([['Cleaning Up...', 'green']], '', false)).start()\n await actions.cleanup(kitName)\n\n spinner.info(Logger.parse([['Initializing Project...', 'green']], '', false)).start()\n await actions.copyExampleEnv()\n\n spinner.succeed(Logger.parse([['Project initialization complete!', 'green']], '', false))\n\n await actions.complete(install)\n }\n}\n","#!/usr/bin/env node\n\nimport { CreateArkstackCommand } from './Commands/CreateArkstackCommand'\nimport { Kernel } from '@h3ravel/musket'\n\nclass Application { }\n\nKernel.init(new Application(), {\n rootCommand: CreateArkstackCommand,\n})\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-arkstack",
3
3
  "type": "module",
4
- "version": "0.2.6",
4
+ "version": "0.3.1",
5
5
  "description": "Scaffold new H3.js or Express.js applications using Toneflix's arkstack templates and starter kits",
6
6
  "homepage": "https://arkstack.toneflix.net",
7
7
  "repository": {