diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..650f08f --- /dev/null +++ b/index.d.ts @@ -0,0 +1,3 @@ +declare function isMap(x: unknown): x is Map; + +export = isMap; \ No newline at end of file diff --git a/index.js b/index.js index de6aec9..44063d0 100644 --- a/index.js +++ b/index.js @@ -1,11 +1,13 @@ 'use strict'; +/** @const */ var $Map = typeof Map === 'function' && Map.prototype ? Map : null; var $Set = typeof Set === 'function' && Set.prototype ? Set : null; var exported; if (!$Map) { + /** @type {import('.')} */ // eslint-disable-next-line no-unused-vars exported = function isMap(x) { // `Map` is not present in this environment. @@ -16,6 +18,7 @@ if (!$Map) { var $mapHas = $Map ? Map.prototype.has : null; var $setHas = $Set ? Set.prototype.has : null; if (!exported && !$mapHas) { + /** @type {import('.')} */ // eslint-disable-next-line no-unused-vars exported = function isMap(x) { // `Map` does not have a `has` method @@ -23,6 +26,7 @@ if (!exported && !$mapHas) { }; } +/** @type {import('.')} */ module.exports = exported || function isMap(x) { if (!x || typeof x !== 'object') { return false; @@ -36,6 +40,7 @@ module.exports = exported || function isMap(x) { return true; } } + // @ts-expect-error TS can't figure out that $Map is always truthy here return x instanceof $Map; // core-js workaround, pre-v2.5.0 } catch (e) {} return false; diff --git a/package.json b/package.json index e043904..12543c5 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "prepublish": "not-in-publish || npm run prepublishOnly", "pretest": "npm run lint", "lint": "eslint --ext=js,mjs .", + "postlint": "tsc -p . && attw -P", "tests-only": "nyc tape 'test/**/*.js'", "tests:shims": "nyc tape --require=es5-shim --require=es5-shim 'test/**/*.js'", "tests:corejs": "nyc tape --require=core-js 'test/**/*.js'", @@ -39,7 +40,11 @@ }, "homepage": "https://github.com/inspect-js/is-map#readme", "devDependencies": { + "@arethetypeswrong/cli": "^0.15.0", "@ljharb/eslint-config": "^21.1.0", + "@types/for-each": "^0.3.3", + "@types/object-inspect": "^1.8.4", + "@types/tape": "^5.6.4", "aud": "^2.0.4", "auto-changelog": "^2.4.0", "core-js": "^2.6.12", @@ -52,7 +57,8 @@ "nyc": "^10.3.2", "object-inspect": "^1.13.1", "safe-publish-latest": "^2.0.0", - "tape": "^5.7.5" + "tape": "^5.7.5", + "typescript": "^5.5.0-dev.20240308" }, "auto-changelog": { "output": "CHANGELOG.md", diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..2002ce5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,49 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + + /* Language and Environment */ + "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + "typeRoots": ["types"], /* Specify multiple folders that act like './node_modules/@types'. */ + "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + + /* JavaScript Support */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + "maxNodeModuleJsDepth": 0, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declarationMap": true, /* Create sourcemaps for d.ts files. */ + "noEmit": true, /* Disable emitting files from a compilation. */ + + /* Interop Constraints */ + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + + /* Completeness */ + //"skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": [ + "coverage" + ] +}