import fastify, { FastifyInstance, FastifyPluginAsync, FastifyRequest, FastifyReply } from 'fastify' import { Server } from 'node:http' import { Stats } from 'node:fs' import { expectAssignable, expectError, expectType } from 'tsd' import * as fastifyStaticStar from '..' import fastifyStatic, { FastifyStaticOptions, fastifyStatic as fastifyStaticNamed } from '..' const fastifyStaticCjsImport = fastifyStaticStar const fastifyStaticCjs = require('..') const app: FastifyInstance = fastify() app.register(fastifyStatic, { root: __dirname }) app.register(fastifyStaticNamed, { root: __dirname }) app.register(fastifyStaticCjs, { root: __dirname }) app.register(fastifyStaticCjsImport.default, { root: __dirname }) app.register(fastifyStaticCjsImport.fastifyStatic, { root: __dirname }) app.register(fastifyStaticStar.default, { root: __dirname }) app.register(fastifyStaticStar.fastifyStatic, { root: __dirname }) expectType>(fastifyStatic) expectType>(fastifyStaticNamed) expectType>(fastifyStaticCjsImport.default) expectType>(fastifyStaticCjsImport.fastifyStatic) expectType>(fastifyStaticStar.default) expectType>( fastifyStaticStar.fastifyStatic ) expectType(fastifyStaticCjs) const appWithImplicitHttp = fastify() const options: FastifyStaticOptions = { acceptRanges: true, contentType: true, cacheControl: true, decorateReply: true, dotfiles: 'allow', etag: true, extensions: ['.js'], immutable: true, index: ['1'], lastModified: true, maxAge: '', prefix: '', prefixAvoidTrailingSlash: false, root: '', schemaHide: true, serve: true, wildcard: true, globIgnore: ['**/*.private'], list: false, setHeaders: (res, path, stat) => { expectType(res.filename) expectType(res.statusCode) expectType>(res.getHeader('X-Test')) res.setHeader('X-Test', 'string') expectType(path) expectType(stat) }, preCompressed: false, allowedPath: (_pathName: string, _root: string, _request: FastifyRequest) => { return true }, constraints: { host: /^.*\.example\.com$/, version: '1.0.2' }, logLevel: 'warn' } expectError({ root: '', wildcard: '**/**' }) expectAssignable({ root: '', list: { format: 'json' } }) expectAssignable({ root: '', list: { format: 'json', render: () => '' } }) expectAssignable({ root: '', list: { format: 'html', render: () => '' } }) expectError({ root: '', list: { format: 'html' } }) expectAssignable({ root: [''] }) expectAssignable({ root: new URL('') }) expectAssignable({ root: [new URL('')] }) expectError({ serve: true }) expectAssignable({ serve: true, root: '' }) expectAssignable({ serve: false }) appWithImplicitHttp .register(fastifyStatic, options) .after(() => { appWithImplicitHttp.get('/', (_request, reply) => { reply.sendFile('some-file-name') }) }) const appWithHttp2 = fastify({ http2: true }) appWithHttp2 .register(fastifyStatic, options) .after(() => { appWithHttp2.get('/', (_request, reply) => { reply.sendFile('some-file-name') }) appWithHttp2.get('/download', (_request, reply) => { reply.download('some-file-name') }) appWithHttp2.get('/download/1', (_request, reply) => { reply.download('some-file-name', { maxAge: '2 days' }) }) appWithHttp2.get('/download/2', (_request, reply) => { reply.download('some-file-name', 'some-filename', { cacheControl: false, acceptRanges: true }) }) appWithHttp2.get('/download/3', (_request, reply) => { reply.download('some-file-name', 'some-filename', { contentType: false }) }) }) const multiRootAppWithImplicitHttp = fastify() options.root = [''] multiRootAppWithImplicitHttp .register(fastifyStatic, options) .after(() => { multiRootAppWithImplicitHttp.get('/', (_request, reply) => { reply.sendFile('some-file-name') }) multiRootAppWithImplicitHttp.get('/', (_request, reply) => { reply.sendFile('some-file-name', { cacheControl: false, acceptRanges: true }) }) multiRootAppWithImplicitHttp.get('/', (_request, reply) => { reply.sendFile('some-file-name', 'some-root-name', { cacheControl: false, acceptRanges: true }) }) multiRootAppWithImplicitHttp.get('/', (_request, reply) => { reply.sendFile('some-file-name', 'some-root-name-2', { contentType: false }) }) multiRootAppWithImplicitHttp.get('/download', (_request, reply) => { reply.download('some-file-name') }) multiRootAppWithImplicitHttp.get('/download/1', (_request, reply) => { reply.download('some-file-name', { maxAge: '2 days' }) }) multiRootAppWithImplicitHttp.get('/download/2', (_request, reply) => { reply.download('some-file-name', 'some-filename', { cacheControl: false, acceptRanges: true }) }) multiRootAppWithImplicitHttp.get('/download/3', (_request, reply) => { reply.download('some-file-name', 'some-filename', { contentType: false }) }) }) const noIndexApp = fastify() options.root = '' options.index = false noIndexApp .register(fastifyStatic, options) .after(() => { noIndexApp.get('/', (_request, reply) => { reply.send('

fastify-static

') }) }) options.root = new URL('') const URLRootApp = fastify() URLRootApp.register(fastifyStatic, options) .after(() => { URLRootApp.get('/', (_request, reply) => { reply.send('

fastify-static

') }) }) const defaultIndexApp = fastify() options.index = 'index.html' defaultIndexApp .register(fastifyStatic, options) .after(() => { defaultIndexApp.get('/', (_request, reply) => { reply.send('

fastify-static

') }) })