Skip to content

Commit

Permalink
fix: cache collections using file name too (#11553)
Browse files Browse the repository at this point in the history
* fix: cache collections using file name too

* oops
  • Loading branch information
ematipico authored Jul 25, 2024
1 parent 602c5bf commit 02c85b5
Show file tree
Hide file tree
Showing 10 changed files with 112 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/tidy-needles-build.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': patch
---

Fixes an issue in content collection caching, where two documents with the same contents were generating an error during the build.
4 changes: 3 additions & 1 deletion packages/astro/src/core/build/plugins/plugin-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ interface ContentManifestKey {
type: 'content' | 'data';
entry: string;
}

interface ContentManifest {
version: number;
entries: [ContentManifestKey, string][];
Expand Down Expand Up @@ -304,6 +305,7 @@ interface ContentEntries {
restoreFromCache: ContentManifestKey[];
buildFromSource: ContentManifestKey[];
}

function getEntriesFromManifests(
oldManifest: ContentManifest,
newManifest: ContentManifest
Expand Down Expand Up @@ -379,7 +381,7 @@ async function generateContentManifest(
promises.push(
limit(async () => {
const data = await fsMod.promises.readFile(fileURL, { encoding: 'utf8' });
manifest.entries.push([key, checksum(data)]);
manifest.entries.push([key, checksum(data, fileURL.toString())]);
})
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,25 @@ describe('Experimental Content Collections cache - invalidation', () => {
this.cacheDir = new URL(relCacheDir, this.root);
this.tmpDir = new URL(`./tmp` + relCacheDir.slice(1), this.root);
}

backup() {
this.rmTmp();
copyFiles(this.cacheDir, this.tmpDir);
}

restore() {
fs.rmSync(this.cacheDir, { recursive: true });
copyFiles(this.tmpDir, this.cacheDir);
}

rmTmp() {
fs.rmSync(this.tmpDir, { force: true, recursive: true });
}
}

class ManifestTestPlugin {
used = false;

plugin() {
return {
name: '@test/manifest-used',
Expand Down Expand Up @@ -99,4 +103,35 @@ describe('Experimental Content Collections cache - invalidation', () => {
assert.equal(testPlugin.used, false, 'manifest not used because of lockfile mismatch');
});
});

describe('duplicate content', () => {
let fixture,
backup,
/** @type {ManifestTestPlugin} */
testPlugin;
before(async () => {
testPlugin = new ManifestTestPlugin();
fixture = await loadFixture({
root: './fixtures/content-collections-same-contents/',
cacheDir: './cache/same-contents/',
experimental: { contentCollectionCache: true },
integrations: [testPlugin.plugin()],
});
backup = new CacheBackup(
'./fixtures/content-collections-same-contents/',
'./cache/same-contents/'
);
backup.backup();
await fixture.build();
});

after(async () => {
backup.restore();
//await fixture.clean();
});

it('Manifest was not used', () => {
assert.equal(testPlugin.used, false, 'manifest not used because of lockfile mismatch');
});
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import {defineConfig} from 'astro/config';

// https://astro.build/config
export default defineConfig({
base: '/docs',
vite: {
build: {
assetsInlineLimit: 0
}
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "@test/content-collections-same-contents",
"version": "0.0.0",
"private": true,
"dependencies": {
"astro": "workspace:*"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { defineCollection, z } from 'astro:content';


const docs = defineCollection({
schema: z.object({
title: z.string(),
}),
});

export const collections = {
docs,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
title: One
---

# Title

stuff

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: One
---

# Title

stuff
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
import { getEntryBySlug } from 'astro:content';
const entry = await getEntryBySlug('docs', 'one');
const { Content } = await entry.render();
---
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>It's content time!</title>
</head>
<body>
<main>
<Content />
</main>
</body>
</html>
6 changes: 6 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 02c85b5

Please sign in to comment.