create-nifra 0.1.0-alpha.5 → 0.1.0-alpha.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAc,KAAK,QAAQ,EAAiB,MAAM,SAAS,CAAA;AAgPlE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAA;IACtB,mFAAmF;IACnF,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAC3B;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAuBtD"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAc,KAAK,QAAQ,EAAiB,MAAM,SAAS,CAAA;AA2PlE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAA;IACtB,mFAAmF;IACnF,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAC3B;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAuBtD"}
package/dist/agents.js CHANGED
@@ -38,16 +38,24 @@ export type App = typeof app
38
38
 
39
39
  Rules an agent must follow:
40
40
 
41
- - **Validate every input at the boundary.** Pass a schema (\`{ body, query, params, headers }\`) on any
42
- route that reads untrusted input — use \`t\` from \`@nifrajs/schema\` or any Standard Schema (zod, valibot).
43
- Then read \`c.body\` / \`c.query\` / \`c.params\`, which are typed and already validated. **Never** hand-parse
44
- \`await c.req.json()\` and poke at properties — that's the bug class the schema exists to remove.
41
+ - **Validate every input at the boundary.** The route schema slots are \`{ body, query }\` (plus
42
+ \`response\`, below) — use \`t\` from \`@nifrajs/schema\` (installed) or any Standard Schema (zod, valibot).
43
+ Read the typed, already-validated \`c.body\` / \`c.query\` (invalid input was rejected with a 400 before the
44
+ handler ran). **Never** hand-parse \`await c.req.json()\` and poke at properties — that's the bug class the
45
+ schema exists to remove.
46
+ - **Path params are NOT a schema slot.** \`:id\` etc. are inferred from the path literal as \`string\` and
47
+ read via \`c.params.id\`; there is no \`params\` (or \`headers\`) key in the route schema. Validate a param's
48
+ shape inside the handler (a length/format check), not via \`{ params: ... }\` — that's a type error.
45
49
  - **Lock the output shape with \`response\` (no drift).** Add \`{ response: t.object({...}) }\` to a route:
46
50
  the handler's return is type-checked against it, and the typed client sees exactly that shape. One
47
51
  contract, both sides — the frontend physically can't drift from the backend's output.
48
- - **Return values, not boilerplate.** Returning a plain object/array/string sends JSON. Return a
49
- \`Response\` for full control, or \`new Response(..., { status })\` for errors. Prefer explicit error
50
- shapes (\`{ ok: false, error: "slot_unavailable" }\`) with the right status over generic 500s.
52
+ - **Data-or-error routes: return a discriminated UNION, set the code via \`c.set.status\`** — e.g.
53
+ \`response: t.union([Item, t.object({ ok: t.literal(false), error: t.string() })])\`, then
54
+ \`c.set.status = 404; return { ok: false, error: "not_found" }\`. This keeps the typed client's \`res.data\`
55
+ precise — do NOT return a raw \`Response\` just to set an error status.
56
+ - **Raw \`Response\` is for redirects / streams / files** (\`Response.redirect(url, 302)\`, a file body, an
57
+ SSE stream). The typed client infers \`res.data: never\` on such a route and \`nifra check\` emits a
58
+ non-blocking \`response-route\` warning — both are EXPECTED there, not defects.
51
59
  - **\`app.fetch(request)\` is the whole app** — \`(Request) => Response | Promise<Response>\`. Tests drive it
52
60
  directly (\`await app.fetch(new Request("http://x/users/1"))\`); no server needs to be running.
53
61
  - **Don't reach for a heavy ORM/HTTP layer.** Routing, validation, cookies, and the typed client are
@@ -79,6 +87,9 @@ function webRules(framework) {
79
87
  \`_404.tsx\` / \`_error.tsx\` are the fallbacks.
80
88
  - A route file may export: \`default\` (the page component), \`loader\` (server-only data), \`action\`
81
89
  (server-only mutation), and \`meta\` (head tags). The \`loader\` returns data typed straight into the page.
90
+ - **The \`server()\` backend is IN-PROCESS, not a public HTTP surface.** Loaders/actions call it through
91
+ \`ctx.api\` (the typed client — no network) during SSR; there is no \`GET /your-route\` endpoint on the page
92
+ server to curl. Build features through loaders/actions + the typed client, not direct HTTP calls.
82
93
  - Swap UI frameworks by changing one import (\`@nifrajs/web-${framework}\` → another adapter); your route,
83
94
  loader, and action code do not change.
84
95
  - **Loaders \`throw redirect(url)\`, actions \`return redirect(url)\`.** Loader redirects abort the
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-nifra",
3
- "version": "0.1.0-alpha.5",
3
+ "version": "0.1.0-alpha.6",
4
4
  "description": "Scaffold a new nifra app — `bun create nifra <dir>`.",
5
5
  "keywords": [
6
6
  "bun",
@@ -11,7 +11,8 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@nifrajs/client": "^0.1.0-alpha.4",
14
- "@nifrajs/core": "^0.1.0-alpha.4"
14
+ "@nifrajs/core": "^0.1.0-alpha.4",
15
+ "@nifrajs/schema": "^0.1.0-alpha.4"
15
16
  },
16
17
  "devDependencies": {
17
18
  "@types/bun": "latest",
@@ -11,6 +11,7 @@
11
11
  "dependencies": {
12
12
  "@nifrajs/client": "^0.1.0-alpha.4",
13
13
  "@nifrajs/core": "^0.1.0-alpha.4",
14
+ "@nifrajs/schema": "^0.1.0-alpha.4",
14
15
  "@nifrajs/web": "^0.1.0-alpha.4",
15
16
  "@nifrajs/web-react": "^0.1.0-alpha.4",
16
17
  "react": "^19.0.0",
@@ -19,6 +19,7 @@
19
19
  "dependencies": {
20
20
  "@nifrajs/client": "^0.1.0-alpha.4",
21
21
  "@nifrajs/core": "^0.1.0-alpha.4",
22
+ "@nifrajs/schema": "^0.1.0-alpha.4",
22
23
  "@nifrajs/deno": "^0.1.0-alpha.4",
23
24
  "@nifrajs/node": "^0.1.0-alpha.4",
24
25
  "@nifrajs/web": "^0.1.0-alpha.4",
@@ -19,6 +19,7 @@
19
19
  "dependencies": {
20
20
  "@nifrajs/client": "^0.1.0-alpha.4",
21
21
  "@nifrajs/core": "^0.1.0-alpha.4",
22
+ "@nifrajs/schema": "^0.1.0-alpha.4",
22
23
  "@nifrajs/deno": "^0.1.0-alpha.4",
23
24
  "@nifrajs/node": "^0.1.0-alpha.4",
24
25
  "@nifrajs/web": "^0.1.0-alpha.4",
@@ -19,6 +19,7 @@
19
19
  "dependencies": {
20
20
  "@nifrajs/client": "^0.1.0-alpha.4",
21
21
  "@nifrajs/core": "^0.1.0-alpha.4",
22
+ "@nifrajs/schema": "^0.1.0-alpha.4",
22
23
  "@nifrajs/deno": "^0.1.0-alpha.4",
23
24
  "@nifrajs/node": "^0.1.0-alpha.4",
24
25
  "@nifrajs/web": "^0.1.0-alpha.4",
@@ -19,6 +19,7 @@
19
19
  "dependencies": {
20
20
  "@nifrajs/client": "^0.1.0-alpha.4",
21
21
  "@nifrajs/core": "^0.1.0-alpha.4",
22
+ "@nifrajs/schema": "^0.1.0-alpha.4",
22
23
  "@nifrajs/deno": "^0.1.0-alpha.4",
23
24
  "@nifrajs/node": "^0.1.0-alpha.4",
24
25
  "@nifrajs/web": "^0.1.0-alpha.4",
@@ -19,6 +19,7 @@
19
19
  "dependencies": {
20
20
  "@nifrajs/client": "^0.1.0-alpha.4",
21
21
  "@nifrajs/core": "^0.1.0-alpha.4",
22
+ "@nifrajs/schema": "^0.1.0-alpha.4",
22
23
  "@nifrajs/deno": "^0.1.0-alpha.4",
23
24
  "@nifrajs/node": "^0.1.0-alpha.4",
24
25
  "@nifrajs/web": "^0.1.0-alpha.4",