Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
const path = require('node:path')
const { fileURLToPath } = require('node:url')
const { statSync } = require('node:fs')
const { glob } = require('glob')
const { glob, stat } = require('node:fs/promises')

Check failure on line 6 in index.js

View workflow job for this annotation

GitHub Actions / test / quality-check / Lint Code

'stat' is assigned a value but never used
const fp = require('fastify-plugin')
const send = require('@fastify/send')
const encodingNegotiator = require('@fastify/accept-negotiator')
Expand Down Expand Up @@ -139,11 +139,23 @@
for (let rootPath of roots) {
rootPath = rootPath.split(path.win32.sep).join(path.posix.sep)
!rootPath.endsWith('/') && (rootPath += '/')
const files = await glob('**/**', {
cwd: rootPath, absolute: false, follow: true, nodir: true, dot: opts.serveDotFiles, ignore: opts.globIgnore

const patterns = ['**/**']
if (opts.serveDotFiles) {
patterns.push('**/.*/**')
}

const globStream = glob(patterns, {
cwd: rootPath, withFileTypes: true, exclude: opts.globIgnore
})

for (let file of files) {
for await (const entry of globStream) {
const isFile = entry.isFile()
if (!isFile) { continue }
if (!opts.serveDotFiles && entry.name.startsWith('.')) { continue }
const fullPath = path.join(entry.parentPath, entry.name)
let file = path.relative(rootPath, fullPath)

file = file.split(path.win32.sep).join(path.posix.sep)
const route = prefix + file

Expand Down
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@
"@fastify/send": "^4.0.0",
"content-disposition": "^1.0.1",
"fastify-plugin": "^5.0.0",
"fastq": "^1.17.1",
"glob": "^11.0.0"
"fastq": "^1.17.1"
},
"devDependencies": {
"@fastify/compress": "^8.0.0",
Expand Down
15 changes: 10 additions & 5 deletions test/static.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1577,7 +1577,7 @@
})
})

test('fastify with exposeHeadRoutes', async t => {

Check failure on line 1580 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

fastify with exposeHeadRoutes

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 1580 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

fastify with exposeHeadRoutes

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
t.plan(1)

const pluginOptions = {
Expand All @@ -1604,7 +1604,7 @@
})
})

test('register with wildcard false', async t => {

Check failure on line 1607 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

register with wildcard false

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 1607 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

register with wildcard false

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
t.plan(8)

const pluginOptions = {
Expand Down Expand Up @@ -1702,7 +1702,7 @@
})
})

test('register with wildcard false (trailing slash in the root)', async t => {

Check failure on line 1705 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

register with wildcard false (trailing slash in the root)

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 1705 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

register with wildcard false (trailing slash in the root)

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
t.plan(5)

const pluginOptions = {
Expand Down Expand Up @@ -1810,7 +1810,7 @@
await t.assert.rejects(fastify.listen({ port: 0 }))
})

test('register with wildcard false and alternative index', async t => {

Check failure on line 1813 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

register with wildcard false and alternative index

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 1813 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

register with wildcard false and alternative index

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
t.plan(10)

const pluginOptions = {
Expand Down Expand Up @@ -1933,7 +1933,7 @@
})
})

test('register /static with wildcard false and alternative index', async t => {

Check failure on line 1936 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

register /static with wildcard false and alternative index

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 1936 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

register /static with wildcard false and alternative index

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
t.plan(10)

const pluginOptions = {
Expand Down Expand Up @@ -2185,7 +2185,7 @@
})
})

test('register /static with redirect true and wildcard false', async t => {

Check failure on line 2188 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

register /static with redirect true and wildcard false

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 2188 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

register /static with redirect true and wildcard false

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
t.plan(7)

const pluginOptions = {
Expand Down Expand Up @@ -2437,13 +2437,18 @@

test('register with failing glob handler', async (t) => {
const fastifyStatic = proxyquire.noCallThru()('../', {
glob: function globStub (_pattern, _options, cb) {
process.nextTick(function () {
return cb(new Error('mock glob error'))
})
'node:fs/promises': {
glob: function globStub (_pattern, _options) {
return {
[Symbol.asyncIterator] () {
return {
next: async () => { throw new Error('mock glob error') }
}
}
}
}
}
})

const pluginOptions = {
root: path.join(__dirname, '/static'),
serve: true,
Expand Down Expand Up @@ -2582,7 +2587,7 @@
)
})

test('register /static and /static2 without wildcard', async t => {

Check failure on line 2590 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

register /static and /static2 without wildcard

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 2590 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

register /static and /static2 without wildcard

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
t.plan(2)

const pluginOptions = {
Expand Down Expand Up @@ -2765,7 +2770,7 @@
}
)

test(

Check failure on line 2773 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

will serve pre-compressed files with .br at the highest priority (with wildcard: false)

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 2773 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

will serve pre-compressed files with .br at the highest priority (with wildcard: false)

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
'will serve pre-compressed files with .br at the highest priority (with wildcard: false)',
async (t) => {
const pluginOptions = {
Expand Down Expand Up @@ -2795,7 +2800,7 @@
}
)

test(

Check failure on line 2803 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

will serve pre-compressed files and fallback to .gz if .br is not on disk (with wildcard: false)

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 2803 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

will serve pre-compressed files and fallback to .gz if .br is not on disk (with wildcard: false)

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
'will serve pre-compressed files and fallback to .gz if .br is not on disk (with wildcard: false)',
async (t) => {
const pluginOptions = {
Expand Down Expand Up @@ -2825,7 +2830,7 @@
}
)

test(

Check failure on line 2833 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, macos-latest)

will serve pre-compressed files with .gzip if * directive used (with wildcard: false)

TypeError [Error]: glob is not a function at fastifyStatic (/Users/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/Users/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Check failure on line 2833 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (20, ubuntu-latest)

will serve pre-compressed files with .gzip if * directive used (with wildcard: false)

TypeError [Error]: glob is not a function at fastifyStatic (/home/runner/work/fastify-static/fastify-static/index.js:148:28) at Plugin.exec (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/lib/plugin.js:125:28) at Boot._loadPlugin (/home/runner/work/fastify-static/fastify-static/node_modules/avvio/boot.js:432:10) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
'will serve pre-compressed files with .gzip if * directive used (with wildcard: false)',
async (t) => {
const pluginOptions = {
Expand Down Expand Up @@ -3269,7 +3274,7 @@
t.assert.deepStrictEqual(response.status, 200)

const response2 = await fetch('http://localhost:' + fastify.server.address().port + '/dir/symlink/subdir/subdir/index.html')
t.assert.ok(response2.ok)

Check failure on line 3277 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (22, macos-latest)

should follow symbolic link without wildcard

AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: t.assert.ok(response2.ok) at TestContext.<anonymous> (/Users/runner/work/fastify-static/fastify-static/test/static.test.js:3277:12) at process.processTicksAndRejections (node:internal/process/task_queues:105:5) at async Test.run (node:internal/test_runner/test:1054:7) at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' }

Check failure on line 3277 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (24, ubuntu-latest)

should follow symbolic link without wildcard

AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: t.assert.ok(response2.ok) at TestContext.<anonymous> (/home/runner/work/fastify-static/fastify-static/test/static.test.js:3277:12) at process.processTicksAndRejections (node:internal/process/task_queues:103:5) at async Test.run (node:internal/test_runner/test:1113:7) at async Test.processPendingSubtests (node:internal/test_runner/test:788:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' }

Check failure on line 3277 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (22, ubuntu-latest)

should follow symbolic link without wildcard

AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: t.assert.ok(response2.ok) at TestContext.<anonymous> (/home/runner/work/fastify-static/fastify-static/test/static.test.js:3277:12) at process.processTicksAndRejections (node:internal/process/task_queues:105:5) at async Test.run (node:internal/test_runner/test:1054:7) at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' }
t.assert.deepStrictEqual(response2.status, 200)
})

Expand All @@ -3290,7 +3295,7 @@
fastify.server.unref()

const response = await fetch('http://localhost:' + fastify.server.address().port + '/.hidden/sample.json')
t.assert.ok(response.ok)

Check failure on line 3298 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (22, macos-latest)

should serve files into hidden dir with wildcard `false`

AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: t.assert.ok(response.ok) at TestContext.<anonymous> (/Users/runner/work/fastify-static/fastify-static/test/static.test.js:3298:12) at process.processTicksAndRejections (node:internal/process/task_queues:105:5) at async Test.run (node:internal/test_runner/test:1054:7) at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' }

Check failure on line 3298 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (24, ubuntu-latest)

should serve files into hidden dir with wildcard `false`

AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: t.assert.ok(response.ok) at TestContext.<anonymous> (/home/runner/work/fastify-static/fastify-static/test/static.test.js:3298:12) at process.processTicksAndRejections (node:internal/process/task_queues:103:5) at async Test.run (node:internal/test_runner/test:1113:7) at async Test.processPendingSubtests (node:internal/test_runner/test:788:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' }

Check failure on line 3298 in test/static.test.js

View workflow job for this annotation

GitHub Actions / test / Test (22, ubuntu-latest)

should serve files into hidden dir with wildcard `false`

AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: t.assert.ok(response.ok) at TestContext.<anonymous> (/home/runner/work/fastify-static/fastify-static/test/static.test.js:3298:12) at process.processTicksAndRejections (node:internal/process/task_queues:105:5) at async Test.run (node:internal/test_runner/test:1054:7) at async Test.processPendingSubtests (node:internal/test_runner/test:744:7) { generatedMessage: true, code: 'ERR_ASSERTION', actual: false, expected: true, operator: '==', diff: 'simple' }
t.assert.deepStrictEqual(response.status, 200)
t.assert.deepStrictEqual(await response.text(), jsonHiddenContent)
t.assert.ok(/application\/(json)/.test(response.headers.get('content-type')))
Expand Down
Loading