vike 0.4.142-commit-acfc159 → 0.4.143-commit-f03b42d

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 (147) hide show
  1. package/dist/cjs/node/plugin/index.js +2 -2
  2. package/dist/cjs/node/plugin/plugins/buildConfig.js +4 -5
  3. package/dist/cjs/node/plugin/plugins/commonConfig.js +1 -6
  4. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +2 -2
  5. package/dist/cjs/node/plugin/plugins/importUserCode/generateEagerImport.js +19 -8
  6. package/dist/cjs/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +2 -2
  7. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +103 -95
  8. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +37 -27
  9. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +50 -80
  10. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/helpers.js +12 -3
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/replaceImportStatements.js +25 -25
  12. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/transpileAndExecuteFile.js +19 -16
  13. package/dist/cjs/node/plugin/shared/{getConfigValueSource.js → getConfigValueSourcesRelevant.js} +1 -12
  14. package/dist/cjs/node/plugin/shared/loggerNotProd.js +1 -1
  15. package/dist/cjs/node/plugin/utils.js +1 -2
  16. package/dist/cjs/node/prerender/runPrerender.js +13 -16
  17. package/dist/cjs/node/runtime/html/stream.js +4 -1
  18. package/dist/cjs/node/runtime/renderPage/analyzePage.js +2 -2
  19. package/dist/cjs/node/runtime/renderPage/loadPageFilesServerSide.js +2 -2
  20. package/dist/cjs/node/shared/virtual-files/virtualFilePageConfigValuesAll.js +1 -1
  21. package/dist/cjs/shared/error-page.js +1 -1
  22. package/dist/cjs/shared/getPageFiles/assertPageConfigs.js +13 -13
  23. package/dist/cjs/shared/getPageFiles/getExports.js +3 -3
  24. package/dist/cjs/shared/getPageFiles/parseGlobResults.js +9 -43
  25. package/dist/cjs/shared/getPageFiles/parsePageConfigsSerialized.js +62 -0
  26. package/dist/cjs/shared/page-configs/assertExports.js +60 -0
  27. package/dist/cjs/shared/page-configs/loadConfigValues.js +18 -0
  28. package/dist/cjs/shared/page-configs/parseConfigValuesImported.js +50 -0
  29. package/dist/cjs/shared/page-configs/utils.js +1 -1
  30. package/dist/cjs/shared/route/loadPageRoutes.js +11 -13
  31. package/dist/cjs/shared/route/resolvePrecedence.js +32 -11
  32. package/dist/cjs/shared/route/resolveRedirects.js +1 -1
  33. package/dist/cjs/shared/route/resolveRouteFunction.js +1 -0
  34. package/dist/cjs/shared/route/resolveRouteString.js +99 -43
  35. package/dist/cjs/shared/utils.js +1 -1
  36. package/dist/cjs/types/defineConfig.js +7 -0
  37. package/dist/cjs/types/index.js +3 -0
  38. package/dist/cjs/utils/objectAssign.js +3 -1
  39. package/dist/cjs/utils/projectInfo.js +1 -1
  40. package/dist/cjs/utils/{resolve.js → requireResolve.js} +3 -3
  41. package/dist/esm/__internal/index.d.ts +3 -3
  42. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +2 -2
  43. package/dist/esm/client/client-routing-runtime/getPageContext.d.ts +2 -2
  44. package/dist/esm/client/client-routing-runtime/getPageId.d.ts +2 -2
  45. package/dist/esm/client/client-routing-runtime/prefetch.js +3 -1
  46. package/dist/esm/client/client-routing-runtime/useClientRouter.js +2 -2
  47. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +1 -1
  48. package/dist/esm/client/shared/executeOnRenderClientHook.d.ts +2 -2
  49. package/dist/esm/client/shared/loadPageFilesClientSide.d.ts +2 -2
  50. package/dist/esm/client/shared/loadPageFilesClientSide.js +2 -2
  51. package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.d.ts +2 -2
  52. package/dist/esm/node/plugin/index.js +3 -2
  53. package/dist/esm/node/plugin/plugins/buildConfig.js +4 -5
  54. package/dist/esm/node/plugin/plugins/commonConfig.js +1 -6
  55. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +1 -1
  56. package/dist/esm/node/plugin/plugins/importUserCode/generateEagerImport.d.ts +13 -2
  57. package/dist/esm/node/plugin/plugins/importUserCode/generateEagerImport.js +19 -8
  58. package/dist/esm/node/plugin/plugins/importUserCode/getVirtualFileImportUserCode.js +2 -2
  59. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getFilePathToShowToUser.d.ts +8 -0
  60. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +2 -2
  61. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +104 -96
  62. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.d.ts +5 -0
  63. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +35 -25
  64. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.d.ts +3 -0
  65. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigs.js +49 -79
  66. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/helpers.js +10 -1
  67. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/replaceImportStatements.d.ts +18 -6
  68. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/replaceImportStatements.js +25 -25
  69. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/transpileAndExecuteFile.d.ts +2 -2
  70. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/transpileAndExecuteFile.js +19 -16
  71. package/dist/esm/node/plugin/shared/{getConfigValueSource.d.ts → getConfigValueSourcesRelevant.d.ts} +0 -2
  72. package/dist/esm/node/plugin/shared/{getConfigValueSource.js → getConfigValueSourcesRelevant.js} +0 -11
  73. package/dist/esm/node/plugin/shared/loggerNotProd.js +2 -2
  74. package/dist/esm/node/plugin/utils.d.ts +1 -2
  75. package/dist/esm/node/plugin/utils.js +1 -2
  76. package/dist/esm/node/prerender/runPrerender.js +13 -16
  77. package/dist/esm/node/runtime/html/injectAssets.d.ts +2 -2
  78. package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +2 -2
  79. package/dist/esm/node/runtime/html/stream.js +4 -1
  80. package/dist/esm/node/runtime/renderPage/analyzePage.d.ts +2 -2
  81. package/dist/esm/node/runtime/renderPage/analyzePage.js +2 -2
  82. package/dist/esm/node/runtime/renderPage/createHttpResponseObject.d.ts +2 -2
  83. package/dist/esm/node/runtime/renderPage/debugPageFiles.d.ts +2 -2
  84. package/dist/esm/node/runtime/renderPage/executeOnRenderHtmlHook.d.ts +2 -2
  85. package/dist/esm/node/runtime/renderPage/handleErrorWithoutErrorPage.d.ts +2 -2
  86. package/dist/esm/node/runtime/renderPage/loadPageFilesServerSide.d.ts +2 -2
  87. package/dist/esm/node/runtime/renderPage/loadPageFilesServerSide.js +2 -2
  88. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -2
  89. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +13 -13
  90. package/dist/esm/node/shared/getClientEntryFilePath.d.ts +2 -2
  91. package/dist/esm/node/shared/virtual-files/virtualFilePageConfigValuesAll.js +1 -1
  92. package/dist/esm/shared/addIs404ToPageProps.d.ts +2 -2
  93. package/dist/esm/shared/error-page.d.ts +3 -3
  94. package/dist/esm/shared/error-page.js +1 -1
  95. package/dist/esm/shared/getPageFiles/analyzeClientSide.d.ts +2 -2
  96. package/dist/esm/shared/getPageFiles/assertPageConfigs.d.ts +5 -5
  97. package/dist/esm/shared/getPageFiles/assertPageConfigs.js +12 -12
  98. package/dist/esm/shared/getPageFiles/getExports.d.ts +2 -2
  99. package/dist/esm/shared/getPageFiles/getExports.js +1 -1
  100. package/dist/esm/shared/getPageFiles/parseGlobResults.d.ts +3 -3
  101. package/dist/esm/shared/getPageFiles/parseGlobResults.js +9 -43
  102. package/dist/esm/shared/getPageFiles/parsePageConfigsSerialized.d.ts +6 -0
  103. package/dist/esm/shared/getPageFiles/parsePageConfigsSerialized.js +59 -0
  104. package/dist/esm/shared/getPageFiles/setPageFiles.d.ts +3 -3
  105. package/dist/esm/shared/page-configs/Config.d.ts +200 -11
  106. package/dist/esm/shared/page-configs/PageConfig.d.ts +59 -39
  107. package/dist/esm/shared/page-configs/assertExports.d.ts +6 -0
  108. package/dist/esm/shared/page-configs/assertExports.js +54 -0
  109. package/dist/esm/shared/page-configs/findPageConfig.d.ts +2 -2
  110. package/dist/esm/shared/page-configs/loadConfigValues.d.ts +3 -0
  111. package/dist/esm/shared/page-configs/loadConfigValues.js +15 -0
  112. package/dist/esm/shared/page-configs/parseConfigValuesImported.d.ts +3 -0
  113. package/dist/esm/shared/page-configs/parseConfigValuesImported.js +44 -0
  114. package/dist/esm/shared/page-configs/utils.d.ts +3 -2
  115. package/dist/esm/shared/page-configs/utils.js +1 -1
  116. package/dist/esm/shared/route/executeGuardHook.d.ts +2 -2
  117. package/dist/esm/shared/route/index.d.ts +3 -3
  118. package/dist/esm/shared/route/loadPageRoutes.d.ts +2 -2
  119. package/dist/esm/shared/route/loadPageRoutes.js +11 -13
  120. package/dist/esm/shared/route/resolvePrecedence.js +33 -12
  121. package/dist/esm/shared/route/resolveRedirects.js +1 -1
  122. package/dist/esm/shared/route/resolveRouteFunction.js +1 -0
  123. package/dist/esm/shared/route/resolveRouteString.d.ts +21 -4
  124. package/dist/esm/shared/route/resolveRouteString.js +98 -42
  125. package/dist/esm/shared/types.d.ts +7 -6
  126. package/dist/esm/shared/utils.d.ts +1 -1
  127. package/dist/esm/shared/utils.js +1 -1
  128. package/dist/esm/types/defineConfig.d.ts +3 -0
  129. package/dist/esm/types/defineConfig.js +4 -0
  130. package/dist/esm/types/index.d.ts +2 -1
  131. package/dist/esm/types/index.js +1 -1
  132. package/dist/esm/utils/objectAssign.js +3 -1
  133. package/dist/esm/utils/projectInfo.d.ts +1 -1
  134. package/dist/esm/utils/projectInfo.js +1 -1
  135. package/dist/esm/utils/requireResolve.d.ts +2 -0
  136. package/dist/esm/utils/{resolve.js → requireResolve.js} +2 -2
  137. package/package.json +3 -3
  138. package/dist/cjs/shared/page-configs/loadPageCode.js +0 -63
  139. package/dist/cjs/utils/assertDefaultExport.js +0 -53
  140. package/dist/esm/shared/page-configs/loadPageCode.d.ts +0 -3
  141. package/dist/esm/shared/page-configs/loadPageCode.js +0 -57
  142. package/dist/esm/utils/assertDefaultExport.d.ts +0 -8
  143. package/dist/esm/utils/assertDefaultExport.js +0 -47
  144. package/dist/esm/utils/resolve.d.ts +0 -2
  145. /package/dist/cjs/shared/getPageFiles/{assertExports.js → assert_exports_old_design.js} +0 -0
  146. /package/dist/esm/shared/getPageFiles/{assertExports.d.ts → assert_exports_old_design.d.ts} +0 -0
  147. /package/dist/esm/shared/getPageFiles/{assertExports.js → assert_exports_old_design.js} +0 -0
@@ -3,15 +3,204 @@ export type { ConfigBuiltIn };
3
3
  export type { ConfigNameBuiltIn };
4
4
  export type { ConfigMeta };
5
5
  export type { HookName };
6
+ export type { GuardAsync };
7
+ export type { GuardSync };
8
+ export type { OnBeforePrerenderStartAsync };
9
+ export type { OnBeforePrerenderStartSync };
10
+ export type { OnBeforeRenderAsync };
11
+ export type { OnBeforeRenderSync };
12
+ export type { OnBeforeRouteAsync };
13
+ export type { OnBeforeRouteSync };
14
+ export type { OnHydrationEndAsync };
15
+ export type { OnHydrationEndSync };
16
+ export type { OnPageTransitionEndAsync };
17
+ export type { OnPageTransitionEndSync };
18
+ export type { OnPageTransitionStartAsync };
19
+ export type { OnPageTransitionStartSync };
20
+ export type { OnPrerenderStartAsync };
21
+ export type { OnPrerenderStartSync };
22
+ export type { OnRenderClientAsync };
23
+ export type { OnRenderClientSync };
24
+ export type { OnRenderHtmlAsync };
25
+ export type { OnRenderHtmlSync };
26
+ export type { RouteAsync };
27
+ export type { RouteSync };
6
28
  import type { PrefetchStaticAssets } from '../../client/client-routing-runtime/prefetch/getPrefetchSettings.js';
7
29
  import type { ConfigDefinition } from '../../node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js';
30
+ import type { DocumentHtml } from '../../node/runtime/html/renderHtml.js';
8
31
  import type { ConfigVikeUserProvided } from '../ConfigVike.js';
9
32
  import type { Vike, VikePackages } from '../VikeNamespace.js';
33
+ import type { PageContextClient, PageContextServer } from '../types.js';
10
34
  type HookName = 'onHydrationEnd' | 'onBeforePrerender' | 'onBeforePrerenderStart' | 'onBeforeRender' | 'onBeforeRoute' | 'onPageTransitionStart' | 'onPageTransitionEnd' | 'onPrerenderStart' | 'onRenderHtml' | 'onRenderClient' | 'guard' | 'render';
11
35
  type ConfigNameBuiltInPublic = Exclude<keyof Config, keyof ConfigVikeUserProvided | 'onBeforeRoute' | 'onPrerenderStart'> | 'prerender';
12
36
  type ConfigNameBuiltInInternal = 'isClientSideRenderable' | 'onBeforeRenderEnv';
13
37
  type ConfigNameBuiltIn = ConfigNameBuiltInPublic | ConfigNameBuiltInInternal;
14
38
  type Config = ConfigBuiltIn & Vike.Config & (VikePackages.ConfigVikeReact | VikePackages.ConfigVikeVue | VikePackages.ConfigVikeSolid | VikePackages.ConfigVikeSvelte);
39
+ /** Protect page(s), e.g. forbid unauthorized access.
40
+ *
41
+ * https://vike.dev/guard
42
+ */
43
+ type GuardAsync = (pageContext: PageContextServer) => Promise<void>;
44
+ /** Protect page(s), e.g. forbid unauthorized access.
45
+ *
46
+ * https://vike.dev/guard
47
+ */
48
+ type GuardSync = (pageContext: PageContextServer) => void;
49
+ /** Global Hook called before the whole pre-rendering process starts.
50
+ *
51
+ * https://vike.dev/onBeforePrerenderStart
52
+ */
53
+ type OnBeforePrerenderStartAsync = () => Promise<(string | {
54
+ url: string;
55
+ pageContext: Partial<Vike.PageContext>;
56
+ })[]>;
57
+ /** Global Hook called before the whole pre-rendering process starts.
58
+ *
59
+ * https://vike.dev/onBeforePrerenderStart
60
+ */
61
+ type OnBeforePrerenderStartSync = () => (string | {
62
+ url: string;
63
+ pageContext: Partial<Vike.PageContext>;
64
+ })[];
65
+ /** Hook called before the page is rendered, usually for fetching data.
66
+ *
67
+ * https://vike.dev/onBeforeRender
68
+ */
69
+ type OnBeforeRenderAsync = (pageContext: PageContextServer) => Promise<{
70
+ pageContext: Partial<Vike.PageContext>;
71
+ } | void>;
72
+ /** Hook called before the page is rendered, usually for fetching data.
73
+ *
74
+ * https://vike.dev/onBeforeRender
75
+ */
76
+ type OnBeforeRenderSync = (pageContext: PageContextServer) => {
77
+ pageContext: Partial<Vike.PageContext>;
78
+ } | void;
79
+ /** Hook called before the URL is routed to a page.
80
+ *
81
+ * https://vike.dev/onBeforeRoute
82
+ */
83
+ type OnBeforeRouteAsync = (pageContext: PageContextServer) => Promise<{
84
+ pageContext: Partial<{
85
+ /** The URL you provided to Vike when calling `renderPage({ urlOriginal })` in your server middleware.
86
+ *
87
+ * https://vike.dev/renderPage
88
+ */
89
+ urlOriginal: string;
90
+ } | Vike.PageContext>;
91
+ }>;
92
+ /** Hook called before the URL is routed to a page.
93
+ *
94
+ * https://vike.dev/onBeforeRoute
95
+ */
96
+ type OnBeforeRouteSync = (pageContext: PageContextServer) => {
97
+ pageContext: Partial<{
98
+ /** The URL you provided to Vike when calling `renderPage({ urlOriginal })` in your server middleware.
99
+ *
100
+ * https://vike.dev/renderPage
101
+ */
102
+ urlOriginal: string;
103
+ } | Vike.PageContext>;
104
+ };
105
+ /** Hook called after the page is hydrated.
106
+ *
107
+ * https://vike.dev/clientRouting
108
+ */
109
+ type OnHydrationEndAsync = (pageContext: PageContextClient) => Promise<void>;
110
+ /** Hook called after the page is hydrated.
111
+ *
112
+ * https://vike.dev/clientRouting
113
+ */
114
+ type OnHydrationEndSync = (pageContext: PageContextClient) => void;
115
+ /** Hook called after the user navigates to a new page.
116
+ *
117
+ * https://vike.dev/clientRouting
118
+ */
119
+ type OnPageTransitionEndAsync = (pageContext: PageContextClient) => Promise<void>;
120
+ /** Hook called after the user navigates to a new page.
121
+ *
122
+ * https://vike.dev/clientRouting
123
+ */
124
+ type OnPageTransitionEndSync = (pageContext: PageContextClient) => void;
125
+ /** Hook called before the user navigates to a new page.
126
+ *
127
+ * https://vike.dev/clientRouting
128
+ */
129
+ type OnPageTransitionStartAsync = (pageContext: PageContextClient) => Promise<void>;
130
+ /** Hook called before the user navigates to a new page.
131
+ *
132
+ * https://vike.dev/clientRouting
133
+ */
134
+ type OnPageTransitionStartSync = (pageContext: PageContextClient) => void;
135
+ /** Page Hook called when pre-rendering starts.
136
+ *
137
+ * https://vike.dev/onPrerenderStart
138
+ */
139
+ type OnPrerenderStartAsync = (prerenderContext: {
140
+ pageContexts: PageContextServer[];
141
+ }) => Promise<{
142
+ prerenderContext: {
143
+ pageContexts: PageContextServer[];
144
+ };
145
+ }>;
146
+ /** Page Hook called when pre-rendering starts.
147
+ *
148
+ * https://vike.dev/onPrerenderStart
149
+ */
150
+ type OnPrerenderStartSync = (prerenderContext: {
151
+ pageContexts: PageContextServer[];
152
+ }) => {
153
+ prerenderContext: {
154
+ pageContexts: PageContextServer[];
155
+ };
156
+ };
157
+ /** Hook called when page is rendered on the client-side.
158
+ *
159
+ * https://vike.dev/onRenderClient
160
+ */
161
+ type OnRenderClientAsync = (pageContext: PageContextClient) => Promise<void>;
162
+ /** Hook called when page is rendered on the client-side.
163
+ *
164
+ * https://vike.dev/onRenderClient
165
+ */
166
+ type OnRenderClientSync = (pageContext: PageContextClient) => void;
167
+ /** Hook called when page is rendered to HTML on the server-side.
168
+ *
169
+ * https://vike.dev/onRenderHtml
170
+ */
171
+ type OnRenderHtmlAsync = (pageContext: PageContextServer) => Promise<DocumentHtml | {
172
+ documentHtml: DocumentHtml;
173
+ pageContext: OnRenderHtmlPageContextReturn | (() => Promise<OnRenderHtmlPageContextReturn> | OnRenderHtmlPageContextReturn);
174
+ }>;
175
+ /** Hook called when page is rendered to HTML on the server-side.
176
+ *
177
+ * https://vike.dev/onRenderHtml
178
+ */
179
+ type OnRenderHtmlSync = (pageContext: PageContextServer) => DocumentHtml | {
180
+ documentHtml: DocumentHtml;
181
+ pageContext: OnRenderHtmlPageContextReturn | (() => Promise<OnRenderHtmlPageContextReturn> | OnRenderHtmlPageContextReturn);
182
+ };
183
+ type OnRenderHtmlPageContextReturn = Partial<Vike.PageContext & {
184
+ /** See https://vike.dev/stream */
185
+ enableEagerStreaming: boolean;
186
+ }>;
187
+ /** @deprecated Use a sync route() with an async guard() instead */
188
+ type RouteAsync = (pageContext: PageContextServer | PageContextClient) => Promise<{
189
+ routeParams?: Record<string, string>;
190
+ precedence?: number;
191
+ } | boolean>;
192
+ /** The page's URL(s).
193
+ *
194
+ * https://vike.dev/route
195
+ */
196
+ type RouteSync = (pageContext: PageContextServer | PageContextClient) => {
197
+ routeParams?: Record<string, string>;
198
+ precedence?: number;
199
+ } | boolean;
200
+ /** The page's URL(s).
201
+ *
202
+ * https://vike.dev/route
203
+ */
15
204
  /** Page configuration.
16
205
  *
17
206
  * https://vike.dev/config
@@ -23,12 +212,12 @@ type ConfigBuiltIn = {
23
212
  *
24
213
  * https://vike.dev/route
25
214
  */
26
- route?: string | Function | ImportString;
215
+ route?: string | RouteAsync | RouteSync | ImportString;
27
216
  /** Protect page(s), e.g. forbid unauthorized access.
28
217
  *
29
218
  * https://vike.dev/guard
30
219
  */
31
- guard?: Function | ImportString;
220
+ guard?: GuardAsync | GuardSync | ImportString;
32
221
  /**
33
222
  * Whether to pre-render the page(s).
34
223
  *
@@ -45,7 +234,7 @@ type ConfigBuiltIn = {
45
234
  *
46
235
  * https://vike.dev/onBeforeRender
47
236
  */
48
- onBeforeRender?: Function | ImportString | null;
237
+ onBeforeRender?: OnBeforeRenderAsync | OnBeforeRenderSync | ImportString | null;
49
238
  /** Determines what pageContext properties are sent to the client-side.
50
239
  *
51
240
  * https://vike.dev/passToClient
@@ -55,12 +244,12 @@ type ConfigBuiltIn = {
55
244
  *
56
245
  * https://vike.dev/onRenderClient
57
246
  */
58
- onRenderClient?: Function | ImportString;
247
+ onRenderClient?: OnRenderClientAsync | OnRenderClientSync | ImportString;
59
248
  /** Hook called when page is rendered to HTML on the server-side.
60
249
  *
61
250
  * https://vike.dev/onRenderHtml
62
251
  */
63
- onRenderHtml?: Function | ImportString;
252
+ onRenderHtml?: OnRenderHtmlAsync | OnRenderHtmlSync | ImportString;
64
253
  /** Enable async Route Functions.
65
254
  *
66
255
  * https://vike.dev/route-function#async
@@ -75,32 +264,32 @@ type ConfigBuiltIn = {
75
264
  *
76
265
  * https://vike.dev/onPrerenderStart
77
266
  */
78
- onPrerenderStart?: Function | ImportString;
267
+ onPrerenderStart?: OnPrerenderStartAsync | OnPrerenderStartSync | ImportString;
79
268
  /** Global Hook called before the whole pre-rendering process starts.
80
269
  *
81
270
  * https://vike.dev/onBeforePrerenderStart
82
271
  */
83
- onBeforePrerenderStart?: Function | ImportString;
272
+ onBeforePrerenderStart?: OnBeforePrerenderStartAsync | OnBeforePrerenderStartSync | ImportString;
84
273
  /** Hook called before the URL is routed to a page.
85
274
  *
86
275
  * https://vike.dev/onBeforeRoute
87
276
  */
88
- onBeforeRoute?: Function | ImportString;
277
+ onBeforeRoute?: OnBeforeRouteAsync | OnBeforeRouteSync | ImportString;
89
278
  /** Hook called after the page is hydrated.
90
279
  *
91
280
  * https://vike.dev/clientRouting
92
281
  */
93
- onHydrationEnd?: Function | ImportString;
282
+ onHydrationEnd?: OnHydrationEndAsync | OnHydrationEndSync | ImportString;
94
283
  /** Hook called before the user navigates to a new page.
95
284
  *
96
285
  * https://vike.dev/clientRouting
97
286
  */
98
- onPageTransitionStart?: Function | ImportString;
287
+ onPageTransitionStart?: OnPageTransitionStartAsync | OnPageTransitionStartSync | ImportString;
99
288
  /** Hook called after the user navigates to a new page.
100
289
  *
101
290
  * https://vike.dev/clientRouting
102
291
  */
103
- onPageTransitionEnd?: Function | ImportString;
292
+ onPageTransitionEnd?: OnPageTransitionEndAsync | OnPageTransitionEndSync | ImportString;
104
293
  /** Whether the UI framework (React/Vue/Solid/...) allows the page's hydration to be aborted.
105
294
  *
106
295
  * https://vike.dev/clientRouting
@@ -1,35 +1,69 @@
1
- export type { PageConfig };
2
- export type { PageConfigLoaded };
1
+ export type { PageConfigRuntime };
2
+ export type { PageConfigRuntimeLoaded };
3
+ export type { PageConfigRuntimeSerialized };
3
4
  export type { PageConfigBuildTime };
4
- export type { PageConfigCommon };
5
5
  export type { ConfigEnvInternal };
6
6
  export type { ConfigEnv };
7
- export type { PageConfigGlobal };
8
- export type { PageConfigGlobalData };
7
+ export type { PageConfigGlobalRuntime };
8
+ export type { PageConfigGlobalRuntimeSerialized };
9
+ export type { PageConfigGlobalBuildTime };
9
10
  export type { ConfigSource };
10
11
  export type { ConfigValue };
12
+ export type { ConfigValueSerialized };
13
+ export type { ConfigValueImported };
11
14
  export type { ConfigValues };
12
15
  export type { ConfigValueSource };
13
16
  export type { ConfigValueSources };
14
17
  export type { DefinedAtInfo };
15
18
  export type { DefinedAtInfoFull };
16
- type ConfigEnv = 'client-only' | 'server-only' | 'server-and-client' | 'config-only';
17
- type ConfigEnvInternal = ConfigEnv | '_routing-eager' | '_routing-lazy';
18
- type PageConfigBuildTime = PageConfigCommon & {
19
- configValueSources: ConfigValueSources;
20
- };
21
- type PageConfigCommon = {
19
+ type PageConfigBase = {
22
20
  pageId: string;
23
- isErrorPage: boolean;
24
- routeFilesystem: null | {
21
+ isErrorPage?: true;
22
+ routeFilesystem?: {
25
23
  routeString: string;
26
24
  definedBy: string;
27
25
  };
26
+ };
27
+ /** Page config data structure available and used at runtime */
28
+ type PageConfigRuntime = PageConfigBase & {
29
+ /** Loaded config values */
30
+ configValues: ConfigValues;
31
+ /** Load config values that are lazily loaded such as config.Page */
32
+ loadConfigValuesAll: LoadConfigValuesAll;
33
+ };
34
+ /** Same as PageConfigRuntime but also contains all lazily loaded config values such as config.Page */
35
+ type PageConfigRuntimeLoaded = PageConfigRuntime & {
36
+ /** Whether loadConfigValuesAll() was called */
37
+ isLoaded: true;
38
+ };
39
+ /** page config data structure available and used at build-time */
40
+ type PageConfigBuildTime = PageConfigBase & {
41
+ configValues: ConfigValues;
42
+ configValueSources: ConfigValueSources;
43
+ };
44
+ /** page config data structure serialized in virtual files: parsing it results in PageConfigRuntime */
45
+ type PageConfigRuntimeSerialized = PageConfigBase & {
46
+ /** Config values that are loaded eagerly and serializable such as config.passToClient */
47
+ configValuesSerialized: Record<string, ConfigValueSerialized>;
48
+ /** Config values imported eagerly such as config.route */
49
+ configValuesImported: ConfigValueImported[];
50
+ /** Config values imported lazily such as config.page */
51
+ loadConfigValuesAll: LoadConfigValuesAll;
52
+ };
53
+ /** page config that applies to all pages */
54
+ type PageConfigGlobalRuntime = {
28
55
  configValues: ConfigValues;
29
56
  };
57
+ type PageConfigGlobalRuntimeSerialized = {
58
+ configValuesImported: ConfigValueImported[];
59
+ };
60
+ type PageConfigGlobalBuildTime = {
61
+ configValueSources: ConfigValueSources;
62
+ };
63
+ type ConfigEnv = 'client-only' | 'server-only' | 'server-and-client' | 'config-only';
64
+ type ConfigEnvInternal = ConfigEnv | '_routing-eager' | '_routing-lazy';
30
65
  type ConfigValueSource = {
31
66
  configEnv: ConfigEnvInternal;
32
- valueSerialized?: string;
33
67
  value?: unknown;
34
68
  valueIsImportedAtRuntime: boolean;
35
69
  valueIsFilePath?: true;
@@ -46,6 +80,10 @@ type ConfigValue = {
46
80
  value: unknown;
47
81
  definedAtInfo: null | DefinedAtInfo;
48
82
  };
83
+ type ConfigValueSerialized = {
84
+ valueSerialized: string;
85
+ definedAtInfo: null | DefinedAtInfo;
86
+ };
49
87
  type ConfigValues = Record<string, ConfigValue>;
50
88
  type DefinedAtInfo = {
51
89
  filePath: string;
@@ -65,33 +103,15 @@ type ConfigSource = {
65
103
  configSourceFileDefaultExportKey: string;
66
104
  configSourceFileExportName?: undefined;
67
105
  });
68
- type PageConfig = PageConfigCommon & {
69
- loadConfigValuesAll: LoadConfigValuesAll;
70
- isLoaded?: true;
71
- };
72
- type PageConfigLoaded = PageConfig & {
73
- isLoaded: true;
74
- };
75
- type PageConfigGlobalData = {
76
- onPrerenderStart: null | ConfigValueSource;
77
- onBeforeRoute: null | ConfigValueSource;
78
- };
79
- type PageConfigGlobal = {
80
- onPrerenderStart: null | (ConfigValueSource & {
81
- value: unknown;
82
- });
83
- onBeforeRoute: null | (ConfigValueSource & {
84
- value: unknown;
85
- });
86
- };
87
- type LoadConfigValuesAll = () => Promise<({
106
+ type LoadConfigValuesAll = () => Promise<ConfigValueImported[]>;
107
+ type ConfigValueImported = {
88
108
  configName: string;
89
- importFilePath: string;
109
+ importPath: string;
90
110
  } & ({
91
- isPlusFile: true;
111
+ isValueFile: true;
92
112
  importFileExports: Record<string, unknown>;
93
113
  } | {
94
- isPlusFile: false;
95
- importFileExportName: string;
114
+ isValueFile: false;
115
+ exportName: string;
96
116
  importFileExportValue: unknown;
97
- }))[]>;
117
+ });
@@ -0,0 +1,6 @@
1
+ export { assertExportsOfValueFile };
2
+ export { assertExportsOfConfigFile };
3
+ declare function assertExportsOfValueFile(fileExports: Record<string, unknown>, filePathToShowToUser: string, configName: string): void;
4
+ declare function assertExportsOfConfigFile(fileExports: Record<string, unknown>, filePathToShowToUser: string): asserts fileExports is {
5
+ default: Record<string, unknown>;
6
+ };
@@ -0,0 +1,54 @@
1
+ export { assertExportsOfValueFile };
2
+ export { assertExportsOfConfigFile };
3
+ import { assert, assertUsage, assertWarning, isObject } from '../utils.js';
4
+ import pc from '@brillout/picocolors';
5
+ const EXPORTS_IGNORE = [
6
+ // vite-plugin-solid adds `export { $$registrations }`
7
+ '$$registrations',
8
+ // @vitejs/plugin-vue adds `export { _rerender_only }`
9
+ '_rerender_only'
10
+ ];
11
+ // Tolerate `export { frontmatter }` in .mdx files
12
+ const TOLERATE_SIDE_EXPORTS = ['.md', '.mdx'];
13
+ function assertExportsOfValueFile(fileExports, filePathToShowToUser, configName) {
14
+ assertExports(fileExports, filePathToShowToUser, configName);
15
+ }
16
+ function assertExportsOfConfigFile(fileExports, filePathToShowToUser) {
17
+ assertExports(fileExports, filePathToShowToUser);
18
+ const exportDefault = fileExports.default;
19
+ assertUsage(isObject(exportDefault), `The ${pc.cyan('export default')} of ${filePathToShowToUser} should be an object (but it's ${pc.cyan(`typeof exportDefault === ${JSON.stringify(typeof exportDefault)}`)} instead)`);
20
+ }
21
+ function assertExports(fileExports, filePathToShowToUser, configName) {
22
+ const exportsAll = Object.keys(fileExports);
23
+ const exportsRelevant = exportsAll.filter((exportName) => !EXPORTS_IGNORE.includes(exportName));
24
+ const exportsInvalid = exportsRelevant.filter((e) => e !== 'default' &&
25
+ // !!configName => isValueFile
26
+ e !== configName);
27
+ if (exportsInvalid.length === 0) {
28
+ if (exportsRelevant.length === 1) {
29
+ return;
30
+ }
31
+ else {
32
+ assert(exportsRelevant.length === 0);
33
+ let errMsg = `${filePathToShowToUser} doesn't export any value, but it should have a ${pc.cyan('export default')}`;
34
+ if (configName)
35
+ errMsg += ` or ${pc.cyan(`export { ${configName} }`)}`;
36
+ assertUsage(false, errMsg);
37
+ }
38
+ }
39
+ else {
40
+ // !configName => isConfigFile
41
+ if (!configName) {
42
+ const exportsInvalidStr = exportsInvalid.join(', ');
43
+ assertUsage(false, `${filePathToShowToUser} replace ${pc.cyan(`export { ${exportsInvalidStr} }`)} with ${pc.cyan(`export default { ${exportsInvalidStr} }`)}`);
44
+ }
45
+ // !!configName => isValueFile
46
+ else {
47
+ if (TOLERATE_SIDE_EXPORTS.some((ext) => filePathToShowToUser.endsWith(ext)))
48
+ return;
49
+ exportsInvalid.forEach((exportInvalid) => {
50
+ assertWarning(false, `${filePathToShowToUser} should have only a single export: move ${pc.cyan(`export { ${exportInvalid} }`)} to +config.h.js or its own +${exportsInvalid}.js`, { onlyOnce: true });
51
+ });
52
+ }
53
+ }
54
+ }
@@ -1,3 +1,3 @@
1
1
  export { findPageConfig };
2
- import type { PageConfig } from './PageConfig.js';
3
- declare function findPageConfig(pageConfigs: PageConfig[], pageId: string): null | PageConfig;
2
+ import type { PageConfigRuntime } from './PageConfig.js';
3
+ declare function findPageConfig(pageConfigs: PageConfigRuntime[], pageId: string): null | PageConfigRuntime;
@@ -0,0 +1,3 @@
1
+ export { loadConfigValues };
2
+ import type { PageConfigRuntime, PageConfigRuntimeLoaded } from './PageConfig.js';
3
+ declare function loadConfigValues(pageConfig: PageConfigRuntime, isDev: boolean): Promise<PageConfigRuntimeLoaded>;
@@ -0,0 +1,15 @@
1
+ export { loadConfigValues };
2
+ import { objectAssign } from '../utils.js';
3
+ import { parseConfigValuesImported } from './parseConfigValuesImported.js';
4
+ async function loadConfigValues(pageConfig, isDev) {
5
+ if ('isLoaded' in pageConfig &&
6
+ // We don't need to cache in dev, since Vite already caches the virtual module
7
+ !isDev) {
8
+ return pageConfig;
9
+ }
10
+ const configValuesImported = await pageConfig.loadConfigValuesAll();
11
+ const configValuesAddendum = parseConfigValuesImported(configValuesImported);
12
+ Object.assign(pageConfig.configValues, configValuesAddendum);
13
+ objectAssign(pageConfig, { isLoaded: true });
14
+ return pageConfig;
15
+ }
@@ -0,0 +1,3 @@
1
+ export { parseConfigValuesImported };
2
+ import type { ConfigValueImported, ConfigValues } from './PageConfig.js';
3
+ declare function parseConfigValuesImported(configValuesImported: ConfigValueImported[]): ConfigValues;
@@ -0,0 +1,44 @@
1
+ export { parseConfigValuesImported };
2
+ import { assert, assertUsage } from '../utils.js';
3
+ import { assertExportsOfValueFile } from './assertExports.js';
4
+ import pc from '@brillout/picocolors';
5
+ function parseConfigValuesImported(configValuesImported) {
6
+ const configValues = {};
7
+ const addConfigValue = (configName, value, filePath, exportName) => {
8
+ configValues[configName] = {
9
+ value,
10
+ definedAtInfo: {
11
+ filePath,
12
+ fileExportPath: [exportName]
13
+ }
14
+ };
15
+ assertIsNotNull(value, configName, filePath);
16
+ };
17
+ configValuesImported.forEach((configValueLoaded) => {
18
+ if (configValueLoaded.isValueFile) {
19
+ const { importFileExports, importPath, configName } = configValueLoaded;
20
+ if (configName !== 'client') {
21
+ assertExportsOfValueFile(importFileExports, importPath, configName);
22
+ }
23
+ Object.entries(importFileExports).forEach(([exportName, exportValue]) => {
24
+ const isSideExport = exportName !== 'default'; // .md files may have "side-exports" such as `export { frontmatter }`
25
+ const configName = isSideExport ? exportName : configValueLoaded.configName;
26
+ if (isSideExport && configName in configValues) {
27
+ // We can't avoid side-export conflicts upstream. (Because we cannot know about side-exports upstream at build-time.)
28
+ // Side-exports have the lowest priority.
29
+ return;
30
+ }
31
+ addConfigValue(configName, exportValue, importPath, exportName);
32
+ });
33
+ }
34
+ else {
35
+ const { configName, importPath, importFileExportValue, exportName } = configValueLoaded;
36
+ addConfigValue(configName, importFileExportValue, importPath, exportName);
37
+ }
38
+ });
39
+ return configValues;
40
+ }
41
+ function assertIsNotNull(configValue, configName, importPath) {
42
+ assert(!importPath.includes('+config.'));
43
+ assertUsage(configValue !== null, `Set ${pc.cyan(configName)} to ${pc.cyan('null')} in a +config.h.js file instead of ${importPath}`);
44
+ }
@@ -3,8 +3,9 @@ export { getPageConfig };
3
3
  export { getConfigDefinedAtString };
4
4
  export { getConfigDefinedAtInfo };
5
5
  export { getDefinedAtString };
6
- import type { DefinedAtInfo, PageConfig, PageConfigCommon } from './PageConfig.js';
6
+ import type { DefinedAtInfo, PageConfigRuntime, PageConfigBuildTime } from './PageConfig.js';
7
7
  import type { ConfigNameBuiltIn } from './Config.js';
8
+ type PageConfigCommon = PageConfigRuntime | PageConfigBuildTime;
8
9
  type ConfigName = ConfigNameBuiltIn;
9
10
  declare function getConfigValue(pageConfig: PageConfigCommon, configName: ConfigName, type: 'string'): null | {
10
11
  value: string;
@@ -16,7 +17,7 @@ declare function getConfigValue(pageConfig: PageConfigCommon, configName: Config
16
17
  value: unknown;
17
18
  };
18
19
  declare function getConfigDefinedAtInfo(pageConfig: PageConfigCommon, configName: ConfigName): DefinedAtInfo;
19
- declare function getPageConfig(pageId: string, pageConfigs: PageConfig[]): PageConfig;
20
+ declare function getPageConfig(pageId: string, pageConfigs: PageConfigRuntime[]): PageConfigRuntime;
20
21
  type ConfigDefinedAtUppercase<ConfigName extends string> = `Config ${ConfigName}${string}`;
21
22
  type ConfigDefinedAtLowercase<ConfigName extends string> = `config ${ConfigName}${string}`;
22
23
  declare function getConfigDefinedAtString<ConfigName extends string>(configName: ConfigName, { definedAtInfo }: {
@@ -51,7 +51,7 @@ function assertConfigValueType(value, type, configName, definedAtInfo) {
51
51
  const valuePrintable = getValuePrintable(value);
52
52
  const problem = valuePrintable !== null ? `value ${pc.cyan(valuePrintable)}` : `type ${pc.cyan(typeActual)}`;
53
53
  const configDefinedAt = getConfigDefinedAtString(configName, { definedAtInfo }, true);
54
- assertUsage(false, `${configDefinedAt} has an invalid ${problem}: is should be a ${pc.cyan(type)} instead`);
54
+ assertUsage(false, `${configDefinedAt} has an invalid ${problem}: it should be a ${pc.cyan(type)} instead`);
55
55
  }
56
56
  function getConfigDefinedAtString(configName, { definedAtInfo }, sentenceBegin, append) {
57
57
  let configDefinedAt = `${sentenceBegin ? `Config` : `config`} ${pc.cyan(configName)}`;
@@ -1,8 +1,8 @@
1
1
  export { executeGuardHook };
2
2
  import type { PageContextExports, PageFile } from '../getPageFiles.js';
3
- import type { PageConfig } from '../page-configs/PageConfig.js';
3
+ import type { PageConfigRuntime } from '../page-configs/PageConfig.js';
4
4
  declare function executeGuardHook<T extends PageContextExports & {
5
5
  _pageId: string;
6
6
  _pageFilesAll: PageFile[];
7
- _pageConfigs: PageConfig[];
7
+ _pageConfigs: PageConfigRuntime[];
8
8
  }>(pageContext: T, prepareForUserConsumption: (pageConfig: T) => T | void): Promise<void>;
@@ -4,12 +4,12 @@ import type { PageFile } from '../getPageFiles.js';
4
4
  import { PageContextUrlComputedPropsInternal, PageContextUrlSources } from '../addUrlComputedProps.js';
5
5
  import { type OnBeforeRouteHook } from './executeOnBeforeRouteHook.js';
6
6
  import type { PageRoutes, RouteType } from './loadPageRoutes.js';
7
- import type { PageConfig, PageConfigGlobal } from '../page-configs/PageConfig.js';
7
+ import type { PageConfigRuntime, PageConfigGlobalRuntime } from '../page-configs/PageConfig.js';
8
8
  type PageContextForRoute = PageContextUrlComputedPropsInternal & {
9
9
  _pageFilesAll: PageFile[];
10
- _pageConfigs: PageConfig[];
10
+ _pageConfigs: PageConfigRuntime[];
11
11
  _allPageIds: string[];
12
- _pageConfigGlobal: PageConfigGlobal;
12
+ _pageConfigGlobal: PageConfigGlobalRuntime;
13
13
  _pageRoutes: PageRoutes;
14
14
  _onBeforeRouteHook: OnBeforeRouteHook | null;
15
15
  } & PageContextUrlSources;
@@ -3,7 +3,7 @@ export type { PageRoutes };
3
3
  export type { RouteType };
4
4
  import type { PageFile } from '../getPageFiles.js';
5
5
  import type { OnBeforeRouteHook } from './executeOnBeforeRouteHook.js';
6
- import type { PageConfig, PageConfigGlobal } from '../page-configs/PageConfig.js';
6
+ import type { PageConfigRuntime, PageConfigGlobalRuntime } from '../page-configs/PageConfig.js';
7
7
  type PageRoute = {
8
8
  pageId: string;
9
9
  comesFromV1PageConfig: boolean;
@@ -23,7 +23,7 @@ type PageRoute = {
23
23
  });
24
24
  type PageRoutes = PageRoute[];
25
25
  type RouteType = 'STRING' | 'FUNCTION' | 'FILESYSTEM';
26
- declare function loadPageRoutes(pageFilesAll: PageFile[], pageConfigs: PageConfig[], pageConfigGlobal: PageConfigGlobal, allPageIds: string[]): Promise<{
26
+ declare function loadPageRoutes(pageFilesAll: PageFile[], pageConfigs: PageConfigRuntime[], pageConfigGlobal: PageConfigGlobalRuntime, allPageIds: string[]): Promise<{
27
27
  pageRoutes: PageRoutes;
28
28
  onBeforeRouteHook: null | OnBeforeRouteHook;
29
29
  }>;