{"version":3,"file":"index.cjs","names":["value: any","path","input","path: string","nodepath","path","result: any","e: any"],"sources":["../src/Utils/EnvParser.ts","../src/Utils/FileSystem.ts","../src/Utils/Logger.ts","../src/Utils/PathLoader.ts","../src/Utils/Prompts.ts","../src/Utils/Resolver.ts","../src/Utils/scripts.ts","../src/Utils/TaskManager.ts"],"sourcesContent":["import { GenericWithNullableStringValues } from '../Contracts/ObjContract'\n\nexport class EnvParser {\n\n    static parse (initial: GenericWithNullableStringValues) {\n        const parsed = { ...initial }\n\n        for (const key in parsed) {\n            const value: any = parsed[key]\n            parsed[key] = this.parseValue(value)\n        }\n\n        return parsed\n    }\n\n    static parseValue (value: any) {\n        /**\n         * Null/undefined stay untouched \n         */\n        if (value === null || value === undefined) return value\n\n        /**\n         * Convert string \"true\"/\"false\" to boolean \n         */\n        if (value === 'true') return true\n        if (value === 'false') return false\n\n        /**\n         *  Convert string numbers to number \n         */\n        if (!isNaN(value) && value.trim() !== '') {\n            return Number(value)\n        }\n\n        /**\n         * Convert string \"null\" and \"undefined\"\n         */\n        if (value === 'null') return null\n        if (value === 'undefined') return undefined\n\n        /**\n         * Otherwise return as-is (string)\n         */\n        return value\n    }\n}\n","import { access } from 'fs/promises'\nimport escalade from 'escalade/sync'\nimport path from 'path'\n\nexport class FileSystem {\n    static findModulePkg (moduleId: string, cwd?: string) {\n        const parts = moduleId.replace(/\\\\/g, '/').split('/')\n\n        let packageName = ''\n        // Handle scoped package name\n        if (parts.length > 0 && parts[0][0] === '@') {\n            packageName += parts.shift() + '/'\n        }\n        packageName += parts.shift()\n\n        const packageJson = path.join(cwd ?? process.cwd(), 'node_modules', packageName)\n\n        const resolved = this.resolveFileUp('package', ['json'], packageJson)\n\n        if (!resolved) {\n            return\n        }\n\n        return path.join(path.dirname(resolved), parts.join('/'))\n    }\n\n    /**\n     * Check if file exists\n     * \n     * @param path \n     * @returns \n     */\n    static async fileExists (path: string): Promise<boolean> {\n        try {\n            await access(path)\n            return true\n        } catch {\n            return false\n        }\n    }\n\n    /**\n     * Recursively find files starting from given cwd\n     * \n     * @param name \n     * @param extensions \n     * @param cwd \n     * \n     * @returns \n     */\n    static resolveFileUp (\n        name: string,\n        extensions: string[] | ((dir: string, filesNames: string[]) => string | false),\n        cwd?: string\n    ) {\n        cwd ??= process.cwd()\n\n        return escalade(cwd, (dir, filesNames) => {\n            if (typeof extensions === 'function') {\n                return extensions(dir, filesNames)\n            }\n\n            const candidates = new Set(extensions.map(ext => `${name}.${ext}`))\n            for (const filename of filesNames) {\n                if (candidates.has(filename)) {\n                    return filename\n                }\n            }\n\n            return false\n        }) ?? undefined\n    }\n} \n","import chalk, { type ChalkInstance } from 'chalk'\nimport { LoggerChalk, LoggerLog, LoggerParseSignature } from '../Contracts/Utils'\n\nexport class Logger {\n    /**\n     * Global verbosity configuration\n     */\n    private static verbosity: number = 0\n    private static isQuiet: boolean = false\n    private static isSilent: boolean = false\n\n    /**\n     * Configure global verbosity levels\n     */\n    static configure (options: { verbosity?: number, quiet?: boolean, silent?: boolean } = {}) {\n        this.verbosity = options.verbosity ?? 0\n        this.isQuiet = options.quiet ?? false\n        this.isSilent = options.silent ?? false\n    }\n\n    /**\n     * Check if output should be suppressed\n     */\n    private static shouldSuppressOutput (level: 'line' | 'debug' | 'info' | 'warn' | 'error' | 'success'): boolean {\n        if (this.isSilent) return true\n        if (this.isQuiet && (level === 'info' || level === 'success')) return true\n        if (level === 'debug' && this.verbosity < 3) return true\n        return false\n    }\n    /**\n     * Logs the message in two columns\n     * \n     * @param name \n     * @param value \n     * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n     * @returns \n     */\n    static twoColumnDetail (name: string, value: string, log?: true, spacer?: string): void\n    static twoColumnDetail (name: string, value: string, log?: false, spacer?: string): [string, string, string]\n    static twoColumnDetail (name: string, value: string, log = true, spacer = '.'): [string, string, string] | void {\n        // eslint-disable-next-line no-control-regex\n        const regex = /\\x1b\\[\\d+m/g\n        const width = Math.max(process.stdout.columns, 100)\n        const dots = Math.max(width - name.replace(regex, '').length - value.replace(regex, '').length - 10, 0)\n\n        if (log) return console.log(name, chalk.gray(spacer.repeat(dots)), value)\n        else return [name, chalk.gray(spacer.repeat(dots)), value]\n    }\n\n    /**\n     * Logs the message in two columns\n     * \n     * @param name \n     * @param desc \n     * @param width \n     * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n     * @returns \n     */\n    static describe (name: string, desc: string, width?: number, log?: true): void\n    static describe (name: string, desc: string, width?: number, log?: false): [string, string, string]\n    static describe (name: string, desc: string, width = 50, log = true): [string, string, string] | void {\n        width = Math.max(width, 30)\n        // eslint-disable-next-line no-control-regex\n        const regex = /\\x1b\\[\\d+m/g\n        const dots = Math.max(width - name.replace(regex, '').length, 0)\n\n        if (log) return console.log(name, ' '.repeat(dots), desc)\n        else return [name, ' '.repeat(dots), desc]\n    }\n\n    /**\n     * Logs the message in two columns but allways passing status\n     * \n     * @param name \n     * @param value \n     * @param status \n     * @param exit \n     * @param preserveCol \n     */\n    static split (name: string, value: string, status?: 'success' | 'info' | 'error', exit = false, preserveCol = false) {\n        status ??= 'info'\n        const color = { success: chalk.bgGreen, info: chalk.bgBlue, error: chalk.bgRed }\n\n        const [_name, dots, val] = this.twoColumnDetail(name, value, false)\n\n        console.log(this.textFormat(_name, color[status], preserveCol), dots, val)\n\n        if (exit) process.exit(0)\n    }\n\n    /**\n     * Wraps text with chalk\n     * \n     * @param txt \n     * @param color \n     * @param preserveCol \n     * @returns \n     */\n    static textFormat (\n        txt: unknown,\n        color: (txt: string) => string,\n        preserveCol = false\n    ): string {\n        const str = String(txt)\n\n        if (preserveCol) return str\n\n        const [first, ...rest] = str.split(':')\n        if (rest.length === 0) return str\n\n        return color(` ${first} `) + rest.join(':')\n    }\n\n    /**\n     * Logs a success message\n     * \n     * @param msg \n     * @param exit \n     * @param preserveCol \n     */\n    static success (msg: any, exit = false, preserveCol = false) {\n        if (!this.shouldSuppressOutput('success')) {\n            console.log(chalk.green('✓'), this.textFormat(msg, chalk.bgGreen, preserveCol))\n        }\n        if (exit) process.exit(0)\n    }\n\n    /**\n     * Logs an informational message\n     * \n     * @param msg \n     * @param exit \n     * @param preserveCol \n     */\n    static info (msg: any, exit = false, preserveCol = false) {\n        if (!this.shouldSuppressOutput('info')) {\n            console.log(chalk.blue('ℹ'), this.textFormat(msg, chalk.bgBlue, preserveCol))\n        }\n        if (exit) process.exit(0)\n    }\n\n    /**\n     * Logs an error message\n     * \n     * @param msg \n     * @param exit \n     * @param preserveCol \n     */\n    static error (msg: string | string[] | Error & { detail?: string }, exit = true, preserveCol = false) {\n        if (!this.shouldSuppressOutput('error')) {\n            if (msg instanceof Error) {\n                if (msg.message) {\n                    console.error(chalk.red('✖'), this.textFormat('ERROR:' + msg.message, chalk.bgRed, preserveCol))\n                }\n                console.error(chalk.red(`${msg.detail ? `${msg.detail}\\n` : ''}${msg.stack}`))\n            }\n            else {\n                console.error(chalk.red('✖'), this.textFormat(msg, chalk.bgRed, preserveCol))\n            }\n        }\n        if (exit) process.exit(1)\n    }\n\n    /**\n     * Logs a warning message\n     * \n     * @param msg \n     * @param exit \n     * @param preserveCol \n     */\n    static warn (msg: any, exit = false, preserveCol = false) {\n        if (!this.shouldSuppressOutput('warn')) {\n            console.warn(chalk.yellow('⚠'), this.textFormat(msg, chalk.bgYellow, preserveCol))\n        }\n        if (exit) process.exit(0)\n    }\n\n    /**\n     * Logs a debug message (only shown with verbosity >= 3)\n     * \n     * @param msg \n     * @param exit \n     * @param preserveCol \n     */\n    static debug<M = any> (msg: M | M[], exit = false, preserveCol = false) {\n        if (!this.shouldSuppressOutput('debug')) {\n            if (Array.isArray(msg)) {\n                for (let i = 0; i < msg.length; i++) {\n                    console.log(chalk.gray('🐛'), chalk.bgGray(i + 1), this.textFormat(msg[i], chalk.bgGray, preserveCol))\n                }\n            } else {\n                console.log(chalk.gray('🐛'), this.textFormat(msg, chalk.bgGray, preserveCol))\n            }\n        }\n        if (exit) process.exit(0)\n    }\n\n    /**\n     * Terminates the process\n     */\n    static quiet () {\n        process.exit(0)\n    }\n\n    static chalker (styles: LoggerChalk[]) {\n        return (input: any): string =>\n            styles.reduce((acc, style) => {\n                if ((style as any) in chalk) {\n                    const fn = typeof style === 'function'\n                        ? style\n                        : chalk[style as never]\n                    return fn(acc)\n                }\n                return acc\n            }, input)\n    }\n\n    /**\n     * Parse an array formated message and logs it\n     * \n     * @param config \n     * @param joiner \n     * @param log If set to false, string output will be returned and not logged \n     * @param sc color to use ue on split text if : is found \n     */\n    static parse (config: LoggerParseSignature, joiner?: string, log?: true, sc?: LoggerChalk): void\n    static parse (config: LoggerParseSignature, joiner?: string, log?: false, sc?: LoggerChalk): string\n    static parse (config: LoggerParseSignature, joiner = ' ', log = true, sc?: LoggerChalk): string | void {\n        const string = config.map(([str, opt]) => {\n            if (Array.isArray(opt)) {\n                opt = Logger.chalker(opt) as ChalkInstance\n            }\n\n            const output = typeof opt === 'string' && typeof chalk[opt] === 'function'\n                ? (chalk as any)[opt](str)\n                : typeof opt === 'function' ? opt(str) : str\n\n            if (!sc) {\n                return output\n            }\n\n            return this.textFormat(output, Logger.chalker(Array.isArray(sc) ? sc : [sc]))\n        }).join(joiner)\n\n        if (log && !this.shouldSuppressOutput('line')) console.log(string)\n        else return string\n    }\n\n    /**\n     * Ouput formater object or format the output\n     * \n     * @returns \n     */\n    public static log: LoggerLog = ((config, joiner, log: boolean = true, sc) => {\n        if (typeof config === 'string') {\n            const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n            return this.parse(conf, '', log as false, sc)\n        } else if (config) {\n            return this.parse(config, String(joiner), log as false, sc)\n        }\n\n        return this\n    }) as LoggerLog\n}\n","import { IPathName } from '../Contracts/IApplication'\nimport nodepath from 'path'\n\nexport class PathLoader {\n    private paths = {\n        base: '',\n        views: '/src/resources/views',\n        assets: '/public/assets',\n        routes: '/src/routes',\n        config: '/src/config',\n        public: '/public',\n        storage: '/storage',\n        database: '/src/database',\n    }\n\n    /**\n     * Dynamically retrieves a path property from the class.\n     * Any property ending with \"Path\" is accessible automatically.\n     *\n     * @param name - The base name of the path property\n     * @param prefix - The base path to prefix to the path\n     * @returns \n     */\n    getPath (name: IPathName, prefix?: string): string {\n        let path: string\n\n        if (prefix && name !== 'base') {\n            path = nodepath.join(prefix, this.paths[name])\n        } else {\n            path = this.paths[name]\n        }\n\n\n        if (name === 'public') {\n            path = path.replace('/public', nodepath.join('/', process.env.DIST_DIR ?? '.h3ravel/serve'))\n        } else {\n            path = path.replace('/src/', `/${process.env.DIST_DIR ?? '.h3ravel/serve'}/`.replace(/([^:]\\/)\\/+/g, '$1'))\n        }\n\n        return nodepath.normalize(path)\n    }\n\n    /**\n     * Programatically set the paths.\n     *\n     * @param name - The base name of the path property\n     * @param path - The new path\n     * @param base - The base path to include to the path\n     */\n    setPath (name: IPathName, path: string, base?: string) {\n        if (base && name !== 'base') {\n            this.paths[name] = nodepath.join(base, path)\n        }\n\n        this.paths[name] = path\n    }\n}\n","import autocomplete, { ChoiceOrSeparatorArray } from 'inquirer-autocomplete-standalone'\nimport { confirm, input, password, select } from '@inquirer/prompts'\n\nimport { Choices } from '../Contracts/PromptsContract'\nimport { Logger } from '..'\n\nexport class Prompts extends Logger {\n    /**\n     * Allows users to pick from a predefined set of choices when asked a question.\n     */\n    public static async choice (\n        /**\n         * Message to dislpay\n         */\n        message: string,\n        /**\n         * The choices available to the user\n         */\n        choices: Choices,\n        /**\n         * Item index front of which the cursor will initially appear\n         */\n        defaultIndex?: number,\n    ) {\n        return select({\n            message,\n            choices,\n            default: defaultIndex ? choices.at(defaultIndex) : undefined\n        })\n    }\n\n\n    /**\n     * Ask the user for a simple \"yes or no\" confirmation. \n     * By default, this method returns `false`. However, if the user enters y or yes \n     * in response to the prompt, the method would return `true`.\n     */\n    public static async confirm (\n        /**\n         * Message to dislpay\n         */\n        message: string,\n        /**\n         * The default value\n         */\n        def?: boolean | undefined,\n    ) {\n        return confirm({\n            message,\n            default: def\n        })\n    }\n\n    /**\n     * Prompt the user with the given question, accept their input, \n     * and then return the user's input back to your command.\n     */\n    public static async ask (\n        /**\n         * Message to dislpay\n         */\n        message: string,\n        /**\n         * The default value\n         */\n        def?: string | undefined,\n    ) {\n        return input({\n            message,\n            default: def\n        })\n    }\n\n    /**\n     * Prompt the user with the given question, accept their input which \n     * will not be visible to them as they type in the console, \n     * and then return the user's input back to your command.\n     */\n    public static async secret (\n        /**\n         * Message to dislpay\n         */\n        message: string,\n        /**\n         * Mask the user input\n         * \n         * @default true\n         */\n        mask?: string | boolean,\n    ) {\n        return password({\n            message,\n            mask\n        })\n    }\n\n    /**\n     * Provide auto-completion for possible choices. \n     * The user can still provide any answer, regardless of the auto-completion hints.\n     */\n    public static async anticipate (\n        /**\n         * Message to dislpay\n         */\n        message: string,\n        /**\n         * The source of completions\n         */\n        source: string[] | ((input?: string | undefined) => Promise<ChoiceOrSeparatorArray<any>>),\n        /**\n         * Set a default value\n         */\n        def?: string,\n    ) {\n        return autocomplete({\n            message,\n            source: Array.isArray(source) ? async (term) => {\n                return (term ? source.filter(e => e.includes(term)) : source).map(e => ({ value: e }))\n            } : source,\n            suggestOnly: true,\n            default: def\n        })\n    }\n}\n","import crypto from 'crypto'\nimport preferredPM from 'preferred-pm'\n\nexport class Resolver {\n    static async getPakageInstallCommand (pkg?: string) {\n        const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n        let cmd = 'install '\n\n        if (!pkg) {\n            if (pm === 'npm' || pm === 'pnpm' || pm === 'bun')\n                cmd = 'install'\n            else\n                cmd = ''\n        } else if (pm === 'yarn' || pm === 'pnpm' || pm === 'bun')\n            cmd = 'add '\n\n        return `${pm} ${cmd}${pkg ?? ''}`\n    }\n\n    static async getInstallCommand (pkg: string) {\n        const pm = (await preferredPM(process.cwd()))?.name ?? 'pnpm'\n\n        let cmd = 'install'\n        if (pm === 'yarn' || pm === 'pnpm')\n            cmd = 'add'\n        else if (pm === 'bun')\n            cmd = 'create'\n\n        return `${pm} ${cmd} ${pkg}`\n    }\n\n\n    /**\n     * Create a hash for a function or an object\n     * \n     * @param provider \n     * @returns \n     */\n    static hashObjectOrFunction (provider: object | ((..._: any[]) => any)): string {\n        return crypto\n            .createHash('sha1')\n            .update(provider.toString())\n            .digest('hex')\n    }\n\n    /**\n     * Checks if a function is asyncronous\n     * \n     * @param func \n     * @returns \n     */\n    static isAsyncFunction (func: any): boolean {\n        if (typeof func !== 'function') {\n            return false\n        }\n        return Object.prototype.toString.call(func) === '[object AsyncFunction]'\n    }\n}\n","export const mainTsconfig = {\n  extends: '@h3ravel/shared/tsconfig.json',\n  compilerOptions: {\n    baseUrl: '.',\n    outDir: 'dist',\n    paths: {\n      'src/*': ['./../src/*'],\n      'App/*': ['./../src/app/*'],\n      'root/*': ['./../*'],\n      'routes/*': ['./../src/routes/*'],\n      'config/*': ['./../src/config/*'],\n      'resources/*': ['./../src/resources/*']\n    },\n    target: 'es2022',\n    module: 'es2022',\n    moduleResolution: 'Node',\n    esModuleInterop: true,\n    strict: true,\n    allowJs: true,\n    skipLibCheck: true,\n    resolveJsonModule: true,\n    noEmit: true,\n    experimentalDecorators: true,\n    emitDecoratorMetadata: true\n  },\n  include: ['./**/*.d.ts', './../**/*'],\n  exclude: [\n    '.',\n    './../**/console/bin',\n    './../dist',\n    './../**/dist',\n    './../**/node_modules',\n    './../.node_modules',\n    './../**/node_modules/*',\n    './../**/public',\n    './../public',\n    './../**/storage',\n    './../storage',\n    './../**coverage**',\n    './../eslint.config.js',\n    './../jest.config.ts',\n    './../arquebus.config.js'\n  ]\n}\n\nexport const baseTsconfig = {\n  extends: './.h3ravel/tsconfig.json'\n}\n\nexport const packageJsonScript = {\n  build: 'NODE_ENV=production tsdown --config-loader unconfig -c tsdown.default.config.ts',\n  dev: 'NODE_ENV=development pnpm tsdown --config-loader unconfig -c tsdown.default.config.ts',\n  start: 'DIST_DIR=dist node -r source-map-support/register dist/server.js',\n  lint: 'eslint . --ext .ts',\n  test: 'NODE_NO_WARNINGS=1 NODE_ENV=testing jest --passWithNoTests',\n  postinstall: 'pnpm prepare'\n}\n","import { Logger } from './Logger'\n\nexport class TaskManager {\n    public static async taskRunner (\n        description: string,\n        task: (() => Promise<any>) | (() => any)\n    ): Promise<void> {\n        const startTime = process.hrtime()\n        let result: any = false\n\n        try {\n            result = await Promise.all([(task || (() => true))()].flat())\n        } finally {\n            const endTime = process.hrtime(startTime)\n            const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n            Logger.twoColumnDetail(\n                Logger.parse([[description, 'green']], '', false),\n                [\n                    Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n                    Logger.parse([[result !== false ? '✔' : '✘', result !== false ? 'green' : 'red']], '', false),\n                ].join(' ')\n            )\n        }\n    }\n\n    public static async advancedTaskRunner<R = any> (\n        info: [[string, string], [string, string]] | [[string, string]],\n        task: (() => Promise<R>) | (() => R)\n    ): Promise<R | undefined> {\n        const startTime = process.hrtime()\n        const [startInfo, stopInfo] = info\n\n        if (stopInfo) {\n            Logger.twoColumnDetail(startInfo[0], Logger.log(startInfo[1], ['yellow', 'bold'], false))\n        }\n\n        try {\n            return await Promise.race([task()])\n        } catch (e: any) {\n            Logger.error('ERROR: ' + e.message)\n        } finally {\n            const endTime = process.hrtime(startTime)\n            const duration = (endTime[0] * 1e9 + endTime[1]) / 1e6\n\n            Logger.twoColumnDetail(\n                stopInfo?.[0] ?? startInfo[0],\n                [\n                    Logger.parse([[`${Math.floor(duration)}ms`, 'gray']], '', false),\n                    Logger.parse([[`✔ ${stopInfo?.[1] ?? startInfo[1]}`, ['green', 'bold']]], '', false),\n                ].join(' ')\n            )\n        }\n    }\n}\n"],"mappings":"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"}