diff --git a/biome.jsonc b/biome.jsonc index ccb4d8651989..de53455ba505 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.2/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.10/schema.json", "files": { "includes": [ "**", diff --git a/package.json b/package.json index 8943e7dee106..e5d8b2057448 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ }, "devDependencies": { "@astrojs/check": "^0.9.5", - "@biomejs/biome": "2.4.2", + "@biomejs/biome": "2.4.10", "@changesets/changelog-github": "^0.5.2", "@changesets/cli": "^2.29.8", "@flue/cli": "^0.0.47", diff --git a/packages/astro/test/astro-component-bundling.test.js b/packages/astro/test/astro-component-bundling.test.js index 8e437dd5974a..76569c2ffc1c 100644 --- a/packages/astro/test/astro-component-bundling.test.js +++ b/packages/astro/test/astro-component-bundling.test.js @@ -45,20 +45,18 @@ describe('Component bundling', () => { await fixture.build(); }); - it( - 'should treeshake FooComponent', - { skip: 'Not sure how this can possibly work, we bundle the module as an entrypoint.' }, - async () => { - const astroChunkDir = await fixture.readdir('/_astro'); - const manyComponentsChunkName = astroChunkDir.find((chunk) => - chunk.startsWith('ManyComponents'), - ); - const manyComponentsChunkContent = await fixture.readFile( - `/_astro/${manyComponentsChunkName}`, - ); - assert.equal(manyComponentsChunkContent.includes('FooComponent'), false); - }, - ); + it('should treeshake FooComponent', { + skip: 'Not sure how this can possibly work, we bundle the module as an entrypoint.', + }, async () => { + const astroChunkDir = await fixture.readdir('/_astro'); + const manyComponentsChunkName = astroChunkDir.find((chunk) => + chunk.startsWith('ManyComponents'), + ); + const manyComponentsChunkContent = await fixture.readFile( + `/_astro/${manyComponentsChunkName}`, + ); + assert.equal(manyComponentsChunkContent.includes('FooComponent'), false); + }); it('should not include Astro components in client bundles', async () => { const html = await fixture.readFile('/astro-in-client/index.html'); diff --git a/packages/astro/test/cli.test.js b/packages/astro/test/cli.test.js index 8eba27374681..ed3765558da6 100644 --- a/packages/astro/test/cli.test.js +++ b/packages/astro/test/cli.test.js @@ -14,54 +14,50 @@ describe('astro cli', () => { }); // Flaky test, in CI it exceeds the timeout most of the times - it.skip( - 'astro check --watch reports errors on modified files', - { - timeout: 35000, - }, - async () => { - let messageResolve; - const messagePromise = new Promise((resolve) => { - messageResolve = resolve; - }); - const oneErrorContent = 'foobar'; + it.skip('astro check --watch reports errors on modified files', { + timeout: 35000, + }, async () => { + let messageResolve; + const messagePromise = new Promise((resolve) => { + messageResolve = resolve; + }); + const oneErrorContent = 'foobar'; - /** @type {import('./test-utils').Fixture} */ - const fixture = await loadFixture({ - root: './fixtures/astro-check-watch/', - }); - const logs = []; + /** @type {import('./test-utils').Fixture} */ + const fixture = await loadFixture({ + root: './fixtures/astro-check-watch/', + }); + const logs = []; - const checkServer = await fixture.check({ - flags: { watch: true }, - logging: { - level: 'info', - dest: new Writable({ - objectMode: true, - write(event, _, callback) { - logs.push({ ...event, message: stripVTControlCharacters(event.message) }); - if (event.message.includes('1 error')) { - messageResolve(logs); - } - callback(); - }, - }), - }, - }); - await checkServer.watch(); - const pagePath = join(fileURLToPath(fixture.config.root), 'src/pages/index.astro'); - const pageContent = readFileSync(pagePath, 'utf-8'); - await fs.writeFile(pagePath, oneErrorContent); - const messages = await messagePromise; - await fs.writeFile(pagePath, pageContent); - await checkServer.stop(); - const diagnostics = messages.filter( - (m) => m.type === 'diagnostics' && m.message.includes('Result'), - ); - assert.equal(diagnostics[0].message.includes('0 errors'), true); - assert.equal(diagnostics[1].message.includes('1 error'), true); - }, - ); + const checkServer = await fixture.check({ + flags: { watch: true }, + logging: { + level: 'info', + dest: new Writable({ + objectMode: true, + write(event, _, callback) { + logs.push({ ...event, message: stripVTControlCharacters(event.message) }); + if (event.message.includes('1 error')) { + messageResolve(logs); + } + callback(); + }, + }), + }, + }); + await checkServer.watch(); + const pagePath = join(fileURLToPath(fixture.config.root), 'src/pages/index.astro'); + const pageContent = readFileSync(pagePath, 'utf-8'); + await fs.writeFile(pagePath, oneErrorContent); + const messages = await messagePromise; + await fs.writeFile(pagePath, pageContent); + await checkServer.stop(); + const diagnostics = messages.filter( + (m) => m.type === 'diagnostics' && m.message.includes('Result'), + ); + assert.equal(diagnostics[0].message.includes('0 errors'), true); + assert.equal(diagnostics[1].message.includes('1 error'), true); + }); it('astro --version', async () => { const pkgURL = new URL('../package.json', import.meta.url); @@ -72,39 +68,31 @@ describe('astro cli', () => { assert.equal(result.stdout.includes(pkgVersion), true); }); - it( - 'astro check no errors', - { - timeout: 35000, - }, - async () => { - const projectRootURL = new URL('./fixtures/astro-check-no-errors/', import.meta.url); - const result = await cli( - 'check', - '--root', - fileURLToPath(projectRootURL), - '--noSync', - ).getResult(); + it('astro check no errors', { + timeout: 35000, + }, async () => { + const projectRootURL = new URL('./fixtures/astro-check-no-errors/', import.meta.url); + const result = await cli( + 'check', + '--root', + fileURLToPath(projectRootURL), + '--noSync', + ).getResult(); - assert.equal(result.stdout.includes('0 errors'), true); - }, - ); + assert.equal(result.stdout.includes('0 errors'), true); + }); - it( - 'astro check has errors', - { - timeout: 35000, - }, - async () => { - const projectRootURL = new URL('./fixtures/astro-check-errors/', import.meta.url); - const result = await cli( - 'check', - '--root', - fileURLToPath(projectRootURL), - '--noSync', - ).getResult(); + it('astro check has errors', { + timeout: 35000, + }, async () => { + const projectRootURL = new URL('./fixtures/astro-check-errors/', import.meta.url); + const result = await cli( + 'check', + '--root', + fileURLToPath(projectRootURL), + '--noSync', + ).getResult(); - assert.equal(result.stdout.includes('1 error'), true); - }, - ); + assert.equal(result.stdout.includes('1 error'), true); + }); }); diff --git a/packages/astro/test/custom-404-implicit-rerouting.test.js b/packages/astro/test/custom-404-implicit-rerouting.test.js index b5139a78980d..b5eda302b333 100644 --- a/packages/astro/test/custom-404-implicit-rerouting.test.js +++ b/packages/astro/test/custom-404-implicit-rerouting.test.js @@ -58,14 +58,12 @@ for (const caseNumber of [1, 2, 3, 4, 5]) { }); // IMPORTANT: never skip - it( - 'prod server stays responsive for case number ' + caseNumber, - { timeout: 3000 }, - async () => { - const response = await app.render(new Request('https://example.com/alvsibdlvjks')); - assert.equal(response.status, 404); - }, - ); + it('prod server stays responsive for case number ' + caseNumber, { + timeout: 3000, + }, async () => { + const response = await app.render(new Request('https://example.com/alvsibdlvjks')); + assert.equal(response.status, 404); + }); }); }); } diff --git a/packages/astro/test/hmr-markdown.test.js b/packages/astro/test/hmr-markdown.test.js index 62760295ac7f..417e2be7f302 100644 --- a/packages/astro/test/hmr-markdown.test.js +++ b/packages/astro/test/hmr-markdown.test.js @@ -23,32 +23,31 @@ describe('HMR: Markdown updates', () => { await devServer.stop(); }); - it( - 'should update HTML when markdown changes', - { skip: isWindows, todo: 'HMR tests hang on Windows' }, - async () => { - let response = await fixture.fetch('/'); - assert.equal(response.status, 200); - let html = await response.text(); - assert.ok(html.includes('Original content')); - - response = await fixture.fetch('/blog/post'); - assert.equal(response.status, 200); - html = await response.text(); - assert.ok(html.includes('Original content')); - - await fixture.editFile(markdownPath, UPDATED_CONTENT); - await fixture.onNextDataStoreChange(); - - response = await fixture.fetch('/'); - assert.equal(response.status, 200); - html = await response.text(); - assert.ok(html.includes('Updated content')); - - response = await fixture.fetch('/blog/post'); - assert.equal(response.status, 200); - html = await response.text(); - assert.ok(html.includes('Updated content')); - }, - ); + it('should update HTML when markdown changes', { + skip: isWindows, + todo: 'HMR tests hang on Windows', + }, async () => { + let response = await fixture.fetch('/'); + assert.equal(response.status, 200); + let html = await response.text(); + assert.ok(html.includes('Original content')); + + response = await fixture.fetch('/blog/post'); + assert.equal(response.status, 200); + html = await response.text(); + assert.ok(html.includes('Original content')); + + await fixture.editFile(markdownPath, UPDATED_CONTENT); + await fixture.onNextDataStoreChange(); + + response = await fixture.fetch('/'); + assert.equal(response.status, 200); + html = await response.text(); + assert.ok(html.includes('Updated content')); + + response = await fixture.fetch('/blog/post'); + assert.equal(response.status, 200); + html = await response.text(); + assert.ok(html.includes('Updated content')); + }); }); diff --git a/packages/astro/test/hmr-new-page.test.js b/packages/astro/test/hmr-new-page.test.js index 8f0b04a5be25..d4ad8a09f335 100644 --- a/packages/astro/test/hmr-new-page.test.js +++ b/packages/astro/test/hmr-new-page.test.js @@ -50,52 +50,50 @@ describe('HMR: New page detection', () => { assert.equal(response.status, 404); }); - it( - 'should detect a new page without server restart', - { skip: isWindows, todo: 'I hangs on windows' }, - async () => { - // 1. Verify the page doesn't exist yet - let response = await fixture.fetch('/new-page'); - assert.equal(response.status, 404, 'Page should not exist initially'); - - // 2. Create the new page file - await fs.promises.writeFile(newPagePath, NEW_PAGE_CONTENT, 'utf-8'); + it('should detect a new page without server restart', { + skip: isWindows, + todo: 'I hangs on windows', + }, async () => { + // 1. Verify the page doesn't exist yet + let response = await fixture.fetch('/new-page'); + assert.equal(response.status, 404, 'Page should not exist initially'); + + // 2. Create the new page file + await fs.promises.writeFile(newPagePath, NEW_PAGE_CONTENT, 'utf-8'); + + // 3. Wait for HMR to process the change + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // 4. Verify the new page is now accessible + response = await fixture.fetch('/new-page'); + assert.equal(response.status, 200, 'Page should be accessible after creation'); + + const html = await response.text(); + assert.ok(html.includes('New Page Created via HMR'), 'Page content should match'); + }); - // 3. Wait for HMR to process the change + it('should detect page removal without server restart', { + skip: isWindows, + todo: 'I hangs on windows', + }, async () => { + // Ensure the page exists first (from previous test or create it) + if (!fs.existsSync(newPagePath)) { + await fs.promises.writeFile(newPagePath, NEW_PAGE_CONTENT, 'utf-8'); await new Promise((resolve) => setTimeout(resolve, 2000)); + } - // 4. Verify the new page is now accessible - response = await fixture.fetch('/new-page'); - assert.equal(response.status, 200, 'Page should be accessible after creation'); - - const html = await response.text(); - assert.ok(html.includes('New Page Created via HMR'), 'Page content should match'); - }, - ); - - it( - 'should detect page removal without server restart', - { skip: isWindows, todo: 'I hangs on windows' }, - async () => { - // Ensure the page exists first (from previous test or create it) - if (!fs.existsSync(newPagePath)) { - await fs.promises.writeFile(newPagePath, NEW_PAGE_CONTENT, 'utf-8'); - await new Promise((resolve) => setTimeout(resolve, 2000)); - } - - // 1. Verify the page is accessible - let response = await fixture.fetch('/new-page'); - assert.equal(response.status, 200, 'Page should exist before deletion'); - - // 2. Delete the page file - await fs.promises.unlink(newPagePath); + // 1. Verify the page is accessible + let response = await fixture.fetch('/new-page'); + assert.equal(response.status, 200, 'Page should exist before deletion'); - // 3. Wait for HMR to process the change - await new Promise((resolve) => setTimeout(resolve, 2000)); + // 2. Delete the page file + await fs.promises.unlink(newPagePath); - // 4. Verify the page now returns 404 - response = await fixture.fetch('/new-page'); - assert.equal(response.status, 404, 'Page should return 404 after deletion'); - }, - ); + // 3. Wait for HMR to process the change + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // 4. Verify the page now returns 404 + response = await fixture.fetch('/new-page'); + assert.equal(response.status, 404, 'Page should return 404 after deletion'); + }); }); diff --git a/packages/astro/test/hmr-slots-render.test.js b/packages/astro/test/hmr-slots-render.test.js index 1fa462e28b0a..8852296554f1 100644 --- a/packages/astro/test/hmr-slots-render.test.js +++ b/packages/astro/test/hmr-slots-render.test.js @@ -37,35 +37,33 @@ describe('HMR: slots.render with callback args after style change', () => { ); } - it( - 'should render after style change in the slot-render component', - { skip: isWindows }, - async () => { - // Initial fetch - verify correct rendering - let res = await fixture.fetch('/'); - assert.equal(res.status, 200); - verifyRendering(cheerio.load(await res.text()), 'initial'); + it('should render after style change in the slot-render component', { + skip: isWindows, + }, async () => { + // Initial fetch - verify correct rendering + let res = await fixture.fetch('/'); + assert.equal(res.status, 200); + verifyRendering(cheerio.load(await res.text()), 'initial'); - // Style-only edit (triggers HMR style-only path) - await fixture.editFile('/src/components/Each.astro', (c) => - c.replace('font-size: 0.5rem;', 'font-size: 1rem;'), - ); - await new Promise((r) => setTimeout(r, 500)); + // Style-only edit (triggers HMR style-only path) + await fixture.editFile('/src/components/Each.astro', (c) => + c.replace('font-size: 0.5rem;', 'font-size: 1rem;'), + ); + await new Promise((r) => setTimeout(r, 500)); - // Page refresh after HMR - must still render correctly - res = await fixture.fetch('/'); - assert.equal(res.status, 200); - verifyRendering(cheerio.load(await res.text()), 'after style change'); + // Page refresh after HMR - must still render correctly + res = await fixture.fetch('/'); + assert.equal(res.status, 200); + verifyRendering(cheerio.load(await res.text()), 'after style change'); - // Second style edit + refresh - await fixture.editFile('/src/components/Each.astro', (c) => - c.replace('font-size: 1rem;', 'font-size: 2rem;'), - ); - await new Promise((r) => setTimeout(r, 500)); + // Second style edit + refresh + await fixture.editFile('/src/components/Each.astro', (c) => + c.replace('font-size: 1rem;', 'font-size: 2rem;'), + ); + await new Promise((r) => setTimeout(r, 500)); - res = await fixture.fetch('/'); - assert.equal(res.status, 200); - verifyRendering(cheerio.load(await res.text()), 'after 2nd style change'); - }, - ); + res = await fixture.fetch('/'); + assert.equal(res.status, 200); + verifyRendering(cheerio.load(await res.text()), 'after 2nd style change'); + }); }); diff --git a/packages/astro/test/units/config/config-validate.test.ts b/packages/astro/test/units/config/config-validate.test.ts index d70d884c5ba7..d6229bf01e0f 100644 --- a/packages/astro/test/units/config/config-validate.test.ts +++ b/packages/astro/test/units/config/config-validate.test.ts @@ -204,27 +204,26 @@ describe('Config Validation', () => { ); }); - it( - 'errors if `i18n.prefixDefaultLocale` is `false` and `i18n.redirectToDefaultLocale` is `true`', - { todo: 'Enable in Astro 6.0', skip: 'Removed validation' }, - async () => { - const configError = await validateConfig({ - i18n: { - defaultLocale: 'en', - locales: ['es', 'en'], - routing: { - prefixDefaultLocale: false, - redirectToDefaultLocale: true, - }, + it('errors if `i18n.prefixDefaultLocale` is `false` and `i18n.redirectToDefaultLocale` is `true`', { + todo: 'Enable in Astro 6.0', + skip: 'Removed validation', + }, async () => { + const configError = await validateConfig({ + i18n: { + defaultLocale: 'en', + locales: ['es', 'en'], + routing: { + prefixDefaultLocale: false, + redirectToDefaultLocale: true, }, - }).catch((err) => err); - assert.equal(configError instanceof z.ZodError, true); - assert.equal( - configError.issues[0].message, - 'The option `i18n.routing.redirectToDefaultLocale` can be used only when `i18n.routing.prefixDefaultLocale` is set to `true`; otherwise, redirects might cause infinite loops. Remove the option `i18n.routing.redirectToDefaultLocale`, or change its value to `false`.', - ); - }, - ); + }, + }).catch((err) => err); + assert.equal(configError instanceof z.ZodError, true); + assert.equal( + configError.issues[0].message, + 'The option `i18n.routing.redirectToDefaultLocale` can be used only when `i18n.routing.prefixDefaultLocale` is set to `true`; otherwise, redirects might cause infinite loops. Remove the option `i18n.routing.redirectToDefaultLocale`, or change its value to `false`.', + ); + }); it('errors if a domains key does not exist', async () => { const configError = await validateConfig({ diff --git a/packages/astro/test/units/dev/hydration.test.js b/packages/astro/test/units/dev/hydration.test.js index 03962a416fa0..4e75f50993de 100644 --- a/packages/astro/test/units/dev/hydration.test.js +++ b/packages/astro/test/units/dev/hydration.test.js @@ -3,12 +3,12 @@ import { describe, it } from 'node:test'; import { createFixture, createRequestAndResponse, runInContainer } from '../test-utils.js'; describe('hydration', () => { - it( - 'should not crash when reassigning a hydrated component', - { skip: true, todo: "It seems that `components/Client.svelte` isn't found" }, - async () => { - const fixture = await createFixture({ - '/src/pages/index.astro': ` + it('should not crash when reassigning a hydrated component', { + skip: true, + todo: "It seems that `components/Client.svelte` isn't found", + }, async () => { + const fixture = await createFixture({ + '/src/pages/index.astro': ` --- import Svelte from '../components/Client.svelte'; const Foo = Svelte; @@ -22,29 +22,28 @@ describe('hydration', () => { `, - }); + }); - await runInContainer( - { - inlineConfig: { - root: fixture.path, - logLevel: 'silent', - }, + await runInContainer( + { + inlineConfig: { + root: fixture.path, + logLevel: 'silent', }, - async (container) => { - const { req, res, done } = createRequestAndResponse({ - method: 'GET', - url: '/', - }); - container.handle(req, res); - await done; - assert.equal( - res.statusCode, - 200, - "We get a 200 because the error occurs in the template, but we didn't crash!", - ); - }, - ); - }, - ); + }, + async (container) => { + const { req, res, done } = createRequestAndResponse({ + method: 'GET', + url: '/', + }); + container.handle(req, res); + await done; + assert.equal( + res.statusCode, + 200, + "We get a 200 because the error occurs in the template, but we didn't crash!", + ); + }, + ); + }); }); diff --git a/packages/astro/test/units/integrations/api.test.js b/packages/astro/test/units/integrations/api.test.js index 1acb31234792..caaa26496e2e 100644 --- a/packages/astro/test/units/integrations/api.test.js +++ b/packages/astro/test/units/integrations/api.test.js @@ -142,11 +142,9 @@ describe('Integration API', () => { }); describe('Routes resolved hooks', () => { - it.skip( - 'should work in dev', - { todo: "[p2] Understand why routes aren't deep equal anymore" }, - async () => {}, - ); + it.skip('should work in dev', { + todo: "[p2] Understand why routes aren't deep equal anymore", + }, async () => {}); }); describe('Routes setup hook', () => { diff --git a/packages/astro/test/units/vite-plugin-html/transform.test.ts b/packages/astro/test/units/vite-plugin-html/transform.test.ts index e6cbf6be88c4..df5cc9078e3e 100644 --- a/packages/astro/test/units/vite-plugin-html/transform.test.ts +++ b/packages/astro/test/units/vite-plugin-html/transform.test.ts @@ -59,17 +59,15 @@ describe('vite-plugin-html: transform integration', () => { assert.doesNotMatch(result.code, /\$\{___SLOTS___\["default"\]/); }); - it( - 'handles complex escaping in attributes', - { skip: 'There is a bug in replaceAttribute with multiple attributes' }, - async () => { - const code = '
'; - const result = await transform(code, 'test.html'); - - assert.match(result.code, /data-value="\\\$\{foo\}"/); - assert.match(result.code, /data-template="\\`\\\$\{bar\}\\`"/); - }, - ); + it('handles complex escaping in attributes', { + skip: 'There is a bug in replaceAttribute with multiple attributes', + }, async () => { + const code = '
'; + const result = await transform(code, 'test.html'); + + assert.match(result.code, /data-value="\\\$\{foo\}"/); + assert.match(result.code, /data-template="\\`\\\$\{bar\}\\`"/); + }); it('transforms empty HTML', async () => { const code = ''; diff --git a/packages/integrations/node/test/errors.test.js b/packages/integrations/node/test/errors.test.js index 9090b162ee4b..99aff386bf00 100644 --- a/packages/integrations/node/test/errors.test.js +++ b/packages/integrations/node/test/errors.test.js @@ -26,40 +26,38 @@ describe('Errors', () => { await devPreview?.stop(); }); - it( - 'rejected promise in template', - { skip: true, todo: 'Review the response from the in-stream' }, - async () => { - const res = await fixture.fetch('/in-stream'); - const html = await res.text(); - const $ = cheerio.load(html); + it('rejected promise in template', { + skip: true, + todo: 'Review the response from the in-stream', + }, async () => { + const res = await fixture.fetch('/in-stream'); + const html = await res.text(); + const $ = cheerio.load(html); - assert.equal($('p').text().trim(), 'Internal server error'); - }, - ); + assert.equal($('p').text().trim(), 'Internal server error'); + }); - it( - 'generator that throws called in template', - { skip: true, todo: 'Review the response from the generator' }, - async () => { - const result = ['

Astro

1', 'Internal server error']; + it('generator that throws called in template', { + skip: true, + todo: 'Review the response from the generator', + }, async () => { + const result = ['

Astro

1', 'Internal server error']; - /** @type {Response} */ - const res = await fixture.fetch('/generator'); - const reader = res.body.getReader(); - const decoder = new TextDecoder(); - const chunk1 = await reader.read(); - const chunk2 = await reader.read(); - const chunk3 = await reader.read(); - assert.equal(chunk1.done, false); - if (chunk2.done) { - assert.equal(decoder.decode(chunk1.value), result.join('')); - } else if (chunk3.done) { - assert.equal(decoder.decode(chunk1.value), result[0]); - assert.equal(decoder.decode(chunk2.value), result[1]); - } else { - throw new Error('The response should take at most 2 chunks.'); - } - }, - ); + /** @type {Response} */ + const res = await fixture.fetch('/generator'); + const reader = res.body.getReader(); + const decoder = new TextDecoder(); + const chunk1 = await reader.read(); + const chunk2 = await reader.read(); + const chunk3 = await reader.read(); + assert.equal(chunk1.done, false); + if (chunk2.done) { + assert.equal(decoder.decode(chunk1.value), result.join('')); + } else if (chunk3.done) { + assert.equal(decoder.decode(chunk1.value), result[0]); + assert.equal(decoder.decode(chunk2.value), result[1]); + } else { + throw new Error('The response should take at most 2 chunks.'); + } + }); }); diff --git a/packages/language-tools/language-server/test/content-intellisense/caching.test.ts b/packages/language-tools/language-server/test/content-intellisense/caching.test.ts index 92c9cdd41751..8f3a33efb16b 100644 --- a/packages/language-tools/language-server/test/content-intellisense/caching.test.ts +++ b/packages/language-tools/language-server/test/content-intellisense/caching.test.ts @@ -9,60 +9,55 @@ import { fixtureDir } from '../utils.ts'; const contentSchemaPath = path.resolve(fixtureDir, '.astro', 'collections', 'caching.schema.json'); -describe( - 'Content Intellisense - Caching', - { skip: Number.parseInt(process.versions.node) === 20 }, - async () => { - let languageServer: LanguageServer; - - before(async () => { - languageServer = await getLanguageServer(); - }); - - it('Properly updates the schema when they are updated', async () => { - const document = await languageServer.handle.openTextDocument( - path.join(fixtureDir, 'src', 'content', 'caching', 'caching.md'), - 'markdown', - ); - - const hover = await languageServer.handle.sendHoverRequest( - document.uri, - Position.create(1, 1), - ); - - assert.deepStrictEqual(hover?.contents, { - kind: 'markdown', - value: 'I will be changed', - }); - - fs.writeFileSync( - contentSchemaPath, - fs.readFileSync(contentSchemaPath, 'utf-8').replaceAll('I will be changed', 'I am changed'), - ); - - await languageServer.handle.didChangeWatchedFiles([ - { - uri: URI.file(contentSchemaPath).toString(), - type: 2, - }, - ]); - - const hover2 = await languageServer.handle.sendHoverRequest( - document.uri, - Position.create(1, 1), - ); - - assert.deepStrictEqual(hover2?.contents, { - kind: 'markdown', - value: 'I am changed', - }); +describe('Content Intellisense - Caching', { + skip: Number.parseInt(process.versions.node) === 20, +}, async () => { + let languageServer: LanguageServer; + + before(async () => { + languageServer = await getLanguageServer(); + }); + + it('Properly updates the schema when they are updated', async () => { + const document = await languageServer.handle.openTextDocument( + path.join(fixtureDir, 'src', 'content', 'caching', 'caching.md'), + 'markdown', + ); + + const hover = await languageServer.handle.sendHoverRequest(document.uri, Position.create(1, 1)); + + assert.deepStrictEqual(hover?.contents, { + kind: 'markdown', + value: 'I will be changed', }); - after(async () => { - fs.writeFileSync( - contentSchemaPath, - fs.readFileSync(contentSchemaPath, 'utf-8').replaceAll('I am changed', 'I will be changed'), - ); + fs.writeFileSync( + contentSchemaPath, + fs.readFileSync(contentSchemaPath, 'utf-8').replaceAll('I will be changed', 'I am changed'), + ); + + await languageServer.handle.didChangeWatchedFiles([ + { + uri: URI.file(contentSchemaPath).toString(), + type: 2, + }, + ]); + + const hover2 = await languageServer.handle.sendHoverRequest( + document.uri, + Position.create(1, 1), + ); + + assert.deepStrictEqual(hover2?.contents, { + kind: 'markdown', + value: 'I am changed', }); - }, -); + }); + + after(async () => { + fs.writeFileSync( + contentSchemaPath, + fs.readFileSync(contentSchemaPath, 'utf-8').replaceAll('I am changed', 'I will be changed'), + ); + }); +}); diff --git a/packages/language-tools/language-server/test/content-intellisense/completions.test.ts b/packages/language-tools/language-server/test/content-intellisense/completions.test.ts index e6bbf0d60d94..2725bb4e64cb 100644 --- a/packages/language-tools/language-server/test/content-intellisense/completions.test.ts +++ b/packages/language-tools/language-server/test/content-intellisense/completions.test.ts @@ -5,45 +5,43 @@ import { Position } from '@volar/language-server'; import { getLanguageServer, type LanguageServer } from '../server.ts'; import { fixtureDir } from '../utils.ts'; -describe( - 'Content Intellisense - Completions', - { skip: Number.parseInt(process.versions.node) === 20 }, - async () => { - let languageServer: LanguageServer; - - before(async () => { - languageServer = await getLanguageServer(); - }); - - it('Provide completions for collection properties', async () => { - const document = await languageServer.handle.openTextDocument( - path.join(fixtureDir, 'src', 'content', 'blog', 'completions.md'), - 'markdown', - ); - - const completions = await languageServer.handle.sendCompletionRequest( - document.uri, - Position.create(1, 1), - ); - - // We don't do any mapping ourselves here, so we'll just check if the labels are correct. - const labels = (completions?.items ?? []).map((item) => item.label); - ['title', 'description', 'tags', 'type'].forEach((m) => assert.ok(labels.includes(m))); - }); - - it('Provide completions for collection property values', async () => { - const document = await languageServer.handle.openTextDocument( - path.join(fixtureDir, 'src', 'content', 'blog', 'completions-values.md'), - 'markdown', - ); - - const completions = await languageServer.handle.sendCompletionRequest( - document.uri, - Position.create(1, 7), - ); - - const labels = (completions?.items ?? []).map((item) => item.label); - ['blog'].forEach((m) => assert.ok(labels.includes(m))); - }); - }, -); +describe('Content Intellisense - Completions', { + skip: Number.parseInt(process.versions.node) === 20, +}, async () => { + let languageServer: LanguageServer; + + before(async () => { + languageServer = await getLanguageServer(); + }); + + it('Provide completions for collection properties', async () => { + const document = await languageServer.handle.openTextDocument( + path.join(fixtureDir, 'src', 'content', 'blog', 'completions.md'), + 'markdown', + ); + + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, + Position.create(1, 1), + ); + + // We don't do any mapping ourselves here, so we'll just check if the labels are correct. + const labels = (completions?.items ?? []).map((item) => item.label); + ['title', 'description', 'tags', 'type'].forEach((m) => assert.ok(labels.includes(m))); + }); + + it('Provide completions for collection property values', async () => { + const document = await languageServer.handle.openTextDocument( + path.join(fixtureDir, 'src', 'content', 'blog', 'completions-values.md'), + 'markdown', + ); + + const completions = await languageServer.handle.sendCompletionRequest( + document.uri, + Position.create(1, 7), + ); + + const labels = (completions?.items ?? []).map((item) => item.label); + ['blog'].forEach((m) => assert.ok(labels.includes(m))); + }); +}); diff --git a/packages/language-tools/language-server/test/content-intellisense/definitions.test.ts b/packages/language-tools/language-server/test/content-intellisense/definitions.test.ts index 2772d67573a4..2aff28e99bed 100644 --- a/packages/language-tools/language-server/test/content-intellisense/definitions.test.ts +++ b/packages/language-tools/language-server/test/content-intellisense/definitions.test.ts @@ -6,49 +6,47 @@ import { Position } from '@volar/language-server'; import { getLanguageServer, type LanguageServer } from '../server.ts'; import { fixtureDir } from '../utils.ts'; -describe( - 'Content Intellisense - Go To Everywhere', - { skip: Number.parseInt(process.versions.node) === 20 }, - async () => { - let languageServer: LanguageServer; - - before(async () => { - languageServer = await getLanguageServer(); +describe('Content Intellisense - Go To Everywhere', { + skip: Number.parseInt(process.versions.node) === 20, +}, async () => { + let languageServer: LanguageServer; + + before(async () => { + languageServer = await getLanguageServer(); + }); + + it('Provide definitions for keys', async () => { + const document = await languageServer.handle.openTextDocument( + path.join(fixtureDir, 'src', 'content', 'blog', 'definitions.md'), + 'markdown', + ); + + const definitions = (await languageServer.handle.sendDefinitionRequest( + document.uri, + Position.create(1, 2), + )) as LocationLink[]; + + const targetUris = definitions?.map((definition) => definition.targetUri); + assert.strictEqual( + targetUris.every((uri) => uri.endsWith('config.ts')), + true, + ); + + const { targetRange, targetSelectionRange, originSelectionRange } = definitions[0]; + + assert.deepStrictEqual(targetRange, { + start: { line: 7, character: 2 }, + end: { line: 7, character: 65 }, }); - it('Provide definitions for keys', async () => { - const document = await languageServer.handle.openTextDocument( - path.join(fixtureDir, 'src', 'content', 'blog', 'definitions.md'), - 'markdown', - ); - - const definitions = (await languageServer.handle.sendDefinitionRequest( - document.uri, - Position.create(1, 2), - )) as LocationLink[]; - - const targetUris = definitions?.map((definition) => definition.targetUri); - assert.strictEqual( - targetUris.every((uri) => uri.endsWith('config.ts')), - true, - ); - - const { targetRange, targetSelectionRange, originSelectionRange } = definitions[0]; - - assert.deepStrictEqual(targetRange, { - start: { line: 7, character: 2 }, - end: { line: 7, character: 65 }, - }); - - assert.deepStrictEqual(targetSelectionRange, { - start: { line: 7, character: 2 }, - end: { line: 7, character: 7 }, - }); - - assert.deepStrictEqual(originSelectionRange, { - start: { line: 1, character: 0 }, - end: { line: 1, character: 5 }, - }); + assert.deepStrictEqual(targetSelectionRange, { + start: { line: 7, character: 2 }, + end: { line: 7, character: 7 }, }); - }, -); + + assert.deepStrictEqual(originSelectionRange, { + start: { line: 1, character: 0 }, + end: { line: 1, character: 5 }, + }); + }); +}); diff --git a/packages/language-tools/language-server/test/content-intellisense/diagnostics.test.ts b/packages/language-tools/language-server/test/content-intellisense/diagnostics.test.ts index bea456c12b4b..6ce3904d206f 100644 --- a/packages/language-tools/language-server/test/content-intellisense/diagnostics.test.ts +++ b/packages/language-tools/language-server/test/content-intellisense/diagnostics.test.ts @@ -7,94 +7,92 @@ import { getLanguageServer, type LanguageServer } from '../server.ts'; import { fixtureDir } from '../utils.ts'; // TODO: We can't sync the fixture with these mistakes at all, as such we can't run these tests. -describe.skip( - 'Content Intellisense - Diagnostics', - { skip: Number.parseInt(process.versions.node) === 20 }, - async () => { - let languageServer: LanguageServer; - - before(async () => { - languageServer = await getLanguageServer(); +describe.skip('Content Intellisense - Diagnostics', { + skip: Number.parseInt(process.versions.node) === 20, +}, async () => { + let languageServer: LanguageServer; + + before(async () => { + languageServer = await getLanguageServer(); + }); + + it('Report errors for missing entries in frontmatter', async () => { + const document = await languageServer.handle.openTextDocument( + path.join(fixtureDir, 'src', 'content', 'blog', 'missing_property.md'), + 'markdown', + ); + const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( + document.uri, + )) as FullDocumentDiagnosticReport; + + assert.strictEqual(diagnostics.items.length, 1); + + const firstDiagnostic = diagnostics.items[0]; + + // The data is not super relevant to the test, so we'll throw it out. + delete firstDiagnostic.data; + + assert.deepStrictEqual(firstDiagnostic, { + code: 0, + message: 'Missing property "description".', + range: { + start: Position.create(0, 0), + end: Position.create(2, 3), + }, + severity: DiagnosticSeverity.Error, + source: 'astro', }); - - it('Report errors for missing entries in frontmatter', async () => { - const document = await languageServer.handle.openTextDocument( - path.join(fixtureDir, 'src', 'content', 'blog', 'missing_property.md'), - 'markdown', - ); - const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( - document.uri, - )) as FullDocumentDiagnosticReport; - - assert.strictEqual(diagnostics.items.length, 1); - - const firstDiagnostic = diagnostics.items[0]; - - // The data is not super relevant to the test, so we'll throw it out. - delete firstDiagnostic.data; - - assert.deepStrictEqual(firstDiagnostic, { - code: 0, - message: 'Missing property "description".', - range: { - start: Position.create(0, 0), - end: Position.create(2, 3), - }, - severity: DiagnosticSeverity.Error, - source: 'astro', - }); - }); - - it('Report errors for invalid types in frontmatter', async () => { - const document = await languageServer.handle.openTextDocument( - path.join(fixtureDir, 'src', 'content', 'blog', 'type_error.md'), - 'markdown', - ); - const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( - document.uri, - )) as FullDocumentDiagnosticReport; - - assert.strictEqual(diagnostics.items.length, 1); - - const firstDiagnostic = diagnostics.items[0]; - - delete firstDiagnostic.data; - - assert.deepStrictEqual(firstDiagnostic, { - code: 0, - message: 'Incorrect type. Expected "string".', - range: { - start: Position.create(1, 7), - end: Position.create(1, 8), - }, - severity: DiagnosticSeverity.Error, - source: 'astro', - }); + }); + + it('Report errors for invalid types in frontmatter', async () => { + const document = await languageServer.handle.openTextDocument( + path.join(fixtureDir, 'src', 'content', 'blog', 'type_error.md'), + 'markdown', + ); + const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( + document.uri, + )) as FullDocumentDiagnosticReport; + + assert.strictEqual(diagnostics.items.length, 1); + + const firstDiagnostic = diagnostics.items[0]; + + delete firstDiagnostic.data; + + assert.deepStrictEqual(firstDiagnostic, { + code: 0, + message: 'Incorrect type. Expected "string".', + range: { + start: Position.create(1, 7), + end: Position.create(1, 8), + }, + severity: DiagnosticSeverity.Error, + source: 'astro', }); - - it('Report error for missing frontmatter', async () => { - const document = await languageServer.handle.openTextDocument( - path.join(fixtureDir, 'src', 'content', 'blog', 'no_frontmatter.md'), - 'markdown', - ); - const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( - document.uri, - )) as FullDocumentDiagnosticReport; - - assert.strictEqual(diagnostics.items.length, 1); - - const firstDiagnostic = diagnostics.items[0]; - - delete firstDiagnostic.data; - - assert.deepStrictEqual(firstDiagnostic, { - message: 'Frontmatter is required for this file.', - range: { - start: Position.create(0, 0), - end: Position.create(0, 0), - }, - severity: DiagnosticSeverity.Error, - }); + }); + + it('Report error for missing frontmatter', async () => { + const document = await languageServer.handle.openTextDocument( + path.join(fixtureDir, 'src', 'content', 'blog', 'no_frontmatter.md'), + 'markdown', + ); + const diagnostics = (await languageServer.handle.sendDocumentDiagnosticRequest( + document.uri, + )) as FullDocumentDiagnosticReport; + + assert.strictEqual(diagnostics.items.length, 1); + + const firstDiagnostic = diagnostics.items[0]; + + delete firstDiagnostic.data; + + assert.deepStrictEqual(firstDiagnostic, { + message: 'Frontmatter is required for this file.', + range: { + start: Position.create(0, 0), + end: Position.create(0, 0), + }, + severity: DiagnosticSeverity.Error, }); - }, -); + }); +}); diff --git a/packages/language-tools/language-server/test/content-intellisense/hover.test.ts b/packages/language-tools/language-server/test/content-intellisense/hover.test.ts index 3ceec867555a..d729182dade8 100644 --- a/packages/language-tools/language-server/test/content-intellisense/hover.test.ts +++ b/packages/language-tools/language-server/test/content-intellisense/hover.test.ts @@ -5,31 +5,26 @@ import { Position } from '@volar/language-server'; import { getLanguageServer, type LanguageServer } from '../server.ts'; import { fixtureDir } from '../utils.ts'; -describe( - 'Content Intellisense - Hover', - { skip: Number.parseInt(process.versions.node) === 20 }, - async () => { - let languageServer: LanguageServer; +describe('Content Intellisense - Hover', { + skip: Number.parseInt(process.versions.node) === 20, +}, async () => { + let languageServer: LanguageServer; - before(async () => { - languageServer = await getLanguageServer(); - }); + before(async () => { + languageServer = await getLanguageServer(); + }); - it('Provide hover information for collection properties', async () => { - const document = await languageServer.handle.openTextDocument( - path.join(fixtureDir, 'src', 'content', 'blog', 'hover.md'), - 'markdown', - ); + it('Provide hover information for collection properties', async () => { + const document = await languageServer.handle.openTextDocument( + path.join(fixtureDir, 'src', 'content', 'blog', 'hover.md'), + 'markdown', + ); - const hover = await languageServer.handle.sendHoverRequest( - document.uri, - Position.create(1, 1), - ); + const hover = await languageServer.handle.sendHoverRequest(document.uri, Position.create(1, 1)); - assert.deepStrictEqual(hover?.contents, { - kind: 'markdown', - value: "The blog post's title.", - }); + assert.deepStrictEqual(hover?.contents, { + kind: 'markdown', + value: "The blog post's title.", }); - }, -); + }); +}); diff --git a/packages/language-tools/vscode/languages/astro.code-snippets b/packages/language-tools/vscode/languages/astro.code-snippets index 7321fd49b44a..98231b3927fd 100644 --- a/packages/language-tools/vscode/languages/astro.code-snippets +++ b/packages/language-tools/vscode/languages/astro.code-snippets @@ -1,50 +1,50 @@ { - "page_html": { - "prefix": "page_html", - "isFileTemplate": true, - "scope": "astro", - "body": [ - "---", - "$1", - "---", - "", - "", - "\t", - "\t\t", - "\t\t", - "\t\t", - "\t\t${2:Document}", - "\t", - "\t", - "\t\t$0", - "\t", - "", - ], - "description": "Page with full HTML", - "include": "*.astro", - }, - "page_layout": { - "prefix": "page_layout", - "isFileTemplate": true, - "scope": "astro", - "body": [ - "---", - "import ${1:Layout} from \"../layouts/$1.astro\"", - "---", - "", - "<$1>", - "\t$0", - "", - ], - "description": "Page from Layout", - "include": "*.astro", - }, - "component": { - "prefix": "component", - "isFileTemplate": true, - "scope": "astro", - "body": ["---", "$1", "---", "", "$0"], - "description": "Component", - "include": "*.astro", - }, + "page_html": { + "prefix": "page_html", + "isFileTemplate": true, + "scope": "astro", + "body": [ + "---", + "$1", + "---", + "", + "", + "\t", + "\t\t", + "\t\t", + "\t\t", + "\t\t${2:Document}", + "\t", + "\t", + "\t\t$0", + "\t", + "" + ], + "description": "Page with full HTML", + "include": "*.astro" + }, + "page_layout": { + "prefix": "page_layout", + "isFileTemplate": true, + "scope": "astro", + "body": [ + "---", + "import ${1:Layout} from \"../layouts/$1.astro\"", + "---", + "", + "<$1>", + "\t$0", + "" + ], + "description": "Page from Layout", + "include": "*.astro" + }, + "component": { + "prefix": "component", + "isFileTemplate": true, + "scope": "astro", + "body": ["---", "$1", "---", "", "$0"], + "description": "Component", + "include": "*.astro" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8f1694837cc..6bb1742d73ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^0.9.5 version: link:packages/language-tools/astro-check '@biomejs/biome': - specifier: 2.4.2 - version: 2.4.2 + specifier: 2.4.10 + version: 2.4.10 '@changesets/changelog-github': specifier: ^0.5.2 version: 0.5.2 @@ -7556,59 +7556,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.4.2': - resolution: {integrity: sha512-vVE/FqLxNLbvYnFDYg3Xfrh1UdFhmPT5i+yPT9GE2nTUgI4rkqo5krw5wK19YHBd7aE7J6r91RRmb8RWwkjy6w==} + '@biomejs/biome@2.4.10': + resolution: {integrity: sha512-xxA3AphFQ1geij4JTHXv4EeSTda1IFn22ye9LdyVPoJU19fNVl0uzfEuhsfQ4Yue/0FaLs2/ccVi4UDiE7R30w==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.2': - resolution: {integrity: sha512-3pEcKCP/1POKyaZZhXcxFl3+d9njmeAihZ17k8lL/1vk+6e0Cbf0yPzKItFiT+5Yh6TQA4uKvnlqe0oVZwRxCA==} + '@biomejs/cli-darwin-arm64@2.4.10': + resolution: {integrity: sha512-vuzzI1cWqDVzOMIkYyHbKqp+AkQq4K7k+UCXWpkYcY/HDn1UxdsbsfgtVpa40shem8Kax4TLDLlx8kMAecgqiw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.2': - resolution: {integrity: sha512-P7hK1jLVny+0R9UwyGcECxO6sjETxfPyBm/1dmFjnDOHgdDPjPqozByunrwh4xPKld8sxOr5eAsSqal5uKgeBg==} + '@biomejs/cli-darwin-x64@2.4.10': + resolution: {integrity: sha512-14fzASRo+BPotwp7nWULy2W5xeUyFnTaq1V13Etrrxkrih+ez/2QfgFm5Ehtf5vSjtgx/IJycMMpn5kPd5ZNaA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.2': - resolution: {integrity: sha512-/x04YK9+7erw6tYEcJv9WXoBHcULI/wMOvNdAyE9S3JStZZ9yJyV67sWAI+90UHuDo/BDhq0d96LDqGlSVv7WA==} + '@biomejs/cli-linux-arm64-musl@2.4.10': + resolution: {integrity: sha512-WrJY6UuiSD/Dh+nwK2qOTu8kdMDlLV3dLMmychIghHPAysWFq1/DGC1pVZx8POE3ZkzKR3PUUnVrtZfMfaJjyQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.2': - resolution: {integrity: sha512-DI3Mi7GT2zYNgUTDEbSjl3e1KhoP76OjQdm8JpvZYZWtVDRyLd3w8llSr2TWk1z+U3P44kUBWY3X7H9MD1/DGQ==} + '@biomejs/cli-linux-arm64@2.4.10': + resolution: {integrity: sha512-7MH1CMW5uuxQ/s7FLST63qF8B3Hgu2HRdZ7tA1X1+mk+St4JOuIrqdhIBnnyqeyWJNI+Bww7Es5QZ0wIc1Cmkw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.2': - resolution: {integrity: sha512-wbBmTkeAoAYbOQ33f6sfKG7pcRSydQiF+dTYOBjJsnXO2mWEOQHllKlC2YVnedqZFERp2WZhFUoO7TNRwnwEHQ==} + '@biomejs/cli-linux-x64-musl@2.4.10': + resolution: {integrity: sha512-kDTi3pI6PBN6CiczsWYOyP2zk0IJI08EWEQyDMQWW221rPaaEz6FvjLhnU07KMzLv8q3qSuoB93ua6inSQ55Tw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.2': - resolution: {integrity: sha512-GK2ErnrKpWFigYP68cXiCHK4RTL4IUWhK92AFS3U28X/nuAL5+hTuy6hyobc8JZRSt+upXt1nXChK+tuHHx4mA==} + '@biomejs/cli-linux-x64@2.4.10': + resolution: {integrity: sha512-tZLvEEi2u9Xu1zAqRjTcpIDGVtldigVvzug2fTuPG0ME/g8/mXpRPcNgLB22bGn6FvLJpHHnqLnwliOu8xjYrg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.2': - resolution: {integrity: sha512-k2uqwLYrNNxnaoiW3RJxoMGnbKda8FuCmtYG3cOtVljs3CzWxaTR+AoXwKGHscC9thax9R4kOrtWqWN0+KdPTw==} + '@biomejs/cli-win32-arm64@2.4.10': + resolution: {integrity: sha512-umwQU6qPzH+ISTf/eHyJ/QoQnJs3V9Vpjz2OjZXe9MVBZ7prgGafMy7yYeRGnlmDAn87AKTF3Q6weLoMGpeqdQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.2': - resolution: {integrity: sha512-9ma7C4g8Sq3cBlRJD2yrsHXB1mnnEBdpy7PhvFrylQWQb4PoyCmPucdX7frvsSBQuFtIiKCrolPl/8tCZrKvgQ==} + '@biomejs/cli-win32-x64@2.4.10': + resolution: {integrity: sha512-aW/JU5GuyH4uxMrNYpoC2kjaHlyJGLgIa3XkhPEZI0uKhZhJZU8BuEyJmvgzSPQNGozBwWjC972RaNdcJ9KyJg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -16560,39 +16560,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.4.2': + '@biomejs/biome@2.4.10': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.2 - '@biomejs/cli-darwin-x64': 2.4.2 - '@biomejs/cli-linux-arm64': 2.4.2 - '@biomejs/cli-linux-arm64-musl': 2.4.2 - '@biomejs/cli-linux-x64': 2.4.2 - '@biomejs/cli-linux-x64-musl': 2.4.2 - '@biomejs/cli-win32-arm64': 2.4.2 - '@biomejs/cli-win32-x64': 2.4.2 + '@biomejs/cli-darwin-arm64': 2.4.10 + '@biomejs/cli-darwin-x64': 2.4.10 + '@biomejs/cli-linux-arm64': 2.4.10 + '@biomejs/cli-linux-arm64-musl': 2.4.10 + '@biomejs/cli-linux-x64': 2.4.10 + '@biomejs/cli-linux-x64-musl': 2.4.10 + '@biomejs/cli-win32-arm64': 2.4.10 + '@biomejs/cli-win32-x64': 2.4.10 - '@biomejs/cli-darwin-arm64@2.4.2': + '@biomejs/cli-darwin-arm64@2.4.10': optional: true - '@biomejs/cli-darwin-x64@2.4.2': + '@biomejs/cli-darwin-x64@2.4.10': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.2': + '@biomejs/cli-linux-arm64-musl@2.4.10': optional: true - '@biomejs/cli-linux-arm64@2.4.2': + '@biomejs/cli-linux-arm64@2.4.10': optional: true - '@biomejs/cli-linux-x64-musl@2.4.2': + '@biomejs/cli-linux-x64-musl@2.4.10': optional: true - '@biomejs/cli-linux-x64@2.4.2': + '@biomejs/cli-linux-x64@2.4.10': optional: true - '@biomejs/cli-win32-arm64@2.4.2': + '@biomejs/cli-win32-arm64@2.4.10': optional: true - '@biomejs/cli-win32-x64@2.4.2': + '@biomejs/cli-win32-x64@2.4.10': optional: true '@bluwy/giget-core@0.1.6':