From 5ca22f11d923d0425f576cb99f33703aee8afc19 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 9 Jul 2023 15:05:53 +0200 Subject: [PATCH 1/6] Add ESM support --- .github/workflows/esm.yml | 18 +++++++++ index.mjs | 1 + package.json | 10 +++-- test/esm.mjs | 77 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/esm.yml create mode 100644 index.mjs create mode 100644 test/esm.mjs diff --git a/.github/workflows/esm.yml b/.github/workflows/esm.yml new file mode 100644 index 000000000..20a00b330 --- /dev/null +++ b/.github/workflows/esm.yml @@ -0,0 +1,18 @@ +name: esm ci + +on: + - pull_request + - push + +jobs: + build: + strategy: + matrix: + version: [16.14, 18, 20] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.version }} + - run: node test/esm.mjs diff --git a/index.mjs b/index.mjs new file mode 100644 index 000000000..c05da399f --- /dev/null +++ b/index.mjs @@ -0,0 +1 @@ +export { default } from "./db.json" assert { type: "json" } diff --git a/package.json b/package.json index 8956d3c92..5abfe6cf7 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,8 @@ "name": "mime-db", "description": "Media Type Database", "version": "1.52.0", + "main": "index.js", + "module": "index.mjs", "contributors": [ "Douglas Christopher Wilson ", "Jonathan Ong (http://jongleberry.com)", @@ -38,16 +40,18 @@ "LICENSE", "README.md", "db.json", - "index.js" + "index.js", + "index.mjs" ], "engines": { - "node": ">= 0.6" + "node": "^16.14 || 18 || 20" }, "scripts": { "build": "node scripts/build", "fetch": "node scripts/fetch-apache && node scripts/fetch-iana && node scripts/fetch-nginx", "lint": "eslint .", - "test": "mocha --reporter spec --bail --check-leaks test/", + "test": "mocha --reporter spec --bail --check-leaks test/**/*.js", + "test:esm": "node test/esm.mjs", "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", "test-cov": "nyc --reporter=html --reporter=text npm test", "update": "npm run fetch && npm run build", diff --git a/test/esm.mjs b/test/esm.mjs new file mode 100644 index 000000000..ba81b2518 --- /dev/null +++ b/test/esm.mjs @@ -0,0 +1,77 @@ +import assert from "node:assert" +import { readdirSync } from "node:fs" +import { resolve } from "node:path" +import { fileURLToPath } from "node:url" +import test from 'node:test'; + +import typer from "media-typer" + +import db from "../index.mjs" + +const __dirname = fileURLToPath(new URL('.', import.meta.url)); +const path = resolve(__dirname, '..', 'src') +const types = [] + +test("should not contain types not in src", async () => { + // collect all source types + for (const file of readdirSync(path)) { + if (!/-types\.json$/.test(file)) continue + + const imported = await import(resolve(path, file), { + assert: { + type: "json" + } + }) + types.push(...Object.keys(imported.default)) + } + + Object.keys(db).forEach((name) => { + assert.ok(types.includes(name), `type ${name} should be in src/`) + }) +}) + +test("should contain only valid mime types", () => { + Object.keys(db).forEach((mime) => { + assert.ok(typer.test(mime), `type ${mime} is a valid mime type`) + }) +}) + +test("should not have any uppercased letters in names", () => { + Object.keys(db).forEach((name) => { + assert.strictEqual(name, name.toLowerCase(), `type ${name} should be lowercase`) + }) +}) + +test("should have .json and .js as having UTF-8 charsets", () => { + assert.strictEqual('UTF-8', db['application/json'].charset) + assert.strictEqual('UTF-8', db['application/javascript'].charset) +}) + +test("should set audio/x-flac with extension=flac", () => { + assert.strictEqual('flac', db['audio/x-flac'].extensions[0], 'should set audio/x-flac with extension=flac') +}) + +test("should have guessed application/mathml+xml", () => { + assert(db['application/mathml+xml']) +}) + +test("should not have an empty .extensions", () => { + assert(Object.keys(db).every((name) => { + var mime = db[name] + if (!mime.extensions) return true + return mime.extensions.length + })) +}) + +test("should have only lowercase .extensions", () => { + Object.keys(db).forEach((name) => { + (db[name].extensions || []).forEach((ext) => { + assert.strictEqual(ext, ext.toLowerCase(), `extension ${ext} in type ${name} should be lowercase`) + }) + }) +}) + +test("should have the default .extension as the first", () => { + assert.strictEqual(db['text/plain'].extensions[0], 'txt') + assert.strictEqual(db['video/x-matroska'].extensions[0], 'mkv') +}) From 1cddc41c2dced8b1d081fd818fa0a7224c5950e2 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 9 Jul 2023 15:08:29 +0200 Subject: [PATCH 2/6] fix(esm test): install dev deps --- .github/workflows/esm.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/esm.yml b/.github/workflows/esm.yml index 20a00b330..baf472418 100644 --- a/.github/workflows/esm.yml +++ b/.github/workflows/esm.yml @@ -15,4 +15,5 @@ jobs: - uses: actions/setup-node@v3 with: node-version: ${{ matrix.version }} + - run: npm install - run: node test/esm.mjs From deb7677201bf35e15af61bc93af515f28d9a4a96 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 9 Jul 2023 15:11:10 +0200 Subject: [PATCH 3/6] chore: remove node 16 --- .github/workflows/esm.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/esm.yml b/.github/workflows/esm.yml index baf472418..7b8160aba 100644 --- a/.github/workflows/esm.yml +++ b/.github/workflows/esm.yml @@ -8,7 +8,7 @@ jobs: build: strategy: matrix: - version: [16.14, 18, 20] + version: [18, 20] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 diff --git a/package.json b/package.json index 5abfe6cf7..b3d77d254 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "index.mjs" ], "engines": { - "node": "^16.14 || 18 || 20" + "node": "18 || 20" }, "scripts": { "build": "node scripts/build", From c35de27d5f6d5c408a2c683e1b58f87ce286bb4b Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 9 Jul 2023 15:43:27 +0200 Subject: [PATCH 4/6] add sideEffects and exports pkg json fields --- package.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/package.json b/package.json index b3d77d254..eca876527 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,13 @@ "version": "1.52.0", "main": "index.js", "module": "index.mjs", + "sideEffects": false, + "exports": { + ".": { + "require": "./index.js", + "import": "./index.mjs" + } + }, "contributors": [ "Douglas Christopher Wilson ", "Jonathan Ong (http://jongleberry.com)", From d23032324396073a56458b61773a2d67702a7201 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 9 Jul 2023 15:55:27 +0200 Subject: [PATCH 5/6] reset engines field --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eca876527..747d8e734 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "index.mjs" ], "engines": { - "node": "18 || 20" + "node": ">= 0.6" }, "scripts": { "build": "node scripts/build", From f16c0dbc6d56bca8e73fd1946f656d3e666f7307 Mon Sep 17 00:00:00 2001 From: marvin-j97 Date: Sun, 9 Jul 2023 16:30:30 +0200 Subject: [PATCH 6/6] refactor(esm test): simplify test case --- test/esm.mjs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/esm.mjs b/test/esm.mjs index ba81b2518..1645439ca 100644 --- a/test/esm.mjs +++ b/test/esm.mjs @@ -56,8 +56,7 @@ test("should have guessed application/mathml+xml", () => { }) test("should not have an empty .extensions", () => { - assert(Object.keys(db).every((name) => { - var mime = db[name] + assert(Object.entries(db).every((mime) => { if (!mime.extensions) return true return mime.extensions.length }))