Skip to content

Commit c0e909d

Browse files
committedSep 15, 2023
feat: new namespace Vike to enable users to refine type Config
1 parent b0f35c4 commit c0e909d

File tree

6 files changed

+65
-35
lines changed

6 files changed

+65
-35
lines changed
 

‎vite-plugin-ssr/TODO

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
- Add Vike.PageContext
2+
- improve TypeScript DX for `abortReason`
3+
- improve TypeScript DX for `usePageContext()`
14
- fix pageContext._renderHook.hookFilePath / replace with new prop hookSrc
25
- refacor/fix skipConfigValue to differentiate between global/page virtual file
36
- use json-s instead of JSON
47

58
- By default, only call guard() hooks on the server-side?
69

7-
- improve TypeScript DX for abortReason
8-
- improve TypeScript DX for usePageContext
910
- release 0.5.0
1011
- `import * from 'vite-plugin-ssr'`
1112
- pageContext.url
@@ -55,3 +56,4 @@ Contact:
5556
- Cloudflare Workers
5657
- UI frameworks like qwik (maybe even Angular)
5758
- See `pnpm create vite@latest` for a list of UI frameworks
59+

‎vite-plugin-ssr/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type PageContextForUserConsumptionServerSide = PageContextBuiltInServerInternal
3030
is404: null | boolean
3131
isClientSideNavigation: boolean
3232
pageProps?: Record<string, unknown>
33-
}
33+
} & Record<string, unknown>
3434
function preparePageContextForUserConsumptionServerSide(pageContext: PageContextForUserConsumptionServerSide): void {
3535
assertPageContextUrlComputedProps(pageContext)
3636

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
export type { Vike }
2+
export type { VikePackages }
3+
4+
// Enable users and vike-* packages to define types, e.g.:
5+
// - User can set Config['Page'] over Vike.Config['Page']
6+
// - vike-vercel can add Config['isr'] over Vike.Config['isr']
7+
8+
declare global {
9+
/** Refine Vike types. */
10+
namespace Vike {
11+
/** Define/refine the type `Config`.
12+
*
13+
* For example:
14+
* - You can refine the type of `Config['Page']`.
15+
* - You can define a newly created configuration to `Config`, when creating new configurations using `config.meta` https://vite-plugin-ssr.com/meta
16+
*
17+
*/
18+
interface Config {}
19+
}
20+
21+
/** This namespace is only used by:
22+
* - `vike-react`
23+
* - `vike-vue`
24+
* - `vike-solid`
25+
* - `vike-svelte`
26+
*
27+
* As a Vike user, you can ignore this.
28+
*/
29+
namespace VikePackages {
30+
// Enable vike-{react/vue/solid/svelte} to extend the type `Config`.
31+
// - We need a different interface for each vike-{react/vue/solid/svelte} package because of conflicts.
32+
// - E.g. Config['Page'] is a React/Vue/Solid/Svelte componenent depending on which vike-{react/vue/solid/svelte} package is being used.
33+
// - The user can be using more than one vike-{react/vue/solid/svelte} package.
34+
interface ConfigVikeReact {} // For vike-react
35+
interface ConfigVikeVue {} // For vike-vue
36+
interface ConfigVikeSolid {} // For vike-solid
37+
interface ConfigVikeSvelte {} // For vike-svelte (the vike-svelte package doesn't exist yet)
38+
}
39+
}

‎vite-plugin-ssr/shared/page-configs/Config.ts

+9-19
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,11 @@ export type { ConfigBuiltIn }
33
export type { ConfigNameBuiltIn }
44
export type { ConfigMeta }
55
export type { HookName }
6-
export type { ConfigInterface }
7-
export type { ConfigVikeReact }
8-
export type { ConfigVikeVue }
9-
export type { ConfigVikeSolid }
10-
export type { ConfigVikeSvelte }
116

127
import type { PrefetchStaticAssets } from '../../client/client-routing-runtime/prefetch/getPrefetchSettings.js'
138
import type { ConfigDefinition } from '../../node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.js'
149
import type { ConfigVpsUserProvided } from '../ConfigVps.js'
10+
import type { Vike, VikePackages } from '../VikeNamespace.js'
1511

1612
type HookName =
1713
| 'onHydrationEnd'
@@ -34,7 +30,14 @@ type ConfigNameBuiltInPublic =
3430
type ConfigNameBuiltInInternal = 'isClientSideRenderable' | 'onBeforeRenderEnv'
3531
type ConfigNameBuiltIn = ConfigNameBuiltInPublic | ConfigNameBuiltInInternal
3632

37-
type Config = ConfigBuiltIn & ConfigInterface & (ConfigVikeReact | ConfigVikeVue | ConfigVikeSolid | ConfigVikeSvelte)
33+
type Config = ConfigBuiltIn &
34+
Vike.Config &
35+
(
36+
| VikePackages.ConfigVikeReact
37+
| VikePackages.ConfigVikeVue
38+
| VikePackages.ConfigVikeSolid
39+
| VikePackages.ConfigVikeSvelte
40+
)
3841

3942
// TODO: write docs of links below
4043

@@ -168,16 +171,3 @@ type ConfigBuiltIn = {
168171
}
169172
type ConfigMeta = Record<string, ConfigDefinition>
170173
type ImportString = `import:${string}`
171-
172-
// Enable users and vike-* packages to extend the type Config, for example:
173-
// - The user can set Config['Page'] over ConfigInterface['Page']
174-
// - vike-vercel can add Config['isr'] over ConfigInterface['isr']
175-
interface ConfigInterface {}
176-
177-
// Enable vike-{react/vue/solid/svelte} to extend the type Config.
178-
// - We need a different interface for each vike-{react/vue/solid/svelte} package because of conflicts.
179-
// - E.g. the config 'Page' can be a React/Vue/Solid/Svelte componenent depending on which vike-{react/vue/solid/svelte} packages the user installed.
180-
interface ConfigVikeReact {} // For vike-react
181-
interface ConfigVikeVue {} // For vike-vue
182-
interface ConfigVikeSolid {} // For vike-solid
183-
interface ConfigVikeSvelte {} // For vike-svelte (the vike-svelte package doesn't exist yet)
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
export type { PageContextConfig }
22

3-
import type { ConfigBuiltIn, ConfigVikeReact, ConfigVikeSolid, ConfigVikeSvelte, ConfigVikeVue } from '../Config.js'
3+
import type { VikePackages } from '../../VikeNamespace.js'
4+
import type { ConfigBuiltIn } from '../Config.js'
45
import type { Combine, IsNotEmpty, XOR4 } from './helpers.ts'
56

67
// Like the type `Config` but meant for pageContext.config
78
type PageContextConfig = ConfigBuiltIn &
89
(ConfigVikePackagesNotEmptyXor extends true ? ConfigVikePackagesIntersection : ConfigVikePackagesCombined)
910

1011
// Preserves JSDocs, such as the the JSDoc pageContext.config.title defined by vike-react
11-
type ConfigVikePackagesIntersection = ConfigVikeReact & ConfigVikeVue & ConfigVikeSolid & ConfigVikeSvelte
12+
type ConfigVikePackagesIntersection = VikePackages.ConfigVikeReact &
13+
VikePackages.ConfigVikeVue &
14+
VikePackages.ConfigVikeSolid &
15+
VikePackages.ConfigVikeSvelte
1216
// Loses JSDocs, such as the the JSDoc pageContext.config.title defined by vike-react
1317
type ConfigVikePackagesCombined = Combine<
14-
ConfigVikeReact,
15-
Combine<ConfigVikeVue, Combine<ConfigVikeSolid, ConfigVikeSvelte>>
18+
VikePackages.ConfigVikeReact,
19+
Combine<VikePackages.ConfigVikeVue, Combine<VikePackages.ConfigVikeSolid, VikePackages.ConfigVikeSvelte>>
1620
>
1721

1822
type ConfigVikePackagesNotEmptyXor = XOR4<
19-
IsNotEmpty<ConfigVikeReact>,
20-
IsNotEmpty<ConfigVikeVue>,
21-
IsNotEmpty<ConfigVikeSolid>,
22-
IsNotEmpty<ConfigVikeSvelte>
23+
IsNotEmpty<VikePackages.ConfigVikeReact>,
24+
IsNotEmpty<VikePackages.ConfigVikeVue>,
25+
IsNotEmpty<VikePackages.ConfigVikeSolid>,
26+
IsNotEmpty<VikePackages.ConfigVikeSvelte>
2327
>

‎vite-plugin-ssr/types/index.ts

-5
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@ export type { InjectFilterEntry } from '../node/runtime/html/injectAssets/getHtm
55
export type {
66
Config,
77
ConfigMeta as Meta,
8-
ConfigInterface,
9-
ConfigVikeReact,
10-
ConfigVikeVue,
11-
ConfigVikeSolid,
12-
ConfigVikeSvelte
138
} from '../shared/page-configs/Config.js'
149
export type { ConfigEnv } from '../shared/page-configs/PageConfig.js'
1510
export type {

0 commit comments

Comments
 (0)
Please sign in to comment.