vike 0.4.232 → 0.4.233-commit-e534fd6
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/dist/cjs/node/prerender/runPrerender.js +9 -4
- package/dist/cjs/node/runtime/html/injectAssets/getHtmlTags.js +20 -3
- package/dist/cjs/node/runtime/html/injectAssets/mergeScriptTags.js +7 -1
- package/dist/cjs/node/runtime/renderPage/{executeOnBeforeRenderAndDataHooks.js → execHookDataAndOnBeforeRender.js} +2 -2
- package/dist/cjs/node/runtime/renderPage/{executeOnRenderHtmlHook.js → execHookOnRenderHtml.js} +3 -3
- package/dist/cjs/node/runtime/renderPage/execHookServer.js +1 -4
- package/dist/cjs/node/runtime/renderPage/loadPageConfigsLazyServerSide.js +18 -13
- package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +11 -11
- package/dist/cjs/node/runtime/renderPage.js +55 -48
- package/dist/cjs/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +0 -2
- package/dist/cjs/shared/createPageContextShared.js +1 -3
- package/dist/cjs/shared/hooks/execHook.js +31 -54
- package/dist/cjs/shared/route/{executeGuardHook.js → execHookGuard.js} +3 -3
- package/dist/cjs/shared/route/{executeOnBeforeRouteHook.js → execHookOnBeforeRoute.js} +4 -4
- package/dist/cjs/shared/route/index.js +3 -2
- package/dist/cjs/shared/route/resolveRouteFunction.js +1 -1
- package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
- package/dist/cjs/utils/styleFileRE.js +1 -0
- package/dist/esm/client/runtime-client-routing/getPageContextFromHooks.d.ts +2 -2
- package/dist/esm/client/runtime-client-routing/getPageContextFromHooks.js +9 -9
- package/dist/esm/client/runtime-client-routing/renderPageClientSide.d.ts +1 -1
- package/dist/esm/client/runtime-client-routing/renderPageClientSide.js +97 -62
- package/dist/esm/client/runtime-server-routing/createPageContextClientSide.js +11 -4
- package/dist/esm/client/runtime-server-routing/entry.js +2 -2
- package/dist/esm/client/shared/{executeOnRenderClientHook.d.ts → execHookOnRenderClient.d.ts} +2 -2
- package/dist/esm/client/shared/{executeOnRenderClientHook.js → execHookOnRenderClient.js} +4 -4
- package/dist/esm/client/shared/loadPageConfigsLazyClientSide.d.ts +12 -4
- package/dist/esm/client/shared/loadPageConfigsLazyClientSide.js +4 -4
- package/dist/esm/node/prerender/runPrerender.d.ts +250 -4
- package/dist/esm/node/prerender/runPrerender.js +11 -6
- package/dist/esm/node/runtime/html/injectAssets/getHtmlTags.js +20 -3
- package/dist/esm/node/runtime/html/injectAssets/mergeScriptTags.js +7 -1
- package/dist/esm/node/runtime/renderPage/createHttpResponse.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/execHookDataAndOnBeforeRender.d.ts +6 -0
- package/dist/esm/node/runtime/renderPage/{executeOnBeforeRenderAndDataHooks.js → execHookDataAndOnBeforeRender.js} +2 -2
- package/dist/esm/node/runtime/renderPage/{executeOnRenderHtmlHook.d.ts → execHookOnRenderHtml.d.ts} +2 -2
- package/dist/esm/node/runtime/renderPage/{executeOnRenderHtmlHook.js → execHookOnRenderHtml.js} +4 -4
- package/dist/esm/node/runtime/renderPage/execHookServer.d.ts +3 -3
- package/dist/esm/node/runtime/renderPage/execHookServer.js +1 -4
- package/dist/esm/node/runtime/renderPage/getHttpResponseBody.d.ts +1 -1
- package/dist/esm/node/runtime/renderPage/loadPageConfigsLazyServerSide.d.ts +15 -6
- package/dist/esm/node/runtime/renderPage/loadPageConfigsLazyServerSide.js +18 -13
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +2 -2
- package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +13 -13
- package/dist/esm/node/runtime/renderPage.js +57 -50
- package/dist/esm/node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js +0 -2
- package/dist/esm/shared/createPageContextShared.js +1 -3
- package/dist/esm/shared/hooks/execHook.d.ts +14 -28
- package/dist/esm/shared/hooks/execHook.js +31 -54
- package/dist/esm/shared/route/execHookGuard.d.ts +8 -0
- package/dist/esm/shared/route/{executeGuardHook.js → execHookGuard.js} +4 -4
- package/dist/esm/shared/route/{executeOnBeforeRouteHook.d.ts → execHookOnBeforeRoute.d.ts} +2 -2
- package/dist/esm/shared/route/{executeOnBeforeRouteHook.js → execHookOnBeforeRoute.js} +5 -5
- package/dist/esm/shared/route/index.js +3 -2
- package/dist/esm/shared/route/resolveRouteFunction.js +2 -2
- package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/esm/utils/PROJECT_VERSION.js +1 -1
- package/dist/esm/utils/styleFileRE.js +1 -0
- package/package.json +1 -1
- package/dist/esm/node/runtime/renderPage/executeOnBeforeRenderAndDataHooks.d.ts +0 -6
- package/dist/esm/shared/route/executeGuardHook.d.ts +0 -8
|
@@ -2,16 +2,16 @@ export { renderPageAlreadyRouted };
|
|
|
2
2
|
export { prerenderPage };
|
|
3
3
|
import { getErrorPageId } from '../../../shared/error-page.js';
|
|
4
4
|
import { getHtmlString } from '../html/renderHtml.js';
|
|
5
|
-
import { assert, assertUsage, hasProp, objectAssign } from '../utils.js';
|
|
5
|
+
import { assert, assertUsage, augmentType, hasProp, objectAssign } from '../utils.js';
|
|
6
6
|
import { getPageContextClientSerialized } from '../html/serializeContext.js';
|
|
7
7
|
import { createHttpResponsePage, createHttpResponsePageContextJson } from './createHttpResponse.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
8
|
+
import { loadPageConfigsLazyServerSideAndExecHook, } from './loadPageConfigsLazyServerSide.js';
|
|
9
|
+
import { execHookOnRenderHtml } from './execHookOnRenderHtml.js';
|
|
10
|
+
import { execHookDataAndOnBeforeRender } from './execHookDataAndOnBeforeRender.js';
|
|
11
11
|
import { logRuntimeError } from '../loggerRuntime.js';
|
|
12
12
|
import { isNewError } from './isNewError.js';
|
|
13
13
|
import { preparePageContextForPublicUsageServer } from './preparePageContextForPublicUsageServer.js';
|
|
14
|
-
import {
|
|
14
|
+
import { execHookGuard } from '../../../shared/route/execHookGuard.js';
|
|
15
15
|
import pc from '@brillout/picocolors';
|
|
16
16
|
import { isServerSideError } from '../../../shared/misc/isServerSideError.js';
|
|
17
17
|
async function renderPageAlreadyRouted(pageContext) {
|
|
@@ -23,16 +23,16 @@ async function renderPageAlreadyRouted(pageContext) {
|
|
|
23
23
|
assert(isError ===
|
|
24
24
|
(pageContext.pageId ===
|
|
25
25
|
getErrorPageId(pageContext._globalContext._pageFilesAll, pageContext._globalContext._pageConfigs)));
|
|
26
|
-
|
|
26
|
+
augmentType(pageContext, await loadPageConfigsLazyServerSideAndExecHook(pageContext));
|
|
27
27
|
if (!isError) {
|
|
28
|
-
await
|
|
28
|
+
await execHookGuard(pageContext, (pageContext) => preparePageContextForPublicUsageServer(pageContext));
|
|
29
29
|
}
|
|
30
30
|
if (!isError) {
|
|
31
|
-
await
|
|
31
|
+
await execHookDataAndOnBeforeRender(pageContext);
|
|
32
32
|
}
|
|
33
33
|
else {
|
|
34
34
|
try {
|
|
35
|
-
await
|
|
35
|
+
await execHookDataAndOnBeforeRender(pageContext);
|
|
36
36
|
}
|
|
37
37
|
catch (err) {
|
|
38
38
|
if (isNewError(err, pageContext.errorWhileRendering)) {
|
|
@@ -49,7 +49,7 @@ async function renderPageAlreadyRouted(pageContext) {
|
|
|
49
49
|
objectAssign(pageContext, { httpResponse });
|
|
50
50
|
return pageContext;
|
|
51
51
|
}
|
|
52
|
-
const renderHookResult = await
|
|
52
|
+
const renderHookResult = await execHookOnRenderHtml(pageContext);
|
|
53
53
|
const { htmlRender, renderHook } = renderHookResult;
|
|
54
54
|
const httpResponse = await createHttpResponsePage(htmlRender, renderHook, pageContext);
|
|
55
55
|
objectAssign(pageContext, { httpResponse });
|
|
@@ -62,10 +62,10 @@ async function prerenderPage(pageContext) {
|
|
|
62
62
|
});
|
|
63
63
|
/* Should we execute the guard() hook upon pre-rendering? Is there a use case for this?
|
|
64
64
|
* - It isn't trivial to implement, as it requires to duplicate / factor out the isAbortError() handling
|
|
65
|
-
await
|
|
65
|
+
await execHookGuard(pageContext, (pageContext) => preparePageContextForPublicUsageServer(pageContext))
|
|
66
66
|
*/
|
|
67
|
-
await
|
|
68
|
-
const { htmlRender, renderHook } = await
|
|
67
|
+
await execHookDataAndOnBeforeRender(pageContext);
|
|
68
|
+
const { htmlRender, renderHook } = await execHookOnRenderHtml(pageContext);
|
|
69
69
|
assertUsage(htmlRender !== null, `Cannot pre-render ${pc.cyan(pageContext.urlOriginal)} because the ${renderHook.hookName}() hook defined by ${renderHook.hookFilePath} didn't return an HTML string.`);
|
|
70
70
|
assert(pageContext.isClientSideNavigation === false);
|
|
71
71
|
const documentHtml = await getHtmlString(htmlRender);
|
|
@@ -3,7 +3,7 @@ export { renderPage_addAsyncHookwrapper };
|
|
|
3
3
|
import { renderPageAlreadyRouted } from './renderPage/renderPageAlreadyRouted.js';
|
|
4
4
|
import { createPageContextServerSide, createPageContextServerSideWithoutGlobalContext, } from './renderPage/createPageContextServerSide.js';
|
|
5
5
|
import { route } from '../../shared/route/index.js';
|
|
6
|
-
import { assert, hasProp, objectAssign, isUrl, parseUrl, onSetupRuntime, assertWarning, getGlobalObject, checkType, assertUsage, normalizeUrlPathname, removeBaseServer, modifyUrlPathname, prependBase, removeUrlOrigin, setUrlOrigin, isUri, getUrlPretty, } from './utils.js';
|
|
6
|
+
import { assert, hasProp, objectAssign, isUrl, parseUrl, onSetupRuntime, assertWarning, getGlobalObject, checkType, assertUsage, normalizeUrlPathname, removeBaseServer, modifyUrlPathname, prependBase, removeUrlOrigin, setUrlOrigin, isUri, getUrlPretty, augmentType, } from './utils.js';
|
|
7
7
|
import { assertNoInfiniteAbortLoop, getPageContextFromAllRewrites, isAbortError, logAbortErrorHandled, } from '../../shared/route/abort.js';
|
|
8
8
|
import { getGlobalContextServerInternal, initGlobalContext_renderPage, } from './globalContext.js';
|
|
9
9
|
import { handlePageContextRequestUrl } from './renderPage/handlePageContextRequestUrl.js';
|
|
@@ -16,7 +16,7 @@ import pc from '@brillout/picocolors';
|
|
|
16
16
|
import { getPageContextClientSerializedAbort, getPageContextClientSerialized } from './html/serializeContext.js';
|
|
17
17
|
import { getErrorPageId } from '../../shared/error-page.js';
|
|
18
18
|
import { handleErrorWithoutErrorPage } from './renderPage/handleErrorWithoutErrorPage.js';
|
|
19
|
-
import {
|
|
19
|
+
import { loadPageConfigsLazyServerSideAndExecHook } from './renderPage/loadPageConfigsLazyServerSide.js';
|
|
20
20
|
import { resolveRedirects } from './renderPage/resolveRedirects.js';
|
|
21
21
|
import { getVikeConfigError } from '../shared/getVikeConfigError.js';
|
|
22
22
|
const globalObject = getGlobalObject('runtime/renderPage.ts', { httpRequestsCount: 0 });
|
|
@@ -138,59 +138,66 @@ async function renderPageAlreadyPrepared(pageContextBegin, globalContext, httpRe
|
|
|
138
138
|
else {
|
|
139
139
|
assert(errNominalPage);
|
|
140
140
|
assert(pageContextNominalPageSuccess === undefined);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
141
|
+
return await renderPageOnError(errNominalPage, pageContextBegin, pageContextNominalPageBegin, globalContext, httpRequestId, pageContextsFromRewrite);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// When the normal page threw an error
|
|
145
|
+
// - Can be a URL rewrite upon `throw render('/some-url')`
|
|
146
|
+
// - Can be rendering the error page
|
|
147
|
+
// - Can be rendering Vike's generic error page (if no error page is defined, or if the error page throws an error)
|
|
148
|
+
async function renderPageOnError(errNominalPage, pageContextBegin, pageContextNominalPageBegin, globalContext, httpRequestId, pageContextsFromRewrite) {
|
|
149
|
+
assert(pageContextNominalPageBegin);
|
|
150
|
+
assert(hasProp(pageContextNominalPageBegin, 'urlOriginal', 'string'));
|
|
151
|
+
const pageContextErrorPageInit = await getPageContextErrorPageInit(pageContextBegin, errNominalPage, pageContextNominalPageBegin);
|
|
152
|
+
// Handle `throw redirect()` and `throw render()` while rendering nominal page
|
|
153
|
+
if (isAbortError(errNominalPage)) {
|
|
154
|
+
const handled = await handleAbortError(errNominalPage, pageContextsFromRewrite, pageContextBegin, pageContextNominalPageBegin, httpRequestId, pageContextErrorPageInit, globalContext);
|
|
155
|
+
if (handled.pageContextReturn) {
|
|
156
|
+
// - throw redirect()
|
|
157
|
+
// - throw render(url)
|
|
158
|
+
// - throw render(abortStatusCode) if .pageContext.json request
|
|
159
|
+
return handled.pageContextReturn;
|
|
157
160
|
}
|
|
158
|
-
{
|
|
159
|
-
|
|
160
|
-
if (!errorPageId) {
|
|
161
|
-
objectAssign(pageContextErrorPageInit, { pageId: null });
|
|
162
|
-
return handleErrorWithoutErrorPage(pageContextErrorPageInit);
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
objectAssign(pageContextErrorPageInit, { pageId: errorPageId });
|
|
166
|
-
}
|
|
161
|
+
else {
|
|
162
|
+
// - throw render(abortStatusCode) if not .pageContext.json request
|
|
167
163
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
164
|
+
Object.assign(pageContextErrorPageInit, handled.pageContextAbort);
|
|
165
|
+
}
|
|
166
|
+
{
|
|
167
|
+
const errorPageId = getErrorPageId(globalContext._pageFilesAll, globalContext._pageConfigs);
|
|
168
|
+
if (!errorPageId) {
|
|
169
|
+
objectAssign(pageContextErrorPageInit, { pageId: null });
|
|
170
|
+
return handleErrorWithoutErrorPage(pageContextErrorPageInit);
|
|
171
171
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
172
|
+
else {
|
|
173
|
+
objectAssign(pageContextErrorPageInit, { pageId: errorPageId });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
let pageContextErrorPage;
|
|
177
|
+
try {
|
|
178
|
+
pageContextErrorPage = await renderPageAlreadyRouted(pageContextErrorPageInit);
|
|
179
|
+
}
|
|
180
|
+
catch (errErrorPage) {
|
|
181
|
+
// Handle `throw redirect()` and `throw render()` while rendering error page
|
|
182
|
+
if (isAbortError(errErrorPage)) {
|
|
183
|
+
const handled = await handleAbortError(errErrorPage, pageContextsFromRewrite, pageContextBegin, pageContextNominalPageBegin, httpRequestId, pageContextErrorPageInit, globalContext);
|
|
184
|
+
// throw render(abortStatusCode)
|
|
185
|
+
if (!handled.pageContextReturn) {
|
|
186
|
+
const pageContextAbort = errErrorPage._pageContextAbort;
|
|
187
|
+
assertWarning(false, `Failed to render error page because ${pc.cyan(pageContextAbort._abortCall)} was called: make sure ${pc.cyan(pageContextAbort._abortCaller)} doesn't occur while the error page is being rendered.`, { onlyOnce: false });
|
|
188
|
+
const pageContextHttpWithError = getPageContextHttpResponseError(errNominalPage, pageContextBegin);
|
|
189
|
+
return pageContextHttpWithError;
|
|
188
190
|
}
|
|
189
|
-
|
|
190
|
-
return
|
|
191
|
+
// `throw redirect()` / `throw render(url)`
|
|
192
|
+
return handled.pageContextReturn;
|
|
191
193
|
}
|
|
192
|
-
|
|
194
|
+
if (isNewError(errErrorPage, errNominalPage)) {
|
|
195
|
+
logRuntimeError(errErrorPage, httpRequestId);
|
|
196
|
+
}
|
|
197
|
+
const pageContextWithError = getPageContextHttpResponseError(errNominalPage, pageContextBegin);
|
|
198
|
+
return pageContextWithError;
|
|
193
199
|
}
|
|
200
|
+
return pageContextErrorPage;
|
|
194
201
|
}
|
|
195
202
|
function logHttpRequest(urlOriginal, httpRequestId) {
|
|
196
203
|
logRuntimeInfo?.(getRequestInfoMessage(urlOriginal), httpRequestId, 'info');
|
|
@@ -412,7 +419,7 @@ pageContextNominalPageBegin, httpRequestId, pageContextErrorPageInit, globalCont
|
|
|
412
419
|
objectAssign(pageContext, { pageId: errorPageId });
|
|
413
420
|
objectAssign(pageContext, pageContextAbort);
|
|
414
421
|
objectAssign(pageContext, pageContextErrorPageInit, true);
|
|
415
|
-
|
|
422
|
+
augmentType(pageContext, await loadPageConfigsLazyServerSideAndExecHook(pageContext));
|
|
416
423
|
// We include pageContextInit: we don't only serialize pageContextAbort because the error page may need to access pageContextInit
|
|
417
424
|
pageContextSerialized = getPageContextClientSerialized(pageContext);
|
|
418
425
|
}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
export { createPageContextShared };
|
|
2
2
|
export { createPageContextObject };
|
|
3
|
-
import { execHookGlobal } from './hooks/execHook.js';
|
|
4
|
-
import { preparePageContextForPublicUsage } from './preparePageContextForPublicUsage.js';
|
|
5
3
|
import { changeEnumerable, objectAssign } from './utils.js';
|
|
4
|
+
// TODO/now: make this and parents sync
|
|
6
5
|
async function createPageContextShared(pageContextCreated, pageConfigGlobal, vikeConfigPublicGlobal) {
|
|
7
6
|
objectAssign(pageContextCreated, vikeConfigPublicGlobal);
|
|
8
|
-
await execHookGlobal('onCreatePageContext', pageConfigGlobal, pageContextCreated, pageContextCreated, preparePageContextForPublicUsage);
|
|
9
7
|
return pageContextCreated;
|
|
10
8
|
}
|
|
11
9
|
function createPageContextObject() {
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
export { execHook };
|
|
2
|
-
export { execHookSingle };
|
|
3
|
-
export { execHookSingleWithReturn };
|
|
4
|
-
export { execHookErrorHandling };
|
|
5
|
-
export { execHooksErrorHandling };
|
|
6
|
-
export { execHookWithoutPageContext };
|
|
7
2
|
export { execHookGlobal };
|
|
8
|
-
export {
|
|
3
|
+
export { execHookDirect };
|
|
4
|
+
export { execHookDirectSingle };
|
|
5
|
+
export { execHookDirectSingleWithReturn };
|
|
6
|
+
export { execHookDirectWithoutPageContext };
|
|
7
|
+
export { execHookDirectSync };
|
|
9
8
|
export { getPageContext };
|
|
10
9
|
export { providePageContext };
|
|
11
10
|
export { isUserHookError };
|
|
12
|
-
export type {
|
|
11
|
+
export type { PageContextExecHook };
|
|
13
12
|
import type { PageContextClient, PageContextServer } from '../../types/PageContext.js';
|
|
14
13
|
import type { Hook, HookLoc } from './getHook.js';
|
|
15
14
|
import type { VikeConfigPublicPageLazy } from '../getPageFiles.js';
|
|
@@ -19,34 +18,21 @@ import type { PageContextForPublicUsageServer } from '../../node/runtime/renderP
|
|
|
19
18
|
import type { PageContextForPublicUsageClientShared } from '../../client/shared/preparePageContextForPublicUsageClientShared.js';
|
|
20
19
|
import { type PageContextPrepareMinimum } from '../preparePageContextForPublicUsage.js';
|
|
21
20
|
import type { GlobalContextPrepareMinimum } from '../prepareGlobalContextForPublicUsage.js';
|
|
22
|
-
type
|
|
21
|
+
type PageContextExecHook = VikeConfigPublicPageLazy & PageContextForPublicUsage;
|
|
23
22
|
type PageContextForPublicUsage = PageContextForPublicUsageServer | PageContextForPublicUsageClientShared;
|
|
24
23
|
type HookWithResult = Hook & {
|
|
25
24
|
hookReturn: unknown;
|
|
26
25
|
};
|
|
27
|
-
declare function
|
|
28
|
-
declare function
|
|
26
|
+
declare function execHook<PageContext extends PageContextExecHook>(hookName: HookName, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<HookWithResult[]>;
|
|
27
|
+
declare function execHookGlobal<HookArg extends PageContextPrepareMinimum | GlobalContextPrepareMinimum>(hookName: HookNameGlobal, pageConfigGlobal: PageConfigGlobalRuntime, pageContext: PageContextPrepareMinimum | null, hookArg: HookArg, prepareForPublicUsage: (hookArg: HookArg) => HookArg): Promise<void>;
|
|
28
|
+
declare function execHookDirect<PageContext extends PageContextPrepareMinimum>(hooks: Hook[], pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<HookWithResult[]>;
|
|
29
|
+
declare function execHookDirectSingle<PageContext extends PageContextExecHook>(hook: Hook, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<void>;
|
|
30
|
+
declare function execHookDirectSingleWithReturn<PageContext extends PageContextExecHook>(hook: Hook, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<{
|
|
29
31
|
hookReturn: unknown;
|
|
30
32
|
}>;
|
|
31
|
-
declare function execHook<PageContext extends PageContextExecuteHook>(hookName: HookName, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<HookWithResult[]>;
|
|
32
|
-
declare function execHookErrorHandling<PageContext extends PageContextExecuteHook>(hookName: HookName, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<{
|
|
33
|
-
hooks: HookWithResult[];
|
|
34
|
-
err?: undefined;
|
|
35
|
-
} | {
|
|
36
|
-
hooks: Hook[];
|
|
37
|
-
err: unknown;
|
|
38
|
-
}>;
|
|
39
|
-
declare function execHooksErrorHandling<PageContext extends PageContextPrepareMinimum>(hooks: Hook[], pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): Promise<{
|
|
40
|
-
hooks: HookWithResult[];
|
|
41
|
-
err?: undefined;
|
|
42
|
-
} | {
|
|
43
|
-
hooks: Hook[];
|
|
44
|
-
err: unknown;
|
|
45
|
-
}>;
|
|
46
|
-
declare function execHookGlobal<HookArg extends PageContextPrepareMinimum | GlobalContextPrepareMinimum>(hookName: HookNameGlobal, pageConfigGlobal: PageConfigGlobalRuntime, pageContext: PageContextPrepareMinimum | null, hookArg: HookArg, prepareForPublicUsage: (hookArg: HookArg) => HookArg): Promise<void>;
|
|
47
33
|
declare function isUserHookError(err: unknown): false | HookLoc;
|
|
48
|
-
declare function
|
|
49
|
-
declare function
|
|
34
|
+
declare function execHookDirectWithoutPageContext<HookReturn>(hookFnCaller: () => HookReturn, hook: Omit<Hook, 'hookFn'>): Promise<HookReturn>;
|
|
35
|
+
declare function execHookDirectSync<PageContext extends PageContextPrepareMinimum>(hook: Omit<Hook, 'hookTimeout'>, pageContext: PageContext, preparePageContextForPublicUsage: (pageContext: PageContext) => PageContext): {
|
|
50
36
|
hookReturn: unknown;
|
|
51
37
|
};
|
|
52
38
|
/**
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
export { execHook };
|
|
2
|
-
export { execHookSingle };
|
|
3
|
-
export { execHookSingleWithReturn };
|
|
4
|
-
export { execHookErrorHandling };
|
|
5
|
-
export { execHooksErrorHandling };
|
|
6
|
-
export { execHookWithoutPageContext };
|
|
7
2
|
export { execHookGlobal };
|
|
8
|
-
export {
|
|
3
|
+
export { execHookDirect };
|
|
4
|
+
export { execHookDirectSingle };
|
|
5
|
+
export { execHookDirectSingleWithReturn };
|
|
6
|
+
export { execHookDirectWithoutPageContext };
|
|
7
|
+
export { execHookDirectSync };
|
|
9
8
|
export { getPageContext };
|
|
10
9
|
export { providePageContext };
|
|
11
10
|
export { isUserHookError };
|
|
@@ -19,70 +18,48 @@ const globalObject = getGlobalObject('utils/execHook.ts', {
|
|
|
19
18
|
userHookErrors: new WeakMap(),
|
|
20
19
|
pageContext: null,
|
|
21
20
|
});
|
|
22
|
-
async function execHookSingle(hook, pageContext, preparePageContextForPublicUsage) {
|
|
23
|
-
const res = await execHooksErrorHandling([hook], pageContext, preparePageContextForPublicUsage);
|
|
24
|
-
if ('err' in res)
|
|
25
|
-
throw res.err;
|
|
26
|
-
const { hookReturn } = res.hooks[0];
|
|
27
|
-
assertUsage(hookReturn === undefined, `The ${hook.hookName}() hook defined by ${hook.hookFilePath} isn't allowed to return a value`);
|
|
28
|
-
}
|
|
29
|
-
async function execHookSingleWithReturn(hook, pageContext, preparePageContextForPublicUsage) {
|
|
30
|
-
const res = await execHooksErrorHandling([hook], pageContext, preparePageContextForPublicUsage);
|
|
31
|
-
if ('err' in res)
|
|
32
|
-
throw res.err;
|
|
33
|
-
const { hookReturn } = res.hooks[0];
|
|
34
|
-
return { hookReturn };
|
|
35
|
-
}
|
|
36
21
|
async function execHook(hookName, pageContext, preparePageContextForPublicUsage) {
|
|
37
|
-
const res = await execHookErrorHandling(hookName, pageContext, preparePageContextForPublicUsage);
|
|
38
|
-
if ('err' in res)
|
|
39
|
-
throw res.err;
|
|
40
|
-
return res.hooks;
|
|
41
|
-
}
|
|
42
|
-
async function execHookErrorHandling(hookName, pageContext, preparePageContextForPublicUsage) {
|
|
43
22
|
const hooks = getHookFromPageContextNew(hookName, pageContext);
|
|
44
|
-
return
|
|
45
|
-
}
|
|
46
|
-
async function execHooksErrorHandling(hooks, pageContext, preparePageContextForPublicUsage) {
|
|
47
|
-
if (!hooks.length)
|
|
48
|
-
return { hooks: [] };
|
|
49
|
-
const pageContextForPublicUsage = preparePageContextForPublicUsage(pageContext);
|
|
50
|
-
let hooksWithResult;
|
|
51
|
-
let err;
|
|
52
|
-
try {
|
|
53
|
-
hooksWithResult = await Promise.all(hooks.map(async (hook) => {
|
|
54
|
-
const hookReturn = await execHookAsync(() => hook.hookFn(pageContextForPublicUsage), hook, pageContextForPublicUsage);
|
|
55
|
-
return { ...hook, hookReturn };
|
|
56
|
-
}));
|
|
57
|
-
}
|
|
58
|
-
catch (err_) {
|
|
59
|
-
err = err_;
|
|
60
|
-
}
|
|
61
|
-
if (hooksWithResult) {
|
|
62
|
-
return { hooks: hooksWithResult };
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
return { hooks, err };
|
|
66
|
-
}
|
|
23
|
+
return await execHookDirect(hooks, pageContext, preparePageContextForPublicUsage);
|
|
67
24
|
}
|
|
68
25
|
async function execHookGlobal(hookName, pageConfigGlobal, pageContext, hookArg, prepareForPublicUsage) {
|
|
69
26
|
const hooks = getHookFromPageConfigGlobalCumulative(pageConfigGlobal, hookName);
|
|
70
27
|
const hookArgForPublicUsage = prepareForPublicUsage(hookArg);
|
|
71
28
|
await Promise.all(hooks.map(async (hook) => {
|
|
72
|
-
await
|
|
29
|
+
await execHookDirectAsync(() => hook.hookFn(hookArgForPublicUsage), hook, pageContext);
|
|
73
30
|
}));
|
|
74
31
|
}
|
|
32
|
+
async function execHookDirect(hooks, pageContext, preparePageContextForPublicUsage) {
|
|
33
|
+
if (!hooks.length)
|
|
34
|
+
return [];
|
|
35
|
+
const pageContextForPublicUsage = preparePageContextForPublicUsage(pageContext);
|
|
36
|
+
const hooksWithResult = await Promise.all(hooks.map(async (hook) => {
|
|
37
|
+
const hookReturn = await execHookDirectAsync(() => hook.hookFn(pageContextForPublicUsage), hook, pageContextForPublicUsage);
|
|
38
|
+
return { ...hook, hookReturn };
|
|
39
|
+
}));
|
|
40
|
+
return hooksWithResult;
|
|
41
|
+
}
|
|
42
|
+
async function execHookDirectSingle(hook, pageContext, preparePageContextForPublicUsage) {
|
|
43
|
+
const hooksWithResult = await execHookDirect([hook], pageContext, preparePageContextForPublicUsage);
|
|
44
|
+
const { hookReturn } = hooksWithResult[0];
|
|
45
|
+
assertUsage(hookReturn === undefined, `The ${hook.hookName}() hook defined by ${hook.hookFilePath} isn't allowed to return a value`);
|
|
46
|
+
}
|
|
47
|
+
async function execHookDirectSingleWithReturn(hook, pageContext, preparePageContextForPublicUsage) {
|
|
48
|
+
const hooksWithResult = await execHookDirect([hook], pageContext, preparePageContextForPublicUsage);
|
|
49
|
+
const { hookReturn } = hooksWithResult[0];
|
|
50
|
+
return { hookReturn };
|
|
51
|
+
}
|
|
75
52
|
function isUserHookError(err) {
|
|
76
53
|
if (!isObject(err))
|
|
77
54
|
return false;
|
|
78
55
|
return globalObject.userHookErrors.get(err) ?? false;
|
|
79
56
|
}
|
|
80
|
-
async function
|
|
57
|
+
async function execHookDirectWithoutPageContext(hookFnCaller, hook) {
|
|
81
58
|
const { hookName, hookFilePath, hookTimeout } = hook;
|
|
82
|
-
const hookReturn = await
|
|
59
|
+
const hookReturn = await execHookDirectAsync(hookFnCaller, { hookName, hookFilePath, hookTimeout }, null);
|
|
83
60
|
return hookReturn;
|
|
84
61
|
}
|
|
85
|
-
function
|
|
62
|
+
function execHookDirectAsync(hookFnCaller, hook, pageContextForPublicUsage) {
|
|
86
63
|
const { hookName, hookFilePath, hookTimeout: { error: timeoutErr, warning: timeoutWarn }, } = hook;
|
|
87
64
|
let resolve;
|
|
88
65
|
let reject;
|
|
@@ -126,7 +103,7 @@ function execHookAsync(hookFnCaller, hook, pageContextForPublicUsage) {
|
|
|
126
103
|
})();
|
|
127
104
|
return promise;
|
|
128
105
|
}
|
|
129
|
-
function
|
|
106
|
+
function execHookDirectSync(hook, pageContext, preparePageContextForPublicUsage) {
|
|
130
107
|
const pageContextForPublicUsage = preparePageContextForPublicUsage(pageContext);
|
|
131
108
|
providePageContextInternal(pageContextForPublicUsage);
|
|
132
109
|
const hookReturn = hook.hookFn(pageContextForPublicUsage);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { execHookGuard };
|
|
2
|
+
import { type PageContextExecHook } from '../hooks/execHook.js';
|
|
3
|
+
import type { GlobalContextInternal } from '../createGlobalContextShared.js';
|
|
4
|
+
declare function execHookGuard<PageContext extends {
|
|
5
|
+
pageId: string;
|
|
6
|
+
} & {
|
|
7
|
+
_globalContext: GlobalContextInternal;
|
|
8
|
+
} & PageContextExecHook>(pageContext: PageContext, prepareForPublicUsage: (pageConfig: PageContext) => PageContext): Promise<void>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { execHookGuard };
|
|
2
2
|
import { getHookFromPageContext, getHookTimeoutDefault } from '../hooks/getHook.js';
|
|
3
3
|
import { assert, assertUsage, isCallable } from './utils.js';
|
|
4
|
-
import {
|
|
4
|
+
import { execHookDirectSingle } from '../hooks/execHook.js';
|
|
5
5
|
const errIntro = 'The guard() hook defined by';
|
|
6
|
-
async function
|
|
6
|
+
async function execHookGuard(pageContext, prepareForPublicUsage) {
|
|
7
7
|
let hook;
|
|
8
8
|
if (pageContext._globalContext._pageFilesAll.length > 0) {
|
|
9
9
|
// TODO/v1-release: remove
|
|
@@ -17,7 +17,7 @@ async function executeGuardHook(pageContext, prepareForPublicUsage) {
|
|
|
17
17
|
}
|
|
18
18
|
if (!hook)
|
|
19
19
|
return;
|
|
20
|
-
await
|
|
20
|
+
await execHookDirectSingle(hook, pageContext, prepareForPublicUsage);
|
|
21
21
|
}
|
|
22
22
|
function findPageGuard(pageId, pageFilesAll) {
|
|
23
23
|
const pageRouteFile = pageFilesAll.find((p) => p.pageId === pageId && p.fileType === '.page.route');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { execHookOnBeforeRoute };
|
|
2
2
|
import type { PageContextForRoute, PageContextFromRoute } from './index.js';
|
|
3
|
-
declare function
|
|
3
|
+
declare function execHookOnBeforeRoute(pageContext: PageContextForRoute): Promise<null | ({
|
|
4
4
|
_routingProvidedByOnBeforeRouteHook: true;
|
|
5
5
|
} & PageContextFromRoute) | {
|
|
6
6
|
_routingProvidedByOnBeforeRouteHook: false;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { execHookOnBeforeRoute };
|
|
2
2
|
import { assertPageContextProvidedByUser } from '../assertPageContextProvidedByUser.js';
|
|
3
3
|
import { assertUsage, hasProp, isObjectWithKeys, objectAssign, assertWarning, assertUsageUrlPathnameAbsolute, joinEnglish, assert, } from './utils.js';
|
|
4
4
|
import { assertRouteParams, assertSyncRouting } from './resolveRouteFunction.js';
|
|
5
5
|
import pc from '@brillout/picocolors';
|
|
6
|
-
import {
|
|
6
|
+
import { execHookDirectSync } from '../hooks/execHook.js';
|
|
7
7
|
import { preparePageContextForPublicUsage, } from '../preparePageContextForPublicUsage.js';
|
|
8
|
-
async function
|
|
8
|
+
async function execHookOnBeforeRoute(pageContext) {
|
|
9
9
|
const pageContextFromOnBeforeRouteHook = {};
|
|
10
10
|
if (!pageContext._globalContext._onBeforeRouteHook)
|
|
11
11
|
return null;
|
|
@@ -34,9 +34,9 @@ async function executeOnBeforeRouteHook(pageContext) {
|
|
|
34
34
|
return pageContextFromOnBeforeRouteHook;
|
|
35
35
|
}
|
|
36
36
|
async function getPageContextFromHook(onBeforeRouteHook, pageContext) {
|
|
37
|
-
let { hookReturn } =
|
|
37
|
+
let { hookReturn } = execHookDirectSync(onBeforeRouteHook, pageContext, preparePageContextForPublicUsage);
|
|
38
38
|
assertSyncRouting(hookReturn, `The onBeforeRoute() hook ${onBeforeRouteHook.hookFilePath}`);
|
|
39
|
-
// TODO/v1-release: make
|
|
39
|
+
// TODO/v1-release: make execHookOnBeforeRoute() and route() sync
|
|
40
40
|
hookReturn = await hookReturn;
|
|
41
41
|
const errPrefix = `The onBeforeRoute() hook defined by ${onBeforeRouteHook.hookFilePath}`;
|
|
42
42
|
assertUsage(hookReturn === null ||
|
|
@@ -9,15 +9,16 @@ import { assert, assertUsage, isPlainObject, objectAssign } from './utils.js';
|
|
|
9
9
|
import { resolvePrecedence } from './resolvePrecedence.js';
|
|
10
10
|
import { resolveRouteString } from './resolveRouteString.js';
|
|
11
11
|
import { resolveRouteFunction } from './resolveRouteFunction.js';
|
|
12
|
-
import {
|
|
12
|
+
import { execHookOnBeforeRoute } from './execHookOnBeforeRoute.js';
|
|
13
13
|
import { debug } from './debug.js';
|
|
14
14
|
import pc from '@brillout/picocolors';
|
|
15
|
+
// TODO/next-major-release: make it sync
|
|
15
16
|
async function route(pageContext, skipOnBeforeRouteHook) {
|
|
16
17
|
debug('Pages routes:', pageContext._globalContext._pageRoutes);
|
|
17
18
|
const pageContextFromRoute = {};
|
|
18
19
|
// onBeforeRoute()
|
|
19
20
|
if (!skipOnBeforeRouteHook) {
|
|
20
|
-
const pageContextFromOnBeforeRouteHook = await
|
|
21
|
+
const pageContextFromOnBeforeRouteHook = await execHookOnBeforeRoute(pageContext);
|
|
21
22
|
if (pageContextFromOnBeforeRouteHook) {
|
|
22
23
|
if (pageContextFromOnBeforeRouteHook._routingProvidedByOnBeforeRouteHook) {
|
|
23
24
|
assert(pageContextFromOnBeforeRouteHook.pageId);
|
|
@@ -2,12 +2,12 @@ export { resolveRouteFunction };
|
|
|
2
2
|
export { assertRouteParams };
|
|
3
3
|
export { assertSyncRouting };
|
|
4
4
|
export { warnDeprecatedAllowKey };
|
|
5
|
-
import {
|
|
5
|
+
import { execHookDirectSync } from '../hooks/execHook.js';
|
|
6
6
|
import { preparePageContextForPublicUsage } from '../preparePageContextForPublicUsage.js';
|
|
7
7
|
import { assert, assertUsage, assertWarning, hasProp, isPlainObject, isPromise } from './utils.js';
|
|
8
8
|
import pc from '@brillout/picocolors';
|
|
9
9
|
async function resolveRouteFunction(routeFunction, pageContext, routeFunctionFilePath) {
|
|
10
|
-
let { hookReturn: result } =
|
|
10
|
+
let { hookReturn: result } = execHookDirectSync({
|
|
11
11
|
hookFn: routeFunction,
|
|
12
12
|
hookFilePath: routeFunctionFilePath,
|
|
13
13
|
hookName: 'route',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const PROJECT_VERSION: "0.4.
|
|
1
|
+
export declare const PROJECT_VERSION: "0.4.233-commit-e534fd6";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Automatically updated by @brillout/release-me
|
|
2
|
-
export const PROJECT_VERSION = '0.4.
|
|
2
|
+
export const PROJECT_VERSION = '0.4.233-commit-e534fd6';
|
package/package.json
CHANGED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { executeOnBeforeRenderAndDataHooks };
|
|
2
|
-
import { type PageContextExecuteHookServer } from './execHookServer.js';
|
|
3
|
-
declare function executeOnBeforeRenderAndDataHooks(pageContext: {
|
|
4
|
-
pageId: string;
|
|
5
|
-
_pageContextAlreadyProvidedByOnPrerenderHook?: true;
|
|
6
|
-
} & PageContextExecuteHookServer): Promise<void>;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { executeGuardHook };
|
|
2
|
-
import { type PageContextExecuteHook } from '../hooks/execHook.js';
|
|
3
|
-
import type { GlobalContextInternal } from '../createGlobalContextShared.js';
|
|
4
|
-
declare function executeGuardHook<PageContext extends {
|
|
5
|
-
pageId: string;
|
|
6
|
-
} & {
|
|
7
|
-
_globalContext: GlobalContextInternal;
|
|
8
|
-
} & PageContextExecuteHook>(pageContext: PageContext, prepareForPublicUsage: (pageConfig: PageContext) => PageContext): Promise<void>;
|