{"_id":"@bernierllc/slug-generator","_rev":"8-4d535cf195466e1c354573ca75dff4ff","name":"@bernierllc/slug-generator","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"@bernierllc/slug-generator","version":"1.0.0","keywords":["slug","url","seo","unicode","slugify"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","_id":"@bernierllc/slug-generator@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"86fc1b2013911dc12828f0fc33f96563341adbc1","tarball":"https://registry.npmjs.org/@bernierllc/slug-generator/-/slug-generator-1.0.0.tgz","fileCount":17,"integrity":"sha512-E3nZtA/j9penkdbrPif1GltCO1BiWWjuoI+wtskOuU7JIIcKL4Z2NnfLF+vMK4rNswF2T5/Z1XXzwboEoEKf5Q==","signatures":[{"sig":"MEQCIA8jB0bIsY1VeJ+UqRAuSLGPpPNp9YlwaD3e4LB/fkAvAiAZPH5KkSe9L8yNeh02EFDQE6bkHbseC9r24XE/XOy10Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51899},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"a2a0a7115181a9a7f7e1649f8003d2bf17c6b8a7","scripts":{"lint":"eslint src/**/*.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":{"category":"core","priority":"high","integration":{"logger":"not-applicable","docsuite":"ready","neverhub":"not-applicable"}},"_npmVersion":"11.6.0","description":"SEO-friendly URL slug generation with Unicode support and collision handling","directories":{},"_nodeVersion":"24.10.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/slug-generator_1.0.0_1762314395292_0.4931075518447523","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bernierllc/slug-generator","version":"1.0.1","keywords":["slug","url","seo","unicode","slugify"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","_id":"@bernierllc/slug-generator@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"0540bbe769e47b6fe96df20a44c90b1b14ce059d","tarball":"https://registry.npmjs.org/@bernierllc/slug-generator/-/slug-generator-1.0.1.tgz","fileCount":29,"integrity":"sha512-TwIHYFriT73KosXvZ3bgF2rhLrOvG76HknQyszcVYqzaqFCKXTVTEg+dhzbB38wxtH578erKED2DOj0pVKpWFg==","signatures":[{"sig":"MEUCIQC8beXy5dxGHTF+4pipB1IShFCC4Zmp790r9KuUFmOFdAIgbg+t9LJtYBwDwzBypmqQlYumqqjL/5AipNUTviBYPbg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142750},"main":"dist/index.js","_from":"file:bernierllc-slug-generator-1.0.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.ts","test":"jest --watch","build":"tsc","clean":"rm -rf dist","test:run":"jest","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/2fee4cfa0020b04db1b19abc2633c42c/bernierllc-slug-generator-1.0.1.tgz","_integrity":"sha512-TwIHYFriT73KosXvZ3bgF2rhLrOvG76HknQyszcVYqzaqFCKXTVTEg+dhzbB38wxtH578erKED2DOj0pVKpWFg==","bernierllc":{"category":"core","priority":"high","integration":{"logger":"not-applicable","docsuite":"ready","neverhub":"not-applicable"}},"_npmVersion":"11.6.2","description":"SEO-friendly URL slug generation with Unicode support and collision handling","directories":{},"_nodeVersion":"25.2.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/slug-generator_1.0.1_1764637157782_0.5874618691529339","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bernierllc/slug-generator","version":"1.0.3","keywords":["slug","url","seo","unicode","slugify"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","_id":"@bernierllc/slug-generator@1.0.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"b6236a50b5b7f8de74b1557831be0f41248cc283","tarball":"https://registry.npmjs.org/@bernierllc/slug-generator/-/slug-generator-1.0.3.tgz","fileCount":18,"integrity":"sha512-cILQHaLo8/m9bD2G3CeRChiqMOfvN396yvf9OLsGK6Xd5yMv1spgwuE5i4Nzf5Zx7Axsm9JhdU/9Dw1s7vjwBw==","signatures":[{"sig":"MEQCIBKFoiLRyx2Y+DHmZVJbuxjplSUSE505NR2u/myWBuKsAiAu9j6HluCifIbdiJxEhGIY0dgY4nplGhaJUFLrPrWacQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54413},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src/**/*.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:c8996206-895c-451c-8193-0e66f29d34ee"}},"bernierllc":{"category":"core","priority":"high","integration":{"logger":"not-applicable","docsuite":"ready","neverhub":"not-applicable"}},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"SEO-friendly URL slug generation with Unicode support and collision handling","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/slug-generator_1.0.3_1767642328251_0.7856586526354878","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bernierllc/slug-generator","version":"1.0.4","keywords":["slug","url","seo","unicode","slugify"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","_id":"@bernierllc/slug-generator@1.0.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"d747e2c40f9a6268791da573b343b679cc69ef18","tarball":"https://registry.npmjs.org/@bernierllc/slug-generator/-/slug-generator-1.0.4.tgz","fileCount":18,"integrity":"sha512-fdDprXBWuHrccd6Yv1Bzg7ZC/OHwq2zs+LWCOB5NA73NceqmgxlhX38NYGP2gyb/jmQbHFlRQZ3+efbc9/ROXQ==","signatures":[{"sig":"MEUCIQDZAeotP1P9f0rFIcyTlXwZzR4O3bLUl53up2tX3Z+zvwIgb9UFDsQJowcs+69F1jTJC8Cf8+IqUdcMxr6PKzIq1As=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54565},"main":"dist/index.js","_from":"file:bernierllc-slug-generator-1.0.4.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.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:c8996206-895c-451c-8193-0e66f29d34ee"}},"_resolved":"/tmp/3f77e5eac264354471481eeac7b76169/bernierllc-slug-generator-1.0.4.tgz","_integrity":"sha512-fdDprXBWuHrccd6Yv1Bzg7ZC/OHwq2zs+LWCOB5NA73NceqmgxlhX38NYGP2gyb/jmQbHFlRQZ3+efbc9/ROXQ==","bernierllc":{"category":"core","priority":"high","integration":{"logger":"not-applicable","docsuite":"ready","neverhub":"not-applicable"}},"_npmVersion":"11.11.0","description":"SEO-friendly URL slug generation with Unicode support and collision handling","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/slug-generator_1.0.4_1773078073426_0.055903280845472025","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bernierllc/slug-generator","version":"1.0.5","keywords":["slug","url","seo","unicode","slugify"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","_id":"@bernierllc/slug-generator@1.0.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"485bda596bd6025197daaf7a258c61ff0260f966","tarball":"https://registry.npmjs.org/@bernierllc/slug-generator/-/slug-generator-1.0.5.tgz","fileCount":18,"integrity":"sha512-v/t2bc+kKUw2jzxexF8mJBHyLnJuZNJwTIRQNMxV6SAqARtmAai+otSPeS/PZUQN6PyqyoH7G3Gs8JU5Ga/Krg==","signatures":[{"sig":"MEUCIFBrFnFzCZWgyREjhDl1UMNMpdMr45hK2bRT+8OAy0t7AiEAvfdTckifZKukrlduQbjvx9U5xJg/qK9df+xFJczFTXg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54775},"main":"dist/index.js","_from":"file:bernierllc-slug-generator-1.0.5.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.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:c8996206-895c-451c-8193-0e66f29d34ee"}},"_resolved":"/home/runner/work/tools/tools/packages/core/slug-generator/bernierllc-slug-generator-1.0.5.tgz","_integrity":"sha512-v/t2bc+kKUw2jzxexF8mJBHyLnJuZNJwTIRQNMxV6SAqARtmAai+otSPeS/PZUQN6PyqyoH7G3Gs8JU5Ga/Krg==","bernierllc":{"category":"core","priority":"high","integration":{"logger":"not-applicable","docsuite":"ready","neverhub":"not-applicable"}},"_npmVersion":"11.11.0","description":"SEO-friendly URL slug generation with Unicode support and collision handling","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/slug-generator_1.0.5_1773163289704_0.9227559675510488","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bernierllc/slug-generator","version":"1.1.0","keywords":["slug","url","seo","unicode","slugify"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","_id":"@bernierllc/slug-generator@1.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"aded21a580972fbd0b9844c7584100c5d81f486f","tarball":"https://registry.npmjs.org/@bernierllc/slug-generator/-/slug-generator-1.1.0.tgz","fileCount":18,"integrity":"sha512-T2dDnW5H87cVn7KdUoLqYn6Qgcn08cM2SBfjwrfhEZknijWqaAYQEU6K8q9qDeAAFTW4O+yzpBAvfqYZn+Prfg==","signatures":[{"sig":"MEUCIFpcRNEM6YQYtyZLj7zzCbqjBrfGAklpeH68roTuSO1QAiEA/ZsBavYUrSZNgk9BL+ocyPbCgDmzfaS0cHlwFCg2ugs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54973},"main":"dist/index.js","_from":"file:bernierllc-slug-generator-1.1.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.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:c8996206-895c-451c-8193-0e66f29d34ee"}},"_resolved":"/home/runner/work/tools/tools/packages/core/slug-generator/bernierllc-slug-generator-1.1.0.tgz","_integrity":"sha512-T2dDnW5H87cVn7KdUoLqYn6Qgcn08cM2SBfjwrfhEZknijWqaAYQEU6K8q9qDeAAFTW4O+yzpBAvfqYZn+Prfg==","bernierllc":{"category":"core","priority":"high","integration":{"logger":"not-applicable","docsuite":"ready","neverhub":"not-applicable"}},"_npmVersion":"11.14.1","description":"SEO-friendly URL slug generation with Unicode support and collision handling","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/slug-generator_1.1.0_1779241409908_0.2667714678569919","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/slug-generator","version":"1.2.0","keywords":["slug","url","seo","unicode","slugify"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","_id":"@bernierllc/slug-generator@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"02a7cca8e78624d75d2e97367389f6f08cecb39b","tarball":"https://registry.npmjs.org/@bernierllc/slug-generator/-/slug-generator-1.2.0.tgz","fileCount":10,"integrity":"sha512-NHfGIoHBTjCAVSdR30kGLuMKQSaFGo7WHrZGUKg9rnMhKvtUk/nRuwgRktJjEbF5mfQvyKUGNAjXFj1kSW1EqQ==","signatures":[{"sig":"MEYCIQCsBWIqijN44sA0xRGix/yy3ilvDBPLg/NJwJWdJZS5pgIhAJ1LyIJ3PH0fAx5N6WBBMXfU2VAAvHK0OjBNTTXAFGrK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25920},"main":"dist/index.js","_from":"file:bernierllc-slug-generator-1.2.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src/**/*.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:c8996206-895c-451c-8193-0e66f29d34ee"}},"_resolved":"/home/runner/work/tools/tools/packages/core/slug-generator/bernierllc-slug-generator-1.2.0.tgz","_integrity":"sha512-NHfGIoHBTjCAVSdR30kGLuMKQSaFGo7WHrZGUKg9rnMhKvtUk/nRuwgRktJjEbF5mfQvyKUGNAjXFj1kSW1EqQ==","bernierllc":{"category":"core","priority":"high","integration":{"logger":"not-applicable","docsuite":"ready","neverhub":"not-applicable"}},"_npmVersion":"11.14.1","description":"SEO-friendly URL slug generation with Unicode support and collision handling","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.50.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/slug-generator_1.2.0_1779243310668_0.37299921172503114","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/slug-generator","version":"1.3.0","description":"SEO-friendly URL slug generation with Unicode support and collision handling","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","keywords":["slug","url","seo","unicode","slugify"],"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.50.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"bernierllc":{"integration":{"logger":"not-applicable","neverhub":"not-applicable","docsuite":"ready"},"category":"core","priority":"high"},"scripts":{"build":"tsc","test":"jest --watch","test:run":"jest","test:coverage":"jest --coverage","lint":"eslint src/**/*.ts","clean":"rm -rf dist"},"_id":"@bernierllc/slug-generator@1.3.0","_integrity":"sha512-nTyztpw9V5PjFpedOlpb83+U2lmG17jw+1T3c3lPUv4KEVx5e/W3jkJh8fk5o9RPUoEsFJ25Zm4yp/b2iiH4qQ==","_resolved":"/home/runner/work/tools/tools/packages/core/slug-generator/bernierllc-slug-generator-1.3.0.tgz","_from":"file:bernierllc-slug-generator-1.3.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-nTyztpw9V5PjFpedOlpb83+U2lmG17jw+1T3c3lPUv4KEVx5e/W3jkJh8fk5o9RPUoEsFJ25Zm4yp/b2iiH4qQ==","shasum":"3aeed495f3621e08a52a97e18ccc1122593059e9","tarball":"https://registry.npmjs.org/@bernierllc/slug-generator/-/slug-generator-1.3.0.tgz","fileCount":10,"unpackedSize":25920,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGdbAOxDJZk0yGSAINWxW6tek2KupVW4K2x0VEoXAd6TAiBhoil3MKvNIHUsXnrvztfDtKFiYCqJD98MStWORk5ZCg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c8996206-895c-451c-8193-0e66f29d34ee"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/slug-generator_1.3.0_1779250156587_0.10335506426349661"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-05T03:46:35.201Z","modified":"2026-05-20T04:09:16.877Z","1.0.0":"2025-11-05T03:46:35.468Z","1.0.1":"2025-12-02T00:59:17.974Z","1.0.3":"2026-01-05T19:45:28.398Z","1.0.4":"2026-03-09T17:41:13.576Z","1.0.5":"2026-03-10T17:21:29.858Z","1.1.0":"2026-05-20T01:43:30.047Z","1.2.0":"2026-05-20T02:15:10.805Z","1.3.0":"2026-05-20T04:09:16.730Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE.txt","keywords":["slug","url","seo","unicode","slugify"],"description":"SEO-friendly URL slug generation with Unicode support and collision handling","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/slug-generator\n\nSEO-friendly URL slug generation with Unicode support and collision handling.\n\n## Installation\n\n```bash\nnpm install @bernierllc/slug-generator\n```\n\n## Features\n\n- 🌍 **Unicode Support** - Handles international characters (German ß, Spanish ñ, French é, etc.)\n- 🔄 **Collision Detection** - Generates unique slugs with numeric, random, or timestamp suffixes\n- ⚙️ **Customizable** - Configure separator, max length, case handling, and character replacements\n- 🎯 **SEO-Optimized** - Removes special characters, normalizes whitespace, truncates intelligently\n- 📦 **Zero Dependencies** - Pure TypeScript implementation\n- 🌐 **Universal** - Works in Node.js and browser environments\n\n## Usage\n\n### Basic Usage\n\n```typescript\nimport { generateSlug } from '@bernierllc/slug-generator';\n\nconst slug = generateSlug('Hello World!');\n// Output: \"hello-world\"\n\nconst blogPost = generateSlug('How to Build a React App in 2025');\n// Output: \"how-to-build-a-react-app-in-2025\"\n```\n\n### Advanced Usage with Options\n\n```typescript\nimport { SlugGenerator } from '@bernierllc/slug-generator';\n\nconst generator = new SlugGenerator({\n  separator: '_',\n  maxLength: 50,\n  lowercase: true,\n  removeDiacritics: true,\n  strict: true,\n  replacements: {\n    '&': 'and',\n    '@': 'at',\n    '%': 'percent'\n  }\n});\n\nconst result = generator.generate('A & B @ 50% Off!');\n// Output: { slug: \"a_and_b_at_50_percent_off\", modified: true, changes: [...], truncated: false }\n```\n\n### Unicode and International Characters\n\n```typescript\nimport { generateSlug } from '@bernierllc/slug-generator';\n\n// German\ngenerateSlug('Größe und Qualität');\n// Output: \"grosse-und-qualitat\"\n\n// Spanish\ngenerateSlug('Niño en España');\n// Output: \"nino-en-espana\"\n\n// French\ngenerateSlug('Crème brûlée au café');\n// Output: \"creme-brulee-au-cafe\"\n\n// Mixed\ngenerateSlug('Café København Łódź');\n// Output: \"cafe-kobenhavn-lodz\"\n```\n\n### Collision Handling\n\n```typescript\nimport { generateUniqueSlug } from '@bernierllc/slug-generator';\n\nconst existing = ['hello-world', 'hello-world-1'];\n\n// Numeric suffix (default)\nconst slug1 = generateUniqueSlug('Hello World', existing);\n// Output: \"hello-world-2\"\n\n// Random suffix\nconst generator = new SlugGenerator();\nconst result = generator.generateUnique('Hello World', {\n  existing: ['hello-world'],\n  suffixFormat: 'random'\n});\n// Output: { slug: \"hello-world-a3f9k\", ... }\n\n// Timestamp suffix\nconst result2 = generator.generateUnique('Hello World', {\n  existing: ['hello-world'],\n  suffixFormat: 'timestamp'\n});\n// Output: { slug: \"hello-world-l5m2n8p\", ... }\n```\n\n### Validation\n\n```typescript\nimport { isValidSlug } from '@bernierllc/slug-generator';\n\nisValidSlug('hello-world'); // true\nisValidSlug('hello world'); // false (contains space)\nisValidSlug('hello-world!'); // false (contains special char)\nisValidSlug(''); // false (empty)\n```\n\n## API Reference\n\n### `generateSlug(text: string, options?: SlugOptions): string`\n\nGenerate a slug from text using default or custom options.\n\n**Parameters:**\n- `text` - Input text to convert\n- `options` - Optional configuration (see `SlugOptions`)\n\n**Returns:** Generated slug string\n\n### `generateUniqueSlug(text: string, existing: string[], options?: SlugOptions): string`\n\nGenerate a unique slug by adding suffixes to avoid collisions.\n\n**Parameters:**\n- `text` - Input text to convert\n- `existing` - Array of existing slugs to check against\n- `options` - Optional configuration (see `SlugOptions`)\n\n**Returns:** Unique slug string\n\n### `isValidSlug(slug: string, options?: SlugOptions): boolean`\n\nValidate if a string is a valid slug.\n\n**Parameters:**\n- `slug` - String to validate\n- `options` - Optional configuration (see `SlugOptions`)\n\n**Returns:** `true` if valid, `false` otherwise\n\n### `SlugGenerator`\n\nMain class for slug generation with instance-level configuration.\n\n**Constructor:**\n```typescript\nnew SlugGenerator(options?: SlugOptions)\n```\n\n**Methods:**\n- `generate(text: string): SlugResult` - Generate slug with detailed result\n- `generateUnique(text: string, options: CollisionOptions): SlugResult` - Generate unique slug\n- `isValidSlug(slug: string): boolean` - Validate slug format\n\n### `SlugOptions`\n\nConfiguration options for slug generation:\n\n```typescript\ninterface SlugOptions {\n  separator?: string;         // Default: '-'\n  lowercase?: boolean;        // Default: true\n  maxLength?: number;         // Default: 100\n  removeDiacritics?: boolean; // Default: true\n  strict?: boolean;           // Default: true (remove all non-alphanumeric)\n  replacements?: Record<string, string>; // Custom character replacements\n}\n```\n\n### `SlugResult`\n\nDetailed result from slug generation:\n\n```typescript\ninterface SlugResult {\n  slug: string;           // Generated slug\n  modified: boolean;      // Whether original text was changed\n  changes: string[];      // List of transformations applied\n  truncated: boolean;     // Whether slug was truncated\n}\n```\n\n### `CollisionOptions`\n\nOptions for handling slug collisions:\n\n```typescript\ninterface CollisionOptions {\n  existing: string[];                           // Existing slugs to check\n  suffixFormat?: 'numeric' | 'random' | 'timestamp'; // Default: 'numeric'\n  maxAttempts?: number;                        // Default: 100\n}\n```\n\n## Configuration\n\n### Environment Variables\n\nThis package has no environment variables (pure utility - all configuration via options).\n\n### Runtime Configuration\n\nAll configuration is passed via constructor or function parameters:\n\n```typescript\n// Instance configuration\nconst generator = new SlugGenerator({\n  separator: '_',\n  maxLength: 80,\n  replacements: { '&': 'and' }\n});\n\n// Per-call configuration\nconst slug = generateSlug('Hello World', { separator: '_' });\n```\n\n## Examples\n\n### Blog Post Slugs\n\n```typescript\nimport { generateSlug } from '@bernierllc/slug-generator';\n\nconst posts = [\n  'How to Build a React App in 2025',\n  'Top 10 JavaScript Tips & Tricks',\n  'Understanding TypeScript Generics'\n];\n\nconst slugs = posts.map(title => generateSlug(title));\n// [\n//   \"how-to-build-a-react-app-in-2025\",\n//   \"top-10-javascript-tips-tricks\",\n//   \"understanding-typescript-generics\"\n// ]\n```\n\n### Product URLs\n\n```typescript\nimport { SlugGenerator } from '@bernierllc/slug-generator';\n\nconst generator = new SlugGenerator({\n  maxLength: 60,\n  replacements: {\n    '&': 'and',\n    '%': 'percent',\n    '$': 'dollar'\n  }\n});\n\nconst product = 'Nike Air Max 90 - Men\\'s Running Shoes - $120';\nconst result = generator.generate(product);\n// { slug: \"nike-air-max-90-mens-running-shoes-dollar120\", ... }\n```\n\n### Content Management System\n\n```typescript\nimport { SlugGenerator } from '@bernierllc/slug-generator';\n\nclass ContentService {\n  private generator = new SlugGenerator();\n\n  async createPost(title: string) {\n    // Get existing slugs from database\n    const existingSlugs = await this.getExistingSlugs();\n\n    // Generate unique slug\n    const result = this.generator.generateUnique(title, {\n      existing: existingSlugs,\n      suffixFormat: 'numeric'\n    });\n\n    return {\n      title,\n      slug: result.slug,\n      url: `/blog/${result.slug}`\n    };\n  }\n\n  private async getExistingSlugs(): Promise<string[]> {\n    // Database query\n    return ['existing-post', 'another-post'];\n  }\n}\n```\n\n### E-commerce Categories\n\n```typescript\nimport { generateSlug } from '@bernierllc/slug-generator';\n\nconst categories = {\n  'Men\\'s Clothing & Accessories': generateSlug('Men\\'s Clothing & Accessories'),\n  'Women\\'s Shoes & Boots': generateSlug('Women\\'s Shoes & Boots'),\n  'Electronics & Gadgets': generateSlug('Electronics & Gadgets')\n};\n\n// {\n//   \"Men's Clothing & Accessories\": \"mens-clothing-accessories\",\n//   \"Women's Shoes & Boots\": \"womens-shoes-boots\",\n//   \"Electronics & Gadgets\": \"electronics-gadgets\"\n// }\n```\n\n## Integration Status\n\n### Logger Integration\n**Status**: Not applicable\n\n**Justification**: This is a pure utility package with no runtime state, side effects, or error conditions that require logging. The SlugGenerator class is stateless and deterministic - it simply converts strings to URL-friendly slugs. All errors are thrown as exceptions that calling code can handle, and there are no background operations, network calls, or state changes that would benefit from structured logging.\n\n**Pattern**: Pure functional utility - no logger integration needed.\n\n### NeverHub Integration\n**Status**: Not applicable\n\n**Justification**: This is a core utility package that provides slug generation functionality. It does not participate in service discovery, event publishing, or service mesh operations. It's a stateless utility that can be used by any service or application without requiring service registration or discovery.\n\n**Pattern**: Core utility - no service mesh integration needed.\n\n### Docs-Suite Integration\n**Status**: Ready\n\n**Format**: TypeDoc-compatible JSDoc comments are included throughout the source code. All public APIs are documented with examples and type information.\n\n## Performance\n\n- **Typical title (50 chars)**: <1ms\n- **Long title (200 chars)**: <2ms\n- **Unicode heavy (100 chars)**: <3ms\n- **Collision detection (100 existing)**: <5ms\n\n## Browser Support\n\nWorks in all modern browsers and Node.js environments:\n- Node.js 16+\n- Chrome, Firefox, Safari, Edge (latest 2 versions)\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\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## Related Packages\n\n### Used By\n- `@bernierllc/content-editor-service` - Generates slugs for new content\n- `@bernierllc/content-workflow-service` - Slug validation and uniqueness\n- `@bernierllc/social-publisher` - URL generation for published content\n\n### Part Of\n- **Content Management Suite** - Blog content workflow and URL generation\n\n## Support\n\nFor issues, questions, or feature requests, please contact Bernier LLC.\n","readmeFilename":"README.md"}