sleepy-serv 0.17.0 → 0.19.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.
Files changed (52) hide show
  1. package/README.md +113 -15
  2. package/dist/cli/build.d.ts +2 -0
  3. package/dist/cli/build.d.ts.map +1 -0
  4. package/dist/cli/dev.d.ts +2 -0
  5. package/dist/cli/dev.d.ts.map +1 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/init.d.ts +2 -0
  9. package/dist/cli/init.d.ts.map +1 -0
  10. package/dist/core/errors.d.ts.map +1 -0
  11. package/dist/core/index.d.ts +17 -0
  12. package/dist/core/index.d.ts.map +1 -0
  13. package/dist/core/messages.d.ts.map +1 -0
  14. package/dist/core/middleware.d.ts.map +1 -0
  15. package/dist/core/socket.d.ts.map +1 -0
  16. package/dist/{utils.d.ts → core/utils.d.ts} +13 -0
  17. package/dist/core/utils.d.ts.map +1 -0
  18. package/dist/index.d.ts +3 -16
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/plugin/codegen.d.ts +3 -0
  21. package/dist/plugin/codegen.d.ts.map +1 -0
  22. package/dist/plugin/config.d.ts +14 -0
  23. package/dist/plugin/config.d.ts.map +1 -0
  24. package/dist/plugin/index.d.ts +2 -0
  25. package/dist/plugin/index.d.ts.map +1 -0
  26. package/dist/plugin/scanner.d.ts +15 -0
  27. package/dist/plugin/scanner.d.ts.map +1 -0
  28. package/package.json +8 -1
  29. package/src/cli/build.ts +82 -0
  30. package/src/cli/dev.ts +27 -0
  31. package/src/cli/index.ts +53 -0
  32. package/src/cli/init.ts +108 -0
  33. package/src/core/index.ts +406 -0
  34. package/src/{utils.ts → core/utils.ts} +16 -0
  35. package/src/index.ts +5 -573
  36. package/src/plugin/codegen.ts +101 -0
  37. package/src/plugin/config.ts +34 -0
  38. package/src/plugin/index.ts +30 -0
  39. package/src/plugin/scanner.ts +148 -0
  40. package/dist/errors.d.ts.map +0 -1
  41. package/dist/messages.d.ts.map +0 -1
  42. package/dist/middleware.d.ts.map +0 -1
  43. package/dist/socket.d.ts.map +0 -1
  44. package/dist/utils.d.ts.map +0 -1
  45. /package/dist/{errors.d.ts → core/errors.d.ts} +0 -0
  46. /package/dist/{messages.d.ts → core/messages.d.ts} +0 -0
  47. /package/dist/{middleware.d.ts → core/middleware.d.ts} +0 -0
  48. /package/dist/{socket.d.ts → core/socket.d.ts} +0 -0
  49. /package/src/{errors.ts → core/errors.ts} +0 -0
  50. /package/src/{messages.ts → core/messages.ts} +0 -0
  51. /package/src/{middleware.ts → core/middleware.ts} +0 -0
  52. /package/src/{socket.ts → core/socket.ts} +0 -0
package/README.md CHANGED
@@ -9,32 +9,69 @@ A directory-driven web server designed for REST-ful applications
9
9
 
10
10
  ## Getting Started
11
11
 
12
- Here's a minimalist example on how to create a sleepy-serv app:
12
+ The fastest way to scaffold a new project is the CLI:
13
+
14
+ ```bash
15
+ bunx sleepy-serv init
16
+ bun install
17
+ sleepy dev
18
+ ```
19
+
20
+ Or manually:
13
21
 
14
22
  ```js
23
+ // src/index.ts
15
24
  import { createApp } from 'sleepy-serv'
16
25
 
17
- const PORT = 3000
26
+ createApp(3000)
27
+ ```
28
+
29
+ Routes live in `src/api/` and are discovered automatically by the Bun
30
+ plugin at startup. There is no need to pass a directory path or import
31
+ routes yourself.
18
32
 
19
- const app = await createApp(PORT, import.meta.dirname)
33
+ To start the dev server with the plugin preloaded:
34
+
35
+ ```bash
36
+ sleepy dev
20
37
  ```
21
38
 
22
- The parameter for `import.meta.dirname` can be any directory you prefer, but it's common to point to the same directory as your root `index.js` file. The next step is to create an `/api` directory in the directory that you point to, and begin adding routes.
39
+ ### The Plugin
40
+
41
+ `sleepy-serv` uses a Bun plugin (`sleepy-serv/plugin`) to scan the
42
+ filesystem and generate static imports for every route at load time. This
43
+ replaces the previous dynamic `import()` and `fs.readdirSync()` approach
44
+ and enables compatibility with `bun build --compile --bytecode`.
45
+
46
+ The plugin is loaded automatically by the CLI commands (`sleepy dev` and
47
+ `sleepy build`). If you prefer to run your entrypoint directly, preload
48
+ the plugin yourself:
49
+
50
+ ```bash
51
+ bun --preload sleepy-serv/plugin src/index.ts
52
+ ```
23
53
 
24
54
  ### Return Value
25
55
 
26
- `sleepy-serv` was originally built for NodeJS, but it was ported to `bun` recently (before the initial release). The `createApp()` function merely calls `Bun.serve()` under-the-hood, and returns the `app` object that contains these properties:
27
- - `routes`: Contains a list of all of the routes defined by the file structure. This is useful for debugging.
28
- - `server`: this is the object that's returned from `Bun.serve()`. The `server` object has an `async` `.stop()` method on it, but prefer `app.close()` (see [Shutting Down](#shutting-down)), which stops the server and releases everything else the app holds.
29
- - `ws`: WebSocket commands for interacting with connected clients: `query(fn)`, `send(fn, event, body)`, `broadcast(event, body)`, and `drop(fn, code?, reason?)`.
30
- - `close`: an `async` function that shuts the app down. See [Shutting Down](#shutting-down).
56
+ `createApp()` calls `Bun.serve()` under the hood and returns an `app`
57
+ object with these properties:
58
+ - `routes`: a list of all routes defined by the file structure, useful for
59
+ debugging.
60
+ - `server`: the object returned from `Bun.serve()`. Prefer `app.close()`
61
+ (see [Shutting Down](#shutting-down)) over calling `server.stop()`
62
+ directly.
63
+ - `ws`: WebSocket commands for interacting with connected clients:
64
+ `query(fn)`, `send(fn, event, body)`, `broadcast(event, body)`, and
65
+ `drop(fn, code?, reason?)`.
66
+ - `close`: an `async` function that shuts the app down. See
67
+ [Shutting Down](#shutting-down).
31
68
 
32
69
  ### Shutting Down
33
70
 
34
71
  `app.close()` shuts the app down and releases everything it holds:
35
72
 
36
73
  ```js
37
- const app = await createApp(PORT, import.meta.dirname)
74
+ const app = createApp(3000)
38
75
 
39
76
  await app.close()
40
77
  ```
@@ -423,7 +460,7 @@ You can define app-level middleware that will be applied to all routes:
423
460
  ```js
424
461
  import { parseJsonBody } from 'sleepy-serv'
425
462
 
426
- const app = await createApp(PORT, import.meta.dirname, {
463
+ const app = createApp(3000, {
427
464
  middleware: [
428
465
  parseJsonBody(),
429
466
  (req, res, next) => {
@@ -443,7 +480,7 @@ Note that the reserved `/ws` handshake routes are folded into these same chains,
443
480
  The hostname can be customized like so:
444
481
 
445
482
  ```js
446
- createApp(import.meta.dirname, {
483
+ createApp(3000, {
447
484
  hostname: 'test.sleepy-serv.com',
448
485
  })
449
486
  ```
@@ -453,7 +490,7 @@ createApp(import.meta.dirname, {
453
490
  This adds a prefix to all routes. For example:
454
491
 
455
492
  ```js
456
- createApp(import.meta.dirname, {
493
+ createApp(3000, {
457
494
  mountPath: 'api/public',
458
495
  })
459
496
  ```
@@ -481,7 +518,7 @@ Yields these routes:
481
518
  When the app is started, the app can be shutdown gracefully by pressing Ctrl+D in the terminal. That handler is only wired up when `stdin` is a TTY, so it's skipped in CI, in test runners, and anywhere `stdin` is piped. The `onClose` hook will be called during that shutdown if it's defined, and it's also called by [`app.close()`](#shutting-down). `onClose` can also be `async` as well.
482
519
 
483
520
  ```js
484
- const app = await createApp(PORT, import.meta.dirname, {
521
+ const app = createApp(3000, {
485
522
  onClose: () => console.info('closing down...'),
486
523
  })
487
524
  ```
@@ -491,7 +528,7 @@ const app = await createApp(PORT, import.meta.dirname, {
491
528
  WebSocket tuning and lifecycle hooks:
492
529
 
493
530
  ```js
494
- const app = await createApp(PORT, import.meta.dirname, {
531
+ const app = createApp(3000, {
495
532
  ws: {
496
533
  heartbeatInterval: 30_000,
497
534
  dropThreshold: 120_000,
@@ -546,3 +583,64 @@ This works from both HTTP and WebSocket transports.
546
583
  - `SocketCommands`: the type for `app.ws` and `req.ws`
547
584
  - Error classes for every 4xx and 5xx status (e.g. `NotFoundError`, `UnauthorizedError`, `InternalServerError`)
548
585
  - Middleware helpers: `parseJsonBody`, `validateSchemas`, `setValidationFormats`
586
+
587
+ ## CLI
588
+
589
+ The `sleepy` CLI is installed with the package and provides three commands:
590
+
591
+ ### `sleepy init`
592
+
593
+ Scaffolds a new project in the current directory with `package.json`,
594
+ `sleepy.config.ts`, `tsconfig.json`, `src/index.ts`, and
595
+ `src/api/get.ts`. If `package.json` already exists, it merges the
596
+ `dev` and `build` scripts without overwriting other fields. If `src/`
597
+ already exists, existing files are not overwritten.
598
+
599
+ ### `sleepy dev`
600
+
601
+ Starts the dev server in watch mode with the plugin preloaded:
602
+
603
+ ```bash
604
+ sleepy dev
605
+ ```
606
+
607
+ Equivalent to:
608
+
609
+ ```bash
610
+ bun --watch --preload sleepy-serv/plugin src/index.ts
611
+ ```
612
+
613
+ ### `sleepy build`
614
+
615
+ Produces a production build using `Bun.build()` with the plugin:
616
+
617
+ ```bash
618
+ sleepy build
619
+ sleepy build --compile
620
+ sleepy build --compile --bytecode
621
+ ```
622
+
623
+ Output goes to `./dist` by default. The `--compile` flag produces a
624
+ single executable. The `--bytecode` flag pre-compiles to bytecode for
625
+ faster startup.
626
+
627
+ ## Configuration
628
+
629
+ Create a `sleepy.config.ts` (or `.js`) in the project root:
630
+
631
+ ```ts
632
+ export default {
633
+ app: {
634
+ root: './src/api',
635
+ entrypoint: './src/index.ts',
636
+ },
637
+ build: {
638
+ outdir: './dist',
639
+ compile: false,
640
+ bytecode: false,
641
+ plugins: [],
642
+ },
643
+ }
644
+ ```
645
+
646
+ All fields are optional and fall back to the defaults shown above.
@@ -0,0 +1,2 @@
1
+ export declare function build(): Promise<void>;
2
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAQA,wBAAsB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC,CAyE5C"}
@@ -0,0 +1,2 @@
1
+ export declare function dev(): Promise<void>;
2
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AAGA,wBAAsB,GAAG,IAAK,OAAO,CAAC,IAAI,CAAC,CAuB1C"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function init(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AA4FA,wBAAsB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC,CAe3C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { RouteConfig, SocketCommands, AppOptions, Server } from './utils';
2
+ export * from './errors';
3
+ export { StatusCode, CloseCode, CloseReason, HttpMethod } from './utils';
4
+ export { parseJsonBody, setValidationFormats, validateSchemas, } from './middleware';
5
+ export type { FilterFn, SessionEntry, SocketCommands } from './utils';
6
+ export type { AppOptions, AsyncHandlerResult, BaseRequest, EndpointRequest, FormattedError, Handler, MetaEntry, Middleware, MiddlewareChain, NextFn, HandlerResult, Request, RouteConfig, RouteDefinition, Server, SocketConnection, SocketOptions, WebSocketRequest, } from './utils';
7
+ export type { FormatterField, FormatterSchema, ValidationSchemas, } from './middleware';
8
+ type OutputRoutes = Record<string, string[]>;
9
+ type CloseFn = (force?: boolean) => Promise<void>;
10
+ export type App = {
11
+ server: Server;
12
+ routes: OutputRoutes;
13
+ ws: SocketCommands;
14
+ close: CloseFn;
15
+ };
16
+ export declare function createApp(port: number, config: RouteConfig, opts?: AppOptions): App;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAOV,WAAW,EAEX,cAAc,EACd,UAAU,EACV,MAAM,EACP,MAAM,SAAS,CAAA;AAOhB,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAExE,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAA;AAErB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAErE,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,cAAc,EACd,OAAO,EACP,SAAS,EACT,UAAU,EACV,eAAe,EACf,MAAM,EACN,aAAa,EACb,OAAO,EACP,WAAW,EACX,eAAe,EACf,MAAM,EACN,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAA;AAEhB,YAAY,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAErB,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AA0B5C,KAAK,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEjD,MAAM,MAAM,GAAG,GAAG;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,EAAE,EAAE,cAAc,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAgRD,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,UAAe,GACpB,GAAG,CAaL"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,eAAO,MAAM,WAAW;;;;;;CAMd,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,MAAM,OAAO,WAAW,CAAC,CAAA;AAEtE,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAG1C,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,WAAW,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAC3C,IAAI,EAAE,OAAO,WAAW,CAAC,SAAS,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,IAAI,EAAE,OAAO,WAAW,CAAC,OAAO,CAAA;IAChC,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,GAAG,CAAC,WAAW,CAAA;IACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG;IAC1C,IAAI,EAAE,OAAO,WAAW,CAAC,QAAQ,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,IAAI,EAAE,OAAO,WAAW,CAAC,OAAO,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE;QACJ,iBAAiB,EAAE,MAAM,CAAA;QACzB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG;IAC9C,IAAI,EAAE,OAAO,WAAW,CAAC,YAAY,CAAA;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,MAAM,MAAM,OAAO,GACf,gBAAgB,GAChB,cAAc,GACd,eAAe,GACf,cAAc,GACd,mBAAmB,CAAA;AAEvB,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG,cAAc,CAAA;AAE/D,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAC5D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAAE,MAAM,WAAW,CAAC,CAAA;AAwG5D,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,EACjD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAe/B;AAED,wBAAgB,eAAe,CAAE,OAAO,EAAE,UAAU,GAAG,eAAe,CA4BrE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/core/middleware.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAoB,MAAM,KAAK,CAAA;AAE3D,OAAO,KAAK,EAIV,UAAU,EAGX,MAAM,SAAS,CAAA;AAEhB,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAA;AAmF/C,wBAAgB,aAAa,IAAK,UAAU,CAoB3C;AAED,wBAAgB,oBAAoB,CAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAU3E;AAID,wBAAgB,2BAA2B,IAAK,IAAI,CAGnD;AAcD,wBAAgB,eAAe,CAAE,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAgCvE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/core/socket.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,WAAW,EAIZ,MAAM,SAAS,CAAA;AAchB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAE3C,OAAO,KAAK,EACV,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,eAAe,EACf,cAAc,EAGd,UAAU,EAEV,aAAa,EACb,eAAe,EAEf,UAAU,EACX,MAAM,SAAS,CAAA;AAShB,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,kBAAkB,CAAA;AAYvE,KAAK,cAAc,GAAG;IACpB,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,aAAa,CAAA;CACvB,CAAA;AAqBD,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC1C,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAC9C,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;IAC3C,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;CAClE,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,eAAe,CAAA;CACvB,CAAA;AAiTD,wBAAgB,gBAAgB,CAAE,IAAI,GAAE,UAAe,GAAG,WAAW,CAapE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,cAAc,GACvB,gBAAgB,CAAC,UAAU,CAAC,CAoJ9B;AAED,wBAAgB,mBAAmB,CAAE,KAAK,EAAE,WAAW,GAAG,cAAc,EAAE,CAyIzE;AAED,wBAAgB,mBAAmB,CAAE,KAAK,EAAE,WAAW,GAAG,cAAc,CAgEvE"}
@@ -160,6 +160,19 @@ export type SocketConnection = {
160
160
  close: (code?: number, reason?: string) => void;
161
161
  };
162
162
  export type Server = BunServer<SocketData>;
163
+ export type RouteDefinition = {
164
+ method: HttpMethod;
165
+ path: string;
166
+ chain: Handler | MiddlewareChain;
167
+ };
168
+ export type MetaEntry = {
169
+ path: string;
170
+ middleware: Middleware[];
171
+ };
172
+ export type RouteConfig = {
173
+ routes: RouteDefinition[];
174
+ meta?: MetaEntry[];
175
+ };
163
176
  export type AppOptions = {
164
177
  hostname?: string;
165
178
  mountPath?: string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,17 +1,4 @@
1
- import type { SocketCommands, AppOptions, Server } from './utils';
2
- export * from './errors';
3
- export { StatusCode, CloseCode, CloseReason, HttpMethod } from './utils';
4
- export { parseJsonBody, setValidationFormats, validateSchemas, } from './middleware';
5
- export type { FilterFn, SessionEntry, SocketCommands } from './utils';
6
- export type { AppOptions, AsyncHandlerResult, BaseRequest, EndpointRequest, FormattedError, Handler, Middleware, MiddlewareChain, NextFn, HandlerResult, Request, Server, SocketConnection, SocketOptions, WebSocketRequest, } from './utils';
7
- export type { FormatterField, FormatterSchema, ValidationSchemas, } from './middleware';
8
- type OutputRoutes = Record<string, string[]>;
9
- type CloseFn = (force?: boolean) => Promise<void>;
10
- export type App = {
11
- server: Server;
12
- routes: OutputRoutes;
13
- ws: SocketCommands;
14
- close: CloseFn;
15
- };
16
- export declare function createApp(port: number, rootPath: string, opts?: AppOptions): Promise<App>;
1
+ export * from './core';
2
+ import type { App, AppOptions } from './core';
3
+ export declare function createApp(port: number, opts?: AppOptions): App;
17
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAMV,cAAc,EACd,UAAU,EACV,MAAM,EACP,MAAM,SAAS,CAAA;AAOhB,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAExE,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,GAChB,MAAM,cAAc,CAAA;AAErB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAErE,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,cAAc,EACd,OAAO,EACP,UAAU,EACV,eAAe,EACf,MAAM,EACN,aAAa,EACb,OAAO,EACP,MAAM,EACN,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAA;AAEhB,YAAY,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAErB,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AA4C5C,KAAK,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEjD,MAAM,MAAM,GAAG,GAAG;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,EAAE,EAAE,cAAc,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AA0aD,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,GAAG,CAAC,CAad"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AAEtB,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAE7C,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,GAChB,GAAG,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ScanResult } from './scanner';
2
+ export declare function generateBarrelModule(scanResult: ScanResult): string;
3
+ //# sourceMappingURL=codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/plugin/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3C,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,UAAU,GACrB,MAAM,CAgGR"}
@@ -0,0 +1,14 @@
1
+ export type SleepyConfig = {
2
+ app?: {
3
+ root?: string;
4
+ entrypoint?: string;
5
+ };
6
+ build?: {
7
+ compile?: boolean | string;
8
+ bytecode?: boolean;
9
+ outdir?: string;
10
+ plugins?: unknown[];
11
+ };
12
+ };
13
+ export declare function loadConfig(startDir?: string): Promise<SleepyConfig>;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/plugin/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;QAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;KACpB,CAAA;CACF,CAAA;AAED,wBAAsB,UAAU,CAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ export type MethodEntry = {
2
+ method: string;
3
+ path: string;
4
+ modulePath: string;
5
+ };
6
+ export type MetaEntry = {
7
+ path: string;
8
+ modulePath: string;
9
+ };
10
+ export type ScanResult = {
11
+ methods: MethodEntry[];
12
+ meta: MetaEntry[];
13
+ };
14
+ export declare function scanRoutes(apiRoot: string): ScanResult;
15
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/plugin/scanner.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,IAAI,EAAE,SAAS,EAAE,CAAA;CAClB,CAAA;AAkGD,wBAAgB,UAAU,CAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAgCvD"}
package/package.json CHANGED
@@ -3,13 +3,20 @@
3
3
  "description": "A more opinionated web server for building REST-ful applications",
4
4
  "author": "Travis J True",
5
5
  "license": "MIT",
6
- "version": "0.17.0",
6
+ "version": "0.19.0",
7
7
  "type": "module",
8
+ "bin": {
9
+ "sleepy": "./src/cli/index.ts"
10
+ },
8
11
  "exports": {
9
12
  ".": {
10
13
  "types": "./dist/index.d.ts",
11
14
  "bun": "./src/index.ts",
12
15
  "default": "./src/index.ts"
16
+ },
17
+ "./plugin": {
18
+ "bun": "./src/plugin/index.ts",
19
+ "default": "./src/plugin/index.ts"
13
20
  }
14
21
  },
15
22
  "files": [
@@ -0,0 +1,82 @@
1
+ import path from 'path'
2
+ import fs from 'fs'
3
+ import { loadConfig } from '../plugin/config'
4
+ import { scanRoutes } from '../plugin/scanner'
5
+ import { generateBarrelModule } from '../plugin/codegen'
6
+
7
+ import type { BunPlugin } from 'bun'
8
+
9
+ export async function build (): Promise<void> {
10
+ const config = await loadConfig()
11
+ const entrypoint = config.app?.entrypoint?? './src/index.ts'
12
+
13
+ if (!fs.existsSync(entrypoint)) {
14
+ console.error(`Entrypoint not found: ${entrypoint}`)
15
+ process.exit(1)
16
+ }
17
+
18
+ const relativeRoot = config.app?.root ?? './src/api'
19
+ const apiRoot = path.resolve(process.cwd(), relativeRoot)
20
+ const barrelPath = require.resolve('sleepy-serv')
21
+ const escaped = barrelPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
22
+ const constraints = { filter: new RegExp(escaped) }
23
+
24
+ const sleepyPlugin: BunPlugin = {
25
+ name: 'sleepy-serv',
26
+ setup (build) {
27
+ build.onLoad(constraints, () => {
28
+ const scanResult = scanRoutes(apiRoot)
29
+ const contents = generateBarrelModule(scanResult)
30
+
31
+ return {
32
+ loader: 'ts',
33
+ contents,
34
+ }
35
+ })
36
+ },
37
+ }
38
+
39
+ const userPlugins = (config.build?.plugins ?? []) as BunPlugin[]
40
+ const outdir = config.build?.outdir ?? './dist'
41
+
42
+ try {
43
+ const result = await Bun.build({
44
+ outdir,
45
+ target: 'bun',
46
+ minify: true,
47
+ bytecode: config.build?.bytecode || undefined,
48
+ compile: (config.build?.compile || undefined) as boolean | undefined,
49
+ plugins: [...userPlugins, sleepyPlugin],
50
+ entrypoints: [entrypoint],
51
+ })
52
+
53
+ if (!result.success) {
54
+ console.error('Build failed:')
55
+
56
+ for (const log of result.logs) {
57
+ console.error(` ${log.message}`)
58
+ }
59
+
60
+ process.exit(1)
61
+ }
62
+
63
+ console.log('Build succeeded:')
64
+
65
+ for (const output of result.outputs) {
66
+ console.log(` ${output.path}`)
67
+ }
68
+ } catch (err) {
69
+ const errors = err instanceof AggregateError ? err.errors : [err]
70
+
71
+ console.error('Build failed:')
72
+
73
+ for (const buildErr of errors) {
74
+ const isBasicErr = buildErr instanceof Error
75
+ const msg = isBasicErr ? buildErr.message : String(buildErr)
76
+
77
+ console.error(` ${msg}`)
78
+ }
79
+
80
+ process.exit(1)
81
+ }
82
+ }
package/src/cli/dev.ts ADDED
@@ -0,0 +1,27 @@
1
+ import fs from 'fs'
2
+ import { loadConfig } from '../plugin/config'
3
+
4
+ export async function dev (): Promise<void> {
5
+ const config = await loadConfig()
6
+ const entrypoint = config.app?.entrypoint ?? './src/index.ts'
7
+
8
+ if (!fs.existsSync(entrypoint)) {
9
+ console.error(`Entrypoint not found: ${entrypoint}`)
10
+
11
+ process.exit(1)
12
+ }
13
+
14
+ const proc = Bun.spawn([
15
+ 'bun', '--watch',
16
+ '--preload', 'sleepy-serv/plugin',
17
+ entrypoint,
18
+ ], {
19
+ stdout: 'inherit',
20
+ stderr: 'inherit',
21
+ stdin: 'inherit',
22
+ })
23
+
24
+ const code = await proc.exited
25
+
26
+ process.exit(code)
27
+ }
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { parseArgs } from 'node:util'
4
+ import { init } from './init'
5
+ import { dev } from './dev'
6
+ import { build } from './build'
7
+
8
+ const USAGE = `
9
+ Usage: sleepy <command>
10
+
11
+ Commands:
12
+ init Create a new sleepy-serv project
13
+ dev Start the dev server (watch mode)
14
+ build Build for production
15
+
16
+ Options:
17
+ --help Show this help message
18
+ `.trim().concat('\n')
19
+
20
+ const { positionals, values } = parseArgs({
21
+ allowPositionals: true,
22
+ options: {
23
+ help: {
24
+ type: 'boolean',
25
+ short: 'h',
26
+ },
27
+ },
28
+ })
29
+
30
+ if (values.help) {
31
+ console.log(USAGE)
32
+ process.exit(0)
33
+ }
34
+
35
+ const command = positionals[0]
36
+
37
+ switch (command) {
38
+ case 'init':
39
+ await init()
40
+ break
41
+
42
+ case 'dev':
43
+ await dev()
44
+ break
45
+
46
+ case 'build':
47
+ await build()
48
+ break
49
+
50
+ default:
51
+ console.error(USAGE)
52
+ process.exit(1)
53
+ }