@nifrajs/core 0.1.0-alpha.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/dist/errors.d.ts +21 -0
  4. package/dist/errors.d.ts.map +1 -0
  5. package/dist/errors.js +26 -0
  6. package/dist/errors.js.map +1 -0
  7. package/dist/index.d.ts +26 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +21 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/internal/brand.d.ts +11 -0
  12. package/dist/internal/brand.d.ts.map +1 -0
  13. package/dist/internal/brand.js +10 -0
  14. package/dist/internal/brand.js.map +1 -0
  15. package/dist/internal/secret.d.ts +9 -0
  16. package/dist/internal/secret.d.ts.map +1 -0
  17. package/dist/internal/secret.js +19 -0
  18. package/dist/internal/secret.js.map +1 -0
  19. package/dist/router/router.d.ts +61 -0
  20. package/dist/router/router.d.ts.map +1 -0
  21. package/dist/router/router.js +324 -0
  22. package/dist/router/router.js.map +1 -0
  23. package/dist/schema/standard.d.ts +46 -0
  24. package/dist/schema/standard.d.ts.map +1 -0
  25. package/dist/schema/standard.js +20 -0
  26. package/dist/schema/standard.js.map +1 -0
  27. package/dist/seo.d.ts +48 -0
  28. package/dist/seo.d.ts.map +1 -0
  29. package/dist/seo.js +109 -0
  30. package/dist/seo.js.map +1 -0
  31. package/dist/server/body.d.ts +39 -0
  32. package/dist/server/body.d.ts.map +1 -0
  33. package/dist/server/body.js +85 -0
  34. package/dist/server/body.js.map +1 -0
  35. package/dist/server/context.d.ts +111 -0
  36. package/dist/server/context.d.ts.map +1 -0
  37. package/dist/server/context.js +2 -0
  38. package/dist/server/context.js.map +1 -0
  39. package/dist/server/contract.d.ts +142 -0
  40. package/dist/server/contract.d.ts.map +1 -0
  41. package/dist/server/contract.js +59 -0
  42. package/dist/server/contract.js.map +1 -0
  43. package/dist/server/cookies.d.ts +41 -0
  44. package/dist/server/cookies.d.ts.map +1 -0
  45. package/dist/server/cookies.js +181 -0
  46. package/dist/server/cookies.js.map +1 -0
  47. package/dist/server/logger.d.ts +49 -0
  48. package/dist/server/logger.d.ts.map +1 -0
  49. package/dist/server/logger.js +125 -0
  50. package/dist/server/logger.js.map +1 -0
  51. package/dist/server/registry.d.ts +46 -0
  52. package/dist/server/registry.d.ts.map +1 -0
  53. package/dist/server/registry.js +2 -0
  54. package/dist/server/registry.js.map +1 -0
  55. package/dist/server/server.d.ts +528 -0
  56. package/dist/server/server.d.ts.map +1 -0
  57. package/dist/server/server.js +1660 -0
  58. package/dist/server/server.js.map +1 -0
  59. package/dist/server/sse.d.ts +54 -0
  60. package/dist/server/sse.d.ts.map +1 -0
  61. package/dist/server/sse.js +126 -0
  62. package/dist/server/sse.js.map +1 -0
  63. package/dist/server/webhook.d.ts +42 -0
  64. package/dist/server/webhook.d.ts.map +1 -0
  65. package/dist/server/webhook.js +149 -0
  66. package/dist/server/webhook.js.map +1 -0
  67. package/dist/server/websocket.d.ts +152 -0
  68. package/dist/server/websocket.d.ts.map +1 -0
  69. package/dist/server/websocket.js +178 -0
  70. package/dist/server/websocket.js.map +1 -0
  71. package/dist/server/ws-bun.d.ts +27 -0
  72. package/dist/server/ws-bun.d.ts.map +1 -0
  73. package/dist/server/ws-bun.js +82 -0
  74. package/dist/server/ws-bun.js.map +1 -0
  75. package/dist/server/ws-hook.d.ts +36 -0
  76. package/dist/server/ws-hook.d.ts.map +1 -0
  77. package/dist/server/ws-hook.js +18 -0
  78. package/dist/server/ws-hook.js.map +1 -0
  79. package/dist/ws.d.ts +19 -0
  80. package/dist/ws.d.ts.map +1 -0
  81. package/dist/ws.js +26 -0
  82. package/dist/ws.js.map +1 -0
  83. package/package.json +63 -0
  84. package/src/errors.ts +41 -0
  85. package/src/index.ts +115 -0
  86. package/src/internal/brand.ts +11 -0
  87. package/src/internal/secret.ts +24 -0
  88. package/src/router/router.ts +429 -0
  89. package/src/schema/standard.ts +76 -0
  90. package/src/seo.ts +155 -0
  91. package/src/server/body.ts +89 -0
  92. package/src/server/context.ts +124 -0
  93. package/src/server/contract.ts +209 -0
  94. package/src/server/cookies.ts +198 -0
  95. package/src/server/logger.ts +167 -0
  96. package/src/server/registry.ts +63 -0
  97. package/src/server/server.ts +2479 -0
  98. package/src/server/sse.ts +161 -0
  99. package/src/server/webhook.ts +207 -0
  100. package/src/server/websocket.ts +308 -0
  101. package/src/server/ws-bun.ts +106 -0
  102. package/src/server/ws-hook.ts +53 -0
  103. package/src/ws.ts +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The Standard Schema v1 interface (https://standardschema.dev), vendored as
3
+ * types + a tiny runtime helper so any compliant validator — zod, valibot,
4
+ * arktype, … — validates requests without coupling the framework to one lib.
5
+ * The spec is MIT-licensed and explicitly designed to be copied.
6
+ */
7
+ export interface StandardSchemaV1<Input = unknown, Output = Input> {
8
+ readonly "~standard": StandardSchemaProps<Input, Output>;
9
+ }
10
+ export interface StandardSchemaProps<Input = unknown, Output = Input> {
11
+ readonly version: 1;
12
+ readonly vendor: string;
13
+ readonly validate: (value: unknown) => StandardResult<Output> | Promise<StandardResult<Output>>;
14
+ readonly types?: StandardTypes<Input, Output> | undefined;
15
+ }
16
+ export type StandardResult<Output> = StandardSuccess<Output> | StandardFailure;
17
+ export interface StandardSuccess<Output> {
18
+ readonly value: Output;
19
+ readonly issues?: undefined;
20
+ }
21
+ export interface StandardFailure {
22
+ readonly issues: ReadonlyArray<StandardIssue>;
23
+ }
24
+ export interface StandardIssue {
25
+ readonly message: string;
26
+ readonly path?: ReadonlyArray<PropertyKey | StandardPathSegment> | undefined;
27
+ }
28
+ export interface StandardPathSegment {
29
+ readonly key: PropertyKey;
30
+ }
31
+ export interface StandardTypes<Input = unknown, Output = Input> {
32
+ readonly input: Input;
33
+ readonly output: Output;
34
+ }
35
+ export type InferOutput<Schema extends StandardSchemaV1> = NonNullable<Schema["~standard"]["types"]>["output"];
36
+ export type InferInput<Schema extends StandardSchemaV1> = NonNullable<Schema["~standard"]["types"]>["input"];
37
+ export type ValidationOutcome<Output> = {
38
+ readonly ok: true;
39
+ readonly value: Output;
40
+ } | {
41
+ readonly ok: false;
42
+ readonly issues: ReadonlyArray<StandardIssue>;
43
+ };
44
+ /** Run a Standard Schema and normalize the result. Sync validators stay sync; async validators are awaited. */
45
+ export declare function validateStandard<Schema extends StandardSchemaV1>(schema: Schema, value: unknown): ValidationOutcome<InferOutput<Schema>> | Promise<ValidationOutcome<InferOutput<Schema>>>;
46
+ //# sourceMappingURL=standard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard.d.ts","sourceRoot":"","sources":["../../src/schema/standard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAC/D,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;CACzD;AAED,MAAM,WAAW,mBAAmB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAClE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,cAAc,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/F,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;CAC1D;AAED,MAAM,MAAM,cAAc,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,eAAe,CAAA;AAE9E,MAAM,WAAW,eAAe,CAAC,MAAM;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;CAC9C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,GAAG,mBAAmB,CAAC,GAAG,SAAS,CAAA;CAC7E;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAC5D,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,gBAAgB,IAAI,WAAW,CACpE,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAC7B,CAAC,QAAQ,CAAC,CAAA;AAEX,MAAM,MAAM,UAAU,CAAC,MAAM,SAAS,gBAAgB,IAAI,WAAW,CACnE,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAC7B,CAAC,OAAO,CAAC,CAAA;AAEV,MAAM,MAAM,iBAAiB,CAAC,MAAM,IAChC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;CAAE,CAAA;AAWzE,+GAA+G;AAC/G,wBAAgB,gBAAgB,CAAC,MAAM,SAAS,gBAAgB,EAC9D,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAO1F"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The Standard Schema v1 interface (https://standardschema.dev), vendored as
3
+ * types + a tiny runtime helper so any compliant validator — zod, valibot,
4
+ * arktype, … — validates requests without coupling the framework to one lib.
5
+ * The spec is MIT-licensed and explicitly designed to be copied.
6
+ */
7
+ function normalizeStandardResult(result) {
8
+ if (result.issues !== undefined) {
9
+ return { ok: false, issues: result.issues };
10
+ }
11
+ return { ok: true, value: result.value };
12
+ }
13
+ /** Run a Standard Schema and normalize the result. Sync validators stay sync; async validators are awaited. */
14
+ export function validateStandard(schema, value) {
15
+ const result = schema["~standard"].validate(value);
16
+ return result instanceof Promise
17
+ ? result.then((settled) => normalizeStandardResult(settled))
18
+ : normalizeStandardResult(result);
19
+ }
20
+ //# sourceMappingURL=standard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard.js","sourceRoot":"","sources":["../../src/schema/standard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkDH,SAAS,uBAAuB,CAC9B,MAA8B;IAE9B,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;IAC7C,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;AAC1C,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,KAAc;IAEd,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAClD,OAAO,MAAM,YAAY,OAAO;QAC9B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACtB,uBAAuB,CAAC,OAA8C,CAAC,CACxE;QACH,CAAC,CAAC,uBAAuB,CAAC,MAA6C,CAAC,CAAA;AAC5E,CAAC"}
package/dist/seo.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `sitemap.xml` + `robots.txt` builders — pure, edge-safe string generators (no I/O, no runtime deps).
3
+ * Wire them to a route on any runtime:
4
+ *
5
+ * app.get("/sitemap.xml", () =>
6
+ * new Response(sitemap([{ url: "/" }, { url: "/about", priority: 0.8 }], { hostname: "https://x.com" }), {
7
+ * headers: { "content-type": "application/xml; charset=utf-8" },
8
+ * }))
9
+ *
10
+ * app.get("/robots.txt", () =>
11
+ * new Response(robots({ rules: [{ userAgent: "*", disallow: ["/admin"] }], sitemap: "https://x.com/sitemap.xml" }), {
12
+ * headers: { "content-type": "text/plain; charset=utf-8" },
13
+ * }))
14
+ */
15
+ export type SitemapChangeFreq = "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never";
16
+ export interface SitemapEntry {
17
+ /** An absolute URL, or a path that `hostname` will make absolute. */
18
+ readonly url: string;
19
+ /** Last-modified — a `Date` (serialized as ISO 8601) or a pre-formatted W3C-datetime string. */
20
+ readonly lastmod?: string | Date;
21
+ readonly changefreq?: SitemapChangeFreq;
22
+ /** Crawl priority, `0.0`–`1.0`. */
23
+ readonly priority?: number;
24
+ }
25
+ export interface SitemapOptions {
26
+ /** Prepended to path-only `url`s (e.g. `"https://example.com"`). Sitemaps require absolute URLs. */
27
+ readonly hostname?: string;
28
+ }
29
+ /** Build a `<urlset>` sitemap XML document from `entries`. Throws on out-of-spec input (dev-time data). */
30
+ export declare function sitemap(entries: readonly SitemapEntry[], options?: SitemapOptions): string;
31
+ export interface RobotsRule {
32
+ /** A single user-agent token (`"*"`, `"Googlebot"`, …) or several sharing the same directives. */
33
+ readonly userAgent: string | readonly string[];
34
+ readonly allow?: readonly string[];
35
+ readonly disallow?: readonly string[];
36
+ /** Seconds between requests (honored by some crawlers). */
37
+ readonly crawlDelay?: number;
38
+ }
39
+ export interface RobotsOptions {
40
+ readonly rules: readonly RobotsRule[];
41
+ /** One or more absolute `Sitemap:` URLs. */
42
+ readonly sitemap?: string | readonly string[];
43
+ /** A `Host:` directive (preferred mirror). */
44
+ readonly host?: string;
45
+ }
46
+ /** Build a `robots.txt` body from grouped rules plus optional `Sitemap:`/`Host:` lines. */
47
+ export declare function robots(options: RobotsOptions): string;
48
+ //# sourceMappingURL=seo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../src/seo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAeH,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,CAAA;AAYX,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,gGAAgG;IAChG,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;IACvC,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAKD,2GAA2G;AAC3G,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CA4B9F;AAQD,MAAM,WAAW,UAAU;IACzB,kGAAkG;IAClG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;IACrC,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;IAC7C,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAOD,2FAA2F;AAC3F,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA6BrD"}
package/dist/seo.js ADDED
@@ -0,0 +1,109 @@
1
+ /**
2
+ * `sitemap.xml` + `robots.txt` builders — pure, edge-safe string generators (no I/O, no runtime deps).
3
+ * Wire them to a route on any runtime:
4
+ *
5
+ * app.get("/sitemap.xml", () =>
6
+ * new Response(sitemap([{ url: "/" }, { url: "/about", priority: 0.8 }], { hostname: "https://x.com" }), {
7
+ * headers: { "content-type": "application/xml; charset=utf-8" },
8
+ * }))
9
+ *
10
+ * app.get("/robots.txt", () =>
11
+ * new Response(robots({ rules: [{ userAgent: "*", disallow: ["/admin"] }], sitemap: "https://x.com/sitemap.xml" }), {
12
+ * headers: { "content-type": "text/plain; charset=utf-8" },
13
+ * }))
14
+ */
15
+ const XML_ESCAPES = {
16
+ "&": "&amp;",
17
+ "<": "&lt;",
18
+ ">": "&gt;",
19
+ '"': "&quot;",
20
+ "'": "&apos;",
21
+ };
22
+ /** Escape the five XML metacharacters — `<loc>` and `<lastmod>` carry app- or DB-derived strings. */
23
+ function escapeXml(value) {
24
+ return value.replace(/[&<>"']/g, (char) => XML_ESCAPES[char]);
25
+ }
26
+ const CHANGE_FREQS = new Set([
27
+ "always",
28
+ "hourly",
29
+ "daily",
30
+ "weekly",
31
+ "monthly",
32
+ "yearly",
33
+ "never",
34
+ ]);
35
+ /** sitemaps.org caps a single sitemap file at 50,000 URLs. Beyond this, split into a sitemap index. */
36
+ const SITEMAP_MAX_URLS = 50_000;
37
+ /** Build a `<urlset>` sitemap XML document from `entries`. Throws on out-of-spec input (dev-time data). */
38
+ export function sitemap(entries, options = {}) {
39
+ if (entries.length > SITEMAP_MAX_URLS) {
40
+ throw new RangeError(`sitemap: ${entries.length} entries exceeds the ${SITEMAP_MAX_URLS}-URL per-file limit — split into a sitemap index`);
41
+ }
42
+ const base = options.hostname?.replace(/\/+$/, "");
43
+ const urls = entries.map((entry) => {
44
+ const parts = [`<loc>${escapeXml(resolveLoc(entry.url, base))}</loc>`];
45
+ if (entry.lastmod !== undefined) {
46
+ const value = entry.lastmod instanceof Date ? entry.lastmod.toISOString() : entry.lastmod;
47
+ parts.push(`<lastmod>${escapeXml(value)}</lastmod>`);
48
+ }
49
+ if (entry.changefreq !== undefined) {
50
+ if (!CHANGE_FREQS.has(entry.changefreq)) {
51
+ throw new RangeError(`sitemap: invalid changefreq "${entry.changefreq}"`);
52
+ }
53
+ parts.push(`<changefreq>${entry.changefreq}</changefreq>`);
54
+ }
55
+ if (entry.priority !== undefined) {
56
+ if (!Number.isFinite(entry.priority) || entry.priority < 0 || entry.priority > 1) {
57
+ throw new RangeError(`sitemap: priority must be between 0.0 and 1.0, got ${entry.priority}`);
58
+ }
59
+ parts.push(`<priority>${entry.priority.toFixed(1)}</priority>`);
60
+ }
61
+ return ` <url>${parts.join("")}</url>`;
62
+ });
63
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls.join("\n")}\n</urlset>\n`;
64
+ }
65
+ function resolveLoc(url, base) {
66
+ if (/^https?:\/\//i.test(url))
67
+ return url; // already absolute
68
+ if (base === undefined)
69
+ return url; // relative — caller's choice (sitemaps prefer absolute)
70
+ return `${base}${url.startsWith("/") ? "" : "/"}${url}`;
71
+ }
72
+ /** robots.txt is line-oriented, so a newline in any value could inject a forged directive. Flatten it. */
73
+ function sanitizeLine(value) {
74
+ return value.replace(/[\r\n]+/g, " ").trim();
75
+ }
76
+ /** Build a `robots.txt` body from grouped rules plus optional `Sitemap:`/`Host:` lines. */
77
+ export function robots(options) {
78
+ const lines = [];
79
+ for (const rule of options.rules) {
80
+ const agents = typeof rule.userAgent === "string" ? [rule.userAgent] : rule.userAgent;
81
+ if (agents.length === 0) {
82
+ throw new RangeError("robots: each rule needs at least one userAgent");
83
+ }
84
+ for (const agent of agents)
85
+ lines.push(`User-agent: ${sanitizeLine(agent)}`);
86
+ for (const path of rule.allow ?? [])
87
+ lines.push(`Allow: ${sanitizeLine(path)}`);
88
+ for (const path of rule.disallow ?? [])
89
+ lines.push(`Disallow: ${sanitizeLine(path)}`);
90
+ if (rule.crawlDelay !== undefined) {
91
+ if (!Number.isFinite(rule.crawlDelay) || rule.crawlDelay < 0) {
92
+ throw new RangeError(`robots: crawlDelay must be a non-negative number, got ${rule.crawlDelay}`);
93
+ }
94
+ lines.push(`Crawl-delay: ${rule.crawlDelay}`);
95
+ }
96
+ lines.push(""); // blank line between groups
97
+ }
98
+ const sitemaps = options.sitemap === undefined
99
+ ? []
100
+ : typeof options.sitemap === "string"
101
+ ? [options.sitemap]
102
+ : options.sitemap;
103
+ for (const url of sitemaps)
104
+ lines.push(`Sitemap: ${sanitizeLine(url)}`);
105
+ if (options.host !== undefined)
106
+ lines.push(`Host: ${sanitizeLine(options.host)}`);
107
+ return `${lines.join("\n").trim()}\n`;
108
+ }
109
+ //# sourceMappingURL=seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.js","sourceRoot":"","sources":["../src/seo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Bounded request-body reading — the single source of truth for nifra's body-size cap. A lying or
3
+ * absent `Content-Length` can't force us to buffer an oversized payload: a declared length over the
4
+ * cap is rejected *before* buffering, and a chunked / length-less body is aborted mid-stream once the
5
+ * running byte count exceeds the cap. Shared by the server's schema path, `c.boundedBody`, and
6
+ * `verifyWebhook` so they all enforce the same guarantee.
7
+ */
8
+ interface BodySource {
9
+ readonly headers: Pick<Headers, "get">;
10
+ readonly body: ReadableStream<Uint8Array> | null;
11
+ arrayBuffer(): Promise<ArrayBuffer>;
12
+ }
13
+ export declare function parseContentLength(value: string): number | undefined;
14
+ /** The shared streaming byte-cap loop: read until done, or cancel + 413 once over `maxBytes`.
15
+ * A single-chunk body (the common case for small chunked payloads) returns the runtime's own
16
+ * chunk directly — no chunk array, no copy-merge. */
17
+ export declare function drainCapped(body: ReadableStream<Uint8Array>, maxBytes: number): Promise<{
18
+ ok: true;
19
+ bytes: Uint8Array;
20
+ } | {
21
+ ok: false;
22
+ status: 413;
23
+ }>;
24
+ /**
25
+ * Read a request body as **bytes**, capped at `maxBytes`. Rejects a `Content-Length` over the cap
26
+ * before buffering (`413`) and a malformed `Content-Length` (`400`); a chunked / length-less body
27
+ * falls through to the streaming byte-cap guard. Fast path: a non-chunked request with a
28
+ * `Content-Length` within the cap is read via native `arrayBuffer()` (framing-bounded by the runtime's
29
+ * HTTP server), skipping the manual stream loop.
30
+ */
31
+ export declare function readBoundedBytes(req: BodySource, maxBytes: number): Promise<{
32
+ ok: true;
33
+ bytes: Uint8Array;
34
+ } | {
35
+ ok: false;
36
+ status: 400 | 413;
37
+ }>;
38
+ export {};
39
+ //# sourceMappingURL=body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../src/server/body.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,UAAU,UAAU;IAClB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACtC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;IAChD,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;CACpC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUpE;AAED;;qDAEqD;AACrD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC,CA6BvE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAA;CAAE,CAAC,CAe7E"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Bounded request-body reading — the single source of truth for nifra's body-size cap. A lying or
3
+ * absent `Content-Length` can't force us to buffer an oversized payload: a declared length over the
4
+ * cap is rejected *before* buffering, and a chunked / length-less body is aborted mid-stream once the
5
+ * running byte count exceeds the cap. Shared by the server's schema path, `c.boundedBody`, and
6
+ * `verifyWebhook` so they all enforce the same guarantee.
7
+ */
8
+ export function parseContentLength(value) {
9
+ if (value.length === 0)
10
+ return undefined;
11
+ let length = 0;
12
+ for (let i = 0; i < value.length; i++) {
13
+ const digit = value.charCodeAt(i) - 48;
14
+ if (digit < 0 || digit > 9)
15
+ return undefined;
16
+ length = length * 10 + digit;
17
+ if (length > Number.MAX_SAFE_INTEGER)
18
+ return Number.POSITIVE_INFINITY;
19
+ }
20
+ return length;
21
+ }
22
+ /** The shared streaming byte-cap loop: read until done, or cancel + 413 once over `maxBytes`.
23
+ * A single-chunk body (the common case for small chunked payloads) returns the runtime's own
24
+ * chunk directly — no chunk array, no copy-merge. */
25
+ export async function drainCapped(body, maxBytes) {
26
+ const reader = body.getReader();
27
+ let first;
28
+ let rest;
29
+ let total = 0;
30
+ for (;;) {
31
+ const { done, value } = await reader.read();
32
+ if (done)
33
+ break;
34
+ total += value.byteLength;
35
+ if (total > maxBytes) {
36
+ await reader.cancel();
37
+ return { ok: false, status: 413 };
38
+ }
39
+ if (first === undefined) {
40
+ first = value;
41
+ }
42
+ else {
43
+ rest ??= [];
44
+ rest.push(value);
45
+ }
46
+ }
47
+ if (rest === undefined)
48
+ return { ok: true, bytes: first ?? new Uint8Array(0) };
49
+ const merged = new Uint8Array(total);
50
+ merged.set(first, 0);
51
+ let offset = first.byteLength;
52
+ for (const chunk of rest) {
53
+ merged.set(chunk, offset);
54
+ offset += chunk.byteLength;
55
+ }
56
+ return { ok: true, bytes: merged };
57
+ }
58
+ /**
59
+ * Read a request body as **bytes**, capped at `maxBytes`. Rejects a `Content-Length` over the cap
60
+ * before buffering (`413`) and a malformed `Content-Length` (`400`); a chunked / length-less body
61
+ * falls through to the streaming byte-cap guard. Fast path: a non-chunked request with a
62
+ * `Content-Length` within the cap is read via native `arrayBuffer()` (framing-bounded by the runtime's
63
+ * HTTP server), skipping the manual stream loop.
64
+ */
65
+ export async function readBoundedBytes(req, maxBytes) {
66
+ const declared = req.headers.get("content-length");
67
+ if (declared !== null) {
68
+ // A present Content-Length must be a non-negative integer (HTTP grammar: `1*DIGIT`). A non-numeric
69
+ // / negative / fractional value is malformed → 400, rather than falling through to the streaming
70
+ // guard (an UPPER-bound cap only, so a lying SMALLER length would otherwise be read in full).
71
+ const length = parseContentLength(declared);
72
+ if (length === undefined)
73
+ return { ok: false, status: 400 };
74
+ if (length > maxBytes)
75
+ return { ok: false, status: 413 };
76
+ const chunked = req.headers.get("transfer-encoding") !== null;
77
+ if (!chunked)
78
+ return { ok: true, bytes: new Uint8Array(await req.arrayBuffer()) };
79
+ }
80
+ const body = req.body;
81
+ if (body === null)
82
+ return { ok: true, bytes: new Uint8Array(0) };
83
+ return drainCapped(body, maxBytes);
84
+ }
85
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../../src/server/body.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import type { InferOutput, StandardSchemaV1 } from "../schema/standard.js";
2
+ import type { CookieOptions } from "./cookies.js";
3
+ /** Flattens an intersection into a single object type for readable hovers. */
4
+ export type Prettify<T> = {
5
+ [K in keyof T]: T[K];
6
+ } & {};
7
+ /**
8
+ * Extracts `:param` and trailing `*wildcard` names from a route-path literal into
9
+ * a string→string record: `/users/:id/posts/:postId` → `{ id: string; postId:
10
+ * string }`, `/files/*path` → `{ path: string }`, `/files/*` → `{ "*": string }`.
11
+ * A non-literal `string` path widens to `Record<string, string>`.
12
+ */
13
+ type RawParams<Path extends string> = string extends Path ? Record<string, string> : Path extends `${infer _Start}:${infer Param}/${infer Rest}` ? Record<Param, string> & RawParams<`/${Rest}`> : Path extends `${infer _Start}:${infer Param}` ? Record<Param, string> : Path extends `${infer _Start}*${infer Wild}` ? Record<Wild extends "" ? "*" : Wild, string> : Record<never, string>;
14
+ export type Params<Path extends string> = Prettify<RawParams<Path>>;
15
+ /** Per-route input schemas. Each is any Standard Schema (zod/valibot/arktype/…). */
16
+ export interface RouteSchema {
17
+ readonly body?: StandardSchemaV1;
18
+ readonly query?: StandardSchemaV1;
19
+ /** Optional **response contract**. When declared: the handler's return is type-checked against it
20
+ * (the implementation can't drift from the contract), the typed client sees THIS as the response type
21
+ * (the contract — not the handler's incidental return), and it's emitted into OpenAPI/JSON-Schema so
22
+ * tooling and coding agents can read the exact shape. It is **not** validated at runtime (zero
23
+ * hot-path cost) — purely a compile-time + introspection contract. */
24
+ readonly response?: StandardSchemaV1;
25
+ }
26
+ /** The validated body type, or `undefined` when no body schema is declared. */
27
+ type BodyOf<S extends RouteSchema> = S extends {
28
+ body: infer B extends StandardSchemaV1;
29
+ } ? InferOutput<B> : undefined;
30
+ /** The validated query type, or raw `URLSearchParams` when no query schema is declared. */
31
+ type QueryOf<S extends RouteSchema> = S extends {
32
+ query: infer Q extends StandardSchemaV1;
33
+ } ? InferOutput<Q> : URLSearchParams;
34
+ /** Mutable response controls a handler may write to before returning. */
35
+ export interface ResponseControls {
36
+ status?: number;
37
+ readonly headers: Record<string, string>;
38
+ /**
39
+ * Queue a `Set-Cookie` on the response. Defaults are **secure-by-default** —
40
+ * `HttpOnly; Secure; SameSite=Lax; Path=/` — overridable per call (pass `{ secure: false }` for
41
+ * local http dev). Multiple calls set multiple cookies (they're merged via a `Headers` object, so
42
+ * they don't collapse the way the plain `headers` Record would). Sign the value with `signValue`
43
+ * for tamper-evidence (what `@nifrajs/auth` sessions do).
44
+ */
45
+ cookie(name: string, value: string, options?: CookieOptions): void;
46
+ /** Queue a cookie deletion (`Max-Age=0` + a past `Expires`). Match the `path`/`domain` the cookie
47
+ * was set with, or the browser keeps it. */
48
+ deleteCookie(name: string, options?: Pick<CookieOptions, "path" | "domain">): void;
49
+ }
50
+ /**
51
+ * Runtime platform inputs, passed as `app.fetch(request, platform)`. Edge adapters (e.g.
52
+ * Cloudflare Workers) supply `env` (bindings) + `waitUntil`; Bun/Node/Deno omit them. Optional +
53
+ * runtime-neutral, so `app.fetch` stays a Web-standard handler.
54
+ */
55
+ export interface Platform<Env = unknown> {
56
+ /** Platform bindings (KV/D1/secrets on Workers). Typed as `Env` when the app declares them via
57
+ * `server<Env>()`; otherwise `unknown` — validate before use. */
58
+ readonly env?: Env;
59
+ /** Extend the response's lifetime for background work (Workers `ctx.waitUntil`). */
60
+ readonly waitUntil?: (promise: Promise<unknown>) => void;
61
+ }
62
+ /**
63
+ * Handler context. `params` are inferred from the path; `body` and `query` are
64
+ * the validated outputs of their schemas when declared (else `undefined` /
65
+ * raw `URLSearchParams`).
66
+ */
67
+ export interface Context<Path extends string = string, S extends RouteSchema = RouteSchema> {
68
+ readonly req: Request;
69
+ readonly params: Params<Path>;
70
+ readonly query: QueryOf<S>;
71
+ readonly body: BodyOf<S>;
72
+ /** The request's cookies, parsed from the `Cookie` header (values URL-decoded). Parsed lazily on
73
+ * first access + cached. Signed cookies arrive as `value.signature` — verify with `unsignValue`. */
74
+ readonly cookies: Readonly<Record<string, string>>;
75
+ readonly set: ResponseControls;
76
+ /**
77
+ * Aborts when the server's `requestTimeoutMs` elapses (and never, when no timeout
78
+ * is configured). Pass it to cancellation-aware work — DB drivers, `fetch` — so a
79
+ * timed-out request stops doing work instead of running on after the 503.
80
+ */
81
+ readonly signal: AbortSignal;
82
+ /**
83
+ * Platform bindings from `app.fetch(request, { env })` — Workers `env` (KV/D1/secrets), etc.
84
+ * `undefined` off-edge (Bun/Node/Deno). Declare the shape with `server<Env>()` to read it typed
85
+ * (`c.env: Env`); otherwise `unknown`. Validate at the trust boundary before use either way.
86
+ */
87
+ readonly env: unknown;
88
+ /**
89
+ * Schedule background work. On edge runtimes it extends the response lifetime (Workers
90
+ * `ctx.waitUntil`); off-edge it runs the promise fire-and-forget (a rejection is swallowed,
91
+ * never an unhandled rejection).
92
+ */
93
+ readonly waitUntil: (promise: Promise<unknown>) => void;
94
+ /**
95
+ * Read the raw request body as bytes, **capped** at `maxBytes` (default: the server's
96
+ * `maxBodyBytes`). For routes with **no body schema** — raw bodies, file uploads,
97
+ * BYO-validation — where the automatic schema cap doesn't apply. An over-cap body (by
98
+ * `Content-Length` or while streaming) throws a flat `413`; a malformed `Content-Length`
99
+ * throws `400`. Consumes the body stream (call once). Pass a larger `maxBytes` for an
100
+ * upload route, a smaller one to tighten a specific endpoint.
101
+ */
102
+ readonly boundedBody: (maxBytes?: number) => Promise<Uint8Array>;
103
+ /**
104
+ * `boundedBody` + `JSON.parse` (UTF-8). Same cap + `413`/`400` semantics; additionally
105
+ * throws a flat `400` on invalid JSON. Use for a schema-less JSON endpoint that still
106
+ * wants the body bounded.
107
+ */
108
+ readonly boundedJson: <T = unknown>(maxBytes?: number) => Promise<T>;
109
+ }
110
+ export {};
111
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/server/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/server/context.ts"],"names":[],"mappings":""}