vike 0.4.225 → 0.4.226-commit-8f5c172

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 (157) hide show
  1. package/dist/cjs/client/shared/getPageContextProxyForUser.js +3 -66
  2. package/dist/cjs/node/api/build.js +7 -7
  3. package/dist/cjs/node/api/dev.js +2 -2
  4. package/dist/cjs/node/api/prepareViteApiCall.js +55 -30
  5. package/dist/cjs/node/api/prerender.js +2 -3
  6. package/dist/cjs/node/api/preview.js +27 -6
  7. package/dist/cjs/node/api/utils.js +1 -0
  8. package/dist/cjs/node/cli/entry.js +4 -2
  9. package/dist/cjs/node/cli/parseCli.js +10 -4
  10. package/dist/cjs/node/plugin/plugins/build/pluginAutoFullBuild.js +3 -3
  11. package/dist/cjs/node/plugin/plugins/build/pluginModuleBanner.js +51 -0
  12. package/dist/cjs/node/plugin/plugins/build.js +3 -1
  13. package/dist/cjs/node/plugin/plugins/commonConfig.js +22 -8
  14. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +5 -5
  15. package/dist/cjs/node/plugin/plugins/fileEnv.js +3 -0
  16. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +14 -10
  17. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +5 -1
  18. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -12
  19. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +99 -85
  20. package/dist/cjs/node/plugin/plugins/setGlobalContext.js +10 -1
  21. package/dist/cjs/node/plugin/shared/getEnvVarObject.js +7 -0
  22. package/dist/cjs/node/prerender/resolvePrerenderConfig.js +3 -3
  23. package/dist/cjs/node/prerender/runPrerender.js +21 -28
  24. package/dist/cjs/node/prerender/utils.js +1 -1
  25. package/dist/cjs/node/runtime/globalContext.js +13 -8
  26. package/dist/cjs/node/runtime/html/injectAssets/getViteDevScript.js +6 -3
  27. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +67 -14
  28. package/dist/cjs/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +3 -2
  29. package/dist/cjs/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +3 -0
  30. package/dist/cjs/node/runtime/renderPage/renderPageAlreadyRouted.js +18 -12
  31. package/dist/cjs/node/runtime/renderPage.js +13 -28
  32. package/dist/cjs/node/runtime/utils.js +1 -1
  33. package/dist/cjs/node/runtime-dev/createDevMiddleware.js +2 -2
  34. package/dist/cjs/node/shared/assertV1Design.js +1 -1
  35. package/dist/cjs/node/shared/utils.js +1 -1
  36. package/dist/cjs/node/shared/virtual-files.js +14 -10
  37. package/dist/cjs/shared/NOT_SERIALIZABLE.js +5 -0
  38. package/dist/cjs/shared/modifyUrl.js +3 -5
  39. package/dist/cjs/shared/modifyUrlSameOrigin.js +42 -0
  40. package/dist/cjs/shared/page-configs/getConfigDefinedAt.js +3 -2
  41. package/dist/cjs/shared/page-configs/getConfigValueBuildTime.js +5 -5
  42. package/dist/cjs/shared/page-configs/serialize/serializeConfigValues.js +9 -9
  43. package/dist/cjs/shared/utils.js +2 -1
  44. package/dist/cjs/utils/PROJECT_VERSION.js +1 -1
  45. package/dist/cjs/utils/assert.js +10 -3
  46. package/dist/cjs/utils/assertSetup.js +12 -8
  47. package/dist/cjs/utils/assertSingleInstance.js +19 -4
  48. package/dist/cjs/utils/getRandomId.js +1 -1
  49. package/dist/cjs/utils/isNullish.js +16 -0
  50. package/dist/cjs/utils/normalizeHeaders.js +1 -1
  51. package/dist/cjs/utils/objectAssign.js +7 -2
  52. package/dist/cjs/utils/objectFilter.js +10 -0
  53. package/dist/cjs/utils/pick.js +12 -0
  54. package/dist/esm/client/client-routing-runtime/createPageContext.d.ts +3 -1
  55. package/dist/esm/client/client-routing-runtime/createPageContext.js +4 -3
  56. package/dist/esm/client/client-routing-runtime/navigate.d.ts +6 -5
  57. package/dist/esm/client/client-routing-runtime/navigate.js +6 -2
  58. package/dist/esm/client/client-routing-runtime/normalizeUrlArgument.js +1 -1
  59. package/dist/esm/client/client-routing-runtime/renderPageClientSide.js +1 -1
  60. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +6 -3
  61. package/dist/esm/client/server-routing-runtime/getPageContext.js +6 -3
  62. package/dist/esm/client/shared/getPageContextProxyForUser.d.ts +1 -11
  63. package/dist/esm/client/shared/getPageContextProxyForUser.js +4 -67
  64. package/dist/esm/client/shared/preparePageContextForUserConsumptionClientSide.d.ts +2 -2
  65. package/dist/esm/node/api/build.js +7 -7
  66. package/dist/esm/node/api/dev.js +2 -2
  67. package/dist/esm/node/api/prepareViteApiCall.d.ts +2 -1
  68. package/dist/esm/node/api/prepareViteApiCall.js +57 -32
  69. package/dist/esm/node/api/prerender.js +2 -3
  70. package/dist/esm/node/api/preview.d.ts +1 -1
  71. package/dist/esm/node/api/preview.js +24 -6
  72. package/dist/esm/node/api/utils.d.ts +1 -0
  73. package/dist/esm/node/api/utils.js +1 -0
  74. package/dist/esm/node/cli/entry.js +4 -2
  75. package/dist/esm/node/cli/parseCli.js +10 -4
  76. package/dist/esm/node/plugin/plugins/build/pluginAutoFullBuild.js +3 -3
  77. package/dist/esm/node/plugin/plugins/build/pluginModuleBanner.d.ts +3 -0
  78. package/dist/esm/node/plugin/plugins/build/pluginModuleBanner.js +49 -0
  79. package/dist/esm/node/plugin/plugins/build.js +3 -1
  80. package/dist/esm/node/plugin/plugins/commonConfig.d.ts +10 -2
  81. package/dist/esm/node/plugin/plugins/commonConfig.js +22 -8
  82. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +5 -5
  83. package/dist/esm/node/plugin/plugins/fileEnv.js +3 -0
  84. package/dist/esm/node/plugin/plugins/importUserCode/index.js +15 -11
  85. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js +5 -1
  86. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.d.ts +5 -2
  87. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +11 -12
  88. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.d.ts +11 -2
  89. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +101 -86
  90. package/dist/esm/node/plugin/plugins/setGlobalContext.js +11 -2
  91. package/dist/esm/node/plugin/shared/getEnvVarObject.js +7 -0
  92. package/dist/esm/node/prerender/resolvePrerenderConfig.js +3 -3
  93. package/dist/esm/node/prerender/runPrerender.d.ts +1 -1
  94. package/dist/esm/node/prerender/runPrerender.js +21 -28
  95. package/dist/esm/node/prerender/utils.d.ts +1 -1
  96. package/dist/esm/node/prerender/utils.js +1 -1
  97. package/dist/esm/node/runtime/globalContext.d.ts +2 -3
  98. package/dist/esm/node/runtime/globalContext.js +13 -8
  99. package/dist/esm/node/runtime/html/injectAssets/getViteDevScript.js +6 -3
  100. package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +2 -0
  101. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +69 -15
  102. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.d.ts +1 -1
  103. package/dist/esm/node/runtime/renderPage/createHttpResponse/assertNoInfiniteHttpRedirect.js +3 -2
  104. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.js +3 -0
  105. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +27 -1
  106. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.js +18 -12
  107. package/dist/esm/node/runtime/renderPage.js +14 -29
  108. package/dist/esm/node/runtime/utils.d.ts +1 -1
  109. package/dist/esm/node/runtime/utils.js +1 -1
  110. package/dist/esm/node/runtime-dev/createDevMiddleware.js +2 -2
  111. package/dist/esm/node/shared/assertV1Design.js +1 -1
  112. package/dist/esm/node/shared/utils.d.ts +1 -1
  113. package/dist/esm/node/shared/utils.js +1 -1
  114. package/dist/esm/node/shared/virtual-files.d.ts +2 -0
  115. package/dist/esm/node/shared/virtual-files.js +14 -10
  116. package/dist/esm/shared/NOT_SERIALIZABLE.d.ts +1 -0
  117. package/dist/esm/shared/NOT_SERIALIZABLE.js +2 -0
  118. package/dist/esm/shared/modifyUrl.d.ts +2 -2
  119. package/dist/esm/shared/modifyUrl.js +3 -5
  120. package/dist/esm/shared/modifyUrlSameOrigin.d.ts +9 -0
  121. package/dist/esm/shared/modifyUrlSameOrigin.js +40 -0
  122. package/dist/esm/shared/page-configs/Config.d.ts +11 -3
  123. package/dist/esm/shared/page-configs/PageConfig.d.ts +2 -2
  124. package/dist/esm/shared/page-configs/getConfigDefinedAt.d.ts +3 -1
  125. package/dist/esm/shared/page-configs/getConfigDefinedAt.js +3 -2
  126. package/dist/esm/shared/page-configs/getConfigValueBuildTime.js +5 -5
  127. package/dist/esm/shared/page-configs/serialize/serializeConfigValues.js +9 -9
  128. package/dist/esm/shared/route/abort.d.ts +2 -2
  129. package/dist/esm/shared/types.d.ts +39 -3
  130. package/dist/esm/shared/utils.d.ts +2 -1
  131. package/dist/esm/shared/utils.js +2 -1
  132. package/dist/esm/types/index.d.ts +0 -1
  133. package/dist/esm/utils/PROJECT_VERSION.d.ts +1 -1
  134. package/dist/esm/utils/PROJECT_VERSION.js +1 -1
  135. package/dist/esm/utils/assert.d.ts +2 -1
  136. package/dist/esm/utils/assert.js +10 -3
  137. package/dist/esm/utils/assertSetup.d.ts +2 -2
  138. package/dist/esm/utils/assertSetup.js +12 -8
  139. package/dist/esm/utils/assertSingleInstance.js +19 -4
  140. package/dist/esm/utils/getRandomId.d.ts +1 -1
  141. package/dist/esm/utils/getRandomId.js +1 -1
  142. package/dist/esm/utils/isNullish.d.ts +3 -0
  143. package/dist/esm/utils/isNullish.js +11 -0
  144. package/dist/esm/utils/normalizeHeaders.js +1 -1
  145. package/dist/esm/utils/objectAssign.d.ts +1 -1
  146. package/dist/esm/utils/objectAssign.js +7 -2
  147. package/dist/esm/utils/objectFilter.d.ts +1 -0
  148. package/dist/esm/utils/objectFilter.js +7 -0
  149. package/dist/esm/utils/pick.d.ts +1 -0
  150. package/dist/esm/utils/pick.js +9 -0
  151. package/package.json +4 -2
  152. package/dist/cjs/shared/notSerializable.js +0 -5
  153. package/dist/cjs/utils/isNotNullish.js +0 -5
  154. package/dist/esm/shared/notSerializable.d.ts +0 -1
  155. package/dist/esm/shared/notSerializable.js +0 -2
  156. package/dist/esm/utils/isNotNullish.d.ts +0 -1
  157. package/dist/esm/utils/isNotNullish.js +0 -1
@@ -64,6 +64,7 @@ function getGlobalContextSync() {
64
64
  }
65
65
  /** @experimental https://vike.dev/getGlobalContext */
66
66
  async function getGlobalContextAsync(isProduction) {
67
+ debug('getGlobalContextAsync()');
67
68
  assertUsage(typeof isProduction === 'boolean', `[getGlobalContextAsync(isProduction)] Argument ${pc.cyan('isProduction')} ${isProduction === undefined ? 'is missing' : `should be ${pc.cyan('true')} or ${pc.cyan('false')}`}`);
68
69
  setIsProduction(isProduction);
69
70
  if (!globalObject.globalContext)
@@ -89,10 +90,10 @@ function makePublic(globalContext) {
89
90
  async function setGlobalContext_viteDevServer(viteDevServer) {
90
91
  debug('setGlobalContext_viteDevServer()');
91
92
  setIsProduction(false);
92
- /* We cannot cache globalObject.viteDevServer because it's fully replaced when the user modifies vite.config.js => Vite's dev server is fully reloaded and a new viteDevServer replaces the previous one.
93
- if (globalObject.viteDevServer) return
94
- assertIsNotInitilizedYet()
95
- */
93
+ // We cannot cache globalObject.viteDevServer because it's fully replaced when the user modifies vite.config.js => Vite's dev server is fully reloaded and a new viteDevServer replaces the previous one.
94
+ if (!globalObject.viteDevServer) {
95
+ assertIsNotInitilizedYet();
96
+ }
96
97
  assert(globalObject.viteConfig);
97
98
  globalObject.viteDevServer = viteDevServer;
98
99
  await updateUserFiles();
@@ -308,10 +309,14 @@ async function loadBuildEntry(outDir) {
308
309
  globalObject.buildEntry = globalObject.buildEntryPrevious;
309
310
  }
310
311
  assert(globalObject.buildEntry);
311
- assertWarning(!globalObject.buildInfo?.viteConfigRuntime.vitePluginServerEntry.inject,
312
- // TODO/soon: show precise path
313
- // TODO/soon: make this warning work on test/vike-node/
314
- `Run the server production build (e.g. ${pc.cyan('$ node dist/server/index.mjs')}) instead of running the original server entry (e.g. ${pc.cyan('$ ts-node server/index.ts')})`, { onlyOnce: true });
312
+ assertWarning(
313
+ // vike-server => `vitePluginServerEntry.inject === true`
314
+ // vike-node => `vitePluginServerEntry.inject === [ 'index' ]`
315
+ globalObject.buildInfo?.viteConfigRuntime.vitePluginServerEntry.inject !== true,
316
+ /* TO-DO/eventually:
317
+ !!globalObject.buildInfo?.viteConfigRuntime.vitePluginServerEntry.inject,
318
+ */
319
+ `Run the built server entry (e.g. ${pc.cyan('$ node dist/server/index.mjs')}) instead of the original server entry (e.g. ${pc.cyan('$ ts-node server/index.ts')})`, { onlyOnce: true });
315
320
  }
316
321
  const { buildEntry } = globalObject;
317
322
  assertBuildEntry(buildEntry);
@@ -1,6 +1,7 @@
1
1
  export { getViteDevScript };
2
2
  import { assert, assertUsage, assertWarning } from '../../utils.js';
3
3
  import pc from '@brillout/picocolors';
4
+ const reachOutCTA = 'Create a new GitHub issue to discuss a solution.';
4
5
  async function getViteDevScript(pageContext) {
5
6
  const globalContext = pageContext._globalContext;
6
7
  if (globalContext.isProduction) {
@@ -12,11 +13,13 @@ async function getViteDevScript(pageContext) {
12
13
  let fakeHtml = fakeHtmlBegin + fakeHtmlEnd;
13
14
  fakeHtml = await viteDevServer.transformIndexHtml('/', fakeHtml);
14
15
  assertUsage(!fakeHtml.includes('vite-plugin-pwa'), `The HTML transformer of ${pc.cyan('vite-plugin-pwa')} cannot be applied, see workaround at https://github.com/vikejs/vike/issues/388#issuecomment-1199280084`);
15
- assertUsage(!fakeHtml.startsWith(fakeHtmlBegin.replace(' ', '')), 'Vite plugins that minify the HTML are not supported by vike, see https://github.com/vikejs/vike/issues/224');
16
- assertUsage(fakeHtml.startsWith(fakeHtmlBegin) && fakeHtml.endsWith(fakeHtmlEnd), 'You are using a Vite Plugin that transforms the HTML in a way that conflicts with vike. Create a new GitHub ticket to discuss a solution.');
16
+ assertUsage(!fakeHtml.startsWith(fakeHtmlBegin.replace(' ', '')), `Vite plugins that minify the HTML cannot be applied, see https://github.com/vikejs/vike/issues/224`);
17
+ assertUsage(fakeHtml.startsWith(fakeHtmlBegin) && fakeHtml.endsWith(fakeHtmlEnd), `You are using a Vite Plugin that transforms the HTML in a way that conflicts with Vike. ${reachOutCTA}`);
17
18
  const viteInjection = fakeHtml.slice(fakeHtmlBegin.length, -1 * fakeHtmlEnd.length);
18
19
  assert(viteInjection.includes('script'));
19
- assertWarning(!viteInjection.includes('import('), 'Unexpected Vite HMR code. Reach out to a Vike maintainer on GitHub.', { onlyOnce: true });
20
+ assertWarning(!viteInjection.includes('import('), `Unexpected Vite injected HMR code. ${reachOutCTA}`, {
21
+ onlyOnce: true
22
+ });
20
23
  const viteDevScript = viteInjection;
21
24
  return viteDevScript;
22
25
  }
@@ -1,6 +1,7 @@
1
1
  export { serializePageContextClientSide };
2
2
  export { serializePageContextAbort };
3
3
  export type { PageContextSerialization };
4
+ export { getPropKeys };
4
5
  import type { PageConfigRuntime } from '../../../shared/page-configs/PageConfig.js';
5
6
  import type { UrlRedirect } from '../../../shared/route/abort.js';
6
7
  type PageContextSerialization = {
@@ -20,3 +21,4 @@ declare function serializePageContextAbort(pageContext: Record<string, unknown>
20
21
  } | {
21
22
  abortStatusCode: number;
22
23
  })): string;
24
+ declare function getPropKeys(prop: string): string[];
@@ -1,11 +1,13 @@
1
1
  export { serializePageContextClientSide };
2
2
  export { serializePageContextAbort };
3
+ // For ./serializePageContextClientSide.spec.ts
4
+ export { getPropKeys };
3
5
  import { stringify, isJsonSerializerError } from '@brillout/json-serializer/stringify';
4
- import { assert, assertUsage, assertWarning, getPropAccessNotation, hasProp, unique } from '../utils.js';
6
+ import { assert, assertUsage, assertWarning, getPropAccessNotation, hasProp, isObject, unique } from '../utils.js';
5
7
  import { isErrorPage } from '../../../shared/error-page.js';
6
8
  import { addIs404ToPageProps } from '../../../shared/addIs404ToPageProps.js';
7
9
  import pc from '@brillout/picocolors';
8
- import { notSerializable } from '../../../shared/notSerializable.js';
10
+ import { NOT_SERIALIZABLE } from '../../../shared/NOT_SERIALIZABLE.js';
9
11
  import { pageContextInitIsPassedToClient } from '../../../shared/misc/pageContextInitIsPassedToClient.js';
10
12
  import { isServerSideError } from '../../../shared/misc/isServerSideError.js';
11
13
  const PASS_TO_CLIENT = [
@@ -25,12 +27,8 @@ const PASS_TO_CLIENT = [
25
27
  const PASS_TO_CLIENT_ERROR_PAGE = ['pageProps', 'is404', isServerSideError];
26
28
  function serializePageContextClientSide(pageContext) {
27
29
  const passToClient = getPassToClient(pageContext);
28
- const pageContextClient = {};
29
- passToClient.forEach((prop) => {
30
- // We set non-existing props to `undefined`, in order to pass the list of passToClient values to the client-side
31
- pageContextClient[prop] = pageContext[prop];
32
- });
33
- if (Object.keys(pageContext._pageContextInit).some((p) => passToClient.includes(p))) {
30
+ const pageContextClient = applyPassToClient(passToClient, pageContext);
31
+ if (passToClient.some((prop) => getPropVal(pageContext._pageContextInit, prop))) {
34
32
  pageContextClient[pageContextInitIsPassedToClient] = true;
35
33
  }
36
34
  let pageContextSerialized;
@@ -42,14 +40,15 @@ function serializePageContextClientSide(pageContext) {
42
40
  let hasWarned = false;
43
41
  const propsNonSerializable = [];
44
42
  passToClient.forEach((prop) => {
45
- const propName1 = getPropAccessNotation(prop);
46
- const propName2 = JSON.stringify(prop);
47
- const varName = `pageContext${propName1}`;
43
+ const res = getPropVal(pageContext, prop);
44
+ if (!res)
45
+ return;
46
+ const { value } = res;
47
+ const varName = `pageContext${getPropKeys(prop).map(getPropAccessNotation).join('')}`;
48
48
  try {
49
- serialize(pageContext[prop], varName);
49
+ serialize(value, varName);
50
50
  }
51
51
  catch (err) {
52
- hasWarned = true;
53
52
  propsNonSerializable.push(prop);
54
53
  // useConfig() wrong usage
55
54
  if (prop === '_configFromHook') {
@@ -62,7 +61,7 @@ function serializePageContextClientSide(pageContext) {
62
61
  // Non-serializable pageContext set by the user
63
62
  let msg = [
64
63
  `${h(varName)} can't be serialized and, therefore, can't be passed to the client side.`,
65
- `Make sure ${h(varName)} is serializable, or remove ${h(propName2)} from ${h('passToClient')}.`
64
+ `Make sure ${h(varName)} is serializable, or remove ${h(JSON.stringify(prop))} from ${h('passToClient')}.`
66
65
  ].join(' ');
67
66
  if (isJsonSerializerError(err)) {
68
67
  msg = `${msg} Serialization error: ${err.messageCore}.`;
@@ -75,11 +74,12 @@ function serializePageContextClientSide(pageContext) {
75
74
  }
76
75
  // We warn (instead of throwing an error) since Vike's client runtime throws an error (with `assertUsage()`) if the user's client code tries to access the property that cannot be serialized
77
76
  assertWarning(false, msg, { onlyOnce: false });
77
+ hasWarned = true;
78
78
  }
79
79
  });
80
80
  assert(hasWarned);
81
81
  propsNonSerializable.forEach((prop) => {
82
- pageContextClient[prop] = notSerializable;
82
+ pageContextClient[getPropKeys(prop)[0]] = NOT_SERIALIZABLE;
83
83
  });
84
84
  try {
85
85
  pageContextSerialized = serialize(pageContextClient);
@@ -138,3 +138,57 @@ function serializePageContextAbort(pageContext) {
138
138
  }
139
139
  return serialize(pageContext);
140
140
  }
141
+ function applyPassToClient(passToClient, pageContext) {
142
+ const pageContextClient = {};
143
+ passToClient.forEach((prop) => {
144
+ // Get value from pageContext
145
+ const res = getPropVal(pageContext, prop);
146
+ if (!res)
147
+ return;
148
+ const { value } = res;
149
+ // Set value to pageContextClient
150
+ setPropVal(pageContextClient, prop, value);
151
+ });
152
+ return pageContextClient;
153
+ }
154
+ // Get a nested property from an object using a dot-separated path such as 'user.id'
155
+ function getPropVal(obj, prop) {
156
+ const keys = getPropKeys(prop);
157
+ let value = obj;
158
+ for (const key of keys) {
159
+ if (isObject(value) && key in value) {
160
+ value = value[key];
161
+ }
162
+ else {
163
+ return null; // Property or intermediate property doesn't exist
164
+ }
165
+ }
166
+ return { value };
167
+ }
168
+ // Set a nested property in an object using a dot-separated path such as 'user.id'
169
+ function setPropVal(obj, prop, val) {
170
+ const keys = getPropKeys(prop);
171
+ let currentObj = obj;
172
+ // Creating intermediate objects if necessary
173
+ for (let i = 0; i <= keys.length - 2; i++) {
174
+ const key = keys[i];
175
+ if (!(key in currentObj)) {
176
+ // Create intermediate object
177
+ currentObj[key] = {};
178
+ }
179
+ if (!isObject(currentObj[key])) {
180
+ // Skip value upon data structure conflict
181
+ return;
182
+ }
183
+ currentObj = currentObj[key];
184
+ }
185
+ // Set the final key to the value
186
+ const finalKey = keys[keys.length - 1];
187
+ currentObj[finalKey] = val;
188
+ }
189
+ function getPropKeys(prop) {
190
+ // Like `prop.split('.')` but with added support for `\` escaping, see serializePageContextClientSide.spec.ts
191
+ return prop
192
+ .split(/(?<!\\)\./) // Split on unescaped dots
193
+ .map((key) => key.replace(/\\\./g, '.')); // Replace escaped dots with literal dots
194
+ }
@@ -1,4 +1,4 @@
1
1
  export { assertNoInfiniteHttpRedirect };
2
2
  declare function assertNoInfiniteHttpRedirect(urlRedirectTarget: string, pageContextInit: {
3
3
  urlOriginal: string;
4
- }): void;
4
+ }): "DISABLED" | undefined;
@@ -4,14 +4,15 @@ import pc from '@brillout/picocolors';
4
4
  const globalObject = getGlobalObject('createHttpResponse/assertNoInfiniteHttpRedirect.ts', {
5
5
  redirectGraph: {}
6
6
  });
7
- // It's too strict, see https://github.com/vikejs/vike/issues/1270#issuecomment-1820608999
8
- // - Let's create a new setting `+doNotCatchInfiniteRedirect` if someone complains.
9
7
  function assertNoInfiniteHttpRedirect(
10
8
  // The exact URL that the user will be redirected to.
11
9
  // - It includes the Base URL as well as the locale (i18n) base.
12
10
  urlRedirectTarget,
13
11
  // Rationale for checking against `pageContextInit.urlOriginal`: https://github.com/vikejs/vike/pull/2264#issuecomment-2713890263
14
12
  pageContextInit) {
13
+ // TO-DO/eventually: use cookie as described at https://github.com/vikejs/vike/pull/2273
14
+ if (true)
15
+ return 'DISABLED'; // Disabled until we make it reliable.
15
16
  if (!urlRedirectTarget.startsWith('/')) {
16
17
  // We assume that urlRedirectTarget points to an origin that is external (not the same origin), and we can therefore assume that the app doesn't define an infinite loop (at least not in itself).
17
18
  // - There isn't a reliable way to check whether the redirect points to an external origin or the same origin; we hope/assume the user sets the URL without origin.
@@ -7,5 +7,8 @@ function preparePageContextForUserConsumptionServerSide(pageContext) {
7
7
  assert(isPlainObject(pageContext.routeParams));
8
8
  assert('Page' in pageContext);
9
9
  assert(typeof pageContext.isClientSideNavigation === 'boolean');
10
+ assert(pageContext._isPageContextObject);
11
+ assert(pageContext.isClientSide === false);
12
+ assert(typeof pageContext.isPrerendering === 'boolean');
10
13
  preparePageContextForUserConsumption(pageContext);
11
14
  }
@@ -2,6 +2,7 @@ export { renderPageAlreadyRouted };
2
2
  export { prerenderPage };
3
3
  export { prerender404Page };
4
4
  export { getPageContextInitEnhanced };
5
+ export { createPageContext };
5
6
  export type { PageContextAfterRender };
6
7
  export type { PageContextInitEnhanced };
7
8
  import { type PageContextUrlInternal } from '../../../shared/getPageContextUrlComputed.js';
@@ -32,6 +33,10 @@ declare function prerenderPage(pageContext: PageContextInitEnhanced & PageFiles
32
33
  documentHtml: string;
33
34
  pageContextSerialized: null;
34
35
  pageContext: {
36
+ _isPageContextObject: boolean;
37
+ isClientSide: boolean;
38
+ isPrerendering: boolean;
39
+ } & Record<string, unknown> & {
35
40
  urlOriginal: string;
36
41
  headersOriginal?: unknown;
37
42
  headers?: unknown;
@@ -118,6 +123,10 @@ declare function prerenderPage(pageContext: PageContextInitEnhanced & PageFiles
118
123
  documentHtml: string;
119
124
  pageContextSerialized: string;
120
125
  pageContext: {
126
+ _isPageContextObject: boolean;
127
+ isClientSide: boolean;
128
+ isPrerendering: boolean;
129
+ } & Record<string, unknown> & {
121
130
  urlOriginal: string;
122
131
  headersOriginal?: unknown;
123
132
  headers?: unknown;
@@ -205,6 +214,10 @@ declare function prerender404Page(pageContextInit_: Record<string, unknown> | nu
205
214
  documentHtml: string;
206
215
  pageContextSerialized: null;
207
216
  pageContext: {
217
+ _isPageContextObject: boolean;
218
+ isClientSide: boolean;
219
+ isPrerendering: boolean;
220
+ } & Record<string, unknown> & {
208
221
  urlOriginal: string;
209
222
  headersOriginal?: unknown;
210
223
  headers?: unknown;
@@ -291,6 +304,10 @@ declare function prerender404Page(pageContextInit_: Record<string, unknown> | nu
291
304
  documentHtml: string;
292
305
  pageContextSerialized: string;
293
306
  pageContext: {
307
+ _isPageContextObject: boolean;
308
+ isClientSide: boolean;
309
+ isPrerendering: boolean;
310
+ } & Record<string, unknown> & {
294
311
  urlOriginal: string;
295
312
  headersOriginal?: unknown;
296
313
  headers?: unknown;
@@ -379,13 +396,17 @@ declare function getPageContextInitEnhanced(pageContextInit: {
379
396
  urlOriginal: string;
380
397
  headersOriginal?: unknown;
381
398
  headers?: unknown;
382
- }, globalContext: GlobalContextInternal, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } }?: {
399
+ }, globalContext: GlobalContextInternal, isPrerendering: boolean, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } }?: {
383
400
  ssr?: {
384
401
  urlRewrite: null | string;
385
402
  urlHandler: null | ((url: string) => string);
386
403
  isClientSideNavigation: boolean;
387
404
  };
388
405
  }): Promise<{
406
+ _isPageContextObject: boolean;
407
+ isClientSide: boolean;
408
+ isPrerendering: boolean;
409
+ } & Record<string, unknown> & {
389
410
  urlOriginal: string;
390
411
  headersOriginal?: unknown;
391
412
  headers?: unknown;
@@ -450,3 +471,8 @@ declare function getPageContextInitEnhanced(pageContextInit: {
450
471
  } & {
451
472
  headers: Record<string, string> | null;
452
473
  }>;
474
+ declare function createPageContext(pageContextInit: Record<string, unknown>, isPrerendering: boolean): {
475
+ _isPageContextObject: boolean;
476
+ isClientSide: boolean;
477
+ isPrerendering: boolean;
478
+ } & Record<string, unknown>;
@@ -2,6 +2,7 @@ export { renderPageAlreadyRouted };
2
2
  export { prerenderPage };
3
3
  export { prerender404Page };
4
4
  export { getPageContextInitEnhanced };
5
+ export { createPageContext };
5
6
  import { getErrorPageId } from '../../../shared/error-page.js';
6
7
  import { getHtmlString } from '../html/renderHtml.js';
7
8
  import { assert, assertUsage, assertWarning, hasProp, normalizeHeaders, objectAssign } from '../utils.js';
@@ -84,7 +85,11 @@ async function prerender404Page(pageContextInit_, globalContext) {
84
85
  if (!errorPageId) {
85
86
  return null;
86
87
  }
87
- const pageContext = {
88
+ // A URL is required for `viteDevServer.transformIndexHtml(url,html)`
89
+ const pageContextInit = { urlOriginal: '/fake-404-url' };
90
+ objectAssign(pageContextInit, pageContextInit_);
91
+ const pageContext = await getPageContextInitEnhanced(pageContextInit, globalContext, true);
92
+ objectAssign(pageContext, {
88
93
  pageId: errorPageId,
89
94
  _httpRequestId: null,
90
95
  _urlRewrite: null,
@@ -93,25 +98,17 @@ async function prerender404Page(pageContextInit_, globalContext) {
93
98
  // `prerender404Page()` is about generating `dist/client/404.html` for static hosts; there is no Client Routing.
94
99
  _usesClientRouter: false,
95
100
  _debugRouteMatches: []
96
- };
97
- const pageContextInit = {
98
- urlOriginal: '/fake-404-url' // A URL is needed for `applyViteHtmlTransform`
99
- };
100
- objectAssign(pageContextInit, pageContextInit_);
101
- {
102
- const pageContextInitEnhanced = await getPageContextInitEnhanced(pageContextInit, globalContext);
103
- objectAssign(pageContext, pageContextInitEnhanced);
104
- }
101
+ });
105
102
  objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
106
103
  return prerenderPage(pageContext);
107
104
  }
108
- async function getPageContextInitEnhanced(pageContextInit, globalContext, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
105
+ async function getPageContextInitEnhanced(pageContextInit, globalContext, isPrerendering, { ssr: { urlRewrite, urlHandler, isClientSideNavigation } = {
109
106
  urlRewrite: null,
110
107
  urlHandler: null,
111
108
  isClientSideNavigation: false
112
109
  } } = {}) {
113
110
  assert(pageContextInit.urlOriginal);
114
- const pageContextInitEnhanced = {};
111
+ const pageContextInitEnhanced = createPageContext(pageContextInit, isPrerendering);
115
112
  objectAssign(pageContextInitEnhanced, pageContextInit);
116
113
  objectAssign(pageContextInitEnhanced, {
117
114
  _objectCreatedByVike: true,
@@ -158,3 +155,12 @@ async function getPageContextInitEnhanced(pageContextInit, globalContext, { ssr:
158
155
  }
159
156
  return pageContextInitEnhanced;
160
157
  }
158
+ function createPageContext(pageContextInit, isPrerendering) {
159
+ const pageContext = {
160
+ _isPageContextObject: true,
161
+ isClientSide: false,
162
+ isPrerendering
163
+ };
164
+ objectAssign(pageContext, pageContextInit);
165
+ return pageContext;
166
+ }
@@ -1,6 +1,6 @@
1
1
  export { renderPage };
2
2
  export { renderPage_addAsyncHookwrapper };
3
- import { getPageContextInitEnhanced, renderPageAlreadyRouted } from './renderPage/renderPageAlreadyRouted.js';
3
+ import { getPageContextInitEnhanced, renderPageAlreadyRouted, createPageContext } from './renderPage/renderPageAlreadyRouted.js';
4
4
  import { route } from '../../shared/route/index.js';
5
5
  import { assert, hasProp, objectAssign, isUrl, parseUrl, onSetupRuntime, assertWarning, getGlobalObject, checkType, assertUsage, normalizeUrlPathname, removeBaseServer, modifyUrlPathname, prependBase, removeUrlOrigin, setUrlOrigin, isUri, getUrlPretty } from './utils.js';
6
6
  import { assertNoInfiniteAbortLoop, getPageContextFromAllRewrites, isAbortError, logAbortErrorHandled } from '../../shared/route/abort.js';
@@ -103,15 +103,9 @@ async function renderPageAlreadyPrepared(pageContextInit, globalContext, httpReq
103
103
  // https://stackoverflow.com/questions/9683007/detect-infinite-http-redirect-loop-on-server-side
104
104
  0);
105
105
  let pageContextNominalPageSuccess;
106
- let pageContextNominalPageInit = {};
107
- {
108
- const pageContextFromAllRewrites = getPageContextFromAllRewrites(pageContextsFromRewrite);
109
- objectAssign(pageContextNominalPageInit, pageContextFromAllRewrites);
110
- }
111
- {
112
- const pageContextInitEnhanced = await getPageContextInitEnhancedSSR(pageContextInit, globalContext, pageContextNominalPageInit._urlRewrite, httpRequestId);
113
- objectAssign(pageContextNominalPageInit, pageContextInitEnhanced);
114
- }
106
+ const pageContextFromAllRewrites = getPageContextFromAllRewrites(pageContextsFromRewrite);
107
+ const pageContextNominalPageInit = await getPageContextInitEnhancedSSR(pageContextInit, globalContext, pageContextFromAllRewrites._urlRewrite, httpRequestId);
108
+ objectAssign(pageContextNominalPageInit, pageContextFromAllRewrites);
115
109
  let errNominalPage;
116
110
  {
117
111
  try {
@@ -242,7 +236,7 @@ function prettyUrl(url) {
242
236
  return pc.bold(decodeURI(url));
243
237
  }
244
238
  function getPageContextHttpResponseError(err, pageContextInit, pageContext) {
245
- const pageContextWithError = createPageContext(pageContextInit);
239
+ const pageContextWithError = createPageContext(pageContextInit, false);
246
240
  const httpResponse = createHttpResponseError(pageContext);
247
241
  objectAssign(pageContextWithError, {
248
242
  httpResponse,
@@ -250,13 +244,6 @@ function getPageContextHttpResponseError(err, pageContextInit, pageContext) {
250
244
  });
251
245
  return pageContextWithError;
252
246
  }
253
- function createPageContext(pageContextInit) {
254
- const pageContext = {
255
- _isPageContextObject: true
256
- };
257
- Object.assign(pageContext, pageContextInit);
258
- return pageContext;
259
- }
260
247
  async function renderPageNominal(pageContext) {
261
248
  objectAssign(pageContext, { errorWhileRendering: null });
262
249
  // Route
@@ -281,10 +268,8 @@ async function renderPageNominal(pageContext) {
281
268
  return pageContextAfterRender;
282
269
  }
283
270
  async function getPageContextErrorPageInit(pageContextInit, globalContext, errNominalPage, pageContextNominalPagePartial, httpRequestId) {
284
- const pageContextInitEnhanced = await getPageContextInitEnhancedSSR(pageContextInit, globalContext, null, httpRequestId);
271
+ const pageContext = await getPageContextInitEnhancedSSR(pageContextInit, globalContext, null, httpRequestId);
285
272
  assert(errNominalPage);
286
- const pageContext = {};
287
- objectAssign(pageContext, pageContextInitEnhanced);
288
273
  objectAssign(pageContext, {
289
274
  is404: false,
290
275
  errorWhileRendering: errNominalPage,
@@ -298,7 +283,7 @@ async function getPageContextErrorPageInit(pageContextInit, globalContext, errNo
298
283
  }
299
284
  async function getPageContextInitEnhancedSSR(pageContextInit, globalContext, urlRewrite, httpRequestId) {
300
285
  const { isClientSideNavigation, _urlHandler } = handlePageContextUrl(pageContextInit.urlOriginal);
301
- const pageContextInitEnhanced = await getPageContextInitEnhanced(pageContextInit, globalContext, {
286
+ const pageContextInitEnhanced = await getPageContextInitEnhanced(pageContextInit, globalContext, false, {
302
287
  ssr: {
303
288
  urlRewrite,
304
289
  urlHandler: _urlHandler,
@@ -342,7 +327,7 @@ async function normalizeUrl(pageContextInit, globalContext, httpRequestId) {
342
327
  return null;
343
328
  logRuntimeInfo?.(`URL normalized from ${pc.cyan(urlOriginal)} to ${pc.cyan(urlNormalized)} (https://vike.dev/url-normalization)`, httpRequestId, 'info');
344
329
  const httpResponse = createHttpResponseRedirect({ url: urlNormalized, statusCode: 301 }, pageContextInit);
345
- const pageContextHttpResponse = createPageContext(pageContextInit);
330
+ const pageContextHttpResponse = createPageContext(pageContextInit, false);
346
331
  objectAssign(pageContextHttpResponse, { httpResponse });
347
332
  return pageContextHttpResponse;
348
333
  }
@@ -384,7 +369,7 @@ async function getPermanentRedirect(pageContextInit, globalContext, httpRequestI
384
369
  }
385
370
  logRuntimeInfo?.(`Permanent redirection defined by config.redirects (https://vike.dev/redirects)`, httpRequestId, 'info');
386
371
  const httpResponse = createHttpResponseRedirect({ url: urlTarget, statusCode: 301 }, pageContextInit);
387
- const pageContextHttpResponse = createPageContext(pageContextInit);
372
+ const pageContextHttpResponse = createPageContext(pageContextInit, false);
388
373
  objectAssign(pageContextHttpResponse, { httpResponse });
389
374
  return pageContextHttpResponse;
390
375
  }
@@ -405,10 +390,10 @@ pageContextNominalPageInit, httpRequestId, pageContextErrorPageInit, globalConte
405
390
  const abortCall = pageContextAbort._abortCall;
406
391
  assert(abortCall);
407
392
  assertUsage(errorPageId, `You called ${pc.cyan(abortCall)} but you didn't define an error page, make sure to define one https://vike.dev/error-page`);
408
- const pageContext = createPageContext({});
393
+ const pageContext = createPageContext({}, false);
409
394
  objectAssign(pageContext, { pageId: errorPageId });
410
395
  objectAssign(pageContext, pageContextAbort);
411
- objectAssign(pageContext, pageContextErrorPageInit);
396
+ objectAssign(pageContext, pageContextErrorPageInit, true);
412
397
  objectAssign(pageContext, await loadUserFilesServerSide(pageContext));
413
398
  // We include pageContextInit: we don't only serialize pageContextAbort because the error page may need to access pageContextInit
414
399
  pageContextSerialized = serializePageContextClientSide(pageContext);
@@ -429,7 +414,7 @@ pageContextNominalPageInit, httpRequestId, pageContextErrorPageInit, globalConte
429
414
  return { pageContextReturn };
430
415
  }
431
416
  if (pageContextAbort._urlRedirect) {
432
- const pageContextReturn = createPageContext(pageContextInit);
417
+ const pageContextReturn = createPageContext(pageContextInit, false);
433
418
  objectAssign(pageContextReturn, pageContextAbort);
434
419
  const httpResponse = createHttpResponseRedirect(pageContextAbort._urlRedirect, pageContextInit);
435
420
  objectAssign(pageContextReturn, { httpResponse });
@@ -444,7 +429,7 @@ async function checkBaseUrl(pageContextInit, globalContext) {
444
429
  const { isBaseMissing } = parseUrl(urlOriginal, baseServer);
445
430
  if (!isBaseMissing)
446
431
  return;
447
- const pageContext = createPageContext(pageContextInit);
432
+ const pageContext = createPageContext(pageContextInit, false);
448
433
  const httpResponse = createHttpResponseBaseIsMissing(urlOriginal, baseServer);
449
434
  objectAssign(pageContext, {
450
435
  httpResponse,
@@ -457,7 +442,7 @@ function renderInvalidRequest(pageContextInit) {
457
442
  const urlPathnameWithBase = parseUrl(pageContextInit.urlOriginal, '/').pathname;
458
443
  assertIsNotViteRequest(urlPathnameWithBase, pageContextInit.urlOriginal);
459
444
  if (urlPathnameWithBase.endsWith('/favicon.ico')) {
460
- const pageContext = createPageContext(pageContextInit);
445
+ const pageContext = createPageContext(pageContextInit, false);
461
446
  const httpResponse = createHttpResponseFavicon404();
462
447
  objectAssign(pageContext, { httpResponse });
463
448
  checkType(pageContext);
@@ -31,7 +31,7 @@ export * from '../../utils/urlToFile.js';
31
31
  export * from '../../utils/getGlobalObject.js';
32
32
  export * from '../../utils/freezePartial.js';
33
33
  export * from '../../utils/isNpmPackage.js';
34
- export * from '../../utils/isNotNullish.js';
34
+ export * from '../../utils/isNullish.js';
35
35
  export * from '../../utils/isScriptFile.js';
36
36
  export * from '../../utils/removeFileExtention.js';
37
37
  export * from '../../utils/objectKeys.js';
@@ -35,7 +35,7 @@ export * from '../../utils/urlToFile.js';
35
35
  export * from '../../utils/getGlobalObject.js';
36
36
  export * from '../../utils/freezePartial.js';
37
37
  export * from '../../utils/isNpmPackage.js';
38
- export * from '../../utils/isNotNullish.js';
38
+ export * from '../../utils/isNullish.js';
39
39
  export * from '../../utils/isScriptFile.js';
40
40
  export * from '../../utils/removeFileExtention.js';
41
41
  export * from '../../utils/objectKeys.js';
@@ -20,8 +20,8 @@ async function createDevMiddleware(options = {}) {
20
20
  }
21
21
  }
22
22
  };
23
- const { viteConfigEnhanced } = await prepareViteApiCall(optionsMod, 'dev');
24
- const server = await createServer(viteConfigEnhanced);
23
+ const { viteConfigFromUserEnhanced } = await prepareViteApiCall(optionsMod, 'dev');
24
+ const server = await createServer(viteConfigFromUserEnhanced);
25
25
  const devMiddleware = server.middlewares;
26
26
  return { devMiddleware, viteServer: server, viteConfig: server.config };
27
27
  }
@@ -10,7 +10,7 @@ function assertV1Design(pageConfigs, pageFilesAll) {
10
10
  assert(pageConfigs.length > 0);
11
11
  const filesV1 = unique(pageConfigs
12
12
  .map((p) => Object.values(p.configValueSources).map((sources) => sources
13
- .map((c) => c.definedAtFilePath)
13
+ .map((c) => c.definedAt)
14
14
  .map((definedAt) => (definedAt.definedBy ? null : definedAt.filePathAbsoluteUserRootDir))
15
15
  .filter(isNotNullish)
16
16
  .map((filePathToShowToUser) => indent + filePathToShowToUser)))
@@ -10,6 +10,6 @@ export * from '../../utils/parseUrl.js';
10
10
  export * from '../../utils/parseUrl-extras.js';
11
11
  export * from '../../utils/isObject.js';
12
12
  export * from '../../utils/assertIsNotBrowser.js';
13
- export * from '../../utils/isNotNullish.js';
13
+ export * from '../../utils/isNullish.js';
14
14
  export * from '../../utils/unique.js';
15
15
  export * from '../../utils/debug.js';
@@ -12,6 +12,6 @@ export * from '../../utils/parseUrl.js';
12
12
  export * from '../../utils/parseUrl-extras.js';
13
13
  export * from '../../utils/isObject.js';
14
14
  export * from '../../utils/assertIsNotBrowser.js';
15
- export * from '../../utils/isNotNullish.js';
15
+ export * from '../../utils/isNullish.js';
16
16
  export * from '../../utils/unique.js';
17
17
  export * from '../../utils/debug.js';
@@ -1,6 +1,8 @@
1
1
  export { isVirtualFileId };
2
2
  export { getVirtualFileId };
3
3
  export { resolveVirtualFileId };
4
+ export { removeVirtualIdTag };
4
5
  declare function isVirtualFileId(id: string): boolean;
5
6
  declare function getVirtualFileId(id: string): string;
6
7
  declare function resolveVirtualFileId(id: string): string;
8
+ declare function removeVirtualIdTag(id: string): string;
@@ -1,32 +1,36 @@
1
1
  export { isVirtualFileId };
2
2
  export { getVirtualFileId };
3
3
  export { resolveVirtualFileId };
4
+ export { removeVirtualIdTag };
4
5
  import pc from '@brillout/picocolors';
5
6
  import { assert, assertUsage } from './utils.js';
6
7
  const idBase = 'virtual:vike:';
7
8
  // https://vitejs.dev/guide/api-plugin.html#virtual-modules-convention
8
- const tag = '\0';
9
+ const virtualIdTag = '\0';
9
10
  function isVirtualFileId(id) {
10
11
  if (id.startsWith(idBase))
11
12
  return true;
12
- if (id.startsWith(tag + idBase))
13
+ if (id.startsWith(virtualIdTag + idBase))
13
14
  return true;
14
15
  // https://github.com/vikejs/vike/issues/1985
15
16
  assertUsage(!id.includes(idBase), `Encountered a module ID ${pc.cyan(id)} that is unexpected. Are you using a tool that modifies the ID of modules? For example, the baseUrl setting in tsconfig.json cannot be used.`);
16
17
  return false;
17
18
  }
18
19
  function getVirtualFileId(id) {
19
- if (id.startsWith(tag)) {
20
- id = id.slice(tag.length);
21
- }
22
- assert(!id.startsWith(tag));
23
- return id;
20
+ return removeVirtualIdTag(id);
24
21
  }
25
22
  function resolveVirtualFileId(id) {
26
23
  assert(isVirtualFileId(id));
27
- if (!id.startsWith(tag)) {
28
- id = tag + id;
24
+ if (!id.startsWith(virtualIdTag)) {
25
+ id = virtualIdTag + id;
26
+ }
27
+ assert(id.startsWith(virtualIdTag));
28
+ return id;
29
+ }
30
+ function removeVirtualIdTag(id) {
31
+ if (id.startsWith(virtualIdTag)) {
32
+ id = id.slice(virtualIdTag.length);
29
33
  }
30
- assert(id.startsWith(tag));
34
+ assert(!id.startsWith(virtualIdTag));
31
35
  return id;
32
36
  }
@@ -0,0 +1 @@
1
+ export declare const NOT_SERIALIZABLE = "__VIKE__NOT_SERIALIZABLE__";
@@ -0,0 +1,2 @@
1
+ // TODO: move to ../node/runtime/html/NOT_SERIALIZABLE.ts once code is distributed as ESM
2
+ export const NOT_SERIALIZABLE = '__VIKE__NOT_SERIALIZABLE__';