mirror of
https://github.com/withastro/astro.git
synced 2024-12-16 21:46:22 -05:00
update formatter config (#11640)
* update formatter config * format --------- Co-authored-by: Erika <3019731+Princesseuh@users.noreply.github.com>
This commit is contained in:
parent
85de47cd98
commit
72c7ae9901
492 changed files with 1863 additions and 1848 deletions
|
@ -29,7 +29,7 @@
|
|||
"linter": { "enabled": false },
|
||||
"javascript": {
|
||||
"formatter": {
|
||||
"trailingCommas": "es5",
|
||||
"trailingCommas": "all",
|
||||
"quoteStyle": "single",
|
||||
"semicolons": "always"
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import { getCollection } from 'astro:content';
|
|||
import FormattedDate from '../../components/FormattedDate.astro';
|
||||
|
||||
const posts = (await getCollection('blog')).sort(
|
||||
(a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
|
||||
(a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf(),
|
||||
);
|
||||
---
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ import Hero from '../components/Hero.astro';
|
|||
import Grid from '../components/Grid.astro';
|
||||
|
||||
const projects = (await getCollection('work')).sort(
|
||||
(a, b) => b.data.publishDate.valueOf() - a.data.publishDate.valueOf()
|
||||
(a, b) => b.data.publishDate.valueOf() - a.data.publishDate.valueOf(),
|
||||
);
|
||||
---
|
||||
|
||||
|
|
|
@ -29,6 +29,6 @@ runHighlighterWithAstro(
|
|||
|
||||
<div>{helloAstro}</div>
|
||||
`,
|
||||
'astro'
|
||||
'astro',
|
||||
);
|
||||
```
|
||||
|
|
|
@ -10,7 +10,7 @@ export function addAstro(Prism: typeof import('prismjs')) {
|
|||
scriptLang = 'javascript';
|
||||
// eslint-disable-next-line no-console
|
||||
console.warn(
|
||||
'Prism TypeScript language not loaded, Astro scripts will be treated as JavaScript.'
|
||||
'Prism TypeScript language not loaded, Astro scripts will be treated as JavaScript.',
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,7 @@ export function addAstro(Prism: typeof import('prismjs')) {
|
|||
|
||||
(Prism.languages.astro as any).tag.pattern = re(
|
||||
/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/
|
||||
.source
|
||||
.source,
|
||||
);
|
||||
|
||||
(Prism.languages.astro as any).tag.inside['tag'].pattern = /^<\/?[^\s>/]*/;
|
||||
|
@ -60,7 +60,7 @@ export function addAstro(Prism: typeof import('prismjs')) {
|
|||
inside: Prism.languages.astro,
|
||||
},
|
||||
},
|
||||
(Prism.languages.astro as any).tag
|
||||
(Prism.languages.astro as any).tag,
|
||||
);
|
||||
|
||||
Prism.languages.insertBefore(
|
||||
|
@ -80,7 +80,7 @@ export function addAstro(Prism: typeof import('prismjs')) {
|
|||
alias: `language-${scriptLang}`,
|
||||
},
|
||||
},
|
||||
(Prism.languages.astro as any).tag
|
||||
(Prism.languages.astro as any).tag,
|
||||
);
|
||||
|
||||
// The following will handle plain text inside tags
|
||||
|
|
|
@ -73,8 +73,8 @@ const rssOptionsValidator = z.object({
|
|||
// eslint-disable-next-line
|
||||
console.warn(
|
||||
yellow(
|
||||
'[RSS] Passing a glob result directly has been deprecated. Please migrate to the `pagesGlobToRssItems()` helper: https://docs.astro.build/en/guides/rss/'
|
||||
)
|
||||
'[RSS] Passing a glob result directly has been deprecated. Please migrate to the `pagesGlobToRssItems()` helper: https://docs.astro.build/en/guides/rss/',
|
||||
),
|
||||
);
|
||||
return pagesGlobToRssItems(items);
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ async function validateRssOptions(rssOptions: RSSOptions) {
|
|||
|
||||
return message;
|
||||
}),
|
||||
].join('\n')
|
||||
].join('\n'),
|
||||
);
|
||||
throw formattedError;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ export function pagesGlobToRssItems(items: GlobResult): Promise<ValidatedRSSFeed
|
|||
const { url, frontmatter } = await getInfo();
|
||||
if (url === undefined || url === null) {
|
||||
throw new Error(
|
||||
`[RSS] You can only glob entries within 'src/pages/' when passing import.meta.glob() directly. Consider mapping the result to an array of RSSFeedItems. See the RSS docs for usage examples: https://docs.astro.build/en/guides/rss/#2-list-of-rss-feed-objects`
|
||||
`[RSS] You can only glob entries within 'src/pages/' when passing import.meta.glob() directly. Consider mapping the result to an array of RSSFeedItems. See the RSS docs for usage examples: https://docs.astro.build/en/guides/rss/#2-list-of-rss-feed-objects`,
|
||||
);
|
||||
}
|
||||
const parsedResult = rssSchema
|
||||
|
@ -151,11 +151,11 @@ export function pagesGlobToRssItems(items: GlobResult): Promise<ValidatedRSSFeed
|
|||
[
|
||||
`[RSS] ${filePath} has invalid or missing frontmatter.\nFix the following properties:`,
|
||||
...parsedResult.error.errors.map((zodError) => zodError.message),
|
||||
].join('\n')
|
||||
].join('\n'),
|
||||
);
|
||||
(formattedError as any).file = filePath;
|
||||
throw formattedError;
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -207,7 +207,7 @@ async function generateRSS(rssOptions: ValidatedRSSOptions): Promise<string> {
|
|||
if (typeof rssOptions.customData === 'string')
|
||||
Object.assign(
|
||||
root.rss.channel,
|
||||
parser.parse(`<channel>${rssOptions.customData}</channel>`).channel
|
||||
parser.parse(`<channel>${rssOptions.customData}</channel>`).channel,
|
||||
);
|
||||
// items
|
||||
root.rss.channel.item = items.map((result) => {
|
||||
|
@ -250,7 +250,7 @@ async function generateRSS(rssOptions: ValidatedRSSOptions): Promise<string> {
|
|||
}
|
||||
if (result.source) {
|
||||
item.source = parser.parse(
|
||||
`<source url="${result.source.url}">${result.source.title}</source>`
|
||||
`<source url="${result.source.url}">${result.source.title}</source>`,
|
||||
).source;
|
||||
}
|
||||
if (result.enclosure) {
|
||||
|
@ -258,7 +258,7 @@ async function generateRSS(rssOptions: ValidatedRSSOptions): Promise<string> {
|
|||
? result.enclosure.url
|
||||
: createCanonicalURL(result.enclosure.url, rssOptions.trailingSlash, site);
|
||||
item.enclosure = parser.parse(
|
||||
`<enclosure url="${enclosureURL}" length="${result.enclosure.length}" type="${result.enclosure.type}"/>`
|
||||
`<enclosure url="${enclosureURL}" length="${result.enclosure.length}" type="${result.enclosure.type}"/>`,
|
||||
).enclosure;
|
||||
}
|
||||
return item;
|
||||
|
|
|
@ -5,7 +5,7 @@ import type { RSSOptions } from './index.js';
|
|||
export function createCanonicalURL(
|
||||
url: string,
|
||||
trailingSlash?: RSSOptions['trailingSlash'],
|
||||
base?: string
|
||||
base?: string,
|
||||
): string {
|
||||
let pathname = url.replace(/\/index.html$/, ''); // index.html is not canonical
|
||||
if (!getUrlExtension(url)) {
|
||||
|
|
|
@ -16,7 +16,7 @@ describe('pagesGlobToRssItems', () => {
|
|||
pubDate: phpFeedItem.pubDate,
|
||||
description: phpFeedItem.description,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
'./posts/nested/web1.md': () =>
|
||||
new Promise((resolve) =>
|
||||
|
@ -27,7 +27,7 @@ describe('pagesGlobToRssItems', () => {
|
|||
pubDate: web1FeedItem.pubDate,
|
||||
description: web1FeedItem.description,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
};
|
||||
|
||||
|
@ -49,7 +49,7 @@ describe('pagesGlobToRssItems', () => {
|
|||
|
||||
assert.deepEqual(
|
||||
items.sort((a, b) => a.pubDate - b.pubDate),
|
||||
expected
|
||||
expected,
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -63,7 +63,7 @@ describe('pagesGlobToRssItems', () => {
|
|||
pubDate: phpFeedItem.pubDate,
|
||||
description: phpFeedItem.description,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
};
|
||||
return assert.rejects(pagesGlobToRssItems(globResult));
|
||||
|
@ -80,7 +80,7 @@ describe('pagesGlobToRssItems', () => {
|
|||
pubDate: phpFeedItem.pubDate,
|
||||
description: undefined,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
};
|
||||
return assert.rejects(pagesGlobToRssItems(globResult));
|
||||
|
@ -97,7 +97,7 @@ describe('pagesGlobToRssItems', () => {
|
|||
pubDate: phpFeedItem.pubDate,
|
||||
description: phpFeedItem.description,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
};
|
||||
return assert.doesNotReject(pagesGlobToRssItems(globResult));
|
||||
|
@ -114,7 +114,7 @@ describe('pagesGlobToRssItems', () => {
|
|||
pubDate: phpFeedItem.pubDate,
|
||||
description: undefined,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
};
|
||||
return assert.doesNotReject(pagesGlobToRssItems(globResult));
|
||||
|
|
|
@ -191,7 +191,7 @@ describe('getRssString', () => {
|
|||
pubDate: phpFeedItem.pubDate,
|
||||
description: phpFeedItem.description,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
'./posts/nested/web1.md': () =>
|
||||
new Promise((resolve) =>
|
||||
|
@ -202,7 +202,7 @@ describe('getRssString', () => {
|
|||
pubDate: web1FeedItem.pubDate,
|
||||
description: web1FeedItem.description,
|
||||
},
|
||||
})
|
||||
}),
|
||||
),
|
||||
};
|
||||
|
||||
|
|
|
@ -1127,7 +1127,7 @@
|
|||
export function Like({ postId }: { postId: string }) {
|
||||
const [state, action, pending] = useActionState(
|
||||
experimental_withState(actions.like),
|
||||
0 // initial likes
|
||||
0, // initial likes
|
||||
);
|
||||
|
||||
return (
|
||||
|
@ -1341,7 +1341,7 @@
|
|||
{
|
||||
site: 'https://example.com',
|
||||
trailingSlash: 'never',
|
||||
}
|
||||
},
|
||||
);
|
||||
```
|
||||
|
||||
|
@ -1714,7 +1714,7 @@
|
|||
middleware({
|
||||
redirectToDefaultLocale: false,
|
||||
prefixDefaultLocale: true,
|
||||
})
|
||||
}),
|
||||
);
|
||||
```
|
||||
|
||||
|
@ -1985,7 +1985,7 @@
|
|||
detail: {
|
||||
level: 'warning',
|
||||
},
|
||||
})
|
||||
}),
|
||||
);
|
||||
```
|
||||
|
||||
|
@ -6675,7 +6675,7 @@
|
|||
const hydrate = await load();
|
||||
await hydrate();
|
||||
},
|
||||
{ once: true }
|
||||
{ once: true },
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -8970,7 +8970,7 @@
|
|||
{ darkMode: true },
|
||||
{
|
||||
expires: '1 month',
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
const prefs = Astro.cookies.get<Prefs>('prefs').json();
|
||||
|
|
|
@ -66,7 +66,7 @@ Please upgrade Node.js to a supported version: "${engines}"\n`);
|
|||
}
|
||||
}
|
||||
console.log(
|
||||
`${ci.name} CI Environment Detected!\nAdditional steps may be needed to set your Node.js version:`
|
||||
`${ci.name} CI Environment Detected!\nAdditional steps may be needed to set your Node.js version:`,
|
||||
);
|
||||
console.log(`Documentation: https://docs.astro.build/en/guides/deploy/`);
|
||||
if (CI_INSTRUCTIONS[platform]) {
|
||||
|
|
2
packages/astro/client.d.ts
vendored
2
packages/astro/client.d.ts
vendored
|
@ -50,7 +50,7 @@ declare module 'astro:assets' {
|
|||
* This is functionally equivalent to using the `<Image />` component, as the component calls this function internally.
|
||||
*/
|
||||
getImage: (
|
||||
options: import('./dist/assets/types.js').UnresolvedImageTransform
|
||||
options: import('./dist/assets/types.js').UnresolvedImageTransform,
|
||||
) => Promise<import('./dist/assets/types.js').GetImageResult>;
|
||||
imageConfig: import('./dist/@types/astro.js').AstroConfig['image'];
|
||||
getConfiguredImageService: typeof import('./dist/assets/index.js').getConfiguredImageService;
|
||||
|
|
|
@ -53,8 +53,8 @@ const optimizedImages: GetImageResult[] = await Promise.all(
|
|||
format: format,
|
||||
widths: props.widths,
|
||||
densities: props.densities,
|
||||
})
|
||||
)
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
let resultFallbackFormat = fallbackFormat ?? defaultFallbackFormat;
|
||||
|
|
|
@ -53,7 +53,7 @@ const { fallback = 'animate' } = Astro.props;
|
|||
if (supportsViewTransitions || getFallback() !== 'none') {
|
||||
if (import.meta.env.DEV && window.matchMedia('(prefers-reduced-motion)').matches) {
|
||||
console.warn(
|
||||
`[transitions]: all view transition animations, including fallback animation, are disabled as this device has the prefer-reduced-motion setting enabled.`
|
||||
`[transitions]: all view transition animations, including fallback animation, are disabled as this device has the prefer-reduced-motion setting enabled.`,
|
||||
);
|
||||
}
|
||||
document.addEventListener('click', (ev) => {
|
||||
|
|
2
packages/astro/config.d.ts
vendored
2
packages/astro/config.d.ts
vendored
|
@ -17,7 +17,7 @@ export function defineConfig(config: AstroUserConfig): AstroUserConfig;
|
|||
*/
|
||||
export function getViteConfig(
|
||||
config: ViteUserConfig,
|
||||
inlineAstroConfig?: AstroInlineConfig
|
||||
inlineAstroConfig?: AstroInlineConfig,
|
||||
): ViteUserConfigFn;
|
||||
|
||||
/**
|
||||
|
|
|
@ -20,25 +20,25 @@ test.describe('Astro component HMR', () => {
|
|||
const hero = page.locator('section');
|
||||
await expect(hero, 'hero has background: white').toHaveCSS(
|
||||
'background-color',
|
||||
'rgb(255, 255, 255)'
|
||||
'rgb(255, 255, 255)',
|
||||
);
|
||||
await expect(hero, 'hero has color: black').toHaveCSS('color', 'rgb(0, 0, 0)');
|
||||
|
||||
// Edit the Hero component with a new background color
|
||||
await astro.editFile('./src/components/Hero.astro', (content) =>
|
||||
content.replace('background: white', 'background: rgb(230, 230, 230)')
|
||||
content.replace('background: white', 'background: rgb(230, 230, 230)'),
|
||||
);
|
||||
|
||||
await expect(hero, 'background color updated').toHaveCSS(
|
||||
'background-color',
|
||||
'rgb(230, 230, 230)'
|
||||
'rgb(230, 230, 230)',
|
||||
);
|
||||
});
|
||||
|
||||
test('hoisted scripts', async ({ page, astro }) => {
|
||||
const initialLog = page.waitForEvent(
|
||||
'console',
|
||||
(message) => message.text() === 'Hello, Astro!'
|
||||
(message) => message.text() === 'Hello, Astro!',
|
||||
);
|
||||
|
||||
await page.goto(astro.resolveUrl('/'));
|
||||
|
@ -49,12 +49,12 @@ test.describe('Astro component HMR', () => {
|
|||
|
||||
const updatedLog = page.waitForEvent(
|
||||
'console',
|
||||
(message) => message.text() === 'Hello, updated Astro!'
|
||||
(message) => message.text() === 'Hello, updated Astro!',
|
||||
);
|
||||
|
||||
// Edit the hoisted script on the page
|
||||
await astro.editFile('./src/pages/index.astro', (content) =>
|
||||
content.replace('Hello, Astro!', 'Hello, updated Astro!')
|
||||
content.replace('Hello, Astro!', 'Hello, updated Astro!'),
|
||||
);
|
||||
|
||||
await updatedLog;
|
||||
|
@ -63,7 +63,7 @@ test.describe('Astro component HMR', () => {
|
|||
test('inline scripts', async ({ page, astro }) => {
|
||||
const initialLog = page.waitForEvent(
|
||||
'console',
|
||||
(message) => message.text() === 'Hello, inline Astro!'
|
||||
(message) => message.text() === 'Hello, inline Astro!',
|
||||
);
|
||||
|
||||
await page.goto(astro.resolveUrl('/'));
|
||||
|
@ -71,12 +71,12 @@ test.describe('Astro component HMR', () => {
|
|||
|
||||
const updatedLog = page.waitForEvent(
|
||||
'console',
|
||||
(message) => message.text() === 'Hello, updated inline Astro!'
|
||||
(message) => message.text() === 'Hello, updated inline Astro!',
|
||||
);
|
||||
|
||||
// Edit the inline script on the page
|
||||
await astro.editFile('./src/pages/index.astro', (content) =>
|
||||
content.replace('Hello, inline Astro!', 'Hello, updated inline Astro!')
|
||||
content.replace('Hello, inline Astro!', 'Hello, updated inline Astro!'),
|
||||
);
|
||||
|
||||
await updatedLog;
|
||||
|
@ -89,7 +89,7 @@ test.describe('Astro component HMR', () => {
|
|||
await Promise.all([
|
||||
page.waitForLoadState('networkidle'),
|
||||
await astro.editFile('../_deps/astro-linked-lib/Component.astro', (content) =>
|
||||
content.replace('>astro-linked-lib<', '>astro-linked-lib-update<')
|
||||
content.replace('>astro-linked-lib<', '>astro-linked-lib-update<'),
|
||||
),
|
||||
]);
|
||||
h1 = page.locator('#astro-linked-lib');
|
||||
|
@ -103,7 +103,7 @@ test.describe('Astro component HMR', () => {
|
|||
await Promise.all([
|
||||
page.waitForLoadState('networkidle'),
|
||||
await astro.editFile('../_deps/astro-linked-lib/Component.astro', (content) =>
|
||||
content.replace('color: red', 'color: green')
|
||||
content.replace('color: red', 'color: green'),
|
||||
),
|
||||
]);
|
||||
h1 = page.locator('#astro-linked-lib');
|
||||
|
|
|
@ -35,7 +35,7 @@ test.describe('Astro Environment BASE_URL', () => {
|
|||
|
||||
const clientComponentBaseUrl = page.locator('id=client-component-base-url');
|
||||
await expect(clientComponentBaseUrl, 'clientComponentBaseUrl equals to /blog').toHaveText(
|
||||
'/blog'
|
||||
'/blog',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -19,7 +19,7 @@ test.describe('Content Collections', () => {
|
|||
await page.goto(astro.resolveUrl('/'));
|
||||
|
||||
await astro.editFile('./src/components/MyComponent.astro', (original) =>
|
||||
original.replace('red', 'green')
|
||||
original.replace('red', 'green'),
|
||||
);
|
||||
|
||||
const h1 = page.locator('#my-heading');
|
||||
|
|
|
@ -26,7 +26,7 @@ test.describe('CSS HMR', () => {
|
|||
await expect(h).toHaveCSS('color', 'rgb(255, 0, 0)');
|
||||
|
||||
await astro.editFile('./src/styles/main.css', (original) =>
|
||||
original.replace('--h1-color: red;', '--h1-color: green;')
|
||||
original.replace('--h1-color: red;', '--h1-color: green;'),
|
||||
);
|
||||
|
||||
await expect(h).toHaveCSS('color', 'rgb(0, 128, 0)');
|
||||
|
|
|
@ -98,7 +98,7 @@ function testClientDirectivesShared() {
|
|||
|
||||
const clientOptions = page.locator('#options');
|
||||
await expect(clientOptions).toHaveText(
|
||||
'Passed options are: {"message":"Hello! I was passed as an option"}'
|
||||
'Passed options are: {"message":"Hello! I was passed as an option"}',
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ test.describe('Dev Toolbar - Audits', () => {
|
|||
'astro:dev-toolbar:settings',
|
||||
JSON.stringify({
|
||||
verbose: true,
|
||||
})
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -93,7 +93,7 @@ test.describe('Dev Toolbar - Audits', () => {
|
|||
const badButton = page.locator('#bad-button');
|
||||
|
||||
let consolePromise = page.waitForEvent('console', (msg) =>
|
||||
msg.text().includes('Rerunning audit lints')
|
||||
msg.text().includes('Rerunning audit lints'),
|
||||
);
|
||||
await badButton.click({ clickCount: 5 });
|
||||
await consolePromise;
|
||||
|
@ -102,7 +102,7 @@ test.describe('Dev Toolbar - Audits', () => {
|
|||
|
||||
expect(
|
||||
logs.filter((log) => log.includes('Rerunning audit lints because the DOM has been updated'))
|
||||
.length === 1
|
||||
.length === 1,
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
|
@ -114,7 +114,7 @@ test.describe('Dev Toolbar - Audits', () => {
|
|||
'astro:dev-toolbar:settings',
|
||||
JSON.stringify({
|
||||
verbose: true,
|
||||
})
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
|
@ -153,7 +153,7 @@ test.describe('Dev Toolbar - Audits', () => {
|
|||
// Make sure we only reran audits once
|
||||
expect(
|
||||
logs.filter((log) => log.includes('Rerunning audit lints because the DOM has been updated'))
|
||||
.length === 1
|
||||
.length === 1,
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ test.describe('Dev Toolbar', () => {
|
|||
await appButton.click();
|
||||
|
||||
const astroAppCanvas = toolbar.locator(
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:home"]'
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:home"]',
|
||||
);
|
||||
const astroWindow = astroAppCanvas.locator('astro-dev-toolbar-window');
|
||||
await expect(astroWindow).toHaveCount(1);
|
||||
|
@ -152,7 +152,7 @@ test.describe('Dev Toolbar', () => {
|
|||
|
||||
const code = xrayHighlightTooltip.locator('pre > code');
|
||||
await expect(code).toHaveText(
|
||||
JSON.stringify({ name: `<img src='' onerror='alert(1)'>` }, undefined, 2)
|
||||
JSON.stringify({ name: `<img src='' onerror='alert(1)'>` }, undefined, 2),
|
||||
);
|
||||
expect(isAlertCalled).toBe(false);
|
||||
});
|
||||
|
@ -264,7 +264,7 @@ test.describe('Dev Toolbar', () => {
|
|||
await appButton.click();
|
||||
|
||||
const settingsAppCanvas = toolbar.locator(
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]'
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]',
|
||||
);
|
||||
const settingsWindow = settingsAppCanvas.locator('astro-dev-toolbar-window');
|
||||
await expect(settingsWindow).toHaveCount(1);
|
||||
|
@ -283,7 +283,7 @@ test.describe('Dev Toolbar', () => {
|
|||
await appButton.click();
|
||||
|
||||
const settingsAppCanvas = toolbar.locator(
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]'
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]',
|
||||
);
|
||||
const settingsWindow = settingsAppCanvas.locator('astro-dev-toolbar-window');
|
||||
await expect(settingsWindow).toHaveCount(1);
|
||||
|
@ -294,7 +294,7 @@ test.describe('Dev Toolbar', () => {
|
|||
await appButton.click();
|
||||
|
||||
const astroAppCanvas = toolbar.locator(
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:home"]'
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:home"]',
|
||||
);
|
||||
const astroWindow = astroAppCanvas.locator('astro-dev-toolbar-window');
|
||||
await expect(astroWindow).toHaveCount(1);
|
||||
|
@ -311,7 +311,7 @@ test.describe('Dev Toolbar', () => {
|
|||
await appButton.click();
|
||||
|
||||
const settingsAppCanvas = toolbar.locator(
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]'
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]',
|
||||
);
|
||||
const settingsWindow = settingsAppCanvas.locator('astro-dev-toolbar-window');
|
||||
await expect(settingsWindow).toHaveCount(1);
|
||||
|
@ -389,7 +389,7 @@ test.describe('Dev Toolbar', () => {
|
|||
await settingsAppButton.click();
|
||||
|
||||
const settingsAppCanvas = toolbar.locator(
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]'
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]',
|
||||
);
|
||||
const settingsWindow = settingsAppCanvas.locator('astro-dev-toolbar-window');
|
||||
await expect(settingsWindow).toBeVisible();
|
||||
|
@ -423,7 +423,7 @@ test.describe('Dev Toolbar', () => {
|
|||
await settingsAppButton.click();
|
||||
|
||||
const settingsAppCanvas = toolbar.locator(
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]'
|
||||
'astro-dev-toolbar-app-canvas[data-app-id="astro:settings"]',
|
||||
);
|
||||
const settingsWindow = settingsAppCanvas.locator('astro-dev-toolbar-window');
|
||||
await expect(settingsWindow).toBeVisible();
|
||||
|
|
|
@ -33,7 +33,7 @@ test.describe('Error display', () => {
|
|||
// Edit the component file
|
||||
await astro.editFile(
|
||||
'./src/pages/astro-syntax-error.astro',
|
||||
() => `<h1>No syntax error</h1>`
|
||||
() => `<h1>No syntax error</h1>`,
|
||||
),
|
||||
]);
|
||||
|
||||
|
@ -107,7 +107,7 @@ test.describe('Error display', () => {
|
|||
// Edit the component file
|
||||
astro.editFile(
|
||||
'./src/components/svelte/SvelteSyntaxError.svelte',
|
||||
() => `<h1>No mismatch</h1>`
|
||||
() => `<h1>No mismatch</h1>`,
|
||||
),
|
||||
]);
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ test.describe('Scripts with dependencies', () => {
|
|||
await expect(h, 'original text set').toHaveText('before');
|
||||
|
||||
await astro.editFile('./src/scripts/heading.js', (original) =>
|
||||
original.replace('before', 'after')
|
||||
original.replace('before', 'after'),
|
||||
);
|
||||
|
||||
await expect(h, 'text changed').toHaveText('after');
|
||||
|
@ -64,7 +64,7 @@ test.describe('Styles', () => {
|
|||
await expect(h).toHaveCSS('color', 'rgb(0, 0, 255)');
|
||||
|
||||
await astro.editFile('./src/styles/css-external.css', (original) =>
|
||||
original.replace('blue', 'red')
|
||||
original.replace('blue', 'red'),
|
||||
);
|
||||
|
||||
await expect(h).toHaveCSS('color', 'rgb(255, 0, 0)');
|
||||
|
|
|
@ -118,13 +118,13 @@ test.describe('Lit components', () => {
|
|||
|
||||
// Light DOM reconstructed correctly (slots are rendered alphabetically) and shadow dom content rendered
|
||||
await expect(label, 'slotted text is in DOM').toHaveText(
|
||||
'Framework client:only component Should not be visible Shadow dom default content should not be visible'
|
||||
'Framework client:only component Should not be visible Shadow dom default content should not be visible',
|
||||
);
|
||||
|
||||
// Projected content should be visible
|
||||
await expect(
|
||||
page.locator('#client-only .default'),
|
||||
'slotted element is visible'
|
||||
'slotted element is visible',
|
||||
).toBeVisible();
|
||||
await expect(page.locator('#client-only .foo1'), 'slotted element is visible').toBeVisible();
|
||||
await expect(page.locator('#client-only .foo2'), 'slotted element is visible').toBeVisible();
|
||||
|
@ -132,13 +132,13 @@ test.describe('Lit components', () => {
|
|||
// Non-projected content should not be visible
|
||||
await expect(
|
||||
page.locator('#client-only [slot="quux"]'),
|
||||
'element without slot is not visible'
|
||||
'element without slot is not visible',
|
||||
).toBeHidden();
|
||||
|
||||
// Default slot content should not be visible
|
||||
await expect(
|
||||
page.locator('#client-only .defaultContent'),
|
||||
'element without slot is not visible'
|
||||
'element without slot is not visible',
|
||||
).toBeHidden();
|
||||
});
|
||||
|
||||
|
@ -149,7 +149,7 @@ test.describe('Lit components', () => {
|
|||
const label = counter.locator('h1');
|
||||
|
||||
await astro.editFile('./src/pages/index.astro', (original) =>
|
||||
original.replace('Hello, client:idle!', 'Hello, updated client:idle!')
|
||||
original.replace('Hello, client:idle!', 'Hello, updated client:idle!'),
|
||||
);
|
||||
|
||||
await expect(label, 'slot text updated').toHaveText('Hello, updated client:idle!');
|
||||
|
|
|
@ -109,7 +109,7 @@ test.skip('Multiple frameworks', () => {
|
|||
await expect(slot, 'initial slot content').toHaveText('Hello Preact!');
|
||||
|
||||
await astro.editFile('./src/pages/index.astro', (content) =>
|
||||
content.replace('Hello Preact!', 'Hello Preact, updated!')
|
||||
content.replace('Hello Preact!', 'Hello Preact, updated!'),
|
||||
);
|
||||
|
||||
await expect(slot, 'slot content updated').toHaveText('Hello Preact, updated!');
|
||||
|
@ -122,7 +122,7 @@ test.skip('Multiple frameworks', () => {
|
|||
await expect(count, 'initial count updated to 0').toHaveText('0');
|
||||
|
||||
await astro.editFile('./src/components/ReactCounter.jsx', (content) =>
|
||||
content.replace('useState(0)', 'useState(5)')
|
||||
content.replace('useState(0)', 'useState(5)'),
|
||||
);
|
||||
|
||||
await expect(count, 'initial count updated to 5').toHaveText('5');
|
||||
|
@ -135,7 +135,7 @@ test.skip('Multiple frameworks', () => {
|
|||
await expect(count, 'initial count updated to 0').toHaveText('0');
|
||||
|
||||
await astro.editFile('./src/components/PreactCounter.tsx', (content) =>
|
||||
content.replace('useState(0)', 'useState(5)')
|
||||
content.replace('useState(0)', 'useState(5)'),
|
||||
);
|
||||
|
||||
await expect(count, 'initial count updated to 5').toHaveText('5');
|
||||
|
@ -148,7 +148,7 @@ test.skip('Multiple frameworks', () => {
|
|||
await expect(count, 'initial count updated to 0').toHaveText('0');
|
||||
|
||||
await astro.editFile('./src/components/SolidCounter.tsx', (content) =>
|
||||
content.replace('createSignal(0)', 'createSignal(5)')
|
||||
content.replace('createSignal(0)', 'createSignal(5)'),
|
||||
);
|
||||
|
||||
await expect(count, 'initial count updated to 5').toHaveText('5');
|
||||
|
@ -161,7 +161,7 @@ test.skip('Multiple frameworks', () => {
|
|||
await expect(count, 'initial count updated to 0').toHaveText('0');
|
||||
|
||||
await astro.editFile('./src/components/VueCounter.vue', (content) =>
|
||||
content.replace('ref(0)', 'ref(5)')
|
||||
content.replace('ref(0)', 'ref(5)'),
|
||||
);
|
||||
|
||||
await expect(count, 'initial count updated to 5').toHaveText('5');
|
||||
|
@ -174,7 +174,7 @@ test.skip('Multiple frameworks', () => {
|
|||
await expect(count, 'initial count is 0').toHaveText('0');
|
||||
|
||||
await astro.editFile('./src/components/SvelteCounter.svelte', (content) =>
|
||||
content.replace('let count = 0;', 'let count = 5;')
|
||||
content.replace('let count = 0;', 'let count = 5;'),
|
||||
);
|
||||
|
||||
await expect(count, 'initial count updated to 5').toHaveText('5');
|
||||
|
|
|
@ -34,7 +34,7 @@ test.describe('Loading styles that are nested', () => {
|
|||
|
||||
await expect(header, 'should have background color').toHaveCSS(
|
||||
'background-color',
|
||||
'rgb(0, 0, 139)' // darkblue
|
||||
'rgb(0, 0, 139)', // darkblue
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -40,7 +40,7 @@ async function expectUrlPrefetched(url, page, count) {
|
|||
const fetchCount = reqUrls.filter((u) => u.includes(url)).length;
|
||||
expect(
|
||||
fetchCount,
|
||||
`${url} should be prefetched ${count} time(s), but is prefetch with link ${linkCount} time(s) and with fetch ${fetchCount} time(s)`
|
||||
`${url} should be prefetched ${count} time(s), but is prefetch with link ${linkCount} time(s) and with fetch ${fetchCount} time(s)`,
|
||||
).toEqual(count);
|
||||
}
|
||||
}
|
||||
|
@ -344,7 +344,7 @@ test.describe('Prefetch (default), Experimental ({ clientPrerender: true })', ()
|
|||
expect(await scriptIsInHead(page, '?search-param=true')).toBeFalsy();
|
||||
await page.locator('#prefetch-search-param').hover();
|
||||
await page.waitForFunction(
|
||||
() => document.querySelectorAll('script[type=speculationrules]').length === 2
|
||||
() => document.querySelectorAll('script[type=speculationrules]').length === 2,
|
||||
);
|
||||
expect(await scriptIsInHead(page, '?search-param=true')).toBeTruthy();
|
||||
});
|
||||
|
@ -361,7 +361,7 @@ test.describe('Prefetch (default), Experimental ({ clientPrerender: true })', ()
|
|||
expect(await scriptIsInHead(page, '/prefetch-hover')).toBeFalsy();
|
||||
await page.locator('#prefetch-hover').hover();
|
||||
await page.waitForFunction(
|
||||
() => document.querySelectorAll('script[type=speculationrules]').length === 2
|
||||
() => document.querySelectorAll('script[type=speculationrules]').length === 2,
|
||||
);
|
||||
expect(await scriptIsInHead(page, '/prefetch-hover')).toBeTruthy();
|
||||
});
|
||||
|
@ -372,7 +372,7 @@ test.describe('Prefetch (default), Experimental ({ clientPrerender: true })', ()
|
|||
// Scroll down to show the element
|
||||
await page.locator('#prefetch-viewport').scrollIntoViewIfNeeded();
|
||||
await page.waitForFunction(
|
||||
() => document.querySelectorAll('script[type=speculationrules]').length === 2
|
||||
() => document.querySelectorAll('script[type=speculationrules]').length === 2,
|
||||
);
|
||||
expect(await scriptIsInHead(page, '/prefetch-viewport')).toBeTruthy();
|
||||
});
|
||||
|
|
|
@ -134,7 +134,7 @@ export function prepareTestFactory(opts, { canReplayClicks = false } = {}) {
|
|||
|
||||
// Edit the component's initial count prop
|
||||
await astro.editFile(pageSourceFilePath, (original) =>
|
||||
original.replace('id="client-idle" {...someProps}', 'id="client-idle" count={5}')
|
||||
original.replace('id="client-idle" {...someProps}', 'id="client-idle" count={5}'),
|
||||
);
|
||||
|
||||
await expect(count, 'count prop updated').toHaveText('5', { timeout: 10000 });
|
||||
|
@ -144,19 +144,19 @@ export function prepareTestFactory(opts, { canReplayClicks = false } = {}) {
|
|||
await astro.editFile(componentFilePath, (original) =>
|
||||
original.replace(
|
||||
'Framework client:only component',
|
||||
'Updated framework client:only component'
|
||||
)
|
||||
'Updated framework client:only component',
|
||||
),
|
||||
);
|
||||
|
||||
const label = page.locator('#client-only');
|
||||
await expect(label, 'client:only component is visible').toBeVisible();
|
||||
await expect(label, 'client:only slot text is visible').toHaveText(
|
||||
'Updated framework client:only component'
|
||||
'Updated framework client:only component',
|
||||
);
|
||||
|
||||
// Edit the imported CSS file
|
||||
await astro.editFile(counterCssFilePath || './src/components/Counter.css', (original) =>
|
||||
original.replace('font-size: 2em;', 'font-size: 24px;')
|
||||
original.replace('font-size: 2em;', 'font-size: 24px;'),
|
||||
);
|
||||
|
||||
await expect(count, 'imported CSS updated').toHaveCSS('font-size', '24px');
|
||||
|
|
|
@ -4,7 +4,7 @@ const { test, createTests } = prepareTestFactory(
|
|||
{ root: './fixtures/solid-component/' },
|
||||
{
|
||||
canReplayClicks: true,
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
const config = {
|
||||
|
|
|
@ -23,7 +23,7 @@ test.describe('Tailwind CSS', () => {
|
|||
await expect(body, 'should have classes').toHaveClass('bg-dawn text-midnight');
|
||||
await expect(body, 'should have background color').toHaveCSS(
|
||||
'background-color',
|
||||
'rgb(243, 233, 250)'
|
||||
'rgb(243, 233, 250)',
|
||||
);
|
||||
await expect(body, 'should have color').toHaveCSS('color', 'rgb(49, 39, 74)');
|
||||
});
|
||||
|
@ -37,13 +37,13 @@ test.describe('Tailwind CSS', () => {
|
|||
await expect(button, 'should have appearance: none').toHaveCSS('appearance', 'none');
|
||||
await expect(button, 'should have appearance-none with webkit prefix').toHaveCSS(
|
||||
'-webkit-appearance',
|
||||
'none'
|
||||
'none',
|
||||
);
|
||||
|
||||
await expect(button, 'should have bg-purple-600').toHaveClass(/bg-purple-600/);
|
||||
await expect(button, 'should have background color').toHaveCSS(
|
||||
'background-color',
|
||||
'rgb(147, 51, 234)'
|
||||
'rgb(147, 51, 234)',
|
||||
);
|
||||
|
||||
await expect(button, 'should have lg:py-3').toHaveClass(/lg:py-3/);
|
||||
|
@ -58,7 +58,7 @@ test.describe('Tailwind CSS', () => {
|
|||
await page.goto(astro.resolveUrl('/'));
|
||||
|
||||
await astro.editFile('./src/components/Button.astro', (original) =>
|
||||
original.replace('bg-purple-600', 'bg-purple-400')
|
||||
original.replace('bg-purple-600', 'bg-purple-400'),
|
||||
);
|
||||
|
||||
const button = page.locator('button');
|
||||
|
@ -66,7 +66,7 @@ test.describe('Tailwind CSS', () => {
|
|||
await expect(button, 'should have bg-purple-400').toHaveClass(/bg-purple-400/);
|
||||
await expect(button, 'should have background color').toHaveCSS(
|
||||
'background-color',
|
||||
'rgb(192, 132, 252)'
|
||||
'rgb(192, 132, 252)',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -84,7 +84,7 @@ export async function waitForHydrate(page, el) {
|
|||
const astroIslandId = await astroIsland.last().getAttribute('uid');
|
||||
await page.waitForFunction(
|
||||
(selector) => document.querySelector(selector)?.hasAttribute('ssr') === false,
|
||||
`astro-island[uid="${astroIslandId}"]`
|
||||
`astro-island[uid="${astroIslandId}"]`,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ function collectPreloads(page) {
|
|||
mutations.forEach((mutation) =>
|
||||
mutation.addedNodes.forEach((node) => {
|
||||
if (node.nodeName === 'LINK' && node.rel === 'preload') preloads.push(node.href);
|
||||
})
|
||||
}),
|
||||
);
|
||||
});
|
||||
observer.observe(document.head, { childList: true });
|
||||
|
@ -132,7 +132,7 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be 2 page loads. The original, then going from 3 to 2'
|
||||
'There should be 2 page loads. The original, then going from 3 to 2',
|
||||
).toEqual(2);
|
||||
});
|
||||
|
||||
|
@ -163,7 +163,7 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be only 2 page loads (for page one & three), but no additional loads for the hash change'
|
||||
'There should be only 2 page loads (for page one & three), but no additional loads for the hash change',
|
||||
).toEqual(2);
|
||||
});
|
||||
|
||||
|
@ -185,7 +185,7 @@ test.describe('View Transitions', () => {
|
|||
await expect(p, 'should have content').toHaveText('Page 1');
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be 3 page loads (for page one & three), and an additional loads for the back navigation'
|
||||
'There should be 3 page loads (for page one & three), and an additional loads for the back navigation',
|
||||
).toEqual(3);
|
||||
});
|
||||
|
||||
|
@ -628,7 +628,7 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be only 1 page load. No additional loads for going back on same page'
|
||||
'There should be only 1 page load. No additional loads for going back on same page',
|
||||
).toEqual(1);
|
||||
});
|
||||
|
||||
|
@ -770,7 +770,7 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should only be the initial page load and two normal transitions'
|
||||
'There should only be the initial page load and two normal transitions',
|
||||
).toEqual(1);
|
||||
});
|
||||
|
||||
|
@ -1030,7 +1030,7 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be only 1 page load. No additional loads for the form submission'
|
||||
'There should be only 1 page load. No additional loads for the form submission',
|
||||
).toEqual(1);
|
||||
});
|
||||
|
||||
|
@ -1056,7 +1056,7 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be only 1 page load. No additional loads for the form submission'
|
||||
'There should be only 1 page load. No additional loads for the form submission',
|
||||
).toEqual(1);
|
||||
});
|
||||
|
||||
|
@ -1075,7 +1075,7 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be only 1 page load. No additional loads for the form submission'
|
||||
'There should be only 1 page load. No additional loads for the form submission',
|
||||
).toEqual(1);
|
||||
});
|
||||
|
||||
|
@ -1104,12 +1104,12 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be only 1 page load. No additional loads for the form submission'
|
||||
'There should be only 1 page load. No additional loads for the form submission',
|
||||
).toEqual(1);
|
||||
|
||||
expect(
|
||||
postedEncodings,
|
||||
'There should be 1 POST, with encoding set to `multipart/form-data`'
|
||||
'There should be 1 POST, with encoding set to `multipart/form-data`',
|
||||
).toEqual(['multipart/form-data']);
|
||||
});
|
||||
|
||||
|
@ -1130,8 +1130,8 @@ test.describe('View Transitions', () => {
|
|||
|
||||
await page.goto(
|
||||
astro.resolveUrl(
|
||||
`/form-one?${new URLSearchParams({ enctype: 'application/x-www-form-urlencoded' })}`
|
||||
)
|
||||
`/form-one?${new URLSearchParams({ enctype: 'application/x-www-form-urlencoded' })}`,
|
||||
),
|
||||
);
|
||||
|
||||
// Submit the form
|
||||
|
@ -1139,12 +1139,12 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be only 1 page load. No additional loads for the form submission'
|
||||
'There should be only 1 page load. No additional loads for the form submission',
|
||||
).toEqual(1);
|
||||
|
||||
expect(
|
||||
postedEncodings,
|
||||
'There should be 1 POST, with encoding set to `multipart/form-data`'
|
||||
'There should be 1 POST, with encoding set to `multipart/form-data`',
|
||||
).toEqual(['application/x-www-form-urlencoded']);
|
||||
});
|
||||
|
||||
|
@ -1216,7 +1216,7 @@ test.describe('View Transitions', () => {
|
|||
|
||||
expect(
|
||||
loads.length,
|
||||
'There should be only 1 page load. No additional loads for the form submission'
|
||||
'There should be only 1 page load. No additional loads for the form submission',
|
||||
).toEqual(1);
|
||||
});
|
||||
|
||||
|
@ -1333,7 +1333,7 @@ test.describe('View Transitions', () => {
|
|||
expectedAnimations.add(name);
|
||||
expect(page.locator(selector), 'should be escaped correctly').toHaveCSS(
|
||||
'view-transition-name',
|
||||
name
|
||||
name,
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -1361,36 +1361,36 @@ test.describe('View Transitions', () => {
|
|||
await checkName('#thirteen', '___01____02______');
|
||||
await checkName(
|
||||
'#batch0',
|
||||
'__00_01_02_03_04_05_06_07_08_09_0a_0b_0c_0d_0e_0f_10_11_12_13_14_15_16_17_18_19_1a_1b_1c_1d_1e_1f'
|
||||
'__00_01_02_03_04_05_06_07_08_09_0a_0b_0c_0d_0e_0f_10_11_12_13_14_15_16_17_18_19_1a_1b_1c_1d_1e_1f',
|
||||
);
|
||||
await checkName(
|
||||
'#batch1',
|
||||
'__20_21_22_23_24_25_26_27_28_29_2a_2b_2c-_2e_2f0123456789_3a_3b_3c_3d_3e_3f'
|
||||
'__20_21_22_23_24_25_26_27_28_29_2a_2b_2c-_2e_2f0123456789_3a_3b_3c_3d_3e_3f',
|
||||
);
|
||||
await checkName('#batch2', '__40ABCDEFGHIJKLMNOPQRSTUVWXYZ_5b_5c_5d_5e__');
|
||||
await checkName('#batch3', '__60abcdefghijklmnopqrstuvwxyz_7b_7c_7d_7e_7f');
|
||||
await checkName(
|
||||
'#batch4',
|
||||
'\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f'
|
||||
'\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f',
|
||||
);
|
||||
await checkName(
|
||||
'#batch5',
|
||||
'\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf'
|
||||
'\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf',
|
||||
);
|
||||
await checkName(
|
||||
'#batch6',
|
||||
'\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf'
|
||||
'\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf',
|
||||
);
|
||||
await checkName(
|
||||
'#batch7',
|
||||
'\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
|
||||
'\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff',
|
||||
);
|
||||
|
||||
await page.click('#navigate');
|
||||
await page.waitForTimeout(400); // yes, I dislike this, too. Might fix later.
|
||||
expect(
|
||||
expectedAnimations.size,
|
||||
'all animations for transition:names should have been found'
|
||||
'all animations for transition:names should have been found',
|
||||
).toEqual(0);
|
||||
});
|
||||
|
||||
|
@ -1425,7 +1425,7 @@ test.describe('View Transitions', () => {
|
|||
const attributeValue = await page.$eval(
|
||||
':root',
|
||||
(element, attributeName) => element.getAttribute(attributeName),
|
||||
'data-theme'
|
||||
'data-theme',
|
||||
);
|
||||
expect(attributeValue).toBe('purple');
|
||||
});
|
||||
|
|
|
@ -47,7 +47,7 @@ test('hmr works', async ({ page, astro }) => {
|
|||
await expect(span).toHaveText('Count is 1');
|
||||
|
||||
await astro.editFile('./src/components/State.vue', (content) =>
|
||||
content.replace('ref(1)', 'ref(2)')
|
||||
content.replace('ref(1)', 'ref(2)'),
|
||||
);
|
||||
|
||||
await expect(span).toHaveText('Count is 2');
|
||||
|
|
|
@ -74,8 +74,8 @@ async function benchmark({ fixtures, templates, numPosts }) {
|
|||
const fixtures = formats.filter((format) => format !== 'md');
|
||||
console.log(
|
||||
`\n${bold('With Astro components')} ${dim(
|
||||
`${numPosts} posts (${formatsToString(fixtures)})`
|
||||
)}`
|
||||
`${numPosts} posts (${formatsToString(fixtures)})`,
|
||||
)}`,
|
||||
);
|
||||
process.env.ASTRO_PERFORMANCE_TEST_NAME = 'with-astro-components';
|
||||
await benchmark({
|
||||
|
@ -92,8 +92,8 @@ async function benchmark({ fixtures, templates, numPosts }) {
|
|||
const fixtures = formats.filter((format) => format !== 'md');
|
||||
console.log(
|
||||
`\n${bold('With React components')} ${dim(
|
||||
`${numPosts} posts (${formatsToString(fixtures)})`
|
||||
)}`
|
||||
`${numPosts} posts (${formatsToString(fixtures)})`,
|
||||
)}`,
|
||||
);
|
||||
process.env.ASTRO_PERFORMANCE_TEST_NAME = 'with-react-components';
|
||||
await benchmark({
|
||||
|
|
|
@ -23,8 +23,8 @@ export async function generatePosts({
|
|||
Array.from(Array(numPosts).keys()).map((idx) => {
|
||||
return fs.promises.writeFile(
|
||||
`${postsDir}/post-${idx}${ext.startsWith('.') ? ext : `.${ext}`}`,
|
||||
fs.readFileSync(new URL(`./templates/${template}`, import.meta.url), 'utf8')
|
||||
fs.readFileSync(new URL(`./templates/${template}`, import.meta.url), 'utf8'),
|
||||
);
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -378,7 +378,7 @@ export interface AstroGlobalPartial {
|
|||
*/
|
||||
glob(globStr: `${any}.astro`): Promise<AstroInstance[]>;
|
||||
glob<T extends Record<string, any>>(
|
||||
globStr: `${any}${MarkdowFileExtension}`
|
||||
globStr: `${any}${MarkdowFileExtension}`,
|
||||
): Promise<MarkdownInstance<T>[]>;
|
||||
glob<T extends Record<string, any>>(globStr: `${any}.mdx`): Promise<MDXInstance<T>[]>;
|
||||
glob<T extends Record<string, any>>(globStr: string): Promise<T[]>;
|
||||
|
@ -2300,7 +2300,7 @@ export interface ContentEntryType {
|
|||
contents: string;
|
||||
fileUrl: URL;
|
||||
viteId: string;
|
||||
}
|
||||
},
|
||||
): rollup.LoadResult | Promise<rollup.LoadResult>;
|
||||
contentModuleTypes?: string;
|
||||
/**
|
||||
|
@ -2385,7 +2385,7 @@ export type AsyncRendererComponentFn<U> = (
|
|||
Component: any,
|
||||
props: any,
|
||||
slots: Record<string, string>,
|
||||
metadata?: AstroComponentMetadata
|
||||
metadata?: AstroComponentMetadata,
|
||||
) => Promise<U>;
|
||||
|
||||
/** Generic interface for a component (Astro, Svelte, React, etc.) */
|
||||
|
@ -2470,7 +2470,7 @@ export type GetStaticPathsResultKeyed = GetStaticPathsResult & {
|
|||
* [Astro Reference](https://docs.astro.build/en/reference/api-reference/#getstaticpaths)
|
||||
*/
|
||||
export type GetStaticPaths = (
|
||||
options: GetStaticPathsOptions
|
||||
options: GetStaticPathsOptions,
|
||||
) => Promise<GetStaticPathsResult> | GetStaticPathsResult;
|
||||
|
||||
/**
|
||||
|
@ -2493,7 +2493,7 @@ export type GetStaticPaths = (
|
|||
* ```
|
||||
*/
|
||||
export type InferGetStaticParamsType<T> = T extends (
|
||||
opts?: GetStaticPathsOptions
|
||||
opts?: GetStaticPathsOptions,
|
||||
) => infer R | Promise<infer R>
|
||||
? R extends Array<infer U>
|
||||
? U extends { params: infer P }
|
||||
|
@ -2526,7 +2526,7 @@ export type InferGetStaticParamsType<T> = T extends (
|
|||
* ```
|
||||
*/
|
||||
export type InferGetStaticPropsType<T> = T extends (
|
||||
opts: GetStaticPathsOptions
|
||||
opts: GetStaticPathsOptions,
|
||||
) => infer R | Promise<infer R>
|
||||
? R extends Array<infer U>
|
||||
? U extends { props: infer P }
|
||||
|
@ -2639,7 +2639,7 @@ export type PaginateFunction = <
|
|||
AdditionalPaginateParams extends Params,
|
||||
>(
|
||||
data: PaginateData[],
|
||||
args?: PaginateOptions<AdditionalPaginateProps, AdditionalPaginateParams>
|
||||
args?: PaginateOptions<AdditionalPaginateProps, AdditionalPaginateParams>,
|
||||
) => {
|
||||
params: Simplify<
|
||||
{
|
||||
|
@ -2755,7 +2755,7 @@ interface AstroSharedContext<
|
|||
TInputSchema extends ActionInputSchema<TAccept>,
|
||||
TAction extends ActionClient<unknown, TAccept, TInputSchema>,
|
||||
>(
|
||||
action: TAction
|
||||
action: TAction,
|
||||
) => ActionReturnType<TAction> | undefined;
|
||||
/**
|
||||
* Call action handler from the server.
|
||||
|
@ -2769,7 +2769,7 @@ interface AstroSharedContext<
|
|||
| ActionClient<TOutput, TAccept, TInputSchema>['orThrow'],
|
||||
>(
|
||||
action: TAction,
|
||||
input: Parameters<TAction>[0]
|
||||
input: Parameters<TAction>[0],
|
||||
) => Promise<ActionReturnType<TAction>>;
|
||||
/**
|
||||
* Route parameters for this request if this is a dynamic route.
|
||||
|
@ -3142,7 +3142,7 @@ export type RewritePayload = string | URL | Request;
|
|||
export type MiddlewareNext = (rewritePayload?: RewritePayload) => Promise<Response>;
|
||||
export type MiddlewareHandler = (
|
||||
context: APIContext,
|
||||
next: MiddlewareNext
|
||||
next: MiddlewareNext,
|
||||
) => Promise<Response> | Response | Promise<void> | void;
|
||||
|
||||
// NOTE: when updating this file with other functions,
|
||||
|
@ -3258,7 +3258,7 @@ export interface SSRResult {
|
|||
createAstro(
|
||||
Astro: AstroGlobalPartial,
|
||||
props: Record<string, any>,
|
||||
slots: Record<string, any> | null
|
||||
slots: Record<string, any> | null,
|
||||
): AstroGlobal;
|
||||
params: Params;
|
||||
resolve: (s: string) => Promise<string>;
|
||||
|
@ -3326,7 +3326,7 @@ export interface PreviewServerParams {
|
|||
}
|
||||
|
||||
export type CreatePreviewServer = (
|
||||
params: PreviewServerParams
|
||||
params: PreviewServerParams,
|
||||
) => PreviewServer | Promise<PreviewServer>;
|
||||
|
||||
export interface PreviewModule {
|
||||
|
@ -3351,7 +3351,7 @@ type DirectiveOptions = {
|
|||
export type ClientDirective = (
|
||||
load: DirectiveLoad,
|
||||
options: DirectiveOptions,
|
||||
el: HTMLElement
|
||||
el: HTMLElement,
|
||||
) => void;
|
||||
|
||||
export interface ClientDirectiveConfig {
|
||||
|
@ -3399,7 +3399,7 @@ export type DevToolbarApp = {
|
|||
init?(
|
||||
canvas: ShadowRoot,
|
||||
app: ToolbarAppEventTarget,
|
||||
server: ToolbarServerHelpers
|
||||
server: ToolbarServerHelpers,
|
||||
): void | Promise<void>;
|
||||
beforeTogglingOff?(canvas: ShadowRoot): boolean | Promise<boolean>;
|
||||
};
|
||||
|
@ -3464,7 +3464,7 @@ declare global {
|
|||
|
||||
// Container types
|
||||
export type ContainerImportRendererFn = (
|
||||
containerRenderer: ContainerRenderer
|
||||
containerRenderer: ContainerRenderer,
|
||||
) => Promise<SSRLoadedRenderer>;
|
||||
|
||||
export type ContainerRenderer = {
|
||||
|
|
|
@ -31,7 +31,7 @@ export default function astroActions({
|
|||
}
|
||||
|
||||
const stringifiedActionsImport = JSON.stringify(
|
||||
viteID(new URL('./actions', params.config.srcDir))
|
||||
viteID(new URL('./actions', params.config.srcDir)),
|
||||
);
|
||||
params.updateConfig({
|
||||
vite: {
|
||||
|
@ -75,7 +75,7 @@ export function vitePluginUserActions({ settings }: { settings: AstroSettings })
|
|||
}
|
||||
if (id === VIRTUAL_INTERNAL_MODULE_ID) {
|
||||
const resolvedModule = await this.resolve(
|
||||
`${decodeURI(new URL('actions', settings.config.srcDir).pathname)}`
|
||||
`${decodeURI(new URL('actions', settings.config.srcDir).pathname)}`,
|
||||
);
|
||||
|
||||
if (!resolvedModule) {
|
||||
|
@ -109,7 +109,7 @@ const vitePluginActions = (fs: typeof fsMod): VitePlugin => ({
|
|||
|
||||
let code = await fs.promises.readFile(
|
||||
new URL('../../templates/actions.mjs', import.meta.url),
|
||||
'utf-8'
|
||||
'utf-8',
|
||||
);
|
||||
if (opts?.ssr) {
|
||||
code += `\nexport * from 'astro/actions/runtime/virtual/server.js';`;
|
||||
|
|
|
@ -35,7 +35,7 @@ export const onRequest = defineMiddleware(async (context, next) => {
|
|||
// eslint-disable-next-line no-console
|
||||
console.warn(
|
||||
yellow('[astro:actions]'),
|
||||
'POST requests should not be sent to prerendered pages. If you\'re using Actions, disable prerendering with `export const prerender = "false".'
|
||||
'POST requests should not be sent to prerendered pages. If you\'re using Actions, disable prerendering with `export const prerender = "false".',
|
||||
);
|
||||
return next();
|
||||
}
|
||||
|
|
|
@ -10,5 +10,5 @@ export const z = new Proxy(
|
|||
get() {
|
||||
throw new Error('[astro:action] `z` unexpectedly used on the client.');
|
||||
},
|
||||
}
|
||||
},
|
||||
);
|
||||
|
|
|
@ -7,7 +7,7 @@ import type { ActionAccept, ActionClient } from './server.js';
|
|||
* the user's `src/actions/index.ts` file at build-time.
|
||||
*/
|
||||
export async function getAction(
|
||||
path: string
|
||||
path: string,
|
||||
): Promise<ActionClient<unknown, ActionAccept, ZodType> | undefined> {
|
||||
const pathKeys = path.replace('/_actions/', '').split('.');
|
||||
// @ts-expect-error virtual module
|
||||
|
|
|
@ -25,7 +25,7 @@ export type ActionClient<
|
|||
TInputSchema extends ActionInputSchema<TAccept> | undefined,
|
||||
> = TInputSchema extends z.ZodType
|
||||
? ((
|
||||
input: TAccept extends 'form' ? FormData : z.input<TInputSchema>
|
||||
input: TAccept extends 'form' ? FormData : z.input<TInputSchema>,
|
||||
) => Promise<
|
||||
SafeResult<
|
||||
z.input<TInputSchema> extends ErrorInferenceObject
|
||||
|
@ -36,7 +36,7 @@ export type ActionClient<
|
|||
>) & {
|
||||
queryString: string;
|
||||
orThrow: (
|
||||
input: TAccept extends 'form' ? FormData : z.input<TInputSchema>
|
||||
input: TAccept extends 'form' ? FormData : z.input<TInputSchema>,
|
||||
) => Promise<Awaited<TOutput>>;
|
||||
}
|
||||
: (input?: any) => Promise<SafeResult<never, Awaited<TOutput>>> & {
|
||||
|
@ -85,7 +85,7 @@ export function defineAction<
|
|||
|
||||
function getFormServerHandler<TOutput, TInputSchema extends ActionInputSchema<'form'>>(
|
||||
handler: ActionHandler<TInputSchema, TOutput>,
|
||||
inputSchema?: TInputSchema
|
||||
inputSchema?: TInputSchema,
|
||||
) {
|
||||
return async (unparsedInput: unknown, context: ActionAPIContext): Promise<Awaited<TOutput>> => {
|
||||
if (!(unparsedInput instanceof FormData)) {
|
||||
|
@ -107,7 +107,7 @@ function getFormServerHandler<TOutput, TInputSchema extends ActionInputSchema<'f
|
|||
|
||||
function getJsonServerHandler<TOutput, TInputSchema extends ActionInputSchema<'json'>>(
|
||||
handler: ActionHandler<TInputSchema, TOutput>,
|
||||
inputSchema?: TInputSchema
|
||||
inputSchema?: TInputSchema,
|
||||
) {
|
||||
return async (unparsedInput: unknown, context: ActionAPIContext): Promise<Awaited<TOutput>> => {
|
||||
if (unparsedInput instanceof FormData) {
|
||||
|
@ -129,7 +129,7 @@ function getJsonServerHandler<TOutput, TInputSchema extends ActionInputSchema<'j
|
|||
/** Transform form data to an object based on a Zod schema. */
|
||||
export function formDataToObject<T extends z.AnyZodObject>(
|
||||
formData: FormData,
|
||||
schema: T
|
||||
schema: T,
|
||||
): Record<string, unknown> {
|
||||
const obj: Record<string, unknown> = {};
|
||||
for (const [key, baseValidator] of Object.entries(schema.shape)) {
|
||||
|
@ -151,7 +151,7 @@ export function formDataToObject<T extends z.AnyZodObject>(
|
|||
function handleFormDataGetAll(
|
||||
key: string,
|
||||
formData: FormData,
|
||||
validator: z.ZodArray<z.ZodUnknown>
|
||||
validator: z.ZodArray<z.ZodUnknown>,
|
||||
) {
|
||||
const entries = Array.from(formData.getAll(key));
|
||||
const elementValidator = validator._def.type;
|
||||
|
@ -167,7 +167,7 @@ function handleFormDataGet(
|
|||
key: string,
|
||||
formData: FormData,
|
||||
validator: unknown,
|
||||
baseValidator: unknown
|
||||
baseValidator: unknown,
|
||||
) {
|
||||
const value = formData.get(key);
|
||||
if (!value) {
|
||||
|
|
|
@ -41,7 +41,7 @@ const codeToStatusMap: Record<ActionErrorCode, number> = {
|
|||
const statusToCodeMap: Record<number, ActionErrorCode> = Object.entries(codeToStatusMap).reduce(
|
||||
// reverse the key-value pairs
|
||||
(acc, [key, value]) => ({ ...acc, [value]: key }),
|
||||
{}
|
||||
{},
|
||||
);
|
||||
|
||||
// T is used for error inference with SafeInput -> isInputError.
|
||||
|
@ -92,11 +92,11 @@ export function isActionError(error?: unknown): error is ActionError {
|
|||
}
|
||||
|
||||
export function isInputError<T extends ErrorInferenceObject>(
|
||||
error?: ActionError<T>
|
||||
error?: ActionError<T>,
|
||||
): error is ActionInputError<T>;
|
||||
export function isInputError(error?: unknown): error is ActionInputError<ErrorInferenceObject>;
|
||||
export function isInputError<T extends ErrorInferenceObject>(
|
||||
error?: unknown | ActionError<T>
|
||||
error?: unknown | ActionError<T>,
|
||||
): error is ActionInputError<T> {
|
||||
return (
|
||||
typeof error === 'object' &&
|
||||
|
@ -146,7 +146,7 @@ export class ActionInputError<T extends ErrorInferenceObject> extends ActionErro
|
|||
}
|
||||
|
||||
export async function callSafely<TOutput>(
|
||||
handler: () => MaybePromise<TOutput>
|
||||
handler: () => MaybePromise<TOutput>,
|
||||
): Promise<SafeResult<z.ZodType, TOutput>> {
|
||||
try {
|
||||
const data = await handler();
|
||||
|
|
|
@ -48,7 +48,7 @@ type ImageData = { data: Uint8Array; expires: number };
|
|||
|
||||
export async function prepareAssetsGenerationEnv(
|
||||
pipeline: BuildPipeline,
|
||||
totalCount: number
|
||||
totalCount: number,
|
||||
): Promise<AssetEnv> {
|
||||
const { config, logger } = pipeline;
|
||||
let useCache = true;
|
||||
|
@ -61,7 +61,7 @@ export async function prepareAssetsGenerationEnv(
|
|||
} catch (err) {
|
||||
logger.warn(
|
||||
null,
|
||||
`An error was encountered while creating the cache directory. Proceeding without caching. Error: ${err}`
|
||||
`An error was encountered while creating the cache directory. Proceeding without caching. Error: ${err}`,
|
||||
);
|
||||
useCache = false;
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ export async function generateImagesForPath(
|
|||
originalFilePath: string,
|
||||
transformsAndPath: MapValue<AssetsGlobalStaticImagesList>,
|
||||
env: AssetEnv,
|
||||
queue: PQueue
|
||||
queue: PQueue,
|
||||
) {
|
||||
const originalImageData = await loadImage(originalFilePath, env);
|
||||
|
||||
|
@ -119,7 +119,7 @@ export async function generateImagesForPath(
|
|||
if (transformsAndPath.originalSrcPath) {
|
||||
env.logger.debug(
|
||||
'assets',
|
||||
`Deleting ${originalFilePath} as it's not referenced outside of image processing.`
|
||||
`Deleting ${originalFilePath} as it's not referenced outside of image processing.`,
|
||||
);
|
||||
await fs.promises.unlink(getFullImagePath(originalFilePath, env));
|
||||
}
|
||||
|
@ -131,7 +131,7 @@ export async function generateImagesForPath(
|
|||
async function generateImage(
|
||||
originalImage: ImageData,
|
||||
filepath: string,
|
||||
options: ImageTransform
|
||||
options: ImageTransform,
|
||||
) {
|
||||
const timeStart = performance.now();
|
||||
const generationData = await generateImageInternal(originalImage, filepath, options);
|
||||
|
@ -145,7 +145,7 @@ export async function generateImagesForPath(
|
|||
const count = `(${env.count.current}/${env.count.total})`;
|
||||
env.logger.info(
|
||||
null,
|
||||
` ${green('▶')} ${filepath} ${dim(statsText)} ${dim(timeIncrease)} ${dim(count)}`
|
||||
` ${green('▶')} ${filepath} ${dim(statsText)} ${dim(timeIncrease)} ${dim(count)}`,
|
||||
);
|
||||
env.count.current++;
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ export async function generateImagesForPath(
|
|||
async function generateImageInternal(
|
||||
originalImage: ImageData,
|
||||
filepath: string,
|
||||
options: ImageTransform
|
||||
options: ImageTransform,
|
||||
): Promise<GenerationData> {
|
||||
const isLocalImage = isESMImportedImage(options.src);
|
||||
const finalFileURL = new URL('.' + filepath, env.clientRoot);
|
||||
|
@ -177,7 +177,7 @@ export async function generateImagesForPath(
|
|||
await fs.promises.unlink(cachedFileURL);
|
||||
|
||||
throw new Error(
|
||||
`Malformed cache entry for ${filepath}, cache will be regenerated for this file.`
|
||||
`Malformed cache entry for ${filepath}, cache will be regenerated for this file.`,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -219,7 +219,7 @@ export async function generateImagesForPath(
|
|||
await imageService.transform(
|
||||
originalImage.data,
|
||||
{ ...options, src: originalImagePath },
|
||||
env.imageConfig
|
||||
env.imageConfig,
|
||||
)
|
||||
).data;
|
||||
} catch (e) {
|
||||
|
@ -228,7 +228,7 @@ export async function generateImagesForPath(
|
|||
...AstroErrorData.CouldNotTransformImage,
|
||||
message: AstroErrorData.CouldNotTransformImage.message(originalFilePath),
|
||||
},
|
||||
{ cause: e }
|
||||
{ cause: e },
|
||||
);
|
||||
|
||||
throw error;
|
||||
|
@ -245,14 +245,14 @@ export async function generateImagesForPath(
|
|||
JSON.stringify({
|
||||
data: Buffer.from(resultData.data).toString('base64'),
|
||||
expires: resultData.expires,
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
env.logger.warn(
|
||||
null,
|
||||
`An error was encountered while creating the cache directory. Proceeding without caching. Error: ${e}`
|
||||
`An error was encountered while creating the cache directory. Proceeding without caching. Error: ${e}`,
|
||||
);
|
||||
} finally {
|
||||
// Write the final file
|
||||
|
|
|
@ -8,7 +8,7 @@ export async function loadRemoteImage(src: string) {
|
|||
|
||||
if (!res.ok) {
|
||||
throw new Error(
|
||||
`Failed to load remote image ${src}. The request did not return a 200 OK response. (received ${res.status}))`
|
||||
`Failed to load remote image ${src}. The request did not return a 200 OK response. (received ${res.status}))`,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ export const GET: APIRoute = async ({ request }) => {
|
|||
const { data, format } = await imageService.transform(
|
||||
new Uint8Array(inputBuffer),
|
||||
transform,
|
||||
imageConfig
|
||||
imageConfig,
|
||||
);
|
||||
|
||||
return new Response(data, {
|
||||
|
|
|
@ -83,7 +83,7 @@ export const GET: APIRoute = async ({ request }) => {
|
|||
|
||||
if (!transform?.src) {
|
||||
const err = new Error(
|
||||
'Incorrect transform returned by `parseURL`. Expected a transform with a `src` property.'
|
||||
'Incorrect transform returned by `parseURL`. Expected a transform with a `src` property.',
|
||||
);
|
||||
console.error('Could not parse image transform from URL:', err);
|
||||
return new Response('Internal Server Error', { status: 500 });
|
||||
|
@ -122,7 +122,7 @@ export const GET: APIRoute = async ({ request }) => {
|
|||
import.meta.env.DEV ? `Could not process image request: ${err}` : `Internal Server Error`,
|
||||
{
|
||||
status: 500,
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -33,7 +33,7 @@ export async function getConfiguredImageService(): Promise<ImageService> {
|
|||
|
||||
export async function getImage(
|
||||
options: UnresolvedImageTransform,
|
||||
imageConfig: AstroConfig['image']
|
||||
imageConfig: AstroConfig['image'],
|
||||
): Promise<GetImageResult> {
|
||||
if (!options || typeof options !== 'object') {
|
||||
throw new AstroError({
|
||||
|
@ -47,7 +47,7 @@ export async function getImage(
|
|||
message: AstroErrorData.ExpectedImage.message(
|
||||
options.src,
|
||||
'undefined',
|
||||
JSON.stringify(options)
|
||||
JSON.stringify(options),
|
||||
),
|
||||
});
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ export async function getImage(
|
|||
url: await service.getURL(srcSet.transform, imageConfig),
|
||||
descriptor: srcSet.descriptor,
|
||||
attributes: srcSet.attributes,
|
||||
}))
|
||||
})),
|
||||
);
|
||||
|
||||
if (
|
||||
|
@ -113,7 +113,7 @@ export async function getImage(
|
|||
imageURL = globalThis.astroAsset.addStaticImage(
|
||||
validatedOptions,
|
||||
propsToHash,
|
||||
originalFilePath
|
||||
originalFilePath,
|
||||
);
|
||||
srcSets = srcSetTransforms.map((srcSet) => ({
|
||||
transform: srcSet.transform,
|
||||
|
|
|
@ -47,7 +47,7 @@ interface SharedServiceProps<T extends Record<string, any> = Record<string, any>
|
|||
*/
|
||||
getSrcSet?: (
|
||||
options: ImageTransform,
|
||||
imageConfig: ImageConfig<T>
|
||||
imageConfig: ImageConfig<T>,
|
||||
) => UnresolvedSrcSetValue[] | Promise<UnresolvedSrcSetValue[]>;
|
||||
/**
|
||||
* Return any additional HTML attributes separate from `src` that your service requires to show the image properly.
|
||||
|
@ -57,7 +57,7 @@ interface SharedServiceProps<T extends Record<string, any> = Record<string, any>
|
|||
*/
|
||||
getHTMLAttributes?: (
|
||||
options: ImageTransform,
|
||||
imageConfig: ImageConfig<T>
|
||||
imageConfig: ImageConfig<T>,
|
||||
) => Record<string, any> | Promise<Record<string, any>>;
|
||||
/**
|
||||
* Validate and return the options passed by the user.
|
||||
|
@ -69,7 +69,7 @@ interface SharedServiceProps<T extends Record<string, any> = Record<string, any>
|
|||
*/
|
||||
validateOptions?: (
|
||||
options: ImageTransform,
|
||||
imageConfig: ImageConfig<T>
|
||||
imageConfig: ImageConfig<T>,
|
||||
) => ImageTransform | Promise<ImageTransform>;
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,7 @@ export interface LocalImageService<T extends Record<string, any> = Record<string
|
|||
*/
|
||||
parseURL: (
|
||||
url: URL,
|
||||
imageConfig: ImageConfig<T>
|
||||
imageConfig: ImageConfig<T>,
|
||||
) => LocalImageTransform | undefined | Promise<LocalImageTransform> | Promise<undefined>;
|
||||
/**
|
||||
* Performs the image transformations on the input image and returns both the binary data and
|
||||
|
@ -99,7 +99,7 @@ export interface LocalImageService<T extends Record<string, any> = Record<string
|
|||
transform: (
|
||||
inputBuffer: Uint8Array,
|
||||
transform: LocalImageTransform,
|
||||
imageConfig: ImageConfig<T>
|
||||
imageConfig: ImageConfig<T>,
|
||||
) => Promise<{ data: Uint8Array; format: ImageOutputFormat }>;
|
||||
|
||||
/**
|
||||
|
@ -148,7 +148,7 @@ export const baseService: Omit<LocalImageService, 'transform'> = {
|
|||
message: AstroErrorData.ExpectedImage.message(
|
||||
JSON.stringify(options.src),
|
||||
typeof options.src,
|
||||
JSON.stringify(options, (_, v) => (v === undefined ? null : v))
|
||||
JSON.stringify(options, (_, v) => (v === undefined ? null : v)),
|
||||
),
|
||||
});
|
||||
}
|
||||
|
@ -188,7 +188,7 @@ export const baseService: Omit<LocalImageService, 'transform'> = {
|
|||
message: AstroErrorData.UnsupportedImageFormat.message(
|
||||
options.src.format,
|
||||
options.src.src,
|
||||
VALID_SUPPORTED_FORMATS
|
||||
VALID_SUPPORTED_FORMATS,
|
||||
),
|
||||
});
|
||||
}
|
||||
|
@ -281,14 +281,14 @@ export const baseService: Omit<LocalImageService, 'transform'> = {
|
|||
...densityWidths.map((width, index) => ({
|
||||
maxTargetWidth: Math.min(width, maxWidth),
|
||||
descriptor: `${densityValues[index]}x` as const,
|
||||
}))
|
||||
})),
|
||||
);
|
||||
} else if (widths) {
|
||||
allWidths.push(
|
||||
...widths.map((width) => ({
|
||||
maxTargetWidth: Math.min(width, maxWidth),
|
||||
descriptor: `${width}w` as const,
|
||||
}))
|
||||
})),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ const qualityTable: Record<
|
|||
|
||||
async function getRotationForEXIF(
|
||||
inputBuffer: Uint8Array,
|
||||
src?: string
|
||||
src?: string,
|
||||
): Promise<Operation | undefined> {
|
||||
const meta = await imageMetadata(inputBuffer, src);
|
||||
if (!meta) return undefined;
|
||||
|
|
|
@ -4,7 +4,7 @@ import { lookup as probe } from '../utils/vendor/image-size/lookup.js';
|
|||
|
||||
export async function imageMetadata(
|
||||
data: Uint8Array,
|
||||
src?: string
|
||||
src?: string,
|
||||
): Promise<Omit<ImageMetadata, 'src' | 'fsPath'>> {
|
||||
try {
|
||||
const result = probe(data);
|
||||
|
|
|
@ -14,7 +14,7 @@ export async function emitESMImage(
|
|||
_watchMode: boolean,
|
||||
// FIX: in Astro 5, this function should not be passed in dev mode at all.
|
||||
// Or rethink the API so that a function that throws isn't passed through.
|
||||
fileEmitter?: FileEmitter
|
||||
fileEmitter?: FileEmitter,
|
||||
): Promise<ImageMetadata | undefined> {
|
||||
if (!id) {
|
||||
return undefined;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import type { ImageInputFormat, ImageMetadata } from '../types.js';
|
||||
|
||||
export function getOrigQueryParams(
|
||||
params: URLSearchParams
|
||||
params: URLSearchParams,
|
||||
): Pick<ImageMetadata, 'width' | 'height' | 'format'> | undefined {
|
||||
const width = params.get('origWidth');
|
||||
const height = params.get('origHeight');
|
||||
|
|
|
@ -70,7 +70,7 @@ export function isRemoteAllowed(
|
|||
{
|
||||
domains = [],
|
||||
remotePatterns = [],
|
||||
}: Partial<Pick<AstroConfig['image'], 'domains' | 'remotePatterns'>>
|
||||
}: Partial<Pick<AstroConfig['image'], 'domains' | 'remotePatterns'>>,
|
||||
): boolean {
|
||||
if (!isRemotePath(src)) return false;
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ export function propsToFilename(filePath: string, transform: ImageTransform, has
|
|||
export function hashTransform(
|
||||
transform: ImageTransform,
|
||||
imageService: string,
|
||||
propertiesToHash: string[]
|
||||
propertiesToHash: string[],
|
||||
) {
|
||||
// Extract the fields we want to hash
|
||||
const hashFields = propertiesToHash.reduce(
|
||||
|
@ -28,7 +28,7 @@ export function hashTransform(
|
|||
acc[prop] = transform[prop];
|
||||
return acc;
|
||||
},
|
||||
{ imageService } as Record<string, unknown>
|
||||
{ imageService } as Record<string, unknown>,
|
||||
);
|
||||
return shorthash(deterministicString(hashFields));
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ const resolvedVirtualModuleId = '\0' + VIRTUAL_MODULE_ID;
|
|||
const assetRegex = new RegExp(`\\.(${VALID_INPUT_FORMATS.join('|')})`, 'i');
|
||||
const assetRegexEnds = new RegExp(`\\.(${VALID_INPUT_FORMATS.join('|')})$`, 'i');
|
||||
const addStaticImageFactory = (
|
||||
settings: AstroSettings
|
||||
settings: AstroSettings,
|
||||
): typeof globalThis.astroAsset.addStaticImage => {
|
||||
return (options, hashProperties, originalFSPath) => {
|
||||
if (!globalThis.astroAsset.staticImages) {
|
||||
|
@ -46,7 +46,7 @@ const addStaticImageFactory = (
|
|||
// This is the path to the original image, from the dist root, without the base or the asset prefix (e.g. /_astro/image.hash.png)
|
||||
const finalOriginalPath = removeBase(
|
||||
removeBase(ESMImportedImageSrc, settings.config.base),
|
||||
assetPrefix
|
||||
assetPrefix,
|
||||
);
|
||||
|
||||
const hash = hashTransform(options, settings.config.image.service.entrypoint, hashProperties);
|
||||
|
@ -62,8 +62,8 @@ const addStaticImageFactory = (
|
|||
finalFilePath = prependForwardSlash(
|
||||
joinPaths(
|
||||
isESMImportedImage(options.src) ? '' : settings.config.build.assets,
|
||||
prependForwardSlash(propsToFilename(finalOriginalPath, options, hash))
|
||||
)
|
||||
prependForwardSlash(propsToFilename(finalOriginalPath, options, hash)),
|
||||
),
|
||||
);
|
||||
|
||||
if (!transformsForPath) {
|
||||
|
@ -146,11 +146,11 @@ export default function assets({
|
|||
new URL(
|
||||
isServerLikeOutput(settings.config)
|
||||
? settings.config.build.client
|
||||
: settings.config.outDir
|
||||
)
|
||||
: settings.config.outDir,
|
||||
),
|
||||
)});
|
||||
export const assetsDir = /* #__PURE__ */ new URL(${JSON.stringify(
|
||||
settings.config.build.assets
|
||||
settings.config.build.assets,
|
||||
)}, outDir);
|
||||
export const getImage = async (options) => await getImageInternal(options, imageConfig);
|
||||
`;
|
||||
|
@ -235,7 +235,7 @@ export default function assets({
|
|||
if (options?.ssr) {
|
||||
return `export default ${getProxyCode(
|
||||
imageMetadata,
|
||||
isServerLikeOutput(settings.config)
|
||||
isServerLikeOutput(settings.config),
|
||||
)}`;
|
||||
} else {
|
||||
globalThis.astroAsset.referencedImages.add(imageMetadata.fsPath);
|
||||
|
|
|
@ -12,7 +12,7 @@ export function ensureImport(root: t.File, importDeclaration: t.ImportDeclaratio
|
|||
if (specifier.local.name === specifierToFind.local.name) {
|
||||
specifiersToFind.splice(i, 1);
|
||||
}
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
},
|
||||
|
|
|
@ -191,9 +191,9 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
'SKIP_FORMAT',
|
||||
`\n ${magenta(
|
||||
`Astro will scaffold ${green('./db/config.ts')}${magenta(' and ')}${green(
|
||||
'./db/seed.ts'
|
||||
)}${magenta(' files.')}`
|
||||
)}\n`
|
||||
'./db/seed.ts',
|
||||
)}${magenta(' files.')}`,
|
||||
)}\n`,
|
||||
);
|
||||
|
||||
if (await askToContinue({ flags })) {
|
||||
|
@ -205,7 +205,7 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
} else {
|
||||
logger.info(
|
||||
'SKIP_FORMAT',
|
||||
`\n Astro DB requires additional configuration. Please refer to https://astro.build/db/config`
|
||||
`\n Astro DB requires additional configuration. Please refer to https://astro.build/db/config`,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
@ -235,8 +235,8 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
'SKIP_FORMAT',
|
||||
msg.cancelled(
|
||||
`Dependencies ${bold('NOT')} installed.`,
|
||||
`Be sure to install them manually before continuing!`
|
||||
)
|
||||
`Be sure to install them manually before continuing!`,
|
||||
),
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
@ -273,8 +273,8 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
ast,
|
||||
t.importDeclaration(
|
||||
[t.importSpecifier(defineConfig, defineConfig)],
|
||||
t.stringLiteral('astro/config')
|
||||
)
|
||||
t.stringLiteral('astro/config'),
|
||||
),
|
||||
);
|
||||
wrapDefaultExport(ast, defineConfig);
|
||||
|
||||
|
@ -290,9 +290,9 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
'SKIP_FORMAT',
|
||||
`\n ${magenta(
|
||||
`Check our deployment docs for ${bold(
|
||||
integration.packageName
|
||||
)} to update your "adapter" config.`
|
||||
)}`
|
||||
integration.packageName,
|
||||
)} to update your "adapter" config.`,
|
||||
)}`,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
@ -326,7 +326,7 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
case UpdateResult.cancelled: {
|
||||
logger.info(
|
||||
'SKIP_FORMAT',
|
||||
msg.cancelled(`Your configuration has ${bold('NOT')} been updated.`)
|
||||
msg.cancelled(`Your configuration has ${bold('NOT')} been updated.`),
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
@ -338,7 +338,7 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
.then((res) => JSON.parse(res.toString()));
|
||||
const deps = Object.keys(Object.assign(dependencies, devDependencies));
|
||||
const missingDeps = integrations.filter(
|
||||
(integration) => !deps.includes(integration.packageName)
|
||||
(integration) => !deps.includes(integration.packageName),
|
||||
);
|
||||
if (missingDeps.length === 0) {
|
||||
logger.info('SKIP_FORMAT', msg.success(`Configuration up-to-date.`));
|
||||
|
@ -356,8 +356,8 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
msg.success(
|
||||
`Added the following integration${
|
||||
integrations.length === 1 ? '' : 's'
|
||||
} to your project:\n${list}`
|
||||
)
|
||||
} to your project:\n${list}`,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -371,13 +371,13 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
case UpdateResult.cancelled: {
|
||||
logger.info(
|
||||
'SKIP_FORMAT',
|
||||
msg.cancelled(`Your TypeScript configuration has ${bold('NOT')} been updated.`)
|
||||
msg.cancelled(`Your TypeScript configuration has ${bold('NOT')} been updated.`),
|
||||
);
|
||||
break;
|
||||
}
|
||||
case UpdateResult.failure: {
|
||||
throw new Error(
|
||||
`Unknown error parsing tsconfig.json or jsconfig.json. Could not update TypeScript settings.`
|
||||
`Unknown error parsing tsconfig.json or jsconfig.json. Could not update TypeScript settings.`,
|
||||
);
|
||||
}
|
||||
default:
|
||||
|
@ -386,7 +386,7 @@ export async function add(names: string[], { flags }: AddOptions) {
|
|||
}
|
||||
|
||||
function isAdapter(
|
||||
integration: IntegrationInfo
|
||||
integration: IntegrationInfo,
|
||||
): integration is IntegrationInfo & { type: 'adapter' } {
|
||||
return integration.type === 'adapter';
|
||||
}
|
||||
|
@ -445,8 +445,8 @@ async function addIntegration(ast: t.File, integration: IntegrationInfo) {
|
|||
ast,
|
||||
t.importDeclaration(
|
||||
[t.importDefaultSpecifier(integrationId)],
|
||||
t.stringLiteral(integration.packageName)
|
||||
)
|
||||
t.stringLiteral(integration.packageName),
|
||||
),
|
||||
);
|
||||
|
||||
visit(ast, {
|
||||
|
@ -472,7 +472,7 @@ async function addIntegration(ast: t.File, integration: IntegrationInfo) {
|
|||
|
||||
if (!integrationsProp) {
|
||||
configObject.properties.push(
|
||||
t.objectProperty(t.identifier('integrations'), t.arrayExpression([integrationCall]))
|
||||
t.objectProperty(t.identifier('integrations'), t.arrayExpression([integrationCall])),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
@ -484,7 +484,7 @@ async function addIntegration(ast: t.File, integration: IntegrationInfo) {
|
|||
(expr) =>
|
||||
t.isCallExpression(expr) &&
|
||||
t.isIdentifier(expr.callee) &&
|
||||
expr.callee.name === integrationId.name
|
||||
expr.callee.name === integrationId.name,
|
||||
);
|
||||
|
||||
if (existingIntegrationCall) return;
|
||||
|
@ -499,7 +499,7 @@ async function setAdapter(ast: t.File, adapter: IntegrationInfo, exportName: str
|
|||
|
||||
ensureImport(
|
||||
ast,
|
||||
t.importDeclaration([t.importDefaultSpecifier(adapterId)], t.stringLiteral(exportName))
|
||||
t.importDeclaration([t.importDefaultSpecifier(adapterId)], t.stringLiteral(exportName)),
|
||||
);
|
||||
|
||||
visit(ast, {
|
||||
|
@ -523,7 +523,7 @@ async function setAdapter(ast: t.File, adapter: IntegrationInfo, exportName: str
|
|||
|
||||
if (!outputProp) {
|
||||
configObject.properties.push(
|
||||
t.objectProperty(t.identifier('output'), t.stringLiteral('server'))
|
||||
t.objectProperty(t.identifier('output'), t.stringLiteral('server')),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -610,7 +610,7 @@ async function updateAstroConfig({
|
|||
|
||||
logger.info(
|
||||
'SKIP_FORMAT',
|
||||
`\n ${magenta('Astro will make the following changes to your config file:')}\n${message}`
|
||||
`\n ${magenta('Astro will make the following changes to your config file:')}\n${message}`,
|
||||
);
|
||||
|
||||
if (logAdapterInstructions) {
|
||||
|
@ -618,9 +618,9 @@ async function updateAstroConfig({
|
|||
'SKIP_FORMAT',
|
||||
magenta(
|
||||
` For complete deployment options, visit\n ${bold(
|
||||
'https://docs.astro.build/en/guides/deploy/'
|
||||
)}\n`
|
||||
)
|
||||
'https://docs.astro.build/en/guides/deploy/',
|
||||
)}\n`,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -669,7 +669,7 @@ async function getInstallIntegrationsCommand({
|
|||
}
|
||||
|
||||
async function convertIntegrationsToInstallSpecifiers(
|
||||
integrations: IntegrationInfo[]
|
||||
integrations: IntegrationInfo[],
|
||||
): Promise<string[]> {
|
||||
const ranges: Record<string, string> = {};
|
||||
for (let { packageName, dependencies } of integrations) {
|
||||
|
@ -679,7 +679,7 @@ async function convertIntegrationsToInstallSpecifiers(
|
|||
}
|
||||
}
|
||||
return Promise.all(
|
||||
Object.entries(ranges).map(([name, range]) => resolveRangeToInstallSpecifier(name, range))
|
||||
Object.entries(ranges).map(([name, range]) => resolveRangeToInstallSpecifier(name, range)),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -749,8 +749,8 @@ async function tryToInstallIntegrations({
|
|||
logger.info(
|
||||
'SKIP_FORMAT',
|
||||
`\n ${magenta('Astro will run the following command:')}\n ${dim(
|
||||
'If you skip this step, you can always run it yourself later'
|
||||
)}\n${message}`
|
||||
'If you skip this step, you can always run it yourself later',
|
||||
)}\n${message}`,
|
||||
);
|
||||
|
||||
if (await askToContinue({ flags })) {
|
||||
|
@ -768,7 +768,7 @@ async function tryToInstallIntegrations({
|
|||
cwd,
|
||||
// reset NODE_ENV to ensure install command run in dev mode
|
||||
env: { NODE_ENV: undefined },
|
||||
}
|
||||
},
|
||||
);
|
||||
spinner.succeed();
|
||||
return UpdateResult.updated;
|
||||
|
@ -817,8 +817,8 @@ async function validateIntegrations(integrations: string[]): Promise<Integration
|
|||
if (!response.askToContinue) {
|
||||
throw new Error(
|
||||
`No problem! Find our official integrations at ${cyan(
|
||||
'https://astro.build/integrations'
|
||||
)}`
|
||||
'https://astro.build/integrations',
|
||||
)}`,
|
||||
);
|
||||
}
|
||||
spinner.start('Resolving with third party packages...');
|
||||
|
@ -867,15 +867,15 @@ async function validateIntegrations(integrations: string[]): Promise<Integration
|
|||
} else {
|
||||
throw new Error(
|
||||
`${bold(
|
||||
packageName
|
||||
packageName,
|
||||
)} doesn't appear to be an integration or an adapter. Find our official integrations at ${cyan(
|
||||
'https://astro.build/integrations'
|
||||
)}`
|
||||
'https://astro.build/integrations',
|
||||
)}`,
|
||||
);
|
||||
}
|
||||
|
||||
return { id: integration, packageName, dependencies, type: integrationType };
|
||||
})
|
||||
}),
|
||||
);
|
||||
spinner.succeed();
|
||||
return integrationEntries;
|
||||
|
@ -893,13 +893,13 @@ async function updateTSConfig(
|
|||
cwd = process.cwd(),
|
||||
logger: Logger,
|
||||
integrationsInfo: IntegrationInfo[],
|
||||
flags: yargs.Arguments
|
||||
flags: yargs.Arguments,
|
||||
): Promise<UpdateResult> {
|
||||
const integrations = integrationsInfo.map(
|
||||
(integration) => integration.id as frameworkWithTSSettings
|
||||
(integration) => integration.id as frameworkWithTSSettings,
|
||||
);
|
||||
const firstIntegrationWithTSSettings = integrations.find((integration) =>
|
||||
presets.has(integration)
|
||||
presets.has(integration),
|
||||
);
|
||||
|
||||
if (!firstIntegrationWithTSSettings) {
|
||||
|
@ -926,7 +926,7 @@ async function updateTSConfig(
|
|||
|
||||
const outputConfig = updateTSConfigForFramework(
|
||||
inputConfig.rawConfig,
|
||||
firstIntegrationWithTSSettings
|
||||
firstIntegrationWithTSSettings,
|
||||
);
|
||||
|
||||
const output = JSON.stringify(outputConfig, null, 2);
|
||||
|
@ -945,7 +945,7 @@ async function updateTSConfig(
|
|||
|
||||
logger.info(
|
||||
'SKIP_FORMAT',
|
||||
`\n ${magenta(`Astro will make the following changes to your ${configFileName}:`)}\n${message}`
|
||||
`\n ${magenta(`Astro will make the following changes to your ${configFileName}:`)}\n${message}`,
|
||||
);
|
||||
|
||||
// Every major framework, apart from Vue and Svelte requires different `jsxImportSource`, as such it's impossible to config
|
||||
|
@ -961,11 +961,11 @@ async function updateTSConfig(
|
|||
'SKIP_FORMAT',
|
||||
red(
|
||||
` ${bold(
|
||||
'Caution:'
|
||||
'Caution:',
|
||||
)} Selected UI frameworks require conflicting tsconfig.json settings, as such only settings for ${bold(
|
||||
firstIntegrationWithTSSettings
|
||||
)} were used.\n More information: https://docs.astro.build/en/guides/typescript/#errors-typing-multiple-jsx-frameworks-at-the-same-time\n`
|
||||
)
|
||||
firstIntegrationWithTSSettings,
|
||||
)} were used.\n More information: https://docs.astro.build/en/guides/typescript/#errors-typing-multiple-jsx-frameworks-at-the-same-time\n`,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1046,7 +1046,7 @@ async function setupIntegrationConfig(opts: {
|
|||
}) {
|
||||
const logger = opts.logger;
|
||||
const possibleConfigFiles = opts.possibleConfigFiles.map((p) =>
|
||||
fileURLToPath(new URL(p, opts.root))
|
||||
fileURLToPath(new URL(p, opts.root)),
|
||||
);
|
||||
let alreadyConfigured = false;
|
||||
for (const possibleConfigPath of possibleConfigFiles) {
|
||||
|
@ -1058,7 +1058,7 @@ async function setupIntegrationConfig(opts: {
|
|||
if (!alreadyConfigured) {
|
||||
logger.info(
|
||||
'SKIP_FORMAT',
|
||||
`\n ${magenta(`Astro will generate a minimal ${bold(opts.defaultConfigFile)} file.`)}\n`
|
||||
`\n ${magenta(`Astro will generate a minimal ${bold(opts.defaultConfigFile)} file.`)}\n`,
|
||||
);
|
||||
if (await askToContinue({ flags: opts.flags })) {
|
||||
await fs.writeFile(
|
||||
|
@ -1066,7 +1066,7 @@ async function setupIntegrationConfig(opts: {
|
|||
opts.defaultConfigContent,
|
||||
{
|
||||
encoding: 'utf-8',
|
||||
}
|
||||
},
|
||||
);
|
||||
logger.debug('add', `Generated default ${opts.defaultConfigFile} file`);
|
||||
}
|
||||
|
|
|
@ -12,14 +12,14 @@ export async function check(flags: Arguments) {
|
|||
'@astrojs/check',
|
||||
logger,
|
||||
getPackageOpts,
|
||||
['typescript']
|
||||
['typescript'],
|
||||
);
|
||||
const typescript = await getPackage('typescript', logger, getPackageOpts);
|
||||
|
||||
if (!checkPackage || !typescript) {
|
||||
logger.error(
|
||||
'check',
|
||||
'The `@astrojs/check` and `typescript` packages are required for this command to work. Please manually install them into your project and try again.'
|
||||
'The `@astrojs/check` and `typescript` packages are required for this command to work. Please manually install them into your project and try again.',
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ export async function db({ flags }: { flags: Arguments }) {
|
|||
if (!dbPackage) {
|
||||
logger.error(
|
||||
'check',
|
||||
'The `@astrojs/db` package is required for this command to work. Please manually install it in your project and try again.'
|
||||
'The `@astrojs/db` package is required for this command to work. Please manually install it in your project and try again.',
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ export async function dev({ flags }: DevOptions) {
|
|||
],
|
||||
},
|
||||
description: `Check ${cyan(
|
||||
'https://docs.astro.build/en/reference/cli-reference/#astro-dev'
|
||||
'https://docs.astro.build/en/reference/cli-reference/#astro-dev',
|
||||
)} for more information.`,
|
||||
});
|
||||
return;
|
||||
|
|
|
@ -21,7 +21,7 @@ const getPlatformSpecificCommand = (): [string] | [string, string[]] => {
|
|||
return ['/ide/bin/remote-cli/gitpod-code', ['--openExternal']];
|
||||
default:
|
||||
throw new Error(
|
||||
`It looks like your platform ("${platform}") isn't supported!\nTo view Astro's docs, please visit https://docs.astro.build`
|
||||
`It looks like your platform ("${platform}") isn't supported!\nTo view Astro's docs, please visit https://docs.astro.build`,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -93,7 +93,7 @@ async function copyToClipboard(text: string) {
|
|||
});
|
||||
} catch {
|
||||
console.error(
|
||||
colors.red(`\nSorry, something went wrong!`) + ` Please copy the text above manually.`
|
||||
colors.red(`\nSorry, something went wrong!`) + ` Please copy the text above manually.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ export async function getPackage<T>(
|
|||
packageName: string,
|
||||
logger: Logger,
|
||||
options: GetPackageOptions,
|
||||
otherDeps: string[] = []
|
||||
otherDeps: string[] = [],
|
||||
): Promise<T | undefined> {
|
||||
try {
|
||||
// Try to resolve with `createRequire` first to prevent ESM caching of the package
|
||||
|
@ -32,7 +32,7 @@ export async function getPackage<T>(
|
|||
} catch {
|
||||
if (options.optional) return undefined;
|
||||
let message = `To continue, Astro requires the following dependency to be installed: ${bold(
|
||||
packageName
|
||||
packageName,
|
||||
)}.`;
|
||||
|
||||
if (ci.isCI) {
|
||||
|
@ -98,7 +98,7 @@ export async function getExecCommand(packageManager?: string): Promise<string> {
|
|||
async function installPackage(
|
||||
packageNames: string[],
|
||||
options: GetPackageOptions,
|
||||
logger: Logger
|
||||
logger: Logger,
|
||||
): Promise<boolean> {
|
||||
const cwd = options.cwd ?? process.cwd();
|
||||
const packageManager = (await whichPm(cwd))?.name ?? 'npm';
|
||||
|
@ -120,8 +120,8 @@ async function installPackage(
|
|||
logger.info(
|
||||
'SKIP_FORMAT',
|
||||
`\n ${magenta('Astro will run the following command:')}\n ${dim(
|
||||
'If you skip this step, you can always run it yourself later'
|
||||
)}\n${message}`
|
||||
'If you skip this step, you can always run it yourself later',
|
||||
)}\n${message}`,
|
||||
);
|
||||
|
||||
let response;
|
||||
|
@ -144,7 +144,7 @@ async function installPackage(
|
|||
await execa(
|
||||
installCommand.pm,
|
||||
[installCommand.command, ...installCommand.flags, ...installCommand.dependencies],
|
||||
{ cwd: cwd }
|
||||
{ cwd: cwd },
|
||||
);
|
||||
spinner.succeed();
|
||||
|
||||
|
@ -163,7 +163,7 @@ async function installPackage(
|
|||
export async function fetchPackageJson(
|
||||
scope: string | undefined,
|
||||
name: string,
|
||||
tag: string
|
||||
tag: string,
|
||||
): Promise<Record<string, any> | Error> {
|
||||
const packageName = `${scope ? `${scope}/` : ''}${name}`;
|
||||
const registry = await getRegistry();
|
||||
|
|
|
@ -43,7 +43,7 @@ export async function preferences(
|
|||
subcommand: string,
|
||||
key: string,
|
||||
value: string | undefined,
|
||||
{ flags }: PreferencesOptions
|
||||
{ flags }: PreferencesOptions,
|
||||
): Promise<number> {
|
||||
applyPolyfill();
|
||||
if (!isValidSubcommand(subcommand) || flags?.help || flags?.h) {
|
||||
|
@ -98,8 +98,8 @@ export async function preferences(
|
|||
console.error(
|
||||
msg.formatErrorMessage(
|
||||
collectErrorMetadata(new Error(`Please provide a ${type} value for "${key}"`)),
|
||||
true
|
||||
)
|
||||
true,
|
||||
),
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ interface SubcommandOptions {
|
|||
async function getPreference(
|
||||
settings: AstroSettings,
|
||||
key: PreferenceKey,
|
||||
{ location = 'project' }: SubcommandOptions
|
||||
{ location = 'project' }: SubcommandOptions,
|
||||
) {
|
||||
try {
|
||||
let value = await settings.preferences.get(key, { location });
|
||||
|
@ -155,7 +155,7 @@ async function setPreference(
|
|||
settings: AstroSettings,
|
||||
key: PreferenceKey,
|
||||
value: unknown,
|
||||
{ location }: SubcommandOptions
|
||||
{ location }: SubcommandOptions,
|
||||
) {
|
||||
try {
|
||||
const defaultType = typeof dlv(DEFAULT_PREFERENCES, key);
|
||||
|
@ -178,7 +178,7 @@ async function setPreference(
|
|||
async function enablePreference(
|
||||
settings: AstroSettings,
|
||||
key: PreferenceKey,
|
||||
{ location }: SubcommandOptions
|
||||
{ location }: SubcommandOptions,
|
||||
) {
|
||||
try {
|
||||
await settings.preferences.set(key, true, { location });
|
||||
|
@ -191,7 +191,7 @@ async function enablePreference(
|
|||
async function disablePreference(
|
||||
settings: AstroSettings,
|
||||
key: PreferenceKey,
|
||||
{ location }: SubcommandOptions
|
||||
{ location }: SubcommandOptions,
|
||||
) {
|
||||
try {
|
||||
await settings.preferences.set(key, false, { location });
|
||||
|
@ -204,7 +204,7 @@ async function disablePreference(
|
|||
async function resetPreference(
|
||||
settings: AstroSettings,
|
||||
key: PreferenceKey,
|
||||
{ location }: SubcommandOptions
|
||||
{ location }: SubcommandOptions,
|
||||
) {
|
||||
try {
|
||||
await settings.preferences.set(key, undefined as any, { location });
|
||||
|
@ -216,13 +216,13 @@ async function resetPreference(
|
|||
|
||||
function annotate(flat: Record<string, any>, annotation: string) {
|
||||
return Object.fromEntries(
|
||||
Object.entries(flat).map(([key, value]) => [key, { annotation, value }])
|
||||
Object.entries(flat).map(([key, value]) => [key, { annotation, value }]),
|
||||
);
|
||||
}
|
||||
function userValues(
|
||||
flatDefault: Record<string, string | number | boolean>,
|
||||
flatProject: Record<string, string | number | boolean>,
|
||||
flatGlobal: Record<string, string | number | boolean>
|
||||
flatGlobal: Record<string, string | number | boolean>,
|
||||
) {
|
||||
const result: AnnotatedValues = {};
|
||||
for (const key of Object.keys(flatDefault)) {
|
||||
|
@ -289,8 +289,8 @@ async function listPreferences(settings: AstroSettings, { location, json }: Subc
|
|||
) {
|
||||
console.log(
|
||||
yellow(
|
||||
'The dev toolbar is currently disabled. To enable it, set devToolbar: {enabled: true} in your astroConfig file.'
|
||||
)
|
||||
'The dev toolbar is currently disabled. To enable it, set devToolbar: {enabled: true} in your astroConfig file.',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -327,7 +327,7 @@ function annotatedFormat(mv: AnnotatedValue) {
|
|||
// this is the real formatting for annotated values
|
||||
function formatAnnotated(
|
||||
mv: AnnotatedValue,
|
||||
style: (value: string | number | boolean) => string = (v) => v.toString()
|
||||
style: (value: string | number | boolean) => string = (v) => v.toString(),
|
||||
) {
|
||||
return mv.annotation ? `${style(mv.value)} ${dim(mv.annotation)}` : style(mv.value);
|
||||
}
|
||||
|
@ -339,28 +339,28 @@ function formatTable(object: Record<string, AnnotatedValue>, columnLabels: [stri
|
|||
i: number,
|
||||
a: string,
|
||||
b: AnnotatedValue,
|
||||
style: (value: string | number | boolean) => string = (v) => v.toString()
|
||||
style: (value: string | number | boolean) => string = (v) => v.toString(),
|
||||
): string {
|
||||
return `${dim(chars.v)} ${style(a)} ${space(colALength - a.length - 2)} ${dim(
|
||||
chars.v
|
||||
chars.v,
|
||||
)} ${formatAnnotated(b, style)} ${space(colBLength - annotatedFormat(b).length - 3)} ${dim(
|
||||
chars.v
|
||||
chars.v,
|
||||
)}`;
|
||||
}
|
||||
const top = dim(
|
||||
`${chars.topLeft}${chars.h.repeat(colALength + 1)}${chars.hBottom}${chars.h.repeat(
|
||||
colBLength
|
||||
)}${chars.topRight}`
|
||||
colBLength,
|
||||
)}${chars.topRight}`,
|
||||
);
|
||||
const bottom = dim(
|
||||
`${chars.bottomLeft}${chars.h.repeat(colALength + 1)}${chars.hTop}${chars.h.repeat(
|
||||
colBLength
|
||||
)}${chars.bottomRight}`
|
||||
colBLength,
|
||||
)}${chars.bottomRight}`,
|
||||
);
|
||||
const divider = dim(
|
||||
`${chars.vRightThick}${chars.hThick.repeat(colALength + 1)}${
|
||||
chars.hThickCross
|
||||
}${chars.hThick.repeat(colBLength)}${chars.vLeftThick}`
|
||||
}${chars.hThick.repeat(colBLength)}${chars.vLeftThick}`,
|
||||
);
|
||||
const rows: string[] = [top, formatRow(-1, colA, { value: colB, annotation: '' }, bold), divider];
|
||||
let i = 0;
|
||||
|
|
|
@ -23,7 +23,7 @@ export async function preview({ flags }: PreviewOptions) {
|
|||
],
|
||||
},
|
||||
description: `Starts a local server to serve your static dist/ directory. Check ${cyan(
|
||||
'https://docs.astro.build/en/reference/cli-reference/#astro-preview'
|
||||
'https://docs.astro.build/en/reference/cli-reference/#astro-preview',
|
||||
)} for more information.`,
|
||||
});
|
||||
return;
|
||||
|
|
|
@ -8,7 +8,7 @@ export function defineConfig(config: AstroUserConfig) {
|
|||
|
||||
export function getViteConfig(
|
||||
userViteConfig: ViteUserConfig,
|
||||
inlineAstroConfig: AstroInlineConfig = {}
|
||||
inlineAstroConfig: AstroInlineConfig = {},
|
||||
) {
|
||||
// Return an async Vite config getter which exposes a resolved `mode` and `command`
|
||||
return async ({ mode, command }: { mode: string; command: 'serve' | 'build' }) => {
|
||||
|
@ -48,7 +48,7 @@ export function getViteConfig(
|
|||
astroContentListenPlugin({ settings, logger, fs }),
|
||||
],
|
||||
},
|
||||
{ settings, logger, mode, sync: false }
|
||||
{ settings, logger, mode, sync: false },
|
||||
);
|
||||
await runHookConfigDone({ settings, logger });
|
||||
return mergeConfig(viteConfig, userViteConfig);
|
||||
|
|
|
@ -105,7 +105,7 @@ export type AddClientRenderer = {
|
|||
function createManifest(
|
||||
manifest?: AstroContainerManifest,
|
||||
renderers?: SSRLoadedRenderer[],
|
||||
middleware?: MiddlewareHandler
|
||||
middleware?: MiddlewareHandler,
|
||||
): SSRManifest {
|
||||
const defaultMiddleware: MiddlewareHandler = (_, next) => {
|
||||
return next();
|
||||
|
@ -274,7 +274,7 @@ export class experimental_AstroContainer {
|
|||
* @param {AstroContainerOptions=} containerOptions
|
||||
*/
|
||||
public static async create(
|
||||
containerOptions: AstroContainerOptions = {}
|
||||
containerOptions: AstroContainerOptions = {},
|
||||
): Promise<experimental_AstroContainer> {
|
||||
const { streaming = false, manifest, renderers = [], resolve } = containerOptions;
|
||||
const astroConfig = await validateConfig(ASTRO_CONFIG_DEFAULTS, process.cwd(), 'container');
|
||||
|
@ -315,7 +315,7 @@ export class experimental_AstroContainer {
|
|||
if (!renderer.check || !renderer.renderToStaticMarkup) {
|
||||
throw new Error(
|
||||
"The renderer you passed isn't valid. A renderer is usually an object that exposes the `check` and `renderToStaticMarkup` functions.\n" +
|
||||
"Usually, the renderer is exported by a /server.js entrypoint e.g. `import renderer from '@astrojs/react/server.js'`"
|
||||
"Usually, the renderer is exported by a /server.js entrypoint e.g. `import renderer from '@astrojs/react/server.js'`",
|
||||
);
|
||||
}
|
||||
if (isNamedRenderer(renderer)) {
|
||||
|
@ -362,7 +362,7 @@ export class experimental_AstroContainer {
|
|||
throw new Error(
|
||||
'You tried to add the ' +
|
||||
name +
|
||||
" client renderer, but its server renderer wasn't added. You must add the server renderer first. Use the `addServerRenderer` function."
|
||||
" client renderer, but its server renderer wasn't added. You must add the server renderer first. Use the `addServerRenderer` function.",
|
||||
);
|
||||
}
|
||||
const renderer = this.#pipeline.manifest.renderers[rendererIndex];
|
||||
|
@ -374,7 +374,7 @@ export class experimental_AstroContainer {
|
|||
// NOTE: we keep this private via TS instead via `#` so it's still available on the surface, so we can play with it.
|
||||
// @ematipico: I plan to use it for a possible integration that could help people
|
||||
private static async createFromManifest(
|
||||
manifest: SSRManifest
|
||||
manifest: SSRManifest,
|
||||
): Promise<experimental_AstroContainer> {
|
||||
const astroConfig = await validateConfig(ASTRO_CONFIG_DEFAULTS, process.cwd(), 'container');
|
||||
const container = new experimental_AstroContainer({
|
||||
|
@ -431,7 +431,7 @@ export class experimental_AstroContainer {
|
|||
*/
|
||||
public async renderToString(
|
||||
component: AstroComponentFactory,
|
||||
options: ContainerRenderOptions = {}
|
||||
options: ContainerRenderOptions = {},
|
||||
): Promise<string> {
|
||||
const response = await this.renderToResponse(component, options);
|
||||
return await response.text();
|
||||
|
@ -458,7 +458,7 @@ export class experimental_AstroContainer {
|
|||
*/
|
||||
public async renderToResponse(
|
||||
component: AstroComponentFactory,
|
||||
options: ContainerRenderOptions = {}
|
||||
options: ContainerRenderOptions = {},
|
||||
): Promise<Response> {
|
||||
const { routeType = 'page', slots } = options;
|
||||
const request = options?.request ?? new Request('https://example.com/');
|
||||
|
@ -510,7 +510,7 @@ export class experimental_AstroContainer {
|
|||
pattern: getPattern(
|
||||
segments,
|
||||
ASTRO_CONFIG_DEFAULTS.base,
|
||||
ASTRO_CONFIG_DEFAULTS.trailingSlash
|
||||
ASTRO_CONFIG_DEFAULTS.trailingSlash,
|
||||
),
|
||||
prerender: false,
|
||||
segments,
|
||||
|
@ -528,7 +528,7 @@ export class experimental_AstroContainer {
|
|||
*/
|
||||
#wrapComponent(
|
||||
componentFactory: AstroComponentFactory,
|
||||
params?: Record<string, string | undefined>
|
||||
params?: Record<string, string | undefined>,
|
||||
): ComponentInstance {
|
||||
if (params) {
|
||||
return {
|
||||
|
|
|
@ -41,7 +41,7 @@ export class ContainerPipeline extends Pipeline {
|
|||
renderers,
|
||||
resolve,
|
||||
serverLike,
|
||||
streaming
|
||||
streaming,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -70,7 +70,7 @@ export class ContainerPipeline extends Pipeline {
|
|||
|
||||
async tryRewrite(
|
||||
payload: RewritePayload,
|
||||
request: Request
|
||||
request: Request,
|
||||
): Promise<[RouteData, ComponentInstance, URL]> {
|
||||
const [foundRoute, finalUrl] = findRouteToRewrite({
|
||||
payload,
|
||||
|
|
|
@ -6,7 +6,7 @@ import { emitESMImage } from '../assets/utils/node/emitAsset.js';
|
|||
export function createImage(
|
||||
pluginContext: PluginContext,
|
||||
shouldEmitFile: boolean,
|
||||
entryFilePath: string
|
||||
entryFilePath: string,
|
||||
) {
|
||||
return () => {
|
||||
return z.string().transform(async (imagePath, ctx) => {
|
||||
|
@ -14,7 +14,7 @@ export function createImage(
|
|||
const metadata = (await emitESMImage(
|
||||
resolvedFilePath,
|
||||
pluginContext.meta.watchMode,
|
||||
shouldEmitFile ? pluginContext.emitFile : undefined
|
||||
shouldEmitFile ? pluginContext.emitFile : undefined,
|
||||
)) as OmitBrand<ImageMetadata>;
|
||||
|
||||
if (!metadata) {
|
||||
|
|
|
@ -65,15 +65,15 @@ export function createGetCollection({
|
|||
// eslint-disable-next-line no-console
|
||||
console.warn(
|
||||
`The collection ${JSON.stringify(
|
||||
collection
|
||||
)} does not exist or is empty. Ensure a collection directory with this name exists.`
|
||||
collection,
|
||||
)} does not exist or is empty. Ensure a collection directory with this name exists.`,
|
||||
);
|
||||
return [];
|
||||
}
|
||||
const lazyImports = Object.values(
|
||||
type === 'content'
|
||||
? contentCollectionToEntryMap[collection]
|
||||
: dataCollectionToEntryMap[collection]
|
||||
: dataCollectionToEntryMap[collection],
|
||||
);
|
||||
let entries: any[] = [];
|
||||
// Cache `getCollection()` calls in production only
|
||||
|
@ -106,8 +106,8 @@ export function createGetCollection({
|
|||
collection: entry.collection,
|
||||
data: entry.data,
|
||||
};
|
||||
})
|
||||
)
|
||||
}),
|
||||
),
|
||||
);
|
||||
cacheEntriesByCollection.set(collection, entries);
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ export function createGetEntry({
|
|||
// Or pass a single object with the collection and identifier as properties.
|
||||
// This means the first positional arg can have different shapes.
|
||||
collectionOrLookupObject: string | EntryLookupObject,
|
||||
_lookupId?: string
|
||||
_lookupId?: string,
|
||||
): Promise<ContentEntryResult | DataEntryResult | undefined> {
|
||||
let collection: string, lookupId: string;
|
||||
if (typeof collectionOrLookupObject === 'string') {
|
||||
|
@ -249,7 +249,7 @@ export function createGetEntry({
|
|||
|
||||
export function createGetEntries(getEntry: ReturnType<typeof createGetEntry>) {
|
||||
return async function getEntries(
|
||||
entries: { collection: string; id: string }[] | { collection: string; slug: string }[]
|
||||
entries: { collection: string; id: string }[] | { collection: string; slug: string }[],
|
||||
) {
|
||||
return Promise.all(entries.map((e) => getEntry(e)));
|
||||
};
|
||||
|
@ -332,8 +332,8 @@ async function render({
|
|||
'Content',
|
||||
propagationMod.Content,
|
||||
props,
|
||||
slots
|
||||
)}`
|
||||
slots,
|
||||
)}`,
|
||||
);
|
||||
},
|
||||
propagation: 'self',
|
||||
|
@ -374,7 +374,7 @@ export function createReference({ lookupMap }: { lookupMap: ContentLookupMap })
|
|||
ctx.addIssue({
|
||||
code: ZodIssueCode.custom,
|
||||
message: `**${flattenedErrorPath}**: Reference to ${collection} invalid. Expected ${Object.keys(
|
||||
entries
|
||||
entries,
|
||||
)
|
||||
.map((c) => JSON.stringify(c))
|
||||
.join(' | ')}. Received ${JSON.stringify(lookupId)}.`,
|
||||
|
|
|
@ -29,8 +29,8 @@ export async function attachContentServerListeners({
|
|||
logger.debug(
|
||||
'content',
|
||||
`Watching ${cyan(
|
||||
contentPaths.contentDir.href.replace(settings.config.root.href, '')
|
||||
)} for changes`
|
||||
contentPaths.contentDir.href.replace(settings.config.root.href, ''),
|
||||
)} for changes`,
|
||||
);
|
||||
const maybeTsConfigStats = await getTSConfigStatsWhenAllowJsFalse({ contentPaths, settings });
|
||||
if (maybeTsConfigStats) warnAllowJsIsFalse({ ...maybeTsConfigStats, logger });
|
||||
|
@ -61,16 +61,16 @@ export async function attachContentServerListeners({
|
|||
contentGenerator.queueEvent({ name: 'add', entry });
|
||||
});
|
||||
viteServer.watcher.on('addDir', (entry) =>
|
||||
contentGenerator.queueEvent({ name: 'addDir', entry })
|
||||
contentGenerator.queueEvent({ name: 'addDir', entry }),
|
||||
);
|
||||
viteServer.watcher.on('change', (entry) =>
|
||||
contentGenerator.queueEvent({ name: 'change', entry })
|
||||
contentGenerator.queueEvent({ name: 'change', entry }),
|
||||
);
|
||||
viteServer.watcher.on('unlink', (entry) => {
|
||||
contentGenerator.queueEvent({ name: 'unlink', entry });
|
||||
});
|
||||
viteServer.watcher.on('unlinkDir', (entry) =>
|
||||
contentGenerator.queueEvent({ name: 'unlinkDir', entry })
|
||||
contentGenerator.queueEvent({ name: 'unlinkDir', entry }),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -87,12 +87,12 @@ function warnAllowJsIsFalse({
|
|||
logger.warn(
|
||||
'content',
|
||||
`Make sure you have the ${bold('allowJs')} compiler option set to ${bold(
|
||||
'true'
|
||||
'true',
|
||||
)} in your ${bold(tsConfigFileName)} file to have autocompletion in your ${bold(
|
||||
contentConfigFileName
|
||||
contentConfigFileName,
|
||||
)} file. See ${underline(
|
||||
cyan('https://www.typescriptlang.org/tsconfig#allowJs')
|
||||
)} for more information.`
|
||||
cyan('https://www.typescriptlang.org/tsconfig#allowJs'),
|
||||
)} for more information.`,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -104,7 +104,7 @@ async function getTSConfigStatsWhenAllowJsFalse({
|
|||
settings: AstroSettings;
|
||||
}) {
|
||||
const isContentConfigJsFile = ['.js', '.mjs'].some((ext) =>
|
||||
contentPaths.config.url.pathname.endsWith(ext)
|
||||
contentPaths.config.url.pathname.endsWith(ext),
|
||||
);
|
||||
if (!isContentConfigJsFile) return;
|
||||
|
||||
|
|
|
@ -112,7 +112,7 @@ export async function createContentTypesGenerator({
|
|||
async function handleEvent(event: ContentEvent): Promise<{ shouldGenerateTypes: boolean }> {
|
||||
if (event.name === 'addDir' || event.name === 'unlinkDir') {
|
||||
const collection = normalizePath(
|
||||
path.relative(fileURLToPath(contentPaths.contentDir), fileURLToPath(event.entry))
|
||||
path.relative(fileURLToPath(contentPaths.contentDir), fileURLToPath(event.entry)),
|
||||
);
|
||||
const collectionKey = JSON.stringify(collection);
|
||||
// If directory is multiple levels deep, it is not a collection. Ignore event.
|
||||
|
@ -137,7 +137,7 @@ export async function createContentTypesGenerator({
|
|||
fileURLToPath(event.entry),
|
||||
contentPaths,
|
||||
contentEntryExts,
|
||||
dataEntryExts
|
||||
dataEntryExts,
|
||||
);
|
||||
if (fileType === 'ignored') {
|
||||
return { shouldGenerateTypes: false };
|
||||
|
@ -156,9 +156,9 @@ export async function createContentTypesGenerator({
|
|||
'content',
|
||||
`${bold(
|
||||
normalizePath(
|
||||
path.relative(fileURLToPath(contentPaths.contentDir), fileURLToPath(event.entry))
|
||||
)
|
||||
)} must live in a ${bold('content/...')} collection subdirectory.`
|
||||
path.relative(fileURLToPath(contentPaths.contentDir), fileURLToPath(event.entry)),
|
||||
),
|
||||
)} must live in a ${bold('content/...')} collection subdirectory.`,
|
||||
);
|
||||
return { shouldGenerateTypes: false };
|
||||
}
|
||||
|
@ -406,7 +406,7 @@ async function writeContentFiles({
|
|||
message: AstroErrorData.ContentCollectionTypeMismatchError.message(
|
||||
collectionKey,
|
||||
collection.type,
|
||||
collectionConfig.type
|
||||
collectionConfig.type,
|
||||
),
|
||||
hint:
|
||||
collection.type === 'data'
|
||||
|
@ -438,7 +438,7 @@ async function writeContentFiles({
|
|||
for (const entryKey of collectionEntryKeys) {
|
||||
const entryMetadata = collection.entries[entryKey];
|
||||
const renderType = `{ render(): Render[${JSON.stringify(
|
||||
path.extname(JSON.parse(entryKey))
|
||||
path.extname(JSON.parse(entryKey)),
|
||||
)}] }`;
|
||||
|
||||
const slugType = JSON.stringify(entryMetadata.slug);
|
||||
|
@ -479,14 +479,14 @@ async function writeContentFiles({
|
|||
dateStrategy: ['format:date-time', 'format:date', 'integer'],
|
||||
}),
|
||||
null,
|
||||
2
|
||||
)
|
||||
2,
|
||||
),
|
||||
);
|
||||
} catch (err) {
|
||||
// This should error gracefully and not crash the dev server
|
||||
logger.warn(
|
||||
'content',
|
||||
`An error was encountered while creating the JSON schema for the ${collectionKey} collection. Proceeding without it. Error: ${err}`
|
||||
`An error was encountered while creating the JSON schema for the ${collectionKey} collection. Proceeding without it. Error: ${err}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -500,7 +500,7 @@ async function writeContentFiles({
|
|||
|
||||
const configPathRelativeToCacheDir = normalizeConfigPath(
|
||||
settings.dotAstroDir.pathname,
|
||||
contentPaths.config.url.pathname
|
||||
contentPaths.config.url.pathname,
|
||||
);
|
||||
|
||||
for (const contentEntryType of contentEntryTypes) {
|
||||
|
@ -512,11 +512,11 @@ async function writeContentFiles({
|
|||
typeTemplateContent = typeTemplateContent.replace('// @@DATA_ENTRY_MAP@@', dataTypesStr);
|
||||
typeTemplateContent = typeTemplateContent.replace(
|
||||
"'@@CONTENT_CONFIG_TYPE@@'",
|
||||
contentConfig ? `typeof import(${configPathRelativeToCacheDir})` : 'never'
|
||||
contentConfig ? `typeof import(${configPathRelativeToCacheDir})` : 'never',
|
||||
);
|
||||
|
||||
await fs.promises.writeFile(
|
||||
new URL(CONTENT_TYPES_FILE, settings.dotAstroDir),
|
||||
typeTemplateContent
|
||||
typeTemplateContent,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ export async function getEntryData(
|
|||
},
|
||||
collectionConfig: CollectionConfig,
|
||||
shouldEmitFile: boolean,
|
||||
pluginContext: PluginContext
|
||||
pluginContext: PluginContext,
|
||||
) {
|
||||
let data;
|
||||
if (collectionConfig.type === 'data') {
|
||||
|
@ -127,7 +127,7 @@ export async function getEntryData(
|
|||
message: AstroErrorData.InvalidContentEntryFrontmatterError.message(
|
||||
entry.collection,
|
||||
entry.id,
|
||||
parsed.error
|
||||
parsed.error,
|
||||
),
|
||||
location: {
|
||||
file: entry._internal.filePath,
|
||||
|
@ -151,7 +151,7 @@ export function getDataEntryExts(settings: Pick<AstroSettings, 'dataEntryTypes'>
|
|||
}
|
||||
|
||||
export function getEntryConfigByExtMap<TEntryType extends ContentEntryType | DataEntryType>(
|
||||
entryTypes: TEntryType[]
|
||||
entryTypes: TEntryType[],
|
||||
): Map<string, TEntryType> {
|
||||
const map = new Map<string, TEntryType>();
|
||||
for (const entryType of entryTypes) {
|
||||
|
@ -248,7 +248,7 @@ export function getDataEntryId({
|
|||
const relativePath = getRelativeEntryPath(entry, collection, contentDir);
|
||||
const withoutFileExt = normalizePath(relativePath).replace(
|
||||
new RegExp(path.extname(relativePath) + '$'),
|
||||
''
|
||||
'',
|
||||
);
|
||||
|
||||
return withoutFileExt;
|
||||
|
@ -290,7 +290,7 @@ export function getEntryType(
|
|||
entryPath: string,
|
||||
paths: Pick<ContentPaths, 'config' | 'contentDir'>,
|
||||
contentFileExts: string[],
|
||||
dataFileExts: string[]
|
||||
dataFileExts: string[],
|
||||
): 'content' | 'data' | 'config' | 'ignored' {
|
||||
const { ext } = path.parse(entryPath);
|
||||
const fileUrl = pathToFileURL(entryPath);
|
||||
|
@ -310,7 +310,7 @@ export function getEntryType(
|
|||
|
||||
function hasUnderscoreBelowContentDirectoryPath(
|
||||
fileUrl: URL,
|
||||
contentDir: ContentPaths['contentDir']
|
||||
contentDir: ContentPaths['contentDir'],
|
||||
): boolean {
|
||||
const parts = fileUrl.pathname.replace(contentDir.pathname, '').split('/');
|
||||
for (const part of parts) {
|
||||
|
@ -324,7 +324,7 @@ function getYAMLErrorLine(rawData: string | undefined, objectKey: string) {
|
|||
const indexOfObjectKey = rawData.search(
|
||||
// Match key either at the top of the file or after a newline
|
||||
// Ensures matching on top-level object keys only
|
||||
new RegExp(`(\n|^)${objectKey}`)
|
||||
new RegExp(`(\n|^)${objectKey}`),
|
||||
);
|
||||
if (indexOfObjectKey === -1) return 0;
|
||||
|
||||
|
@ -485,7 +485,7 @@ export type ContentPaths = {
|
|||
|
||||
export function getContentPaths(
|
||||
{ srcDir }: Pick<AstroConfig, 'root' | 'srcDir'>,
|
||||
fs: typeof fsMod = fsMod
|
||||
fs: typeof fsMod = fsMod,
|
||||
): ContentPaths {
|
||||
const configStats = search(fs, srcDir);
|
||||
const pkgBase = new URL('../../', import.meta.url);
|
||||
|
@ -499,7 +499,7 @@ export function getContentPaths(
|
|||
}
|
||||
function search(fs: typeof fsMod, srcDir: URL) {
|
||||
const paths = ['config.mjs', 'config.js', 'config.mts', 'config.ts'].map(
|
||||
(p) => new URL(`./content/${p}`, srcDir)
|
||||
(p) => new URL(`./content/${p}`, srcDir),
|
||||
);
|
||||
for (const file of paths) {
|
||||
if (fs.existsSync(file)) {
|
||||
|
|
|
@ -77,7 +77,7 @@ export function astroContentAssetPropagationPlugin({
|
|||
: await getScriptsForURL(
|
||||
pathToFileURL(basePath),
|
||||
settings.config.root,
|
||||
devModuleLoader
|
||||
devModuleLoader,
|
||||
);
|
||||
|
||||
// Register files we crawled to be able to retrieve the rendered styles and scripts,
|
||||
|
@ -127,7 +127,7 @@ export function astroContentAssetPropagationPlugin({
|
|||
|
||||
export function astroConfigBuildPlugin(
|
||||
options: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): AstroBuildPlugin {
|
||||
return {
|
||||
targets: ['server'],
|
||||
|
@ -176,7 +176,7 @@ export function astroConfigBuildPlugin(
|
|||
if (entryStyles.size) {
|
||||
newCode = newCode.replace(
|
||||
JSON.stringify(STYLES_PLACEHOLDER),
|
||||
JSON.stringify(Array.from(entryStyles))
|
||||
JSON.stringify(Array.from(entryStyles)),
|
||||
);
|
||||
} else {
|
||||
newCode = newCode.replace(JSON.stringify(STYLES_PLACEHOLDER), '[]');
|
||||
|
@ -184,7 +184,7 @@ export function astroConfigBuildPlugin(
|
|||
if (entryLinks.size) {
|
||||
newCode = newCode.replace(
|
||||
JSON.stringify(LINKS_PLACEHOLDER),
|
||||
JSON.stringify(Array.from(entryLinks).map(prependBase))
|
||||
JSON.stringify(Array.from(entryLinks).map(prependBase)),
|
||||
);
|
||||
} else {
|
||||
newCode = newCode.replace(JSON.stringify(LINKS_PLACEHOLDER), '[]');
|
||||
|
@ -210,8 +210,8 @@ export function astroConfigBuildPlugin(
|
|||
type: 'module',
|
||||
},
|
||||
children: '',
|
||||
}))
|
||||
)
|
||||
})),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
newCode = newCode.replace(JSON.stringify(SCRIPTS_PLACEHOLDER), '[]');
|
||||
|
|
|
@ -39,7 +39,7 @@ import {
|
|||
|
||||
function getContentRendererByViteId(
|
||||
viteId: string,
|
||||
settings: Pick<AstroSettings, 'contentEntryTypes'>
|
||||
settings: Pick<AstroSettings, 'contentEntryTypes'>,
|
||||
): ContentEntryType['getRenderModule'] | undefined {
|
||||
let ext = viteId.split('.').pop();
|
||||
if (!ext) return undefined;
|
||||
|
@ -215,7 +215,7 @@ type GetEntryModuleParams<TEntryType extends ContentEntryType | DataEntryType> =
|
|||
};
|
||||
|
||||
async function getContentEntryModule(
|
||||
params: GetEntryModuleParams<ContentEntryType>
|
||||
params: GetEntryModuleParams<ContentEntryType>,
|
||||
): Promise<ContentEntryModule> {
|
||||
const { fileId, contentDir, pluginContext } = params;
|
||||
const { collectionConfig, entryConfig, entry, rawContents, collection } =
|
||||
|
@ -245,7 +245,7 @@ async function getContentEntryModule(
|
|||
{ id, collection, _internal, unvalidatedData },
|
||||
collectionConfig,
|
||||
params.shouldEmitFile,
|
||||
pluginContext
|
||||
pluginContext,
|
||||
)
|
||||
: unvalidatedData;
|
||||
|
||||
|
@ -262,7 +262,7 @@ async function getContentEntryModule(
|
|||
}
|
||||
|
||||
async function getDataEntryModule(
|
||||
params: GetEntryModuleParams<DataEntryType>
|
||||
params: GetEntryModuleParams<DataEntryType>,
|
||||
): Promise<DataEntryModule> {
|
||||
const { fileId, contentDir, pluginContext } = params;
|
||||
const { collectionConfig, entryConfig, entry, rawContents, collection } =
|
||||
|
@ -280,7 +280,7 @@ async function getDataEntryModule(
|
|||
{ id, collection, _internal, unvalidatedData },
|
||||
collectionConfig,
|
||||
params.shouldEmitFile,
|
||||
pluginContext
|
||||
pluginContext,
|
||||
)
|
||||
: unvalidatedData;
|
||||
|
||||
|
@ -320,7 +320,7 @@ async function getEntryModuleBaseInfo<TEntryType extends ContentEntryType | Data
|
|||
throw new AstroError({
|
||||
...AstroErrorData.UnknownContentCollectionError,
|
||||
message: `No parser found for data entry ${JSON.stringify(
|
||||
fileId
|
||||
fileId,
|
||||
)}. Did you apply an integration for this file type?`,
|
||||
});
|
||||
}
|
||||
|
|
|
@ -129,21 +129,21 @@ export async function generateContentEntryFile({
|
|||
`import.meta.glob(${JSON.stringify(value)}, { query: { ${flag}: true } })`;
|
||||
contentEntryGlobResult = createGlob(
|
||||
globWithUnderscoresIgnored(relContentDir, contentEntryExts),
|
||||
CONTENT_FLAG
|
||||
CONTENT_FLAG,
|
||||
);
|
||||
dataEntryGlobResult = createGlob(
|
||||
globWithUnderscoresIgnored(relContentDir, dataEntryExts),
|
||||
DATA_FLAG
|
||||
DATA_FLAG,
|
||||
);
|
||||
renderEntryGlobResult = createGlob(
|
||||
globWithUnderscoresIgnored(relContentDir, contentEntryExts),
|
||||
CONTENT_RENDER_FLAG
|
||||
CONTENT_RENDER_FLAG,
|
||||
);
|
||||
} else {
|
||||
contentEntryGlobResult = getStringifiedCollectionFromLookup(
|
||||
'content',
|
||||
relContentDir,
|
||||
lookupMap
|
||||
lookupMap,
|
||||
);
|
||||
dataEntryGlobResult = getStringifiedCollectionFromLookup('data', relContentDir, lookupMap);
|
||||
renderEntryGlobResult = getStringifiedCollectionFromLookup('render', relContentDir, lookupMap);
|
||||
|
@ -168,7 +168,7 @@ console.warn('astro:content is only supported running server-side. Using it in t
|
|||
function getStringifiedCollectionFromLookup(
|
||||
wantedType: 'content' | 'data' | 'render',
|
||||
relContentDir: string,
|
||||
lookupMap: ContentLookupMap
|
||||
lookupMap: ContentLookupMap,
|
||||
) {
|
||||
let str = '{';
|
||||
// In dev, we don't need to normalize the import specifier at all. Vite handles it.
|
||||
|
@ -226,7 +226,7 @@ export async function generateLookupMap({
|
|||
absolute: true,
|
||||
cwd: fileURLToPath(root),
|
||||
fs,
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
// Run 10 at a time to prevent `await getEntrySlug` from accessing the filesystem all at once.
|
||||
|
@ -276,7 +276,7 @@ export async function generateLookupMap({
|
|||
collection,
|
||||
slug,
|
||||
lookupMap[collection].entries[slug],
|
||||
rootRelativePath(root, filePath)
|
||||
rootRelativePath(root, filePath),
|
||||
),
|
||||
hint:
|
||||
slug !== generatedSlug
|
||||
|
@ -301,7 +301,7 @@ export async function generateLookupMap({
|
|||
},
|
||||
};
|
||||
}
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import type { OutgoingHttpHeaders } from 'node:http';
|
|||
* @returns {OutgoingHttpHeaders} NodeJS OutgoingHttpHeaders object with multiple set-cookie handled as an array of values
|
||||
*/
|
||||
export const createOutgoingHttpHeaders = (
|
||||
headers: Headers | undefined | null
|
||||
headers: Headers | undefined | null,
|
||||
): OutgoingHttpHeaders | undefined => {
|
||||
if (!headers) {
|
||||
return undefined;
|
||||
|
|
|
@ -95,7 +95,7 @@ export class App {
|
|||
this.#pipeline = this.#createPipeline(this.#manifestData, streaming);
|
||||
this.#adapterLogger = new AstroIntegrationLogger(
|
||||
this.#logger.options,
|
||||
this.#manifest.adapterName
|
||||
this.#manifest.adapterName,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -114,7 +114,7 @@ export class App {
|
|||
if (this.#manifest.checkOrigin) {
|
||||
this.#manifest.middleware = sequence(
|
||||
createOriginCheckMiddleware(),
|
||||
this.#manifest.middleware
|
||||
this.#manifest.middleware,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -209,7 +209,7 @@ export class App {
|
|||
let locale;
|
||||
const hostAsUrl = new URL(`${protocol}//${host}`);
|
||||
for (const [domainKey, localeValue] of Object.entries(
|
||||
this.#manifest.i18n.domainLookupTable
|
||||
this.#manifest.i18n.domainLookupTable,
|
||||
)) {
|
||||
// This operation should be safe because we force the protocol via zod inside the configuration
|
||||
// If not, then it means that the manifest was tampered
|
||||
|
@ -226,7 +226,7 @@ export class App {
|
|||
|
||||
if (locale) {
|
||||
pathname = prependForwardSlash(
|
||||
joinPaths(normalizeTheLocale(locale), this.removeBase(url.pathname))
|
||||
joinPaths(normalizeTheLocale(locale), this.removeBase(url.pathname)),
|
||||
);
|
||||
if (url.pathname.endsWith('/')) {
|
||||
pathname = appendForwardSlash(pathname);
|
||||
|
@ -235,7 +235,7 @@ export class App {
|
|||
} catch (e: any) {
|
||||
this.#logger.error(
|
||||
'router',
|
||||
`Astro tried to parse ${protocol}//${host} as an URL, but it threw a parsing error. Check the X-Forwarded-Host and X-Forwarded-Proto headers.`
|
||||
`Astro tried to parse ${protocol}//${host} as an URL, but it threw a parsing error. Check the X-Forwarded-Host and X-Forwarded-Proto headers.`,
|
||||
);
|
||||
this.#logger.error('router', `Error: ${e}`);
|
||||
}
|
||||
|
@ -253,7 +253,7 @@ export class App {
|
|||
async render(
|
||||
request: Request,
|
||||
routeDataOrOptions?: RouteData | RenderOptions,
|
||||
maybeLocals?: object
|
||||
maybeLocals?: object,
|
||||
): Promise<Response> {
|
||||
let routeData: RouteData | undefined;
|
||||
let locals: object | undefined;
|
||||
|
@ -290,7 +290,7 @@ export class App {
|
|||
this.#logger.debug(
|
||||
'router',
|
||||
'The adapter ' + this.#manifest.adapterName + ' provided a custom RouteData for ',
|
||||
request.url
|
||||
request.url,
|
||||
);
|
||||
this.#logger.debug('router', 'RouteData:\n' + routeData);
|
||||
}
|
||||
|
@ -370,7 +370,7 @@ export class App {
|
|||
if (this.#renderOptionsDeprecationWarningShown) return;
|
||||
this.#logger.warn(
|
||||
'deprecated',
|
||||
`The adapter ${this.#manifest.adapterName} is using a deprecated signature of the 'app.render()' method. From Astro 4.0, locals and routeData are provided as properties on an optional object to this method. Using the old signature will cause an error in Astro 5.0. See https://github.com/withastro/astro/pull/9199 for more information.`
|
||||
`The adapter ${this.#manifest.adapterName} is using a deprecated signature of the 'app.render()' method. From Astro 4.0, locals and routeData are provided as properties on an optional object to this method. Using the old signature will cause an error in Astro 5.0. See https://github.com/withastro/astro/pull/9199 for more information.`,
|
||||
);
|
||||
this.#renderOptionsDeprecationWarningShown = true;
|
||||
}
|
||||
|
@ -404,7 +404,7 @@ export class App {
|
|||
response: originalResponse,
|
||||
skipMiddleware = false,
|
||||
error,
|
||||
}: RenderErrorOptions
|
||||
}: RenderErrorOptions,
|
||||
): Promise<Response> {
|
||||
const errorRoutePath = `/${status}${this.#manifest.trailingSlash === 'always' ? '/' : ''}`;
|
||||
const errorRouteData = matchRoute(errorRoutePath, this.#manifestData);
|
||||
|
@ -414,7 +414,7 @@ export class App {
|
|||
const maybeDotHtml = errorRouteData.route.endsWith(`/${status}`) ? '.html' : '';
|
||||
const statusURL = new URL(
|
||||
`${this.#baseWithoutTrailingSlash}/${status}${maybeDotHtml}`,
|
||||
url
|
||||
url,
|
||||
);
|
||||
const response = await fetch(statusURL.toString());
|
||||
|
||||
|
@ -459,7 +459,7 @@ export class App {
|
|||
#mergeResponses(
|
||||
newResponse: Response,
|
||||
originalResponse?: Response,
|
||||
override?: { status: 404 | 500 }
|
||||
override?: { status: 404 | 500 },
|
||||
) {
|
||||
if (!originalResponse) {
|
||||
if (override !== undefined) {
|
||||
|
|
|
@ -37,7 +37,7 @@ export class NodeApp extends App {
|
|||
render(
|
||||
req: NodeRequest | Request,
|
||||
routeDataOrOptions?: RouteData | RenderOptions,
|
||||
maybeLocals?: object
|
||||
maybeLocals?: object,
|
||||
) {
|
||||
if (!(req instanceof Request)) {
|
||||
req = NodeApp.createRequest(req);
|
||||
|
@ -120,7 +120,7 @@ export class NodeApp extends App {
|
|||
// eslint-disable-next-line no-console
|
||||
console.error(
|
||||
`There was an uncaught error in the middle of the stream while rendering ${destination.req.url}.`,
|
||||
err
|
||||
err,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -36,7 +36,7 @@ export class AppPipeline extends Pipeline {
|
|||
| 'serverLike'
|
||||
| 'streaming'
|
||||
| 'defaultRoutes'
|
||||
>
|
||||
>,
|
||||
) {
|
||||
const pipeline = new AppPipeline(
|
||||
logger,
|
||||
|
@ -55,7 +55,7 @@ export class AppPipeline extends Pipeline {
|
|||
undefined,
|
||||
undefined,
|
||||
false,
|
||||
defaultRoutes
|
||||
defaultRoutes,
|
||||
);
|
||||
pipeline.#manifestData = manifestData;
|
||||
return pipeline;
|
||||
|
@ -93,7 +93,7 @@ export class AppPipeline extends Pipeline {
|
|||
async tryRewrite(
|
||||
payload: RewritePayload,
|
||||
request: Request,
|
||||
_sourceRoute: RouteData
|
||||
_sourceRoute: RouteData,
|
||||
): Promise<[RouteData, ComponentInstance, URL]> {
|
||||
const [foundRoute, finalUrl] = findRouteToRewrite({
|
||||
payload,
|
||||
|
@ -125,7 +125,7 @@ export class AppPipeline extends Pipeline {
|
|||
const importComponentInstance = this.manifest.pageMap.get(route.component);
|
||||
if (!importComponentInstance) {
|
||||
throw new Error(
|
||||
`Unexpectedly unable to find a component instance for route ${route.route}`
|
||||
`Unexpectedly unable to find a component instance for route ${route.route}`,
|
||||
);
|
||||
}
|
||||
return await importComponentInstance();
|
||||
|
@ -133,7 +133,7 @@ export class AppPipeline extends Pipeline {
|
|||
return this.manifest.pageModule;
|
||||
}
|
||||
throw new Error(
|
||||
"Astro couldn't find the correct page to render, probably because it wasn't correctly mapped for SSR usage. This is an internal error, please file an issue."
|
||||
"Astro couldn't find the correct page to render, probably because it wasn't correctly mapped for SSR usage. This is an internal error, please file an issue.",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,13 +58,13 @@ export abstract class Pipeline {
|
|||
* Array of built-in, internal, routes.
|
||||
* Used to find the route module
|
||||
*/
|
||||
readonly defaultRoutes = createDefaultRoutes(manifest)
|
||||
readonly defaultRoutes = createDefaultRoutes(manifest),
|
||||
) {
|
||||
this.internalMiddleware = [];
|
||||
// We do use our middleware only if the user isn't using the manual setup
|
||||
if (i18n?.strategy !== 'manual') {
|
||||
this.internalMiddleware.push(
|
||||
createI18nMiddleware(i18n, manifest.base, manifest.trailingSlash, manifest.buildFormat)
|
||||
createI18nMiddleware(i18n, manifest.base, manifest.trailingSlash, manifest.buildFormat),
|
||||
);
|
||||
}
|
||||
// In SSR, getSecret should fail by default. Setting it here will run before the
|
||||
|
@ -94,7 +94,7 @@ export abstract class Pipeline {
|
|||
abstract tryRewrite(
|
||||
rewritePayload: RewritePayload,
|
||||
request: Request,
|
||||
sourceRoute: RouteData
|
||||
sourceRoute: RouteData,
|
||||
): Promise<[RouteData, ComponentInstance, URL]>;
|
||||
|
||||
/**
|
||||
|
|
|
@ -10,7 +10,7 @@ function fromEntries<V>(entries: [string, V][]) {
|
|||
|
||||
export function addRollupInput(
|
||||
inputOptions: Rollup.InputOptions,
|
||||
newInputs: string[]
|
||||
newInputs: string[],
|
||||
): Rollup.InputOptions {
|
||||
// Add input module ids to existing input option, whether it's a string, array or object
|
||||
// this way you can use multiple html plugins all adding their own inputs
|
||||
|
|
|
@ -17,7 +17,7 @@ function getOutRoot(astroConfig: AstroConfig): URL {
|
|||
export function getOutFolder(
|
||||
astroConfig: AstroConfig,
|
||||
pathname: string,
|
||||
routeData: RouteData
|
||||
routeData: RouteData,
|
||||
): URL {
|
||||
const outRoot = getOutRoot(astroConfig);
|
||||
const routeType = routeData.type;
|
||||
|
@ -59,7 +59,7 @@ export function getOutFile(
|
|||
astroConfig: AstroConfig,
|
||||
outFolder: URL,
|
||||
pathname: string,
|
||||
routeData: RouteData
|
||||
routeData: RouteData,
|
||||
): URL {
|
||||
const routeType = routeData.type;
|
||||
switch (routeType) {
|
||||
|
|
|
@ -21,7 +21,7 @@ export function shortHashedName(settings: AstroSettings) {
|
|||
return createNameHash(
|
||||
getFirstParentId(parents),
|
||||
parents.map((page) => page.id),
|
||||
settings
|
||||
settings,
|
||||
);
|
||||
};
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ export function shortHashedName(settings: AstroSettings) {
|
|||
export function createNameHash(
|
||||
baseId: string | undefined,
|
||||
hashIds: string[],
|
||||
settings: AstroSettings
|
||||
settings: AstroSettings,
|
||||
): string {
|
||||
const baseName = baseId ? prettifyBaseName(npath.parse(baseId).name) : 'index';
|
||||
const hash = crypto.createHash('sha256');
|
||||
|
|
|
@ -69,14 +69,14 @@ export async function generatePages(options: StaticBuildOptions, internals: Buil
|
|||
// middleware.mjs is not emitted if there is no user middleware
|
||||
// in which case the import fails with ERR_MODULE_NOT_FOUND, and we fall back to a no-op middleware
|
||||
middleware = await import(new URL('middleware.mjs', baseDirectory).toString()).then(
|
||||
(mod) => mod.onRequest
|
||||
(mod) => mod.onRequest,
|
||||
);
|
||||
} catch {}
|
||||
manifest = createBuildManifest(
|
||||
options.settings,
|
||||
internals,
|
||||
renderers.renderers as SSRLoadedRenderer[],
|
||||
middleware
|
||||
middleware,
|
||||
);
|
||||
}
|
||||
const pipeline = BuildPipeline.create({ internals, manifest, options });
|
||||
|
@ -118,7 +118,7 @@ export async function generatePages(options: StaticBuildOptions, internals: Buil
|
|||
} else {
|
||||
const ssrEntryURLPage = createEntryURL(filePath, outFolder);
|
||||
throw new Error(
|
||||
`Unable to find the manifest for the module ${ssrEntryURLPage.toString()}. This is unexpected and likely a bug in Astro, please report.`
|
||||
`Unable to find the manifest for the module ${ssrEntryURLPage.toString()}. This is unexpected and likely a bug in Astro, please report.`,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
@ -135,7 +135,7 @@ export async function generatePages(options: StaticBuildOptions, internals: Buil
|
|||
}
|
||||
logger.info(
|
||||
null,
|
||||
green(`✓ Completed in ${getTimeStat(generatePagesTimer, performance.now())}.\n`)
|
||||
green(`✓ Completed in ${getTimeStat(generatePagesTimer, performance.now())}.\n`),
|
||||
);
|
||||
|
||||
const staticImageList = getStaticImageList();
|
||||
|
@ -170,7 +170,7 @@ async function generatePage(
|
|||
pageData: PageBuildData,
|
||||
ssrEntry: SinglePageBuiltModule,
|
||||
builtPaths: Set<string>,
|
||||
pipeline: BuildPipeline
|
||||
pipeline: BuildPipeline,
|
||||
) {
|
||||
// prepare information we need
|
||||
const { config, logger } = pipeline;
|
||||
|
@ -186,7 +186,7 @@ async function generatePage(
|
|||
const scripts = pageData.hoistedScript ?? null;
|
||||
if (!pageModulePromise) {
|
||||
throw new Error(
|
||||
`Unable to find the module for ${pageData.component}. This is unexpected and likely a bug in Astro, please report.`
|
||||
`Unable to find the module for ${pageData.component}. This is unexpected and likely a bug in Astro, please report.`,
|
||||
);
|
||||
}
|
||||
const pageModule = await pageModulePromise();
|
||||
|
@ -241,7 +241,7 @@ async function getPathsForRoute(
|
|||
route: RouteData,
|
||||
mod: ComponentInstance,
|
||||
pipeline: BuildPipeline,
|
||||
builtPaths: Set<string>
|
||||
builtPaths: Set<string>,
|
||||
): Promise<Array<string>> {
|
||||
const { logger, options, routeCache, serverLike } = pipeline;
|
||||
let paths: Array<string> = [];
|
||||
|
@ -263,7 +263,7 @@ async function getPathsForRoute(
|
|||
const label = staticPaths.length === 1 ? 'page' : 'pages';
|
||||
logger.debug(
|
||||
'build',
|
||||
`├── ${bold(green('√'))} ${route.component} → ${magenta(`[${staticPaths.length} ${label}]`)}`
|
||||
`├── ${bold(green('√'))} ${route.component} → ${magenta(`[${staticPaths.length} ${label}]`)}`,
|
||||
);
|
||||
|
||||
paths = staticPaths
|
||||
|
@ -304,7 +304,7 @@ async function getPathsForRoute(
|
|||
function getInvalidRouteSegmentError(
|
||||
e: TypeError,
|
||||
route: RouteData,
|
||||
staticPath: GetStaticPathsItem
|
||||
staticPath: GetStaticPathsItem,
|
||||
): AstroError {
|
||||
const invalidParam = /^Expected "([^"]+)"/.exec(e.message)?.[1];
|
||||
const received = invalidParam ? staticPath.params[invalidParam] : undefined;
|
||||
|
@ -312,7 +312,7 @@ function getInvalidRouteSegmentError(
|
|||
'Learn about dynamic routes at https://docs.astro.build/en/core-concepts/routing/#dynamic-routes';
|
||||
if (invalidParam && typeof received === 'string') {
|
||||
const matchingSegment = route.segments.find(
|
||||
(segment) => segment[0]?.content === invalidParam
|
||||
(segment) => segment[0]?.content === invalidParam,
|
||||
)?.[0];
|
||||
const mightBeMissingSpread = matchingSegment?.dynamic && !matchingSegment?.spread;
|
||||
if (mightBeMissingSpread) {
|
||||
|
@ -325,7 +325,7 @@ function getInvalidRouteSegmentError(
|
|||
? AstroErrorData.InvalidDynamicRoute.message(
|
||||
route.route,
|
||||
JSON.stringify(invalidParam),
|
||||
JSON.stringify(received)
|
||||
JSON.stringify(received),
|
||||
)
|
||||
: `Generated path for ${route.route} is invalid.`,
|
||||
hint,
|
||||
|
@ -355,7 +355,7 @@ function getUrlForPath(
|
|||
origin: string,
|
||||
format: AstroConfig['build']['format'],
|
||||
trailingSlash: AstroConfig['trailingSlash'],
|
||||
routeType: RouteType
|
||||
routeType: RouteType,
|
||||
): URL {
|
||||
/**
|
||||
* Examples:
|
||||
|
@ -402,7 +402,7 @@ async function generatePath(
|
|||
pathname: string,
|
||||
pipeline: BuildPipeline,
|
||||
gopts: GeneratePathOptions,
|
||||
route: RouteData
|
||||
route: RouteData,
|
||||
) {
|
||||
const { mod } = gopts;
|
||||
const { config, logger, options } = pipeline;
|
||||
|
@ -432,7 +432,7 @@ async function generatePath(
|
|||
options.origin,
|
||||
config.build.format,
|
||||
config.trailingSlash,
|
||||
route.type
|
||||
route.type,
|
||||
);
|
||||
|
||||
const request = createRequest({
|
||||
|
@ -520,7 +520,7 @@ function createBuildManifest(
|
|||
settings: AstroSettings,
|
||||
internals: BuildInternals,
|
||||
renderers: SSRLoadedRenderer[],
|
||||
middleware: MiddlewareHandler
|
||||
middleware: MiddlewareHandler,
|
||||
): SSRManifest {
|
||||
let i18nManifest: SSRManifestI18n | undefined = undefined;
|
||||
if (settings.config.i18n) {
|
||||
|
|
|
@ -17,7 +17,7 @@ export function getParentExtendedModuleInfos(
|
|||
order = 0,
|
||||
childId = '',
|
||||
seen = new Set<string>(),
|
||||
accumulated: ExtendedModuleInfo[] = []
|
||||
accumulated: ExtendedModuleInfo[] = [],
|
||||
): ExtendedModuleInfo[] {
|
||||
seen.add(id);
|
||||
|
||||
|
@ -54,7 +54,7 @@ export function getParentModuleInfos(
|
|||
ctx: { getModuleInfo: GetModuleInfo },
|
||||
until?: (importer: string) => boolean,
|
||||
seen = new Set<string>(),
|
||||
accumulated: ModuleInfo[] = []
|
||||
accumulated: ModuleInfo[] = [],
|
||||
): ModuleInfo[] {
|
||||
seen.add(id);
|
||||
|
||||
|
@ -88,7 +88,7 @@ export function moduleIsTopLevelPage(info: ModuleInfo): boolean {
|
|||
// This could be a .astro page, a .markdown or a .md (or really any file extension for markdown files) page.
|
||||
export function getTopLevelPageModuleInfos(
|
||||
id: string,
|
||||
ctx: { getModuleInfo: GetModuleInfo }
|
||||
ctx: { getModuleInfo: GetModuleInfo },
|
||||
): ModuleInfo[] {
|
||||
return getParentModuleInfos(id, ctx).filter(moduleIsTopLevelPage);
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ export interface BuildOptions {
|
|||
*/
|
||||
export default async function build(
|
||||
inlineConfig: AstroInlineConfig,
|
||||
options: BuildOptions = {}
|
||||
options: BuildOptions = {},
|
||||
): Promise<void> {
|
||||
ensureProcessNodeEnv('production');
|
||||
applyPolyfill();
|
||||
|
@ -140,7 +140,13 @@ class AstroBuilder {
|
|||
middlewareMode: true,
|
||||
},
|
||||
},
|
||||
{ settings: this.settings, logger: this.logger, mode: 'build', command: 'build', sync: false }
|
||||
{
|
||||
settings: this.settings,
|
||||
logger: this.logger,
|
||||
mode: 'build',
|
||||
command: 'build',
|
||||
sync: false,
|
||||
},
|
||||
);
|
||||
await runHookConfigDone({ settings: this.settings, logger: logger });
|
||||
|
||||
|
@ -182,7 +188,7 @@ class AstroBuilder {
|
|||
this.timer.buildStart = performance.now();
|
||||
this.logger.info(
|
||||
'build',
|
||||
green(`✓ Completed in ${getTimeStat(this.timer.init, performance.now())}.`)
|
||||
green(`✓ Completed in ${getTimeStat(this.timer.init, performance.now())}.`),
|
||||
);
|
||||
|
||||
const opts: StaticBuildOptions = {
|
||||
|
@ -221,7 +227,7 @@ class AstroBuilder {
|
|||
.concat(
|
||||
this.settings.config.experimental.serverIslands
|
||||
? [getServerIslandRouteData(this.settings.config)]
|
||||
: []
|
||||
: [],
|
||||
),
|
||||
logging: this.logger,
|
||||
cacheManifest: internals.cacheManifestUsed,
|
||||
|
@ -256,7 +262,7 @@ class AstroBuilder {
|
|||
// outDir gets blown away so it can't be the root.
|
||||
if (config.outDir.toString() === config.root.toString()) {
|
||||
throw new Error(
|
||||
`the outDir cannot be the root folder. Please build to a folder such as dist.`
|
||||
`the outDir cannot be the root folder. Please build to a folder such as dist.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -150,7 +150,7 @@ export function trackPageData(
|
|||
component: string,
|
||||
pageData: PageBuildData,
|
||||
componentModuleId: string,
|
||||
componentURL: URL
|
||||
componentURL: URL,
|
||||
): void {
|
||||
pageData.moduleSpecifier = componentModuleId;
|
||||
internals.pagesByKeys.set(pageData.key, pageData);
|
||||
|
@ -163,7 +163,7 @@ export function trackPageData(
|
|||
export function trackClientOnlyPageDatas(
|
||||
internals: BuildInternals,
|
||||
pageData: PageBuildData,
|
||||
clientOnlys: string[]
|
||||
clientOnlys: string[],
|
||||
) {
|
||||
for (const clientOnlyComponent of clientOnlys) {
|
||||
let pageDataSet: Set<PageBuildData>;
|
||||
|
@ -184,7 +184,7 @@ export function trackClientOnlyPageDatas(
|
|||
export function trackScriptPageDatas(
|
||||
internals: BuildInternals,
|
||||
pageData: PageBuildData,
|
||||
scriptIds: string[]
|
||||
scriptIds: string[],
|
||||
) {
|
||||
for (const scriptId of scriptIds) {
|
||||
let pageDataSet: Set<PageBuildData>;
|
||||
|
@ -200,7 +200,7 @@ export function trackScriptPageDatas(
|
|||
|
||||
export function* getPageDatasByClientOnlyID(
|
||||
internals: BuildInternals,
|
||||
viteid: ViteID
|
||||
viteid: ViteID,
|
||||
): Generator<PageBuildData, void, unknown> {
|
||||
const pagesByClientOnly = internals.pagesByClientOnly;
|
||||
if (pagesByClientOnly.size) {
|
||||
|
@ -238,7 +238,7 @@ export function* getPageDatasByClientOnlyID(
|
|||
export function getPageData(
|
||||
internals: BuildInternals,
|
||||
route: string,
|
||||
component: string
|
||||
component: string,
|
||||
): PageBuildData | undefined {
|
||||
let pageData = internals.pagesByKeys.get(makePageDataKey(route, component));
|
||||
if (pageData) {
|
||||
|
@ -271,7 +271,7 @@ function getPagesDatasByComponent(internals: BuildInternals, component: string):
|
|||
* @param pagesByKeys A map of all page data by their internal key
|
||||
*/
|
||||
export function getPageDatasWithPublicKey(
|
||||
pagesByKeys: Map<string, PageBuildData>
|
||||
pagesByKeys: Map<string, PageBuildData>,
|
||||
): Map<string, PageBuildData> {
|
||||
// Create a map to store the pages with the public key, mimicking internal.pagesByKeys
|
||||
const pagesWithPublicKey = new Map<string, PageBuildData>();
|
||||
|
@ -303,7 +303,7 @@ export function getPageDatasWithPublicKey(
|
|||
|
||||
export function getPageDataByViteID(
|
||||
internals: BuildInternals,
|
||||
viteid: ViteID
|
||||
viteid: ViteID,
|
||||
): PageBuildData | undefined {
|
||||
if (internals.pagesByViteID.has(viteid)) {
|
||||
return internals.pagesByViteID.get(viteid);
|
||||
|
@ -358,7 +358,7 @@ export function cssOrder(a: OrderInfo, b: OrderInfo) {
|
|||
|
||||
export function mergeInlineCss(
|
||||
acc: Array<StylesheetAsset>,
|
||||
current: StylesheetAsset
|
||||
current: StylesheetAsset,
|
||||
): Array<StylesheetAsset> {
|
||||
const lastAdded = acc.at(acc.length - 1);
|
||||
const lastWasInline = lastAdded?.type === 'inline';
|
||||
|
@ -379,7 +379,7 @@ export function mergeInlineCss(
|
|||
*/
|
||||
export function getPageDatasByHoistedScriptId(
|
||||
internals: BuildInternals,
|
||||
id: string
|
||||
id: string,
|
||||
): PageBuildData[] {
|
||||
const set = internals.hoistedScriptIdToPagesMap.get(id);
|
||||
const pageDatas: PageBuildData[] = [];
|
||||
|
|
|
@ -46,7 +46,7 @@ export function collectPagesData(opts: CollectPagesDataOptions): CollectPagesDat
|
|||
const html = `${route.pathname}`.replace(/\/?$/, '/index.html');
|
||||
debug(
|
||||
'build',
|
||||
`├── ${colors.bold(colors.green('✔'))} ${route.component} → ${colors.yellow(html)}`
|
||||
`├── ${colors.bold(colors.green('✔'))} ${route.component} → ${colors.yellow(html)}`,
|
||||
);
|
||||
} else {
|
||||
debug('build', `├── ${colors.bold(colors.green('✔'))} ${route.component}`);
|
||||
|
|
|
@ -54,7 +54,7 @@ export class BuildPipeline extends Pipeline {
|
|||
readonly options: StaticBuildOptions,
|
||||
readonly config = options.settings.config,
|
||||
readonly settings = options.settings,
|
||||
readonly defaultRoutes = createDefaultRoutes(manifest)
|
||||
readonly defaultRoutes = createDefaultRoutes(manifest),
|
||||
) {
|
||||
const resolveCache = new Map<string, string>();
|
||||
|
||||
|
@ -87,7 +87,7 @@ export class BuildPipeline extends Pipeline {
|
|||
manifest.renderers,
|
||||
resolve,
|
||||
serverLike,
|
||||
streaming
|
||||
streaming,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -114,18 +114,18 @@ export class BuildPipeline extends Pipeline {
|
|||
*/
|
||||
static async retrieveManifest(
|
||||
staticBuildOptions: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): Promise<SSRManifest> {
|
||||
const config = staticBuildOptions.settings.config;
|
||||
const baseDirectory = getOutputDirectory(config);
|
||||
const manifestEntryUrl = new URL(
|
||||
`${internals.manifestFileName}?time=${Date.now()}`,
|
||||
baseDirectory
|
||||
baseDirectory,
|
||||
);
|
||||
const { manifest } = await import(manifestEntryUrl.toString());
|
||||
if (!manifest) {
|
||||
throw new Error(
|
||||
"Astro couldn't find the emitted manifest. This is an internal error, please file an issue."
|
||||
"Astro couldn't find the emitted manifest. This is an internal error, please file an issue.",
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -140,7 +140,7 @@ export class BuildPipeline extends Pipeline {
|
|||
|
||||
if (!renderers) {
|
||||
throw new Error(
|
||||
"Astro couldn't find the emitted renderers. This is an internal error, please file an issue."
|
||||
"Astro couldn't find the emitted renderers. This is an internal error, please file an issue.",
|
||||
);
|
||||
}
|
||||
return {
|
||||
|
@ -161,7 +161,7 @@ export class BuildPipeline extends Pipeline {
|
|||
const scripts = createModuleScriptsSet(
|
||||
pageBuildData?.hoistedScript ? [pageBuildData.hoistedScript] : [],
|
||||
base,
|
||||
assetsPrefix
|
||||
assetsPrefix,
|
||||
);
|
||||
const sortedCssAssets = pageBuildData?.styles
|
||||
.sort(cssOrder)
|
||||
|
@ -216,8 +216,8 @@ export class BuildPipeline extends Pipeline {
|
|||
...getPagesFromVirtualModulePageName(
|
||||
this.internals,
|
||||
ASTRO_PAGE_RESOLVED_MODULE_ID,
|
||||
virtualModulePageName
|
||||
)
|
||||
virtualModulePageName,
|
||||
),
|
||||
);
|
||||
}
|
||||
if (virtualModulePageName.includes(RESOLVED_SPLIT_MODULE_ID)) {
|
||||
|
@ -225,8 +225,8 @@ export class BuildPipeline extends Pipeline {
|
|||
...getPagesFromVirtualModulePageName(
|
||||
this.internals,
|
||||
RESOLVED_SPLIT_MODULE_ID,
|
||||
virtualModulePageName
|
||||
)
|
||||
virtualModulePageName,
|
||||
),
|
||||
);
|
||||
}
|
||||
for (const pageData of pageDatas) {
|
||||
|
@ -288,7 +288,7 @@ export class BuildPipeline extends Pipeline {
|
|||
async tryRewrite(
|
||||
payload: RewritePayload,
|
||||
request: Request,
|
||||
_sourceRoute: RouteData
|
||||
_sourceRoute: RouteData,
|
||||
): Promise<[RouteData, ComponentInstance, URL]> {
|
||||
const [foundRoute, finalUrl] = findRouteToRewrite({
|
||||
payload,
|
||||
|
@ -324,7 +324,7 @@ export class BuildPipeline extends Pipeline {
|
|||
async #getEntryForFallbackRoute(
|
||||
route: RouteData,
|
||||
internals: BuildInternals,
|
||||
outFolder: URL
|
||||
outFolder: URL,
|
||||
): Promise<SinglePageBuiltModule> {
|
||||
if (route.type !== 'fallback') {
|
||||
throw new Error(`Expected a redirect route.`);
|
||||
|
@ -344,7 +344,7 @@ export class BuildPipeline extends Pipeline {
|
|||
async #getEntryForRedirectRoute(
|
||||
route: RouteData,
|
||||
internals: BuildInternals,
|
||||
outFolder: URL
|
||||
outFolder: URL,
|
||||
): Promise<SinglePageBuiltModule> {
|
||||
if (route.type !== 'redirect') {
|
||||
throw new Error(`Expected a redirect route.`);
|
||||
|
|
|
@ -22,7 +22,7 @@ The emitted file has content similar to:
|
|||
const renderers = [
|
||||
Object.assign(
|
||||
{ name: 'astro:jsx', serverEntrypoint: 'astro/jsx/server.js', jsxImportSource: 'astro' },
|
||||
{ ssr: server_default }
|
||||
{ ssr: server_default },
|
||||
),
|
||||
];
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ function isPropagatedAsset(id: string) {
|
|||
|
||||
export function vitePluginAnalyzer(
|
||||
options: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): VitePlugin {
|
||||
function hoistedScriptScanner() {
|
||||
const uniqueHoistedIds = new Map<string, string>();
|
||||
|
@ -43,7 +43,7 @@ export function vitePluginAnalyzer(
|
|||
async scan(
|
||||
this: PluginContext,
|
||||
scripts: AstroPluginMetadata['astro']['scripts'],
|
||||
from: string
|
||||
from: string,
|
||||
) {
|
||||
const hoistedScripts = new Set<string>();
|
||||
for (let i = 0; i < scripts.length; i++) {
|
||||
|
@ -178,7 +178,7 @@ export function vitePluginAnalyzer(
|
|||
// `discoveredScripts` here, which will eventually be passed as inputs of the client build.
|
||||
if (options.settings.config.experimental.directRenderScript && astro.scripts.length) {
|
||||
const scriptIds = astro.scripts.map(
|
||||
(_, i) => `${id.replace('/@fs', '')}?astro&type=script&index=${i}&lang.ts`
|
||||
(_, i) => `${id.replace('/@fs', '')}?astro&type=script&index=${i}&lang.ts`,
|
||||
);
|
||||
|
||||
// Assign as entrypoints for the client bundle
|
||||
|
@ -204,7 +204,7 @@ export function vitePluginAnalyzer(
|
|||
|
||||
export function pluginAnalyzer(
|
||||
options: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): AstroBuildPlugin {
|
||||
return {
|
||||
targets: ['server'],
|
||||
|
|
|
@ -80,7 +80,7 @@ function vitePluginContent(
|
|||
opts: StaticBuildOptions,
|
||||
lookupMap: ContentLookupMap,
|
||||
internals: BuildInternals,
|
||||
cachedBuildOutput: Array<{ cached: URL; dist: URL }>
|
||||
cachedBuildOutput: Array<{ cached: URL; dist: URL }>,
|
||||
): VitePlugin {
|
||||
const { config } = opts.settings;
|
||||
const distContentRoot = getContentRoot(config);
|
||||
|
@ -184,7 +184,7 @@ function vitePluginContent(
|
|||
) {
|
||||
const [srcRelativePath] = id.replace(rootPath, '/').split('?');
|
||||
const resultId = encodeName(
|
||||
`${removeLeadingForwardSlash(removeFileExtension(srcRelativePath))}.render.mjs`
|
||||
`${removeLeadingForwardSlash(removeFileExtension(srcRelativePath))}.render.mjs`,
|
||||
);
|
||||
return resultId;
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ function vitePluginContent(
|
|||
const collectionEntry = findEntryFromSrcRelativePath(
|
||||
lookupMap,
|
||||
srcRelativePath,
|
||||
entryCache
|
||||
entryCache,
|
||||
);
|
||||
if (collectionEntry) {
|
||||
let suffix = '.mjs';
|
||||
|
@ -201,7 +201,7 @@ function vitePluginContent(
|
|||
}
|
||||
id =
|
||||
removeLeadingForwardSlash(
|
||||
removeFileExtension(encodeName(id.replace(srcPath, '/')))
|
||||
removeFileExtension(encodeName(id.replace(srcPath, '/'))),
|
||||
) + suffix;
|
||||
return id;
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ function vitePluginContent(
|
|||
function findEntryFromSrcRelativePath(
|
||||
lookupMap: ContentLookupMap,
|
||||
srcRelativePath: string,
|
||||
entryCache: Map<string, string>
|
||||
entryCache: Map<string, string>,
|
||||
) {
|
||||
let value = entryCache.get(srcRelativePath);
|
||||
if (value) return value;
|
||||
|
@ -308,7 +308,7 @@ interface ContentEntries {
|
|||
|
||||
function getEntriesFromManifests(
|
||||
oldManifest: ContentManifest,
|
||||
newManifest: ContentManifest
|
||||
newManifest: ContentManifest,
|
||||
): ContentEntries {
|
||||
const { entries: oldEntries } = oldManifest;
|
||||
const { entries: newEntries } = newManifest;
|
||||
|
@ -320,7 +320,7 @@ function getEntriesFromManifests(
|
|||
return entries;
|
||||
}
|
||||
const oldEntryHashMap = new Map<string, ContentManifestKey>(
|
||||
oldEntries.map(([key, hash]) => [hash, key])
|
||||
oldEntries.map(([key, hash]) => [hash, key]),
|
||||
);
|
||||
|
||||
for (const [entry, hash] of newEntryMap) {
|
||||
|
@ -367,7 +367,7 @@ function manifestState(oldManifest: ContentManifest, newManifest: ContentManifes
|
|||
|
||||
async function generateContentManifest(
|
||||
opts: StaticBuildOptions,
|
||||
lookupMap: ContentLookupMap
|
||||
lookupMap: ContentLookupMap,
|
||||
): Promise<ContentManifest> {
|
||||
let manifest = createContentManifest();
|
||||
manifest.version = CONTENT_MANIFEST_VERSION;
|
||||
|
@ -382,7 +382,7 @@ async function generateContentManifest(
|
|||
limit(async () => {
|
||||
const data = await fsMod.promises.readFile(fileURL, { encoding: 'utf8' });
|
||||
manifest.entries.push([key, checksum(data, fileURL.toString())]);
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -480,7 +480,7 @@ export async function copyContentToCache(opts: StaticBuildOptions) {
|
|||
|
||||
export function pluginContent(
|
||||
opts: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): AstroBuildPlugin {
|
||||
const { cacheDir, outDir } = opts.settings.config;
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ interface PluginOptions {
|
|||
|
||||
export function pluginCSS(
|
||||
options: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): AstroBuildPlugin {
|
||||
return {
|
||||
targets: ['client', 'server'],
|
||||
|
@ -206,7 +206,7 @@ function rollupPluginAstroBuildCSS(options: PluginOptions): VitePlugin[] {
|
|||
// Ref: https://github.com/vitejs/vite/blob/b2c0ee04d4db4a0ef5a084c50f49782c5f88587c/packages/vite/src/node/plugins/html.ts#L690-L705
|
||||
if (resolvedConfig.build.cssCodeSplit) return;
|
||||
const cssChunk = Object.values(bundle).find(
|
||||
(chunk) => chunk.type === 'asset' && chunk.name === 'style.css'
|
||||
(chunk) => chunk.type === 'asset' && chunk.name === 'style.css',
|
||||
);
|
||||
if (cssChunk === undefined) return;
|
||||
for (const pageData of internals.pagesByKeys.values()) {
|
||||
|
@ -293,7 +293,7 @@ function rollupPluginAstroBuildCSS(options: PluginOptions): VitePlugin[] {
|
|||
function* getParentClientOnlys(
|
||||
id: string,
|
||||
ctx: { getModuleInfo: GetModuleInfo },
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): Generator<PageBuildData, void, unknown> {
|
||||
for (const info of getParentModuleInfos(id, ctx)) {
|
||||
yield* getPageDatasByClientOnlyID(internals, info.id);
|
||||
|
@ -310,7 +310,7 @@ function appendCSSToPage(
|
|||
meta: ViteMetadata,
|
||||
pagesToCss: Record<string, Record<string, { order: number; depth: number }>>,
|
||||
depth: number,
|
||||
order: number
|
||||
order: number,
|
||||
) {
|
||||
for (const importedCssImport of meta.importedCss) {
|
||||
// CSS is prioritized based on depth. Shared CSS has a higher depth due to being imported by multiple pages.
|
||||
|
@ -341,7 +341,7 @@ function appendCSSToPage(
|
|||
*/
|
||||
function isCssScopeToRendered(
|
||||
cssScopeTo: Record<string, string[]>,
|
||||
chunks: Rollup.RenderedChunk[]
|
||||
chunks: Rollup.RenderedChunk[],
|
||||
) {
|
||||
for (const moduleId in cssScopeTo) {
|
||||
const exports = cssScopeTo[moduleId];
|
||||
|
|
|
@ -13,7 +13,7 @@ function virtualHoistedEntry(id: string) {
|
|||
|
||||
export function vitePluginHoistedScripts(
|
||||
settings: AstroSettings,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): VitePlugin {
|
||||
let assetsInlineLimit: NonNullable<BuildOptions['assetsInlineLimit']>;
|
||||
|
||||
|
@ -104,7 +104,7 @@ export function vitePluginHoistedScripts(
|
|||
|
||||
export function pluginHoistedScripts(
|
||||
options: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): AstroBuildPlugin {
|
||||
return {
|
||||
targets: ['client'],
|
||||
|
|
|
@ -36,7 +36,7 @@ export function vitePluginInternals(input: Set<string>, internals: BuildInternal
|
|||
mapping.set(result.id, new Set<string>([specifier]));
|
||||
}
|
||||
}
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
await Promise.all(promises);
|
||||
|
|
|
@ -78,7 +78,7 @@ function vitePluginManifest(_options: StaticBuildOptions, internals: BuildIntern
|
|||
|
||||
export function pluginManifest(
|
||||
options: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): AstroBuildPlugin {
|
||||
return {
|
||||
targets: ['server'],
|
||||
|
@ -115,7 +115,7 @@ export function pluginManifest(
|
|||
|
||||
async function createManifest(
|
||||
buildOpts: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): Promise<SerializedSSRManifest> {
|
||||
if (!internals.manifestEntryChunk) {
|
||||
throw new Error(`Did not generate an entry chunk for SSR`);
|
||||
|
@ -125,7 +125,7 @@ async function createManifest(
|
|||
const clientStatics = new Set(
|
||||
await glob('**/*', {
|
||||
cwd: fileURLToPath(buildOpts.settings.config.build.client),
|
||||
})
|
||||
}),
|
||||
);
|
||||
for (const file of clientStatics) {
|
||||
internals.staticFiles.add(file);
|
||||
|
@ -149,7 +149,7 @@ function injectManifest(manifest: SerializedSSRManifest, chunk: Readonly<OutputC
|
|||
function buildManifest(
|
||||
opts: StaticBuildOptions,
|
||||
internals: BuildInternals,
|
||||
staticFiles: string[]
|
||||
staticFiles: string[],
|
||||
): SerializedSSRManifest {
|
||||
const { settings } = opts;
|
||||
|
||||
|
@ -197,7 +197,7 @@ function buildManifest(
|
|||
scripts.unshift(
|
||||
Object.assign({}, pageData.hoistedScript, {
|
||||
value,
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
if (settings.scripts.some((script) => script.stage === 'page')) {
|
||||
|
|
|
@ -6,7 +6,7 @@ export { MIDDLEWARE_MODULE_ID } from '../../middleware/vite-plugin.js';
|
|||
|
||||
export function pluginMiddleware(
|
||||
opts: StaticBuildOptions,
|
||||
internals: BuildInternals
|
||||
internals: BuildInternals,
|
||||
): AstroBuildPlugin {
|
||||
return {
|
||||
targets: ['server'],
|
||||
|
|
|
@ -39,7 +39,7 @@ function vitePluginPages(opts: StaticBuildOptions, internals: BuildInternals): V
|
|||
const pageDatas = getPagesFromVirtualModulePageName(
|
||||
internals,
|
||||
ASTRO_PAGE_RESOLVED_MODULE_ID,
|
||||
id
|
||||
id,
|
||||
);
|
||||
for (const pageData of pageDatas) {
|
||||
const resolvedPage = await this.resolve(pageData.moduleSpecifier);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue