Skip to content

Commit

Permalink
Use AstroError for Astro.glob errors (#7219)
Browse files Browse the repository at this point in the history
Co-authored-by: Erika <[email protected]>
Co-authored-by: sarah11918 <[email protected]>
  • Loading branch information
3 people authored May 29, 2023
1 parent df1e6f7 commit af3c5a2
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 9 deletions.
5 changes: 5 additions & 0 deletions .changeset/strange-socks-give.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': patch
---

Use `AstroError` for `Astro.glob` errors
23 changes: 21 additions & 2 deletions packages/astro/e2e/errors.test.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
import { expect } from '@playwright/test';
import { getErrorOverlayContent, testFactory } from './test-utils.js';
import { getErrorOverlayContent, silentLogging, testFactory } from './test-utils.js';

const test = testFactory({
root: './fixtures/errors/',
// Only test the error overlay, don't print to console
vite: {
logLevel: 'silent',
},
});

let devServer;

test.beforeAll(async ({ astro }) => {
devServer = await astro.startDevServer();
devServer = await astro.startDevServer({
// Only test the error overlay, don't print to console
logging: silentLogging,
});
});

test.afterAll(async ({ astro }) => {
Expand Down Expand Up @@ -89,4 +96,16 @@ test.describe('Error display', () => {

expect(await page.locator('vite-error-overlay').count()).toEqual(0);
});

test('astro glob no match error', async ({ page, astro }) => {
await page.goto(astro.resolveUrl('/astro-glob-no-match'), { waitUntil: 'networkidle' });
const message = (await getErrorOverlayContent(page)).message;
expect(message).toMatch('did not return any matching files');
});

test('astro glob used outside of an astro file', async ({ page, astro }) => {
await page.goto(astro.resolveUrl('/astro-glob-outside-astro'), { waitUntil: 'networkidle' });
const message = (await getErrorOverlayContent(page)).message;
expect(message).toMatch('can only be used in');
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function globSomething(Astro) {
return Astro.glob('./*.lua')
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
---
Astro.glob('./*.lua')
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
import { globSomething } from '../components/AstroGlobOutsideAstro'
globSomething(Astro)
---
2 changes: 2 additions & 0 deletions packages/astro/e2e/test-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { loadFixture as baseLoadFixture } from '../test/test-utils.js';

export const isWindows = process.platform === 'win32';

export { silentLogging } from '../test/test-utils.js';

// Get all test files in directory, assign unique port for each of them so they don't conflict
const testFiles = await fs.readdir(new URL('.', import.meta.url));
const testFileToPort = new Map();
Expand Down
30 changes: 30 additions & 0 deletions packages/astro/src/core/errors/errors-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,36 @@ See https://docs.astro.build/en/guides/server-side-rendering/ for more informati
message: (imageFilePath: string) =>
`\`Image\`'s and \`getImage\`'s \`src\` parameter must be an imported image or an URL, it cannot be a filepath. Received \`${imageFilePath}\`.`,
},

/**
* @docs
* @see
* - [Astro.glob](https://docs.astro.build/en/reference/api-reference/#astroglob)
* @description
* `Astro.glob()` can only be used in `.astro` files. You can use [`import.meta.glob()`](https://vitejs.dev/guide/features.html#glob-import) instead to acheive the same result.
*/
AstroGlobUsedOutside: {
title: 'Astro.glob() used outside of an Astro file.',
code: 3035,
message: (globStr: string) =>
`\`Astro.glob(${globStr})\` can only be used in \`.astro\` files. \`import.meta.glob(${globStr})\` can be used instead to achieve a similar result.`,
hint: "See Vite's documentation on `import.meta.glob` for more information: https://vitejs.dev/guide/features.html#glob-import",
},

/**
* @docs
* @see
* - [Astro.glob](https://docs.astro.build/en/reference/api-reference/#astroglob)
* @description
* `Astro.glob()` did not return any matching files. There might be a typo in the glob pattern.
*/
AstroGlobNoMatch: {
title: 'Astro.glob() did not match any files.',
code: 3036,
message: (globStr: string) =>
`\`Astro.glob(${globStr})\` did not return any matching files. Check the pattern for typos.`,
},

// No headings here, that way Vite errors are merged with Astro ones in the docs, which makes more sense to users.
// Vite Errors - 4xxx
/**
Expand Down
13 changes: 9 additions & 4 deletions packages/astro/src/runtime/server/astro-global.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
import type { AstroGlobalPartial } from '../../@types/astro';
import { ASTRO_VERSION } from '../../core/constants.js';
import { AstroError, AstroErrorData } from '../../core/errors/index.js';

/** Create the Astro.glob() runtime function. */
function createAstroGlobFn() {
const globHandler = (importMetaGlobResult: Record<string, any>, globValue: () => any) => {
if (typeof importMetaGlobResult === 'string') {
throw new Error(
'Astro.glob() does not work outside of an Astro file. Use `import.meta.glob()` instead.'
);
throw new AstroError({
...AstroErrorData.AstroGlobUsedOutside,
message: AstroErrorData.AstroGlobUsedOutside.message(JSON.stringify(importMetaGlobResult)),
});
}
let allEntries = [...Object.values(importMetaGlobResult)];
if (allEntries.length === 0) {
throw new Error(`Astro.glob(${JSON.stringify(globValue())}) - no matches found.`);
throw new AstroError({
...AstroErrorData.AstroGlobNoMatch,
message: AstroErrorData.AstroGlobNoMatch.message(JSON.stringify(importMetaGlobResult)),
});
}
// Map over the `import()` promises, calling to load them.
return Promise.all(allEntries.map((fn) => fn()));
Expand Down
11 changes: 8 additions & 3 deletions packages/astro/test/units/runtime/astro-global.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,13 @@ describe('astro global', () => {
const Astro = createAstro(undefined);
expect(() => {
Astro.glob('./**/*.md');
}).to.throw(
'Astro.glob() does not work outside of an Astro file. Use `import.meta.glob()` instead.'
);
}).to.throw(/can only be used in/);
});

it('Glob should error if has no results', async () => {
const Astro = createAstro(undefined);
expect(() => {
Astro.glob([], () => './**/*.md');
}).to.throw(/did not return any matching files/);
});
});

0 comments on commit af3c5a2

Please sign in to comment.