@h3ravel/core 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Container.ts","../src/Utils/PathLoader.ts","../../http/src/Middleware.ts","../../support/src/Contracts/ObjContract.ts","../../support/src/Contracts/StrContract.ts","../../support/src/Helpers/Arr.ts","../../support/src/Helpers/Number.ts","../../support/src/Helpers/Obj.ts","../../support/src/Helpers/Str.ts","../../support/src/index.ts","../../http/src/Request.ts","../../http/src/Response.ts","../../http/src/Contracts/ControllerContracts.ts","../../http/src/Contracts/HttpContract.ts","../../http/src/Middleware/LogRequests.ts","../../http/src/Providers/HttpServiceProvider.ts","../../http/src/Resources/JsonResource.ts","../../http/src/Resources/ApiResource.ts","../../http/src/index.ts","../../config/src/ConfigRepository.ts","../../config/src/EnvLoader.ts","../../config/src/Helpers.ts","../../../node_modules/.pnpm/dotenv@17.2.1/node_modules/dotenv/package.json","../../../node_modules/.pnpm/dotenv@17.2.1/node_modules/dotenv/lib/main.js","../../config/src/Providers/ConfigServiceProvider.ts","../../config/src/index.ts","../../router/src/Controller.ts","../../router/src/Route.ts","../../router/src/Router.ts","../../router/src/Decorators/ApiResource.ts","../../router/src/Decorators/Controller.ts","../../router/src/Decorators/Get.ts","../../router/src/Decorators/Middleware.ts","../../router/src/Decorators/Post.ts","../../router/src/Providers/AssetsServiceProvider.ts","../../router/src/Providers/RouteServiceProvider.ts","../../router/src/index.ts","../src/Application.ts","../src/Controller.ts","../src/ServiceProvider.ts","../src/Contracts/BindingsContract.ts","../src/Exceptions/Handler.ts","../src/Http/Kernel.ts","../src/Providers/AppServiceProvider.ts","../src/Providers/ViewServiceProvider.ts","../src/index.ts"],"sourcesContent":["import type { Bindings, UseKey } from \"./Contracts/BindingsContract\"\n\ntype IBinding = UseKey | (new (..._args: any[]) => unknown)\n\nexport class Container {\n private bindings = new Map<IBinding, () => unknown>()\n private singletons = new Map<IBinding, unknown>()\n\n /**\n * Bind a transient service to the container\n */\n bind<T> (key: new (...args: any[]) => T, factory: () => T): void\n bind<T extends UseKey> (key: T, factory: () => Bindings[T]): void\n bind<T extends UseKey> (\n key: T,\n factory: () => Bindings[T] | T\n ) {\n this.bindings.set(key, factory)\n }\n\n /**\n * Bind a singleton service to the container\n */\n singleton<T extends UseKey> (\n key: T | (new (..._args: any[]) => Bindings[T]),\n factory: () => Bindings[T]\n ) {\n this.bindings.set(key, () => {\n if (!this.singletons.has(key)) {\n this.singletons.set(key, factory())\n }\n return this.singletons.get(key)!\n })\n }\n\n /**\n * Resolve a service from the container\n */\n make<T extends UseKey> (key: T | (new (..._args: any[]) => Bindings[T])): Bindings[T] {\n // 1️⃣ Direct factory binding\n if (this.bindings.has(key)) {\n return this.bindings.get(key)!() as Bindings[T]\n }\n\n // 2️⃣ If class constructor → auto-resolve via reflection\n if (typeof key === 'function') {\n return this.build(key)\n }\n\n throw new Error(\n `No binding found for key: ${typeof key === 'string' ? key : (key as any)?.name}`\n )\n }\n\n /**\n * Automatically build a class with constructor dependency injection\n */\n private build<T extends UseKey> (ClassType: new (..._args: any[]) => Bindings[T]): Bindings[T] {\n const paramTypes: any[] = Reflect.getMetadata('design:paramtypes', ClassType) || []\n const dependencies = paramTypes.map((dep) => this.make(dep))\n return new ClassType(...dependencies)\n }\n\n\n /**\n * Check if a service is registered\n */\n has (key: UseKey): boolean {\n return this.bindings.has(key)\n }\n}\n","import nodepath from \"path\"\n\ntype PathName = 'views' | 'routes' | 'assets' | 'base' | 'public' | 'storage' | 'config'\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: '/src/storage',\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 base - The base path to include to the path\n * @returns \n */\n getPath (name: PathName, base?: string): string {\n if (base && name !== 'base') {\n return nodepath.join(base, this.paths[name])\n }\n\n return this.paths[name]\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: PathName, 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 { HttpContext } from './Contracts/HttpContract';\n\nexport abstract class Middleware {\n abstract handle (context: HttpContext, next: () => Promise<unknown>): Promise<unknown>\n}\n","import { CamelToSnakeCase } from \"./StrContract\"\n\n/**\n * Adds a dot prefix to nested keys\n */\ntype DotPrefix<T extends string, U extends string> =\n T extends '' ? U : `${T}.${U}`\n\n/**\n * Converts a union of objects into a single merged object\n */\ntype MergeUnion<T> =\n (T extends any ? (k: T) => void : never) extends\n (k: infer I) => void ? { [K in keyof I]: I[K] } : never\n\n/**\n * Flattens nested objects into dotted keys\n */\nexport type DotFlatten<T, Prefix extends string = ''> = MergeUnion<{\n [K in keyof T & string]:\n T[K] extends Record<string, any>\n ? DotFlatten<T[K], DotPrefix<Prefix, K>>\n : { [P in DotPrefix<Prefix, K>]: T[K] }\n}[keyof T & string]>\n\n/**\n * Builds \"nested.key\" paths for autocompletion\n */\nexport type DotNestedKeys<T> = {\n [K in keyof T & string]:\n T[K] extends object\n ? `${K}` | `${K}.${DotNestedKeys<T[K]>}`\n : `${K}`\n}[keyof T & string]\n\n/**\n * Retrieves type at a given dot-path\n */\nexport type DotNestedValue<T, Path extends string> =\n Path extends `${infer Key}.${infer Rest}`\n ? Key extends keyof T\n ? DotNestedValue<T[Key], Rest>\n : never\n : Path extends keyof T\n ? T[Path]\n : never\n\n/**\n * Convert CamelCased Object keys to snake_case\n */\nexport type KeysToSnakeCase<T> = {\n [K in keyof T as CamelToSnakeCase<string & K>]: T[K]\n}\n","/**\n * Converts CamelCased strings to snake_case\n */\nexport type CamelToSnakeCase<S extends string> = S extends `${infer T}${infer U}` ?\n `${T extends Capitalize<T> ? '_' : ''}${Lowercase<T>}${CamelToSnakeCase<U>}` :\n S \n","/**\n * Splits an array into chunks of a specified size.\n *\n * @template T - Type of elements in the array\n * @param arr - The input array\n * @param size - Size of each chunk (default: 2)\n * @returns An array of chunks (arrays)\n */\nexport const chunk = <T> (arr: T[], size: number = 2): T[][] => {\n if (size <= 0) throw new Error(\"Chunk size must be greater than 0\")\n\n const chunks: T[][] = []\n\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size))\n }\n\n return chunks\n}\n\n\n/**\n * Generates an array of sequential numbers.\n *\n * @param size - Number of elements in the range\n * @param startAt - Starting number (default: 0)\n * @returns An array of numbers from startAt to startAt + size - 1\n */\nexport const range = (size: number, startAt: number = 0): number[] => {\n if (size <= 0 || !Number.isFinite(size)) return []\n\n return Array.from({ length: size }, (_, i) => startAt + i)\n}\n","/**\n * Abbreviates large numbers using SI symbols (K, M, B...) \n * and formats the output according to the given locale.\n *\n * @param value - The number to abbreviate\n * @param locale - Optional locale string (default: \"en-US\")\n * @returns A localized, abbreviated number string\n */\nexport const abbreviate = (value?: number, locale: string = 'en-US'): string => {\n if (!value) return '0'\n\n // Numbers less than 1000 don't need abbreviation\n if (value < 1000) {\n return new Intl.NumberFormat(locale).format(value)\n }\n\n const si = [\n { v: 1e18, s: 'E' },\n { v: 1e15, s: 'P' },\n { v: 1e12, s: 'T' },\n { v: 1e9, s: 'B' },\n { v: 1e6, s: 'M' },\n { v: 1e3, s: 'K' },\n ]\n\n const match = si.find(scale => value >= scale.v)\n if (!match) return new Intl.NumberFormat(locale).format(value)\n\n const formatted = value / match.v\n\n return (\n new Intl.NumberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(formatted) + match.s\n )\n}\n\n/**\n * Concverts a number into human readable string\n *\n * @param num The number to convert\n * @param slugify convert the ouput into a slug using this as a separator\n * @returns\n */\nexport const humanize = (num: number, slugify?: '-' | '_'): string => {\n if (!num) {\n return ''\n }\n\n if (slugify === '-' || slugify === '_') {\n const h = humanize(num)\n return typeof h === 'string' ? h.replace(' ', slugify).toLowerCase() : h\n }\n\n const ones = [\n '',\n 'one',\n 'two',\n 'three',\n 'four',\n 'five',\n 'six',\n 'seven',\n 'eight',\n 'nine',\n 'ten',\n 'eleven',\n 'twelve',\n 'thirteen',\n 'fourteen',\n 'fifteen',\n 'sixteen',\n 'seventeen',\n 'eighteen',\n 'nineteen',\n ]\n const tens = [\n '',\n '',\n 'twenty',\n 'thirty',\n 'forty',\n 'fifty',\n 'sixty',\n 'seventy',\n 'eighty',\n 'ninety',\n ]\n\n const numString: string = num.toString()\n\n if (num < 0) throw new Error('Negative numbers are not supported.')\n\n if (num === 0) return 'zero'\n\n //the case of 1 - 20\n if (num < 20) {\n return ones[num] ?? ''\n }\n\n if (numString.length === 2) {\n return tens[numString[0] as unknown as number] + ' ' + ones[numString[1] as unknown as number]\n }\n\n //100 and more\n if (numString.length == 3) {\n if (numString[1] === '0' && numString[2] === '0')\n return ones[numString[0] as unknown as number] + ' hundred'\n else\n return (\n ones[numString[0] as unknown as number] +\n ' hundred and ' +\n humanize(+((numString[1] || '') + numString[2]), slugify)\n )\n }\n\n if (numString.length === 4) {\n const end = +((numString[1] || '') + numString[2] + numString[3])\n if (end === 0) return ones[numString[0] as unknown as number] + ' thousand'\n if (end < 100)\n return ones[numString[0] as unknown as number] + ' thousand and ' + humanize(end, slugify)\n return ones[numString[0] as unknown as number] + ' thousand ' + humanize(end, slugify)\n }\n\n return num as unknown as string\n}\n\n/**\n * Converts a number of bytes into a human-readable string.\n *\n * @param bytes - The size in bytes to convert\n * @param decimals - Number of decimal places to display (default: 2)\n * @param bits - If true, uses 1000-based (SI) units (B, KB, MB...); \n * otherwise uses 1024-based binary units (Bytes, KiB...)\n * @returns A formatted string with the appropriate unit\n */\nexport const toBytes = (\n bytes?: number,\n decimals: number = 2,\n bits: boolean = false\n): string => {\n if (!bytes || isNaN(bytes)) {\n return bits ? '0 B' : '0 Bytes'\n }\n\n const base = bits ? 1000 : 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = bits\n ? ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] // SI units\n : ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] // Binary units\n\n const index = Math.floor(Math.log(bytes) / Math.log(base))\n\n const value = parseFloat((bytes / Math.pow(base, index)).toFixed(dm))\n return `${value} ${sizes[index]}`\n}\n\n/**\n * Formats a duration (in seconds) into a human-readable string.\n *\n * @param seconds - Duration in seconds\n * @param worded - If true, outputs worded format (e.g., \"1hr 2min 3sec\"),\n * otherwise HH:MM:SS (e.g., \"01:02:03\")\n * @returns A formatted time string\n */\nexport const toHumanTime = (\n seconds: number = 0,\n worded: boolean = false\n): string => {\n // Ensure seconds is a number and not negative\n if (isNaN(seconds) || seconds < 0) seconds = 0\n\n const hours = Math.floor(seconds / 3600)\n const minutes = Math.floor((seconds % 3600) / 60)\n const secs = Math.floor(seconds % 60)\n\n // Worded format → \"1hr 2min 3sec\"\n if (worded) {\n const parts = []\n if (hours) parts.push(`${hours}hr`)\n if (minutes) parts.push(`${minutes}min`)\n if (secs || (!hours && !minutes)) parts.push(`${secs}sec`)\n return parts.join(' ')\n }\n\n // HH:MM:SS format → zero-padded\n const hh = hours > 0 ? `${hours}:` : ''\n const mm = (hours > 0 && minutes < 10 ? `0${minutes}` : minutes) + ':'\n const ss = secs < 10 ? `0${secs}` : secs\n\n return `${hh}${mm}${ss}`\n}\n\n","import { DotFlatten, DotNestedKeys, DotNestedValue, KeysToSnakeCase } from \"../Contracts/ObjContract\"\n\n/**\n * Flattens a nested object into a single-level object\n * with dot-separated keys.\n *\n * Example:\n * doter({\n * user: { name: \"John\", address: { city: \"NY\" } },\n * active: true\n * })\n * \n * Output:\n * {\n * \"user.name\": \"John\",\n * \"user.address.city\": \"NY\",\n * \"active\": true\n * }\n *\n * @template T - The type of the input object\n * @param obj - The nested object to flatten\n * @returns A flattened object with dotted keys and inferred types\n */\nexport const dot = <T extends Record<string, any>> (obj: T): DotFlatten<T> => {\n const result = {} as Record<string, unknown>\n\n /**\n * Internal recursive function to traverse and flatten the object.\n * \n * @param o - Current object to flatten\n * @param prefix - Key path accumulated so far\n */\n const recurse = (o: Record<string, any>, prefix = ''): void => {\n for (const [key, value] of Object.entries(o)) {\n const newKey = prefix ? `${prefix}.${key}` : key\n\n /**\n * Recurse if the value is a plain object\n */\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n recurse(value, newKey)\n } else {\n /**\n * Otherwise, assign directly\n */\n result[newKey] = value\n }\n }\n }\n\n recurse(obj)\n return result as DotFlatten<T>\n}\n\n/**\n * Extracts a subset of properties from an object.\n *\n * @template T - Type of the source object\n * @template K - Keys of T to extract\n * @param obj - The source object\n * @param keys - Array of keys to extract\n * @returns A new object with only the specified keys\n */\nexport const extractProperties = <T extends object, K extends keyof T> (\n obj: T,\n keys: readonly K[] = []\n): Pick<T, K> => {\n return Object.fromEntries(\n keys.map(key => [key, obj[key]])\n ) as Pick<T, K>\n}\n\n/**\n * Safely retrieves a value from an object by key or nested keys.\n *\n * @template T - Type of the source object\n * @param key - Single key or tuple [parentKey, childKey]\n * @param item - The source object\n * @returns The found value as a string or the key itself if not found\n */\nexport const getValue = <\n T extends Record<string, any> // Allow nested objects\n> (\n key: string | [keyof T, keyof T[string]],\n item: T\n): string => {\n if (Array.isArray(key)) {\n const [parent, child] = key\n\n if (child !== undefined) {\n // Access nested property: item[parent][child]\n return (\n String(item?.[parent]?.[child] ??\n item?.[parent] ??\n `${String(parent)}.${String(child)}`)\n )\n }\n\n // Only top-level key\n return String(item?.[parent] ?? parent)\n }\n\n // Single key access\n return String(item?.[key] ?? key)\n}\n\n/**\n * Maps over an object's entries and returns a new object \n * with transformed keys and/or values.\n *\n * @template T - Type of the input object\n * @template R - Type of the new values\n * @param obj - The object to transform\n * @param callback - Function that receives [key, value] and returns [newKey, newValue]\n * @returns A new object with transformed entries\n */\nexport const modObj = <T extends object, R> (\n obj: T,\n callback: (entry: [keyof T & string, T[keyof T]]) => [string, R]\n): Record<string, R> => {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) =>\n callback([key as keyof T & string, value as T[keyof T]])\n )\n ) as Record<string, R>\n}\n\n\nexport function safeDot<T extends Record<string, any>> (data: T): T\nexport function safeDot<\n T extends Record<string, any>,\n K extends DotNestedKeys<T>\n> (data: T, key?: K): DotNestedValue<T, K>\nexport function safeDot<\n T extends Record<string, any>,\n K extends DotNestedKeys<T>\n> (data: T, key?: K): any {\n if (!key) return data\n return key.split('.').reduce((acc: any, k) => acc?.[k], data)\n}\n\n/**\n * Sets a nested property on an object using dot notation.\n * \n * @example\n * const obj = {}\n * setNested(obj, 'app.user.name', 'Legacy')\n * console.log(obj)\n * // Output: { app: { user: { name: 'Legacy' } } }\n * \n * @param obj - The target object to modify.\n * @param key - The dot-separated key (e.g., 'app.user.name').\n * @param value - The value to set at the specified path.\n */\nexport const setNested = (\n obj: Record<string, any>,\n key: string,\n value: any\n): void => {\n if (!key.includes('.')) {\n obj[key] = value\n return\n }\n\n const parts = key.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n\n /**\n * If we're at the last key, assign the value\n */\n if (i === parts.length - 1) {\n current[part] = value\n } else {\n /**\n * If the key doesn't exist or isn't an object, create it\n */\n if (typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {}\n }\n current = current[part]\n }\n }\n}\n\n/**\n * Converts object keys to a slugified format (e.g., snake_case).\n *\n * @template T - Type of the input object\n * @param obj - The object whose keys will be slugified\n * @param only - Optional array of keys to slugify (others remain unchanged)\n * @param separator - Separator for slugified keys (default: \"_\")\n * @returns A new object with slugified keys\n */\nexport const slugifyKeys = <T extends object> (\n obj: T,\n only: string[] = [],\n separator: string = '_'\n): KeysToSnakeCase<T> => {\n const slugify = (key: string): string =>\n key\n .replace(/([a-z])([A-Z])/g, `$1${separator}$2`) // Handle camelCase\n .replace(/[\\s\\W]+/g, separator) // Replace spaces/symbols\n .replace(new RegExp(`${separator}{2,}`, 'g'), separator) // Remove duplicate separators\n .replace(new RegExp(`^${separator}|${separator}$`, 'g'), '') // Trim edges\n .toLowerCase()\n\n let entries = Object.entries(obj)\n\n // Filter if `only` is provided\n if (only.length) {\n entries = entries.filter(([key]) => only.includes(key))\n }\n\n return Object.fromEntries(\n entries.map(([key, value]) => [slugify(key), value])\n ) as KeysToSnakeCase<T>\n}\n","import { dot } from \"./Obj\"\n\n/**\n * Get the portion of the string after the first occurrence of the given value.\n * \n * @param value \n * @param search \n * @returns \n */\nexport const after = (value: string, search: string): string => {\n if (!search) return value\n const index = value.indexOf(search)\n return index !== -1 ? value.slice(index + search.length) : value\n}\n\n/**\n * Get the portion of the string after the last occurrence of the given value.\n * \n * @param value \n * @param search \n * @returns \n */\nexport const afterLast = (value: string, search: string): string => {\n if (!search) return value\n const lastIndex = value.lastIndexOf(search)\n return lastIndex !== -1 ? value.slice(lastIndex + search.length) : value\n}\n\n/**\n * Get the portion of the string before the first occurrence of the given value.\n * \n * @param value \n * @param search \n * @returns \n */\nexport const before = (value: string, search: string): string => {\n if (!search) return value\n const index = value.indexOf(search)\n return index !== -1 ? value.slice(0, index) : value\n}\n\n/**\n * Get the portion of the string before the last occurrence of the given value.\n * \n * @param value \n * @param search \n * @returns \n */\nexport const beforeLast = (value: string, search: string): string => {\n if (!search) return value\n const lastIndex = value.lastIndexOf(search)\n return lastIndex !== -1 ? value.slice(0, lastIndex) : value\n}\n\n/**\n * Capitalizes the first character of a string.\n *\n * @param str - The input string\n * @returns The string with the first character capitalized\n */\nexport function capitalize (str: string): string {\n if (!str) return '' // Handle empty or undefined strings safely\n return str[0].toUpperCase() + str.slice(1)\n}\n\n\n/**\n * Returns the pluralized form of a word based on the given number.\n *\n * @param word - The word to pluralize\n * @param count - The number determining pluralization\n * @returns Singular if count === 1, otherwise plural form\n */\nexport const pluralize = (word: string, count: number): string => {\n // If count is exactly 1 → singular\n if (count === 1) return word\n\n // Irregular plurals map\n const irregularPlurals: Record<string, string> = {\n foot: 'feet',\n child: 'children',\n mouse: 'mice',\n goose: 'geese',\n person: 'people',\n man: 'men',\n woman: 'women',\n }\n\n // Handle irregular cases first\n if (word in irregularPlurals) {\n return irregularPlurals[word]\n }\n\n // If word ends with consonant + \"y\" → replace \"y\" with \"ies\"\n if (\n word.endsWith('y') &&\n !['a', 'e', 'i', 'o', 'u'].includes(word[word.length - 2]?.toLowerCase() ?? '')\n ) {\n return word.slice(0, -1) + 'ies'\n }\n\n // If word ends in \"s\", \"ss\", \"sh\", \"ch\", \"x\", or \"z\" → add \"es\"\n if (/(s|ss|sh|ch|x|z)$/i.test(word)) {\n return word + 'es'\n }\n\n // Default: just add \"s\"\n return word + 's'\n}\n\n/**\n * Converts a plural English word into its singular form.\n *\n * @param word - The word to singularize\n * @returns The singular form of the word\n */\nexport const singularize = (word: string): string => {\n // Irregular plurals map (reverse of pluralize)\n const irregulars: Record<string, string> = {\n feet: 'foot',\n children: 'child',\n mice: 'mouse',\n geese: 'goose',\n people: 'person',\n men: 'man',\n women: 'woman',\n }\n\n // Handle irregular cases\n if (word in irregulars) return irregulars[word]\n\n // Words ending in \"ies\" → change to \"y\" (e.g., \"bodies\" → \"body\")\n if (/ies$/i.test(word) && word.length > 3) {\n return word.replace(/ies$/i, 'y')\n }\n\n // Words ending in \"es\" after certain consonants → remove \"es\"\n if (/(ches|shes|sses|xes|zes)$/i.test(word)) {\n return word.replace(/es$/i, '')\n }\n\n // Generic case: remove trailing \"s\"\n if (/s$/i.test(word) && word.length > 1) {\n return word.replace(/s$/i, '')\n }\n\n return word\n}\n\n/**\n * Converts a string into a slug format.\n * Handles camelCase, spaces, and non-alphanumeric characters.\n *\n * @param str - The input string to slugify\n * @param joiner - The character used to join words (default: \"_\")\n * @returns A slugified string\n */\nexport const slugify = (str: string, joiner = '_'): string => {\n return str\n // Handle camelCase by adding joiner between lowercase → uppercase\n .replace(/([a-z])([A-Z])/g, `$1${joiner}$2`)\n // Replace spaces and non-alphanumeric characters with joiner\n .replace(/[\\s\\W]+/g, joiner)\n // Remove duplicate joiners\n .replace(new RegExp(`${joiner}{2,}`, 'g'), joiner)\n // Trim joiners from start/end\n .replace(new RegExp(`^${joiner}|${joiner}$`, 'g'), '')\n .toLowerCase()\n}\n\n/**\n * Truncates a string to a specified length and appends an ellipsis if needed.\n *\n * @param str - The input string\n * @param len - Maximum length of the result (including ellipsis)\n * @param ellipsis - String to append if truncated (default: \"...\")\n * @returns The truncated string\n */\nexport const subString = (\n str: string,\n len: number,\n ellipsis: string = '...'\n): string => {\n if (!str) return ''\n if (len <= ellipsis.length) return ellipsis // Avoid negative slicing\n\n return str.length > len\n ? str.substring(0, len - ellipsis.length).trimEnd() + ellipsis\n : str\n}\n\n/**\n * Replaces placeholders in a string with corresponding values from a data object.\n * \n * Example:\n * substitute(\"Hello { user.name }!\", { user: { name: \"John\" } })\n * // \"Hello John!\"\n *\n * @param str - The string containing placeholders wrapped in { } braces.\n * @param data - Object containing values to substitute. Supports nested keys via dot notation.\n * @param def - Default value to use if a key is missing. (Optional)\n * @returns The substituted string or undefined if the input string or data is invalid.\n */\nexport const substitute = (\n str: string,\n data: Record<string, unknown> = {},\n def?: string\n): string | undefined => {\n if (!str || !data) return undefined\n\n // Matches { key } or { nested.key } placeholders\n const regex = /{\\s*([a-zA-Z0-9_.]+)\\s*}/g\n\n // Flatten the data so we can directly access dot notation keys\n const flattened = dot(data)\n\n // Replace each placeholder with its value or the default\n const out = str.replace(regex, (_, key: string) => {\n const value = flattened[key]\n return value !== undefined ? String(value) : def ?? ''\n })\n\n return out\n}\n\n/**\n * Truncates a string to a specified length, removing HTML tags and \n * appending a suffix if the string exceeds the length.\n *\n * @param str - The string to truncate\n * @param len - Maximum length (default: 20)\n * @param suffix - Suffix to append if truncated (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (\n str: string,\n len: number = 20,\n suffix: string = '...'\n): string => {\n if (!str) return ''\n\n // Remove any HTML tags\n const clean = str.replace(/<[^>]+>/g, '')\n\n // Determine if we need to truncate\n const truncated =\n clean.length > len\n ? clean.substring(0, len - suffix.length) + suffix\n : clean\n\n // Normalize spaces and line breaks\n return truncated\n .replace(/\\n/g, ' ') // Replace all line breaks\n .replace(new RegExp(`\\\\s+${suffix.replace(/\\./g, '\\\\.')}$`), suffix) // Avoid extra space before suffix\n}\n\n","/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Contracts/ObjContract';\nexport * from './Contracts/StrContract';\nexport * from './Helpers/Arr';\nexport * from './Helpers/Number';\nexport * from './Helpers/Obj';\nexport * from './Helpers/Str';\n","import { getQuery, getRouterParams, readBody, type H3Event } from 'h3'\nimport { DotNestedKeys, DotNestedValue, safeDot } from '@h3ravel/support'\n\nexport class Request {\n private readonly event: H3Event\n\n constructor(event: H3Event) {\n this.event = event\n }\n\n /**\n * Get all input data (query + body).\n */\n async all<T = Record<string, unknown>> (): Promise<T> {\n let data = {\n ...getRouterParams(this.event),\n ...getQuery(this.event),\n } as T\n\n if (this.event.req.method === 'POST') {\n data = Object.assign({}, data, Object.fromEntries((await this.event.req.formData()).entries()))\n } else if (this.event.req.method === 'PUT') {\n data = <never>Object.fromEntries(Object.entries(<never>await readBody(this.event)))\n }\n\n return data\n }\n\n /**\n * Get a single input field from query or body.\n */\n async input<T = unknown> (key: string, defaultValue?: T): Promise<T> {\n const data = await this.all<Record<string, T>>()\n return (data[key] ?? defaultValue) as T\n }\n\n /**\n * Get route parameters.\n */\n params<T = Record<string, string>> (): T {\n return getRouterParams(this.event) as T\n }\n\n /**\n * Get query parameters.\n */\n query<T = Record<string, string>> (): T {\n return getQuery(this.event) as T\n }\n\n /**\n * Get the base event\n */\n getEvent (): H3Event\n getEvent<K extends DotNestedKeys<H3Event>> (key: K): DotNestedValue<H3Event, K>\n getEvent<K extends DotNestedKeys<H3Event>> (key?: K): any {\n return safeDot(this.event, key)\n }\n}\n","import { DotNestedKeys, DotNestedValue, safeDot } from '@h3ravel/support'\nimport { html, redirect, } from 'h3'\n\nimport type { H3Event } from 'h3'\n\nexport class Response {\n private readonly event: H3Event\n private statusCode: number = 200\n private headers: Record<string, string> = {}\n\n constructor(event: H3Event) {\n this.event = event\n }\n\n /**\n * Set HTTP status code.\n */\n setStatusCode (code: number): this {\n this.statusCode = code\n this.event.res.status = code\n return this\n }\n\n /**\n * Set a header.\n */\n setHeader (name: string, value: string): this {\n this.headers[name] = value\n return this\n }\n\n html (content: string): string {\n this.applyHeaders()\n return html(this.event, content)\n }\n\n /**\n * Send a JSON response.\n */\n json<T = unknown> (data: T): T {\n this.setHeader(\"content-type\", \"application/json; charset=utf-8\")\n this.applyHeaders()\n return data\n }\n\n /**\n * Send plain text.\n */\n text (data: string): string {\n this.setHeader(\"content-type\", \"text/plain; charset=utf-8\")\n this.applyHeaders()\n return data;\n }\n\n /**\n * Redirect to another URL.\n */\n redirect (url: string, status = 302): string {\n this.setStatusCode(status)\n return redirect(this.event, url, this.statusCode)\n }\n\n /**\n * Apply headers before sending response.\n */\n private applyHeaders (): void {\n Object.entries(this.headers).forEach(([key, value]) => {\n this.event.res.headers.set(key, value)\n })\n }\n\n /**\n * Get the base event\n */\n getEvent (): H3Event\n getEvent<K extends DotNestedKeys<H3Event>> (key: K): DotNestedValue<H3Event, K>\n getEvent<K extends DotNestedKeys<H3Event>> (key?: K): any {\n return safeDot(this.event, key)\n }\n}\n","import { HttpContext } from \"./HttpContract\"\n\n/**\n * Defines the contract for all controllers.\n * Any controller implementing this must define these methods.\n */\nexport interface IController {\n show (ctx: HttpContext): any\n index (ctx: HttpContext): any\n store (ctx: HttpContext): any\n update (ctx: HttpContext): any\n destroy (ctx: HttpContext): any\n}\n","import { Request } from \"../Request\"\nimport { Response } from \"../Response\"\n\nexport interface HttpContext {\n request: Request\n response: Response\n}\n","import { HttpContext, Middleware } from '@h3ravel/http'\n\nexport class LogRequests extends Middleware {\n async handle ({ request }: HttpContext, next: () => Promise<unknown>): Promise<unknown> {\n const url = request.getEvent('url')\n console.log(`[${request.getEvent('method')}] ${url.pathname + url.search}`)\n return next()\n }\n}\n","import { H3, serve } from 'h3'\n\nimport { ServiceProvider } from '@h3ravel/core'\n\n/**\n * Sets up HTTP kernel and request lifecycle.\n * \n * Register Request, Response, and Middleware classes.\n * Configure global middleware stack.\n * Boot HTTP kernel.\n * \n * Auto-Registered\n */\nexport class HttpServiceProvider extends ServiceProvider {\n register () {\n this.app.singleton('http.app', () => {\n return new H3()\n })\n\n this.app.singleton('http.serve', () => serve)\n }\n}\n","import { EventHandlerRequest, H3Event } from \"h3\";\n\nexport interface Resource {\n [key: string]: any;\n pagination?: {\n from?: number | undefined;\n to?: number | undefined;\n perPage?: number | undefined;\n total?: number | undefined;\n } | undefined;\n}\n\ntype BodyResource = Resource & {\n data: Omit<Resource, 'pagination'>,\n meta?: {\n pagination?: Resource['pagination']\n } | undefined;\n}\n\n/**\n * Class to render API resource\n */\nexport class JsonResource<R extends Resource = any> {\n /**\n * The request instance\n */\n request: H3Event<EventHandlerRequest>['req'];\n /**\n * The response instance\n */\n response: H3Event['res'];\n /**\n * The data to send to the client\n */\n resource: R;\n /**\n * The final response data object\n */\n body: BodyResource = {\n data: {},\n };\n /**\n * Flag to track if response should be sent automatically\n */\n private shouldSend: boolean = false;\n /**\n * Flag to track if response has been sent\n */\n\n private responseSent: boolean = false;\n\n /**\n * Declare that this includes R's properties\n */\n [key: string]: any;\n\n /**\n * @param req The request instance\n * @param res The response instance\n * @param rsc The data to send to the client\n */\n constructor(private event: H3Event, rsc: R) {\n this.request = event.req;\n this.response = event.res;\n this.resource = rsc;\n\n // Copy all properties from rsc to this, avoiding conflicts\n for (const key of Object.keys(rsc)) {\n if (!(key in this)) {\n Object.defineProperty(this, key, {\n enumerable: true,\n configurable: true,\n get: () => this.resource[key],\n set: (value) => {\n (<any>this.resource)[key] = value;\n },\n });\n }\n }\n }\n\n /**\n * Return the data in the expected format\n * \n * @returns \n */\n data (): Resource {\n return this.resource\n }\n\n /**\n * Build the response object\n * @returns this\n */\n json () {\n // Indicate response should be sent automatically\n this.shouldSend = true;\n\n // Set default status code\n this.response.status = 200;\n\n // Prepare body\n const resource = this.data()\n let data: Resource = Array.isArray(resource) ? [...resource] : { ...resource };\n\n if (typeof data.data !== 'undefined') {\n data = data.data\n }\n\n if (!Array.isArray(resource)) {\n delete data.pagination;\n }\n\n this.body = {\n data,\n };\n\n // Set the pagination from the data() resource, if available\n if (!Array.isArray(resource) && resource.pagination) {\n const meta: BodyResource['meta'] = this.body.meta ?? {}\n meta.pagination = resource.pagination;\n this.body.meta = meta;\n }\n\n // If pagination is not available on the resource, then check and set it\n // if it's available on the base resource.\n if (this.resource.pagination && !this.body.meta?.pagination) {\n const meta: BodyResource['meta'] = this.body.meta ?? {}\n meta.pagination = this.resource.pagination;\n this.body.meta = meta;\n }\n\n return this;\n }\n\n /**\n * Add context data to the response object\n * @param data Context data\n * @returns this\n */\n additional<X extends { [key: string]: any }> (data: X) {\n\n // Allow automatic send after additional\n this.shouldSend = true;\n\n // Merge data with body\n delete data.data;\n delete data.pagination;\n\n this.body = {\n ...this.body,\n ...data,\n };\n\n return this;\n }\n\n /**\n * Send the output to the client\n * @returns this\n */\n send () {\n this.shouldSend = false; // Prevent automatic send\n if (!this.responseSent) {\n this.#send();\n }\n return this;\n }\n\n /**\n * Set the status code for this response\n * @param code Status code\n * @returns this\n */\n status (code: number) {\n this.response.status = code;\n return this;\n }\n\n /**\n * Private method to send the response\n */\n #send () {\n if (!this.responseSent) {\n this.event.context.\n this.response.json(this.body);\n\n // Mark response as sent\n this.responseSent = true;\n }\n }\n\n /**\n * Check if send should be triggered automatically\n */\n private checkSend () {\n if (this.shouldSend && !this.responseSent) {\n this.#send();\n }\n }\n}\n","import { JsonResource, Resource } from \"./JsonResource\";\n\nimport { H3Event } from \"h3\";\n\nexport function ApiResource (\n instance: JsonResource\n) {\n return new Proxy(instance, {\n get (target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'function') {\n // Intercept json, additional, and send methods\n if (prop === 'json' || prop === 'additional') {\n return (...args: any[]) => {\n const result = value.apply(target, args);\n // Schedule checkSend after json or additional\n setImmediate(() => target['checkSend']());\n return result;\n };\n } else if (prop === 'send') {\n return (...args: any[]) => {\n // Prevent checkSend from firing\n target['shouldSend'] = false;\n\n return value.apply(target, args);\n };\n }\n }\n return value;\n },\n });\n}\n\nexport default function BaseResource<R extends Resource> (\n evt: H3Event,\n rsc: R\n) {\n return ApiResource(new JsonResource<R>(evt, rsc))\n}\n","/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Middleware';\nexport * from './Request';\nexport * from './Response';\nexport * from './Contracts/ControllerContracts';\nexport * from './Contracts/HttpContract';\nexport * from './Middleware/LogRequests';\nexport * from './Providers/HttpServiceProvider';\nexport * from './Resources/ApiResource';\nexport * from './Resources/JsonResource';\n","import { DotNestedKeys, DotNestedValue, safeDot, setNested } from '@h3ravel/support'\n\nimport { Application } from \"@h3ravel/core\";\nimport path from 'node:path'\nimport { readdir } from 'node:fs/promises'\n\nexport class ConfigRepository {\n private loaded: boolean = false\n private configs: Record<string, Record<string, any>> = {}\n\n constructor(private app: Application) { }\n\n // get<X extends Record<string, any>> (): X\n // get<X extends Record<string, any>, T extends Extract<keyof X, string>> (key: T): X[T]\n\n /**\n * Get the defined configurations\n */\n get<X extends Record<string, any>> (): X\n get<X extends Record<string, any>, K extends DotNestedKeys<X>> (key: K, def?: any): DotNestedValue<X, K>\n get<X extends Record<string, any>, K extends DotNestedKeys<X>> (key?: K, def?: any): any {\n return safeDot(this.configs, key) ?? def\n }\n\n /**\n * Modify the defined configurations\n */\n set<T extends string> (key: T, value: any): void {\n setNested(this.configs, key, value)\n }\n\n async load () {\n if (!this.loaded) {\n const configPath = this.app.getPath('config')\n\n const files = await readdir(configPath);\n\n for (let i = 0; i < files.length; i++) {\n const configModule = await import(path.join(configPath, files[i]))\n const name = files[i].replaceAll(/.ts|js/g, '')\n if (typeof configModule.default === 'function') {\n this.configs[name] = configModule.default(this.app)\n }\n }\n\n this.loaded = true\n }\n\n return this\n }\n}\n","import { DotNestedKeys, DotNestedValue, safeDot } from '@h3ravel/support'\n\nimport { Application } from \"@h3ravel/core\";\n\nexport class EnvLoader {\n constructor(private _app: Application) { }\n\n /**\n * Get the defined environment vars\n */\n get<X extends NodeJS.ProcessEnv> (): X\n get<X extends NodeJS.ProcessEnv, K extends DotNestedKeys<X>> (key: K, def?: any): DotNestedValue<X, K>\n get<X extends NodeJS.ProcessEnv, K extends DotNestedKeys<X>> (key?: K, def?: any): any {\n return safeDot(process.env, key) ?? def\n }\n}\n","export default class { }\n","{\n \"name\": \"dotenv\",\n \"version\": \"17.2.1\",\n \"description\": \"Loads environment variables from .env file\",\n \"main\": \"lib/main.js\",\n \"types\": \"lib/main.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/main.d.ts\",\n \"require\": \"./lib/main.js\",\n \"default\": \"./lib/main.js\"\n },\n \"./config\": \"./config.js\",\n \"./config.js\": \"./config.js\",\n \"./lib/env-options\": \"./lib/env-options.js\",\n \"./lib/env-options.js\": \"./lib/env-options.js\",\n \"./lib/cli-options\": \"./lib/cli-options.js\",\n \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n \"lint\": \"standard\",\n \"pretest\": \"npm run lint && npm run dts-check\",\n \"test\": \"tap run --allow-empty-coverage --disable-coverage --timeout=60000\",\n \"test:coverage\": \"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov\",\n \"prerelease\": \"npm test\",\n \"release\": \"standard-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/motdotla/dotenv.git\"\n },\n \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n \"funding\": \"https://dotenvx.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \".env\",\n \"environment\",\n \"variables\",\n \"config\",\n \"settings\"\n ],\n \"readmeFilename\": \"README.md\",\n \"license\": \"BSD-2-Clause\",\n \"devDependencies\": {\n \"@types/node\": \"^18.11.3\",\n \"decache\": \"^4.6.2\",\n \"sinon\": \"^14.0.1\",\n \"standard\": \"^17.0.0\",\n \"standard-version\": \"^9.5.0\",\n \"tap\": \"^19.2.0\",\n \"typescript\": \"^4.8.4\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"browser\": {\n \"fs\": false\n }\n}\n","const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\n// Array of tips to display randomly\nconst TIPS = [\n '🔐 encrypt with Dotenvx: https://dotenvx.com',\n '🔐 prevent committing .env to code: https://dotenvx.com/precommit',\n '🔐 prevent building .env in docker: https://dotenvx.com/prebuild',\n '📡 observe env with Radar: https://dotenvx.com/radar',\n '📡 auto-backup env with Radar: https://dotenvx.com/radar',\n '📡 version env with Radar: https://dotenvx.com/radar',\n '🛠️ run anywhere with `dotenvx run -- yourcommand`',\n '⚙️ specify custom .env file path with { path: \\'/custom/path/.env\\' }',\n '⚙️ enable debug logging with { debug: true }',\n '⚙️ override existing env vars with { override: true }',\n '⚙️ suppress all logs with { quiet: true }',\n '⚙️ write to custom object with { processEnv: myObject }',\n '⚙️ load multiple .env files with { path: [\\'.env.local\\', \\'.env\\'] }'\n]\n\n// Get a random tip from the tips array\nfunction _getRandomTip () {\n return TIPS[Math.floor(Math.random() * TIPS.length)]\n}\n\nfunction parseBoolean (value) {\n if (typeof value === 'string') {\n return !['false', '0', 'no', 'off', ''].includes(value.toLowerCase())\n }\n return Boolean(value)\n}\n\nfunction supportsAnsi () {\n return process.stdout.isTTY // && process.env.TERM !== 'dumb'\n}\n\nfunction dim (text) {\n return supportsAnsi() ? `\\x1b[2m${text}\\x1b[0m` : text\n}\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n options = options || {}\n\n const vaultPath = _vaultPath(options)\n options.path = vaultPath // parse .env.vault\n const result = DotenvModule.configDotenv(options)\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _warn (message) {\n console.error(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _log (message) {\n console.log(`[dotenv@${version}] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n const debug = parseBoolean(process.env.DOTENV_CONFIG_DEBUG || (options && options.debug))\n const quiet = parseBoolean(process.env.DOTENV_CONFIG_QUIET || (options && options.quiet))\n\n if (debug || !quiet) {\n _log('Loading env from encrypted .env.vault')\n }\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n let debug = parseBoolean(processEnv.DOTENV_CONFIG_DEBUG || (options && options.debug))\n let quiet = parseBoolean(processEnv.DOTENV_CONFIG_QUIET || (options && options.quiet))\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n const populated = DotenvModule.populate(processEnv, parsedAll, options)\n\n // handle user settings DOTENV_CONFIG_ options inside .env file(s)\n debug = parseBoolean(processEnv.DOTENV_CONFIG_DEBUG || debug)\n quiet = parseBoolean(processEnv.DOTENV_CONFIG_QUIET || quiet)\n\n if (debug || !quiet) {\n const keysCount = Object.keys(populated).length\n const shortPaths = []\n for (const filePath of optionPaths) {\n try {\n const relative = path.relative(process.cwd(), filePath)\n shortPaths.push(relative)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${filePath} ${e.message}`)\n }\n lastError = e\n }\n }\n\n _log(`injecting env (${keysCount}) from ${shortPaths.join(',')} ${dim(`-- tip: ${_getRandomTip()}`)}`)\n }\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n const populated = {}\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n populated[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n populated[key] = parsed[key]\n }\n }\n\n return populated\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n","import { Bindings, ServiceProvider } from '@h3ravel/core'\nimport { ConfigRepository, EnvLoader } from '..'\n\nimport { config as loadEnv } from 'dotenv'\n\n/**\n * Loads configuration and environment files.\n * \n * Load .env and merge with config files.\n * Bind ConfigRepository to the container.\n * \n * Auto-Registered\n */\nexport class ConfigServiceProvider extends ServiceProvider {\n async register () {\n\n loadEnv()\n\n /**\n * Create singleton to load env\n */\n this.app.singleton('env', () => {\n return new EnvLoader(this.app).get\n })\n\n /**\n * Initialize the configuration through the repository\n */\n const repo = new ConfigRepository(this.app)\n await repo.load()\n\n /**\n * Create singleton to load configurations\n */\n this.app.singleton('config', () => {\n return {\n get: (key, def) => repo.get(key as any, def),\n set: repo.set\n } as Bindings['config']\n })\n\n this.app.make('http.app').use(e => {\n repo.set('app.url', e.url.origin)\n })\n }\n}\n","/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './ConfigRepository';\nexport * from './EnvLoader';\nexport * from './Helpers';\nexport * from './Providers/ConfigServiceProvider';\n","export default class { }\n","export default class { }\n","import { H3Event, Middleware, MiddlewareOptions, type H3 } from 'h3'\nimport { Application, Controller, Kernel } from '@h3ravel/core'\nimport { Middleware as HttpMiddleware } from '@h3ravel/http'\nimport { HttpContext } from '@h3ravel/http'\nimport { afterLast } from '@h3ravel/support'\n\ntype EventHandler = (ctx: HttpContext) => unknown\n\ninterface RouteDefinition {\n method: string\n path: string\n name?: string\n handler: EventHandler\n}\n\nexport class Router {\n private routes: RouteDefinition[] = []\n private groupPrefix = ''\n private groupMiddleware: EventHandler[] = []\n\n constructor(private h3App: H3, private app: Application) { }\n\n /**\n * Route Resolver\n * \n * @param handler \n * @param middleware \n * @returns \n */\n private resolveHandler (handler: EventHandler, middleware: HttpMiddleware[] = []) {\n return async (event: H3Event) => {\n const kernel = new Kernel(middleware)\n return kernel.handle(event, (ctx) => Promise.resolve(handler(ctx)))\n }\n }\n\n /**\n * Add a route to the stack\n * \n * @param method \n * @param path \n * @param handler \n * @param name \n * @param middleware \n */\n private addRoute (\n method: string,\n path: string,\n handler: EventHandler,\n name?: string,\n middleware: HttpMiddleware[] = []\n ) {\n const fullPath = `${this.groupPrefix}${path}`.replace(/\\/+/g, '/')\n this.routes.push({ method, path: fullPath, name, handler })\n this.h3App[method as 'get'](fullPath, this.resolveHandler(handler, middleware))\n }\n\n private resolveControllerOrHandler (\n handler: EventHandler | (new (...args: any[]) => Controller),\n methodName?: string\n ): EventHandler {\n if (typeof handler === 'function' && (handler as any).prototype instanceof Controller) {\n return (ctx) => {\n const controller = new (handler as new (...args: any[]) => Controller)(this.app)\n const action = (methodName || 'index') as keyof Controller\n\n if (typeof controller[action] !== 'function') {\n throw new Error(`Method \"${action}\" not found on controller ${handler.name}`)\n }\n\n return controller[action](ctx)\n }\n }\n\n return handler as EventHandler\n }\n\n\n get (\n path: string,\n handler: EventHandler | (new (...args: any[]) => Controller),\n methodName?: string, name?: string, middleware: HttpMiddleware[] = []\n ) {\n this.addRoute('get', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n post (\n path: string,\n handler: EventHandler | (new (...args: any[]) => Controller),\n methodName?: string, name?: string, middleware: HttpMiddleware[] = []\n ) {\n this.addRoute('post', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n put (\n path: string,\n handler: EventHandler | (new (...args: any[]) => Controller),\n methodName?: string, name?: string, middleware: HttpMiddleware[] = []\n ) {\n this.addRoute('put', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n delete (\n path: string,\n handler: EventHandler | (new (...args: any[]) => Controller),\n methodName?: string, name?: string, middleware: HttpMiddleware[] = []\n ) {\n this.addRoute('delete', path, this.resolveControllerOrHandler(handler, methodName), name, middleware)\n }\n\n /**\n * API Resource support \n * \n * @param path \n * @param controller \n */\n apiResource (\n path: string,\n Controller: new (app: Application) => Controller,\n middleware: HttpMiddleware[] = []\n ) {\n path = path.replace(/\\//g, '/')\n\n const name = afterLast(path, '/')\n const basePath = `/${path}`.replace(/\\/+/g, '/')\n\n const controller = new Controller(this.app)\n\n this.addRoute('get', basePath, controller.index.bind(controller), `${name}.index`, middleware)\n this.addRoute('post', basePath, controller.store.bind(controller), `${name}.store`, middleware)\n this.addRoute('get', `${basePath}/:id`, controller.show.bind(controller), `${name}.show`, middleware)\n this.addRoute('put', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('patch', `${basePath}/:id`, controller.update.bind(controller), `${name}.update`, middleware)\n this.addRoute('delete', `${basePath}/:id`, controller.destroy.bind(controller), `${name}.destroy`, middleware)\n }\n\n /**\n * Named route URL generator\n * \n * @param name \n * @param params \n * @returns \n */\n route (name: string, params: Record<string, string> = {}): string | undefined {\n const found = this.routes.find(r => r.name === name)\n if (!found) return undefined\n\n let url = found.path\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, value)\n }\n return url\n }\n\n /**\n * Grouping\n * \n * @param options \n * @param callback \n */\n group (options: { prefix?: string; middleware?: EventHandler[] }, callback: () => void) {\n const prevPrefix = this.groupPrefix\n const prevMiddleware = [...this.groupMiddleware]\n\n this.groupPrefix += options.prefix || ''\n this.groupMiddleware.push(...(options.middleware || []))\n\n callback()\n\n /**\n * Restore state after group\n */\n this.groupPrefix = prevPrefix\n this.groupMiddleware = prevMiddleware\n }\n\n middleware (path: string, handler: Middleware, opts?: MiddlewareOptions) {\n this.h3App.use(path, handler, opts)\n }\n}\n","export default class { }\n","export default class { }\n","export default class { }\n","export default class { }\n","export default class { }\n","import { readFile, stat } from \"node:fs/promises\";\n\nimport { ServiceProvider } from '@h3ravel/core'\nimport { before } from \"@h3ravel/support\";\nimport { join } from \"node:path\";\nimport { serveStatic } from 'h3'\nimport { statSync } from \"node:fs\";\n\n/**\n * Handles public assets loading\n * \n * Auto-Registered\n */\nexport class AssetsServiceProvider extends ServiceProvider {\n register () {\n const app = this.app.make('router')\n const config = this.app.make('config')\n const fsconfig = config.get('filesystem')\n const publicPath = this.app.getPath('public')\n\n app.middleware(`/${fsconfig.public_mask}/**`, (event) => {\n return serveStatic(event, {\n indexNames: [\"/index.html\"],\n getContents: (id) => {\n const newId = id.replace(`/${fsconfig.public_mask}/`, '')\n return readFile(join(before(publicPath, newId), newId))\n },\n getMeta: async (id) => {\n const newId = id.replace(`/${fsconfig.public_mask}/`, '')\n const stats = await stat(join(before(publicPath, newId), newId)).catch(() => { });\n if (stats?.isFile()) {\n return {\n size: stats.size,\n mtime: stats.mtimeMs,\n };\n }\n },\n });\n })\n\n this.app.singleton('asset', () => {\n return (key: string, def = '') => {\n try {\n statSync(join(before(publicPath, key), key))\n } catch {\n key = def\n }\n\n return join(fsconfig.public_mask, key)\n }\n })\n }\n}\n","import { Router } from '../Router'\nimport { ServiceProvider } from '@h3ravel/core'\nimport path from 'node:path'\nimport { readdir } from 'node:fs/promises'\n\n/**\n * Handles routing registration\n * \n * Load route files (web.ts, api.ts).\n * Map controllers to routes.\n * Register route-related middleware.\n * \n * Auto-Registered\n */\nexport class RouteServiceProvider extends ServiceProvider {\n register () {\n this.app.singleton('router', () => {\n const h3App = this.app.make('http.app')\n return new Router(h3App, this.app)\n })\n }\n\n /**\n * Load routes from src/routes\n */\n async boot () {\n try {\n const routePath = this.app.getPath('routes')\n\n const files = await readdir(routePath);\n\n for (let i = 0; i < files.length; i++) {\n const routesModule = await import(path.join(routePath, files[i]))\n\n if (typeof routesModule.default === 'function') {\n const router = this.app.make('router')\n routesModule.default(router)\n }\n }\n } catch (e) {\n console.warn('No web routes found or failed to load:', e)\n }\n }\n}\n","/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Controller';\nexport * from './Route';\nexport * from './Router';\nexport * from './Decorators/ApiResource';\nexport * from './Decorators/Controller';\nexport * from './Decorators/Get';\nexport * from './Decorators/Middleware';\nexport * from './Decorators/Post';\nexport * from './Providers/AssetsServiceProvider';\nexport * from './Providers/RouteServiceProvider';\n","import { Container } from './Container'\nimport { PathLoader } from './Utils/PathLoader'\nimport { ServiceProvider } from './ServiceProvider'\nimport path from 'node:path'\n\nexport class Application extends Container {\n paths = new PathLoader()\n private booted = false\n private versions = { app: '0', ts: '0' }\n private basePath: string\n\n private providers: ServiceProvider[] = []\n protected externalProviders: Array<new (_app: Application) => ServiceProvider> = []\n\n constructor(basePath: string) {\n super()\n this.basePath = basePath\n this.setPath('base', basePath)\n this.loadOptions()\n this.registerBaseBindings()\n }\n\n /**\n * Register core bindings into the container\n */\n protected registerBaseBindings () {\n this.bind(Application, () => this)\n this.bind('path.base', () => this.basePath)\n this.bind('app.paths', () => this.paths)\n }\n\n /**\n * Dynamically register all configured providers\n */\n public async registerConfiguredProviders () {\n const providers = await this.getAllProviders()\n\n for (const ProviderClass of providers) {\n if (!ProviderClass) continue\n const provider = new ProviderClass(this)\n await this.register(provider)\n }\n }\n\n protected async loadOptions () {\n const app = await this.safeImport(this.getPath('base', 'package.json'))\n const core = await this.safeImport('../package.json')\n\n if (app && app.dependencies) {\n this.versions.app = app.dependencies['@h3ravel/core']\n }\n if (core && core.devDependencies) {\n this.versions.ts = app.devDependencies.typescript\n }\n }\n\n /**\n * Load default and optional providers dynamically\n * \n * Auto-Registration Behavior\n * \n * Minimal App: Loads only core, config, http, router by default.\n * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.\n */\n protected async getConfiguredProviders (): Promise<Array<new (_app: Application) => ServiceProvider>> {\n return [\n (await import('@h3ravel/core')).AppServiceProvider,\n (await import('@h3ravel/http')).HttpServiceProvider,\n (await import('@h3ravel/config')).ConfigServiceProvider,\n (await import('@h3ravel/router')).RouteServiceProvider,\n (await import('@h3ravel/router')).AssetsServiceProvider,\n (await import('@h3ravel/core')).ViewServiceProvider,\n (await this.safeImport('@h3ravel/database'))?.DatabaseServiceProvider,\n (await this.safeImport('@h3ravel/cache'))?.CacheServiceProvider,\n (await this.safeImport('@h3ravel/console'))?.ConsoleServiceProvider,\n (await this.safeImport('@h3ravel/queue'))?.QueueServiceProvider,\n (await this.safeImport('@h3ravel/mail'))?.MailServiceProvider,\n ]\n }\n\n protected async getAllProviders (): Promise<Array<new (_app: Application) => ServiceProvider>> {\n const coreProviders = await this.getConfiguredProviders()\n return [...coreProviders, ...this.externalProviders]\n }\n\n registerProviders (providers: Array<new (_app: Application) => ServiceProvider>): void {\n this.externalProviders.push(...providers)\n }\n\n /**\n * Register a provider\n */\n public async register (provider: ServiceProvider) {\n await provider.register()\n this.providers.push(provider)\n }\n\n /**\n * Boot all providers after registration\n */\n public async boot () {\n if (this.booted) return\n\n for (const provider of this.providers) {\n if (provider.boot) {\n await provider.boot()\n }\n }\n\n this.booted = true\n }\n\n /**\n * Attempt to dynamically import an optional module\n */\n private async safeImport (moduleName: string) {\n try {\n const mod = await import(moduleName)\n return mod.default ?? mod\n } catch {\n return null\n }\n }\n\n /**\n * Get the base path of the app\n * \n * @returns \n */\n getBasePath (): string {\n return this.basePath\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 * @returns \n */\n getPath (name: Parameters<PathLoader['setPath']>[0], pth?: string) {\n return path.join(this.paths.getPath(name, this.basePath), pth ?? '')\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 * @returns \n */\n setPath (name: Parameters<PathLoader['setPath']>[0], path: string) {\n return this.paths.setPath(name, path, this.basePath)\n }\n\n /**\n * Returns the installed version of the system core and typescript.\n *\n * @returns \n */\n getVersion (key: 'app' | 'ts') {\n return this.versions[key]?.replaceAll(/\\^|\\~/g, '')\n }\n}\n","import { HttpContext, IController } from '@h3ravel/http'\n\nimport { Application } from '.'\n\n/**\n * Base controller class\n */\nexport abstract class Controller implements IController {\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n public show (_ctx: HttpContext): any { return }\n public index (_ctx: HttpContext): any { return }\n public store (_ctx: HttpContext): any { return }\n public update (_ctx: HttpContext): any { return }\n public destroy (_ctx: HttpContext): any { return }\n}\n","import { Application } from './Application'\n\nexport abstract class ServiceProvider {\n protected app: Application\n\n constructor(app: Application) {\n this.app = app\n }\n\n /**\n * Register bindings to the container.\n * Runs before boot().\n */\n abstract register (): void | Promise<void>\n\n /**\n * Perform post-registration booting of services.\n * Runs after all providers have been registered.\n */\n boot?(): void | Promise<void>\n}\n","import { DotNestedKeys, DotNestedValue } from \"@h3ravel/support\";\nimport type { H3, serve } from \"h3\";\n\nimport type { Edge } from \"edge.js\";\nimport { PathLoader } from \"../Utils/PathLoader\";\nimport type { Router } from \"@h3ravel/router\";\n\ntype RemoveIndexSignature<T> = {\n [K in keyof T as string extends K\n ? never\n : number extends K\n ? never\n : K]: T[K]\n}\n\nexport type Bindings = {\n [key: string]: any;\n env<T extends string> (): NodeJS.ProcessEnv\n env<T extends string> (key: T, def?: any): any\n view: Edge,\n asset (key: string, def?: string): string,\n router: Router\n config: {\n // get<X extends Record<string, any>> (): X\n // get<X extends Record<string, any>, K extends DotNestedKeys<X>> (key: K, def?: any): DotNestedValue<X, K>\n get<X extends Record<string, any>> (): X\n get<X extends Record<string, any>, T extends Extract<keyof X, string>> (key: T, def?: any): X[T]\n set<T extends string> (key: T, value: any): void\n load?(): any\n }\n 'http.app': H3\n 'path.base': string\n 'app.paths': PathLoader\n 'http.serve': typeof serve\n}\n\nexport type UseKey = keyof RemoveIndexSignature<Bindings>\n","export default class { }\n","import { HttpContext, Middleware, Request, Response } from '@h3ravel/http'\n\nimport type { H3Event } from 'h3'\n\nexport class Kernel {\n constructor(private middleware: Middleware[] = []) { }\n\n async handle (event: H3Event, next: (ctx: HttpContext) => Promise<unknown>): Promise<unknown> {\n const context: HttpContext = {\n request: new Request(event),\n response: new Response(event)\n }\n\n const result = await this.runMiddleware(context, () => next(context))\n\n // Auto-set JSON header if plain object returned\n if (result !== undefined && this.isPlainObject(result)) {\n event.res.headers.set('Content-Type', 'application/json; charset=UTF-8')\n }\n\n return result\n }\n\n private async runMiddleware (context: HttpContext, next: (ctx: HttpContext) => Promise<unknown>) {\n let index = -1\n\n const runner = async (i: number): Promise<unknown> => {\n if (i <= index) throw new Error('next() called multiple times')\n index = i\n const middleware = this.middleware[i]\n\n if (middleware) {\n return middleware.handle(context, () => runner(i + 1))\n } else {\n return next(context)\n }\n }\n\n return runner(0)\n }\n\n private isPlainObject (value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' &&\n value !== null &&\n (value.constructor === Object || value.constructor === Array)\n }\n}\n","import 'reflect-metadata'\n\nimport { ServiceProvider } from '../ServiceProvider'\n\n/**\n * Bootstraps core services and bindings.\n * \n * Bind essential services to the container (logger, config repository).\n * Register app-level singletons.\n * Set up exception handling.\n * \n * Auto-Registered\n */\nexport class AppServiceProvider extends ServiceProvider {\n register () {\n // Core bindings\n }\n}\n","import { Edge } from 'edge.js'\nimport { ServiceProvider } from '@h3ravel/core'\n\nexport class ViewServiceProvider extends ServiceProvider {\n register (): void {\n const config = this.app.make('config')\n const edge = Edge.create({\n cache: process.env.NODE_ENV === 'production'\n })\n\n edge.mount(this.app.getPath('views'))\n\n edge.global('asset', this.app.make('asset'))\n edge.global('config', config.get)\n edge.global('app', this.app)\n\n this.app.bind('view', () => edge)\n }\n}\n","/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Application';\nexport * from './Container';\nexport * from './Controller';\nexport * from './ServiceProvider';\nexport * from './Contracts/BindingsContract';\nexport * from './Exceptions/Handler';\nexport * from './Http/Kernel';\nexport * from './Providers/AppServiceProvider';\nexport * from './Providers/ViewServiceProvider';\nexport * from './Utils/PathLoader';\n"],"mappings":"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","names":["Container","bindings","Map","singletons","bind","key","factory","set","singleton","has","get","make","build","Error","name","ClassType","paramTypes","Reflect","getMetadata","dependencies","map","dep","PathLoader","paths","base","views","assets","routes","config","public","storage","getPath","name","nodepath","join","setPath","path","Middleware","safeDot","data","key","split","reduce","acc","k","setNested","obj","value","includes","parts","current","i","length","part","afterLast","before","value","search","lastIndex","lastIndexOf","slice","length","index","indexOf","Request","event","all","data","getRouterParams","getQuery","req","method","Object","assign","fromEntries","formData","entries","readBody","input","key","defaultValue","params","query","getEvent","safeDot","import_h3","Response","event","statusCode","headers","setStatusCode","code","res","status","setHeader","name","value","html","content","applyHeaders","json","data","text","redirect","url","Object","entries","forEach","key","set","getEvent","safeDot","LogRequests","init_src","Middleware","handle","request","next","url","getEvent","console","log","pathname","search","import_h3","HttpServiceProvider","ServiceProvider","register","app","singleton","H3","serve","JsonResource","request","response","resource","body","data","shouldSend","responseSent","event","rsc","req","res","key","Object","keys","defineProperty","enumerable","configurable","get","set","value","json","status","Array","isArray","pagination","meta","additional","send","code","context","this","checkSend","ApiResource","instance","Proxy","get","target","prop","receiver","value","Reflect","args","result","apply","setImmediate","init_src","ConfigRepository","loaded","configs","app","get","key","def","safeDot","set","value","setNested","load","configPath","getPath","files","readdir","i","length","configModule","path","join","name","replaceAll","default","EnvLoader","_app","get","key","def","safeDot","process","env","exports","module","exports","module","fs","require","path","os","crypto","packageJson","version","TIPS","_getRandomTip","Math","floor","random","length","parseBoolean","value","includes","toLowerCase","Boolean","supportsAnsi","process","stdout","isTTY","dim","text","LINE","parse","src","obj","lines","toString","replace","match","exec","key","trim","maybeQuote","_parseVault","options","vaultPath","_vaultPath","result","DotenvModule","configDotenv","parsed","err","Error","code","keys","_dotenvKey","split","decrypted","i","attrs","_instructions","decrypt","ciphertext","error","_warn","message","console","_debug","log","_log","DOTENV_KEY","env","dotenvKey","uri","URL","password","environment","searchParams","get","environmentKey","toUpperCase","possibleVaultPath","Array","isArray","filepath","existsSync","endsWith","resolve","cwd","_resolveHome","envPath","join","homedir","slice","_configVault","debug","DOTENV_CONFIG_DEBUG","quiet","DOTENV_CONFIG_QUIET","processEnv","populate","dotenvPath","encoding","optionPaths","push","lastError","parsedAll","readFileSync","e","populated","keysCount","Object","shortPaths","filePath","relative","config","encrypted","keyStr","Buffer","from","nonce","subarray","authTag","aesgcm","createDecipheriv","setAuthTag","update","final","isRange","RangeError","invalidKeyLength","decryptionFailed","override","prototype","hasOwnProperty","call","ConfigServiceProvider","init_src","ServiceProvider","register","loadEnv","app","singleton","EnvLoader","get","repo","ConfigRepository","load","key","def","set","make","use","e","url","origin","src_exports","init_src","Router","routes","groupPrefix","groupMiddleware","h3App","app","resolveHandler","handler","middleware","event","kernel","Kernel","handle","ctx","Promise","resolve","addRoute","method","path","name","fullPath","replace","push","resolveControllerOrHandler","methodName","prototype","Controller","controller","action","Error","get","post","put","delete","apiResource","afterLast","basePath","index","bind","store","show","update","destroy","route","params","found","find","r","undefined","url","key","value","Object","entries","group","options","callback","prevPrefix","prevMiddleware","prefix","opts","use","init_ApiResource","init_Controller","init_Middleware","import_promises","import_node_path","import_h3","AssetsServiceProvider","ServiceProvider","register","app","make","config","fsconfig","get","publicPath","getPath","middleware","public_mask","event","serveStatic","indexNames","getContents","id","newId","replace","readFile","join","before","getMeta","stats","stat","catch","isFile","size","mtime","mtimeMs","singleton","key","def","statSync","import_node_path","import_promises","RouteServiceProvider","ServiceProvider","register","app","singleton","h3App","make","Router","boot","routePath","getPath","files","readdir","i","length","routesModule","path","join","default","router","e","console","warn","src_exports","init_src","init_ApiResource","init_Controller","init_Middleware","import_node_path","Application","Container","paths","PathLoader","booted","versions","app","ts","basePath","providers","externalProviders","setPath","loadOptions","registerBaseBindings","bind","registerConfiguredProviders","getAllProviders","ProviderClass","provider","register","safeImport","getPath","core","dependencies","devDependencies","typescript","getConfiguredProviders","AppServiceProvider","HttpServiceProvider","ConfigServiceProvider","RouteServiceProvider","AssetsServiceProvider","ViewServiceProvider","DatabaseServiceProvider","CacheServiceProvider","ConsoleServiceProvider","QueueServiceProvider","MailServiceProvider","coreProviders","registerProviders","push","boot","moduleName","mod","default","getBasePath","name","pth","path","join","getVersion","key","replaceAll","Controller","init_Controller","app","show","_ctx","index","store","update","destroy","ServiceProvider","app","Kernel","init_src","middleware","handle","event","next","context","request","Request","response","Response","result","runMiddleware","undefined","isPlainObject","res","headers","set","index","runner","i","Error","value","Object","Array","AppServiceProvider","ServiceProvider","register","ViewServiceProvider","ServiceProvider","register","config","app","make","edge","Edge","create","cache","process","env","NODE_ENV","mount","getPath","global","get","bind","init_Controller"]}
@@ -0,0 +1,352 @@
1
+ import { H3Event, H3, Middleware as Middleware$1, MiddlewareOptions, serve } from 'h3';
2
+ import { Edge } from 'edge.js';
3
+
4
+ type PathName = 'views' | 'routes' | 'assets' | 'base' | 'public' | 'storage' | 'config';
5
+ declare class PathLoader {
6
+ private paths;
7
+ /**
8
+ * Dynamically retrieves a path property from the class.
9
+ * Any property ending with "Path" is accessible automatically.
10
+ *
11
+ * @param name - The base name of the path property
12
+ * @param base - The base path to include to the path
13
+ * @returns
14
+ */
15
+ getPath(name: PathName, base?: string): string;
16
+ /**
17
+ * Programatically set the paths.
18
+ *
19
+ * @param name - The base name of the path property
20
+ * @param path - The new path
21
+ * @param base - The base path to include to the path
22
+ */
23
+ setPath(name: PathName, path: string, base?: string): void;
24
+ }
25
+
26
+ /**
27
+ * Builds "nested.key" paths for autocompletion
28
+ */
29
+ type DotNestedKeys<T> = {
30
+ [K in keyof T & string]: T[K] extends object ? `${K}` | `${K}.${DotNestedKeys<T[K]>}` : `${K}`;
31
+ }[keyof T & string];
32
+ /**
33
+ * Retrieves type at a given dot-path
34
+ */
35
+ type DotNestedValue<T, Path extends string> = Path extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? DotNestedValue<T[Key], Rest> : never : Path extends keyof T ? T[Path] : never;
36
+
37
+ declare class Request {
38
+ private readonly event;
39
+ constructor(event: H3Event);
40
+ /**
41
+ * Get all input data (query + body).
42
+ */
43
+ all<T = Record<string, unknown>>(): Promise<T>;
44
+ /**
45
+ * Get a single input field from query or body.
46
+ */
47
+ input<T = unknown>(key: string, defaultValue?: T): Promise<T>;
48
+ /**
49
+ * Get route parameters.
50
+ */
51
+ params<T = Record<string, string>>(): T;
52
+ /**
53
+ * Get query parameters.
54
+ */
55
+ query<T = Record<string, string>>(): T;
56
+ /**
57
+ * Get the base event
58
+ */
59
+ getEvent(): H3Event;
60
+ getEvent<K extends DotNestedKeys<H3Event>>(key: K): DotNestedValue<H3Event, K>;
61
+ }
62
+
63
+ declare class Response {
64
+ private readonly event;
65
+ private statusCode;
66
+ private headers;
67
+ constructor(event: H3Event);
68
+ /**
69
+ * Set HTTP status code.
70
+ */
71
+ setStatusCode(code: number): this;
72
+ /**
73
+ * Set a header.
74
+ */
75
+ setHeader(name: string, value: string): this;
76
+ html(content: string): string;
77
+ /**
78
+ * Send a JSON response.
79
+ */
80
+ json<T = unknown>(data: T): T;
81
+ /**
82
+ * Send plain text.
83
+ */
84
+ text(data: string): string;
85
+ /**
86
+ * Redirect to another URL.
87
+ */
88
+ redirect(url: string, status?: number): string;
89
+ /**
90
+ * Apply headers before sending response.
91
+ */
92
+ private applyHeaders;
93
+ /**
94
+ * Get the base event
95
+ */
96
+ getEvent(): H3Event;
97
+ getEvent<K extends DotNestedKeys<H3Event>>(key: K): DotNestedValue<H3Event, K>;
98
+ }
99
+
100
+ interface HttpContext {
101
+ request: Request;
102
+ response: Response;
103
+ }
104
+
105
+ declare abstract class Middleware {
106
+ abstract handle(context: HttpContext, next: () => Promise<unknown>): Promise<unknown>;
107
+ }
108
+
109
+ /**
110
+ * Defines the contract for all controllers.
111
+ * Any controller implementing this must define these methods.
112
+ */
113
+ interface IController {
114
+ show(ctx: HttpContext): any;
115
+ index(ctx: HttpContext): any;
116
+ store(ctx: HttpContext): any;
117
+ update(ctx: HttpContext): any;
118
+ destroy(ctx: HttpContext): any;
119
+ }
120
+
121
+ type EventHandler = (ctx: HttpContext) => unknown;
122
+ declare class Router {
123
+ private h3App;
124
+ private app;
125
+ private routes;
126
+ private groupPrefix;
127
+ private groupMiddleware;
128
+ constructor(h3App: H3, app: Application);
129
+ /**
130
+ * Route Resolver
131
+ *
132
+ * @param handler
133
+ * @param middleware
134
+ * @returns
135
+ */
136
+ private resolveHandler;
137
+ /**
138
+ * Add a route to the stack
139
+ *
140
+ * @param method
141
+ * @param path
142
+ * @param handler
143
+ * @param name
144
+ * @param middleware
145
+ */
146
+ private addRoute;
147
+ private resolveControllerOrHandler;
148
+ get(path: string, handler: EventHandler | (new (...args: any[]) => Controller), methodName?: string, name?: string, middleware?: Middleware[]): void;
149
+ post(path: string, handler: EventHandler | (new (...args: any[]) => Controller), methodName?: string, name?: string, middleware?: Middleware[]): void;
150
+ put(path: string, handler: EventHandler | (new (...args: any[]) => Controller), methodName?: string, name?: string, middleware?: Middleware[]): void;
151
+ delete(path: string, handler: EventHandler | (new (...args: any[]) => Controller), methodName?: string, name?: string, middleware?: Middleware[]): void;
152
+ /**
153
+ * API Resource support
154
+ *
155
+ * @param path
156
+ * @param controller
157
+ */
158
+ apiResource(path: string, Controller: new (app: Application) => Controller, middleware?: Middleware[]): void;
159
+ /**
160
+ * Named route URL generator
161
+ *
162
+ * @param name
163
+ * @param params
164
+ * @returns
165
+ */
166
+ route(name: string, params?: Record<string, string>): string | undefined;
167
+ /**
168
+ * Grouping
169
+ *
170
+ * @param options
171
+ * @param callback
172
+ */
173
+ group(options: {
174
+ prefix?: string;
175
+ middleware?: EventHandler[];
176
+ }, callback: () => void): void;
177
+ middleware(path: string, handler: Middleware$1, opts?: MiddlewareOptions): void;
178
+ }
179
+
180
+ type RemoveIndexSignature<T> = {
181
+ [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K];
182
+ };
183
+ type Bindings = {
184
+ [key: string]: any;
185
+ env<T extends string>(): NodeJS.ProcessEnv;
186
+ env<T extends string>(key: T, def?: any): any;
187
+ view: Edge;
188
+ asset(key: string, def?: string): string;
189
+ router: Router;
190
+ config: {
191
+ get<X extends Record<string, any>>(): X;
192
+ get<X extends Record<string, any>, T extends Extract<keyof X, string>>(key: T, def?: any): X[T];
193
+ set<T extends string>(key: T, value: any): void;
194
+ load?(): any;
195
+ };
196
+ 'http.app': H3;
197
+ 'path.base': string;
198
+ 'app.paths': PathLoader;
199
+ 'http.serve': typeof serve;
200
+ };
201
+ type UseKey = keyof RemoveIndexSignature<Bindings>;
202
+
203
+ declare class Container {
204
+ private bindings;
205
+ private singletons;
206
+ /**
207
+ * Bind a transient service to the container
208
+ */
209
+ bind<T>(key: new (...args: any[]) => T, factory: () => T): void;
210
+ bind<T extends UseKey>(key: T, factory: () => Bindings[T]): void;
211
+ /**
212
+ * Bind a singleton service to the container
213
+ */
214
+ singleton<T extends UseKey>(key: T | (new (..._args: any[]) => Bindings[T]), factory: () => Bindings[T]): void;
215
+ /**
216
+ * Resolve a service from the container
217
+ */
218
+ make<T extends UseKey>(key: T | (new (..._args: any[]) => Bindings[T])): Bindings[T];
219
+ /**
220
+ * Automatically build a class with constructor dependency injection
221
+ */
222
+ private build;
223
+ /**
224
+ * Check if a service is registered
225
+ */
226
+ has(key: UseKey): boolean;
227
+ }
228
+
229
+ declare abstract class ServiceProvider {
230
+ protected app: Application;
231
+ constructor(app: Application);
232
+ /**
233
+ * Register bindings to the container.
234
+ * Runs before boot().
235
+ */
236
+ abstract register(): void | Promise<void>;
237
+ /**
238
+ * Perform post-registration booting of services.
239
+ * Runs after all providers have been registered.
240
+ */
241
+ boot?(): void | Promise<void>;
242
+ }
243
+
244
+ declare class Application extends Container {
245
+ paths: PathLoader;
246
+ private booted;
247
+ private versions;
248
+ private basePath;
249
+ private providers;
250
+ protected externalProviders: Array<new (_app: Application) => ServiceProvider>;
251
+ constructor(basePath: string);
252
+ /**
253
+ * Register core bindings into the container
254
+ */
255
+ protected registerBaseBindings(): void;
256
+ /**
257
+ * Dynamically register all configured providers
258
+ */
259
+ registerConfiguredProviders(): Promise<void>;
260
+ protected loadOptions(): Promise<void>;
261
+ /**
262
+ * Load default and optional providers dynamically
263
+ *
264
+ * Auto-Registration Behavior
265
+ *
266
+ * Minimal App: Loads only core, config, http, router by default.
267
+ * Full-Stack App: Installs database, mail, queue, cache → they self-register via their providers.
268
+ */
269
+ protected getConfiguredProviders(): Promise<Array<new (_app: Application) => ServiceProvider>>;
270
+ protected getAllProviders(): Promise<Array<new (_app: Application) => ServiceProvider>>;
271
+ registerProviders(providers: Array<new (_app: Application) => ServiceProvider>): void;
272
+ /**
273
+ * Register a provider
274
+ */
275
+ register(provider: ServiceProvider): Promise<void>;
276
+ /**
277
+ * Boot all providers after registration
278
+ */
279
+ boot(): Promise<void>;
280
+ /**
281
+ * Attempt to dynamically import an optional module
282
+ */
283
+ private safeImport;
284
+ /**
285
+ * Get the base path of the app
286
+ *
287
+ * @returns
288
+ */
289
+ getBasePath(): string;
290
+ /**
291
+ * Dynamically retrieves a path property from the class.
292
+ * Any property ending with "Path" is accessible automatically.
293
+ *
294
+ * @param name - The base name of the path property
295
+ * @returns
296
+ */
297
+ getPath(name: Parameters<PathLoader['setPath']>[0], pth?: string): string;
298
+ /**
299
+ * Programatically set the paths.
300
+ *
301
+ * @param name - The base name of the path property
302
+ * @param path - The new path
303
+ * @returns
304
+ */
305
+ setPath(name: Parameters<PathLoader['setPath']>[0], path: string): void;
306
+ /**
307
+ * Returns the installed version of the system core and typescript.
308
+ *
309
+ * @returns
310
+ */
311
+ getVersion(key: 'app' | 'ts'): string;
312
+ }
313
+
314
+ /**
315
+ * Base controller class
316
+ */
317
+ declare abstract class Controller implements IController {
318
+ protected app: Application;
319
+ constructor(app: Application);
320
+ show(_ctx: HttpContext): any;
321
+ index(_ctx: HttpContext): any;
322
+ store(_ctx: HttpContext): any;
323
+ update(_ctx: HttpContext): any;
324
+ destroy(_ctx: HttpContext): any;
325
+ }
326
+
327
+ declare class Kernel {
328
+ private middleware;
329
+ constructor(middleware?: Middleware[]);
330
+ handle(event: H3Event, next: (ctx: HttpContext) => Promise<unknown>): Promise<unknown>;
331
+ private runMiddleware;
332
+ private isPlainObject;
333
+ }
334
+
335
+ /**
336
+ * Bootstraps core services and bindings.
337
+ *
338
+ * Bind essential services to the container (logger, config repository).
339
+ * Register app-level singletons.
340
+ * Set up exception handling.
341
+ *
342
+ * Auto-Registered
343
+ */
344
+ declare class AppServiceProvider extends ServiceProvider {
345
+ register(): void;
346
+ }
347
+
348
+ declare class ViewServiceProvider extends ServiceProvider {
349
+ register(): void;
350
+ }
351
+
352
+ export { AppServiceProvider, Application, type Bindings, Container, Controller, Kernel, PathLoader, ServiceProvider, type UseKey, ViewServiceProvider };