Skip to content

Commit

Permalink
feat: remove automatic flattening of getStaticPaths result (#7845)
Browse files Browse the repository at this point in the history
* feat: remove automatic flattening of `getStaticPaths` result

* chore: changeset
  • Loading branch information
Princesseuh authored and ematipico committed Aug 1, 2023
1 parent 19e91e1 commit a4f30d2
Show file tree
Hide file tree
Showing 12 changed files with 42 additions and 62 deletions.
5 changes: 5 additions & 0 deletions .changeset/chilled-ducks-grin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': major
---

Removed automatic flattening of `getStaticPaths` result. `.flatMap` and `.flat` should now be used to ensure that you're returning a flat array.
5 changes: 1 addition & 4 deletions packages/astro/src/@types/astro.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1524,10 +1524,7 @@ export type GetStaticPathsResultKeyed = GetStaticPathsResult & {
*/
export type GetStaticPaths = (
options: GetStaticPathsOptions
) =>
| Promise<GetStaticPathsResult | GetStaticPathsResult[]>
| GetStaticPathsResult
| GetStaticPathsResult[];
) => Promise<GetStaticPathsResult> | GetStaticPathsResult;

/**
* Infers the shape of the `params` property returned by `getStaticPaths()`.
Expand Down
1 change: 0 additions & 1 deletion packages/astro/src/core/build/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,6 @@ async function getPathsForRoute(
mod,
route,
routeCache: opts.routeCache,
isValidate: false,
logging: opts.logging,
ssr: isServerLikeOutput(opts.settings.config),
}).catch((err) => {
Expand Down
23 changes: 23 additions & 0 deletions packages/astro/src/core/errors/errors-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,28 @@ but ${plural ? 'none were' : 'it was not'} able to server-side render \`${compon
`Invalid params given to \`getStaticPaths\` path. Expected an \`object\`, got \`${paramType}\``,
hint: 'See https://docs.astro.build/en/reference/api-reference/#getstaticpaths for more information on getStaticPaths.',
},
/**
* @docs
* @see
* - [`getStaticPaths()`](https://docs.astro.build/en/reference/api-reference/#getstaticpaths)
* @description
* `getStaticPaths`'s return value must be an array of objects. In most cases, this error happens because an array of array was returned. Using [`.flatMap()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap) or a [`.flat()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat) call may be useful.
*
* ```ts title="pages/blog/[id].astro"
* export async function getStaticPaths() {
* return [ // <-- Array
* { params: { slug: "blog" } }, // <-- Object
* { params: { slug: "about" } }
* ];
*}
* ```
*/
InvalidGetStaticPathsEntry: {
title: "Invalid entry inside getStaticPath's return value",
message: (entryType) =>
`Invalid entry returned by getStaticPaths. Expected an object, got \`${entryType}\``,
hint: "If you're using a `.map` call, you might be looking for `.flatMap()` instead. See https://docs.astro.build/en/reference/api-reference/#getstaticpaths for more information on getStaticPaths.",
},
/**
* @docs
* @see
Expand All @@ -254,6 +276,7 @@ but ${plural ? 'none were' : 'it was not'} able to server-side render \`${compon
`Invalid type returned by \`getStaticPaths\`. Expected an \`array\`, got \`${returnType}\``,
hint: 'See https://docs.astro.build/en/reference/api-reference/#getstaticpaths for more information on getStaticPaths.',
},

/**
* @docs
* @see
Expand Down
1 change: 0 additions & 1 deletion packages/astro/src/core/render/params-and-props.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ export async function getParamsAndProps(opts: GetParamsAndPropsOptions): Promise
mod,
route,
routeCache,
isValidate: true,
logging,
ssr,
});
Expand Down
11 changes: 1 addition & 10 deletions packages/astro/src/core/render/route-cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ interface CallGetStaticPathsOptions {
mod: ComponentInstance;
route: RouteData;
routeCache: RouteCache;
isValidate: boolean;
logging: LogOptions;
ssr: boolean;
}
Expand All @@ -27,7 +26,6 @@ export async function callGetStaticPaths({
mod,
route,
routeCache,
isValidate,
logging,
ssr,
}: CallGetStaticPathsOptions): Promise<GetStaticPathsResultKeyed> {
Expand Down Expand Up @@ -58,14 +56,7 @@ export async function callGetStaticPaths({
},
});

// Flatten the array before validating the content, otherwise users using `.map` will run into errors
if (Array.isArray(staticPaths)) {
staticPaths = staticPaths.flat();
}

if (isValidate) {
validateGetStaticPathsResult(staticPaths, logging, route);
}
validateGetStaticPathsResult(staticPaths, logging, route);

const keyedStaticPaths = staticPaths as GetStaticPathsResultKeyed;
keyedStaticPaths.keyed = new Map<string, GetStaticPathsItem>();
Expand Down
19 changes: 9 additions & 10 deletions packages/astro/src/core/routing/validation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,15 @@ export function validateGetStaticPathsResult(
}

result.forEach((pathObject) => {
if ((typeof pathObject === 'object' && Array.isArray(pathObject)) || pathObject === null) {
throw new AstroError({
...AstroErrorData.InvalidGetStaticPathsEntry,
message: AstroErrorData.InvalidGetStaticPathsEntry.message(
Array.isArray(pathObject) ? 'array' : typeof pathObject
),
});
}

if (
pathObject.params === undefined ||
pathObject.params === null ||
Expand All @@ -67,16 +76,6 @@ export function validateGetStaticPathsResult(
});
}

if (typeof pathObject.params !== 'object') {
throw new AstroError({
...AstroErrorData.InvalidGetStaticPathParam,
message: AstroErrorData.InvalidGetStaticPathParam.message(typeof pathObject.params),
location: {
file: route.component,
},
});
}

// TODO: Replace those with errors? They technically don't crash the build, but users might miss the warning. - erika, 2022-11-07
for (const [key, val] of Object.entries(pathObject.params)) {
if (!(typeof val === 'undefined' || typeof val === 'string' || typeof val === 'number')) {
Expand Down
7 changes: 1 addition & 6 deletions packages/astro/test/astro-get-static-paths.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { expect } from 'chai';
import { loadFixture } from './test-utils.js';
import * as cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';

describe('getStaticPaths - build calls', () => {
/** @type {import('./test-utils').Fixture} */
Expand Down Expand Up @@ -92,11 +92,6 @@ describe('getStaticPaths - dev calls', () => {
});

describe('route params type validation', () => {
it('resolves 200 on nested array parameters', async () => {
const res = await fixture.fetch('/nested-arrays/slug1');
expect(res.status).to.equal(200);
});

it('resolves 200 on matching static path - string params', async () => {
// route provided with { params: { year: "2022", slug: "post-2" }}
const res = await fixture.fetch('/blog/2022/post-1');
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
export async function getStaticPaths({paginate}) {
const allPosts = await Astro.glob('../../post/*.md');
return ['red', 'blue'].map((filter) => {
return ['red', 'blue'].flatMap((filter) => {
const filteredPosts = allPosts.filter((post) => post.frontmatter.tag === filter);
return paginate(filteredPosts, {
params: { slug: filter },
Expand Down

This file was deleted.

12 changes: 1 addition & 11 deletions packages/astro/test/ssr-prerender-get-static-paths.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { expect } from 'chai';
import { loadFixture } from './test-utils.js';
import * as cheerio from 'cheerio';
import testAdapter from './test-adapter.js';
import { loadFixture } from './test-utils.js';

describe('Prerender', () => {
/** @type {import('./test-utils').Fixture} */
Expand Down Expand Up @@ -102,11 +102,6 @@ describe('Prerender', () => {
});

describe('route params type validation', () => {
it('resolves 200 on nested array parameters', async () => {
const res = await fixture.fetch('/blog/nested-arrays/slug1');
expect(res.status).to.equal(200);
});

it('resolves 200 on matching static path - string params', async () => {
// route provided with { params: { year: "2022", slug: "post-2" }}
const res = await fixture.fetch('/blog/blog/2022/post-1');
Expand Down Expand Up @@ -234,11 +229,6 @@ describe('Prerender', () => {
});

describe('route params type validation', () => {
it('resolves 200 on nested array parameters', async () => {
const res = await fixture.fetch('/blog/nested-arrays/slug1');
expect(res.status).to.equal(200);
});

it('resolves 200 on matching static path - string params', async () => {
// route provided with { params: { year: "2022", slug: "post-2" }}
const res = await fixture.fetch('/blog/blog/2022/post-1');
Expand Down

0 comments on commit a4f30d2

Please sign in to comment.