netjes 0.0.0-stage → 0.0.2

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 (222) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -2
  3. package/bin/netjes.mjs +13 -0
  4. package/cli/agents.mjs +66 -0
  5. package/cli/commands.mjs +467 -0
  6. package/cli/help.mjs +89 -0
  7. package/cli/info.mjs +454 -0
  8. package/cli/main.mjs +167 -0
  9. package/cli/packages.mjs +19 -0
  10. package/cli/process-io.mjs +163 -0
  11. package/cli/routes.mjs +31 -0
  12. package/cli/scaffold.mjs +193 -0
  13. package/cli/suggest.mjs +50 -0
  14. package/cli/terminal.mjs +40 -0
  15. package/dist/actions.d.ts +98 -0
  16. package/dist/actions.d.ts.map +1 -0
  17. package/dist/actions.js +176 -0
  18. package/dist/actions.js.map +1 -0
  19. package/dist/client-entry.d.ts +2 -0
  20. package/dist/client-entry.d.ts.map +1 -0
  21. package/dist/client-entry.js +126 -0
  22. package/dist/client-entry.js.map +1 -0
  23. package/dist/deferred.d.ts +39 -0
  24. package/dist/deferred.d.ts.map +1 -0
  25. package/dist/deferred.js +123 -0
  26. package/dist/deferred.js.map +1 -0
  27. package/dist/define-page.d.ts +15 -0
  28. package/dist/define-page.d.ts.map +1 -0
  29. package/dist/define-page.js +27 -0
  30. package/dist/define-page.js.map +1 -0
  31. package/dist/document.d.ts +19 -0
  32. package/dist/document.d.ts.map +1 -0
  33. package/dist/document.js +17 -0
  34. package/dist/document.js.map +1 -0
  35. package/dist/draft-mode.d.ts +5 -0
  36. package/dist/draft-mode.d.ts.map +1 -0
  37. package/dist/draft-mode.js +6 -0
  38. package/dist/draft-mode.js.map +1 -0
  39. package/dist/dynamic.d.ts +20 -0
  40. package/dist/dynamic.d.ts.map +1 -0
  41. package/dist/dynamic.js +37 -0
  42. package/dist/dynamic.js.map +1 -0
  43. package/dist/form-data.d.ts +10 -0
  44. package/dist/form-data.d.ts.map +1 -0
  45. package/dist/form-data.js +10 -0
  46. package/dist/form-data.js.map +1 -0
  47. package/dist/form.d.ts +35 -0
  48. package/dist/form.d.ts.map +1 -0
  49. package/dist/form.js +80 -0
  50. package/dist/form.js.map +1 -0
  51. package/dist/href.d.ts +25 -0
  52. package/dist/href.d.ts.map +1 -0
  53. package/dist/href.js +71 -0
  54. package/dist/href.js.map +1 -0
  55. package/dist/image.d.ts +36 -0
  56. package/dist/image.d.ts.map +1 -0
  57. package/dist/image.js +60 -0
  58. package/dist/image.js.map +1 -0
  59. package/dist/index.d.ts +18 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +14 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/link.d.ts +17 -0
  64. package/dist/link.d.ts.map +1 -0
  65. package/dist/link.js +46 -0
  66. package/dist/link.js.map +1 -0
  67. package/dist/locale.d.ts +3 -0
  68. package/dist/locale.d.ts.map +1 -0
  69. package/dist/locale.js +6 -0
  70. package/dist/locale.js.map +1 -0
  71. package/dist/metadata.d.ts +83 -0
  72. package/dist/metadata.d.ts.map +1 -0
  73. package/dist/metadata.js +100 -0
  74. package/dist/metadata.js.map +1 -0
  75. package/dist/modules.d.ts +74 -0
  76. package/dist/modules.d.ts.map +1 -0
  77. package/dist/modules.js +85 -0
  78. package/dist/modules.js.map +1 -0
  79. package/dist/nonce.d.ts +8 -0
  80. package/dist/nonce.d.ts.map +1 -0
  81. package/dist/nonce.js +12 -0
  82. package/dist/nonce.js.map +1 -0
  83. package/dist/payload.d.ts +171 -0
  84. package/dist/payload.d.ts.map +1 -0
  85. package/dist/payload.js +273 -0
  86. package/dist/payload.js.map +1 -0
  87. package/dist/public-config.d.ts +11 -0
  88. package/dist/public-config.d.ts.map +1 -0
  89. package/dist/public-config.js +10 -0
  90. package/dist/public-config.js.map +1 -0
  91. package/dist/query.d.ts +22 -0
  92. package/dist/query.d.ts.map +1 -0
  93. package/dist/query.js +68 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/render-cleanup.d.ts +6 -0
  96. package/dist/render-cleanup.d.ts.map +1 -0
  97. package/dist/render-cleanup.js +7 -0
  98. package/dist/render-cleanup.js.map +1 -0
  99. package/dist/root.d.ts +12 -0
  100. package/dist/root.d.ts.map +1 -0
  101. package/dist/root.js +26 -0
  102. package/dist/root.js.map +1 -0
  103. package/dist/route-tree.d.ts +56 -0
  104. package/dist/route-tree.d.ts.map +1 -0
  105. package/dist/route-tree.js +86 -0
  106. package/dist/route-tree.js.map +1 -0
  107. package/dist/router.d.ts +118 -0
  108. package/dist/router.d.ts.map +1 -0
  109. package/dist/router.js +938 -0
  110. package/dist/router.js.map +1 -0
  111. package/dist/schema.d.ts +35 -0
  112. package/dist/schema.d.ts.map +1 -0
  113. package/dist/schema.js +74 -0
  114. package/dist/schema.js.map +1 -0
  115. package/dist/script.d.ts +23 -0
  116. package/dist/script.d.ts.map +1 -0
  117. package/dist/script.js +89 -0
  118. package/dist/script.js.map +1 -0
  119. package/dist/server-entry.d.ts +2 -0
  120. package/dist/server-entry.d.ts.map +1 -0
  121. package/dist/server-entry.js +4 -0
  122. package/dist/server-entry.js.map +1 -0
  123. package/dist/server-render.d.ts +19 -0
  124. package/dist/server-render.d.ts.map +1 -0
  125. package/dist/server-render.js +193 -0
  126. package/dist/server-render.js.map +1 -0
  127. package/dist/testing-setup.d.ts +2 -0
  128. package/dist/testing-setup.d.ts.map +1 -0
  129. package/dist/testing-setup.js +8 -0
  130. package/dist/testing-setup.js.map +1 -0
  131. package/dist/testing.d.ts +76 -0
  132. package/dist/testing.d.ts.map +1 -0
  133. package/dist/testing.js +106 -0
  134. package/dist/testing.js.map +1 -0
  135. package/dist/vitals-config.d.ts +4 -0
  136. package/dist/vitals-config.d.ts.map +1 -0
  137. package/dist/vitals-config.js +5 -0
  138. package/dist/vitals-config.js.map +1 -0
  139. package/dist/vitals.d.ts +13 -0
  140. package/dist/vitals.d.ts.map +1 -0
  141. package/dist/vitals.js +60 -0
  142. package/dist/vitals.js.map +1 -0
  143. package/dist/zod.d.ts +19 -0
  144. package/dist/zod.d.ts.map +1 -0
  145. package/dist/zod.js +65 -0
  146. package/dist/zod.js.map +1 -0
  147. package/package.json +147 -4
  148. package/sidecar/server.mjs +325 -0
  149. package/skills/netjes/SKILL.md +93 -0
  150. package/skills/netjes/references/caching-and-streaming.md +68 -0
  151. package/skills/netjes/references/data-and-actions.md +98 -0
  152. package/skills/netjes/references/deployment.md +57 -0
  153. package/skills/netjes/references/routing.md +65 -0
  154. package/skills/netjes/references/testing.md +57 -0
  155. package/src/actions.tsx +241 -0
  156. package/src/client-entry.tsx +126 -0
  157. package/src/deferred.ts +134 -0
  158. package/src/define-page.tsx +41 -0
  159. package/src/document.tsx +49 -0
  160. package/src/draft-mode.ts +6 -0
  161. package/src/dynamic.tsx +64 -0
  162. package/src/form-data.ts +10 -0
  163. package/src/form.tsx +122 -0
  164. package/src/href.ts +79 -0
  165. package/src/image.tsx +91 -0
  166. package/src/index.ts +40 -0
  167. package/src/link.tsx +73 -0
  168. package/src/locale.ts +6 -0
  169. package/src/metadata.tsx +181 -0
  170. package/src/modules.ts +133 -0
  171. package/src/nonce.tsx +14 -0
  172. package/src/payload.ts +405 -0
  173. package/src/public-config.tsx +19 -0
  174. package/src/query.tsx +82 -0
  175. package/src/render-cleanup.ts +7 -0
  176. package/src/root.tsx +39 -0
  177. package/src/route-tree.tsx +139 -0
  178. package/src/router.tsx +1188 -0
  179. package/src/schema.ts +98 -0
  180. package/src/script.tsx +103 -0
  181. package/src/server-entry.tsx +4 -0
  182. package/src/server-render.tsx +223 -0
  183. package/src/testing-setup.ts +8 -0
  184. package/src/testing.tsx +177 -0
  185. package/src/virtual.d.ts +12 -0
  186. package/src/vitals-config.ts +6 -0
  187. package/src/vitals.tsx +68 -0
  188. package/src/zod.ts +72 -0
  189. package/template/.dockerignore +11 -0
  190. package/template/Dockerfile +58 -0
  191. package/template/Features/Home/HomePage.cs +32 -0
  192. package/template/Program.cs +28 -0
  193. package/template/Properties/launchSettings.json +13 -0
  194. package/template/README.md +24 -0
  195. package/template/SiteProps.cs +4 -0
  196. package/template/_AGENTS.md +64 -0
  197. package/template/_CLAUDE.md +1 -0
  198. package/template/__NAME__.csproj +11 -0
  199. package/template/_gitattributes +2 -0
  200. package/template/_gitignore +11 -0
  201. package/template/app/about/page.tsx +17 -0
  202. package/template/app/error.tsx +15 -0
  203. package/template/app/layout.tsx +33 -0
  204. package/template/app/not-found.tsx +14 -0
  205. package/template/app/page.tsx +14 -0
  206. package/template/appsettings.Development.json +3 -0
  207. package/template/appsettings.json +9 -0
  208. package/template/components/Greeting.test.tsx +25 -0
  209. package/template/components/Greeting.tsx +26 -0
  210. package/template/components/HelloForm.test.tsx +27 -0
  211. package/template/components/HelloForm.tsx +34 -0
  212. package/template/docker-compose.override.yml +15 -0
  213. package/template/docker-compose.prod.yml +26 -0
  214. package/template/docker-compose.yml +16 -0
  215. package/template/generated/netjes.ts +73 -0
  216. package/template/package.json +36 -0
  217. package/template/public/favicon.svg +6 -0
  218. package/template/styles/global.css +7 -0
  219. package/template/tsconfig.json +19 -0
  220. package/template/vite.config.ts +7 -0
  221. package/vite/plugin.d.ts +29 -0
  222. package/vite/plugin.mjs +291 -0
package/dist/link.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { AnchorHTMLAttributes } from 'react';
2
+ import type { Href } from './href.ts';
3
+ /** The props of `<Link>`: an anchor's own, with a typed `href` and the client navigation options. */
4
+ export type LinkProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {
5
+ /** Typed by the app's routes once `netjes generate` has registered them. */
6
+ href: Href;
7
+ replace?: boolean;
8
+ /** Scroll to the top (or the #fragment) after navigating. Default true. */
9
+ scroll?: boolean;
10
+ /** `intent` (default) fetches the next page on hover or focus. */
11
+ prefetch?: 'intent' | 'none';
12
+ /** Let the browser follow it with a full page load, e.g. for a file download or a page outside Netjes. */
13
+ reloadDocument?: boolean;
14
+ };
15
+ /** An `<a>` that navigates on the client. Ctrl/cmd-click, new tabs and external URLs behave like a normal link. */
16
+ export declare function Link({ href, replace, scroll, prefetch, reloadDocument, onClick, onMouseEnter, onFocus, onTouchStart, ...rest }: LinkProps): import("react").JSX.Element;
17
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,OAAO,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC,qGAAqG;AACrG,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,GAAG;IAC9E,4EAA4E;IAC5E,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,0GAA0G;IAC1G,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAsBF,mHAAmH;AACnH,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,OAAe,EAAE,MAAa,EAAE,QAAmB,EAAE,cAAsB,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,+BAkC3K"}
package/dist/link.js ADDED
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useBasePath, useInternalRouter, usePathname, withBasePath } from './router.js';
3
+ const BASE = 'http://netjes.invalid';
4
+ function isCurrentPath(href, pathname) {
5
+ const url = new URL(href, BASE + pathname);
6
+ return url.origin === BASE && url.pathname === pathname;
7
+ }
8
+ function isPlainLeftClick(event) {
9
+ const anchor = event.currentTarget;
10
+ return (event.button === 0 &&
11
+ !event.metaKey &&
12
+ !event.ctrlKey &&
13
+ !event.shiftKey &&
14
+ !event.altKey &&
15
+ (!anchor.target || anchor.target === '_self') &&
16
+ !anchor.hasAttribute('download'));
17
+ }
18
+ /** An `<a>` that navigates on the client. Ctrl/cmd-click, new tabs and external URLs behave like a normal link. */
19
+ export function Link({ href, replace = false, scroll = true, prefetch = 'intent', reloadDocument = false, onClick, onMouseEnter, onFocus, onTouchStart, ...rest }) {
20
+ const router = useInternalRouter();
21
+ const pathname = usePathname();
22
+ const basePath = useBasePath();
23
+ const warm = () => {
24
+ if (prefetch === 'intent' && !reloadDocument)
25
+ router.prefetch(href);
26
+ };
27
+ return (_jsx("a", { href: withBasePath(href, basePath), "aria-current": isCurrentPath(href, pathname) ? 'page' : undefined, ...rest, onClick: (event) => {
28
+ onClick?.(event);
29
+ if (event.defaultPrevented || reloadDocument || !isPlainLeftClick(event))
30
+ return;
31
+ if (new URL(href, window.location.href).origin !== window.location.origin)
32
+ return;
33
+ event.preventDefault();
34
+ void (replace ? router.replace(href, { scroll }) : router.push(href, { scroll }));
35
+ }, onMouseEnter: (event) => {
36
+ onMouseEnter?.(event);
37
+ warm();
38
+ }, onFocus: (event) => {
39
+ onFocus?.(event);
40
+ warm();
41
+ }, onTouchStart: (event) => {
42
+ onTouchStart?.(event);
43
+ warm();
44
+ } }));
45
+ }
46
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** The request culture the server rendered this page in (`AddNetjesLocalization`), e.g. `nl`; null without localization. */
2
+ export declare function useLocale(): string | null;
3
+ //# sourceMappingURL=locale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":"AAEA,4HAA4H;AAC5H,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAEzC"}
package/dist/locale.js ADDED
@@ -0,0 +1,6 @@
1
+ import { usePagePayload } from './router.js';
2
+ /** The request culture the server rendered this page in (`AddNetjesLocalization`), e.g. `nl`; null without localization. */
3
+ export function useLocale() {
4
+ return usePagePayload().locale ?? null;
5
+ }
6
+ //# sourceMappingURL=locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.js","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAc,CAAC;AAE9C,4HAA4H;AAC5H,MAAM,UAAU,SAAS;IACvB,OAAO,cAAc,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC;AACzC,CAAC"}
@@ -0,0 +1,83 @@
1
+ /** A title, or a layout's `default` and `template` (`'%s · Site'`), or an `absolute` title that skips templates. */
2
+ export type MetadataTitle = string | {
3
+ default?: string;
4
+ template?: string;
5
+ absolute?: string;
6
+ };
7
+ /** An image for a link preview: `og:image` with `og:image:width`, `og:image:height` and `og:image:alt` when given, or `twitter:image` with `twitter:image:alt`. */
8
+ export type MetadataImage = {
9
+ url: string | URL;
10
+ width?: number;
11
+ height?: number;
12
+ alt?: string;
13
+ };
14
+ /** One image or several, each a URL (a string or a `URL`) or a `MetadataImage`, as Next.js takes them. */
15
+ type MetadataImages = string | URL | MetadataImage | (string | URL | MetadataImage)[];
16
+ /** An image with its URL as a string, as the tags are written from it. */
17
+ type ResolvedImage = Omit<MetadataImage, 'url'> & {
18
+ url: string;
19
+ };
20
+ /** The type of `export const metadata` in pages, layouts and special pages: the head tags a route sets, merged from the layouts down. */
21
+ export type Metadata = {
22
+ title?: MetadataTitle;
23
+ description?: string;
24
+ keywords?: string[];
25
+ authors?: {
26
+ name: string;
27
+ url?: string;
28
+ }[];
29
+ robots?: string | {
30
+ index?: boolean;
31
+ follow?: boolean;
32
+ };
33
+ alternates?: {
34
+ canonical?: string;
35
+ languages?: Record<string, string>;
36
+ };
37
+ openGraph?: {
38
+ title?: string;
39
+ description?: string;
40
+ url?: string;
41
+ siteName?: string;
42
+ type?: string;
43
+ locale?: string;
44
+ images?: MetadataImages;
45
+ };
46
+ twitter?: {
47
+ card?: 'summary' | 'summary_large_image' | 'app' | 'player';
48
+ site?: string;
49
+ creator?: string;
50
+ title?: string;
51
+ description?: string;
52
+ images?: MetadataImages;
53
+ };
54
+ icons?: {
55
+ icon?: string;
56
+ apple?: string;
57
+ };
58
+ themeColor?: string;
59
+ other?: Record<string, string>;
60
+ };
61
+ type OpenGraph = NonNullable<Metadata['openGraph']>;
62
+ type Twitter = NonNullable<Metadata['twitter']>;
63
+ /** The merged result: one title string, the images as a list, everything else merged field by field (later wins). */
64
+ export type ResolvedMetadata = Omit<Metadata, 'title' | 'openGraph' | 'twitter'> & {
65
+ title?: string;
66
+ openGraph?: Omit<OpenGraph, 'images'> & {
67
+ images?: ResolvedImage[];
68
+ };
69
+ twitter?: Omit<Twitter, 'images'> & {
70
+ images?: ResolvedImage[];
71
+ };
72
+ };
73
+ /**
74
+ * Merges the layouts' metadata (outermost first), the page's, and the server's. A layout's `title.template` applies
75
+ * to titles below it, `title.default` is used when nothing below sets one, `title.absolute` skips templates.
76
+ */
77
+ export declare function resolveMetadata(layouts: readonly (Metadata | undefined)[], page: Metadata | undefined, server?: Metadata): ResolvedMetadata;
78
+ /** The tags for resolved metadata; rendered anywhere, React puts them in <head>. */
79
+ export declare function MetadataTags({ metadata }: {
80
+ metadata: ResolvedMetadata;
81
+ }): import("react").JSX.Element;
82
+ export {};
83
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // The Next.js Metadata API: `export const metadata` from pages and layouts, plus metadata sent by the C# loader
3
+ // (`.WithMetadata(...)`, the counterpart of generateMetadata). React 19 hoists the tags into <head>.
4
+ import { Fragment } from 'react';
5
+ function titleOf(title, template) {
6
+ if (title === undefined)
7
+ return undefined;
8
+ // A function replacer: a title such as "Save $& now" must not be read as a replacement pattern.
9
+ if (typeof title === 'string')
10
+ return template ? template.replace('%s', () => title) : title;
11
+ if (title.absolute !== undefined)
12
+ return title.absolute;
13
+ return title.default;
14
+ }
15
+ /** The images as a list of descriptors with string URLs; like Next.js, a null image or one without a URL is left out. */
16
+ function imagesOf(images) {
17
+ return (Array.isArray(images) ? images : [images])
18
+ // The types allow no null, but an untyped page can pass one.
19
+ .filter((image) => !!image)
20
+ .map((image) => (typeof image === 'string' || image instanceof URL ? { url: String(image) } : { ...image, url: String(image.url ?? '') }))
21
+ .filter((image) => image.url !== '');
22
+ }
23
+ function withImages(group) {
24
+ const { images, ...rest } = group;
25
+ return images == null ? rest : { ...rest, images: imagesOf(images) };
26
+ }
27
+ /**
28
+ * Merges the layouts' metadata (outermost first), the page's, and the server's. A layout's `title.template` applies
29
+ * to titles below it, `title.default` is used when nothing below sets one, `title.absolute` skips templates.
30
+ */
31
+ export function resolveMetadata(layouts, page, server) {
32
+ let resolved = {};
33
+ let template;
34
+ for (const metadata of [...layouts, page, server]) {
35
+ if (!metadata)
36
+ continue;
37
+ const { title, openGraph, twitter, alternates, icons, other, ...rest } = metadata;
38
+ resolved = { ...resolved, ...rest };
39
+ if (title !== undefined) {
40
+ // A layout's own default is not put through its own template, only templates from above.
41
+ const own = titleOf(title, typeof title === 'string' || title.default === undefined ? template : undefined);
42
+ if (own !== undefined)
43
+ resolved.title = own;
44
+ if (typeof title === 'object' && title.template)
45
+ template = title.template;
46
+ }
47
+ if (openGraph)
48
+ resolved.openGraph = { ...resolved.openGraph, ...withImages(openGraph) };
49
+ if (twitter)
50
+ resolved.twitter = { ...resolved.twitter, ...withImages(twitter) };
51
+ if (alternates)
52
+ resolved.alternates = { ...resolved.alternates, ...alternates };
53
+ if (icons)
54
+ resolved.icons = { ...resolved.icons, ...icons };
55
+ if (other)
56
+ resolved.other = { ...resolved.other, ...other };
57
+ }
58
+ return fillTwitter(resolved);
59
+ }
60
+ /**
61
+ * Next.js's last step, once everything is merged: with Open Graph or Twitter metadata, Twitter takes the title,
62
+ * description and images it does not set from Open Graph, or the page's title (as its templates made it) and
63
+ * description where there is no Open Graph one. Without a card it gets `summary_large_image` when its own images have
64
+ * one, or with no twitter metadata at all the images it took, and `summary` otherwise.
65
+ */
66
+ function fillTwitter(resolved) {
67
+ const { openGraph: og, twitter } = resolved;
68
+ if (!og && !twitter)
69
+ return resolved;
70
+ const title = twitter?.title || og?.title || resolved.title;
71
+ const description = twitter?.description || og?.description || resolved.description;
72
+ const images = twitter?.images ?? og?.images;
73
+ const card = twitter?.card ?? ((twitter ? twitter.images : images)?.length ? 'summary_large_image' : 'summary');
74
+ return {
75
+ ...resolved,
76
+ twitter: {
77
+ ...twitter,
78
+ card,
79
+ ...(title ? { title } : {}),
80
+ ...(description ? { description } : {}),
81
+ ...(images ? { images } : {}),
82
+ },
83
+ };
84
+ }
85
+ function robotsContent(robots) {
86
+ if (robots === undefined || typeof robots === 'string')
87
+ return robots;
88
+ return `${robots.index === false ? 'noindex' : 'index'}, ${robots.follow === false ? 'nofollow' : 'follow'}`;
89
+ }
90
+ /** The tags for resolved metadata; rendered anywhere, React puts them in <head>. */
91
+ export function MetadataTags({ metadata }) {
92
+ const og = metadata.openGraph;
93
+ const twitter = metadata.twitter;
94
+ const robots = robotsContent(metadata.robots);
95
+ // As in Next.js, an empty Open Graph title or description counts as not set, and an empty tag is not written.
96
+ const ogTitle = og ? og.title || metadata.title : undefined;
97
+ const ogDescription = og ? og.description || metadata.description : undefined;
98
+ return (_jsxs(_Fragment, { children: [metadata.title !== undefined && _jsx("title", { children: metadata.title }), metadata.description !== undefined && _jsx("meta", { name: "description", content: metadata.description }), metadata.keywords && _jsx("meta", { name: "keywords", content: metadata.keywords.join(', ') }), metadata.authors?.map((author) => _jsx("meta", { name: "author", content: author.name }, author.name)), robots && _jsx("meta", { name: "robots", content: robots }), metadata.themeColor && _jsx("meta", { name: "theme-color", content: metadata.themeColor }), metadata.alternates?.canonical && _jsx("link", { rel: "canonical", href: metadata.alternates.canonical }), Object.entries(metadata.alternates?.languages ?? {}).map(([lang, href]) => (_jsx("link", { rel: "alternate", hrefLang: lang, href: href }, lang))), metadata.icons?.icon && _jsx("link", { rel: "icon", href: metadata.icons.icon }), metadata.icons?.apple && _jsx("link", { rel: "apple-touch-icon", href: metadata.icons.apple }), ogTitle && _jsx("meta", { property: "og:title", content: ogTitle }), ogDescription && _jsx("meta", { property: "og:description", content: ogDescription }), og?.url && _jsx("meta", { property: "og:url", content: og.url }), og?.siteName && _jsx("meta", { property: "og:site_name", content: og.siteName }), og?.type && _jsx("meta", { property: "og:type", content: og.type }), og?.locale && _jsx("meta", { property: "og:locale", content: og.locale }), og?.images?.map((image, index) => (_jsxs(Fragment, { children: [_jsx("meta", { property: "og:image", content: image.url }), !!image.width && _jsx("meta", { property: "og:image:width", content: String(image.width) }), !!image.height && _jsx("meta", { property: "og:image:height", content: String(image.height) }), !!image.alt && _jsx("meta", { property: "og:image:alt", content: image.alt })] }, `${index}:${image.url}`))), twitter?.card && _jsx("meta", { name: "twitter:card", content: twitter.card }), twitter?.site && _jsx("meta", { name: "twitter:site", content: twitter.site }), twitter?.creator && _jsx("meta", { name: "twitter:creator", content: twitter.creator }), twitter?.title && _jsx("meta", { name: "twitter:title", content: twitter.title }), twitter?.description && _jsx("meta", { name: "twitter:description", content: twitter.description }), twitter?.images?.map((image, index) => (_jsxs(Fragment, { children: [_jsx("meta", { name: "twitter:image", content: image.url }), !!image.alt && _jsx("meta", { name: "twitter:image:alt", content: image.alt })] }, `${index}:${image.url}`))), Object.entries(metadata.other ?? {}).map(([name, content]) => (_jsx("meta", { name: name, content: content }, name)))] }));
99
+ }
100
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { ComponentType, ReactNode } from 'react';
2
+ import type { Metadata } from './metadata.tsx';
3
+ import type { Params, SegmentRef } from './payload.ts';
4
+ export type PageComponent = ComponentType<Record<string, unknown>>;
5
+ /** The props every layout gets: its `children` and the route `params`. The loader's props and parallel route slots arrive as further props. */
6
+ export type LayoutProps = {
7
+ children: ReactNode;
8
+ params: Params;
9
+ };
10
+ export type LayoutComponent = ComponentType<LayoutProps & Record<string, unknown>>;
11
+ /** The props of an `error.tsx`: what was thrown, and a way to try rendering the segment again. */
12
+ export type ErrorPageProps = {
13
+ error: Error & {
14
+ status?: number;
15
+ };
16
+ reset: () => void;
17
+ };
18
+ export type LoadedSegment = {
19
+ id: string;
20
+ /** The layout's `export const metadata`. */
21
+ metadata?: Metadata;
22
+ Layout?: LayoutComponent;
23
+ Template?: ComponentType<{
24
+ children: ReactNode;
25
+ }>;
26
+ Loading?: ComponentType;
27
+ Error?: ComponentType<ErrorPageProps>;
28
+ /** Parallel routes: what each slot renders (null when it renders nothing for this page). */
29
+ slots?: Record<string, ComponentType<{
30
+ params: Params;
31
+ }> | null>;
32
+ };
33
+ /** What `import.meta.glob` produces: root-relative paths (`/app/x/page.tsx`) to lazy imports. */
34
+ export type ModuleMap = Record<string, () => Promise<unknown>>;
35
+ export type RouteModules = {
36
+ page: PageComponent | null;
37
+ segments: LoadedSegment[];
38
+ pageMetadata?: Metadata;
39
+ };
40
+ export type ModuleLoader = {
41
+ load(file: string): Promise<ComponentType<never>>;
42
+ /** A loaded module's `export const metadata`, if any. */
43
+ metadataOf(file: string): Metadata | undefined;
44
+ loadRoute(route: {
45
+ page: string | null;
46
+ segments: readonly SegmentRef[];
47
+ }): Promise<RouteModules>;
48
+ };
49
+ /** The server knows a page this client build does not: the app was redeployed or a page was just added. */
50
+ export declare class MissingModuleError extends Error {
51
+ name: string;
52
+ readonly file: string;
53
+ constructor(file: string);
54
+ }
55
+ /**
56
+ * A module's import failed in the browser: the network dropped the request, a deploy removed its chunk, or the module
57
+ * threw while it ran. The browser's own error is its `cause`, and its message is in this one's: for a chunk that did
58
+ * not load, that names only the chunk.
59
+ */
60
+ export declare class ModuleLoadError extends Error {
61
+ name: string;
62
+ readonly file: string;
63
+ constructor(file: string, cause: unknown);
64
+ }
65
+ export type ModuleLoaderOptions = {
66
+ /**
67
+ * Reject a failed import with a {@link ModuleLoadError} that names the app's file. The client entry turns it on. The
68
+ * server leaves it off: an import that fails there is the app's code (a syntax error, a bad import, a module that
69
+ * needs the browser), and its own message and stack are what the sidecar logs and the development error page shows.
70
+ */
71
+ nameFailedImports?: boolean;
72
+ };
73
+ export declare function createModuleLoader(modules: ModuleMap, options?: ModuleLoaderOptions): ModuleLoader;
74
+ //# sourceMappingURL=modules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACnE,+IAA+I;AAC/I,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACnF,kGAAkG;AAClG,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,KAAK,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AAEvF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IACtC,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAAC;CAClE,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE9G,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,yDAAyD;IACzD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/C,SAAS,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACnG,CAAC;AAEF,2GAA2G;AAC3G,qBAAa,kBAAmB,SAAQ,KAAK;IAClC,IAAI,SAAwB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,YAAY,IAAI,EAAE,MAAM,EAGvB;CACF;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAC/B,IAAI,SAAqB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,YAAY,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAGvC;CACF;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CA2DtG"}
@@ -0,0 +1,85 @@
1
+ /** The server knows a page this client build does not: the app was redeployed or a page was just added. */
2
+ export class MissingModuleError extends Error {
3
+ name = 'MissingModuleError';
4
+ file;
5
+ constructor(file) {
6
+ super(`netjes: no module for ${file} in this build`);
7
+ this.file = file;
8
+ }
9
+ }
10
+ /**
11
+ * A module's import failed in the browser: the network dropped the request, a deploy removed its chunk, or the module
12
+ * threw while it ran. The browser's own error is its `cause`, and its message is in this one's: for a chunk that did
13
+ * not load, that names only the chunk.
14
+ */
15
+ export class ModuleLoadError extends Error {
16
+ name = 'ModuleLoadError';
17
+ file;
18
+ constructor(file, cause) {
19
+ super(`netjes: ${file} could not be loaded (${cause instanceof Error ? cause.message : String(cause)})`, { cause });
20
+ this.file = file;
21
+ }
22
+ }
23
+ function isComponent(value) {
24
+ // Function components, classes, and the objects returned by memo/forwardRef/lazy.
25
+ return typeof value === 'function' || (typeof value === 'object' && value !== null && '$$typeof' in value);
26
+ }
27
+ export function createModuleLoader(modules, options = {}) {
28
+ const cache = new Map();
29
+ const metadata = new Map();
30
+ function load(file) {
31
+ const cached = cache.get(file);
32
+ if (cached)
33
+ return cached;
34
+ const importer = modules[`/${file}`];
35
+ if (!importer)
36
+ return Promise.reject(new MissingModuleError(file));
37
+ const loading = importer().then((module) => {
38
+ const component = typeof module === 'object' && module !== null && 'default' in module ? module.default : undefined;
39
+ if (!isComponent(component))
40
+ throw new Error(`netjes: ${file} must have a default export that is a React component`);
41
+ const exported = module.metadata;
42
+ if (typeof exported === 'object' && exported !== null)
43
+ metadata.set(file, exported);
44
+ return component;
45
+ }, (error) => {
46
+ throw options.nameFailedImports ? new ModuleLoadError(file, error) : error;
47
+ });
48
+ cache.set(file, loading);
49
+ loading.catch(() => cache.delete(file));
50
+ return loading;
51
+ }
52
+ return {
53
+ load,
54
+ metadataOf: (file) => metadata.get(file),
55
+ async loadRoute(route) {
56
+ const optional = (file) => (file ? load(file) : Promise.resolve(undefined));
57
+ const [page, segments] = await Promise.all([
58
+ route.page ? load(route.page) : null,
59
+ Promise.all(route.segments.map(async (segment) => {
60
+ const [Layout, Template, Loading, Error] = await Promise.all([segment.layout, segment.template, segment.loading, segment.error].map(optional));
61
+ const loaded = { id: segment.id };
62
+ if (segment.slots) {
63
+ const entries = await Promise.all(Object.entries(segment.slots).map(async ([name, file]) => [name, file ? await load(file) : null]));
64
+ loaded.slots = Object.fromEntries(entries);
65
+ }
66
+ const layoutMetadata = segment.layout ? metadata.get(segment.layout) : undefined;
67
+ if (layoutMetadata)
68
+ loaded.metadata = layoutMetadata;
69
+ if (Layout)
70
+ loaded.Layout = Layout;
71
+ if (Template)
72
+ loaded.Template = Template;
73
+ if (Loading)
74
+ loaded.Loading = Loading;
75
+ if (Error)
76
+ loaded.Error = Error;
77
+ return loaded;
78
+ })),
79
+ ]);
80
+ const pageMetadata = route.page ? metadata.get(route.page) : undefined;
81
+ return { page: (page ?? null), segments, ...(pageMetadata ? { pageMetadata } : {}) };
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Provided by Netjes from the first document (`NetjesOptions.ContentSecurityPolicy` or `HttpContext.GetCspNonce()`). */
2
+ export declare const NonceProvider: import("react").Provider<string | undefined>;
3
+ /**
4
+ * This page's Content-Security-Policy nonce, for inline scripts and styles of your own; undefined without one (no
5
+ * policy, or one without `{nonce}`).
6
+ */
7
+ export declare function useNonce(): string | undefined;
8
+ //# sourceMappingURL=nonce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonce.d.ts","sourceRoot":"","sources":["../src/nonce.tsx"],"names":[],"mappings":"AAIA,yHAAyH;AACzH,eAAO,MAAM,aAAa,8CAAwB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7C"}
package/dist/nonce.js ADDED
@@ -0,0 +1,12 @@
1
+ import { createContext, useContext } from 'react';
2
+ const NonceContext = createContext(undefined);
3
+ /** Provided by Netjes from the first document (`NetjesOptions.ContentSecurityPolicy` or `HttpContext.GetCspNonce()`). */
4
+ export const NonceProvider = NonceContext.Provider;
5
+ /**
6
+ * This page's Content-Security-Policy nonce, for inline scripts and styles of your own; undefined without one (no
7
+ * policy, or one without `{nonce}`).
8
+ */
9
+ export function useNonce() {
10
+ return useContext(NonceContext);
11
+ }
12
+ //# sourceMappingURL=nonce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonce.js","sourceRoot":"","sources":["../src/nonce.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAElD,MAAM,YAAY,GAAG,aAAa,CAAqB,SAAS,CAAC,CAAC;AAElE,yHAAyH;AACzH,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC"}