{"id":14975712,"url":"https://github.com/ladjs/mongoose-slug-plugin","last_synced_at":"2026-03-13T14:31:19.094Z","repository":{"id":27126217,"uuid":"112602702","full_name":"ladjs/mongoose-slug-plugin","owner":"ladjs","description":"Slugs for Mongoose with history and i18n support (uses speakingurl by default, but you can use any slug library such as limax, slugify, mollusc, or slugme)","archived":false,"fork":false,"pushed_at":"2024-04-15T23:31:36.000Z","size":561,"stargazers_count":23,"open_issues_count":2,"forks_count":9,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-10-08T19:04:03.056Z","etag":null,"topics":["301","generator","handler","history","limax","localize","message","mongo","mongoose","permanent","plugin","redirect","redirection","seo","slug","slugify","slugs","speakingurl","template","translate"],"latest_commit_sha":null,"homepage":"https://lad.js.org","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ladjs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-11-30T11:18:14.000Z","updated_at":"2025-08-27T12:14:58.000Z","dependencies_parsed_at":"2024-06-18T22:52:12.446Z","dependency_job_id":"832d877a-6fd9-4034-a75a-7a9649248996","html_url":"https://github.com/ladjs/mongoose-slug-plugin","commit_stats":{"total_commits":38,"total_committers":4,"mean_commits":9.5,"dds":0.07894736842105265,"last_synced_commit":"46a9f64bf2272e4c8d69efb44cab9b30c1444cd6"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/ladjs/mongoose-slug-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ladjs%2Fmongoose-slug-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ladjs%2Fmongoose-slug-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ladjs%2Fmongoose-slug-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ladjs%2Fmongoose-slug-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ladjs","download_url":"https://codeload.github.com/ladjs/mongoose-slug-plugin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ladjs%2Fmongoose-slug-plugin/sbom","scorecard":{"id":576848,"data":{"date":"2025-08-11","repo":{"name":"github.com/ladjs/mongoose-slug-plugin","commit":"46a9f64bf2272e4c8d69efb44cab9b30c1444cd6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":1,"reason":"Found 3/27 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/ladjs/.github/SECURITY.md:1","Info: Found linked content: github.com/ladjs/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/ladjs/.github/SECURITY.md:1","Info: Found text in security policy: github.com/ladjs/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 6 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"45 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-pp7h-53gx-mx7r","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-xp63-6vf5-xf3v","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-f825-f98c-gj3g","Warn: Project is vulnerable to: GHSA-h8hf-x3f4-xwgp","Warn: Project is vulnerable to: GHSA-9m93-w8w6-76hh","Warn: Project is vulnerable to: GHSA-m7xq-9374-9rvx","Warn: Project is vulnerable to: GHSA-vg7j-7cwx-8wgw","Warn: Project is vulnerable to: GHSA-p92x-r36w-9395","Warn: Project is vulnerable to: GHSA-45q2-34rf-mr94","Warn: Project is vulnerable to: GHSA-w7rc-rwvf-8q5r","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-px4h-xg32-q955","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-w5p7-h5w8-2hfq","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-38fc-wpqx-33j7","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T18:04:42.102Z","repository_id":27126217,"created_at":"2025-08-20T18:04:42.102Z","updated_at":"2025-08-20T18:04:42.102Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30468273,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-13T11:00:43.441Z","status":"ssl_error","status_checked_at":"2026-03-13T11:00:23.173Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["301","generator","handler","history","limax","localize","message","mongo","mongoose","permanent","plugin","redirect","redirection","seo","slug","slugify","slugs","speakingurl","template","translate"],"created_at":"2024-09-24T13:52:25.722Z","updated_at":"2026-03-13T14:31:19.068Z","avatar_url":"https://github.com/ladjs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mongoose-slug-plugin\n\n[![build status](https://img.shields.io/travis/ladjs/mongoose-slug-plugin.svg)](https://travis-ci.org/ladjs/mongoose-slug-plugin)\n[![code coverage](https://img.shields.io/codecov/c/github/ladjs/mongoose-slug-plugin.svg)](https://codecov.io/gh/ladjs/mongoose-slug-plugin)\n[![code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/sindresorhus/xo)\n[![styled with prettier](https://img.shields.io/badge/styled_with-prettier-ff69b4.svg)](https://github.com/prettier/prettier)\n[![made with lass](https://img.shields.io/badge/made_with-lass-95CC28.svg)](https://lass.js.org)\n[![license](https://img.shields.io/github/license/ladjs/mongoose-slug-plugin.svg)](LICENSE)\n\n\u003e Slugs for [Mongoose][] with history and [i18n][] support (uses [speakingurl][] by default, but you can use any slug library such as [limax][], [slugify][], [mollusc][], or [slugme][])\n\n\n## Table of Contents\n\n* [Install](#install)\n* [Usage](#usage)\n* [Static Methods](#static-methods)\n* [Options](#options)\n* [Slug Tips](#slug-tips)\n* [Slug Uniqueness](#slug-uniqueness)\n* [Custom Slug Library](#custom-slug-library)\n* [Background](#background)\n* [Contributors](#contributors)\n* [License](#license)\n\n\n## Install\n\n[npm][]:\n\n```sh\nnpm install mongoose-slug-plugin\n```\n\n[yarn][]:\n\n```sh\nyarn add mongoose-slug-plugin\n```\n\n\n## Usage\n\n\u003e Add the plugin to your project (it will automatically generate a slug when the document is validated based off the template string passed)\n\n```js\nconst mongooseSlugPlugin = require('mongoose-slug-plugin');\nconst mongoose = require('mongoose');\n\nconst BlogPost = new mongoose.Schema({\n  title: String\n});\n\nBlogPost.plugin(mongooseSlugPlugin, { tmpl: '\u003c%=title%\u003e' });\n\nmodule.exports = mongoose.model('BlogPost', BlogPost);\n```\n\n\u003e If you need to render some custom function in the template string for display purposes, such as outputting a formatted date with [dayjs][]:\n\n```js\nconst dayjs = require('dayjs');\n\nconst mongooseSlugPlugin = require('mongoose-slug-plugin');\nconst mongoose = require('mongoose');\n\nconst BlogPost = new mongoose.Schema({\n  title: { type: String, required: true, unique: true },\n  posted_at: { type: Date, required: true }\n});\n\nBlogPost.plugin(mongooseSlugPlugin, {\n  tmpl: \"\u003c%=title%\u003e-\u003c%=dayjs(posted_at).format('YYYY-MM-DD')%\u003e\",\n  locals: { dayjs }\n});\n\nmodule.exports = mongoose.model('BlogPost', BlogPost);\n```\n\n\u003e If you're using [Koa][], here's an example showing how to lookup a slug or an archived slug and properly 301 redirect:\n\n```js\nconst Koa = require('koa');\nconst Router = require('koa-router');\nconst Boom = require('boom');\n\nconst BlogPosts = require('./blog-post');\n\nconst app = new Koa();\nconst router = new Router();\n\nrouter.get('/blog/:slug', async (ctx, next) =\u003e {\n  try {\n    // lookup the blog post by the slug parameter\n    const blogPost = await BlogPosts.findOne({ slug: ctx.params.slug });\n\n    // if we found it then return early and render the blog post\n    if (blogPost) return ctx.render('blog-post', { title: blogPost.title, blogPost });\n\n    // check if the slug changed for the post we're trying to lookup\n    blogPost = await BlogPosts.findOne({ slug_history: ctx.params.slug });\n\n    // 301 permanent redirect to new blog post slug if it was found\n    if (blogPost) return ctx.redirect(301, `/blog/${blogPost.slug}`);\n\n    // if no blog post found then throw a nice 404 error\n    // this assumes that you're using `koa-better-error-handler`\n    // and also using `koa-404-handler`, but you don't necessarily need to\n    // since koa automatically sets 404 status code if nothing found\n    // \u003chttps://github.com/ladjs/koa-better-error-handler\u003e\n    // \u003chttps://github.com/ladjs/koa-404-handler\u003e\n    return next();\n\n  } catch (err) {\n    ctx.throw(err);\n  }\n});\n\napp.use(router.routes());\napp.listen(3000);\n```\n\n\u003e If you're using [Express][], here's an example showing how to lookup a slug or an archived slug and properly 301 redirect:\n\n```js\nTODO\n```\n\n\u003e Note that you also have access to a static function on the model called `getUniqueSlug`.\n\nThis function accepts an `_id` and `str` argument. The `_id` being the ObjectID of the document and `str` being the slug you're searching for to ensure uniqueness.\n\nThis function is used internally by the plugin to recursively ensure uniqueness.\n\n\n## Static Methods\n\nIf you have to write a script to automatically set slugs across a collection, you can use the `getUniqueSlug` static method this package exposes on models.\n\nFor example, if you want to programmatically set all blog posts to have slugs, run this script (note that you should run the updates serially as the example shows to prevent slug conflicts):\n\n```js\nconst Promise = require('bluebird'); // exposes `Promise.each`\n\nconst BlogPost = require('../app/models/blog-post.js');\n\n(async () =\u003e {\n  const blogPosts = await BlogPost.find({}).exec();\n  await Promise.each(blogPosts, async blogPost =\u003e {\n    blogPost.slug = null;\n    blogPost.slug = await BlogPost.getUniqueSlug(blogPost._id, blogPost.title);\n    return blogPost.save();\n  }));\n})();\n```\n\n\n## Options\n\nHere are the default options passed to the plugin:\n\n* `tmpl` (String) - Required, this should be a [lodash template string][lodash-template-string] (e.g. `\u003c%=title%\u003e` to use the blog post title as the slug)\n* `locals` (Object) - Defaults to an empty object, but you can pass a custom object that will be inherited for use in the lodash template string (see above example for how you could use [dayjs][] to render a document's date formatted in the slug)\n* `alwaysUpdateSlug` (Boolean) - Defaults to `true` (basically this will re-set the slug to the value it should be based off the template string every time the document is validated (or saved for instance due to pre-save hook in turn calling pre-validate in Mongoose)\n* `errorMessage` (String) - Defaults to `Slug was missing or blank`, this is a String that is returned for failed validation (note that it gets translated based off the `this.locale` field if it is set on the document (see [Lad][] for more insight into how this works))\n* `logger` (Object) - defaults to `console`, but you might want to use [Lad's logger][lad-logger]\n* `slugField` (String) - defaults to `slug`, this is the field used for storing the slug for the document\n* `historyField` (String) - defaults to `slug_history`, this is the field used for storing a document's slug history\n* `i18n` (Object|Boolean) - defaults to `false`, but accepts a `i18n` object from [Lad's i18n][i18n]\n* `slug` (Function) - Defaults to `speakingurl`, but it is a function that converts a string into a slug (see below [Custom Slug Libary](#custom-slug-library) examples)\n* `slugOptions` (Object) - An object of options to pass to the slug function when invoked as specified in `options.slug`\n\n\n## Slug Tips\n\nIf you're using the default slug library `speakingurl`, then you might want to pass the option `slugOptions: { \"'\": '' }` in order to fix contractions.\n\nFor example, if your title is \"Jason's Blog Post\", you probably want the slug to be \"jasons-blog-post\" as opposed to \"jason-s-blog-post\".  This option will fix that.\n\nSee [pid/speakingurl#105](https://github.com/pid/speakingurl/issues/105) for more information.\n\n\n## Slug Uniqueness\n\nIf a slug of \"foo-bar\" already exists, and if we are inserting a new document that also has a slug of \"foo-bar\", then this new slug will automatically become \"foo-bar-1\".\n\n\n## Custom Slug Library\n\nIf you don't want to use the library `speakingurl` for generating slugs (which this package uses by default), then you can pass a custom `slug` function:\n\n\u003e [limax][] example:\n\n```js\nconst limax = require('limax');\n\nBlogPost.plugin(mongooseSlugPlugin, { tmpl: '\u003c%=title%\u003e', slug: limax });\n```\n\n\u003e [slugify][] example:\n\n```js\nconst slugify = require('slugify');\n\nBlogPost.plugin(mongooseSlugPlugin, { tmpl: '\u003c%=title%\u003e', slug: slugify });\n```\n\n\u003e [mollusc][] example:\n\n```js\nconst slug = require('mollusc');\n\nBlogPost.plugin(mongooseSlugPlugin, { tmpl: '\u003c%=title%\u003e', slug });\n```\n\n\u003e [slugme][] example:\n\n```js\nconst slugme = require('slugme');\n\nBlogPost.plugin(mongooseSlugPlugin, { tmpl: '\u003c%=title%\u003e', slug: slugme });\n```\n\n\n## Background\n\nI created this package despite knowing that other alternatives like it exist for these reasons:\n\n* No alternative supported i18n localization/translation out of the box\n* No alternative used the well-tested and SEO-friendly `speakingurl` package\n* No alternative allowed users to pass their own slug library\n* No alternative documented how to clearly do a 301 permanent redirect for archived slugs\n* No alternative allowed the field names to be customized\n* No alternative had decent tests written\n\n\n## Contributors\n\n| Name             | Website                           |\n| ---------------- | --------------------------------- |\n| **Nick Baugh**   | \u003chttp://niftylettuce.com/\u003e        |\n| **shadowgate15** | \u003chttps://github.com/shadowgate15\u003e |\n\n\n## License\n\n[MIT](LICENSE) © [Nick Baugh](http://niftylettuce.com/)\n\n\n## \n\n[npm]: https://www.npmjs.com/\n\n[yarn]: https://yarnpkg.com/\n\n[limax]: https://github.com/lovell/limax\n\n[slugify]: https://github.com/simov/slugify\n\n[mollusc]: https://github.com/Zertz/mollusc\n\n[slugme]: https://github.com/arthurlacoste/js-slug-me\n\n[i18n]: https://github.com/ladjs/i18n\n\n[mongoose]: http://mongoosejs.com/\n\n[speakingurl]: https://github.com/pid/speakingurl\n\n[koa]: http://koajs.com/\n\n[express]: https://expressjs.com/\n\n[lodash-template-string]: https://lodash.com/docs/4.17.4#template\n\n[lad-logger]: https://github.com/ladjs/logger\n\n[dayjs]: https://github.com/iamkun/dayjs\n\n[lad]: https://lad.js.org\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fladjs%2Fmongoose-slug-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fladjs%2Fmongoose-slug-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fladjs%2Fmongoose-slug-plugin/lists"}