vike 0.4.242 → 0.4.243-commit-a70ea31

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.
@@ -1,5 +1,5 @@
1
1
  export { initOnLinkClick };
2
- import { isSameAsCurrentUrl, skipLink } from './skipLink.js';
2
+ import { isLinkIgnored, isSameAsCurrentUrl, skipLink } from './skipLink.js';
3
3
  import { renderPageClientSide } from './renderPageClientSide.js';
4
4
  import { scrollToHashOrTop } from './setScrollPosition.js';
5
5
  function initOnLinkClick() {
@@ -14,6 +14,8 @@ async function onLinkClick(ev) {
14
14
  const href = linkTag.getAttribute('href');
15
15
  if (href === null)
16
16
  return;
17
+ if (isLinkIgnored(linkTag))
18
+ return;
17
19
  // Workaround for Firefox bug: clicking on a hash link that doesn't change the current URL causes Firefox to erroneously set `window.history.state = null` without firing any signal that we can detect.
18
20
  // - https://github.com/vikejs/vike/issues/1962
19
21
  // - https://github.com/sveltejs/kit/issues/8725
@@ -1,4 +1,6 @@
1
1
  export { skipLink };
2
+ export { isLinkIgnored };
2
3
  export { isSameAsCurrentUrl };
3
4
  declare function skipLink(linkTag: HTMLElement): boolean;
5
+ declare function isLinkIgnored(linkTag: HTMLElement): boolean;
4
6
  declare function isSameAsCurrentUrl(href: string): boolean;
@@ -1,4 +1,6 @@
1
+ // TODO: rename_full skipLink isLinkSkipped
1
2
  export { skipLink };
3
+ export { isLinkIgnored };
2
4
  export { isSameAsCurrentUrl };
3
5
  import { normalizeClientSideUrl } from '../shared/normalizeClientSideUrl.js';
4
6
  import { getBaseServer } from './getBaseServer.js';
@@ -11,6 +13,7 @@ function skipLink(linkTag) {
11
13
  isUrlExternal(href) ||
12
14
  isSamePageHashLink(href) ||
13
15
  isNewTabLink(linkTag) ||
16
+ isLinkIgnored(linkTag) ||
14
17
  !hasBaseServer(href) ||
15
18
  // Purposely last because disableAutomaticLinkInterception will be removed in the next major release
16
19
  !isVikeLink(linkTag));
@@ -22,18 +25,25 @@ function isVikeLink(linkTag) {
22
25
  return true;
23
26
  }
24
27
  else {
28
+ // TODO: rename target attrVal
25
29
  const target = linkTag.getAttribute('data-vike-link');
26
30
  return target !== null && target !== 'false';
27
31
  }
28
32
  }
33
+ // TODO rename
29
34
  function isNewTabLink(linkTag) {
30
35
  const target = linkTag.getAttribute('target');
31
36
  const rel = linkTag.getAttribute('rel');
32
37
  return target === '_blank' || target === '_external' || rel === 'external' || linkTag.hasAttribute('download');
33
38
  }
39
+ function isLinkIgnored(linkTag) {
40
+ return linkTag.getAttribute('data-vike') === 'false';
41
+ }
42
+ // TODO refactor both functions below?
34
43
  function isSamePageHashLink(href) {
35
44
  if (href.startsWith('#'))
36
45
  return true;
46
+ // TODO: remove?
37
47
  if (href.includes('#') &&
38
48
  normalizeClientSideUrl(href, { withoutHash: true }) ===
39
49
  normalizeClientSideUrl(window.location.href, { withoutHash: true })) {
@@ -3,9 +3,10 @@ import { prepareViteApiCall } from './prepareViteApiCall.js';
3
3
  import { preview as previewVite } from 'vite';
4
4
  import { importServerProductionIndex } from '@brillout/vite-plugin-server-entry/runtime';
5
5
  import { getOutDirs } from '../vite/shared/getOutDirs.js';
6
- import { assertWarning, onSetupPreview } from './utils.js';
6
+ import { assertUsage, assertWarning, onSetupPreview } from './utils.js';
7
7
  import pc from '@brillout/picocolors';
8
8
  import path from 'node:path';
9
+ import { getVikeConfigInternal } from '../vite/shared/resolveVikeConfigInternal.js';
9
10
  /**
10
11
  * Programmatically trigger `$ vike preview`
11
12
  *
@@ -14,7 +15,12 @@ import path from 'node:path';
14
15
  async function preview(options = {}) {
15
16
  onSetupPreview();
16
17
  const { viteConfigFromUserResolved, viteConfigResolved } = await prepareViteApiCall(options, 'preview');
17
- if (viteConfigResolved.vitePluginServerEntry?.inject) {
18
+ const vikeConfig = await getVikeConfigInternal();
19
+ const cliPreview = vikeConfig.config.cli?.preview;
20
+ assertUsage(cliPreview !== false, `${pc.cyan('$ vike preview')} isn't supported`);
21
+ const useVite = cliPreview === 'vite' || (cliPreview === undefined && !viteConfigResolved.vitePluginServerEntry?.inject);
22
+ if (!useVite) {
23
+ // Dynamically import() server production entry dist/server/index.js
18
24
  const outDir = getOutDirs(viteConfigResolved, undefined).outDirRoot;
19
25
  const { outServerIndex } = await importServerProductionIndex({ outDir });
20
26
  const outServerIndexRelative = path.relative(viteConfigResolved.root, outServerIndex);
@@ -24,6 +30,7 @@ async function preview(options = {}) {
24
30
  };
25
31
  }
26
32
  else {
33
+ // Use Vite's preview server
27
34
  const server = await previewVite(viteConfigFromUserResolved);
28
35
  return {
29
36
  viteServer: server,
@@ -3,14 +3,12 @@ export { handleAssetsManifest_getBuildConfig };
3
3
  export { handleAssetsManifest_isFixEnabled };
4
4
  export { handleAssetsManifest_assertUsageCssCodeSplit };
5
5
  export { handleAssetsManifest_assertUsageCssTarget };
6
- export { handleAssetsManifest_workaroundCssTarget_part1 };
7
- export { handleAssetsManifest_workaroundCssTarget_part2 };
6
+ export { handleAssetsManifest_alignCssTarget };
8
7
  import type { Environment, ResolvedConfig, Rollup } from 'vite';
9
8
  type Bundle = Rollup.OutputBundle;
10
9
  declare function handleAssetsManifest_isFixEnabled(): boolean;
11
10
  declare function handleAssetsManifest_assertUsageCssCodeSplit(config: ResolvedConfig): void;
12
- declare function handleAssetsManifest_workaroundCssTarget_part1(config: ResolvedConfig): void;
13
- declare function handleAssetsManifest_workaroundCssTarget_part2(): void;
11
+ declare function handleAssetsManifest_alignCssTarget(config: ResolvedConfig): void;
14
12
  declare function handleAssetsManifest_assertUsageCssTarget(config: ResolvedConfig, env: Environment): void;
15
13
  declare function handleAssetsManifest_getBuildConfig(): Promise<{
16
14
  readonly ssrEmitAssets: true | undefined;
@@ -3,8 +3,7 @@ export { handleAssetsManifest_getBuildConfig };
3
3
  export { handleAssetsManifest_isFixEnabled };
4
4
  export { handleAssetsManifest_assertUsageCssCodeSplit };
5
5
  export { handleAssetsManifest_assertUsageCssTarget };
6
- export { handleAssetsManifest_workaroundCssTarget_part1 };
7
- export { handleAssetsManifest_workaroundCssTarget_part2 };
6
+ export { handleAssetsManifest_alignCssTarget };
8
7
  import fs from 'node:fs/promises';
9
8
  import fs_sync from 'node:fs';
10
9
  import path from 'node:path';
@@ -20,7 +19,6 @@ import { set_macro_ASSETS_MANIFEST } from './pluginProdBuildEntry.js';
20
19
  import { getManifestFilePathRelative } from '../../shared/getManifestFilePathRelative.js';
21
20
  const globalObject = getGlobalObject('handleAssetsManifest.ts', {
22
21
  assetsJsonFilePath: undefined,
23
- cssTarget: '__VIKE__UNSET',
24
22
  targetsAll: [],
25
23
  configsAll: [],
26
24
  });
@@ -221,15 +219,13 @@ function handleAssetsManifest_assertUsageCssCodeSplit(config) {
221
219
  return;
222
220
  assertWarning(config.build.cssCodeSplit, `${pc.cyan('build.cssCodeSplit')} shouldn't be set to ${pc.cyan('false')} (https://github.com/vikejs/vike/issues/1993)`, { onlyOnce: true });
223
221
  }
224
- function handleAssetsManifest_workaroundCssTarget_part1(config) {
222
+ function handleAssetsManifest_alignCssTarget(config) {
225
223
  globalObject.configsAll.push(config);
226
- if (!isViteServerSide_viteEnvOptional(config, undefined)) {
227
- globalObject.cssTarget = config.build.cssTarget;
228
- }
229
- }
230
- function handleAssetsManifest_workaroundCssTarget_part2() {
231
- assert(globalObject.cssTarget !== '__VIKE__UNSET');
232
- globalObject.configsAll.forEach((c) => (c.build.cssTarget = globalObject.cssTarget));
224
+ const { cssTarget } = globalObject.configsAll
225
+ .filter((c) => !isViteServerSide_viteEnvOptional(c, undefined))
226
+ .at(-1).build;
227
+ assert(cssTarget);
228
+ globalObject.configsAll.forEach((c) => (c.build.cssTarget = cssTarget));
233
229
  }
234
230
  function handleAssetsManifest_assertUsageCssTarget(config, env) {
235
231
  if (!handleAssetsManifest_isFixEnabled())
@@ -113,9 +113,6 @@ function pluginBuildApp() {
113
113
  handler() {
114
114
  onSetupBuild();
115
115
  handleAssetsManifest_assertUsageCssTarget(config, this.environment);
116
- /* Let vike:build:pluginBuildApp force exit
117
- runPrerender_forceExit()
118
- */
119
116
  },
120
117
  },
121
118
  },
@@ -10,31 +10,18 @@ import { prependEntriesDir } from '../../../shared/prependEntriesDir.js';
10
10
  import { getFilePathResolved } from '../../shared/getFilePath.js';
11
11
  import { getConfigValueBuildTime } from '../../../../shared/page-configs/getConfigValueBuildTime.js';
12
12
  import { isViteServerSide_viteEnvOptional } from '../../shared/isViteServerSide.js';
13
- import { handleAssetsManifest_assertUsageCssCodeSplit, handleAssetsManifest_getBuildConfig, handleAssetsManifest_workaroundCssTarget_part1, handleAssetsManifest_workaroundCssTarget_part2, } from './handleAssetsManifest.js';
13
+ import { handleAssetsManifest_assertUsageCssCodeSplit, handleAssetsManifest_getBuildConfig, handleAssetsManifest_alignCssTarget, } from './handleAssetsManifest.js';
14
14
  import { resolveIncludeAssetsImportedByServer } from '../../../runtime/renderPage/getPageAssets/retrievePageAssetsProd.js';
15
15
  function pluginBuildConfig() {
16
- let config;
17
16
  return [
18
- {
19
- name: 'vike:build:pluginBuildConfig:post1',
20
- apply: 'build',
21
- enforce: 'post',
22
- configResolved: {
23
- order: 'post',
24
- handler(config_) {
25
- config = config_;
26
- handleAssetsManifest_workaroundCssTarget_part1(config);
27
- },
28
- },
29
- },
30
17
  {
31
18
  name: 'vike:build:pluginBuildConfig:post2',
32
19
  apply: 'build',
33
20
  enforce: 'post',
34
21
  configResolved: {
35
22
  order: 'post',
36
- async handler() {
37
- handleAssetsManifest_workaroundCssTarget_part2();
23
+ async handler(config) {
24
+ handleAssetsManifest_alignCssTarget(config);
38
25
  onSetupBuild();
39
26
  assertRollupInput(config);
40
27
  const entries = await getEntries(config);
@@ -196,6 +196,10 @@ const configDefinitionsBuiltIn = {
196
196
  env: { client: true },
197
197
  },
198
198
  middleware: { env: { server: true }, cumulative: true, eager: true, global: true },
199
+ cli: {
200
+ env: { config: true },
201
+ global: true,
202
+ },
199
203
  onPrerenderStart: {
200
204
  env: { server: true, production: true },
201
205
  eager: true,
@@ -740,10 +740,15 @@ function getConfigDefinitions(plusFilesRelevant, filter) {
740
740
  });
741
741
  objectEntries(meta).forEach(([configName, configDefinitionUserLand]) => {
742
742
  if ('isDefinedByPeerDependency' in configDefinitionUserLand) {
743
- configDefinitionUserLand = {
744
- env: { client: false, server: false, config: false },
745
- ...configDefinitionUserLand,
746
- };
743
+ /* vike-server@1.0.24 wrongfully sets `stream: { env: { config: true }, isDefinedByPeerDependency: true }`
744
+ assert(deepEqual(Object.keys(configDefinitionUserLand), ['isDefinedByPeerDependency']))
745
+ //*/
746
+ if (!configDefinitions[configName]) {
747
+ configDefinitions[configName] = {
748
+ env: { client: false, server: false, config: false },
749
+ };
750
+ }
751
+ return;
747
752
  }
748
753
  // User can override an existing config definition
749
754
  configDefinitions[configName] = {
@@ -18,7 +18,7 @@ function getTrapGet(obj, objName, skipOnInternalProp, fallback) {
18
18
  const propStr = String(prop);
19
19
  if (prop === '_isProxyObject')
20
20
  return true;
21
- if (!skipOnInternalProp)
21
+ if (!skipOnInternalProp && !globalThis.__VIKE__IS_CLIENT)
22
22
  onInternalProp(propStr, objName);
23
23
  if (fallback && !(prop in obj)) {
24
24
  // Rudimentary flat pageContext implementation https://github.com/vikejs/vike/issues/1268
@@ -38,13 +38,8 @@ function onNotSerializable(propStr, val, objName) {
38
38
  assertUsage(false, `Can't access ${objName}${propName} on the client side. Because it can't be serialized, see server logs.`);
39
39
  }
40
40
  function onInternalProp(propStr, objName) {
41
- // - We must skip it in the client-side because of the reactivity mechanism of UI frameworks like Solid.
42
- // - TO-DO/eventually: use import.meta.CLIENT instead of isBrowser()
43
- // - Where import.meta.CLIENT is defined by Vike
44
- // - Using import.meta.env.CLIENT (note `.env.`) doesn't seem possible: https://github.com/brillout/playground_node_import.meta.env
45
- // - If Rolldown Vite + Rolldowns always transpiles node_modules/ then we can simply use import.meta.env.SSR
46
- if (isBrowser())
47
- return;
41
+ // We must skip it on the client-side because of the reactivity mechanism of UI frameworks like Solid.
42
+ assert(!isBrowser());
48
43
  // TO-DO/soon/proxy: remove this and only warn on built-in access instead
49
44
  if (propStr === '_configFromHook')
50
45
  return;
@@ -1,12 +1,12 @@
1
1
  export { modifyUrlSameOrigin };
2
2
  // We don't move modifyUrlSameOrigin() to the modifyUrl.ts file because we plan to use modifyUrlSameOrigin() on the client-side:
3
3
  // https://github.com/vikejs/vike/blob/c5a2de5e85262771f97851767c00ac35da69c64b/packages/vike/client/runtime-client-routing/navigate.ts#L4
4
- import { createUrlFromComponents, isNotNullish_keyVal, parseUrl, objectFilter, assertUsageUrlPathnameAbsolute, } from './utils.js';
4
+ import { createUrlFromComponents, isNotNullish_keyVal, parseUrl, objectFilter, assertUsageUrlPathAbsolute, } from './utils.js';
5
5
  function modifyUrlSameOrigin(url, modify) {
6
6
  const urlParsed = parseUrl(url, '/');
7
7
  // Pathname
8
8
  const pathname = modify.pathname ?? urlParsed.pathnameOriginal;
9
- assertUsageUrlPathnameAbsolute(pathname, 'modify.pathname');
9
+ assertUsageUrlPathAbsolute(pathname, 'modify.pathname');
10
10
  // Search
11
11
  let search = modify.search === null ? '' : !modify.search ? urlParsed.searchOriginal : resolveSearch(urlParsed, modify.search);
12
12
  if (search === '?')
@@ -8,7 +8,7 @@ export { getPageContextFromAllRewrites };
8
8
  export { AbortRender };
9
9
  export { assertNoInfiniteAbortLoop };
10
10
  import { isUserHookError } from '../hooks/execHook.js';
11
- import { assert, assertInfo, assertUsage, assertUsageUrlPathnameAbsolute, assertUsageUrlRedirectTarget, assertWarning, checkType, hasProp, isBrowser, joinEnglish, objectAssign, truncateString, } from './utils.js';
11
+ import { assert, assertInfo, assertUsage, assertUsageUrlPathAbsolute, assertUsageUrlRedirectTarget, assertWarning, checkType, hasProp, isBrowser, joinEnglish, objectAssign, truncateString, } from './utils.js';
12
12
  import pc from '@brillout/picocolors';
13
13
  /**
14
14
  * Abort the rendering of the current page, and redirect the user to another URL instead.
@@ -66,7 +66,7 @@ function render_(urlOrStatusCode, abortReason, abortCall, abortCaller, pageConte
66
66
  }
67
67
  if (typeof urlOrStatusCode === 'string') {
68
68
  const url = urlOrStatusCode;
69
- assertUsageUrlPathnameAbsolute(url, getErrPrefix(abortCaller));
69
+ assertUsageUrlPathAbsolute(url, getErrPrefix(abortCaller));
70
70
  objectAssign(pageContextAbort, {
71
71
  _urlRewrite: url,
72
72
  });
@@ -1,6 +1,6 @@
1
1
  export { execHookOnBeforeRoute };
2
2
  import { assertPageContextProvidedByUser } from '../assertPageContextProvidedByUser.js';
3
- import { assertUsage, hasProp, isObjectWithKeys, objectAssign, assertWarning, assertUsageUrlPathnameAbsolute, joinEnglish, assert, } from './utils.js';
3
+ import { assertUsage, hasProp, isObjectWithKeys, objectAssign, assertWarning, assertUsageUrlAbsolute, joinEnglish, assert, } from './utils.js';
4
4
  import { assertRouteParams, assertSyncRouting } from './resolveRouteFunction.js';
5
5
  import pc from '@brillout/picocolors';
6
6
  import { execHookDirectSync } from '../hooks/execHook.js';
@@ -65,8 +65,8 @@ async function getPageContextFromHook(onBeforeRouteHook, pageContext) {
65
65
  delete hookReturn.pageContext.urlOriginal;
66
66
  }
67
67
  if (hasProp(hookReturn.pageContext, 'urlLogical')) {
68
- assertUsageUrlPathnameAbsolute(
69
- // We skip validation and type-cast instead of assertUsage() in order to save client-side KBs
68
+ assertUsageUrlAbsolute(
69
+ // We type-cast instead of assertUsage() validation in order to save client-side KBs
70
70
  hookReturn.pageContext.urlLogical, `${errPrefix} returned ${pc.cyan('{ pageContext: { urlLogical } }')} and ${pc.cyan('urlLogical')}`);
71
71
  }
72
72
  assertPageContextProvidedByUser(hookReturn.pageContext, {
@@ -512,6 +512,10 @@ type ConfigBuiltIn = {
512
512
  keepScrollPosition?: KeepScrollPosition;
513
513
  /** @experimental */
514
514
  middleware?: Function;
515
+ /** @experimental */
516
+ cli?: {
517
+ preview?: boolean | 'vite';
518
+ };
515
519
  };
516
520
  type ConfigBuiltInResolved = {
517
521
  passToClient?: string[][];
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.242";
1
+ export declare const PROJECT_VERSION: "0.4.243-commit-a70ea31";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.242';
2
+ export const PROJECT_VERSION = '0.4.243-commit-a70ea31';
@@ -1,5 +1,6 @@
1
1
  export { parseUrl };
2
- export { assertUsageUrlPathnameAbsolute };
2
+ export { assertUsageUrlAbsolute };
3
+ export { assertUsageUrlPathAbsolute };
3
4
  export { assertUsageUrlRedirectTarget };
4
5
  export { isUrl };
5
6
  export { isUri };
@@ -52,5 +53,6 @@ declare function isUrlRedirectTarget(url: string): boolean;
52
53
  declare function isUrlRelative(url: string): boolean;
53
54
  declare function isUrlExternal(url: string): boolean;
54
55
  declare function isUri(uri: string): boolean;
55
- declare function assertUsageUrlPathnameAbsolute(url: string, errPrefix: string): void;
56
+ declare function assertUsageUrlAbsolute(url: string, errPrefix: string): void;
57
+ declare function assertUsageUrlPathAbsolute(url: string, errPrefix: string): void;
56
58
  declare function assertUsageUrlRedirectTarget(url: string, errPrefix: string, isUnresolved?: true): void;
@@ -3,7 +3,8 @@
3
3
  // - It doesn't support the tauri:// protocol
4
4
  // Unit tests at ./parseUrl.spec.ts
5
5
  export { parseUrl };
6
- export { assertUsageUrlPathnameAbsolute };
6
+ export { assertUsageUrlAbsolute };
7
+ export { assertUsageUrlPathAbsolute };
7
8
  export { assertUsageUrlRedirectTarget };
8
9
  export { isUrl };
9
10
  export { isUri };
@@ -53,6 +54,10 @@ function parseUrl(url, baseServer) {
53
54
  const { hostname, port } = parseHost(host, url);
54
55
  // decode after setting href
55
56
  pathname = decodePathname(pathname);
57
+ /* Should it be `pathname` or `pathnameOriginal`? https://github.com/vikejs/vike/pull/2770
58
+ // pageContext.urlParsed.path
59
+ const path = pathname + (searchOriginal || '') + (hashOriginal || '')
60
+ */
56
61
  assert(pathname.startsWith('/'));
57
62
  return {
58
63
  href,
@@ -135,7 +140,7 @@ function getBaseURI() {
135
140
  return baseURI;
136
141
  }
137
142
  function parseOrigin(url) {
138
- if (!isUrlWithProtocol(url)) {
143
+ if (!isUrlWithWebProtocol(url)) {
139
144
  return { pathname: url, origin: null, protocol: null };
140
145
  }
141
146
  else {
@@ -181,7 +186,7 @@ function parseProtocol(uri) {
181
186
  }
182
187
  return { protocol, uriWithoutProtocol };
183
188
  }
184
- function isUrlProtocol(protocol) {
189
+ function isWebUrlProtocol(protocol) {
185
190
  // Is there an alternative to having a blocklist?
186
191
  // - If the blocklist becomes too big, maybe use a allowlist instead ['tauri://', 'file://', 'capacitor://', 'http://', 'https://']
187
192
  const blocklist = [
@@ -264,10 +269,16 @@ function createUrlFromComponents(origin, pathname, search, hash) {
264
269
  }
265
270
  function isUrl(url) {
266
271
  // parseUrl() works with these URLs
267
- return isUrlWithProtocol(url) || url.startsWith('/') || isUrlRelative(url);
272
+ return isUrlAbsolute(url) || isUrlRelative(url);
268
273
  }
269
274
  function isUrlRedirectTarget(url) {
270
- return url.startsWith('/') || isUri(url) || isUrlWithProtocol(url);
275
+ return isUrlAbsolute(url) || isUri(url);
276
+ }
277
+ function isUrlAbsolute(url) {
278
+ return isUrlPathAbsolute(url) || isUrlWithWebProtocol(url);
279
+ }
280
+ function isUrlPathAbsolute(url) {
281
+ return url.startsWith('/');
271
282
  }
272
283
  function isUrlRelative(url) {
273
284
  return ['.', '?', '#'].some((c) => url.startsWith(c)) || url === '';
@@ -288,9 +299,9 @@ URL with protocol.
288
299
  [Electron (`file://`)](https://github.com/vikejs/vike/issues/1557)
289
300
  [Capacitor](https://github.com/vikejs/vike/issues/1706)
290
301
  */
291
- function isUrlWithProtocol(url) {
302
+ function isUrlWithWebProtocol(url) {
292
303
  const { protocol } = parseProtocol(url);
293
- return !!protocol && isUrlProtocol(protocol);
304
+ return !!protocol && isWebUrlProtocol(protocol);
294
305
  }
295
306
  /*
296
307
  URIs that aren't URLs.
@@ -308,27 +319,23 @@ We need to treat URIs differently than URLs.
308
319
  */
309
320
  function isUri(uri) {
310
321
  const { protocol } = parseProtocol(uri);
311
- return !!protocol && !isUrlProtocol(uri);
322
+ return !!protocol && !isWebUrlProtocol(protocol);
323
+ }
324
+ function assertUsageUrlAbsolute(url, errPrefix) {
325
+ assertUsage(isUrlAbsolute(url), getErrMsg(url, errPrefix, true));
312
326
  }
313
- function assertUsageUrlPathnameAbsolute(url, errPrefix) {
314
- assertUsageUrl(url, errPrefix);
327
+ function assertUsageUrlPathAbsolute(url, errPrefix) {
328
+ assertUsage(isUrlPathAbsolute(url), getErrMsg(url, errPrefix));
315
329
  }
316
330
  function assertUsageUrlRedirectTarget(url, errPrefix, isUnresolved) {
317
- assertUsageUrl(url, errPrefix, { isRedirectTarget: isUnresolved ? 'unresolved' : true });
331
+ const errMsg = getErrMsg(url, errPrefix, true, isUnresolved);
332
+ assertUsage(isUrlRedirectTarget(url) || (isUnresolved && url === '*'), errMsg);
318
333
  }
319
- function assertUsageUrl(url, errPrefix, { isRedirectTarget } = {}) {
320
- if (url.startsWith('/'))
321
- return;
334
+ function getErrMsg(url, errPrefix, allowProtocol, allowUri) {
322
335
  let errMsg = `${errPrefix} is ${pc.string(url)} but it should start with ${pc.string('/')}`;
323
- if (isRedirectTarget) {
324
- if (isUrlRedirectTarget(url))
325
- return;
326
- errMsg += ` or a protocol (${pc.string('http://')}, ${pc.string('mailto:')}, ...)`;
327
- if (isRedirectTarget === 'unresolved') {
328
- if (url === '*')
329
- return;
330
- errMsg += `, or be ${pc.string('*')}`;
331
- }
332
- }
333
- assertUsage(false, errMsg);
336
+ if (allowProtocol)
337
+ errMsg += ` or a protocol (e.g. ${pc.string('http://')})`;
338
+ if (allowUri)
339
+ errMsg += `, or be ${pc.string('*')}`;
340
+ return errMsg;
334
341
  }
@@ -1,2 +1 @@
1
- export { unique };
2
- declare function unique<T>(arr: T[]): T[];
1
+ export declare function unique<T>(arr: T[]): T[];
@@ -1,4 +1,3 @@
1
- export { unique };
2
- function unique(arr) {
1
+ export function unique(arr) {
3
2
  return Array.from(new Set(arr));
4
3
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.242",
3
+ "version": "0.4.243-commit-a70ea31",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {
@@ -245,7 +245,7 @@
245
245
  "@types/picomatch": "^3.0.2",
246
246
  "@types/semver": "^7.5.8",
247
247
  "@types/source-map-support": "^0.5.10",
248
- "react-streaming": "^0.4.3",
248
+ "react-streaming": "^0.4.10",
249
249
  "rimraf": "^5.0.5",
250
250
  "typescript": "^5.9.2",
251
251
  "vite": "^7.1.5"