@daloyjs/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.
Files changed (74) hide show
  1. package/README.md +296 -0
  2. package/dist/adapters/bun.d.ts +16 -0
  3. package/dist/adapters/bun.d.ts.map +1 -0
  4. package/dist/adapters/bun.js +25 -0
  5. package/dist/adapters/bun.js.map +1 -0
  6. package/dist/adapters/cloudflare.d.ts +11 -0
  7. package/dist/adapters/cloudflare.d.ts.map +1 -0
  8. package/dist/adapters/cloudflare.js +6 -0
  9. package/dist/adapters/cloudflare.js.map +1 -0
  10. package/dist/adapters/deno.d.ts +12 -0
  11. package/dist/adapters/deno.d.ts.map +1 -0
  12. package/dist/adapters/deno.js +13 -0
  13. package/dist/adapters/deno.js.map +1 -0
  14. package/dist/adapters/node.d.ts +25 -0
  15. package/dist/adapters/node.d.ts.map +1 -0
  16. package/dist/adapters/node.js +90 -0
  17. package/dist/adapters/node.js.map +1 -0
  18. package/dist/adapters/vercel.d.ts +13 -0
  19. package/dist/adapters/vercel.d.ts.map +1 -0
  20. package/dist/adapters/vercel.js +4 -0
  21. package/dist/adapters/vercel.js.map +1 -0
  22. package/dist/app.d.ts +104 -0
  23. package/dist/app.d.ts.map +1 -0
  24. package/dist/app.js +487 -0
  25. package/dist/app.js.map +1 -0
  26. package/dist/client.d.ts +40 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +61 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/contract.d.ts +31 -0
  31. package/dist/contract.d.ts.map +1 -0
  32. package/dist/contract.js +76 -0
  33. package/dist/contract.js.map +1 -0
  34. package/dist/docs.d.ts +16 -0
  35. package/dist/docs.d.ts.map +1 -0
  36. package/dist/docs.js +51 -0
  37. package/dist/docs.js.map +1 -0
  38. package/dist/errors.d.ts +75 -0
  39. package/dist/errors.d.ts.map +1 -0
  40. package/dist/errors.js +155 -0
  41. package/dist/errors.js.map +1 -0
  42. package/dist/index.d.ts +13 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +7 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/logger.d.ts +26 -0
  47. package/dist/logger.d.ts.map +1 -0
  48. package/dist/logger.js +74 -0
  49. package/dist/logger.js.map +1 -0
  50. package/dist/middleware.d.ts +62 -0
  51. package/dist/middleware.d.ts.map +1 -0
  52. package/dist/middleware.js +201 -0
  53. package/dist/middleware.js.map +1 -0
  54. package/dist/openapi.d.ts +28 -0
  55. package/dist/openapi.d.ts.map +1 -0
  56. package/dist/openapi.js +178 -0
  57. package/dist/openapi.js.map +1 -0
  58. package/dist/router.d.ts +30 -0
  59. package/dist/router.d.ts.map +1 -0
  60. package/dist/router.js +135 -0
  61. package/dist/router.js.map +1 -0
  62. package/dist/schema.d.ts +45 -0
  63. package/dist/schema.d.ts.map +1 -0
  64. package/dist/schema.js +13 -0
  65. package/dist/schema.js.map +1 -0
  66. package/dist/security.d.ts +21 -0
  67. package/dist/security.d.ts.map +1 -0
  68. package/dist/security.js +107 -0
  69. package/dist/security.js.map +1 -0
  70. package/dist/types.d.ts +98 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +2 -0
  73. package/dist/types.js.map +1 -0
  74. package/package.json +108 -0
package/dist/router.js ADDED
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Trie / radix-style router with a static-route fast path.
3
+ *
4
+ * Performance:
5
+ * - Static (parameter-free) paths resolve via a single Map.get — O(1).
6
+ * - Dynamic paths walk a trie, O(path-segments) regardless of route count.
7
+ * - Path string is split by `indexOf` rather than a regex/replace.
8
+ *
9
+ * Safety:
10
+ * - Path traversal (`..`) and empty segments are rejected at lookup time.
11
+ * - Duplicate routes and duplicate operationIds throw at registration.
12
+ * - Wildcard segments must be terminal.
13
+ */
14
+ function createNode() {
15
+ return { children: new Map(), handlers: {} };
16
+ }
17
+ export class Router {
18
+ root = createNode();
19
+ operationIds = new Set();
20
+ /** Static (no-param/no-wildcard) routes for O(1) lookup. */
21
+ staticTable = new Map();
22
+ add(method, path, handler, operationId) {
23
+ if (operationId) {
24
+ if (this.operationIds.has(operationId)) {
25
+ throw new Error(`Duplicate operationId: "${operationId}"`);
26
+ }
27
+ this.operationIds.add(operationId);
28
+ }
29
+ const segments = splitPath(path);
30
+ const isStatic = segments.every((s) => !s.startsWith(":") && !s.startsWith("*"));
31
+ const normalized = "/" + segments.join("/");
32
+ if (isStatic) {
33
+ let entry = this.staticTable.get(normalized);
34
+ if (!entry) {
35
+ entry = {};
36
+ this.staticTable.set(normalized, entry);
37
+ }
38
+ if (entry[method])
39
+ throw new Error(`Duplicate route: ${method} ${path}`);
40
+ entry[method] = handler;
41
+ return;
42
+ }
43
+ let node = this.root;
44
+ for (const seg of segments) {
45
+ if (seg.startsWith(":")) {
46
+ const name = seg.slice(1);
47
+ if (!node.paramChild) {
48
+ node.paramChild = { name, node: createNode() };
49
+ }
50
+ else if (node.paramChild.name !== name) {
51
+ throw new Error(`Conflicting param names at same position: "${node.paramChild.name}" vs "${name}"`);
52
+ }
53
+ node = node.paramChild.node;
54
+ }
55
+ else if (seg.startsWith("*")) {
56
+ const name = seg.length > 1 ? seg.slice(1) : "wildcard";
57
+ node.wildcardChild = { name, node: createNode() };
58
+ node = node.wildcardChild.node;
59
+ break;
60
+ }
61
+ else {
62
+ let next = node.children.get(seg);
63
+ if (!next) {
64
+ next = createNode();
65
+ node.children.set(seg, next);
66
+ }
67
+ node = next;
68
+ }
69
+ }
70
+ if (node.handlers[method])
71
+ throw new Error(`Duplicate route: ${method} ${path}`);
72
+ node.handlers[method] = handler;
73
+ }
74
+ find(method, path) {
75
+ // Reject path traversal attempts before walking.
76
+ if (path.includes("/../") || path.endsWith("/..") || path.includes("//")) {
77
+ return undefined;
78
+ }
79
+ // Static fast path.
80
+ const normalized = path.replace(/\/+$/, "") || "/";
81
+ const staticEntry = this.staticTable.get(normalized);
82
+ if (staticEntry && staticEntry[method]) {
83
+ return { handler: staticEntry[method], params: {} };
84
+ }
85
+ const segments = splitPath(path);
86
+ const params = {};
87
+ const found = this.walk(this.root, segments, 0, params);
88
+ if (!found)
89
+ return undefined;
90
+ const handler = found.handlers[method];
91
+ if (!handler)
92
+ return undefined;
93
+ return { handler, params };
94
+ }
95
+ /** Returns the set of methods registered at this exact path (for 405 responses). */
96
+ allowedMethods(path) {
97
+ const normalized = path.replace(/\/+$/, "") || "/";
98
+ const fromStatic = this.staticTable.get(normalized);
99
+ if (fromStatic)
100
+ return Object.keys(fromStatic);
101
+ const segments = splitPath(path);
102
+ const found = this.walk(this.root, segments, 0, {});
103
+ return found ? Object.keys(found.handlers) : [];
104
+ }
105
+ walk(node, segs, i, params) {
106
+ if (i === segs.length)
107
+ return node;
108
+ const seg = segs[i];
109
+ const staticNext = node.children.get(seg);
110
+ if (staticNext) {
111
+ const r = this.walk(staticNext, segs, i + 1, params);
112
+ if (r)
113
+ return r;
114
+ }
115
+ if (node.paramChild) {
116
+ params[node.paramChild.name] = decodeURIComponent(seg);
117
+ const r = this.walk(node.paramChild.node, segs, i + 1, params);
118
+ if (r)
119
+ return r;
120
+ delete params[node.paramChild.name];
121
+ }
122
+ if (node.wildcardChild) {
123
+ params[node.wildcardChild.name] = segs.slice(i).map(decodeURIComponent).join("/");
124
+ return node.wildcardChild.node;
125
+ }
126
+ return undefined;
127
+ }
128
+ }
129
+ function splitPath(path) {
130
+ const clean = path.replace(/\/+$/, "") || "/";
131
+ if (clean === "/")
132
+ return [];
133
+ return clean.replace(/^\//, "").split("/");
134
+ }
135
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Standard Schema v1 — minimal subset.
3
+ * https://github.com/standard-schema/standard-schema
4
+ *
5
+ * By coding to this interface, DaloyJS supports Zod, Valibot, ArkType,
6
+ * TypeBox-as-StandardSchema, and any future validator that exposes
7
+ * `~standard`. No vendor lock-in.
8
+ */
9
+ export interface StandardSchemaV1<Input = unknown, Output = Input> {
10
+ readonly "~standard": StandardSchemaV1.Props<Input, Output>;
11
+ }
12
+ export declare namespace StandardSchemaV1 {
13
+ interface Props<Input = unknown, Output = Input> {
14
+ readonly version: 1;
15
+ readonly vendor: string;
16
+ readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;
17
+ readonly types?: Types<Input, Output>;
18
+ }
19
+ type Result<Output> = SuccessResult<Output> | FailureResult;
20
+ interface SuccessResult<Output> {
21
+ readonly value: Output;
22
+ readonly issues?: undefined;
23
+ }
24
+ interface FailureResult {
25
+ readonly issues: ReadonlyArray<Issue>;
26
+ }
27
+ interface Issue {
28
+ readonly message: string;
29
+ readonly path?: ReadonlyArray<PropertyKey | PathSegment>;
30
+ }
31
+ interface PathSegment {
32
+ readonly key: PropertyKey;
33
+ }
34
+ interface Types<Input, Output> {
35
+ readonly input: Input;
36
+ readonly output: Output;
37
+ }
38
+ type InferInput<S extends StandardSchemaV1> = NonNullable<S["~standard"]["types"]>["input"];
39
+ type InferOutput<S extends StandardSchemaV1> = NonNullable<S["~standard"]["types"]>["output"];
40
+ }
41
+ /** Validate any Standard-Schema-compatible schema. */
42
+ export declare function validate<S extends StandardSchemaV1>(schema: S, value: unknown): Promise<StandardSchemaV1.Result<StandardSchemaV1.InferOutput<S>>>;
43
+ /** Light-weight check for "looks like a Standard Schema". */
44
+ export declare function isStandardSchema(x: unknown): x is StandardSchemaV1;
45
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAC/D,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CAC7D;AAED,yBAAiB,gBAAgB,CAAC;IAChC,UAAiB,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QACpD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,OAAO,KACX,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;KACvC;IAED,KAAY,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC;IAEnE,UAAiB,aAAa,CAAC,MAAM;QACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;KAC7B;IAED,UAAiB,aAAa;QAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;KACvC;IAED,UAAiB,KAAK;QACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC;KAC1D;IAED,UAAiB,WAAW;QAC1B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;KAC3B;IAED,UAAiB,KAAK,CAAC,KAAK,EAAE,MAAM;QAClC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB;IAED,KAAY,UAAU,CAAC,CAAC,SAAS,gBAAgB,IAC/C,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAChD,KAAY,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAChD,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;CAClD;AAED,sDAAsD;AACtD,wBAAsB,QAAQ,CAAC,CAAC,SAAS,gBAAgB,EACvD,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAGnE;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,gBAAgB,CAOlE"}
package/dist/schema.js ADDED
@@ -0,0 +1,13 @@
1
+ /** Validate any Standard-Schema-compatible schema. */
2
+ export async function validate(schema, value) {
3
+ const r = schema["~standard"].validate(value);
4
+ return r instanceof Promise ? r : r;
5
+ }
6
+ /** Light-weight check for "looks like a Standard Schema". */
7
+ export function isStandardSchema(x) {
8
+ return (!!x &&
9
+ typeof x === "object" &&
10
+ "~standard" in x &&
11
+ typeof x["~standard"]?.validate === "function");
12
+ }
13
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAqDA,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAS,EACT,KAAc;IAEd,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,YAAY,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAS,CAAC;AAC/C,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAO,CACL,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,QAAQ;QACrB,WAAW,IAAK,CAAY;QAC5B,OAAQ,CAAS,CAAC,WAAW,CAAC,EAAE,QAAQ,KAAK,UAAU,CACxD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Security primitives. Used by the App core and the public middleware.
3
+ *
4
+ * - readBodyLimited: streaming read with a hard byte cap (DoS protection).
5
+ * - safeJsonParse: JSON parser that strips __proto__ / constructor / prototype
6
+ * keys to prevent prototype-pollution attacks.
7
+ * - sanitizeHeaderName / sanitizeHeaderValue: prevent CRLF header injection.
8
+ * - timingSafeEqual: constant-time string comparison for token checks.
9
+ * - randomId: cryptographically strong request id.
10
+ */
11
+ /** Read a request body to bytes with a hard size cap. */
12
+ export declare function readBodyLimited(req: Request, limit: number): Promise<Uint8Array>;
13
+ /** JSON.parse that drops dangerous keys (prototype pollution defence). */
14
+ export declare function safeJsonParse(text: string): unknown;
15
+ export declare function sanitizeHeaderName(name: string): string;
16
+ export declare function sanitizeHeaderValue(value: string): string;
17
+ /** Constant-time string comparison. Use for tokens, signatures, etc. */
18
+ export declare function timingSafeEqual(a: string, b: string): boolean;
19
+ /** Cryptographically strong request id (URL-safe, ~22 chars). */
20
+ export declare function randomId(): string;
21
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,yDAAyD;AACzD,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAsCrB;AAID,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUnD;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,IAAI,MAAM,CAUjC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Security primitives. Used by the App core and the public middleware.
3
+ *
4
+ * - readBodyLimited: streaming read with a hard byte cap (DoS protection).
5
+ * - safeJsonParse: JSON parser that strips __proto__ / constructor / prototype
6
+ * keys to prevent prototype-pollution attacks.
7
+ * - sanitizeHeaderName / sanitizeHeaderValue: prevent CRLF header injection.
8
+ * - timingSafeEqual: constant-time string comparison for token checks.
9
+ * - randomId: cryptographically strong request id.
10
+ */
11
+ import { PayloadTooLargeError, BadRequestError, } from "./errors.js";
12
+ /** Read a request body to bytes with a hard size cap. */
13
+ export async function readBodyLimited(req, limit) {
14
+ // Trust Content-Length when present — fail fast.
15
+ const cl = req.headers.get("content-length");
16
+ if (cl) {
17
+ const n = Number(cl);
18
+ if (!Number.isFinite(n) || n < 0)
19
+ throw new BadRequestError("Invalid Content-Length");
20
+ if (n > limit)
21
+ throw new PayloadTooLargeError(limit);
22
+ }
23
+ if (!req.body)
24
+ return new Uint8Array(0);
25
+ const reader = req.body.getReader();
26
+ const chunks = [];
27
+ let total = 0;
28
+ // eslint-disable-next-line no-constant-condition
29
+ while (true) {
30
+ const { done, value } = await reader.read();
31
+ if (done)
32
+ break;
33
+ if (!value)
34
+ continue;
35
+ total += value.byteLength;
36
+ if (total > limit) {
37
+ try {
38
+ await reader.cancel();
39
+ }
40
+ catch {
41
+ /* ignore */
42
+ }
43
+ throw new PayloadTooLargeError(limit);
44
+ }
45
+ chunks.push(value);
46
+ }
47
+ const out = new Uint8Array(total);
48
+ let offset = 0;
49
+ for (const c of chunks) {
50
+ out.set(c, offset);
51
+ offset += c.byteLength;
52
+ }
53
+ return out;
54
+ }
55
+ const FORBIDDEN_KEYS = new Set(["__proto__", "constructor", "prototype"]);
56
+ /** JSON.parse that drops dangerous keys (prototype pollution defence). */
57
+ export function safeJsonParse(text) {
58
+ if (text.length === 0)
59
+ return undefined;
60
+ try {
61
+ return JSON.parse(text, (key, value) => {
62
+ if (FORBIDDEN_KEYS.has(key))
63
+ return undefined;
64
+ return value;
65
+ });
66
+ }
67
+ catch {
68
+ throw new BadRequestError("Invalid JSON");
69
+ }
70
+ }
71
+ const HEADER_NAME_RE = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
72
+ export function sanitizeHeaderName(name) {
73
+ if (!HEADER_NAME_RE.test(name)) {
74
+ throw new BadRequestError(`Invalid header name: ${name}`);
75
+ }
76
+ return name.toLowerCase();
77
+ }
78
+ export function sanitizeHeaderValue(value) {
79
+ // Block CRLF + NUL — the classic header / response splitting vector.
80
+ if (/[\r\n\0]/.test(value)) {
81
+ throw new BadRequestError("Invalid header value");
82
+ }
83
+ return value;
84
+ }
85
+ /** Constant-time string comparison. Use for tokens, signatures, etc. */
86
+ export function timingSafeEqual(a, b) {
87
+ const len = Math.max(a.length, b.length);
88
+ let mismatch = a.length ^ b.length;
89
+ for (let i = 0; i < len; i++) {
90
+ mismatch |= (a.charCodeAt(i) || 0) ^ (b.charCodeAt(i) || 0);
91
+ }
92
+ return mismatch === 0;
93
+ }
94
+ /** Cryptographically strong request id (URL-safe, ~22 chars). */
95
+ export function randomId() {
96
+ const c = globalThis.crypto;
97
+ if (c?.randomUUID)
98
+ return c.randomUUID();
99
+ if (c?.getRandomValues) {
100
+ const buf = new Uint8Array(16);
101
+ c.getRandomValues(buf);
102
+ return Array.from(buf, (b) => b.toString(16).padStart(2, "0")).join("");
103
+ }
104
+ // Last-resort fallback (should never trigger on Node 20+/Bun/Deno/Workers).
105
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
106
+ }
107
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import type { StandardSchemaV1 } from "./schema.js";
2
+ /** HTTP methods supported by DaloyJS. */
3
+ export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
4
+ /** A path string, e.g. "/books/:id". */
5
+ export type PathString = `/${string}`;
6
+ /** Extract path-parameter names from a route path. */
7
+ export type ParamsOf<P extends string> = P extends `${string}:${infer Param}/${infer Rest}` ? Param | ParamsOf<`/${Rest}`> : P extends `${string}:${infer Param}` ? Param : never;
8
+ /** Map of path params with all string values (raw). */
9
+ export type PathParams<P extends string> = {
10
+ [K in ParamsOf<P>]: string;
11
+ };
12
+ export interface RequestSchemas {
13
+ params?: StandardSchemaV1;
14
+ query?: StandardSchemaV1;
15
+ headers?: StandardSchemaV1;
16
+ body?: StandardSchemaV1;
17
+ }
18
+ export type InferOut<S> = S extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<S> : undefined;
19
+ export type InferRequest<R extends RequestSchemas | undefined, P extends string> = {
20
+ params: R extends {
21
+ params: StandardSchemaV1;
22
+ } ? StandardSchemaV1.InferOutput<R["params"]> : PathParams<P>;
23
+ query: R extends {
24
+ query: StandardSchemaV1;
25
+ } ? StandardSchemaV1.InferOutput<R["query"]> : Record<string, string | string[] | undefined>;
26
+ headers: R extends {
27
+ headers: StandardSchemaV1;
28
+ } ? StandardSchemaV1.InferOutput<R["headers"]> : Record<string, string | undefined>;
29
+ body: R extends {
30
+ body: StandardSchemaV1;
31
+ } ? InferOut<R["body"]> : unknown;
32
+ };
33
+ export interface ResponseSpec {
34
+ description: string;
35
+ body?: StandardSchemaV1;
36
+ headers?: Record<string, {
37
+ description?: string;
38
+ schema?: StandardSchemaV1;
39
+ }>;
40
+ examples?: Record<string, unknown>;
41
+ }
42
+ export type ResponsesMap = {
43
+ [Status in number]?: ResponseSpec;
44
+ };
45
+ export type StatusOf<R extends ResponsesMap> = Extract<keyof R, number>;
46
+ export type HandlerReturn<R extends ResponsesMap> = {
47
+ [S in StatusOf<R>]: {
48
+ status: S;
49
+ body: R[S] extends {
50
+ body: StandardSchemaV1;
51
+ } ? StandardSchemaV1.InferInput<NonNullable<R[S]>["body"] & StandardSchemaV1> : unknown;
52
+ headers?: Record<string, string>;
53
+ };
54
+ }[StatusOf<R>];
55
+ export interface AuthSpec {
56
+ /** Name referenced in OpenAPI components.securitySchemes */
57
+ scheme: string;
58
+ /** Optional scopes/permissions, surfaces in OpenAPI security requirement */
59
+ scopes?: string[];
60
+ }
61
+ export interface BaseContext<P extends string, R extends RequestSchemas | undefined> {
62
+ request: Request;
63
+ /** Validated request data (or raw fallbacks if no schema). */
64
+ params: InferRequest<R, P>["params"];
65
+ query: InferRequest<R, P>["query"];
66
+ headers: InferRequest<R, P>["headers"];
67
+ body: InferRequest<R, P>["body"];
68
+ /** Mutable per-request state. Plugin-augmented context lives here. */
69
+ state: Record<string, unknown>;
70
+ /** Convenience response helpers (do not bypass schema validation). */
71
+ set: {
72
+ status?: number;
73
+ headers: Headers;
74
+ };
75
+ }
76
+ export interface Hooks {
77
+ onRequest?: (req: Request) => void | Promise<void>;
78
+ beforeHandle?: (ctx: BaseContext<any, any>) => void | Response | Promise<void | Response>;
79
+ afterHandle?: (ctx: BaseContext<any, any>, result: unknown) => void | unknown | Promise<void | unknown>;
80
+ onError?: (err: unknown, ctx: BaseContext<any, any> | undefined) => void | Response | Promise<void | Response>;
81
+ onResponse?: (res: Response) => void | Promise<void>;
82
+ }
83
+ export interface RouteDefinition<P extends PathString = PathString, M extends HttpMethod = HttpMethod, Req extends RequestSchemas | undefined = undefined, Res extends ResponsesMap = ResponsesMap> {
84
+ method: M;
85
+ path: P;
86
+ operationId?: string;
87
+ summary?: string;
88
+ description?: string;
89
+ tags?: string[];
90
+ deprecated?: boolean;
91
+ version?: string;
92
+ request?: Req;
93
+ responses: Res;
94
+ auth?: AuthSpec;
95
+ hooks?: Hooks;
96
+ handler: (ctx: BaseContext<P, Req>) => HandlerReturn<Res> | Promise<HandlerReturn<Res>>;
97
+ }
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,108 @@
1
+ {
2
+ "name": "@daloyjs/core",
3
+ "version": "0.1.0",
4
+ "description": "DaloyJS is a runtime-portable, contract-first TypeScript web framework with built-in OpenAPI (Hey API), typed client generation, large-scale maintainability, and security-first defaults. Hono-grade portability, Elysia-grade DX, FastAPI-grade docs, Fastify-grade ops — distributed via pnpm.",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/daloyjs/daloy.git"
12
+ },
13
+ "homepage": "https://github.com/daloyjs/daloy#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/daloyjs/daloy/issues"
16
+ },
17
+ "author": "DaloyJS",
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "packageManager": "pnpm@11.1.2",
21
+ "engines": {
22
+ "node": ">=20.10.0",
23
+ "pnpm": ">=9.0.0"
24
+ },
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ },
30
+ "./node": {
31
+ "types": "./dist/adapters/node.d.ts",
32
+ "import": "./dist/adapters/node.js"
33
+ },
34
+ "./bun": {
35
+ "types": "./dist/adapters/bun.d.ts",
36
+ "import": "./dist/adapters/bun.js"
37
+ },
38
+ "./deno": {
39
+ "types": "./dist/adapters/deno.d.ts",
40
+ "import": "./dist/adapters/deno.js"
41
+ },
42
+ "./cloudflare": {
43
+ "types": "./dist/adapters/cloudflare.d.ts",
44
+ "import": "./dist/adapters/cloudflare.js"
45
+ },
46
+ "./vercel": {
47
+ "types": "./dist/adapters/vercel.d.ts",
48
+ "import": "./dist/adapters/vercel.js"
49
+ },
50
+ "./client": {
51
+ "types": "./dist/client.d.ts",
52
+ "import": "./dist/client.js"
53
+ },
54
+ "./openapi": {
55
+ "types": "./dist/openapi.d.ts",
56
+ "import": "./dist/openapi.js"
57
+ },
58
+ "./docs": {
59
+ "types": "./dist/docs.d.ts",
60
+ "import": "./dist/docs.js"
61
+ },
62
+ "./contract": {
63
+ "types": "./dist/contract.d.ts",
64
+ "import": "./dist/contract.js"
65
+ }
66
+ },
67
+ "files": [
68
+ "dist",
69
+ "README.md"
70
+ ],
71
+ "scripts": {
72
+ "build": "tsc -p tsconfig.json",
73
+ "dev": "tsc -w -p tsconfig.json",
74
+ "example": "node --import tsx examples/basic.ts",
75
+ "bench": "node --import tsx bench/router.bench.ts",
76
+ "test": "node --import tsx --test tests/**/*.test.ts",
77
+ "typecheck": "tsc --noEmit",
78
+ "gen:openapi": "node --import tsx scripts/dump-openapi.ts",
79
+ "gen:client": "openapi-ts",
80
+ "gen": "pnpm gen:openapi && pnpm gen:client",
81
+ "audit": "pnpm audit --prod",
82
+ "prepublishOnly": "pnpm build"
83
+ },
84
+ "keywords": [
85
+ "framework",
86
+ "http",
87
+ "openapi",
88
+ "hey-api",
89
+ "contract-first",
90
+ "typescript",
91
+ "hono",
92
+ "elysia",
93
+ "fastify",
94
+ "fastapi",
95
+ "standard-schema",
96
+ "security",
97
+ "pnpm"
98
+ ],
99
+ "license": "MIT",
100
+ "devDependencies": {
101
+ "@hey-api/openapi-ts": "^0.97.1",
102
+ "@types/node": "^25.7.0",
103
+ "prettier": "^3.8.3",
104
+ "tsx": "^4.22.0",
105
+ "typescript": "^6.0.3",
106
+ "zod": "^4.4.3"
107
+ }
108
+ }