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.
- package/.changeset/README.md +8 -0
- package/.changeset/config.json +11 -0
- package/.github/workflows/release.yml +42 -0
- package/.husky/pre-commit +1 -0
- package/LICENSE +21 -0
- package/README.md +65 -0
- package/docs/.gitkeep +0 -0
- package/eslint.config.js +17 -0
- package/examples/basic-app/.env.example +54 -0
- package/examples/basic-app/package.json +27 -0
- package/examples/basic-app/public/h3ravel-logo.svg +23 -0
- package/examples/basic-app/public/main.js +13 -0
- package/examples/basic-app/src/Exceptions/.gitkeep +0 -0
- package/examples/basic-app/src/config/app.ts +125 -0
- package/examples/basic-app/src/config/filesystem.ts +59 -0
- package/examples/basic-app/src/http/controllers/HomeController.ts +17 -0
- package/examples/basic-app/src/http/controllers/UserController.ts +29 -0
- package/examples/basic-app/src/http/middlewares/AuthMiddleware.ts +8 -0
- package/examples/basic-app/src/index.ts +30 -0
- package/examples/basic-app/src/resources/views/index.edge +383 -0
- package/examples/basic-app/src/routes/api.ts +17 -0
- package/examples/basic-app/src/routes/web.ts +6 -0
- package/examples/basic-app/src/storage/app/public/.gitkeep +0 -0
- package/examples/basic-app/tsconfig.json +8 -0
- package/package.json +36 -0
- package/packages/cache/node_modules/.bin/tsc +21 -0
- package/packages/cache/node_modules/.bin/tsserver +21 -0
- package/packages/cache/package.json +26 -0
- package/packages/cache/src/CacheManager.ts +1 -0
- package/packages/cache/src/Contracts/.gitkeep +0 -0
- package/packages/cache/src/Drivers/MemoryCache.ts +1 -0
- package/packages/cache/src/Drivers/RedisCache.ts +1 -0
- package/packages/cache/src/Helpers.ts +1 -0
- package/packages/cache/src/Providers/CacheServiceProvider.ts +16 -0
- package/packages/cache/src/index.ts +9 -0
- package/packages/cache/tests/.gitkeep +0 -0
- package/packages/cache/tsconfig.json +9 -0
- package/packages/cache/vite.config.ts +9 -0
- package/packages/config/node_modules/.bin/tsc +21 -0
- package/packages/config/node_modules/.bin/tsserver +21 -0
- package/packages/config/package.json +34 -0
- package/packages/config/src/ConfigRepository.ts +51 -0
- package/packages/config/src/Contracts/.gitkeep +0 -0
- package/packages/config/src/EnvLoader.ts +16 -0
- package/packages/config/src/Helpers.ts +1 -0
- package/packages/config/src/Providers/ConfigServiceProvider.ts +46 -0
- package/packages/config/src/index.ts +8 -0
- package/packages/config/tests/.gitkeep +0 -0
- package/packages/config/tsconfig.json +8 -0
- package/packages/config/vite.config.ts +9 -0
- package/packages/console/node_modules/.bin/tsc +21 -0
- package/packages/console/node_modules/.bin/tsserver +21 -0
- package/packages/console/package.json +26 -0
- package/packages/console/src/Commands/MakeController.ts +1 -0
- package/packages/console/src/Commands/MakeModel.ts +1 -0
- package/packages/console/src/Commands/MakeResource.ts +1 -0
- package/packages/console/src/Contracts/.gitkeep +0 -0
- package/packages/console/src/IO/.gitkeep +0 -0
- package/packages/console/src/Kernel.ts +1 -0
- package/packages/console/src/Musketeer.ts +4 -0
- package/packages/console/src/Providers/ConsoleServiceProvider.ts +16 -0
- package/packages/console/src/index.ts +10 -0
- package/packages/console/tests/.gitkeep +0 -0
- package/packages/console/tsconfig.json +8 -0
- package/packages/console/vite.config.ts +9 -0
- package/packages/core/node_modules/.bin/tsc +21 -0
- package/packages/core/node_modules/.bin/tsserver +21 -0
- package/packages/core/package.json +29 -0
- package/packages/core/src/Application.ts +164 -0
- package/packages/core/src/Container.ts +71 -0
- package/packages/core/src/Contracts/.gitkeep +0 -0
- package/packages/core/src/Contracts/BindingsContract.ts +37 -0
- package/packages/core/src/Controller.ts +20 -0
- package/packages/core/src/Exceptions/Handler.ts +1 -0
- package/packages/core/src/Http/Kernel.ts +47 -0
- package/packages/core/src/Providers/AppServiceProvider.ts +18 -0
- package/packages/core/src/Providers/ViewServiceProvider.ts +19 -0
- package/packages/core/src/ServiceProvider.ts +21 -0
- package/packages/core/src/Utils/PathLoader.ts +46 -0
- package/packages/core/src/index.ts +14 -0
- package/packages/core/tests/.gitkeep +0 -0
- package/packages/core/tsconfig.json +8 -0
- package/packages/core/vite.config.ts +9 -0
- package/packages/database/node_modules/.bin/tsc +21 -0
- package/packages/database/node_modules/.bin/tsserver +21 -0
- package/packages/database/package.json +26 -0
- package/packages/database/src/Contracts/.gitkeep +0 -0
- package/packages/database/src/Migrations/.gitkeep +0 -0
- package/packages/database/src/Model.ts +1 -0
- package/packages/database/src/Providers/DatabaseServiceProvider.ts +16 -0
- package/packages/database/src/Query/.gitkeep +0 -0
- package/packages/database/src/index.ts +6 -0
- package/packages/database/src/tests/.gitkeep +0 -0
- package/packages/database/tsconfig.json +8 -0
- package/packages/database/vite.config.ts +9 -0
- package/packages/http/node_modules/.bin/tsc +21 -0
- package/packages/http/node_modules/.bin/tsserver +21 -0
- package/packages/http/package.json +28 -0
- package/packages/http/src/Contracts/ControllerContracts.ts +13 -0
- package/packages/http/src/Contracts/HttpContract.ts +7 -0
- package/packages/http/src/Middleware/LogRequests.ts +9 -0
- package/packages/http/src/Middleware.ts +5 -0
- package/packages/http/src/Providers/HttpServiceProvider.ts +22 -0
- package/packages/http/src/Request.ts +59 -0
- package/packages/http/src/Resources/ApiResource.ts +39 -0
- package/packages/http/src/Resources/JsonResource.ts +201 -0
- package/packages/http/src/Response.ts +80 -0
- package/packages/http/src/index.ts +13 -0
- package/packages/http/tests/.gitkeep +0 -0
- package/packages/http/tsconfig.json +8 -0
- package/packages/http/vite.config.ts +9 -0
- package/packages/mail/node_modules/.bin/tsc +21 -0
- package/packages/mail/node_modules/.bin/tsserver +21 -0
- package/packages/mail/package.json +26 -0
- package/packages/mail/src/Contracts/.gitkeep +0 -0
- package/packages/mail/src/Drivers/SES.ts +1 -0
- package/packages/mail/src/Drivers/SMTP.ts +1 -0
- package/packages/mail/src/Helpers.ts +1 -0
- package/packages/mail/src/Mailable.ts +1 -0
- package/packages/mail/src/Mailer.ts +1 -0
- package/packages/mail/src/Providers/MailServiceProvider.ts +16 -0
- package/packages/mail/src/index.ts +10 -0
- package/packages/mail/tests/.gitkeep +0 -0
- package/packages/mail/tsconfig.json +8 -0
- package/packages/mail/vite.config.ts +9 -0
- package/packages/queue/node_modules/.bin/tsc +21 -0
- package/packages/queue/node_modules/.bin/tsserver +21 -0
- package/packages/queue/package.json +26 -0
- package/packages/queue/src/Contracts/.gitkeep +0 -0
- package/packages/queue/src/Drivers/MemoryDriver.ts +1 -0
- package/packages/queue/src/Drivers/RedisDriver.ts +1 -0
- package/packages/queue/src/Jobs/.gitkeep +0 -0
- package/packages/queue/src/Providers/QueueServiceProvider.ts +16 -0
- package/packages/queue/src/QueueManager.ts +1 -0
- package/packages/queue/src/Workers/.gitkeep +0 -0
- package/packages/queue/src/index.ts +8 -0
- package/packages/queue/tests/.gitkeep +0 -0
- package/packages/queue/tsconfig.json +8 -0
- package/packages/queue/vite.config.ts +9 -0
- package/packages/router/node_modules/.bin/tsc +21 -0
- package/packages/router/node_modules/.bin/tsserver +21 -0
- package/packages/router/package.json +27 -0
- package/packages/router/src/Contracts/.gitkeep +0 -0
- package/packages/router/src/Controller.ts +1 -0
- package/packages/router/src/Decorators/ApiResource.ts +1 -0
- package/packages/router/src/Decorators/Controller.ts +1 -0
- package/packages/router/src/Decorators/Get.ts +1 -0
- package/packages/router/src/Decorators/Middleware.ts +1 -0
- package/packages/router/src/Decorators/Post.ts +1 -0
- package/packages/router/src/Middleware/.gitkeep +0 -0
- package/packages/router/src/Providers/AssetsServiceProvider.ts +53 -0
- package/packages/router/src/Providers/RouteServiceProvider.ts +44 -0
- package/packages/router/src/Route.ts +1 -0
- package/packages/router/src/Router.ts +180 -0
- package/packages/router/src/index.ts +14 -0
- package/packages/router/tests/.gitkeep +0 -0
- package/packages/router/tsconfig.json +8 -0
- package/packages/router/vite.config.ts +9 -0
- package/packages/support/node_modules/.bin/tsc +21 -0
- package/packages/support/node_modules/.bin/tsserver +21 -0
- package/packages/support/package.json +26 -0
- package/packages/support/src/Contracts/ObjContract.ts +53 -0
- package/packages/support/src/Contracts/StrContract.ts +6 -0
- package/packages/support/src/Facades/.gitkeep +0 -0
- package/packages/support/src/Helpers/Arr.ts +33 -0
- package/packages/support/src/Helpers/Number.ts +194 -0
- package/packages/support/src/Helpers/Obj.ts +220 -0
- package/packages/support/src/Helpers/Str.ts +256 -0
- package/packages/support/src/index.ts +10 -0
- package/packages/support/tests/.gitkeep +0 -0
- package/packages/support/tsconfig.json +8 -0
- package/packages/support/vite.config.ts +9 -0
- package/pnpm-workspace.yaml +7 -0
- package/tsconfig.json +26 -0
- package/tsup.config.ts +15 -0
- 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,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
|
File without changes
|
@@ -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,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,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
|
+
}
|