summaryrefslogtreecommitdiff
path: root/packages/integrations/netlify/test/functions/include-files.test.js
diff options
context:
space:
mode:
authorGravatar Dani Fernández <mail.dfdez@gmail.com> 2025-02-12 15:08:38 +0100
committerGravatar GitHub <noreply@github.com> 2025-02-12 14:08:38 +0000
commit1b5037bd77d77817e5f821aee8ceccb49b00e0d9 (patch)
tree646c3a3dfcb2f6925757ca8e7b2cc8d43a5c11da /packages/integrations/netlify/test/functions/include-files.test.js
parentb019150dc22530051ad6f70fd2756c8b853c6f4f (diff)
downloadastro-1b5037bd77d77817e5f821aee8ceccb49b00e0d9.tar.gz
astro-1b5037bd77d77817e5f821aee8ceccb49b00e0d9.tar.zst
astro-1b5037bd77d77817e5f821aee8ceccb49b00e0d9.zip
Update netlify adapter to integrate includeFiles and excludeFiles options (#13194)
* feat: integrated includeFiles and excludeFiles on netlify adapter * feat: added netlify include and exclude files tests * feat: changelogs added * fix: avoid problems with glob file url on windows * feat: improved JS Docs to include examples and important information * feat: removed non necessary root path as glob is already absolute * Apply suggestions from code review * Update packages/integrations/netlify/src/index.ts Co-authored-by: Matt Kane <m@mk.gg> * Update .changeset/ninety-clouds-judge.md Co-authored-by: Sarah Rainsberger <5098874+sarah11918@users.noreply.github.com> --------- Co-authored-by: Emanuele Stoppa <my.burning@gmail.com> Co-authored-by: Matt Kane <m@mk.gg> Co-authored-by: Sarah Rainsberger <5098874+sarah11918@users.noreply.github.com>
Diffstat (limited to 'packages/integrations/netlify/test/functions/include-files.test.js')
-rw-r--r--packages/integrations/netlify/test/functions/include-files.test.js184
1 files changed, 184 insertions, 0 deletions
diff --git a/packages/integrations/netlify/test/functions/include-files.test.js b/packages/integrations/netlify/test/functions/include-files.test.js
new file mode 100644
index 000000000..a7fa11ca3
--- /dev/null
+++ b/packages/integrations/netlify/test/functions/include-files.test.js
@@ -0,0 +1,184 @@
+import * as assert from 'node:assert/strict';
+import { existsSync } from 'node:fs';
+import { after, before, describe, it } from 'node:test';
+import netlify from '@astrojs/netlify';
+import { loadFixture } from '../../../../astro/test/test-utils.js';
+import * as cheerio from 'cheerio';
+import glob from 'fast-glob';
+
+describe(
+ 'Included vite assets files',
+ () => {
+ let fixture;
+
+ const root = new URL('./fixtures/includes/', import.meta.url);
+ const expectedCwd = new URL('.netlify/v1/functions/ssr/packages/integrations/netlify/', root);
+
+ const expectedAssetsInclude = ['./*.json'];
+ const excludedAssets = ['./files/exclude-asset.json'];
+
+ before(async () => {
+ fixture = await loadFixture({
+ root,
+ vite: {
+ assetsInclude: expectedAssetsInclude,
+ },
+ adapter: netlify({
+ excludeFiles: excludedAssets,
+ }),
+ });
+ await fixture.build();
+ });
+
+ it('Emits vite assets files', async () => {
+ for (const pattern of expectedAssetsInclude) {
+ const files = glob.sync(pattern);
+ for (const file of files) {
+ assert.ok(
+ existsSync(new URL(file, expectedCwd)),
+ `Expected file ${pattern} to exist in build`,
+ );
+ }
+ }
+ });
+
+ it('Does not include vite assets files when excluded', async () => {
+ for (const file of excludedAssets) {
+ assert.ok(
+ !existsSync(new URL(file, expectedCwd)),
+ `Expected file ${file} to not exist in build`,
+ );
+ }
+ });
+
+ after(async () => {
+ await fixture.clean();
+ });
+ },
+ {
+ timeout: 120000,
+ },
+);
+
+describe(
+ 'Included files',
+ () => {
+ let fixture;
+
+ const root = new URL('./fixtures/includes/', import.meta.url);
+ const expectedCwd = new URL(
+ '.netlify/v1/functions/ssr/packages/integrations/netlify/test/functions/fixtures/includes/',
+ root,
+ );
+
+ const expectedFiles = [
+ './files/include-this.txt',
+ './files/also-this.csv',
+ './files/subdirectory/and-this.csv',
+ ];
+
+ before(async () => {
+ fixture = await loadFixture({
+ root,
+ adapter: netlify({
+ includeFiles: expectedFiles,
+ }),
+ });
+ await fixture.build();
+ });
+
+ it('Emits include files', async () => {
+ for (const file of expectedFiles) {
+ assert.ok(existsSync(new URL(file, expectedCwd)), `Expected file ${file} to exist`);
+ }
+ });
+
+ it('Can load included files correctly', async () => {
+ const entryURL = new URL(
+ './fixtures/includes/.netlify/v1/functions/ssr/ssr.mjs',
+ import.meta.url,
+ );
+ const { default: handler } = await import(entryURL);
+ const resp = await handler(new Request('http://example.com/?file=include-this.txt'), {});
+ const html = await resp.text();
+ const $ = cheerio.load(html);
+ assert.equal($('h1').text(), 'hello');
+ });
+
+ it('Includes traced node modules with symlinks', async () => {
+ const expected = new URL(
+ '.netlify/v1/functions/ssr/node_modules/.pnpm/cowsay@1.6.0/node_modules/cowsay/cows/happy-whale.cow',
+ root,
+ );
+ assert.ok(existsSync(expected, 'Expected excluded file to exist in default build'));
+ });
+
+ after(async () => {
+ await fixture.clean();
+ });
+ },
+ {
+ timeout: 120000,
+ },
+);
+
+describe(
+ 'Excluded files',
+ () => {
+ let fixture;
+
+ const root = new URL('./fixtures/includes/', import.meta.url);
+ const expectedCwd = new URL(
+ '.netlify/v1/functions/ssr/packages/integrations/netlify/test/functions/fixtures/includes/',
+ root,
+ );
+
+ const includeFiles = ['./files/**/*.txt'];
+ const excludedTxt = ['./files/subdirectory/not-this.txt', './files/subdirectory/or-this.txt'];
+ const excludeFiles = [...excludedTxt, '../../../../../../../node_modules/.pnpm/cowsay@*/**'];
+
+ before(async () => {
+ fixture = await loadFixture({
+ root,
+ adapter: netlify({
+ includeFiles: includeFiles,
+ excludeFiles: excludeFiles,
+ }),
+ });
+ await fixture.build();
+ });
+
+ it('Excludes traced node modules', async () => {
+ const expected = new URL(
+ '.netlify/v1/functions/ssr/node_modules/.pnpm/cowsay@1.6.0/node_modules/cowsay/cows/happy-whale.cow',
+ root,
+ );
+ assert.ok(!existsSync(expected), 'Expected excluded file to not exist in build');
+ });
+
+ it('Does not include files when excluded', async () => {
+ for (const pattern of includeFiles) {
+ const files = glob.sync(pattern, { ignore: excludedTxt });
+ for (const file of files) {
+ assert.ok(
+ existsSync(new URL(file, expectedCwd)),
+ `Expected file ${pattern} to exist in build`,
+ );
+ }
+ }
+ for (const file of excludedTxt) {
+ assert.ok(
+ !existsSync(new URL(file, expectedCwd)),
+ `Expected file ${file} to not exist in build`,
+ );
+ }
+ });
+
+ after(async () => {
+ await fixture.clean();
+ });
+ },
+ {
+ timeout: 120000,
+ },
+);