diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f2a0ff9 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,60 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin', 'import', '@stylistic/ts'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier', + 'plugin:sonarjs/recommended-legacy', + 'plugin:import/recommended', + 'plugin:import/typescript', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: [ + '**/node_modules/*', + 'dist', + 'tests', + 'scripts', + 'resources', + '.dev', + '.devops', + '.debug', + ], + rules: { + 'no-console': 'error', + '@typescript-eslint/no-inferrable-types': 'error', + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + 'no-eval': 'error', + 'no-implied-eval': 'error', + 'prefer-promise-reject-errors': 'warn', + complexity: ['error', 20], + 'import/no-unresolved': 'error', + 'import/order': [ + 'error', + { + alphabetize: { + /* sort in ascending order. Options: ["ignore", "asc", "desc"] */ + order: 'asc', + /* ignore case. Options: [true, false] */ + caseInsensitive: true, + }, + }, + ], + }, + settings: { + 'import/resolver': { + typescript: { + project: './tsconfig.json', + }, + }, + }, +}; diff --git a/.github/workflows/pull-requests.yaml b/.github/workflows/pull-requests.yaml new file mode 100644 index 0000000..c2c3771 --- /dev/null +++ b/.github/workflows/pull-requests.yaml @@ -0,0 +1,48 @@ +name: "Code Quality Control Workflow" + +on: + - pull_request + +jobs: + code_quality_matrix: + strategy: + fail-fast: false + matrix: + cmd: ["format:check", "lint:check", "build"] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Cache node modules + id: cache-npm + uses: actions/cache@v4 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} + name: List the state of node modules + continue-on-error: true + run: npm list + + - name: "Install Node Modules" + run: npm install -D + + - name: "Running ${{ matrix.cmd }}" + run: npm run ${{ matrix.cmd }} + continue-on-error: ${{ matrix.cmd == 'lint:check' }} + + - name: Annotate Code Linting Results + if: ${{ matrix.cmd == 'lint:check' }} + uses: ataylorme/eslint-annotate-action@v3 + with: + report-json: "eslint_report.json" diff --git a/.gitignore b/.gitignore index 1d5d067..f6d01fd 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,9 @@ npm-debug.log # dist dist +# temporary reports +eslint_report.json + #yarn .pnp.* .yarn/* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..ad35042 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "arrowParens": "avoid" +} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index e69de29..0000000 diff --git a/lib/cache/cache.ts b/lib/cache/cache.ts index c2cec48..fbe1110 100644 --- a/lib/cache/cache.ts +++ b/lib/cache/cache.ts @@ -1,6 +1,6 @@ -import { CacheDriver } from "./interfaces"; -import { CacheService } from "./service"; -import { genKeyFromObj } from "./utils/genKey"; +import { CacheDriver } from './interfaces'; +import { CacheService } from './service'; +import { genKeyFromObj } from './utils/genKey'; export class Cache { static store(store?: string): CacheDriver { diff --git a/lib/cache/constants.ts b/lib/cache/constants.ts index 8a73f7d..f2243c7 100644 --- a/lib/cache/constants.ts +++ b/lib/cache/constants.ts @@ -1 +1 @@ -export const CACHE_OPTIONS = "_intentjs_cache_options__"; +export const CACHE_OPTIONS = '_intentjs_cache_options__'; diff --git a/lib/cache/drivers/inMemory.ts b/lib/cache/drivers/inMemory.ts index ebb7d7a..f4fd4a1 100644 --- a/lib/cache/drivers/inMemory.ts +++ b/lib/cache/drivers/inMemory.ts @@ -1,12 +1,12 @@ -import { GenericFunction } from "../../interfaces"; -import { Package } from "../../utils/packageLoader"; -import { CacheDriver, InMemoryDriverOption } from "../interfaces"; +import { GenericFunction } from '../../interfaces'; +import { Package } from '../../utils/packageLoader'; +import { CacheDriver, InMemoryDriverOption } from '../interfaces'; export class InMemoryDriver implements CacheDriver { private client: any; constructor(private options: InMemoryDriverOption) { - const NodeCache = Package.load("node-cache"); + const NodeCache = Package.load('node-cache'); this.client = new NodeCache({ stdTTL: 100, checkperiod: 120 }); } @@ -19,7 +19,7 @@ export class InMemoryDriver implements CacheDriver { async set( key: string, value: string | Record, - ttlInSec?: number | undefined + ttlInSec?: number | undefined, ): Promise { const cacheKey = `${this.options.prefix}:::${key}`; @@ -38,7 +38,7 @@ export class InMemoryDriver implements CacheDriver { async remember( key: string, cb: GenericFunction, - ttlInSec: number + ttlInSec: number, ): Promise { const exists = await this.has(key); if (exists) return this.get(key); diff --git a/lib/cache/drivers/redis.ts b/lib/cache/drivers/redis.ts index c5889f9..87ab0a5 100644 --- a/lib/cache/drivers/redis.ts +++ b/lib/cache/drivers/redis.ts @@ -1,12 +1,12 @@ -import { GenericFunction } from "../../interfaces"; -import { Package } from "../../utils"; -import { CacheDriver, RedisDriverOption } from "../interfaces"; +import { GenericFunction } from '../../interfaces'; +import { Package } from '../../utils'; +import { CacheDriver, RedisDriverOption } from '../interfaces'; export class RedisDriver implements CacheDriver { private client: any; constructor(private options: RedisDriverOption) { - const IORedis = Package.load("ioredis"); + const IORedis = Package.load('ioredis'); if (options.url) { this.client = new IORedis(options.url, { db: options.database || 0 }); } else { @@ -33,12 +33,12 @@ export class RedisDriver implements CacheDriver { async set( key: string, value: string | number | Record, - ttlInSec?: number + ttlInSec?: number, ): Promise { try { const redisKey = `${this.options.prefix}:::${key}`; ttlInSec - ? await this.client.set(redisKey, JSON.stringify(value), "EX", ttlInSec) + ? await this.client.set(redisKey, JSON.stringify(value), 'EX', ttlInSec) : await this.client.set(redisKey, JSON.stringify(value)); return true; } catch { @@ -54,7 +54,7 @@ export class RedisDriver implements CacheDriver { async remember( key: string, cb: GenericFunction, - ttlInSec: number + ttlInSec: number, ): Promise { const value = await this.get(key); if (value) return value; diff --git a/lib/cache/index.ts b/lib/cache/index.ts index 95a8ab0..5f2cba4 100644 --- a/lib/cache/index.ts +++ b/lib/cache/index.ts @@ -1,3 +1,3 @@ -export * from "./service"; -export * from "./interfaces"; -export * from "./cache"; +export * from './service'; +export * from './interfaces'; +export * from './cache'; diff --git a/lib/cache/interfaces/driver.ts b/lib/cache/interfaces/driver.ts index 3352252..cb371b9 100644 --- a/lib/cache/interfaces/driver.ts +++ b/lib/cache/interfaces/driver.ts @@ -1,4 +1,4 @@ -import { GenericFunction } from "../../interfaces"; +import { GenericFunction } from '../../interfaces'; export interface CacheDriver { /** @@ -16,7 +16,7 @@ export interface CacheDriver { set( key: string, value: Record | string, - ttlInSec?: number + ttlInSec?: number, ): Promise; /** @@ -28,7 +28,7 @@ export interface CacheDriver { remember( key: string, cb: GenericFunction, - ttlInSec: number + ttlInSec: number, ): Promise; rememberForever(key: string, cb: GenericFunction): Promise; diff --git a/lib/cache/interfaces/index.ts b/lib/cache/interfaces/index.ts index f6082e1..90f7d5c 100644 --- a/lib/cache/interfaces/index.ts +++ b/lib/cache/interfaces/index.ts @@ -1,2 +1,2 @@ -export * from "./options"; -export * from "./driver"; +export * from './options'; +export * from './driver'; diff --git a/lib/cache/interfaces/options.ts b/lib/cache/interfaces/options.ts index b29b657..5ce268c 100644 --- a/lib/cache/interfaces/options.ts +++ b/lib/cache/interfaces/options.ts @@ -1,7 +1,7 @@ -import { ModuleMetadata, Type } from "@nestjs/common"; +import { ModuleMetadata, Type } from '@nestjs/common'; export interface RedisDriverOption { - driver: "redis"; + driver: 'redis'; host?: string; port?: number; url?: string; @@ -12,7 +12,7 @@ export interface RedisDriverOption { } export interface InMemoryDriverOption { - driver: "memory"; + driver: 'memory'; prefix: string; } @@ -28,7 +28,7 @@ export interface CacheAsyncOptionsFactory { createCacheOptions(): Promise | CacheOptions; } -export interface CacheAsyncOptions extends Pick { +export interface CacheAsyncOptions extends Pick { name?: string; isGlobal: boolean; useExisting?: Type; diff --git a/lib/cache/service.ts b/lib/cache/service.ts index ea3be04..95e3b6a 100644 --- a/lib/cache/service.ts +++ b/lib/cache/service.ts @@ -1,10 +1,10 @@ -import { Injectable, OnModuleInit } from "@nestjs/common"; -import { RedisDriver } from "./drivers/redis"; -import { CacheDriver, CacheOptions } from "./interfaces"; -import { InMemoryDriver } from "./drivers/inMemory"; -import { InternalLogger } from "../utils/logger"; -import { IntentConfig } from "../config/service"; -import { logTime } from "../utils/helpers"; +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { IntentConfig } from '../config/service'; +import { logTime } from '../utils/helpers'; +import { InternalLogger } from '../utils/logger'; +import { InMemoryDriver } from './drivers/inMemory'; +import { RedisDriver } from './drivers/redis'; +import { CacheDriver, CacheOptions } from './interfaces'; @Injectable() export class CacheService implements OnModuleInit { @@ -13,7 +13,7 @@ export class CacheService implements OnModuleInit { static stores: Record; constructor(config: IntentConfig) { - CacheService.data = config.get("cache"); + CacheService.data = config.get('cache'); } onModuleInit() { @@ -26,18 +26,18 @@ export class CacheService implements OnModuleInit { if (!driver) { InternalLogger.error( - "QueueService", - `We couldn't find any driver associated with the "${stores[store].driver}".` + 'QueueService', + `We couldn't find any driver associated with the "${stores[store].driver}".`, ); continue; } CacheService.stores[store] = new driver(stores[store] as never); InternalLogger.success( - "CacheService", + 'CacheService', `Cache store [${ stores[store].driver - }] successfully initiailized ${logTime(Date.now() - time)}` + }] successfully initiailized ${logTime(Date.now() - time)}`, ); } } diff --git a/lib/cache/utils/genKey.ts b/lib/cache/utils/genKey.ts index 72f7383..b434c48 100644 --- a/lib/cache/utils/genKey.ts +++ b/lib/cache/utils/genKey.ts @@ -1,21 +1,20 @@ -import { createHash } from "node:crypto"; -import { Arr } from "../../utils/array"; +import { createHash } from 'node:crypto'; +import { Arr } from '../../utils/array'; export const genKeyFromObj = ( obj: Record, - dontHash: boolean = false + dontHash = false, ): string => { const keys = Object.keys(obj).sort(); const keyStr = []; for (const key of keys) { - const values = Arr.isArray(obj[key]) ? obj[key].join(",") : obj[key]; + const values = Arr.isArray(obj[key]) ? obj[key].join(',') : obj[key]; keyStr.push(`${key}[${values}]`); } - const str = keyStr.join(","); + const str = keyStr.join(','); if (str.length > 10000 && !dontHash) { - const hash = createHash("sha1").update(str).digest("hex"); - return hash; + return createHash('sha1').update(str).digest('hex'); } return str; diff --git a/lib/codegen/command.ts b/lib/codegen/command.ts index a3442c2..ecf1280 100644 --- a/lib/codegen/command.ts +++ b/lib/codegen/command.ts @@ -1,17 +1,17 @@ -import { Injectable } from "@nestjs/common"; -import { Command, CommandRunner, ConsoleIO } from "../console"; -import { CodegenService } from "./service"; -import { getClassNamesFromFilePath } from "./utils"; -import { join } from "path"; -import { Str } from "../utils/string"; +import { join } from 'path'; +import { Injectable } from '@nestjs/common'; +import { Command, CommandRunner, ConsoleIO } from '../console'; +import { Str } from '../utils/string'; +import { CodegenService } from './service'; +import { getClassNamesFromFilePath } from './utils'; @Injectable() export class CodegenCommand { constructor(private service: CodegenService) {} - @Command("make:config {namespace}", { desc: "Command to make config" }) + @Command('make:config {namespace}', { desc: 'Command to make config' }) async makeConfig(_cli: ConsoleIO): Promise { - const namespace = _cli.argument("namespace"); + const namespace = _cli.argument('namespace'); // convert the namespace to camelcase for file name. const fileNameWithoutEx = Str.camel(namespace); const fileNameWithEx = `${fileNameWithoutEx}.ts`; @@ -27,15 +27,15 @@ export class CodegenCommand { await this.service.createConfigFile(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:controller {name}", { desc: "Command to create a controller" }) + @Command('make:controller {name}', { desc: 'Command to create a controller' }) async makeController(_cli: ConsoleIO): Promise { - _cli.info("Creating controller"); - const name = _cli.argument("name"); + _cli.info('Creating controller'); + const name = _cli.argument('name'); const routeName = name; const controllerName = Str.pascal(`${name}_controller`); const fileNameWithoutEx = Str.camel(`${name}_controller`); @@ -49,15 +49,15 @@ export class CodegenCommand { await this.service.createController(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:service {name}", { desc: "Command to create a service" }) + @Command('make:service {name}', { desc: 'Command to create a service' }) async makeService(_cli: ConsoleIO): Promise { - _cli.info("Creating service class"); - const name = _cli.argument("name"); + _cli.info('Creating service class'); + const name = _cli.argument('name'); const className = Str.pascal(`${name}_service`); const fileNameWithoutEx = Str.camel(`${name}_service`); const filePath = `app/services/${fileNameWithoutEx}.ts`; @@ -66,15 +66,15 @@ export class CodegenCommand { await this.service.createService(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:job {name}", { desc: "Command to create a job" }) + @Command('make:job {name}', { desc: 'Command to create a job' }) async makeJob(_cli: ConsoleIO): Promise { - _cli.info("Creating job class"); - const jobName = _cli.argument("name"); + _cli.info('Creating job class'); + const jobName = _cli.argument('name'); const jobClassName = Str.pascal(`${jobName}_job`); const fileNameWithoutEx = Str.camel(`${jobName}_job`); const filePath = `app/jobs/${fileNameWithoutEx}.ts`; @@ -82,22 +82,22 @@ export class CodegenCommand { input: { jobName, jobClassName }, filePath, fileNameWithoutEx, - template: "job", + template: 'job', }; try { await this.service.createJob(options); _cli.success(`Successfully created job at ${filePath}`); } catch (e) { console.log(e); - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:model {name}", { desc: "Command to create a model" }) + @Command('make:model {name}', { desc: 'Command to create a model' }) async makeModel(_cli: ConsoleIO): Promise { - _cli.info("Creating model class"); - const name = _cli.argument("name"); + _cli.info('Creating model class'); + const name = _cli.argument('name'); const className = Str.pascal(`${name}_model`); const fileNameWithoutEx = Str.camel(`${name}_model`); const filePath = `app/models/${fileNameWithoutEx}.ts`; @@ -110,25 +110,25 @@ export class CodegenCommand { await this.service.createModel(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:repo {repoName} {modelFileName} {--without-interface}", { - desc: "Command to create a repo", + @Command('make:repo {repoName} {modelFileName} {--without-interface}', { + desc: 'Command to create a repo', }) async makeRepository(_cli: ConsoleIO): Promise { - _cli.info("Creating db repository class"); - const repoName = _cli.argument("repoName"); + _cli.info('Creating db repository class'); + const repoName = _cli.argument('repoName'); const repoClassName = Str.pascal(`${repoName}_Db_Repository`); const fileNameWithoutEx = Str.camel(`${repoName}_Db_Repository`); const filePath = `app/repositories/${fileNameWithoutEx}.ts`; const repoToken = Str.upper(`${repoName}_DB_REPO`); - const modelFileName = _cli.argument("modelFileName"); + const modelFileName = _cli.argument('modelFileName'); const relativeModelFilePath = `../models/${modelFileName}`; const modelName = getClassNamesFromFilePath( - join("app", `models/${modelFileName}.ts`) + join('app', `models/${modelFileName}.ts`), )[0]; const options = { @@ -146,17 +146,17 @@ export class CodegenCommand { await this.service.createRepo(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:exception {name}", { - desc: "Command to create an http exception class", + @Command('make:exception {name}', { + desc: 'Command to create an http exception class', }) async makeException(_cli: ConsoleIO): Promise { - _cli.info("Creating an exception class"); - const name = _cli.argument("name"); + _cli.info('Creating an exception class'); + const name = _cli.argument('name'); const className = Str.pascal(`${name}_exception`); const fileNameWithoutEx = Str.camel(`${name}_exception`); const filePath = `app/exceptions/${fileNameWithoutEx}.ts`; @@ -165,15 +165,15 @@ export class CodegenCommand { await this.service.createException(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:resource {name}", { desc: "Command to create a service" }) + @Command('make:resource {name}', { desc: 'Command to create a service' }) async makeResource(_cli: ConsoleIO): Promise { - _cli.info("Creating resource file"); - const name = _cli.argument("name"); + _cli.info('Creating resource file'); + const name = _cli.argument('name'); try { await CommandRunner.run(`make:model ${name}`); @@ -182,17 +182,17 @@ export class CodegenCommand { await CommandRunner.run(`make:controller ${name}`); await CommandRunner.run(`make:service ${name}`, { silent: true }); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:event {name}", { - desc: "Command to create an event class", + @Command('make:event {name}', { + desc: 'Command to create an event class', }) async makeEvent(_cli: ConsoleIO): Promise { - _cli.info("Creating an event class"); - const name = _cli.argument("name"); + _cli.info('Creating an event class'); + const name = _cli.argument('name'); const className = Str.pascal(`${name}_event`); const fileNameWithoutEx = Str.camel(`${name}_event`); const filePath = `app/events/${fileNameWithoutEx}.ts`; @@ -205,20 +205,20 @@ export class CodegenCommand { await this.service.createEvent(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } @Command( - "make:listener {name: Name of the listener} {--E|event= : Name of the event to which the listener will listen to}", - { desc: "Command to create an event listener class" } + 'make:listener {name: Name of the listener} {--E|event= : Name of the event to which the listener will listen to}', + { desc: 'Command to create an event listener class' }, ) async makeListener(_cli: ConsoleIO): Promise { - _cli.info("Creating a listener class"); - const name = _cli.argument("name"); - console.log("name", name, _cli.values); - const eventName = _cli.option("event_name"); + _cli.info('Creating a listener class'); + const name = _cli.argument('name'); + console.log('name', name, _cli.values); + const eventName = _cli.option('event_name'); const className = Str.pascal(`${name}_listener`); const fileNameWithoutEx = Str.camel(`${name}_listener`); const filePath = `app/events/listeners/${fileNameWithoutEx}.ts`; @@ -231,18 +231,18 @@ export class CodegenCommand { await this.service.createListener(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } @Command( - "make:command {name : Name of the command by which it will be invoked}", - { desc: "Command to create a console command class" } + 'make:command {name : Name of the command by which it will be invoked}', + { desc: 'Command to create a console command class' }, ) async makeCommand(_cli: ConsoleIO): Promise { - const name = _cli.argument("name"); - const validClassToken = Str.replace(name, ":", ""); + const name = _cli.argument('name'); + const validClassToken = Str.replace(name, ':', ''); const className = Str.pascal(`${validClassToken}_command`); const fileNameWithoutEx = Str.camel(`${validClassToken}_command`); const filePath = `app/console/${fileNameWithoutEx}.ts`; @@ -255,16 +255,16 @@ export class CodegenCommand { await this.service.createCommand(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } - @Command("make:mail {name}", { - desc: "Command to create a mail class", + @Command('make:mail {name}', { + desc: 'Command to create a mail class', }) async makeMail(_cli: ConsoleIO): Promise { - const name = _cli.argument("name"); + const name = _cli.argument('name'); const className = Str.pascal(`${name}_mail`); const fileNameWithoutEx = Str.camel(`${name}_mail`); const filePath = `app/mails/${fileNameWithoutEx}.ts`; @@ -277,7 +277,7 @@ export class CodegenCommand { await this.service.createMail(options); _cli.success(`Successfully created ${filePath}`); } catch (e) { - _cli.error(e["message"]); + _cli.error(e['message']); return; } } diff --git a/lib/codegen/service.ts b/lib/codegen/service.ts index 745c8a9..388887e 100644 --- a/lib/codegen/service.ts +++ b/lib/codegen/service.ts @@ -1,9 +1,9 @@ -import { Injectable } from "@nestjs/common"; -import { existsSync } from "fs"; -import { join } from "path"; -import { Eta } from "eta"; -import { path } from "app-root-path"; -import { Node, Project, SyntaxKind } from "ts-morph"; +import { existsSync } from 'fs'; +import { join } from 'path'; +import { Injectable } from '@nestjs/common'; +import { path } from 'app-root-path'; +import { Eta } from 'eta'; +import { Node, Project, SyntaxKind } from 'ts-morph'; @Injectable() export class CodegenService { @@ -12,7 +12,7 @@ export class CodegenService { constructor() { this.templateEngine = new Eta({ cache: true, - views: join(__dirname, "../../../resources/stubs"), + views: join(__dirname, '../../../resources/stubs'), }); } @@ -27,7 +27,7 @@ export class CodegenService { const { filePath, fileNameWithoutEx, input = {} } = options; await this.checkIfFileAlreadyExists(filePath); - const content = await this.templateEngine.renderAsync("config", input); + const content = await this.templateEngine.renderAsync('config', input); const project = new Project({}); const newFile = project.createSourceFile(join(path, filePath), content, { overwrite: false, @@ -36,7 +36,7 @@ export class CodegenService { // update the index.ts file const indexFile = project.addSourceFileAtPath( - join(path, "config/index.ts") + join(path, 'config/index.ts'), ); indexFile.addImportDeclaration({ @@ -45,18 +45,18 @@ export class CodegenService { }); const defaultExport = indexFile.getExportAssignment( - (assignment) => assignment.isExportEquals() === false + assignment => assignment.isExportEquals() === false, ); if (!defaultExport) return; const exportExpression = defaultExport.getExpression(); const arrayLiteral = exportExpression.asKindOrThrow( - SyntaxKind.ArrayLiteralExpression + SyntaxKind.ArrayLiteralExpression, ); arrayLiteral.addElement(fileNameWithoutEx); await indexFile.save(); - console.timeEnd("ttl"); + console.timeEnd('ttl'); } async createController(options: Record): Promise { @@ -64,27 +64,27 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("controller", input); + const content = await this.templateEngine.renderAsync('controller', input); const newController = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newController.save(); // update module.ts const moduleFile = project.addSourceFileAtPath( - join(path, "app", "module.ts") + join(path, 'app', 'module.ts'), ); - const classDeclaration = moduleFile.getClassOrThrow("AppModule"); - const moduleDecorator = classDeclaration.getDecoratorOrThrow("Module"); + const classDeclaration = moduleFile.getClassOrThrow('AppModule'); + const moduleDecorator = classDeclaration.getDecoratorOrThrow('Module'); const moduleDecoratorArg = moduleDecorator.getArguments()[0]; const moduleObjectLiteral = moduleDecoratorArg.asKindOrThrow( - SyntaxKind.ObjectLiteralExpression + SyntaxKind.ObjectLiteralExpression, ); - const controllersProperty = moduleObjectLiteral.getProperty("controllers"); + const controllersProperty = moduleObjectLiteral.getProperty('controllers'); if (Node.isPropertyAssignment(controllersProperty)) { const controllersArray = controllersProperty @@ -106,27 +106,27 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("service", input); + const content = await this.templateEngine.renderAsync('service', input); const newController = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newController.save(); // update module.ts const moduleFile = project.addSourceFileAtPath( - join(path, "app", "module.ts") + join(path, 'app', 'module.ts'), ); - const classDeclaration = moduleFile.getClassOrThrow("AppModule"); - const moduleDecorator = classDeclaration.getDecoratorOrThrow("Module"); + const classDeclaration = moduleFile.getClassOrThrow('AppModule'); + const moduleDecorator = classDeclaration.getDecoratorOrThrow('Module'); const moduleDecoratorArg = moduleDecorator.getArguments()[0]; const moduleObjectLiteral = moduleDecoratorArg.asKindOrThrow( - SyntaxKind.ObjectLiteralExpression + SyntaxKind.ObjectLiteralExpression, ); - const controllersProperty = moduleObjectLiteral.getProperty("providers"); + const controllersProperty = moduleObjectLiteral.getProperty('providers'); if (Node.isPropertyAssignment(controllersProperty)) { const controllersArray = controllersProperty @@ -148,11 +148,11 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("exception", input); + const content = await this.templateEngine.renderAsync('exception', input); const newException = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newException.save(); } @@ -162,8 +162,8 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const content = await this.templateEngine.renderAsync( - "repositoryDB", - input + 'repositoryDB', + input, ); const project = new Project(); @@ -171,31 +171,31 @@ export class CodegenService { const newSourceFile = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newSourceFile.save(); // update module.ts const moduleFile = project.addSourceFileAtPath( - join(path, "app", "module.ts") + join(path, 'app', 'module.ts'), ); - const classDeclaration = moduleFile.getClassOrThrow("AppModule"); - const moduleDecorator = classDeclaration.getDecoratorOrThrow("Module"); + const classDeclaration = moduleFile.getClassOrThrow('AppModule'); + const moduleDecorator = classDeclaration.getDecoratorOrThrow('Module'); const moduleDecoratorArg = moduleDecorator.getArguments()[0]; const moduleObjectLiteral = moduleDecoratorArg.asKindOrThrow( - SyntaxKind.ObjectLiteralExpression + SyntaxKind.ObjectLiteralExpression, ); - const controllersProperty = moduleObjectLiteral.getProperty("providers"); + const controllersProperty = moduleObjectLiteral.getProperty('providers'); if (Node.isPropertyAssignment(controllersProperty)) { const controllersArray = controllersProperty .getInitializer() .asKindOrThrow(SyntaxKind.ArrayLiteralExpression); controllersArray.addElement( - `{ provide: '${repoToken}', useClass: ${input.className}, }` + `{ provide: '${repoToken}', useClass: ${input.className}, }`, ); } @@ -212,27 +212,27 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("job", input); + const content = await this.templateEngine.renderAsync('job', input); const newController = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newController.save(); // update module.ts const moduleFile = project.addSourceFileAtPath( - join(path, "app", "module.ts") + join(path, 'app', 'module.ts'), ); - const classDeclaration = moduleFile.getClassOrThrow("AppModule"); - const moduleDecorator = classDeclaration.getDecoratorOrThrow("Module"); + const classDeclaration = moduleFile.getClassOrThrow('AppModule'); + const moduleDecorator = classDeclaration.getDecoratorOrThrow('Module'); const moduleDecoratorArg = moduleDecorator.getArguments()[0]; const moduleObjectLiteral = moduleDecoratorArg.asKindOrThrow( - SyntaxKind.ObjectLiteralExpression + SyntaxKind.ObjectLiteralExpression, ); - const controllersProperty = moduleObjectLiteral.getProperty("providers"); + const controllersProperty = moduleObjectLiteral.getProperty('providers'); if (Node.isPropertyAssignment(controllersProperty)) { const controllersArray = controllersProperty @@ -254,11 +254,11 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("model", input); + const content = await this.templateEngine.renderAsync('model', input); const newController = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newController.save(); } @@ -268,11 +268,11 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("event", input); + const content = await this.templateEngine.renderAsync('event', input); const newException = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newException.save(); } @@ -282,27 +282,27 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("listener", input); + const content = await this.templateEngine.renderAsync('listener', input); const newController = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newController.save(); // update module.ts const moduleFile = project.addSourceFileAtPath( - join(path, "app", "module.ts") + join(path, 'app', 'module.ts'), ); - const classDeclaration = moduleFile.getClassOrThrow("AppModule"); - const moduleDecorator = classDeclaration.getDecoratorOrThrow("Module"); + const classDeclaration = moduleFile.getClassOrThrow('AppModule'); + const moduleDecorator = classDeclaration.getDecoratorOrThrow('Module'); const moduleDecoratorArg = moduleDecorator.getArguments()[0]; const moduleObjectLiteral = moduleDecoratorArg.asKindOrThrow( - SyntaxKind.ObjectLiteralExpression + SyntaxKind.ObjectLiteralExpression, ); - const controllersProperty = moduleObjectLiteral.getProperty("providers"); + const controllersProperty = moduleObjectLiteral.getProperty('providers'); if (Node.isPropertyAssignment(controllersProperty)) { const controllersArray = controllersProperty @@ -324,27 +324,27 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("command", input); + const content = await this.templateEngine.renderAsync('command', input); const newController = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newController.save(); // update module.ts const moduleFile = project.addSourceFileAtPath( - join(path, "app", "module.ts") + join(path, 'app', 'module.ts'), ); - const classDeclaration = moduleFile.getClassOrThrow("AppModule"); - const moduleDecorator = classDeclaration.getDecoratorOrThrow("Module"); + const classDeclaration = moduleFile.getClassOrThrow('AppModule'); + const moduleDecorator = classDeclaration.getDecoratorOrThrow('Module'); const moduleDecoratorArg = moduleDecorator.getArguments()[0]; const moduleObjectLiteral = moduleDecoratorArg.asKindOrThrow( - SyntaxKind.ObjectLiteralExpression + SyntaxKind.ObjectLiteralExpression, ); - const controllersProperty = moduleObjectLiteral.getProperty("providers"); + const controllersProperty = moduleObjectLiteral.getProperty('providers'); if (Node.isPropertyAssignment(controllersProperty)) { const controllersArray = controllersProperty @@ -366,11 +366,11 @@ export class CodegenService { await this.checkIfFileAlreadyExists(filePath); const project = new Project(); - const content = await this.templateEngine.renderAsync("mail", input); + const content = await this.templateEngine.renderAsync('mail', input); const newException = project.createSourceFile( join(path, filePath), content, - { overwrite: false } + { overwrite: false }, ); await newException.save(); } diff --git a/lib/codegen/utils.ts b/lib/codegen/utils.ts index 8ecc3a7..626e567 100644 --- a/lib/codegen/utils.ts +++ b/lib/codegen/utils.ts @@ -1,10 +1,10 @@ -import { path } from 'app-root-path'; import { join } from 'path'; +import { path } from 'app-root-path'; import { Project } from 'ts-morph'; export const getClassNamesFromFilePath = (filePath: string): string[] => { const project = new Project(); const sourceFile = project.addSourceFileAtPath(join(path, filePath)); const classes = sourceFile.getClasses(); - return classes.map((c) => c.getName()); + return classes.map(c => c.getName()); }; diff --git a/lib/config/command.ts b/lib/config/command.ts index 5c0433b..791e3c0 100644 --- a/lib/config/command.ts +++ b/lib/config/command.ts @@ -1,33 +1,33 @@ -import { Injectable } from "@nestjs/common"; -import { Command, ConsoleIO } from "../console"; -import { Obj } from "../utils"; -import { Arr } from "../utils/array"; -import { IntentConfig } from "./service"; -import { columnify } from "../utils/columnify"; -import * as pc from "picocolors"; +import { Injectable } from '@nestjs/common'; +import * as pc from 'picocolors'; +import { Command, ConsoleIO } from '../console'; +import { Obj } from '../utils'; +import { Arr } from '../utils/array'; +import { columnify } from '../utils/columnify'; +import { IntentConfig } from './service'; @Injectable() export class ViewConfigCommand { constructor(private config: IntentConfig) {} - @Command("config:view {namespace}", { - desc: "Command to view config for a given namespace", + @Command('config:view {namespace}', { + desc: 'Command to view config for a given namespace', }) async handle(_cli: ConsoleIO): Promise { - const namespace = _cli.argument("namespace"); + const namespace = _cli.argument('namespace'); const config = this.config.get(namespace); if (!config) { _cli.error(`config with ${namespace} namespace not found`); return; } const columnifiedConfig = columnify( - Arr.toObj(Obj.entries(config), ["key", "value"]) + Arr.toObj(Obj.entries(config), ['key', 'value']), ); const printRows = []; for (const row of columnifiedConfig) { - printRows.push([pc.green(row[0]), pc.yellow(row[1])].join(" ")); + printRows.push([pc.green(row[0]), pc.yellow(row[1])].join(' ')); } - console.log(printRows.join("\n")); + console.log(printRows.join('\n')); } } diff --git a/lib/config/service.ts b/lib/config/service.ts index 1742a07..a20c4cd 100644 --- a/lib/config/service.ts +++ b/lib/config/service.ts @@ -1,5 +1,5 @@ -import { Injectable } from "@nestjs/common"; -import { ConfigService } from "@nestjs/config"; +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class IntentConfig { diff --git a/lib/console/argumentParser.ts b/lib/console/argumentParser.ts index 9efcf88..20b2869 100644 --- a/lib/console/argumentParser.ts +++ b/lib/console/argumentParser.ts @@ -1,6 +1,6 @@ -import { Str } from "../utils"; -import { InternalLogger } from "../utils/logger"; -import { ArgumentOptionObject, ArgumentParserOutput } from "./interfaces"; +import { Str } from '../utils'; +import { InternalLogger } from '../utils/logger'; +import { ArgumentOptionObject, ArgumentParserOutput } from './interfaces'; export class ArgumentParser { constructor(private exp: string) {} @@ -11,28 +11,28 @@ export class ArgumentParser { } private handle(): ArgumentParserOutput { - const words = this.exp.split("{"); + const words = this.exp.split('{'); const obj: ArgumentParserOutput = { - name: Str.replace(words.splice(0, 1)[0], /[\s\n]*/, ""), + name: Str.replace(words.splice(0, 1)[0], /[\s\n]*/, ''), arguments: [], options: [], - meta: { desc: "" }, + meta: { desc: '' }, }; const reservedArgumentsAndOptions = {}; for (const word of words) { if (!word) continue; - const input = Str.replace(word, /[\n}]]*/, "").trim(); - Str.startsWith(input, "--") + const input = Str.replace(word, /[\n}]]*/, '').trim(); + Str.startsWith(input, '--') ? obj.options.push({ ...this.parseExpression( input.substring(2), - reservedArgumentsAndOptions + reservedArgumentsAndOptions, ), isRequired: false, }) : obj.arguments.push( - this.parseExpression(input, reservedArgumentsAndOptions) + this.parseExpression(input, reservedArgumentsAndOptions), ); } @@ -41,19 +41,19 @@ export class ArgumentParser { parseExpression( expression: string, - reservedArgumentsAndOptions: Record + reservedArgumentsAndOptions: Record, ): ArgumentOptionObject { - const [arg, description] = expression.split(":"); - const [arg1, defaultValue = null] = arg.split("="); + const [arg, description] = expression.split(':'); + const [arg1, defaultValue = null] = arg.split('='); - const formattedExp = Str.replace(arg1, /[?\*]+/g, ""); - const aliasedExp = formattedExp.split("|"); + const formattedExp = Str.replace(arg1, /[?\*]+/g, ''); + const aliasedExp = formattedExp.split('|'); for (const alias of aliasedExp) { if (reservedArgumentsAndOptions[alias]) { InternalLogger.error( - "Console Argument Parser", - `Only unique command name or alias are allowed, duplicated found for alias: '${alias}'` + 'Console Argument Parser', + `Only unique command name or alias are allowed, duplicated found for alias: '${alias}'`, ); return; } @@ -61,12 +61,12 @@ export class ArgumentParser { } return { name: aliasedExp.pop().trim(), - alias: aliasedExp.map((a) => a.trim()), - isRequired: !Str.contains(arg, "?"), - isArray: Str.contains(arg, "*"), - defaultValue: ![" ", null].includes(defaultValue) && defaultValue, + alias: aliasedExp.map(a => a.trim()), + isRequired: !Str.contains(arg, '?'), + isArray: Str.contains(arg, '*'), + defaultValue: ![' ', null].includes(defaultValue) && defaultValue, expression, - description: description?.trim() ?? "", + description: description?.trim() ?? '', }; } } diff --git a/lib/console/commands/listCommands.ts b/lib/console/commands/listCommands.ts index c228d2e..85e1391 100644 --- a/lib/console/commands/listCommands.ts +++ b/lib/console/commands/listCommands.ts @@ -1,15 +1,15 @@ -import { Injectable } from "@nestjs/common"; -import { Command } from "../decorators"; -import { CommandMeta } from "../metadata"; -import * as pc from "picocolors"; -import { readFileSync } from "fs"; -import { path } from "app-root-path"; -import { join } from "path"; -import { columnify } from "../../utils/columnify"; -import { Str } from "../../utils/string"; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { Injectable } from '@nestjs/common'; +import { path } from 'app-root-path'; +import * as pc from 'picocolors'; +import { columnify } from '../../utils/columnify'; +import { Str } from '../../utils/string'; +import { Command } from '../decorators'; +import { CommandMeta } from '../metadata'; @Injectable() -@Command("list", { desc: "Command to list all the commands" }) +@Command('list', { desc: 'Command to list all the commands' }) export class ListCommands { public async handle(): Promise { const commands = CommandMeta.getAllCommands(); @@ -18,18 +18,18 @@ export class ListCommands { const groupsWithIndices = {}; for (const commandKey in commands) { const commandInfo = commands[commandKey]; - const group = Str.before(commandKey, ":"); + const group = Str.before(commandKey, ':'); groupsWithIndices[group] = []; list.push({ command: commandKey, - desc: commandInfo.meta.desc || "", + desc: commandInfo.meta.desc || '', }); } const formattedRows = columnify(list, { padStart: 2 }); const groups = {}; for (const row of formattedRows) { - const group = Str.before(row[0], ":").trim(); + const group = Str.before(row[0], ':').trim(); if (groups[group]) { groups[group].push(row); } else { @@ -38,11 +38,11 @@ export class ListCommands { } // create rows - const printRows = [pc.yellow(Str.prepend("Available Commands:", " "))]; + const printRows = [pc.yellow(Str.prepend('Available Commands:', ' '))]; for (const group in groups) { - printRows.push(pc.yellow(Str.prepend(group, " "))); + printRows.push(pc.yellow(Str.prepend(group, ' '))); for (const command of groups[group]) { - printRows.push([pc.green(command[0]), command[1]].join(" ")); + printRows.push([pc.green(command[0]), command[1]].join(' ')); } } @@ -50,16 +50,16 @@ export class ListCommands { * Read package.json */ const packageJson = JSON.parse( - readFileSync(join(path, "package.json")).toString() + readFileSync(join(path, 'package.json')).toString(), ); console.log(); console.log( pc.white( - ` IntentJS ${packageJson.dependencies["@intentjs/core"] || "0.0.1"}` - ) + ` IntentJS ${packageJson.dependencies['@intentjs/core'] || '0.0.1'}`, + ), ); console.log(); - console.log(printRows.join("\n")); + console.log(printRows.join('\n')); console.log(); return; } diff --git a/lib/console/consoleIO.ts b/lib/console/consoleIO.ts index 363a1f5..42cbaf7 100644 --- a/lib/console/consoleIO.ts +++ b/lib/console/consoleIO.ts @@ -1,8 +1,8 @@ -import { ArgumentParserOutput } from "./interfaces"; -import { ArgumentParser } from "./argumentParser"; -import { Inquirer } from "./inquirer"; -import { ConsoleLogger } from "./logger"; -import { Obj } from "../utils"; +import { Obj } from '../utils'; +import { ArgumentParser } from './argumentParser'; +import { Inquirer } from './inquirer'; +import { ArgumentParserOutput } from './interfaces'; +import { ConsoleLogger } from './logger'; export class ConsoleIO { schema: ArgumentParserOutput; @@ -11,8 +11,11 @@ export class ConsoleIO { hasErrors: boolean; missingArguments: string[]; - constructor(private schemaString: string, private argv: Record) { - this.schema = { name: "", arguments: [], options: [], meta: { desc: "" } }; + constructor( + private schemaString: string, + private argv: Record, + ) { + this.schema = { name: '', arguments: [], options: [], meta: { desc: '' } }; this.values = { arguments: {}, options: {} }; this.rawValues = { ...this.argv }; this.missingArguments = []; diff --git a/lib/console/explorer.ts b/lib/console/explorer.ts index f6260b1..64636c2 100644 --- a/lib/console/explorer.ts +++ b/lib/console/explorer.ts @@ -1,9 +1,9 @@ import { Injectable } from '@nestjs/common'; import { DiscoveryService, MetadataScanner } from '@nestjs/core'; -import { ConsoleConstants } from './constants'; -import { CommandMeta } from './metadata'; import { GenericFunction } from '../interfaces'; +import { ConsoleConstants } from './constants'; import { CommandMetaOptions } from './interfaces'; +import { CommandMeta } from './metadata'; @Injectable() export class ConsoleExplorer { @@ -14,7 +14,7 @@ export class ConsoleExplorer { onModuleInit() { const wrappers = this.discovery.getProviders(); - wrappers.forEach((w) => { + wrappers.forEach(w => { const { instance } = w; if ( !instance || diff --git a/lib/console/index.ts b/lib/console/index.ts index c682695..8d53279 100644 --- a/lib/console/index.ts +++ b/lib/console/index.ts @@ -1,9 +1,9 @@ -export * from "./metadata"; -export * from "./decorators"; -export * from "./logger"; -export * from "./inquirer"; -export * from "./commands"; -export * from "./explorer"; -export * from "./runner"; -export * from "./interfaces"; -export * from "./consoleIO"; +export * from './metadata'; +export * from './decorators'; +export * from './logger'; +export * from './inquirer'; +export * from './commands'; +export * from './explorer'; +export * from './runner'; +export * from './interfaces'; +export * from './consoleIO'; diff --git a/lib/console/inquirer.ts b/lib/console/inquirer.ts index 578d321..4f57a93 100644 --- a/lib/console/inquirer.ts +++ b/lib/console/inquirer.ts @@ -1,4 +1,4 @@ -import { prompt } from "enquirer"; +import { prompt } from 'enquirer'; export class Inquirer { /** @@ -8,10 +8,10 @@ export class Inquirer { */ static async ask(question: string): Promise { const answers = await prompt([ - { name: "question", message: question, type: "input" }, + { name: 'question', message: question, type: 'input' }, ]); console.log(answers); - return answers["question"]; + return answers['question']; } /** @@ -20,15 +20,15 @@ export class Inquirer { */ static async confirm(message: string): Promise { const answer = await prompt([ - { name: "confirm_once", message, type: "confirm" }, + { name: 'confirm_once', message, type: 'confirm' }, ]); - return answer["confirm_once"]; + return answer['confirm_once']; } static async number(message: string): Promise { - const answer = await prompt([{ name: "q", message, type: "numeral" }]); - return answer["q"]; + const answer = await prompt([{ name: 'q', message, type: 'numeral' }]); + return answer['q']; } /** @@ -38,9 +38,9 @@ export class Inquirer { * @returns Promise */ static async select(message: string, choices: string[]): Promise { - const name = "command"; - const answers = await prompt([{ type: "select", name, message, choices }]); - return answers["command"]; + const name = 'command'; + const answers = await prompt([{ type: 'select', name, message, choices }]); + return answers['command']; } /** @@ -51,13 +51,13 @@ export class Inquirer { */ static async multiSelect( message: string, - choices: string[] + choices: string[], ): Promise { - const name = "command"; + const name = 'command'; const answers = await prompt([ - { type: "multiselect", name, message, choices, multiple: true }, + { type: 'multiselect', name, message, choices, multiple: true }, ]); - return answers["command"]; + return answers['command']; } /** @@ -66,8 +66,8 @@ export class Inquirer { * @param mask */ static async password(message: string): Promise { - const name = "command"; - const answers = await prompt([{ type: "password", name, message }]); + const name = 'command'; + const answers = await prompt([{ type: 'password', name, message }]); return answers[name]; } } diff --git a/lib/console/interfaces/index.ts b/lib/console/interfaces/index.ts index 84a0767..9ef91ea 100644 --- a/lib/console/interfaces/index.ts +++ b/lib/console/interfaces/index.ts @@ -1,4 +1,4 @@ -import { ConsoleIO } from "../consoleIO"; +import { ConsoleIO } from '../consoleIO'; export interface CommandMetaOptions { desc?: string; diff --git a/lib/console/logger.ts b/lib/console/logger.ts index ab69e08..685a247 100644 --- a/lib/console/logger.ts +++ b/lib/console/logger.ts @@ -1,6 +1,6 @@ -import pc from "picocolors"; -import Table from "cli-table3"; -import { Str } from "../utils/string"; +import Table from 'cli-table3'; +import pc from 'picocolors'; +import { Str } from '../utils/string'; export class ConsoleLogger { /** @@ -36,7 +36,7 @@ export class ConsoleLogger { * @returns void */ static line(): void { - console.log(pc.gray("-".repeat(process.stdout.columns / 2))); + console.log(pc.gray('-'.repeat(process.stdout.columns / 2))); } /** diff --git a/lib/console/metadata.ts b/lib/console/metadata.ts index d1555f6..7a9c5e1 100644 --- a/lib/console/metadata.ts +++ b/lib/console/metadata.ts @@ -1,6 +1,6 @@ -import { GenericFunction } from "../interfaces"; -import { ArgumentParser } from "./argumentParser"; -import { CommandObject, CommandMetaOptions } from "./interfaces"; +import { GenericFunction } from '../interfaces'; +import { ArgumentParser } from './argumentParser'; +import { CommandObject, CommandMetaOptions } from './interfaces'; export class CommandMeta { private static commands: Record = {}; @@ -16,7 +16,7 @@ export class CommandMeta { static setCommand( command: string, options: CommandMetaOptions, - target: GenericFunction + target: GenericFunction, ): void { const parsedArgument = ArgumentParser.from(command); const { name } = parsedArgument; diff --git a/lib/console/runner.ts b/lib/console/runner.ts index 0be26dc..f1a3748 100644 --- a/lib/console/runner.ts +++ b/lib/console/runner.ts @@ -1,11 +1,11 @@ -import * as pc from "picocolors"; -import { CommandObject } from "./interfaces"; -import { ConsoleIO } from "./consoleIO"; -import { ConsoleLogger } from "./logger"; -import yargsParser from "yargs-parser"; -import { CommandMeta } from "./metadata"; -import { columnify } from "../utils/columnify"; -import { isEmpty } from "../utils/helpers"; +import * as pc from 'picocolors'; +import yargsParser from 'yargs-parser'; +import { columnify } from '../utils/columnify'; +import { isEmpty } from '../utils/helpers'; +import { ConsoleIO } from './consoleIO'; +import { CommandObject } from './interfaces'; +import { ConsoleLogger } from './logger'; +import { CommandMeta } from './metadata'; export class CommandRunner { static async run(cmd: string, options?: { silent: boolean }): Promise { @@ -16,10 +16,10 @@ export class CommandRunner { static async handle( command: CommandObject | null, - args: Record + args: Record, ): Promise { if (command == null) { - ConsoleLogger.error("No command found"); + ConsoleLogger.error('No command found'); return; } @@ -34,7 +34,7 @@ export class CommandRunner { const _cli = ConsoleIO.from(command.expression, args); if (_cli.hasErrors && _cli.missingArguments.length > 0) { - _cli.error(` Missing Arguments: ${_cli.missingArguments.join(", ")} `); + _cli.error(` Missing Arguments: ${_cli.missingArguments.join(', ')} `); return; } @@ -47,21 +47,21 @@ export class CommandRunner { } static printOptions(command: CommandObject) { - console.log(pc.yellow("Command: ") + command.name); + console.log(pc.yellow('Command: ') + command.name); if (command.meta.desc) { - console.log(pc.yellow("Description: ") + command.meta.desc); + console.log(pc.yellow('Description: ') + command.meta.desc); } if (command.arguments.length) { console.log(); - console.log(pc.yellow("Arguments:")); + console.log(pc.yellow('Arguments:')); const rows = []; for (const option of command.arguments) { let key = option.name; key = option.defaultValue ? `${key}[=${option.defaultValue}]` : key; - let desc = option.description || "No description passed"; + let desc = option.description || 'No description passed'; desc = option.isArray - ? `${desc} ${pc.yellow("[multiple values allowed]")}` + ? `${desc} ${pc.yellow('[multiple values allowed]')}` : desc; rows.push({ key, description: desc }); @@ -69,25 +69,25 @@ export class CommandRunner { const printRows = []; const formattedRows = columnify(rows, { padStart: 2 }); for (const row of formattedRows) { - printRows.push([pc.green(row[0]), row[1]].join("")); + printRows.push([pc.green(row[0]), row[1]].join('')); } - console.log(printRows.join("\n")); + console.log(printRows.join('\n')); } if (command.options.length) { console.log(); - console.log(pc.yellow("Options:")); + console.log(pc.yellow('Options:')); const rows = []; for (const option of command.options) { - let key = option.alias?.length ? `-${option.alias.join("|")}, ` : ``; + let key = option.alias?.length ? `-${option.alias.join('|')}, ` : ``; key = `${key}--${option.name}`; key = isEmpty(option.defaultValue) ? `${key}[=${option.defaultValue}]` : key; - let desc = option.description || "No description passed"; + let desc = option.description || 'No description passed'; desc = option.isArray - ? `${desc} ${pc.yellow("[multiple values allowed]")}` + ? `${desc} ${pc.yellow('[multiple values allowed]')}` : desc; rows.push({ key, description: desc }); @@ -95,10 +95,10 @@ export class CommandRunner { const printRows = []; const formattedRows = columnify(rows, { padStart: 2 }); for (const row of formattedRows) { - printRows.push([pc.green(row[0]), row[1]].join("")); + printRows.push([pc.green(row[0]), row[1]].join('')); } - console.log(printRows.join("\n")); + console.log(printRows.join('\n')); } // if (command.arguments.length > 0) { diff --git a/lib/constants.ts b/lib/constants.ts index be1f00d..b222abb 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -4,5 +4,5 @@ export class BoatConstants { export class IntentDecoratorTypes { static consoleCommand = '@intent/console/command'; - static queueJob = '@intent/queue/job' -} \ No newline at end of file + static queueJob = '@intent/queue/job'; +} diff --git a/lib/database/baseModel.ts b/lib/database/baseModel.ts index f136fce..b8a30ff 100644 --- a/lib/database/baseModel.ts +++ b/lib/database/baseModel.ts @@ -15,7 +15,7 @@ export class BaseModel extends Model { /** * Specifies if the model supports soft delete feature. */ - static softDelete: boolean = false; + static softDelete = false; QueryBuilderType!: CustomQueryBuilder | SoftDeleteQueryBuilder; diff --git a/lib/database/commands/migrations.ts b/lib/database/commands/migrations.ts index 3460a22..0acf08c 100644 --- a/lib/database/commands/migrations.ts +++ b/lib/database/commands/migrations.ts @@ -1,20 +1,20 @@ -import { Injectable } from "@nestjs/common"; -import * as pc from "picocolors"; -import { Command, ConsoleIO } from "../../console"; -import { ObjectionService } from "../service"; -import { Str } from "../../utils/string"; +import { Injectable } from '@nestjs/common'; +import * as pc from 'picocolors'; +import { Command, ConsoleIO } from '../../console'; +import { Str } from '../../utils/string'; +import { ObjectionService } from '../service'; @Injectable() export class DbOperationsCommand { constructor() {} - @Command("migrate:status {--connection==}", { - desc: "Command to show the status of all migrations", + @Command('migrate:status {--connection==}', { + desc: 'Command to show the status of all migrations', }) async migrateStatus(_cli: ConsoleIO): Promise { const options = ObjectionService.config; - const conn = _cli.option("connection") || options.default; + const conn = _cli.option('connection') || options.default; const knex = ObjectionService.connection(conn); const connConfig = options.connections[conn]; @@ -23,31 +23,31 @@ export class DbOperationsCommand { const statusList = []; for (const migration of completed) { - statusList.push({ migration: migration.name, status: pc.green("Y") }); + statusList.push({ migration: migration.name, status: pc.green('Y') }); } for (const migration of pending) { - statusList.push({ migration: migration.file, status: pc.red("N") }); + statusList.push({ migration: migration.file, status: pc.red('N') }); } - _cli.table(["Migration", "Status"], statusList); + _cli.table(['Migration', 'Status'], statusList); } - @Command("migrate {--connection==}", { - desc: "Command to run the pending migrations", + @Command('migrate {--connection==}', { + desc: 'Command to run the pending migrations', }) async migrationUp(_cli: ConsoleIO): Promise { const options = ObjectionService.config; - const conn = _cli.option("connection") || options.default; + const conn = _cli.option('connection') || options.default; const knex = ObjectionService.connection(conn); const connConfig = options.connections[conn]; const [batch, migrations]: [number, string[]] = await knex.migrate.latest( - connConfig.migrations + connConfig.migrations, ); if (migrations.length === 0) { - _cli.info("No migrations to run"); + _cli.info('No migrations to run'); return; } @@ -57,21 +57,21 @@ export class DbOperationsCommand { } } - @Command("migrate:rollback {--connection==}", { - desc: "Command to rollback the previous batch of migrations", + @Command('migrate:rollback {--connection==}', { + desc: 'Command to rollback the previous batch of migrations', }) async migrateRollback(_cli: ConsoleIO) { const options = ObjectionService.config; - const conn = _cli.option("connection") || options.default; + const conn = _cli.option('connection') || options.default; const knex = ObjectionService.connection(conn); const connConfig = options.connections[conn]; const [batch, migrations]: [number, string[]] = await knex.migrate.rollback( - connConfig.migrations + connConfig.migrations, ); if (migrations.length === 0) { - _cli.info("No migrations to rollback. Already at the base migration"); + _cli.info('No migrations to rollback. Already at the base migration'); return; } @@ -81,67 +81,67 @@ export class DbOperationsCommand { } } - @Command("migrate:reset {--connection==}", { - desc: "Command to reset the migration", + @Command('migrate:reset {--connection==}', { + desc: 'Command to reset the migration', }) async migrateReset(_cli: ConsoleIO) { const options = ObjectionService.config; - const conn = _cli.option("connection") || options.default; + const conn = _cli.option('connection') || options.default; const knex = ObjectionService.connection(conn); const connConfig = options.connections[conn]; const confirm = await _cli.confirm( - "Are you sure you want to reset your database? This action is irreversible." + 'Are you sure you want to reset your database? This action is irreversible.', ); if (!confirm) { - _cli.info("Thank you! Exiting..."); + _cli.info('Thank you! Exiting...'); return; } const password = await _cli.password( - "Please enter the password of the database to proceed" + 'Please enter the password of the database to proceed', ); if (connConfig.connection && Str.isNotString(connConfig.connection)) { - const conPassword = connConfig.connection?.["password"]; + const conPassword = connConfig.connection?.['password']; if (conPassword && password !== conPassword) { - _cli.error(" Wrong Password. Exiting... "); + _cli.error(' Wrong Password. Exiting... '); return; } } const [, migrations]: [number, string[]] = await knex.migrate.down( - connConfig.migrations + connConfig.migrations, ); if (migrations.length === 0) { - _cli.info("No migrations to rollback. Already at the base migration"); + _cli.info('No migrations to rollback. Already at the base migration'); return; } - _cli.info("Rollback of following migrations are done:"); + _cli.info('Rollback of following migrations are done:'); for (const migration of migrations) { _cli.success(migration); } } - @Command("make:migration {name} {--connection=}", { - desc: "Command to create a new migration", + @Command('make:migration {name} {--connection=}', { + desc: 'Command to create a new migration', }) async makeMigration(_cli: ConsoleIO) { const options = ObjectionService.config; - const name = _cli.argument("name"); - const conn = _cli.option("connection") || options.default; + const name = _cli.argument('name'); + const conn = _cli.option('connection') || options.default; const knex = ObjectionService.connection(conn); const connConfig = options.connections[conn]; const res = await knex.migrate.make(name, { directory: connConfig?.migrations?.directory, - extension: "js", + extension: 'js', }); - const paths = res.split("/"); + const paths = res.split('/'); _cli.success(paths[paths.length - 1]); } } diff --git a/lib/database/commands/utils.ts b/lib/database/commands/utils.ts index 242431d..cad062b 100644 --- a/lib/database/commands/utils.ts +++ b/lib/database/commands/utils.ts @@ -1,17 +1,17 @@ -import { Injectable } from "@nestjs/common"; -import { Command, ConsoleIO } from "../../console"; -import { ObjectionService } from "../service"; +import { Injectable } from '@nestjs/common'; +import { Command, ConsoleIO } from '../../console'; +import { ObjectionService } from '../service'; @Injectable() export class DatabaseUtilitiesCommand { constructor() {} - @Command("db:column-info {tableName} {--connection==}") + @Command('db:column-info {tableName} {--connection==}') async listColumnInfo(_cli: ConsoleIO): Promise { const conn = - _cli.option("connection") || ObjectionService.config.default; + _cli.option('connection') || ObjectionService.config.default; const knex = ObjectionService.connection(conn); - const tableName = _cli.argument("tableName"); + const tableName = _cli.argument('tableName'); const columnInfo = await knex.table(tableName).columnInfo(); @@ -24,6 +24,6 @@ export class DatabaseUtilitiesCommand { } console.log(arr); - _cli.table(["Column", ""], arr); + _cli.table(['Column', ''], arr); } } diff --git a/lib/database/exceptions/connectionNotFound.ts b/lib/database/exceptions/connectionNotFound.ts index 025b0b5..de9e1bf 100644 --- a/lib/database/exceptions/connectionNotFound.ts +++ b/lib/database/exceptions/connectionNotFound.ts @@ -1,7 +1,7 @@ export class ConnectionNotFound extends Error { constructor(conName: string) { super( - `${conName} not found! Please make sure you are passing correct connection name! Or alternatively, check if you have initialised ObjectionModule` + `${conName} not found! Please make sure you are passing correct connection name! Or alternatively, check if you have initialised ObjectionModule`, ); } } diff --git a/lib/database/exceptions/index.ts b/lib/database/exceptions/index.ts index f27468a..7d0291c 100644 --- a/lib/database/exceptions/index.ts +++ b/lib/database/exceptions/index.ts @@ -1,2 +1,2 @@ -export * from "./connectionNotFound"; -export * from "./modelNotFound"; +export * from './connectionNotFound'; +export * from './modelNotFound'; diff --git a/lib/database/exceptions/modelNotFound.ts b/lib/database/exceptions/modelNotFound.ts index f33abe4..490bcad 100644 --- a/lib/database/exceptions/modelNotFound.ts +++ b/lib/database/exceptions/modelNotFound.ts @@ -1,4 +1,4 @@ -import { HttpException } from "@nestjs/common"; +import { HttpException } from '@nestjs/common'; export class ModelNotFound extends HttpException { constructor(modelName: string) { diff --git a/lib/database/queryBuilders/custom.ts b/lib/database/queryBuilders/custom.ts index b05bd6d..23fa47a 100644 --- a/lib/database/queryBuilders/custom.ts +++ b/lib/database/queryBuilders/custom.ts @@ -5,9 +5,9 @@ import { OrderByDirection, PrimitiveValue, Expression, -} from "objection"; -import { Pagination } from "../interfaces"; -import { GenericFunction } from "../../interfaces"; +} from 'objection'; +import { GenericFunction } from '../../interfaces'; +import { Pagination } from '../interfaces'; export class CustomQueryBuilder extends QueryBuilder< M, @@ -39,7 +39,7 @@ export class CustomQueryBuilder extends QueryBuilder< } async onlyCount() { - const result = (await this.count({ c: "*" })) as unknown as { c: number }[]; + const result = (await this.count({ c: '*' })) as unknown as { c: number }[]; return +result[0].c; } @@ -51,7 +51,7 @@ export class CustomQueryBuilder extends QueryBuilder< async chunk(cb: GenericFunction, size: number): Promise { let offset = 0; let hasMore = true; - while (!!!offset || hasMore) { + while (!offset || hasMore) { const query = structuredClone(this); const records = (await query .offset(offset) @@ -64,11 +64,11 @@ export class CustomQueryBuilder extends QueryBuilder< } cOrderBy(expressions: string): this { - const orders = (expressions || "").split("|"); + const orders = (expressions || '').split('|'); for (const order of orders) { - const [column, direction] = order.split(":"); + const [column, direction] = order.split(':'); if (!column) continue; - this.orderBy(column, (direction || "ASC") as OrderByDirection); + this.orderBy(column, (direction || 'ASC') as OrderByDirection); } return this; @@ -77,7 +77,7 @@ export class CustomQueryBuilder extends QueryBuilder< when( condition: any, truthyCb: (query: CustomQueryBuilder, condition: any) => this, - falsyCb?: (query: CustomQueryBuilder, condition: any) => this + falsyCb?: (query: CustomQueryBuilder, condition: any) => this, ): this { if (condition) { return truthyCb(this, condition); diff --git a/lib/database/queryBuilders/softDelete.ts b/lib/database/queryBuilders/softDelete.ts index f4be83f..61111dc 100644 --- a/lib/database/queryBuilders/softDelete.ts +++ b/lib/database/queryBuilders/softDelete.ts @@ -3,16 +3,16 @@ import { Model, PartialModelObject, QueryBuilder, -} from "objection"; -import { CustomQueryBuilder } from "./custom"; +} from 'objection'; +import { CustomQueryBuilder } from './custom'; export class SoftDeleteQueryBuilder< M extends Model, - R = M[] + R = M[], > extends CustomQueryBuilder { - static forClass: ForClassMethod = (modelClass) => { + static forClass: ForClassMethod = modelClass => { const qb = QueryBuilder.forClass.call(this, modelClass); - qb.onBuild((builder) => { + qb.onBuild(builder => { const tableName = builder.tableRefFor(modelClass as any); if (!builder.context().withArchived) { builder.whereNull(`${tableName}.deleted_at`); diff --git a/lib/database/repositories/database.ts b/lib/database/repositories/database.ts index a07f19e..b809deb 100644 --- a/lib/database/repositories/database.ts +++ b/lib/database/repositories/database.ts @@ -1,13 +1,12 @@ -import { RepositoryContract } from './contract'; -import { BaseModel } from '../baseModel'; -import { ModelKeys } from '../interfaces'; -import { Expression } from 'objection'; -import { PrimitiveValue } from 'objection'; -import { ObjectionService } from '../service'; import { Knex, Knex as KnexType } from 'knex'; +import { PrimitiveValue , Expression } from 'objection'; +import { BaseModel } from '../baseModel'; import { ModelNotFound } from '../exceptions'; import { RepositoryError } from '../exceptions/repoError'; +import { ModelKeys } from '../interfaces'; import { CustomQueryBuilder } from '../queryBuilders/custom'; +import { ObjectionService } from '../service'; +import { RepositoryContract } from './contract'; export class DatabaseRepository implements RepositoryContract diff --git a/lib/database/service.ts b/lib/database/service.ts index be42614..8309c38 100644 --- a/lib/database/service.ts +++ b/lib/database/service.ts @@ -1,11 +1,11 @@ -import { Injectable, OnModuleInit } from "@nestjs/common"; -import { DatabaseOptions, DbConnectionOptions } from "./options"; -import Knex, { Knex as KnexType } from "knex"; -import { ConnectionNotFound } from "./exceptions"; -import { BaseModel } from "./baseModel"; -import { IntentConfig } from "../config/service"; -import { InternalLogger } from "../utils/logger"; -import { logTime } from "../utils/helpers"; +import { Injectable, OnModuleInit } from '@nestjs/common'; +import Knex, { Knex as KnexType } from 'knex'; +import { IntentConfig } from '../config/service'; +import { logTime } from '../utils/helpers'; +import { InternalLogger } from '../utils/logger'; +import { BaseModel } from './baseModel'; +import { ConnectionNotFound } from './exceptions'; +import { DatabaseOptions, DbConnectionOptions } from './options'; @Injectable() export class ObjectionService implements OnModuleInit { @@ -13,7 +13,7 @@ export class ObjectionService implements OnModuleInit { static dbConnections: Record; constructor(config: IntentConfig) { - const dbConfig = config.get("db") as DatabaseOptions; + const dbConfig = config.get('db') as DatabaseOptions; if (!dbConfig) return; const defaultConnection = dbConfig.connections[dbConfig.default]; ObjectionService.config = dbConfig; @@ -32,20 +32,20 @@ export class ObjectionService implements OnModuleInit { const dbOptions = ObjectionService.getOptions(connName); try { - await connection.raw(dbOptions.validateQuery || "select 1+1 as result"); + await connection.raw(dbOptions.validateQuery || 'select 1+1 as result'); InternalLogger.success( - "DatabaseService", + 'DatabaseService', `Was able to successfully validate [${connName}] connection ${logTime( - Date.now() - time - )}` + Date.now() - time, + )}`, ); } catch (_e) { const e = _e as Error; InternalLogger.error( - "DatabaseService", + 'DatabaseService', `Validation for connection [${connName}] failed with reason ${ e.message - } ${logTime(Date.now() - time)}` + } ${logTime(Date.now() - time)}`, ); } } @@ -56,7 +56,7 @@ export class ObjectionService implements OnModuleInit { conName = conName || ObjectionService.config.default; const isConNameValid = Object.keys( - ObjectionService.config.connections + ObjectionService.config.connections, ).includes(conName); if (conName && !isConNameValid) { @@ -71,7 +71,7 @@ export class ObjectionService implements OnModuleInit { conName = conName || ObjectionService.config.default; const isConNameValid = Object.keys( - ObjectionService.config.connections + ObjectionService.config.connections, ).includes(conName); if (conName && !isConNameValid) { diff --git a/lib/events/constants.ts b/lib/events/constants.ts index b86f040..d2bddce 100644 --- a/lib/events/constants.ts +++ b/lib/events/constants.ts @@ -1,5 +1,5 @@ export class IntentEventConstants { - static eventEmitterName = "intentjs/event_emitter_name"; - static eventName = "intentjs/event_name"; - static eventJobName = "intentjs/queued_event_handler_job"; + static eventEmitterName = 'intentjs/event_emitter_name'; + static eventName = 'intentjs/event_name'; + static eventJobName = 'intentjs/queued_event_handler_job'; } diff --git a/lib/events/decorator.ts b/lib/events/decorator.ts index d0c374f..5a292c2 100644 --- a/lib/events/decorator.ts +++ b/lib/events/decorator.ts @@ -1,25 +1,25 @@ -import "reflect-metadata"; -import { IntentEventConstants } from "./constants"; -import { GenericClass } from "../interfaces"; +import 'reflect-metadata'; +import { GenericClass } from '../interfaces'; +import { IntentEventConstants } from './constants'; export function Event(name?: string) { return function (target: GenericClass) { Reflect.defineMetadata( IntentEventConstants.eventEmitterName, - name || target["name"], - target + name || target['name'], + target, ); }; } export function ListensTo(event: string | GenericClass) { - const eventName = typeof event === "string" ? event : event["name"]; + const eventName = typeof event === 'string' ? event : event['name']; return function (target: Record, propertyKey: string) { Reflect.defineMetadata( IntentEventConstants.eventName, eventName, target, - propertyKey + propertyKey, ); }; } diff --git a/lib/events/event.ts b/lib/events/event.ts index a949063..849207c 100644 --- a/lib/events/event.ts +++ b/lib/events/event.ts @@ -1,17 +1,17 @@ -import "reflect-metadata"; -import { IntentEventConstants } from "./constants"; -import { difference } from "./helpers"; -import { EventListenerRunner } from "./runner"; -import { Dispatch } from "../queue/queue"; -import { JobOptions } from "../queue/strategy"; -import { isBoolean } from "../utils/helpers"; +import 'reflect-metadata'; +import { Dispatch } from '../queue/queue'; +import { JobOptions } from '../queue/strategy'; +import { isBoolean } from '../utils/helpers'; +import { IntentEventConstants } from './constants'; +import { difference } from './helpers'; +import { EventListenerRunner } from './runner'; export class EmitsEvent { private reservedKeyNames = [ - "fetchPayload", - "emit", - "reservedKeyNames", - "dispatch", + 'fetchPayload', + 'emit', + 'reservedKeyNames', + 'dispatch', ]; /** @@ -35,11 +35,11 @@ export class EmitsEvent { async emit(): Promise { const eventName = Reflect.getMetadata( IntentEventConstants.eventEmitterName, - this.constructor + this.constructor, ); const overrideJobOptions = - this["shouldBeQueued"] && this["shouldBeQueued"](); + this['shouldBeQueued'] && this['shouldBeQueued'](); if (!overrideJobOptions) { const runner = new EventListenerRunner(); @@ -49,7 +49,7 @@ export class EmitsEvent { await this.dispatch( eventName, - !isBoolean(overrideJobOptions) && overrideJobOptions + !isBoolean(overrideJobOptions) && overrideJobOptions, ); } @@ -58,7 +58,7 @@ export class EmitsEvent { const payloadKeys = difference( Object.getOwnPropertyNames(this), - this.reservedKeyNames + this.reservedKeyNames, ) as ObjectKey[]; const payload = {} as Record; @@ -78,32 +78,32 @@ export class EmitsEvent { */ async dispatch( eventName: string, - overrideJobOptions: JobOptions + overrideJobOptions: JobOptions, ): Promise { const connection = - overrideJobOptions && overrideJobOptions["connection"] - ? overrideJobOptions["connection"] - : this["connection"]; + overrideJobOptions && overrideJobOptions['connection'] + ? overrideJobOptions['connection'] + : this['connection']; const queue = - overrideJobOptions && overrideJobOptions["queue"] - ? overrideJobOptions["queue"] - : this["queue"]; + overrideJobOptions && overrideJobOptions['queue'] + ? overrideJobOptions['queue'] + : this['queue']; const delay = - overrideJobOptions && overrideJobOptions["delay"] - ? +overrideJobOptions["delay"] - : this["delay"]; + overrideJobOptions && overrideJobOptions['delay'] + ? +overrideJobOptions['delay'] + : this['delay']; const tries = - overrideJobOptions && overrideJobOptions["tries"] - ? +overrideJobOptions["tries"] - : this["tries"]; + overrideJobOptions && overrideJobOptions['tries'] + ? +overrideJobOptions['tries'] + : this['tries']; const jobOptions = {}; - if (connection) jobOptions["connection"] = connection; - if (queue) jobOptions["queue"] = queue; - if (delay) jobOptions["delay"] = delay; - if (tries) jobOptions["tries"] = tries; + if (connection) jobOptions['connection'] = connection; + if (queue) jobOptions['queue'] = queue; + if (delay) jobOptions['delay'] = delay; + if (tries) jobOptions['tries'] = tries; const eventData = this.fetchPayload(); await Dispatch({ @@ -111,7 +111,7 @@ export class EmitsEvent { data: { eventName, eventData, - discriminator: "intentjs/events/queueable_event", + discriminator: 'intentjs/events/queueable_event', }, ...jobOptions, }); diff --git a/lib/events/explorer.ts b/lib/events/explorer.ts index 5428df5..d9665e7 100644 --- a/lib/events/explorer.ts +++ b/lib/events/explorer.ts @@ -1,22 +1,22 @@ -import { Injectable } from "@nestjs/common"; -import { DiscoveryService, MetadataScanner } from "@nestjs/core"; -import { IntentEventConstants } from "./constants"; -import { EventMetadata } from "./metadata"; +import { Injectable } from '@nestjs/common'; +import { DiscoveryService, MetadataScanner } from '@nestjs/core'; +import { IntentEventConstants } from './constants'; +import { EventMetadata } from './metadata'; @Injectable() export class EventExplorer { constructor( private readonly discovery: DiscoveryService, - private readonly metadataScanner: MetadataScanner + private readonly metadataScanner: MetadataScanner, ) {} onModuleInit() { const wrappers = this.discovery.getProviders(); - wrappers.forEach((w) => { + wrappers.forEach(w => { const { instance } = w; if ( !instance || - typeof instance === "string" || + typeof instance === 'string' || !Object.getPrototypeOf(instance) ) { return; @@ -24,7 +24,7 @@ export class EventExplorer { this.metadataScanner.scanFromPrototype( instance, Object.getPrototypeOf(instance), - (key: string) => this.lookupListeners(instance, key) + (key: string) => this.lookupListeners(instance, key), ); }); } @@ -34,13 +34,13 @@ export class EventExplorer { const hasEventMeta = Reflect.hasMetadata( IntentEventConstants.eventName, instance, - key + key, ); if (!hasEventMeta) return; const eventName = Reflect.getMetadata( IntentEventConstants.eventName, instance, - key + key, ); EventMetadata.addListener(eventName, methodRef.bind(instance)); } diff --git a/lib/events/helpers.ts b/lib/events/helpers.ts index fd80923..d7c395c 100644 --- a/lib/events/helpers.ts +++ b/lib/events/helpers.ts @@ -1,4 +1,4 @@ -import { EmitsEvent } from "./event"; +import { EmitsEvent } from './event'; export async function Emit(...events: EmitsEvent[]): Promise { const promises = []; diff --git a/lib/events/index.ts b/lib/events/index.ts index a6da44d..7c89d10 100644 --- a/lib/events/index.ts +++ b/lib/events/index.ts @@ -1,8 +1,8 @@ -export * from "./event"; -export * from "./decorator"; -export * from "./metadata"; -export * from "./explorer"; -export * from "./interfaces"; -export * from "./helpers"; -export * from "./jobListener"; -export * from "./runner"; +export * from './event'; +export * from './decorator'; +export * from './metadata'; +export * from './explorer'; +export * from './interfaces'; +export * from './helpers'; +export * from './jobListener'; +export * from './runner'; diff --git a/lib/events/interfaces.ts b/lib/events/interfaces.ts index dee42d9..c5b5fbe 100644 --- a/lib/events/interfaces.ts +++ b/lib/events/interfaces.ts @@ -1,4 +1,4 @@ -import { JobOptions } from "../queue/strategy"; +import { JobOptions } from '../queue/strategy'; export interface QueueableEvent { /** diff --git a/lib/events/jobListener.ts b/lib/events/jobListener.ts index 55c51e1..cbf7d80 100644 --- a/lib/events/jobListener.ts +++ b/lib/events/jobListener.ts @@ -1,7 +1,7 @@ -import { Injectable } from "@nestjs/common"; -import { IntentEventConstants } from "./constants"; -import { EventListenerRunner } from "./runner"; -import { Job } from "../queue/decorators"; +import { Injectable } from '@nestjs/common'; +import { Job } from '../queue/decorators'; +import { IntentEventConstants } from './constants'; +import { EventListenerRunner } from './runner'; @Injectable() export class EventQueueWorker { diff --git a/lib/events/metadata.ts b/lib/events/metadata.ts index d37f7e1..83003ae 100644 --- a/lib/events/metadata.ts +++ b/lib/events/metadata.ts @@ -1,4 +1,4 @@ -import { GenericFunction } from "../interfaces"; +import { GenericFunction } from '../interfaces'; export class EventMetadata { private static store: Record = { events: {}, listeners: {} }; diff --git a/lib/events/runner.ts b/lib/events/runner.ts index 9119288..301b723 100644 --- a/lib/events/runner.ts +++ b/lib/events/runner.ts @@ -1,5 +1,5 @@ -import { isEmpty } from "../utils/helpers"; -import { EventMetadata } from "./metadata"; +import { isEmpty } from '../utils/helpers'; +import { EventMetadata } from './metadata'; export class EventListenerRunner { async handle(eventName: string, eventData: any): Promise { diff --git a/lib/exceptions/index.ts b/lib/exceptions/index.ts index bf212f7..07101bd 100644 --- a/lib/exceptions/index.ts +++ b/lib/exceptions/index.ts @@ -1,7 +1,7 @@ -export * from "./unauthorized"; -export * from "./invalidCredentials"; -export * from "./validationfailed"; -export * from "./genericException"; -export * from "./intentExceptionFilter"; -export * from "./invalidValue"; -export * from "./invalidValueType"; +export * from './unauthorized'; +export * from './invalidCredentials'; +export * from './validationfailed'; +export * from './genericException'; +export * from './intentExceptionFilter'; +export * from './invalidValue'; +export * from './invalidValueType'; diff --git a/lib/exceptions/intentExceptionFilter.ts b/lib/exceptions/intentExceptionFilter.ts index bd5b8b8..6245c40 100644 --- a/lib/exceptions/intentExceptionFilter.ts +++ b/lib/exceptions/intentExceptionFilter.ts @@ -1,9 +1,9 @@ -import { ArgumentsHost, HttpException, Type } from "@nestjs/common"; -import { BaseExceptionFilter } from "@nestjs/core"; -import { Package } from "../utils"; -import { IntentConfig } from "../config/service"; -import { Log } from "../logger"; -import { Request, Response } from "../rest"; +import { ArgumentsHost, HttpException, Type } from '@nestjs/common'; +import { BaseExceptionFilter } from '@nestjs/core'; +import { IntentConfig } from '../config/service'; +import { Log } from '../logger'; +import { Request, Response } from '../rest'; +import { Package } from '../utils'; export abstract class IntentExceptionFilter extends BaseExceptionFilter { abstract handleHttp(exception: any, req: Request, res: Response); @@ -13,7 +13,7 @@ export abstract class IntentExceptionFilter extends BaseExceptionFilter { } report(): Array> | string { - return "*"; + return '*'; } catch(exception: any, host: ArgumentsHost) { @@ -23,18 +23,18 @@ export abstract class IntentExceptionFilter extends BaseExceptionFilter { this.reportToSentry(exception); - Log().error("", exception); + Log().error('', exception); return this.handleHttp(exception, request.intent.req(), response); } reportToSentry(exception: any): void { - const sentryConfig = IntentConfig.get("app.sentry"); + const sentryConfig = IntentConfig.get('app.sentry'); console.log(sentryConfig); if (!sentryConfig?.dsn) return; const exceptionConstructor = exception?.constructor; - const sentry = Package.load("@sentry/node"); + const sentry = Package.load('@sentry/node'); if ( exceptionConstructor && !this.doNotReport().includes(exceptionConstructor) diff --git a/lib/index.ts b/lib/index.ts index 06229a9..37684e9 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,17 +1,19 @@ -export * from "./module"; -export * from "./utils"; -export * from "./constants"; -export * from "./interfaces"; -export * from "./rest"; -export * from "./cache"; -export * from "./storage"; -export * from "./transformers"; -export * from "./exceptions"; -export * from "./localization"; -export * from "./logger"; -export * from "./queue"; -export * from "./console"; -export * from "./database"; -export * from "./serializers/validationErrorSerializer"; -export * from "./mailer"; -export * from "./events"; +export * from './module'; +export * from './utils'; +export * from './constants'; +export * from './interfaces'; +export * from './rest'; +export * from './cache'; +export * from './storage'; +export * from './transformers'; +export * from './exceptions'; +export * from './localization'; +export * from './logger'; +export * from './queue'; +export * from './console'; +export * from './database'; +export * from './serializers/validationErrorSerializer'; +export * from './mailer'; +export * from './events'; +export * from './validator'; +export * from './config/service'; diff --git a/lib/interfaces/config.ts b/lib/interfaces/config.ts index 2419b84..3682bf5 100644 --- a/lib/interfaces/config.ts +++ b/lib/interfaces/config.ts @@ -1,8 +1,8 @@ import { CorsOptions, CorsOptionsDelegate, -} from "@nestjs/common/interfaces/external/cors-options.interface"; -import { GenericClass } from "."; +} from '@nestjs/common/interfaces/external/cors-options.interface'; +import { GenericClass } from '.'; export interface SentryConfig { dsn: string; diff --git a/lib/interfaces/index.ts b/lib/interfaces/index.ts index ee0187c..9073930 100644 --- a/lib/interfaces/index.ts +++ b/lib/interfaces/index.ts @@ -1,5 +1,5 @@ export type GenericFunction = (...args: any[]) => any; export type GenericClass = Record; -export * from "./transformer"; -export * from "./config"; +export * from './transformer'; +export * from './config'; diff --git a/lib/localization/helpers/index.ts b/lib/localization/helpers/index.ts index 7b97f3f..9ff8cee 100644 --- a/lib/localization/helpers/index.ts +++ b/lib/localization/helpers/index.ts @@ -1,9 +1,9 @@ -import { LocalizationService } from "../service"; +import { LocalizationService } from '../service'; export const __ = ( key: string, language?: string | Record, - options?: Record + options?: Record, ): string => { return LocalizationService.trans(key, language, options); }; @@ -12,7 +12,7 @@ export const transChoice = ( key: string, language?: string | number, count?: number | Record, - options?: Record + options?: Record, ): string => { return LocalizationService.transChoice(key, language, count, options); }; diff --git a/lib/localization/index.ts b/lib/localization/index.ts index 940804e..34b3117 100644 --- a/lib/localization/index.ts +++ b/lib/localization/index.ts @@ -1,3 +1,3 @@ -export * from "./service"; -export * from "./helpers"; -export * from "./interfaces/index"; +export * from './service'; +export * from './helpers'; +export * from './interfaces/index'; diff --git a/lib/localization/service.ts b/lib/localization/service.ts index ad969e8..7cbc54b 100644 --- a/lib/localization/service.ts +++ b/lib/localization/service.ts @@ -1,12 +1,12 @@ -import { Injectable } from "@nestjs/common"; -import { readdirSync, readFileSync } from "fs-extra"; -import { Obj } from "../utils"; -import { Str } from "../utils/string"; -import { Num } from "../utils/number"; -import { IntentConfig } from "../config/service"; -import { LocalizationOptions } from "./interfaces"; -import { join } from "path"; -import { path } from "app-root-path"; +import { join } from 'path'; +import { Injectable } from '@nestjs/common'; +import { path } from 'app-root-path'; +import { readdirSync, readFileSync } from 'fs-extra'; +import { IntentConfig } from '../config/service'; +import { Obj } from '../utils'; +import { Num } from '../utils/number'; +import { Str } from '../utils/string'; +import { LocalizationOptions } from './interfaces'; @Injectable() export class LocalizationService { @@ -20,7 +20,7 @@ export class LocalizationService { }; constructor(private config: IntentConfig) { - const options = config.get("localization"); + const options = config.get('localization'); const { path: dir, fallbackLang } = options; const data: Record = {}; @@ -28,8 +28,8 @@ export class LocalizationService { LocalizationService.readFiles( join(path, dir), function (filename: string, content: any) { - data[filename.split(".")[0]] = JSON.parse(content); - } + data[filename.split('.')[0]] = JSON.parse(content); + }, ); LocalizationService.data = data; @@ -39,17 +39,17 @@ export class LocalizationService { static trans( key: string, language?: string | Record, - options?: Record + options?: Record, ): string { let langData = LocalizationService.data[this.fallbackLang]; - if (typeof language === "string" && language != "") { + if (typeof language === 'string' && language != '') { langData = LocalizationService.data[language]; } else { options = language as Record; } - let text = Obj.get(langData, key, "") as string; - if (!text || typeof text !== "string") return `${key}`; + let text = Obj.get(langData, key, '') as string; + if (!text || typeof text !== 'string') return `${key}`; if (options) { for (const k in options) { @@ -64,32 +64,32 @@ export class LocalizationService { key: string, language?: string | number, count?: number | Record, - options?: Record + options?: Record, ): string { let langData = LocalizationService.data[this.fallbackLang]; - if (typeof language === "string" && language != "") { + if (typeof language === 'string' && language != '') { langData = LocalizationService.data[language]; } - if (typeof count === "object") { + if (typeof count === 'object') { options = count as Record; } - if (typeof language === "number") { + if (typeof language === 'number') { count = language as number; } - if (!count && count != 0) throw new Error("Count value not found"); + if (!count && count != 0) throw new Error('Count value not found'); const text = Obj.get(langData, key, null); - if (!text || typeof text !== "string") return key; + if (!text || typeof text !== 'string') return key; const textObjArr: Record[] = []; - text.split("|").forEach((t, index) => { + text.split('|').forEach((t, index) => { textObjArr.push(this.choiceStringParser(t, index)); }); - let finalText = ""; + let finalText = ''; for (const t of textObjArr) { if (Num.inRange(count as number, [t.limit.lower, t.limit.upper])) { finalText = t.text; @@ -111,20 +111,20 @@ export class LocalizationService { private static choiceStringParser( t: string, - index: number + index: number, ): Record { - const text: string = Str.after(t, "]").trim(); - const range = Str.between(t, "[", "]"); + const text: string = Str.after(t, ']').trim(); + const range = Str.between(t, '[', ']'); const limits = Str.is(range, text) - ? [index == 0 ? index : index + 1, index == 0 ? index + 1 : "*"] - : range.split(","); + ? [index == 0 ? index : index + 1, index == 0 ? index + 1 : '*'] + : range.split(','); return { text, limit: { - lower: limits[0] == "*" ? Number.NEGATIVE_INFINITY : +limits[0], + lower: limits[0] == '*' ? Number.NEGATIVE_INFINITY : +limits[0], upper: limits[1] - ? limits[1] == "*" + ? limits[1] == '*' ? Number.POSITIVE_INFINITY : +limits[1] : +limits[0], @@ -141,25 +141,25 @@ export class LocalizationService { const keyStartIdx = lowerCaseText.indexOf(key); const identifier: string = text.substr( keyStartIdx, - keyStartIdx + key.length + keyStartIdx + key.length, ); const caseType = Str.isUpperCase(identifier) ? this.caseTypes.UPPER_CASE : Str.isLowerCase(identifier) - ? this.caseTypes.LOWER_CASE - : Str.isSentenceCase(identifier) - ? this.caseTypes.SENTENCE_CASE - : this.caseTypes.UNKNOWN; + ? this.caseTypes.LOWER_CASE + : Str.isSentenceCase(identifier) + ? this.caseTypes.SENTENCE_CASE + : this.caseTypes.UNKNOWN; const matchStr = caseType === this.caseTypes.UPPER_CASE ? key.toUpperCase() : caseType === this.caseTypes.LOWER_CASE - ? key.toLowerCase() - : caseType === this.caseTypes.SENTENCE_CASE - ? key[0].toUpperCase() + key.slice(1) - : key; + ? key.toLowerCase() + : caseType === this.caseTypes.SENTENCE_CASE + ? key[0].toUpperCase() + key.slice(1) + : key; const replaceStr = () => { switch (caseType) { @@ -181,8 +181,8 @@ export class LocalizationService { private static readFiles(dirname: string, onFileContent: any) { const fss = readdirSync(dirname); fss.forEach((filename: string) => { - const fileData = readFileSync(dirname + "/" + filename, { - encoding: "utf-8", + const fileData = readFileSync(dirname + '/' + filename, { + encoding: 'utf-8', }); onFileContent(filename, fileData); diff --git a/lib/localization/utils/get.ts b/lib/localization/utils/get.ts index c743c43..f2ad6bb 100644 --- a/lib/localization/utils/get.ts +++ b/lib/localization/utils/get.ts @@ -1,4 +1,4 @@ -import stringToPath from "./stringToPath"; +import stringToPath from './stringToPath'; // function baseGet(object: Record, path: any): any { // path = castPath(path, object); @@ -21,7 +21,7 @@ import stringToPath from "./stringToPath"; */ function getTag(value: string): any { if (value == null) { - return value === undefined ? "[object Undefined]" : "[object Null]"; + return value === undefined ? '[object Undefined]' : '[object Null]'; } return toString.call(value); } @@ -58,8 +58,8 @@ function isKey(value: any, object: Record): boolean { } const type = typeof value; if ( - type === "number" || - type === "boolean" || + type === 'number' || + type === 'boolean' || value == null || isSymbol(value) ) { @@ -83,17 +83,17 @@ const INFINITY = 1 / 0; * @returns {string|symbol} Returns the key. */ function toKey(value: number): any { - if (typeof value === "string" || isSymbol(value)) { + if (typeof value === 'string' || isSymbol(value)) { return value; } const result = `${value}`; - return result == "0" && 1 / value == -INFINITY ? "-0" : result; + return result == '0' && 1 / value == -INFINITY ? '-0' : result; } function isSymbol(value: any): boolean { const type = typeof value; return ( - type == "symbol" || - (type === "object" && value != null && getTag(value) == "[object Symbol]") + type == 'symbol' || + (type === 'object' && value != null && getTag(value) == '[object Symbol]') ); } diff --git a/lib/localization/utils/memoize.ts b/lib/localization/utils/memoize.ts index 6f288ca..cfbf504 100644 --- a/lib/localization/utils/memoize.ts +++ b/lib/localization/utils/memoize.ts @@ -1,4 +1,4 @@ -import { GenericFunction } from "../../interfaces"; +import { GenericFunction } from '../../interfaces'; /** * Creates a function that memoizes the result of `func`. If `resolver` is @@ -44,10 +44,10 @@ import { GenericFunction } from "../../interfaces"; */ function memoize(this: any, func: any, resolver: any): any { if ( - typeof func !== "function" || - (resolver != null && typeof resolver !== "function") + typeof func !== 'function' || + (resolver != null && typeof resolver !== 'function') ) { - throw new TypeError("Expected a function"); + throw new TypeError('Expected a function'); } const that = this; diff --git a/lib/localization/utils/stringToPath.ts b/lib/localization/utils/stringToPath.ts index a1766a1..cc60b06 100644 --- a/lib/localization/utils/stringToPath.ts +++ b/lib/localization/utils/stringToPath.ts @@ -1,23 +1,23 @@ -import memoizeCapped from "./memoizeCapped"; +import memoizeCapped from './memoizeCapped'; -const charCodeOfDot = ".".charCodeAt(0); +const charCodeOfDot = '.'.charCodeAt(0); const reEscapeChar = /\\(\\)?/g; const rePropName = RegExp( // Match anything that isn't a dot or bracket. - "[^.[\\]]+" + - "|" + + '[^.[\\]]+' + + '|' + // Or match property names within brackets. - "\\[(?:" + + '\\[(?:' + // Match a non-string expression. - "([^\"'][^[]*)" + - "|" + + '([^"\'][^[]*)' + + '|' + // Or match strings (supports escaping characters). - "([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2" + - ")\\]" + - "|" + + '(["\'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2' + + ')\\]' + + '|' + // Or match "" as the space between consecutive dots or empty brackets. - "(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))", - "g" + '(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))', + 'g', ); /** @@ -30,19 +30,19 @@ const rePropName = RegExp( const stringToPath = memoizeCapped((string: any): any => { const result = []; if (string.charCodeAt(0) === charCodeOfDot) { - result.push(""); + result.push(''); } string.replace( rePropName, (match: any, expression: any, quote: string, subString: string) => { let key = match; if (quote) { - key = subString.replace(reEscapeChar, "$1"); + key = subString.replace(reEscapeChar, '$1'); } else if (expression) { key = expression.trim(); } result.push(key); - } + }, ); return result; }); diff --git a/lib/logger/index.ts b/lib/logger/index.ts index 0f2b72d..8928839 100644 --- a/lib/logger/index.ts +++ b/lib/logger/index.ts @@ -1,3 +1,3 @@ -export * from "./logger"; -export * from "./options"; -export * from "./service"; +export * from './logger'; +export * from './options'; +export * from './service'; diff --git a/lib/logger/logger.ts b/lib/logger/logger.ts index 3f25e32..be8c798 100644 --- a/lib/logger/logger.ts +++ b/lib/logger/logger.ts @@ -1,11 +1,10 @@ -import { LoggerService } from "./service"; +import { LoggerService } from './service'; export const Log = (conn?: string) => { - const logger = LoggerService.getConnection(conn); - return logger; + return LoggerService.getConnection(conn); }; export const log = (payload: any, level?: string) => { const logger = Log(); - return logger[level ?? "debug"](payload); + return logger[level ?? 'debug'](payload); }; diff --git a/lib/logger/options.ts b/lib/logger/options.ts index a414178..976f0c0 100644 --- a/lib/logger/options.ts +++ b/lib/logger/options.ts @@ -1,4 +1,4 @@ -import { transports, format, transport } from "winston"; +import { transports, format, transport } from 'winston'; export enum Transports { Default, @@ -48,7 +48,7 @@ export const defaultLoggerOptions = (): { level: LogLevel; [key: string]: any; } => ({ - level: "debug", + level: 'debug', transports: [{ transport: Transports.Default, format: Formats.Default }], }); @@ -70,7 +70,7 @@ export const TransportsMap = { const defaultFormat = () => { const date = new Date().toISOString(); - const logFormat = format.printf((info) => { + const logFormat = format.printf(info => { return `[${info.level}] ${date} : ${JSON.stringify(info.message)}`; }); return format.combine(format.colorize(), logFormat); @@ -97,4 +97,4 @@ export const FormatsMap = { [Formats.Uncolorize]: format.uncolorize, }; -export type LogLevel = "error" | "warn" | "info" | "http" | "verbose" | "debug"; +export type LogLevel = 'error' | 'warn' | 'info' | 'http' | 'verbose' | 'debug'; diff --git a/lib/logger/service.ts b/lib/logger/service.ts index f70b1a9..8c8f5a8 100644 --- a/lib/logger/service.ts +++ b/lib/logger/service.ts @@ -1,4 +1,10 @@ -import { Injectable } from "@nestjs/common"; +import { join } from 'path'; +import { Injectable } from '@nestjs/common'; +import { path } from 'app-root-path'; +import * as winston from 'winston'; +import { IntentConfig } from '../config/service'; +import { Obj } from '../utils'; +import { Num } from '../utils/number'; import { Formats, FormatsMap, @@ -8,13 +14,7 @@ import { TransportsMap, TransportOptions, defaultLoggerOptions, -} from "./options"; -import * as winston from "winston"; -import { IntentConfig } from "../config/service"; -import { Num } from "../utils/number"; -import { path } from "app-root-path"; -import { join } from "path"; -import { Obj } from "../utils"; +} from './options'; @Injectable() export class LoggerService { @@ -22,11 +22,11 @@ export class LoggerService { private static options: any = {}; constructor(private readonly config: IntentConfig) { - const options = this.config.get("logger"); + const options = this.config.get('logger'); LoggerService.config = options; for (const conn in options.loggers) { LoggerService.options[conn] = LoggerService.createLogger( - options.loggers[conn] + options.loggers[conn], ); } } @@ -60,25 +60,25 @@ export class LoggerService { transport = transport as winston.transport; const options = { - ...Obj.except(transportOptions.options, ["format"]), + ...Obj.except(transportOptions.options, ['format']), format: this.buildFormatter( formats as Formats[], - transportOptions.labels + transportOptions.labels, ), } as TransportOptions; if (transportOptions.transport === Transports.File) { - options["filename"] = join( + options['filename'] = join( path, - "storage/logs", - transportOptions.options?.["filename"] + 'storage/logs', + transportOptions.options?.['filename'], ); } transportsConfig.push( new TransportsMap[transportOptions.transport as Transports]( - options as any - ) + options as any, + ), ); } @@ -95,7 +95,7 @@ export class LoggerService { private static buildFormatter( formats: Formats[], - labels?: Record + labels?: Record, ) { const formatters = []; for (const formatEnum of formats) { @@ -106,8 +106,8 @@ export class LoggerService { return winston.format.combine( winston.format.errors({ stack: true }), - winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), - ...formatters + winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), + ...formatters, ); } } diff --git a/lib/mailer/constants.ts b/lib/mailer/constants.ts index 45fd7fa..89a52a4 100644 --- a/lib/mailer/constants.ts +++ b/lib/mailer/constants.ts @@ -1,5 +1,5 @@ -export const RAW_MAIL = "RAW"; -export const VIEW_BASED_MAIL = "VIEW_BASED"; -export const GENERIC_MAIL = "GENERIC"; +export const RAW_MAIL = 'RAW'; +export const VIEW_BASED_MAIL = 'VIEW_BASED'; +export const GENERIC_MAIL = 'GENERIC'; export class MailmanConstant {} diff --git a/lib/mailer/exceptions/errorSendingMail.ts b/lib/mailer/exceptions/errorSendingMail.ts index 5dc3db3..c481f90 100644 --- a/lib/mailer/exceptions/errorSendingMail.ts +++ b/lib/mailer/exceptions/errorSendingMail.ts @@ -1,11 +1,11 @@ -import { Str } from "../../utils/string"; +import { Str } from '../../utils/string'; export class ErrorSendingMail extends Error { constructor(message: string | Record) { super( Str.isString(message) ? (message as string) - : `There was an error while sending email` + : `There was an error while sending email`, ); } } diff --git a/lib/mailer/index.ts b/lib/mailer/index.ts index 7a9c00b..cdda658 100644 --- a/lib/mailer/index.ts +++ b/lib/mailer/index.ts @@ -1,4 +1,4 @@ -export * from "./service"; -export * from "./mail"; -export * from "./interfaces"; -export * from "./message"; +export * from './service'; +export * from './mail'; +export * from './interfaces'; +export * from './message'; diff --git a/lib/mailer/interfaces/index.ts b/lib/mailer/interfaces/index.ts index 9c15534..5f30ef3 100644 --- a/lib/mailer/interfaces/index.ts +++ b/lib/mailer/interfaces/index.ts @@ -1 +1 @@ -export * from "./options"; +export * from './options'; diff --git a/lib/mailer/interfaces/options.ts b/lib/mailer/interfaces/options.ts index 2402fc5..46a40b1 100644 --- a/lib/mailer/interfaces/options.ts +++ b/lib/mailer/interfaces/options.ts @@ -22,13 +22,13 @@ export interface BaseProviderConfigOptions { } export interface SendgridApiOptions extends BaseProviderConfigOptions { - provider: "sendgrid"; + provider: 'sendgrid'; apiKey: string; from: string; } export interface MailgunOptions extends BaseProviderConfigOptions { - provider: "mailgun"; + provider: 'mailgun'; username: string; key: string; domain: string; @@ -36,7 +36,7 @@ export interface MailgunOptions extends BaseProviderConfigOptions { } export interface NodemailerOptions extends BaseProviderConfigOptions { - provider: "smtp"; + provider: 'smtp'; host: string; port: string; username: string; @@ -46,11 +46,11 @@ export interface NodemailerOptions extends BaseProviderConfigOptions { } export interface MailLoggerProviderOptions { - provider: "logger"; + provider: 'logger'; } export interface ResendOptions extends BaseProviderConfigOptions { - provider: "resend"; + provider: 'resend'; apiKey: string; from: string; } @@ -76,4 +76,4 @@ export interface GenericTemplateField { className?: string; } -export type MailType = "RAW" | "VIEW_BASED" | "GENERIC"; +export type MailType = 'RAW' | 'VIEW_BASED' | 'GENERIC'; diff --git a/lib/mailer/interfaces/provider.ts b/lib/mailer/interfaces/provider.ts index c60a614..f82f548 100644 --- a/lib/mailer/interfaces/provider.ts +++ b/lib/mailer/interfaces/provider.ts @@ -1,4 +1,4 @@ -import { MailMessage } from "../message"; +import { MailMessage } from '../message'; export interface AttachmentOptions { filename: string; diff --git a/lib/mailer/mail.ts b/lib/mailer/mail.ts index 2502d95..69bf81e 100644 --- a/lib/mailer/mail.ts +++ b/lib/mailer/mail.ts @@ -1,5 +1,5 @@ -import { MailerService } from "./service"; -import { MailMessage } from "./message"; +import { MailMessage } from './message'; +import { MailerService } from './service'; export class Mail { private receipents: string | string[]; @@ -11,12 +11,12 @@ export class Mail { private provider: string; private constructor(provider?: string) { - this.fromAddress = ""; - this._replyTo = ""; - this._inReplyTo = ""; - this.receipents = ""; - this.ccReceipents = ""; - this.bccReceipents = ""; + this.fromAddress = ''; + this._replyTo = ''; + this._inReplyTo = ''; + this.receipents = ''; + this.ccReceipents = ''; + this.bccReceipents = ''; this.provider = provider; } @@ -99,7 +99,7 @@ export class Mail { inReplyTo: this._inReplyTo, to: this.receipents, }, - this.provider + this.provider, ); } } diff --git a/lib/mailer/message.ts b/lib/mailer/message.ts index 42feba1..d0119e2 100644 --- a/lib/mailer/message.ts +++ b/lib/mailer/message.ts @@ -1,15 +1,15 @@ -import { GENERIC_MAIL, RAW_MAIL, VIEW_BASED_MAIL } from "./constants"; +import { render } from '@react-email/render'; +import IntentMailComponent from '../../resources/mail/emails'; +import { IntentConfig } from '../config/service'; +import { GENERIC_MAIL, RAW_MAIL, VIEW_BASED_MAIL } from './constants'; import { MailData, MailMessageMetaPayload, MailType, MailMessagePayload, -} from "./interfaces"; -import { MailerService } from "./service"; -import { render } from "@react-email/render"; -import { IntentConfig } from "../config/service"; -import { AttachmentOptions } from "./interfaces/provider"; -import IntentMailComponent from "../../resources/mail/emails"; +} from './interfaces'; +import { AttachmentOptions } from './interfaces/provider'; +import { MailerService } from './service'; export class MailMessage { private mailSubject?: string; @@ -22,7 +22,7 @@ export class MailMessage { constructor() { this.attachments = []; - this.compiledHtml = ""; + this.compiledHtml = ''; this.mailType = GENERIC_MAIL; this.payload = { genericFields: [], @@ -62,7 +62,7 @@ export class MailMessage { */ view( component: (payload: Record) => JSX.Element, - payload?: Record + payload?: Record, ): this { this.mailType = VIEW_BASED_MAIL; this.viewFile = component; @@ -74,19 +74,19 @@ export class MailMessage { * Add attachment to the mail * @param greeting */ - attach(filename: string, content: Omit): this { + attach(filename: string, content: Omit): this { this.attachments.push({ filename, ...content }); return this; } image(url: string, options?: Record): this { - this.payload.genericFields.push({ type: "image", value: { url, options } }); + this.payload.genericFields.push({ type: 'image', value: { url, options } }); return this; } markdown(content: string, options?: Record): this { this.payload.genericFields.push({ - type: "markdown", + type: 'markdown', value: { content, options }, }); return this; @@ -94,7 +94,7 @@ export class MailMessage { code(content: string, options?: Record): this { this.payload.genericFields.push({ - type: "code", + type: 'code', value: { content, options }, }); return this; @@ -102,7 +102,7 @@ export class MailMessage { link(title: string, href: string): this { this.payload.genericFields.push({ - type: "link", + type: 'link', value: { href, title }, }); return this; @@ -110,7 +110,7 @@ export class MailMessage { inlineCode(code: string): this { this.payload.genericFields.push({ - type: "code-inline", + type: 'code-inline', value: { content: code }, }); return this; @@ -124,7 +124,7 @@ export class MailMessage { greeting(greeting: string): this { this.payload?.genericFields.push({ - type: "greeting", + type: 'greeting', value: { text: greeting }, }); return this; @@ -137,7 +137,7 @@ export class MailMessage { */ line(text: string, options?: Record): this { this.payload?.genericFields.push({ - type: "text", + type: 'text', value: { text, options }, }); return this; @@ -145,7 +145,7 @@ export class MailMessage { html(html: string): this { if (this.payload.genericFields) { - this.payload?.genericFields.push({ type: "html", value: { text: html } }); + this.payload?.genericFields.push({ type: 'html', value: { text: html } }); } return this; } @@ -158,7 +158,7 @@ export class MailMessage { */ button(text: string, link: string): this { this.payload.genericFields.push({ - type: "button", + type: 'button', value: { text, link }, }); return this; @@ -172,7 +172,7 @@ export class MailMessage { table(data: string[][], header = true): this { if (this.payload.genericFields) { this.payload.genericFields.push({ - type: "table", + type: 'table', value: { rows: data, header }, }); } @@ -186,7 +186,7 @@ export class MailMessage { return this; } - dark(dark: boolean = true): this { + dark(dark = true): this { this.payload.meta = { ...this.payload.meta, isDarkThemed: dark }; return this; } @@ -208,7 +208,7 @@ export class MailMessage { const config = MailerService.getConfig(); if (this.mailType === GENERIC_MAIL) { - const templateConfig = IntentConfig.get("mailers.template"); + const templateConfig = IntentConfig.get('mailers.template'); const html = render( IntentMailComponent({ header: { value: { title: templateConfig.appName } }, @@ -221,7 +221,7 @@ export class MailMessage { preview: this.payload.meta.preview, components: this.payload.genericFields, theme: { isDarkThemed: this.payload.meta.isDarkThemed }, - }) + }), ); this.compiledHtml = html; return this.compiledHtml; @@ -246,8 +246,8 @@ export class MailMessage { * Returns the maildata payload */ getMailData(): MailData { - if (typeof (this as any).handle === "function") { - (this as any)["handle"](); + if (typeof (this as any).handle === 'function') { + (this as any)['handle'](); } return { diff --git a/lib/mailer/providers/index.ts b/lib/mailer/providers/index.ts index 9278547..c6bf5c8 100644 --- a/lib/mailer/providers/index.ts +++ b/lib/mailer/providers/index.ts @@ -1,7 +1,7 @@ -import { LoggerProvider } from "./logger"; -import { MailgunProvider } from "./mailgun"; -import { NodemailerProvider } from "./nodemailer"; -import { ResendMailProvider } from "./resend"; +import { LoggerProvider } from './logger'; +import { MailgunProvider } from './mailgun'; +import { NodemailerProvider } from './nodemailer'; +import { ResendMailProvider } from './resend'; // import { SendgridProvider } from './sendgrid'; export const MAIL_PROVIDER_MAP = { diff --git a/lib/mailer/providers/logger.ts b/lib/mailer/providers/logger.ts index 8cb4603..73a5e8a 100644 --- a/lib/mailer/providers/logger.ts +++ b/lib/mailer/providers/logger.ts @@ -1,6 +1,6 @@ -import { Log } from "../../logger"; -import { NodemailerOptions } from "../interfaces"; -import { BaseProvider, BaseProviderSendOptions } from "../interfaces/provider"; +import { Log } from '../../logger'; +import { NodemailerOptions } from '../interfaces'; +import { BaseProvider, BaseProviderSendOptions } from '../interfaces/provider'; export class LoggerProvider implements BaseProvider { private client: any; diff --git a/lib/mailer/providers/mailgun.ts b/lib/mailer/providers/mailgun.ts index b138b44..f4efea8 100644 --- a/lib/mailer/providers/mailgun.ts +++ b/lib/mailer/providers/mailgun.ts @@ -1,16 +1,16 @@ -import { Storage } from "../../storage"; -import { Package } from "../../utils"; -import { isEmpty } from "../../utils/helpers"; -import { Str } from "../../utils/string"; -import { MailgunOptions } from "../interfaces"; -import { BaseProvider, BaseProviderSendOptions } from "../interfaces/provider"; +import { Storage } from '../../storage'; +import { Package } from '../../utils'; +import { isEmpty } from '../../utils/helpers'; +import { Str } from '../../utils/string'; +import { MailgunOptions } from '../interfaces'; +import { BaseProvider, BaseProviderSendOptions } from '../interfaces/provider'; export class MailgunProvider implements BaseProvider { protected client: any; constructor(private options: MailgunOptions) { - const formData = Package.load("form-data"); - const Mailgun = Package.load("mailgun.js"); + const formData = Package.load('form-data'); + const Mailgun = Package.load('mailgun.js'); const mailgun = new Mailgun(formData); this.client = mailgun.client({ username: this.options.username, @@ -23,7 +23,7 @@ export class MailgunProvider implements BaseProvider { if (!isEmpty(attachments)) { for (const attachment of attachments) { if (Str.isUrl(attachment.url)) { - attachment["content"] = await Storage.download(attachment.url); + attachment['content'] = await Storage.download(attachment.url); delete attachment.url; } } @@ -36,7 +36,7 @@ export class MailgunProvider implements BaseProvider { bcc: payload.bcc, subject: payload.subject, html: payload.html, - attachment: attachments.map((a) => ({ + attachment: attachments.map(a => ({ filename: a.filename, data: a.content, })), diff --git a/lib/mailer/providers/nodemailer.ts b/lib/mailer/providers/nodemailer.ts index 0b46e4b..3486bf8 100644 --- a/lib/mailer/providers/nodemailer.ts +++ b/lib/mailer/providers/nodemailer.ts @@ -1,16 +1,16 @@ -import { Package } from "../../utils"; -import { NodemailerOptions } from "../interfaces"; -import { BaseProvider, BaseProviderSendOptions } from "../interfaces/provider"; +import { Package } from '../../utils'; +import { NodemailerOptions } from '../interfaces'; +import { BaseProvider, BaseProviderSendOptions } from '../interfaces/provider'; export class NodemailerProvider implements BaseProvider { private client: any; constructor(private options: NodemailerOptions) { - const nodemailer = Package.load("nodemailer"); + const nodemailer = Package.load('nodemailer'); this.client = nodemailer.createTransport({ host: options.host, port: options.port, - secure: options.port === "465", + secure: options.port === '465', ignoreTLS: options.ignoreTLS, requireTLS: options.requireTLS, auth: { @@ -24,7 +24,7 @@ export class NodemailerProvider implements BaseProvider { return this.client.sendMail({ from: payload.from, to: payload.to, - attachments: payload.attachments?.map((a) => ({ + attachments: payload.attachments?.map(a => ({ filename: a.filename, content: a.content, path: a.url, diff --git a/lib/mailer/providers/resend.ts b/lib/mailer/providers/resend.ts index 1ad7954..a380869 100644 --- a/lib/mailer/providers/resend.ts +++ b/lib/mailer/providers/resend.ts @@ -1,13 +1,13 @@ -import { Package } from "../../utils"; -import { ErrorSendingMail } from "../exceptions/errorSendingMail"; -import { ResendOptions } from "../interfaces"; -import { BaseProvider, BaseProviderSendOptions } from "../interfaces/provider"; +import { Package } from '../../utils'; +import { ErrorSendingMail } from '../exceptions/errorSendingMail'; +import { ResendOptions } from '../interfaces'; +import { BaseProvider, BaseProviderSendOptions } from '../interfaces/provider'; export class ResendMailProvider implements BaseProvider { private client: any; constructor(private options: ResendOptions) { - const { Resend } = Package.load("resend"); + const { Resend } = Package.load('resend'); this.client = new Resend(this.options.apiKey); } @@ -17,12 +17,12 @@ export class ResendMailProvider implements BaseProvider { to: payload.to, bcc: payload.bcc, cc: payload.cc, - attachments: payload.attachments?.map((a) => ({ + attachments: payload.attachments?.map(a => ({ filename: a.filename, content: a.content, path: a.url, })), - subject: payload.subject ?? "", + subject: payload.subject ?? '', html: payload.html, reply_to: payload.replyTo, }); diff --git a/lib/mailer/providers/sendgrid.ts b/lib/mailer/providers/sendgrid.ts index 49eb69e..74b3c13 100644 --- a/lib/mailer/providers/sendgrid.ts +++ b/lib/mailer/providers/sendgrid.ts @@ -1,20 +1,20 @@ -import { Package } from "../../utils"; -import { SendgridApiOptions } from "../interfaces"; -import { BaseProvider, BaseProviderSendOptions } from "../interfaces/provider"; +import { Package } from '../../utils'; +import { SendgridApiOptions } from '../interfaces'; +import { BaseProvider, BaseProviderSendOptions } from '../interfaces/provider'; export class SendgridProvider implements BaseProvider { protected client: any; constructor(private options: SendgridApiOptions) { - const sendgrid = Package.load("@sendgrid/mail"); + const sendgrid = Package.load('@sendgrid/mail'); this.client = sendgrid.setApiKey(options.apiKey); } send(payload: BaseProviderSendOptions): Promise { console.log(payload); - throw new Error("Method not implemented."); + throw new Error('Method not implemented.'); } getClient(): T { - throw new Error("Method not implemented."); + throw new Error('Method not implemented.'); } } diff --git a/lib/mailer/service.ts b/lib/mailer/service.ts index 73b1920..b9e7c25 100644 --- a/lib/mailer/service.ts +++ b/lib/mailer/service.ts @@ -1,10 +1,10 @@ -import { Injectable } from "@nestjs/common"; -import { MailData, MailerOptions } from "./interfaces"; -import { IntentConfig } from "../config/service"; -import { BaseProvider, BaseProviderSendOptions } from "./interfaces/provider"; -import { MAIL_PROVIDER_MAP } from "./providers"; -import { InternalLogger } from "../utils/logger"; -import { logTime } from "../utils"; +import { Injectable } from '@nestjs/common'; +import { IntentConfig } from '../config/service'; +import { logTime } from '../utils'; +import { InternalLogger } from '../utils/logger'; +import { MailData, MailerOptions } from './interfaces'; +import { BaseProvider, BaseProviderSendOptions } from './interfaces/provider'; +import { MAIL_PROVIDER_MAP } from './providers'; @Injectable() export class MailerService { @@ -12,7 +12,7 @@ export class MailerService { private static channels: Record; constructor(private config: IntentConfig) { - const options = this.config.get("mailers") as MailerOptions; + const options = this.config.get('mailers') as MailerOptions; MailerService.options = options; MailerService.channels = {}; @@ -22,20 +22,20 @@ export class MailerService { const driver = MAIL_PROVIDER_MAP[cOptions.provider]; if (!driver) { InternalLogger.error( - "MailerService", - `We couldn't find any channel driver associated with the [${channel}].` + 'MailerService', + `We couldn't find any channel driver associated with the [${channel}].`, ); continue; } MailerService.channels[channel] = new driver( - cOptions as unknown as never + cOptions as unknown as never, ); InternalLogger.success( - "MailerService", + 'MailerService', `Channel [${channel}] successfully initiailized ${logTime( - Date.now() - time - )}` + Date.now() - time, + )}`, ); } } @@ -53,14 +53,14 @@ export class MailerService { to: options.to, cc: options.cc, bcc: options.bcc, - from: options.sender || providerConfig["from"], + from: options.sender || providerConfig['from'], html: mailData.html, subject: mailData.subject, attachments: mailData.attachments, } as BaseProviderSendOptions; - if (options.replyTo || providerConfig["replyTo"]) { - mail.replyTo = options.replyTo || providerConfig["replyTo"]; + if (options.replyTo || providerConfig['replyTo']) { + mail.replyTo = options.replyTo || providerConfig['replyTo']; } if (options.inReplyTo) { diff --git a/lib/module.ts b/lib/module.ts index 772cf13..315647f 100644 --- a/lib/module.ts +++ b/lib/module.ts @@ -1,26 +1,26 @@ -import { DynamicModule, Global, Module } from "@nestjs/common"; -import { ConfigModule } from "@nestjs/config"; -import { DiscoveryModule } from "@nestjs/core"; -import { ConsoleExplorer, ListCommands } from "./console"; -import { DbOperationsCommand } from "./database/commands/migrations"; -import { ObjectionService } from "./database"; -import { EventExplorer } from "./events"; -import { StorageService } from "./storage/service"; -import { CacheService } from "./cache"; -import { QueueService } from "./queue"; -import { QueueConsoleCommands } from "./queue/console"; -import { QueueExplorer } from "./queue/explorer"; -import { CodegenCommand } from "./codegen/command"; -import { CodegenService } from "./codegen/service"; -import { ViewConfigCommand } from "./config/command"; -import { IntentConfig } from "./config/service"; -import { ExistsConstraint } from "./validator/decorators/exists"; -import { IsUniqueConstraint } from "./validator/decorators/isUnique"; -import { LoggerService } from "./logger/service"; -import { GenericFunction } from "./interfaces"; -import { EventQueueWorker } from "./events/jobListener"; -import { MailerService } from "./mailer"; -import { LocalizationService } from "./localization"; +import { DynamicModule, Global, Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { DiscoveryModule } from '@nestjs/core'; +import { CacheService } from './cache'; +import { CodegenCommand } from './codegen/command'; +import { CodegenService } from './codegen/service'; +import { ViewConfigCommand } from './config/command'; +import { IntentConfig } from './config/service'; +import { ConsoleExplorer, ListCommands } from './console'; +import { ObjectionService } from './database'; +import { DbOperationsCommand } from './database/commands/migrations'; +import { EventExplorer } from './events'; +import { EventQueueWorker } from './events/jobListener'; +import { GenericFunction } from './interfaces'; +import { LocalizationService } from './localization'; +import { LoggerService } from './logger/service'; +import { MailerService } from './mailer'; +import { QueueService } from './queue'; +import { QueueConsoleCommands } from './queue/console'; +import { QueueExplorer } from './queue/explorer'; +import { StorageService } from './storage/service'; +import { ExistsConstraint } from './validator/decorators/exists'; +import { IsUniqueConstraint } from './validator/decorators/isUnique'; const providers = [ ConsoleExplorer, diff --git a/lib/queue/console/commands.ts b/lib/queue/console/commands.ts index e4b6397..fdb9647 100644 --- a/lib/queue/console/commands.ts +++ b/lib/queue/console/commands.ts @@ -1,6 +1,6 @@ -import { Injectable } from "@nestjs/common"; -import { QueueWorker } from "../worker"; -import { Command, ConsoleIO } from "../../console"; +import { Injectable } from '@nestjs/common'; +import { Command, ConsoleIO } from '../../console'; +import { QueueWorker } from '../worker'; @Injectable() export class QueueConsoleCommands { @@ -14,17 +14,17 @@ export class QueueConsoleCommands { {--C|connection= : Connection which should be used for consumption} {--Q|queue= : Name of the queue from which the messages should be pulled} `, - { desc: "Command to run the intent queue worker." } + { desc: 'Command to run the intent queue worker.' }, ) public async startQueueWork(_cli: ConsoleIO): Promise { - const sleep = _cli.option("sleep"); - const connection = _cli.option("connection"); - const queue = _cli.option("queue"); + const sleep = _cli.option('sleep'); + const connection = _cli.option('connection'); + const queue = _cli.option('queue'); const options: { [key: string]: string | number } = {}; - if (sleep) options["sleep"] = sleep; - if (connection) options["connection"] = connection; - if (queue) options["queue"] = queue; + if (sleep) options['sleep'] = sleep; + if (connection) options['connection'] = connection; + if (queue) options['queue'] = queue; await QueueWorker.init(options).listen(); return; diff --git a/lib/queue/constants.ts b/lib/queue/constants.ts index bfd5bcc..0b8e14b 100644 --- a/lib/queue/constants.ts +++ b/lib/queue/constants.ts @@ -1,11 +1,11 @@ -export const JOB_NAME = "__JOB_NAME__"; -export const JOB_OPTIONS = "__JOB_OPTIONS__"; +export const JOB_NAME = '__JOB_NAME__'; +export const JOB_OPTIONS = '__JOB_OPTIONS__'; export const events = { - jobFailed: "intent-queue::job-failed", - jobProcessing: "intent-queue::job-processing", - jobProcessed: "intent-queue::job-processed", - jobMaxRetriesExceeed: "intent-queue::job-max-retries-exceeded", + jobFailed: 'intent-queue::job-failed', + jobProcessing: 'intent-queue::job-processing', + jobProcessed: 'intent-queue::job-processed', + jobMaxRetriesExceeed: 'intent-queue::job-max-retries-exceeded', }; export enum JobStatusEnum { diff --git a/lib/queue/core/payloadBuilder.ts b/lib/queue/core/payloadBuilder.ts index c09c780..add6d60 100644 --- a/lib/queue/core/payloadBuilder.ts +++ b/lib/queue/core/payloadBuilder.ts @@ -1,5 +1,5 @@ -import { QueueMetadata } from "../metadata"; -import { Message, JobOptions, InternalMessage } from "../strategy"; +import { QueueMetadata } from '../metadata'; +import { Message, JobOptions, InternalMessage } from '../strategy'; type Complete = { [P in keyof Required]: Pick extends Required> @@ -10,7 +10,7 @@ type Complete = { export class PayloadBuilder { static build( message: Message, - jobOptions: JobOptions + jobOptions: JobOptions, ): Complete { const defaultOptions = QueueMetadata.getDefaultOptions(); const payload = { diff --git a/lib/queue/decorators.ts b/lib/queue/decorators.ts index ac6fe94..bf04ceb 100644 --- a/lib/queue/decorators.ts +++ b/lib/queue/decorators.ts @@ -1,7 +1,7 @@ -import "reflect-metadata"; -import { events, JOB_NAME, JOB_OPTIONS } from "./constants"; -import { ListensTo } from "../events"; -import { JobOptions } from "./strategy"; +import 'reflect-metadata'; +import { ListensTo } from '../events'; +import { events, JOB_NAME, JOB_OPTIONS } from './constants'; +import { JobOptions } from './strategy'; export function Job(job: string, options?: JobOptions) { options = options || {}; diff --git a/lib/queue/drivers/redis.ts b/lib/queue/drivers/redis.ts index 0bdf6e7..cedac09 100644 --- a/lib/queue/drivers/redis.ts +++ b/lib/queue/drivers/redis.ts @@ -1,10 +1,10 @@ -import { InternalMessage } from "../strategy"; -import { RedisJob } from "../interfaces/redisJob"; -import { RedisQueueOptionsDto } from "../schema"; -import { PollQueueDriver } from "../strategy/pollQueueDriver"; -import { validateOptions } from "../../utils/helpers"; -import { Package } from "../../utils"; -import { ulid } from "ulid"; +import { ulid } from 'ulid'; +import { Package } from '../../utils'; +import { validateOptions } from '../../utils/helpers'; +import { RedisJob } from '../interfaces/redisJob'; +import { RedisQueueOptionsDto } from '../schema'; +import { InternalMessage } from '../strategy'; +import { PollQueueDriver } from '../strategy/pollQueueDriver'; const FIND_DELAYED_JOB = ` local source_key = KEYS[1] @@ -38,12 +38,12 @@ export class RedisQueueDriver implements PollQueueDriver { constructor(private options: Record) { validateOptions(this.options, RedisQueueOptionsDto, { - cls: "RedisQueueDriver", + cls: 'RedisQueueDriver', }); - this.queuePrefix = this.options.prefix || "intent_queue"; - const Redis = Package.load("ioredis"); + this.queuePrefix = this.options.prefix || 'intent_queue'; + const Redis = Package.load('ioredis'); this.client = new Redis(options); - this.client.defineCommand("findDelayedJob", { + this.client.defineCommand('findDelayedJob', { numberOfKeys: 2, lua: FIND_DELAYED_JOB, }); @@ -59,7 +59,7 @@ export class RedisQueueDriver implements PollQueueDriver { await this.client.rpush( this.getQueue(`${rawPayload.queue}`), - this.getProcessedMessage(message) + this.getProcessedMessage(message), ); } @@ -79,18 +79,17 @@ export class RedisQueueDriver implements PollQueueDriver { } async count(options: Record): Promise { - const data = await this.client.llen(this.getQueue(options.queue)); - return data; + return await this.client.llen(this.getQueue(options.queue)); } async pushToDelayedQueue( message: string, - rawPayload: InternalMessage + rawPayload: InternalMessage, ): Promise { await this.client.zadd( this.getDelayedQueue(`${rawPayload.queue}`), Date.now() + rawPayload.delay * 1000, - this.getProcessedMessage(message) + this.getProcessedMessage(message), ); return; } @@ -105,7 +104,7 @@ export class RedisQueueDriver implements PollQueueDriver { await (this.client as any).findDelayedJob( this.getDelayedQueue(options.queue), this.getQueue(options.queue), - Date.now() + Date.now(), ); } diff --git a/lib/queue/drivers/sqs.ts b/lib/queue/drivers/sqs.ts index 8ca9f1e..1614d8d 100644 --- a/lib/queue/drivers/sqs.ts +++ b/lib/queue/drivers/sqs.ts @@ -1,16 +1,16 @@ -import { SqsJob } from "../interfaces/sqsJob"; -import { InternalMessage } from "../strategy"; -import { SqsQueueOptionsDto } from "../schema"; -import { PollQueueDriver } from "../strategy/pollQueueDriver"; -import { Package } from "../../utils"; -import { joinUrl, validateOptions } from "../../utils/helpers"; +import { Package } from '../../utils'; +import { joinUrl, validateOptions } from '../../utils/helpers'; +import { SqsJob } from '../interfaces/sqsJob'; +import { SqsQueueOptionsDto } from '../schema'; +import { InternalMessage } from '../strategy'; +import { PollQueueDriver } from '../strategy/pollQueueDriver'; export class SqsQueueDriver implements PollQueueDriver { private client: any; constructor(private options: Record) { validateOptions(options, SqsQueueOptionsDto, { cls: SqsQueueDriver.name }); - const AWS = Package.load("@aws-sdk/client-sqs"); + const AWS = Package.load('@aws-sdk/client-sqs'); this.client = new AWS.SQS({ region: options.region, apiVersion: options.apiVersion, @@ -22,7 +22,7 @@ export class SqsQueueDriver implements PollQueueDriver { } init(): Promise { - throw new Error("Method not implemented."); + throw new Error('Method not implemented.'); } async push(message: string, rawPayload: InternalMessage): Promise { @@ -39,7 +39,7 @@ export class SqsQueueDriver implements PollQueueDriver { async pull(options: Record): Promise { const params = { MaxNumberOfMessages: 10, - MessageAttributeNames: ["All"], + MessageAttributeNames: ['All'], QueueUrl: joinUrl(this.options.prefix, options.queue), VisibilityTimeout: 30, WaitTimeSeconds: 20, @@ -47,7 +47,7 @@ export class SqsQueueDriver implements PollQueueDriver { const response = await this.client.receiveMessage(params); const messages = response.Messages ?? []; - return messages.map((m) => new SqsJob(m)); + return messages.map(m => new SqsJob(m)); } async remove(job: SqsJob, options: Record): Promise { @@ -74,11 +74,10 @@ export class SqsQueueDriver implements PollQueueDriver { async count(options: Record): Promise { const params = { QueueUrl: joinUrl(this.options.prefix, options.queue), - AttributeNames: ["ApproximateNumberOfMessages"], + AttributeNames: ['ApproximateNumberOfMessages'], }; - const response: Record = await this.client.getQueueAttributes( - params - ); + const response: Record = + await this.client.getQueueAttributes(params); return +response.Attributes.ApproximateNumberOfMessages; } } diff --git a/lib/queue/events/index.ts b/lib/queue/events/index.ts index c469f5d..b2df0f2 100644 --- a/lib/queue/events/index.ts +++ b/lib/queue/events/index.ts @@ -1,4 +1,4 @@ -export * from "./JobFailed"; -export * from "./JobProcessed"; -export * from "./JobProcessing"; -export * from "./jobMaxRetries"; +export * from './JobFailed'; +export * from './JobProcessed'; +export * from './JobProcessing'; +export * from './jobMaxRetries'; diff --git a/lib/queue/events/jobMaxRetries.ts b/lib/queue/events/jobMaxRetries.ts index a59c747..9836ca4 100644 --- a/lib/queue/events/jobMaxRetries.ts +++ b/lib/queue/events/jobMaxRetries.ts @@ -1,9 +1,12 @@ -import { EmitsEvent, Event } from "../../events"; -import { events } from "../constants"; +import { EmitsEvent, Event } from '../../events'; +import { events } from '../constants'; @Event(events.jobMaxRetriesExceeed) export class JobMaxRetriesExceeed extends EmitsEvent { - constructor(public message: any, public job: any) { + constructor( + public message: any, + public job: any, + ) { super(); } } diff --git a/lib/queue/explorer.ts b/lib/queue/explorer.ts index bbfef42..c2856c7 100644 --- a/lib/queue/explorer.ts +++ b/lib/queue/explorer.ts @@ -1,23 +1,23 @@ -import { Injectable, OnModuleInit } from "@nestjs/common"; -import { DiscoveryService, MetadataScanner } from "@nestjs/core"; -import { JOB_NAME, JOB_OPTIONS } from "./constants"; -import { QueueMetadata } from "./metadata"; -import { GenericFunction } from "../interfaces"; +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { DiscoveryService, MetadataScanner } from '@nestjs/core'; +import { GenericFunction } from '../interfaces'; +import { JOB_NAME, JOB_OPTIONS } from './constants'; +import { QueueMetadata } from './metadata'; @Injectable() export class QueueExplorer implements OnModuleInit { constructor( private readonly discovery: DiscoveryService, - private readonly metadataScanner: MetadataScanner + private readonly metadataScanner: MetadataScanner, ) {} onModuleInit() { const wrappers = this.discovery.getProviders(); - wrappers.forEach((w) => { + wrappers.forEach(w => { const { instance } = w; if ( !instance || - typeof instance === "string" || + typeof instance === 'string' || !Object.getPrototypeOf(instance) ) { return; @@ -25,7 +25,7 @@ export class QueueExplorer implements OnModuleInit { this.metadataScanner.scanFromPrototype( instance, Object.getPrototypeOf(instance), - (key: string) => this.lookupJobs(instance, key) + (key: string) => this.lookupJobs(instance, key), ); }); } diff --git a/lib/queue/index.ts b/lib/queue/index.ts index 89ee0ba..e78ee7d 100644 --- a/lib/queue/index.ts +++ b/lib/queue/index.ts @@ -1,7 +1,7 @@ -export * from "./interfaces"; -export * from "./service"; -export * from "./queue"; -export * from "./decorators"; -export * from "./worker"; -export * from "./strategy"; -export * from "./drivers"; +export * from './interfaces'; +export * from './service'; +export * from './queue'; +export * from './decorators'; +export * from './worker'; +export * from './strategy'; +export * from './drivers'; diff --git a/lib/queue/interfaces/options.ts b/lib/queue/interfaces/options.ts index 2a9eded..f5f2cac 100644 --- a/lib/queue/interfaces/options.ts +++ b/lib/queue/interfaces/options.ts @@ -1,21 +1,21 @@ -import { Type } from "@nestjs/common"; -import { QueueDrivers } from "../strategy"; +import { Type } from '@nestjs/common'; +import { QueueDrivers } from '../strategy'; export interface QueueDriverOptions { - listenerType: "poll" | "subscribe"; + listenerType: 'poll' | 'subscribe'; driver: Type; [key: string]: string | number | Record; } export interface SyncQueueDriverOptions { - listenerType: "poll"; - driver: "sync"; + listenerType: 'poll'; + driver: 'sync'; queue?: string; } export interface SqsQueueDriverOptions { - listenerType: "poll"; - driver: "sqs"; + listenerType: 'poll'; + driver: 'sqs'; region: string; apiVersion: string; prefix: string; @@ -28,8 +28,8 @@ export interface SqsQueueDriverOptions { } export interface RedisQueueDriverOptions { - listenerType: "poll"; - driver: "redis"; + listenerType: 'poll'; + driver: 'redis'; host?: string; port?: number; url?: string; diff --git a/lib/queue/jobRunners/base.ts b/lib/queue/jobRunners/base.ts index c882764..4940f92 100644 --- a/lib/queue/jobRunners/base.ts +++ b/lib/queue/jobRunners/base.ts @@ -1,13 +1,13 @@ -import { ListenerOptions } from "../interfaces"; -import { QueueMetadata } from "../metadata"; -import { InternalMessage } from "../strategy"; -import { PollQueueDriver } from "../strategy/pollQueueDriver"; -import { JobStatusEnum } from "../constants"; +import { JobStatusEnum } from '../constants'; +import { ListenerOptions } from '../interfaces'; +import { QueueMetadata } from '../metadata'; +import { InternalMessage } from '../strategy'; +import { PollQueueDriver } from '../strategy/pollQueueDriver'; export class JobRunner { constructor( private options: ListenerOptions, - private connection: PollQueueDriver + private connection: PollQueueDriver, ) {} async run(message: InternalMessage): Promise> { diff --git a/lib/queue/metadata.ts b/lib/queue/metadata.ts index 839dbcb..286e7fd 100644 --- a/lib/queue/metadata.ts +++ b/lib/queue/metadata.ts @@ -1,8 +1,8 @@ -import { Injectable } from "@nestjs/common"; -import { QueueOptions } from "./interfaces"; -import { GenericFunction } from "../interfaces"; -import { JobOptions } from "./strategy"; -import { IntentConfig } from "../config/service"; +import { Injectable } from '@nestjs/common'; +import { IntentConfig } from '../config/service'; +import { GenericFunction } from '../interfaces'; +import { QueueOptions } from './interfaces'; +import { JobOptions } from './strategy'; interface JobTarget { options: JobOptions; @@ -19,7 +19,7 @@ export class QueueMetadata { private static store: Record = { jobs: {} }; constructor(private config: IntentConfig) { - const data = this.config.get("queue"); + const data = this.config.get('queue'); QueueMetadata.data = data; QueueMetadata.defaultOptions = { connection: data.default, diff --git a/lib/queue/queue.ts b/lib/queue/queue.ts index 0569cb4..154e5b5 100644 --- a/lib/queue/queue.ts +++ b/lib/queue/queue.ts @@ -1,22 +1,22 @@ -import { PayloadBuilder } from "./core"; -import { QueueMetadata } from "./metadata"; -import { QueueService } from "./service"; -import { Message } from "./strategy"; -import { PollQueueDriver } from "./strategy/pollQueueDriver"; -import { SubscribeQueueDriver } from "./strategy/subscribeQueueDriver"; +import { PayloadBuilder } from './core'; +import { QueueMetadata } from './metadata'; +import { QueueService } from './service'; +import { Message } from './strategy'; +import { PollQueueDriver } from './strategy/pollQueueDriver'; +import { SubscribeQueueDriver } from './strategy/subscribeQueueDriver'; export class Queue { static async dispatch(message: Message): Promise { const job = QueueMetadata.getJob(message.job); const payload = PayloadBuilder.build(message, job?.options ?? {}); const { config, client } = QueueService.getConnection( - payload["connection"] + payload['connection'], ); - if (config.listenerType === "subscribe") { + if (config.listenerType === 'subscribe') { return (client as SubscribeQueueDriver).publish( message.job, - message.data + message.data, ); } @@ -27,17 +27,17 @@ export class Queue { export async function Dispatch(message: Message): Promise { const job = QueueMetadata.getJob(message.job); const payload = PayloadBuilder.build(message, job?.options || {}); - const { config, client } = QueueService.getConnection(payload["connection"]); + const { config, client } = QueueService.getConnection(payload['connection']); - if (config.listenerType === "subscribe") { + if (config.listenerType === 'subscribe') { return await (client as SubscribeQueueDriver).publish( message.job, - message.data + message.data, ); } return await (client as PollQueueDriver).push( JSON.stringify(payload), - payload + payload, ); } diff --git a/lib/queue/schema/index.ts b/lib/queue/schema/index.ts index e125470..5f8b8a6 100644 --- a/lib/queue/schema/index.ts +++ b/lib/queue/schema/index.ts @@ -31,11 +31,11 @@ export class SqsQueueOptionsDto { } export class RedisQueueOptionsDto { - @ValidateIf((o) => !o.url) + @ValidateIf(o => !o.url) @IsString() host: string; - @ValidateIf((o) => !o.url) + @ValidateIf(o => !o.url) @IsNotEmpty() @IsInt() port: number; @@ -47,7 +47,7 @@ export class RedisQueueOptionsDto { @IsNotEmpty() queue: string; - @ValidateIf((o) => !o.host) + @ValidateIf(o => !o.host) @IsUrl() url: string; diff --git a/lib/queue/service.ts b/lib/queue/service.ts index 3c7d0a8..1c6883b 100644 --- a/lib/queue/service.ts +++ b/lib/queue/service.ts @@ -1,13 +1,13 @@ -import { Injectable, Type } from "@nestjs/common"; -import { QueueDriverOptions, QueueOptions } from "./interfaces"; -import { QueueMetadata } from "./metadata"; -import { IntentConfig } from "../config/service"; -import { SqsQueueDriver, SyncQueueDriver } from "./drivers"; -import { Str } from "../utils/string"; -import { InternalLogger } from "../utils/logger"; -import { QueueDrivers } from "./strategy"; -import { RedisQueueDriver } from "./drivers/redis"; -import { logTime } from "../utils/helpers"; +import { Injectable, Type } from '@nestjs/common'; +import { IntentConfig } from '../config/service'; +import { logTime } from '../utils/helpers'; +import { InternalLogger } from '../utils/logger'; +import { Str } from '../utils/string'; +import { SqsQueueDriver, SyncQueueDriver } from './drivers'; +import { RedisQueueDriver } from './drivers/redis'; +import { QueueDriverOptions, QueueOptions } from './interfaces'; +import { QueueMetadata } from './metadata'; +import { QueueDrivers } from './strategy'; @Injectable() export class QueueService { @@ -20,7 +20,7 @@ export class QueueService { private static connections: Record = {}; constructor(private config: IntentConfig) { - const options = this.config.get("queue"); + const options = this.config.get('queue'); if (!options) return; for (const connName in options.connections) { const time = Date.now(); @@ -32,8 +32,8 @@ export class QueueService { if (!driver) { InternalLogger.error( - "QueueService", - `We couldn't find any driver associated with the "${driverName}".` + 'QueueService', + `We couldn't find any driver associated with the "${driverName}".`, ); continue; } @@ -43,16 +43,16 @@ export class QueueService { client: new driver(connection), }; InternalLogger.success( - "QueueService", + 'QueueService', `Queue connection [${connName}] successfully initiailized ${logTime( - Date.now() - time - )}` + Date.now() - time, + )}`, ); } } static getConnection( - connection: string | undefined + connection: string | undefined, ): { config: QueueDriverOptions; client: T } { const options = QueueMetadata.getData(); if (!connection) connection = options.default; @@ -60,7 +60,7 @@ export class QueueService { } static getConnectionClient( - connection: string | undefined + connection: string | undefined, ): T { const options = QueueMetadata.getData(); if (!connection) connection = options.default; diff --git a/lib/queue/strategy/index.ts b/lib/queue/strategy/index.ts index 566b768..813bbbc 100644 --- a/lib/queue/strategy/index.ts +++ b/lib/queue/strategy/index.ts @@ -1,7 +1,7 @@ -import { PollQueueDriver } from "./pollQueueDriver"; -import { SubscribeQueueDriver } from "./subscribeQueueDriver"; +import { PollQueueDriver } from './pollQueueDriver'; +import { SubscribeQueueDriver } from './subscribeQueueDriver'; -export * from "./message"; -export * from "./driverJob"; +export * from './message'; +export * from './driverJob'; export type QueueDrivers = PollQueueDriver | SubscribeQueueDriver; diff --git a/lib/queue/strategy/pollQueueDriver.ts b/lib/queue/strategy/pollQueueDriver.ts index 792ecf4..ecd0f2c 100644 --- a/lib/queue/strategy/pollQueueDriver.ts +++ b/lib/queue/strategy/pollQueueDriver.ts @@ -1,5 +1,5 @@ -import { DriverJob, Message } from '.'; import { BaseQueueDriver } from './subscribeQueueDriver'; +import { DriverJob, Message } from '.'; export interface PollQueueDriver extends BaseQueueDriver { push(message: string, rawMessage: Message): Promise; diff --git a/lib/queue/strategy/subscribeQueueDriver.ts b/lib/queue/strategy/subscribeQueueDriver.ts index a20c467..783ceb6 100644 --- a/lib/queue/strategy/subscribeQueueDriver.ts +++ b/lib/queue/strategy/subscribeQueueDriver.ts @@ -1,5 +1,5 @@ -import { GenericFunction } from "../../interfaces"; -import { DriverJob } from "./driverJob"; +import { GenericFunction } from '../../interfaces'; +import { DriverJob } from './driverJob'; export interface BaseQueueDriver { init(): Promise; diff --git a/lib/queue/worker.ts b/lib/queue/worker.ts index 041ec35..6457643 100644 --- a/lib/queue/worker.ts +++ b/lib/queue/worker.ts @@ -1,11 +1,11 @@ -import { ListenerOptions } from "./interfaces"; -import { QueueMetadata } from "./metadata"; -import { QueueService } from "./service"; -import { PollQueueWorker } from "./workers/pollQueue"; -import { SubscribeQueueWorker } from "./workers/subscribeQueue"; +import { ListenerOptions } from './interfaces'; +import { QueueMetadata } from './metadata'; +import { QueueService } from './service'; +import { PollQueueWorker } from './workers/pollQueue'; +import { SubscribeQueueWorker } from './workers/subscribeQueue'; interface QueueWorkerOptions extends ListenerOptions { - listenerType: "poll" | "subscribe"; + listenerType: 'poll' | 'subscribe'; meta?: Record; listenerId?: string; } @@ -13,7 +13,7 @@ interface QueueWorkerOptions extends ListenerOptions { export class QueueWorker { private options: Record; - constructor(args: Omit) { + constructor(args: Omit) { const defaultOptions = QueueMetadata.getDefaultOptions(); this.options = { ...defaultOptions, @@ -28,26 +28,26 @@ export class QueueWorker { if (!this.options.queue) { const data = QueueMetadata.getData(); - this.options["queue"] = data.connections[ + this.options['queue'] = data.connections[ this.options.connection || defaultOptions.connection ].queue as string; } } - static init(options: Omit): QueueWorker { + static init(options: Omit): QueueWorker { return new QueueWorker(options); } async listen(): Promise { const options = { ...this.options }; - if (this.options.listenerType === "poll") { + if (this.options.listenerType === 'poll') { await PollQueueWorker.init(options).listen(); } - if (this.options.listenerType === "subscribe") { + if (this.options.listenerType === 'subscribe') { await SubscribeQueueWorker.init({ - listenerId: options?.listenerId ?? "intent-queue-listener", + listenerId: options?.listenerId ?? 'intent-queue-listener', ...options, }); } diff --git a/lib/queue/workers/baseWorker.ts b/lib/queue/workers/baseWorker.ts index 13d85fa..f4625ff 100644 --- a/lib/queue/workers/baseWorker.ts +++ b/lib/queue/workers/baseWorker.ts @@ -1,50 +1,50 @@ -import { getTimestampForLog } from "../../utils/helpers"; -import { ListenerOptions } from "../interfaces"; -import { QueueDrivers } from "../strategy"; -import * as pc from "picocolors"; +import * as pc from 'picocolors'; +import { getTimestampForLog } from '../../utils/helpers'; +import { ListenerOptions } from '../interfaces'; +import { QueueDrivers } from '../strategy'; export class BaseQueueWorker { protected silent: boolean; protected options: ListenerOptions; protected connection: QueueDrivers; - logInfo(msg: string, silentLabel: boolean = false): void { + logInfo(msg: string, silentLabel = false): void { if (!silentLabel) { - const level = pc.bgCyan(pc.black("[INFO]")); + const level = pc.bgCyan(pc.black('[INFO]')); console.log(`${level} ${getTimestampForLog()} ${this.shallowLog()}`); } console.log(pc.cyan(msg)); } - logSuccess(msg: string, silentLabel: boolean = false): void { + logSuccess(msg: string, silentLabel = false): void { if (!silentLabel) { - const level = pc.bgCyan(pc.black("[INFO]")); + const level = pc.bgCyan(pc.black('[INFO]')); console.log(`${level} ${getTimestampForLog()} ${this.shallowLog()}`); } console.log(pc.green(msg)); } - logError(msg: string, silentLabel: boolean = false): void { + logError(msg: string, silentLabel = false): void { if (!silentLabel) { - const level = pc.bgCyan(pc.black("[INFO]")); + const level = pc.bgCyan(pc.black('[INFO]')); console.log(`${level} ${getTimestampForLog()} ${this.shallowLog()}`); } console.log(pc.red(msg)); } - logWarn(msg: string, silentLabel: boolean = false): void { + logWarn(msg: string, silentLabel = false): void { if (!silentLabel) { - const level = pc.bgYellow(pc.black("[WARN]")); + const level = pc.bgYellow(pc.black('[WARN]')); console.log(`${level} ${getTimestampForLog()} ${this.shallowLog()}`); } console.log(pc.yellow(msg)); } private shallowLog(): string { - return `${pc.dim("Connection: " + this.options.connection)} ${pc.dim( - "Queue: " + this.options.queue + return `${pc.dim('Connection: ' + this.options.connection)} ${pc.dim( + 'Queue: ' + this.options.queue, )}`; } } diff --git a/lib/queue/workers/pollQueue.ts b/lib/queue/workers/pollQueue.ts index e83465a..6f1f958 100644 --- a/lib/queue/workers/pollQueue.ts +++ b/lib/queue/workers/pollQueue.ts @@ -1,16 +1,16 @@ -import { ListenerOptions } from "../interfaces"; -import { QueueMetadata } from "../metadata"; -import { QueueService } from "../service"; -import { DriverJob, InternalMessage } from "../strategy"; -import { PollQueueDriver } from "../strategy/pollQueueDriver"; -import { BaseQueueWorker } from "./baseWorker"; -import { JobRunner } from "../jobRunners/base"; -import { JobFailed, JobProcessed, JobProcessing } from "../events"; -import { Dispatch } from "../queue"; -import { JobStatusEnum } from "../constants"; -import { JobMaxRetriesExceeed } from "../events/jobMaxRetries"; -import { EmitsEvent } from "../../events"; -import { logTime } from "../../utils/helpers"; +import { EmitsEvent } from '../../events'; +import { logTime } from '../../utils/helpers'; +import { JobStatusEnum } from '../constants'; +import { JobFailed, JobProcessed, JobProcessing } from '../events'; +import { JobMaxRetriesExceeed } from '../events/jobMaxRetries'; +import { ListenerOptions } from '../interfaces'; +import { JobRunner } from '../jobRunners/base'; +import { QueueMetadata } from '../metadata'; +import { Dispatch } from '../queue'; +import { QueueService } from '../service'; +import { DriverJob, InternalMessage } from '../strategy'; +import { PollQueueDriver } from '../strategy/pollQueueDriver'; +import { BaseQueueWorker } from './baseWorker'; export class PollQueueWorker extends BaseQueueWorker { protected options: ListenerOptions; @@ -29,7 +29,7 @@ export class PollQueueWorker extends BaseQueueWorker { if (!this.options.queue) { const data = QueueMetadata.getData(); - this.options["queue"] = data.connections[ + this.options['queue'] = data.connections[ this.options.connection || defaultOptions.connection ].queue as string; } @@ -47,11 +47,11 @@ export class PollQueueWorker extends BaseQueueWorker { * Listen to the queue */ async listen() { - this.logInfo("Poll Queue Worker Initialised"); - this.logInfo("Listening for messages..."); + this.logInfo('Poll Queue Worker Initialised'); + this.logInfo('Listening for messages...'); const connection = QueueService.getConnectionClient( - this.options.connection + this.options.connection, ); // perform scheduled task of the driver @@ -61,7 +61,7 @@ export class PollQueueWorker extends BaseQueueWorker { while (1) { const jobs = await this.poll(connection); if (!jobs.length) { - await new Promise((resolve) => setTimeout(resolve, this.options.sleep)); + await new Promise(resolve => setTimeout(resolve, this.options.sleep)); continue; } @@ -89,12 +89,12 @@ export class PollQueueWorker extends BaseQueueWorker { message: InternalMessage, job: DriverJob, error: Error, - startTime: number + startTime: number, ): Promise { if (status === JobStatusEnum.jobNotFound) { this.logWarn( `Job [${message.job}] not found. Please ensure that you have a job running for this connection`, - true + true, ); return; } @@ -103,7 +103,7 @@ export class PollQueueWorker extends BaseQueueWorker { await this.success(message, job); this.logSuccess( `[${message.job}] Job Processed ... ${logTime(Date.now() - startTime)}`, - true + true, ); return; } @@ -111,8 +111,8 @@ export class PollQueueWorker extends BaseQueueWorker { if (status === JobStatusEnum.retry) { await this.retry(message, job); this.logError( - `[${message.job}] Job Failed... | ${error["message"]}`, - true + `[${message.job}] Job Failed... | ${error['message']}`, + true, ); return; } @@ -125,20 +125,20 @@ export class PollQueueWorker extends BaseQueueWorker { connection.scheduledTask ? await connection.scheduledTask(this.options) : null, - this.options.schedulerInterval || 30000 + this.options.schedulerInterval || 30000, ); } async purge(): Promise { const connection = QueueService.getConnectionClient( - this.options.connection + this.options.connection, ); await connection.purge({ queue: this.options.queue }); } async count(): Promise { const connection = QueueService.getConnectionClient( - this.options.connection + this.options.connection, ); return await connection.count({ queue: this.options.queue }); } @@ -176,7 +176,7 @@ export class PollQueueWorker extends BaseQueueWorker { */ async removeJobFromQueue(job: DriverJob): Promise { const connection = QueueService.getConnectionClient( - this.options.connection + this.options.connection, ); await connection.remove(job, this.options); } diff --git a/lib/queue/workers/subscribeQueue.ts b/lib/queue/workers/subscribeQueue.ts index 06ec123..f8836e7 100644 --- a/lib/queue/workers/subscribeQueue.ts +++ b/lib/queue/workers/subscribeQueue.ts @@ -1,8 +1,8 @@ -import { ListenerOptions } from "../interfaces"; -import { SubscribeQueueDriver } from "../strategy/subscribeQueueDriver"; -import { QueueMetadata } from "../metadata"; -import { QueueService } from "../service"; -import { Obj } from "../../utils"; +import { Obj } from '../../utils'; +import { ListenerOptions } from '../interfaces'; +import { QueueMetadata } from '../metadata'; +import { QueueService } from '../service'; +import { SubscribeQueueDriver } from '../strategy/subscribeQueueDriver'; export interface PubSubWorkerOptions extends ListenerOptions { listenerId?: string; @@ -25,7 +25,7 @@ export class SubscribeQueueWorker { if (!this.options.queue) { const data = QueueMetadata.getData(); - this.options["queue"] = data.connections[ + this.options['queue'] = data.connections[ this.options.connection || defaultOptions.connection ].queue as string; } @@ -40,7 +40,7 @@ export class SubscribeQueueWorker { const jobs = QueueMetadata.getAllJobs(); await this.initBroker(this.options.connection, jobs); const connClient = QueueService.getConnectionClient( - this.options.connection + this.options.connection, ); await connClient.startListening(this.processIncomingMessage()); @@ -48,25 +48,25 @@ export class SubscribeQueueWorker { this.attachDeamonListeners(); await new Promise(() => - setInterval(async () => {}, 20 * 24 * 60 * 60 * 1000) + setInterval(async () => {}, 20 * 24 * 60 * 60 * 1000), ); } attachDeamonListeners() { - process.on("SIGINT", async () => { + process.on('SIGINT', async () => { await this.closeConnections(); }); - process.on("SIGQUIT", async () => { + process.on('SIGQUIT', async () => { await this.closeConnections(); }); - process.on("SIGTERM", async () => { + process.on('SIGTERM', async () => { await this.closeConnections(); }); - process.on("message", async (msg: any) => { - if (msg === "shutdown" || msg.type === "shutdown") { + process.on('message', async (msg: any) => { + if (msg === 'shutdown' || msg.type === 'shutdown') { await this.closeConnections(); } }); @@ -81,14 +81,14 @@ export class SubscribeQueueWorker { async initBroker( broker: string, - listeners: Record + listeners: Record, ): Promise { const topicNames = Object.keys(listeners); const brokerClient = QueueService.getConnectionClient(broker); - const workerOptions = Obj.pick(this.options, ["listenerId"]); + const workerOptions = Obj.pick(this.options, ['listenerId']); await brokerClient.initListeners({ topics: topicNames, workerOptions: workerOptions, diff --git a/lib/rest/decoratorts.ts b/lib/rest/decoratorts.ts index 2b716f3..038e6ed 100644 --- a/lib/rest/decoratorts.ts +++ b/lib/rest/decoratorts.ts @@ -1,15 +1,15 @@ -import { ExecutionContext, createParamDecorator } from "@nestjs/common"; +import { ExecutionContext, createParamDecorator } from '@nestjs/common'; export const IReq = createParamDecorator( (data: string, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); - return request["$intent"]["req"]; - } + return request['$intent']['req']; + }, ); export const IRes = createParamDecorator( (data: string, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); - return request["$intent"]["res"]; - } + return request['$intent']['res']; + }, ); diff --git a/lib/rest/index.ts b/lib/rest/index.ts index 25310ff..8d5ba8d 100644 --- a/lib/rest/index.ts +++ b/lib/rest/index.ts @@ -1,7 +1,7 @@ -export * from "./restController"; -export * from "./restServer"; -export * from "./interceptors/timeout"; -export * from "./interfaces"; -export * from "./decoratorts"; -export { Response } from "express"; -export * from "./request"; +export * from './restController'; +export * from './restServer'; +export * from './interceptors/timeout'; +export * from './interfaces'; +export * from './decoratorts'; +export { Response } from 'express'; +export * from './request'; diff --git a/lib/rest/interceptors/response.ts b/lib/rest/interceptors/response.ts index a9353f6..a0a5877 100644 --- a/lib/rest/interceptors/response.ts +++ b/lib/rest/interceptors/response.ts @@ -6,18 +6,18 @@ import { StreamableFile, ClassSerializerContextOptions, PlainLiteralObject, -} from "@nestjs/common"; -import { Observable, map } from "rxjs"; -import { IntentResponse } from "../response"; -import { instanceToPlain, plainToInstance } from "class-transformer"; -import { Obj } from "../../utils"; +} from '@nestjs/common'; +import { instanceToPlain, plainToInstance } from 'class-transformer'; +import { Observable, map } from 'rxjs'; +import { Obj } from '../../utils'; +import { IntentResponse } from '../response'; @Injectable() export class ResponseSerializerInterceptor implements NestInterceptor { constructor() {} intercept(context: ExecutionContext, next: CallHandler): Observable { - return next.handle().pipe(map((data) => this.serialize(data))); + return next.handle().pipe(map(data => this.serialize(data))); } serialize(response: any): any { diff --git a/lib/rest/interceptors/timeout.ts b/lib/rest/interceptors/timeout.ts index 82ac6ca..372d6ef 100644 --- a/lib/rest/interceptors/timeout.ts +++ b/lib/rest/interceptors/timeout.ts @@ -13,7 +13,7 @@ export class TimeoutInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { return next.handle().pipe( timeout(30000), - catchError((err) => { + catchError(err => { if (err instanceof TimeoutError) { return throwError(() => new RequestTimeoutException()); } diff --git a/lib/rest/interfaces.ts b/lib/rest/interfaces.ts index c29e8d4..ecb97ba 100644 --- a/lib/rest/interfaces.ts +++ b/lib/rest/interfaces.ts @@ -1,6 +1,6 @@ -import { CorsOptions } from "@nestjs/common/interfaces/external/cors-options.interface"; -import { AbstractHttpAdapter, BaseExceptionFilter } from "@nestjs/core"; -import { Request as BaseRequest } from "express"; +import { CorsOptions } from '@nestjs/common/interfaces/external/cors-options.interface'; +import { AbstractHttpAdapter, BaseExceptionFilter } from '@nestjs/core'; +import { Request as BaseRequest } from 'express'; export interface IRequest extends BaseRequest { /** diff --git a/lib/rest/middlewares/requestSerializer.ts b/lib/rest/middlewares/requestSerializer.ts index cba814b..cdd8424 100644 --- a/lib/rest/middlewares/requestSerializer.ts +++ b/lib/rest/middlewares/requestSerializer.ts @@ -2,16 +2,16 @@ import { NextFunction, Request as ERequest, Response as EResponse, -} from "express"; -import { Request } from "../request"; +} from 'express'; +import { Request } from '../request'; export const requestMiddleware = ( req: ERequest, res: EResponse, - next: NextFunction + next: NextFunction, ) => { const intentRequestObj = new Request(req); - req["intent"] = { + req['intent'] = { req: () => intentRequestObj, }; next(); diff --git a/lib/rest/request.ts b/lib/rest/request.ts index 9f28b2f..2716155 100644 --- a/lib/rest/request.ts +++ b/lib/rest/request.ts @@ -1,8 +1,8 @@ -import { Type } from "@nestjs/common"; -import { Request as ERequest } from "express"; -import { Validator } from "../validator"; -import { ulid } from "ulid"; -import { isEmpty } from "lodash"; +import { Type } from '@nestjs/common'; +import { Request as ERequest } from 'express'; +import { isEmpty } from 'lodash'; +import { ulid } from 'ulid'; +import { Validator } from '../validator'; export class Request { private $payload: Record; @@ -58,7 +58,7 @@ export class Request { boolean(name: string): boolean { const val = this.$payload[name] as string; - return [true, "yes", "on", "1", 1, "true"].includes(val.toLowerCase()); + return [true, 'yes', 'on', '1', 1, 'true'].includes(val.toLowerCase()); } query>(name?: string): T { @@ -82,13 +82,13 @@ export class Request { } bearerToken(): string { - const authHeader = this.$headers["authorization"]; - const asArray = authHeader?.split(" "); - return !isEmpty(asArray) && asArray(" ")[1]; + const authHeader = this.$headers['authorization']; + const asArray = authHeader?.split(' '); + return !isEmpty(asArray) && asArray(' ')[1]; } host(): string { - return this.request.get("host"); + return this.request.get('host'); } httpHost(): string { @@ -96,11 +96,11 @@ export class Request { } isHttp(): boolean { - return this.httpHost() === "http"; + return this.httpHost() === 'http'; } isHttps(): boolean { - return this.httpHost() === "https"; + return this.httpHost() === 'https'; } url(): string { @@ -128,18 +128,18 @@ export class Request { } getAcceptableContentTypes(): string[] { - const accept = this.$headers["accept"]; - return accept.split(","); + const accept = this.$headers['accept']; + return accept.split(','); } accepts(contentTypes: string[]): boolean { - const accept = this.$headers["accept"]; - if (accept == "*/*") return true; + const accept = this.$headers['accept']; + if (accept == '*/*') return true; return contentTypes.includes(accept); } expectsJson(): boolean { - return this.$headers["accept"]; + return this.$headers['accept']; } async validate(dto: Type): Promise { @@ -166,7 +166,7 @@ export class Request { } has(...keys: string[]): boolean { - console.log("kjeys ===> ", keys); + console.log('kjeys ===> ', keys); for (const key of keys) { if (!(key in this.$payload)) return false; } diff --git a/lib/rest/response.ts b/lib/rest/response.ts index 11a6664..597cbe9 100644 --- a/lib/rest/response.ts +++ b/lib/rest/response.ts @@ -1,8 +1,8 @@ -import { ClassSerializerContextOptions, StreamableFile } from "@nestjs/common"; -import { StreamableFileOptions } from "@nestjs/common/file-stream/interfaces"; -import { instanceToPlain, plainToInstance } from "class-transformer"; -import { Response } from "express"; -import { ReadStream } from "fs"; +import { ReadStream } from 'fs'; +import { ClassSerializerContextOptions, StreamableFile } from '@nestjs/common'; +import { StreamableFileOptions } from '@nestjs/common/file-stream/interfaces'; +import { instanceToPlain, plainToInstance } from 'class-transformer'; +import { Response } from 'express'; export class IntentResponse { private $headers: Record; @@ -15,7 +15,7 @@ export class IntentResponse { this.$statusCode = 200; } - send(data: any, statusCode: number = 200): this { + send(data: any, statusCode = 200): this { this.$data = data; this.response.status(statusCode); return this; @@ -27,7 +27,7 @@ export class IntentResponse { return this; } - status(status: number = 200): this { + status(status = 200): this { this.response.status(status); return this; } @@ -48,7 +48,7 @@ export class IntentResponse { transformToPlain( plainOrClass: any, - options: ClassSerializerContextOptions + options: ClassSerializerContextOptions, ): Record { if (!plainOrClass) { return plainOrClass; diff --git a/lib/rest/restServer.ts b/lib/rest/restServer.ts index 51e5588..3b76f04 100644 --- a/lib/rest/restServer.ts +++ b/lib/rest/restServer.ts @@ -1,10 +1,10 @@ -import { HttpAdapterHost, NestFactory } from "@nestjs/core"; -import { useContainer } from "class-validator"; -import { ServerOptions } from "./interfaces"; -import { NestExpressApplication } from "@nestjs/platform-express"; -import { IntentConfig } from "../config/service"; -import { requestMiddleware } from "./middlewares/requestSerializer"; -import { Obj, Package } from "../utils"; +import { HttpAdapterHost, NestFactory } from '@nestjs/core'; +import { NestExpressApplication } from '@nestjs/platform-express'; +import { useContainer } from 'class-validator'; +import { IntentConfig } from '../config/service'; +import { Obj, Package } from '../utils'; +import { ServerOptions } from './interfaces'; +import { requestMiddleware } from './middlewares/requestSerializer'; export class RestServer { /** @@ -20,14 +20,14 @@ export class RestServer { } const config = app.get(IntentConfig, { strict: false }); - if (config.get("app.cors") || options?.cors) { - const corsRule = options?.cors ?? config.get("app.cors"); + if (config.get('app.cors') || options?.cors) { + const corsRule = options?.cors ?? config.get('app.cors'); app.enable(corsRule); } app.use(requestMiddleware); - this.configureErrorReporter(config.get("app.sentry")); + this.configureErrorReporter(config.get('app.sentry')); if (options.exceptionFilter) { const { httpAdapter } = app.get(HttpAdapterHost); @@ -36,7 +36,7 @@ export class RestServer { options?.globalPrefix && app.setGlobalPrefix(options.globalPrefix); - await app.listen(options?.port || config.get("app.port")); + await app.listen(options?.port || config.get('app.port')); } static configureErrorReporter(config: Record) { @@ -51,14 +51,14 @@ export class RestServer { } = config; if (dsn) { - const Sentry = Package.load("@sentry/node"); + const Sentry = Package.load('@sentry/node'); const integrations = []; /** * Load integrations */ if (integrateNodeProfile) { const { nodeProfilingIntegration } = Package.load( - "@sentry/profiling-node" + '@sentry/profiling-node', ); integrations.push(nodeProfilingIntegration()); diff --git a/lib/serializers/validationErrorSerializer.ts b/lib/serializers/validationErrorSerializer.ts index ecbf0ca..398a93e 100644 --- a/lib/serializers/validationErrorSerializer.ts +++ b/lib/serializers/validationErrorSerializer.ts @@ -1,6 +1,6 @@ -import { ValidationError } from "class-validator"; -import { isEmpty } from "../utils/helpers"; -import { Str } from "../utils/string"; +import { ValidationError } from 'class-validator'; +import { isEmpty } from '../utils/helpers'; +import { Str } from '../utils/string'; export class ValidationErrorSerializer { async handle(errors: ValidationError[]): Promise> { @@ -25,8 +25,8 @@ export class ValidationErrorSerializer { children.push(this.parseError(child)); } - const messages = Object.values(error.constraints || {}).map((m) => - Str.replace(m, error.property, Str.title(error.property)) + const messages = Object.values(error.constraints || {}).map(m => + Str.replace(m, error.property, Str.title(error.property)), ); const errors = {}; diff --git a/lib/storage/data/mime-db.ts b/lib/storage/data/mime-db.ts index b0cf868..3a4eef4 100644 --- a/lib/storage/data/mime-db.ts +++ b/lib/storage/data/mime-db.ts @@ -1,8856 +1,8856 @@ export const MimeTypes: Record = { - "application/1d-interleaved-parityfec": { - source: "iana", + 'application/1d-interleaved-parityfec': { + source: 'iana', }, - "application/3gpdash-qoe-report+xml": { - source: "iana", - charset: "UTF-8", + 'application/3gpdash-qoe-report+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/3gpp-ims+xml": { - source: "iana", + 'application/3gpp-ims+xml': { + source: 'iana', compressible: true, }, - "application/3gpphal+json": { - source: "iana", + 'application/3gpphal+json': { + source: 'iana', compressible: true, }, - "application/3gpphalforms+json": { - source: "iana", + 'application/3gpphalforms+json': { + source: 'iana', compressible: true, }, - "application/a2l": { - source: "iana", + 'application/a2l': { + source: 'iana', }, - "application/ace+cbor": { - source: "iana", + 'application/ace+cbor': { + source: 'iana', }, - "application/ace+json": { - source: "iana", + 'application/ace+json': { + source: 'iana', compressible: true, }, - "application/activemessage": { - source: "iana", + 'application/activemessage': { + source: 'iana', }, - "application/activity+json": { - source: "iana", + 'application/activity+json': { + source: 'iana', compressible: true, }, - "application/aif+cbor": { - source: "iana", + 'application/aif+cbor': { + source: 'iana', }, - "application/aif+json": { - source: "iana", + 'application/aif+json': { + source: 'iana', compressible: true, }, - "application/alto-cdni+json": { - source: "iana", + 'application/alto-cdni+json': { + source: 'iana', compressible: true, }, - "application/alto-cdnifilter+json": { - source: "iana", + 'application/alto-cdnifilter+json': { + source: 'iana', compressible: true, }, - "application/alto-costmap+json": { - source: "iana", + 'application/alto-costmap+json': { + source: 'iana', compressible: true, }, - "application/alto-costmapfilter+json": { - source: "iana", + 'application/alto-costmapfilter+json': { + source: 'iana', compressible: true, }, - "application/alto-directory+json": { - source: "iana", + 'application/alto-directory+json': { + source: 'iana', compressible: true, }, - "application/alto-endpointcost+json": { - source: "iana", + 'application/alto-endpointcost+json': { + source: 'iana', compressible: true, }, - "application/alto-endpointcostparams+json": { - source: "iana", + 'application/alto-endpointcostparams+json': { + source: 'iana', compressible: true, }, - "application/alto-endpointprop+json": { - source: "iana", + 'application/alto-endpointprop+json': { + source: 'iana', compressible: true, }, - "application/alto-endpointpropparams+json": { - source: "iana", + 'application/alto-endpointpropparams+json': { + source: 'iana', compressible: true, }, - "application/alto-error+json": { - source: "iana", + 'application/alto-error+json': { + source: 'iana', compressible: true, }, - "application/alto-networkmap+json": { - source: "iana", + 'application/alto-networkmap+json': { + source: 'iana', compressible: true, }, - "application/alto-networkmapfilter+json": { - source: "iana", + 'application/alto-networkmapfilter+json': { + source: 'iana', compressible: true, }, - "application/alto-propmap+json": { - source: "iana", + 'application/alto-propmap+json': { + source: 'iana', compressible: true, }, - "application/alto-propmapparams+json": { - source: "iana", + 'application/alto-propmapparams+json': { + source: 'iana', compressible: true, }, - "application/alto-updatestreamcontrol+json": { - source: "iana", + 'application/alto-updatestreamcontrol+json': { + source: 'iana', compressible: true, }, - "application/alto-updatestreamparams+json": { - source: "iana", + 'application/alto-updatestreamparams+json': { + source: 'iana', compressible: true, }, - "application/aml": { - source: "iana", + 'application/aml': { + source: 'iana', }, - "application/andrew-inset": { - source: "iana", - extensions: ["ez"], + 'application/andrew-inset': { + source: 'iana', + extensions: ['ez'], }, - "application/appinstaller": { + 'application/appinstaller': { compressible: false, - extensions: ["appinstaller"], + extensions: ['appinstaller'], }, - "application/applefile": { - source: "iana", + 'application/applefile': { + source: 'iana', }, - "application/applixware": { - source: "apache", - extensions: ["aw"], + 'application/applixware': { + source: 'apache', + extensions: ['aw'], }, - "application/appx": { + 'application/appx': { compressible: false, - extensions: ["appx"], + extensions: ['appx'], }, - "application/appxbundle": { + 'application/appxbundle': { compressible: false, - extensions: ["appxbundle"], + extensions: ['appxbundle'], }, - "application/at+jwt": { - source: "iana", + 'application/at+jwt': { + source: 'iana', }, - "application/atf": { - source: "iana", + 'application/atf': { + source: 'iana', }, - "application/atfx": { - source: "iana", + 'application/atfx': { + source: 'iana', }, - "application/atom+xml": { - source: "iana", + 'application/atom+xml': { + source: 'iana', compressible: true, - extensions: ["atom"], + extensions: ['atom'], }, - "application/atomcat+xml": { - source: "iana", + 'application/atomcat+xml': { + source: 'iana', compressible: true, - extensions: ["atomcat"], + extensions: ['atomcat'], }, - "application/atomdeleted+xml": { - source: "iana", + 'application/atomdeleted+xml': { + source: 'iana', compressible: true, - extensions: ["atomdeleted"], + extensions: ['atomdeleted'], }, - "application/atomicmail": { - source: "iana", + 'application/atomicmail': { + source: 'iana', }, - "application/atomsvc+xml": { - source: "iana", + 'application/atomsvc+xml': { + source: 'iana', compressible: true, - extensions: ["atomsvc"], + extensions: ['atomsvc'], }, - "application/atsc-dwd+xml": { - source: "iana", + 'application/atsc-dwd+xml': { + source: 'iana', compressible: true, - extensions: ["dwd"], + extensions: ['dwd'], }, - "application/atsc-dynamic-event-message": { - source: "iana", + 'application/atsc-dynamic-event-message': { + source: 'iana', }, - "application/atsc-held+xml": { - source: "iana", + 'application/atsc-held+xml': { + source: 'iana', compressible: true, - extensions: ["held"], + extensions: ['held'], }, - "application/atsc-rdt+json": { - source: "iana", + 'application/atsc-rdt+json': { + source: 'iana', compressible: true, }, - "application/atsc-rsat+xml": { - source: "iana", + 'application/atsc-rsat+xml': { + source: 'iana', compressible: true, - extensions: ["rsat"], + extensions: ['rsat'], }, - "application/atxml": { - source: "iana", + 'application/atxml': { + source: 'iana', }, - "application/auth-policy+xml": { - source: "iana", + 'application/auth-policy+xml': { + source: 'iana', compressible: true, }, - "application/automationml-aml+xml": { - source: "iana", + 'application/automationml-aml+xml': { + source: 'iana', compressible: true, - extensions: ["aml"], + extensions: ['aml'], }, - "application/automationml-amlx+zip": { - source: "iana", + 'application/automationml-amlx+zip': { + source: 'iana', compressible: false, - extensions: ["amlx"], + extensions: ['amlx'], }, - "application/bacnet-xdd+zip": { - source: "iana", + 'application/bacnet-xdd+zip': { + source: 'iana', compressible: false, }, - "application/batch-smtp": { - source: "iana", + 'application/batch-smtp': { + source: 'iana', }, - "application/bdoc": { + 'application/bdoc': { compressible: false, - extensions: ["bdoc"], + extensions: ['bdoc'], }, - "application/beep+xml": { - source: "iana", - charset: "UTF-8", + 'application/beep+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/calendar+json": { - source: "iana", + 'application/calendar+json': { + source: 'iana', compressible: true, }, - "application/calendar+xml": { - source: "iana", + 'application/calendar+xml': { + source: 'iana', compressible: true, - extensions: ["xcs"], + extensions: ['xcs'], }, - "application/call-completion": { - source: "iana", + 'application/call-completion': { + source: 'iana', }, - "application/cals-1840": { - source: "iana", + 'application/cals-1840': { + source: 'iana', }, - "application/captive+json": { - source: "iana", + 'application/captive+json': { + source: 'iana', compressible: true, }, - "application/cbor": { - source: "iana", + 'application/cbor': { + source: 'iana', }, - "application/cbor-seq": { - source: "iana", + 'application/cbor-seq': { + source: 'iana', }, - "application/cccex": { - source: "iana", + 'application/cccex': { + source: 'iana', }, - "application/ccmp+xml": { - source: "iana", + 'application/ccmp+xml': { + source: 'iana', compressible: true, }, - "application/ccxml+xml": { - source: "iana", + 'application/ccxml+xml': { + source: 'iana', compressible: true, - extensions: ["ccxml"], + extensions: ['ccxml'], }, - "application/cda+xml": { - source: "iana", - charset: "UTF-8", + 'application/cda+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/cdfx+xml": { - source: "iana", + 'application/cdfx+xml': { + source: 'iana', compressible: true, - extensions: ["cdfx"], + extensions: ['cdfx'], }, - "application/cdmi-capability": { - source: "iana", - extensions: ["cdmia"], + 'application/cdmi-capability': { + source: 'iana', + extensions: ['cdmia'], }, - "application/cdmi-container": { - source: "iana", - extensions: ["cdmic"], + 'application/cdmi-container': { + source: 'iana', + extensions: ['cdmic'], }, - "application/cdmi-domain": { - source: "iana", - extensions: ["cdmid"], + 'application/cdmi-domain': { + source: 'iana', + extensions: ['cdmid'], }, - "application/cdmi-object": { - source: "iana", - extensions: ["cdmio"], + 'application/cdmi-object': { + source: 'iana', + extensions: ['cdmio'], }, - "application/cdmi-queue": { - source: "iana", - extensions: ["cdmiq"], + 'application/cdmi-queue': { + source: 'iana', + extensions: ['cdmiq'], }, - "application/cdni": { - source: "iana", + 'application/cdni': { + source: 'iana', }, - "application/cea": { - source: "iana", + 'application/cea': { + source: 'iana', }, - "application/cea-2018+xml": { - source: "iana", + 'application/cea-2018+xml': { + source: 'iana', compressible: true, }, - "application/cellml+xml": { - source: "iana", + 'application/cellml+xml': { + source: 'iana', compressible: true, }, - "application/cfw": { - source: "iana", + 'application/cfw': { + source: 'iana', }, - "application/city+json": { - source: "iana", + 'application/city+json': { + source: 'iana', compressible: true, }, - "application/clr": { - source: "iana", + 'application/clr': { + source: 'iana', }, - "application/clue+xml": { - source: "iana", + 'application/clue+xml': { + source: 'iana', compressible: true, }, - "application/clue_info+xml": { - source: "iana", + 'application/clue_info+xml': { + source: 'iana', compressible: true, }, - "application/cms": { - source: "iana", + 'application/cms': { + source: 'iana', }, - "application/cnrp+xml": { - source: "iana", + 'application/cnrp+xml': { + source: 'iana', compressible: true, }, - "application/coap-group+json": { - source: "iana", + 'application/coap-group+json': { + source: 'iana', compressible: true, }, - "application/coap-payload": { - source: "iana", + 'application/coap-payload': { + source: 'iana', }, - "application/commonground": { - source: "iana", + 'application/commonground': { + source: 'iana', }, - "application/concise-problem-details+cbor": { - source: "iana", + 'application/concise-problem-details+cbor': { + source: 'iana', }, - "application/conference-info+xml": { - source: "iana", + 'application/conference-info+xml': { + source: 'iana', compressible: true, }, - "application/cose": { - source: "iana", + 'application/cose': { + source: 'iana', }, - "application/cose-key": { - source: "iana", + 'application/cose-key': { + source: 'iana', }, - "application/cose-key-set": { - source: "iana", + 'application/cose-key-set': { + source: 'iana', }, - "application/cose-x509": { - source: "iana", + 'application/cose-x509': { + source: 'iana', }, - "application/cpl+xml": { - source: "iana", + 'application/cpl+xml': { + source: 'iana', compressible: true, - extensions: ["cpl"], + extensions: ['cpl'], }, - "application/csrattrs": { - source: "iana", + 'application/csrattrs': { + source: 'iana', }, - "application/csta+xml": { - source: "iana", + 'application/csta+xml': { + source: 'iana', compressible: true, }, - "application/cstadata+xml": { - source: "iana", + 'application/cstadata+xml': { + source: 'iana', compressible: true, }, - "application/csvm+json": { - source: "iana", + 'application/csvm+json': { + source: 'iana', compressible: true, }, - "application/cu-seeme": { - source: "apache", - extensions: ["cu"], + 'application/cu-seeme': { + source: 'apache', + extensions: ['cu'], }, - "application/cwl": { - source: "iana", - extensions: ["cwl"], + 'application/cwl': { + source: 'iana', + extensions: ['cwl'], }, - "application/cwl+json": { - source: "iana", + 'application/cwl+json': { + source: 'iana', compressible: true, }, - "application/cwt": { - source: "iana", + 'application/cwt': { + source: 'iana', }, - "application/cybercash": { - source: "iana", + 'application/cybercash': { + source: 'iana', }, - "application/dart": { + 'application/dart': { compressible: true, }, - "application/dash+xml": { - source: "iana", + 'application/dash+xml': { + source: 'iana', compressible: true, - extensions: ["mpd"], + extensions: ['mpd'], }, - "application/dash-patch+xml": { - source: "iana", + 'application/dash-patch+xml': { + source: 'iana', compressible: true, - extensions: ["mpp"], + extensions: ['mpp'], }, - "application/dashdelta": { - source: "iana", + 'application/dashdelta': { + source: 'iana', }, - "application/davmount+xml": { - source: "iana", + 'application/davmount+xml': { + source: 'iana', compressible: true, - extensions: ["davmount"], + extensions: ['davmount'], }, - "application/dca-rft": { - source: "iana", + 'application/dca-rft': { + source: 'iana', }, - "application/dcd": { - source: "iana", + 'application/dcd': { + source: 'iana', }, - "application/dec-dx": { - source: "iana", + 'application/dec-dx': { + source: 'iana', }, - "application/dialog-info+xml": { - source: "iana", + 'application/dialog-info+xml': { + source: 'iana', compressible: true, }, - "application/dicom": { - source: "iana", + 'application/dicom': { + source: 'iana', }, - "application/dicom+json": { - source: "iana", + 'application/dicom+json': { + source: 'iana', compressible: true, }, - "application/dicom+xml": { - source: "iana", + 'application/dicom+xml': { + source: 'iana', compressible: true, }, - "application/dii": { - source: "iana", + 'application/dii': { + source: 'iana', }, - "application/dit": { - source: "iana", + 'application/dit': { + source: 'iana', }, - "application/dns": { - source: "iana", + 'application/dns': { + source: 'iana', }, - "application/dns+json": { - source: "iana", + 'application/dns+json': { + source: 'iana', compressible: true, }, - "application/dns-message": { - source: "iana", + 'application/dns-message': { + source: 'iana', }, - "application/docbook+xml": { - source: "apache", + 'application/docbook+xml': { + source: 'apache', compressible: true, - extensions: ["dbk"], + extensions: ['dbk'], }, - "application/dots+cbor": { - source: "iana", + 'application/dots+cbor': { + source: 'iana', }, - "application/dskpp+xml": { - source: "iana", + 'application/dskpp+xml': { + source: 'iana', compressible: true, }, - "application/dssc+der": { - source: "iana", - extensions: ["dssc"], + 'application/dssc+der': { + source: 'iana', + extensions: ['dssc'], }, - "application/dssc+xml": { - source: "iana", + 'application/dssc+xml': { + source: 'iana', compressible: true, - extensions: ["xdssc"], + extensions: ['xdssc'], }, - "application/dvcs": { - source: "iana", + 'application/dvcs': { + source: 'iana', }, - "application/ecmascript": { - source: "apache", + 'application/ecmascript': { + source: 'apache', compressible: true, - extensions: ["ecma"], + extensions: ['ecma'], }, - "application/edi-consent": { - source: "iana", + 'application/edi-consent': { + source: 'iana', }, - "application/edi-x12": { - source: "iana", + 'application/edi-x12': { + source: 'iana', compressible: false, }, - "application/edifact": { - source: "iana", + 'application/edifact': { + source: 'iana', compressible: false, }, - "application/efi": { - source: "iana", + 'application/efi': { + source: 'iana', }, - "application/elm+json": { - source: "iana", - charset: "UTF-8", + 'application/elm+json': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/elm+xml": { - source: "iana", + 'application/elm+xml': { + source: 'iana', compressible: true, }, - "application/emergencycalldata.cap+xml": { - source: "iana", - charset: "UTF-8", + 'application/emergencycalldata.cap+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/emergencycalldata.comment+xml": { - source: "iana", + 'application/emergencycalldata.comment+xml': { + source: 'iana', compressible: true, }, - "application/emergencycalldata.control+xml": { - source: "iana", + 'application/emergencycalldata.control+xml': { + source: 'iana', compressible: true, }, - "application/emergencycalldata.deviceinfo+xml": { - source: "iana", + 'application/emergencycalldata.deviceinfo+xml': { + source: 'iana', compressible: true, }, - "application/emergencycalldata.ecall.msd": { - source: "iana", + 'application/emergencycalldata.ecall.msd': { + source: 'iana', }, - "application/emergencycalldata.legacyesn+json": { - source: "iana", + 'application/emergencycalldata.legacyesn+json': { + source: 'iana', compressible: true, }, - "application/emergencycalldata.providerinfo+xml": { - source: "iana", + 'application/emergencycalldata.providerinfo+xml': { + source: 'iana', compressible: true, }, - "application/emergencycalldata.serviceinfo+xml": { - source: "iana", + 'application/emergencycalldata.serviceinfo+xml': { + source: 'iana', compressible: true, }, - "application/emergencycalldata.subscriberinfo+xml": { - source: "iana", + 'application/emergencycalldata.subscriberinfo+xml': { + source: 'iana', compressible: true, }, - "application/emergencycalldata.veds+xml": { - source: "iana", + 'application/emergencycalldata.veds+xml': { + source: 'iana', compressible: true, }, - "application/emma+xml": { - source: "iana", + 'application/emma+xml': { + source: 'iana', compressible: true, - extensions: ["emma"], + extensions: ['emma'], }, - "application/emotionml+xml": { - source: "iana", + 'application/emotionml+xml': { + source: 'iana', compressible: true, - extensions: ["emotionml"], + extensions: ['emotionml'], }, - "application/encaprtp": { - source: "iana", + 'application/encaprtp': { + source: 'iana', }, - "application/epp+xml": { - source: "iana", + 'application/epp+xml': { + source: 'iana', compressible: true, }, - "application/epub+zip": { - source: "iana", + 'application/epub+zip': { + source: 'iana', compressible: false, - extensions: ["epub"], + extensions: ['epub'], }, - "application/eshop": { - source: "iana", + 'application/eshop': { + source: 'iana', }, - "application/exi": { - source: "iana", - extensions: ["exi"], + 'application/exi': { + source: 'iana', + extensions: ['exi'], }, - "application/expect-ct-report+json": { - source: "iana", + 'application/expect-ct-report+json': { + source: 'iana', compressible: true, }, - "application/express": { - source: "iana", - extensions: ["exp"], + 'application/express': { + source: 'iana', + extensions: ['exp'], }, - "application/fastinfoset": { - source: "iana", + 'application/fastinfoset': { + source: 'iana', }, - "application/fastsoap": { - source: "iana", + 'application/fastsoap': { + source: 'iana', }, - "application/fdf": { - source: "iana", - extensions: ["fdf"], + 'application/fdf': { + source: 'iana', + extensions: ['fdf'], }, - "application/fdt+xml": { - source: "iana", + 'application/fdt+xml': { + source: 'iana', compressible: true, - extensions: ["fdt"], + extensions: ['fdt'], }, - "application/fhir+json": { - source: "iana", - charset: "UTF-8", + 'application/fhir+json': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/fhir+xml": { - source: "iana", - charset: "UTF-8", + 'application/fhir+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/fido.trusted-apps+json": { + 'application/fido.trusted-apps+json': { compressible: true, }, - "application/fits": { - source: "iana", + 'application/fits': { + source: 'iana', }, - "application/flexfec": { - source: "iana", + 'application/flexfec': { + source: 'iana', }, - "application/font-sfnt": { - source: "iana", + 'application/font-sfnt': { + source: 'iana', }, - "application/font-tdpfr": { - source: "iana", - extensions: ["pfr"], + 'application/font-tdpfr': { + source: 'iana', + extensions: ['pfr'], }, - "application/font-woff": { - source: "iana", + 'application/font-woff': { + source: 'iana', compressible: false, }, - "application/framework-attributes+xml": { - source: "iana", + 'application/framework-attributes+xml': { + source: 'iana', compressible: true, }, - "application/geo+json": { - source: "iana", + 'application/geo+json': { + source: 'iana', compressible: true, - extensions: ["geojson"], + extensions: ['geojson'], }, - "application/geo+json-seq": { - source: "iana", + 'application/geo+json-seq': { + source: 'iana', }, - "application/geopackage+sqlite3": { - source: "iana", + 'application/geopackage+sqlite3': { + source: 'iana', }, - "application/geoxacml+xml": { - source: "iana", + 'application/geoxacml+xml': { + source: 'iana', compressible: true, }, - "application/gltf-buffer": { - source: "iana", + 'application/gltf-buffer': { + source: 'iana', }, - "application/gml+xml": { - source: "iana", + 'application/gml+xml': { + source: 'iana', compressible: true, - extensions: ["gml"], + extensions: ['gml'], }, - "application/gpx+xml": { - source: "apache", + 'application/gpx+xml': { + source: 'apache', compressible: true, - extensions: ["gpx"], + extensions: ['gpx'], }, - "application/gxf": { - source: "apache", - extensions: ["gxf"], + 'application/gxf': { + source: 'apache', + extensions: ['gxf'], }, - "application/gzip": { - source: "iana", + 'application/gzip': { + source: 'iana', compressible: false, - extensions: ["gz"], + extensions: ['gz'], }, - "application/h224": { - source: "iana", + 'application/h224': { + source: 'iana', }, - "application/held+xml": { - source: "iana", + 'application/held+xml': { + source: 'iana', compressible: true, }, - "application/hjson": { - extensions: ["hjson"], + 'application/hjson': { + extensions: ['hjson'], }, - "application/hl7v2+xml": { - source: "iana", - charset: "UTF-8", + 'application/hl7v2+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/http": { - source: "iana", + 'application/http': { + source: 'iana', }, - "application/hyperstudio": { - source: "iana", - extensions: ["stk"], + 'application/hyperstudio': { + source: 'iana', + extensions: ['stk'], }, - "application/ibe-key-request+xml": { - source: "iana", + 'application/ibe-key-request+xml': { + source: 'iana', compressible: true, }, - "application/ibe-pkg-reply+xml": { - source: "iana", + 'application/ibe-pkg-reply+xml': { + source: 'iana', compressible: true, }, - "application/ibe-pp-data": { - source: "iana", + 'application/ibe-pp-data': { + source: 'iana', }, - "application/iges": { - source: "iana", + 'application/iges': { + source: 'iana', }, - "application/im-iscomposing+xml": { - source: "iana", - charset: "UTF-8", + 'application/im-iscomposing+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/index": { - source: "iana", + 'application/index': { + source: 'iana', }, - "application/index.cmd": { - source: "iana", + 'application/index.cmd': { + source: 'iana', }, - "application/index.obj": { - source: "iana", + 'application/index.obj': { + source: 'iana', }, - "application/index.response": { - source: "iana", + 'application/index.response': { + source: 'iana', }, - "application/index.vnd": { - source: "iana", + 'application/index.vnd': { + source: 'iana', }, - "application/inkml+xml": { - source: "iana", + 'application/inkml+xml': { + source: 'iana', compressible: true, - extensions: ["ink", "inkml"], + extensions: ['ink', 'inkml'], }, - "application/iotp": { - source: "iana", + 'application/iotp': { + source: 'iana', }, - "application/ipfix": { - source: "iana", - extensions: ["ipfix"], + 'application/ipfix': { + source: 'iana', + extensions: ['ipfix'], }, - "application/ipp": { - source: "iana", + 'application/ipp': { + source: 'iana', }, - "application/isup": { - source: "iana", + 'application/isup': { + source: 'iana', }, - "application/its+xml": { - source: "iana", + 'application/its+xml': { + source: 'iana', compressible: true, - extensions: ["its"], + extensions: ['its'], }, - "application/java-archive": { - source: "apache", + 'application/java-archive': { + source: 'apache', compressible: false, - extensions: ["jar", "war", "ear"], + extensions: ['jar', 'war', 'ear'], }, - "application/java-serialized-object": { - source: "apache", + 'application/java-serialized-object': { + source: 'apache', compressible: false, - extensions: ["ser"], + extensions: ['ser'], }, - "application/java-vm": { - source: "apache", + 'application/java-vm': { + source: 'apache', compressible: false, - extensions: ["class"], + extensions: ['class'], }, - "application/javascript": { - source: "apache", - charset: "UTF-8", + 'application/javascript': { + source: 'apache', + charset: 'UTF-8', compressible: true, - extensions: ["js"], + extensions: ['js'], }, - "application/jf2feed+json": { - source: "iana", + 'application/jf2feed+json': { + source: 'iana', compressible: true, }, - "application/jose": { - source: "iana", + 'application/jose': { + source: 'iana', }, - "application/jose+json": { - source: "iana", + 'application/jose+json': { + source: 'iana', compressible: true, }, - "application/jrd+json": { - source: "iana", + 'application/jrd+json': { + source: 'iana', compressible: true, }, - "application/jscalendar+json": { - source: "iana", + 'application/jscalendar+json': { + source: 'iana', compressible: true, }, - "application/json": { - source: "iana", - charset: "UTF-8", + 'application/json': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["json", "map"], + extensions: ['json', 'map'], }, - "application/json-patch+json": { - source: "iana", + 'application/json-patch+json': { + source: 'iana', compressible: true, }, - "application/json-seq": { - source: "iana", + 'application/json-seq': { + source: 'iana', }, - "application/json5": { - extensions: ["json5"], + 'application/json5': { + extensions: ['json5'], }, - "application/jsonml+json": { - source: "apache", + 'application/jsonml+json': { + source: 'apache', compressible: true, - extensions: ["jsonml"], + extensions: ['jsonml'], }, - "application/jwk+json": { - source: "iana", + 'application/jwk+json': { + source: 'iana', compressible: true, }, - "application/jwk-set+json": { - source: "iana", + 'application/jwk-set+json': { + source: 'iana', compressible: true, }, - "application/jwt": { - source: "iana", + 'application/jwt': { + source: 'iana', }, - "application/kpml-request+xml": { - source: "iana", + 'application/kpml-request+xml': { + source: 'iana', compressible: true, }, - "application/kpml-response+xml": { - source: "iana", + 'application/kpml-response+xml': { + source: 'iana', compressible: true, }, - "application/ld+json": { - source: "iana", + 'application/ld+json': { + source: 'iana', compressible: true, - extensions: ["jsonld"], + extensions: ['jsonld'], }, - "application/lgr+xml": { - source: "iana", + 'application/lgr+xml': { + source: 'iana', compressible: true, - extensions: ["lgr"], + extensions: ['lgr'], }, - "application/link-format": { - source: "iana", + 'application/link-format': { + source: 'iana', }, - "application/linkset": { - source: "iana", + 'application/linkset': { + source: 'iana', }, - "application/linkset+json": { - source: "iana", + 'application/linkset+json': { + source: 'iana', compressible: true, }, - "application/load-control+xml": { - source: "iana", + 'application/load-control+xml': { + source: 'iana', compressible: true, }, - "application/logout+jwt": { - source: "iana", + 'application/logout+jwt': { + source: 'iana', }, - "application/lost+xml": { - source: "iana", + 'application/lost+xml': { + source: 'iana', compressible: true, - extensions: ["lostxml"], + extensions: ['lostxml'], }, - "application/lostsync+xml": { - source: "iana", + 'application/lostsync+xml': { + source: 'iana', compressible: true, }, - "application/lpf+zip": { - source: "iana", + 'application/lpf+zip': { + source: 'iana', compressible: false, }, - "application/lxf": { - source: "iana", + 'application/lxf': { + source: 'iana', }, - "application/mac-binhex40": { - source: "iana", - extensions: ["hqx"], + 'application/mac-binhex40': { + source: 'iana', + extensions: ['hqx'], }, - "application/mac-compactpro": { - source: "apache", - extensions: ["cpt"], + 'application/mac-compactpro': { + source: 'apache', + extensions: ['cpt'], }, - "application/macwriteii": { - source: "iana", + 'application/macwriteii': { + source: 'iana', }, - "application/mads+xml": { - source: "iana", + 'application/mads+xml': { + source: 'iana', compressible: true, - extensions: ["mads"], + extensions: ['mads'], }, - "application/manifest+json": { - source: "iana", - charset: "UTF-8", + 'application/manifest+json': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["webmanifest"], + extensions: ['webmanifest'], }, - "application/marc": { - source: "iana", - extensions: ["mrc"], + 'application/marc': { + source: 'iana', + extensions: ['mrc'], }, - "application/marcxml+xml": { - source: "iana", + 'application/marcxml+xml': { + source: 'iana', compressible: true, - extensions: ["mrcx"], + extensions: ['mrcx'], }, - "application/mathematica": { - source: "iana", - extensions: ["ma", "nb", "mb"], + 'application/mathematica': { + source: 'iana', + extensions: ['ma', 'nb', 'mb'], }, - "application/mathml+xml": { - source: "iana", + 'application/mathml+xml': { + source: 'iana', compressible: true, - extensions: ["mathml"], + extensions: ['mathml'], }, - "application/mathml-content+xml": { - source: "iana", + 'application/mathml-content+xml': { + source: 'iana', compressible: true, }, - "application/mathml-presentation+xml": { - source: "iana", + 'application/mathml-presentation+xml': { + source: 'iana', compressible: true, }, - "application/mbms-associated-procedure-description+xml": { - source: "iana", + 'application/mbms-associated-procedure-description+xml': { + source: 'iana', compressible: true, }, - "application/mbms-deregister+xml": { - source: "iana", + 'application/mbms-deregister+xml': { + source: 'iana', compressible: true, }, - "application/mbms-envelope+xml": { - source: "iana", + 'application/mbms-envelope+xml': { + source: 'iana', compressible: true, }, - "application/mbms-msk+xml": { - source: "iana", + 'application/mbms-msk+xml': { + source: 'iana', compressible: true, }, - "application/mbms-msk-response+xml": { - source: "iana", + 'application/mbms-msk-response+xml': { + source: 'iana', compressible: true, }, - "application/mbms-protection-description+xml": { - source: "iana", + 'application/mbms-protection-description+xml': { + source: 'iana', compressible: true, }, - "application/mbms-reception-report+xml": { - source: "iana", + 'application/mbms-reception-report+xml': { + source: 'iana', compressible: true, }, - "application/mbms-register+xml": { - source: "iana", + 'application/mbms-register+xml': { + source: 'iana', compressible: true, }, - "application/mbms-register-response+xml": { - source: "iana", + 'application/mbms-register-response+xml': { + source: 'iana', compressible: true, }, - "application/mbms-schedule+xml": { - source: "iana", + 'application/mbms-schedule+xml': { + source: 'iana', compressible: true, }, - "application/mbms-user-service-description+xml": { - source: "iana", + 'application/mbms-user-service-description+xml': { + source: 'iana', compressible: true, }, - "application/mbox": { - source: "iana", - extensions: ["mbox"], + 'application/mbox': { + source: 'iana', + extensions: ['mbox'], }, - "application/media-policy-dataset+xml": { - source: "iana", + 'application/media-policy-dataset+xml': { + source: 'iana', compressible: true, - extensions: ["mpf"], + extensions: ['mpf'], }, - "application/media_control+xml": { - source: "iana", + 'application/media_control+xml': { + source: 'iana', compressible: true, }, - "application/mediaservercontrol+xml": { - source: "iana", + 'application/mediaservercontrol+xml': { + source: 'iana', compressible: true, - extensions: ["mscml"], + extensions: ['mscml'], }, - "application/merge-patch+json": { - source: "iana", + 'application/merge-patch+json': { + source: 'iana', compressible: true, }, - "application/metalink+xml": { - source: "apache", + 'application/metalink+xml': { + source: 'apache', compressible: true, - extensions: ["metalink"], + extensions: ['metalink'], }, - "application/metalink4+xml": { - source: "iana", + 'application/metalink4+xml': { + source: 'iana', compressible: true, - extensions: ["meta4"], + extensions: ['meta4'], }, - "application/mets+xml": { - source: "iana", + 'application/mets+xml': { + source: 'iana', compressible: true, - extensions: ["mets"], + extensions: ['mets'], }, - "application/mf4": { - source: "iana", + 'application/mf4': { + source: 'iana', }, - "application/mikey": { - source: "iana", + 'application/mikey': { + source: 'iana', }, - "application/mipc": { - source: "iana", + 'application/mipc': { + source: 'iana', }, - "application/missing-blocks+cbor-seq": { - source: "iana", + 'application/missing-blocks+cbor-seq': { + source: 'iana', }, - "application/mmt-aei+xml": { - source: "iana", + 'application/mmt-aei+xml': { + source: 'iana', compressible: true, - extensions: ["maei"], + extensions: ['maei'], }, - "application/mmt-usd+xml": { - source: "iana", + 'application/mmt-usd+xml': { + source: 'iana', compressible: true, - extensions: ["musd"], + extensions: ['musd'], }, - "application/mods+xml": { - source: "iana", + 'application/mods+xml': { + source: 'iana', compressible: true, - extensions: ["mods"], + extensions: ['mods'], }, - "application/moss-keys": { - source: "iana", + 'application/moss-keys': { + source: 'iana', }, - "application/moss-signature": { - source: "iana", + 'application/moss-signature': { + source: 'iana', }, - "application/mosskey-data": { - source: "iana", + 'application/mosskey-data': { + source: 'iana', }, - "application/mosskey-request": { - source: "iana", + 'application/mosskey-request': { + source: 'iana', }, - "application/mp21": { - source: "iana", - extensions: ["m21", "mp21"], + 'application/mp21': { + source: 'iana', + extensions: ['m21', 'mp21'], }, - "application/mp4": { - source: "iana", - extensions: ["mp4", "mpg4", "mp4s", "m4p"], + 'application/mp4': { + source: 'iana', + extensions: ['mp4', 'mpg4', 'mp4s', 'm4p'], }, - "application/mpeg4-generic": { - source: "iana", + 'application/mpeg4-generic': { + source: 'iana', }, - "application/mpeg4-iod": { - source: "iana", + 'application/mpeg4-iod': { + source: 'iana', }, - "application/mpeg4-iod-xmt": { - source: "iana", + 'application/mpeg4-iod-xmt': { + source: 'iana', }, - "application/mrb-consumer+xml": { - source: "iana", + 'application/mrb-consumer+xml': { + source: 'iana', compressible: true, }, - "application/mrb-publish+xml": { - source: "iana", + 'application/mrb-publish+xml': { + source: 'iana', compressible: true, }, - "application/msc-ivr+xml": { - source: "iana", - charset: "UTF-8", + 'application/msc-ivr+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/msc-mixer+xml": { - source: "iana", - charset: "UTF-8", + 'application/msc-mixer+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/msix": { + 'application/msix': { compressible: false, - extensions: ["msix"], + extensions: ['msix'], }, - "application/msixbundle": { + 'application/msixbundle': { compressible: false, - extensions: ["msixbundle"], + extensions: ['msixbundle'], }, - "application/msword": { - source: "iana", + 'application/msword': { + source: 'iana', compressible: false, - extensions: ["doc", "dot"], + extensions: ['doc', 'dot'], }, - "application/mud+json": { - source: "iana", + 'application/mud+json': { + source: 'iana', compressible: true, }, - "application/multipart-core": { - source: "iana", + 'application/multipart-core': { + source: 'iana', }, - "application/mxf": { - source: "iana", - extensions: ["mxf"], + 'application/mxf': { + source: 'iana', + extensions: ['mxf'], }, - "application/n-quads": { - source: "iana", - extensions: ["nq"], + 'application/n-quads': { + source: 'iana', + extensions: ['nq'], }, - "application/n-triples": { - source: "iana", - extensions: ["nt"], + 'application/n-triples': { + source: 'iana', + extensions: ['nt'], }, - "application/nasdata": { - source: "iana", + 'application/nasdata': { + source: 'iana', }, - "application/news-checkgroups": { - source: "iana", - charset: "US-ASCII", + 'application/news-checkgroups': { + source: 'iana', + charset: 'US-ASCII', }, - "application/news-groupinfo": { - source: "iana", - charset: "US-ASCII", + 'application/news-groupinfo': { + source: 'iana', + charset: 'US-ASCII', }, - "application/news-transmission": { - source: "iana", + 'application/news-transmission': { + source: 'iana', }, - "application/nlsml+xml": { - source: "iana", + 'application/nlsml+xml': { + source: 'iana', compressible: true, }, - "application/node": { - source: "iana", - extensions: ["cjs"], + 'application/node': { + source: 'iana', + extensions: ['cjs'], }, - "application/nss": { - source: "iana", + 'application/nss': { + source: 'iana', }, - "application/oauth-authz-req+jwt": { - source: "iana", + 'application/oauth-authz-req+jwt': { + source: 'iana', }, - "application/oblivious-dns-message": { - source: "iana", + 'application/oblivious-dns-message': { + source: 'iana', }, - "application/ocsp-request": { - source: "iana", + 'application/ocsp-request': { + source: 'iana', }, - "application/ocsp-response": { - source: "iana", + 'application/ocsp-response': { + source: 'iana', }, - "application/octet-stream": { - source: "iana", + 'application/octet-stream': { + source: 'iana', compressible: false, extensions: [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy", - "exe", - "dll", - "deb", - "dmg", - "iso", - "img", - "msi", - "msp", - "msm", - "buffer", + 'bin', + 'dms', + 'lrf', + 'mar', + 'so', + 'dist', + 'distz', + 'pkg', + 'bpk', + 'dump', + 'elc', + 'deploy', + 'exe', + 'dll', + 'deb', + 'dmg', + 'iso', + 'img', + 'msi', + 'msp', + 'msm', + 'buffer', ], }, - "application/oda": { - source: "iana", - extensions: ["oda"], + 'application/oda': { + source: 'iana', + extensions: ['oda'], }, - "application/odm+xml": { - source: "iana", + 'application/odm+xml': { + source: 'iana', compressible: true, }, - "application/odx": { - source: "iana", + 'application/odx': { + source: 'iana', }, - "application/oebps-package+xml": { - source: "iana", + 'application/oebps-package+xml': { + source: 'iana', compressible: true, - extensions: ["opf"], + extensions: ['opf'], }, - "application/ogg": { - source: "iana", + 'application/ogg': { + source: 'iana', compressible: false, - extensions: ["ogx"], + extensions: ['ogx'], }, - "application/omdoc+xml": { - source: "apache", + 'application/omdoc+xml': { + source: 'apache', compressible: true, - extensions: ["omdoc"], + extensions: ['omdoc'], }, - "application/onenote": { - source: "apache", - extensions: ["onetoc", "onetoc2", "onetmp", "onepkg"], + 'application/onenote': { + source: 'apache', + extensions: ['onetoc', 'onetoc2', 'onetmp', 'onepkg'], }, - "application/opc-nodeset+xml": { - source: "iana", + 'application/opc-nodeset+xml': { + source: 'iana', compressible: true, }, - "application/oscore": { - source: "iana", + 'application/oscore': { + source: 'iana', }, - "application/oxps": { - source: "iana", - extensions: ["oxps"], + 'application/oxps': { + source: 'iana', + extensions: ['oxps'], }, - "application/p21": { - source: "iana", + 'application/p21': { + source: 'iana', }, - "application/p21+zip": { - source: "iana", + 'application/p21+zip': { + source: 'iana', compressible: false, }, - "application/p2p-overlay+xml": { - source: "iana", + 'application/p2p-overlay+xml': { + source: 'iana', compressible: true, - extensions: ["relo"], + extensions: ['relo'], }, - "application/parityfec": { - source: "iana", + 'application/parityfec': { + source: 'iana', }, - "application/passport": { - source: "iana", + 'application/passport': { + source: 'iana', }, - "application/patch-ops-error+xml": { - source: "iana", + 'application/patch-ops-error+xml': { + source: 'iana', compressible: true, - extensions: ["xer"], + extensions: ['xer'], }, - "application/pdf": { - source: "iana", + 'application/pdf': { + source: 'iana', compressible: false, - extensions: ["pdf"], + extensions: ['pdf'], }, - "application/pdx": { - source: "iana", + 'application/pdx': { + source: 'iana', }, - "application/pem-certificate-chain": { - source: "iana", + 'application/pem-certificate-chain': { + source: 'iana', }, - "application/pgp-encrypted": { - source: "iana", + 'application/pgp-encrypted': { + source: 'iana', compressible: false, - extensions: ["pgp"], + extensions: ['pgp'], }, - "application/pgp-keys": { - source: "iana", - extensions: ["asc"], + 'application/pgp-keys': { + source: 'iana', + extensions: ['asc'], }, - "application/pgp-signature": { - source: "iana", - extensions: ["sig", "asc"], + 'application/pgp-signature': { + source: 'iana', + extensions: ['sig', 'asc'], }, - "application/pics-rules": { - source: "apache", - extensions: ["prf"], + 'application/pics-rules': { + source: 'apache', + extensions: ['prf'], }, - "application/pidf+xml": { - source: "iana", - charset: "UTF-8", + 'application/pidf+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/pidf-diff+xml": { - source: "iana", - charset: "UTF-8", + 'application/pidf-diff+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/pkcs10": { - source: "iana", - extensions: ["p10"], + 'application/pkcs10': { + source: 'iana', + extensions: ['p10'], }, - "application/pkcs12": { - source: "iana", + 'application/pkcs12': { + source: 'iana', }, - "application/pkcs7-mime": { - source: "iana", - extensions: ["p7m", "p7c"], + 'application/pkcs7-mime': { + source: 'iana', + extensions: ['p7m', 'p7c'], }, - "application/pkcs7-signature": { - source: "iana", - extensions: ["p7s"], + 'application/pkcs7-signature': { + source: 'iana', + extensions: ['p7s'], }, - "application/pkcs8": { - source: "iana", - extensions: ["p8"], + 'application/pkcs8': { + source: 'iana', + extensions: ['p8'], }, - "application/pkcs8-encrypted": { - source: "iana", + 'application/pkcs8-encrypted': { + source: 'iana', }, - "application/pkix-attr-cert": { - source: "iana", - extensions: ["ac"], + 'application/pkix-attr-cert': { + source: 'iana', + extensions: ['ac'], }, - "application/pkix-cert": { - source: "iana", - extensions: ["cer"], + 'application/pkix-cert': { + source: 'iana', + extensions: ['cer'], }, - "application/pkix-crl": { - source: "iana", - extensions: ["crl"], + 'application/pkix-crl': { + source: 'iana', + extensions: ['crl'], }, - "application/pkix-pkipath": { - source: "iana", - extensions: ["pkipath"], + 'application/pkix-pkipath': { + source: 'iana', + extensions: ['pkipath'], }, - "application/pkixcmp": { - source: "iana", - extensions: ["pki"], + 'application/pkixcmp': { + source: 'iana', + extensions: ['pki'], }, - "application/pls+xml": { - source: "iana", + 'application/pls+xml': { + source: 'iana', compressible: true, - extensions: ["pls"], + extensions: ['pls'], }, - "application/poc-settings+xml": { - source: "iana", - charset: "UTF-8", + 'application/poc-settings+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/postscript": { - source: "iana", + 'application/postscript': { + source: 'iana', compressible: true, - extensions: ["ai", "eps", "ps"], + extensions: ['ai', 'eps', 'ps'], }, - "application/ppsp-tracker+json": { - source: "iana", + 'application/ppsp-tracker+json': { + source: 'iana', compressible: true, }, - "application/problem+json": { - source: "iana", + 'application/problem+json': { + source: 'iana', compressible: true, }, - "application/problem+xml": { - source: "iana", + 'application/problem+xml': { + source: 'iana', compressible: true, }, - "application/provenance+xml": { - source: "iana", + 'application/provenance+xml': { + source: 'iana', compressible: true, - extensions: ["provx"], + extensions: ['provx'], }, - "application/prs.alvestrand.titrax-sheet": { - source: "iana", + 'application/prs.alvestrand.titrax-sheet': { + source: 'iana', }, - "application/prs.cww": { - source: "iana", - extensions: ["cww"], + 'application/prs.cww': { + source: 'iana', + extensions: ['cww'], }, - "application/prs.cyn": { - source: "iana", - charset: "7-BIT", + 'application/prs.cyn': { + source: 'iana', + charset: '7-BIT', }, - "application/prs.hpub+zip": { - source: "iana", + 'application/prs.hpub+zip': { + source: 'iana', compressible: false, }, - "application/prs.nprend": { - source: "iana", + 'application/prs.nprend': { + source: 'iana', }, - "application/prs.plucker": { - source: "iana", + 'application/prs.plucker': { + source: 'iana', }, - "application/prs.rdf-xml-crypt": { - source: "iana", + 'application/prs.rdf-xml-crypt': { + source: 'iana', }, - "application/prs.xsf+xml": { - source: "iana", + 'application/prs.xsf+xml': { + source: 'iana', compressible: true, - extensions: ["xsf"], + extensions: ['xsf'], }, - "application/pskc+xml": { - source: "iana", + 'application/pskc+xml': { + source: 'iana', compressible: true, - extensions: ["pskcxml"], + extensions: ['pskcxml'], }, - "application/pvd+json": { - source: "iana", + 'application/pvd+json': { + source: 'iana', compressible: true, }, - "application/qsig": { - source: "iana", + 'application/qsig': { + source: 'iana', }, - "application/raml+yaml": { + 'application/raml+yaml': { compressible: true, - extensions: ["raml"], + extensions: ['raml'], }, - "application/raptorfec": { - source: "iana", + 'application/raptorfec': { + source: 'iana', }, - "application/rdap+json": { - source: "iana", + 'application/rdap+json': { + source: 'iana', compressible: true, }, - "application/rdf+xml": { - source: "iana", + 'application/rdf+xml': { + source: 'iana', compressible: true, - extensions: ["rdf", "owl"], + extensions: ['rdf', 'owl'], }, - "application/reginfo+xml": { - source: "iana", + 'application/reginfo+xml': { + source: 'iana', compressible: true, - extensions: ["rif"], + extensions: ['rif'], }, - "application/relax-ng-compact-syntax": { - source: "iana", - extensions: ["rnc"], + 'application/relax-ng-compact-syntax': { + source: 'iana', + extensions: ['rnc'], }, - "application/remote-printing": { - source: "apache", + 'application/remote-printing': { + source: 'apache', }, - "application/reputon+json": { - source: "iana", + 'application/reputon+json': { + source: 'iana', compressible: true, }, - "application/resource-lists+xml": { - source: "iana", + 'application/resource-lists+xml': { + source: 'iana', compressible: true, - extensions: ["rl"], + extensions: ['rl'], }, - "application/resource-lists-diff+xml": { - source: "iana", + 'application/resource-lists-diff+xml': { + source: 'iana', compressible: true, - extensions: ["rld"], + extensions: ['rld'], }, - "application/rfc+xml": { - source: "iana", + 'application/rfc+xml': { + source: 'iana', compressible: true, }, - "application/riscos": { - source: "iana", + 'application/riscos': { + source: 'iana', }, - "application/rlmi+xml": { - source: "iana", + 'application/rlmi+xml': { + source: 'iana', compressible: true, }, - "application/rls-services+xml": { - source: "iana", + 'application/rls-services+xml': { + source: 'iana', compressible: true, - extensions: ["rs"], + extensions: ['rs'], }, - "application/route-apd+xml": { - source: "iana", + 'application/route-apd+xml': { + source: 'iana', compressible: true, - extensions: ["rapd"], + extensions: ['rapd'], }, - "application/route-s-tsid+xml": { - source: "iana", + 'application/route-s-tsid+xml': { + source: 'iana', compressible: true, - extensions: ["sls"], + extensions: ['sls'], }, - "application/route-usd+xml": { - source: "iana", + 'application/route-usd+xml': { + source: 'iana', compressible: true, - extensions: ["rusd"], + extensions: ['rusd'], }, - "application/rpki-checklist": { - source: "iana", + 'application/rpki-checklist': { + source: 'iana', }, - "application/rpki-ghostbusters": { - source: "iana", - extensions: ["gbr"], + 'application/rpki-ghostbusters': { + source: 'iana', + extensions: ['gbr'], }, - "application/rpki-manifest": { - source: "iana", - extensions: ["mft"], + 'application/rpki-manifest': { + source: 'iana', + extensions: ['mft'], }, - "application/rpki-publication": { - source: "iana", + 'application/rpki-publication': { + source: 'iana', }, - "application/rpki-roa": { - source: "iana", - extensions: ["roa"], + 'application/rpki-roa': { + source: 'iana', + extensions: ['roa'], }, - "application/rpki-updown": { - source: "iana", + 'application/rpki-updown': { + source: 'iana', }, - "application/rsd+xml": { - source: "apache", + 'application/rsd+xml': { + source: 'apache', compressible: true, - extensions: ["rsd"], + extensions: ['rsd'], }, - "application/rss+xml": { - source: "apache", + 'application/rss+xml': { + source: 'apache', compressible: true, - extensions: ["rss"], + extensions: ['rss'], }, - "application/rtf": { - source: "iana", + 'application/rtf': { + source: 'iana', compressible: true, - extensions: ["rtf"], + extensions: ['rtf'], }, - "application/rtploopback": { - source: "iana", + 'application/rtploopback': { + source: 'iana', }, - "application/rtx": { - source: "iana", + 'application/rtx': { + source: 'iana', }, - "application/samlassertion+xml": { - source: "iana", + 'application/samlassertion+xml': { + source: 'iana', compressible: true, }, - "application/samlmetadata+xml": { - source: "iana", + 'application/samlmetadata+xml': { + source: 'iana', compressible: true, }, - "application/sarif+json": { - source: "iana", + 'application/sarif+json': { + source: 'iana', compressible: true, }, - "application/sarif-external-properties+json": { - source: "iana", + 'application/sarif-external-properties+json': { + source: 'iana', compressible: true, }, - "application/sbe": { - source: "iana", + 'application/sbe': { + source: 'iana', }, - "application/sbml+xml": { - source: "iana", + 'application/sbml+xml': { + source: 'iana', compressible: true, - extensions: ["sbml"], + extensions: ['sbml'], }, - "application/scaip+xml": { - source: "iana", + 'application/scaip+xml': { + source: 'iana', compressible: true, }, - "application/scim+json": { - source: "iana", + 'application/scim+json': { + source: 'iana', compressible: true, }, - "application/scvp-cv-request": { - source: "iana", - extensions: ["scq"], + 'application/scvp-cv-request': { + source: 'iana', + extensions: ['scq'], }, - "application/scvp-cv-response": { - source: "iana", - extensions: ["scs"], + 'application/scvp-cv-response': { + source: 'iana', + extensions: ['scs'], }, - "application/scvp-vp-request": { - source: "iana", - extensions: ["spq"], + 'application/scvp-vp-request': { + source: 'iana', + extensions: ['spq'], }, - "application/scvp-vp-response": { - source: "iana", - extensions: ["spp"], + 'application/scvp-vp-response': { + source: 'iana', + extensions: ['spp'], }, - "application/sdp": { - source: "iana", - extensions: ["sdp"], + 'application/sdp': { + source: 'iana', + extensions: ['sdp'], }, - "application/secevent+jwt": { - source: "iana", + 'application/secevent+jwt': { + source: 'iana', }, - "application/senml+cbor": { - source: "iana", + 'application/senml+cbor': { + source: 'iana', }, - "application/senml+json": { - source: "iana", + 'application/senml+json': { + source: 'iana', compressible: true, }, - "application/senml+xml": { - source: "iana", + 'application/senml+xml': { + source: 'iana', compressible: true, - extensions: ["senmlx"], + extensions: ['senmlx'], }, - "application/senml-etch+cbor": { - source: "iana", + 'application/senml-etch+cbor': { + source: 'iana', }, - "application/senml-etch+json": { - source: "iana", + 'application/senml-etch+json': { + source: 'iana', compressible: true, }, - "application/senml-exi": { - source: "iana", + 'application/senml-exi': { + source: 'iana', }, - "application/sensml+cbor": { - source: "iana", + 'application/sensml+cbor': { + source: 'iana', }, - "application/sensml+json": { - source: "iana", + 'application/sensml+json': { + source: 'iana', compressible: true, }, - "application/sensml+xml": { - source: "iana", + 'application/sensml+xml': { + source: 'iana', compressible: true, - extensions: ["sensmlx"], + extensions: ['sensmlx'], }, - "application/sensml-exi": { - source: "iana", + 'application/sensml-exi': { + source: 'iana', }, - "application/sep+xml": { - source: "iana", + 'application/sep+xml': { + source: 'iana', compressible: true, }, - "application/sep-exi": { - source: "iana", + 'application/sep-exi': { + source: 'iana', }, - "application/session-info": { - source: "iana", + 'application/session-info': { + source: 'iana', }, - "application/set-payment": { - source: "iana", + 'application/set-payment': { + source: 'iana', }, - "application/set-payment-initiation": { - source: "iana", - extensions: ["setpay"], + 'application/set-payment-initiation': { + source: 'iana', + extensions: ['setpay'], }, - "application/set-registration": { - source: "iana", + 'application/set-registration': { + source: 'iana', }, - "application/set-registration-initiation": { - source: "iana", - extensions: ["setreg"], + 'application/set-registration-initiation': { + source: 'iana', + extensions: ['setreg'], }, - "application/sgml": { - source: "iana", + 'application/sgml': { + source: 'iana', }, - "application/sgml-open-catalog": { - source: "iana", + 'application/sgml-open-catalog': { + source: 'iana', }, - "application/shf+xml": { - source: "iana", + 'application/shf+xml': { + source: 'iana', compressible: true, - extensions: ["shf"], + extensions: ['shf'], }, - "application/sieve": { - source: "iana", - extensions: ["siv", "sieve"], + 'application/sieve': { + source: 'iana', + extensions: ['siv', 'sieve'], }, - "application/simple-filter+xml": { - source: "iana", + 'application/simple-filter+xml': { + source: 'iana', compressible: true, }, - "application/simple-message-summary": { - source: "iana", + 'application/simple-message-summary': { + source: 'iana', }, - "application/simplesymbolcontainer": { - source: "iana", + 'application/simplesymbolcontainer': { + source: 'iana', }, - "application/sipc": { - source: "iana", + 'application/sipc': { + source: 'iana', }, - "application/slate": { - source: "iana", + 'application/slate': { + source: 'iana', }, - "application/smil": { - source: "apache", + 'application/smil': { + source: 'apache', }, - "application/smil+xml": { - source: "iana", + 'application/smil+xml': { + source: 'iana', compressible: true, - extensions: ["smi", "smil"], + extensions: ['smi', 'smil'], }, - "application/smpte336m": { - source: "iana", + 'application/smpte336m': { + source: 'iana', }, - "application/soap+fastinfoset": { - source: "iana", + 'application/soap+fastinfoset': { + source: 'iana', }, - "application/soap+xml": { - source: "iana", + 'application/soap+xml': { + source: 'iana', compressible: true, }, - "application/sparql-query": { - source: "iana", - extensions: ["rq"], + 'application/sparql-query': { + source: 'iana', + extensions: ['rq'], }, - "application/sparql-results+xml": { - source: "iana", + 'application/sparql-results+xml': { + source: 'iana', compressible: true, - extensions: ["srx"], + extensions: ['srx'], }, - "application/spdx+json": { - source: "iana", + 'application/spdx+json': { + source: 'iana', compressible: true, }, - "application/spirits-event+xml": { - source: "iana", + 'application/spirits-event+xml': { + source: 'iana', compressible: true, }, - "application/sql": { - source: "iana", - extensions: ["sql"], + 'application/sql': { + source: 'iana', + extensions: ['sql'], }, - "application/srgs": { - source: "iana", - extensions: ["gram"], + 'application/srgs': { + source: 'iana', + extensions: ['gram'], }, - "application/srgs+xml": { - source: "iana", + 'application/srgs+xml': { + source: 'iana', compressible: true, - extensions: ["grxml"], + extensions: ['grxml'], }, - "application/sru+xml": { - source: "iana", + 'application/sru+xml': { + source: 'iana', compressible: true, - extensions: ["sru"], + extensions: ['sru'], }, - "application/ssdl+xml": { - source: "apache", + 'application/ssdl+xml': { + source: 'apache', compressible: true, - extensions: ["ssdl"], + extensions: ['ssdl'], }, - "application/ssml+xml": { - source: "iana", + 'application/ssml+xml': { + source: 'iana', compressible: true, - extensions: ["ssml"], + extensions: ['ssml'], }, - "application/stix+json": { - source: "iana", + 'application/stix+json': { + source: 'iana', compressible: true, }, - "application/swid+cbor": { - source: "iana", + 'application/swid+cbor': { + source: 'iana', }, - "application/swid+xml": { - source: "iana", + 'application/swid+xml': { + source: 'iana', compressible: true, - extensions: ["swidtag"], + extensions: ['swidtag'], }, - "application/tamp-apex-update": { - source: "iana", + 'application/tamp-apex-update': { + source: 'iana', }, - "application/tamp-apex-update-confirm": { - source: "iana", + 'application/tamp-apex-update-confirm': { + source: 'iana', }, - "application/tamp-community-update": { - source: "iana", + 'application/tamp-community-update': { + source: 'iana', }, - "application/tamp-community-update-confirm": { - source: "iana", + 'application/tamp-community-update-confirm': { + source: 'iana', }, - "application/tamp-error": { - source: "iana", + 'application/tamp-error': { + source: 'iana', }, - "application/tamp-sequence-adjust": { - source: "iana", + 'application/tamp-sequence-adjust': { + source: 'iana', }, - "application/tamp-sequence-adjust-confirm": { - source: "iana", + 'application/tamp-sequence-adjust-confirm': { + source: 'iana', }, - "application/tamp-status-query": { - source: "iana", + 'application/tamp-status-query': { + source: 'iana', }, - "application/tamp-status-response": { - source: "iana", + 'application/tamp-status-response': { + source: 'iana', }, - "application/tamp-update": { - source: "iana", + 'application/tamp-update': { + source: 'iana', }, - "application/tamp-update-confirm": { - source: "iana", + 'application/tamp-update-confirm': { + source: 'iana', }, - "application/tar": { + 'application/tar': { compressible: true, }, - "application/taxii+json": { - source: "iana", + 'application/taxii+json': { + source: 'iana', compressible: true, }, - "application/td+json": { - source: "iana", + 'application/td+json': { + source: 'iana', compressible: true, }, - "application/tei+xml": { - source: "iana", + 'application/tei+xml': { + source: 'iana', compressible: true, - extensions: ["tei", "teicorpus"], + extensions: ['tei', 'teicorpus'], }, - "application/tetra_isi": { - source: "iana", + 'application/tetra_isi': { + source: 'iana', }, - "application/thraud+xml": { - source: "iana", + 'application/thraud+xml': { + source: 'iana', compressible: true, - extensions: ["tfi"], + extensions: ['tfi'], }, - "application/timestamp-query": { - source: "iana", + 'application/timestamp-query': { + source: 'iana', }, - "application/timestamp-reply": { - source: "iana", + 'application/timestamp-reply': { + source: 'iana', }, - "application/timestamped-data": { - source: "iana", - extensions: ["tsd"], + 'application/timestamped-data': { + source: 'iana', + extensions: ['tsd'], }, - "application/tlsrpt+gzip": { - source: "iana", + 'application/tlsrpt+gzip': { + source: 'iana', }, - "application/tlsrpt+json": { - source: "iana", + 'application/tlsrpt+json': { + source: 'iana', compressible: true, }, - "application/tm+json": { - source: "iana", + 'application/tm+json': { + source: 'iana', compressible: true, }, - "application/tnauthlist": { - source: "iana", + 'application/tnauthlist': { + source: 'iana', }, - "application/token-introspection+jwt": { - source: "iana", + 'application/token-introspection+jwt': { + source: 'iana', }, - "application/toml": { + 'application/toml': { compressible: true, - extensions: ["toml"], + extensions: ['toml'], }, - "application/trickle-ice-sdpfrag": { - source: "iana", + 'application/trickle-ice-sdpfrag': { + source: 'iana', }, - "application/trig": { - source: "iana", - extensions: ["trig"], + 'application/trig': { + source: 'iana', + extensions: ['trig'], }, - "application/ttml+xml": { - source: "iana", + 'application/ttml+xml': { + source: 'iana', compressible: true, - extensions: ["ttml"], + extensions: ['ttml'], }, - "application/tve-trigger": { - source: "iana", + 'application/tve-trigger': { + source: 'iana', }, - "application/tzif": { - source: "iana", + 'application/tzif': { + source: 'iana', }, - "application/tzif-leap": { - source: "iana", + 'application/tzif-leap': { + source: 'iana', }, - "application/ubjson": { + 'application/ubjson': { compressible: false, - extensions: ["ubj"], + extensions: ['ubj'], }, - "application/ulpfec": { - source: "iana", + 'application/ulpfec': { + source: 'iana', }, - "application/urc-grpsheet+xml": { - source: "iana", + 'application/urc-grpsheet+xml': { + source: 'iana', compressible: true, }, - "application/urc-ressheet+xml": { - source: "iana", + 'application/urc-ressheet+xml': { + source: 'iana', compressible: true, - extensions: ["rsheet"], + extensions: ['rsheet'], }, - "application/urc-targetdesc+xml": { - source: "iana", + 'application/urc-targetdesc+xml': { + source: 'iana', compressible: true, - extensions: ["td"], + extensions: ['td'], }, - "application/urc-uisocketdesc+xml": { - source: "iana", + 'application/urc-uisocketdesc+xml': { + source: 'iana', compressible: true, }, - "application/vcard+json": { - source: "iana", + 'application/vcard+json': { + source: 'iana', compressible: true, }, - "application/vcard+xml": { - source: "iana", + 'application/vcard+xml': { + source: 'iana', compressible: true, }, - "application/vemmi": { - source: "iana", + 'application/vemmi': { + source: 'iana', }, - "application/vividence.scriptfile": { - source: "apache", + 'application/vividence.scriptfile': { + source: 'apache', }, - "application/vnd.1000minds.decision-model+xml": { - source: "iana", + 'application/vnd.1000minds.decision-model+xml': { + source: 'iana', compressible: true, - extensions: ["1km"], + extensions: ['1km'], }, - "application/vnd.3gpp-prose+xml": { - source: "iana", + 'application/vnd.3gpp-prose+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp-prose-pc3a+xml": { - source: "iana", + 'application/vnd.3gpp-prose-pc3a+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp-prose-pc3ach+xml": { - source: "iana", + 'application/vnd.3gpp-prose-pc3ach+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp-prose-pc3ch+xml": { - source: "iana", + 'application/vnd.3gpp-prose-pc3ch+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp-prose-pc8+xml": { - source: "iana", + 'application/vnd.3gpp-prose-pc8+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp-v2x-local-service-information": { - source: "iana", + 'application/vnd.3gpp-v2x-local-service-information': { + source: 'iana', }, - "application/vnd.3gpp.5gnas": { - source: "iana", + 'application/vnd.3gpp.5gnas': { + source: 'iana', }, - "application/vnd.3gpp.access-transfer-events+xml": { - source: "iana", + 'application/vnd.3gpp.access-transfer-events+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.bsf+xml": { - source: "iana", + 'application/vnd.3gpp.bsf+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.gmop+xml": { - source: "iana", + 'application/vnd.3gpp.gmop+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.gtpc": { - source: "iana", + 'application/vnd.3gpp.gtpc': { + source: 'iana', }, - "application/vnd.3gpp.interworking-data": { - source: "iana", + 'application/vnd.3gpp.interworking-data': { + source: 'iana', }, - "application/vnd.3gpp.lpp": { - source: "iana", + 'application/vnd.3gpp.lpp': { + source: 'iana', }, - "application/vnd.3gpp.mc-signalling-ear": { - source: "iana", + 'application/vnd.3gpp.mc-signalling-ear': { + source: 'iana', }, - "application/vnd.3gpp.mcdata-affiliation-command+xml": { - source: "iana", + 'application/vnd.3gpp.mcdata-affiliation-command+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcdata-info+xml": { - source: "iana", + 'application/vnd.3gpp.mcdata-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml": { - source: "iana", + 'application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcdata-payload": { - source: "iana", + 'application/vnd.3gpp.mcdata-payload': { + source: 'iana', }, - "application/vnd.3gpp.mcdata-regroup+xml": { - source: "iana", + 'application/vnd.3gpp.mcdata-regroup+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcdata-service-config+xml": { - source: "iana", + 'application/vnd.3gpp.mcdata-service-config+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcdata-signalling": { - source: "iana", + 'application/vnd.3gpp.mcdata-signalling': { + source: 'iana', }, - "application/vnd.3gpp.mcdata-ue-config+xml": { - source: "iana", + 'application/vnd.3gpp.mcdata-ue-config+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcdata-user-profile+xml": { - source: "iana", + 'application/vnd.3gpp.mcdata-user-profile+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-affiliation-command+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-affiliation-command+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-floor-request+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-floor-request+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-info+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-location-info+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-location-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-mbms-usage-info+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-mbms-usage-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-service-config+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-service-config+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-signed+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-signed+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-ue-config+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-ue-config+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-ue-init-config+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-ue-init-config+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcptt-user-profile+xml": { - source: "iana", + 'application/vnd.3gpp.mcptt-user-profile+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcvideo-affiliation-command+xml": { - source: "iana", + 'application/vnd.3gpp.mcvideo-affiliation-command+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcvideo-info+xml": { - source: "iana", + 'application/vnd.3gpp.mcvideo-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcvideo-location-info+xml": { - source: "iana", + 'application/vnd.3gpp.mcvideo-location-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcvideo-mbms-usage-info+xml": { - source: "iana", + 'application/vnd.3gpp.mcvideo-mbms-usage-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcvideo-service-config+xml": { - source: "iana", + 'application/vnd.3gpp.mcvideo-service-config+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcvideo-transmission-request+xml": { - source: "iana", + 'application/vnd.3gpp.mcvideo-transmission-request+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcvideo-ue-config+xml": { - source: "iana", + 'application/vnd.3gpp.mcvideo-ue-config+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mcvideo-user-profile+xml": { - source: "iana", + 'application/vnd.3gpp.mcvideo-user-profile+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.mid-call+xml": { - source: "iana", + 'application/vnd.3gpp.mid-call+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.ngap": { - source: "iana", + 'application/vnd.3gpp.ngap': { + source: 'iana', }, - "application/vnd.3gpp.pfcp": { - source: "iana", + 'application/vnd.3gpp.pfcp': { + source: 'iana', }, - "application/vnd.3gpp.pic-bw-large": { - source: "iana", - extensions: ["plb"], + 'application/vnd.3gpp.pic-bw-large': { + source: 'iana', + extensions: ['plb'], }, - "application/vnd.3gpp.pic-bw-small": { - source: "iana", - extensions: ["psb"], + 'application/vnd.3gpp.pic-bw-small': { + source: 'iana', + extensions: ['psb'], }, - "application/vnd.3gpp.pic-bw-var": { - source: "iana", - extensions: ["pvb"], + 'application/vnd.3gpp.pic-bw-var': { + source: 'iana', + extensions: ['pvb'], }, - "application/vnd.3gpp.s1ap": { - source: "iana", + 'application/vnd.3gpp.s1ap': { + source: 'iana', }, - "application/vnd.3gpp.seal-info+xml": { - source: "iana", + 'application/vnd.3gpp.seal-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.seal-location-info+xml": { - source: "iana", + 'application/vnd.3gpp.seal-location-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.sms": { - source: "iana", + 'application/vnd.3gpp.sms': { + source: 'iana', }, - "application/vnd.3gpp.sms+xml": { - source: "iana", + 'application/vnd.3gpp.sms+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.srvcc-ext+xml": { - source: "iana", + 'application/vnd.3gpp.srvcc-ext+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.srvcc-info+xml": { - source: "iana", + 'application/vnd.3gpp.srvcc-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.state-and-event-info+xml": { - source: "iana", + 'application/vnd.3gpp.state-and-event-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.ussd+xml": { - source: "iana", + 'application/vnd.3gpp.ussd+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp.vae-info+xml": { - source: "iana", + 'application/vnd.3gpp.vae-info+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp2.bcmcsinfo+xml": { - source: "iana", + 'application/vnd.3gpp2.bcmcsinfo+xml': { + source: 'iana', compressible: true, }, - "application/vnd.3gpp2.sms": { - source: "iana", + 'application/vnd.3gpp2.sms': { + source: 'iana', }, - "application/vnd.3gpp2.tcap": { - source: "iana", - extensions: ["tcap"], + 'application/vnd.3gpp2.tcap': { + source: 'iana', + extensions: ['tcap'], }, - "application/vnd.3lightssoftware.imagescal": { - source: "iana", + 'application/vnd.3lightssoftware.imagescal': { + source: 'iana', }, - "application/vnd.3m.post-it-notes": { - source: "iana", - extensions: ["pwn"], + 'application/vnd.3m.post-it-notes': { + source: 'iana', + extensions: ['pwn'], }, - "application/vnd.accpac.simply.aso": { - source: "iana", - extensions: ["aso"], + 'application/vnd.accpac.simply.aso': { + source: 'iana', + extensions: ['aso'], }, - "application/vnd.accpac.simply.imp": { - source: "iana", - extensions: ["imp"], + 'application/vnd.accpac.simply.imp': { + source: 'iana', + extensions: ['imp'], }, - "application/vnd.acucobol": { - source: "iana", - extensions: ["acu"], + 'application/vnd.acucobol': { + source: 'iana', + extensions: ['acu'], }, - "application/vnd.acucorp": { - source: "iana", - extensions: ["atc", "acutc"], + 'application/vnd.acucorp': { + source: 'iana', + extensions: ['atc', 'acutc'], }, - "application/vnd.adobe.air-application-installer-package+zip": { - source: "apache", + 'application/vnd.adobe.air-application-installer-package+zip': { + source: 'apache', compressible: false, - extensions: ["air"], + extensions: ['air'], }, - "application/vnd.adobe.flash.movie": { - source: "iana", + 'application/vnd.adobe.flash.movie': { + source: 'iana', }, - "application/vnd.adobe.formscentral.fcdt": { - source: "iana", - extensions: ["fcdt"], + 'application/vnd.adobe.formscentral.fcdt': { + source: 'iana', + extensions: ['fcdt'], }, - "application/vnd.adobe.fxp": { - source: "iana", - extensions: ["fxp", "fxpl"], + 'application/vnd.adobe.fxp': { + source: 'iana', + extensions: ['fxp', 'fxpl'], }, - "application/vnd.adobe.partial-upload": { - source: "iana", + 'application/vnd.adobe.partial-upload': { + source: 'iana', }, - "application/vnd.adobe.xdp+xml": { - source: "iana", + 'application/vnd.adobe.xdp+xml': { + source: 'iana', compressible: true, - extensions: ["xdp"], + extensions: ['xdp'], }, - "application/vnd.adobe.xfdf": { - source: "apache", - extensions: ["xfdf"], + 'application/vnd.adobe.xfdf': { + source: 'apache', + extensions: ['xfdf'], }, - "application/vnd.aether.imp": { - source: "iana", + 'application/vnd.aether.imp': { + source: 'iana', }, - "application/vnd.afpc.afplinedata": { - source: "iana", + 'application/vnd.afpc.afplinedata': { + source: 'iana', }, - "application/vnd.afpc.afplinedata-pagedef": { - source: "iana", + 'application/vnd.afpc.afplinedata-pagedef': { + source: 'iana', }, - "application/vnd.afpc.cmoca-cmresource": { - source: "iana", + 'application/vnd.afpc.cmoca-cmresource': { + source: 'iana', }, - "application/vnd.afpc.foca-charset": { - source: "iana", + 'application/vnd.afpc.foca-charset': { + source: 'iana', }, - "application/vnd.afpc.foca-codedfont": { - source: "iana", + 'application/vnd.afpc.foca-codedfont': { + source: 'iana', }, - "application/vnd.afpc.foca-codepage": { - source: "iana", + 'application/vnd.afpc.foca-codepage': { + source: 'iana', }, - "application/vnd.afpc.modca": { - source: "iana", + 'application/vnd.afpc.modca': { + source: 'iana', }, - "application/vnd.afpc.modca-cmtable": { - source: "iana", + 'application/vnd.afpc.modca-cmtable': { + source: 'iana', }, - "application/vnd.afpc.modca-formdef": { - source: "iana", + 'application/vnd.afpc.modca-formdef': { + source: 'iana', }, - "application/vnd.afpc.modca-mediummap": { - source: "iana", + 'application/vnd.afpc.modca-mediummap': { + source: 'iana', }, - "application/vnd.afpc.modca-objectcontainer": { - source: "iana", + 'application/vnd.afpc.modca-objectcontainer': { + source: 'iana', }, - "application/vnd.afpc.modca-overlay": { - source: "iana", + 'application/vnd.afpc.modca-overlay': { + source: 'iana', }, - "application/vnd.afpc.modca-pagesegment": { - source: "iana", + 'application/vnd.afpc.modca-pagesegment': { + source: 'iana', }, - "application/vnd.age": { - source: "iana", - extensions: ["age"], + 'application/vnd.age': { + source: 'iana', + extensions: ['age'], }, - "application/vnd.ah-barcode": { - source: "apache", + 'application/vnd.ah-barcode': { + source: 'apache', }, - "application/vnd.ahead.space": { - source: "iana", - extensions: ["ahead"], + 'application/vnd.ahead.space': { + source: 'iana', + extensions: ['ahead'], }, - "application/vnd.airzip.filesecure.azf": { - source: "iana", - extensions: ["azf"], + 'application/vnd.airzip.filesecure.azf': { + source: 'iana', + extensions: ['azf'], }, - "application/vnd.airzip.filesecure.azs": { - source: "iana", - extensions: ["azs"], + 'application/vnd.airzip.filesecure.azs': { + source: 'iana', + extensions: ['azs'], }, - "application/vnd.amadeus+json": { - source: "iana", + 'application/vnd.amadeus+json': { + source: 'iana', compressible: true, }, - "application/vnd.amazon.ebook": { - source: "apache", - extensions: ["azw"], + 'application/vnd.amazon.ebook': { + source: 'apache', + extensions: ['azw'], }, - "application/vnd.amazon.mobi8-ebook": { - source: "iana", + 'application/vnd.amazon.mobi8-ebook': { + source: 'iana', }, - "application/vnd.americandynamics.acc": { - source: "iana", - extensions: ["acc"], + 'application/vnd.americandynamics.acc': { + source: 'iana', + extensions: ['acc'], }, - "application/vnd.amiga.ami": { - source: "iana", - extensions: ["ami"], + 'application/vnd.amiga.ami': { + source: 'iana', + extensions: ['ami'], }, - "application/vnd.amundsen.maze+xml": { - source: "iana", + 'application/vnd.amundsen.maze+xml': { + source: 'iana', compressible: true, }, - "application/vnd.android.ota": { - source: "iana", + 'application/vnd.android.ota': { + source: 'iana', }, - "application/vnd.android.package-archive": { - source: "apache", + 'application/vnd.android.package-archive': { + source: 'apache', compressible: false, - extensions: ["apk"], + extensions: ['apk'], }, - "application/vnd.anki": { - source: "iana", + 'application/vnd.anki': { + source: 'iana', }, - "application/vnd.anser-web-certificate-issue-initiation": { - source: "iana", - extensions: ["cii"], + 'application/vnd.anser-web-certificate-issue-initiation': { + source: 'iana', + extensions: ['cii'], }, - "application/vnd.anser-web-funds-transfer-initiation": { - source: "apache", - extensions: ["fti"], + 'application/vnd.anser-web-funds-transfer-initiation': { + source: 'apache', + extensions: ['fti'], }, - "application/vnd.antix.game-component": { - source: "iana", - extensions: ["atx"], + 'application/vnd.antix.game-component': { + source: 'iana', + extensions: ['atx'], }, - "application/vnd.apache.arrow.file": { - source: "iana", + 'application/vnd.apache.arrow.file': { + source: 'iana', }, - "application/vnd.apache.arrow.stream": { - source: "iana", + 'application/vnd.apache.arrow.stream': { + source: 'iana', }, - "application/vnd.apache.thrift.binary": { - source: "iana", + 'application/vnd.apache.thrift.binary': { + source: 'iana', }, - "application/vnd.apache.thrift.compact": { - source: "iana", + 'application/vnd.apache.thrift.compact': { + source: 'iana', }, - "application/vnd.apache.thrift.json": { - source: "iana", + 'application/vnd.apache.thrift.json': { + source: 'iana', }, - "application/vnd.apexlang": { - source: "iana", + 'application/vnd.apexlang': { + source: 'iana', }, - "application/vnd.api+json": { - source: "iana", + 'application/vnd.api+json': { + source: 'iana', compressible: true, }, - "application/vnd.aplextor.warrp+json": { - source: "iana", + 'application/vnd.aplextor.warrp+json': { + source: 'iana', compressible: true, }, - "application/vnd.apothekende.reservation+json": { - source: "iana", + 'application/vnd.apothekende.reservation+json': { + source: 'iana', compressible: true, }, - "application/vnd.apple.installer+xml": { - source: "iana", + 'application/vnd.apple.installer+xml': { + source: 'iana', compressible: true, - extensions: ["mpkg"], + extensions: ['mpkg'], }, - "application/vnd.apple.keynote": { - source: "iana", - extensions: ["key"], + 'application/vnd.apple.keynote': { + source: 'iana', + extensions: ['key'], }, - "application/vnd.apple.mpegurl": { - source: "iana", - extensions: ["m3u8"], + 'application/vnd.apple.mpegurl': { + source: 'iana', + extensions: ['m3u8'], }, - "application/vnd.apple.numbers": { - source: "iana", - extensions: ["numbers"], + 'application/vnd.apple.numbers': { + source: 'iana', + extensions: ['numbers'], }, - "application/vnd.apple.pages": { - source: "iana", - extensions: ["pages"], + 'application/vnd.apple.pages': { + source: 'iana', + extensions: ['pages'], }, - "application/vnd.apple.pkpass": { + 'application/vnd.apple.pkpass': { compressible: false, - extensions: ["pkpass"], + extensions: ['pkpass'], }, - "application/vnd.arastra.swi": { - source: "apache", + 'application/vnd.arastra.swi': { + source: 'apache', }, - "application/vnd.aristanetworks.swi": { - source: "iana", - extensions: ["swi"], + 'application/vnd.aristanetworks.swi': { + source: 'iana', + extensions: ['swi'], }, - "application/vnd.artisan+json": { - source: "iana", + 'application/vnd.artisan+json': { + source: 'iana', compressible: true, }, - "application/vnd.artsquare": { - source: "iana", + 'application/vnd.artsquare': { + source: 'iana', }, - "application/vnd.astraea-software.iota": { - source: "iana", - extensions: ["iota"], + 'application/vnd.astraea-software.iota': { + source: 'iana', + extensions: ['iota'], }, - "application/vnd.audiograph": { - source: "iana", - extensions: ["aep"], + 'application/vnd.audiograph': { + source: 'iana', + extensions: ['aep'], }, - "application/vnd.autopackage": { - source: "iana", + 'application/vnd.autopackage': { + source: 'iana', }, - "application/vnd.avalon+json": { - source: "iana", + 'application/vnd.avalon+json': { + source: 'iana', compressible: true, }, - "application/vnd.avistar+xml": { - source: "iana", + 'application/vnd.avistar+xml': { + source: 'iana', compressible: true, }, - "application/vnd.balsamiq.bmml+xml": { - source: "iana", + 'application/vnd.balsamiq.bmml+xml': { + source: 'iana', compressible: true, - extensions: ["bmml"], + extensions: ['bmml'], }, - "application/vnd.balsamiq.bmpr": { - source: "iana", + 'application/vnd.balsamiq.bmpr': { + source: 'iana', }, - "application/vnd.banana-accounting": { - source: "iana", + 'application/vnd.banana-accounting': { + source: 'iana', }, - "application/vnd.bbf.usp.error": { - source: "iana", + 'application/vnd.bbf.usp.error': { + source: 'iana', }, - "application/vnd.bbf.usp.msg": { - source: "iana", + 'application/vnd.bbf.usp.msg': { + source: 'iana', }, - "application/vnd.bbf.usp.msg+json": { - source: "iana", + 'application/vnd.bbf.usp.msg+json': { + source: 'iana', compressible: true, }, - "application/vnd.bekitzur-stech+json": { - source: "iana", + 'application/vnd.bekitzur-stech+json': { + source: 'iana', compressible: true, }, - "application/vnd.belightsoft.lhzd+zip": { - source: "iana", + 'application/vnd.belightsoft.lhzd+zip': { + source: 'iana', compressible: false, }, - "application/vnd.belightsoft.lhzl+zip": { - source: "iana", + 'application/vnd.belightsoft.lhzl+zip': { + source: 'iana', compressible: false, }, - "application/vnd.bint.med-content": { - source: "iana", + 'application/vnd.bint.med-content': { + source: 'iana', }, - "application/vnd.biopax.rdf+xml": { - source: "iana", + 'application/vnd.biopax.rdf+xml': { + source: 'iana', compressible: true, }, - "application/vnd.blink-idb-value-wrapper": { - source: "iana", + 'application/vnd.blink-idb-value-wrapper': { + source: 'iana', }, - "application/vnd.blueice.multipass": { - source: "iana", - extensions: ["mpm"], + 'application/vnd.blueice.multipass': { + source: 'iana', + extensions: ['mpm'], }, - "application/vnd.bluetooth.ep.oob": { - source: "iana", + 'application/vnd.bluetooth.ep.oob': { + source: 'iana', }, - "application/vnd.bluetooth.le.oob": { - source: "iana", + 'application/vnd.bluetooth.le.oob': { + source: 'iana', }, - "application/vnd.bmi": { - source: "iana", - extensions: ["bmi"], + 'application/vnd.bmi': { + source: 'iana', + extensions: ['bmi'], }, - "application/vnd.bpf": { - source: "iana", + 'application/vnd.bpf': { + source: 'iana', }, - "application/vnd.bpf3": { - source: "iana", + 'application/vnd.bpf3': { + source: 'iana', }, - "application/vnd.businessobjects": { - source: "iana", - extensions: ["rep"], + 'application/vnd.businessobjects': { + source: 'iana', + extensions: ['rep'], }, - "application/vnd.byu.uapi+json": { - source: "iana", + 'application/vnd.byu.uapi+json': { + source: 'iana', compressible: true, }, - "application/vnd.cab-jscript": { - source: "iana", + 'application/vnd.cab-jscript': { + source: 'iana', }, - "application/vnd.canon-cpdl": { - source: "iana", + 'application/vnd.canon-cpdl': { + source: 'iana', }, - "application/vnd.canon-lips": { - source: "iana", + 'application/vnd.canon-lips': { + source: 'iana', }, - "application/vnd.capasystems-pg+json": { - source: "iana", + 'application/vnd.capasystems-pg+json': { + source: 'iana', compressible: true, }, - "application/vnd.cendio.thinlinc.clientconf": { - source: "iana", + 'application/vnd.cendio.thinlinc.clientconf': { + source: 'iana', }, - "application/vnd.century-systems.tcp_stream": { - source: "iana", + 'application/vnd.century-systems.tcp_stream': { + source: 'iana', }, - "application/vnd.chemdraw+xml": { - source: "iana", + 'application/vnd.chemdraw+xml': { + source: 'iana', compressible: true, - extensions: ["cdxml"], + extensions: ['cdxml'], }, - "application/vnd.chess-pgn": { - source: "iana", + 'application/vnd.chess-pgn': { + source: 'iana', }, - "application/vnd.chipnuts.karaoke-mmd": { - source: "iana", - extensions: ["mmd"], + 'application/vnd.chipnuts.karaoke-mmd': { + source: 'iana', + extensions: ['mmd'], }, - "application/vnd.ciedi": { - source: "iana", + 'application/vnd.ciedi': { + source: 'iana', }, - "application/vnd.cinderella": { - source: "iana", - extensions: ["cdy"], + 'application/vnd.cinderella': { + source: 'iana', + extensions: ['cdy'], }, - "application/vnd.cirpack.isdn-ext": { - source: "iana", + 'application/vnd.cirpack.isdn-ext': { + source: 'iana', }, - "application/vnd.citationstyles.style+xml": { - source: "iana", + 'application/vnd.citationstyles.style+xml': { + source: 'iana', compressible: true, - extensions: ["csl"], + extensions: ['csl'], }, - "application/vnd.claymore": { - source: "iana", - extensions: ["cla"], + 'application/vnd.claymore': { + source: 'iana', + extensions: ['cla'], }, - "application/vnd.cloanto.rp9": { - source: "iana", - extensions: ["rp9"], + 'application/vnd.cloanto.rp9': { + source: 'iana', + extensions: ['rp9'], }, - "application/vnd.clonk.c4group": { - source: "iana", - extensions: ["c4g", "c4d", "c4f", "c4p", "c4u"], + 'application/vnd.clonk.c4group': { + source: 'iana', + extensions: ['c4g', 'c4d', 'c4f', 'c4p', 'c4u'], }, - "application/vnd.cluetrust.cartomobile-config": { - source: "iana", - extensions: ["c11amc"], + 'application/vnd.cluetrust.cartomobile-config': { + source: 'iana', + extensions: ['c11amc'], }, - "application/vnd.cluetrust.cartomobile-config-pkg": { - source: "iana", - extensions: ["c11amz"], + 'application/vnd.cluetrust.cartomobile-config-pkg': { + source: 'iana', + extensions: ['c11amz'], }, - "application/vnd.cncf.helm.chart.content.v1.tar+gzip": { - source: "iana", + 'application/vnd.cncf.helm.chart.content.v1.tar+gzip': { + source: 'iana', }, - "application/vnd.cncf.helm.chart.provenance.v1.prov": { - source: "iana", + 'application/vnd.cncf.helm.chart.provenance.v1.prov': { + source: 'iana', }, - "application/vnd.coffeescript": { - source: "iana", + 'application/vnd.coffeescript': { + source: 'iana', }, - "application/vnd.collabio.xodocuments.document": { - source: "iana", + 'application/vnd.collabio.xodocuments.document': { + source: 'iana', }, - "application/vnd.collabio.xodocuments.document-template": { - source: "iana", + 'application/vnd.collabio.xodocuments.document-template': { + source: 'iana', }, - "application/vnd.collabio.xodocuments.presentation": { - source: "iana", + 'application/vnd.collabio.xodocuments.presentation': { + source: 'iana', }, - "application/vnd.collabio.xodocuments.presentation-template": { - source: "iana", + 'application/vnd.collabio.xodocuments.presentation-template': { + source: 'iana', }, - "application/vnd.collabio.xodocuments.spreadsheet": { - source: "iana", + 'application/vnd.collabio.xodocuments.spreadsheet': { + source: 'iana', }, - "application/vnd.collabio.xodocuments.spreadsheet-template": { - source: "iana", + 'application/vnd.collabio.xodocuments.spreadsheet-template': { + source: 'iana', }, - "application/vnd.collection+json": { - source: "iana", + 'application/vnd.collection+json': { + source: 'iana', compressible: true, }, - "application/vnd.collection.doc+json": { - source: "iana", + 'application/vnd.collection.doc+json': { + source: 'iana', compressible: true, }, - "application/vnd.collection.next+json": { - source: "iana", + 'application/vnd.collection.next+json': { + source: 'iana', compressible: true, }, - "application/vnd.comicbook+zip": { - source: "iana", + 'application/vnd.comicbook+zip': { + source: 'iana', compressible: false, }, - "application/vnd.comicbook-rar": { - source: "iana", + 'application/vnd.comicbook-rar': { + source: 'iana', }, - "application/vnd.commerce-battelle": { - source: "iana", + 'application/vnd.commerce-battelle': { + source: 'iana', }, - "application/vnd.commonspace": { - source: "iana", - extensions: ["csp"], + 'application/vnd.commonspace': { + source: 'iana', + extensions: ['csp'], }, - "application/vnd.contact.cmsg": { - source: "iana", - extensions: ["cdbcmsg"], + 'application/vnd.contact.cmsg': { + source: 'iana', + extensions: ['cdbcmsg'], }, - "application/vnd.coreos.ignition+json": { - source: "iana", + 'application/vnd.coreos.ignition+json': { + source: 'iana', compressible: true, }, - "application/vnd.cosmocaller": { - source: "iana", - extensions: ["cmc"], + 'application/vnd.cosmocaller': { + source: 'iana', + extensions: ['cmc'], }, - "application/vnd.crick.clicker": { - source: "iana", - extensions: ["clkx"], + 'application/vnd.crick.clicker': { + source: 'iana', + extensions: ['clkx'], }, - "application/vnd.crick.clicker.keyboard": { - source: "iana", - extensions: ["clkk"], + 'application/vnd.crick.clicker.keyboard': { + source: 'iana', + extensions: ['clkk'], }, - "application/vnd.crick.clicker.palette": { - source: "iana", - extensions: ["clkp"], + 'application/vnd.crick.clicker.palette': { + source: 'iana', + extensions: ['clkp'], }, - "application/vnd.crick.clicker.template": { - source: "iana", - extensions: ["clkt"], + 'application/vnd.crick.clicker.template': { + source: 'iana', + extensions: ['clkt'], }, - "application/vnd.crick.clicker.wordbank": { - source: "iana", - extensions: ["clkw"], + 'application/vnd.crick.clicker.wordbank': { + source: 'iana', + extensions: ['clkw'], }, - "application/vnd.criticaltools.wbs+xml": { - source: "iana", + 'application/vnd.criticaltools.wbs+xml': { + source: 'iana', compressible: true, - extensions: ["wbs"], + extensions: ['wbs'], }, - "application/vnd.cryptii.pipe+json": { - source: "iana", + 'application/vnd.cryptii.pipe+json': { + source: 'iana', compressible: true, }, - "application/vnd.crypto-shade-file": { - source: "iana", + 'application/vnd.crypto-shade-file': { + source: 'iana', }, - "application/vnd.cryptomator.encrypted": { - source: "iana", + 'application/vnd.cryptomator.encrypted': { + source: 'iana', }, - "application/vnd.cryptomator.vault": { - source: "iana", + 'application/vnd.cryptomator.vault': { + source: 'iana', }, - "application/vnd.ctc-posml": { - source: "iana", - extensions: ["pml"], + 'application/vnd.ctc-posml': { + source: 'iana', + extensions: ['pml'], }, - "application/vnd.ctct.ws+xml": { - source: "iana", + 'application/vnd.ctct.ws+xml': { + source: 'iana', compressible: true, }, - "application/vnd.cups-pdf": { - source: "iana", + 'application/vnd.cups-pdf': { + source: 'iana', }, - "application/vnd.cups-postscript": { - source: "iana", + 'application/vnd.cups-postscript': { + source: 'iana', }, - "application/vnd.cups-ppd": { - source: "iana", - extensions: ["ppd"], + 'application/vnd.cups-ppd': { + source: 'iana', + extensions: ['ppd'], }, - "application/vnd.cups-raster": { - source: "iana", + 'application/vnd.cups-raster': { + source: 'iana', }, - "application/vnd.cups-raw": { - source: "iana", + 'application/vnd.cups-raw': { + source: 'iana', }, - "application/vnd.curl": { - source: "iana", + 'application/vnd.curl': { + source: 'iana', }, - "application/vnd.curl.car": { - source: "apache", - extensions: ["car"], + 'application/vnd.curl.car': { + source: 'apache', + extensions: ['car'], }, - "application/vnd.curl.pcurl": { - source: "apache", - extensions: ["pcurl"], + 'application/vnd.curl.pcurl': { + source: 'apache', + extensions: ['pcurl'], }, - "application/vnd.cyan.dean.root+xml": { - source: "iana", + 'application/vnd.cyan.dean.root+xml': { + source: 'iana', compressible: true, }, - "application/vnd.cybank": { - source: "iana", + 'application/vnd.cybank': { + source: 'iana', }, - "application/vnd.cyclonedx+json": { - source: "iana", + 'application/vnd.cyclonedx+json': { + source: 'iana', compressible: true, }, - "application/vnd.cyclonedx+xml": { - source: "iana", + 'application/vnd.cyclonedx+xml': { + source: 'iana', compressible: true, }, - "application/vnd.d2l.coursepackage1p0+zip": { - source: "iana", + 'application/vnd.d2l.coursepackage1p0+zip': { + source: 'iana', compressible: false, }, - "application/vnd.d3m-dataset": { - source: "iana", + 'application/vnd.d3m-dataset': { + source: 'iana', }, - "application/vnd.d3m-problem": { - source: "iana", + 'application/vnd.d3m-problem': { + source: 'iana', }, - "application/vnd.dart": { - source: "iana", + 'application/vnd.dart': { + source: 'iana', compressible: true, - extensions: ["dart"], + extensions: ['dart'], }, - "application/vnd.data-vision.rdz": { - source: "iana", - extensions: ["rdz"], + 'application/vnd.data-vision.rdz': { + source: 'iana', + extensions: ['rdz'], }, - "application/vnd.datalog": { - source: "iana", + 'application/vnd.datalog': { + source: 'iana', }, - "application/vnd.datapackage+json": { - source: "iana", + 'application/vnd.datapackage+json': { + source: 'iana', compressible: true, }, - "application/vnd.dataresource+json": { - source: "iana", + 'application/vnd.dataresource+json': { + source: 'iana', compressible: true, }, - "application/vnd.dbf": { - source: "iana", - extensions: ["dbf"], + 'application/vnd.dbf': { + source: 'iana', + extensions: ['dbf'], }, - "application/vnd.debian.binary-package": { - source: "iana", + 'application/vnd.debian.binary-package': { + source: 'iana', }, - "application/vnd.dece.data": { - source: "iana", - extensions: ["uvf", "uvvf", "uvd", "uvvd"], + 'application/vnd.dece.data': { + source: 'iana', + extensions: ['uvf', 'uvvf', 'uvd', 'uvvd'], }, - "application/vnd.dece.ttml+xml": { - source: "iana", + 'application/vnd.dece.ttml+xml': { + source: 'iana', compressible: true, - extensions: ["uvt", "uvvt"], + extensions: ['uvt', 'uvvt'], }, - "application/vnd.dece.unspecified": { - source: "iana", - extensions: ["uvx", "uvvx"], + 'application/vnd.dece.unspecified': { + source: 'iana', + extensions: ['uvx', 'uvvx'], }, - "application/vnd.dece.zip": { - source: "iana", - extensions: ["uvz", "uvvz"], + 'application/vnd.dece.zip': { + source: 'iana', + extensions: ['uvz', 'uvvz'], }, - "application/vnd.denovo.fcselayout-link": { - source: "iana", - extensions: ["fe_launch"], + 'application/vnd.denovo.fcselayout-link': { + source: 'iana', + extensions: ['fe_launch'], }, - "application/vnd.desmume.movie": { - source: "iana", + 'application/vnd.desmume.movie': { + source: 'iana', }, - "application/vnd.dir-bi.plate-dl-nosuffix": { - source: "iana", + 'application/vnd.dir-bi.plate-dl-nosuffix': { + source: 'iana', }, - "application/vnd.dm.delegation+xml": { - source: "iana", + 'application/vnd.dm.delegation+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dna": { - source: "iana", - extensions: ["dna"], + 'application/vnd.dna': { + source: 'iana', + extensions: ['dna'], }, - "application/vnd.document+json": { - source: "iana", + 'application/vnd.document+json': { + source: 'iana', compressible: true, }, - "application/vnd.dolby.mlp": { - source: "apache", - extensions: ["mlp"], + 'application/vnd.dolby.mlp': { + source: 'apache', + extensions: ['mlp'], }, - "application/vnd.dolby.mobile.1": { - source: "iana", + 'application/vnd.dolby.mobile.1': { + source: 'iana', }, - "application/vnd.dolby.mobile.2": { - source: "iana", + 'application/vnd.dolby.mobile.2': { + source: 'iana', }, - "application/vnd.doremir.scorecloud-binary-document": { - source: "iana", + 'application/vnd.doremir.scorecloud-binary-document': { + source: 'iana', }, - "application/vnd.dpgraph": { - source: "iana", - extensions: ["dpg"], + 'application/vnd.dpgraph': { + source: 'iana', + extensions: ['dpg'], }, - "application/vnd.dreamfactory": { - source: "iana", - extensions: ["dfac"], + 'application/vnd.dreamfactory': { + source: 'iana', + extensions: ['dfac'], }, - "application/vnd.drive+json": { - source: "iana", + 'application/vnd.drive+json': { + source: 'iana', compressible: true, }, - "application/vnd.ds-keypoint": { - source: "apache", - extensions: ["kpxx"], + 'application/vnd.ds-keypoint': { + source: 'apache', + extensions: ['kpxx'], }, - "application/vnd.dtg.local": { - source: "iana", + 'application/vnd.dtg.local': { + source: 'iana', }, - "application/vnd.dtg.local.flash": { - source: "iana", + 'application/vnd.dtg.local.flash': { + source: 'iana', }, - "application/vnd.dtg.local.html": { - source: "iana", + 'application/vnd.dtg.local.html': { + source: 'iana', }, - "application/vnd.dvb.ait": { - source: "iana", - extensions: ["ait"], + 'application/vnd.dvb.ait': { + source: 'iana', + extensions: ['ait'], }, - "application/vnd.dvb.dvbisl+xml": { - source: "iana", + 'application/vnd.dvb.dvbisl+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dvb.dvbj": { - source: "iana", + 'application/vnd.dvb.dvbj': { + source: 'iana', }, - "application/vnd.dvb.esgcontainer": { - source: "iana", + 'application/vnd.dvb.esgcontainer': { + source: 'iana', }, - "application/vnd.dvb.ipdcdftnotifaccess": { - source: "iana", + 'application/vnd.dvb.ipdcdftnotifaccess': { + source: 'iana', }, - "application/vnd.dvb.ipdcesgaccess": { - source: "iana", + 'application/vnd.dvb.ipdcesgaccess': { + source: 'iana', }, - "application/vnd.dvb.ipdcesgaccess2": { - source: "iana", + 'application/vnd.dvb.ipdcesgaccess2': { + source: 'iana', }, - "application/vnd.dvb.ipdcesgpdd": { - source: "iana", + 'application/vnd.dvb.ipdcesgpdd': { + source: 'iana', }, - "application/vnd.dvb.ipdcroaming": { - source: "iana", + 'application/vnd.dvb.ipdcroaming': { + source: 'iana', }, - "application/vnd.dvb.iptv.alfec-base": { - source: "iana", + 'application/vnd.dvb.iptv.alfec-base': { + source: 'iana', }, - "application/vnd.dvb.iptv.alfec-enhancement": { - source: "iana", + 'application/vnd.dvb.iptv.alfec-enhancement': { + source: 'iana', }, - "application/vnd.dvb.notif-aggregate-root+xml": { - source: "iana", + 'application/vnd.dvb.notif-aggregate-root+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dvb.notif-container+xml": { - source: "iana", + 'application/vnd.dvb.notif-container+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dvb.notif-generic+xml": { - source: "iana", + 'application/vnd.dvb.notif-generic+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dvb.notif-ia-msglist+xml": { - source: "iana", + 'application/vnd.dvb.notif-ia-msglist+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dvb.notif-ia-registration-request+xml": { - source: "iana", + 'application/vnd.dvb.notif-ia-registration-request+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dvb.notif-ia-registration-response+xml": { - source: "iana", + 'application/vnd.dvb.notif-ia-registration-response+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dvb.notif-init+xml": { - source: "iana", + 'application/vnd.dvb.notif-init+xml': { + source: 'iana', compressible: true, }, - "application/vnd.dvb.pfr": { - source: "iana", + 'application/vnd.dvb.pfr': { + source: 'iana', }, - "application/vnd.dvb.service": { - source: "iana", - extensions: ["svc"], + 'application/vnd.dvb.service': { + source: 'iana', + extensions: ['svc'], }, - "application/vnd.dxr": { - source: "iana", + 'application/vnd.dxr': { + source: 'iana', }, - "application/vnd.dynageo": { - source: "iana", - extensions: ["geo"], + 'application/vnd.dynageo': { + source: 'iana', + extensions: ['geo'], }, - "application/vnd.dzr": { - source: "iana", + 'application/vnd.dzr': { + source: 'iana', }, - "application/vnd.easykaraoke.cdgdownload": { - source: "iana", + 'application/vnd.easykaraoke.cdgdownload': { + source: 'iana', }, - "application/vnd.ecdis-update": { - source: "iana", + 'application/vnd.ecdis-update': { + source: 'iana', }, - "application/vnd.ecip.rlp": { - source: "iana", + 'application/vnd.ecip.rlp': { + source: 'iana', }, - "application/vnd.eclipse.ditto+json": { - source: "iana", + 'application/vnd.eclipse.ditto+json': { + source: 'iana', compressible: true, }, - "application/vnd.ecowin.chart": { - source: "iana", - extensions: ["mag"], + 'application/vnd.ecowin.chart': { + source: 'iana', + extensions: ['mag'], }, - "application/vnd.ecowin.filerequest": { - source: "iana", + 'application/vnd.ecowin.filerequest': { + source: 'iana', }, - "application/vnd.ecowin.fileupdate": { - source: "iana", + 'application/vnd.ecowin.fileupdate': { + source: 'iana', }, - "application/vnd.ecowin.series": { - source: "iana", + 'application/vnd.ecowin.series': { + source: 'iana', }, - "application/vnd.ecowin.seriesrequest": { - source: "iana", + 'application/vnd.ecowin.seriesrequest': { + source: 'iana', }, - "application/vnd.ecowin.seriesupdate": { - source: "iana", + 'application/vnd.ecowin.seriesupdate': { + source: 'iana', }, - "application/vnd.efi.img": { - source: "iana", + 'application/vnd.efi.img': { + source: 'iana', }, - "application/vnd.efi.iso": { - source: "iana", + 'application/vnd.efi.iso': { + source: 'iana', }, - "application/vnd.eln+zip": { - source: "iana", + 'application/vnd.eln+zip': { + source: 'iana', compressible: false, }, - "application/vnd.emclient.accessrequest+xml": { - source: "iana", + 'application/vnd.emclient.accessrequest+xml': { + source: 'iana', compressible: true, }, - "application/vnd.enliven": { - source: "iana", - extensions: ["nml"], + 'application/vnd.enliven': { + source: 'iana', + extensions: ['nml'], }, - "application/vnd.enphase.envoy": { - source: "iana", + 'application/vnd.enphase.envoy': { + source: 'iana', }, - "application/vnd.eprints.data+xml": { - source: "iana", + 'application/vnd.eprints.data+xml': { + source: 'iana', compressible: true, }, - "application/vnd.epson.esf": { - source: "iana", - extensions: ["esf"], + 'application/vnd.epson.esf': { + source: 'iana', + extensions: ['esf'], }, - "application/vnd.epson.msf": { - source: "iana", - extensions: ["msf"], + 'application/vnd.epson.msf': { + source: 'iana', + extensions: ['msf'], }, - "application/vnd.epson.quickanime": { - source: "iana", - extensions: ["qam"], + 'application/vnd.epson.quickanime': { + source: 'iana', + extensions: ['qam'], }, - "application/vnd.epson.salt": { - source: "iana", - extensions: ["slt"], + 'application/vnd.epson.salt': { + source: 'iana', + extensions: ['slt'], }, - "application/vnd.epson.ssf": { - source: "iana", - extensions: ["ssf"], + 'application/vnd.epson.ssf': { + source: 'iana', + extensions: ['ssf'], }, - "application/vnd.ericsson.quickcall": { - source: "iana", + 'application/vnd.ericsson.quickcall': { + source: 'iana', }, - "application/vnd.espass-espass+zip": { - source: "iana", + 'application/vnd.espass-espass+zip': { + source: 'iana', compressible: false, }, - "application/vnd.eszigno3+xml": { - source: "iana", + 'application/vnd.eszigno3+xml': { + source: 'iana', compressible: true, - extensions: ["es3", "et3"], + extensions: ['es3', 'et3'], }, - "application/vnd.etsi.aoc+xml": { - source: "iana", + 'application/vnd.etsi.aoc+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.asic-e+zip": { - source: "iana", + 'application/vnd.etsi.asic-e+zip': { + source: 'iana', compressible: false, }, - "application/vnd.etsi.asic-s+zip": { - source: "iana", + 'application/vnd.etsi.asic-s+zip': { + source: 'iana', compressible: false, }, - "application/vnd.etsi.cug+xml": { - source: "iana", + 'application/vnd.etsi.cug+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvcommand+xml": { - source: "iana", + 'application/vnd.etsi.iptvcommand+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvdiscovery+xml": { - source: "iana", + 'application/vnd.etsi.iptvdiscovery+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvprofile+xml": { - source: "iana", + 'application/vnd.etsi.iptvprofile+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvsad-bc+xml": { - source: "iana", + 'application/vnd.etsi.iptvsad-bc+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvsad-cod+xml": { - source: "iana", + 'application/vnd.etsi.iptvsad-cod+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvsad-npvr+xml": { - source: "iana", + 'application/vnd.etsi.iptvsad-npvr+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvservice+xml": { - source: "iana", + 'application/vnd.etsi.iptvservice+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvsync+xml": { - source: "iana", + 'application/vnd.etsi.iptvsync+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.iptvueprofile+xml": { - source: "iana", + 'application/vnd.etsi.iptvueprofile+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.mcid+xml": { - source: "iana", + 'application/vnd.etsi.mcid+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.mheg5": { - source: "iana", + 'application/vnd.etsi.mheg5': { + source: 'iana', }, - "application/vnd.etsi.overload-control-policy-dataset+xml": { - source: "iana", + 'application/vnd.etsi.overload-control-policy-dataset+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.pstn+xml": { - source: "iana", + 'application/vnd.etsi.pstn+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.sci+xml": { - source: "iana", + 'application/vnd.etsi.sci+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.simservs+xml": { - source: "iana", + 'application/vnd.etsi.simservs+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.timestamp-token": { - source: "iana", + 'application/vnd.etsi.timestamp-token': { + source: 'iana', }, - "application/vnd.etsi.tsl+xml": { - source: "iana", + 'application/vnd.etsi.tsl+xml': { + source: 'iana', compressible: true, }, - "application/vnd.etsi.tsl.der": { - source: "iana", + 'application/vnd.etsi.tsl.der': { + source: 'iana', }, - "application/vnd.eu.kasparian.car+json": { - source: "iana", + 'application/vnd.eu.kasparian.car+json': { + source: 'iana', compressible: true, }, - "application/vnd.eudora.data": { - source: "iana", + 'application/vnd.eudora.data': { + source: 'iana', }, - "application/vnd.evolv.ecig.profile": { - source: "iana", + 'application/vnd.evolv.ecig.profile': { + source: 'iana', }, - "application/vnd.evolv.ecig.settings": { - source: "iana", + 'application/vnd.evolv.ecig.settings': { + source: 'iana', }, - "application/vnd.evolv.ecig.theme": { - source: "iana", + 'application/vnd.evolv.ecig.theme': { + source: 'iana', }, - "application/vnd.exstream-empower+zip": { - source: "iana", + 'application/vnd.exstream-empower+zip': { + source: 'iana', compressible: false, }, - "application/vnd.exstream-package": { - source: "iana", + 'application/vnd.exstream-package': { + source: 'iana', }, - "application/vnd.ezpix-album": { - source: "iana", - extensions: ["ez2"], + 'application/vnd.ezpix-album': { + source: 'iana', + extensions: ['ez2'], }, - "application/vnd.ezpix-package": { - source: "iana", - extensions: ["ez3"], + 'application/vnd.ezpix-package': { + source: 'iana', + extensions: ['ez3'], }, - "application/vnd.f-secure.mobile": { - source: "iana", + 'application/vnd.f-secure.mobile': { + source: 'iana', }, - "application/vnd.familysearch.gedcom+zip": { - source: "iana", + 'application/vnd.familysearch.gedcom+zip': { + source: 'iana', compressible: false, }, - "application/vnd.fastcopy-disk-image": { - source: "iana", + 'application/vnd.fastcopy-disk-image': { + source: 'iana', }, - "application/vnd.fdf": { - source: "apache", - extensions: ["fdf"], + 'application/vnd.fdf': { + source: 'apache', + extensions: ['fdf'], }, - "application/vnd.fdsn.mseed": { - source: "iana", - extensions: ["mseed"], + 'application/vnd.fdsn.mseed': { + source: 'iana', + extensions: ['mseed'], }, - "application/vnd.fdsn.seed": { - source: "iana", - extensions: ["seed", "dataless"], + 'application/vnd.fdsn.seed': { + source: 'iana', + extensions: ['seed', 'dataless'], }, - "application/vnd.ffsns": { - source: "iana", + 'application/vnd.ffsns': { + source: 'iana', }, - "application/vnd.ficlab.flb+zip": { - source: "iana", + 'application/vnd.ficlab.flb+zip': { + source: 'iana', compressible: false, }, - "application/vnd.filmit.zfc": { - source: "iana", + 'application/vnd.filmit.zfc': { + source: 'iana', }, - "application/vnd.fints": { - source: "iana", + 'application/vnd.fints': { + source: 'iana', }, - "application/vnd.firemonkeys.cloudcell": { - source: "iana", + 'application/vnd.firemonkeys.cloudcell': { + source: 'iana', }, - "application/vnd.flographit": { - source: "iana", - extensions: ["gph"], + 'application/vnd.flographit': { + source: 'iana', + extensions: ['gph'], }, - "application/vnd.fluxtime.clip": { - source: "iana", - extensions: ["ftc"], + 'application/vnd.fluxtime.clip': { + source: 'iana', + extensions: ['ftc'], }, - "application/vnd.font-fontforge-sfd": { - source: "iana", + 'application/vnd.font-fontforge-sfd': { + source: 'iana', }, - "application/vnd.framemaker": { - source: "iana", - extensions: ["fm", "frame", "maker", "book"], + 'application/vnd.framemaker': { + source: 'iana', + extensions: ['fm', 'frame', 'maker', 'book'], }, - "application/vnd.frogans.fnc": { - source: "apache", - extensions: ["fnc"], + 'application/vnd.frogans.fnc': { + source: 'apache', + extensions: ['fnc'], }, - "application/vnd.frogans.ltf": { - source: "apache", - extensions: ["ltf"], + 'application/vnd.frogans.ltf': { + source: 'apache', + extensions: ['ltf'], }, - "application/vnd.fsc.weblaunch": { - source: "iana", - extensions: ["fsc"], + 'application/vnd.fsc.weblaunch': { + source: 'iana', + extensions: ['fsc'], }, - "application/vnd.fujifilm.fb.docuworks": { - source: "iana", + 'application/vnd.fujifilm.fb.docuworks': { + source: 'iana', }, - "application/vnd.fujifilm.fb.docuworks.binder": { - source: "iana", + 'application/vnd.fujifilm.fb.docuworks.binder': { + source: 'iana', }, - "application/vnd.fujifilm.fb.docuworks.container": { - source: "iana", + 'application/vnd.fujifilm.fb.docuworks.container': { + source: 'iana', }, - "application/vnd.fujifilm.fb.jfi+xml": { - source: "iana", + 'application/vnd.fujifilm.fb.jfi+xml': { + source: 'iana', compressible: true, }, - "application/vnd.fujitsu.oasys": { - source: "iana", - extensions: ["oas"], + 'application/vnd.fujitsu.oasys': { + source: 'iana', + extensions: ['oas'], }, - "application/vnd.fujitsu.oasys2": { - source: "iana", - extensions: ["oa2"], + 'application/vnd.fujitsu.oasys2': { + source: 'iana', + extensions: ['oa2'], }, - "application/vnd.fujitsu.oasys3": { - source: "iana", - extensions: ["oa3"], + 'application/vnd.fujitsu.oasys3': { + source: 'iana', + extensions: ['oa3'], }, - "application/vnd.fujitsu.oasysgp": { - source: "iana", - extensions: ["fg5"], + 'application/vnd.fujitsu.oasysgp': { + source: 'iana', + extensions: ['fg5'], }, - "application/vnd.fujitsu.oasysprs": { - source: "iana", - extensions: ["bh2"], + 'application/vnd.fujitsu.oasysprs': { + source: 'iana', + extensions: ['bh2'], }, - "application/vnd.fujixerox.art-ex": { - source: "iana", + 'application/vnd.fujixerox.art-ex': { + source: 'iana', }, - "application/vnd.fujixerox.art4": { - source: "iana", + 'application/vnd.fujixerox.art4': { + source: 'iana', }, - "application/vnd.fujixerox.ddd": { - source: "iana", - extensions: ["ddd"], + 'application/vnd.fujixerox.ddd': { + source: 'iana', + extensions: ['ddd'], }, - "application/vnd.fujixerox.docuworks": { - source: "iana", - extensions: ["xdw"], + 'application/vnd.fujixerox.docuworks': { + source: 'iana', + extensions: ['xdw'], }, - "application/vnd.fujixerox.docuworks.binder": { - source: "iana", - extensions: ["xbd"], + 'application/vnd.fujixerox.docuworks.binder': { + source: 'iana', + extensions: ['xbd'], }, - "application/vnd.fujixerox.docuworks.container": { - source: "iana", + 'application/vnd.fujixerox.docuworks.container': { + source: 'iana', }, - "application/vnd.fujixerox.hbpl": { - source: "iana", + 'application/vnd.fujixerox.hbpl': { + source: 'iana', }, - "application/vnd.fut-misnet": { - source: "iana", + 'application/vnd.fut-misnet': { + source: 'iana', }, - "application/vnd.futoin+cbor": { - source: "iana", + 'application/vnd.futoin+cbor': { + source: 'iana', }, - "application/vnd.futoin+json": { - source: "iana", + 'application/vnd.futoin+json': { + source: 'iana', compressible: true, }, - "application/vnd.fuzzysheet": { - source: "iana", - extensions: ["fzs"], + 'application/vnd.fuzzysheet': { + source: 'iana', + extensions: ['fzs'], }, - "application/vnd.genomatix.tuxedo": { - source: "iana", - extensions: ["txd"], + 'application/vnd.genomatix.tuxedo': { + source: 'iana', + extensions: ['txd'], }, - "application/vnd.genozip": { - source: "iana", + 'application/vnd.genozip': { + source: 'iana', }, - "application/vnd.gentics.grd+json": { - source: "iana", + 'application/vnd.gentics.grd+json': { + source: 'iana', compressible: true, }, - "application/vnd.gentoo.catmetadata+xml": { - source: "iana", + 'application/vnd.gentoo.catmetadata+xml': { + source: 'iana', compressible: true, }, - "application/vnd.gentoo.ebuild": { - source: "iana", + 'application/vnd.gentoo.ebuild': { + source: 'iana', }, - "application/vnd.gentoo.eclass": { - source: "iana", + 'application/vnd.gentoo.eclass': { + source: 'iana', }, - "application/vnd.gentoo.gpkg": { - source: "iana", + 'application/vnd.gentoo.gpkg': { + source: 'iana', }, - "application/vnd.gentoo.manifest": { - source: "iana", + 'application/vnd.gentoo.manifest': { + source: 'iana', }, - "application/vnd.gentoo.pkgmetadata+xml": { - source: "iana", + 'application/vnd.gentoo.pkgmetadata+xml': { + source: 'iana', compressible: true, }, - "application/vnd.gentoo.xpak": { - source: "iana", + 'application/vnd.gentoo.xpak': { + source: 'iana', }, - "application/vnd.geo+json": { - source: "apache", + 'application/vnd.geo+json': { + source: 'apache', compressible: true, }, - "application/vnd.geocube+xml": { - source: "apache", + 'application/vnd.geocube+xml': { + source: 'apache', compressible: true, }, - "application/vnd.geogebra.file": { - source: "iana", - extensions: ["ggb"], + 'application/vnd.geogebra.file': { + source: 'iana', + extensions: ['ggb'], }, - "application/vnd.geogebra.slides": { - source: "iana", + 'application/vnd.geogebra.slides': { + source: 'iana', }, - "application/vnd.geogebra.tool": { - source: "iana", - extensions: ["ggt"], + 'application/vnd.geogebra.tool': { + source: 'iana', + extensions: ['ggt'], }, - "application/vnd.geometry-explorer": { - source: "iana", - extensions: ["gex", "gre"], + 'application/vnd.geometry-explorer': { + source: 'iana', + extensions: ['gex', 'gre'], }, - "application/vnd.geonext": { - source: "iana", - extensions: ["gxt"], + 'application/vnd.geonext': { + source: 'iana', + extensions: ['gxt'], }, - "application/vnd.geoplan": { - source: "iana", - extensions: ["g2w"], + 'application/vnd.geoplan': { + source: 'iana', + extensions: ['g2w'], }, - "application/vnd.geospace": { - source: "iana", - extensions: ["g3w"], + 'application/vnd.geospace': { + source: 'iana', + extensions: ['g3w'], }, - "application/vnd.gerber": { - source: "iana", + 'application/vnd.gerber': { + source: 'iana', }, - "application/vnd.globalplatform.card-content-mgt": { - source: "iana", + 'application/vnd.globalplatform.card-content-mgt': { + source: 'iana', }, - "application/vnd.globalplatform.card-content-mgt-response": { - source: "iana", + 'application/vnd.globalplatform.card-content-mgt-response': { + source: 'iana', }, - "application/vnd.gmx": { - source: "iana", - extensions: ["gmx"], + 'application/vnd.gmx': { + source: 'iana', + extensions: ['gmx'], }, - "application/vnd.gnu.taler.exchange+json": { - source: "iana", + 'application/vnd.gnu.taler.exchange+json': { + source: 'iana', compressible: true, }, - "application/vnd.gnu.taler.merchant+json": { - source: "iana", + 'application/vnd.gnu.taler.merchant+json': { + source: 'iana', compressible: true, }, - "application/vnd.google-apps.document": { + 'application/vnd.google-apps.document': { compressible: false, - extensions: ["gdoc"], + extensions: ['gdoc'], }, - "application/vnd.google-apps.presentation": { + 'application/vnd.google-apps.presentation': { compressible: false, - extensions: ["gslides"], + extensions: ['gslides'], }, - "application/vnd.google-apps.spreadsheet": { + 'application/vnd.google-apps.spreadsheet': { compressible: false, - extensions: ["gsheet"], + extensions: ['gsheet'], }, - "application/vnd.google-earth.kml+xml": { - source: "iana", + 'application/vnd.google-earth.kml+xml': { + source: 'iana', compressible: true, - extensions: ["kml"], + extensions: ['kml'], }, - "application/vnd.google-earth.kmz": { - source: "iana", + 'application/vnd.google-earth.kmz': { + source: 'iana', compressible: false, - extensions: ["kmz"], + extensions: ['kmz'], }, - "application/vnd.gov.sk.e-form+xml": { - source: "iana", + 'application/vnd.gov.sk.e-form+xml': { + source: 'iana', compressible: true, }, - "application/vnd.gov.sk.e-form+zip": { - source: "iana", + 'application/vnd.gov.sk.e-form+zip': { + source: 'iana', compressible: false, }, - "application/vnd.gov.sk.xmldatacontainer+xml": { - source: "iana", + 'application/vnd.gov.sk.xmldatacontainer+xml': { + source: 'iana', compressible: true, }, - "application/vnd.gpxsee.map+xml": { - source: "iana", + 'application/vnd.gpxsee.map+xml': { + source: 'iana', compressible: true, }, - "application/vnd.grafeq": { - source: "iana", - extensions: ["gqf", "gqs"], + 'application/vnd.grafeq': { + source: 'iana', + extensions: ['gqf', 'gqs'], }, - "application/vnd.gridmp": { - source: "iana", + 'application/vnd.gridmp': { + source: 'iana', }, - "application/vnd.groove-account": { - source: "iana", - extensions: ["gac"], + 'application/vnd.groove-account': { + source: 'iana', + extensions: ['gac'], }, - "application/vnd.groove-help": { - source: "iana", - extensions: ["ghf"], + 'application/vnd.groove-help': { + source: 'iana', + extensions: ['ghf'], }, - "application/vnd.groove-identity-message": { - source: "iana", - extensions: ["gim"], + 'application/vnd.groove-identity-message': { + source: 'iana', + extensions: ['gim'], }, - "application/vnd.groove-injector": { - source: "iana", - extensions: ["grv"], + 'application/vnd.groove-injector': { + source: 'iana', + extensions: ['grv'], }, - "application/vnd.groove-tool-message": { - source: "iana", - extensions: ["gtm"], + 'application/vnd.groove-tool-message': { + source: 'iana', + extensions: ['gtm'], }, - "application/vnd.groove-tool-template": { - source: "iana", - extensions: ["tpl"], + 'application/vnd.groove-tool-template': { + source: 'iana', + extensions: ['tpl'], }, - "application/vnd.groove-vcard": { - source: "iana", - extensions: ["vcg"], + 'application/vnd.groove-vcard': { + source: 'iana', + extensions: ['vcg'], }, - "application/vnd.hal+json": { - source: "iana", + 'application/vnd.hal+json': { + source: 'iana', compressible: true, }, - "application/vnd.hal+xml": { - source: "iana", + 'application/vnd.hal+xml': { + source: 'iana', compressible: true, - extensions: ["hal"], + extensions: ['hal'], }, - "application/vnd.handheld-entertainment+xml": { - source: "iana", + 'application/vnd.handheld-entertainment+xml': { + source: 'iana', compressible: true, - extensions: ["zmm"], + extensions: ['zmm'], }, - "application/vnd.hbci": { - source: "iana", - extensions: ["hbci"], + 'application/vnd.hbci': { + source: 'iana', + extensions: ['hbci'], }, - "application/vnd.hc+json": { - source: "iana", + 'application/vnd.hc+json': { + source: 'iana', compressible: true, }, - "application/vnd.hcl-bireports": { - source: "iana", + 'application/vnd.hcl-bireports': { + source: 'iana', }, - "application/vnd.hdt": { - source: "iana", + 'application/vnd.hdt': { + source: 'iana', }, - "application/vnd.heroku+json": { - source: "iana", + 'application/vnd.heroku+json': { + source: 'iana', compressible: true, }, - "application/vnd.hhe.lesson-player": { - source: "iana", - extensions: ["les"], + 'application/vnd.hhe.lesson-player': { + source: 'iana', + extensions: ['les'], }, - "application/vnd.hp-hpgl": { - source: "iana", - extensions: ["hpgl"], + 'application/vnd.hp-hpgl': { + source: 'iana', + extensions: ['hpgl'], }, - "application/vnd.hp-hpid": { - source: "iana", - extensions: ["hpid"], + 'application/vnd.hp-hpid': { + source: 'iana', + extensions: ['hpid'], }, - "application/vnd.hp-hps": { - source: "iana", - extensions: ["hps"], + 'application/vnd.hp-hps': { + source: 'iana', + extensions: ['hps'], }, - "application/vnd.hp-jlyt": { - source: "iana", - extensions: ["jlt"], + 'application/vnd.hp-jlyt': { + source: 'iana', + extensions: ['jlt'], }, - "application/vnd.hp-pcl": { - source: "iana", - extensions: ["pcl"], + 'application/vnd.hp-pcl': { + source: 'iana', + extensions: ['pcl'], }, - "application/vnd.hp-pclxl": { - source: "iana", - extensions: ["pclxl"], + 'application/vnd.hp-pclxl': { + source: 'iana', + extensions: ['pclxl'], }, - "application/vnd.hsl": { - source: "iana", + 'application/vnd.hsl': { + source: 'iana', }, - "application/vnd.httphone": { - source: "iana", + 'application/vnd.httphone': { + source: 'iana', }, - "application/vnd.hydrostatix.sof-data": { - source: "iana", - extensions: ["sfd-hdstx"], + 'application/vnd.hydrostatix.sof-data': { + source: 'iana', + extensions: ['sfd-hdstx'], }, - "application/vnd.hyper+json": { - source: "iana", + 'application/vnd.hyper+json': { + source: 'iana', compressible: true, }, - "application/vnd.hyper-item+json": { - source: "iana", + 'application/vnd.hyper-item+json': { + source: 'iana', compressible: true, }, - "application/vnd.hyperdrive+json": { - source: "iana", + 'application/vnd.hyperdrive+json': { + source: 'iana', compressible: true, }, - "application/vnd.hzn-3d-crossword": { - source: "iana", + 'application/vnd.hzn-3d-crossword': { + source: 'iana', }, - "application/vnd.ibm.afplinedata": { - source: "apache", + 'application/vnd.ibm.afplinedata': { + source: 'apache', }, - "application/vnd.ibm.electronic-media": { - source: "iana", + 'application/vnd.ibm.electronic-media': { + source: 'iana', }, - "application/vnd.ibm.minipay": { - source: "iana", - extensions: ["mpy"], + 'application/vnd.ibm.minipay': { + source: 'iana', + extensions: ['mpy'], }, - "application/vnd.ibm.modcap": { - source: "apache", - extensions: ["afp", "listafp", "list3820"], + 'application/vnd.ibm.modcap': { + source: 'apache', + extensions: ['afp', 'listafp', 'list3820'], }, - "application/vnd.ibm.rights-management": { - source: "iana", - extensions: ["irm"], + 'application/vnd.ibm.rights-management': { + source: 'iana', + extensions: ['irm'], }, - "application/vnd.ibm.secure-container": { - source: "iana", - extensions: ["sc"], + 'application/vnd.ibm.secure-container': { + source: 'iana', + extensions: ['sc'], }, - "application/vnd.iccprofile": { - source: "iana", - extensions: ["icc", "icm"], + 'application/vnd.iccprofile': { + source: 'iana', + extensions: ['icc', 'icm'], }, - "application/vnd.ieee.1905": { - source: "iana", + 'application/vnd.ieee.1905': { + source: 'iana', }, - "application/vnd.igloader": { - source: "iana", - extensions: ["igl"], + 'application/vnd.igloader': { + source: 'iana', + extensions: ['igl'], }, - "application/vnd.imagemeter.folder+zip": { - source: "iana", + 'application/vnd.imagemeter.folder+zip': { + source: 'iana', compressible: false, }, - "application/vnd.imagemeter.image+zip": { - source: "iana", + 'application/vnd.imagemeter.image+zip': { + source: 'iana', compressible: false, }, - "application/vnd.immervision-ivp": { - source: "iana", - extensions: ["ivp"], + 'application/vnd.immervision-ivp': { + source: 'iana', + extensions: ['ivp'], }, - "application/vnd.immervision-ivu": { - source: "iana", - extensions: ["ivu"], + 'application/vnd.immervision-ivu': { + source: 'iana', + extensions: ['ivu'], }, - "application/vnd.ims.imsccv1p1": { - source: "iana", + 'application/vnd.ims.imsccv1p1': { + source: 'iana', }, - "application/vnd.ims.imsccv1p2": { - source: "iana", + 'application/vnd.ims.imsccv1p2': { + source: 'iana', }, - "application/vnd.ims.imsccv1p3": { - source: "iana", + 'application/vnd.ims.imsccv1p3': { + source: 'iana', }, - "application/vnd.ims.lis.v2.result+json": { - source: "iana", + 'application/vnd.ims.lis.v2.result+json': { + source: 'iana', compressible: true, }, - "application/vnd.ims.lti.v2.toolconsumerprofile+json": { - source: "iana", + 'application/vnd.ims.lti.v2.toolconsumerprofile+json': { + source: 'iana', compressible: true, }, - "application/vnd.ims.lti.v2.toolproxy+json": { - source: "iana", + 'application/vnd.ims.lti.v2.toolproxy+json': { + source: 'iana', compressible: true, }, - "application/vnd.ims.lti.v2.toolproxy.id+json": { - source: "iana", + 'application/vnd.ims.lti.v2.toolproxy.id+json': { + source: 'iana', compressible: true, }, - "application/vnd.ims.lti.v2.toolsettings+json": { - source: "iana", + 'application/vnd.ims.lti.v2.toolsettings+json': { + source: 'iana', compressible: true, }, - "application/vnd.ims.lti.v2.toolsettings.simple+json": { - source: "iana", + 'application/vnd.ims.lti.v2.toolsettings.simple+json': { + source: 'iana', compressible: true, }, - "application/vnd.informedcontrol.rms+xml": { - source: "iana", + 'application/vnd.informedcontrol.rms+xml': { + source: 'iana', compressible: true, }, - "application/vnd.informix-visionary": { - source: "apache", + 'application/vnd.informix-visionary': { + source: 'apache', }, - "application/vnd.infotech.project": { - source: "iana", + 'application/vnd.infotech.project': { + source: 'iana', }, - "application/vnd.infotech.project+xml": { - source: "iana", + 'application/vnd.infotech.project+xml': { + source: 'iana', compressible: true, }, - "application/vnd.innopath.wamp.notification": { - source: "iana", + 'application/vnd.innopath.wamp.notification': { + source: 'iana', }, - "application/vnd.insors.igm": { - source: "iana", - extensions: ["igm"], + 'application/vnd.insors.igm': { + source: 'iana', + extensions: ['igm'], }, - "application/vnd.intercon.formnet": { - source: "iana", - extensions: ["xpw", "xpx"], + 'application/vnd.intercon.formnet': { + source: 'iana', + extensions: ['xpw', 'xpx'], }, - "application/vnd.intergeo": { - source: "iana", - extensions: ["i2g"], + 'application/vnd.intergeo': { + source: 'iana', + extensions: ['i2g'], }, - "application/vnd.intertrust.digibox": { - source: "iana", + 'application/vnd.intertrust.digibox': { + source: 'iana', }, - "application/vnd.intertrust.nncp": { - source: "iana", + 'application/vnd.intertrust.nncp': { + source: 'iana', }, - "application/vnd.intu.qbo": { - source: "iana", - extensions: ["qbo"], + 'application/vnd.intu.qbo': { + source: 'iana', + extensions: ['qbo'], }, - "application/vnd.intu.qfx": { - source: "iana", - extensions: ["qfx"], + 'application/vnd.intu.qfx': { + source: 'iana', + extensions: ['qfx'], }, - "application/vnd.ipld.car": { - source: "iana", + 'application/vnd.ipld.car': { + source: 'iana', }, - "application/vnd.ipld.dag-cbor": { - source: "iana", + 'application/vnd.ipld.dag-cbor': { + source: 'iana', }, - "application/vnd.ipld.dag-json": { - source: "iana", + 'application/vnd.ipld.dag-json': { + source: 'iana', }, - "application/vnd.ipld.raw": { - source: "iana", + 'application/vnd.ipld.raw': { + source: 'iana', }, - "application/vnd.iptc.g2.catalogitem+xml": { - source: "iana", + 'application/vnd.iptc.g2.catalogitem+xml': { + source: 'iana', compressible: true, }, - "application/vnd.iptc.g2.conceptitem+xml": { - source: "iana", + 'application/vnd.iptc.g2.conceptitem+xml': { + source: 'iana', compressible: true, }, - "application/vnd.iptc.g2.knowledgeitem+xml": { - source: "iana", + 'application/vnd.iptc.g2.knowledgeitem+xml': { + source: 'iana', compressible: true, }, - "application/vnd.iptc.g2.newsitem+xml": { - source: "iana", + 'application/vnd.iptc.g2.newsitem+xml': { + source: 'iana', compressible: true, }, - "application/vnd.iptc.g2.newsmessage+xml": { - source: "iana", + 'application/vnd.iptc.g2.newsmessage+xml': { + source: 'iana', compressible: true, }, - "application/vnd.iptc.g2.packageitem+xml": { - source: "iana", + 'application/vnd.iptc.g2.packageitem+xml': { + source: 'iana', compressible: true, }, - "application/vnd.iptc.g2.planningitem+xml": { - source: "iana", + 'application/vnd.iptc.g2.planningitem+xml': { + source: 'iana', compressible: true, }, - "application/vnd.ipunplugged.rcprofile": { - source: "iana", - extensions: ["rcprofile"], + 'application/vnd.ipunplugged.rcprofile': { + source: 'iana', + extensions: ['rcprofile'], }, - "application/vnd.irepository.package+xml": { - source: "iana", + 'application/vnd.irepository.package+xml': { + source: 'iana', compressible: true, - extensions: ["irp"], + extensions: ['irp'], }, - "application/vnd.is-xpr": { - source: "iana", - extensions: ["xpr"], + 'application/vnd.is-xpr': { + source: 'iana', + extensions: ['xpr'], }, - "application/vnd.isac.fcs": { - source: "iana", - extensions: ["fcs"], + 'application/vnd.isac.fcs': { + source: 'iana', + extensions: ['fcs'], }, - "application/vnd.iso11783-10+zip": { - source: "iana", + 'application/vnd.iso11783-10+zip': { + source: 'iana', compressible: false, }, - "application/vnd.jam": { - source: "iana", - extensions: ["jam"], + 'application/vnd.jam': { + source: 'iana', + extensions: ['jam'], }, - "application/vnd.japannet-directory-service": { - source: "iana", + 'application/vnd.japannet-directory-service': { + source: 'iana', }, - "application/vnd.japannet-jpnstore-wakeup": { - source: "iana", + 'application/vnd.japannet-jpnstore-wakeup': { + source: 'iana', }, - "application/vnd.japannet-payment-wakeup": { - source: "iana", + 'application/vnd.japannet-payment-wakeup': { + source: 'iana', }, - "application/vnd.japannet-registration": { - source: "iana", + 'application/vnd.japannet-registration': { + source: 'iana', }, - "application/vnd.japannet-registration-wakeup": { - source: "iana", + 'application/vnd.japannet-registration-wakeup': { + source: 'iana', }, - "application/vnd.japannet-setstore-wakeup": { - source: "iana", + 'application/vnd.japannet-setstore-wakeup': { + source: 'iana', }, - "application/vnd.japannet-verification": { - source: "iana", + 'application/vnd.japannet-verification': { + source: 'iana', }, - "application/vnd.japannet-verification-wakeup": { - source: "iana", + 'application/vnd.japannet-verification-wakeup': { + source: 'iana', }, - "application/vnd.jcp.javame.midlet-rms": { - source: "iana", - extensions: ["rms"], + 'application/vnd.jcp.javame.midlet-rms': { + source: 'iana', + extensions: ['rms'], }, - "application/vnd.jisp": { - source: "iana", - extensions: ["jisp"], + 'application/vnd.jisp': { + source: 'iana', + extensions: ['jisp'], }, - "application/vnd.joost.joda-archive": { - source: "iana", - extensions: ["joda"], + 'application/vnd.joost.joda-archive': { + source: 'iana', + extensions: ['joda'], }, - "application/vnd.jsk.isdn-ngn": { - source: "iana", + 'application/vnd.jsk.isdn-ngn': { + source: 'iana', }, - "application/vnd.kahootz": { - source: "iana", - extensions: ["ktz", "ktr"], + 'application/vnd.kahootz': { + source: 'iana', + extensions: ['ktz', 'ktr'], }, - "application/vnd.kde.karbon": { - source: "iana", - extensions: ["karbon"], + 'application/vnd.kde.karbon': { + source: 'iana', + extensions: ['karbon'], }, - "application/vnd.kde.kchart": { - source: "iana", - extensions: ["chrt"], + 'application/vnd.kde.kchart': { + source: 'iana', + extensions: ['chrt'], }, - "application/vnd.kde.kformula": { - source: "iana", - extensions: ["kfo"], + 'application/vnd.kde.kformula': { + source: 'iana', + extensions: ['kfo'], }, - "application/vnd.kde.kivio": { - source: "iana", - extensions: ["flw"], + 'application/vnd.kde.kivio': { + source: 'iana', + extensions: ['flw'], }, - "application/vnd.kde.kontour": { - source: "iana", - extensions: ["kon"], + 'application/vnd.kde.kontour': { + source: 'iana', + extensions: ['kon'], }, - "application/vnd.kde.kpresenter": { - source: "iana", - extensions: ["kpr", "kpt"], + 'application/vnd.kde.kpresenter': { + source: 'iana', + extensions: ['kpr', 'kpt'], }, - "application/vnd.kde.kspread": { - source: "iana", - extensions: ["ksp"], + 'application/vnd.kde.kspread': { + source: 'iana', + extensions: ['ksp'], }, - "application/vnd.kde.kword": { - source: "iana", - extensions: ["kwd", "kwt"], + 'application/vnd.kde.kword': { + source: 'iana', + extensions: ['kwd', 'kwt'], }, - "application/vnd.kenameaapp": { - source: "iana", - extensions: ["htke"], + 'application/vnd.kenameaapp': { + source: 'iana', + extensions: ['htke'], }, - "application/vnd.kidspiration": { - source: "iana", - extensions: ["kia"], + 'application/vnd.kidspiration': { + source: 'iana', + extensions: ['kia'], }, - "application/vnd.kinar": { - source: "iana", - extensions: ["kne", "knp"], + 'application/vnd.kinar': { + source: 'iana', + extensions: ['kne', 'knp'], }, - "application/vnd.koan": { - source: "iana", - extensions: ["skp", "skd", "skt", "skm"], + 'application/vnd.koan': { + source: 'iana', + extensions: ['skp', 'skd', 'skt', 'skm'], }, - "application/vnd.kodak-descriptor": { - source: "iana", - extensions: ["sse"], + 'application/vnd.kodak-descriptor': { + source: 'iana', + extensions: ['sse'], }, - "application/vnd.las": { - source: "iana", + 'application/vnd.las': { + source: 'iana', }, - "application/vnd.las.las+json": { - source: "iana", + 'application/vnd.las.las+json': { + source: 'iana', compressible: true, }, - "application/vnd.las.las+xml": { - source: "iana", + 'application/vnd.las.las+xml': { + source: 'iana', compressible: true, - extensions: ["lasxml"], + extensions: ['lasxml'], }, - "application/vnd.laszip": { - source: "iana", + 'application/vnd.laszip': { + source: 'iana', }, - "application/vnd.leap+json": { - source: "iana", + 'application/vnd.leap+json': { + source: 'iana', compressible: true, }, - "application/vnd.liberty-request+xml": { - source: "iana", + 'application/vnd.liberty-request+xml': { + source: 'iana', compressible: true, }, - "application/vnd.llamagraphics.life-balance.desktop": { - source: "iana", - extensions: ["lbd"], + 'application/vnd.llamagraphics.life-balance.desktop': { + source: 'iana', + extensions: ['lbd'], }, - "application/vnd.llamagraphics.life-balance.exchange+xml": { - source: "iana", + 'application/vnd.llamagraphics.life-balance.exchange+xml': { + source: 'iana', compressible: true, - extensions: ["lbe"], + extensions: ['lbe'], }, - "application/vnd.logipipe.circuit+zip": { - source: "iana", + 'application/vnd.logipipe.circuit+zip': { + source: 'iana', compressible: false, }, - "application/vnd.loom": { - source: "iana", + 'application/vnd.loom': { + source: 'iana', }, - "application/vnd.lotus-1-2-3": { - source: "iana", - extensions: ["123"], + 'application/vnd.lotus-1-2-3': { + source: 'iana', + extensions: ['123'], }, - "application/vnd.lotus-approach": { - source: "iana", - extensions: ["apr"], + 'application/vnd.lotus-approach': { + source: 'iana', + extensions: ['apr'], }, - "application/vnd.lotus-freelance": { - source: "iana", - extensions: ["pre"], + 'application/vnd.lotus-freelance': { + source: 'iana', + extensions: ['pre'], }, - "application/vnd.lotus-notes": { - source: "iana", - extensions: ["nsf"], + 'application/vnd.lotus-notes': { + source: 'iana', + extensions: ['nsf'], }, - "application/vnd.lotus-organizer": { - source: "iana", - extensions: ["org"], + 'application/vnd.lotus-organizer': { + source: 'iana', + extensions: ['org'], }, - "application/vnd.lotus-screencam": { - source: "iana", - extensions: ["scm"], + 'application/vnd.lotus-screencam': { + source: 'iana', + extensions: ['scm'], }, - "application/vnd.lotus-wordpro": { - source: "iana", - extensions: ["lwp"], + 'application/vnd.lotus-wordpro': { + source: 'iana', + extensions: ['lwp'], }, - "application/vnd.macports.portpkg": { - source: "iana", - extensions: ["portpkg"], + 'application/vnd.macports.portpkg': { + source: 'iana', + extensions: ['portpkg'], }, - "application/vnd.mapbox-vector-tile": { - source: "iana", - extensions: ["mvt"], + 'application/vnd.mapbox-vector-tile': { + source: 'iana', + extensions: ['mvt'], }, - "application/vnd.marlin.drm.actiontoken+xml": { - source: "iana", + 'application/vnd.marlin.drm.actiontoken+xml': { + source: 'iana', compressible: true, }, - "application/vnd.marlin.drm.conftoken+xml": { - source: "iana", + 'application/vnd.marlin.drm.conftoken+xml': { + source: 'iana', compressible: true, }, - "application/vnd.marlin.drm.license+xml": { - source: "iana", + 'application/vnd.marlin.drm.license+xml': { + source: 'iana', compressible: true, }, - "application/vnd.marlin.drm.mdcf": { - source: "iana", + 'application/vnd.marlin.drm.mdcf': { + source: 'iana', }, - "application/vnd.mason+json": { - source: "iana", + 'application/vnd.mason+json': { + source: 'iana', compressible: true, }, - "application/vnd.maxar.archive.3tz+zip": { - source: "iana", + 'application/vnd.maxar.archive.3tz+zip': { + source: 'iana', compressible: false, }, - "application/vnd.maxmind.maxmind-db": { - source: "iana", + 'application/vnd.maxmind.maxmind-db': { + source: 'iana', }, - "application/vnd.mcd": { - source: "iana", - extensions: ["mcd"], + 'application/vnd.mcd': { + source: 'iana', + extensions: ['mcd'], }, - "application/vnd.medcalcdata": { - source: "iana", - extensions: ["mc1"], + 'application/vnd.medcalcdata': { + source: 'iana', + extensions: ['mc1'], }, - "application/vnd.mediastation.cdkey": { - source: "iana", - extensions: ["cdkey"], + 'application/vnd.mediastation.cdkey': { + source: 'iana', + extensions: ['cdkey'], }, - "application/vnd.medicalholodeck.recordxr": { - source: "iana", + 'application/vnd.medicalholodeck.recordxr': { + source: 'iana', }, - "application/vnd.meridian-slingshot": { - source: "iana", + 'application/vnd.meridian-slingshot': { + source: 'iana', }, - "application/vnd.mfer": { - source: "iana", - extensions: ["mwf"], + 'application/vnd.mfer': { + source: 'iana', + extensions: ['mwf'], }, - "application/vnd.mfmp": { - source: "iana", - extensions: ["mfm"], + 'application/vnd.mfmp': { + source: 'iana', + extensions: ['mfm'], }, - "application/vnd.micro+json": { - source: "iana", + 'application/vnd.micro+json': { + source: 'iana', compressible: true, }, - "application/vnd.micrografx.flo": { - source: "iana", - extensions: ["flo"], + 'application/vnd.micrografx.flo': { + source: 'iana', + extensions: ['flo'], }, - "application/vnd.micrografx.igx": { - source: "iana", - extensions: ["igx"], + 'application/vnd.micrografx.igx': { + source: 'iana', + extensions: ['igx'], }, - "application/vnd.microsoft.portable-executable": { - source: "iana", + 'application/vnd.microsoft.portable-executable': { + source: 'iana', }, - "application/vnd.microsoft.windows.thumbnail-cache": { - source: "iana", + 'application/vnd.microsoft.windows.thumbnail-cache': { + source: 'iana', }, - "application/vnd.miele+json": { - source: "iana", + 'application/vnd.miele+json': { + source: 'iana', compressible: true, }, - "application/vnd.mif": { - source: "iana", - extensions: ["mif"], + 'application/vnd.mif': { + source: 'iana', + extensions: ['mif'], }, - "application/vnd.minisoft-hp3000-save": { - source: "iana", + 'application/vnd.minisoft-hp3000-save': { + source: 'iana', }, - "application/vnd.mitsubishi.misty-guard.trustweb": { - source: "iana", + 'application/vnd.mitsubishi.misty-guard.trustweb': { + source: 'iana', }, - "application/vnd.mobius.daf": { - source: "iana", - extensions: ["daf"], + 'application/vnd.mobius.daf': { + source: 'iana', + extensions: ['daf'], }, - "application/vnd.mobius.dis": { - source: "iana", - extensions: ["dis"], + 'application/vnd.mobius.dis': { + source: 'iana', + extensions: ['dis'], }, - "application/vnd.mobius.mbk": { - source: "iana", - extensions: ["mbk"], + 'application/vnd.mobius.mbk': { + source: 'iana', + extensions: ['mbk'], }, - "application/vnd.mobius.mqy": { - source: "iana", - extensions: ["mqy"], + 'application/vnd.mobius.mqy': { + source: 'iana', + extensions: ['mqy'], }, - "application/vnd.mobius.msl": { - source: "iana", - extensions: ["msl"], + 'application/vnd.mobius.msl': { + source: 'iana', + extensions: ['msl'], }, - "application/vnd.mobius.plc": { - source: "iana", - extensions: ["plc"], + 'application/vnd.mobius.plc': { + source: 'iana', + extensions: ['plc'], }, - "application/vnd.mobius.txf": { - source: "iana", - extensions: ["txf"], + 'application/vnd.mobius.txf': { + source: 'iana', + extensions: ['txf'], }, - "application/vnd.mophun.application": { - source: "iana", - extensions: ["mpn"], + 'application/vnd.mophun.application': { + source: 'iana', + extensions: ['mpn'], }, - "application/vnd.mophun.certificate": { - source: "iana", - extensions: ["mpc"], + 'application/vnd.mophun.certificate': { + source: 'iana', + extensions: ['mpc'], }, - "application/vnd.motorola.flexsuite": { - source: "iana", + 'application/vnd.motorola.flexsuite': { + source: 'iana', }, - "application/vnd.motorola.flexsuite.adsi": { - source: "iana", + 'application/vnd.motorola.flexsuite.adsi': { + source: 'iana', }, - "application/vnd.motorola.flexsuite.fis": { - source: "iana", + 'application/vnd.motorola.flexsuite.fis': { + source: 'iana', }, - "application/vnd.motorola.flexsuite.gotap": { - source: "iana", + 'application/vnd.motorola.flexsuite.gotap': { + source: 'iana', }, - "application/vnd.motorola.flexsuite.kmr": { - source: "iana", + 'application/vnd.motorola.flexsuite.kmr': { + source: 'iana', }, - "application/vnd.motorola.flexsuite.ttc": { - source: "iana", + 'application/vnd.motorola.flexsuite.ttc': { + source: 'iana', }, - "application/vnd.motorola.flexsuite.wem": { - source: "iana", + 'application/vnd.motorola.flexsuite.wem': { + source: 'iana', }, - "application/vnd.motorola.iprm": { - source: "iana", + 'application/vnd.motorola.iprm': { + source: 'iana', }, - "application/vnd.mozilla.xul+xml": { - source: "iana", + 'application/vnd.mozilla.xul+xml': { + source: 'iana', compressible: true, - extensions: ["xul"], + extensions: ['xul'], }, - "application/vnd.ms-3mfdocument": { - source: "iana", + 'application/vnd.ms-3mfdocument': { + source: 'iana', }, - "application/vnd.ms-artgalry": { - source: "iana", - extensions: ["cil"], + 'application/vnd.ms-artgalry': { + source: 'iana', + extensions: ['cil'], }, - "application/vnd.ms-asf": { - source: "iana", + 'application/vnd.ms-asf': { + source: 'iana', }, - "application/vnd.ms-cab-compressed": { - source: "iana", - extensions: ["cab"], + 'application/vnd.ms-cab-compressed': { + source: 'iana', + extensions: ['cab'], }, - "application/vnd.ms-color.iccprofile": { - source: "apache", + 'application/vnd.ms-color.iccprofile': { + source: 'apache', }, - "application/vnd.ms-excel": { - source: "iana", + 'application/vnd.ms-excel': { + source: 'iana', compressible: false, - extensions: ["xls", "xlm", "xla", "xlc", "xlt", "xlw"], + extensions: ['xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw'], }, - "application/vnd.ms-excel.addin.macroenabled.12": { - source: "iana", - extensions: ["xlam"], + 'application/vnd.ms-excel.addin.macroenabled.12': { + source: 'iana', + extensions: ['xlam'], }, - "application/vnd.ms-excel.sheet.binary.macroenabled.12": { - source: "iana", - extensions: ["xlsb"], + 'application/vnd.ms-excel.sheet.binary.macroenabled.12': { + source: 'iana', + extensions: ['xlsb'], }, - "application/vnd.ms-excel.sheet.macroenabled.12": { - source: "iana", - extensions: ["xlsm"], + 'application/vnd.ms-excel.sheet.macroenabled.12': { + source: 'iana', + extensions: ['xlsm'], }, - "application/vnd.ms-excel.template.macroenabled.12": { - source: "iana", - extensions: ["xltm"], + 'application/vnd.ms-excel.template.macroenabled.12': { + source: 'iana', + extensions: ['xltm'], }, - "application/vnd.ms-fontobject": { - source: "iana", + 'application/vnd.ms-fontobject': { + source: 'iana', compressible: true, - extensions: ["eot"], + extensions: ['eot'], }, - "application/vnd.ms-htmlhelp": { - source: "iana", - extensions: ["chm"], + 'application/vnd.ms-htmlhelp': { + source: 'iana', + extensions: ['chm'], }, - "application/vnd.ms-ims": { - source: "iana", - extensions: ["ims"], + 'application/vnd.ms-ims': { + source: 'iana', + extensions: ['ims'], }, - "application/vnd.ms-lrm": { - source: "iana", - extensions: ["lrm"], + 'application/vnd.ms-lrm': { + source: 'iana', + extensions: ['lrm'], }, - "application/vnd.ms-office.activex+xml": { - source: "iana", + 'application/vnd.ms-office.activex+xml': { + source: 'iana', compressible: true, }, - "application/vnd.ms-officetheme": { - source: "iana", - extensions: ["thmx"], + 'application/vnd.ms-officetheme': { + source: 'iana', + extensions: ['thmx'], }, - "application/vnd.ms-opentype": { - source: "apache", + 'application/vnd.ms-opentype': { + source: 'apache', compressible: true, }, - "application/vnd.ms-outlook": { + 'application/vnd.ms-outlook': { compressible: false, - extensions: ["msg"], + extensions: ['msg'], }, - "application/vnd.ms-package.obfuscated-opentype": { - source: "apache", + 'application/vnd.ms-package.obfuscated-opentype': { + source: 'apache', }, - "application/vnd.ms-pki.seccat": { - source: "apache", - extensions: ["cat"], + 'application/vnd.ms-pki.seccat': { + source: 'apache', + extensions: ['cat'], }, - "application/vnd.ms-pki.stl": { - source: "apache", - extensions: ["stl"], + 'application/vnd.ms-pki.stl': { + source: 'apache', + extensions: ['stl'], }, - "application/vnd.ms-playready.initiator+xml": { - source: "iana", + 'application/vnd.ms-playready.initiator+xml': { + source: 'iana', compressible: true, }, - "application/vnd.ms-powerpoint": { - source: "iana", + 'application/vnd.ms-powerpoint': { + source: 'iana', compressible: false, - extensions: ["ppt", "pps", "pot"], + extensions: ['ppt', 'pps', 'pot'], }, - "application/vnd.ms-powerpoint.addin.macroenabled.12": { - source: "iana", - extensions: ["ppam"], + 'application/vnd.ms-powerpoint.addin.macroenabled.12': { + source: 'iana', + extensions: ['ppam'], }, - "application/vnd.ms-powerpoint.presentation.macroenabled.12": { - source: "iana", - extensions: ["pptm"], + 'application/vnd.ms-powerpoint.presentation.macroenabled.12': { + source: 'iana', + extensions: ['pptm'], }, - "application/vnd.ms-powerpoint.slide.macroenabled.12": { - source: "iana", - extensions: ["sldm"], + 'application/vnd.ms-powerpoint.slide.macroenabled.12': { + source: 'iana', + extensions: ['sldm'], }, - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { - source: "iana", - extensions: ["ppsm"], + 'application/vnd.ms-powerpoint.slideshow.macroenabled.12': { + source: 'iana', + extensions: ['ppsm'], }, - "application/vnd.ms-powerpoint.template.macroenabled.12": { - source: "iana", - extensions: ["potm"], + 'application/vnd.ms-powerpoint.template.macroenabled.12': { + source: 'iana', + extensions: ['potm'], }, - "application/vnd.ms-printdevicecapabilities+xml": { - source: "iana", + 'application/vnd.ms-printdevicecapabilities+xml': { + source: 'iana', compressible: true, }, - "application/vnd.ms-printing.printticket+xml": { - source: "apache", + 'application/vnd.ms-printing.printticket+xml': { + source: 'apache', compressible: true, }, - "application/vnd.ms-printschematicket+xml": { - source: "iana", + 'application/vnd.ms-printschematicket+xml': { + source: 'iana', compressible: true, }, - "application/vnd.ms-project": { - source: "iana", - extensions: ["mpp", "mpt"], + 'application/vnd.ms-project': { + source: 'iana', + extensions: ['mpp', 'mpt'], }, - "application/vnd.ms-tnef": { - source: "iana", + 'application/vnd.ms-tnef': { + source: 'iana', }, - "application/vnd.ms-windows.devicepairing": { - source: "iana", + 'application/vnd.ms-windows.devicepairing': { + source: 'iana', }, - "application/vnd.ms-windows.nwprinting.oob": { - source: "iana", + 'application/vnd.ms-windows.nwprinting.oob': { + source: 'iana', }, - "application/vnd.ms-windows.printerpairing": { - source: "iana", + 'application/vnd.ms-windows.printerpairing': { + source: 'iana', }, - "application/vnd.ms-windows.wsd.oob": { - source: "iana", + 'application/vnd.ms-windows.wsd.oob': { + source: 'iana', }, - "application/vnd.ms-wmdrm.lic-chlg-req": { - source: "iana", + 'application/vnd.ms-wmdrm.lic-chlg-req': { + source: 'iana', }, - "application/vnd.ms-wmdrm.lic-resp": { - source: "iana", + 'application/vnd.ms-wmdrm.lic-resp': { + source: 'iana', }, - "application/vnd.ms-wmdrm.meter-chlg-req": { - source: "iana", + 'application/vnd.ms-wmdrm.meter-chlg-req': { + source: 'iana', }, - "application/vnd.ms-wmdrm.meter-resp": { - source: "iana", + 'application/vnd.ms-wmdrm.meter-resp': { + source: 'iana', }, - "application/vnd.ms-word.document.macroenabled.12": { - source: "iana", - extensions: ["docm"], + 'application/vnd.ms-word.document.macroenabled.12': { + source: 'iana', + extensions: ['docm'], }, - "application/vnd.ms-word.template.macroenabled.12": { - source: "iana", - extensions: ["dotm"], + 'application/vnd.ms-word.template.macroenabled.12': { + source: 'iana', + extensions: ['dotm'], }, - "application/vnd.ms-works": { - source: "iana", - extensions: ["wps", "wks", "wcm", "wdb"], + 'application/vnd.ms-works': { + source: 'iana', + extensions: ['wps', 'wks', 'wcm', 'wdb'], }, - "application/vnd.ms-wpl": { - source: "iana", - extensions: ["wpl"], + 'application/vnd.ms-wpl': { + source: 'iana', + extensions: ['wpl'], }, - "application/vnd.ms-xpsdocument": { - source: "iana", + 'application/vnd.ms-xpsdocument': { + source: 'iana', compressible: false, - extensions: ["xps"], + extensions: ['xps'], }, - "application/vnd.msa-disk-image": { - source: "iana", + 'application/vnd.msa-disk-image': { + source: 'iana', }, - "application/vnd.mseq": { - source: "iana", - extensions: ["mseq"], + 'application/vnd.mseq': { + source: 'iana', + extensions: ['mseq'], }, - "application/vnd.msign": { - source: "iana", + 'application/vnd.msign': { + source: 'iana', }, - "application/vnd.multiad.creator": { - source: "iana", + 'application/vnd.multiad.creator': { + source: 'iana', }, - "application/vnd.multiad.creator.cif": { - source: "iana", + 'application/vnd.multiad.creator.cif': { + source: 'iana', }, - "application/vnd.music-niff": { - source: "iana", + 'application/vnd.music-niff': { + source: 'iana', }, - "application/vnd.musician": { - source: "iana", - extensions: ["mus"], + 'application/vnd.musician': { + source: 'iana', + extensions: ['mus'], }, - "application/vnd.muvee.style": { - source: "iana", - extensions: ["msty"], + 'application/vnd.muvee.style': { + source: 'iana', + extensions: ['msty'], }, - "application/vnd.mynfc": { - source: "iana", - extensions: ["taglet"], + 'application/vnd.mynfc': { + source: 'iana', + extensions: ['taglet'], }, - "application/vnd.nacamar.ybrid+json": { - source: "iana", + 'application/vnd.nacamar.ybrid+json': { + source: 'iana', compressible: true, }, - "application/vnd.ncd.control": { - source: "iana", + 'application/vnd.ncd.control': { + source: 'iana', }, - "application/vnd.ncd.reference": { - source: "iana", + 'application/vnd.ncd.reference': { + source: 'iana', }, - "application/vnd.nearst.inv+json": { - source: "iana", + 'application/vnd.nearst.inv+json': { + source: 'iana', compressible: true, }, - "application/vnd.nebumind.line": { - source: "iana", + 'application/vnd.nebumind.line': { + source: 'iana', }, - "application/vnd.nervana": { - source: "iana", + 'application/vnd.nervana': { + source: 'iana', }, - "application/vnd.netfpx": { - source: "iana", + 'application/vnd.netfpx': { + source: 'iana', }, - "application/vnd.neurolanguage.nlu": { - source: "iana", - extensions: ["nlu"], + 'application/vnd.neurolanguage.nlu': { + source: 'iana', + extensions: ['nlu'], }, - "application/vnd.nimn": { - source: "iana", + 'application/vnd.nimn': { + source: 'iana', }, - "application/vnd.nintendo.nitro.rom": { - source: "iana", + 'application/vnd.nintendo.nitro.rom': { + source: 'iana', }, - "application/vnd.nintendo.snes.rom": { - source: "iana", + 'application/vnd.nintendo.snes.rom': { + source: 'iana', }, - "application/vnd.nitf": { - source: "iana", - extensions: ["ntf", "nitf"], + 'application/vnd.nitf': { + source: 'iana', + extensions: ['ntf', 'nitf'], }, - "application/vnd.noblenet-directory": { - source: "iana", - extensions: ["nnd"], + 'application/vnd.noblenet-directory': { + source: 'iana', + extensions: ['nnd'], }, - "application/vnd.noblenet-sealer": { - source: "iana", - extensions: ["nns"], + 'application/vnd.noblenet-sealer': { + source: 'iana', + extensions: ['nns'], }, - "application/vnd.noblenet-web": { - source: "iana", - extensions: ["nnw"], + 'application/vnd.noblenet-web': { + source: 'iana', + extensions: ['nnw'], }, - "application/vnd.nokia.catalogs": { - source: "iana", + 'application/vnd.nokia.catalogs': { + source: 'iana', }, - "application/vnd.nokia.conml+wbxml": { - source: "iana", + 'application/vnd.nokia.conml+wbxml': { + source: 'iana', }, - "application/vnd.nokia.conml+xml": { - source: "iana", + 'application/vnd.nokia.conml+xml': { + source: 'iana', compressible: true, }, - "application/vnd.nokia.iptv.config+xml": { - source: "iana", + 'application/vnd.nokia.iptv.config+xml': { + source: 'iana', compressible: true, }, - "application/vnd.nokia.isds-radio-presets": { - source: "iana", + 'application/vnd.nokia.isds-radio-presets': { + source: 'iana', }, - "application/vnd.nokia.landmark+wbxml": { - source: "iana", + 'application/vnd.nokia.landmark+wbxml': { + source: 'iana', }, - "application/vnd.nokia.landmark+xml": { - source: "iana", + 'application/vnd.nokia.landmark+xml': { + source: 'iana', compressible: true, }, - "application/vnd.nokia.landmarkcollection+xml": { - source: "iana", + 'application/vnd.nokia.landmarkcollection+xml': { + source: 'iana', compressible: true, }, - "application/vnd.nokia.n-gage.ac+xml": { - source: "iana", + 'application/vnd.nokia.n-gage.ac+xml': { + source: 'iana', compressible: true, - extensions: ["ac"], + extensions: ['ac'], }, - "application/vnd.nokia.n-gage.data": { - source: "iana", - extensions: ["ngdat"], + 'application/vnd.nokia.n-gage.data': { + source: 'iana', + extensions: ['ngdat'], }, - "application/vnd.nokia.n-gage.symbian.install": { - source: "apache", - extensions: ["n-gage"], + 'application/vnd.nokia.n-gage.symbian.install': { + source: 'apache', + extensions: ['n-gage'], }, - "application/vnd.nokia.ncd": { - source: "iana", + 'application/vnd.nokia.ncd': { + source: 'iana', }, - "application/vnd.nokia.pcd+wbxml": { - source: "iana", + 'application/vnd.nokia.pcd+wbxml': { + source: 'iana', }, - "application/vnd.nokia.pcd+xml": { - source: "iana", + 'application/vnd.nokia.pcd+xml': { + source: 'iana', compressible: true, }, - "application/vnd.nokia.radio-preset": { - source: "iana", - extensions: ["rpst"], + 'application/vnd.nokia.radio-preset': { + source: 'iana', + extensions: ['rpst'], }, - "application/vnd.nokia.radio-presets": { - source: "iana", - extensions: ["rpss"], + 'application/vnd.nokia.radio-presets': { + source: 'iana', + extensions: ['rpss'], }, - "application/vnd.novadigm.edm": { - source: "iana", - extensions: ["edm"], + 'application/vnd.novadigm.edm': { + source: 'iana', + extensions: ['edm'], }, - "application/vnd.novadigm.edx": { - source: "iana", - extensions: ["edx"], + 'application/vnd.novadigm.edx': { + source: 'iana', + extensions: ['edx'], }, - "application/vnd.novadigm.ext": { - source: "iana", - extensions: ["ext"], + 'application/vnd.novadigm.ext': { + source: 'iana', + extensions: ['ext'], }, - "application/vnd.ntt-local.content-share": { - source: "iana", + 'application/vnd.ntt-local.content-share': { + source: 'iana', }, - "application/vnd.ntt-local.file-transfer": { - source: "iana", + 'application/vnd.ntt-local.file-transfer': { + source: 'iana', }, - "application/vnd.ntt-local.ogw_remote-access": { - source: "iana", + 'application/vnd.ntt-local.ogw_remote-access': { + source: 'iana', }, - "application/vnd.ntt-local.sip-ta_remote": { - source: "iana", + 'application/vnd.ntt-local.sip-ta_remote': { + source: 'iana', }, - "application/vnd.ntt-local.sip-ta_tcp_stream": { - source: "iana", + 'application/vnd.ntt-local.sip-ta_tcp_stream': { + source: 'iana', }, - "application/vnd.oasis.opendocument.base": { - source: "iana", + 'application/vnd.oasis.opendocument.base': { + source: 'iana', }, - "application/vnd.oasis.opendocument.chart": { - source: "iana", - extensions: ["odc"], + 'application/vnd.oasis.opendocument.chart': { + source: 'iana', + extensions: ['odc'], }, - "application/vnd.oasis.opendocument.chart-template": { - source: "iana", - extensions: ["otc"], + 'application/vnd.oasis.opendocument.chart-template': { + source: 'iana', + extensions: ['otc'], }, - "application/vnd.oasis.opendocument.database": { - source: "apache", - extensions: ["odb"], + 'application/vnd.oasis.opendocument.database': { + source: 'apache', + extensions: ['odb'], }, - "application/vnd.oasis.opendocument.formula": { - source: "iana", - extensions: ["odf"], + 'application/vnd.oasis.opendocument.formula': { + source: 'iana', + extensions: ['odf'], }, - "application/vnd.oasis.opendocument.formula-template": { - source: "iana", - extensions: ["odft"], + 'application/vnd.oasis.opendocument.formula-template': { + source: 'iana', + extensions: ['odft'], }, - "application/vnd.oasis.opendocument.graphics": { - source: "iana", + 'application/vnd.oasis.opendocument.graphics': { + source: 'iana', compressible: false, - extensions: ["odg"], + extensions: ['odg'], }, - "application/vnd.oasis.opendocument.graphics-template": { - source: "iana", - extensions: ["otg"], + 'application/vnd.oasis.opendocument.graphics-template': { + source: 'iana', + extensions: ['otg'], }, - "application/vnd.oasis.opendocument.image": { - source: "iana", - extensions: ["odi"], + 'application/vnd.oasis.opendocument.image': { + source: 'iana', + extensions: ['odi'], }, - "application/vnd.oasis.opendocument.image-template": { - source: "iana", - extensions: ["oti"], + 'application/vnd.oasis.opendocument.image-template': { + source: 'iana', + extensions: ['oti'], }, - "application/vnd.oasis.opendocument.presentation": { - source: "iana", + 'application/vnd.oasis.opendocument.presentation': { + source: 'iana', compressible: false, - extensions: ["odp"], + extensions: ['odp'], }, - "application/vnd.oasis.opendocument.presentation-template": { - source: "iana", - extensions: ["otp"], + 'application/vnd.oasis.opendocument.presentation-template': { + source: 'iana', + extensions: ['otp'], }, - "application/vnd.oasis.opendocument.spreadsheet": { - source: "iana", + 'application/vnd.oasis.opendocument.spreadsheet': { + source: 'iana', compressible: false, - extensions: ["ods"], + extensions: ['ods'], }, - "application/vnd.oasis.opendocument.spreadsheet-template": { - source: "iana", - extensions: ["ots"], + 'application/vnd.oasis.opendocument.spreadsheet-template': { + source: 'iana', + extensions: ['ots'], }, - "application/vnd.oasis.opendocument.text": { - source: "iana", + 'application/vnd.oasis.opendocument.text': { + source: 'iana', compressible: false, - extensions: ["odt"], + extensions: ['odt'], }, - "application/vnd.oasis.opendocument.text-master": { - source: "iana", - extensions: ["odm"], + 'application/vnd.oasis.opendocument.text-master': { + source: 'iana', + extensions: ['odm'], }, - "application/vnd.oasis.opendocument.text-template": { - source: "iana", - extensions: ["ott"], + 'application/vnd.oasis.opendocument.text-template': { + source: 'iana', + extensions: ['ott'], }, - "application/vnd.oasis.opendocument.text-web": { - source: "iana", - extensions: ["oth"], + 'application/vnd.oasis.opendocument.text-web': { + source: 'iana', + extensions: ['oth'], }, - "application/vnd.obn": { - source: "iana", + 'application/vnd.obn': { + source: 'iana', }, - "application/vnd.ocf+cbor": { - source: "iana", + 'application/vnd.ocf+cbor': { + source: 'iana', }, - "application/vnd.oci.image.manifest.v1+json": { - source: "iana", + 'application/vnd.oci.image.manifest.v1+json': { + source: 'iana', compressible: true, }, - "application/vnd.oftn.l10n+json": { - source: "iana", + 'application/vnd.oftn.l10n+json': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.contentaccessdownload+xml": { - source: "iana", + 'application/vnd.oipf.contentaccessdownload+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.contentaccessstreaming+xml": { - source: "iana", + 'application/vnd.oipf.contentaccessstreaming+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.cspg-hexbinary": { - source: "iana", + 'application/vnd.oipf.cspg-hexbinary': { + source: 'iana', }, - "application/vnd.oipf.dae.svg+xml": { - source: "iana", + 'application/vnd.oipf.dae.svg+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.dae.xhtml+xml": { - source: "iana", + 'application/vnd.oipf.dae.xhtml+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.mippvcontrolmessage+xml": { - source: "iana", + 'application/vnd.oipf.mippvcontrolmessage+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.pae.gem": { - source: "iana", + 'application/vnd.oipf.pae.gem': { + source: 'iana', }, - "application/vnd.oipf.spdiscovery+xml": { - source: "iana", + 'application/vnd.oipf.spdiscovery+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.spdlist+xml": { - source: "iana", + 'application/vnd.oipf.spdlist+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.ueprofile+xml": { - source: "iana", + 'application/vnd.oipf.ueprofile+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oipf.userprofile+xml": { - source: "iana", + 'application/vnd.oipf.userprofile+xml': { + source: 'iana', compressible: true, }, - "application/vnd.olpc-sugar": { - source: "iana", - extensions: ["xo"], + 'application/vnd.olpc-sugar': { + source: 'iana', + extensions: ['xo'], }, - "application/vnd.oma-scws-config": { - source: "iana", + 'application/vnd.oma-scws-config': { + source: 'iana', }, - "application/vnd.oma-scws-http-request": { - source: "iana", + 'application/vnd.oma-scws-http-request': { + source: 'iana', }, - "application/vnd.oma-scws-http-response": { - source: "iana", + 'application/vnd.oma-scws-http-response': { + source: 'iana', }, - "application/vnd.oma.bcast.associated-procedure-parameter+xml": { - source: "iana", + 'application/vnd.oma.bcast.associated-procedure-parameter+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.bcast.drm-trigger+xml": { - source: "apache", + 'application/vnd.oma.bcast.drm-trigger+xml': { + source: 'apache', compressible: true, }, - "application/vnd.oma.bcast.imd+xml": { - source: "iana", + 'application/vnd.oma.bcast.imd+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.bcast.ltkm": { - source: "iana", + 'application/vnd.oma.bcast.ltkm': { + source: 'iana', }, - "application/vnd.oma.bcast.notification+xml": { - source: "iana", + 'application/vnd.oma.bcast.notification+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.bcast.provisioningtrigger": { - source: "iana", + 'application/vnd.oma.bcast.provisioningtrigger': { + source: 'iana', }, - "application/vnd.oma.bcast.sgboot": { - source: "iana", + 'application/vnd.oma.bcast.sgboot': { + source: 'iana', }, - "application/vnd.oma.bcast.sgdd+xml": { - source: "iana", + 'application/vnd.oma.bcast.sgdd+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.bcast.sgdu": { - source: "iana", + 'application/vnd.oma.bcast.sgdu': { + source: 'iana', }, - "application/vnd.oma.bcast.simple-symbol-container": { - source: "iana", + 'application/vnd.oma.bcast.simple-symbol-container': { + source: 'iana', }, - "application/vnd.oma.bcast.smartcard-trigger+xml": { - source: "apache", + 'application/vnd.oma.bcast.smartcard-trigger+xml': { + source: 'apache', compressible: true, }, - "application/vnd.oma.bcast.sprov+xml": { - source: "iana", + 'application/vnd.oma.bcast.sprov+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.bcast.stkm": { - source: "iana", + 'application/vnd.oma.bcast.stkm': { + source: 'iana', }, - "application/vnd.oma.cab-address-book+xml": { - source: "iana", + 'application/vnd.oma.cab-address-book+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.cab-feature-handler+xml": { - source: "iana", + 'application/vnd.oma.cab-feature-handler+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.cab-pcc+xml": { - source: "iana", + 'application/vnd.oma.cab-pcc+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.cab-subs-invite+xml": { - source: "iana", + 'application/vnd.oma.cab-subs-invite+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.cab-user-prefs+xml": { - source: "iana", + 'application/vnd.oma.cab-user-prefs+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.dcd": { - source: "iana", + 'application/vnd.oma.dcd': { + source: 'iana', }, - "application/vnd.oma.dcdc": { - source: "iana", + 'application/vnd.oma.dcdc': { + source: 'iana', }, - "application/vnd.oma.dd2+xml": { - source: "iana", + 'application/vnd.oma.dd2+xml': { + source: 'iana', compressible: true, - extensions: ["dd2"], + extensions: ['dd2'], }, - "application/vnd.oma.drm.risd+xml": { - source: "iana", + 'application/vnd.oma.drm.risd+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.group-usage-list+xml": { - source: "iana", + 'application/vnd.oma.group-usage-list+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.lwm2m+cbor": { - source: "iana", + 'application/vnd.oma.lwm2m+cbor': { + source: 'iana', }, - "application/vnd.oma.lwm2m+json": { - source: "iana", + 'application/vnd.oma.lwm2m+json': { + source: 'iana', compressible: true, }, - "application/vnd.oma.lwm2m+tlv": { - source: "iana", + 'application/vnd.oma.lwm2m+tlv': { + source: 'iana', }, - "application/vnd.oma.pal+xml": { - source: "iana", + 'application/vnd.oma.pal+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.poc.detailed-progress-report+xml": { - source: "iana", + 'application/vnd.oma.poc.detailed-progress-report+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.poc.final-report+xml": { - source: "iana", + 'application/vnd.oma.poc.final-report+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.poc.groups+xml": { - source: "iana", + 'application/vnd.oma.poc.groups+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.poc.invocation-descriptor+xml": { - source: "iana", + 'application/vnd.oma.poc.invocation-descriptor+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.poc.optimized-progress-report+xml": { - source: "iana", + 'application/vnd.oma.poc.optimized-progress-report+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.push": { - source: "iana", + 'application/vnd.oma.push': { + source: 'iana', }, - "application/vnd.oma.scidm.messages+xml": { - source: "iana", + 'application/vnd.oma.scidm.messages+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oma.xcap-directory+xml": { - source: "iana", + 'application/vnd.oma.xcap-directory+xml': { + source: 'iana', compressible: true, }, - "application/vnd.omads-email+xml": { - source: "iana", - charset: "UTF-8", + 'application/vnd.omads-email+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/vnd.omads-file+xml": { - source: "iana", - charset: "UTF-8", + 'application/vnd.omads-file+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/vnd.omads-folder+xml": { - source: "iana", - charset: "UTF-8", + 'application/vnd.omads-folder+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/vnd.omaloc-supl-init": { - source: "iana", + 'application/vnd.omaloc-supl-init': { + source: 'iana', }, - "application/vnd.onepager": { - source: "iana", + 'application/vnd.onepager': { + source: 'iana', }, - "application/vnd.onepagertamp": { - source: "iana", + 'application/vnd.onepagertamp': { + source: 'iana', }, - "application/vnd.onepagertamx": { - source: "iana", + 'application/vnd.onepagertamx': { + source: 'iana', }, - "application/vnd.onepagertat": { - source: "iana", + 'application/vnd.onepagertat': { + source: 'iana', }, - "application/vnd.onepagertatp": { - source: "iana", + 'application/vnd.onepagertatp': { + source: 'iana', }, - "application/vnd.onepagertatx": { - source: "iana", + 'application/vnd.onepagertatx': { + source: 'iana', }, - "application/vnd.onvif.metadata": { - source: "iana", + 'application/vnd.onvif.metadata': { + source: 'iana', }, - "application/vnd.openblox.game+xml": { - source: "iana", + 'application/vnd.openblox.game+xml': { + source: 'iana', compressible: true, - extensions: ["obgx"], + extensions: ['obgx'], }, - "application/vnd.openblox.game-binary": { - source: "iana", + 'application/vnd.openblox.game-binary': { + source: 'iana', }, - "application/vnd.openeye.oeb": { - source: "iana", + 'application/vnd.openeye.oeb': { + source: 'iana', }, - "application/vnd.openofficeorg.extension": { - source: "apache", - extensions: ["oxt"], + 'application/vnd.openofficeorg.extension': { + source: 'apache', + extensions: ['oxt'], }, - "application/vnd.openstreetmap.data+xml": { - source: "iana", + 'application/vnd.openstreetmap.data+xml': { + source: 'iana', compressible: true, - extensions: ["osm"], + extensions: ['osm'], }, - "application/vnd.opentimestamps.ots": { - source: "iana", + 'application/vnd.opentimestamps.ots': { + source: 'iana', }, - "application/vnd.openxmlformats-officedocument.custom-properties+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.custom-properties+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.customxmlproperties+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.drawing+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.drawing+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.extended-properties+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.extended-properties+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.presentationml.comments+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.presentationml.presentation': { + source: 'iana', compressible: false, - extensions: ["pptx"], + extensions: ['pptx'], }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.presprops+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.slide": { - source: "iana", - extensions: ["sldx"], + 'application/vnd.openxmlformats-officedocument.presentationml.slide': { + source: 'iana', + extensions: ['sldx'], }, - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.presentationml.slide+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { - source: "iana", - extensions: ["ppsx"], + 'application/vnd.openxmlformats-officedocument.presentationml.slideshow': { + source: 'iana', + extensions: ['ppsx'], }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.presentationml.tags+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.template": { - source: "iana", - extensions: ["potx"], + 'application/vnd.openxmlformats-officedocument.presentationml.template': { + source: 'iana', + extensions: ['potx'], }, - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.template.main+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": + 'application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': { + source: 'iana', compressible: false, - extensions: ["xlsx"], + extensions: ['xlsx'], }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { - source: "iana", - extensions: ["xltx"], + 'application/vnd.openxmlformats-officedocument.spreadsheetml.template': { + source: 'iana', + extensions: ['xltx'], }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": + 'application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.theme+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.theme+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.themeoverride+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.themeoverride+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.vmldrawing": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.vmldrawing': { + source: 'iana', }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': { + source: 'iana', compressible: false, - extensions: ["docx"], + extensions: ['docx'], }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { - source: "iana", + 'application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { - source: "iana", - extensions: ["dotx"], + 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': { + source: 'iana', + extensions: ['dotx'], }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": + 'application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml': { - source: "iana", + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-package.core-properties+xml": { - source: "iana", + 'application/vnd.openxmlformats-package.core-properties+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { - source: "iana", + 'application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml': { + source: 'iana', compressible: true, }, - "application/vnd.openxmlformats-package.relationships+xml": { - source: "iana", + 'application/vnd.openxmlformats-package.relationships+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oracle.resource+json": { - source: "iana", + 'application/vnd.oracle.resource+json': { + source: 'iana', compressible: true, }, - "application/vnd.orange.indata": { - source: "iana", + 'application/vnd.orange.indata': { + source: 'iana', }, - "application/vnd.osa.netdeploy": { - source: "iana", + 'application/vnd.osa.netdeploy': { + source: 'iana', }, - "application/vnd.osgeo.mapguide.package": { - source: "iana", - extensions: ["mgp"], + 'application/vnd.osgeo.mapguide.package': { + source: 'iana', + extensions: ['mgp'], }, - "application/vnd.osgi.bundle": { - source: "iana", + 'application/vnd.osgi.bundle': { + source: 'iana', }, - "application/vnd.osgi.dp": { - source: "iana", - extensions: ["dp"], + 'application/vnd.osgi.dp': { + source: 'iana', + extensions: ['dp'], }, - "application/vnd.osgi.subsystem": { - source: "iana", - extensions: ["esa"], + 'application/vnd.osgi.subsystem': { + source: 'iana', + extensions: ['esa'], }, - "application/vnd.otps.ct-kip+xml": { - source: "iana", + 'application/vnd.otps.ct-kip+xml': { + source: 'iana', compressible: true, }, - "application/vnd.oxli.countgraph": { - source: "iana", + 'application/vnd.oxli.countgraph': { + source: 'iana', }, - "application/vnd.pagerduty+json": { - source: "iana", + 'application/vnd.pagerduty+json': { + source: 'iana', compressible: true, }, - "application/vnd.palm": { - source: "iana", - extensions: ["pdb", "pqa", "oprc"], + 'application/vnd.palm': { + source: 'iana', + extensions: ['pdb', 'pqa', 'oprc'], }, - "application/vnd.panoply": { - source: "iana", + 'application/vnd.panoply': { + source: 'iana', }, - "application/vnd.paos.xml": { - source: "iana", + 'application/vnd.paos.xml': { + source: 'iana', }, - "application/vnd.patentdive": { - source: "iana", + 'application/vnd.patentdive': { + source: 'iana', }, - "application/vnd.patientecommsdoc": { - source: "iana", + 'application/vnd.patientecommsdoc': { + source: 'iana', }, - "application/vnd.pawaafile": { - source: "iana", - extensions: ["paw"], + 'application/vnd.pawaafile': { + source: 'iana', + extensions: ['paw'], }, - "application/vnd.pcos": { - source: "iana", + 'application/vnd.pcos': { + source: 'iana', }, - "application/vnd.pg.format": { - source: "iana", - extensions: ["str"], + 'application/vnd.pg.format': { + source: 'iana', + extensions: ['str'], }, - "application/vnd.pg.osasli": { - source: "iana", - extensions: ["ei6"], + 'application/vnd.pg.osasli': { + source: 'iana', + extensions: ['ei6'], }, - "application/vnd.piaccess.application-licence": { - source: "iana", + 'application/vnd.piaccess.application-licence': { + source: 'iana', }, - "application/vnd.picsel": { - source: "iana", - extensions: ["efif"], + 'application/vnd.picsel': { + source: 'iana', + extensions: ['efif'], }, - "application/vnd.pmi.widget": { - source: "iana", - extensions: ["wg"], + 'application/vnd.pmi.widget': { + source: 'iana', + extensions: ['wg'], }, - "application/vnd.poc.group-advertisement+xml": { - source: "iana", + 'application/vnd.poc.group-advertisement+xml': { + source: 'iana', compressible: true, }, - "application/vnd.pocketlearn": { - source: "iana", - extensions: ["plf"], + 'application/vnd.pocketlearn': { + source: 'iana', + extensions: ['plf'], }, - "application/vnd.powerbuilder6": { - source: "iana", - extensions: ["pbd"], + 'application/vnd.powerbuilder6': { + source: 'iana', + extensions: ['pbd'], }, - "application/vnd.powerbuilder6-s": { - source: "iana", + 'application/vnd.powerbuilder6-s': { + source: 'iana', }, - "application/vnd.powerbuilder7": { - source: "iana", + 'application/vnd.powerbuilder7': { + source: 'iana', }, - "application/vnd.powerbuilder7-s": { - source: "iana", + 'application/vnd.powerbuilder7-s': { + source: 'iana', }, - "application/vnd.powerbuilder75": { - source: "iana", + 'application/vnd.powerbuilder75': { + source: 'iana', }, - "application/vnd.powerbuilder75-s": { - source: "iana", + 'application/vnd.powerbuilder75-s': { + source: 'iana', }, - "application/vnd.preminet": { - source: "iana", + 'application/vnd.preminet': { + source: 'iana', }, - "application/vnd.previewsystems.box": { - source: "iana", - extensions: ["box"], + 'application/vnd.previewsystems.box': { + source: 'iana', + extensions: ['box'], }, - "application/vnd.proteus.magazine": { - source: "iana", - extensions: ["mgz"], + 'application/vnd.proteus.magazine': { + source: 'iana', + extensions: ['mgz'], }, - "application/vnd.psfs": { - source: "iana", + 'application/vnd.psfs': { + source: 'iana', }, - "application/vnd.publishare-delta-tree": { - source: "iana", - extensions: ["qps"], + 'application/vnd.publishare-delta-tree': { + source: 'iana', + extensions: ['qps'], }, - "application/vnd.pvi.ptid1": { - source: "iana", - extensions: ["ptid"], + 'application/vnd.pvi.ptid1': { + source: 'iana', + extensions: ['ptid'], }, - "application/vnd.pwg-multiplexed": { - source: "iana", + 'application/vnd.pwg-multiplexed': { + source: 'iana', }, - "application/vnd.pwg-xhtml-print+xml": { - source: "iana", + 'application/vnd.pwg-xhtml-print+xml': { + source: 'iana', compressible: true, - extensions: ["xhtm"], + extensions: ['xhtm'], }, - "application/vnd.qualcomm.brew-app-res": { - source: "iana", + 'application/vnd.qualcomm.brew-app-res': { + source: 'iana', }, - "application/vnd.quarantainenet": { - source: "iana", + 'application/vnd.quarantainenet': { + source: 'iana', }, - "application/vnd.quark.quarkxpress": { - source: "iana", - extensions: ["qxd", "qxt", "qwd", "qwt", "qxl", "qxb"], + 'application/vnd.quark.quarkxpress': { + source: 'iana', + extensions: ['qxd', 'qxt', 'qwd', 'qwt', 'qxl', 'qxb'], }, - "application/vnd.quobject-quoxdocument": { - source: "iana", + 'application/vnd.quobject-quoxdocument': { + source: 'iana', }, - "application/vnd.radisys.moml+xml": { - source: "iana", + 'application/vnd.radisys.moml+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml+xml": { - source: "iana", + 'application/vnd.radisys.msml+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-audit+xml": { - source: "iana", + 'application/vnd.radisys.msml-audit+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-audit-conf+xml": { - source: "iana", + 'application/vnd.radisys.msml-audit-conf+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-audit-conn+xml": { - source: "iana", + 'application/vnd.radisys.msml-audit-conn+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-audit-dialog+xml": { - source: "iana", + 'application/vnd.radisys.msml-audit-dialog+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-audit-stream+xml": { - source: "iana", + 'application/vnd.radisys.msml-audit-stream+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-conf+xml": { - source: "iana", + 'application/vnd.radisys.msml-conf+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-dialog+xml": { - source: "iana", + 'application/vnd.radisys.msml-dialog+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-dialog-base+xml": { - source: "iana", + 'application/vnd.radisys.msml-dialog-base+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-dialog-fax-detect+xml": { - source: "iana", + 'application/vnd.radisys.msml-dialog-fax-detect+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { - source: "iana", + 'application/vnd.radisys.msml-dialog-fax-sendrecv+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-dialog-group+xml": { - source: "iana", + 'application/vnd.radisys.msml-dialog-group+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-dialog-speech+xml": { - source: "iana", + 'application/vnd.radisys.msml-dialog-speech+xml': { + source: 'iana', compressible: true, }, - "application/vnd.radisys.msml-dialog-transform+xml": { - source: "iana", + 'application/vnd.radisys.msml-dialog-transform+xml': { + source: 'iana', compressible: true, }, - "application/vnd.rainstor.data": { - source: "iana", + 'application/vnd.rainstor.data': { + source: 'iana', }, - "application/vnd.rapid": { - source: "iana", + 'application/vnd.rapid': { + source: 'iana', }, - "application/vnd.rar": { - source: "iana", - extensions: ["rar"], + 'application/vnd.rar': { + source: 'iana', + extensions: ['rar'], }, - "application/vnd.realvnc.bed": { - source: "iana", - extensions: ["bed"], + 'application/vnd.realvnc.bed': { + source: 'iana', + extensions: ['bed'], }, - "application/vnd.recordare.musicxml": { - source: "iana", - extensions: ["mxl"], + 'application/vnd.recordare.musicxml': { + source: 'iana', + extensions: ['mxl'], }, - "application/vnd.recordare.musicxml+xml": { - source: "iana", + 'application/vnd.recordare.musicxml+xml': { + source: 'iana', compressible: true, - extensions: ["musicxml"], + extensions: ['musicxml'], }, - "application/vnd.renlearn.rlprint": { - source: "iana", + 'application/vnd.renlearn.rlprint': { + source: 'iana', }, - "application/vnd.resilient.logic": { - source: "iana", + 'application/vnd.resilient.logic': { + source: 'iana', }, - "application/vnd.restful+json": { - source: "iana", + 'application/vnd.restful+json': { + source: 'iana', compressible: true, }, - "application/vnd.rig.cryptonote": { - source: "iana", - extensions: ["cryptonote"], + 'application/vnd.rig.cryptonote': { + source: 'iana', + extensions: ['cryptonote'], }, - "application/vnd.rim.cod": { - source: "apache", - extensions: ["cod"], + 'application/vnd.rim.cod': { + source: 'apache', + extensions: ['cod'], }, - "application/vnd.rn-realmedia": { - source: "apache", - extensions: ["rm"], + 'application/vnd.rn-realmedia': { + source: 'apache', + extensions: ['rm'], }, - "application/vnd.rn-realmedia-vbr": { - source: "apache", - extensions: ["rmvb"], + 'application/vnd.rn-realmedia-vbr': { + source: 'apache', + extensions: ['rmvb'], }, - "application/vnd.route66.link66+xml": { - source: "iana", + 'application/vnd.route66.link66+xml': { + source: 'iana', compressible: true, - extensions: ["link66"], + extensions: ['link66'], }, - "application/vnd.rs-274x": { - source: "iana", + 'application/vnd.rs-274x': { + source: 'iana', }, - "application/vnd.ruckus.download": { - source: "iana", + 'application/vnd.ruckus.download': { + source: 'iana', }, - "application/vnd.s3sms": { - source: "iana", + 'application/vnd.s3sms': { + source: 'iana', }, - "application/vnd.sailingtracker.track": { - source: "iana", - extensions: ["st"], + 'application/vnd.sailingtracker.track': { + source: 'iana', + extensions: ['st'], }, - "application/vnd.sar": { - source: "iana", + 'application/vnd.sar': { + source: 'iana', }, - "application/vnd.sbm.cid": { - source: "iana", + 'application/vnd.sbm.cid': { + source: 'iana', }, - "application/vnd.sbm.mid2": { - source: "iana", + 'application/vnd.sbm.mid2': { + source: 'iana', }, - "application/vnd.scribus": { - source: "iana", + 'application/vnd.scribus': { + source: 'iana', }, - "application/vnd.sealed.3df": { - source: "iana", + 'application/vnd.sealed.3df': { + source: 'iana', }, - "application/vnd.sealed.csf": { - source: "iana", + 'application/vnd.sealed.csf': { + source: 'iana', }, - "application/vnd.sealed.doc": { - source: "iana", + 'application/vnd.sealed.doc': { + source: 'iana', }, - "application/vnd.sealed.eml": { - source: "iana", + 'application/vnd.sealed.eml': { + source: 'iana', }, - "application/vnd.sealed.mht": { - source: "iana", + 'application/vnd.sealed.mht': { + source: 'iana', }, - "application/vnd.sealed.net": { - source: "iana", + 'application/vnd.sealed.net': { + source: 'iana', }, - "application/vnd.sealed.ppt": { - source: "iana", + 'application/vnd.sealed.ppt': { + source: 'iana', }, - "application/vnd.sealed.tiff": { - source: "iana", + 'application/vnd.sealed.tiff': { + source: 'iana', }, - "application/vnd.sealed.xls": { - source: "iana", + 'application/vnd.sealed.xls': { + source: 'iana', }, - "application/vnd.sealedmedia.softseal.html": { - source: "iana", + 'application/vnd.sealedmedia.softseal.html': { + source: 'iana', }, - "application/vnd.sealedmedia.softseal.pdf": { - source: "iana", + 'application/vnd.sealedmedia.softseal.pdf': { + source: 'iana', }, - "application/vnd.seemail": { - source: "iana", - extensions: ["see"], + 'application/vnd.seemail': { + source: 'iana', + extensions: ['see'], }, - "application/vnd.seis+json": { - source: "iana", + 'application/vnd.seis+json': { + source: 'iana', compressible: true, }, - "application/vnd.sema": { - source: "iana", - extensions: ["sema"], + 'application/vnd.sema': { + source: 'iana', + extensions: ['sema'], }, - "application/vnd.semd": { - source: "iana", - extensions: ["semd"], + 'application/vnd.semd': { + source: 'iana', + extensions: ['semd'], }, - "application/vnd.semf": { - source: "iana", - extensions: ["semf"], + 'application/vnd.semf': { + source: 'iana', + extensions: ['semf'], }, - "application/vnd.shade-save-file": { - source: "iana", + 'application/vnd.shade-save-file': { + source: 'iana', }, - "application/vnd.shana.informed.formdata": { - source: "iana", - extensions: ["ifm"], + 'application/vnd.shana.informed.formdata': { + source: 'iana', + extensions: ['ifm'], }, - "application/vnd.shana.informed.formtemplate": { - source: "iana", - extensions: ["itp"], + 'application/vnd.shana.informed.formtemplate': { + source: 'iana', + extensions: ['itp'], }, - "application/vnd.shana.informed.interchange": { - source: "iana", - extensions: ["iif"], + 'application/vnd.shana.informed.interchange': { + source: 'iana', + extensions: ['iif'], }, - "application/vnd.shana.informed.package": { - source: "iana", - extensions: ["ipk"], + 'application/vnd.shana.informed.package': { + source: 'iana', + extensions: ['ipk'], }, - "application/vnd.shootproof+json": { - source: "iana", + 'application/vnd.shootproof+json': { + source: 'iana', compressible: true, }, - "application/vnd.shopkick+json": { - source: "iana", + 'application/vnd.shopkick+json': { + source: 'iana', compressible: true, }, - "application/vnd.shp": { - source: "iana", + 'application/vnd.shp': { + source: 'iana', }, - "application/vnd.shx": { - source: "iana", + 'application/vnd.shx': { + source: 'iana', }, - "application/vnd.sigrok.session": { - source: "iana", + 'application/vnd.sigrok.session': { + source: 'iana', }, - "application/vnd.simtech-mindmapper": { - source: "iana", - extensions: ["twd", "twds"], + 'application/vnd.simtech-mindmapper': { + source: 'iana', + extensions: ['twd', 'twds'], }, - "application/vnd.siren+json": { - source: "iana", + 'application/vnd.siren+json': { + source: 'iana', compressible: true, }, - "application/vnd.smaf": { - source: "iana", - extensions: ["mmf"], + 'application/vnd.smaf': { + source: 'iana', + extensions: ['mmf'], }, - "application/vnd.smart.notebook": { - source: "iana", + 'application/vnd.smart.notebook': { + source: 'iana', }, - "application/vnd.smart.teacher": { - source: "iana", - extensions: ["teacher"], + 'application/vnd.smart.teacher': { + source: 'iana', + extensions: ['teacher'], }, - "application/vnd.smintio.portals.archive": { - source: "iana", + 'application/vnd.smintio.portals.archive': { + source: 'iana', }, - "application/vnd.snesdev-page-table": { - source: "iana", + 'application/vnd.snesdev-page-table': { + source: 'iana', }, - "application/vnd.software602.filler.form+xml": { - source: "iana", + 'application/vnd.software602.filler.form+xml': { + source: 'iana', compressible: true, - extensions: ["fo"], + extensions: ['fo'], }, - "application/vnd.software602.filler.form-xml-zip": { - source: "iana", + 'application/vnd.software602.filler.form-xml-zip': { + source: 'iana', }, - "application/vnd.solent.sdkm+xml": { - source: "iana", + 'application/vnd.solent.sdkm+xml': { + source: 'iana', compressible: true, - extensions: ["sdkm", "sdkd"], + extensions: ['sdkm', 'sdkd'], }, - "application/vnd.spotfire.dxp": { - source: "iana", - extensions: ["dxp"], + 'application/vnd.spotfire.dxp': { + source: 'iana', + extensions: ['dxp'], }, - "application/vnd.spotfire.sfs": { - source: "iana", - extensions: ["sfs"], + 'application/vnd.spotfire.sfs': { + source: 'iana', + extensions: ['sfs'], }, - "application/vnd.sqlite3": { - source: "iana", + 'application/vnd.sqlite3': { + source: 'iana', }, - "application/vnd.sss-cod": { - source: "iana", + 'application/vnd.sss-cod': { + source: 'iana', }, - "application/vnd.sss-dtf": { - source: "iana", + 'application/vnd.sss-dtf': { + source: 'iana', }, - "application/vnd.sss-ntf": { - source: "iana", + 'application/vnd.sss-ntf': { + source: 'iana', }, - "application/vnd.stardivision.calc": { - source: "apache", - extensions: ["sdc"], + 'application/vnd.stardivision.calc': { + source: 'apache', + extensions: ['sdc'], }, - "application/vnd.stardivision.draw": { - source: "apache", - extensions: ["sda"], + 'application/vnd.stardivision.draw': { + source: 'apache', + extensions: ['sda'], }, - "application/vnd.stardivision.impress": { - source: "apache", - extensions: ["sdd"], + 'application/vnd.stardivision.impress': { + source: 'apache', + extensions: ['sdd'], }, - "application/vnd.stardivision.math": { - source: "apache", - extensions: ["smf"], + 'application/vnd.stardivision.math': { + source: 'apache', + extensions: ['smf'], }, - "application/vnd.stardivision.writer": { - source: "apache", - extensions: ["sdw", "vor"], + 'application/vnd.stardivision.writer': { + source: 'apache', + extensions: ['sdw', 'vor'], }, - "application/vnd.stardivision.writer-global": { - source: "apache", - extensions: ["sgl"], + 'application/vnd.stardivision.writer-global': { + source: 'apache', + extensions: ['sgl'], }, - "application/vnd.stepmania.package": { - source: "iana", - extensions: ["smzip"], + 'application/vnd.stepmania.package': { + source: 'iana', + extensions: ['smzip'], }, - "application/vnd.stepmania.stepchart": { - source: "iana", - extensions: ["sm"], + 'application/vnd.stepmania.stepchart': { + source: 'iana', + extensions: ['sm'], }, - "application/vnd.street-stream": { - source: "iana", + 'application/vnd.street-stream': { + source: 'iana', }, - "application/vnd.sun.wadl+xml": { - source: "iana", + 'application/vnd.sun.wadl+xml': { + source: 'iana', compressible: true, - extensions: ["wadl"], + extensions: ['wadl'], }, - "application/vnd.sun.xml.calc": { - source: "apache", - extensions: ["sxc"], + 'application/vnd.sun.xml.calc': { + source: 'apache', + extensions: ['sxc'], }, - "application/vnd.sun.xml.calc.template": { - source: "apache", - extensions: ["stc"], + 'application/vnd.sun.xml.calc.template': { + source: 'apache', + extensions: ['stc'], }, - "application/vnd.sun.xml.draw": { - source: "apache", - extensions: ["sxd"], + 'application/vnd.sun.xml.draw': { + source: 'apache', + extensions: ['sxd'], }, - "application/vnd.sun.xml.draw.template": { - source: "apache", - extensions: ["std"], + 'application/vnd.sun.xml.draw.template': { + source: 'apache', + extensions: ['std'], }, - "application/vnd.sun.xml.impress": { - source: "apache", - extensions: ["sxi"], + 'application/vnd.sun.xml.impress': { + source: 'apache', + extensions: ['sxi'], }, - "application/vnd.sun.xml.impress.template": { - source: "apache", - extensions: ["sti"], + 'application/vnd.sun.xml.impress.template': { + source: 'apache', + extensions: ['sti'], }, - "application/vnd.sun.xml.math": { - source: "apache", - extensions: ["sxm"], + 'application/vnd.sun.xml.math': { + source: 'apache', + extensions: ['sxm'], }, - "application/vnd.sun.xml.writer": { - source: "apache", - extensions: ["sxw"], + 'application/vnd.sun.xml.writer': { + source: 'apache', + extensions: ['sxw'], }, - "application/vnd.sun.xml.writer.global": { - source: "apache", - extensions: ["sxg"], + 'application/vnd.sun.xml.writer.global': { + source: 'apache', + extensions: ['sxg'], }, - "application/vnd.sun.xml.writer.template": { - source: "apache", - extensions: ["stw"], + 'application/vnd.sun.xml.writer.template': { + source: 'apache', + extensions: ['stw'], }, - "application/vnd.sus-calendar": { - source: "iana", - extensions: ["sus", "susp"], + 'application/vnd.sus-calendar': { + source: 'iana', + extensions: ['sus', 'susp'], }, - "application/vnd.svd": { - source: "iana", - extensions: ["svd"], + 'application/vnd.svd': { + source: 'iana', + extensions: ['svd'], }, - "application/vnd.swiftview-ics": { - source: "iana", + 'application/vnd.swiftview-ics': { + source: 'iana', }, - "application/vnd.sybyl.mol2": { - source: "iana", + 'application/vnd.sybyl.mol2': { + source: 'iana', }, - "application/vnd.sycle+xml": { - source: "iana", + 'application/vnd.sycle+xml': { + source: 'iana', compressible: true, }, - "application/vnd.syft+json": { - source: "iana", + 'application/vnd.syft+json': { + source: 'iana', compressible: true, }, - "application/vnd.symbian.install": { - source: "apache", - extensions: ["sis", "sisx"], + 'application/vnd.symbian.install': { + source: 'apache', + extensions: ['sis', 'sisx'], }, - "application/vnd.syncml+xml": { - source: "iana", - charset: "UTF-8", + 'application/vnd.syncml+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["xsm"], + extensions: ['xsm'], }, - "application/vnd.syncml.dm+wbxml": { - source: "iana", - charset: "UTF-8", - extensions: ["bdm"], + 'application/vnd.syncml.dm+wbxml': { + source: 'iana', + charset: 'UTF-8', + extensions: ['bdm'], }, - "application/vnd.syncml.dm+xml": { - source: "iana", - charset: "UTF-8", + 'application/vnd.syncml.dm+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["xdm"], + extensions: ['xdm'], }, - "application/vnd.syncml.dm.notification": { - source: "iana", + 'application/vnd.syncml.dm.notification': { + source: 'iana', }, - "application/vnd.syncml.dmddf+wbxml": { - source: "iana", + 'application/vnd.syncml.dmddf+wbxml': { + source: 'iana', }, - "application/vnd.syncml.dmddf+xml": { - source: "iana", - charset: "UTF-8", + 'application/vnd.syncml.dmddf+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["ddf"], + extensions: ['ddf'], }, - "application/vnd.syncml.dmtnds+wbxml": { - source: "iana", + 'application/vnd.syncml.dmtnds+wbxml': { + source: 'iana', }, - "application/vnd.syncml.dmtnds+xml": { - source: "iana", - charset: "UTF-8", + 'application/vnd.syncml.dmtnds+xml': { + source: 'iana', + charset: 'UTF-8', compressible: true, }, - "application/vnd.syncml.ds.notification": { - source: "iana", + 'application/vnd.syncml.ds.notification': { + source: 'iana', }, - "application/vnd.tableschema+json": { - source: "iana", + 'application/vnd.tableschema+json': { + source: 'iana', compressible: true, }, - "application/vnd.tao.intent-module-archive": { - source: "iana", - extensions: ["tao"], + 'application/vnd.tao.intent-module-archive': { + source: 'iana', + extensions: ['tao'], }, - "application/vnd.tcpdump.pcap": { - source: "iana", - extensions: ["pcap", "cap", "dmp"], + 'application/vnd.tcpdump.pcap': { + source: 'iana', + extensions: ['pcap', 'cap', 'dmp'], }, - "application/vnd.think-cell.ppttc+json": { - source: "iana", + 'application/vnd.think-cell.ppttc+json': { + source: 'iana', compressible: true, }, - "application/vnd.tmd.mediaflex.api+xml": { - source: "iana", + 'application/vnd.tmd.mediaflex.api+xml': { + source: 'iana', compressible: true, }, - "application/vnd.tml": { - source: "iana", + 'application/vnd.tml': { + source: 'iana', }, - "application/vnd.tmobile-livetv": { - source: "iana", - extensions: ["tmo"], + 'application/vnd.tmobile-livetv': { + source: 'iana', + extensions: ['tmo'], }, - "application/vnd.tri.onesource": { - source: "iana", + 'application/vnd.tri.onesource': { + source: 'iana', }, - "application/vnd.trid.tpt": { - source: "iana", - extensions: ["tpt"], + 'application/vnd.trid.tpt': { + source: 'iana', + extensions: ['tpt'], }, - "application/vnd.triscape.mxs": { - source: "iana", - extensions: ["mxs"], + 'application/vnd.triscape.mxs': { + source: 'iana', + extensions: ['mxs'], }, - "application/vnd.trueapp": { - source: "iana", - extensions: ["tra"], + 'application/vnd.trueapp': { + source: 'iana', + extensions: ['tra'], }, - "application/vnd.truedoc": { - source: "iana", + 'application/vnd.truedoc': { + source: 'iana', }, - "application/vnd.ubisoft.webplayer": { - source: "iana", + 'application/vnd.ubisoft.webplayer': { + source: 'iana', }, - "application/vnd.ufdl": { - source: "iana", - extensions: ["ufd", "ufdl"], + 'application/vnd.ufdl': { + source: 'iana', + extensions: ['ufd', 'ufdl'], }, - "application/vnd.uiq.theme": { - source: "iana", - extensions: ["utz"], + 'application/vnd.uiq.theme': { + source: 'iana', + extensions: ['utz'], }, - "application/vnd.umajin": { - source: "iana", - extensions: ["umj"], + 'application/vnd.umajin': { + source: 'iana', + extensions: ['umj'], }, - "application/vnd.unity": { - source: "iana", - extensions: ["unityweb"], + 'application/vnd.unity': { + source: 'iana', + extensions: ['unityweb'], }, - "application/vnd.uoml+xml": { - source: "iana", + 'application/vnd.uoml+xml': { + source: 'iana', compressible: true, - extensions: ["uoml", "uo"], + extensions: ['uoml', 'uo'], }, - "application/vnd.uplanet.alert": { - source: "iana", + 'application/vnd.uplanet.alert': { + source: 'iana', }, - "application/vnd.uplanet.alert-wbxml": { - source: "iana", + 'application/vnd.uplanet.alert-wbxml': { + source: 'iana', }, - "application/vnd.uplanet.bearer-choice": { - source: "iana", + 'application/vnd.uplanet.bearer-choice': { + source: 'iana', }, - "application/vnd.uplanet.bearer-choice-wbxml": { - source: "iana", + 'application/vnd.uplanet.bearer-choice-wbxml': { + source: 'iana', }, - "application/vnd.uplanet.cacheop": { - source: "iana", + 'application/vnd.uplanet.cacheop': { + source: 'iana', }, - "application/vnd.uplanet.cacheop-wbxml": { - source: "iana", + 'application/vnd.uplanet.cacheop-wbxml': { + source: 'iana', }, - "application/vnd.uplanet.channel": { - source: "iana", + 'application/vnd.uplanet.channel': { + source: 'iana', }, - "application/vnd.uplanet.channel-wbxml": { - source: "iana", + 'application/vnd.uplanet.channel-wbxml': { + source: 'iana', }, - "application/vnd.uplanet.list": { - source: "iana", + 'application/vnd.uplanet.list': { + source: 'iana', }, - "application/vnd.uplanet.list-wbxml": { - source: "iana", + 'application/vnd.uplanet.list-wbxml': { + source: 'iana', }, - "application/vnd.uplanet.listcmd": { - source: "iana", + 'application/vnd.uplanet.listcmd': { + source: 'iana', }, - "application/vnd.uplanet.listcmd-wbxml": { - source: "iana", + 'application/vnd.uplanet.listcmd-wbxml': { + source: 'iana', }, - "application/vnd.uplanet.signal": { - source: "iana", + 'application/vnd.uplanet.signal': { + source: 'iana', }, - "application/vnd.uri-map": { - source: "iana", + 'application/vnd.uri-map': { + source: 'iana', }, - "application/vnd.valve.source.material": { - source: "iana", + 'application/vnd.valve.source.material': { + source: 'iana', }, - "application/vnd.vcx": { - source: "iana", - extensions: ["vcx"], + 'application/vnd.vcx': { + source: 'iana', + extensions: ['vcx'], }, - "application/vnd.vd-study": { - source: "iana", + 'application/vnd.vd-study': { + source: 'iana', }, - "application/vnd.vectorworks": { - source: "iana", + 'application/vnd.vectorworks': { + source: 'iana', }, - "application/vnd.vel+json": { - source: "iana", + 'application/vnd.vel+json': { + source: 'iana', compressible: true, }, - "application/vnd.verimatrix.vcas": { - source: "iana", + 'application/vnd.verimatrix.vcas': { + source: 'iana', }, - "application/vnd.veritone.aion+json": { - source: "iana", + 'application/vnd.veritone.aion+json': { + source: 'iana', compressible: true, }, - "application/vnd.veryant.thin": { - source: "iana", + 'application/vnd.veryant.thin': { + source: 'iana', }, - "application/vnd.ves.encrypted": { - source: "iana", + 'application/vnd.ves.encrypted': { + source: 'iana', }, - "application/vnd.vidsoft.vidconference": { - source: "iana", + 'application/vnd.vidsoft.vidconference': { + source: 'iana', }, - "application/vnd.visio": { - source: "iana", - extensions: ["vsd", "vst", "vss", "vsw"], + 'application/vnd.visio': { + source: 'iana', + extensions: ['vsd', 'vst', 'vss', 'vsw'], }, - "application/vnd.visionary": { - source: "iana", - extensions: ["vis"], + 'application/vnd.visionary': { + source: 'iana', + extensions: ['vis'], }, - "application/vnd.vividence.scriptfile": { - source: "iana", + 'application/vnd.vividence.scriptfile': { + source: 'iana', }, - "application/vnd.vsf": { - source: "iana", - extensions: ["vsf"], + 'application/vnd.vsf': { + source: 'iana', + extensions: ['vsf'], }, - "application/vnd.wap.sic": { - source: "iana", + 'application/vnd.wap.sic': { + source: 'iana', }, - "application/vnd.wap.slc": { - source: "iana", + 'application/vnd.wap.slc': { + source: 'iana', }, - "application/vnd.wap.wbxml": { - source: "iana", - charset: "UTF-8", - extensions: ["wbxml"], + 'application/vnd.wap.wbxml': { + source: 'iana', + charset: 'UTF-8', + extensions: ['wbxml'], }, - "application/vnd.wap.wmlc": { - source: "iana", - extensions: ["wmlc"], + 'application/vnd.wap.wmlc': { + source: 'iana', + extensions: ['wmlc'], }, - "application/vnd.wap.wmlscriptc": { - source: "iana", - extensions: ["wmlsc"], + 'application/vnd.wap.wmlscriptc': { + source: 'iana', + extensions: ['wmlsc'], }, - "application/vnd.wasmflow.wafl": { - source: "iana", + 'application/vnd.wasmflow.wafl': { + source: 'iana', }, - "application/vnd.webturbo": { - source: "iana", - extensions: ["wtb"], + 'application/vnd.webturbo': { + source: 'iana', + extensions: ['wtb'], }, - "application/vnd.wfa.dpp": { - source: "iana", + 'application/vnd.wfa.dpp': { + source: 'iana', }, - "application/vnd.wfa.p2p": { - source: "iana", + 'application/vnd.wfa.p2p': { + source: 'iana', }, - "application/vnd.wfa.wsc": { - source: "iana", + 'application/vnd.wfa.wsc': { + source: 'iana', }, - "application/vnd.windows.devicepairing": { - source: "iana", + 'application/vnd.windows.devicepairing': { + source: 'iana', }, - "application/vnd.wmc": { - source: "iana", + 'application/vnd.wmc': { + source: 'iana', }, - "application/vnd.wmf.bootstrap": { - source: "iana", + 'application/vnd.wmf.bootstrap': { + source: 'iana', }, - "application/vnd.wolfram.mathematica": { - source: "iana", + 'application/vnd.wolfram.mathematica': { + source: 'iana', }, - "application/vnd.wolfram.mathematica.package": { - source: "iana", + 'application/vnd.wolfram.mathematica.package': { + source: 'iana', }, - "application/vnd.wolfram.player": { - source: "iana", - extensions: ["nbp"], + 'application/vnd.wolfram.player': { + source: 'iana', + extensions: ['nbp'], }, - "application/vnd.wordlift": { - source: "iana", + 'application/vnd.wordlift': { + source: 'iana', }, - "application/vnd.wordperfect": { - source: "iana", - extensions: ["wpd"], + 'application/vnd.wordperfect': { + source: 'iana', + extensions: ['wpd'], }, - "application/vnd.wqd": { - source: "iana", - extensions: ["wqd"], + 'application/vnd.wqd': { + source: 'iana', + extensions: ['wqd'], }, - "application/vnd.wrq-hp3000-labelled": { - source: "iana", + 'application/vnd.wrq-hp3000-labelled': { + source: 'iana', }, - "application/vnd.wt.stf": { - source: "iana", - extensions: ["stf"], + 'application/vnd.wt.stf': { + source: 'iana', + extensions: ['stf'], }, - "application/vnd.wv.csp+wbxml": { - source: "iana", + 'application/vnd.wv.csp+wbxml': { + source: 'iana', }, - "application/vnd.wv.csp+xml": { - source: "iana", + 'application/vnd.wv.csp+xml': { + source: 'iana', compressible: true, }, - "application/vnd.wv.ssp+xml": { - source: "iana", + 'application/vnd.wv.ssp+xml': { + source: 'iana', compressible: true, }, - "application/vnd.xacml+json": { - source: "iana", + 'application/vnd.xacml+json': { + source: 'iana', compressible: true, }, - "application/vnd.xara": { - source: "iana", - extensions: ["xar"], + 'application/vnd.xara': { + source: 'iana', + extensions: ['xar'], }, - "application/vnd.xfdl": { - source: "iana", - extensions: ["xfdl"], + 'application/vnd.xfdl': { + source: 'iana', + extensions: ['xfdl'], }, - "application/vnd.xfdl.webform": { - source: "iana", + 'application/vnd.xfdl.webform': { + source: 'iana', }, - "application/vnd.xmi+xml": { - source: "iana", + 'application/vnd.xmi+xml': { + source: 'iana', compressible: true, }, - "application/vnd.xmpie.cpkg": { - source: "iana", + 'application/vnd.xmpie.cpkg': { + source: 'iana', }, - "application/vnd.xmpie.dpkg": { - source: "iana", + 'application/vnd.xmpie.dpkg': { + source: 'iana', }, - "application/vnd.xmpie.plan": { - source: "iana", + 'application/vnd.xmpie.plan': { + source: 'iana', }, - "application/vnd.xmpie.ppkg": { - source: "iana", + 'application/vnd.xmpie.ppkg': { + source: 'iana', }, - "application/vnd.xmpie.xlim": { - source: "iana", + 'application/vnd.xmpie.xlim': { + source: 'iana', }, - "application/vnd.yamaha.hv-dic": { - source: "iana", - extensions: ["hvd"], + 'application/vnd.yamaha.hv-dic': { + source: 'iana', + extensions: ['hvd'], }, - "application/vnd.yamaha.hv-script": { - source: "iana", - extensions: ["hvs"], + 'application/vnd.yamaha.hv-script': { + source: 'iana', + extensions: ['hvs'], }, - "application/vnd.yamaha.hv-voice": { - source: "iana", - extensions: ["hvp"], + 'application/vnd.yamaha.hv-voice': { + source: 'iana', + extensions: ['hvp'], }, - "application/vnd.yamaha.openscoreformat": { - source: "iana", - extensions: ["osf"], + 'application/vnd.yamaha.openscoreformat': { + source: 'iana', + extensions: ['osf'], }, - "application/vnd.yamaha.openscoreformat.osfpvg+xml": { - source: "iana", + 'application/vnd.yamaha.openscoreformat.osfpvg+xml': { + source: 'iana', compressible: true, - extensions: ["osfpvg"], + extensions: ['osfpvg'], }, - "application/vnd.yamaha.remote-setup": { - source: "iana", + 'application/vnd.yamaha.remote-setup': { + source: 'iana', }, - "application/vnd.yamaha.smaf-audio": { - source: "iana", - extensions: ["saf"], + 'application/vnd.yamaha.smaf-audio': { + source: 'iana', + extensions: ['saf'], }, - "application/vnd.yamaha.smaf-phrase": { - source: "iana", - extensions: ["spf"], + 'application/vnd.yamaha.smaf-phrase': { + source: 'iana', + extensions: ['spf'], }, - "application/vnd.yamaha.through-ngn": { - source: "iana", + 'application/vnd.yamaha.through-ngn': { + source: 'iana', }, - "application/vnd.yamaha.tunnel-udpencap": { - source: "iana", + 'application/vnd.yamaha.tunnel-udpencap': { + source: 'iana', }, - "application/vnd.yaoweme": { - source: "iana", + 'application/vnd.yaoweme': { + source: 'iana', }, - "application/vnd.yellowriver-custom-menu": { - source: "iana", - extensions: ["cmp"], + 'application/vnd.yellowriver-custom-menu': { + source: 'iana', + extensions: ['cmp'], }, - "application/vnd.zul": { - source: "iana", - extensions: ["zir", "zirz"], + 'application/vnd.zul': { + source: 'iana', + extensions: ['zir', 'zirz'], }, - "application/vnd.zzazz.deck+xml": { - source: "iana", + 'application/vnd.zzazz.deck+xml': { + source: 'iana', compressible: true, - extensions: ["zaz"], + extensions: ['zaz'], }, - "application/voicexml+xml": { - source: "iana", + 'application/voicexml+xml': { + source: 'iana', compressible: true, - extensions: ["vxml"], + extensions: ['vxml'], }, - "application/voucher-cms+json": { - source: "iana", + 'application/voucher-cms+json': { + source: 'iana', compressible: true, }, - "application/vq-rtcpxr": { - source: "iana", + 'application/vq-rtcpxr': { + source: 'iana', }, - "application/wasm": { - source: "iana", + 'application/wasm': { + source: 'iana', compressible: true, - extensions: ["wasm"], + extensions: ['wasm'], }, - "application/watcherinfo+xml": { - source: "iana", + 'application/watcherinfo+xml': { + source: 'iana', compressible: true, - extensions: ["wif"], + extensions: ['wif'], }, - "application/webpush-options+json": { - source: "iana", + 'application/webpush-options+json': { + source: 'iana', compressible: true, }, - "application/whoispp-query": { - source: "iana", + 'application/whoispp-query': { + source: 'iana', }, - "application/whoispp-response": { - source: "iana", + 'application/whoispp-response': { + source: 'iana', }, - "application/widget": { - source: "iana", - extensions: ["wgt"], + 'application/widget': { + source: 'iana', + extensions: ['wgt'], }, - "application/winhlp": { - source: "apache", - extensions: ["hlp"], + 'application/winhlp': { + source: 'apache', + extensions: ['hlp'], }, - "application/wita": { - source: "iana", + 'application/wita': { + source: 'iana', }, - "application/wordperfect5.1": { - source: "iana", + 'application/wordperfect5.1': { + source: 'iana', }, - "application/wsdl+xml": { - source: "iana", + 'application/wsdl+xml': { + source: 'iana', compressible: true, - extensions: ["wsdl"], + extensions: ['wsdl'], }, - "application/wspolicy+xml": { - source: "iana", + 'application/wspolicy+xml': { + source: 'iana', compressible: true, - extensions: ["wspolicy"], + extensions: ['wspolicy'], }, - "application/x-7z-compressed": { - source: "apache", + 'application/x-7z-compressed': { + source: 'apache', compressible: false, - extensions: ["7z"], + extensions: ['7z'], }, - "application/x-abiword": { - source: "apache", - extensions: ["abw"], + 'application/x-abiword': { + source: 'apache', + extensions: ['abw'], }, - "application/x-ace-compressed": { - source: "apache", - extensions: ["ace"], + 'application/x-ace-compressed': { + source: 'apache', + extensions: ['ace'], }, - "application/x-amf": { - source: "apache", + 'application/x-amf': { + source: 'apache', }, - "application/x-apple-diskimage": { - source: "apache", - extensions: ["dmg"], + 'application/x-apple-diskimage': { + source: 'apache', + extensions: ['dmg'], }, - "application/x-arj": { + 'application/x-arj': { compressible: false, - extensions: ["arj"], + extensions: ['arj'], }, - "application/x-authorware-bin": { - source: "apache", - extensions: ["aab", "x32", "u32", "vox"], + 'application/x-authorware-bin': { + source: 'apache', + extensions: ['aab', 'x32', 'u32', 'vox'], }, - "application/x-authorware-map": { - source: "apache", - extensions: ["aam"], + 'application/x-authorware-map': { + source: 'apache', + extensions: ['aam'], }, - "application/x-authorware-seg": { - source: "apache", - extensions: ["aas"], + 'application/x-authorware-seg': { + source: 'apache', + extensions: ['aas'], }, - "application/x-bcpio": { - source: "apache", - extensions: ["bcpio"], + 'application/x-bcpio': { + source: 'apache', + extensions: ['bcpio'], }, - "application/x-bdoc": { + 'application/x-bdoc': { compressible: false, - extensions: ["bdoc"], + extensions: ['bdoc'], }, - "application/x-bittorrent": { - source: "apache", - extensions: ["torrent"], + 'application/x-bittorrent': { + source: 'apache', + extensions: ['torrent'], }, - "application/x-blorb": { - source: "apache", - extensions: ["blb", "blorb"], + 'application/x-blorb': { + source: 'apache', + extensions: ['blb', 'blorb'], }, - "application/x-bzip": { - source: "apache", + 'application/x-bzip': { + source: 'apache', compressible: false, - extensions: ["bz"], + extensions: ['bz'], }, - "application/x-bzip2": { - source: "apache", + 'application/x-bzip2': { + source: 'apache', compressible: false, - extensions: ["bz2", "boz"], + extensions: ['bz2', 'boz'], }, - "application/x-cbr": { - source: "apache", - extensions: ["cbr", "cba", "cbt", "cbz", "cb7"], + 'application/x-cbr': { + source: 'apache', + extensions: ['cbr', 'cba', 'cbt', 'cbz', 'cb7'], }, - "application/x-cdlink": { - source: "apache", - extensions: ["vcd"], + 'application/x-cdlink': { + source: 'apache', + extensions: ['vcd'], }, - "application/x-cfs-compressed": { - source: "apache", - extensions: ["cfs"], + 'application/x-cfs-compressed': { + source: 'apache', + extensions: ['cfs'], }, - "application/x-chat": { - source: "apache", - extensions: ["chat"], + 'application/x-chat': { + source: 'apache', + extensions: ['chat'], }, - "application/x-chess-pgn": { - source: "apache", - extensions: ["pgn"], + 'application/x-chess-pgn': { + source: 'apache', + extensions: ['pgn'], }, - "application/x-chrome-extension": { - extensions: ["crx"], + 'application/x-chrome-extension': { + extensions: ['crx'], }, - "application/x-cocoa": { - source: "nginx", - extensions: ["cco"], + 'application/x-cocoa': { + source: 'nginx', + extensions: ['cco'], }, - "application/x-compress": { - source: "apache", + 'application/x-compress': { + source: 'apache', }, - "application/x-conference": { - source: "apache", - extensions: ["nsc"], + 'application/x-conference': { + source: 'apache', + extensions: ['nsc'], }, - "application/x-cpio": { - source: "apache", - extensions: ["cpio"], + 'application/x-cpio': { + source: 'apache', + extensions: ['cpio'], }, - "application/x-csh": { - source: "apache", - extensions: ["csh"], + 'application/x-csh': { + source: 'apache', + extensions: ['csh'], }, - "application/x-deb": { + 'application/x-deb': { compressible: false, }, - "application/x-debian-package": { - source: "apache", - extensions: ["deb", "udeb"], + 'application/x-debian-package': { + source: 'apache', + extensions: ['deb', 'udeb'], }, - "application/x-dgc-compressed": { - source: "apache", - extensions: ["dgc"], + 'application/x-dgc-compressed': { + source: 'apache', + extensions: ['dgc'], }, - "application/x-director": { - source: "apache", - extensions: ["dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"], + 'application/x-director': { + source: 'apache', + extensions: ['dir', 'dcr', 'dxr', 'cst', 'cct', 'cxt', 'w3d', 'fgd', 'swa'], }, - "application/x-doom": { - source: "apache", - extensions: ["wad"], + 'application/x-doom': { + source: 'apache', + extensions: ['wad'], }, - "application/x-dtbncx+xml": { - source: "apache", + 'application/x-dtbncx+xml': { + source: 'apache', compressible: true, - extensions: ["ncx"], + extensions: ['ncx'], }, - "application/x-dtbook+xml": { - source: "apache", + 'application/x-dtbook+xml': { + source: 'apache', compressible: true, - extensions: ["dtb"], + extensions: ['dtb'], }, - "application/x-dtbresource+xml": { - source: "apache", + 'application/x-dtbresource+xml': { + source: 'apache', compressible: true, - extensions: ["res"], + extensions: ['res'], }, - "application/x-dvi": { - source: "apache", + 'application/x-dvi': { + source: 'apache', compressible: false, - extensions: ["dvi"], + extensions: ['dvi'], }, - "application/x-envoy": { - source: "apache", - extensions: ["evy"], + 'application/x-envoy': { + source: 'apache', + extensions: ['evy'], }, - "application/x-eva": { - source: "apache", - extensions: ["eva"], + 'application/x-eva': { + source: 'apache', + extensions: ['eva'], }, - "application/x-font-bdf": { - source: "apache", - extensions: ["bdf"], + 'application/x-font-bdf': { + source: 'apache', + extensions: ['bdf'], }, - "application/x-font-dos": { - source: "apache", + 'application/x-font-dos': { + source: 'apache', }, - "application/x-font-framemaker": { - source: "apache", + 'application/x-font-framemaker': { + source: 'apache', }, - "application/x-font-ghostscript": { - source: "apache", - extensions: ["gsf"], + 'application/x-font-ghostscript': { + source: 'apache', + extensions: ['gsf'], }, - "application/x-font-libgrx": { - source: "apache", + 'application/x-font-libgrx': { + source: 'apache', }, - "application/x-font-linux-psf": { - source: "apache", - extensions: ["psf"], + 'application/x-font-linux-psf': { + source: 'apache', + extensions: ['psf'], }, - "application/x-font-pcf": { - source: "apache", - extensions: ["pcf"], + 'application/x-font-pcf': { + source: 'apache', + extensions: ['pcf'], }, - "application/x-font-snf": { - source: "apache", - extensions: ["snf"], + 'application/x-font-snf': { + source: 'apache', + extensions: ['snf'], }, - "application/x-font-speedo": { - source: "apache", + 'application/x-font-speedo': { + source: 'apache', }, - "application/x-font-sunos-news": { - source: "apache", + 'application/x-font-sunos-news': { + source: 'apache', }, - "application/x-font-type1": { - source: "apache", - extensions: ["pfa", "pfb", "pfm", "afm"], + 'application/x-font-type1': { + source: 'apache', + extensions: ['pfa', 'pfb', 'pfm', 'afm'], }, - "application/x-font-vfont": { - source: "apache", + 'application/x-font-vfont': { + source: 'apache', }, - "application/x-freearc": { - source: "apache", - extensions: ["arc"], + 'application/x-freearc': { + source: 'apache', + extensions: ['arc'], }, - "application/x-futuresplash": { - source: "apache", - extensions: ["spl"], + 'application/x-futuresplash': { + source: 'apache', + extensions: ['spl'], }, - "application/x-gca-compressed": { - source: "apache", - extensions: ["gca"], + 'application/x-gca-compressed': { + source: 'apache', + extensions: ['gca'], }, - "application/x-glulx": { - source: "apache", - extensions: ["ulx"], + 'application/x-glulx': { + source: 'apache', + extensions: ['ulx'], }, - "application/x-gnumeric": { - source: "apache", - extensions: ["gnumeric"], + 'application/x-gnumeric': { + source: 'apache', + extensions: ['gnumeric'], }, - "application/x-gramps-xml": { - source: "apache", - extensions: ["gramps"], + 'application/x-gramps-xml': { + source: 'apache', + extensions: ['gramps'], }, - "application/x-gtar": { - source: "apache", - extensions: ["gtar"], + 'application/x-gtar': { + source: 'apache', + extensions: ['gtar'], }, - "application/x-gzip": { - source: "apache", + 'application/x-gzip': { + source: 'apache', }, - "application/x-hdf": { - source: "apache", - extensions: ["hdf"], + 'application/x-hdf': { + source: 'apache', + extensions: ['hdf'], }, - "application/x-httpd-php": { + 'application/x-httpd-php': { compressible: true, - extensions: ["php"], + extensions: ['php'], }, - "application/x-install-instructions": { - source: "apache", - extensions: ["install"], + 'application/x-install-instructions': { + source: 'apache', + extensions: ['install'], }, - "application/x-iso9660-image": { - source: "apache", - extensions: ["iso"], + 'application/x-iso9660-image': { + source: 'apache', + extensions: ['iso'], }, - "application/x-iwork-keynote-sffkey": { - extensions: ["key"], + 'application/x-iwork-keynote-sffkey': { + extensions: ['key'], }, - "application/x-iwork-numbers-sffnumbers": { - extensions: ["numbers"], + 'application/x-iwork-numbers-sffnumbers': { + extensions: ['numbers'], }, - "application/x-iwork-pages-sffpages": { - extensions: ["pages"], + 'application/x-iwork-pages-sffpages': { + extensions: ['pages'], }, - "application/x-java-archive-diff": { - source: "nginx", - extensions: ["jardiff"], + 'application/x-java-archive-diff': { + source: 'nginx', + extensions: ['jardiff'], }, - "application/x-java-jnlp-file": { - source: "apache", + 'application/x-java-jnlp-file': { + source: 'apache', compressible: false, - extensions: ["jnlp"], + extensions: ['jnlp'], }, - "application/x-javascript": { + 'application/x-javascript': { compressible: true, }, - "application/x-keepass2": { - extensions: ["kdbx"], + 'application/x-keepass2': { + extensions: ['kdbx'], }, - "application/x-latex": { - source: "apache", + 'application/x-latex': { + source: 'apache', compressible: false, - extensions: ["latex"], + extensions: ['latex'], }, - "application/x-lua-bytecode": { - extensions: ["luac"], + 'application/x-lua-bytecode': { + extensions: ['luac'], }, - "application/x-lzh-compressed": { - source: "apache", - extensions: ["lzh", "lha"], + 'application/x-lzh-compressed': { + source: 'apache', + extensions: ['lzh', 'lha'], }, - "application/x-makeself": { - source: "nginx", - extensions: ["run"], + 'application/x-makeself': { + source: 'nginx', + extensions: ['run'], }, - "application/x-mie": { - source: "apache", - extensions: ["mie"], + 'application/x-mie': { + source: 'apache', + extensions: ['mie'], }, - "application/x-mobipocket-ebook": { - source: "apache", - extensions: ["prc", "mobi"], + 'application/x-mobipocket-ebook': { + source: 'apache', + extensions: ['prc', 'mobi'], }, - "application/x-mpegurl": { + 'application/x-mpegurl': { compressible: false, }, - "application/x-ms-application": { - source: "apache", - extensions: ["application"], + 'application/x-ms-application': { + source: 'apache', + extensions: ['application'], }, - "application/x-ms-shortcut": { - source: "apache", - extensions: ["lnk"], + 'application/x-ms-shortcut': { + source: 'apache', + extensions: ['lnk'], }, - "application/x-ms-wmd": { - source: "apache", - extensions: ["wmd"], + 'application/x-ms-wmd': { + source: 'apache', + extensions: ['wmd'], }, - "application/x-ms-wmz": { - source: "apache", - extensions: ["wmz"], + 'application/x-ms-wmz': { + source: 'apache', + extensions: ['wmz'], }, - "application/x-ms-xbap": { - source: "apache", - extensions: ["xbap"], + 'application/x-ms-xbap': { + source: 'apache', + extensions: ['xbap'], }, - "application/x-msaccess": { - source: "apache", - extensions: ["mdb"], + 'application/x-msaccess': { + source: 'apache', + extensions: ['mdb'], }, - "application/x-msbinder": { - source: "apache", - extensions: ["obd"], + 'application/x-msbinder': { + source: 'apache', + extensions: ['obd'], }, - "application/x-mscardfile": { - source: "apache", - extensions: ["crd"], + 'application/x-mscardfile': { + source: 'apache', + extensions: ['crd'], }, - "application/x-msclip": { - source: "apache", - extensions: ["clp"], + 'application/x-msclip': { + source: 'apache', + extensions: ['clp'], }, - "application/x-msdos-program": { - extensions: ["exe"], + 'application/x-msdos-program': { + extensions: ['exe'], }, - "application/x-msdownload": { - source: "apache", - extensions: ["exe", "dll", "com", "bat", "msi"], + 'application/x-msdownload': { + source: 'apache', + extensions: ['exe', 'dll', 'com', 'bat', 'msi'], }, - "application/x-msmediaview": { - source: "apache", - extensions: ["mvb", "m13", "m14"], + 'application/x-msmediaview': { + source: 'apache', + extensions: ['mvb', 'm13', 'm14'], }, - "application/x-msmetafile": { - source: "apache", - extensions: ["wmf", "wmz", "emf", "emz"], + 'application/x-msmetafile': { + source: 'apache', + extensions: ['wmf', 'wmz', 'emf', 'emz'], }, - "application/x-msmoney": { - source: "apache", - extensions: ["mny"], + 'application/x-msmoney': { + source: 'apache', + extensions: ['mny'], }, - "application/x-mspublisher": { - source: "apache", - extensions: ["pub"], + 'application/x-mspublisher': { + source: 'apache', + extensions: ['pub'], }, - "application/x-msschedule": { - source: "apache", - extensions: ["scd"], + 'application/x-msschedule': { + source: 'apache', + extensions: ['scd'], }, - "application/x-msterminal": { - source: "apache", - extensions: ["trm"], + 'application/x-msterminal': { + source: 'apache', + extensions: ['trm'], }, - "application/x-mswrite": { - source: "apache", - extensions: ["wri"], + 'application/x-mswrite': { + source: 'apache', + extensions: ['wri'], }, - "application/x-netcdf": { - source: "apache", - extensions: ["nc", "cdf"], + 'application/x-netcdf': { + source: 'apache', + extensions: ['nc', 'cdf'], }, - "application/x-ns-proxy-autoconfig": { + 'application/x-ns-proxy-autoconfig': { compressible: true, - extensions: ["pac"], + extensions: ['pac'], }, - "application/x-nzb": { - source: "apache", - extensions: ["nzb"], + 'application/x-nzb': { + source: 'apache', + extensions: ['nzb'], }, - "application/x-perl": { - source: "nginx", - extensions: ["pl", "pm"], + 'application/x-perl': { + source: 'nginx', + extensions: ['pl', 'pm'], }, - "application/x-pilot": { - source: "nginx", - extensions: ["prc", "pdb"], + 'application/x-pilot': { + source: 'nginx', + extensions: ['prc', 'pdb'], }, - "application/x-pkcs12": { - source: "apache", + 'application/x-pkcs12': { + source: 'apache', compressible: false, - extensions: ["p12", "pfx"], + extensions: ['p12', 'pfx'], }, - "application/x-pkcs7-certificates": { - source: "apache", - extensions: ["p7b", "spc"], + 'application/x-pkcs7-certificates': { + source: 'apache', + extensions: ['p7b', 'spc'], }, - "application/x-pkcs7-certreqresp": { - source: "apache", - extensions: ["p7r"], + 'application/x-pkcs7-certreqresp': { + source: 'apache', + extensions: ['p7r'], }, - "application/x-pki-message": { - source: "iana", + 'application/x-pki-message': { + source: 'iana', }, - "application/x-rar-compressed": { - source: "apache", + 'application/x-rar-compressed': { + source: 'apache', compressible: false, - extensions: ["rar"], + extensions: ['rar'], }, - "application/x-redhat-package-manager": { - source: "nginx", - extensions: ["rpm"], + 'application/x-redhat-package-manager': { + source: 'nginx', + extensions: ['rpm'], }, - "application/x-research-info-systems": { - source: "apache", - extensions: ["ris"], + 'application/x-research-info-systems': { + source: 'apache', + extensions: ['ris'], }, - "application/x-sea": { - source: "nginx", - extensions: ["sea"], + 'application/x-sea': { + source: 'nginx', + extensions: ['sea'], }, - "application/x-sh": { - source: "apache", + 'application/x-sh': { + source: 'apache', compressible: true, - extensions: ["sh"], + extensions: ['sh'], }, - "application/x-shar": { - source: "apache", - extensions: ["shar"], + 'application/x-shar': { + source: 'apache', + extensions: ['shar'], }, - "application/x-shockwave-flash": { - source: "apache", + 'application/x-shockwave-flash': { + source: 'apache', compressible: false, - extensions: ["swf"], + extensions: ['swf'], }, - "application/x-silverlight-app": { - source: "apache", - extensions: ["xap"], + 'application/x-silverlight-app': { + source: 'apache', + extensions: ['xap'], }, - "application/x-sql": { - source: "apache", - extensions: ["sql"], + 'application/x-sql': { + source: 'apache', + extensions: ['sql'], }, - "application/x-stuffit": { - source: "apache", + 'application/x-stuffit': { + source: 'apache', compressible: false, - extensions: ["sit"], + extensions: ['sit'], }, - "application/x-stuffitx": { - source: "apache", - extensions: ["sitx"], + 'application/x-stuffitx': { + source: 'apache', + extensions: ['sitx'], }, - "application/x-subrip": { - source: "apache", - extensions: ["srt"], + 'application/x-subrip': { + source: 'apache', + extensions: ['srt'], }, - "application/x-sv4cpio": { - source: "apache", - extensions: ["sv4cpio"], + 'application/x-sv4cpio': { + source: 'apache', + extensions: ['sv4cpio'], }, - "application/x-sv4crc": { - source: "apache", - extensions: ["sv4crc"], + 'application/x-sv4crc': { + source: 'apache', + extensions: ['sv4crc'], }, - "application/x-t3vm-image": { - source: "apache", - extensions: ["t3"], + 'application/x-t3vm-image': { + source: 'apache', + extensions: ['t3'], }, - "application/x-tads": { - source: "apache", - extensions: ["gam"], + 'application/x-tads': { + source: 'apache', + extensions: ['gam'], }, - "application/x-tar": { - source: "apache", + 'application/x-tar': { + source: 'apache', compressible: true, - extensions: ["tar"], + extensions: ['tar'], }, - "application/x-tcl": { - source: "apache", - extensions: ["tcl", "tk"], + 'application/x-tcl': { + source: 'apache', + extensions: ['tcl', 'tk'], }, - "application/x-tex": { - source: "apache", - extensions: ["tex"], + 'application/x-tex': { + source: 'apache', + extensions: ['tex'], }, - "application/x-tex-tfm": { - source: "apache", - extensions: ["tfm"], + 'application/x-tex-tfm': { + source: 'apache', + extensions: ['tfm'], }, - "application/x-texinfo": { - source: "apache", - extensions: ["texinfo", "texi"], + 'application/x-texinfo': { + source: 'apache', + extensions: ['texinfo', 'texi'], }, - "application/x-tgif": { - source: "apache", - extensions: ["obj"], + 'application/x-tgif': { + source: 'apache', + extensions: ['obj'], }, - "application/x-ustar": { - source: "apache", - extensions: ["ustar"], + 'application/x-ustar': { + source: 'apache', + extensions: ['ustar'], }, - "application/x-virtualbox-hdd": { + 'application/x-virtualbox-hdd': { compressible: true, - extensions: ["hdd"], + extensions: ['hdd'], }, - "application/x-virtualbox-ova": { + 'application/x-virtualbox-ova': { compressible: true, - extensions: ["ova"], + extensions: ['ova'], }, - "application/x-virtualbox-ovf": { + 'application/x-virtualbox-ovf': { compressible: true, - extensions: ["ovf"], + extensions: ['ovf'], }, - "application/x-virtualbox-vbox": { + 'application/x-virtualbox-vbox': { compressible: true, - extensions: ["vbox"], + extensions: ['vbox'], }, - "application/x-virtualbox-vbox-extpack": { + 'application/x-virtualbox-vbox-extpack': { compressible: false, - extensions: ["vbox-extpack"], + extensions: ['vbox-extpack'], }, - "application/x-virtualbox-vdi": { + 'application/x-virtualbox-vdi': { compressible: true, - extensions: ["vdi"], + extensions: ['vdi'], }, - "application/x-virtualbox-vhd": { + 'application/x-virtualbox-vhd': { compressible: true, - extensions: ["vhd"], + extensions: ['vhd'], }, - "application/x-virtualbox-vmdk": { + 'application/x-virtualbox-vmdk': { compressible: true, - extensions: ["vmdk"], + extensions: ['vmdk'], }, - "application/x-wais-source": { - source: "apache", - extensions: ["src"], + 'application/x-wais-source': { + source: 'apache', + extensions: ['src'], }, - "application/x-web-app-manifest+json": { + 'application/x-web-app-manifest+json': { compressible: true, - extensions: ["webapp"], + extensions: ['webapp'], }, - "application/x-www-form-urlencoded": { - source: "iana", + 'application/x-www-form-urlencoded': { + source: 'iana', compressible: true, }, - "application/x-x509-ca-cert": { - source: "iana", - extensions: ["der", "crt", "pem"], + 'application/x-x509-ca-cert': { + source: 'iana', + extensions: ['der', 'crt', 'pem'], }, - "application/x-x509-ca-ra-cert": { - source: "iana", + 'application/x-x509-ca-ra-cert': { + source: 'iana', }, - "application/x-x509-next-ca-cert": { - source: "iana", + 'application/x-x509-next-ca-cert': { + source: 'iana', }, - "application/x-xfig": { - source: "apache", - extensions: ["fig"], + 'application/x-xfig': { + source: 'apache', + extensions: ['fig'], }, - "application/x-xliff+xml": { - source: "apache", + 'application/x-xliff+xml': { + source: 'apache', compressible: true, - extensions: ["xlf"], + extensions: ['xlf'], }, - "application/x-xpinstall": { - source: "apache", + 'application/x-xpinstall': { + source: 'apache', compressible: false, - extensions: ["xpi"], + extensions: ['xpi'], }, - "application/x-xz": { - source: "apache", - extensions: ["xz"], + 'application/x-xz': { + source: 'apache', + extensions: ['xz'], }, - "application/x-zmachine": { - source: "apache", - extensions: ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"], + 'application/x-zmachine': { + source: 'apache', + extensions: ['z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8'], }, - "application/x400-bp": { - source: "iana", + 'application/x400-bp': { + source: 'iana', }, - "application/xacml+xml": { - source: "iana", + 'application/xacml+xml': { + source: 'iana', compressible: true, }, - "application/xaml+xml": { - source: "apache", + 'application/xaml+xml': { + source: 'apache', compressible: true, - extensions: ["xaml"], + extensions: ['xaml'], }, - "application/xcap-att+xml": { - source: "iana", + 'application/xcap-att+xml': { + source: 'iana', compressible: true, - extensions: ["xav"], + extensions: ['xav'], }, - "application/xcap-caps+xml": { - source: "iana", + 'application/xcap-caps+xml': { + source: 'iana', compressible: true, - extensions: ["xca"], + extensions: ['xca'], }, - "application/xcap-diff+xml": { - source: "iana", + 'application/xcap-diff+xml': { + source: 'iana', compressible: true, - extensions: ["xdf"], + extensions: ['xdf'], }, - "application/xcap-el+xml": { - source: "iana", + 'application/xcap-el+xml': { + source: 'iana', compressible: true, - extensions: ["xel"], + extensions: ['xel'], }, - "application/xcap-error+xml": { - source: "iana", + 'application/xcap-error+xml': { + source: 'iana', compressible: true, }, - "application/xcap-ns+xml": { - source: "iana", + 'application/xcap-ns+xml': { + source: 'iana', compressible: true, - extensions: ["xns"], + extensions: ['xns'], }, - "application/xcon-conference-info+xml": { - source: "iana", + 'application/xcon-conference-info+xml': { + source: 'iana', compressible: true, }, - "application/xcon-conference-info-diff+xml": { - source: "iana", + 'application/xcon-conference-info-diff+xml': { + source: 'iana', compressible: true, }, - "application/xenc+xml": { - source: "iana", + 'application/xenc+xml': { + source: 'iana', compressible: true, - extensions: ["xenc"], + extensions: ['xenc'], }, - "application/xfdf": { - source: "iana", - extensions: ["xfdf"], + 'application/xfdf': { + source: 'iana', + extensions: ['xfdf'], }, - "application/xhtml+xml": { - source: "iana", + 'application/xhtml+xml': { + source: 'iana', compressible: true, - extensions: ["xhtml", "xht"], + extensions: ['xhtml', 'xht'], }, - "application/xhtml-voice+xml": { - source: "apache", + 'application/xhtml-voice+xml': { + source: 'apache', compressible: true, }, - "application/xliff+xml": { - source: "iana", + 'application/xliff+xml': { + source: 'iana', compressible: true, - extensions: ["xlf"], + extensions: ['xlf'], }, - "application/xml": { - source: "iana", + 'application/xml': { + source: 'iana', compressible: true, - extensions: ["xml", "xsl", "xsd", "rng"], + extensions: ['xml', 'xsl', 'xsd', 'rng'], }, - "application/xml-dtd": { - source: "iana", + 'application/xml-dtd': { + source: 'iana', compressible: true, - extensions: ["dtd"], + extensions: ['dtd'], }, - "application/xml-external-parsed-entity": { - source: "iana", + 'application/xml-external-parsed-entity': { + source: 'iana', }, - "application/xml-patch+xml": { - source: "iana", + 'application/xml-patch+xml': { + source: 'iana', compressible: true, }, - "application/xmpp+xml": { - source: "iana", + 'application/xmpp+xml': { + source: 'iana', compressible: true, }, - "application/xop+xml": { - source: "iana", + 'application/xop+xml': { + source: 'iana', compressible: true, - extensions: ["xop"], + extensions: ['xop'], }, - "application/xproc+xml": { - source: "apache", + 'application/xproc+xml': { + source: 'apache', compressible: true, - extensions: ["xpl"], + extensions: ['xpl'], }, - "application/xslt+xml": { - source: "iana", + 'application/xslt+xml': { + source: 'iana', compressible: true, - extensions: ["xsl", "xslt"], + extensions: ['xsl', 'xslt'], }, - "application/xspf+xml": { - source: "apache", + 'application/xspf+xml': { + source: 'apache', compressible: true, - extensions: ["xspf"], + extensions: ['xspf'], }, - "application/xv+xml": { - source: "iana", + 'application/xv+xml': { + source: 'iana', compressible: true, - extensions: ["mxml", "xhvml", "xvml", "xvm"], + extensions: ['mxml', 'xhvml', 'xvml', 'xvm'], }, - "application/yang": { - source: "iana", - extensions: ["yang"], + 'application/yang': { + source: 'iana', + extensions: ['yang'], }, - "application/yang-data+cbor": { - source: "iana", + 'application/yang-data+cbor': { + source: 'iana', }, - "application/yang-data+json": { - source: "iana", + 'application/yang-data+json': { + source: 'iana', compressible: true, }, - "application/yang-data+xml": { - source: "iana", + 'application/yang-data+xml': { + source: 'iana', compressible: true, }, - "application/yang-patch+json": { - source: "iana", + 'application/yang-patch+json': { + source: 'iana', compressible: true, }, - "application/yang-patch+xml": { - source: "iana", + 'application/yang-patch+xml': { + source: 'iana', compressible: true, }, - "application/yin+xml": { - source: "iana", + 'application/yin+xml': { + source: 'iana', compressible: true, - extensions: ["yin"], + extensions: ['yin'], }, - "application/zip": { - source: "iana", + 'application/zip': { + source: 'iana', compressible: false, - extensions: ["zip"], + extensions: ['zip'], }, - "application/zlib": { - source: "iana", + 'application/zlib': { + source: 'iana', }, - "application/zstd": { - source: "iana", + 'application/zstd': { + source: 'iana', }, - "audio/1d-interleaved-parityfec": { - source: "iana", + 'audio/1d-interleaved-parityfec': { + source: 'iana', }, - "audio/32kadpcm": { - source: "iana", + 'audio/32kadpcm': { + source: 'iana', }, - "audio/3gpp": { - source: "iana", + 'audio/3gpp': { + source: 'iana', compressible: false, - extensions: ["3gpp"], + extensions: ['3gpp'], }, - "audio/3gpp2": { - source: "iana", + 'audio/3gpp2': { + source: 'iana', }, - "audio/aac": { - source: "iana", - extensions: ["adts", "aac"], + 'audio/aac': { + source: 'iana', + extensions: ['adts', 'aac'], }, - "audio/ac3": { - source: "iana", + 'audio/ac3': { + source: 'iana', }, - "audio/adpcm": { - source: "apache", - extensions: ["adp"], + 'audio/adpcm': { + source: 'apache', + extensions: ['adp'], }, - "audio/amr": { - source: "iana", - extensions: ["amr"], + 'audio/amr': { + source: 'iana', + extensions: ['amr'], }, - "audio/amr-wb": { - source: "iana", + 'audio/amr-wb': { + source: 'iana', }, - "audio/amr-wb+": { - source: "iana", + 'audio/amr-wb+': { + source: 'iana', }, - "audio/aptx": { - source: "iana", + 'audio/aptx': { + source: 'iana', }, - "audio/asc": { - source: "iana", + 'audio/asc': { + source: 'iana', }, - "audio/atrac-advanced-lossless": { - source: "iana", + 'audio/atrac-advanced-lossless': { + source: 'iana', }, - "audio/atrac-x": { - source: "iana", + 'audio/atrac-x': { + source: 'iana', }, - "audio/atrac3": { - source: "iana", + 'audio/atrac3': { + source: 'iana', }, - "audio/basic": { - source: "iana", + 'audio/basic': { + source: 'iana', compressible: false, - extensions: ["au", "snd"], + extensions: ['au', 'snd'], }, - "audio/bv16": { - source: "iana", + 'audio/bv16': { + source: 'iana', }, - "audio/bv32": { - source: "iana", + 'audio/bv32': { + source: 'iana', }, - "audio/clearmode": { - source: "iana", + 'audio/clearmode': { + source: 'iana', }, - "audio/cn": { - source: "iana", + 'audio/cn': { + source: 'iana', }, - "audio/dat12": { - source: "iana", + 'audio/dat12': { + source: 'iana', }, - "audio/dls": { - source: "iana", + 'audio/dls': { + source: 'iana', }, - "audio/dsr-es201108": { - source: "iana", + 'audio/dsr-es201108': { + source: 'iana', }, - "audio/dsr-es202050": { - source: "iana", + 'audio/dsr-es202050': { + source: 'iana', }, - "audio/dsr-es202211": { - source: "iana", + 'audio/dsr-es202211': { + source: 'iana', }, - "audio/dsr-es202212": { - source: "iana", + 'audio/dsr-es202212': { + source: 'iana', }, - "audio/dv": { - source: "iana", + 'audio/dv': { + source: 'iana', }, - "audio/dvi4": { - source: "iana", + 'audio/dvi4': { + source: 'iana', }, - "audio/eac3": { - source: "iana", + 'audio/eac3': { + source: 'iana', }, - "audio/encaprtp": { - source: "iana", + 'audio/encaprtp': { + source: 'iana', }, - "audio/evrc": { - source: "iana", + 'audio/evrc': { + source: 'iana', }, - "audio/evrc-qcp": { - source: "iana", + 'audio/evrc-qcp': { + source: 'iana', }, - "audio/evrc0": { - source: "iana", + 'audio/evrc0': { + source: 'iana', }, - "audio/evrc1": { - source: "iana", + 'audio/evrc1': { + source: 'iana', }, - "audio/evrcb": { - source: "iana", + 'audio/evrcb': { + source: 'iana', }, - "audio/evrcb0": { - source: "iana", + 'audio/evrcb0': { + source: 'iana', }, - "audio/evrcb1": { - source: "iana", + 'audio/evrcb1': { + source: 'iana', }, - "audio/evrcnw": { - source: "iana", + 'audio/evrcnw': { + source: 'iana', }, - "audio/evrcnw0": { - source: "iana", + 'audio/evrcnw0': { + source: 'iana', }, - "audio/evrcnw1": { - source: "iana", + 'audio/evrcnw1': { + source: 'iana', }, - "audio/evrcwb": { - source: "iana", + 'audio/evrcwb': { + source: 'iana', }, - "audio/evrcwb0": { - source: "iana", + 'audio/evrcwb0': { + source: 'iana', }, - "audio/evrcwb1": { - source: "iana", + 'audio/evrcwb1': { + source: 'iana', }, - "audio/evs": { - source: "iana", + 'audio/evs': { + source: 'iana', }, - "audio/flexfec": { - source: "iana", + 'audio/flexfec': { + source: 'iana', }, - "audio/fwdred": { - source: "iana", + 'audio/fwdred': { + source: 'iana', }, - "audio/g711-0": { - source: "iana", + 'audio/g711-0': { + source: 'iana', }, - "audio/g719": { - source: "iana", + 'audio/g719': { + source: 'iana', }, - "audio/g722": { - source: "iana", + 'audio/g722': { + source: 'iana', }, - "audio/g7221": { - source: "iana", + 'audio/g7221': { + source: 'iana', }, - "audio/g723": { - source: "iana", + 'audio/g723': { + source: 'iana', }, - "audio/g726-16": { - source: "iana", + 'audio/g726-16': { + source: 'iana', }, - "audio/g726-24": { - source: "iana", + 'audio/g726-24': { + source: 'iana', }, - "audio/g726-32": { - source: "iana", + 'audio/g726-32': { + source: 'iana', }, - "audio/g726-40": { - source: "iana", + 'audio/g726-40': { + source: 'iana', }, - "audio/g728": { - source: "iana", + 'audio/g728': { + source: 'iana', }, - "audio/g729": { - source: "iana", + 'audio/g729': { + source: 'iana', }, - "audio/g7291": { - source: "iana", + 'audio/g7291': { + source: 'iana', }, - "audio/g729d": { - source: "iana", + 'audio/g729d': { + source: 'iana', }, - "audio/g729e": { - source: "iana", + 'audio/g729e': { + source: 'iana', }, - "audio/gsm": { - source: "iana", + 'audio/gsm': { + source: 'iana', }, - "audio/gsm-efr": { - source: "iana", + 'audio/gsm-efr': { + source: 'iana', }, - "audio/gsm-hr-08": { - source: "iana", + 'audio/gsm-hr-08': { + source: 'iana', }, - "audio/ilbc": { - source: "iana", + 'audio/ilbc': { + source: 'iana', }, - "audio/ip-mr_v2.5": { - source: "iana", + 'audio/ip-mr_v2.5': { + source: 'iana', }, - "audio/isac": { - source: "apache", + 'audio/isac': { + source: 'apache', }, - "audio/l16": { - source: "iana", + 'audio/l16': { + source: 'iana', }, - "audio/l20": { - source: "iana", + 'audio/l20': { + source: 'iana', }, - "audio/l24": { - source: "iana", + 'audio/l24': { + source: 'iana', compressible: false, }, - "audio/l8": { - source: "iana", + 'audio/l8': { + source: 'iana', }, - "audio/lpc": { - source: "iana", + 'audio/lpc': { + source: 'iana', }, - "audio/melp": { - source: "iana", + 'audio/melp': { + source: 'iana', }, - "audio/melp1200": { - source: "iana", + 'audio/melp1200': { + source: 'iana', }, - "audio/melp2400": { - source: "iana", + 'audio/melp2400': { + source: 'iana', }, - "audio/melp600": { - source: "iana", + 'audio/melp600': { + source: 'iana', }, - "audio/mhas": { - source: "iana", + 'audio/mhas': { + source: 'iana', }, - "audio/midi": { - source: "apache", - extensions: ["mid", "midi", "kar", "rmi"], + 'audio/midi': { + source: 'apache', + extensions: ['mid', 'midi', 'kar', 'rmi'], }, - "audio/mobile-xmf": { - source: "iana", - extensions: ["mxmf"], + 'audio/mobile-xmf': { + source: 'iana', + extensions: ['mxmf'], }, - "audio/mp3": { + 'audio/mp3': { compressible: false, - extensions: ["mp3"], + extensions: ['mp3'], }, - "audio/mp4": { - source: "iana", + 'audio/mp4': { + source: 'iana', compressible: false, - extensions: ["m4a", "mp4a"], + extensions: ['m4a', 'mp4a'], }, - "audio/mp4a-latm": { - source: "iana", + 'audio/mp4a-latm': { + source: 'iana', }, - "audio/mpa": { - source: "iana", + 'audio/mpa': { + source: 'iana', }, - "audio/mpa-robust": { - source: "iana", + 'audio/mpa-robust': { + source: 'iana', }, - "audio/mpeg": { - source: "iana", + 'audio/mpeg': { + source: 'iana', compressible: false, - extensions: ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"], + extensions: ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'], }, - "audio/mpeg4-generic": { - source: "iana", + 'audio/mpeg4-generic': { + source: 'iana', }, - "audio/musepack": { - source: "apache", + 'audio/musepack': { + source: 'apache', }, - "audio/ogg": { - source: "iana", + 'audio/ogg': { + source: 'iana', compressible: false, - extensions: ["oga", "ogg", "spx", "opus"], + extensions: ['oga', 'ogg', 'spx', 'opus'], }, - "audio/opus": { - source: "iana", + 'audio/opus': { + source: 'iana', }, - "audio/parityfec": { - source: "iana", + 'audio/parityfec': { + source: 'iana', }, - "audio/pcma": { - source: "iana", + 'audio/pcma': { + source: 'iana', }, - "audio/pcma-wb": { - source: "iana", + 'audio/pcma-wb': { + source: 'iana', }, - "audio/pcmu": { - source: "iana", + 'audio/pcmu': { + source: 'iana', }, - "audio/pcmu-wb": { - source: "iana", + 'audio/pcmu-wb': { + source: 'iana', }, - "audio/prs.sid": { - source: "iana", + 'audio/prs.sid': { + source: 'iana', }, - "audio/qcelp": { - source: "iana", + 'audio/qcelp': { + source: 'iana', }, - "audio/raptorfec": { - source: "iana", + 'audio/raptorfec': { + source: 'iana', }, - "audio/red": { - source: "iana", + 'audio/red': { + source: 'iana', }, - "audio/rtp-enc-aescm128": { - source: "iana", + 'audio/rtp-enc-aescm128': { + source: 'iana', }, - "audio/rtp-midi": { - source: "iana", + 'audio/rtp-midi': { + source: 'iana', }, - "audio/rtploopback": { - source: "iana", + 'audio/rtploopback': { + source: 'iana', }, - "audio/rtx": { - source: "iana", + 'audio/rtx': { + source: 'iana', }, - "audio/s3m": { - source: "apache", - extensions: ["s3m"], + 'audio/s3m': { + source: 'apache', + extensions: ['s3m'], }, - "audio/scip": { - source: "iana", + 'audio/scip': { + source: 'iana', }, - "audio/silk": { - source: "apache", - extensions: ["sil"], + 'audio/silk': { + source: 'apache', + extensions: ['sil'], }, - "audio/smv": { - source: "iana", + 'audio/smv': { + source: 'iana', }, - "audio/smv-qcp": { - source: "iana", + 'audio/smv-qcp': { + source: 'iana', }, - "audio/smv0": { - source: "iana", + 'audio/smv0': { + source: 'iana', }, - "audio/sofa": { - source: "iana", + 'audio/sofa': { + source: 'iana', }, - "audio/sp-midi": { - source: "iana", + 'audio/sp-midi': { + source: 'iana', }, - "audio/speex": { - source: "iana", + 'audio/speex': { + source: 'iana', }, - "audio/t140c": { - source: "iana", + 'audio/t140c': { + source: 'iana', }, - "audio/t38": { - source: "iana", + 'audio/t38': { + source: 'iana', }, - "audio/telephone-event": { - source: "iana", + 'audio/telephone-event': { + source: 'iana', }, - "audio/tetra_acelp": { - source: "iana", + 'audio/tetra_acelp': { + source: 'iana', }, - "audio/tetra_acelp_bb": { - source: "iana", + 'audio/tetra_acelp_bb': { + source: 'iana', }, - "audio/tone": { - source: "iana", + 'audio/tone': { + source: 'iana', }, - "audio/tsvcis": { - source: "iana", + 'audio/tsvcis': { + source: 'iana', }, - "audio/uemclip": { - source: "iana", + 'audio/uemclip': { + source: 'iana', }, - "audio/ulpfec": { - source: "iana", + 'audio/ulpfec': { + source: 'iana', }, - "audio/usac": { - source: "iana", + 'audio/usac': { + source: 'iana', }, - "audio/vdvi": { - source: "iana", + 'audio/vdvi': { + source: 'iana', }, - "audio/vmr-wb": { - source: "iana", + 'audio/vmr-wb': { + source: 'iana', }, - "audio/vnd.3gpp.iufp": { - source: "iana", + 'audio/vnd.3gpp.iufp': { + source: 'iana', }, - "audio/vnd.4sb": { - source: "iana", + 'audio/vnd.4sb': { + source: 'iana', }, - "audio/vnd.audiokoz": { - source: "iana", + 'audio/vnd.audiokoz': { + source: 'iana', }, - "audio/vnd.celp": { - source: "iana", + 'audio/vnd.celp': { + source: 'iana', }, - "audio/vnd.cisco.nse": { - source: "iana", + 'audio/vnd.cisco.nse': { + source: 'iana', }, - "audio/vnd.cmles.radio-events": { - source: "iana", + 'audio/vnd.cmles.radio-events': { + source: 'iana', }, - "audio/vnd.cns.anp1": { - source: "iana", + 'audio/vnd.cns.anp1': { + source: 'iana', }, - "audio/vnd.cns.inf1": { - source: "iana", + 'audio/vnd.cns.inf1': { + source: 'iana', }, - "audio/vnd.dece.audio": { - source: "iana", - extensions: ["uva", "uvva"], + 'audio/vnd.dece.audio': { + source: 'iana', + extensions: ['uva', 'uvva'], }, - "audio/vnd.digital-winds": { - source: "iana", - extensions: ["eol"], + 'audio/vnd.digital-winds': { + source: 'iana', + extensions: ['eol'], }, - "audio/vnd.dlna.adts": { - source: "iana", + 'audio/vnd.dlna.adts': { + source: 'iana', }, - "audio/vnd.dolby.heaac.1": { - source: "iana", + 'audio/vnd.dolby.heaac.1': { + source: 'iana', }, - "audio/vnd.dolby.heaac.2": { - source: "iana", + 'audio/vnd.dolby.heaac.2': { + source: 'iana', }, - "audio/vnd.dolby.mlp": { - source: "iana", + 'audio/vnd.dolby.mlp': { + source: 'iana', }, - "audio/vnd.dolby.mps": { - source: "iana", + 'audio/vnd.dolby.mps': { + source: 'iana', }, - "audio/vnd.dolby.pl2": { - source: "iana", + 'audio/vnd.dolby.pl2': { + source: 'iana', }, - "audio/vnd.dolby.pl2x": { - source: "iana", + 'audio/vnd.dolby.pl2x': { + source: 'iana', }, - "audio/vnd.dolby.pl2z": { - source: "iana", + 'audio/vnd.dolby.pl2z': { + source: 'iana', }, - "audio/vnd.dolby.pulse.1": { - source: "iana", + 'audio/vnd.dolby.pulse.1': { + source: 'iana', }, - "audio/vnd.dra": { - source: "iana", - extensions: ["dra"], + 'audio/vnd.dra': { + source: 'iana', + extensions: ['dra'], }, - "audio/vnd.dts": { - source: "iana", - extensions: ["dts"], + 'audio/vnd.dts': { + source: 'iana', + extensions: ['dts'], }, - "audio/vnd.dts.hd": { - source: "iana", - extensions: ["dtshd"], + 'audio/vnd.dts.hd': { + source: 'iana', + extensions: ['dtshd'], }, - "audio/vnd.dts.uhd": { - source: "iana", + 'audio/vnd.dts.uhd': { + source: 'iana', }, - "audio/vnd.dvb.file": { - source: "iana", + 'audio/vnd.dvb.file': { + source: 'iana', }, - "audio/vnd.everad.plj": { - source: "iana", + 'audio/vnd.everad.plj': { + source: 'iana', }, - "audio/vnd.hns.audio": { - source: "iana", + 'audio/vnd.hns.audio': { + source: 'iana', }, - "audio/vnd.lucent.voice": { - source: "iana", - extensions: ["lvp"], + 'audio/vnd.lucent.voice': { + source: 'iana', + extensions: ['lvp'], }, - "audio/vnd.ms-playready.media.pya": { - source: "iana", - extensions: ["pya"], + 'audio/vnd.ms-playready.media.pya': { + source: 'iana', + extensions: ['pya'], }, - "audio/vnd.nokia.mobile-xmf": { - source: "iana", + 'audio/vnd.nokia.mobile-xmf': { + source: 'iana', }, - "audio/vnd.nortel.vbk": { - source: "iana", + 'audio/vnd.nortel.vbk': { + source: 'iana', }, - "audio/vnd.nuera.ecelp4800": { - source: "iana", - extensions: ["ecelp4800"], + 'audio/vnd.nuera.ecelp4800': { + source: 'iana', + extensions: ['ecelp4800'], }, - "audio/vnd.nuera.ecelp7470": { - source: "iana", - extensions: ["ecelp7470"], + 'audio/vnd.nuera.ecelp7470': { + source: 'iana', + extensions: ['ecelp7470'], }, - "audio/vnd.nuera.ecelp9600": { - source: "iana", - extensions: ["ecelp9600"], + 'audio/vnd.nuera.ecelp9600': { + source: 'iana', + extensions: ['ecelp9600'], }, - "audio/vnd.octel.sbc": { - source: "iana", + 'audio/vnd.octel.sbc': { + source: 'iana', }, - "audio/vnd.presonus.multitrack": { - source: "iana", + 'audio/vnd.presonus.multitrack': { + source: 'iana', }, - "audio/vnd.qcelp": { - source: "apache", + 'audio/vnd.qcelp': { + source: 'apache', }, - "audio/vnd.rhetorex.32kadpcm": { - source: "iana", + 'audio/vnd.rhetorex.32kadpcm': { + source: 'iana', }, - "audio/vnd.rip": { - source: "iana", - extensions: ["rip"], + 'audio/vnd.rip': { + source: 'iana', + extensions: ['rip'], }, - "audio/vnd.rn-realaudio": { + 'audio/vnd.rn-realaudio': { compressible: false, }, - "audio/vnd.sealedmedia.softseal.mpeg": { - source: "iana", + 'audio/vnd.sealedmedia.softseal.mpeg': { + source: 'iana', }, - "audio/vnd.vmx.cvsd": { - source: "iana", + 'audio/vnd.vmx.cvsd': { + source: 'iana', }, - "audio/vnd.wave": { + 'audio/vnd.wave': { compressible: false, }, - "audio/vorbis": { - source: "iana", + 'audio/vorbis': { + source: 'iana', compressible: false, }, - "audio/vorbis-config": { - source: "iana", + 'audio/vorbis-config': { + source: 'iana', }, - "audio/wav": { + 'audio/wav': { compressible: false, - extensions: ["wav"], + extensions: ['wav'], }, - "audio/wave": { + 'audio/wave': { compressible: false, - extensions: ["wav"], + extensions: ['wav'], }, - "audio/webm": { - source: "apache", + 'audio/webm': { + source: 'apache', compressible: false, - extensions: ["weba"], + extensions: ['weba'], }, - "audio/x-aac": { - source: "apache", + 'audio/x-aac': { + source: 'apache', compressible: false, - extensions: ["aac"], + extensions: ['aac'], }, - "audio/x-aiff": { - source: "apache", - extensions: ["aif", "aiff", "aifc"], + 'audio/x-aiff': { + source: 'apache', + extensions: ['aif', 'aiff', 'aifc'], }, - "audio/x-caf": { - source: "apache", + 'audio/x-caf': { + source: 'apache', compressible: false, - extensions: ["caf"], + extensions: ['caf'], }, - "audio/x-flac": { - source: "apache", - extensions: ["flac"], + 'audio/x-flac': { + source: 'apache', + extensions: ['flac'], }, - "audio/x-m4a": { - source: "nginx", - extensions: ["m4a"], + 'audio/x-m4a': { + source: 'nginx', + extensions: ['m4a'], }, - "audio/x-matroska": { - source: "apache", - extensions: ["mka"], + 'audio/x-matroska': { + source: 'apache', + extensions: ['mka'], }, - "audio/x-mpegurl": { - source: "apache", - extensions: ["m3u"], + 'audio/x-mpegurl': { + source: 'apache', + extensions: ['m3u'], }, - "audio/x-ms-wax": { - source: "apache", - extensions: ["wax"], + 'audio/x-ms-wax': { + source: 'apache', + extensions: ['wax'], }, - "audio/x-ms-wma": { - source: "apache", - extensions: ["wma"], + 'audio/x-ms-wma': { + source: 'apache', + extensions: ['wma'], }, - "audio/x-pn-realaudio": { - source: "apache", - extensions: ["ram", "ra"], + 'audio/x-pn-realaudio': { + source: 'apache', + extensions: ['ram', 'ra'], }, - "audio/x-pn-realaudio-plugin": { - source: "apache", - extensions: ["rmp"], + 'audio/x-pn-realaudio-plugin': { + source: 'apache', + extensions: ['rmp'], }, - "audio/x-realaudio": { - source: "nginx", - extensions: ["ra"], + 'audio/x-realaudio': { + source: 'nginx', + extensions: ['ra'], }, - "audio/x-tta": { - source: "apache", + 'audio/x-tta': { + source: 'apache', }, - "audio/x-wav": { - source: "apache", - extensions: ["wav"], + 'audio/x-wav': { + source: 'apache', + extensions: ['wav'], }, - "audio/xm": { - source: "apache", - extensions: ["xm"], + 'audio/xm': { + source: 'apache', + extensions: ['xm'], }, - "chemical/x-cdx": { - source: "apache", - extensions: ["cdx"], + 'chemical/x-cdx': { + source: 'apache', + extensions: ['cdx'], }, - "chemical/x-cif": { - source: "apache", - extensions: ["cif"], + 'chemical/x-cif': { + source: 'apache', + extensions: ['cif'], }, - "chemical/x-cmdf": { - source: "apache", - extensions: ["cmdf"], + 'chemical/x-cmdf': { + source: 'apache', + extensions: ['cmdf'], }, - "chemical/x-cml": { - source: "apache", - extensions: ["cml"], + 'chemical/x-cml': { + source: 'apache', + extensions: ['cml'], }, - "chemical/x-csml": { - source: "apache", - extensions: ["csml"], + 'chemical/x-csml': { + source: 'apache', + extensions: ['csml'], }, - "chemical/x-pdb": { - source: "apache", + 'chemical/x-pdb': { + source: 'apache', }, - "chemical/x-xyz": { - source: "apache", - extensions: ["xyz"], + 'chemical/x-xyz': { + source: 'apache', + extensions: ['xyz'], }, - "font/collection": { - source: "iana", - extensions: ["ttc"], + 'font/collection': { + source: 'iana', + extensions: ['ttc'], }, - "font/otf": { - source: "iana", + 'font/otf': { + source: 'iana', compressible: true, - extensions: ["otf"], + extensions: ['otf'], }, - "font/sfnt": { - source: "iana", + 'font/sfnt': { + source: 'iana', }, - "font/ttf": { - source: "iana", + 'font/ttf': { + source: 'iana', compressible: true, - extensions: ["ttf"], + extensions: ['ttf'], }, - "font/woff": { - source: "iana", - extensions: ["woff"], + 'font/woff': { + source: 'iana', + extensions: ['woff'], }, - "font/woff2": { - source: "iana", - extensions: ["woff2"], + 'font/woff2': { + source: 'iana', + extensions: ['woff2'], }, - "image/aces": { - source: "iana", - extensions: ["exr"], + 'image/aces': { + source: 'iana', + extensions: ['exr'], }, - "image/apng": { - source: "iana", + 'image/apng': { + source: 'iana', compressible: false, - extensions: ["apng"], + extensions: ['apng'], }, - "image/avci": { - source: "iana", - extensions: ["avci"], + 'image/avci': { + source: 'iana', + extensions: ['avci'], }, - "image/avcs": { - source: "iana", - extensions: ["avcs"], + 'image/avcs': { + source: 'iana', + extensions: ['avcs'], }, - "image/avif": { - source: "iana", + 'image/avif': { + source: 'iana', compressible: false, - extensions: ["avif"], + extensions: ['avif'], }, - "image/bmp": { - source: "iana", + 'image/bmp': { + source: 'iana', compressible: true, - extensions: ["bmp", "dib"], + extensions: ['bmp', 'dib'], }, - "image/cgm": { - source: "iana", - extensions: ["cgm"], + 'image/cgm': { + source: 'iana', + extensions: ['cgm'], }, - "image/dicom-rle": { - source: "iana", - extensions: ["drle"], + 'image/dicom-rle': { + source: 'iana', + extensions: ['drle'], }, - "image/dpx": { - source: "iana", - extensions: ["dpx"], + 'image/dpx': { + source: 'iana', + extensions: ['dpx'], }, - "image/emf": { - source: "iana", - extensions: ["emf"], + 'image/emf': { + source: 'iana', + extensions: ['emf'], }, - "image/fits": { - source: "iana", - extensions: ["fits"], + 'image/fits': { + source: 'iana', + extensions: ['fits'], }, - "image/g3fax": { - source: "iana", - extensions: ["g3"], + 'image/g3fax': { + source: 'iana', + extensions: ['g3'], }, - "image/gif": { - source: "iana", + 'image/gif': { + source: 'iana', compressible: false, - extensions: ["gif"], + extensions: ['gif'], }, - "image/heic": { - source: "iana", - extensions: ["heic"], + 'image/heic': { + source: 'iana', + extensions: ['heic'], }, - "image/heic-sequence": { - source: "iana", - extensions: ["heics"], + 'image/heic-sequence': { + source: 'iana', + extensions: ['heics'], }, - "image/heif": { - source: "iana", - extensions: ["heif"], + 'image/heif': { + source: 'iana', + extensions: ['heif'], }, - "image/heif-sequence": { - source: "iana", - extensions: ["heifs"], + 'image/heif-sequence': { + source: 'iana', + extensions: ['heifs'], }, - "image/hej2k": { - source: "iana", - extensions: ["hej2"], + 'image/hej2k': { + source: 'iana', + extensions: ['hej2'], }, - "image/hsj2": { - source: "iana", - extensions: ["hsj2"], + 'image/hsj2': { + source: 'iana', + extensions: ['hsj2'], }, - "image/ief": { - source: "iana", - extensions: ["ief"], + 'image/ief': { + source: 'iana', + extensions: ['ief'], }, - "image/jls": { - source: "iana", - extensions: ["jls"], + 'image/jls': { + source: 'iana', + extensions: ['jls'], }, - "image/jp2": { - source: "iana", + 'image/jp2': { + source: 'iana', compressible: false, - extensions: ["jp2", "jpg2"], + extensions: ['jp2', 'jpg2'], }, - "image/jpeg": { - source: "iana", + 'image/jpeg': { + source: 'iana', compressible: false, - extensions: ["jpeg", "jpg", "jpe"], + extensions: ['jpeg', 'jpg', 'jpe'], }, - "image/jph": { - source: "iana", - extensions: ["jph"], + 'image/jph': { + source: 'iana', + extensions: ['jph'], }, - "image/jphc": { - source: "iana", - extensions: ["jhc"], + 'image/jphc': { + source: 'iana', + extensions: ['jhc'], }, - "image/jpm": { - source: "iana", + 'image/jpm': { + source: 'iana', compressible: false, - extensions: ["jpm", "jpgm"], + extensions: ['jpm', 'jpgm'], }, - "image/jpx": { - source: "iana", + 'image/jpx': { + source: 'iana', compressible: false, - extensions: ["jpx", "jpf"], + extensions: ['jpx', 'jpf'], }, - "image/jxr": { - source: "iana", - extensions: ["jxr"], + 'image/jxr': { + source: 'iana', + extensions: ['jxr'], }, - "image/jxra": { - source: "iana", - extensions: ["jxra"], + 'image/jxra': { + source: 'iana', + extensions: ['jxra'], }, - "image/jxrs": { - source: "iana", - extensions: ["jxrs"], + 'image/jxrs': { + source: 'iana', + extensions: ['jxrs'], }, - "image/jxs": { - source: "iana", - extensions: ["jxs"], + 'image/jxs': { + source: 'iana', + extensions: ['jxs'], }, - "image/jxsc": { - source: "iana", - extensions: ["jxsc"], + 'image/jxsc': { + source: 'iana', + extensions: ['jxsc'], }, - "image/jxsi": { - source: "iana", - extensions: ["jxsi"], + 'image/jxsi': { + source: 'iana', + extensions: ['jxsi'], }, - "image/jxss": { - source: "iana", - extensions: ["jxss"], + 'image/jxss': { + source: 'iana', + extensions: ['jxss'], }, - "image/ktx": { - source: "iana", - extensions: ["ktx"], + 'image/ktx': { + source: 'iana', + extensions: ['ktx'], }, - "image/ktx2": { - source: "iana", - extensions: ["ktx2"], + 'image/ktx2': { + source: 'iana', + extensions: ['ktx2'], }, - "image/naplps": { - source: "iana", + 'image/naplps': { + source: 'iana', }, - "image/pjpeg": { + 'image/pjpeg': { compressible: false, }, - "image/png": { - source: "iana", + 'image/png': { + source: 'iana', compressible: false, - extensions: ["png"], + extensions: ['png'], }, - "image/prs.btif": { - source: "iana", - extensions: ["btif", "btf"], + 'image/prs.btif': { + source: 'iana', + extensions: ['btif', 'btf'], }, - "image/prs.pti": { - source: "iana", - extensions: ["pti"], + 'image/prs.pti': { + source: 'iana', + extensions: ['pti'], }, - "image/pwg-raster": { - source: "iana", + 'image/pwg-raster': { + source: 'iana', }, - "image/sgi": { - source: "apache", - extensions: ["sgi"], + 'image/sgi': { + source: 'apache', + extensions: ['sgi'], }, - "image/svg+xml": { - source: "iana", + 'image/svg+xml': { + source: 'iana', compressible: true, - extensions: ["svg", "svgz"], + extensions: ['svg', 'svgz'], }, - "image/t38": { - source: "iana", - extensions: ["t38"], + 'image/t38': { + source: 'iana', + extensions: ['t38'], }, - "image/tiff": { - source: "iana", + 'image/tiff': { + source: 'iana', compressible: false, - extensions: ["tif", "tiff"], + extensions: ['tif', 'tiff'], }, - "image/tiff-fx": { - source: "iana", - extensions: ["tfx"], + 'image/tiff-fx': { + source: 'iana', + extensions: ['tfx'], }, - "image/vnd.adobe.photoshop": { - source: "iana", + 'image/vnd.adobe.photoshop': { + source: 'iana', compressible: true, - extensions: ["psd"], + extensions: ['psd'], }, - "image/vnd.airzip.accelerator.azv": { - source: "iana", - extensions: ["azv"], + 'image/vnd.airzip.accelerator.azv': { + source: 'iana', + extensions: ['azv'], }, - "image/vnd.cns.inf2": { - source: "iana", + 'image/vnd.cns.inf2': { + source: 'iana', }, - "image/vnd.dece.graphic": { - source: "iana", - extensions: ["uvi", "uvvi", "uvg", "uvvg"], + 'image/vnd.dece.graphic': { + source: 'iana', + extensions: ['uvi', 'uvvi', 'uvg', 'uvvg'], }, - "image/vnd.djvu": { - source: "iana", - extensions: ["djvu", "djv"], + 'image/vnd.djvu': { + source: 'iana', + extensions: ['djvu', 'djv'], }, - "image/vnd.dvb.subtitle": { - source: "iana", - extensions: ["sub"], + 'image/vnd.dvb.subtitle': { + source: 'iana', + extensions: ['sub'], }, - "image/vnd.dwg": { - source: "iana", - extensions: ["dwg"], + 'image/vnd.dwg': { + source: 'iana', + extensions: ['dwg'], }, - "image/vnd.dxf": { - source: "iana", - extensions: ["dxf"], + 'image/vnd.dxf': { + source: 'iana', + extensions: ['dxf'], }, - "image/vnd.fastbidsheet": { - source: "iana", - extensions: ["fbs"], + 'image/vnd.fastbidsheet': { + source: 'iana', + extensions: ['fbs'], }, - "image/vnd.fpx": { - source: "iana", - extensions: ["fpx"], + 'image/vnd.fpx': { + source: 'iana', + extensions: ['fpx'], }, - "image/vnd.fst": { - source: "iana", - extensions: ["fst"], + 'image/vnd.fst': { + source: 'iana', + extensions: ['fst'], }, - "image/vnd.fujixerox.edmics-mmr": { - source: "iana", - extensions: ["mmr"], + 'image/vnd.fujixerox.edmics-mmr': { + source: 'iana', + extensions: ['mmr'], }, - "image/vnd.fujixerox.edmics-rlc": { - source: "iana", - extensions: ["rlc"], + 'image/vnd.fujixerox.edmics-rlc': { + source: 'iana', + extensions: ['rlc'], }, - "image/vnd.globalgraphics.pgb": { - source: "iana", + 'image/vnd.globalgraphics.pgb': { + source: 'iana', }, - "image/vnd.microsoft.icon": { - source: "iana", + 'image/vnd.microsoft.icon': { + source: 'iana', compressible: true, - extensions: ["ico"], + extensions: ['ico'], }, - "image/vnd.mix": { - source: "iana", + 'image/vnd.mix': { + source: 'iana', }, - "image/vnd.mozilla.apng": { - source: "iana", + 'image/vnd.mozilla.apng': { + source: 'iana', }, - "image/vnd.ms-dds": { + 'image/vnd.ms-dds': { compressible: true, - extensions: ["dds"], + extensions: ['dds'], }, - "image/vnd.ms-modi": { - source: "iana", - extensions: ["mdi"], + 'image/vnd.ms-modi': { + source: 'iana', + extensions: ['mdi'], }, - "image/vnd.ms-photo": { - source: "apache", - extensions: ["wdp"], + 'image/vnd.ms-photo': { + source: 'apache', + extensions: ['wdp'], }, - "image/vnd.net-fpx": { - source: "iana", - extensions: ["npx"], + 'image/vnd.net-fpx': { + source: 'iana', + extensions: ['npx'], }, - "image/vnd.pco.b16": { - source: "iana", - extensions: ["b16"], + 'image/vnd.pco.b16': { + source: 'iana', + extensions: ['b16'], }, - "image/vnd.radiance": { - source: "iana", + 'image/vnd.radiance': { + source: 'iana', }, - "image/vnd.sealed.png": { - source: "iana", + 'image/vnd.sealed.png': { + source: 'iana', }, - "image/vnd.sealedmedia.softseal.gif": { - source: "iana", + 'image/vnd.sealedmedia.softseal.gif': { + source: 'iana', }, - "image/vnd.sealedmedia.softseal.jpg": { - source: "iana", + 'image/vnd.sealedmedia.softseal.jpg': { + source: 'iana', }, - "image/vnd.svf": { - source: "iana", + 'image/vnd.svf': { + source: 'iana', }, - "image/vnd.tencent.tap": { - source: "iana", - extensions: ["tap"], + 'image/vnd.tencent.tap': { + source: 'iana', + extensions: ['tap'], }, - "image/vnd.valve.source.texture": { - source: "iana", - extensions: ["vtf"], + 'image/vnd.valve.source.texture': { + source: 'iana', + extensions: ['vtf'], }, - "image/vnd.wap.wbmp": { - source: "iana", - extensions: ["wbmp"], + 'image/vnd.wap.wbmp': { + source: 'iana', + extensions: ['wbmp'], }, - "image/vnd.xiff": { - source: "iana", - extensions: ["xif"], + 'image/vnd.xiff': { + source: 'iana', + extensions: ['xif'], }, - "image/vnd.zbrush.pcx": { - source: "iana", - extensions: ["pcx"], + 'image/vnd.zbrush.pcx': { + source: 'iana', + extensions: ['pcx'], }, - "image/webp": { - source: "iana", - extensions: ["webp"], + 'image/webp': { + source: 'iana', + extensions: ['webp'], }, - "image/wmf": { - source: "iana", - extensions: ["wmf"], + 'image/wmf': { + source: 'iana', + extensions: ['wmf'], }, - "image/x-3ds": { - source: "apache", - extensions: ["3ds"], + 'image/x-3ds': { + source: 'apache', + extensions: ['3ds'], }, - "image/x-cmu-raster": { - source: "apache", - extensions: ["ras"], + 'image/x-cmu-raster': { + source: 'apache', + extensions: ['ras'], }, - "image/x-cmx": { - source: "apache", - extensions: ["cmx"], + 'image/x-cmx': { + source: 'apache', + extensions: ['cmx'], }, - "image/x-freehand": { - source: "apache", - extensions: ["fh", "fhc", "fh4", "fh5", "fh7"], + 'image/x-freehand': { + source: 'apache', + extensions: ['fh', 'fhc', 'fh4', 'fh5', 'fh7'], }, - "image/x-icon": { - source: "apache", + 'image/x-icon': { + source: 'apache', compressible: true, - extensions: ["ico"], + extensions: ['ico'], }, - "image/x-jng": { - source: "nginx", - extensions: ["jng"], + 'image/x-jng': { + source: 'nginx', + extensions: ['jng'], }, - "image/x-mrsid-image": { - source: "apache", - extensions: ["sid"], + 'image/x-mrsid-image': { + source: 'apache', + extensions: ['sid'], }, - "image/x-ms-bmp": { - source: "nginx", + 'image/x-ms-bmp': { + source: 'nginx', compressible: true, - extensions: ["bmp"], + extensions: ['bmp'], }, - "image/x-pcx": { - source: "apache", - extensions: ["pcx"], + 'image/x-pcx': { + source: 'apache', + extensions: ['pcx'], }, - "image/x-pict": { - source: "apache", - extensions: ["pic", "pct"], + 'image/x-pict': { + source: 'apache', + extensions: ['pic', 'pct'], }, - "image/x-portable-anymap": { - source: "apache", - extensions: ["pnm"], + 'image/x-portable-anymap': { + source: 'apache', + extensions: ['pnm'], }, - "image/x-portable-bitmap": { - source: "apache", - extensions: ["pbm"], + 'image/x-portable-bitmap': { + source: 'apache', + extensions: ['pbm'], }, - "image/x-portable-graymap": { - source: "apache", - extensions: ["pgm"], + 'image/x-portable-graymap': { + source: 'apache', + extensions: ['pgm'], }, - "image/x-portable-pixmap": { - source: "apache", - extensions: ["ppm"], + 'image/x-portable-pixmap': { + source: 'apache', + extensions: ['ppm'], }, - "image/x-rgb": { - source: "apache", - extensions: ["rgb"], + 'image/x-rgb': { + source: 'apache', + extensions: ['rgb'], }, - "image/x-tga": { - source: "apache", - extensions: ["tga"], + 'image/x-tga': { + source: 'apache', + extensions: ['tga'], }, - "image/x-xbitmap": { - source: "apache", - extensions: ["xbm"], + 'image/x-xbitmap': { + source: 'apache', + extensions: ['xbm'], }, - "image/x-xcf": { + 'image/x-xcf': { compressible: false, }, - "image/x-xpixmap": { - source: "apache", - extensions: ["xpm"], + 'image/x-xpixmap': { + source: 'apache', + extensions: ['xpm'], }, - "image/x-xwindowdump": { - source: "apache", - extensions: ["xwd"], + 'image/x-xwindowdump': { + source: 'apache', + extensions: ['xwd'], }, - "message/bhttp": { - source: "iana", + 'message/bhttp': { + source: 'iana', }, - "message/cpim": { - source: "iana", + 'message/cpim': { + source: 'iana', }, - "message/delivery-status": { - source: "iana", + 'message/delivery-status': { + source: 'iana', }, - "message/disposition-notification": { - source: "iana", - extensions: ["disposition-notification"], + 'message/disposition-notification': { + source: 'iana', + extensions: ['disposition-notification'], }, - "message/external-body": { - source: "iana", + 'message/external-body': { + source: 'iana', }, - "message/feedback-report": { - source: "iana", + 'message/feedback-report': { + source: 'iana', }, - "message/global": { - source: "iana", - extensions: ["u8msg"], + 'message/global': { + source: 'iana', + extensions: ['u8msg'], }, - "message/global-delivery-status": { - source: "iana", - extensions: ["u8dsn"], + 'message/global-delivery-status': { + source: 'iana', + extensions: ['u8dsn'], }, - "message/global-disposition-notification": { - source: "iana", - extensions: ["u8mdn"], + 'message/global-disposition-notification': { + source: 'iana', + extensions: ['u8mdn'], }, - "message/global-headers": { - source: "iana", - extensions: ["u8hdr"], + 'message/global-headers': { + source: 'iana', + extensions: ['u8hdr'], }, - "message/http": { - source: "iana", + 'message/http': { + source: 'iana', compressible: false, }, - "message/imdn+xml": { - source: "iana", + 'message/imdn+xml': { + source: 'iana', compressible: true, }, - "message/news": { - source: "apache", + 'message/news': { + source: 'apache', }, - "message/partial": { - source: "iana", + 'message/partial': { + source: 'iana', compressible: false, }, - "message/rfc822": { - source: "iana", + 'message/rfc822': { + source: 'iana', compressible: true, - extensions: ["eml", "mime"], + extensions: ['eml', 'mime'], }, - "message/s-http": { - source: "apache", + 'message/s-http': { + source: 'apache', }, - "message/sip": { - source: "iana", + 'message/sip': { + source: 'iana', }, - "message/sipfrag": { - source: "iana", + 'message/sipfrag': { + source: 'iana', }, - "message/tracking-status": { - source: "iana", + 'message/tracking-status': { + source: 'iana', }, - "message/vnd.si.simp": { - source: "apache", + 'message/vnd.si.simp': { + source: 'apache', }, - "message/vnd.wfa.wsc": { - source: "iana", - extensions: ["wsc"], + 'message/vnd.wfa.wsc': { + source: 'iana', + extensions: ['wsc'], }, - "model/3mf": { - source: "iana", - extensions: ["3mf"], + 'model/3mf': { + source: 'iana', + extensions: ['3mf'], }, - "model/e57": { - source: "iana", + 'model/e57': { + source: 'iana', }, - "model/gltf+json": { - source: "iana", + 'model/gltf+json': { + source: 'iana', compressible: true, - extensions: ["gltf"], + extensions: ['gltf'], }, - "model/gltf-binary": { - source: "iana", + 'model/gltf-binary': { + source: 'iana', compressible: true, - extensions: ["glb"], + extensions: ['glb'], }, - "model/iges": { - source: "iana", + 'model/iges': { + source: 'iana', compressible: false, - extensions: ["igs", "iges"], + extensions: ['igs', 'iges'], }, - "model/jt": { - source: "iana", - extensions: ["jt"], + 'model/jt': { + source: 'iana', + extensions: ['jt'], }, - "model/mesh": { - source: "iana", + 'model/mesh': { + source: 'iana', compressible: false, - extensions: ["msh", "mesh", "silo"], + extensions: ['msh', 'mesh', 'silo'], }, - "model/mtl": { - source: "iana", - extensions: ["mtl"], + 'model/mtl': { + source: 'iana', + extensions: ['mtl'], }, - "model/obj": { - source: "iana", - extensions: ["obj"], + 'model/obj': { + source: 'iana', + extensions: ['obj'], }, - "model/prc": { - source: "iana", - extensions: ["prc"], + 'model/prc': { + source: 'iana', + extensions: ['prc'], }, - "model/step": { - source: "iana", + 'model/step': { + source: 'iana', }, - "model/step+xml": { - source: "iana", + 'model/step+xml': { + source: 'iana', compressible: true, - extensions: ["stpx"], + extensions: ['stpx'], }, - "model/step+zip": { - source: "iana", + 'model/step+zip': { + source: 'iana', compressible: false, - extensions: ["stpz"], + extensions: ['stpz'], }, - "model/step-xml+zip": { - source: "iana", + 'model/step-xml+zip': { + source: 'iana', compressible: false, - extensions: ["stpxz"], + extensions: ['stpxz'], }, - "model/stl": { - source: "iana", - extensions: ["stl"], + 'model/stl': { + source: 'iana', + extensions: ['stl'], }, - "model/u3d": { - source: "iana", - extensions: ["u3d"], + 'model/u3d': { + source: 'iana', + extensions: ['u3d'], }, - "model/vnd.cld": { - source: "iana", - extensions: ["cld"], + 'model/vnd.cld': { + source: 'iana', + extensions: ['cld'], }, - "model/vnd.collada+xml": { - source: "iana", + 'model/vnd.collada+xml': { + source: 'iana', compressible: true, - extensions: ["dae"], + extensions: ['dae'], }, - "model/vnd.dwf": { - source: "iana", - extensions: ["dwf"], + 'model/vnd.dwf': { + source: 'iana', + extensions: ['dwf'], }, - "model/vnd.flatland.3dml": { - source: "iana", + 'model/vnd.flatland.3dml': { + source: 'iana', }, - "model/vnd.gdl": { - source: "iana", - extensions: ["gdl"], + 'model/vnd.gdl': { + source: 'iana', + extensions: ['gdl'], }, - "model/vnd.gs-gdl": { - source: "apache", + 'model/vnd.gs-gdl': { + source: 'apache', }, - "model/vnd.gs.gdl": { - source: "iana", + 'model/vnd.gs.gdl': { + source: 'iana', }, - "model/vnd.gtw": { - source: "iana", - extensions: ["gtw"], + 'model/vnd.gtw': { + source: 'iana', + extensions: ['gtw'], }, - "model/vnd.moml+xml": { - source: "iana", + 'model/vnd.moml+xml': { + source: 'iana', compressible: true, }, - "model/vnd.mts": { - source: "iana", - extensions: ["mts"], + 'model/vnd.mts': { + source: 'iana', + extensions: ['mts'], }, - "model/vnd.opengex": { - source: "iana", - extensions: ["ogex"], + 'model/vnd.opengex': { + source: 'iana', + extensions: ['ogex'], }, - "model/vnd.parasolid.transmit.binary": { - source: "iana", - extensions: ["x_b"], + 'model/vnd.parasolid.transmit.binary': { + source: 'iana', + extensions: ['x_b'], }, - "model/vnd.parasolid.transmit.text": { - source: "iana", - extensions: ["x_t"], + 'model/vnd.parasolid.transmit.text': { + source: 'iana', + extensions: ['x_t'], }, - "model/vnd.pytha.pyox": { - source: "iana", - extensions: ["pyo", "pyox"], + 'model/vnd.pytha.pyox': { + source: 'iana', + extensions: ['pyo', 'pyox'], }, - "model/vnd.rosette.annotated-data-model": { - source: "iana", + 'model/vnd.rosette.annotated-data-model': { + source: 'iana', }, - "model/vnd.sap.vds": { - source: "iana", - extensions: ["vds"], + 'model/vnd.sap.vds': { + source: 'iana', + extensions: ['vds'], }, - "model/vnd.usda": { - source: "iana", - extensions: ["usda"], + 'model/vnd.usda': { + source: 'iana', + extensions: ['usda'], }, - "model/vnd.usdz+zip": { - source: "iana", + 'model/vnd.usdz+zip': { + source: 'iana', compressible: false, - extensions: ["usdz"], + extensions: ['usdz'], }, - "model/vnd.valve.source.compiled-map": { - source: "iana", - extensions: ["bsp"], + 'model/vnd.valve.source.compiled-map': { + source: 'iana', + extensions: ['bsp'], }, - "model/vnd.vtu": { - source: "iana", - extensions: ["vtu"], + 'model/vnd.vtu': { + source: 'iana', + extensions: ['vtu'], }, - "model/vrml": { - source: "iana", + 'model/vrml': { + source: 'iana', compressible: false, - extensions: ["wrl", "vrml"], + extensions: ['wrl', 'vrml'], }, - "model/x3d+binary": { - source: "apache", + 'model/x3d+binary': { + source: 'apache', compressible: false, - extensions: ["x3db", "x3dbz"], + extensions: ['x3db', 'x3dbz'], }, - "model/x3d+fastinfoset": { - source: "iana", - extensions: ["x3db"], + 'model/x3d+fastinfoset': { + source: 'iana', + extensions: ['x3db'], }, - "model/x3d+vrml": { - source: "apache", + 'model/x3d+vrml': { + source: 'apache', compressible: false, - extensions: ["x3dv", "x3dvz"], + extensions: ['x3dv', 'x3dvz'], }, - "model/x3d+xml": { - source: "iana", + 'model/x3d+xml': { + source: 'iana', compressible: true, - extensions: ["x3d", "x3dz"], + extensions: ['x3d', 'x3dz'], }, - "model/x3d-vrml": { - source: "iana", - extensions: ["x3dv"], + 'model/x3d-vrml': { + source: 'iana', + extensions: ['x3dv'], }, - "multipart/alternative": { - source: "iana", + 'multipart/alternative': { + source: 'iana', compressible: false, }, - "multipart/appledouble": { - source: "iana", + 'multipart/appledouble': { + source: 'iana', }, - "multipart/byteranges": { - source: "iana", + 'multipart/byteranges': { + source: 'iana', }, - "multipart/digest": { - source: "iana", + 'multipart/digest': { + source: 'iana', }, - "multipart/encrypted": { - source: "iana", + 'multipart/encrypted': { + source: 'iana', compressible: false, }, - "multipart/form-data": { - source: "iana", + 'multipart/form-data': { + source: 'iana', compressible: false, }, - "multipart/header-set": { - source: "iana", + 'multipart/header-set': { + source: 'iana', }, - "multipart/mixed": { - source: "iana", + 'multipart/mixed': { + source: 'iana', }, - "multipart/multilingual": { - source: "iana", + 'multipart/multilingual': { + source: 'iana', }, - "multipart/parallel": { - source: "iana", + 'multipart/parallel': { + source: 'iana', }, - "multipart/related": { - source: "iana", + 'multipart/related': { + source: 'iana', compressible: false, }, - "multipart/report": { - source: "iana", + 'multipart/report': { + source: 'iana', }, - "multipart/signed": { - source: "iana", + 'multipart/signed': { + source: 'iana', compressible: false, }, - "multipart/vnd.bint.med-plus": { - source: "iana", + 'multipart/vnd.bint.med-plus': { + source: 'iana', }, - "multipart/voice-message": { - source: "iana", + 'multipart/voice-message': { + source: 'iana', }, - "multipart/x-mixed-replace": { - source: "iana", + 'multipart/x-mixed-replace': { + source: 'iana', }, - "text/1d-interleaved-parityfec": { - source: "iana", + 'text/1d-interleaved-parityfec': { + source: 'iana', }, - "text/cache-manifest": { - source: "iana", + 'text/cache-manifest': { + source: 'iana', compressible: true, - extensions: ["appcache", "manifest"], + extensions: ['appcache', 'manifest'], }, - "text/calendar": { - source: "iana", - extensions: ["ics", "ifb"], + 'text/calendar': { + source: 'iana', + extensions: ['ics', 'ifb'], }, - "text/calender": { + 'text/calender': { compressible: true, }, - "text/cmd": { + 'text/cmd': { compressible: true, }, - "text/coffeescript": { - extensions: ["coffee", "litcoffee"], + 'text/coffeescript': { + extensions: ['coffee', 'litcoffee'], }, - "text/cql": { - source: "iana", + 'text/cql': { + source: 'iana', }, - "text/cql-expression": { - source: "iana", + 'text/cql-expression': { + source: 'iana', }, - "text/cql-identifier": { - source: "iana", + 'text/cql-identifier': { + source: 'iana', }, - "text/css": { - source: "iana", - charset: "UTF-8", + 'text/css': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["css"], + extensions: ['css'], }, - "text/csv": { - source: "iana", + 'text/csv': { + source: 'iana', compressible: true, - extensions: ["csv"], + extensions: ['csv'], }, - "text/csv-schema": { - source: "iana", + 'text/csv-schema': { + source: 'iana', }, - "text/directory": { - source: "iana", + 'text/directory': { + source: 'iana', }, - "text/dns": { - source: "iana", + 'text/dns': { + source: 'iana', }, - "text/ecmascript": { - source: "apache", + 'text/ecmascript': { + source: 'apache', }, - "text/encaprtp": { - source: "iana", + 'text/encaprtp': { + source: 'iana', }, - "text/enriched": { - source: "iana", + 'text/enriched': { + source: 'iana', }, - "text/fhirpath": { - source: "iana", + 'text/fhirpath': { + source: 'iana', }, - "text/flexfec": { - source: "iana", + 'text/flexfec': { + source: 'iana', }, - "text/fwdred": { - source: "iana", + 'text/fwdred': { + source: 'iana', }, - "text/gff3": { - source: "iana", + 'text/gff3': { + source: 'iana', }, - "text/grammar-ref-list": { - source: "iana", + 'text/grammar-ref-list': { + source: 'iana', }, - "text/hl7v2": { - source: "iana", + 'text/hl7v2': { + source: 'iana', }, - "text/html": { - source: "iana", + 'text/html': { + source: 'iana', compressible: true, - extensions: ["html", "htm", "shtml"], + extensions: ['html', 'htm', 'shtml'], }, - "text/jade": { - extensions: ["jade"], + 'text/jade': { + extensions: ['jade'], }, - "text/javascript": { - source: "iana", - charset: "UTF-8", + 'text/javascript': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["js", "mjs"], + extensions: ['js', 'mjs'], }, - "text/jcr-cnd": { - source: "iana", + 'text/jcr-cnd': { + source: 'iana', }, - "text/jsx": { + 'text/jsx': { compressible: true, - extensions: ["jsx"], + extensions: ['jsx'], }, - "text/less": { + 'text/less': { compressible: true, - extensions: ["less"], + extensions: ['less'], }, - "text/markdown": { - source: "iana", + 'text/markdown': { + source: 'iana', compressible: true, - extensions: ["md", "markdown"], + extensions: ['md', 'markdown'], }, - "text/mathml": { - source: "nginx", - extensions: ["mml"], + 'text/mathml': { + source: 'nginx', + extensions: ['mml'], }, - "text/mdx": { + 'text/mdx': { compressible: true, - extensions: ["mdx"], + extensions: ['mdx'], }, - "text/mizar": { - source: "iana", + 'text/mizar': { + source: 'iana', }, - "text/n3": { - source: "iana", - charset: "UTF-8", + 'text/n3': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["n3"], + extensions: ['n3'], }, - "text/parameters": { - source: "iana", - charset: "UTF-8", + 'text/parameters': { + source: 'iana', + charset: 'UTF-8', }, - "text/parityfec": { - source: "iana", + 'text/parityfec': { + source: 'iana', }, - "text/plain": { - source: "iana", + 'text/plain': { + source: 'iana', compressible: true, - extensions: ["txt", "text", "conf", "def", "list", "log", "in", "ini"], + extensions: ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'ini'], }, - "text/provenance-notation": { - source: "iana", - charset: "UTF-8", + 'text/provenance-notation': { + source: 'iana', + charset: 'UTF-8', }, - "text/prs.fallenstein.rst": { - source: "iana", + 'text/prs.fallenstein.rst': { + source: 'iana', }, - "text/prs.lines.tag": { - source: "iana", - extensions: ["dsc"], + 'text/prs.lines.tag': { + source: 'iana', + extensions: ['dsc'], }, - "text/prs.prop.logic": { - source: "iana", + 'text/prs.prop.logic': { + source: 'iana', }, - "text/raptorfec": { - source: "iana", + 'text/raptorfec': { + source: 'iana', }, - "text/red": { - source: "iana", + 'text/red': { + source: 'iana', }, - "text/rfc822-headers": { - source: "iana", + 'text/rfc822-headers': { + source: 'iana', }, - "text/richtext": { - source: "iana", + 'text/richtext': { + source: 'iana', compressible: true, - extensions: ["rtx"], + extensions: ['rtx'], }, - "text/rtf": { - source: "iana", + 'text/rtf': { + source: 'iana', compressible: true, - extensions: ["rtf"], + extensions: ['rtf'], }, - "text/rtp-enc-aescm128": { - source: "iana", + 'text/rtp-enc-aescm128': { + source: 'iana', }, - "text/rtploopback": { - source: "iana", + 'text/rtploopback': { + source: 'iana', }, - "text/rtx": { - source: "iana", + 'text/rtx': { + source: 'iana', }, - "text/sgml": { - source: "iana", - extensions: ["sgml", "sgm"], + 'text/sgml': { + source: 'iana', + extensions: ['sgml', 'sgm'], }, - "text/shaclc": { - source: "iana", + 'text/shaclc': { + source: 'iana', }, - "text/shex": { - source: "iana", - extensions: ["shex"], + 'text/shex': { + source: 'iana', + extensions: ['shex'], }, - "text/slim": { - extensions: ["slim", "slm"], + 'text/slim': { + extensions: ['slim', 'slm'], }, - "text/spdx": { - source: "iana", - extensions: ["spdx"], + 'text/spdx': { + source: 'iana', + extensions: ['spdx'], }, - "text/strings": { - source: "iana", + 'text/strings': { + source: 'iana', }, - "text/stylus": { - extensions: ["stylus", "styl"], + 'text/stylus': { + extensions: ['stylus', 'styl'], }, - "text/t140": { - source: "iana", + 'text/t140': { + source: 'iana', }, - "text/tab-separated-values": { - source: "iana", + 'text/tab-separated-values': { + source: 'iana', compressible: true, - extensions: ["tsv"], + extensions: ['tsv'], }, - "text/troff": { - source: "iana", - extensions: ["t", "tr", "roff", "man", "me", "ms"], + 'text/troff': { + source: 'iana', + extensions: ['t', 'tr', 'roff', 'man', 'me', 'ms'], }, - "text/turtle": { - source: "iana", - charset: "UTF-8", - extensions: ["ttl"], + 'text/turtle': { + source: 'iana', + charset: 'UTF-8', + extensions: ['ttl'], }, - "text/ulpfec": { - source: "iana", + 'text/ulpfec': { + source: 'iana', }, - "text/uri-list": { - source: "iana", + 'text/uri-list': { + source: 'iana', compressible: true, - extensions: ["uri", "uris", "urls"], + extensions: ['uri', 'uris', 'urls'], }, - "text/vcard": { - source: "iana", + 'text/vcard': { + source: 'iana', compressible: true, - extensions: ["vcard"], + extensions: ['vcard'], }, - "text/vnd.a": { - source: "iana", + 'text/vnd.a': { + source: 'iana', }, - "text/vnd.abc": { - source: "iana", + 'text/vnd.abc': { + source: 'iana', }, - "text/vnd.ascii-art": { - source: "iana", + 'text/vnd.ascii-art': { + source: 'iana', }, - "text/vnd.curl": { - source: "iana", - extensions: ["curl"], + 'text/vnd.curl': { + source: 'iana', + extensions: ['curl'], }, - "text/vnd.curl.dcurl": { - source: "apache", - extensions: ["dcurl"], + 'text/vnd.curl.dcurl': { + source: 'apache', + extensions: ['dcurl'], }, - "text/vnd.curl.mcurl": { - source: "apache", - extensions: ["mcurl"], + 'text/vnd.curl.mcurl': { + source: 'apache', + extensions: ['mcurl'], }, - "text/vnd.curl.scurl": { - source: "apache", - extensions: ["scurl"], + 'text/vnd.curl.scurl': { + source: 'apache', + extensions: ['scurl'], }, - "text/vnd.debian.copyright": { - source: "iana", - charset: "UTF-8", + 'text/vnd.debian.copyright': { + source: 'iana', + charset: 'UTF-8', }, - "text/vnd.dmclientscript": { - source: "iana", + 'text/vnd.dmclientscript': { + source: 'iana', }, - "text/vnd.dvb.subtitle": { - source: "iana", - extensions: ["sub"], + 'text/vnd.dvb.subtitle': { + source: 'iana', + extensions: ['sub'], }, - "text/vnd.esmertec.theme-descriptor": { - source: "iana", - charset: "UTF-8", + 'text/vnd.esmertec.theme-descriptor': { + source: 'iana', + charset: 'UTF-8', }, - "text/vnd.exchangeable": { - source: "iana", + 'text/vnd.exchangeable': { + source: 'iana', }, - "text/vnd.familysearch.gedcom": { - source: "iana", - extensions: ["ged"], + 'text/vnd.familysearch.gedcom': { + source: 'iana', + extensions: ['ged'], }, - "text/vnd.ficlab.flt": { - source: "iana", + 'text/vnd.ficlab.flt': { + source: 'iana', }, - "text/vnd.fly": { - source: "iana", - extensions: ["fly"], + 'text/vnd.fly': { + source: 'iana', + extensions: ['fly'], }, - "text/vnd.fmi.flexstor": { - source: "iana", - extensions: ["flx"], + 'text/vnd.fmi.flexstor': { + source: 'iana', + extensions: ['flx'], }, - "text/vnd.gml": { - source: "iana", + 'text/vnd.gml': { + source: 'iana', }, - "text/vnd.graphviz": { - source: "iana", - extensions: ["gv"], + 'text/vnd.graphviz': { + source: 'iana', + extensions: ['gv'], }, - "text/vnd.hans": { - source: "iana", + 'text/vnd.hans': { + source: 'iana', }, - "text/vnd.hgl": { - source: "iana", + 'text/vnd.hgl': { + source: 'iana', }, - "text/vnd.in3d.3dml": { - source: "iana", - extensions: ["3dml"], + 'text/vnd.in3d.3dml': { + source: 'iana', + extensions: ['3dml'], }, - "text/vnd.in3d.spot": { - source: "iana", - extensions: ["spot"], + 'text/vnd.in3d.spot': { + source: 'iana', + extensions: ['spot'], }, - "text/vnd.iptc.newsml": { - source: "iana", + 'text/vnd.iptc.newsml': { + source: 'iana', }, - "text/vnd.iptc.nitf": { - source: "iana", + 'text/vnd.iptc.nitf': { + source: 'iana', }, - "text/vnd.latex-z": { - source: "iana", + 'text/vnd.latex-z': { + source: 'iana', }, - "text/vnd.motorola.reflex": { - source: "iana", + 'text/vnd.motorola.reflex': { + source: 'iana', }, - "text/vnd.ms-mediapackage": { - source: "iana", + 'text/vnd.ms-mediapackage': { + source: 'iana', }, - "text/vnd.net2phone.commcenter.command": { - source: "iana", + 'text/vnd.net2phone.commcenter.command': { + source: 'iana', }, - "text/vnd.radisys.msml-basic-layout": { - source: "iana", + 'text/vnd.radisys.msml-basic-layout': { + source: 'iana', }, - "text/vnd.senx.warpscript": { - source: "iana", + 'text/vnd.senx.warpscript': { + source: 'iana', }, - "text/vnd.si.uricatalogue": { - source: "apache", + 'text/vnd.si.uricatalogue': { + source: 'apache', }, - "text/vnd.sosi": { - source: "iana", + 'text/vnd.sosi': { + source: 'iana', }, - "text/vnd.sun.j2me.app-descriptor": { - source: "iana", - charset: "UTF-8", - extensions: ["jad"], + 'text/vnd.sun.j2me.app-descriptor': { + source: 'iana', + charset: 'UTF-8', + extensions: ['jad'], }, - "text/vnd.trolltech.linguist": { - source: "iana", - charset: "UTF-8", + 'text/vnd.trolltech.linguist': { + source: 'iana', + charset: 'UTF-8', }, - "text/vnd.wap.si": { - source: "iana", + 'text/vnd.wap.si': { + source: 'iana', }, - "text/vnd.wap.sl": { - source: "iana", + 'text/vnd.wap.sl': { + source: 'iana', }, - "text/vnd.wap.wml": { - source: "iana", - extensions: ["wml"], + 'text/vnd.wap.wml': { + source: 'iana', + extensions: ['wml'], }, - "text/vnd.wap.wmlscript": { - source: "iana", - extensions: ["wmls"], + 'text/vnd.wap.wmlscript': { + source: 'iana', + extensions: ['wmls'], }, - "text/vtt": { - source: "iana", - charset: "UTF-8", + 'text/vtt': { + source: 'iana', + charset: 'UTF-8', compressible: true, - extensions: ["vtt"], + extensions: ['vtt'], }, - "text/wgsl": { - source: "iana", - extensions: ["wgsl"], + 'text/wgsl': { + source: 'iana', + extensions: ['wgsl'], }, - "text/x-asm": { - source: "apache", - extensions: ["s", "asm"], + 'text/x-asm': { + source: 'apache', + extensions: ['s', 'asm'], }, - "text/x-c": { - source: "apache", - extensions: ["c", "cc", "cxx", "cpp", "h", "hh", "dic"], + 'text/x-c': { + source: 'apache', + extensions: ['c', 'cc', 'cxx', 'cpp', 'h', 'hh', 'dic'], }, - "text/x-component": { - source: "nginx", - extensions: ["htc"], + 'text/x-component': { + source: 'nginx', + extensions: ['htc'], }, - "text/x-fortran": { - source: "apache", - extensions: ["f", "for", "f77", "f90"], + 'text/x-fortran': { + source: 'apache', + extensions: ['f', 'for', 'f77', 'f90'], }, - "text/x-gwt-rpc": { + 'text/x-gwt-rpc': { compressible: true, }, - "text/x-handlebars-template": { - extensions: ["hbs"], + 'text/x-handlebars-template': { + extensions: ['hbs'], }, - "text/x-java-source": { - source: "apache", - extensions: ["java"], + 'text/x-java-source': { + source: 'apache', + extensions: ['java'], }, - "text/x-jquery-tmpl": { + 'text/x-jquery-tmpl': { compressible: true, }, - "text/x-lua": { - extensions: ["lua"], + 'text/x-lua': { + extensions: ['lua'], }, - "text/x-markdown": { + 'text/x-markdown': { compressible: true, - extensions: ["mkd"], + extensions: ['mkd'], }, - "text/x-nfo": { - source: "apache", - extensions: ["nfo"], + 'text/x-nfo': { + source: 'apache', + extensions: ['nfo'], }, - "text/x-opml": { - source: "apache", - extensions: ["opml"], + 'text/x-opml': { + source: 'apache', + extensions: ['opml'], }, - "text/x-org": { + 'text/x-org': { compressible: true, - extensions: ["org"], + extensions: ['org'], }, - "text/x-pascal": { - source: "apache", - extensions: ["p", "pas"], + 'text/x-pascal': { + source: 'apache', + extensions: ['p', 'pas'], }, - "text/x-processing": { + 'text/x-processing': { compressible: true, - extensions: ["pde"], + extensions: ['pde'], }, - "text/x-sass": { - extensions: ["sass"], + 'text/x-sass': { + extensions: ['sass'], }, - "text/x-scss": { - extensions: ["scss"], + 'text/x-scss': { + extensions: ['scss'], }, - "text/x-setext": { - source: "apache", - extensions: ["etx"], + 'text/x-setext': { + source: 'apache', + extensions: ['etx'], }, - "text/x-sfv": { - source: "apache", - extensions: ["sfv"], + 'text/x-sfv': { + source: 'apache', + extensions: ['sfv'], }, - "text/x-suse-ymp": { + 'text/x-suse-ymp': { compressible: true, - extensions: ["ymp"], + extensions: ['ymp'], }, - "text/x-uuencode": { - source: "apache", - extensions: ["uu"], + 'text/x-uuencode': { + source: 'apache', + extensions: ['uu'], }, - "text/x-vcalendar": { - source: "apache", - extensions: ["vcs"], + 'text/x-vcalendar': { + source: 'apache', + extensions: ['vcs'], }, - "text/x-vcard": { - source: "apache", - extensions: ["vcf"], + 'text/x-vcard': { + source: 'apache', + extensions: ['vcf'], }, - "text/xml": { - source: "iana", + 'text/xml': { + source: 'iana', compressible: true, - extensions: ["xml"], + extensions: ['xml'], }, - "text/xml-external-parsed-entity": { - source: "iana", + 'text/xml-external-parsed-entity': { + source: 'iana', }, - "text/yaml": { + 'text/yaml': { compressible: true, - extensions: ["yaml", "yml"], + extensions: ['yaml', 'yml'], }, - "video/1d-interleaved-parityfec": { - source: "iana", + 'video/1d-interleaved-parityfec': { + source: 'iana', }, - "video/3gpp": { - source: "iana", - extensions: ["3gp", "3gpp"], + 'video/3gpp': { + source: 'iana', + extensions: ['3gp', '3gpp'], }, - "video/3gpp-tt": { - source: "iana", + 'video/3gpp-tt': { + source: 'iana', }, - "video/3gpp2": { - source: "iana", - extensions: ["3g2"], + 'video/3gpp2': { + source: 'iana', + extensions: ['3g2'], }, - "video/av1": { - source: "iana", + 'video/av1': { + source: 'iana', }, - "video/bmpeg": { - source: "iana", + 'video/bmpeg': { + source: 'iana', }, - "video/bt656": { - source: "iana", + 'video/bt656': { + source: 'iana', }, - "video/celb": { - source: "iana", + 'video/celb': { + source: 'iana', }, - "video/dv": { - source: "iana", + 'video/dv': { + source: 'iana', }, - "video/encaprtp": { - source: "iana", + 'video/encaprtp': { + source: 'iana', }, - "video/ffv1": { - source: "iana", + 'video/ffv1': { + source: 'iana', }, - "video/flexfec": { - source: "iana", + 'video/flexfec': { + source: 'iana', }, - "video/h261": { - source: "iana", - extensions: ["h261"], + 'video/h261': { + source: 'iana', + extensions: ['h261'], }, - "video/h263": { - source: "iana", - extensions: ["h263"], + 'video/h263': { + source: 'iana', + extensions: ['h263'], }, - "video/h263-1998": { - source: "iana", + 'video/h263-1998': { + source: 'iana', }, - "video/h263-2000": { - source: "iana", + 'video/h263-2000': { + source: 'iana', }, - "video/h264": { - source: "iana", - extensions: ["h264"], + 'video/h264': { + source: 'iana', + extensions: ['h264'], }, - "video/h264-rcdo": { - source: "iana", + 'video/h264-rcdo': { + source: 'iana', }, - "video/h264-svc": { - source: "iana", + 'video/h264-svc': { + source: 'iana', }, - "video/h265": { - source: "iana", + 'video/h265': { + source: 'iana', }, - "video/h266": { - source: "iana", + 'video/h266': { + source: 'iana', }, - "video/iso.segment": { - source: "iana", - extensions: ["m4s"], + 'video/iso.segment': { + source: 'iana', + extensions: ['m4s'], }, - "video/jpeg": { - source: "iana", - extensions: ["jpgv"], + 'video/jpeg': { + source: 'iana', + extensions: ['jpgv'], }, - "video/jpeg2000": { - source: "iana", + 'video/jpeg2000': { + source: 'iana', }, - "video/jpm": { - source: "apache", - extensions: ["jpm", "jpgm"], + 'video/jpm': { + source: 'apache', + extensions: ['jpm', 'jpgm'], }, - "video/jxsv": { - source: "iana", + 'video/jxsv': { + source: 'iana', }, - "video/mj2": { - source: "iana", - extensions: ["mj2", "mjp2"], + 'video/mj2': { + source: 'iana', + extensions: ['mj2', 'mjp2'], }, - "video/mp1s": { - source: "iana", + 'video/mp1s': { + source: 'iana', }, - "video/mp2p": { - source: "iana", + 'video/mp2p': { + source: 'iana', }, - "video/mp2t": { - source: "iana", - extensions: ["ts"], + 'video/mp2t': { + source: 'iana', + extensions: ['ts'], }, - "video/mp4": { - source: "iana", + 'video/mp4': { + source: 'iana', compressible: false, - extensions: ["mp4", "mp4v", "mpg4"], + extensions: ['mp4', 'mp4v', 'mpg4'], }, - "video/mp4v-es": { - source: "iana", + 'video/mp4v-es': { + source: 'iana', }, - "video/mpeg": { - source: "iana", + 'video/mpeg': { + source: 'iana', compressible: false, - extensions: ["mpeg", "mpg", "mpe", "m1v", "m2v"], + extensions: ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'], }, - "video/mpeg4-generic": { - source: "iana", + 'video/mpeg4-generic': { + source: 'iana', }, - "video/mpv": { - source: "iana", + 'video/mpv': { + source: 'iana', }, - "video/nv": { - source: "iana", + 'video/nv': { + source: 'iana', }, - "video/ogg": { - source: "iana", + 'video/ogg': { + source: 'iana', compressible: false, - extensions: ["ogv"], + extensions: ['ogv'], }, - "video/parityfec": { - source: "iana", + 'video/parityfec': { + source: 'iana', }, - "video/pointer": { - source: "iana", + 'video/pointer': { + source: 'iana', }, - "video/quicktime": { - source: "iana", + 'video/quicktime': { + source: 'iana', compressible: false, - extensions: ["qt", "mov"], + extensions: ['qt', 'mov'], }, - "video/raptorfec": { - source: "iana", + 'video/raptorfec': { + source: 'iana', }, - "video/raw": { - source: "iana", + 'video/raw': { + source: 'iana', }, - "video/rtp-enc-aescm128": { - source: "iana", + 'video/rtp-enc-aescm128': { + source: 'iana', }, - "video/rtploopback": { - source: "iana", + 'video/rtploopback': { + source: 'iana', }, - "video/rtx": { - source: "iana", + 'video/rtx': { + source: 'iana', }, - "video/scip": { - source: "iana", + 'video/scip': { + source: 'iana', }, - "video/smpte291": { - source: "iana", + 'video/smpte291': { + source: 'iana', }, - "video/smpte292m": { - source: "iana", + 'video/smpte292m': { + source: 'iana', }, - "video/ulpfec": { - source: "iana", + 'video/ulpfec': { + source: 'iana', }, - "video/vc1": { - source: "iana", + 'video/vc1': { + source: 'iana', }, - "video/vc2": { - source: "iana", + 'video/vc2': { + source: 'iana', }, - "video/vnd.cctv": { - source: "iana", + 'video/vnd.cctv': { + source: 'iana', }, - "video/vnd.dece.hd": { - source: "iana", - extensions: ["uvh", "uvvh"], + 'video/vnd.dece.hd': { + source: 'iana', + extensions: ['uvh', 'uvvh'], }, - "video/vnd.dece.mobile": { - source: "iana", - extensions: ["uvm", "uvvm"], + 'video/vnd.dece.mobile': { + source: 'iana', + extensions: ['uvm', 'uvvm'], }, - "video/vnd.dece.mp4": { - source: "iana", + 'video/vnd.dece.mp4': { + source: 'iana', }, - "video/vnd.dece.pd": { - source: "iana", - extensions: ["uvp", "uvvp"], + 'video/vnd.dece.pd': { + source: 'iana', + extensions: ['uvp', 'uvvp'], }, - "video/vnd.dece.sd": { - source: "iana", - extensions: ["uvs", "uvvs"], + 'video/vnd.dece.sd': { + source: 'iana', + extensions: ['uvs', 'uvvs'], }, - "video/vnd.dece.video": { - source: "iana", - extensions: ["uvv", "uvvv"], + 'video/vnd.dece.video': { + source: 'iana', + extensions: ['uvv', 'uvvv'], }, - "video/vnd.directv.mpeg": { - source: "iana", + 'video/vnd.directv.mpeg': { + source: 'iana', }, - "video/vnd.directv.mpeg-tts": { - source: "iana", + 'video/vnd.directv.mpeg-tts': { + source: 'iana', }, - "video/vnd.dlna.mpeg-tts": { - source: "iana", + 'video/vnd.dlna.mpeg-tts': { + source: 'iana', }, - "video/vnd.dvb.file": { - source: "iana", - extensions: ["dvb"], + 'video/vnd.dvb.file': { + source: 'iana', + extensions: ['dvb'], }, - "video/vnd.fvt": { - source: "iana", - extensions: ["fvt"], + 'video/vnd.fvt': { + source: 'iana', + extensions: ['fvt'], }, - "video/vnd.hns.video": { - source: "iana", + 'video/vnd.hns.video': { + source: 'iana', }, - "video/vnd.iptvforum.1dparityfec-1010": { - source: "iana", + 'video/vnd.iptvforum.1dparityfec-1010': { + source: 'iana', }, - "video/vnd.iptvforum.1dparityfec-2005": { - source: "iana", + 'video/vnd.iptvforum.1dparityfec-2005': { + source: 'iana', }, - "video/vnd.iptvforum.2dparityfec-1010": { - source: "iana", + 'video/vnd.iptvforum.2dparityfec-1010': { + source: 'iana', }, - "video/vnd.iptvforum.2dparityfec-2005": { - source: "iana", + 'video/vnd.iptvforum.2dparityfec-2005': { + source: 'iana', }, - "video/vnd.iptvforum.ttsavc": { - source: "iana", + 'video/vnd.iptvforum.ttsavc': { + source: 'iana', }, - "video/vnd.iptvforum.ttsmpeg2": { - source: "iana", + 'video/vnd.iptvforum.ttsmpeg2': { + source: 'iana', }, - "video/vnd.motorola.video": { - source: "iana", + 'video/vnd.motorola.video': { + source: 'iana', }, - "video/vnd.motorola.videop": { - source: "iana", + 'video/vnd.motorola.videop': { + source: 'iana', }, - "video/vnd.mpegurl": { - source: "iana", - extensions: ["mxu", "m4u"], + 'video/vnd.mpegurl': { + source: 'iana', + extensions: ['mxu', 'm4u'], }, - "video/vnd.ms-playready.media.pyv": { - source: "iana", - extensions: ["pyv"], + 'video/vnd.ms-playready.media.pyv': { + source: 'iana', + extensions: ['pyv'], }, - "video/vnd.nokia.interleaved-multimedia": { - source: "iana", + 'video/vnd.nokia.interleaved-multimedia': { + source: 'iana', }, - "video/vnd.nokia.mp4vr": { - source: "iana", + 'video/vnd.nokia.mp4vr': { + source: 'iana', }, - "video/vnd.nokia.videovoip": { - source: "iana", + 'video/vnd.nokia.videovoip': { + source: 'iana', }, - "video/vnd.objectvideo": { - source: "iana", + 'video/vnd.objectvideo': { + source: 'iana', }, - "video/vnd.radgamettools.bink": { - source: "iana", + 'video/vnd.radgamettools.bink': { + source: 'iana', }, - "video/vnd.radgamettools.smacker": { - source: "apache", + 'video/vnd.radgamettools.smacker': { + source: 'apache', }, - "video/vnd.sealed.mpeg1": { - source: "iana", + 'video/vnd.sealed.mpeg1': { + source: 'iana', }, - "video/vnd.sealed.mpeg4": { - source: "iana", + 'video/vnd.sealed.mpeg4': { + source: 'iana', }, - "video/vnd.sealed.swf": { - source: "iana", + 'video/vnd.sealed.swf': { + source: 'iana', }, - "video/vnd.sealedmedia.softseal.mov": { - source: "iana", + 'video/vnd.sealedmedia.softseal.mov': { + source: 'iana', }, - "video/vnd.uvvu.mp4": { - source: "iana", - extensions: ["uvu", "uvvu"], + 'video/vnd.uvvu.mp4': { + source: 'iana', + extensions: ['uvu', 'uvvu'], }, - "video/vnd.vivo": { - source: "iana", - extensions: ["viv"], + 'video/vnd.vivo': { + source: 'iana', + extensions: ['viv'], }, - "video/vnd.youtube.yt": { - source: "iana", + 'video/vnd.youtube.yt': { + source: 'iana', }, - "video/vp8": { - source: "iana", + 'video/vp8': { + source: 'iana', }, - "video/vp9": { - source: "iana", + 'video/vp9': { + source: 'iana', }, - "video/webm": { - source: "apache", + 'video/webm': { + source: 'apache', compressible: false, - extensions: ["webm"], + extensions: ['webm'], }, - "video/x-f4v": { - source: "apache", - extensions: ["f4v"], + 'video/x-f4v': { + source: 'apache', + extensions: ['f4v'], }, - "video/x-fli": { - source: "apache", - extensions: ["fli"], + 'video/x-fli': { + source: 'apache', + extensions: ['fli'], }, - "video/x-flv": { - source: "apache", + 'video/x-flv': { + source: 'apache', compressible: false, - extensions: ["flv"], + extensions: ['flv'], }, - "video/x-m4v": { - source: "apache", - extensions: ["m4v"], + 'video/x-m4v': { + source: 'apache', + extensions: ['m4v'], }, - "video/x-matroska": { - source: "apache", + 'video/x-matroska': { + source: 'apache', compressible: false, - extensions: ["mkv", "mk3d", "mks"], + extensions: ['mkv', 'mk3d', 'mks'], }, - "video/x-mng": { - source: "apache", - extensions: ["mng"], + 'video/x-mng': { + source: 'apache', + extensions: ['mng'], }, - "video/x-ms-asf": { - source: "apache", - extensions: ["asf", "asx"], + 'video/x-ms-asf': { + source: 'apache', + extensions: ['asf', 'asx'], }, - "video/x-ms-vob": { - source: "apache", - extensions: ["vob"], + 'video/x-ms-vob': { + source: 'apache', + extensions: ['vob'], }, - "video/x-ms-wm": { - source: "apache", - extensions: ["wm"], + 'video/x-ms-wm': { + source: 'apache', + extensions: ['wm'], }, - "video/x-ms-wmv": { - source: "apache", + 'video/x-ms-wmv': { + source: 'apache', compressible: false, - extensions: ["wmv"], + extensions: ['wmv'], }, - "video/x-ms-wmx": { - source: "apache", - extensions: ["wmx"], + 'video/x-ms-wmx': { + source: 'apache', + extensions: ['wmx'], }, - "video/x-ms-wvx": { - source: "apache", - extensions: ["wvx"], + 'video/x-ms-wvx': { + source: 'apache', + extensions: ['wvx'], }, - "video/x-msvideo": { - source: "apache", - extensions: ["avi"], + 'video/x-msvideo': { + source: 'apache', + extensions: ['avi'], }, - "video/x-sgi-movie": { - source: "apache", - extensions: ["movie"], + 'video/x-sgi-movie': { + source: 'apache', + extensions: ['movie'], }, - "video/x-smv": { - source: "apache", - extensions: ["smv"], + 'video/x-smv': { + source: 'apache', + extensions: ['smv'], }, - "x-conference/x-cooltalk": { - source: "apache", - extensions: ["ice"], + 'x-conference/x-cooltalk': { + source: 'apache', + extensions: ['ice'], }, - "x-shader/x-fragment": { + 'x-shader/x-fragment': { compressible: true, }, - "x-shader/x-vertex": { + 'x-shader/x-vertex': { compressible: true, }, }; diff --git a/lib/storage/drivers/index.ts b/lib/storage/drivers/index.ts index 39fa2e3..d2422b3 100644 --- a/lib/storage/drivers/index.ts +++ b/lib/storage/drivers/index.ts @@ -1,4 +1,4 @@ -import { Local } from "./local"; -import { S3Storage } from "./s3Storage"; +import { Local } from './local'; +import { S3Storage } from './s3Storage'; export { Local, S3Storage }; diff --git a/lib/storage/drivers/local.ts b/lib/storage/drivers/local.ts index 3810291..fe8442e 100644 --- a/lib/storage/drivers/local.ts +++ b/lib/storage/drivers/local.ts @@ -1,20 +1,23 @@ -import { extname, join } from "path"; -import * as fs from "fs-extra"; +import { ReadStream, createReadStream } from 'fs'; +import { extname, join } from 'path'; +import * as fs from 'fs-extra'; +import { CannotParseAsJsonException } from '../exceptions/cannotParseAsJson'; +import { CannotPerformFileOpException } from '../exceptions/cannotPerformFileOp'; +import { getMimeTypeFromExtention } from '../helpers'; import { LocalDiskOptions, StorageDriver, StorageDriver$FileMetadataResponse, StorageDriver$PutFileResponse, StorageDriver$RenameFileResponse, -} from "../interfaces"; -import { ReadStream, createReadStream } from "fs"; -import { getMimeTypeFromExtention } from "../helpers"; -import { CannotParseAsJsonException } from "../exceptions/cannotParseAsJson"; -import { StorageService } from "../service"; -import { CannotPerformFileOpException } from "../exceptions/cannotPerformFileOp"; +} from '../interfaces'; +import { StorageService } from '../service'; export class Local implements StorageDriver { - constructor(private disk: string, private config: LocalDiskOptions) {} + constructor( + private disk: string, + private config: LocalDiskOptions, + ) {} /** * Put file content to the path specified. @@ -24,13 +27,13 @@ export class Local implements StorageDriver { */ async put( filePath: string, - fileContent: any + fileContent: any, ): Promise { await fs.outputFile( - join(this.config.basePath || "", filePath), - fileContent + join(this.config.basePath || '', filePath), + fileContent, ); - return { path: join(this.config.basePath || "", filePath), url: "" }; + return { path: join(this.config.basePath || '', filePath), url: '' }; } /** @@ -39,7 +42,7 @@ export class Local implements StorageDriver { * @param path */ async get(filePath: string): Promise { - return await fs.readFile(join(this.config.basePath || "", filePath)); + return await fs.readFile(join(this.config.basePath || '', filePath)); } /** @@ -47,7 +50,7 @@ export class Local implements StorageDriver { * @param path */ async meta(filePath: string): Promise { - const path = join(this.config.basePath || "", filePath); + const path = join(this.config.basePath || '', filePath); const res = await fs.stat(path); return { path, @@ -63,10 +66,10 @@ export class Local implements StorageDriver { async signedUrl( filePath: string, expire = 10, - command: "get" | "put" + command: 'get' | 'put', ): Promise { console.log(expire, filePath, command); - return ""; + return ''; } /** @@ -75,7 +78,7 @@ export class Local implements StorageDriver { * @param path */ async exists(filePath: string): Promise { - return fs.pathExists(join(this.config.basePath || "", filePath)); + return fs.pathExists(join(this.config.basePath || '', filePath)); } /** @@ -93,11 +96,11 @@ export class Local implements StorageDriver { * @param path */ async url(fileName: string): Promise { - if (this.config.hasOwnProperty("baseUrl")) { - const filePath = join("public", fileName); + if (this.config.hasOwnProperty('baseUrl')) { + const filePath = join('public', fileName); return `${this.config.basePath}/${filePath}`; } else { - return ""; + return ''; } } @@ -108,20 +111,19 @@ export class Local implements StorageDriver { */ async delete(filePath: string): Promise { try { - await fs.remove(join(this.config.basePath || "", filePath)); + await fs.remove(join(this.config.basePath || '', filePath)); return true; } catch (e) { if (this.shouldThrowError()) throw new CannotPerformFileOpException( - `File ${filePath} cannot be deleted due to the reason: ${e["message"]}` + `File ${filePath} cannot be deleted due to the reason: ${e['message']}`, ); } return false; } getStream(filePath: string): ReadStream { - const file = createReadStream(join(this.config.basePath || "", filePath)); - return file; + return createReadStream(join(this.config.basePath || '', filePath)); } /** @@ -132,15 +134,15 @@ export class Local implements StorageDriver { */ async copy( sourcePath: string, - destinationPath: string + destinationPath: string, ): Promise { await fs.copy( - join(this.config.basePath || "", sourcePath), - join(this.config.basePath || "", destinationPath), - { overwrite: true } + join(this.config.basePath || '', sourcePath), + join(this.config.basePath || '', destinationPath), + { overwrite: true }, ); return { - path: join(this.config.basePath || "", destinationPath), + path: join(this.config.basePath || '', destinationPath), url: await this.url(destinationPath), }; } @@ -153,12 +155,12 @@ export class Local implements StorageDriver { */ async move( sourcePath: string, - destinationPath: string + destinationPath: string, ): Promise { await this.copy(sourcePath, destinationPath); await this.delete(sourcePath); return { - path: join(this.config.basePath || "", destinationPath), + path: join(this.config.basePath || '', destinationPath), url: await this.url(destinationPath), }; } @@ -180,7 +182,7 @@ export class Local implements StorageDriver { async copyToDisk( sourcePath: string, destinationDisk: string, - destinationPath: string + destinationPath: string, ): Promise { try { const buffer = await this.get(sourcePath); @@ -190,7 +192,7 @@ export class Local implements StorageDriver { } catch (e) { if (this.shouldThrowError()) { throw new CannotPerformFileOpException( - `File cannot be copied from ${sourcePath} to ${destinationDisk} in ${destinationDisk} disk for the reason: ${e["message"]}` + `File cannot be copied from ${sourcePath} to ${destinationDisk} in ${destinationDisk} disk for the reason: ${e['message']}`, ); } } @@ -201,7 +203,7 @@ export class Local implements StorageDriver { async moveToDisk( sourcePath: string, destinationDisk: string, - destinationPath: string + destinationPath: string, ): Promise { try { const buffer = await this.get(sourcePath); @@ -212,10 +214,10 @@ export class Local implements StorageDriver { } catch (e) { if (this.shouldThrowError()) { throw new CannotPerformFileOpException( - `File cannot be moved from ${sourcePath} to ${destinationDisk} in ${destinationDisk} disk for the reason: ${e["message"]}` + `File cannot be moved from ${sourcePath} to ${destinationDisk} in ${destinationDisk} disk for the reason: ${e['message']}`, ); } - console.log("error while copying ===> ", e); + console.log('error while copying ===> ', e); } return false; } @@ -235,20 +237,20 @@ export class Local implements StorageDriver { temporaryUrl( path: string, ttlInMins: number, - params?: Record + params?: Record, ): Promise { console.log(path, ttlInMins, params); return null; } async size(filePath: string): Promise { - const path = join(this.config.basePath || "", filePath); + const path = join(this.config.basePath || '', filePath); const res = await fs.stat(path); return res.size; } async lastModifiedAt(filePath: string): Promise { - const path = join(this.config.basePath || "", filePath); + const path = join(this.config.basePath || '', filePath); const res = await fs.stat(path); return res.mtime; } @@ -258,11 +260,11 @@ export class Local implements StorageDriver { } async path(filePath: string): Promise { - return join(this.config.basePath || "", filePath); + return join(this.config.basePath || '', filePath); } async listDir(path: string): Promise> { - const directory = join(this.config.basePath || "", path); + const directory = join(this.config.basePath || '', path); const fileNames = await fs.readdir(directory); const listOfFiles = []; diff --git a/lib/storage/drivers/s3Storage.ts b/lib/storage/drivers/s3Storage.ts index d0fbe84..7b7f50e 100644 --- a/lib/storage/drivers/s3Storage.ts +++ b/lib/storage/drivers/s3Storage.ts @@ -1,3 +1,10 @@ +import { ReadStream } from 'fs'; +import { GenericFunction } from '../../interfaces'; +import { Package } from '../../utils'; +import { Str } from '../../utils/string'; +import { CannotParseAsJsonException } from '../exceptions/cannotParseAsJson'; +import { CannotPerformFileOpException } from '../exceptions/cannotPerformFileOp'; +import { getMimeFromExtension } from '../helpers'; import { StorageDriver, FileOptions, @@ -5,15 +12,8 @@ import { StorageDriver$PutFileResponse, StorageDriver$RenameFileResponse, S3DiskOptions, -} from "../interfaces"; -import { getMimeFromExtension } from "../helpers"; -import { ReadStream } from "fs"; -import { CannotParseAsJsonException } from "../exceptions/cannotParseAsJson"; -import { StorageService } from "../service"; -import { CannotPerformFileOpException } from "../exceptions/cannotPerformFileOp"; -import { GenericFunction } from "../../interfaces"; -import { Package } from "../../utils"; -import { Str } from "../../utils/string"; +} from '../interfaces'; +import { StorageService } from '../service'; export class S3Storage implements StorageDriver { private readonly disk: string; @@ -25,9 +25,9 @@ export class S3Storage implements StorageDriver { constructor(disk: string, config: S3DiskOptions) { this.disk = disk; this.config = config; - const { getSignedUrl } = Package.load("@aws-sdk/s3-request-presigner"); + const { getSignedUrl } = Package.load('@aws-sdk/s3-request-presigner'); this.getSignedUrlFn = getSignedUrl; - this.AWS = Package.load("@aws-sdk/client-s3"); + this.AWS = Package.load('@aws-sdk/client-s3'); this.client = new this.AWS.S3({ region: this.config.region, credentials: config.credentials || { @@ -38,13 +38,13 @@ export class S3Storage implements StorageDriver { } getStream(filePath: string): ReadStream { - console.log("file path ===> ", filePath); - throw new Error("Method not implemented."); + console.log('file path ===> ', filePath); + throw new Error('Method not implemented.'); } listDir(path: string): Promise> { console.log(path); - throw new Error("Method not implemented."); + throw new Error('Method not implemented.'); } /** @@ -56,7 +56,7 @@ export class S3Storage implements StorageDriver { async put( path: string, fileContent: any, - options?: FileOptions + options?: FileOptions, ): Promise { const { mimeType } = options || {}; const params = { @@ -80,7 +80,7 @@ export class S3Storage implements StorageDriver { async signedUrl( path: string, expireInMinutes = 20, - command: "get" | "put" = "get" + command: 'get' | 'put' = 'get', ): Promise { const commandMap = { get: this.AWS.GetObjectCommand, @@ -91,11 +91,9 @@ export class S3Storage implements StorageDriver { Bucket: this.config.bucket, Key: this.getPath(path), }); - const signedUrl = await this.getSignedUrlFn(this.client, commandObj, { + return await this.getSignedUrlFn(this.client, commandObj, { expiresIn: 60 * expireInMinutes, }); - - return signedUrl; } /** @@ -165,8 +163,8 @@ export class S3Storage implements StorageDriver { * @param path */ async url(path: string): Promise { - const signedUrl = await this.signedUrl(path, 20, "get"); - return Str.before(signedUrl, "?"); + const signedUrl = await this.signedUrl(path, 20, 'get'); + return Str.before(signedUrl, '?'); } /** @@ -176,7 +174,7 @@ export class S3Storage implements StorageDriver { */ async delete(filePath: string): Promise { const params = { - Bucket: this.config.bucket || "", + Bucket: this.config.bucket || '', Key: this.getPath(filePath), }; @@ -186,7 +184,7 @@ export class S3Storage implements StorageDriver { } catch (err) { if (this.shouldThrowError()) { throw new CannotPerformFileOpException( - `File ${filePath} cannot be deleted due to the reason: ${err["message"]}` + `File ${filePath} cannot be deleted due to the reason: ${err['message']}`, ); } return false; @@ -201,11 +199,11 @@ export class S3Storage implements StorageDriver { */ async copy( sourcePath: string, - destinationPath: string + destinationPath: string, ): Promise { const copyCommand = new this.AWS.CopyObjectCommand({ - Bucket: this.config.bucket || "", - CopySource: "/" + this.config.bucket + "/" + this.getPath(sourcePath), + Bucket: this.config.bucket || '', + CopySource: '/' + this.config.bucket + '/' + this.getPath(sourcePath), Key: destinationPath, }); @@ -221,7 +219,7 @@ export class S3Storage implements StorageDriver { */ async move( path: string, - newPath: string + newPath: string, ): Promise { await this.copy(this.getPath(path), newPath); await this.delete(this.getPath(path)); @@ -231,7 +229,7 @@ export class S3Storage implements StorageDriver { async copyToDisk( sourcePath: string, destinationDisk: string, - destinationPath: string + destinationPath: string, ): Promise { try { const buffer = await this.get(sourcePath); @@ -241,7 +239,7 @@ export class S3Storage implements StorageDriver { } catch (e) { if (this.shouldThrowError()) { throw new CannotPerformFileOpException( - `File cannot be copied from ${sourcePath} to ${destinationDisk} in ${destinationDisk} disk for the reason: ${e["message"]}` + `File cannot be copied from ${sourcePath} to ${destinationDisk} in ${destinationDisk} disk for the reason: ${e['message']}`, ); } } @@ -252,7 +250,7 @@ export class S3Storage implements StorageDriver { async moveToDisk( sourcePath: string, destinationDisk: string, - destinationPath: string + destinationPath: string, ): Promise { try { const buffer = await this.get(sourcePath); @@ -263,7 +261,7 @@ export class S3Storage implements StorageDriver { } catch (e) { if (this.shouldThrowError()) { throw new CannotPerformFileOpException( - `File cannot be moved from ${sourcePath} to ${destinationDisk} in ${destinationDisk} disk for the reason: ${e["message"]}` + `File cannot be moved from ${sourcePath} to ${destinationDisk} in ${destinationDisk} disk for the reason: ${e['message']}`, ); } } @@ -272,7 +270,7 @@ export class S3Storage implements StorageDriver { async getAsJson( path: string, - throwError: boolean = false + throwError = false, ): Promise> { const buffer = await this.get(path); try { @@ -288,10 +286,10 @@ export class S3Storage implements StorageDriver { temporaryUrl( path: string, ttlInMins: number, - params?: Record + params?: Record, ): Promise { console.log(path, ttlInMins, params); - throw new Error("Method not implemented."); + throw new Error('Method not implemented.'); } async size(path: string): Promise { diff --git a/lib/storage/helpers/extensions.ts b/lib/storage/helpers/extensions.ts index 5037509..1145828 100644 --- a/lib/storage/helpers/extensions.ts +++ b/lib/storage/helpers/extensions.ts @@ -1,7 +1,7 @@ -import { MimeTypes } from "../data/mime-db"; +import { MimeTypes } from '../data/mime-db'; export const getMimeFromExtension = (fileName: string): string => { - const fileSplit = fileName.split("."); + const fileSplit = fileName.split('.'); const fileExtension = fileSplit[fileSplit.length - 1]; for (const mimeType in MimeTypes) { @@ -11,11 +11,11 @@ export const getMimeFromExtension = (fileName: string): string => { } } - return ""; + return ''; }; export const getMimeTypeFromExtention = (fileName: string): string => { - const fileSplit = fileName.split("."); + const fileSplit = fileName.split('.'); const fileExtension = fileSplit[fileSplit.length - 1]; for (const mimeType in MimeTypes) { diff --git a/lib/storage/helpers/index.ts b/lib/storage/helpers/index.ts index e121e50..4509f5c 100644 --- a/lib/storage/helpers/index.ts +++ b/lib/storage/helpers/index.ts @@ -1 +1 @@ -export * from "./extensions"; +export * from './extensions'; diff --git a/lib/storage/index.ts b/lib/storage/index.ts index 624c960..86323e0 100644 --- a/lib/storage/index.ts +++ b/lib/storage/index.ts @@ -1,3 +1,3 @@ -export * from "./storage"; -export * from "./drivers"; -export * from "./interfaces"; +export * from './storage'; +export * from './drivers'; +export * from './interfaces'; diff --git a/lib/storage/interfaces/index.ts b/lib/storage/interfaces/index.ts index 3489e6f..2b7b4a5 100644 --- a/lib/storage/interfaces/index.ts +++ b/lib/storage/interfaces/index.ts @@ -1,6 +1,6 @@ -export * from "./storageDriver"; -export * from "./storageOptions"; -export * from "./fileOptions"; +export * from './storageDriver'; +export * from './storageOptions'; +export * from './fileOptions'; export interface StorageDriver$FileMetadataResponse { path?: string; diff --git a/lib/storage/interfaces/storageDriver.ts b/lib/storage/interfaces/storageDriver.ts index 53b454d..a4bbf4c 100644 --- a/lib/storage/interfaces/storageDriver.ts +++ b/lib/storage/interfaces/storageDriver.ts @@ -4,7 +4,7 @@ import { StorageDriver$PutFileResponse, StorageDriver$RenameFileResponse, FileOptions, -} from "."; +} from '.'; export interface StorageDriver { /** @@ -16,7 +16,7 @@ export interface StorageDriver { put( path: string, fileContent: any, - options?: FileOptions + options?: FileOptions, ): Promise; /** @@ -55,7 +55,7 @@ export interface StorageDriver { signedUrl( path: string, expireInMinutes: number, - command?: "get" | "put" + command?: 'get' | 'put', ): Promise; /** @@ -79,7 +79,7 @@ export interface StorageDriver { */ copy( path: string, - newPath: string + newPath: string, ): Promise; /** @@ -90,7 +90,7 @@ export interface StorageDriver { */ move( path: string, - newPath: string + newPath: string, ): Promise; listDir(path: string): Promise>; @@ -105,7 +105,7 @@ export interface StorageDriver { copyToDisk( sourcePath: string, destinationDisk: string, - destinationPath: string + destinationPath: string, ): Promise; /** @@ -118,7 +118,7 @@ export interface StorageDriver { moveToDisk( sourcePath: string, destinationDisk: string, - destinationPath: string + destinationPath: string, ): Promise; /** @@ -139,7 +139,7 @@ export interface StorageDriver { temporaryUrl( path: string, ttlInMins: number, - params?: Record + params?: Record, ): Promise; size(path: string): Promise; diff --git a/lib/storage/interfaces/storageOptions.ts b/lib/storage/interfaces/storageOptions.ts index e01bcd9..b174804 100644 --- a/lib/storage/interfaces/storageOptions.ts +++ b/lib/storage/interfaces/storageOptions.ts @@ -1,7 +1,7 @@ -export type StorageDiskType = "s3" | "local"; +export type StorageDiskType = 's3' | 'local'; export interface DiskOptions { - driver: "s3" | "local"; + driver: 's3' | 'local'; profile?: string; region?: string; bucket?: string; @@ -13,7 +13,7 @@ export interface DiskOptions { } export interface S3DiskOptions { - driver: "s3"; + driver: 's3'; region: string; bucket: string; credentials?: any; @@ -24,7 +24,7 @@ export interface S3DiskOptions { } export interface LocalDiskOptions { - driver: "local"; + driver: 'local'; basePath?: string; throwOnFailure?: boolean; } diff --git a/lib/storage/service.ts b/lib/storage/service.ts index 353a451..3ba34a0 100644 --- a/lib/storage/service.ts +++ b/lib/storage/service.ts @@ -1,11 +1,10 @@ -import { Injectable, Type } from "@nestjs/common"; -import { LocalDiskOptions, S3DiskOptions, StorageOptions } from "./interfaces"; -import { StorageDriver } from "./interfaces"; -import { IntentConfig } from "../config/service"; -import { Local, S3Storage } from "./drivers"; -import { InternalLogger } from "../utils/logger"; -import { DiskNotFoundException } from "./exceptions/diskNotFound"; -import { logTime } from "../utils/helpers"; +import { Injectable, Type } from '@nestjs/common'; +import { IntentConfig } from '../config/service'; +import { logTime } from '../utils/helpers'; +import { InternalLogger } from '../utils/logger'; +import { Local, S3Storage } from './drivers'; +import { DiskNotFoundException } from './exceptions/diskNotFound'; +import { LocalDiskOptions, S3DiskOptions, StorageOptions , StorageDriver } from './interfaces'; @Injectable() export class StorageService { @@ -18,7 +17,7 @@ export class StorageService { private static options: StorageOptions; constructor(private config: IntentConfig) { - StorageService.options = this.config.get("filesystem"); + StorageService.options = this.config.get('filesystem'); const disksConfig = StorageService.options.disks; StorageService.disks = {}; for (const diskName in StorageService.options.disks) { @@ -27,18 +26,18 @@ export class StorageService { const driver = StorageService.driverMap[diskConfig.driver]; if (!driver) { InternalLogger.error( - "StorageService", - `We couldn't find any disk driver associated with the [${diskName}].` + 'StorageService', + `We couldn't find any disk driver associated with the [${diskName}].`, ); continue; } StorageService.disks[diskName] = new driver(diskName, diskConfig); InternalLogger.success( - "StorageService", + 'StorageService', `Disk [${diskName}] successfully initiailized ${logTime( - Date.now() - time - )}` + Date.now() - time, + )}`, ); } } @@ -46,7 +45,7 @@ export class StorageService { static buildDriver(config: S3DiskOptions | LocalDiskOptions): StorageDriver { const driver = StorageService.driverMap[config.driver]; if (!driver) throw new DiskNotFoundException(config); - return new driver("", config); + return new driver('', config); } static getDriver(disk?: string): StorageDriver { diff --git a/lib/storage/storage.ts b/lib/storage/storage.ts index 1f25bfd..2b69a94 100644 --- a/lib/storage/storage.ts +++ b/lib/storage/storage.ts @@ -1,7 +1,7 @@ -import axios from "axios"; -import { LocalDiskOptions, S3DiskOptions, StorageDriver } from "./interfaces"; -import { StorageService } from "./service"; -import { Injectable } from "@nestjs/common"; +import { Injectable } from '@nestjs/common'; +import axios from 'axios'; +import { LocalDiskOptions, S3DiskOptions, StorageDriver } from './interfaces'; +import { StorageService } from './service'; @Injectable() export class Storage { @@ -14,7 +14,7 @@ export class Storage { } static async download(url: string): Promise { - const res = await axios.get(url, { responseType: "arraybuffer" }); + const res = await axios.get(url, { responseType: 'arraybuffer' }); return Buffer.from(res.data); } } diff --git a/lib/transformers/interfaces.ts b/lib/transformers/interfaces.ts index a5eb491..bf6c16e 100644 --- a/lib/transformers/interfaces.ts +++ b/lib/transformers/interfaces.ts @@ -1,4 +1,4 @@ -import { Request } from "../rest"; +import { Request } from '../rest'; export interface TransformableContextOptions { req?: Request; diff --git a/lib/transformers/transformable.ts b/lib/transformers/transformable.ts index 6860a2f..3c1d565 100644 --- a/lib/transformers/transformable.ts +++ b/lib/transformers/transformable.ts @@ -1,6 +1,6 @@ -import { Obj } from "../utils"; -import { TransformableContextOptions, TransformerContext } from "./interfaces"; -import { Transformer } from "./transformer"; +import { Obj } from '../utils'; +import { TransformableContextOptions, TransformerContext } from './interfaces'; +import { Transformer } from './transformer'; export class Transformable { /** @@ -13,7 +13,7 @@ export class Transformable { async item( obj: Record, transformer: Transformer, - options?: TransformableContextOptions + options?: TransformableContextOptions, ): Promise> { transformer = this.setTransformerContext(transformer, options); @@ -30,7 +30,7 @@ export class Transformable { async collection( collect: Array>, transformer: Transformer, - options?: TransformableContextOptions + options?: TransformableContextOptions, ): Promise>> { transformer = this.setTransformerContext(transformer, options); @@ -50,7 +50,7 @@ export class Transformable { async paginate( obj: Record, transformer: Transformer, - options?: TransformableContextOptions + options?: TransformableContextOptions, ): Promise> { const collection = this.collection(obj.data, transformer, options); return { data: await collection, pagination: obj.pagination }; @@ -58,7 +58,7 @@ export class Transformable { private setTransformerContext( transformer: Transformer, - options: TransformableContextOptions + options: TransformableContextOptions, ): Transformer { // add request object to the transformer's context const ctx = new TransformerContext(options); @@ -67,7 +67,7 @@ export class Transformable { } getIncludes(req: any) { - if (!req) return ""; - return Obj.get(req.all(), "include", ""); + if (!req) return ''; + return Obj.get(req.all(), 'include', ''); } } diff --git a/lib/transformers/transformer.ts b/lib/transformers/transformer.ts index fbd4e82..54fff78 100644 --- a/lib/transformers/transformer.ts +++ b/lib/transformers/transformer.ts @@ -1,6 +1,6 @@ -import { Transformer$IncludeMethodOptions } from "../interfaces"; -import { ExpParser } from "../utils/expParser"; -import { TransformerContext } from "./interfaces"; +import { Transformer$IncludeMethodOptions } from '../interfaces'; +import { ExpParser } from '../utils/expParser'; +import { TransformerContext } from './interfaces'; export abstract class Transformer { public availableIncludes = []; @@ -26,7 +26,7 @@ export abstract class Transformer { async item( obj: Record, transformer: Transformer, - options?: Transformer$IncludeMethodOptions + options?: Transformer$IncludeMethodOptions, ): Promise | null> { if (!obj) return null; transformer = this.applyOptions(transformer, options); @@ -44,7 +44,7 @@ export abstract class Transformer { async collection( arr: Array | string>, transformer: Transformer, - options?: Transformer$IncludeMethodOptions + options?: Transformer$IncludeMethodOptions, ): Promise> { if (!arr || arr.length === 0) return []; transformer = this.applyOptions(transformer, options); @@ -58,18 +58,18 @@ export abstract class Transformer { applyOptions( transformer: Transformer, - options?: Transformer$IncludeMethodOptions + options?: Transformer$IncludeMethodOptions, ): Transformer { options = options || {}; transformer.setContext( - new TransformerContext({ include: options.include?.join(",") }) + new TransformerContext({ include: options.include?.join(',') }), ); return transformer; } parseIncludes(): this { this.includes = ExpParser.from( - this.ctx?.getPayload()?.include || "" + this.ctx?.getPayload()?.include || '', ).toObj(); for (const include of this.defaultIncludes) { if (!(include in this.includes)) { @@ -81,7 +81,7 @@ export abstract class Transformer { } async work( - data: any + data: any, ): Promise | Array>> { if (!data) return null; this.parseIncludes(); @@ -91,14 +91,14 @@ export abstract class Transformer { } const handlerName = (name: string) => - "include" + name.charAt(0).toUpperCase() + name.slice(1); + 'include' + name.charAt(0).toUpperCase() + name.slice(1); for (const include in this.includes) { const handler = handlerName(include); const nestedIncludes = this.includes[include]; if (this[handler]) { result[include] = await this[handler](data, { - include: nestedIncludes || "", + include: nestedIncludes || '', }); } } diff --git a/lib/utils/array.ts b/lib/utils/array.ts index 0f0ae25..605ada9 100644 --- a/lib/utils/array.ts +++ b/lib/utils/array.ts @@ -1,10 +1,10 @@ -import { InvalidValue } from "../exceptions"; -import { Obj } from "./object"; +import { InvalidValue } from '../exceptions'; +import { Obj } from './object'; export class Arr { static toObj( nestedArray: Array, - keyIndexMap: string[] + keyIndexMap: string[], ): Record[] { Arr.isArray(nestedArray, true); @@ -29,7 +29,7 @@ export class Arr { if (Array.isArray(value)) return true; if (throwError) { - throw new InvalidValue("Passed value is not an object"); + throw new InvalidValue('Passed value is not an object'); } return false; @@ -74,16 +74,16 @@ export class Arr { static pick(arr: T[], props: Array): T[] { const newArr = []; for (const prop of props) { - const propArr = prop.split("."); - let startIndex = propArr[0] === "*" ? 0 : +propArr[0]; - const endIndex = propArr[0] === "*" ? arr.length - 1 : +propArr[0]; + const propArr = prop.split('.'); + let startIndex = propArr[0] === '*' ? 0 : +propArr[0]; + const endIndex = propArr[0] === '*' ? arr.length - 1 : +propArr[0]; while (startIndex <= endIndex) { - const newPropsArr = [propArr.slice(1).join(".")]; + const newPropsArr = [propArr.slice(1).join('.')]; if (Obj.isObj(arr[startIndex])) { newArr[startIndex] = Obj.pick( arr[startIndex], - newPropsArr[0] === "" ? [] : newPropsArr + newPropsArr[0] === '' ? [] : newPropsArr, ); } @@ -100,9 +100,9 @@ export class Arr { static except(arr: T[], props: Array): T[] { let newArr = [...arr]; for (const prop of props) { - const propArr = prop.split("."); - let startIndex = propArr[0] === "*" ? 0 : +propArr[0]; - const endIndex = propArr[0] === "*" ? arr.length - 1 : +propArr[0]; + const propArr = prop.split('.'); + let startIndex = propArr[0] === '*' ? 0 : +propArr[0]; + const endIndex = propArr[0] === '*' ? arr.length - 1 : +propArr[0]; while (startIndex <= endIndex) { if (!propArr[1]) { @@ -111,7 +111,7 @@ export class Arr { continue; } - const newPropsArr = [propArr.slice(1).join(".")]; + const newPropsArr = [propArr.slice(1).join('.')]; if (Obj.isObj(arr[startIndex])) { newArr[startIndex] = Obj.except(arr[startIndex], newPropsArr); } @@ -119,7 +119,7 @@ export class Arr { if (Array.isArray(arr[startIndex])) { newArr[startIndex] = Arr.except( arr[startIndex] as T[], - newPropsArr + newPropsArr, ) as T; } @@ -132,15 +132,15 @@ export class Arr { static get(arr: T[], key: string | number): T { if (key in arr) return arr[key]; key = key as string; - const splitKeys = key.split("."); + const splitKeys = key.split('.'); if (!splitKeys.length) return; if (Arr.isArray(arr[splitKeys[0]])) { - return Arr.get(arr[splitKeys[0]], splitKeys.slice(1).join(".")); + return Arr.get(arr[splitKeys[0]], splitKeys.slice(1).join('.')); } if (Obj.isObj(arr[splitKeys[0]])) { - return Obj.get(arr[splitKeys[0]], splitKeys.slice(1).join(".")); + return Obj.get(arr[splitKeys[0]], splitKeys.slice(1).join('.')); } return undefined; diff --git a/lib/utils/columnify.ts b/lib/utils/columnify.ts index 21e3d92..bde5e26 100644 --- a/lib/utils/columnify.ts +++ b/lib/utils/columnify.ts @@ -1,18 +1,18 @@ -import { Str } from "./string"; +import { Str } from './string'; export const columnify = ( rows: Record[], - options?: Record + options?: Record, ) => { - const formattedRows: string[][] = rows.map((row) => Object.values(row)); + const formattedRows: string[][] = rows.map(row => Object.values(row)); const maxColumns = findMaxColumns(formattedRows); for (let i = 0; i < maxColumns; i++) { const colValues = findAllColumnsAtIndex(formattedRows, i); const maxLength = findMaxLength(colValues); for (const row of formattedRows) { - row[i] = Str.padRight(row[i], maxLength, " "); + row[i] = Str.padRight(row[i], maxLength, ' '); if (options?.padStart) { - row[i] = Str.padLeft("", options.padStart, " ").concat(row[i]); + row[i] = Str.padLeft('', options.padStart, ' ').concat(row[i]); } } } diff --git a/lib/utils/context.ts b/lib/utils/context.ts index 3b613bc..906e554 100644 --- a/lib/utils/context.ts +++ b/lib/utils/context.ts @@ -1,4 +1,4 @@ -import { Request } from "../rest"; +import { Request } from '../rest'; export class Context { req: Request; diff --git a/lib/utils/expParser.ts b/lib/utils/expParser.ts index 9784b44..6694e3f 100644 --- a/lib/utils/expParser.ts +++ b/lib/utils/expParser.ts @@ -22,27 +22,27 @@ export class ExpParser { const lastChar = this.exp.charCodeAt(i - 1); const ch = this.exp.charCodeAt(i); if (ch === 91) { - o["name"] = p.join(""); - o["args"] = []; + o['name'] = p.join(''); + o['args'] = []; p = []; inArray = true; } else if (inArray && ch === 44) { - o["args"].push(p.join("")); + o['args'].push(p.join('')); p = []; } else if (ch === 93) { - o["args"].push(p.join("")); + o['args'].push(p.join('')); presenter.push(o); o = {}; p = []; inArray = false; } else if (lastChar !== 93 && ch === 44) { - o["name"] = p.join(""); + o['name'] = p.join(''); presenter.push(o); o = {}; p = []; } else if (ch !== 93 && length - i == 1) { p.push(String.fromCharCode(ch)); - o["name"] = p.join(""); + o['name'] = p.join(''); presenter.push(o); } else if (ch !== 44) { p.push(String.fromCharCode(ch)); @@ -59,18 +59,18 @@ export class ExpParser { static buildFromObj(inputs: Record): string { for (const key in inputs) { const type = typeof inputs[key]; - if (type === "string" || type === "number") { + if (type === 'string' || type === 'number') { inputs[key] = [inputs[key]]; } } const keys = Object.keys(inputs).sort(); - let str = ""; + let str = ''; for (const key of keys) { str += `,${key}`; if (Array.isArray(inputs[key]) && inputs[key].length > 0) { const values = inputs[key].sort(); - str += `[${values.join(",")}]`; + str += `[${values.join(',')}]`; } } diff --git a/lib/utils/helpers.ts b/lib/utils/helpers.ts index 56e5881..f274cd7 100644 --- a/lib/utils/helpers.ts +++ b/lib/utils/helpers.ts @@ -1,16 +1,16 @@ -import { Arr } from "./array"; -import { Obj } from "./object"; -import { Str } from "./string"; -import { InternalLogger } from "./logger"; -import { validateSync, ValidationError } from "class-validator"; -import { GenericClass } from "../interfaces"; -import { plainToInstance } from "class-transformer"; -import { Type } from "@nestjs/common"; -import * as pc from "picocolors"; +import { Type } from '@nestjs/common'; +import { plainToInstance } from 'class-transformer'; +import { validateSync, ValidationError } from 'class-validator'; +import * as pc from 'picocolors'; +import { GenericClass } from '../interfaces'; +import { Arr } from './array'; +import { InternalLogger } from './logger'; +import { Obj } from './object'; +import { Str } from './string'; export const isEmpty = (value: any) => { if (Str.isString(value)) { - return value === ""; + return value === ''; } if (Arr.isArray(value)) { @@ -29,17 +29,17 @@ export const isEmpty = (value: any) => { }; export const isBoolean = (value: any): boolean => { - return typeof value === "boolean"; + return typeof value === 'boolean'; }; export const toBoolean = (value: any) => { - if (!Str.isString(value) || typeof value !== "boolean") return undefined; + if (!Str.isString(value) || typeof value !== 'boolean') return undefined; const val = String(value); - return [true, "yes", "on", "1", 1, "true"].includes(val?.toLowerCase()); + return [true, 'yes', 'on', '1', 1, 'true'].includes(val?.toLowerCase()); }; export const joinUrl = (url: string, appendString: string): string => { - return url.endsWith("/") ? `${url}${appendString}` : `${url}/${appendString}`; + return url.endsWith('/') ? `${url}${appendString}` : `${url}/${appendString}`; }; export const logTime = (time: number): string => { @@ -47,23 +47,23 @@ export const logTime = (time: number): string => { }; export const getTimestampForLog = (): string => { - const timestamp = new Intl.DateTimeFormat("en-US", { - year: "numeric", - month: "numeric", - day: "numeric", - hour: "numeric", - minute: "numeric", - second: "numeric", + const timestamp = new Intl.DateTimeFormat('en-US', { + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', hour12: true, }).format(new Date()); - return pc.bgGreen(pc.black(" " + timestamp + " ")); + return pc.bgGreen(pc.black(' ' + timestamp + ' ')); }; export const validateOptions = ( payload: Record, schema: Type, - meta: Record = {} + meta: Record = {}, ): void => { const dto = plainToInstance(schema, payload); const errors = validateSync(dto); @@ -87,14 +87,14 @@ export const validateOptions = ( for (const key in bag) { errorStatement.push( `${pc.bold(pc.yellow(key))} ${pc.dim( - pc.white("[" + bag[key].join(", ") + "]") - )}` + pc.white('[' + bag[key].join(', ') + ']'), + )}`, ); } InternalLogger.error( meta.cls, - `The config is missing some required options - ${errorStatement.join(", ")}` + `The config is missing some required options - ${errorStatement.join(', ')}`, ); }; @@ -104,8 +104,8 @@ const parseError = (error: ValidationError) => { children.push(parseError(child)); } - const messages = Object.values(error.constraints || {}).map((m) => - Str.replace(m, error.property, Str.title(error.property)) + const messages = Object.values(error.constraints || {}).map(m => + Str.replace(m, error.property, Str.title(error.property)), ); const errors = {}; diff --git a/lib/utils/index.ts b/lib/utils/index.ts index 696e75d..725cece 100644 --- a/lib/utils/index.ts +++ b/lib/utils/index.ts @@ -1,8 +1,8 @@ -export * from "./context"; -export * from "./expParser"; -export * from "./packageLoader"; -export * from "./object"; -export * from "./string"; -export * from "./array"; -export * from "./helpers"; -export * from "./number"; +export * from './context'; +export * from './expParser'; +export * from './packageLoader'; +export * from './object'; +export * from './string'; +export * from './array'; +export * from './helpers'; +export * from './number'; diff --git a/lib/utils/logger.ts b/lib/utils/logger.ts index fcab41d..f396880 100644 --- a/lib/utils/logger.ts +++ b/lib/utils/logger.ts @@ -1,40 +1,40 @@ -import * as pc from "picocolors"; -import { Str } from "./string"; +import * as pc from 'picocolors'; +import { Str } from './string'; export class InternalLogger { - static moduleName = "Intent"; + static moduleName = 'Intent'; static info(cls: string, msg: string): void { - const logLevel = this.successColor("LOG"); + const logLevel = this.successColor('LOG'); const formattedCls = this.warn(this.formatClass(cls)); msg = this.successColor(msg); console.log( - `${this.getPrintableTag("")}${Str.ws( - 5 - )}${logLevel} ${formattedCls} ${msg}` + `${this.getPrintableTag('')}${Str.ws( + 5, + )}${logLevel} ${formattedCls} ${msg}`, ); } static success(cls: string, msg: string): void { - const logLevel = this.successColor("LOG"); + const logLevel = this.successColor('LOG'); const formattedCls = this.warn(this.formatClass(cls)); msg = this.successColor(msg); console.log( - `${this.getPrintableTag("")}${Str.ws( - 5 - )}${logLevel} ${formattedCls} ${msg}` + `${this.getPrintableTag('')}${Str.ws( + 5, + )}${logLevel} ${formattedCls} ${msg}`, ); } static error(cls: string, msg: string): void { - const logLevel = this.danger("ERROR"); + const logLevel = this.danger('ERROR'); const formattedCls = this.warn(this.formatClass(cls)); msg = this.danger(msg); console.log( - `${this.getPrintableTag("danger")}${Str.ws( - 5 - )}${logLevel} ${formattedCls} ${msg}` + `${this.getPrintableTag('danger')}${Str.ws( + 5, + )}${logLevel} ${formattedCls} ${msg}`, ); } @@ -57,15 +57,15 @@ export class InternalLogger { static getPrintableTag(type?: string): string { const pid = process.pid; const statement = `[Intent] ${pid} - `; - const colorFn = type === "danger" ? pc.red : pc.yellow; + const colorFn = type === 'danger' ? pc.red : pc.yellow; const module = pc.isColorSupported ? colorFn(statement) : statement; - const timestamp = new Intl.DateTimeFormat("en-US", { - year: "numeric", - month: "numeric", - day: "numeric", - hour: "numeric", - minute: "numeric", - second: "numeric", + const timestamp = new Intl.DateTimeFormat('en-US', { + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', hour12: true, }).format(new Date()); diff --git a/lib/utils/number.ts b/lib/utils/number.ts index 16c956b..9b2fc7b 100644 --- a/lib/utils/number.ts +++ b/lib/utils/number.ts @@ -1,4 +1,4 @@ -import { IntentConfig } from "../config/service"; +import { IntentConfig } from '../config/service'; interface NumOptions { precision?: number; @@ -12,9 +12,9 @@ export class Num { } static abbreviate(num: number, options?: NumOptions): string { - const locale = options?.locale ?? IntentConfig.get("app.locale"); + const locale = options?.locale ?? IntentConfig.get('app.locale'); return Intl.NumberFormat(locale, { - notation: "compact", + notation: 'compact', maximumFractionDigits: options?.precision ?? 1, }).format(num); } @@ -24,10 +24,10 @@ export class Num { } static currency(num: number, options?: NumOptions): string { - const locale = options?.locale ?? IntentConfig.get("app.locale"); - const currency = options?.currency ?? IntentConfig.get("app.currency"); + const locale = options?.locale ?? IntentConfig.get('app.locale'); + const currency = options?.currency ?? IntentConfig.get('app.currency'); return Intl.NumberFormat(locale, { - style: "currency", + style: 'currency', currency: currency, }).format(num); } @@ -35,34 +35,34 @@ export class Num { // return type - static fileSize(num: number, options?: NumOptions): string { return new Intl.NumberFormat([], { - style: "unit", - unit: "byte", - notation: "compact", - unitDisplay: "narrow", + style: 'unit', + unit: 'byte', + notation: 'compact', + unitDisplay: 'narrow', maximumFractionDigits: options?.precision ?? 1, }).format(num); } static forHumans(num: number, options?: NumOptions): string { - const locale = options?.locale ?? IntentConfig.get("app.locale"); + const locale = options?.locale ?? IntentConfig.get('app.locale'); return Intl.NumberFormat(locale, { - notation: "compact", - compactDisplay: "long", + notation: 'compact', + compactDisplay: 'long', maximumFractionDigits: options?.precision ?? 1, }).format(num); } static format(num: number, options?: NumOptions): string { - const locale = options?.locale ?? IntentConfig.get("app.locale"); + const locale = options?.locale ?? IntentConfig.get('app.locale'); return Intl.NumberFormat(locale, { maximumFractionDigits: options?.precision ?? 1, }).format(num); } static percentage(num: number, options?: NumOptions): string { - const locale = options?.locale ?? IntentConfig.get("app.locale"); + const locale = options?.locale ?? IntentConfig.get('app.locale'); return Intl.NumberFormat(locale, { - style: "percent", + style: 'percent', minimumFractionDigits: options?.precision ?? 1, maximumFractionDigits: options?.precision ?? 1, }).format(num / 100); @@ -84,72 +84,72 @@ export class Num { static spell(num: number | string): string { const numWords = [ - "", - "one ", - "two ", - "three ", - "four ", - "five ", - "six ", - "seven ", - "eight ", - "nine ", - "ten ", - "eleven ", - "twelve ", - "thirteen ", - "fourteen ", - "fifteen ", - "sixteen ", - "seventeen ", - "eighteen ", - "nineteen ", + '', + 'one ', + 'two ', + 'three ', + 'four ', + 'five ', + 'six ', + 'seven ', + 'eight ', + 'nine ', + 'ten ', + 'eleven ', + 'twelve ', + 'thirteen ', + 'fourteen ', + 'fifteen ', + 'sixteen ', + 'seventeen ', + 'eighteen ', + 'nineteen ', ]; const tens = [ - "", - "", - "twenty", - "thirty", - "forty", - "fifty", - "sixty", - "seventy", - "eighty", - "ninety", + '', + '', + 'twenty', + 'thirty', + 'forty', + 'fifty', + 'sixty', + 'seventy', + 'eighty', + 'ninety', ]; - if ((num = num.toString()).length > 9) return "overflow"; - const n = ("000000000" + num) + if ((num = num.toString()).length > 9) return 'overflow'; + const n = ('000000000' + num) .slice(-9) .match(/^(\d{2})(\d{2})(\d{2})(\d{1})(\d{2})$/); if (!n) return; - let str = ""; + let str = ''; str += Number(n[1]) != 0 - ? (numWords[Number(n[1])] || tens[n[1][0]] + " " + numWords[n[1][1]]) + - "crore " - : ""; + ? (numWords[Number(n[1])] || tens[n[1][0]] + ' ' + numWords[n[1][1]]) + + 'crore ' + : ''; str += Number(n[2]) != 0 - ? (numWords[Number(n[2])] || tens[n[2][0]] + " " + numWords[n[2][1]]) + - "lakh " - : ""; + ? (numWords[Number(n[2])] || tens[n[2][0]] + ' ' + numWords[n[2][1]]) + + 'lakh ' + : ''; str += Number(n[3]) != 0 - ? (numWords[Number(n[3])] || tens[n[3][0]] + " " + numWords[n[3][1]]) + - "thousand " - : ""; + ? (numWords[Number(n[3])] || tens[n[3][0]] + ' ' + numWords[n[3][1]]) + + 'thousand ' + : ''; str += Number(n[4]) != 0 - ? (numWords[Number(n[4])] || tens[n[4][0]] + " " + numWords[n[4][1]]) + - "hundred " - : ""; + ? (numWords[Number(n[4])] || tens[n[4][0]] + ' ' + numWords[n[4][1]]) + + 'hundred ' + : ''; str += Number(n[5]) != 0 - ? (str != "" ? "and " : "") + - (numWords[Number(n[5])] || tens[n[5][0]] + " " + numWords[n[5][1]]) + - "only" - : ""; + ? (str != '' ? 'and ' : '') + + (numWords[Number(n[5])] || tens[n[5][0]] + ' ' + numWords[n[5][1]]) + + 'only' + : ''; return str; } diff --git a/lib/utils/object.ts b/lib/utils/object.ts index 5ab8cdb..0fc25f0 100644 --- a/lib/utils/object.ts +++ b/lib/utils/object.ts @@ -1,5 +1,5 @@ -import { InvalidValue } from "../exceptions"; -import { Arr } from "./array"; +import { InvalidValue } from '../exceptions'; +import { Arr } from './array'; export class Obj { static dot(obj: Record): Record { @@ -37,7 +37,7 @@ export class Obj { for (const key in obj) { if (Obj.isObj(obj[key])) { trimmedObj[key] = Obj.trim(obj[key]); - } else if (typeof obj[key] === "string") { + } else if (typeof obj[key] === 'string') { trimmedObj[key] = obj[key].trim(); } else { trimmedObj[key] = obj[key]; @@ -55,14 +55,14 @@ export class Obj { continue; } - const propArr = prop.split("."); + const propArr = prop.split('.'); if (Array.isArray(obj[propArr[0]])) { newObj[propArr[0]] = Arr.pick(obj[propArr[0]], [ - propArr.slice(1).join("."), + propArr.slice(1).join('.'), ]); } else if (Obj.isObj(obj[propArr[0]])) { newObj[propArr[0]] = Obj.pick(obj[propArr[0]], [ - propArr.slice(1).join("."), + propArr.slice(1).join('.'), ]); } } @@ -78,14 +78,14 @@ export class Obj { continue; } - const propArr = prop.split("."); + const propArr = prop.split('.'); if (Array.isArray(cloneObj[propArr[0]])) { cloneObj[propArr[0]] = Arr.except(cloneObj[propArr[0]], [ - propArr.slice(1).join("."), + propArr.slice(1).join('.'), ]); } else if (Obj.isObj(cloneObj[propArr[0]])) { cloneObj[propArr[0]] = Obj.except(cloneObj[propArr[0]], [ - propArr.slice(1).join("."), + propArr.slice(1).join('.'), ]); } } @@ -95,7 +95,7 @@ export class Obj { static isEmpty(obj: Record): boolean { Obj.isObj(obj); - return !!!Object.keys(obj).length; + return !Object.keys(obj).length; } static isNotEmpty(obj: Record): boolean { @@ -110,15 +110,15 @@ export class Obj { const keys = [key, ...aliasKeys]; for (const key of keys) { if (key in obj) return obj[key]; - const splitKeys = key.split("."); + const splitKeys = key.split('.'); if (!splitKeys.length) return; if (Arr.isArray(obj[splitKeys[0]])) { - return Arr.get(obj[splitKeys[0]], splitKeys.slice(1).join(".")); + return Arr.get(obj[splitKeys[0]], splitKeys.slice(1).join('.')); } if (Obj.isObj(obj[splitKeys[0]])) { - return Obj.get(obj[splitKeys[0]], splitKeys.slice(1).join(".")); + return Obj.get(obj[splitKeys[0]], splitKeys.slice(1).join('.')); } } return undefined; @@ -152,7 +152,7 @@ export class Obj { console.log(sortedObj); const jsonString = JSON.stringify(sortedObj); console.log(jsonString); - return ""; + return ''; } static asMap>(obj: T): Map { @@ -164,12 +164,12 @@ export class Obj { } static isObj(obj: any, throwError = false): boolean { - if (typeof obj === "object" && !Array.isArray(obj) && obj !== null) { + if (typeof obj === 'object' && !Array.isArray(obj) && obj !== null) { return true; } if (throwError) { - throw new InvalidValue("Passed value is not an object"); + throw new InvalidValue('Passed value is not an object'); } return false; diff --git a/lib/utils/packageLoader.ts b/lib/utils/packageLoader.ts index a72e8de..22212a1 100644 --- a/lib/utils/packageLoader.ts +++ b/lib/utils/packageLoader.ts @@ -1,5 +1,5 @@ -import { InternalLogger } from "./logger"; -import * as pc from "picocolors"; +import * as pc from 'picocolors'; +import { InternalLogger } from './logger'; export class Package { static load(pkgName: string): any { @@ -7,10 +7,10 @@ export class Package { return require(pkgName); } catch (e) { InternalLogger.error( - "PackageLoader", + 'PackageLoader', `${pc.underline( - pkgName - )} is missing. Please make sure that you have installed the package first` + pkgName, + )} is missing. Please make sure that you have installed the package first`, ); process.exit(); // process.exitCode = 1; diff --git a/lib/utils/pluralise.ts b/lib/utils/pluralise.ts index 63cd18f..ce7b76e 100644 --- a/lib/utils/pluralise.ts +++ b/lib/utils/pluralise.ts @@ -1,4 +1,4 @@ -import { Str } from "./string"; +import { Str } from './string'; function revertCase(word: string, token: string) { if (Str.equals(word, token)) return token; @@ -15,107 +15,107 @@ function revertCase(word: string, token: string) { } const irregularPulurals = { - I: "we", - me: "us", - he: "they", - she: "they", - them: "them", - myself: "ourselves", - yourself: "yourselves", - itself: "themselves", - herself: "themselves", - himself: "themselves", - themself: "themselves", - is: "are", - was: "were", - has: "have", - this: "these", - that: "those", - my: "our", - its: "their", - his: "their", - her: "their", - echo: "echoes", - dingo: "dingoes", - volcano: "volcanoes", - tornado: "tornadoes", - torpedo: "torpedoes", - genus: "genera", - viscus: "viscera", - stigma: "stigmata", - stoma: "stomata", - dogma: "dogmata", - lemma: "lemmata", - schema: "schemata", - anathema: "anathemata", - ox: "oxen", - axe: "axes", - die: "dice", - yes: "yeses", - foot: "feet", - eave: "eaves", - goose: "geese", - tooth: "teeth", - quiz: "quizzes", - human: "humans", - proof: "proofs", - carve: "carves", - valve: "valves", - looey: "looies", - thief: "thieves", - groove: "grooves", - pickaxe: "pickaxes", - passerby: "passersby", - canvas: "canvases", + I: 'we', + me: 'us', + he: 'they', + she: 'they', + them: 'them', + myself: 'ourselves', + yourself: 'yourselves', + itself: 'themselves', + herself: 'themselves', + himself: 'themselves', + themself: 'themselves', + is: 'are', + was: 'were', + has: 'have', + this: 'these', + that: 'those', + my: 'our', + its: 'their', + his: 'their', + her: 'their', + echo: 'echoes', + dingo: 'dingoes', + volcano: 'volcanoes', + tornado: 'tornadoes', + torpedo: 'torpedoes', + genus: 'genera', + viscus: 'viscera', + stigma: 'stigmata', + stoma: 'stomata', + dogma: 'dogmata', + lemma: 'lemmata', + schema: 'schemata', + anathema: 'anathemata', + ox: 'oxen', + axe: 'axes', + die: 'dice', + yes: 'yeses', + foot: 'feet', + eave: 'eaves', + goose: 'geese', + tooth: 'teeth', + quiz: 'quizzes', + human: 'humans', + proof: 'proofs', + carve: 'carves', + valve: 'valves', + looey: 'looies', + thief: 'thieves', + groove: 'grooves', + pickaxe: 'pickaxes', + passerby: 'passersby', + canvas: 'canvases', }; const irregularSingulars = { - we: "I", - us: "me", - they: "he", - them: "them", - ourselves: "myself", - yourselves: "yourself", - themselves: "themself", - are: "is", - were: "was", - have: "has", - these: "this", - those: "that", - our: "my", - their: "his", - echoes: "echo", - dingoes: "dingo", - volcanoes: "volcano", - tornadoes: "tornado", - torpedoes: "torpedo", - genera: "genus", - viscera: "viscus", - stigmata: "stigma", - stomata: "stoma", - dogmata: "dogma", - lemmata: "lemma", - schemata: "schema", - anathemata: "anathema", - oxen: "ox", - axes: "axe", - dice: "die", - yeses: "yes", - feet: "foot", - eaves: "eave", - geese: "goose", - teeth: "tooth", - quizzes: "quiz", - humans: "human", - proofs: "proof", - carves: "carve", - valves: "valve", - looies: "looey", - thieves: "thief", - grooves: "groove", - pickaxes: "pickaxe", - passersby: "passerby", - canvases: "canvas", + we: 'I', + us: 'me', + they: 'he', + them: 'them', + ourselves: 'myself', + yourselves: 'yourself', + themselves: 'themself', + are: 'is', + were: 'was', + have: 'has', + these: 'this', + those: 'that', + our: 'my', + their: 'his', + echoes: 'echo', + dingoes: 'dingo', + volcanoes: 'volcano', + tornadoes: 'tornado', + torpedoes: 'torpedo', + genera: 'genus', + viscera: 'viscus', + stigmata: 'stigma', + stomata: 'stoma', + dogmata: 'dogma', + lemmata: 'lemma', + schemata: 'schema', + anathemata: 'anathema', + oxen: 'ox', + axes: 'axe', + dice: 'die', + yeses: 'yes', + feet: 'foot', + eaves: 'eave', + geese: 'goose', + teeth: 'tooth', + quizzes: 'quiz', + humans: 'human', + proofs: 'proof', + carves: 'carve', + valves: 'valve', + looies: 'looey', + thieves: 'thief', + grooves: 'groove', + pickaxes: 'pickaxe', + passersby: 'passerby', + canvases: 'canvas', }; const uncountableWords = { @@ -215,102 +215,102 @@ const uncountableWords = { }; const singularRules = [ - [/s$/i, ""], - [/(ss)$/i, "$1"], - [/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i, "$1fe"], - [/(ar|(?:wo|[ae])l|[eo][ao])ves$/i, "$1f"], - [/ies$/i, "y"], - [/(dg|ss|ois|lk|ok|wn|mb|th|ch|ec|oal|is|ck|ix|sser|ts|wb)ies$/i, "$1ie"], + [/s$/i, ''], + [/(ss)$/i, '$1'], + [/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i, '$1fe'], + [/(ar|(?:wo|[ae])l|[eo][ao])ves$/i, '$1f'], + [/ies$/i, 'y'], + [/(dg|ss|ois|lk|ok|wn|mb|th|ch|ec|oal|is|ck|ix|sser|ts|wb)ies$/i, '$1ie'], [ /\b(l|(?:neck|cross|hog|aun)?t|coll|faer|food|gen|goon|group|hipp|junk|vegg|(?:pork)?p|charl|calor|cut)ies$/i, - "$1ie", + '$1ie', ], - [/\b(mon|smil)ies$/i, "$1ey"], - [/\b((?:tit)?m|l)ice$/i, "$1ouse"], - [/(seraph|cherub)im$/i, "$1"], + [/\b(mon|smil)ies$/i, '$1ey'], + [/\b((?:tit)?m|l)ice$/i, '$1ouse'], + [/(seraph|cherub)im$/i, '$1'], [ /(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i, - "$1", + '$1', ], [ /(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i, - "$1sis", + '$1sis', ], - [/(movie|twelve|abuse|e[mn]u)s$/i, "$1"], - [/(test)(?:is|es)$/i, "$1is"], + [/(movie|twelve|abuse|e[mn]u)s$/i, '$1'], + [/(test)(?:is|es)$/i, '$1is'], [ /(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, - "$1us", + '$1us', ], [ /(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i, - "$1um", + '$1um', ], [ /(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i, - "$1on", + '$1on', ], - [/(alumn|alg|vertebr)ae$/i, "$1a"], - [/(cod|mur|sil|vert|ind)ices$/i, "$1ex"], - [/(matr|append)ices$/i, "$1ix"], - [/(pe)(rson|ople)$/i, "$1rson"], - [/(child)ren$/i, "$1"], - [/(eau)x?$/i, "$1"], - [/men$/i, "man"], + [/(alumn|alg|vertebr)ae$/i, '$1a'], + [/(cod|mur|sil|vert|ind)ices$/i, '$1ex'], + [/(matr|append)ices$/i, '$1ix'], + [/(pe)(rson|ople)$/i, '$1rson'], + [/(child)ren$/i, '$1'], + [/(eau)x?$/i, '$1'], + [/men$/i, 'man'], - [/pok[eé]mon$/i, "$0"], - [/[^aeiou]ese$/i, "$0"], - [/deer$/i, "$0"], - [/fish$/i, "$0"], - [/measles$/i, "$0"], - [/o[iu]s$/i, "$0"], - [/pox$/i, "$0"], - [/sheep$/i, "$0"], + [/pok[eé]mon$/i, '$0'], + [/[^aeiou]ese$/i, '$0'], + [/deer$/i, '$0'], + [/fish$/i, '$0'], + [/measles$/i, '$0'], + [/o[iu]s$/i, '$0'], + [/pox$/i, '$0'], + [/sheep$/i, '$0'], ]; const pluralRules = [ - [/s?$/i, "s"], - [/[^\u0000-\u007F]$/i, "$0"], - [/([^aeiou]ese)$/i, "$1"], - [/(ax|test)is$/i, "$1es"], - [/(alias|[^aou]us|t[lm]as|gas|ris)$/i, "$1es"], - [/(e[mn]u)s?$/i, "$1s"], - [/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i, "$1"], + [/s?$/i, 's'], + [/[^\u0000-\u007F]$/i, '$0'], + [/([^aeiou]ese)$/i, '$1'], + [/(ax|test)is$/i, '$1es'], + [/(alias|[^aou]us|t[lm]as|gas|ris)$/i, '$1es'], + [/(e[mn]u)s?$/i, '$1s'], + [/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i, '$1'], [ /(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, - "$1i", + '$1i', ], - [/(alumn|alg|vertebr)(?:a|ae)$/i, "$1ae"], - [/(seraph|cherub)(?:im)?$/i, "$1im"], - [/(her|at|gr)o$/i, "$1oes"], + [/(alumn|alg|vertebr)(?:a|ae)$/i, '$1ae'], + [/(seraph|cherub)(?:im)?$/i, '$1im'], + [/(her|at|gr)o$/i, '$1oes'], [ /(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i, - "$1a", + '$1a', ], [ /(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i, - "$1a", + '$1a', ], - [/sis$/i, "ses"], - [/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i, "$1$2ves"], - [/([^aeiouy]|qu)y$/i, "$1ies"], - [/([^ch][ieo][ln])ey$/i, "$1ies"], - [/(x|ch|ss|sh|zz)$/i, "$1es"], - [/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i, "$1ices"], - [/\b((?:tit)?m|l)(?:ice|ouse)$/i, "$1ice"], - [/(pe)(?:rson|ople)$/i, "$1ople"], - [/(child)(?:ren)?$/i, "$1ren"], - [/eaux$/i, "$0"], - [/m[ae]n$/i, "men"], - ["thou", "you"], - [/pok[eé]mon$/i, "$0"], - [/[^aeiou]ese$/i, "$0"], - [/deer$/i, "$0"], - [/fish$/i, "$0"], - [/measles$/i, "$0"], - [/o[iu]s$/i, "$0"], - [/pox$/i, "$0"], - [/sheep$/i, "$0"], + [/sis$/i, 'ses'], + [/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i, '$1$2ves'], + [/([^aeiouy]|qu)y$/i, '$1ies'], + [/([^ch][ieo][ln])ey$/i, '$1ies'], + [/(x|ch|ss|sh|zz)$/i, '$1es'], + [/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i, '$1ices'], + [/\b((?:tit)?m|l)(?:ice|ouse)$/i, '$1ice'], + [/(pe)(?:rson|ople)$/i, '$1ople'], + [/(child)(?:ren)?$/i, '$1ren'], + [/eaux$/i, '$0'], + [/m[ae]n$/i, 'men'], + ['thou', 'you'], + [/pok[eé]mon$/i, '$0'], + [/[^aeiou]ese$/i, '$0'], + [/deer$/i, '$0'], + [/fish$/i, '$0'], + [/measles$/i, '$0'], + [/o[iu]s$/i, '$0'], + [/pox$/i, '$0'], + [/sheep$/i, '$0'], ]; const sanitizeWord = (token: string, word: string, rules: object[]) => { @@ -330,14 +330,14 @@ const sanitizeWord = (token: string, word: string, rules: object[]) => { const interpolate = (str: string, args) => { return str.replace(/\$(\d{1,2})/g, function (match, index) { - return args[index] || ""; + return args[index] || ''; }); }; const replace = (word: string, rule: object) => { return word.replace(rule[0], function (match, index) { const result = interpolate(rule[1], arguments); - if (match === "") { + if (match === '') { return revertCase(word[index - 1], result); } diff --git a/lib/utils/string.ts b/lib/utils/string.ts index ae5848c..51589b6 100644 --- a/lib/utils/string.ts +++ b/lib/utils/string.ts @@ -1,13 +1,13 @@ -import { ConflictException } from "@nestjs/common"; -import { Num } from "./number"; -import { pluralize, singularize } from "./pluralise"; +import { ConflictException } from '@nestjs/common'; +import { Num } from './number'; +import { pluralize, singularize } from './pluralise'; export class Str { static wordsArr = (str: string, stripAllSpecialChars?: boolean): string[] => { if (Str.len(str) == 0) return []; // escape (strip) unicodes const words = []; - let word = ""; + let word = ''; const isLegalChar = (charCode: number) => Num.inRange(charCode, [48, 57]) || @@ -17,12 +17,12 @@ export class Str { for (const char of str) { if ( - ["_", "-", " ", "/", "\\"].includes(char) || + ['_', '-', ' ', '/', '\\'].includes(char) || (stripAllSpecialChars && !isLegalChar(char.charCodeAt(0))) || Str.isUpperCase(char) ) { if (Str.len(word)) words.push(word); - word = ""; + word = ''; if (Str.isUpperCase(char)) word += char; } else { word += char; @@ -30,7 +30,7 @@ export class Str { } Str.len(word) && words.push(word); - return words.map((key) => Str.lower(key)); + return words.map(key => Str.lower(key)); }; static words = (string: string, stripAllSpecialChars?: boolean): string[] => { @@ -38,7 +38,7 @@ export class Str { }; static alphaNumOnly = (str: string): string => { - let newStr = ""; + let newStr = ''; let i = 0; const isLegalChar = (charCode: number) => Num.inRange(charCode, [48, 57]) || @@ -47,7 +47,7 @@ export class Str { charCode == 32; while (i < str.length) { - newStr += isLegalChar(str.charCodeAt(i)) ? str.charAt(i) : " "; + newStr += isLegalChar(str.charCodeAt(i)) ? str.charAt(i) : ' '; i++; } @@ -55,32 +55,32 @@ export class Str { }; static kebab = (str: string): string => { - return Str.wordsArr(str, true).join("-"); + return Str.wordsArr(str, true).join('-'); }; static snake = (str: string): string => { - return Str.wordsArr(str, true).join("_"); + return Str.wordsArr(str, true).join('_'); }; static pascal = (str: string): string => { - return Str.wordsArr(str).map(Str.ucfirst).join(""); + return Str.wordsArr(str).map(Str.ucfirst).join(''); }; static camel = (str: string): string => { - return Str.lcfirst(Str.wordsArr(str).map(Str.ucfirst).join("")); + return Str.lcfirst(Str.wordsArr(str).map(Str.ucfirst).join('')); }; static headline = (str: string, stripAllSpecialChars?: boolean): string => { - return Str.wordsArr(str, stripAllSpecialChars).map(Str.ucfirst).join(" "); + return Str.wordsArr(str, stripAllSpecialChars).map(Str.ucfirst).join(' '); }; static slug = (str: string): string => { const words = Str.wordsArr(str, true); - return Str.lower(words.join("-")); + return Str.lower(words.join('-')); }; static charAt = (str: string, idx: number) => { - return str?.[idx] ?? ""; + return str?.[idx] ?? ''; }; static isLowerCase = (str: string): boolean => { @@ -102,7 +102,7 @@ export class Str { }; static isString = (str: any): boolean => { - return typeof str == "string"; + return typeof str == 'string'; }; static after = (text: string, subStr: string): string => { @@ -118,7 +118,7 @@ export class Str { static before = ( text: string, subStr: string, - defaultValue?: string + defaultValue?: string, ): string => { if (Str.len(subStr) < 1) return text; const index = text.indexOf(subStr); @@ -136,7 +136,7 @@ export class Str { static between = ( text: string, startingSubStr: string, - endingSubStr: string + endingSubStr: string, ): string => { let startIdx = 0; let endIdx = Str.len(text); @@ -164,7 +164,7 @@ export class Str { static isEmail = (email: string): boolean => { return ( Str.lower(email)?.match( - /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, ) != null ); }; @@ -180,13 +180,13 @@ export class Str { static isUrl = (url: string): boolean => { const pattern = new RegExp( - "^(https?:\\/\\/)?" + // protocol - "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name - "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address - "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path - "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string - "(\\#[-a-z\\d_]*)?$", - "i" + '^(https?:\\/\\/)?' + // protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name + '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path + '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string + '(\\#[-a-z\\d_]*)?$', + 'i', ); // fragment locator return !!pattern.test(url); }; @@ -198,10 +198,10 @@ export class Str { static lcfirst = (str: string): string => { if (Str.isNotString(str)) { - throw new ConflictException("Not a string"); + throw new ConflictException('Not a string'); } - return (Str.lower(str?.[0]) ?? "") + (str?.slice(1) ?? ""); + return (Str.lower(str?.[0]) ?? '') + (str?.slice(1) ?? ''); }; static isNotString = (value: any): boolean => { @@ -218,7 +218,7 @@ export class Str { static limit = (str: string, limit: number, suffix?: string): string => { return ( - str?.slice(0, limit) + (Str.len(str) >= limit ? suffix ?? "..." : "") + str?.slice(0, limit) + (Str.len(str) >= limit ? (suffix ?? '...') : '') ); }; @@ -240,41 +240,41 @@ export class Str { static title = (text: string): string => { const words = Str.words(text); - return words.map(Str.ucfirst).join(" "); + return words.map(Str.ucfirst).join(' '); }; static replace( str: string, findStr: string | RegExp, replaceStr: string, - caseInsensitive?: boolean + caseInsensitive?: boolean, ): string { - const regexFlags = ["g"]; - caseInsensitive && regexFlags.push("i"); - const pattern = new RegExp(findStr, regexFlags.join("")); + const regexFlags = ['g']; + caseInsensitive && regexFlags.push('i'); + const pattern = new RegExp(findStr, regexFlags.join('')); return str.replace(pattern, replaceStr); } static replaceArray( str: string, identifier: string, - values: Array + values: Array, ): string { - const words = str.split(" "); + const words = str.split(' '); const newWordsArr = []; let i = 0; for (const word of words) { - if (word === "") newWordsArr.push(" "); + if (word === '') newWordsArr.push(' '); else if (word === identifier) newWordsArr.push(values[i++]); else newWordsArr.push(word); } - return newWordsArr.join(" "); + return newWordsArr.join(' '); } static replaceFirst( str: string, pattern: string, - replacement: string + replacement: string, ): string { return str.replace(pattern, replacement); } @@ -282,7 +282,7 @@ export class Str { static replaceLast( str: string, pattern: string, - replacement: string + replacement: string, ): string { const lastIndex = str.lastIndexOf(pattern); if (lastIndex === -1) return str; @@ -311,11 +311,11 @@ export class Str { } static remove(str: string, remove: string): string { - return str.split(remove).join(""); + return str.split(remove).join(''); } static repeat(repeat: string, times: number): string { - let newStr = ""; + let newStr = ''; let i = 1; while (i <= times) { newStr += repeat; @@ -326,7 +326,7 @@ export class Str { } static reverse(str: string): string { - let newStr = ""; + let newStr = ''; for (let i = str.length - 1; i >= 0; i--) { newStr += str.charAt(i); } @@ -343,7 +343,7 @@ export class Str { static take(str: string, length: number): string { let i = 0, - newStr = ""; + newStr = ''; while (i < length) { newStr += str.charAt(i); i++; @@ -353,23 +353,23 @@ export class Str { } static toBase64(str: string): string { - return Buffer.from(str).toString("base64"); + return Buffer.from(str).toString('base64'); } static toBase64Url(str: string): string { - return Buffer.from(str).toString("base64url"); + return Buffer.from(str).toString('base64url'); } static fromBase64(str: string): string { - return Buffer.from(str, "base64").toString(); + return Buffer.from(str, 'base64').toString(); } static ucsplit(str: string): string[] { const newStr = []; - let substr = ""; + let substr = ''; for (let i = 0; i < str.length; i++) { if (Num.inRange(str.charCodeAt(i), [65, 90])) { - if (substr != "") { + if (substr != '') { newStr.push(substr); } substr = str.charAt(i); @@ -383,17 +383,17 @@ export class Str { // buggy static squish(str: string): string { - let newStr = ""; - let nextChar = ""; + let newStr = ''; + let nextChar = ''; for (let i = 0; i < str.length; i++) { const char = str.charAt(i); nextChar = str.charAt(i + 1); - if (char !== " ") { + if (char !== ' ') { newStr += char; } - if (char != " " && nextChar == " " && i !== str.length - 1) { - newStr += " "; + if (char != ' ' && nextChar == ' ' && i !== str.length - 1) { + newStr += ' '; } } @@ -414,20 +414,20 @@ export class Str { static is(str: string, pattern: string): boolean { if (str === pattern) return true; - let regex = "^"; + let regex = '^'; for (const p of pattern) { - regex += p === "*" ? ".*" : p; + regex += p === '*' ? '.*' : p; } - const regexp = new RegExp(regex + "$", "g"); + const regexp = new RegExp(regex + '$', 'g'); return regexp.test(str); } static ws(len: number): string { - return Array(len).fill(" ").join(""); + return Array(len).fill(' ').join(''); } static equals(str1: string, str2: string): boolean { - return typeof str1 === "string" && str1 === str2; + return typeof str1 === 'string' && str1 === str2; } static isSentenceCase = (value: string): boolean => { diff --git a/lib/validator/decorators/exists.ts b/lib/validator/decorators/exists.ts index de69226..7b12ae8 100644 --- a/lib/validator/decorators/exists.ts +++ b/lib/validator/decorators/exists.ts @@ -1,13 +1,13 @@ +import { Injectable } from '@nestjs/common'; import { registerDecorator, ValidationOptions, ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface, -} from "class-validator"; -import { Injectable } from "@nestjs/common"; -import { ObjectionService } from "../../database"; -import { isEmpty } from "../../utils/helpers"; +} from 'class-validator'; +import { ObjectionService } from '../../database'; +import { isEmpty } from '../../utils/helpers'; @Injectable() @ValidatorConstraint({ async: true }) @@ -16,7 +16,7 @@ export class ExistsConstraint implements ValidatorConstraintInterface { public async validate( value: string | string[], - args: ValidationArguments + args: ValidationArguments, ): Promise { if (!value && isEmpty(value)) return false; const [{ table, column, dbCon }] = args.constraints; @@ -51,7 +51,7 @@ export function Exists( column: string; dbCon?: string; }, - validationOptions?: ValidationOptions + validationOptions?: ValidationOptions, ) { return function (object: Record, propertyName: string): void { registerDecorator({ diff --git a/lib/validator/decorators/isUnique.ts b/lib/validator/decorators/isUnique.ts index 0625d0d..54763e3 100644 --- a/lib/validator/decorators/isUnique.ts +++ b/lib/validator/decorators/isUnique.ts @@ -1,13 +1,13 @@ +import { Injectable } from '@nestjs/common'; import { registerDecorator, ValidationOptions, ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface, -} from "class-validator"; -import { Injectable } from "@nestjs/common"; -import { ObjectionService } from "../../database"; -import { isEmpty } from "../../utils/helpers"; +} from 'class-validator'; +import { ObjectionService } from '../../database'; +import { isEmpty } from '../../utils/helpers'; @Injectable() @ValidatorConstraint({ async: true }) @@ -16,7 +16,7 @@ export class IsUniqueConstraint implements ValidatorConstraintInterface { public async validate( value: string | string[], - args: ValidationArguments + args: ValidationArguments, ): Promise { if (isEmpty(value)) return false; const [{ table, column, dbCon }] = args.constraints; @@ -31,15 +31,15 @@ export class IsUniqueConstraint implements ValidatorConstraintInterface { * Apply self unique check, useful in case of update queries */ const { object } = args; - const id = object["id"]; + const id = object['id']; - if (id) query.whereNot("id", id); + if (id) query.whereNot('id', id); - const result = await query.count({ count: "*" }); + const result = await query.count({ count: '*' }); const record = result[0] || {}; - const count = +record["count"]; + const count = +record['count']; - return Array.isArray(value) ? !!!(value.length === count) : !!!count; + return Array.isArray(value) ? !(value.length === count) : !count; } defaultMessage(args: ValidationArguments) { @@ -54,7 +54,7 @@ export function IsUnique( column: string; dbCon?: string; }, - validationOptions?: ValidationOptions + validationOptions?: ValidationOptions, ) { return function (object: Record, propertyName: string): void { registerDecorator({ diff --git a/lib/validator/decorators/isValueFromConfig.ts b/lib/validator/decorators/isValueFromConfig.ts index 69be8b2..dfdbbac 100644 --- a/lib/validator/decorators/isValueFromConfig.ts +++ b/lib/validator/decorators/isValueFromConfig.ts @@ -1,15 +1,15 @@ +import { Injectable } from '@nestjs/common'; import { registerDecorator, ValidationOptions, ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface, -} from "class-validator"; -import { Injectable } from "@nestjs/common"; -import { IntentConfig } from "../../config/service"; -import { isEmpty } from "../../utils/helpers"; -import { Arr } from "../../utils/array"; -import { Obj } from "../../utils"; +} from 'class-validator'; +import { IntentConfig } from '../../config/service'; +import { Obj } from '../../utils'; +import { Arr } from '../../utils/array'; +import { isEmpty } from '../../utils/helpers'; @Injectable() @ValidatorConstraint({ async: false }) @@ -37,7 +37,7 @@ export class IsValueFromConfigConstraint const [options] = args.constraints; const validValues = this.getValues(options.key); return `${args.property} should have either of ${validValues.join( - ", " + ', ', )} as value`; } @@ -53,7 +53,7 @@ export class IsValueFromConfigConstraint export function IsValueFromConfig( options: Record, - validationOptions?: ValidationOptions + validationOptions?: ValidationOptions, ) { return function (object: Record, propertyName: string): void { registerDecorator({ diff --git a/lib/validator/decorators/valueIn.ts b/lib/validator/decorators/valueIn.ts index b43ab17..5fd0625 100644 --- a/lib/validator/decorators/valueIn.ts +++ b/lib/validator/decorators/valueIn.ts @@ -15,7 +15,7 @@ class ValueInConstraint implements ValidatorConstraintInterface { } if (value instanceof Array) { - const difference = value.filter((x) => validValues.indexOf(x) === -1); + const difference = value.filter(x => validValues.indexOf(x) === -1); return !difference.length; } diff --git a/lib/validator/index.ts b/lib/validator/index.ts index 8efaaff..3c269a0 100644 --- a/lib/validator/index.ts +++ b/lib/validator/index.ts @@ -4,28 +4,28 @@ import { UseGuards, applyDecorators, createParamDecorator, -} from "@nestjs/common"; -import { IntentValidationGuard } from "./validationGuard"; -import { Request } from "../rest/request"; +} from '@nestjs/common'; +import { Request } from '../rest/request'; +import { IntentValidationGuard } from './validationGuard'; -export * from "./validator"; -export * from "./decorators"; +export * from './validator'; +export * from './decorators'; export function Validate(DTO: any) { return applyDecorators( - SetMetadata("dtoSchema", DTO), - UseGuards(IntentValidationGuard) + SetMetadata('dtoSchema', DTO), + UseGuards(IntentValidationGuard), ); } export const Dto = createParamDecorator( (data: string, ctx: ExecutionContext) => { - const contextType = ctx["contextType"]; - if (contextType === "ws") { + const contextType = ctx['contextType']; + if (contextType === 'ws') { return ctx.switchToWs().getClient()._dto; } const request = ctx.switchToHttp().getRequest(); const intentRequest = request.intent.req() as Request; return intentRequest.dto(); - } + }, ); diff --git a/lib/validator/validationGuard.ts b/lib/validator/validationGuard.ts index b87682d..3cce378 100644 --- a/lib/validator/validationGuard.ts +++ b/lib/validator/validationGuard.ts @@ -1,6 +1,6 @@ -import { CanActivate, ExecutionContext, Injectable } from "@nestjs/common"; -import { Reflector } from "@nestjs/core"; -import { Request } from "../rest"; +import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { Request } from '../rest'; @Injectable() export class IntentValidationGuard implements CanActivate { @@ -8,8 +8,8 @@ export class IntentValidationGuard implements CanActivate { async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest() as Request; - const iRequest = request["intent"].req(); - const schema = this.reflector.get("dtoSchema", context.getHandler()); + const iRequest = request['intent'].req(); + const schema = this.reflector.get('dtoSchema', context.getHandler()); iRequest.addDto(await iRequest.validate(schema)); return true; } diff --git a/lib/validator/validator.ts b/lib/validator/validator.ts index 1e1ba3e..ed6d400 100644 --- a/lib/validator/validator.ts +++ b/lib/validator/validator.ts @@ -1,9 +1,9 @@ -import { Type } from "@nestjs/common"; -import { plainToInstance } from "class-transformer"; -import { ValidationError, validate } from "class-validator"; -import { Obj } from "../utils"; -import { ValidationFailed } from "../exceptions/validationfailed"; -import { IntentConfig } from "../config/service"; +import { Type } from '@nestjs/common'; +import { plainToInstance } from 'class-transformer'; +import { ValidationError, validate } from 'class-validator'; +import { IntentConfig } from '../config/service'; +import { ValidationFailed } from '../exceptions/validationfailed'; +import { Obj } from '../utils'; export class Validator { private meta: Record; @@ -32,7 +32,7 @@ export class Validator { this.injectMeta(schema); } - schema["$"] = this.meta; + schema['$'] = this.meta; const errors = await validate(schema as Record, { stopAtFirstError: true, @@ -51,7 +51,7 @@ export class Validator { */ async processErrorsFromValidation(errors: ValidationError[]): Promise { const serializerClass = IntentConfig.get( - "app.error.validationErrorSerializer" + 'app.error.validationErrorSerializer', ); if (!serializerClass) throw new ValidationFailed(errors); const serializer = new serializerClass(); @@ -60,17 +60,17 @@ export class Validator { } injectMeta(schema: T): T { - schema["$"] = this.meta || {}; + schema['$'] = this.meta || {}; const inject = (obj: any, injectionKey: string, injectionValue: any) => { for (const key in obj) { if (key === injectionKey) continue; - if (typeof obj[key] === "object") + if (typeof obj[key] === 'object') obj[key] = inject(obj[key], injectionKey, injectionValue); } obj[injectionKey] = injectionValue; return obj; }; - return inject(schema, "$", this.meta); + return inject(schema, '$', this.meta); } } diff --git a/package-lock.json b/package-lock.json index 0d555c4..7e9e770 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@intentjs/core", - "version": "0.0.1-beta6", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@intentjs/core", - "version": "0.0.1-beta6", + "version": "0.1.2", "license": "MIT", "dependencies": { "@nestjs/config": "^3.2.0", @@ -37,13 +37,24 @@ "devDependencies": { "@jest/globals": "^29.7.0", "@nestjs/testing": "^10.3.9", + "@stylistic/eslint-plugin-ts": "^2.6.1", "@types/express": "^4.17.21", "@types/fs-extra": "^11.0.1", "@types/inquirer": "^9.0.7", "@types/jest": "^29.5.12", "@types/lodash": "^4.14.202", "@types/node": "^18.14.6", + "@typescript-eslint/eslint-plugin": "^8.0.1", + "@typescript-eslint/parser": "^8.0.1", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-security": "^3.0.1", + "eslint-plugin-sonarjs": "^1.0.4", "jest": "^29.7.0", + "prettier": "^3.3.3", "reflect-metadata": "^0.1.13", "ts-jest": "^29.1.4", "typescript": "^5.5.2" @@ -1042,7 +1053,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "peer": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -1053,74 +1063,23 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.11.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.0.tgz", - "integrity": "sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==", - "peer": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/config-array/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true - }, "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "peer": true, + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1128,7 +1087,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1138,7 +1097,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1153,14 +1111,12 @@ "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "peer": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "peer": true, + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -1174,12 +1130,14 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "peer": true, + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1189,7 +1147,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -1200,31 +1157,30 @@ "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "peer": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/@eslint/eslintrc/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/@eslint/js": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", - "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", - "peer": true, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "peer": true, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { @@ -1261,11 +1217,45 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "peer": true, "engines": { "node": ">=12.22" }, @@ -1274,18 +1264,11 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead" }, "node_modules/@ioredis/commands": { "version": "1.2.0", @@ -2077,6 +2060,18 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@radix-ui/colors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-1.0.1.tgz", @@ -3021,6 +3016,70 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.1.tgz", + "integrity": "sha512-iLOiVzcvqzDGD9U0EuVOX680v+XOPiPAjkxWj+Q6iV2GLOM5NB27tKVOpJY7AzBhidwpRbaLTgg3T4UzYx09jw==", + "dev": true, + "dependencies": { + "@types/eslint": "^9.6.0", + "acorn": "^8.12.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-js/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-js/node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.1.tgz", + "integrity": "sha512-Mxl1VMorEG1Hc6oBYPD0+KIJOWkjEF1R0liL7wWgKfwpqOkgmnh5lVdZBrYyfRKOE4RlGcwEFTNai1IW6orgVg==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "2.6.1", + "@types/eslint": "^9.6.0", + "@typescript-eslint/utils": "^8.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, "node_modules/@swc/core": { "version": "1.3.101", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.101.tgz", @@ -3350,9 +3409,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3470,6 +3529,12 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "node_modules/@types/jsonfile": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", @@ -3609,65 +3674,357 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.1.tgz", + "integrity": "sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==", + "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/type-utils": "8.0.1", + "@typescript-eslint/utils": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "node_modules/@typescript-eslint/parser": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.1.tgz", + "integrity": "sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==", + "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/typescript-estree": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@webassemblyjs/leb128": { + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", + "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.1.tgz", + "integrity": "sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.0.1", + "@typescript-eslint/utils": "8.0.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", + "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", + "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", + "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/typescript-estree": "8.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", + "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", @@ -3793,7 +4150,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3929,11 +4285,134 @@ "node": ">=10" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", @@ -3976,6 +4455,21 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", @@ -4781,11 +5275,62 @@ "node": ">=4" } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/db-errors": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/db-errors/-/db-errors-0.2.3.tgz", @@ -4827,8 +5372,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "peer": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -4865,6 +5409,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4926,11 +5487,34 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -5245,6 +5829,66 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -5269,6 +5913,58 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.19.11", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", @@ -5278,130 +5974,354 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-turbo": { + "version": "1.10.12", + "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.12.tgz", + "integrity": "sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==", + "dependencies": { + "eslint-plugin-turbo": "1.10.12" + }, + "peerDependencies": { + "eslint": ">6.6.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "peer": true, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/eslint": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", - "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", - "peer": true, + "node_modules/eslint-plugin-security": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz", + "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==", + "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.7.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "safe-regex": "^2.1.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-turbo": { - "version": "1.10.12", - "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.12.tgz", - "integrity": "sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==", - "dependencies": { - "eslint-plugin-turbo": "1.10.12" + "node_modules/eslint-plugin-sonarjs": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-1.0.4.tgz", + "integrity": "sha512-jF0eGCUsq/HzMub4ExAyD8x1oEgjOyB9XVytYGyWgSFvdiJQJp6IuP7RmtauCf06o6N/kZErh+zW4b10y1WZ+Q==", + "dev": true, + "engines": { + "node": ">=16" }, "peerDependencies": { - "eslint": ">6.6.0" + "eslint": "^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-turbo": { @@ -5424,28 +6344,26 @@ } }, "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "peer": true, + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "peer": true, + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5455,7 +6373,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5467,11 +6384,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/eslint/node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -5488,7 +6409,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -5504,7 +6424,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -5512,17 +6431,40 @@ "node": ">=10.13.0" } }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "peer": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -5536,14 +6478,12 @@ "node_modules/eslint/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -5554,6 +6494,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -5563,17 +6514,16 @@ } }, "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "peer": true, + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dependencies": { - "acorn": "^8.12.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5596,7 +6546,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -5627,7 +6576,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -5758,6 +6706,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -5781,8 +6735,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "peer": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", @@ -5818,15 +6771,14 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "peer": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/filelist": { @@ -5901,23 +6853,22 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "peer": true, + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "peer": true + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/fn.name": { "version": "1.1.0", @@ -5943,6 +6894,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", @@ -6072,6 +7032,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6135,6 +7122,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/getopts": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", @@ -6176,12 +7192,48 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { @@ -6200,6 +7252,20 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6241,6 +7307,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -6349,7 +7430,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "peer": true, "engines": { "node": ">= 4" } @@ -6358,7 +7438,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6374,7 +7453,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "peer": true, "engines": { "node": ">=4" } @@ -6426,6 +7504,20 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -6494,12 +7586,40 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -6511,6 +7631,34 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", @@ -6525,6 +7673,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6561,6 +7739,18 @@ "node": ">=8" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6569,15 +7759,60 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "peer": true, "engines": { "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -6589,6 +7824,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -6600,6 +7880,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -7428,8 +8720,7 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "peer": true + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -7444,8 +8735,7 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "peer": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json5": { "version": "2.2.3", @@ -7473,7 +8763,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -7584,7 +8873,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -7655,8 +8943,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "peer": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -8154,6 +9441,82 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/objection": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/objection/-/objection-3.1.4.tgz", @@ -8215,7 +9578,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -8332,7 +9694,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -8438,6 +9799,15 @@ "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==", "peer": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/peberminta": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", @@ -8495,6 +9865,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -8654,11 +10033,37 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "peer": true, "engines": { "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -8989,6 +10394,17 @@ } } }, + "node_modules/react-email/node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/react-email/node_modules/glob": { "version": "10.3.4", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", @@ -9222,6 +10638,33 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9275,6 +10718,15 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -9293,6 +10745,21 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9323,6 +10790,30 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9342,6 +10833,32 @@ } ] }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -9493,6 +11010,21 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -9917,6 +11449,55 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -10083,6 +11664,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tailwind-merge": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.0.tgz", @@ -10271,8 +11868,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "peer": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/thenify": { "version": "3.3.1", @@ -10348,6 +11944,18 @@ "node": ">= 14.0.0" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -10422,6 +12030,39 @@ "code-block-writer": "^13.0.1" } }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", @@ -10431,7 +12072,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -10472,6 +12112,79 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -10510,6 +12223,21 @@ "ulid": "bin/cli.js" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -10785,6 +12513,41 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/winston": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.1.tgz", @@ -10857,7 +12620,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "peer": true, "engines": { "node": ">=0.10.0" } diff --git a/package.json b/package.json index 8560110..1813611 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,9 @@ "scripts": { "build": "rm -rf dist && tsc -p tsconfig.json && npm run copy:assets", "format": "prettier --write \"**/*.ts\"", - "lint": "eslint 'lib/**/*.ts' --fix", + "format:check": "prettier --check \"lib/**/*.ts\" \"tests/**/*.ts\"", + "lint": "eslint \"{lib,tests}/**/*.ts\" --fix", + "lint:check": "eslint \"{lib,tests}/**/*.ts\" --output-file eslint_report.json --format json", "prepublish:npm": "npm run build", "publish:npm": "npm publish --access public", "prepublish:next": "npm run build", @@ -30,13 +32,24 @@ "devDependencies": { "@jest/globals": "^29.7.0", "@nestjs/testing": "^10.3.9", + "@stylistic/eslint-plugin-ts": "^2.6.1", "@types/express": "^4.17.21", "@types/fs-extra": "^11.0.1", "@types/inquirer": "^9.0.7", "@types/jest": "^29.5.12", "@types/lodash": "^4.14.202", "@types/node": "^18.14.6", + "@typescript-eslint/eslint-plugin": "^8.0.1", + "@typescript-eslint/parser": "^8.0.1", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-security": "^3.0.1", + "eslint-plugin-sonarjs": "^1.0.4", "jest": "^29.7.0", + "prettier": "^3.3.3", "reflect-metadata": "^0.1.13", "ts-jest": "^29.1.4", "typescript": "^5.5.2" diff --git a/tests/helpers/stringHelper.spec.ts b/tests/helpers/stringHelper.spec.ts index 72955f3..83ac049 100644 --- a/tests/helpers/stringHelper.spec.ts +++ b/tests/helpers/stringHelper.spec.ts @@ -1,54 +1,54 @@ -import { Str } from "../../lib/utils/string"; +import { Str } from '../../lib/utils/string'; -describe("String Helper", () => { +describe('String Helper', () => { beforeEach(async () => {}); - it("should pluralize the sentence", () => { - const string = `Vinayak ${Str.pluralize("have")} 5 ${Str.pluralize( - "apple" + it('should pluralize the sentence', () => { + const string = `Vinayak ${Str.pluralize('have')} 5 ${Str.pluralize( + 'apple', )}.`; - expect(string).toBe("Vinayak has 5 apples."); + expect(string).toBe('Vinayak has 5 apples.'); }); - it("should replace using string", () => { - const string = "vinayak don"; - const find = "don"; - const replace = "sarawagi"; - expect(Str.replace(string, find, replace)).toBe("vinayak sarawagi"); + it('should replace using string', () => { + const string = 'vinayak don'; + const find = 'don'; + const replace = 'sarawagi'; + expect(Str.replace(string, find, replace)).toBe('vinayak sarawagi'); }); - it("should replace using regex", () => { - const string = "vinayak don"; - const find = "don"; - const replace = "sarawagi"; - expect(Str.replace(string, find, replace)).toBe("vinayak sarawagi"); + it('should replace using regex', () => { + const string = 'vinayak don'; + const find = 'don'; + const replace = 'sarawagi'; + expect(Str.replace(string, find, replace)).toBe('vinayak sarawagi'); }); - it("should replace all occurences using string", () => { - const string = "vinayak don don don don"; - const find = "don"; - const replace = "sarawagi"; + it('should replace all occurences using string', () => { + const string = 'vinayak don don don don'; + const find = 'don'; + const replace = 'sarawagi'; expect(Str.replace(string, find, replace)).toBe( - "vinayak sarawagi sarawagi sarawagi sarawagi" + 'vinayak sarawagi sarawagi sarawagi sarawagi', ); }); - it("should replace all occurences using regex", () => { - const string = "Virat Kohli says Ben Stokes"; + it('should replace all occurences using regex', () => { + const string = 'Virat Kohli says Ben Stokes'; const replacements = { - "Ben Stokes": "OUT!!", + 'Ben Stokes': 'OUT!!', }; - expect(Str.swap(string, replacements)).toBe("Virat Kohli says OUT!!"); + expect(Str.swap(string, replacements)).toBe('Virat Kohli says OUT!!'); }); - it("should convert to snake case", () => { - const string = "IntentJs - For the devs_whoHaveTheIntent"; + it('should convert to snake case', () => { + const string = 'IntentJs - For the devs_whoHaveTheIntent'; expect(Str.snake(string)).toBe( - "intent_js_for_the_devs_who_have_the_intent" + 'intent_js_for_the_devs_who_have_the_intent', ); }); - it("should singularize", () => { - expect(Str.singular("indices")).toBe("index"); + it('should singularize', () => { + expect(Str.singular('indices')).toBe('index'); }); });