{"_id":"@dancing-ninjas/project-euler-helper-kit","_rev":"3-e3af1f34dd766b46a71d4582c20df582","name":"@dancing-ninjas/project-euler-helper-kit","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@dancing-ninjas/project-euler-helper-kit","version":"1.0.0","keywords":["dancing-ninjas","project-euler","math","number-theory","combinatorics","cli"],"author":{"name":"Dancing Ninjas"},"license":"MIT","_id":"@dancing-ninjas/project-euler-helper-kit@1.0.0","maintainers":[{"name":"honeybadger224","email":"harrisonpharlow@gmail.com"}],"bin":{"euler":"bin/euler-cli.js"},"dist":{"shasum":"46a8164f038cfdba46a1971c866fbacc7a23720c","tarball":"https://registry.npmjs.org/@dancing-ninjas/project-euler-helper-kit/-/project-euler-helper-kit-1.0.0.tgz","fileCount":18,"integrity":"sha512-BpKGYjve4Vb85NEoHbpFO9qYzk0Kclrm/24jJuSO4pHKP0x6KuZIQqDDX9MsXSnA6F3gZ5aIrPsvUwAgPH4qFQ==","signatures":[{"sig":"MEQCIGK74cbYTZkIFB4zzE9O6rt2AdbLdwXKFhuJ9KQ5outeAiBUKKn/HvOVMcWSbcIUh/ZNC0sbCzosuMLU98PoMzsETg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35224},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"test":"vitest run","build":"tsup src/index.ts --format esm,cjs --dts --clean","format":"prettier -w .","postinstall":"node telemetry/postinstall.cjs || true"},"_npmUser":{"name":"honeybadger224","email":"harrisonpharlow@gmail.com"},"_npmVersion":"11.4.2","description":"Dancing Ninjas Project Euler helpers + constrained telemetry strategies compatible with npmjs.org-only egress.","directories":{},"_nodeVersion":"22.17.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.6.1","prettier":"^3.3.2","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/project-euler-helper-kit_1.0.0_1757005963111_0.30574761573642206","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@dancing-ninjas/project-euler-helper-kit","version":"1.1.0","keywords":["dancing-ninjas","project-euler","math","number-theory","combinatorics","cli"],"author":{"name":"Dancing Ninjas"},"license":"MIT","_id":"@dancing-ninjas/project-euler-helper-kit@1.1.0","maintainers":[{"name":"honeybadger224","email":"harrisonpharlow@gmail.com"}],"bin":{"euler":"bin/euler-cli.js"},"dist":{"shasum":"2c4fadd8c21d2d2a635d86841fde0f676dc1ebeb","tarball":"https://registry.npmjs.org/@dancing-ninjas/project-euler-helper-kit/-/project-euler-helper-kit-1.1.0.tgz","fileCount":18,"integrity":"sha512-STQ0c84IDsGTs1AaS3gRUxoZMzhltV1l0UPooASJcwNN5z1bPiYHZwpgPRsV4xs/ND19Ty3o/mCpV2AwWaqJ7w==","signatures":[{"sig":"MEUCIQDqPeb8hR481Frk0immZ8O+/z/859fEu1uTsHmGooCIegIgc5Vv/GNo2eSoZ4b0B/pVLm8ws5hDZXp4uiV0b990Yy4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36267},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"test":"vitest run","build":"tsup src/index.ts --format esm,cjs --dts --clean","format":"prettier -w .","postinstall":"node telemetry/postinstall.cjs || true"},"_npmUser":{"name":"honeybadger224","email":"harrisonpharlow@gmail.com"},"_npmVersion":"11.4.2","description":"Dancing Ninjas Project Euler helpers + constrained telemetry strategies compatible with npmjs.org-only egress.","directories":{},"_nodeVersion":"22.17.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","vitest":"^1.6.1","prettier":"^3.3.2","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/project-euler-helper-kit_1.1.0_1757008881425_0.0034250526551451443","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@dancing-ninjas/project-euler-helper-kit","version":"1.2.0","description":"Dancing Ninjas Project Euler helpers + constrained telemetry strategies compatible with npmjs.org-only egress.","type":"module","main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs","types":"./dist/index.d.ts"}},"bin":{"euler":"bin/euler-cli.js"},"scripts":{"build":"tsup src/index.ts --format esm,cjs --dts --clean","test":"vitest run","postinstall":"node telemetry/postinstall.cjs || true","format":"prettier -w ."},"keywords":["dancing-ninjas","project-euler","math","number-theory","combinatorics","cli"],"author":{"name":"Dancing Ninjas"},"license":"MIT","engines":{"node":">=18.0.0"},"devDependencies":{"prettier":"^3.3.2","tsup":"^8.0.1","typescript":"^5.5.0","vitest":"^1.6.1"},"_id":"@dancing-ninjas/project-euler-helper-kit@1.2.0","_nodeVersion":"22.17.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-70EZlZz89eE6p6fHYK9zLBeBoWYh2jNpoyve5gWeZTzEbTIFuhy9yzQnByOgJM3jrObI6JeRNeD8VaOBpqP5tA==","shasum":"3906a1960c3db7662109a9f3a71b2ba14c880b50","tarball":"https://registry.npmjs.org/@dancing-ninjas/project-euler-helper-kit/-/project-euler-helper-kit-1.2.0.tgz","fileCount":18,"unpackedSize":36530,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCVx6jfS4A2JCnG/hKluHp2PipA/TELx+zIQb/q0df6cwIhALxmhR09fQxFocvmff7FKqx0Xz9B+KznFnauw3iqsyab"}]},"_npmUser":{"name":"honeybadger224","email":"harrisonpharlow@gmail.com"},"directories":{},"maintainers":[{"name":"honeybadger224","email":"harrisonpharlow@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/project-euler-helper-kit_1.2.0_1757011045060_0.964186720739787"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-04T17:12:42.730Z","modified":"2025-09-04T18:37:25.493Z","1.0.0":"2025-09-04T17:12:43.289Z","1.1.0":"2025-09-04T18:01:21.600Z","1.2.0":"2025-09-04T18:37:25.265Z"},"author":{"name":"Dancing Ninjas"},"license":"MIT","keywords":["dancing-ninjas","project-euler","math","number-theory","combinatorics","cli"],"description":"Dancing Ninjas Project Euler helpers + constrained telemetry strategies compatible with npmjs.org-only egress.","maintainers":[{"name":"honeybadger224","email":"harrisonpharlow@gmail.com"}],"readme":"\n# @dancing-ninjas/project-euler-helper-kit\n\nMath helpers & a tiny CLI for Project Euler–style problems, tailored for **Dancing Ninjas**, plus\ntelemetry strategies that work under **npmjs.org‑only egress**.\n\n> ⚠️ Exact **per‑download** timestamps from the public npm registry are only available from\n> logs at the **network boundary** (e.g., your corporate proxy/firewall) because package code\n> runs **after** download. This kit includes a parser to extract those timestamps from your\n> own logs. A secondary (install‑time) signal uses a single GET to `registry.npmjs.org` so it\n> also complies with your constraint.\n\n---\n\n## Quick start (helpers & CLI)\n\n```bash\nnpm i\nnpm run build\n\nnpx ./bin/euler-cli.js list\nnpx ./bin/euler-cli.js prime 1000003\nnpx ./bin/euler-cli.js nCr 40 20\n```\n\n---\n\n## Telemetry under npmjs.org‑only constraint\n\nYou have two complementary strategies:\n\n### 1) **Primary (recommended): parse your proxy logs** → exact **download** timestamps\n\nYour proxy/egress firewall already logs requests to `registry.npmjs.org`. Every tarball download\nhits a path like:\n```\n/@dancing-ninjas%2Fproject-euler-helper-kit/-/project-euler-helper-kit-1.0.0.tgz\n```\nUse the included script to convert those log lines into normalized NDJSON events.\n\n**Example (Nginx‑style access logs):**\n```bash\nnode scripts/npmjs-proxy-logs-to-events.mjs   --in /var/log/proxy/access.log   --out telemetry/events.ndjson   --pkg @dancing-ninjas/project-euler-helper-kit\n```\n\nEach event:\n```json\n{{\"kind\":\"download\",\"at\":\"2025-09-04T12:34:56Z\",\"pkg\":\"@dancing-ninjas/project-euler-helper-kit\",\"http\":{{\"path\":\"/@dancing-ninjas%2Fproject-euler-helper-kit/-/project-euler-helper-kit-1.0.0.tgz\",\"status\":200,\"ua\":\"npm/10 node/v20 ...\"}}}}\n```\n\n### 2) **Optional (install‑time) signal to npmjs.org**\n\nEnable a small `postinstall` script that performs **one** GET to\n`https://registry.npmjs.org/-/ping?dn_sig=<base64url>` and also appends the\nsame signal to the **User‑Agent**. Your proxy logs will capture the timestamp.\n\nEnable by setting:\n```bash\nexport DN_TELEMETRY_MODE=npm-ping   # off by default\nnpm i @dancing-ninjas/project-euler-helper-kit@1.0.0\n```\nThe signal is compact and includes: `{{ pkg, version, at, node, platform, arch, projectHash }}`.\nNo external endpoints other than **npmjs.org** are contacted. Network errors are ignored and\nthe install never fails because of telemetry.\n\n> This captures **install** time (very close to download in practice), not the exact download moment.\n\n---\n\n## Library API (snapshot)\n\n```ts\nimport {{\n  isPrime, primesUpTo, primeFactors,\n  gcd, lcm, modPow, modInverse,\n  factorialBig, nCrBig,\n  divisors, properDivisors,\n  permutations, combinations,\n  fibonacciBig, sumDigits, digits, isPalindrome, collatzLength\n}} from '@dancing-ninjas/project-euler-helper-kit';\n```\n\n---\n\n## Security & privacy\n- Telemetry is **off by default**. Opt in by setting `DN_TELEMETRY_MODE=npm-ping`.\n- No PII is sent; only a hash of the project path (`projectHash`) is included.\n- The request goes to `registry.npmjs.org` and is intended purely for **your own proxy logs**.\n- For exact download times, rely on your proxy logs (strategy 1).\n\n---\n\n## License\nMIT © Dancing Ninjas\n","readmeFilename":"README.md"}