{"_id":"@bernierllc/content-soft-delete","_rev":"7-9a65744d755313b21324b35b963f7fbf","name":"@bernierllc/content-soft-delete","dist-tags":{"latest":"1.6.0"},"versions":{"1.0.0":{"name":"@bernierllc/content-soft-delete","version":"1.0.0","keywords":["soft-delete","content","deletion","restore","trash","retention","state-management"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-soft-delete@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools/tree/main/packages/core/content-soft-delete#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"a808b4c4f3ed6960fd442ac205f82bbef003e39c","tarball":"https://registry.npmjs.org/@bernierllc/content-soft-delete/-/content-soft-delete-1.0.0.tgz","fileCount":14,"integrity":"sha512-GEO1DwW/qD962O3xAC8M1vt8RAM+FLzyJmTHvjREUdAwCD4WSdZt7cxULZwzQLvsbvuJ1SYdXbyN132Wep70rA==","signatures":[{"sig":"MEYCIQCpHq+BVKcCSUt/0naulMv5xyHJXCQrR2Le312jOqGb5wIhAO1IoJ5e8ZMl8gkojHVjrxnjqBUQvqQ4C6qtpWOmxC4/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26267},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"e36471225e21fdcaddf9a54aaedaf6346ee0078c","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"bernierllc":{"integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"not-applicable"}},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/content-soft-delete"},"_npmVersion":"11.6.0","description":"Pure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration","directories":{},"_nodeVersion":"24.10.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-soft-delete_1.0.0_1762139640497_0.4795701448400944","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/content-soft-delete","version":"1.2.0","keywords":["soft-delete","content","deletion","restore","trash","retention","state-management"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-soft-delete@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools/tree/main/packages/core/content-soft-delete#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"3959008caad6f45b69cade442ba408eb122c173d","tarball":"https://registry.npmjs.org/@bernierllc/content-soft-delete/-/content-soft-delete-1.2.0.tgz","fileCount":14,"integrity":"sha512-cN7oV+6uNlDFh9zkdWTKcmwgVcM5+4ijlQf2vCIw07GP8ywjXLA0T8gjPUdGlOs4nTbZG7CB6gR1t2arXyZ1ZA==","signatures":[{"sig":"MEUCIQDIg7MJ5Ye84+uGrxkAFJoL6S/VO3RyT+x07vBCcE29HgIgfR4+pEpOIkvzD1KdXsUpxXikD0A3qf58UJarZWY2PL0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26349},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5e23e942-f82b-4557-8a7a-e6c223ac6f44"}},"bernierllc":{"integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"not-applicable"}},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/content-soft-delete"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Pure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-soft-delete_1.2.0_1767642290228_0.08581366531920942","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@bernierllc/content-soft-delete","version":"1.2.1","keywords":["soft-delete","content","deletion","restore","trash","retention","state-management"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-soft-delete@1.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools/tree/main/packages/core/content-soft-delete#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"6d8a77dd45518618239e607f227f93cc57886e09","tarball":"https://registry.npmjs.org/@bernierllc/content-soft-delete/-/content-soft-delete-1.2.1.tgz","fileCount":14,"integrity":"sha512-vPe2dMmjqr0mWiqompYMJPALDdaJYBFDRA9BonH8G2EBTPOhFIuq5+g9h3KCL/zOT+St04Fag5R7A+xFlEp+4w==","signatures":[{"sig":"MEQCIFHE8Yp8zLkbQPoyC/uEa4xM9HGj0ITgPlJF1+nW9logAiA3YanpLzmzIDAF5oBedwatOjKLuKdQPRW2jpuNx3YUAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26291},"main":"dist/index.js","_from":"file:bernierllc-content-soft-delete-1.2.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5e23e942-f82b-4557-8a7a-e6c223ac6f44"}},"_resolved":"/tmp/07da1a3119185b00a5003ce27b90d403/bernierllc-content-soft-delete-1.2.1.tgz","_integrity":"sha512-vPe2dMmjqr0mWiqompYMJPALDdaJYBFDRA9BonH8G2EBTPOhFIuq5+g9h3KCL/zOT+St04Fag5R7A+xFlEp+4w==","bernierllc":{"integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"not-applicable"}},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/content-soft-delete"},"_npmVersion":"11.11.0","description":"Pure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-soft-delete_1.2.1_1773077977314_0.9502543414192723","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bernierllc/content-soft-delete","version":"1.2.2","keywords":["soft-delete","content","deletion","restore","trash","retention","state-management"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-soft-delete@1.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools/tree/main/packages/core/content-soft-delete#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"97d4997c60928a28adeaa09215d852fa6bf5d6c7","tarball":"https://registry.npmjs.org/@bernierllc/content-soft-delete/-/content-soft-delete-1.2.2.tgz","fileCount":14,"integrity":"sha512-QfyFmCoT4W6lkKbuMzEnMeB+SbawUAC/IxitejLTVhLBmLFXEq4BL+GnB7VzQnSpt4tIsOfmw7SnBonFx0B4Vw==","signatures":[{"sig":"MEUCIAe3zFNoIvDSQi1UKcZc5oki9JZgXiTkZfP5csa8nSUEAiEAsJaM3qsHk7tWxjF8tQxe6vLvKyug8WQ9F851SwjPwDg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26291},"main":"dist/index.js","_from":"file:bernierllc-content-soft-delete-1.2.2.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5e23e942-f82b-4557-8a7a-e6c223ac6f44"}},"_resolved":"/tmp/2bd7472296e939c7c87bca0c81b2009c/bernierllc-content-soft-delete-1.2.2.tgz","_integrity":"sha512-QfyFmCoT4W6lkKbuMzEnMeB+SbawUAC/IxitejLTVhLBmLFXEq4BL+GnB7VzQnSpt4tIsOfmw7SnBonFx0B4Vw==","bernierllc":{"integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"not-applicable"}},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/content-soft-delete"},"_npmVersion":"11.11.0","description":"Pure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-soft-delete_1.2.2_1773081145530_0.4884459462867832","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/content-soft-delete","version":"1.4.0","keywords":["soft-delete","content","deletion","restore","trash","retention","state-management"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-soft-delete@1.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools/tree/main/packages/core/content-soft-delete#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"258aa5f1b7563c570ad795a62b06ada55ec2631f","tarball":"https://registry.npmjs.org/@bernierllc/content-soft-delete/-/content-soft-delete-1.4.0.tgz","fileCount":18,"integrity":"sha512-LPFrTnRqPdZlW+JG4kUVeLj2hda6hAA+GOzjzWwoHKL4D/SQN3P/tUZE2ZTKvIZBx/2VMKsmNUlb24JWTxY+0A==","signatures":[{"sig":"MEYCIQDM3kkJvTHPOleiLg324liLOdS6mYkKCZDrVnlQmvEvVwIhAJ4UnK6FjBt+5cynf5IYUnLLFD4Qjcg36+8qOK3v6G9U","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29632},"main":"dist/index.js","_from":"file:bernierllc-content-soft-delete-1.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5e23e942-f82b-4557-8a7a-e6c223ac6f44"}},"_resolved":"/home/runner/work/tools/tools/packages/core/content-soft-delete/bernierllc-content-soft-delete-1.4.0.tgz","_integrity":"sha512-LPFrTnRqPdZlW+JG4kUVeLj2hda6hAA+GOzjzWwoHKL4D/SQN3P/tUZE2ZTKvIZBx/2VMKsmNUlb24JWTxY+0A==","bernierllc":{"integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"not-applicable"}},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/content-soft-delete"},"_npmVersion":"11.14.1","description":"Pure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-soft-delete_1.4.0_1779233866407_0.6342890635094403","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bernierllc/content-soft-delete","version":"1.5.0","keywords":["soft-delete","content","deletion","restore","trash","retention","state-management"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/content-soft-delete@1.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/BernierLLC/tools/tree/main/packages/core/content-soft-delete#readme","bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"dist":{"shasum":"07fa1b6f180bd9ac3b1c54190828662046843d22","tarball":"https://registry.npmjs.org/@bernierllc/content-soft-delete/-/content-soft-delete-1.5.0.tgz","fileCount":18,"integrity":"sha512-7ulwXCI6xKTL4VKQAaQLoMDF0KsrKW60Nl7AIs+OK/Yi8epkETsAv1WwpcanM8ODGJMYHUIZl31LyU4aYuwALg==","signatures":[{"sig":"MEUCIQC9dGy0h5dnDI7Rv0L27DIE1L9fAdAfjBduBFeH5lnX8wIgRCxW7fo+L3omLiFeOghQrsueSpIJ2mZ8RMJXpUxQmCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29632},"main":"dist/index.js","_from":"file:bernierllc-content-soft-delete-1.5.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5e23e942-f82b-4557-8a7a-e6c223ac6f44"}},"_resolved":"/home/runner/work/tools/tools/packages/core/content-soft-delete/bernierllc-content-soft-delete-1.5.0.tgz","_integrity":"sha512-7ulwXCI6xKTL4VKQAaQLoMDF0KsrKW60Nl7AIs+OK/Yi8epkETsAv1WwpcanM8ODGJMYHUIZl31LyU4aYuwALg==","bernierllc":{"integration":{"logger":"not-applicable","neverhub":"not-applicable","neveradmin":"not-applicable"}},"repository":{"url":"git+https://github.com/BernierLLC/tools.git","type":"git","directory":"packages/core/content-soft-delete"},"_npmVersion":"11.14.1","description":"Pure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/content-soft-delete_1.5.0_1779240977728_0.335294221263575","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@bernierllc/content-soft-delete","version":"1.6.0","description":"Pure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration","main":"dist/index.js","types":"dist/index.d.ts","keywords":["soft-delete","content","deletion","restore","trash","retention","state-management"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","devDependencies":{"@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"bernierllc":{"integration":{"neverhub":"not-applicable","neveradmin":"not-applicable","logger":"not-applicable"}},"repository":{"type":"git","url":"git+https://github.com/BernierLLC/tools.git","directory":"packages/core/content-soft-delete"},"bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"homepage":"https://github.com/BernierLLC/tools/tree/main/packages/core/content-soft-delete#readme","scripts":{"build":"tsc","test":"jest --watch","test:run":"jest","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","clean":"rm -rf dist"},"_id":"@bernierllc/content-soft-delete@1.6.0","_integrity":"sha512-mlUiL/umBhKsBOwW9EhlRMAEk2tSjZpC0GLcG5WAHlq4WRHvhLkVYrbNQW0lZizEqtNRZfSbsmZ8e3AXA6DzYw==","_resolved":"/home/runner/work/tools/tools/packages/core/content-soft-delete/bernierllc-content-soft-delete-1.6.0.tgz","_from":"file:bernierllc-content-soft-delete-1.6.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-mlUiL/umBhKsBOwW9EhlRMAEk2tSjZpC0GLcG5WAHlq4WRHvhLkVYrbNQW0lZizEqtNRZfSbsmZ8e3AXA6DzYw==","shasum":"c78324eec0b73e62380ff298099390fd774f7475","tarball":"https://registry.npmjs.org/@bernierllc/content-soft-delete/-/content-soft-delete-1.6.0.tgz","fileCount":18,"unpackedSize":29632,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCeuIXvKY/tQz6pBLa876djdGV/HHQGanR8qN5u3RxiiAIgXQuGIDw/dNa6Cv8fzap2dknwLDvwL1lwIHu91qbl0V4="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5e23e942-f82b-4557-8a7a-e6c223ac6f44"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/content-soft-delete_1.6.0_1779249714366_0.2919212475926942"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-03T03:14:00.372Z","modified":"2026-05-20T04:01:54.671Z","1.0.0":"2025-11-03T03:14:00.719Z","1.2.0":"2026-01-05T19:44:50.374Z","1.2.1":"2026-03-09T17:39:37.458Z","1.2.2":"2026-03-09T18:32:25.675Z","1.4.0":"2026-05-19T23:37:46.562Z","1.5.0":"2026-05-20T01:36:17.879Z","1.6.0":"2026-05-20T04:01:54.536Z"},"bugs":{"url":"https://github.com/BernierLLC/tools/issues"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","homepage":"https://github.com/BernierLLC/tools/tree/main/packages/core/content-soft-delete#readme","keywords":["soft-delete","content","deletion","restore","trash","retention","state-management"],"repository":{"type":"git","url":"git+https://github.com/BernierLLC/tools.git","directory":"packages/core/content-soft-delete"},"description":"Pure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/content-soft-delete\n\nPure utility for soft delete functionality - mark content as deleted without permanent removal, track deletion metadata, and support restoration.\n\n## Installation\n\n```bash\nnpm install @bernierllc/content-soft-delete\n```\n\n## Usage\n\n### Basic Usage\n\n```typescript\nimport { ContentSoftDelete, createSoftDelete } from '@bernierllc/content-soft-delete';\n\n// Create instance with default configuration\nconst softDelete = new ContentSoftDelete();\n\n// Or use factory function\nconst softDelete = createSoftDelete({ retentionDays: 60 });\n\n// Mark content as soft-deleted\nconst content = { id: 'article-123', title: 'My Article', author: 'John Doe' };\nconst result = softDelete.mark(content, 'user-456', 'No longer relevant');\n\nif (result.success) {\n  console.log('Content marked as deleted:', result.data);\n  // { id: 'article-123', title: 'My Article', author: 'John Doe', softDelete: {...} }\n}\n\n// Restore soft-deleted content\nconst restored = softDelete.restore(result.data);\nif (restored.success) {\n  console.log('Content restored:', restored.data);\n  // { id: 'article-123', title: 'My Article', author: 'John Doe' }\n}\n```\n\n### Configuration Options\n\n```typescript\nimport { ContentSoftDelete, SoftDeleteConfig } from '@bernierllc/content-soft-delete';\n\nconst config: Partial<SoftDeleteConfig> = {\n  retentionDays: 30,      // Days before permanent deletion (default: 30)\n  allowRestore: true,     // Whether restoration is permitted (default: true)\n  requireReason: false    // Whether delete reason is required (default: false)\n};\n\nconst softDelete = new ContentSoftDelete(config);\n```\n\n### Filtering Content\n\n```typescript\nconst items = [\n  { id: '1', title: 'Active 1' },\n  { id: '2', title: 'Deleted', softDelete: {...} },\n  { id: '3', title: 'Active 2' }\n];\n\n// Get only active content\nconst active = softDelete.filterActive(items);\n// Returns: [{ id: '1', ... }, { id: '3', ... }]\n\n// Get only deleted content\nconst deleted = softDelete.filterDeleted(items);\n// Returns: [{ id: '2', ... }]\n```\n\n### Checking Deletion Status\n\n```typescript\n// Check if content is soft-deleted\nconst isDeleted = softDelete.isSoftDeleted(content);\n\n// Check if content is ready for permanent deletion\nconst canDelete = softDelete.isPermanentlyDeletable(content);\n\n// Get days remaining until permanent deletion\nconst days = softDelete.getDaysUntilPermanentDelete(content);\nconsole.log(`${days} days until permanent deletion`);\n```\n\n### Permanent Deletion\n\n```typescript\n// Prepare content for permanent deletion\nconst result = softDelete.preparePermanentDelete(content);\n\nif (result.success) {\n  // Only the ID remains for audit purposes\n  console.log(result.data); // { id: 'article-123' }\n\n  // Now you can permanently delete from your database\n  await database.delete(result.data.id);\n}\n```\n\n## API Reference\n\n### Classes\n\n#### `ContentSoftDelete`\n\nMain class for soft delete operations.\n\n**Constructor:**\n```typescript\nnew ContentSoftDelete(config?: Partial<SoftDeleteConfig>)\n```\n\n**Methods:**\n\n- **`mark<T>(content: T, userId: string, reason?: string): SoftDeleteResult<T>`**\n  - Marks content as soft-deleted with metadata\n  - Returns success status and updated content with softDelete metadata\n\n- **`restore<T>(content: T): SoftDeleteResult<T>`**\n  - Restores soft-deleted content by removing softDelete metadata\n  - Returns success status and restored content\n\n- **`isSoftDeleted(content: SoftDeletableContent): boolean`**\n  - Checks if content is currently soft-deleted\n  - Returns true if softDelete metadata exists\n\n- **`isPermanentlyDeletable(content: SoftDeletableContent): boolean`**\n  - Checks if content is ready for permanent deletion\n  - Returns true if retention period has expired\n\n- **`filterActive<T>(items: T[]): T[]`**\n  - Filters array to exclude soft-deleted items\n  - Returns only active content\n\n- **`filterDeleted<T>(items: T[]): T[]`**\n  - Filters array to include only soft-deleted items\n  - Returns only deleted content\n\n- **`getDaysUntilPermanentDelete(content: SoftDeletableContent): number | null`**\n  - Calculates days remaining until permanent deletion\n  - Returns number of days or null if not applicable\n\n- **`preparePermanentDelete<T>(content: T): SoftDeleteResult<{ id: string }>`**\n  - Prepares content for permanent deletion (returns only ID)\n  - Returns success status and minimal data for audit\n\n### Interfaces\n\n#### `SoftDeleteConfig`\n\nConfiguration for soft delete behavior.\n\n```typescript\ninterface SoftDeleteConfig {\n  retentionDays: number;    // Days before permanent deletion (default: 30)\n  allowRestore: boolean;    // Whether restoration is permitted (default: true)\n  requireReason: boolean;   // Whether delete reason is required (default: false)\n}\n```\n\n#### `SoftDeleteMetadata`\n\nMetadata attached to soft-deleted content.\n\n```typescript\ninterface SoftDeleteMetadata {\n  deletedAt: string;          // ISO 8601 timestamp\n  deletedBy: string;          // User ID who deleted\n  deleteReason?: string;      // Optional reason\n  canRestore: boolean;        // Whether restoration is allowed\n  permanentDeleteAt?: string; // When permanent deletion will occur\n}\n```\n\n#### `SoftDeletableContent`\n\nContent item with soft delete support.\n\n```typescript\ninterface SoftDeletableContent {\n  id: string;\n  softDelete?: SoftDeleteMetadata;\n  [key: string]: any; // Other content properties\n}\n```\n\n#### `SoftDeleteResult<T>`\n\nResult of soft delete operations.\n\n```typescript\ninterface SoftDeleteResult<T = SoftDeletableContent> {\n  success: boolean;\n  data?: T;\n  error?: string;\n}\n```\n\n### Factory Function\n\n#### `createSoftDelete(config?: Partial<SoftDeleteConfig>): ContentSoftDelete`\n\nConvenience factory function for creating ContentSoftDelete instances.\n\n```typescript\nconst softDelete = createSoftDelete({ retentionDays: 60 });\n```\n\n## Examples\n\n### Example 1: Editorial Workflow\n\n```typescript\nimport { createSoftDelete } from '@bernierllc/content-soft-delete';\n\nconst softDelete = createSoftDelete({\n  retentionDays: 30,\n  requireReason: true\n});\n\n// Editor marks article for deletion\nconst article = { id: 'article-123', title: 'Draft Article', status: 'draft' };\nconst result = softDelete.mark(article, 'editor-456', 'Superseded by new version');\n\nif (result.success) {\n  // Save to database with softDelete metadata\n  await database.save(result.data);\n\n  // Check when it will be permanently deleted\n  const days = softDelete.getDaysUntilPermanentDelete(result.data);\n  console.log(`Article will be permanently deleted in ${days} days`);\n}\n\n// Later, restore if needed\nconst restored = softDelete.restore(result.data);\nif (restored.success) {\n  await database.save(restored.data);\n  console.log('Article restored to active status');\n}\n```\n\n### Example 2: Filtering Content Lists\n\n```typescript\nimport { ContentSoftDelete } from '@bernierllc/content-soft-delete';\n\nconst softDelete = new ContentSoftDelete();\n\n// Fetch all content from database\nconst allContent = await database.getAllContent();\n\n// Show only active content to users\nconst activeContent = softDelete.filterActive(allContent);\ndisplayToUser(activeContent);\n\n// Admin view: show trash\nconst deletedContent = softDelete.filterDeleted(allContent);\ndisplayTrash(deletedContent);\n```\n\n### Example 3: Automated Cleanup\n\n```typescript\nimport { ContentSoftDelete } from '@bernierllc/content-soft-delete';\n\nconst softDelete = new ContentSoftDelete({ retentionDays: 30 });\n\nasync function cleanupExpiredContent() {\n  const allContent = await database.getAllContent();\n  const deleted = softDelete.filterDeleted(allContent);\n\n  for (const item of deleted) {\n    if (softDelete.isPermanentlyDeletable(item)) {\n      const prepared = softDelete.preparePermanentDelete(item);\n      if (prepared.success) {\n        // Permanently delete from database\n        await database.permanentDelete(prepared.data.id);\n        console.log(`Permanently deleted: ${prepared.data.id}`);\n      }\n    }\n  }\n}\n\n// Run daily cleanup\nsetInterval(cleanupExpiredContent, 24 * 60 * 60 * 1000);\n```\n\n### Example 4: Custom Retention Policies\n\n```typescript\nimport { createSoftDelete } from '@bernierllc/content-soft-delete';\n\n// Different retention periods for different content types\nconst articleSoftDelete = createSoftDelete({ retentionDays: 90 });\nconst commentSoftDelete = createSoftDelete({ retentionDays: 30 });\nconst draftSoftDelete = createSoftDelete({ retentionDays: 7 });\n\n// Articles get 90 days\nconst deletedArticle = articleSoftDelete.mark(article, userId, 'Outdated');\n\n// Comments get 30 days\nconst deletedComment = commentSoftDelete.mark(comment, userId, 'Spam');\n\n// Drafts get only 7 days\nconst deletedDraft = draftSoftDelete.mark(draft, userId, 'Abandoned');\n```\n\n## Integration Status\n\n- **Logger**: not-applicable (Pure utility with no side effects - logging is caller's responsibility)\n- **Docs-Suite**: ready (Complete TypeDoc documentation)\n- **NeverHub**: not-applicable (Pure utility with no runtime behavior - no events to publish)\n\n## Design Philosophy\n\nThis package follows MECE (Mutually Exclusive, Collectively Exhaustive) principles:\n\n**What it does:**\n- ✅ Mark content as soft-deleted with metadata\n- ✅ Track deletion timestamp, user ID, and reason\n- ✅ Restore soft-deleted content\n- ✅ Filter arrays to exclude/include soft-deleted items\n- ✅ Check if content is permanently deletable\n- ✅ Calculate retention periods\n- ✅ Validate deletion state transitions\n\n**What it does NOT do:**\n- ❌ Persist deletion state to database (caller's responsibility)\n- ❌ Handle authorization/permissions\n- ❌ Send notifications about deletions\n- ❌ Archive or backup deleted content\n- ❌ Manage content versions or history\n\n## Dependencies\n\nNone - This is a pure utility package with zero dependencies.\n\n## License\n\nCopyright (c) 2025 Bernier LLC\n\nThis file is licensed to the client under a limited-use license.\nThe client may use and modify this code *only within the scope of the project it was delivered for*.\nRedistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n\n## See Also\n\n- [@bernierllc/content-editor-service](../service/content-editor-service) - Uses this package for trash functionality\n- [@bernierllc/content-list-ui](../ui/content-list-ui) - Filters soft-deleted content from lists\n- [@bernierllc/content-management-suite](../suite/content-management-suite) - Complete editorial workflow\n","readmeFilename":"README.md"}