GitFOSS
.ts
TypeScript
(application/typescript)
// 3rd-party
import { FastifyPluginAsync } from "fastify";
import fp from "fastify-plugin";
import getFilePathExt from "file-extension";
import imageExts from "image-extensions";
import isImageFilePath from "is-image";
import languagesMap from "language-map";
import languageDetect from "language-detect";
import mimeTypes from "mime-db";
// app
import { makeCodeAnalysisService } from "../services/codeAnalysis";

const serviceKey = "codeAnalysisService";
export const codeAnalysisPlugin: FastifyPluginAsync<never> = fp(
  async (server) => {
    const service = makeCodeAnalysisService({
      getFilePathExt,
      imageExts,
      isImageFilePath,
      languageDetect,
      languagesMap,
      extsMimeTypesMap: Object.entries(mimeTypes).reduce(
        (acc, [mimeType, metas]) => {
          const { extensions } = metas;
          if (extensions == null) return acc;
          extensions.forEach((ext) => {
            acc = {
              ...acc,
              [ext]: mimeType,
            };
          });
          return acc;
        },
        {} as {
          [extension: string]: string; // ext => mime-type
        }
      ),
    });
    server.decorate(serviceKey, {
      getter: () => service,
    });
    server.decorateRequest(serviceKey, {
      getter: () => service,
    });
  }
);