diff --git a/.eslintrc.js b/.eslintrc.js
index cfc2f68e..8fc32d9b 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -2,26 +2,32 @@ module.exports = {
env: {
node: true
},
+ plugins: [
+ "@typescript-eslint",
+ "eslint-plugin-import",
+ "eslint-plugin-node",
+ "regexp"
+ ],
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:eslint-plugin-import/recommended",
- "plugin:node/recommended"
+ "plugin:node/recommended",
+ "plugin:regexp/recommended"
],
parser: "@typescript-eslint/parser",
parserOptions: {
project: "tsconfig.json",
sourceType: "module"
},
- plugins: ["@typescript-eslint", "eslint-plugin-import", "eslint-plugin-node"],
rules: {
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/explicit-module-boundary-types": "off",
- "@typescript-eslint/member-delimiter-style": [ "warn", { multiline: { delimiter: "none" } } ],
+ "@typescript-eslint/member-delimiter-style": ["warn", { multiline: { delimiter: "none" } }],
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-var-requires": "off",
- "eqeqeq": ["warn", "always", {"null": "ignore"}],
+ "eqeqeq": ["warn", "always", { "null": "ignore" }],
"import/no-cycle": "warn",
"import/no-unresolved": "off",
"import/named": "off",
diff --git a/docs/classes/ExifToolTask.html b/docs/classes/ExifToolTask.html
index 622432c6..18fcc78b 100644
--- a/docs/classes/ExifToolTask.html
+++ b/docs/classes/ExifToolTask.html
@@ -192,7 +192,7 @@
Parameters
err: string
Returns void
+Defined in src/ExifToolTask.ts:33
onStart
@@ -249,7 +249,7 @@ input: Optional error: Error
Returns T
+Defined in src/ExifToolTask.ts:31
reject
diff --git a/package.json b/package.json
index df80d2e3..24bc1ee8 100644
--- a/package.json
+++ b/package.json
@@ -67,30 +67,31 @@
]
},
"devDependencies": {
- "@types/chai": "^4.3.7",
- "@types/chai-as-promised": "^7.1.6",
- "@types/chai-subset": "^1.3.3",
- "@types/globule": "^1.1.7",
- "@types/he": "^1.2.1",
- "@types/mocha": "^10.0.2",
- "@types/node": "^20.8.4",
- "@types/progress": "^2.0.5",
- "@types/tmp": "^0.2.4",
- "@types/xmldom": "^0.1.32",
- "@typescript-eslint/eslint-plugin": "^6.7.5",
- "@typescript-eslint/parser": "^6.7.5",
+ "@types/chai": "^4.3.9",
+ "@types/chai-as-promised": "^7.1.7",
+ "@types/chai-subset": "^1.3.4",
+ "@types/globule": "^1.1.8",
+ "@types/he": "^1.2.2",
+ "@types/mocha": "^10.0.3",
+ "@types/node": "^20.8.9",
+ "@types/progress": "^2.0.6",
+ "@types/tmp": "^0.2.5",
+ "@types/xmldom": "^0.1.33",
+ "@typescript-eslint/eslint-plugin": "^6.9.0",
+ "@typescript-eslint/parser": "^6.9.0",
"@xmldom/xmldom": "^0.8.10",
"chai": "^4.3.10",
"chai-as-promised": "^7.1.1",
"chai-subset": "^1.6.0",
- "eslint": "^8.51.0",
- "eslint-plugin-import": "^2.28.1",
+ "eslint": "^8.52.0",
+ "eslint-plugin-import": "^2.29.0",
"eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-regexp": "^2.1.1",
"extract-zip": "^2.0.1",
"geo-tz": "^7.0.7",
"globule": "^1.3.4",
"mocha": "^10.2.0",
- "npm-check-updates": "^16.14.5",
+ "npm-check-updates": "^16.14.6",
"npm-run-all": "^4.1.5",
"prettier": "^3.0.3",
"prettier-plugin-organize-imports": "^3.2.3",
@@ -106,7 +107,7 @@
"dependencies-note": "@types/luxon is a proper dependency, not devDependency, as our exported TypeScript typings reference luxon types. See ",
"dependencies": {
"@photostructure/tz-lookup": "^8.0.0",
- "@types/luxon": "^3.3.2",
+ "@types/luxon": "^3.3.3",
"batch-cluster": "^12.1.0",
"he": "^1.2.0",
"luxon": "^3.4.3"
diff --git a/src/ExifTool.spec.ts b/src/ExifTool.spec.ts
index 421d4e5f..a5f83120 100644
--- a/src/ExifTool.spec.ts
+++ b/src/ExifTool.spec.ts
@@ -49,7 +49,7 @@ describe("ExifTool", function () {
// vendorVersion might have a ^ or ~ or something else as a prefix, so get
// rid of that:
return vendorVersion
- .replace(/^[^.0-9]+/, "")
+ .replace(/^[^.\d]+/, "")
.split(".")
.slice(0, 2)
.map((ea) => leftPad(ea, 2, "0"))
diff --git a/src/ExifToolTask.ts b/src/ExifToolTask.ts
index aab46d4d..e88cc40b 100644
--- a/src/ExifToolTask.ts
+++ b/src/ExifToolTask.ts
@@ -16,7 +16,9 @@ export abstract class ExifToolTask extends bc.Task {
super(ExifToolTask.renderCommand(args), (stdout, stderr, passed) => {
let error: Maybe
if (notBlank(stderr) || !passed) {
- const errMsg = (stderr ?? stdout).trim().replace(/error(:\s*|\b)/i, "")
+ const errMsg = (stderr ?? stdout)
+ .trim()
+ .replace(/error(?::\s*|\b)/i, "")
if (!this.isIgnorableError(errMsg)) {
this.errors.push(errMsg)
error = new Error(errMsg)
diff --git a/src/Timezones.ts b/src/Timezones.ts
index ffe39120..91730611 100644
--- a/src/Timezones.ts
+++ b/src/Timezones.ts
@@ -164,7 +164,7 @@ export function normalizeZone(
}
let z = input
if (typeof z === "string") {
- z = z.replace(/^(Zulu|Z|GMT)(\b|$)/, "UTC")
+ z = z.replace(/^(?:Zulu|Z|GMT)(?:\b|$)/, "UTC")
// Info.normalizeZone("") returns the system zone, which we never want.
// We also don't need to tease Info.normalizeZone with obviously
// non-offset inputs:
@@ -311,7 +311,7 @@ export function extractZone(
opts?.stripTZA !== false &&
// We only want to strip off the TZA if the input _doesn't_ end with "UTC"
// or "Z"
- !/[.\d\s](UTC|Z)$/.test(str)
+ !/[.\d\s](?:UTC|Z)$/.test(str)
) {
str = str.replace(/\s[a-z]{2,5}$/i, "")
}
diff --git a/src/VersionTask.ts b/src/VersionTask.ts
index c0188a0b..e69ed685 100644
--- a/src/VersionTask.ts
+++ b/src/VersionTask.ts
@@ -1,7 +1,7 @@
import { ExifToolTask } from "./ExifToolTask"
export class VersionTask extends ExifToolTask {
- private static readonly versionRegex = /^\d{1,3}\.\d{1,3}(\.\d{1,3}})?$/
+ private static readonly versionRegex = /^\d{1,3}\.\d{1,3}(?:\.\d{1,3})?$/
constructor() {
super(["-ver"])
diff --git a/src/update/mktags.ts b/src/update/mktags.ts
index d1150ba9..e87fadb7 100644
--- a/src/update/mktags.ts
+++ b/src/update/mktags.ts
@@ -1,3 +1,5 @@
+/* eslint-disable regexp/optimal-quantifier-concatenation */
+/* eslint-disable regexp/no-dupe-disjunctions */
require("source-map-support").install()
import { BatchCluster, Log, logger, setLogger } from "batch-cluster"
@@ -648,7 +650,7 @@ class TagMap {
}
const tagMap = new TagMap()
-const saneTagRe = /^[a-z0-9_]+:[a-z0-9_]+$/i
+const saneTagRe = /^\w+:\w+$/
const bar = new ProgressBar(
"reading tags [:bar] :current/:total files, :tasks pending @ :rate files/sec w/:procs procs :etas",
@@ -706,7 +708,7 @@ process.on("unhandledRejection", (reason: any) => {
})
function escapeKey(s: string): string {
- return s.match(/[^0-9a-z_]/i) != null ? JSON.stringify(s) : s
+ return s.match(/\W/) != null ? JSON.stringify(s) : s
}
Promise.all(files.map((file) => readAndAddToTagMap(file)))