Socket
Socket
Sign inDemoInstall

bootstrap-markdown-editor

Package Overview
Dependencies
0
Maintainers
1
Versions
11
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.2.2 to 2.2.3

2

dist/js/markdown-editor.min.js

@@ -1,1 +0,1 @@

"use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_createClass=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}();function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}!function(a){var e=function(){function i(e){_classCallCheck(this,i);var t=e||{},n={container:"MarkdownEditor",fullscreenButtonTitle:"Toggle fullscreen mode",previewButtonTitle:"Toggle preview mode",markdownToHtmlConvertor:function(e){return e},saveContentUrl:null,additionalButtons:[],window:a};this.toolbar=[{name:"",buttons:[{title:"Bold",className:"glyphicon glyphicon-bold",action:o.bold},{title:"Italic",className:"glyphicon glyphicon-italic",action:o.italic},{title:"Heading",className:"glyphicon glyphicon-header",action:null}]},{name:"",buttons:[{title:"Link",className:"glyphicon glyphicon-link",action:o.link},{title:"Image",className:"glyphicon glyphicon-picture",action:o.image}]},{name:"",buttons:[{title:"Unordered List",className:"glyphicon glyphicon-list",action:o.ulist},{title:"Ordered List",className:"glyphicon glyphicon-th-list",action:o.olist},{title:"Blockquote",className:"glyphicon glyphicon-comment",action:o.quote},{title:"Code",className:"glyphicon glyphicon-asterisk",action:o.code}]}],this.settings={container:t.container||n.container,fullscreenButtonTitle:t.fullscreenButtonTitle||n.fullscreenButtonTitle,previewButtonTitle:t.previewButtonTitle||n.previewButtonTitle,markdownToHtmlConvertor:t.markdownToHtmlConvertor||n.markdownToHtmlConvertor,additionalButtons:t.additionalButtons||n.additionalButtons,saveContentUrl:t.saveContentUrl||n.saveContentUrl,window:t.window||n.window},this._elements={},"string"==typeof this.settings.container?this._elements.editor=this.settings.window.document.getElementById(this.settings.container):"object"===_typeof(this.settings.container)&&(this._elements.editor=this.settings.container)}return _createClass(i,null,[{key:"FULLSCREEN_CLASS",get:function(){return"markdown-editor-fullscreen"}}]),_createClass(i,[{key:"load",value:function(e){!function(e){var t=e.settings.window.document,n=t.createElement("div");n.setAttribute("class","markdown-editor-wrapper"),(e._elements.wrapper=n).innerHTML='<div class=\'markdown-editor-header btn-toolbar\'>\n <div class="btn-group markdown-editor-modes" data-toggle="buttons">\n <label class="btn btn-default active" data-me-mode="editor" title="Editor">\n <input type="radio" name="markdownEditorMode" value="Editor" checked>\n <span class="glyphicon glyphicon-pencil"></span>\n </label>\n <label class="btn btn-default" data-me-mode="preview" title="Preview">\n <input type="radio" name="markdownEditorMode" value="Preview">\n <span class="glyphicon glyphicon-eye-open"></span>\n </label>\n <label class="btn btn-default" data-me-mode="split" title="Split mode">\n <input type="radio" name="markdownEditorMode" value="Split">\n <span class="glyphicon glyphicon-adjust"></span>\n </label>\n </div>\n\n <div class=\'btn-toolbar float-left markdown-toolbar-buttons\'>\n </div>\n\n <div class=\'btn-toolbar float-right\' style=\'margin-right:5px\'>\n <div class=\'btn-group\' style=\''+(e.settings.saveContentUrl?"":"display:none")+"'>\n <button type='button' class='btn btn-primary markdowneditor-save-btn' title='Save content'>\n <span class='glyphicon glyphicon-save'></span> Save\n </button>\n </div>\n\n <div class='btn-group'>\n <button type='button' class='btn markdowneditor-fullscreen-btn' title='"+e.settings.fullscreenButtonTitle+"'>\n <span class='glyphicon glyphicon-fullscreen'></span>\n </button>\n </div>\n </div>\n </div>";var i=t.createElement("div");i.setAttribute("class","markdown-editor-row");var o=t.createElement("div");o.setAttribute("class","markdown-editor-preview");var l=t.createElement("div");l.setAttribute("class","markdown-editor-preview-content"),o.appendChild(l),e._elements.preview=l;var s=e._elements.editor.parentNode,a=e._elements.editor.nextSibling;i.appendChild(e._elements.editor),i.appendChild(o),n.appendChild(i),a?s.insertBefore(n,a):s.appendChild(n);for(var r=n.getElementsByClassName("markdown-toolbar-buttons")[0],c=e._renderButtons(e.toolbar.concat(e.settings.additionalButtons||[])),d=0;d<c.length;d++)r.appendChild(c[d])}(this),function(n){var e=n._elements.wrapper,t=n.settings.window;if(e.getElementsByClassName("markdowneditor-fullscreen-btn")[0].addEventListener("click",function(e){n.enterFullscreen()}),n.settings.saveContentUrl){var i=e.getElementsByClassName("markdowneditor-save-btn")[0];i.addEventListener("click",function(e){var t=new XMLHttpRequest;t.open("PATCH",n.settings.saveContentUrl,!0),t.setRequestHeader("X-Requested-With","XMLHttpRequest"),t.setRequestHeader("Content-Type","text/plain"),t.onreadystatechange=function(){if(t.readyState===XMLHttpRequest.DONE){(function(e){if(!("Notification"in a))return alert(e);var t=function(){new Notification(e)};"granted"===Notification.permission?t():"denied"!==Notification.permission&&Notification.requestPermission(function(e){"granted"===e&&t()})})(200===t.status?"The post has been successfully saved.":"Error: "+t.responseText)}},t.send(n.getContent())})}for(var o,l=e.querySelectorAll(".markdown-editor-modes label.btn"),s=0;s<l.length;s++)l[s].addEventListener("click",function(e){n.changeMode(e.currentTarget.getAttribute("data-me-mode"))});n._elements.editor.addEventListener("input",function(){o&&t.clearTimeout(o);o=t.setTimeout(function(){n._updatePreview()},250)})}(this),(e=e||function(){}).call(this)}},{key:"changeMode",value:function(e){this._elements.wrapper.setAttribute("data-mode",e),this._updatePreview()}},{key:"enterFullscreen",value:function(){this.isFullscreenMode()?this.exitFullscreen():(this._elements.wrapper.classList.add(i.FULLSCREEN_CLASS),this.settings.window.document.body.classList.add(i.FULLSCREEN_CLASS))}},{key:"exitFullscreen",value:function(){this._elements.wrapper.classList.remove(i.FULLSCREEN_CLASS),this.settings.window.document.body.classList.remove(i.FULLSCREEN_CLASS)}},{key:"isFullscreenMode",value:function(){return this._elements.wrapper.classList.contains(i.FULLSCREEN_CLASS)}},{key:"getContent",value:function(){return this._elements.editor.value}},{key:"getSelection",value:function(){var e=this._elements.editor,t=e.selectionEnd-e.selectionStart;return{start:e.selectionStart,end:e.selectionEnd,length:t,text:e.value.substr(e.selectionStart,t)}}},{key:"setSelection",value:function(e,t){var n=this._elements.editor;n.selectionStart=e,n.selectionEnd=t}},{key:"replaceSelection",value:function(e){var t=this._elements.editor;t.value=t.value.substr(0,t.selectionStart)+e+t.value.substr(t.selectionEnd,t.value.length),t.selectionStart=t.value.length}},{key:"_updatePreview",value:function(){var e=this.getContent(),t=this.settings.markdownToHtmlConvertor(e);this._elements.preview.innerHTML=t}},{key:"_renderButtons",value:function(e){for(var t=[],n=0;n<e.length;n++){var i=e[n],o=this._renderButtonsGroup(i);t.push(o)}return t}},{key:"_renderButtonsGroup",value:function(e){var t=this.settings.window.document,n=t.createElement("div"),i=this;n.setAttribute("class","btn-group");for(var o=0;o<e.buttons.length;o++){var l=e.buttons[o],s=t.createElement("button");if(l.action){s.setAttribute("type","button"),s.setAttribute("class","btn btn-default"),s.setAttribute("title",l.title);var a=t.createElement("span");a.setAttribute("class",l.className),s.action=l.action;s.addEventListener("click",function(t){return function(e){t(i),i._updatePreview()}}(l.action)),s.appendChild(a),n.appendChild(s)}}return n}}]),i}(),o={decorate:function(e,t,n){var i,o,l=t.length,s=e.getSelection(),a=e.getContent();i=0===s.length?n:s.text,a.substr(s.start-l,l)===t&&a.substr(s.end,l)===t?(e.setSelection(s.start-l,s.end+l),e.replaceSelection(i),o=s.start-l):(e.replaceSelection(t+i+t),o=s.start+l),e.setSelection(o,o+i.length)},prependToSelection:function(e,n,t){var i,o=e.getSelection(),l=n.length;if(0===o.length)i=t,e.replaceSelection(n+i),o.start+l;else if(o.text.indexOf("\n")<0)i=o.text,e.replaceSelection(n+i),o.start+l;else{var s=[];i=(s=o.text.split("\n"))[0],s.forEach(function(e,t){s[t]=n+e}),e.replaceSelection("\n\n"+s.join("\n")),o.start+l+2}},bold:function(e){o.decorate(e,"**","Strong text")},italic:function(e){o.decorate(e,"_","Emphasized text")},heading:function(e){},link:function(e){var t,n,i,o=e.getSelection();if(t=0===o.length?"Enter link description here":o.text,i=e.settings.window.prompt("Insert Hyperlink","http://"),null!==i&&""!==i&&"http://"!==i&&"http"===i.substr(0,4)){var l=i;e.replaceSelection("["+t+"]("+l+")"),n=o.start+1,e.setSelection(n,n+t.length)}},image:function(e){var t,n,i,o=e.getSelection();if(t=0===o.length?"Enter image description here":o.text,null!==(i=e.settings.window.prompt("Insert Image Hyperlink","http://"))&&""!==i&&"http://"!==i){var l=i;e.replaceSelection("!["+t+"]("+l+' "Enter image title here")'),n=o.start+2,e.setSelection(n,n+t.length)}},ulist:function(e){o.prependToSelection(e,"- ","List text here")},olist:function(e){o.prependToSelection(e,"1. ","List text here")},quote:function(e){o.prependToSelection(e,"> ","Quote here")},code:function(e){o.decorate(e,"```","Code block")}};a.MarkdownEditor=e}(window);
"use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_createClass=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}();function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}!function(o){var e=function(){function i(e){_classCallCheck(this,i);var t=e||{},n={container:"MarkdownEditor",fullscreenButtonTitle:"Toggle fullscreen mode",previewButtonTitle:"Toggle preview mode",markdownToHtmlConvertor:function(e){return e},saveContentUrl:null,additionalButtons:[],window:o};this.toolbar=[{name:"",buttons:[{title:"Bold",className:"glyphicon glyphicon-bold",action:l.bold},{title:"Italic",className:"glyphicon glyphicon-italic",action:l.italic},{title:"Heading",className:"glyphicon glyphicon-header",action:null}]},{name:"",buttons:[{title:"Link",className:"glyphicon glyphicon-link",action:l.link},{title:"Image",className:"glyphicon glyphicon-picture",action:l.image}]},{name:"",buttons:[{title:"Unordered List",className:"glyphicon glyphicon-list",action:l.ulist},{title:"Ordered List",className:"glyphicon glyphicon-th-list",action:l.olist},{title:"Blockquote",className:"glyphicon glyphicon-comment",action:l.quote},{title:"Code",className:"glyphicon glyphicon-asterisk",action:l.code}]}],this.settings={container:t.container||n.container,fullscreenButtonTitle:t.fullscreenButtonTitle||n.fullscreenButtonTitle,previewButtonTitle:t.previewButtonTitle||n.previewButtonTitle,markdownToHtmlConvertor:t.markdownToHtmlConvertor||n.markdownToHtmlConvertor,additionalButtons:t.additionalButtons||n.additionalButtons,saveContentUrl:t.saveContentUrl||n.saveContentUrl,window:t.window||n.window},this._elements={},"string"==typeof this.settings.container?this._elements.editor=this.settings.window.document.getElementById(this.settings.container):"object"===_typeof(this.settings.container)&&(this._elements.editor=this.settings.container)}return _createClass(i,null,[{key:"FULLSCREEN_CLASS",get:function(){return"markdown-editor-fullscreen"}}]),_createClass(i,[{key:"load",value:function(e){!function(e){var t=e.settings.window.document,n=t.createElement("div");n.setAttribute("class","markdown-editor-wrapper"),(e._elements.wrapper=n).innerHTML='<div class=\'markdown-editor-header btn-toolbar\'>\n <div class="btn-group markdown-editor-modes" data-toggle="buttons">\n <label class="btn btn-default active" data-me-mode="editor" title="Editor">\n <input type="radio" name="markdownEditorMode" value="Editor" checked>\n <span class="glyphicon glyphicon-pencil"></span>\n </label>\n <label class="btn btn-default" data-me-mode="preview" title="Preview">\n <input type="radio" name="markdownEditorMode" value="Preview">\n <span class="glyphicon glyphicon-eye-open"></span>\n </label>\n <label class="btn btn-default" data-me-mode="split" title="Split mode">\n <input type="radio" name="markdownEditorMode" value="Split">\n <span class="glyphicon glyphicon-adjust"></span>\n </label>\n </div>\n\n <div class=\'btn-toolbar float-left markdown-toolbar-buttons\'>\n </div>\n\n <div class=\'btn-toolbar float-right\' style=\'margin-right:5px\'>\n <div class=\'btn-group\' style=\''+(e.settings.saveContentUrl?"":"display:none")+"'>\n <button type='button' role='button' tabindex='0' class='btn btn-primary markdowneditor-save-btn'>\n <span class='glyphicon glyphicon-save'></span> Save\n </button>\n </div>\n\n <div class='btn-group'>\n <button type='button' class='btn markdowneditor-fullscreen-btn' title='"+e.settings.fullscreenButtonTitle+"'>\n <span class='glyphicon glyphicon-fullscreen'></span>\n </button>\n </div>\n </div>\n </div>";var i=t.createElement("div");i.setAttribute("class","markdown-editor-row");var o=t.createElement("div");o.setAttribute("class","markdown-editor-preview");var l=t.createElement("div");l.setAttribute("class","markdown-editor-preview-content"),o.appendChild(l),e._elements.preview=l;var s=e._elements.editor.parentNode,a=e._elements.editor.nextSibling;i.appendChild(e._elements.editor),i.appendChild(o),n.appendChild(i),a?s.insertBefore(n,a):s.appendChild(n);for(var r=n.getElementsByClassName("markdown-toolbar-buttons")[0],c=e._renderButtons(e.toolbar.concat(e.settings.additionalButtons||[])),d=0;d<c.length;d++)r.appendChild(c[d])}(this),function(t){var o=t._elements.wrapper,l=t.settings.window;if(o.getElementsByClassName("markdowneditor-fullscreen-btn")[0].addEventListener("click",function(e){t.enterFullscreen()}),t.settings.saveContentUrl){var s=o.getElementsByClassName("markdowneditor-save-btn")[0];s.addEventListener("click",function(e){s.disabled=!0;var i=new XMLHttpRequest;i.open("PATCH",t.settings.saveContentUrl,!0),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i.setRequestHeader("Content-Type","text/plain"),i.onreadystatechange=function(){if(i.readyState===XMLHttpRequest.DONE){s.disabled=!1;var e="success",t="The content has been successfully saved.";200!==i.status&&(e="danger",t="An error occured while saving the content.");var n=document.createElement("div");n.setAttribute("class","alert alert-"+e),n.setAttribute("style","position:absolute;display:none;top:20px;left:50%;transform:translate(-50%,0)"),n.setAttribute("role","alert"),n.innerText=t,o.appendChild(n),$(n).fadeIn(1e3,function(){l.setTimeout(function(){$(n).fadeOut(4e3,function(){$(this).alert("close")})},2e3)})}},i.send(t.getContent())})}for(var e,n=o.querySelectorAll(".markdown-editor-modes label.btn"),i=0;i<n.length;i++)n[i].addEventListener("click",function(e){t.changeMode(e.currentTarget.getAttribute("data-me-mode"))});t._elements.editor.addEventListener("input",function(){e&&l.clearTimeout(e);e=l.setTimeout(function(){t._updatePreview()},250)})}(this),(e=e||function(){}).call(this)}},{key:"changeMode",value:function(e){this._elements.wrapper.setAttribute("data-mode",e),this._updatePreview()}},{key:"enterFullscreen",value:function(){this.isFullscreenMode()?this.exitFullscreen():(this._elements.wrapper.classList.add(i.FULLSCREEN_CLASS),this.settings.window.document.body.classList.add(i.FULLSCREEN_CLASS))}},{key:"exitFullscreen",value:function(){this._elements.wrapper.classList.remove(i.FULLSCREEN_CLASS),this.settings.window.document.body.classList.remove(i.FULLSCREEN_CLASS)}},{key:"isFullscreenMode",value:function(){return this._elements.wrapper.classList.contains(i.FULLSCREEN_CLASS)}},{key:"getContent",value:function(){return this._elements.editor.value}},{key:"getSelection",value:function(){var e=this._elements.editor,t=e.selectionEnd-e.selectionStart;return{start:e.selectionStart,end:e.selectionEnd,length:t,text:e.value.substr(e.selectionStart,t)}}},{key:"setSelection",value:function(e,t){var n=this._elements.editor;n.selectionStart=e,n.selectionEnd=t}},{key:"replaceSelection",value:function(e){var t=this._elements.editor;t.value=t.value.substr(0,t.selectionStart)+e+t.value.substr(t.selectionEnd,t.value.length),t.selectionStart=t.value.length}},{key:"_updatePreview",value:function(){var e=this.getContent(),t=this.settings.markdownToHtmlConvertor(e);this._elements.preview.innerHTML=t}},{key:"_renderButtons",value:function(e){for(var t=[],n=0;n<e.length;n++){var i=e[n],o=this._renderButtonsGroup(i);t.push(o)}return t}},{key:"_renderButtonsGroup",value:function(e){var t=this.settings.window.document,n=t.createElement("div"),i=this;n.setAttribute("class","btn-group");for(var o=0;o<e.buttons.length;o++){var l=e.buttons[o],s=t.createElement("button");if(l.action){s.setAttribute("type","button"),s.setAttribute("class","btn btn-default"),s.setAttribute("title",l.title);var a=t.createElement("span");a.setAttribute("class",l.className),s.action=l.action;s.addEventListener("click",function(t){return function(e){t(i),i._updatePreview()}}(l.action)),s.appendChild(a),n.appendChild(s)}}return n}}]),i}(),l={decorate:function(e,t,n){var i,o,l=t.length,s=e.getSelection(),a=e.getContent();i=0===s.length?n:s.text,a.substr(s.start-l,l)===t&&a.substr(s.end,l)===t?(e.setSelection(s.start-l,s.end+l),e.replaceSelection(i),o=s.start-l):(e.replaceSelection(t+i+t),o=s.start+l),e.setSelection(o,o+i.length)},prependToSelection:function(e,n,t){var i,o=e.getSelection(),l=n.length;if(0===o.length)i=t,e.replaceSelection(n+i),o.start+l;else if(o.text.indexOf("\n")<0)i=o.text,e.replaceSelection(n+i),o.start+l;else{var s=[];i=(s=o.text.split("\n"))[0],s.forEach(function(e,t){s[t]=n+e}),e.replaceSelection("\n\n"+s.join("\n")),o.start+l+2}},bold:function(e){l.decorate(e,"**","Strong text")},italic:function(e){l.decorate(e,"_","Emphasized text")},heading:function(e){},link:function(e){var t,n,i,o=e.getSelection();if(t=0===o.length?"Enter link description here":o.text,i=e.settings.window.prompt("Insert Hyperlink","http://"),null!==i&&""!==i&&"http://"!==i&&"http"===i.substr(0,4)){var l=i;e.replaceSelection("["+t+"]("+l+")"),n=o.start+1,e.setSelection(n,n+t.length)}},image:function(e){var t,n,i,o=e.getSelection();if(t=0===o.length?"Enter image description here":o.text,null!==(i=e.settings.window.prompt("Insert Image Hyperlink","http://"))&&""!==i&&"http://"!==i){var l=i;e.replaceSelection("!["+t+"]("+l+' "Enter image title here")'),n=o.start+2,e.setSelection(n,n+t.length)}},ulist:function(e){l.prependToSelection(e,"- ","List text here")},olist:function(e){l.prependToSelection(e,"1. ","List text here")},quote:function(e){l.prependToSelection(e,"> ","Quote here")},code:function(e){l.decorate(e,"```","Code block")}};o.MarkdownEditor=e}(window);

@@ -342,3 +342,3 @@ /*

<div class='btn-group' style='${self.settings.saveContentUrl ? '' : 'display:none'}'>
<button type='button' class='btn btn-primary markdowneditor-save-btn' title='Save content'>
<button type='button' role='button' tabindex='0' class='btn btn-primary markdowneditor-save-btn'>
<span class='glyphicon glyphicon-save'></span> Save

@@ -402,2 +402,4 @@ </button>

saveButton.addEventListener('click', function (e) {
saveButton.disabled = true;
var xhr = new XMLHttpRequest();

@@ -407,12 +409,30 @@ xhr.open("PATCH", self.settings.saveContentUrl, true);

xhr.setRequestHeader("Content-Type", "text/plain");
xhr.onreadystatechange = function () {
if(xhr.readyState === XMLHttpRequest.DONE) {
var message = "";
if (xhr.status === 200) {
message = "The post has been successfully saved.";
} else {
message = `Error: ${xhr.responseText}`;
saveButton.disabled = false;
var alertClass = "success";
var message = "The content has been successfully saved.";
if (xhr.status !== 200) {
alertClass = "danger";
message = "An error occured while saving the content.";
}
notify(message);
var alert = document.createElement("div");
alert.setAttribute("class", `alert alert-${alertClass}`);
alert.setAttribute("style", "position:absolute;display:none;top:20px;left:50%;transform:translate(-50%,0)");
alert.setAttribute("role", "alert");
alert.innerText = message;
wrapElement.appendChild(alert);
$(alert).fadeIn(1000, function () {
window.setTimeout(function () {
$(alert).fadeOut(4000, function () {
$(this).alert("close");
});
}, 2000);
});
}

@@ -445,31 +465,3 @@ };

function notify(message) {
if (!("Notification" in window)) {
alert(message);
return;
}
var showNotification = function () {
var notification = new Notification(message);
}
if (Notification.permission === "granted") {
// If it's okay let's create a notification
showNotification();
}
// Otherwise, we need to ask the user for permission
else if (Notification.permission !== 'denied') {
Notification.requestPermission(function (permission) {
// If the user accepts, let's create a notification
if (permission === "granted") {
showNotification();
}
});
}
// Finally, if the user has denied notifications and you
// want to be respectful there is no need to bother them any more.
}
window.MarkdownEditor = MarkdownEditor;
})(window);
{
"name": "bootstrap-markdown-editor",
"version": "2.2.2",
"version": "2.2.3",
"description": "Client-side markdown editor with the compatibility of any markdown render engine.",

@@ -5,0 +5,0 @@ "main": "js/markdown-editor.js",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc