diff --git a/.changeset/blue-lizards-type.md b/.changeset/blue-lizards-type.md new file mode 100644 index 000000000000..814fc1ebc397 --- /dev/null +++ b/.changeset/blue-lizards-type.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[fix] prevent data types from becoming type `never`, notice moved/deleted files diff --git a/packages/kit/src/core/sync/write_types/index.js b/packages/kit/src/core/sync/write_types/index.js index fc18f0c0eca2..1e4b29aea395 100644 --- a/packages/kit/src/core/sync/write_types/index.js +++ b/packages/kit/src/core/sync/write_types/index.js @@ -46,11 +46,82 @@ export async function write_all_types(config, manifest_data) { } } + // Read/write meta data on each invocation, not once per node process, + // it could be invoked by another process in the meantime. + const meta_data_file = `${types_dir}/route_meta_data.json`; + const has_meta_data = fs.existsSync(meta_data_file); + let meta_data = has_meta_data + ? /** @type {Record} */ (JSON.parse(fs.readFileSync(meta_data_file, 'utf-8'))) + : {}; const routes_map = create_routes_map(manifest_data); // For each directory, write $types.d.ts for (const route of manifest_data.routes) { - update_types(config, routes_map, route); + if (!route.leaf && !route.layout && !route.endpoint) continue; // nothing to do + + const outdir = path.join(config.kit.outDir, 'types', routes_dir, route.id); + + // check if the types are out of date + /** @type {string[]} */ + const input_files = []; + + /** @type {import('types').PageNode | null} */ + let node = route.leaf; + while (node) { + if (node.shared) input_files.push(node.shared); + if (node.server) input_files.push(node.server); + node = node.parent ?? null; + } + + /** @type {import('types').PageNode | null} */ + node = route.layout; + while (node) { + if (node.shared) input_files.push(node.shared); + if (node.server) input_files.push(node.server); + node = node.parent ?? null; + } + + if (route.endpoint) { + input_files.push(route.endpoint.file); + } + + try { + fs.mkdirSync(outdir, { recursive: true }); + } catch {} + + const output_files = compact( + fs.readdirSync(outdir).map((name) => { + const stats = fs.statSync(path.join(outdir, name)); + if (stats.isDirectory()) return; + return { + name, + updated: stats.mtimeMs + }; + }) + ); + + const source_last_updated = Math.max( + // ctimeMs includes move operations whereas mtimeMs does not + ...input_files.map((file) => fs.statSync(file).ctimeMs) + ); + const types_last_updated = Math.max(...output_files.map((file) => file.updated)); + + const should_generate = + // source files were generated more recently than the types + source_last_updated > types_last_updated || + // no meta data file exists yet + !has_meta_data || + // some file was deleted + !meta_data[route.id]?.every((file) => input_files.includes(file)); + + if (should_generate) { + // track which old files end up being surplus to requirements + const to_delete = new Set(output_files.map((file) => file.name)); + update_types(config, routes_map, route, to_delete); + meta_data[route.id] = input_files; + } } + + fs.writeFileSync(meta_data_file, JSON.stringify(meta_data, null, '\t')); } /** @@ -72,6 +143,7 @@ export async function write_types(config, manifest_data, file) { const route = manifest_data.routes.find((route) => route.id === id); if (!route) return; // this shouldn't ever happen + if (!route.leaf && !route.layout && !route.endpoint) return; // nothing to do update_types(config, create_routes_map(manifest_data), route); } @@ -96,60 +168,12 @@ function create_routes_map(manifest_data) { * @param {import('types').ValidatedConfig} config * @param {Map} routes * @param {import('types').RouteData} route + * @param {Set} [to_delete] */ -function update_types(config, routes, route) { - if (!route.leaf && !route.layout && !route.endpoint) return; // nothing to do - +function update_types(config, routes, route, to_delete = new Set()) { const routes_dir = posixify(path.relative('.', config.kit.files.routes)); const outdir = path.join(config.kit.outDir, 'types', routes_dir, route.id); - // first, check if the types are out of date - const input_files = []; - - /** @type {import('types').PageNode | null} */ - let node = route.leaf; - while (node) { - if (node.shared) input_files.push(node.shared); - if (node.server) input_files.push(node.server); - node = node.parent ?? null; - } - - /** @type {import('types').PageNode | null} */ - node = route.layout; - while (node) { - if (node.shared) input_files.push(node.shared); - if (node.server) input_files.push(node.server); - node = node.parent ?? null; - } - - if (route.endpoint) { - input_files.push(route.endpoint.file); - } - - try { - fs.mkdirSync(outdir, { recursive: true }); - } catch {} - - const output_files = compact( - fs.readdirSync(outdir).map((name) => { - const stats = fs.statSync(path.join(outdir, name)); - if (stats.isDirectory()) return; - return { - name, - updated: stats.mtimeMs - }; - }) - ); - - const source_last_updated = Math.max(...input_files.map((file) => fs.statSync(file).mtimeMs)); - const types_last_updated = Math.max(...output_files.map((file) => file?.updated)); - - // types were generated more recently than the source files, so don't regenerate - if (types_last_updated > source_last_updated) return; - - // track which old files end up being surplus to requirements - const to_delete = new Set(output_files.map((file) => file.name)); - // now generate new types const imports = [`import type * as Kit from '@sveltejs/kit';`]; @@ -180,7 +204,7 @@ function update_types(config, routes, route) { `type OutputDataShape = MaybeWithVoid> & Partial> & Record>` ); // null & {} == null, we need to prevent that in some situations - declarations.push(`type EnsureParentData = T extends null | undefined ? {} : T;`); + declarations.push(`type EnsureDefined = T extends null | undefined ? {} : T;`); } if (route.leaf) { @@ -329,9 +353,13 @@ function process_node(node, outdir, is_page, all_pages_have_load = true) { written_proxies.push(`proxy${path.basename(node.shared)}`); } - const type = get_data_type(node.shared, `${parent_type} & ${prefix}ServerData`, proxy); + const type = get_data_type( + node.shared, + `${parent_type} & EnsureDefined<${prefix}ServerData>`, + proxy + ); - data = `Expand & ${type}>`; + data = `Expand & EnsureDefined<${type}>>`; const output_data_shape = !is_page && all_pages_have_load @@ -345,7 +373,7 @@ function process_node(node, outdir, is_page, all_pages_have_load = true) { } else if (server_data === 'null') { data = `Expand<${parent_type}>`; } else { - data = `Expand & ${prefix}ServerData>`; + data = `Expand & EnsureDefined<${prefix}ServerData>>`; } exports.push(`export type ${prefix}Data = ${data};`); @@ -396,14 +424,14 @@ function get_parent_type(node, type) { parent = parent.parent; } - let parent_str = `EnsureParentData<${parent_imports[0] || '{}'}>`; + let parent_str = `EnsureDefined<${parent_imports[0] || '{}'}>`; for (let i = 1; i < parent_imports.length; i++) { // Omit is necessary because a parent could have a property with the same key which would // cause a type conflict. At runtime the child overwrites the parent property in this case, // so reflect that in the type definition. - // EnsureParentData is necessary because {something: string} & null becomes null. + // EnsureDefined is necessary because {something: string} & null becomes null. // Output types of server loads can be null but when passed in through the `parent` parameter they are the empty object instead. - parent_str = `Omit<${parent_str}, keyof ${parent_imports[i]}> & EnsureParentData<${parent_imports[i]}>`; + parent_str = `Omit<${parent_str}, keyof ${parent_imports[i]}> & EnsureDefined<${parent_imports[i]}>`; } return parent_str; } diff --git a/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/$types.d.ts b/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/$types.d.ts index 437ad8dcb6a7..bf57263b30d8 100644 --- a/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/$types.d.ts @@ -11,9 +11,9 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; +type EnsureDefined = T extends null | undefined ? {} : T; type LayoutParams = RouteParams & {}; -type LayoutParentData = EnsureParentData<{}>; +type LayoutParentData = EnsureDefined<{}>; export type LayoutServerData = null; export type LayoutLoad< @@ -29,7 +29,9 @@ export type LayoutData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; diff --git a/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/(main)/$types.d.ts b/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/(main)/$types.d.ts index cafaca1162b8..8dce3050a2c8 100644 --- a/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/(main)/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/(main)/$types.d.ts @@ -11,11 +11,11 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; -type PageParentData = EnsureParentData; +type EnsureDefined = T extends null | undefined ? {} : T; +type PageParentData = EnsureDefined; type LayoutParams = RouteParams & {}; -type LayoutServerParentData = EnsureParentData; -type LayoutParentData = EnsureParentData; +type LayoutServerParentData = EnsureDefined; +type LayoutParentData = EnsureDefined; export type PageServerData = null; export type PageLoad< @@ -29,8 +29,10 @@ export type PageData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; export type LayoutServerLoad< @@ -44,4 +46,6 @@ export type LayoutServerData = Expand< Awaited> > >; -export type LayoutData = Expand & LayoutServerData>; +export type LayoutData = Expand< + Omit & EnsureDefined +>; diff --git a/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/(main)/sub/$types.d.ts b/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/(main)/sub/$types.d.ts index 2a6dcc75e223..6d3a147d3033 100644 --- a/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/(main)/sub/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/layout-advanced/_expected/(main)/sub/$types.d.ts @@ -11,12 +11,12 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; +type EnsureDefined = T extends null | undefined ? {} : T; type PageParentData = Omit< - EnsureParentData, + EnsureDefined, keyof import('../$types.js').LayoutData > & - EnsureParentData; + EnsureDefined; export type PageServerData = null; export type PageLoad< @@ -30,7 +30,9 @@ export type PageData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; diff --git a/packages/kit/src/core/sync/write_types/test/layout/_expected/$types.d.ts b/packages/kit/src/core/sync/write_types/test/layout/_expected/$types.d.ts index c7ace7bcb076..7aa6216adc85 100644 --- a/packages/kit/src/core/sync/write_types/test/layout/_expected/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/layout/_expected/$types.d.ts @@ -11,12 +11,12 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; -type PageServerParentData = EnsureParentData; -type PageParentData = EnsureParentData; +type EnsureDefined = T extends null | undefined ? {} : T; +type PageServerParentData = EnsureDefined; +type PageParentData = EnsureDefined; type LayoutParams = RouteParams & {}; -type LayoutServerParentData = EnsureParentData<{}>; -type LayoutParentData = EnsureParentData<{}>; +type LayoutServerParentData = EnsureDefined<{}>; +type LayoutParentData = EnsureDefined<{}>; export type PageServerLoad< OutputData extends (Partial & Record) | void = @@ -41,8 +41,10 @@ export type PageData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; export type Action = Kit.Action; @@ -71,8 +73,10 @@ export type LayoutData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; export type RequestEvent = Kit.RequestEvent; diff --git a/packages/kit/src/core/sync/write_types/test/simple-page-server-and-shared/_expected/$types.d.ts b/packages/kit/src/core/sync/write_types/test/simple-page-server-and-shared/_expected/$types.d.ts index 4c55aeabc56a..e0aa63a0dc77 100644 --- a/packages/kit/src/core/sync/write_types/test/simple-page-server-and-shared/_expected/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/simple-page-server-and-shared/_expected/$types.d.ts @@ -11,11 +11,11 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; -type PageServerParentData = EnsureParentData; -type PageParentData = EnsureParentData; +type EnsureDefined = T extends null | undefined ? {} : T; +type PageServerParentData = EnsureDefined; +type PageParentData = EnsureDefined; type LayoutParams = RouteParams & {}; -type LayoutParentData = EnsureParentData<{}>; +type LayoutParentData = EnsureDefined<{}>; export type PageServerLoad< OutputData extends (Partial & Record) | void = @@ -40,8 +40,10 @@ export type PageData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; export type Action = Kit.Action; diff --git a/packages/kit/src/core/sync/write_types/test/simple-page-server-only/_expected/$types.d.ts b/packages/kit/src/core/sync/write_types/test/simple-page-server-only/_expected/$types.d.ts index 597cd9a16ce6..83443fcf45bc 100644 --- a/packages/kit/src/core/sync/write_types/test/simple-page-server-only/_expected/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/simple-page-server-only/_expected/$types.d.ts @@ -11,11 +11,11 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; -type PageServerParentData = EnsureParentData; -type PageParentData = EnsureParentData; +type EnsureDefined = T extends null | undefined ? {} : T; +type PageServerParentData = EnsureDefined; +type PageParentData = EnsureDefined; type LayoutParams = RouteParams & {}; -type LayoutParentData = EnsureParentData<{}>; +type LayoutParentData = EnsureDefined<{}>; export type PageServerLoad< OutputData extends OutputDataShape = OutputDataShape @@ -29,7 +29,9 @@ export type PageServerData = Expand< Awaited> > >; -export type PageData = Expand & PageServerData>; +export type PageData = Expand< + Omit & EnsureDefined +>; export type Action = Kit.Action; export type Actions = Kit.Actions; export type LayoutServerData = null; diff --git a/packages/kit/src/core/sync/write_types/test/simple-page-shared-only/_expected/$types.d.ts b/packages/kit/src/core/sync/write_types/test/simple-page-shared-only/_expected/$types.d.ts index b633139a3a75..bd9abf03bb14 100644 --- a/packages/kit/src/core/sync/write_types/test/simple-page-shared-only/_expected/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/simple-page-shared-only/_expected/$types.d.ts @@ -11,10 +11,10 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; -type PageParentData = EnsureParentData; +type EnsureDefined = T extends null | undefined ? {} : T; +type PageParentData = EnsureDefined; type LayoutParams = RouteParams & {}; -type LayoutParentData = EnsureParentData<{}>; +type LayoutParentData = EnsureDefined<{}>; export type PageServerData = null; export type PageLoad< @@ -28,8 +28,10 @@ export type PageData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; export type LayoutServerData = null; diff --git a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/$types.d.ts b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/$types.d.ts index 01c8cf716180..84ca3b827252 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/$types.d.ts @@ -11,9 +11,9 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; +type EnsureDefined = T extends null | undefined ? {} : T; type LayoutParams = RouteParams & { rest?: string; slug?: string }; -type LayoutParentData = EnsureParentData<{}>; +type LayoutParentData = EnsureDefined<{}>; export type LayoutServerData = null; export type LayoutLoad< @@ -27,7 +27,9 @@ export type LayoutData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; diff --git a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/$types.d.ts b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/$types.d.ts index 0eb3bde85319..ceb75d063513 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/$types.d.ts @@ -11,9 +11,9 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; +type EnsureDefined = T extends null | undefined ? {} : T; type LayoutParams = RouteParams & { rest?: string }; -type LayoutParentData = EnsureParentData; +type LayoutParentData = EnsureDefined; export type LayoutServerData = null; export type LayoutLoad< @@ -29,7 +29,9 @@ export type LayoutData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; diff --git a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/[...rest]/$types.d.ts b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/[...rest]/$types.d.ts index 876364ebf239..1f85afeb0254 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/[...rest]/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/[...rest]/$types.d.ts @@ -11,12 +11,12 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; +type EnsureDefined = T extends null | undefined ? {} : T; type PageParentData = Omit< - EnsureParentData, + EnsureDefined, keyof import('../$types.js').LayoutData > & - EnsureParentData; + EnsureDefined; export type PageServerData = null; export type PageLoad< @@ -32,9 +32,11 @@ export type PageData = Expand< > > > & - Kit.AwaitedProperties< - Awaited< - ReturnType + EnsureDefined< + Kit.AwaitedProperties< + Awaited< + ReturnType + > > > >; diff --git a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/[slug]/$types.d.ts b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/[slug]/$types.d.ts index 36a66f7a1d77..1fed4661e16e 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/[slug]/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/_expected/nested/[slug]/$types.d.ts @@ -11,8 +11,8 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; -type PageParentData = EnsureParentData; +type EnsureDefined = T extends null | undefined ? {} : T; +type PageParentData = EnsureDefined; export type PageServerData = null; export type PageData = Expand; diff --git a/packages/kit/src/core/sync/write_types/test/slugs/_expected/$types.d.ts b/packages/kit/src/core/sync/write_types/test/slugs/_expected/$types.d.ts index 1d0cf89b6f24..131ee971983d 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs/_expected/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/slugs/_expected/$types.d.ts @@ -11,9 +11,9 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; +type EnsureDefined = T extends null | undefined ? {} : T; type LayoutParams = RouteParams & { rest?: string; slug?: string }; -type LayoutParentData = EnsureParentData<{}>; +type LayoutParentData = EnsureDefined<{}>; export type LayoutServerData = null; export type LayoutLoad< @@ -29,7 +29,9 @@ export type LayoutData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; diff --git a/packages/kit/src/core/sync/write_types/test/slugs/_expected/[...rest]/$types.d.ts b/packages/kit/src/core/sync/write_types/test/slugs/_expected/[...rest]/$types.d.ts index bc4cc6f74ae8..3e9a9bf730bf 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs/_expected/[...rest]/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/slugs/_expected/[...rest]/$types.d.ts @@ -11,8 +11,8 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; -type PageParentData = EnsureParentData; +type EnsureDefined = T extends null | undefined ? {} : T; +type PageParentData = EnsureDefined; export type PageServerData = null; export type PageLoad< @@ -26,7 +26,9 @@ export type PageData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >; diff --git a/packages/kit/src/core/sync/write_types/test/slugs/_expected/[slug]/$types.d.ts b/packages/kit/src/core/sync/write_types/test/slugs/_expected/[slug]/$types.d.ts index 86911f5e0043..ec1208796bf6 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs/_expected/[slug]/$types.d.ts +++ b/packages/kit/src/core/sync/write_types/test/slugs/_expected/[slug]/$types.d.ts @@ -11,8 +11,8 @@ type OutputDataShape = MaybeWithVoid< Partial> & Record >; -type EnsureParentData = T extends null | undefined ? {} : T; -type PageParentData = EnsureParentData; +type EnsureDefined = T extends null | undefined ? {} : T; +type PageParentData = EnsureDefined; export type PageServerData = null; export type PageLoad< @@ -26,7 +26,9 @@ export type PageData = Expand< Awaited> > > & - Kit.AwaitedProperties< - Awaited> + EnsureDefined< + Kit.AwaitedProperties< + Awaited> + > > >;