h3ravel-monorepo 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +11 -0
  3. package/.github/workflows/release.yml +42 -0
  4. package/.husky/pre-commit +1 -0
  5. package/LICENSE +21 -0
  6. package/README.md +65 -0
  7. package/docs/.gitkeep +0 -0
  8. package/eslint.config.js +17 -0
  9. package/examples/basic-app/.env.example +54 -0
  10. package/examples/basic-app/package.json +27 -0
  11. package/examples/basic-app/public/h3ravel-logo.svg +23 -0
  12. package/examples/basic-app/public/main.js +13 -0
  13. package/examples/basic-app/src/Exceptions/.gitkeep +0 -0
  14. package/examples/basic-app/src/config/app.ts +125 -0
  15. package/examples/basic-app/src/config/filesystem.ts +59 -0
  16. package/examples/basic-app/src/http/controllers/HomeController.ts +17 -0
  17. package/examples/basic-app/src/http/controllers/UserController.ts +29 -0
  18. package/examples/basic-app/src/http/middlewares/AuthMiddleware.ts +8 -0
  19. package/examples/basic-app/src/index.ts +30 -0
  20. package/examples/basic-app/src/resources/views/index.edge +383 -0
  21. package/examples/basic-app/src/routes/api.ts +17 -0
  22. package/examples/basic-app/src/routes/web.ts +6 -0
  23. package/examples/basic-app/src/storage/app/public/.gitkeep +0 -0
  24. package/examples/basic-app/tsconfig.json +8 -0
  25. package/package.json +36 -0
  26. package/packages/cache/node_modules/.bin/tsc +21 -0
  27. package/packages/cache/node_modules/.bin/tsserver +21 -0
  28. package/packages/cache/package.json +26 -0
  29. package/packages/cache/src/CacheManager.ts +1 -0
  30. package/packages/cache/src/Contracts/.gitkeep +0 -0
  31. package/packages/cache/src/Drivers/MemoryCache.ts +1 -0
  32. package/packages/cache/src/Drivers/RedisCache.ts +1 -0
  33. package/packages/cache/src/Helpers.ts +1 -0
  34. package/packages/cache/src/Providers/CacheServiceProvider.ts +16 -0
  35. package/packages/cache/src/index.ts +9 -0
  36. package/packages/cache/tests/.gitkeep +0 -0
  37. package/packages/cache/tsconfig.json +9 -0
  38. package/packages/cache/vite.config.ts +9 -0
  39. package/packages/config/node_modules/.bin/tsc +21 -0
  40. package/packages/config/node_modules/.bin/tsserver +21 -0
  41. package/packages/config/package.json +34 -0
  42. package/packages/config/src/ConfigRepository.ts +51 -0
  43. package/packages/config/src/Contracts/.gitkeep +0 -0
  44. package/packages/config/src/EnvLoader.ts +16 -0
  45. package/packages/config/src/Helpers.ts +1 -0
  46. package/packages/config/src/Providers/ConfigServiceProvider.ts +46 -0
  47. package/packages/config/src/index.ts +8 -0
  48. package/packages/config/tests/.gitkeep +0 -0
  49. package/packages/config/tsconfig.json +8 -0
  50. package/packages/config/vite.config.ts +9 -0
  51. package/packages/console/node_modules/.bin/tsc +21 -0
  52. package/packages/console/node_modules/.bin/tsserver +21 -0
  53. package/packages/console/package.json +26 -0
  54. package/packages/console/src/Commands/MakeController.ts +1 -0
  55. package/packages/console/src/Commands/MakeModel.ts +1 -0
  56. package/packages/console/src/Commands/MakeResource.ts +1 -0
  57. package/packages/console/src/Contracts/.gitkeep +0 -0
  58. package/packages/console/src/IO/.gitkeep +0 -0
  59. package/packages/console/src/Kernel.ts +1 -0
  60. package/packages/console/src/Musketeer.ts +4 -0
  61. package/packages/console/src/Providers/ConsoleServiceProvider.ts +16 -0
  62. package/packages/console/src/index.ts +10 -0
  63. package/packages/console/tests/.gitkeep +0 -0
  64. package/packages/console/tsconfig.json +8 -0
  65. package/packages/console/vite.config.ts +9 -0
  66. package/packages/core/node_modules/.bin/tsc +21 -0
  67. package/packages/core/node_modules/.bin/tsserver +21 -0
  68. package/packages/core/package.json +29 -0
  69. package/packages/core/src/Application.ts +164 -0
  70. package/packages/core/src/Container.ts +71 -0
  71. package/packages/core/src/Contracts/.gitkeep +0 -0
  72. package/packages/core/src/Contracts/BindingsContract.ts +37 -0
  73. package/packages/core/src/Controller.ts +20 -0
  74. package/packages/core/src/Exceptions/Handler.ts +1 -0
  75. package/packages/core/src/Http/Kernel.ts +47 -0
  76. package/packages/core/src/Providers/AppServiceProvider.ts +18 -0
  77. package/packages/core/src/Providers/ViewServiceProvider.ts +19 -0
  78. package/packages/core/src/ServiceProvider.ts +21 -0
  79. package/packages/core/src/Utils/PathLoader.ts +46 -0
  80. package/packages/core/src/index.ts +14 -0
  81. package/packages/core/tests/.gitkeep +0 -0
  82. package/packages/core/tsconfig.json +8 -0
  83. package/packages/core/vite.config.ts +9 -0
  84. package/packages/database/node_modules/.bin/tsc +21 -0
  85. package/packages/database/node_modules/.bin/tsserver +21 -0
  86. package/packages/database/package.json +26 -0
  87. package/packages/database/src/Contracts/.gitkeep +0 -0
  88. package/packages/database/src/Migrations/.gitkeep +0 -0
  89. package/packages/database/src/Model.ts +1 -0
  90. package/packages/database/src/Providers/DatabaseServiceProvider.ts +16 -0
  91. package/packages/database/src/Query/.gitkeep +0 -0
  92. package/packages/database/src/index.ts +6 -0
  93. package/packages/database/src/tests/.gitkeep +0 -0
  94. package/packages/database/tsconfig.json +8 -0
  95. package/packages/database/vite.config.ts +9 -0
  96. package/packages/http/node_modules/.bin/tsc +21 -0
  97. package/packages/http/node_modules/.bin/tsserver +21 -0
  98. package/packages/http/package.json +28 -0
  99. package/packages/http/src/Contracts/ControllerContracts.ts +13 -0
  100. package/packages/http/src/Contracts/HttpContract.ts +7 -0
  101. package/packages/http/src/Middleware/LogRequests.ts +9 -0
  102. package/packages/http/src/Middleware.ts +5 -0
  103. package/packages/http/src/Providers/HttpServiceProvider.ts +22 -0
  104. package/packages/http/src/Request.ts +59 -0
  105. package/packages/http/src/Resources/ApiResource.ts +39 -0
  106. package/packages/http/src/Resources/JsonResource.ts +201 -0
  107. package/packages/http/src/Response.ts +80 -0
  108. package/packages/http/src/index.ts +13 -0
  109. package/packages/http/tests/.gitkeep +0 -0
  110. package/packages/http/tsconfig.json +8 -0
  111. package/packages/http/vite.config.ts +9 -0
  112. package/packages/mail/node_modules/.bin/tsc +21 -0
  113. package/packages/mail/node_modules/.bin/tsserver +21 -0
  114. package/packages/mail/package.json +26 -0
  115. package/packages/mail/src/Contracts/.gitkeep +0 -0
  116. package/packages/mail/src/Drivers/SES.ts +1 -0
  117. package/packages/mail/src/Drivers/SMTP.ts +1 -0
  118. package/packages/mail/src/Helpers.ts +1 -0
  119. package/packages/mail/src/Mailable.ts +1 -0
  120. package/packages/mail/src/Mailer.ts +1 -0
  121. package/packages/mail/src/Providers/MailServiceProvider.ts +16 -0
  122. package/packages/mail/src/index.ts +10 -0
  123. package/packages/mail/tests/.gitkeep +0 -0
  124. package/packages/mail/tsconfig.json +8 -0
  125. package/packages/mail/vite.config.ts +9 -0
  126. package/packages/queue/node_modules/.bin/tsc +21 -0
  127. package/packages/queue/node_modules/.bin/tsserver +21 -0
  128. package/packages/queue/package.json +26 -0
  129. package/packages/queue/src/Contracts/.gitkeep +0 -0
  130. package/packages/queue/src/Drivers/MemoryDriver.ts +1 -0
  131. package/packages/queue/src/Drivers/RedisDriver.ts +1 -0
  132. package/packages/queue/src/Jobs/.gitkeep +0 -0
  133. package/packages/queue/src/Providers/QueueServiceProvider.ts +16 -0
  134. package/packages/queue/src/QueueManager.ts +1 -0
  135. package/packages/queue/src/Workers/.gitkeep +0 -0
  136. package/packages/queue/src/index.ts +8 -0
  137. package/packages/queue/tests/.gitkeep +0 -0
  138. package/packages/queue/tsconfig.json +8 -0
  139. package/packages/queue/vite.config.ts +9 -0
  140. package/packages/router/node_modules/.bin/tsc +21 -0
  141. package/packages/router/node_modules/.bin/tsserver +21 -0
  142. package/packages/router/package.json +27 -0
  143. package/packages/router/src/Contracts/.gitkeep +0 -0
  144. package/packages/router/src/Controller.ts +1 -0
  145. package/packages/router/src/Decorators/ApiResource.ts +1 -0
  146. package/packages/router/src/Decorators/Controller.ts +1 -0
  147. package/packages/router/src/Decorators/Get.ts +1 -0
  148. package/packages/router/src/Decorators/Middleware.ts +1 -0
  149. package/packages/router/src/Decorators/Post.ts +1 -0
  150. package/packages/router/src/Middleware/.gitkeep +0 -0
  151. package/packages/router/src/Providers/AssetsServiceProvider.ts +53 -0
  152. package/packages/router/src/Providers/RouteServiceProvider.ts +44 -0
  153. package/packages/router/src/Route.ts +1 -0
  154. package/packages/router/src/Router.ts +180 -0
  155. package/packages/router/src/index.ts +14 -0
  156. package/packages/router/tests/.gitkeep +0 -0
  157. package/packages/router/tsconfig.json +8 -0
  158. package/packages/router/vite.config.ts +9 -0
  159. package/packages/support/node_modules/.bin/tsc +21 -0
  160. package/packages/support/node_modules/.bin/tsserver +21 -0
  161. package/packages/support/package.json +26 -0
  162. package/packages/support/src/Contracts/ObjContract.ts +53 -0
  163. package/packages/support/src/Contracts/StrContract.ts +6 -0
  164. package/packages/support/src/Facades/.gitkeep +0 -0
  165. package/packages/support/src/Helpers/Arr.ts +33 -0
  166. package/packages/support/src/Helpers/Number.ts +194 -0
  167. package/packages/support/src/Helpers/Obj.ts +220 -0
  168. package/packages/support/src/Helpers/Str.ts +256 -0
  169. package/packages/support/src/index.ts +10 -0
  170. package/packages/support/tests/.gitkeep +0 -0
  171. package/packages/support/tsconfig.json +8 -0
  172. package/packages/support/vite.config.ts +9 -0
  173. package/pnpm-workspace.yaml +7 -0
  174. package/tsconfig.json +26 -0
  175. package/tsup.config.ts +15 -0
  176. package/vite.base.config.ts +12 -0
@@ -0,0 +1,37 @@
1
+ import { DotNestedKeys, DotNestedValue } from "@h3ravel/support";
2
+ import type { H3, serve } from "h3";
3
+
4
+ import type { Edge } from "edge.js";
5
+ import { PathLoader } from "../Utils/PathLoader";
6
+ import type { Router } from "@h3ravel/router";
7
+
8
+ type RemoveIndexSignature<T> = {
9
+ [K in keyof T as string extends K
10
+ ? never
11
+ : number extends K
12
+ ? never
13
+ : K]: T[K]
14
+ }
15
+
16
+ export type Bindings = {
17
+ [key: string]: any;
18
+ env<T extends string> (): NodeJS.ProcessEnv
19
+ env<T extends string> (key: T, def?: any): any
20
+ view: Edge,
21
+ asset (key: string, def?: string): string,
22
+ router: Router
23
+ config: {
24
+ // get<X extends Record<string, any>> (): X
25
+ // get<X extends Record<string, any>, K extends DotNestedKeys<X>> (key: K, def?: any): DotNestedValue<X, K>
26
+ get<X extends Record<string, any>> (): X
27
+ get<X extends Record<string, any>, T extends Extract<keyof X, string>> (key: T, def?: any): X[T]
28
+ set<T extends string> (key: T, value: any): void
29
+ load?(): any
30
+ }
31
+ 'http.app': H3
32
+ 'path.base': string
33
+ 'app.paths': PathLoader
34
+ 'http.serve': typeof serve
35
+ }
36
+
37
+ export type UseKey = keyof RemoveIndexSignature<Bindings>
@@ -0,0 +1,20 @@
1
+ import { HttpContext, IController } from '@h3ravel/http'
2
+
3
+ import { Application } from '.'
4
+
5
+ /**
6
+ * Base controller class
7
+ */
8
+ export abstract class Controller implements IController {
9
+ protected app: Application
10
+
11
+ constructor(app: Application) {
12
+ this.app = app
13
+ }
14
+
15
+ public show (_ctx: HttpContext): any { return }
16
+ public index (_ctx: HttpContext): any { return }
17
+ public store (_ctx: HttpContext): any { return }
18
+ public update (_ctx: HttpContext): any { return }
19
+ public destroy (_ctx: HttpContext): any { return }
20
+ }
@@ -0,0 +1 @@
1
+ export default class { }
@@ -0,0 +1,47 @@
1
+ import { HttpContext, Middleware, Request, Response } from '@h3ravel/http'
2
+
3
+ import type { H3Event } from 'h3'
4
+
5
+ export class Kernel {
6
+ constructor(private middleware: Middleware[] = []) { }
7
+
8
+ async handle (event: H3Event, next: (ctx: HttpContext) => Promise<unknown>): Promise<unknown> {
9
+ const context: HttpContext = {
10
+ request: new Request(event),
11
+ response: new Response(event)
12
+ }
13
+
14
+ const result = await this.runMiddleware(context, () => next(context))
15
+
16
+ // Auto-set JSON header if plain object returned
17
+ if (result !== undefined && this.isPlainObject(result)) {
18
+ event.res.headers.set('Content-Type', 'application/json; charset=UTF-8')
19
+ }
20
+
21
+ return result
22
+ }
23
+
24
+ private async runMiddleware (context: HttpContext, next: (ctx: HttpContext) => Promise<unknown>) {
25
+ let index = -1
26
+
27
+ const runner = async (i: number): Promise<unknown> => {
28
+ if (i <= index) throw new Error('next() called multiple times')
29
+ index = i
30
+ const middleware = this.middleware[i]
31
+
32
+ if (middleware) {
33
+ return middleware.handle(context, () => runner(i + 1))
34
+ } else {
35
+ return next(context)
36
+ }
37
+ }
38
+
39
+ return runner(0)
40
+ }
41
+
42
+ private isPlainObject (value: unknown): value is Record<string, unknown> {
43
+ return typeof value === 'object' &&
44
+ value !== null &&
45
+ (value.constructor === Object || value.constructor === Array)
46
+ }
47
+ }
@@ -0,0 +1,18 @@
1
+ import 'reflect-metadata'
2
+
3
+ import { ServiceProvider } from '../ServiceProvider'
4
+
5
+ /**
6
+ * Bootstraps core services and bindings.
7
+ *
8
+ * Bind essential services to the container (logger, config repository).
9
+ * Register app-level singletons.
10
+ * Set up exception handling.
11
+ *
12
+ * Auto-Registered
13
+ */
14
+ export class AppServiceProvider extends ServiceProvider {
15
+ register () {
16
+ // Core bindings
17
+ }
18
+ }
@@ -0,0 +1,19 @@
1
+ import { Edge } from 'edge.js'
2
+ import { ServiceProvider } from '@h3ravel/core'
3
+
4
+ export class ViewServiceProvider extends ServiceProvider {
5
+ register (): void {
6
+ const config = this.app.make('config')
7
+ const edge = Edge.create({
8
+ cache: process.env.NODE_ENV === 'production'
9
+ })
10
+
11
+ edge.mount(this.app.getPath('views'))
12
+
13
+ edge.global('asset', this.app.make('asset'))
14
+ edge.global('config', config.get)
15
+ edge.global('app', this.app)
16
+
17
+ this.app.bind('view', () => edge)
18
+ }
19
+ }
@@ -0,0 +1,21 @@
1
+ import { Application } from './Application'
2
+
3
+ export abstract class ServiceProvider {
4
+ protected app: Application
5
+
6
+ constructor(app: Application) {
7
+ this.app = app
8
+ }
9
+
10
+ /**
11
+ * Register bindings to the container.
12
+ * Runs before boot().
13
+ */
14
+ abstract register (): void | Promise<void>
15
+
16
+ /**
17
+ * Perform post-registration booting of services.
18
+ * Runs after all providers have been registered.
19
+ */
20
+ boot?(): void | Promise<void>
21
+ }
@@ -0,0 +1,46 @@
1
+ import nodepath from "path"
2
+
3
+ type PathName = 'views' | 'routes' | 'assets' | 'base' | 'public' | 'storage' | 'config'
4
+
5
+ export class PathLoader {
6
+ private paths = {
7
+ base: '',
8
+ views: '/src/resources/views',
9
+ assets: '/public/assets',
10
+ routes: '/src/routes',
11
+ config: '/src/config',
12
+ public: '/public',
13
+ storage: '/src/storage',
14
+ }
15
+
16
+ /**
17
+ * Dynamically retrieves a path property from the class.
18
+ * Any property ending with "Path" is accessible automatically.
19
+ *
20
+ * @param name - The base name of the path property
21
+ * @param base - The base path to include to the path
22
+ * @returns
23
+ */
24
+ getPath (name: PathName, base?: string): string {
25
+ if (base && name !== 'base') {
26
+ return nodepath.join(base, this.paths[name])
27
+ }
28
+
29
+ return this.paths[name]
30
+ }
31
+
32
+ /**
33
+ * Programatically set the paths.
34
+ *
35
+ * @param name - The base name of the path property
36
+ * @param path - The new path
37
+ * @param base - The base path to include to the path
38
+ */
39
+ setPath (name: PathName, path: string, base?: string) {
40
+ if (base && name !== 'base') {
41
+ this.paths[name] = nodepath.join(base, path)
42
+ }
43
+
44
+ this.paths[name] = path
45
+ }
46
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @file Automatically generated by barrelsby.
3
+ */
4
+
5
+ export * from './Application';
6
+ export * from './Container';
7
+ export * from './Controller';
8
+ export * from './ServiceProvider';
9
+ export * from './Contracts/BindingsContract';
10
+ export * from './Exceptions/Handler';
11
+ export * from './Http/Kernel';
12
+ export * from './Providers/AppServiceProvider';
13
+ export * from './Providers/ViewServiceProvider';
14
+ export * from './Utils/PathLoader';
File without changes
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist"
5
+ },
6
+ "include": ["src", "../http/src/Middleware", "../http/src/Middleware.ts"],
7
+ "exclude": ["dist", "node_modules"]
8
+ }
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from 'tsup'
2
+
3
+ export default defineConfig({
4
+ entry: ['src/index.ts'],
5
+ format: ['esm', 'cjs'],
6
+ dts: true,
7
+ sourcemap: true,
8
+ clean: true
9
+ })
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/bin/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/bin/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsc" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/bin/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/bin/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsserver" "$@"
21
+ fi
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@h3ravel/database",
3
+ "version": "0.1.1",
4
+ "description": "Modeling data and migration system for H3ravel.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "scripts": {
12
+ "barrel": "barrelsby --directory src --delete --singleQuotes",
13
+ "build": "tsup",
14
+ "dev": "tsx watch src/index.ts",
15
+ "start": "node dist/index.js",
16
+ "lint": "eslint . --ext .ts",
17
+ "test": "vitest"
18
+ },
19
+ "dependencies": {
20
+ "@h3ravel/core": "workspace:*",
21
+ "h3": "^2.0.0-beta.1"
22
+ },
23
+ "devDependencies": {
24
+ "typescript": "^5.4.0"
25
+ }
26
+ }
File without changes
File without changes
@@ -0,0 +1 @@
1
+ export default class { }
@@ -0,0 +1,16 @@
1
+ import { ServiceProvider } from '@h3ravel/core'
2
+
3
+ /**
4
+ * Database connection, ORM, migrations.
5
+ *
6
+ * Register DatabaseManager and QueryBuilder if required.
7
+ * Set up ORM models and relationships.
8
+ * Register migration and seeder commands.
9
+ *
10
+ * Auto-Registered if @h3ravel/database is installed
11
+ */
12
+ export class DatabaseServiceProvider extends ServiceProvider {
13
+ register () {
14
+ // Core bindings
15
+ }
16
+ }
File without changes
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @file Automatically generated by barrelsby.
3
+ */
4
+
5
+ export * from './Model';
6
+ export * from './Providers/DatabaseServiceProvider';
File without changes
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist"
5
+ },
6
+ "include": ["src"],
7
+ "exclude": ["dist", "node_modules"]
8
+ }
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from 'tsup'
2
+
3
+ export default defineConfig({
4
+ entry: ['src/index.ts'],
5
+ format: ['esm', 'cjs'],
6
+ dts: true,
7
+ sourcemap: true,
8
+ clean: true
9
+ })
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/bin/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/bin/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsc" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/bin/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/bin/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/typescript@5.8.3/node_modules:/Users/ralph/Documents/Marx/Toneflix/OpenSource/H3ravel/framework/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsserver" "$@"
21
+ fi
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@h3ravel/http",
3
+ "version": "0.1.1",
4
+ "description": "HTTP kernel, middleware pipeline, request/response classes for H3ravel.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "scripts": {
12
+ "barrel": "barrelsby --directory src --delete --singleQuotes",
13
+ "build": "tsup",
14
+ "dev": "tsx watch src/index.ts",
15
+ "start": "node dist/index.js",
16
+ "lint": "eslint . --ext .ts",
17
+ "test": "vitest"
18
+ },
19
+ "dependencies": {
20
+ "@h3ravel/core": "workspace:*",
21
+ "@h3ravel/support": "workspace:*",
22
+ "srvx": "^0.8.2",
23
+ "h3": "^2.0.0-beta.1"
24
+ },
25
+ "devDependencies": {
26
+ "typescript": "^5.4.0"
27
+ }
28
+ }
@@ -0,0 +1,13 @@
1
+ import { HttpContext } from "./HttpContract"
2
+
3
+ /**
4
+ * Defines the contract for all controllers.
5
+ * Any controller implementing this must define these methods.
6
+ */
7
+ export interface IController {
8
+ show (ctx: HttpContext): any
9
+ index (ctx: HttpContext): any
10
+ store (ctx: HttpContext): any
11
+ update (ctx: HttpContext): any
12
+ destroy (ctx: HttpContext): any
13
+ }
@@ -0,0 +1,7 @@
1
+ import { Request } from "../Request"
2
+ import { Response } from "../Response"
3
+
4
+ export interface HttpContext {
5
+ request: Request
6
+ response: Response
7
+ }
@@ -0,0 +1,9 @@
1
+ import { HttpContext, Middleware } from '@h3ravel/http'
2
+
3
+ export class LogRequests extends Middleware {
4
+ async handle ({ request }: HttpContext, next: () => Promise<unknown>): Promise<unknown> {
5
+ const url = request.getEvent('url')
6
+ console.log(`[${request.getEvent('method')}] ${url.pathname + url.search}`)
7
+ return next()
8
+ }
9
+ }
@@ -0,0 +1,5 @@
1
+ import { HttpContext } from './Contracts/HttpContract';
2
+
3
+ export abstract class Middleware {
4
+ abstract handle (context: HttpContext, next: () => Promise<unknown>): Promise<unknown>
5
+ }
@@ -0,0 +1,22 @@
1
+ import { H3, serve } from 'h3'
2
+
3
+ import { ServiceProvider } from '@h3ravel/core'
4
+
5
+ /**
6
+ * Sets up HTTP kernel and request lifecycle.
7
+ *
8
+ * Register Request, Response, and Middleware classes.
9
+ * Configure global middleware stack.
10
+ * Boot HTTP kernel.
11
+ *
12
+ * Auto-Registered
13
+ */
14
+ export class HttpServiceProvider extends ServiceProvider {
15
+ register () {
16
+ this.app.singleton('http.app', () => {
17
+ return new H3()
18
+ })
19
+
20
+ this.app.singleton('http.serve', () => serve)
21
+ }
22
+ }
@@ -0,0 +1,59 @@
1
+ import { getQuery, getRouterParams, readBody, type H3Event } from 'h3'
2
+ import { DotNestedKeys, DotNestedValue, safeDot } from '@h3ravel/support'
3
+
4
+ export class Request {
5
+ private readonly event: H3Event
6
+
7
+ constructor(event: H3Event) {
8
+ this.event = event
9
+ }
10
+
11
+ /**
12
+ * Get all input data (query + body).
13
+ */
14
+ async all<T = Record<string, unknown>> (): Promise<T> {
15
+ let data = {
16
+ ...getRouterParams(this.event),
17
+ ...getQuery(this.event),
18
+ } as T
19
+
20
+ if (this.event.req.method === 'POST') {
21
+ data = Object.assign({}, data, Object.fromEntries((await this.event.req.formData()).entries()))
22
+ } else if (this.event.req.method === 'PUT') {
23
+ data = <never>Object.fromEntries(Object.entries(<never>await readBody(this.event)))
24
+ }
25
+
26
+ return data
27
+ }
28
+
29
+ /**
30
+ * Get a single input field from query or body.
31
+ */
32
+ async input<T = unknown> (key: string, defaultValue?: T): Promise<T> {
33
+ const data = await this.all<Record<string, T>>()
34
+ return (data[key] ?? defaultValue) as T
35
+ }
36
+
37
+ /**
38
+ * Get route parameters.
39
+ */
40
+ params<T = Record<string, string>> (): T {
41
+ return getRouterParams(this.event) as T
42
+ }
43
+
44
+ /**
45
+ * Get query parameters.
46
+ */
47
+ query<T = Record<string, string>> (): T {
48
+ return getQuery(this.event) as T
49
+ }
50
+
51
+ /**
52
+ * Get the base event
53
+ */
54
+ getEvent (): H3Event
55
+ getEvent<K extends DotNestedKeys<H3Event>> (key: K): DotNestedValue<H3Event, K>
56
+ getEvent<K extends DotNestedKeys<H3Event>> (key?: K): any {
57
+ return safeDot(this.event, key)
58
+ }
59
+ }
@@ -0,0 +1,39 @@
1
+ import { JsonResource, Resource } from "./JsonResource";
2
+
3
+ import { H3Event } from "h3";
4
+
5
+ export function ApiResource (
6
+ instance: JsonResource
7
+ ) {
8
+ return new Proxy(instance, {
9
+ get (target, prop, receiver) {
10
+ const value = Reflect.get(target, prop, receiver);
11
+ if (typeof value === 'function') {
12
+ // Intercept json, additional, and send methods
13
+ if (prop === 'json' || prop === 'additional') {
14
+ return (...args: any[]) => {
15
+ const result = value.apply(target, args);
16
+ // Schedule checkSend after json or additional
17
+ setImmediate(() => target['checkSend']());
18
+ return result;
19
+ };
20
+ } else if (prop === 'send') {
21
+ return (...args: any[]) => {
22
+ // Prevent checkSend from firing
23
+ target['shouldSend'] = false;
24
+
25
+ return value.apply(target, args);
26
+ };
27
+ }
28
+ }
29
+ return value;
30
+ },
31
+ });
32
+ }
33
+
34
+ export default function BaseResource<R extends Resource> (
35
+ evt: H3Event,
36
+ rsc: R
37
+ ) {
38
+ return ApiResource(new JsonResource<R>(evt, rsc))
39
+ }