{"_id":"@apet97/clockify-addon-sdk","_rev":"10-86a4affd7aa97418f6680799bf9a874a","name":"@apet97/clockify-addon-sdk","dist-tags":{"latest":"1.3.1"},"versions":{"1.0.0":{"name":"@apet97/clockify-addon-sdk","version":"1.0.0","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.0.0","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"214f60b9ea68e38a45d171180821ab5b1437608b","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.0.0.tgz","fileCount":226,"integrity":"sha512-p+vUIKpAoXnFYSaTtEKq1Pi/A4Wln+MhzlaIeYDpqHmmPcU59t75nOgozZtcPLINzN2H4oaKHUss7vmdJaxOJg==","signatures":[{"sig":"MEYCIQDvqZiQ5+SbVcXseM/otAuWTym1K5QOKvNUfVGoE6vjlAIhAKPSuMR/aXHGX4ODRygSXEQSy8waq+5H0E0PdqRb71ot","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1132343},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"gitHead":"a06b76d280317e94a21ad11551c2d85edbfa6a13","scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"ajv":"^8.20.0","jose":"^6.2.3","ajv-draft-04":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.1","vite":"^8.1.0","eslint":"^10.6.0","vitest":"^4.1.9","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.0","@types/express":"^5.0.6","typescript-eslint":"^8.62.0","@vitest/coverage-v8":"^4.1.9","@arethetypeswrong/cli":"^0.18.4","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.0.0_1783828706183_0.790130261334151","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@apet97/clockify-addon-sdk","version":"1.0.1","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.0.1","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"86846f228c8205d9e28f1121e7280aa270dc4916","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.0.1.tgz","fileCount":226,"integrity":"sha512-pCGl3bz+liIWiFg/lng/AL4alOrvxm5oxhs51Ar3ibcSF/PRL9azYSL+IdRI2BfcE6b4ddhJVH0QDfnUKjBtwA==","signatures":[{"sig":"MEUCIFDEnoopZVw9emnczpFg5xaO51GgQIUg2b3Pjs7ojmKGAiEAsOjWeoo/IPcZFi3294wr/PbK2urqs8BrJSROyUmcg28=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1132343},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"gitHead":"4162e6f40670715dc7a773b2ec0a59a3428aeb53","scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"ajv":"^8.20.0","jose":"^6.2.3","ajv-draft-04":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.1","vite":"^8.1.0","eslint":"^10.6.0","vitest":"^4.1.9","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.1","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.0","@types/express":"^5.0.6","typescript-eslint":"^8.62.0","@vitest/coverage-v8":"^4.1.9","@arethetypeswrong/cli":"^0.18.4","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.0.1_1783831930377_0.520111249903952","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@apet97/clockify-addon-sdk","version":"1.0.2","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.0.2","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"73eb00ff7b282f87fc37d2305d48586b2a75e593","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.0.2.tgz","fileCount":226,"integrity":"sha512-okmYaiHhIvAikXlpa745AgGnJn9i8tOxiHYZFWsVuF0ZgztoKkbO9+HzixgWrbQHtkHvXwu5BxnOz9rGc4hiOA==","signatures":[{"sig":"MEYCIQCvoTM9E+UoQTdi1eM2g3X+nrbbmnnuNtxyBcjv9uSXRAIhAP41UsE+eaLV/6+BC+8Y0YnugP7eCiOJgaNVp9nvwJ3z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1132698},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"gitHead":"99ac2314e6bc724d4e1ebe9492f81171fff6f0c5","scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"ajv":"^8.20.0","jose":"^6.2.3","ajv-draft-04":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","vite":"^8.1.4","eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.1","@types/express":"^5.0.6","typescript-eslint":"^8.63.0","@vitest/coverage-v8":"^4.1.10","@arethetypeswrong/cli":"^0.18.5","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.0.2_1783963460847_0.15724839535498458","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@apet97/clockify-addon-sdk","version":"1.0.3","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.0.3","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"933248cf9f3b4cfc3b66391a61615dcd3518591b","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.0.3.tgz","fileCount":226,"integrity":"sha512-hQZ0FtCQJ5t4v8/B1slWQOiLY4giOrDLllvMVnCGTSjfgCKyFVF4ovZrUzXF1cR4ztZeVsx3ytyr5HROhW9/pA==","signatures":[{"sig":"MEUCIQDgPQD/2u/NM6o7G75oC1kIOOzAtvlRNy5GGhHjJ3zKNwIgUnPIN3O2lsLR2NC9PSkCEIulgU0ujLnHTO75f4f2lvc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1138547},"main":"./dist/cjs/index.js","type":"commonjs","_from":"file:/tmp/addon-ts-sdk-publish-103.Eaw3K8/apet97-clockify-addon-sdk-1.0.3.tgz","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"_resolved":"/tmp/addon-ts-sdk-publish-103.Eaw3K8/apet97-clockify-addon-sdk-1.0.3.tgz","_integrity":"sha512-hQZ0FtCQJ5t4v8/B1slWQOiLY4giOrDLllvMVnCGTSjfgCKyFVF4ovZrUzXF1cR4ztZeVsx3ytyr5HROhW9/pA==","repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"ajv":"^8.20.0","jose":"^6.2.3","ajv-draft-04":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","vite":"^8.1.4","eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.1","@types/express":"^5.0.6","typescript-eslint":"^8.64.0","@vitest/coverage-v8":"^4.1.10","@arethetypeswrong/cli":"^0.18.5","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.0.3_1783994864083_0.8436059662266251","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@apet97/clockify-addon-sdk","version":"1.0.4","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.0.4","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"3442f2cf37f1d058fba8f82ad051227f90647e0a","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.0.4.tgz","fileCount":231,"integrity":"sha512-lVRDTRrUg0ZGlXdXIvr3hd8AoO4ru6fE7rwt65wcvNvCd//Q7159161vVsndtsfiC27DHldZtZcLY0c51p5wFA==","signatures":[{"sig":"MEQCIGTRselOix1X3gl50zu7FJxCrQCWv6Erwz7X9cB8vUddAiBEvx3MxhkdgLcVZhxswAuxMLhQ74LNB1b7DI7kptaOhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140435},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"gitHead":"0e2fde5a49e8d6860961339b7945ba6d2a177c07","scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"ajv":"^8.20.0","jose":"^6.2.3","ajv-draft-04":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","vite":"^8.1.4","eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.1","@types/express":"^5.0.6","typescript-eslint":"^8.64.0","@vitest/coverage-v8":"^4.1.10","@arethetypeswrong/cli":"^0.18.5","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.0.4_1784002780738_0.9261258106511632","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@apet97/clockify-addon-sdk","version":"1.0.5","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.0.5","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"853a6701dfc53df18fa9086f04c08d5fda6904f8","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.0.5.tgz","fileCount":234,"integrity":"sha512-CeWpMkPPDvke9hGYc211Hol3l4tbTgBkK7OR/QPgYUitffLLBisEsZ0dbvL8e7L/4kcY4U5+gm7MSSd2ZxTB0Q==","signatures":[{"sig":"MEYCIQCCEFRAu6vmYayVPfUfPQDjjv/JVMpBwa5oK/l+EfEszgIhAO/JhO7iym6pjogKvj/kgaKttaVWIv5dpvfqE94NmS+l","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2124824},"main":"./dist/cjs/index.js","type":"commonjs","_from":"file:/tmp/addon-ts-sdk-1.0.5.AJAxHW/apet97-clockify-addon-sdk-1.0.5.tgz","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"_resolved":"/tmp/addon-ts-sdk-1.0.5.AJAxHW/apet97-clockify-addon-sdk-1.0.5.tgz","_integrity":"sha512-CeWpMkPPDvke9hGYc211Hol3l4tbTgBkK7OR/QPgYUitffLLBisEsZ0dbvL8e7L/4kcY4U5+gm7MSSd2ZxTB0Q==","repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"ajv":"^8.20.0","jose":"^6.2.3","ajv-draft-04":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","vite":"^8.1.4","eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.1","@types/express":"^5.0.6","typescript-eslint":"^8.64.0","@vitest/coverage-v8":"^4.1.10","@arethetypeswrong/cli":"^0.18.5","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.0.5_1784024290239_0.36258212344879137","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@apet97/clockify-addon-sdk","version":"1.1.0","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.1.0","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"7069765c3299de3154aadf100e9253a91ad6c7d7","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.1.0.tgz","fileCount":240,"integrity":"sha512-d68r8kdrq0XlQBThR/Ugzia6XUlIO/2y+tQFphPxYy/nO0VIslqDZNXHoN7bgBVdgHH+WAa8OvzIO93yg4L4QA==","signatures":[{"sig":"MEUCIQC5vRyKgiFVz4eIpLCuAachdVr+aeWdCrSez9TpdWTfwwIgUNjPdiFICtKZerdA4KyIThnT+/n4szIQKCeQy3ZjuK4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2667934},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22.13.0"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"gitHead":"919639e1c0b7f4bcb4d85a0b32fb37ba4c4b81d7","scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"jose":"^6.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.20.0","tsx":"^4.23.1","vite":"^8.1.4","eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.1","ajv-draft-04":"^1.0.0","@types/express":"^5.0.6","typescript-eslint":"^8.64.0","@vitest/coverage-v8":"^4.1.10","@arethetypeswrong/cli":"^0.18.5","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.1.0_1786126014413_0.6366913474508185","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@apet97/clockify-addon-sdk","version":"1.2.0","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.2.0","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"244e416522ec7501092633f96696012e6b785061","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.2.0.tgz","fileCount":245,"integrity":"sha512-V2OXR6dzKdTfBwOWaHV77gxh8rcKczQf4cyz/1oQQeuPG/8R0LcT8/pIKiMs+/avMsfY5aJptEF5fqHU6afuZg==","signatures":[{"sig":"MEUCICsw57A/+Oo8e+MRHk1dDXkSrdD/b4k7rbyUipzNMpCHAiEAuzTWgibFp7ibW1RZLIm0sqs7MSbEGxadT6/E+C1sYeA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2720512},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22.13.0"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"gitHead":"f067e5b73be0c903abcf516e1da91e95d395def9","scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"jose":"^6.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.20.0","tsx":"^4.23.1","vite":"^8.1.4","eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.1","ajv-draft-04":"^1.0.0","@types/express":"^5.0.6","typescript-eslint":"^8.64.0","@vitest/coverage-v8":"^4.1.10","@arethetypeswrong/cli":"^0.18.5","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.2.0_1786133993657_0.30772129649423374","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@apet97/clockify-addon-sdk","version":"1.3.0","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","_id":"@apet97/clockify-addon-sdk@1.3.0","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"dist":{"shasum":"eebed77d7cd6e133c8fb73f85dc205ab2ae05162","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.3.0.tgz","fileCount":245,"integrity":"sha512-zgGcpwJmt9BXNEjpywLrqarN0yKBOEewxjlsl/temvvPCJB8RLV5RVN41MVjZH0jQ6/JjWjV3O9ZJ9RjjfEcKw==","signatures":[{"sig":"MEQCIDez+Moazyu+hjS6KgXRE6Y9n2q1vqqihWwbjNpGuTJKAiAK1WexL66yxJptsZejc/n5RPnq6kycU/tygk4cX1YxCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2737949},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=22.13.0"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json","./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json"},"gitHead":"64e668afd7bf330be4908c58d8671bdd27951608","scripts":{"lint":"eslint .","test":"vitest run","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist","generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:dist":"node scripts/verify-dist.mjs","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","format:check":"prettier . --check","test:coverage":"vitest run --coverage","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:public-api":"node scripts/verify-public-api.cjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","verify:schema-live":"node scripts/verify-live-schemas.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs"},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"repository":{"url":"git+https://github.com/apet97/addon-ts-sdk.git","type":"git","directory":"addon-sdk"},"_npmVersion":"11.12.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"jose":"^6.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.20.0","tsx":"^4.23.1","vite":"^8.1.4","eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","publint":"^0.3.21","prettier":"^3.9.5","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.20.1","ajv-draft-04":"^1.0.0","@types/express":"^5.0.6","typescript-eslint":"^8.64.0","@vitest/coverage-v8":"^4.1.10","@arethetypeswrong/cli":"^0.18.5","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/clockify-addon-sdk_1.3.0_1786295237627_0.7130561713967831","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@apet97/clockify-addon-sdk","version":"1.3.1","description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"license":"MIT","publishConfig":{"access":"public"},"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/apet97/addon-ts-sdk.git","directory":"addon-sdk"},"homepage":"https://github.com/apet97/addon-ts-sdk#readme","bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"engines":{"node":">=22.13.0"},"sideEffects":false,"type":"commonjs","main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.js"}},"./clockify":{"import":{"types":"./dist/esm/clockify/index.d.ts","default":"./dist/esm/clockify/index.js"},"require":{"types":"./dist/cjs/clockify/index.d.cts","default":"./dist/cjs/clockify/index.js"}},"./client":{"import":{"types":"./dist/esm/client/index.d.ts","default":"./dist/esm/client/index.js"},"require":{"types":"./dist/cjs/client/index.d.cts","default":"./dist/cjs/client/index.js"}},"./ui":{"import":{"types":"./dist/esm/ui/index.d.ts","default":"./dist/esm/ui/index.js"},"require":{"types":"./dist/cjs/ui/index.d.cts","default":"./dist/cjs/ui/index.js"}},"./adapters":{"import":{"types":"./dist/esm/adapters/index.d.ts","default":"./dist/esm/adapters/index.js"},"require":{"types":"./dist/cjs/adapters/index.d.cts","default":"./dist/cjs/adapters/index.js"}},"./adapters/fetch":{"import":{"types":"./dist/esm/adapters/fetch.d.ts","default":"./dist/esm/adapters/fetch.js"},"require":{"types":"./dist/cjs/adapters/fetch.d.cts","default":"./dist/cjs/adapters/fetch.js"}},"./adapters/node":{"import":{"types":"./dist/esm/adapters/node-http.d.ts","default":"./dist/esm/adapters/node-http.js"},"require":{"types":"./dist/cjs/adapters/node-http.d.cts","default":"./dist/cjs/adapters/node-http.js"}},"./adapters/express":{"import":{"types":"./dist/esm/adapters/express.d.ts","default":"./dist/esm/adapters/express.js"},"require":{"types":"./dist/cjs/adapters/express.d.cts","default":"./dist/cjs/adapters/express.js"}},"./testing":{"import":{"types":"./dist/esm/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/cjs/testing/index.d.cts","default":"./dist/cjs/testing/index.js"}},"./schemas/clockify-manifests/provenance.json":"./schemas/clockify-manifests/provenance.json","./schemas/clockify-manifests/*.json":"./schemas/clockify-manifests/*.json"},"scripts":{"generate":"tsx scripts/generate-clockify-manifest.ts","type-check":"tsc -p tsconfig.typecheck.json","verify:generated":"node scripts/verify-schema-provenance.cjs && node scripts/verify-generated.cjs","verify:schema-live":"node scripts/verify-live-schemas.mjs","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","build":"npm run clean && npm run generate && tsc -p tsconfig.esm.json && node scripts/fix-esm-extensions.cjs && tsc -p tsconfig.cjs.json && node scripts/finalize-cjs.js && node scripts/fix-cjs-declarations.cjs","verify:public-api":"node scripts/verify-public-api.cjs","verify:dist":"node scripts/verify-dist.mjs","verify:package-lint":"node scripts/verify-package-lint.mjs","verify:package-consumer":"node scripts/verify-package-consumer.mjs","dev:clockify-local":"tsx scripts/dev-clockify-local.ts","test:replay":"vitest run tests/clockify-local-replay.test.ts","verify:fast":"npm run type-check && npm run verify:generated && npm run test:replay && npm run build && npm run verify:dist","test":"vitest run","test:coverage":"vitest run --coverage","lint":"eslint .","format:check":"prettier . --check","prepack":"npm run type-check && npm run verify:generated && npm run test && npm run lint && npm run format:check && npm run build && npm run verify:public-api && npm run verify:dist"},"peerDependencies":{"express":"^4.17.0 || ^5.0.0"},"peerDependenciesMeta":{"express":{"optional":true}},"devDependencies":{"@arethetypeswrong/cli":"^0.18.5","@eslint/js":"^10.0.1","@types/express":"^5.0.6","@types/node":"^22.20.1","@vitest/coverage-v8":"^4.1.11","ajv":"^8.20.0","ajv-draft-04":"^1.0.0","eslint":"^10.8.1","eslint-config-prettier":"^10.1.8","express":"^5.2.1","prettier":"^3.9.6","publint":"^0.3.24","tsx":"^4.23.12","typescript":"^6.0.3","typescript-eslint":"^8.67.0","vite":"^8.2.2","vitest":"^4.1.10"},"dependencies":{"jose":"^6.2.12"},"gitHead":"7864b479cb69dc3e5d54191f9f59a28c85bf618b","_id":"@apet97/clockify-addon-sdk@1.3.1","_nodeVersion":"26.0.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-8f4/JT1vjASicAGAFZS7eg5f6rX3xfScQi1GhRXNC8ENPfZ1S7kEoal7Qy6IQy2Nm3fny0B1td2ZTof2HXB03A==","shasum":"337fe45f49d056ca2291603e1d8bdfc3b520f4c0","tarball":"https://registry.npmjs.org/@apet97/clockify-addon-sdk/-/clockify-addon-sdk-1.3.1.tgz","fileCount":245,"unpackedSize":2742071,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFNI8h66FcPm98Bvz+SS2gQXHGVyWjVyw6q1+haTxHHjAiEAh4BGJ/XpoMM4gvmGQgS+DqUkQLibxguYannNkmuEflw="}]},"_npmUser":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"directories":{},"maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/clockify-addon-sdk_1.3.1_1788696232006_0.3692632161680558"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-12T03:58:26.057Z","modified":"2026-09-06T12:03:52.328Z","1.0.0":"2026-07-12T03:58:26.316Z","1.0.1":"2026-07-12T04:52:10.524Z","1.0.2":"2026-07-13T17:24:20.984Z","1.0.3":"2026-07-14T02:07:44.262Z","1.0.4":"2026-07-14T04:19:40.865Z","1.0.5":"2026-07-14T10:18:10.404Z","1.1.0":"2026-08-07T18:06:54.552Z","1.2.0":"2026-08-07T20:19:53.816Z","1.3.0":"2026-08-09T17:07:17.822Z","1.3.1":"2026-09-06T12:03:52.156Z"},"bugs":{"url":"https://github.com/apet97/addon-ts-sdk/issues"},"author":{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"},"license":"MIT","homepage":"https://github.com/apet97/addon-ts-sdk#readme","keywords":["clockify","addon","add-on","sdk","typescript","manifest","webhook"],"repository":{"type":"git","url":"git+https://github.com/apet97/addon-ts-sdk.git","directory":"addon-sdk"},"description":"TypeScript SDK for building Clockify add-on servers: manifest builders, request router, runtime adapters, and RS256 webhook-signature verification.","maintainers":[{"name":"apet97","email":"petkovic.aleksandar037@gmail.com"}],"readme":"# @apet97/clockify-addon-sdk\n\nA TypeScript SDK for the server side of a Clockify add-on: typed manifest builders, a request\nrouter, runtime adapters, Clockify request verification, installation storage contracts, and\nMarketplace-specific client helpers.\n\n> Independent, unofficial project. Not affiliated with, endorsed by, or supported by Clockify or\n> CAKE.com. \"Clockify\" is referenced only to describe what this library is compatible with.\n\nIt builds and serves an add-on manifest, routes the requests Clockify sends to it, and verifies\ncomponent, lifecycle, and webhook context. `ClockifyAddonClient` handles add-on token exchange,\nsettings, and authenticated transport; the package is not a general Clockify entity REST SDK.\n\n## Install\n\nInstall the public package from npm:\n\n```bash\nnpm install @apet97/clockify-addon-sdk\n```\n\nNode 22.13.0+. Ships ESM and CommonJS builds with type declarations.\n\n## Imports\n\nThe root entry point is runtime-neutral and supports both ESM and CommonJS:\n\n```typescript\nimport { ClockifyAddon, ClockifyManifest } from \"@apet97/clockify-addon-sdk\";\nimport { ClockifyAddonClient } from \"@apet97/clockify-addon-sdk/client\";\n```\n\n```javascript\nconst { ClockifyAddon, ClockifyManifest } = require(\"@apet97/clockify-addon-sdk\");\nconst { ClockifyAddonClient } = require(\"@apet97/clockify-addon-sdk/client\");\n```\n\nImport host integrations from the granular subpath for the runtime you use:\n\n| Import path                                   | Purpose                                  |\n| --------------------------------------------- | ---------------------------------------- |\n| `@apet97/clockify-addon-sdk/clockify`         | Clockify builders, models, and verifiers |\n| `@apet97/clockify-addon-sdk/client`           | `ClockifyAddonClient`                    |\n| `@apet97/clockify-addon-sdk/ui`               | Browser bridge and preference helpers    |\n| `@apet97/clockify-addon-sdk/adapters/node`    | Node `http` adapter                      |\n| `@apet97/clockify-addon-sdk/adapters/express` | Express adapter                          |\n| `@apet97/clockify-addon-sdk/adapters/fetch`   | Standard Fetch adapter                   |\n| `@apet97/clockify-addon-sdk/testing`          | Test keys and signed-token helpers       |\n\n### Contributing or testing unreleased changes\n\nUse the repository checkout when contributing or testing a change that has not been released:\n\n```bash\n# Clone the source repository.\ngit clone https://github.com/apet97/addon-ts-sdk.git\ncd addon-ts-sdk\nnpm ci\n\n# Verify and inspect the package contents without leaving a tarball.\nnpm run ci:verify\nnpm pack --dry-run -w @apet97/clockify-addon-sdk\n\n# When another local project needs an unreleased package, create and install a tarball intentionally.\ncd addon-sdk\nnpm pack\nnpm install \"/absolute/path/to/apet97-clockify-addon-sdk-<version>.tgz\"\n```\n\nDo not use the repo-root Git URL as an npm package dependency: npm installs the private workspace\nroot rather than this SDK package. Pack a tarball from `addon-sdk/` when another project needs to\nconsume unreleased code.\n\n## Quick start\n\n```typescript\nimport {\n  ClockifyAddon,\n  ClockifyManifest,\n  ClockifyComponent,\n  createClockifySignatureParser,\n  isClockifyAdminRole,\n  verifyClockifyComponentRequest,\n} from \"@apet97/clockify-addon-sdk\";\nimport { createNodeHttpAddonServer } from \"@apet97/clockify-addon-sdk/adapters/node\";\n\n// 1. Build the manifest using the versioned builder\nconst manifest = ClockifyManifest.v1_5Builder()\n  .key(\"my-clockify-addon\")\n  .name(\"My Add-on\")\n  .baseUrl(\"https://example.com/addon\")\n  .requireBasicPlan()\n  .build();\n\n// 2. Initialize the addon\nconst addon = new ClockifyAddon(manifest);\nconst parser = createClockifySignatureParser(\"my-clockify-addon\");\n\n// 3. Register a component and verify Clockify's signed auth_token on every request\naddon.registerComponent(\n  ClockifyComponent.v1_5Builder()\n    .activityTab()\n    .allowAdmins()\n    .path(\"/component\")\n    .label(\"Activity Tab\")\n    .build(),\n  async (request) => {\n    const verification = await verifyClockifyComponentRequest(parser, request);\n    if (!verification.ok) {\n      return { status: 401, body: \"Unauthorized\" };\n    }\n    if (!isClockifyAdminRole(verification.claims.workspaceRole)) {\n      return { status: 403, body: \"Admins only\" };\n    }\n\n    return {\n      status: 200,\n      headers: { \"content-type\": \"text/html\" },\n      body: \"<html><body>Hello Clockify!</body></html>\",\n    };\n  },\n);\n\n// 4. Start the server\nconst server = createNodeHttpAddonServer(addon);\nserver.listen(8080, () => {\n  console.log(\"Addon server running on port 8080\");\n});\n```\n\nClockify fetches `${baseUrl}/manifest` over public HTTPS — it cannot reach `localhost`. During\ndevelopment, expose your server with a tunnel (`npx ngrok http 8080` or\n`npx cloudflared tunnel --url http://localhost:8080`) and use the printed tunnel URL as `baseUrl`.\n\n## Product surface\n\n- **Manifest builders** for schema versions 1.2–1.6. Required fields are enforced at the type\n  level: the chain will not expose `.build()` until every required step is set.\n- **Router** that serves `/manifest`, trims one trailing slash before matching, returns 404 when no\n  route owns a path, returns 405 with `Allow` when the path exists for another method, and contains\n  handler failures as 500 responses.\n- **Clockify token helpers** — built-in platform public key, parser factory, RS256 JWT\n  verification, component `auth_token` and lifecycle-header helpers, admin-role checks, and\n  environment URL normalization.\n- **Verified handler wrappers** that compose the token helpers into small route handlers returning\n  `401 Unauthorized` for failed component, lifecycle, installed lifecycle, and webhook checks.\n- **Lifecycle payload guards** that validate documented lifecycle bodies and narrow verified claims\n  before persisting installation or webhook-token data, plus stable webhook-path normalization for\n  storage and lookup.\n- **Structured setting helpers** for common setting types, keeping value types paired with\n  `TXT`, `NUMBER`, `CHECKBOX`, `LINK`, dropdown, and user dropdown settings.\n- **Adapters** for Node `http`, Express, and the Fetch API (Hono, Cloudflare Workers, Bun, Deno).\n- **`ClockifyAddonClient`** for add-on token exchange, structured settings, and authenticated\n  server-side requests with encoded path/query input and `X-Addon-Token`, with fail-closed redirect\n  handling.\n\n## Node and Express runtimes\n\nThe quick start uses `createNodeHttpAddonServer` from the Node-only adapter subpath. It applies the\nSDK's request-body limit before dispatch and leaves process startup with the application.\n\nExpress applications use the structurally typed optional adapter and configure their own body\nparser limit:\n\n```typescript\nimport express from \"express\";\nimport { createExpressAddonHandler } from \"@apet97/clockify-addon-sdk/adapters/express\";\n\nconst app = express();\napp.use(express.json({ limit: \"1mb\" }));\napp.use(createExpressAddonHandler(addon));\n```\n\n## Fetch and edge runtimes\n\n`handleFetchRequest()` adapts the framework-free router to standard Fetch `Request` and `Response`\nobjects. In Hono, Cloudflare Workers, Bun, Deno, or another Fetch-compatible runtime, keep the addon\ninstance outside the request callback and pass each incoming request through the adapter:\n\n```typescript\nimport { Hono } from \"hono\";\nimport { ClockifyAddon, ClockifyManifest } from \"@apet97/clockify-addon-sdk\";\nimport { handleFetchRequest } from \"@apet97/clockify-addon-sdk/adapters/fetch\";\n\nconst manifest = ClockifyManifest.v1_5Builder()\n  .key(\"edge-addon\")\n  .name(\"Edge Add-on\")\n  .baseUrl(\"https://example.com/addon\")\n  .requireBasicPlan()\n  .build();\n\nconst addon = new ClockifyAddon(manifest);\nconst app = new Hono();\n\napp.all(\"*\", (c) => handleFetchRequest(addon, c.req.raw));\n```\n\nFor a plain Fetch handler, return `handleFetchRequest(addon, request)` from `fetch(request)`.\n\n### Cloudflare Workers support\n\nCloudflare Workers is a tested runtime: the `workers-compat/` CI gate runs the published package\nshape inside workerd on every push, covering the Fetch adapter, manifest serving, and RS256\nsignature verification. The SDK uses only Web APIs on this path (Fetch, WebCrypto through `jose`),\nso **no `nodejs_compat` compatibility flag is required**. The Node and Express adapters live on\nseparate subpaths and never enter a Worker bundle.\n\n## Testing helpers\n\nThe `@apet97/clockify-addon-sdk/testing` subpath exports `generateTestKeys()` and `signTestToken()`\nfor signing RS256 add-on JWTs in your own tests, so you can exercise the verification helpers without\na live Clockify environment:\n\n```typescript\nimport { ClockifySignatureParser } from \"@apet97/clockify-addon-sdk\";\nimport { generateTestKeys, signTestToken } from \"@apet97/clockify-addon-sdk/testing\";\n\nconst { privateKey, publicKey } = await generateTestKeys();\nconst token = await signTestToken(privateKey, \"my-addon-key\", { workspaceId: \"w-1\" });\n\nconst claims = await new ClockifySignatureParser(\"my-addon-key\", publicKey).parseClaims(token);\n```\n\n## Complete toolkit\n\n- `validateClockifyManifest()` validates runtime objects against the embedded draft-04 schemas.\n- `createClockifyHtmlResponse()` and `createClockifyJsonResponse()` apply the browser response\n  security baseline.\n- `ClockifyAddonClient` provides claim-driven token exchange and structured-settings transport.\n- Installation-store encryption and webhook idempotency leases cover server credential workflows.\n  Generation-aware deletion applies only when the caller supplies `installedAt`; the documented\n  Clockify `DELETED` payload has no generation, so unqualified cleanup is unconditional.\n- `@apet97/clockify-addon-sdk/ui` provides exact-origin iframe messaging, admin-role checks, theme,\n  language, and date helpers.\n- `create-clockify-addon` scaffolds Node or Worker projects that fail closed until production origin,\n  parent-origin, persistence and webhook processing are configured.\n\n## Snippets\n\n`snippets/*` are copy-in reference code, not standalone runnable projects — each imports `../../src`\ndirectly and has no `package.json` of its own. Copy the file you need into a project that depends on\n`@apet97/clockify-addon-sdk` and adjust the import path. This package's own test suite and\n`npm run dev:clockify-local` run them in place, inside this repository, as regression coverage; that\nin-repo execution is not a claim that the files work unmodified outside it.\n\n## Local Clockify replay\n\nRun the secure example as a local Clockify emulator/playground:\n\n```bash\nnpm run dev:clockify-local\n```\n\nThe command boots `snippets/secure-server`, generates fake signed test tokens with the SDK testing\nhelpers, replays manifest/component/lifecycle/webhook requests, prints the status transcript, and\nthen keeps the server running for manual inspection. For automation, use:\n\n```bash\nnpm run dev:clockify-local -- --once\nnpm run verify:fast\n```\n\nThe replay uses local-only keys and tokens. It does not call Clockify and does not produce usable\nClockify credentials.\n\n## Schema versions\n\n1.2–1.4 are ported from the Clockify add-on Java SDK; 1.5 and 1.6 are taken from the live schema\nendpoint (`GET https://developer.clockify.me/api/addons/manifest-schema?version=1.6`, also served\nidentically from `api.clockify.me`). Schema 1.6 is additive over 1.5 — one new webhook event and one\nnew component type, no changed or removed fields. The copies vendored under\n`schemas/clockify-manifests/` are structurally identical to those sources, and the generated\nbuilders are reproducible from them. Run `npm run verify:schema-live` manually when you want to\ncompare the vendored schemas against Clockify's live endpoint.\n\nThe packaged tarball intentionally exposes the vendored schema JSON files. ESM consumers can\nimport a schema or the provenance file directly:\n\n```typescript\nimport manifestSchema15 from \"@apet97/clockify-addon-sdk/schemas/clockify-manifests/1.5.json\" with { type: \"json\" };\nimport schemaProvenance from \"@apet97/clockify-addon-sdk/schemas/clockify-manifests/provenance.json\" with { type: \"json\" };\n\nconsole.log(manifestSchema15.version);\nconsole.log(schemaProvenance.supportedVersions);\n```\n\nThese direct JSON imports are untyped data (`any`) — no `.d.ts` is generated for them. For a typed\nmanifest shape, use the generated TS models (`ClockifyManifest`, `ClockifyManifest.v1_5Builder()`,\netc.) instead of reading the schema JSON directly.\n\n## Documentation\n\n- [Builder getting started](https://github.com/apet97/addon-ts-sdk/blob/main/docs/getting-started.md)\n- [Complete add-on lifecycle](https://github.com/apet97/addon-ts-sdk/blob/main/docs/how-an-addon-works.md)\n- [Installation and storage](https://github.com/apet97/addon-ts-sdk/blob/main/docs/guides/installation-and-storage.md)\n- [Components and UI](https://github.com/apet97/addon-ts-sdk/blob/main/docs/guides/components-and-ui.md)\n- [Webhooks and idempotency](https://github.com/apet97/addon-ts-sdk/blob/main/docs/guides/webhooks-and-idempotency.md)\n- [Calling Clockify](https://github.com/apet97/addon-ts-sdk/blob/main/docs/guides/calling-clockify.md)\n- [Java Migration Guide](./docs/java-migration.md)\n- [API Reference](./docs/api-reference.md)\n- [Manifest Builders](./docs/manifest-builders.md)\n- [Routing and Middleware](./docs/routing.md)\n- [Token Signature Validation](./docs/token-validation.md)\n- [Secure Server Recipe](./docs/secure-server-recipe.md)\n- [Dependency Strategy](./docs/dependency-strategy.md)\n","readmeFilename":"README.md"}