{"_id":"@diabolicallabs/notion","_rev":"3-aba08732d5079107fcbc0c1c724d09f5","name":"@diabolicallabs/notion","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.1":{"name":"@diabolicallabs/notion","version":"0.0.1","author":{"url":"https://deeismail.com","name":"Diana Ismail","email":"diana@deeismail.com"},"license":"UNLICENSED","_id":"@diabolicallabs/notion@0.0.1","maintainers":[{"name":"shackled78","email":"shackled78@gmail.com"}],"homepage":"https://github.com/mannism/dlabs-toolkit#readme","bugs":{"url":"https://github.com/mannism/dlabs-toolkit/issues"},"dist":{"shasum":"b1f95cf2fc0bead10a96151e4766d95e0a51b209","tarball":"https://registry.npmjs.org/@diabolicallabs/notion/-/notion-0.0.1.tgz","fileCount":5,"integrity":"sha512-Z7KmFfy0WO8YKTPxTlm4u8tkPxgFV1AATdJd0dyVN5OwQhgSqJO4UAyUFQfgG8nlpHv77XBdEYeOFxiZBja4qQ==","signatures":[{"sig":"MEYCIQCPyTGRNJKFzYlpERbvN2bGtPx34HTq4MQI4Hg2y6t4EgIhANvICu8nXM6J91WFViWaLBdldptHkNzzR2QMgJhbMGt+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7336},"main":"./dist/index.js","type":"module","_from":"file:diabolicallabs-notion-0.0.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"biome check ./src && eslint ./src","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"shackled78","email":"shackled78@gmail.com"},"_resolved":"/tmp/0839e108852cb16db615c33cc10c3b5d/diabolicallabs-notion-0.0.1.tgz","publisher":"Diabolical Labs","_integrity":"sha512-Z7KmFfy0WO8YKTPxTlm4u8tkPxgFV1AATdJd0dyVN5OwQhgSqJO4UAyUFQfgG8nlpHv77XBdEYeOFxiZBja4qQ==","repository":{"url":"git+https://github.com/mannism/dlabs-toolkit.git","type":"git","directory":"packages/notion"},"_npmVersion":"10.8.2","description":"Notion REST API helpers — database page creation, property serialization, conflict retry, rate-limit backoff. © Diabolical Labs","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^4.1.5","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/notion_0.0.1_1778050952837_0.362529684069937","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@diabolicallabs/notion","version":"0.0.2","author":{"url":"https://deeismail.com","name":"Diana Ismail","email":"diana@deeismail.com"},"license":"MIT","_id":"@diabolicallabs/notion@0.0.2","maintainers":[{"name":"shackled78","email":"shackled78@gmail.com"}],"homepage":"https://github.com/mannism/dlabs-toolkit#readme","bugs":{"url":"https://github.com/mannism/dlabs-toolkit/issues"},"dist":{"shasum":"3f08085cfb95110e198360139fe010975f3697c6","tarball":"https://registry.npmjs.org/@diabolicallabs/notion/-/notion-0.0.2.tgz","fileCount":6,"integrity":"sha512-JKllX5y5CSpKHP7jcWB2ZCFx4LrWI1UXQdH4JVtBD5tlqIqfJWlL3oJGWIUQY4DDsd4Qg6KUy9TWDEpfThk1ug==","signatures":[{"sig":"MEUCIQCBit+PsoAqsWuzcrQngVUx4CQF/sIN9iiGpe1WrkeA7QIgOLPdpgRrTrMbUPyA6ZciwmYRixVKCqK3+6d6WjTQyks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8425},"main":"./dist/index.js","type":"module","_from":"file:diabolicallabs-notion-0.0.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"biome check ./src && eslint ./src","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"shackled78","email":"shackled78@gmail.com"},"_resolved":"/tmp/f3d91c43ca2426ed3b73e5b0a5168b4c/diabolicallabs-notion-0.0.2.tgz","publisher":"Diabolical Labs","_integrity":"sha512-JKllX5y5CSpKHP7jcWB2ZCFx4LrWI1UXQdH4JVtBD5tlqIqfJWlL3oJGWIUQY4DDsd4Qg6KUy9TWDEpfThk1ug==","repository":{"url":"git+https://github.com/mannism/dlabs-toolkit.git","type":"git","directory":"packages/notion"},"_npmVersion":"10.8.2","description":"Notion REST API helpers — database page creation, property serialization, conflict retry, rate-limit backoff. © Diabolical Labs","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^4.1.5","@vitest/coverage-v8":"^4.1.5"},"_npmOperationalInternal":{"tmp":"tmp/notion_0.0.2_1778059931825_0.04727716229269974","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@diabolicallabs/notion","version":"1.0.0","description":"Notion REST API helpers — database page creation, property serialization, conflict retry, rate-limit backoff. © Diabolical Labs","author":{"name":"Diana Ismail","email":"diana@deeismail.com","url":"https://deeismail.com"},"publisher":"Diabolical Labs","license":"MIT","type":"module","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"main":"./dist/index.js","types":"./dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/mannism/dlabs-toolkit.git","directory":"packages/notion"},"homepage":"https://github.com/mannism/dlabs-toolkit#readme","bugs":{"url":"https://github.com/mannism/dlabs-toolkit/issues"},"engines":{"node":">=20"},"devDependencies":{"@types/node":"^25.9.0","@vitest/coverage-v8":"^4.1.6","msw":"^2.14.6","tsup":"^8.3.5","vitest":"^4.1.6"},"dependencies":{"@notionhq/client":"^5.22.0"},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","lint":"biome check ./src && eslint ./src","test":"vitest run","test:watch":"vitest"},"_id":"@diabolicallabs/notion@1.0.0","_integrity":"sha512-KLd1V2fe5llScwlxv9LQY5V1V3xCQgdUcpjl7U1uTMDBWvy5ijekd/8oSs+UCr7HpfOipkM/1oQTcw7WZkckWg==","_resolved":"/tmp/6231bf9f1e03d91f8ab3f6c990aabc98/diabolicallabs-notion-1.0.0.tgz","_from":"file:diabolicallabs-notion-1.0.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-KLd1V2fe5llScwlxv9LQY5V1V3xCQgdUcpjl7U1uTMDBWvy5ijekd/8oSs+UCr7HpfOipkM/1oQTcw7WZkckWg==","shasum":"d8a7b7dcbba9a809e20acbf2bdf870b7aa874d90","tarball":"https://registry.npmjs.org/@diabolicallabs/notion/-/notion-1.0.0.tgz","fileCount":6,"unpackedSize":54910,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDePorya5YkjcqLakbRucqGf5+WGquCx/ofKZB3ttpxGQIhAOqlPTzwGi6242skN6TvwnI3rTD1qBlrwCwkrB/6TF5O"}]},"_npmUser":{"name":"shackled78","email":"shackled78@gmail.com"},"directories":{},"maintainers":[{"name":"shackled78","email":"shackled78@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/notion_1.0.0_1779586990306_0.6521779803263039"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-06T07:02:32.721Z","modified":"2026-05-24T01:43:10.586Z","0.0.1":"2026-05-06T07:02:32.971Z","0.0.2":"2026-05-06T09:32:12.020Z","1.0.0":"2026-05-24T01:43:10.450Z"},"bugs":{"url":"https://github.com/mannism/dlabs-toolkit/issues"},"author":{"name":"Diana Ismail","email":"diana@deeismail.com","url":"https://deeismail.com"},"license":"MIT","homepage":"https://github.com/mannism/dlabs-toolkit#readme","repository":{"type":"git","url":"git+https://github.com/mannism/dlabs-toolkit.git","directory":"packages/notion"},"description":"Notion REST API helpers — database page creation, property serialization, conflict retry, rate-limit backoff. © Diabolical Labs","maintainers":[{"name":"shackled78","email":"shackled78@gmail.com"}],"readme":"# @diabolicallabs/notion\n\nNotion database client — page creation, querying, updates, property serialization, conflict retry, and a named error taxonomy. © Diabolical Labs\n\n## Install\n\n```bash\npnpm add @diabolicallabs/notion\n```\n\n## Usage\n\n```typescript\nimport { createNotionClientFromEnv } from '@diabolicallabs/notion';\n\n// Reads NOTION_API_KEY from environment\nconst notion = createNotionClientFromEnv();\n\n// Create a database page\nconst page = await notion.createDatabasePage('your-database-id', {\n  Name: { type: 'title', content: 'My Page' },\n  Status: { type: 'select', name: 'Active' },\n  Score: { type: 'number', value: 42 },\n  Published: { type: 'date', start: '2026-05-03' },\n});\n\n// Query a database (auto-paginated)\nconst pages = await notion.queryDatabase('your-database-id', {\n  filter: { property: 'Status', select: { equals: 'Active' } },\n  sorts: [{ property: 'Name', direction: 'ascending' }],\n});\n\n// Get a single page\nconst retrieved = await notion.getPage(page.id);\n\n// Update properties\nawait notion.updatePage(page.id, {\n  Status: { type: 'select', name: 'Archived' },\n});\n```\n\n## API\n\n### `createNotionClient(config): NotionClient`\n\nCreates a client with explicit config.\n\n```typescript\ninterface NotionClientConfig {\n  apiKey: string;\n  notionVersion?: string;    // default: '2025-09-03'\n  timeoutMs?: number;        // default: 30_000\n  maxRetries?: number;       // default: 3\n  retryDelayMs?: number;     // base delay for conflict retry; default: 500\n  logger?: Logger;\n}\n```\n\n### `createNotionClientFromEnv(overrides?): NotionClient`\n\nReads `NOTION_API_KEY` (or `NOTION_TOKEN` as a legacy alias) from the environment. Throws `NotionValidationError` synchronously if absent.\n\n### `setNotionLogger(logger: Logger): void`\n\nOverride the module-level logger. Default: structured JSON to stdout.\n\n### `NotionClient` interface\n\n| Method | Description |\n|---|---|\n| `createDatabasePage(databaseId, properties)` | Create a page in a Notion database |\n| `queryDatabase(databaseId, options?)` | Query a database — auto-paginated |\n| `getPage(pageId)` | Retrieve a single page by ID |\n| `updatePage(pageId, properties)` | Update page properties |\n\n### Property types\n\nSupported `NotionPropertyValue` variants:\n\n```typescript\ntype NotionPropertyValue =\n  | { type: 'title'; content: string }\n  | { type: 'rich_text'; content: string }\n  | { type: 'number'; value: number }\n  | { type: 'select'; name: string }\n  | { type: 'multi_select'; names: string[] }\n  | { type: 'date'; start: string; end?: string }\n  | { type: 'checkbox'; checked: boolean }\n  | { type: 'url'; url: string }\n  | { type: 'email'; email: string }\n  | { type: 'phone_number'; phone_number: string }\n  | { type: 'relation'; pageIds: string[] }\n  | { type: 'status'; name: string };\n```\n\n### Error taxonomy\n\nAll errors extend `NotionError`. Import by name for `instanceof` checks.\n\n```typescript\nimport {\n  NotionError,\n  NotionAuthError,       // 401, 403\n  NotionNotFoundError,   // 404\n  NotionValidationError, // 400, missing env var\n  NotionRateLimitError,  // 429\n  NotionConflictError,   // 409 conflict_error\n  NotionUnavailableError // 500, 503, timeout, network\n} from '@diabolicallabs/notion';\n```\n\n## Retry behavior\n\n- `conflict_error` (concurrent writes): retried with full-jitter exponential backoff. Transparent to caller.\n- HTTP 429 (rate limited): retried after backoff. Transparent to caller.\n- HTTP 401 (invalid API key): throws `NotionAuthError` immediately.\n- Authorization header is stripped from all error logs — the API key is never logged.\n\n## Implementation notes\n\nWraps `@notionhq/client` v5 with Notion-Version `2025-09-03`. Uses `dataSources.query` (v5 API). Auto-pagination via `collectPaginatedAPI`.\n","readmeFilename":"README.md"}