From 1e926b3f04814ba69e3b86bb07e66b064f3acae5 Mon Sep 17 00:00:00 2001 From: tgd Date: Thu, 13 Nov 2025 15:53:09 -0800 Subject: [PATCH] fix .d.ts and add a basic typechecking example/CI --- .github/workflows/tests.yml | 1 + lib/mixpanel-node.d.ts | 5 ---- package-lock.json | 54 +++++++++++++++++++++++++++++++++++++ package.json | 2 ++ tscheck/example.ts | 7 +++++ tsconfig.json | 41 ++++++++++++++++++++++++++++ 6 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 tscheck/example.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c47d07f..3346666 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,3 +23,4 @@ jobs: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm test -- run --coverage + - run: npx tsc diff --git a/lib/mixpanel-node.d.ts b/lib/mixpanel-node.d.ts index 164d4c1..88deb34 100644 --- a/lib/mixpanel-node.d.ts +++ b/lib/mixpanel-node.d.ts @@ -162,11 +162,6 @@ declare namespace mixpanel { delete_group(groupKey: string, groupId: string, modifiers?: Modifiers, callback?: Callback): void; delete_group(groupKey: string, groupId: string, callback: Callback): void; } - - // Export feature flags types for convenience - export { LocalFlagsConfig, RemoteFlagsConfig, FlagContext, SelectedVariant } from './flags/types'; - export { default as LocalFeatureFlagsProvider } from './flags/local_flags'; - export { default as RemoteFeatureFlagsProvider } from './flags/remote_flags'; } export = mixpanel; diff --git a/package-lock.json b/package-lock.json index abcc8da..642b0cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,11 @@ "https-proxy-agent": "7.0.6" }, "devDependencies": { + "@types/node": "^24.10.1", "@vitest/coverage-v8": "^4.0.8", "nock": "^14.0.10", "proxyquire": "^2.1.3", + "typescript": "^5.9.3", "vitest": "^4.0.8" }, "engines": { @@ -934,6 +936,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, "node_modules/@vitest/coverage-v8": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.8.tgz", @@ -1763,6 +1775,27 @@ "node": ">=14.0.0" } }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", @@ -2394,6 +2427,15 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, + "@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "dev": true, + "requires": { + "undici-types": "~7.16.0" + } + }, "@vitest/coverage-v8": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.8.tgz", @@ -2949,6 +2991,18 @@ "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true }, + "typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true + }, + "undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true + }, "vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", diff --git a/package.json b/package.json index 428cd26..5ad99b8 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,11 @@ }, "types": "./lib/mixpanel-node.d.ts", "devDependencies": { + "@types/node": "^24.10.1", "@vitest/coverage-v8": "^4.0.8", "nock": "^14.0.10", "proxyquire": "^2.1.3", + "typescript": "^5.9.3", "vitest": "^4.0.8" }, "dependencies": { diff --git a/tscheck/example.ts b/tscheck/example.ts new file mode 100644 index 0000000..af69f8b --- /dev/null +++ b/tscheck/example.ts @@ -0,0 +1,7 @@ +// example module where typechecking should be working both in code editors and via `tsc` + +import Mixpanel from "../lib/mixpanel-node.js"; + +const mp = Mixpanel.init("asjdf", { local_flags_config: {} }); +mp.track("test event"); +mp.local_flags?.getVariantValue("color", "blue", { distinct_id: "user_1" }); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f25f045 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,41 @@ +{ + // Visit https://aka.ms/tsconfig to read more about this file + "compilerOptions": { + // File Layout + // "rootDir": "./lib", + // "outDir": "./dist", + + // Environment Settings + // See also https://aka.ms/tsconfig/module + "module": "nodenext", + "target": "esnext", + + // For nodejs: + "lib": ["esnext"], + "types": ["node"], + + "noEmit": true, + + "esModuleInterop": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + + // Style Options + // "noImplicitReturns": true, + // "noImplicitOverride": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "noFallthroughCasesInSwitch": true, + // "noPropertyAccessFromIndexSignature": true, + + // Recommended Options + "strict": true, + // "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true, + } +}