Skip to content

Commit

Permalink
[feat] improve readability of generated types (#6883)
Browse files Browse the repository at this point in the history
  • Loading branch information
david-plugge committed Sep 19, 2022
1 parent 434df79 commit 5e75c9c
Show file tree
Hide file tree
Showing 16 changed files with 208 additions and 152 deletions.
19 changes: 12 additions & 7 deletions packages/kit/src/core/sync/write_types/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ function update_types(config, routes, route) {
/** @type {string[]} */
const exports = [];

// add 'Expand' helper
// Makes sure a type is "repackaged" and therefore more readable
declarations.push('type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;');
declarations.push(
`type RouteParams = { ${route.names.map((param) => `${param}: string`).join('; ')} }`
);
Expand Down Expand Up @@ -278,7 +281,7 @@ function process_node(node, outdir, is_page, all_pages_have_load = true) {
written_proxies.push(`proxy${basename}`);
}

server_data = get_data_type(node.server, 'null', proxy);
server_data = get_data_type(node.server, 'null', proxy, true);

const parent_type = `${prefix}ServerParentData`;

Expand All @@ -305,7 +308,7 @@ function process_node(node, outdir, is_page, all_pages_have_load = true) {
? `./proxy${replace_ext_with_js(basename)}`
: path_to_original(outdir, node.server);

type = `Kit.AwaitedActions<typeof import('${from}').actions>`;
type = `Expand<Kit.AwaitedActions<typeof import('${from}').actions>>`;
}
}
exports.push(`export type ActionData = ${type};`);
Expand All @@ -328,7 +331,7 @@ function process_node(node, outdir, is_page, all_pages_have_load = true) {

const type = get_data_type(node.shared, `${parent_type} & ${prefix}ServerData`, proxy);

data = `Omit<${parent_type}, keyof ${type}> & ${type}`;
data = `Expand<Omit<${parent_type}, keyof ${type}> & ${type}>`;

const output_data_shape =
!is_page && all_pages_have_load
Expand All @@ -340,9 +343,9 @@ function process_node(node, outdir, is_page, all_pages_have_load = true) {

exports.push(`export type ${prefix}LoadEvent = Parameters<${prefix}Load>[0];`);
} else if (server_data === 'null') {
data = parent_type;
data = `Expand<${parent_type}>`;
} else {
data = `Omit<${parent_type}, keyof ${prefix}ServerData> & ${prefix}ServerData`;
data = `Expand<Omit<${parent_type}, keyof ${prefix}ServerData> & ${prefix}ServerData>`;
}

exports.push(`export type ${prefix}Data = ${data};`);
Expand All @@ -353,16 +356,18 @@ function process_node(node, outdir, is_page, all_pages_have_load = true) {
* @param {string} file_path
* @param {string} fallback
* @param {Proxy} proxy
* @param {boolean} expand
*/
function get_data_type(file_path, fallback, proxy) {
function get_data_type(file_path, fallback, proxy, expand = false) {
if (proxy) {
if (proxy.exports.includes('load')) {
// If the file wasn't tweaked, we can use the return type of the original file.
// The advantage is that type updates are reflected without saving.
const from = proxy.modified
? `./proxy${replace_ext_with_js(path.basename(file_path))}`
: path_to_original(outdir, file_path);
return `Kit.AwaitedProperties<Awaited<ReturnType<typeof import('${from}').load>>>`;
const type = `Kit.AwaitedProperties<Awaited<ReturnType<typeof import('${from}').load>>>`;
return expand ? `Expand<${type}>` : type;
} else {
return fallback;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type * as Kit from '@sveltejs/kit';

type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type RouteParams = {};
type MaybeWithVoid<T> = {} extends T ? T | void : T;
export type RequiredKeys<T> = {
Expand All @@ -21,12 +22,14 @@ export type LayoutLoad<
| void
> = Kit.Load<LayoutParams, LayoutServerData, LayoutParentData, OutputData>;
export type LayoutLoadEvent = Parameters<LayoutLoad>[0];
export type LayoutData = Omit<
LayoutParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.js').load>>
>;
export type LayoutData = Expand<
Omit<
LayoutParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.js').load>>
>
>;
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type * as Kit from '@sveltejs/kit';

type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type RouteParams = {};
type MaybeWithVoid<T> = {} extends T ? T | void : T;
export type RequiredKeys<T> = {
Expand All @@ -21,22 +22,26 @@ export type PageLoad<
OutputData extends OutputDataShape<PageParentData> = OutputDataShape<PageParentData>
> = Kit.Load<RouteParams, PageServerData, PageParentData, OutputData>;
export type PageLoadEvent = Parameters<PageLoad>[0];
export type PageData = Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../(main)/+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../(main)/+page.js').load>>
>;
export type PageData = Expand<
Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../(main)/+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../(main)/+page.js').load>>
>
>;
export type LayoutServerLoad<
OutputData extends (Partial<App.PageData> & Record<string, any>) | void =
| (Partial<App.PageData> & Record<string, any>)
| void
> = Kit.ServerLoad<LayoutParams, LayoutServerParentData, OutputData>;
export type LayoutServerLoadEvent = Parameters<LayoutServerLoad>[0];
export type LayoutServerData = Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../(main)/+layout.server.js').load>>
export type LayoutServerData = Expand<
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../(main)/+layout.server.js').load>>
>
>;
export type LayoutData = Omit<LayoutParentData, keyof LayoutServerData> & LayoutServerData;
export type LayoutData = Expand<Omit<LayoutParentData, keyof LayoutServerData> & LayoutServerData>;
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type * as Kit from '@sveltejs/kit';

type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type RouteParams = {};
type MaybeWithVoid<T> = {} extends T ? T | void : T;
export type RequiredKeys<T> = {
Expand All @@ -22,12 +23,14 @@ export type PageLoad<
OutputData extends OutputDataShape<PageParentData> = OutputDataShape<PageParentData>
> = Kit.Load<RouteParams, PageServerData, PageParentData, OutputData>;
export type PageLoadEvent = Parameters<PageLoad>[0];
export type PageData = Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../../(main)/sub/+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../../(main)/sub/+page.js').load>>
>;
export type PageData = Expand<
Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../../(main)/sub/+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../../../(main)/sub/+page.js').load>>
>
>;
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type * as Kit from '@sveltejs/kit';

type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type RouteParams = {};
type MaybeWithVoid<T> = {} extends T ? T | void : T;
export type RequiredKeys<T> = {
Expand All @@ -24,22 +25,26 @@ export type PageServerLoad<
> = Kit.ServerLoad<RouteParams, PageServerParentData, OutputData>;
export type PageServerLoadEvent = Parameters<PageServerLoad>[0];
export type ActionData = unknown;
export type PageServerData = Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.server.js').load>>
export type PageServerData = Expand<
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.server.js').load>>
>
>;
export type PageLoad<
OutputData extends OutputDataShape<PageParentData> = OutputDataShape<PageParentData>
> = Kit.Load<RouteParams, PageServerData, PageParentData, OutputData>;
export type PageLoadEvent = Parameters<PageLoad>[0];
export type PageData = Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>;
export type PageData = Expand<
Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
>;
export type Action = Kit.Action<RouteParams>;
export type Actions = Kit.Actions<RouteParams>;
export type LayoutServerLoad<
Expand All @@ -48,22 +53,26 @@ export type LayoutServerLoad<
| void
> = Kit.ServerLoad<LayoutParams, LayoutServerParentData, OutputData>;
export type LayoutServerLoadEvent = Parameters<LayoutServerLoad>[0];
export type LayoutServerData = Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.server.js').load>>
export type LayoutServerData = Expand<
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.server.js').load>>
>
>;
export type LayoutLoad<
OutputData extends (Partial<App.PageData> & Record<string, any>) | void =
| (Partial<App.PageData> & Record<string, any>)
| void
> = Kit.Load<LayoutParams, LayoutServerData, LayoutParentData, OutputData>;
export type LayoutLoadEvent = Parameters<LayoutLoad>[0];
export type LayoutData = Omit<
LayoutParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.js').load>>
>;
export type LayoutData = Expand<
Omit<
LayoutParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+layout.js').load>>
>
>;
export type RequestEvent = Kit.RequestEvent<RouteParams>;
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type * as Kit from '@sveltejs/kit';

type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type RouteParams = {};
type MaybeWithVoid<T> = {} extends T ? T | void : T;
export type RequiredKeys<T> = {
Expand All @@ -23,24 +24,28 @@ export type PageServerLoad<
> = Kit.ServerLoad<RouteParams, PageServerParentData, OutputData>;
export type PageServerLoadEvent = Parameters<PageServerLoad>[0];
export type ActionData = unknown;
export type PageServerData = Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.server.js').load>>
export type PageServerData = Expand<
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.server.js').load>>
>
>;
export type PageLoad<
OutputData extends OutputDataShape<PageParentData> = OutputDataShape<PageParentData>
> = Kit.Load<RouteParams, PageServerData, PageParentData, OutputData>;
export type PageLoadEvent = Parameters<PageLoad>[0];
export type PageData = Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>;
export type PageData = Expand<
Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
>;
export type Action = Kit.Action<RouteParams>;
export type Actions = Kit.Actions<RouteParams>;
export type LayoutServerData = null;
export type LayoutData = LayoutParentData;
export type LayoutData = Expand<LayoutParentData>;
export type RequestEvent = Kit.RequestEvent<RouteParams>;
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type * as Kit from '@sveltejs/kit';

type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type RouteParams = {};
type MaybeWithVoid<T> = {} extends T ? T | void : T;
export type RequiredKeys<T> = {
Expand All @@ -20,15 +21,17 @@ export type PageServerLoad<
OutputData extends OutputDataShape<PageServerParentData> = OutputDataShape<PageServerParentData>
> = Kit.ServerLoad<RouteParams, PageServerParentData, OutputData>;
export type PageServerLoadEvent = Parameters<PageServerLoad>[0];
export type ActionData = Kit.AwaitedActions<
typeof import('../../../../../../../../+page.server.js').actions
export type ActionData = Expand<
Kit.AwaitedActions<typeof import('../../../../../../../../+page.server.js').actions>
>;
export type PageServerData = Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.server.js').load>>
export type PageServerData = Expand<
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.server.js').load>>
>
>;
export type PageData = Omit<PageParentData, keyof PageServerData> & PageServerData;
export type PageData = Expand<Omit<PageParentData, keyof PageServerData> & PageServerData>;
export type Action = Kit.Action<RouteParams>;
export type Actions = Kit.Actions<RouteParams>;
export type LayoutServerData = null;
export type LayoutData = LayoutParentData;
export type LayoutData = Expand<LayoutParentData>;
export type RequestEvent = Kit.RequestEvent<RouteParams>;
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type * as Kit from '@sveltejs/kit';

type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
type RouteParams = {};
type MaybeWithVoid<T> = {} extends T ? T | void : T;
export type RequiredKeys<T> = {
Expand All @@ -20,14 +21,16 @@ export type PageLoad<
OutputData extends OutputDataShape<PageParentData> = OutputDataShape<PageParentData>
> = Kit.Load<RouteParams, PageServerData, PageParentData, OutputData>;
export type PageLoadEvent = Parameters<PageLoad>[0];
export type PageData = Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>;
export type PageData = Expand<
Omit<
PageParentData,
keyof Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
> &
Kit.AwaitedProperties<
Awaited<ReturnType<typeof import('../../../../../../../../+page.js').load>>
>
>;
export type LayoutServerData = null;
export type LayoutData = LayoutParentData;
export type LayoutData = Expand<LayoutParentData>;
Loading

0 comments on commit 5e75c9c

Please sign in to comment.