create-nowaki 0.18.3 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -26,6 +26,14 @@ After an edit or a failing request, check `recent_errors` first.
|
|
|
26
26
|
```
|
|
27
27
|
routes/ file-based routes (pages + API). _layout.tsx, _middleware.ts,
|
|
28
28
|
_404.tsx, _500.tsx, [slug].tsx, api/*.ts
|
|
29
|
+
(name)/ = route group: no URL segment, its own _layout /
|
|
30
|
+
_middleware for the files inside it (group middleware skips 404s)
|
|
31
|
+
@name/ = parallel route slot: the parent dir's _layout gets
|
|
32
|
+
`slots.name` (the @name file matching the URL, else
|
|
33
|
+
@name/default.tsx, else null). @name/(.)photo/[id].tsx =
|
|
34
|
+
intercepting route: client navigation to /photo/1 shows it in
|
|
35
|
+
the slot (a modal); a reload renders routes/photo/[id].tsx.
|
|
36
|
+
Close it with history.back()
|
|
29
37
|
islands/ interactive components — THE ONLY things that ship JS and hydrate
|
|
30
38
|
components/ shared server components (no client JS)
|
|
31
39
|
lib/ shared server code
|
|
@@ -134,6 +142,17 @@ nowaki.config.mjs plugins (optional)
|
|
|
134
142
|
<a href={route("/blog/[slug]", { slug })}>Post</a> // dynamic, params typed
|
|
135
143
|
```
|
|
136
144
|
Unknown paths, missing params, and wrong param keys are compile errors.
|
|
145
|
+
11. **Markdoc (optional)** — [Markdoc](https://markdoc.dev) via the official
|
|
146
|
+
`@nowaki-dev/markdoc` plugin (`npm install @nowaki-dev/markdoc`). Register it
|
|
147
|
+
in `nowaki.config.mjs` and import `.mdoc` files from routes; they are not
|
|
148
|
+
routes themselves. Upstream docs: `packages/nowaki-markdoc/README.md`.
|
|
149
|
+
```js
|
|
150
|
+
// nowaki.config.mjs
|
|
151
|
+
import { markdoc } from "@nowaki-dev/markdoc";
|
|
152
|
+
export default {
|
|
153
|
+
plugins: [markdoc({ components: "./markdoc/components.tsx", tags: { /* … */ } })],
|
|
154
|
+
};
|
|
155
|
+
```
|
|
137
156
|
|
|
138
157
|
## Security
|
|
139
158
|
|
|
@@ -141,6 +160,11 @@ nowaki.config.mjs plugins (optional)
|
|
|
141
160
|
Use `nowaki start` or a deploy adapter output in production.
|
|
142
161
|
- **Secrets stay server-side.** Only `PUBLIC_*` (and `MODE`) reach the browser. Copy
|
|
143
162
|
`.env.example` to `.env` and keep database URLs, API keys, and tokens unprefixed.
|
|
163
|
+
To validate them, declare them in `env.ts` at the app root with `defineEnv({ server,
|
|
164
|
+
public })` from `@nowaki-dev/runtime/env` and a Standard Schema per variable; the
|
|
165
|
+
build fails on a missing or invalid one. Read server values with
|
|
166
|
+
`import { env } from "@nowaki-dev/runtime/env/server"` in loaders, actions, and server
|
|
167
|
+
functions (never in islands: that fails the build).
|
|
144
168
|
- **Server functions and API routes are public endpoints.** Validate and bound every
|
|
145
169
|
argument; authorize with `getContext()` (cookies/headers) before mutating data.
|
|
146
170
|
Use `serverFn(schema, impl)` for `"use server"` exports that take arguments (see
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
// Nowaki ambient types, so editors understand CSS / asset / virtual-module imports.
|
|
2
2
|
// No need to edit (it only teaches the type checker the framework's import conventions).
|
|
3
|
+
// Keep this file free of top-level import / export. Either one makes it a module, and then the
|
|
4
|
+
// `declare module "*..."` wildcards below stop being ambient declarations. The preact JSX
|
|
5
|
+
// additions (client:* directives) need a module, so they are in nowaki-jsx.d.ts.
|
|
3
6
|
|
|
4
7
|
declare module "*.module.css" {
|
|
5
8
|
const classes: Record<string, string>;
|
|
@@ -46,36 +49,27 @@ declare module "*.mdx" {
|
|
|
46
49
|
export default MDXContent;
|
|
47
50
|
}
|
|
48
51
|
|
|
52
|
+
// Markdoc (@nowaki-dev/markdoc): the default export renders the file; `frontmatter` is its
|
|
53
|
+
// frontmatter and `headings` lists its headings.
|
|
54
|
+
declare module "*.mdoc" {
|
|
55
|
+
export const frontmatter: Record<string, any>;
|
|
56
|
+
export const headings: { depth: number; text: string; id: string }[];
|
|
57
|
+
const MarkdocContent: () => import("preact").JSX.Element;
|
|
58
|
+
export default MarkdocContent;
|
|
59
|
+
}
|
|
60
|
+
|
|
49
61
|
// Plugin virtual modules (resolveId/load in nowaki.config). Any export is allowed.
|
|
50
62
|
declare module "virtual:*";
|
|
51
63
|
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
/** Hydrate when idle, via requestIdleCallback. */
|
|
61
|
-
"client:idle"?: boolean;
|
|
62
|
-
/** Hydrate once visible, via IntersectionObserver. */
|
|
63
|
-
"client:visible"?: boolean;
|
|
64
|
-
/** Hydrate when the media query matches. e.g. client:media="(min-width: 768px)" */
|
|
65
|
-
"client:media"?: string;
|
|
66
|
-
/** Skip SSR and render on the client only (for islands using browser-only APIs). */
|
|
67
|
-
"client:only"?: boolean;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
64
|
+
// import.meta.env (PUBLIC_*, MODE and BASE_URL are inlined at build time). These are global
|
|
65
|
+
// because this file is not a module. `nowaki typegen` adds the types of env.ts's public values
|
|
66
|
+
// in .nowaki/types.d.ts.
|
|
67
|
+
interface ImportMetaEnv {
|
|
68
|
+
readonly MODE: string;
|
|
69
|
+
/** nowaki.config `basePath` with a trailing slash ("/app/"), or "/". */
|
|
70
|
+
readonly BASE_URL: string;
|
|
71
|
+
readonly [key: `PUBLIC_${string}`]: string | undefined;
|
|
70
72
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// import.meta.env (PUBLIC_* and MODE are inlined at build time).
|
|
74
|
-
interface ImportMetaEnv {
|
|
75
|
-
readonly MODE: string;
|
|
76
|
-
readonly [key: `PUBLIC_${string}`]: string | undefined;
|
|
77
|
-
}
|
|
78
|
-
interface ImportMeta {
|
|
79
|
-
readonly env: ImportMetaEnv;
|
|
80
|
-
}
|
|
73
|
+
interface ImportMeta {
|
|
74
|
+
readonly env: ImportMetaEnv;
|
|
81
75
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Nowaki's additions to preact's JSX types. No need to edit.
|
|
2
|
+
// Extends preact's JSX.IntrinsicAttributes so client:* directives can go on any component.
|
|
3
|
+
// The import makes this file a module, which a `declare module "preact"` augmentation needs.
|
|
4
|
+
// The ambient asset declarations are in nowaki-env.d.ts, which must not be a module.
|
|
5
|
+
import "preact";
|
|
6
|
+
|
|
7
|
+
declare module "preact" {
|
|
8
|
+
namespace JSX {
|
|
9
|
+
interface IntrinsicAttributes {
|
|
10
|
+
/** Hydrate on page load (default). */
|
|
11
|
+
"client:load"?: boolean;
|
|
12
|
+
/** Hydrate when idle, via requestIdleCallback. */
|
|
13
|
+
"client:idle"?: boolean;
|
|
14
|
+
/** Hydrate once visible, via IntersectionObserver. */
|
|
15
|
+
"client:visible"?: boolean;
|
|
16
|
+
/** Hydrate when the media query matches. e.g. client:media="(min-width: 768px)" */
|
|
17
|
+
"client:media"?: string;
|
|
18
|
+
/** Skip SSR and render on the client only (for islands using browser-only APIs). */
|
|
19
|
+
"client:only"?: boolean;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
"prerender": "nowaki prerender"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@nowaki-dev/runtime": "^0.
|
|
12
|
+
"@nowaki-dev/runtime": "^0.17.1",
|
|
13
13
|
"preact": "^11.1.1",
|
|
14
14
|
"preact-render-to-string": "^6.8.2"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"nowaki": "^0.
|
|
17
|
+
"nowaki": "^0.18.1"
|
|
18
18
|
}
|
|
19
19
|
}
|