{"_id":"@doist/remark-application-links","_rev":"22-78ef34164b7c147ea08ae214d0a7a94a","name":"@doist/remark-application-links","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.0":{"name":"@doist/remark-application-links","version":"1.0.0","author":{"name":"Henning Muszynski"},"license":"MIT","_id":"@doist/remark-application-links@1.0.0","maintainers":[{"name":"doistuser","email":"amix@doist.io"},{"name":"henningmu","email":"muszynski.henning@gmail.com"},{"name":"jvalente","email":"joao@doist.io"},{"name":"stkao05","email":"st.kao.05@gmail.com"}],"dist":{"shasum":"bd42ab8dd4974a5534f555fd14a444577f3f6d5a","tarball":"https://registry.npmjs.org/@doist/remark-application-links/-/remark-application-links-1.0.0.tgz","fileCount":14,"integrity":"sha512-3Vlnpx0JG+t7j2oZHD1geZ0wpRY6hAyXgn12yNpNf2BUFQriQaAuVLwKoYWsJ8N24DgtJa4lul114xu23WPIAw==","signatures":[{"sig":"MEUCIQCTWGp1novMDYujXQuta7smnmAGvWa+uSqJoR/BgSGbYgIgWKzXly3+PCxu7Oj7TJfE0EzFhBFQw4J9plhGkzdphEM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfdzJsCRA9TVsSAnZWagAAB5sP/2XHwudix9+zBlvPR5FA\ni2gi3QxCwhj2FaXud9mrWuUy9YnM4iFXlwj+qTyYK3x0DfcAdNhttS6uPxy6\no5tbiKXjyJsL39PE9foMwUICAvIpgW1Kk5+Fmyl1U2+aj128Uoe1wK4Obt5c\notxfDTQ2KCnWCS1iUpovIjWP3TfyowwK17RvExs20hAABBJxGnq6bSx7S22Q\nNXFVh5dHl91PTv7EDbJASr/P10a4ZLyUp9iK/OjRPFJjoDQ0dSOW4KyMEWgj\nqwAxgmJ4NYxTLriasYYmLvlMieBiRwd1UFfKse6miswI5rfK8v7XDGYNS6Oi\niOXeMe9tFBr+F3E+PYwvgd2zncYDL0KXhp8lyo4ZHKtgXOF/91Wl18UZHA/9\n5Fp6Ii0zMzZJipDOXvvDX+QQPQ6axPOwnaU3ix3NYmuf9yfRSGCGlyH97nSL\nLVMBLH15wOzkgdI74zmB0KdfJUU3e/989fEs61Gdtc8nYNXW3johvkSqLsGm\nFwg+QeYKfEpQJ9wzw77hqKfAb2Cpqm96OjtmVqrzWRzBRaB6Pd6enLU52bqb\ns1TF7lNVQH2XvAae2E+1HRAItPxIdJglUccNU0A3650yU412pePoVte7jB8E\nPRuDU0hq4Mg+lfet56Pzz5akuxGKtfW098fDqYhwiSgg4BZVnSETVJxUQcQN\nh84d\r\n=tax7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","husky":{"hooks":{"pre-commit":"tsdx lint"}},"module":"dist/remark-application-links.esm.js","engines":{"node":">=12"},"gitHead":"496c030c67df179a3bb36fb45d6f2d25455409d1","scripts":{"lint":"tsdx lint","test":"tsdx test","build":"tsdx build","setup":"npm install && npm run validate","start":"tsdx watch","prepare":"tsdx build","test:ci":"tsdx test --ci --coverage --maxWorkers=2","validate":"npm run lint && npm run test","test:watch":"tsdx test --watch"},"typings":"dist/index.d.ts","_npmUser":{"name":"henningmu","email":"muszynski.henning@gmail.com"},"prettier":"@doist/prettier-config","_npmVersion":"6.13.6","description":"![logo](./.github/logo.png)","directories":{},"_nodeVersion":"12.14.1","dependencies":{"unist-util-flatmap":"^1.0.0","unist-util-visit-parents":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsdx":"^0.14.0","husky":"^4.3.0","tslib":"^2.0.1","remark":"^12.0.1","typescript":"^4.0.3","remark-html":"^12.0.0","@types/unist":"^2.0.3","@doist/prettier-config":"^3.0.5"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/remark-application-links_1.0.0_1601647212434_0.5483411993259533","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@doist/remark-application-links","version":"1.0.1","author":{"name":"Henning Muszynski"},"license":"MIT","_id":"@doist/remark-application-links@1.0.1","maintainers":[{"name":"doistuser","email":"amix@doist.io"},{"name":"henningmu","email":"muszynski.henning@gmail.com"},{"name":"jvalente","email":"joao@doist.io"},{"name":"stkao05","email":"st.kao.05@gmail.com"}],"dist":{"shasum":"038f6e808af85a12364635a0d4a0cf4f8be3dc8d","tarball":"https://registry.npmjs.org/@doist/remark-application-links/-/remark-application-links-1.0.1.tgz","fileCount":14,"integrity":"sha512-s2msJZPW7et4YKHa8J4kX2JirR+k7kIHVkkENNPIP8aglMLVQiVuopcY7HY0zGOn4CpN3PUsrKIrducj4a5x/A==","signatures":[{"sig":"MEYCIQD+bEKjvYVq0/ft9XltJcUTwtka7tmBINERiPFFOBkrfAIhAOiS+zaQ3S3byJl17VHENOrgvPSYiPpBebD10gXzEqaS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfdzNyCRA9TVsSAnZWagAA0mUP/3Em3i7kTZKJ8MrsGSuM\nQRhkQTEaCJT6u2XVMdhM0FoNUHN0vXTRaumBNwLY2VviDzHwuw/n/M39OYnT\n8+9ARJSRnVQEdidYvIzIOs2uD8B1pDVUwGW/FNx2UyTqtQYFnuQgE2/QswV4\nlufDu4rBvXVrO/LWrmv8UmfDJng8O/R2H7zY//Twgukv7L08LchjbXAccVtu\nJe0eUM4GMVDP++Y01CUeK7kcReGAqzeb7B/JwXd2UkSjItLMqKlucbQZ0qyt\nOFLKrGTwuIr2BpGPwLdVQAoirxfoLqWA4KJZHI4L0Y5TOkSl7k1YcH/Yqbt8\n/ZPtWuYTXdlbs/Iwf5X+P60P1XoTfsYgR2TZ4LhqkQBcwfIKsV6hZ2LQSFpN\nHGS/8wLfpdi5IH0HJ9nMjqn6FuiSZy8S6kHOd/gxg27i//+lJlxAt6BZt32j\nJD3u5aI7v84dyjk7V82c+/5kB5S124FB25oIOmD6/qmc/+OtwaS0vOuYoYvB\nkGl4HPIi8+3WgQY3fIRFgX3GTdJ2B1LQS8LQBpKTTG3zKXCRbzjhK4wHxo5j\n7RrmrXf0IZiVZIQZ90iL/2jvC09BG8R8zzdnkJUJFCRkqigiGehZoc716E+Q\nijWvl+8ahE1x5kTaXqbllPSoi6j4tBElNIHL/CvJZillumyEbVbT0YrjntBH\ne3gU\r\n=R+gI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","husky":{"hooks":{"pre-commit":"tsdx lint"}},"module":"dist/remark-application-links.esm.js","engines":{"node":">=12"},"gitHead":"1c5af4c60098a5e77847f0c4073d1ca8d2bf37f9","scripts":{"lint":"tsdx lint","test":"tsdx test","build":"tsdx build","setup":"npm install && npm run validate","start":"tsdx watch","prepare":"tsdx build","test:ci":"tsdx test --ci --coverage --maxWorkers=2","validate":"npm run lint && npm run test","test:watch":"tsdx test --watch"},"typings":"dist/index.d.ts","_npmUser":{"name":"henningmu","email":"muszynski.henning@gmail.com"},"prettier":"@doist/prettier-config","_npmVersion":"6.14.6","description":"![logo](./.github/logo.png)","directories":{},"_nodeVersion":"12.18.4","dependencies":{"unist-util-flatmap":"^1.0.0","unist-util-visit-parents":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsdx":"^0.14.0","husky":"^4.3.0","tslib":"^2.0.1","remark":"^12.0.1","typescript":"^4.0.3","remark-html":"^12.0.0","@types/unist":"^2.0.3","@doist/prettier-config":"^3.0.5"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/remark-application-links_1.0.1_1601647474244_0.5109418446091449","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"@doist/remark-application-links","version":"1.0.3","author":{"name":"Henning Muszynski"},"license":"MIT","_id":"@doist/remark-application-links@1.0.3","maintainers":[{"name":"ricardoist","email":"ricardo@doist.com"},{"name":"henningmu","email":"muszynski.henning@gmail.com"},{"name":"jvalente","email":"joao@doist.com"},{"name":"antondoist","email":"antonball@doist.com"},{"name":"jefcurtis","email":"jef@doist.com"},{"name":"doistbot","email":"dev@doist.com"},{"name":"fbidu","email":"felipe@doist.com"},{"name":"ernestodoist","email":"ernesto@doist.com"}],"homepage":"https://github.com/Doist/remark-application-links#readme","bugs":{"url":"https://github.com/Doist/remark-application-links/issues"},"dist":{"shasum":"3b27ff78b4280918fe9236db5dd9e3e1c4dda151","tarball":"https://registry.npmjs.org/@doist/remark-application-links/-/remark-application-links-1.0.3.tgz","fileCount":13,"integrity":"sha512-ODJ8tQOoKUr2gp/p7ZZ68Y5arx9jeZMaxKGm9yZLAc1RnirrnVxZZaYMtzzNdryLtd9i9ri6EvsaY2GRQPOg4A==","signatures":[{"sig":"MEQCIDVCTAHFJgRkbAHC0JB2piAoKXxYJhHlmehNqIwurQbSAiB2iDnDDWeBDaObqr2lnltAlCYc7W6yOSumSHLAyzrHVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@doist%2fremark-application-links@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":34277},"main":"dist/index.js","husky":{"hooks":{"pre-commit":"tsdx lint"}},"module":"dist/remark-application-links.esm.js","engines":{"node":">=24"},"gitHead":"4355e60df251e99001cae44db6f4a4f3cff83672","scripts":{"lint":"tsdx lint","test":"tsdx test","build":"tsdx build","setup":"npm install && npm run validate","start":"tsdx watch","prepare":"tsdx build","test:ci":"tsdx test --ci --coverage --maxWorkers=2","validate":"npm run lint && npm run test","test:watch":"tsdx test --watch"},"typings":"dist/index.d.ts","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d72ef9bf-b749-4715-b119-a8c97daf4fbc"}},"prettier":"@doist/prettier-config","repository":{"url":"git+https://github.com/Doist/remark-application-links.git","type":"git"},"_npmVersion":"11.6.2","description":"![logo](./.github/logo.png)","directories":{},"_nodeVersion":"24.10.0","dependencies":{"unist-util-flatmap":"^1.0.0","unist-util-visit-parents":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsdx":"^0.14.0","husky":"^4.3.0","tslib":"^2.0.1","remark":"^12.0.1","typescript":"^4.0.3","remark-html":"^12.0.0","@types/unist":"^2.0.3","@doist/prettier-config":"^3.0.5"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/remark-application-links_1.0.3_1761224403377_0.29768793758712886","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@doist/remark-application-links","version":"1.0.4","author":{"name":"Henning Muszynski"},"license":"MIT","_id":"@doist/remark-application-links@1.0.4","maintainers":[{"name":"ricardoist","email":"ricardo@doist.com"},{"name":"henningmu","email":"muszynski.henning@gmail.com"},{"name":"jvalente","email":"joao@doist.com"},{"name":"antondoist","email":"antonball@doist.com"},{"name":"jefcurtis","email":"jef@doist.com"},{"name":"doistbot","email":"dev@doist.com"},{"name":"fbidu","email":"felipe@doist.com"},{"name":"ernestodoist","email":"ernesto@doist.com"}],"homepage":"https://github.com/Doist/remark-application-links#readme","bugs":{"url":"https://github.com/Doist/remark-application-links/issues"},"dist":{"shasum":"3d10a7c04f6fcf95262818ccac5d041daa5c4e85","tarball":"https://registry.npmjs.org/@doist/remark-application-links/-/remark-application-links-1.0.4.tgz","fileCount":13,"integrity":"sha512-Y5C/dQG0wL90ewuYdMwbbr+QZ2wIWbAcSXZbWcTj016b1gh/rsAKf0qLmPOmCxQNGYbBAaPSJpGar6tVwyL1Qw==","signatures":[{"sig":"MEUCIQDdfhYr21qupAouiCjGEa4eWFu8qpmBy6Ww39AHULsqFQIgdckYo5HiCXgjP+gfMPOdv8uoUmepOc7I/5/PoCD7YnU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@doist%2fremark-application-links@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":34277},"main":"dist/index.js","husky":{"hooks":{"pre-commit":"tsdx lint"}},"module":"dist/remark-application-links.esm.js","engines":{"node":">=12"},"gitHead":"c90d42a7327f4c4db9c257760f45b86dccae5d85","scripts":{"lint":"tsdx lint","test":"tsdx test","build":"tsdx build","setup":"npm install && npm run validate","start":"tsdx watch","prepare":"tsdx build","test:ci":"tsdx test --ci --coverage --maxWorkers=2","validate":"npm run lint && npm run test","test:watch":"tsdx test --watch"},"typings":"dist/index.d.ts","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d72ef9bf-b749-4715-b119-a8c97daf4fbc"}},"prettier":"@doist/prettier-config","repository":{"url":"git+https://github.com/Doist/remark-application-links.git","type":"git"},"_npmVersion":"11.6.2","description":"![logo](./.github/logo.png)","directories":{},"_nodeVersion":"24.11.1","dependencies":{"unist-util-flatmap":"^1.0.0","unist-util-visit-parents":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsdx":"^0.14.0","husky":"^4.3.0","tslib":"^2.0.1","remark":"^12.0.1","typescript":"^4.0.3","remark-html":"^12.0.0","@types/unist":"^2.0.3","@doist/prettier-config":"^3.0.5"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/remark-application-links_1.0.4_1763544328713_0.30210891719881205","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2020-10-02T14:00:12.229Z","modified":"2026-08-21T21:58:03.559Z","1.0.0":"2020-10-02T14:00:12.540Z","1.0.1":"2020-10-02T14:04:34.403Z","1.0.3":"2025-10-23T13:00:03.580Z","1.0.4":"2025-11-19T09:25:28.885Z"},"bugs":{"url":"https://github.com/Doist/remark-application-links/issues"},"author":{"name":"Henning Muszynski"},"license":"MIT","homepage":"https://github.com/Doist/remark-application-links#readme","repository":{"url":"git+https://github.com/Doist/remark-application-links.git","type":"git"},"description":"![logo](./.github/logo.png)","maintainers":[{"email":"ricardo@doist.com","name":"ricardoist"},{"email":"muszynski.henning@gmail.com","name":"henningmu"},{"email":"joao@doist.com","name":"jvalente"},{"email":"antonball@doist.com","name":"antondoist"},{"email":"jef@doist.com","name":"jefcurtis"},{"email":"daw.gawel@gmail.com","name":"dmgawel"},{"email":"dev@doist.com","name":"doistbot"},{"email":"felipe@doist.com","name":"fbidu"},{"email":"goncalossilva@gmail.com","name":"goncalossilva"},{"email":"omar@doist.com","name":"omar.doist.com"},{"email":"scott@doist.com","name":"scottatdoist"},{"email":"craigcarlyle@me.com","name":"craigcarlyle"},{"email":"ernesto@doist.com","name":"ernestodoist"}],"readme":"![logo](./.github/logo.png)\n\n# remark-application-links\n\nYou want to allow your users to directly link deeply into their favorite applications like Notion or Mail. Per default remark only supports a handful of valid protocols when parsing links from text which makes this impossible. With the **remark-application-links** plugin you can support all the schemes and specify a block list of potentially dangerous ones.\n\nTurn\n\n```md\nHere's a link to my notion: notion://notion.so/user/123\n```\n\ninto\n\n```html\n<p>\n    Here's a link to my notion:\n    <a href=\"notion://notion.so/user/123\">notion://notion.so/user/123</a>\n</p>\n```\n\nMake sure you understand the security implications before using this plugin: [Security](#security)\n\nHeavily inspired by [remark-linkify-regex](https://gitlab.com/staltz/remark-linkify-regex) but different enough to justify a separate plugin.\n\nBootstrapped and built with [tsdx](https://github.com/formium/tsdx).\n\n## Installation\n\nUse [npm](https://www.npmjs.com/get-npm) or [yarn](https://yarnpkg.com/lang/en/docs/install/) to install:\n\n```sh\nnpm install @doist/remark-application-links\n# or\nyarn add @doist/remark-application-links\n```\n\n## Usage\n\nThis plugin exposes a function which you need to call with the blocked URL schemes (or with nothing to accept the default ones).\n\n```js\nremark().use(remarkApplicationLinksPlugin())\n// or with custom schemes\nremark().use(remarkApplicationLinksPlugin(['javascript', 'notion']))\n```\n\n## Security\n\nSince this plugin is using a block list of URL schemes instead of explictly allowing explicit ones it potentially opens up your application for attackers. The general stance in the security community is that a complete block list is hard (read: impossible) to achieve. If you want to be on the safe side it's better to rely on an explicit allow list of supported URL schemes.\n\nPer default we're blocking these url schemes:\n\n```js\nconst blockedUrlSchemes = ['data', 'jar', 'java', 'javascript', 'vbscript', 'view-source']\n```\n\nIn general it's recommended to not only rely on your parser to prevent inline script executions but apply a Content-Security Policy (CSP) on your page as reliable catch-all.\n\nYou're advised to thoroughly test your use cases to not open your users up to [cross-site scripting (XSS)](https://en.wikipedia.org/wiki/Cross-site_scripting) attacks. You might find additional tools like [rehype-sanitize](https://github.com/rehypejs/rehype-sanitize) helpful.\n\n### Markdown links and react-markdown\n\nThis plugin will transform this text:\n\n```md\n[link](<javascript:alert(1)>)\n```\n\ninto\n\n```html\n<p><a href=\"javascript:alert(1)\">link</a></p>\n```\n\nWhich is dangerous as it would execute JavaScript. If you allow users to enter the text this will open you up to cross-site scripting (XSS) attacks. As mentioned above a strong CSP will protect you from this and not allow the JavaScript to execute.\n\nThis plugin can be used in combination with [react-markdown](https://github.com/rexxars/react-markdown). In order to prevent the example above being parsed as a link you need to supply the `transformLinkUri` prop.\n\n## Changelog\n\nWe're maintaining a [changelog](./CHANGELOG.md) in this repository. Our versioning follows [semantic versioning](https://semver.org/).\n\n## Releasing\n\nA new version of remark-application-links is published both on npm and GitHub Package Registry whenever a new release on GitHub is created. A GitHub Action will automatically perform all the necessary steps.\n\nThe Action will release the version number that's specified inside the `package.json`'s `version` field so make sure that it reflects the version you want to publish. Additionally, the Action can be triggered manually in case something went wrong in the automation.\n\n## Contributing\n\nContributions are welcome. Check our [contributing guide](./CONTRIBUTING.md).\n\n## License\n\nThis project is distributed under the [MIT License](./LICENSE).\n","readmeFilename":"README.md"}