New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@vue-storefront/middleware

Package Overview
Dependencies
Maintainers
8
Versions
102
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@vue-storefront/middleware - npm Package Compare versions

Comparing version 3.0.0 to 3.0.1

2

lib/index.cjs.js

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

"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("consola"),t=require("cookie-parser"),n=require("cors"),r=require("express"),i=require("helmet");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=o(e),a=o(t),u=o(n),c=o(r),l=o(i);const d=e=>"function"==typeof e;const f=["status","statusCode"];function g(e,t=1){const n=e||{};return t>3?null:Object.keys(n).reduce(function(e,t){return function(n,r){if(n)return n;if(f.includes(r))return e[r]||null;const i=t+1;return g(e[r],i)}}(n,t),null)}function p(e){return function(e){var t,n,r;if("Object"===(null===(r=null===(n=null!=(t=e)&&t)||void 0===n?void 0:n.constructor)||void 0===r?void 0:r.name))return function(e){return"isAxiosError"in e}(e)?function(e){return e.response.status}(e):function(e){return"networkError"in e||"code"in e}(e)?function(e){return e.networkError?500:e.code?"string"==typeof e.code?400:e.code:void 0}(e):g(e)}(e)||500}function m(e){try{return require(require.resolve(e,{paths:[process.cwd()]}))}catch(t){throw s.default.error(t),new Error(`Could not resolve integration "${e}". See the error above for more details.`)}}function v(e){return"string"==typeof e?m(e):[e]}async function h(e,t){return await Object.entries(t).reduce((async(t,[n,r])=>{s.default.info(`- Loading: ${n} ${r.location}`);const i=await t,o=m(r.location),a=function(e,t){const n=t.extensions,r=e.createApiClient._predefinedExtensions||[];return n?n(r):r}(o,r),u=function(e){return e.flatMap(v)}(a),c=await async function({apiClient:e,tag:t,integration:n}){if(d(null==e?void 0:e.init))try{s.default.success(`- Integration: ${t} init function Start!`);const r=await e.init(n.configuration);return s.default.success(`- Integration: ${t} init function Done!`),r}catch(e){throw Error(`Error during executing init function in ${t} integration. Error message: ${e}`)}return{}}({apiClient:o,integration:r,tag:n});return u.forEach((({name:t,extendApp:i})=>{s.default.info(`- Loading: ${n} extension: ${t}`),i&&i({app:e,configuration:r.configuration})})),s.default.success(`- Integration: ${n} loaded!`),{...i,[n]:{apiClient:o,extensions:u,initConfig:c,configuration:r.configuration,customQueries:r.customQueries}}}),Promise.resolve({}))}const y=c.default();y.use(c.default.json()),y.use(a.default()),y.use(u.default({credentials:!0,origin:"http://localhost:3000"})),y.disable("x-powered-by");const b=({args:e})=>e,C=({response:e})=>e,w=(e,t,n={before:b,after:C})=>Object.entries(e).reduce(((e,[r,i])=>({...e,[r]:async(...e)=>{const o=(e=>(t,n)=>{const{customQueries:r={}}=e,{metadata:i={}}=t||{};return Object.entries(n).reduce(((e,[n,o])=>{const s=null==t?void 0:t[n];return{...e,[n]:(s&&r[s]||(()=>o))({...o,metadata:i})}}),{})})(t),s=n.before({callName:r,args:e}),a={...t,extendQuery:o},u=await i(a,...s);return n.after({callName:r,args:e,response:u})}})),{});exports.apiClientFactory=e=>{const t=function(t,n={}){var r;const i=(null===(r=null==this?void 0:this.middleware)||void 0===r?void 0:r.extensions)||[],o=i.filter((e=>d(null==e?void 0:e.hooks))).map((({hooks:e})=>{var t,n;return e(null===(t=null==this?void 0:this.middleware)||void 0===t?void 0:t.req,null===(n=null==this?void 0:this.middleware)||void 0===n?void 0:n.res)})),s=i.reduce(((e,{extendApiMethods:t})=>({...e,...t})),n),a=o.filter((e=>d(null==e?void 0:e.beforeCreate))).reduce(((e,t)=>t.beforeCreate({configuration:e})),t),u=e.onCreate?e.onCreate(a):{config:t,client:t.client};u.config=o.filter((e=>d(null==e?void 0:e.afterCreate))).reduce(((e,t)=>t.afterCreate({configuration:e})),u.config);const c={before:e=>o.filter((e=>d(null==e?void 0:e.beforeCall))).reduce(((t,n)=>n.beforeCall({...e,configuration:u.config,args:t})),e.args),after:e=>o.filter((e=>d(e.afterCall))).reduce(((t,n)=>n.afterCall({...e,configuration:u.config,response:t})),e.response)};return{api:w({...e.api,...s},{...u,...(null==this?void 0:this.middleware)||{}},c),client:u.client,settings:u.config}};return t._predefinedExtensions=e.extensions||[],{createApiClient:t}},exports.createServer=async function(e){s.default.info("Middleware starting....");const t={contentSecurityPolicy:!1,crossOriginOpenerPolicy:!1,crossOriginEmbedderPolicy:!1,permittedCrossDomainPolicies:{permittedPolicies:"none"},...e.helmet||{}};(!0===e.helmet||e.helmet&&Object.keys(e.helmet).length>0)&&(y.use(l.default(t)),s.default.info("VSF `Helmet` middleware added")),s.default.info("Loading integrations...");const n=await h(y,e.integrations);return s.default.success("Integrations loaded!"),y.post("/:integrationName/:functionName",(async(e,t)=>{const{integrationName:r,functionName:i}=e.params;if(!n||!n[r])return t.status(404),void t.send(`"${r}" integration is not configured. Please, check the request path or integration configuration.`);const{apiClient:o,configuration:a,extensions:u,customQueries:c={},initConfig:l}=n[r],d={req:e,res:t,extensions:u,customQueries:c},f=o.createApiClient.bind({middleware:d})({...a,...l}).api[i];try{Symbol.iterator in Object(e.body)||(e.body=[e.body]);const n=await f(...e.body);t.send(n)}catch(e){s.default.error(e),t.status(p(e)),t.send("ServerError: Response not successful. Please, check server logs for more details.")}})),y.get("/healthz",((e,t)=>{t.end("ok")})),s.default.success("Middleware created!"),y};
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("consola"),t=require("cookie-parser"),n=require("cors"),r=require("express"),i=require("helmet");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=o(e),a=o(t),u=o(n),c=o(r),l=o(i);const d=e=>"function"==typeof e;const f=["status","statusCode"];function g(e,t=1){const n=e||{};return t>3?null:Object.keys(n).reduce(function(e,t){return function(n,r){if(n)return n;if(f.includes(r))return e[r]||null;const i=t+1;return g(e[r],i)}}(n,t),null)}function p(e){return function(e){if(function(e){var t,n;const r=null===(n=null===(t=null!=e&&e)||void 0===t?void 0:t.constructor)||void 0===n?void 0:n.name;return"Error"===r||"Object"===r}(e))return function(e){return"isAxiosError"in e}(e)?function(e){return e.response.status}(e):function(e){return"networkError"in e||"code"in e}(e)?function(e){return e.networkError?500:e.code?"string"==typeof e.code?400:e.code:void 0}(e):g(e)}(e)||500}function m(e){try{return require(require.resolve(e,{paths:[process.cwd()]}))}catch(t){throw s.default.error(t),new Error(`Could not resolve integration "${e}". See the error above for more details.`)}}function v(e){return"string"==typeof e?m(e):[e]}async function h(e,t){return await Object.entries(t).reduce((async(t,[n,r])=>{s.default.info(`- Loading: ${n} ${r.location}`);const i=await t,o=m(r.location),a=function(e,t){const n=t.extensions,r=e.createApiClient._predefinedExtensions||[];return n?n(r):r}(o,r),u=function(e){return e.flatMap(v)}(a),c=await async function({apiClient:e,tag:t,integration:n}){if(d(null==e?void 0:e.init))try{s.default.success(`- Integration: ${t} init function Start!`);const r=await e.init(n.configuration);return s.default.success(`- Integration: ${t} init function Done!`),r}catch(e){throw Error(`Error during executing init function in ${t} integration. Error message: ${e}`)}return{}}({apiClient:o,integration:r,tag:n});return u.forEach((({name:t,extendApp:i})=>{s.default.info(`- Loading: ${n} extension: ${t}`),i&&i({app:e,configuration:r.configuration})})),s.default.success(`- Integration: ${n} loaded!`),{...i,[n]:{apiClient:o,extensions:u,initConfig:c,configuration:r.configuration,customQueries:r.customQueries}}}),Promise.resolve({}))}const y=c.default();y.use(c.default.json()),y.use(a.default()),y.use(u.default({credentials:!0,origin:"http://localhost:3000"})),y.disable("x-powered-by");const b=({args:e})=>e,C=({response:e})=>e,w=(e,t,n={before:b,after:C})=>Object.entries(e).reduce(((e,[r,i])=>({...e,[r]:async(...e)=>{const o=(e=>(t,n)=>{const{customQueries:r={}}=e,{metadata:i={}}=t||{};return Object.entries(n).reduce(((e,[n,o])=>{const s=null==t?void 0:t[n];return{...e,[n]:(s&&r[s]||(()=>o))({...o,metadata:i})}}),{})})(t),s=n.before({callName:r,args:e}),a={...t,extendQuery:o},u=await i(a,...s);return n.after({callName:r,args:e,response:u})}})),{});exports.apiClientFactory=e=>{const t=function(t,n={}){var r;const i=(null===(r=null==this?void 0:this.middleware)||void 0===r?void 0:r.extensions)||[],o=i.filter((e=>d(null==e?void 0:e.hooks))).map((({hooks:e})=>{var t,n;return e(null===(t=null==this?void 0:this.middleware)||void 0===t?void 0:t.req,null===(n=null==this?void 0:this.middleware)||void 0===n?void 0:n.res)})),s=i.reduce(((e,{extendApiMethods:t})=>({...e,...t})),n),a=o.filter((e=>d(null==e?void 0:e.beforeCreate))).reduce(((e,t)=>t.beforeCreate({configuration:e})),t),u=e.onCreate?e.onCreate(a):{config:t,client:t.client};u.config=o.filter((e=>d(null==e?void 0:e.afterCreate))).reduce(((e,t)=>t.afterCreate({configuration:e})),u.config);const c={before:e=>o.filter((e=>d(null==e?void 0:e.beforeCall))).reduce(((t,n)=>n.beforeCall({...e,configuration:u.config,args:t})),e.args),after:e=>o.filter((e=>d(e.afterCall))).reduce(((t,n)=>n.afterCall({...e,configuration:u.config,response:t})),e.response)};return{api:w({...e.api,...s},{...u,...(null==this?void 0:this.middleware)||{}},c),client:u.client,settings:u.config}};return t._predefinedExtensions=e.extensions||[],{createApiClient:t}},exports.createServer=async function(e){s.default.info("Middleware starting....");const t={contentSecurityPolicy:!1,crossOriginOpenerPolicy:!1,crossOriginEmbedderPolicy:!1,permittedCrossDomainPolicies:{permittedPolicies:"none"},...e.helmet||{}};(!0===e.helmet||e.helmet&&Object.keys(e.helmet).length>0)&&(y.use(l.default(t)),s.default.info("VSF `Helmet` middleware added")),s.default.info("Loading integrations...");const n=await h(y,e.integrations);return s.default.success("Integrations loaded!"),y.post("/:integrationName/:functionName",(async(e,t)=>{const{integrationName:r,functionName:i}=e.params;if(!n||!n[r])return t.status(404),void t.send(`"${r}" integration is not configured. Please, check the request path or integration configuration.`);const{apiClient:o,configuration:a,extensions:u,customQueries:c={},initConfig:l}=n[r],d={req:e,res:t,extensions:u,customQueries:c},f=o.createApiClient.bind({middleware:d})({...a,...l}).api[i];try{Symbol.iterator in Object(e.body)||(e.body=[e.body]);const n=await f(...e.body);t.send(n)}catch(e){s.default.error(e);const n=p(e);t.status(n),n>=400&&n<500?t.send(e):t.send("ServerError: Response not successful. Please, check server logs for more details.")}})),y.get("/healthz",((e,t)=>{t.end("ok")})),s.default.success("Middleware created!"),y};
//# sourceMappingURL=index.cjs.js.map

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

import e from"consola";import n from"cookie-parser";import t from"cors";import r from"express";import i from"helmet";const o=e=>"function"==typeof e;const s=["status","statusCode"];function a(e,n=1){const t=e||{};return n>3?null:Object.keys(t).reduce(function(e,n){return function(t,r){if(t)return t;if(s.includes(r))return e[r]||null;const i=n+1;return a(e[r],i)}}(t,n),null)}function c(e){return function(e){var n,t,r;if("Object"===(null===(r=null===(t=null!=(n=e)&&n)||void 0===t?void 0:t.constructor)||void 0===r?void 0:r.name))return function(e){return"isAxiosError"in e}(e)?function(e){return e.response.status}(e):function(e){return"networkError"in e||"code"in e}(e)?function(e){return e.networkError?500:e.code?"string"==typeof e.code?400:e.code:void 0}(e):a(e)}(e)||500}function u(n){try{return require(require.resolve(n,{paths:[process.cwd()]}))}catch(t){throw e.error(t),new Error(`Could not resolve integration "${n}". See the error above for more details.`)}}function l(e){return"string"==typeof e?u(e):[e]}async function d(n,t){return await Object.entries(t).reduce((async(t,[r,i])=>{e.info(`- Loading: ${r} ${i.location}`);const s=await t,a=u(i.location),c=function(e,n){const t=n.extensions,r=e.createApiClient._predefinedExtensions||[];return t?t(r):r}(a,i),d=function(e){return e.flatMap(l)}(c),f=await async function({apiClient:n,tag:t,integration:r}){if(o(null==n?void 0:n.init))try{e.success(`- Integration: ${t} init function Start!`);const i=await n.init(r.configuration);return e.success(`- Integration: ${t} init function Done!`),i}catch(e){throw Error(`Error during executing init function in ${t} integration. Error message: ${e}`)}return{}}({apiClient:a,integration:i,tag:r});return d.forEach((({name:t,extendApp:o})=>{e.info(`- Loading: ${r} extension: ${t}`),o&&o({app:n,configuration:i.configuration})})),e.success(`- Integration: ${r} loaded!`),{...s,[r]:{apiClient:a,extensions:d,initConfig:f,configuration:i.configuration,customQueries:i.customQueries}}}),Promise.resolve({}))}const f=r();async function g(n){e.info("Middleware starting....");const t={contentSecurityPolicy:!1,crossOriginOpenerPolicy:!1,crossOriginEmbedderPolicy:!1,permittedCrossDomainPolicies:{permittedPolicies:"none"},...n.helmet||{}};(!0===n.helmet||n.helmet&&Object.keys(n.helmet).length>0)&&(f.use(i(t)),e.info("VSF `Helmet` middleware added")),e.info("Loading integrations...");const r=await d(f,n.integrations);return e.success("Integrations loaded!"),f.post("/:integrationName/:functionName",(async(n,t)=>{const{integrationName:i,functionName:o}=n.params;if(!r||!r[i])return t.status(404),void t.send(`"${i}" integration is not configured. Please, check the request path or integration configuration.`);const{apiClient:s,configuration:a,extensions:u,customQueries:l={},initConfig:d}=r[i],f={req:n,res:t,extensions:u,customQueries:l},g=s.createApiClient.bind({middleware:f})({...a,...d}).api[o];try{Symbol.iterator in Object(n.body)||(n.body=[n.body]);const e=await g(...n.body);t.send(e)}catch(n){e.error(n),t.status(c(n)),t.send("ServerError: Response not successful. Please, check server logs for more details.")}})),f.get("/healthz",((e,n)=>{n.end("ok")})),e.success("Middleware created!"),f}f.use(r.json()),f.use(n()),f.use(t({credentials:!0,origin:"http://localhost:3000"})),f.disable("x-powered-by");const m=({args:e})=>e,p=({response:e})=>e,h=(e,n,t={before:m,after:p})=>Object.entries(e).reduce(((e,[r,i])=>({...e,[r]:async(...e)=>{const o=(e=>(n,t)=>{const{customQueries:r={}}=e,{metadata:i={}}=n||{};return Object.entries(t).reduce(((e,[t,o])=>{const s=null==n?void 0:n[t];return{...e,[t]:(s&&r[s]||(()=>o))({...o,metadata:i})}}),{})})(n),s=t.before({callName:r,args:e}),a={...n,extendQuery:o},c=await i(a,...s);return t.after({callName:r,args:e,response:c})}})),{}),v=e=>{const n=function(n,t={}){var r;const i=(null===(r=null==this?void 0:this.middleware)||void 0===r?void 0:r.extensions)||[],s=i.filter((e=>o(null==e?void 0:e.hooks))).map((({hooks:e})=>{var n,t;return e(null===(n=null==this?void 0:this.middleware)||void 0===n?void 0:n.req,null===(t=null==this?void 0:this.middleware)||void 0===t?void 0:t.res)})),a=i.reduce(((e,{extendApiMethods:n})=>({...e,...n})),t),c=s.filter((e=>o(null==e?void 0:e.beforeCreate))).reduce(((e,n)=>n.beforeCreate({configuration:e})),n),u=e.onCreate?e.onCreate(c):{config:n,client:n.client};u.config=s.filter((e=>o(null==e?void 0:e.afterCreate))).reduce(((e,n)=>n.afterCreate({configuration:e})),u.config);const l={before:e=>s.filter((e=>o(null==e?void 0:e.beforeCall))).reduce(((n,t)=>t.beforeCall({...e,configuration:u.config,args:n})),e.args),after:e=>s.filter((e=>o(e.afterCall))).reduce(((n,t)=>t.afterCall({...e,configuration:u.config,response:n})),e.response)};return{api:h({...e.api,...a},{...u,...(null==this?void 0:this.middleware)||{}},l),client:u.client,settings:u.config}};return n._predefinedExtensions=e.extensions||[],{createApiClient:n}};export{v as apiClientFactory,g as createServer};
import e from"consola";import n from"cookie-parser";import t from"cors";import r from"express";import i from"helmet";const o=e=>"function"==typeof e;const s=["status","statusCode"];function c(e,n=1){const t=e||{};return n>3?null:Object.keys(t).reduce(function(e,n){return function(t,r){if(t)return t;if(s.includes(r))return e[r]||null;const i=n+1;return c(e[r],i)}}(t,n),null)}function a(e){return function(e){if(function(e){var n,t;const r=null===(t=null===(n=null!=e&&e)||void 0===n?void 0:n.constructor)||void 0===t?void 0:t.name;return"Error"===r||"Object"===r}(e))return function(e){return"isAxiosError"in e}(e)?function(e){return e.response.status}(e):function(e){return"networkError"in e||"code"in e}(e)?function(e){return e.networkError?500:e.code?"string"==typeof e.code?400:e.code:void 0}(e):c(e)}(e)||500}function u(n){try{return require(require.resolve(n,{paths:[process.cwd()]}))}catch(t){throw e.error(t),new Error(`Could not resolve integration "${n}". See the error above for more details.`)}}function l(e){return"string"==typeof e?u(e):[e]}async function d(n,t){return await Object.entries(t).reduce((async(t,[r,i])=>{e.info(`- Loading: ${r} ${i.location}`);const s=await t,c=u(i.location),a=function(e,n){const t=n.extensions,r=e.createApiClient._predefinedExtensions||[];return t?t(r):r}(c,i),d=function(e){return e.flatMap(l)}(a),f=await async function({apiClient:n,tag:t,integration:r}){if(o(null==n?void 0:n.init))try{e.success(`- Integration: ${t} init function Start!`);const i=await n.init(r.configuration);return e.success(`- Integration: ${t} init function Done!`),i}catch(e){throw Error(`Error during executing init function in ${t} integration. Error message: ${e}`)}return{}}({apiClient:c,integration:i,tag:r});return d.forEach((({name:t,extendApp:o})=>{e.info(`- Loading: ${r} extension: ${t}`),o&&o({app:n,configuration:i.configuration})})),e.success(`- Integration: ${r} loaded!`),{...s,[r]:{apiClient:c,extensions:d,initConfig:f,configuration:i.configuration,customQueries:i.customQueries}}}),Promise.resolve({}))}const f=r();async function g(n){e.info("Middleware starting....");const t={contentSecurityPolicy:!1,crossOriginOpenerPolicy:!1,crossOriginEmbedderPolicy:!1,permittedCrossDomainPolicies:{permittedPolicies:"none"},...n.helmet||{}};(!0===n.helmet||n.helmet&&Object.keys(n.helmet).length>0)&&(f.use(i(t)),e.info("VSF `Helmet` middleware added")),e.info("Loading integrations...");const r=await d(f,n.integrations);return e.success("Integrations loaded!"),f.post("/:integrationName/:functionName",(async(n,t)=>{const{integrationName:i,functionName:o}=n.params;if(!r||!r[i])return t.status(404),void t.send(`"${i}" integration is not configured. Please, check the request path or integration configuration.`);const{apiClient:s,configuration:c,extensions:u,customQueries:l={},initConfig:d}=r[i],f={req:n,res:t,extensions:u,customQueries:l},g=s.createApiClient.bind({middleware:f})({...c,...d}).api[o];try{Symbol.iterator in Object(n.body)||(n.body=[n.body]);const e=await g(...n.body);t.send(e)}catch(n){e.error(n);const r=a(n);t.status(r),r>=400&&r<500?t.send(n):t.send("ServerError: Response not successful. Please, check server logs for more details.")}})),f.get("/healthz",((e,n)=>{n.end("ok")})),e.success("Middleware created!"),f}f.use(r.json()),f.use(n()),f.use(t({credentials:!0,origin:"http://localhost:3000"})),f.disable("x-powered-by");const m=({args:e})=>e,p=({response:e})=>e,h=(e,n,t={before:m,after:p})=>Object.entries(e).reduce(((e,[r,i])=>({...e,[r]:async(...e)=>{const o=(e=>(n,t)=>{const{customQueries:r={}}=e,{metadata:i={}}=n||{};return Object.entries(t).reduce(((e,[t,o])=>{const s=null==n?void 0:n[t];return{...e,[t]:(s&&r[s]||(()=>o))({...o,metadata:i})}}),{})})(n),s=t.before({callName:r,args:e}),c={...n,extendQuery:o},a=await i(c,...s);return t.after({callName:r,args:e,response:a})}})),{}),v=e=>{const n=function(n,t={}){var r;const i=(null===(r=null==this?void 0:this.middleware)||void 0===r?void 0:r.extensions)||[],s=i.filter((e=>o(null==e?void 0:e.hooks))).map((({hooks:e})=>{var n,t;return e(null===(n=null==this?void 0:this.middleware)||void 0===n?void 0:n.req,null===(t=null==this?void 0:this.middleware)||void 0===t?void 0:t.res)})),c=i.reduce(((e,{extendApiMethods:n})=>({...e,...n})),t),a=s.filter((e=>o(null==e?void 0:e.beforeCreate))).reduce(((e,n)=>n.beforeCreate({configuration:e})),n),u=e.onCreate?e.onCreate(a):{config:n,client:n.client};u.config=s.filter((e=>o(null==e?void 0:e.afterCreate))).reduce(((e,n)=>n.afterCreate({configuration:e})),u.config);const l={before:e=>s.filter((e=>o(null==e?void 0:e.beforeCall))).reduce(((n,t)=>t.beforeCall({...e,configuration:u.config,args:n})),e.args),after:e=>s.filter((e=>o(e.afterCall))).reduce(((n,t)=>t.afterCall({...e,configuration:u.config,response:n})),e.response)};return{api:h({...e.api,...c},{...u,...(null==this?void 0:this.middleware)||{}},l),client:u.client,settings:u.config}};return n._predefinedExtensions=e.extensions||[],{createApiClient:n}};export{v as apiClientFactory,g as createServer};
//# sourceMappingURL=index.es.js.map
{
"name": "@vue-storefront/middleware",
"version": "3.0.0",
"version": "3.0.1",
"main": "lib/index.cjs.js",

@@ -5,0 +5,0 @@ "module": "lib/index.es.js",

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