Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Socket
Sign inDemoInstall

@folklore/forms

Package Overview
Dependencies
Maintainers
3
Versions
19
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@folklore/forms - npm Package Compare versions

Comparing version 0.0.19 to 0.0.20

233

dist/cjs.js

@@ -5,5 +5,2 @@ 'use strict';

var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
var fetch = require('@folklore/fetch');

@@ -16,127 +13,86 @@ var isObject = require('lodash/isObject');

var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties);
var isObject__default = /*#__PURE__*/_interopDefaultLegacy(isObject);
var isString__default = /*#__PURE__*/_interopDefaultLegacy(isString);
var _excluded = ["value", "errors", "onChange"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var getFieldsPropsFromFields = function getFieldsPropsFromFields(fields, _ref) {
var value = _ref.value,
errors = _ref.errors,
_onChange = _ref.onChange,
props = _objectWithoutProperties__default["default"](_ref, _excluded);
return fields.reduce(function (allFields, field) {
var _ref2 = isObject__default["default"](field) ? field : {},
_ref2$name = _ref2.name,
name = _ref2$name === void 0 ? isString__default["default"](field) ? field : null : _ref2$name;
return _objectSpread(_objectSpread({}, allFields), {}, _defineProperty__default["default"]({}, name, _objectSpread(_objectSpread({}, isObject__default["default"](field) ? field : null), {}, {
name: name,
value: value !== null ? value[name] || null : null,
errors: errors !== null ? errors[name] || null : null,
onChange: function onChange(fieldValue) {
return _onChange(name, fieldValue);
const getFieldsPropsFromFields = (fields, _ref) => {
let {
value,
errors,
onChange,
...props
} = _ref;
return fields.reduce((allFields, field) => {
const {
name = isString__default["default"](field) ? field : null
} = isObject__default["default"](field) ? field : {};
return { ...allFields,
[name]: { ...(isObject__default["default"](field) ? field : null),
name,
value: value !== null ? value[name] || null : null,
errors: errors !== null ? errors[name] || null : null,
onChange: fieldValue => onChange(name, fieldValue),
...props
}
}, props)));
};
}, {});
};
var useForm = function useForm() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _opts$fields = opts.fields,
fields = _opts$fields === void 0 ? [] : _opts$fields,
_opts$action = opts.action,
action = _opts$action === void 0 ? null : _opts$action,
_opts$postForm = opts.postForm,
postForm = _opts$postForm === void 0 ? null : _opts$postForm,
_opts$initialErrors = opts.initialErrors,
initialErrors = _opts$initialErrors === void 0 ? null : _opts$initialErrors,
_opts$errors = opts.errors,
providedErrors = _opts$errors === void 0 ? null : _opts$errors,
_opts$setErrors = opts.setErrors,
setProvidedErrors = _opts$setErrors === void 0 ? null : _opts$setErrors,
_opts$initialGeneralE = opts.initialGeneralError,
initialGeneralError = _opts$initialGeneralE === void 0 ? null : _opts$initialGeneralE,
_opts$generalError = opts.generalError,
providedGeneralError = _opts$generalError === void 0 ? null : _opts$generalError,
_opts$setGeneralError = opts.setGeneralError,
setProvidedGeneralError = _opts$setGeneralError === void 0 ? null : _opts$setGeneralError,
_opts$initialValue = opts.initialValue,
initialValue = _opts$initialValue === void 0 ? null : _opts$initialValue,
_opts$value = opts.value,
providedValue = _opts$value === void 0 ? null : _opts$value,
_opts$setValue = opts.setValue,
setProvidedValue = _opts$setValue === void 0 ? null : _opts$setValue,
_opts$getFieldValue = opts.getFieldValue,
getFieldValue = _opts$getFieldValue === void 0 ? null : _opts$getFieldValue,
_opts$onComplete = opts.onComplete,
onComplete = _opts$onComplete === void 0 ? null : _opts$onComplete;
var _useState = react.useState(initialValue || providedValue),
_useState2 = _slicedToArray__default["default"](_useState, 2),
stateValue = _useState2[0],
setStateValue = _useState2[1];
var _useState3 = react.useState(initialErrors || providedErrors),
_useState4 = _slicedToArray__default["default"](_useState3, 2),
stateErrors = _useState4[0],
setStateErrors = _useState4[1];
var _useState5 = react.useState(initialGeneralError || providedGeneralError),
_useState6 = _slicedToArray__default["default"](_useState5, 2),
stateGeneralError = _useState6[0],
setStateGeneralError = _useState6[1];
var _useState7 = react.useState({
const useForm = function () {
let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
const {
fields = [],
action = null,
postForm = null,
initialErrors = null,
errors: providedErrors = null,
setErrors: setProvidedErrors = null,
initialGeneralError = null,
generalError: providedGeneralError = null,
setGeneralError: setProvidedGeneralError = null,
initialValue = null,
value: providedValue = null,
setValue: setProvidedValue = null,
getFieldValue = null,
onComplete = null
} = opts;
const [stateValue, setStateValue] = react.useState(initialValue || providedValue);
const [stateErrors, setStateErrors] = react.useState(initialErrors || providedErrors);
const [stateGeneralError, setStateGeneralError] = react.useState(initialGeneralError || providedGeneralError);
const [requestState, setRequestState] = react.useState({
success: false,
loading: false,
error: false
}),
_useState8 = _slicedToArray__default["default"](_useState7, 2),
requestState = _useState8[0],
setRequestState = _useState8[1];
});
const [response, setResponse] = react.useState(null);
const hasProvidedValue = setProvidedValue !== null;
const value = hasProvidedValue ? providedValue : stateValue;
const setValue = hasProvidedValue ? setProvidedValue : setStateValue;
const hasProvidedErrors = setProvidedErrors !== null;
const errors = hasProvidedErrors ? providedErrors : stateErrors;
const setErrors = hasProvidedErrors ? setProvidedErrors : setStateErrors;
const hasProvidedGeneralError = setProvidedGeneralError !== null;
const generalError = hasProvidedGeneralError ? providedGeneralError : stateGeneralError;
const setGeneralError = hasProvidedGeneralError ? setProvidedGeneralError : setStateGeneralError;
const fieldsKey = [value, errors, getFieldValue].concat(fields);
const onFieldChange = react.useCallback((fieldName, fieldValue) => {
const fieldErrors = errors !== null ? errors[fieldName] || null : null;
var _useState9 = react.useState(null),
_useState10 = _slicedToArray__default["default"](_useState9, 2),
response = _useState10[0],
setResponse = _useState10[1];
var hasProvidedValue = setProvidedValue !== null;
var value = hasProvidedValue ? providedValue : stateValue;
var setValue = hasProvidedValue ? setProvidedValue : setStateValue;
var hasProvidedErrors = setProvidedErrors !== null;
var errors = hasProvidedErrors ? providedErrors : stateErrors;
var setErrors = hasProvidedErrors ? setProvidedErrors : setStateErrors;
var hasProvidedGeneralError = setProvidedGeneralError !== null;
var generalError = hasProvidedGeneralError ? providedGeneralError : stateGeneralError;
var setGeneralError = hasProvidedGeneralError ? setProvidedGeneralError : setStateGeneralError;
var fieldsKey = [value, errors, getFieldValue].concat(fields);
var onFieldChange = react.useCallback(function (fieldName, fieldValue) {
var fieldErrors = errors !== null ? errors[fieldName] || null : null;
if (fieldErrors !== null) {
setErrors(_objectSpread(_objectSpread({}, errors), {}, _defineProperty__default["default"]({}, fieldName, null)));
setErrors({ ...errors,
[fieldName]: null
});
}
setValue(_objectSpread(_objectSpread({}, value), {}, _defineProperty__default["default"]({}, fieldName, getFieldValue !== null ? getFieldValue(fieldValue) : fieldValue)));
}, fieldsKey);
var fieldsProps = react.useMemo(function () {
return getFieldsPropsFromFields(fields, {
value: value,
errors: errors,
onChange: onFieldChange
setValue({ ...value,
[fieldName]: getFieldValue !== null ? getFieldValue(fieldValue) : fieldValue
});
}, fieldsKey);
var csrfToken = react.useMemo(function () {
return fetch.getCsrfToken();
}, []);
const fieldsProps = react.useMemo(() => getFieldsPropsFromFields(fields, {
value,
errors,
onChange: onFieldChange
}), fieldsKey);
const csrfToken = react.useMemo(() => fetch.getCsrfToken(), []);
var onSubmitError = function onSubmitError(error) {
const onSubmitError = error => {
setRequestState({

@@ -149,6 +105,5 @@ success: false,

if (error.name === 'ValidationError') {
var _error$getResponseDat = error.getResponseData(),
_error$getResponseDat2 = _error$getResponseDat.errors,
validationErrors = _error$getResponseDat2 === void 0 ? null : _error$getResponseDat2;
const {
errors: validationErrors = null
} = error.getResponseData();
setErrors(validationErrors);

@@ -160,3 +115,3 @@ } else {

var onSubmitSuccess = function onSubmitSuccess(resp) {
const onSubmitSuccess = resp => {
setRequestState({

@@ -171,10 +126,8 @@ success: true,

var finalPostForm = react.useCallback(function (postAction, postData) {
return postForm !== null ? postForm(postAction, postData) : fetch.postJSON(postAction, postData, {
credentials: 'include',
headers: fetch.getCSRFHeaders()
});
}, [postForm, fetch.postJSON, fetch.getCSRFHeaders]);
var submit = react.useCallback(function () {
var submitValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : value;
const finalPostForm = react.useCallback((postAction, postData) => postForm !== null ? postForm(postAction, postData) : fetch.postJSON(postAction, postData, {
credentials: 'include',
headers: fetch.getCSRFHeaders()
}), [postForm, fetch.postJSON, fetch.getCSRFHeaders]);
const submit = react.useCallback(function () {
let submitValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : value;
setRequestState({

@@ -187,11 +140,11 @@ success: false,

setErrors(null);
finalPostForm(action, _objectSpread(_objectSpread({}, submitValue), {}, {
finalPostForm(action, { ...submitValue,
_token: csrfToken
})).then(onSubmitSuccess).catch(onSubmitError);
}).then(onSubmitSuccess).catch(onSubmitError);
}, [finalPostForm, action, value]);
var onSubmit = react.useCallback(function (e) {
const onSubmit = react.useCallback(e => {
e.preventDefault();
submit();
}, [submit]);
var status = null;
let status = null;

@@ -206,17 +159,17 @@ if (requestState.loading) {

return _objectSpread(_objectSpread({
value: value,
setValue: setValue,
csrfToken: csrfToken,
submit: submit,
onSubmit: onSubmit
}, requestState), {}, {
status: status,
response: response,
return {
value,
setValue,
csrfToken,
submit,
onSubmit,
...requestState,
status,
response,
fields: fieldsProps,
errors: errors,
generalError: generalError
});
errors,
generalError
};
};
exports.useForm = useForm;

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

import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
import { getCsrfToken, postJSON, getCSRFHeaders } from '@folklore/fetch';

@@ -9,121 +6,83 @@ import isObject from 'lodash/isObject';

var _excluded = ["value", "errors", "onChange"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var getFieldsPropsFromFields = function getFieldsPropsFromFields(fields, _ref) {
var value = _ref.value,
errors = _ref.errors,
_onChange = _ref.onChange,
props = _objectWithoutProperties(_ref, _excluded);
return fields.reduce(function (allFields, field) {
var _ref2 = isObject(field) ? field : {},
_ref2$name = _ref2.name,
name = _ref2$name === void 0 ? isString(field) ? field : null : _ref2$name;
return _objectSpread(_objectSpread({}, allFields), {}, _defineProperty({}, name, _objectSpread(_objectSpread({}, isObject(field) ? field : null), {}, {
name: name,
value: value !== null ? value[name] || null : null,
errors: errors !== null ? errors[name] || null : null,
onChange: function onChange(fieldValue) {
return _onChange(name, fieldValue);
const getFieldsPropsFromFields = (fields, _ref) => {
let {
value,
errors,
onChange,
...props
} = _ref;
return fields.reduce((allFields, field) => {
const {
name = isString(field) ? field : null
} = isObject(field) ? field : {};
return { ...allFields,
[name]: { ...(isObject(field) ? field : null),
name,
value: value !== null ? value[name] || null : null,
errors: errors !== null ? errors[name] || null : null,
onChange: fieldValue => onChange(name, fieldValue),
...props
}
}, props)));
};
}, {});
};
var useForm = function useForm() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _opts$fields = opts.fields,
fields = _opts$fields === void 0 ? [] : _opts$fields,
_opts$action = opts.action,
action = _opts$action === void 0 ? null : _opts$action,
_opts$postForm = opts.postForm,
postForm = _opts$postForm === void 0 ? null : _opts$postForm,
_opts$initialErrors = opts.initialErrors,
initialErrors = _opts$initialErrors === void 0 ? null : _opts$initialErrors,
_opts$errors = opts.errors,
providedErrors = _opts$errors === void 0 ? null : _opts$errors,
_opts$setErrors = opts.setErrors,
setProvidedErrors = _opts$setErrors === void 0 ? null : _opts$setErrors,
_opts$initialGeneralE = opts.initialGeneralError,
initialGeneralError = _opts$initialGeneralE === void 0 ? null : _opts$initialGeneralE,
_opts$generalError = opts.generalError,
providedGeneralError = _opts$generalError === void 0 ? null : _opts$generalError,
_opts$setGeneralError = opts.setGeneralError,
setProvidedGeneralError = _opts$setGeneralError === void 0 ? null : _opts$setGeneralError,
_opts$initialValue = opts.initialValue,
initialValue = _opts$initialValue === void 0 ? null : _opts$initialValue,
_opts$value = opts.value,
providedValue = _opts$value === void 0 ? null : _opts$value,
_opts$setValue = opts.setValue,
setProvidedValue = _opts$setValue === void 0 ? null : _opts$setValue,
_opts$getFieldValue = opts.getFieldValue,
getFieldValue = _opts$getFieldValue === void 0 ? null : _opts$getFieldValue,
_opts$onComplete = opts.onComplete,
onComplete = _opts$onComplete === void 0 ? null : _opts$onComplete;
var _useState = useState(initialValue || providedValue),
_useState2 = _slicedToArray(_useState, 2),
stateValue = _useState2[0],
setStateValue = _useState2[1];
var _useState3 = useState(initialErrors || providedErrors),
_useState4 = _slicedToArray(_useState3, 2),
stateErrors = _useState4[0],
setStateErrors = _useState4[1];
var _useState5 = useState(initialGeneralError || providedGeneralError),
_useState6 = _slicedToArray(_useState5, 2),
stateGeneralError = _useState6[0],
setStateGeneralError = _useState6[1];
var _useState7 = useState({
const useForm = function () {
let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
const {
fields = [],
action = null,
postForm = null,
initialErrors = null,
errors: providedErrors = null,
setErrors: setProvidedErrors = null,
initialGeneralError = null,
generalError: providedGeneralError = null,
setGeneralError: setProvidedGeneralError = null,
initialValue = null,
value: providedValue = null,
setValue: setProvidedValue = null,
getFieldValue = null,
onComplete = null
} = opts;
const [stateValue, setStateValue] = useState(initialValue || providedValue);
const [stateErrors, setStateErrors] = useState(initialErrors || providedErrors);
const [stateGeneralError, setStateGeneralError] = useState(initialGeneralError || providedGeneralError);
const [requestState, setRequestState] = useState({
success: false,
loading: false,
error: false
}),
_useState8 = _slicedToArray(_useState7, 2),
requestState = _useState8[0],
setRequestState = _useState8[1];
});
const [response, setResponse] = useState(null);
const hasProvidedValue = setProvidedValue !== null;
const value = hasProvidedValue ? providedValue : stateValue;
const setValue = hasProvidedValue ? setProvidedValue : setStateValue;
const hasProvidedErrors = setProvidedErrors !== null;
const errors = hasProvidedErrors ? providedErrors : stateErrors;
const setErrors = hasProvidedErrors ? setProvidedErrors : setStateErrors;
const hasProvidedGeneralError = setProvidedGeneralError !== null;
const generalError = hasProvidedGeneralError ? providedGeneralError : stateGeneralError;
const setGeneralError = hasProvidedGeneralError ? setProvidedGeneralError : setStateGeneralError;
const fieldsKey = [value, errors, getFieldValue].concat(fields);
const onFieldChange = useCallback((fieldName, fieldValue) => {
const fieldErrors = errors !== null ? errors[fieldName] || null : null;
var _useState9 = useState(null),
_useState10 = _slicedToArray(_useState9, 2),
response = _useState10[0],
setResponse = _useState10[1];
var hasProvidedValue = setProvidedValue !== null;
var value = hasProvidedValue ? providedValue : stateValue;
var setValue = hasProvidedValue ? setProvidedValue : setStateValue;
var hasProvidedErrors = setProvidedErrors !== null;
var errors = hasProvidedErrors ? providedErrors : stateErrors;
var setErrors = hasProvidedErrors ? setProvidedErrors : setStateErrors;
var hasProvidedGeneralError = setProvidedGeneralError !== null;
var generalError = hasProvidedGeneralError ? providedGeneralError : stateGeneralError;
var setGeneralError = hasProvidedGeneralError ? setProvidedGeneralError : setStateGeneralError;
var fieldsKey = [value, errors, getFieldValue].concat(fields);
var onFieldChange = useCallback(function (fieldName, fieldValue) {
var fieldErrors = errors !== null ? errors[fieldName] || null : null;
if (fieldErrors !== null) {
setErrors(_objectSpread(_objectSpread({}, errors), {}, _defineProperty({}, fieldName, null)));
setErrors({ ...errors,
[fieldName]: null
});
}
setValue(_objectSpread(_objectSpread({}, value), {}, _defineProperty({}, fieldName, getFieldValue !== null ? getFieldValue(fieldValue) : fieldValue)));
}, fieldsKey);
var fieldsProps = useMemo(function () {
return getFieldsPropsFromFields(fields, {
value: value,
errors: errors,
onChange: onFieldChange
setValue({ ...value,
[fieldName]: getFieldValue !== null ? getFieldValue(fieldValue) : fieldValue
});
}, fieldsKey);
var csrfToken = useMemo(function () {
return getCsrfToken();
}, []);
const fieldsProps = useMemo(() => getFieldsPropsFromFields(fields, {
value,
errors,
onChange: onFieldChange
}), fieldsKey);
const csrfToken = useMemo(() => getCsrfToken(), []);
var onSubmitError = function onSubmitError(error) {
const onSubmitError = error => {
setRequestState({

@@ -136,6 +95,5 @@ success: false,

if (error.name === 'ValidationError') {
var _error$getResponseDat = error.getResponseData(),
_error$getResponseDat2 = _error$getResponseDat.errors,
validationErrors = _error$getResponseDat2 === void 0 ? null : _error$getResponseDat2;
const {
errors: validationErrors = null
} = error.getResponseData();
setErrors(validationErrors);

@@ -147,3 +105,3 @@ } else {

var onSubmitSuccess = function onSubmitSuccess(resp) {
const onSubmitSuccess = resp => {
setRequestState({

@@ -158,10 +116,8 @@ success: true,

var finalPostForm = useCallback(function (postAction, postData) {
return postForm !== null ? postForm(postAction, postData) : postJSON(postAction, postData, {
credentials: 'include',
headers: getCSRFHeaders()
});
}, [postForm, postJSON, getCSRFHeaders]);
var submit = useCallback(function () {
var submitValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : value;
const finalPostForm = useCallback((postAction, postData) => postForm !== null ? postForm(postAction, postData) : postJSON(postAction, postData, {
credentials: 'include',
headers: getCSRFHeaders()
}), [postForm, postJSON, getCSRFHeaders]);
const submit = useCallback(function () {
let submitValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : value;
setRequestState({

@@ -174,11 +130,11 @@ success: false,

setErrors(null);
finalPostForm(action, _objectSpread(_objectSpread({}, submitValue), {}, {
finalPostForm(action, { ...submitValue,
_token: csrfToken
})).then(onSubmitSuccess).catch(onSubmitError);
}).then(onSubmitSuccess).catch(onSubmitError);
}, [finalPostForm, action, value]);
var onSubmit = useCallback(function (e) {
const onSubmit = useCallback(e => {
e.preventDefault();
submit();
}, [submit]);
var status = null;
let status = null;

@@ -193,17 +149,17 @@ if (requestState.loading) {

return _objectSpread(_objectSpread({
value: value,
setValue: setValue,
csrfToken: csrfToken,
submit: submit,
onSubmit: onSubmit
}, requestState), {}, {
status: status,
response: response,
return {
value,
setValue,
csrfToken,
submit,
onSubmit,
...requestState,
status,
response,
fields: fieldsProps,
errors: errors,
generalError: generalError
});
errors,
generalError
};
};
export { useForm };
{
"name": "@folklore/forms",
"version": "0.0.19",
"version": "0.0.20",
"description": "Forms utilities",

@@ -42,3 +42,3 @@ "keywords": [

"@babel/runtime": "^7.4.3",
"@folklore/fetch": "^0.1.15",
"@folklore/fetch": "^0.1.16",
"lodash": "^4.17.4"

@@ -54,3 +54,3 @@ },

},
"gitHead": "0090dd6d8f9ee1c5790717d38e4e7ed845d5c30c"
"gitHead": "80b0b5301d3c79cca819327b0f95d8fac1a0b77d"
}
SocketSocket SOC 2 Logo

Product

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

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc