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

aft-core

Package Overview
Dependencies
Maintainers
1
Versions
35
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

aft-core - npm Package Compare versions

Comparing version 8.3.0 to 8.4.0

FileSystemMap/DTYDKFRMLZGUQLVMS.json

2

dist/src/configuration/aftconfig-provider.js

@@ -14,3 +14,2 @@ "use strict";

const file_io_1 = require("../helpers/file-io");
const log_manager_1 = require("../plugins/logging/log-manager");
const options_provider_1 = require("./options-provider");

@@ -31,3 +30,2 @@ class AftConfigProvider {

catch (e) {
log_manager_1.LogManager.toConsole({ name: this.constructor.name, message: e, level: 'warn' });
this._aftConfig = {};

@@ -34,0 +32,0 @@ }

@@ -9,3 +9,3 @@ "use strict";

{ exclude: /[\s]+/g, replaceWith: '_' },
{ exclude: /[\$\^\&\*\%\£\€\~\#\@\!\|\?\'\"\:\;\=\+\[\]]/g, replaceWith: '' }
{ exclude: /[\$\^\&\*\%\£\€\~\#\@\!\|\?\'\"\:\;\=\+\[\]\<\>]/g, replaceWith: '' }
];

@@ -12,0 +12,0 @@ })(SafeStringOption = exports.SafeStringOption || (exports.SafeStringOption = {}));

@@ -64,3 +64,3 @@ /**

/**
* this interface allows for more complex return values
* this type allows for more complex return values
* to be expressed from functions that would normally

@@ -67,0 +67,0 @@ * return a simple boolean

@@ -69,13 +69,13 @@ import { BuildInfoManager } from "../plugins/build-info/build-info-manager";

* NOTE: multiple `testId` values can be chained together
* @param testId a test identifier for your connected {AbstractTestCasePlugin}
* @param testIds a test identifier for your connected {AbstractTestCasePlugin}
* @returns this `Verifier` instance
*/
withTestId(testId: string): this;
withTestIds(...testIds: string[]): this;
/**
* allows for setting a `defectId` to be checked before executing the `assertion`.
* if the referenced `defectId` is _open_ then the `assertion` will not be run.
* @param defectId a defect identifier for your connected `DefectPlugin`
* @param defectIds a defect identifier for your connected `DefectPlugin`
* @returns this `Verifier` instance
*/
withKnownDefectId(defectId: string): this;
withKnownDefectIds(...defectIds: string[]): this;
/**

@@ -82,0 +82,0 @@ * allows for specifying either the expected return value or a `VerifierMatcher`

@@ -151,8 +151,10 @@ "use strict";

* NOTE: multiple `testId` values can be chained together
* @param testId a test identifier for your connected {AbstractTestCasePlugin}
* @param testIds a test identifier for your connected {AbstractTestCasePlugin}
* @returns this `Verifier` instance
*/
withTestId(testId) {
if (testId) {
this._tests.add(testId);
withTestIds(...testIds) {
if (testIds === null || testIds === void 0 ? void 0 : testIds.length) {
for (var i = 0; i < testIds.length; i++) {
this._tests.add(testIds[i]);
}
}

@@ -164,8 +166,10 @@ return this;

* if the referenced `defectId` is _open_ then the `assertion` will not be run.
* @param defectId a defect identifier for your connected `DefectPlugin`
* @param defectIds a defect identifier for your connected `DefectPlugin`
* @returns this `Verifier` instance
*/
withKnownDefectId(defectId) {
if (defectId) {
this._defects.add(defectId);
withKnownDefectIds(...defectIds) {
if (defectIds === null || defectIds === void 0 ? void 0 : defectIds.length) {
for (var i = 0; i < defectIds.length; i++) {
this._defects.add(defectIds[i]);
}
}

@@ -274,3 +278,3 @@ return this;

let defectId = defects[i];
let defect = yield this._defectMgr.getDefect(defectId);
let defect = yield this.defectMgr.getDefect(defectId);
if ((defect === null || defect === void 0 ? void 0 : defect.status) == 'open') {

@@ -277,0 +281,0 @@ return { success: false, message: `Defect: '${defectId}' is open so test should not be run.` };

@@ -70,4 +70,4 @@ "use strict";

return __awaiter(this, void 0, void 0, function* () {
let lvl = yield this.config('level', 'none');
return (log_level_1.LogLevel.isType(lvl)) ? lvl : 'none';
let lvl = yield this.config('level', 'info');
return (log_level_1.LogLevel.isType(lvl)) ? lvl : 'info';
});

@@ -74,0 +74,0 @@ }

@@ -40,3 +40,3 @@ "use strict";

}))
.withTestId('C1234').and.withTestId('C2345')
.withTestIds('C1234', 'C2345')
.and.withTestCaseManager(tcMgr)

@@ -66,3 +66,3 @@ .and.withDefectManager(dMgr);

.and.withDescription('true should be true')
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234', 'C2345');
expect(tcMgr.shouldRun).toHaveBeenCalledTimes(2);

@@ -94,3 +94,3 @@ expect(dMgr.findDefects).toHaveBeenCalledTimes(2);

.and.withDescription('array contains "bar"')
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234', 'C2345');
expect(tcMgr.shouldRun).toHaveBeenCalledTimes(2);

@@ -124,3 +124,3 @@ expect(dMgr.findDefects).toHaveBeenCalledTimes(2);

.withDescription('true should be true')
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234').and.withTestIds('C2345');
expect(true).toBe(false); // force failure

@@ -158,3 +158,3 @@ }

.and.withDescription('failure expected due to true not being false')
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234').and.withTestIds('C2345');
expect('foo').toBe('bar'); // force failure

@@ -191,3 +191,3 @@ }

.and.withDefectManager(dMgr)
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234', 'C2345');
expect(tcMgr.shouldRun).toHaveBeenCalledTimes(2);

@@ -225,3 +225,3 @@ expect(dMgr.findDefects).not.toHaveBeenCalled();

.and.withDefectManager(dMgr)
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234', 'C2345');
expect(tcMgr.shouldRun).toHaveBeenCalledWith('C1234');

@@ -259,3 +259,3 @@ expect(tcMgr.shouldRun).toHaveBeenCalledWith('C2345');

.and.withDefectManager(dMgr)
.and.withTestId('C1234');
.and.withTestIds('C1234');
expect(tcMgr.shouldRun).toHaveBeenCalledTimes(1);

@@ -299,4 +299,4 @@ expect(dMgr.findDefects).toHaveBeenCalledTimes(1);

.and.withDefectManager(dMgr)
.and.withTestId('C1234')
.and.withKnownDefectId('DEFECT-123').and.withKnownDefectId('DEFECT-234');
.and.withTestIds('C1234')
.and.withKnownDefectIds('DEFECT-123', 'DEFECT-234');
expect(tcMgr.shouldRun).toHaveBeenCalledTimes(1);

@@ -333,4 +333,3 @@ expect(dMgr.findDefects).toHaveBeenCalledTimes(1);

.and.withDefectManager(dMgr)
.and.withKnownDefectId('DEFECT-123')
.and.withKnownDefectId('DEFECT-234');
.and.withKnownDefectIds('DEFECT-123', 'DEFECT-234');
expect(tcMgr.shouldRun).not.toHaveBeenCalled();

@@ -337,0 +336,0 @@ expect(dMgr.findDefects).not.toHaveBeenCalled();

@@ -35,3 +35,3 @@ "use strict";

return count;
})).withTestId('C1234').and.withTestId('C2345')
})).withTestIds('C1234').and.withTestIds('C2345')
.and.withDescription('some tests require lots of actions')

@@ -38,0 +38,0 @@ .returns(10);

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

[["ZNUV4N92YFPJNNX","3ID9ZU9PBHEX3OP"],["BUZF6B2RIJA34HNRSB","IALLGWKLQQQPUHRFDVFEQLUENAUOVEUPRULJYOUEZZNTCDALIGWSJYUYXYPADBJITRQLJCILMZKYSHVKYKHMAVWBNXUTZRSYNHMAOHWWJQUFAXPRNDOMTBCMDXJSKFOIHN"],["J0BJ4WTCCBU5","TY95I1FTSP3WUPVDFIW8G"],["J4HZASZW21Y","ACPSQLFJCOIFLIWJUTISUGFNAZPCBKAVENEVWTXHCPFHXGLEUORZTPYPSLTLQZNZINPKQEOEOQTPDFLBGZUYWTCWXIQFJZDCWIVNBFHOHYRXZYLHVZASABNESXWOUBWZMPTUYSVQAFJXNLWEXPKFIFGACCKIGMBNVAVJYIXHILFLVD"],["TWIB39K4JX92","UPDR7DJORJTM8NFBK"],["T4DDKOU1NV6","VWF20LID3WGH7PGGGBNUT6"],["1XJO4FDLS36N","1CTWS4KR7C32MK76IT5RFKV"],["LBVTI1020HSO9TW5EW","QCNBUDXB26IU9GYJVU8PR43D"],["08A2PBYO921PBHB97MT","7YDX87CSQO6L0JSY"],["AYUDWJ31LRQ9P7","N3P4GJOQ7GCQTXPZE2EJ57GB7H4T"],["8JV1Y0XLJC4C3N","EASLAKZQBMIUGBRDVIZKBWIQUQRHSYHTLNBRLENMCJIOHLDLQFRKBMIUYECJKROWKRPNCKJMKRHTNPRDXTZKBGZQAGLMYKJRKYZDMFNJNKQBBUAGRDYYLZAYUHYQCNYZEOTLWEYPENFARDBRQYYSQBTSDE"],["TYNQ74KZPV3BHEXL1DS","UQ748BQ1O7Q736R3AZKW9B0Q58"],["WB29J11M3A783Q01PCW","5S3JTZ5L4FQSV0QHAO1S4Z"],["KTDD71Z7ZQ2ZZMLRE7","UYRNMBBPJ854ZC2"],["CB47X5BHCWAS3ELDUP","CH456UU6DOTYR05IUEXZZX64D"],["R7HN6FZQ7U3043I90R","0WTXENBA46288NC5WTAI"],["U60ST7WPBN","37W98NS52Q95BUBK"],["W4TKK4311SR60QB2KL8","BJDQYCPXRQAVJAAAEQWXHROPIGREGCODXMIHKQROPLZOHCLUIEUUAAORONBZCEDGIRBMGJOIRICTMXSVDZWHFFJTBSOTZFRXSQWHZNYBTYHFNOHPEFEINCUSWH"],["KQMSUV5T1N3NZGSOW69","VB0XO7K0R4UITXHET0PA2NU6K1"],["CP2BM2SV73TUY","YOAJTH8RJPF8CAWO4QTBO"],["FSV8ISVY9NZTGFM6BL","JRIXZ5RM7PXBIBGH7O2RKTUD48"],["93QQYCOPCRIPQ8F1L","QLWRL70E1G5I8ZNEO4FO59M"],["CVAJLGU0PR9Y8JL","5O6ZDJPKHWM1UN5DN5"],["LL1NIM2CL6C4L5V","ICHMTS9ST7CUOPE92"],["6GSD3M8B2WHKAWS5AZM","B2IO5KES4LPG84P"],["99QU9EEUL2S","715C6C09XXCE5OI4VIMMLFVIS"],["UBZUBTQQDZHRO7G6NT","TKANSGWBOIJQYTHBKJPUFCBYOCJXPFVLVPIBZJCBAFRCANYYAFIKZGLAIHNJJSWZSUISOXICALRDIRSZRCEJUWWMDWTLEUQRKDOHTYYXIUFOZTXFZWCFQTCBKJOBOBYXFSTDMBEAPSTYAOOCCBWRKULBLGUGTOPGDXIDULJDQYSRPCJEBCSAMBZARM"],["7QP4WFG0H5BUQ","O19JADL18SRNGLAMAOPBM6ID6"],["IXRFMBD40FB","22Z767N5V9OY8HPPW26WFWN935"],["N28BS2M1V5Y0HZXR","NIPM6PS2F969AMO36I8"],["KZPBEZVYASYY1GH","92GI5O2T58I8ZHDB1DY"],["053BDMIOWDFG669","PH5GZFFMQUXRIEDZIABDZQZZ"],["6JHZXGEGB4FMJ","12JPMJISFOPWP0TLTES"],["IHBAVPRF23","874LK1Q818TKEWZQ"],["69RWZXZHAHB1W50Y","PTBUBDMUFQ9XTIBZOKFA"],["W2TSA9P4AX9","XS9B3M7T5U92BI8C"]]
[["59OL8AFKBA5","BNTPA35ASDTM4KTUBRVXMH"],["7FWH1DT3UU","MSTNOPKELBXNMCQOJRDOMAVEDOMPHSUMLUEDIXXYCYPVTSGOBEYNUXISNHRIIZFXDLDPFRGNSYPPHIGYQICVLVZPBLCDCKBJQLDEUYJAQBLJP"],["MDCWVLWUHDO8","I6UD47O1WHSQPLA2XW5UYK2H"],["C0YMTW71XIFM944","2R4CJDB2RN7V3XA"],["OBDOQWNJKQJN4EEJOLQ","RVZVPVNBGRWJCDQFMOMFXBDSMGRYYXQWZDFHSBKGRQVQIRVNKWGSCSIIXLFAHTDZGOGEBNLHZITKMQLTZGOGNRIHJYANLQAYWYIOPZMRJSISFK"],["8NHADL8ZB6G98FYNT","UFR7IRHIBJEDLKN4GXMDZ"],["1S525LRWJGXNBX8SDW","YFJSDBW4LS7JVL50JK82LNXE70AUU"],["APFDN1QW0Q","STEPQJ429CDH5X51M"],["H2ROAJQ7ZZFOKSY05JK","4PGJE0D9DLR9FT20KYLBM96RY8O"],["6X86D4FTZH2VOH2Z","9U357BL4GQIS5RAYMP5BOVO"],["N8Z63D2PT9G0SY3GXR","OGL0YG67FZWJEDPZ0DEUO9A0LAH3V"],["0297YXGJRKQWHG0","VHEONAUMTFKJQEZPUIEBOJDZOQZLDFVBYTWZOFMTNLRDQGIFGILHKJGCZYRKRXJWBQFCDBARMPAUEVSTHPCXECQILXTECUZTTTWDZMP"],["O8ZM08DB7FRK96S","EIWL7QR3VKTG2CN32EWY0Z"],["FZMAM1A478CK3U","NH3DS4QC36EUAWUPUJ6"],["8MXUK2CPC1","CUJWSTDOFSOGUSWDUPVZCAGDQGXSACLUICRYMXKZRPKESZVAIMYPMSLPORBSBFVGOQEFMKMZTMTIIKBINRBKRNAURGBULGQJQAOTWBPKYUJYAWIPMGKQSVUYJBXAWFUDDCJIWRFIUANPQJAADKRED"],["B27GO5NALTAYK2","J8NKXH3Z3HHKEZWGZP"],["0H8P5TBSG2R6","AKWJWZOGYGZDAMMFP7KEGU"],["Z87MHE00BY8OT4P","A6037IES5YEZSATKFAL2BOBNK"],["O0GEFN4514GWVLIJ2","EM9YMSX9H77JRZYVBS3HL1"],["372F1KTFCGBQAJ4W1V","XPQV2Y0GJO0ZM7N7"],["KSDXOL600IODVC","AXKOUZVFLNF6DXQTLN6Y7O"],["V6XKUHAU7M","EY0FDQ15NSZNUXWS3SJGHY0UPL6"],["XQDEK7W2MV4","TKMVCCZEMZCZYGJLXDRGAOGGLVLRYZKIWDTCHCTIGENDZRQXSGJUNVVARJHQKYINOLYJBWERWEAEVYAFXTWYCQEXEFDJXTLWNNUCVJZGELTOZNPNI"],["677L7YBI98JEKFA","JNBUBJY8TW3HIHEOTU"],["7HLFZBS7W2GPB","M3YGZSLQJR33K2YLGJYJKOJDSR"],["NHA8R6IYOMP9G","7MIL6H3WVAW8B4FF"],["YA8YAAI4QV","FWWG2ND179RJ3VSGEGXENJ6"],["A9V9B42VTYW2T4","O5B4N1LN0F2LX1B5L3IJ9SPCAKY7S"],["87YPCSWHP7J","OC0M1J9YOWOYJWYJSYP"],["U3MT7CTH83P3J","E4582E48NQVQZOOVK"],["BBFQYS7EQGJJZYEPX","WBVJ71APDWTKFU6B2NI0"],["AMKZ5CEFDIBSUP0X1E","P3YEGVGR7W84WRCRV23W9"],["KUPE1JK02M6TK","ZA42C927SCWK9VLX3LE44CYBA"],["VGD4B1M5UBGA","0WCTF14VGPF70TMTCA"],["3JAPKLJ1OIWH","G0QXOSU20UVP0QXF85MICN1G7TKUB"]]
{
"name": "aft-core",
"version": "8.3.0",
"version": "8.4.0",
"description": "Automation Framework for Testing (AFT) package supporting JavaScript unit, integration and functional testing",

@@ -49,3 +49,3 @@ "repository": {

},
"gitHead": "48ced7ed9a8f95ea2a68cc6ffc7ebd90d0f2b86c"
"gitHead": "3d9a53f18d4ff58057b46c3ecaafb03feb7851ed"
}
# AFT-Core
the base AFT library providing support for Plugins and some test configuration and helper classes and functions
the base Automated Functional Testing (AFT) library providing support for Plugins, configuration, and helper classes and functions

@@ -4,0 +4,0 @@ ## Installation

import { JsonObject } from "../helpers/custom-types";
import { fileio } from "../helpers/file-io";
import { LogManager } from "../plugins/logging/log-manager";
import { IConfigProvider } from "./i-config-provider";

@@ -26,3 +25,2 @@ import { OptionsProvider } from "./options-provider";

} catch (e) {
LogManager.toConsole({name: this.constructor.name, message: e, level: 'warn'});
this._aftConfig = {};

@@ -29,0 +27,0 @@ }

@@ -12,3 +12,3 @@ import { JsonObject } from "./custom-types";

{exclude: /[\s]+/g, replaceWith: '_'},
{exclude: /[\$\^\&\*\%\£\€\~\#\@\!\|\?\'\"\:\;\=\+\[\]]/g, replaceWith: ''}
{exclude: /[\$\^\&\*\%\£\€\~\#\@\!\|\?\'\"\:\;\=\+\[\]\<\>]/g, replaceWith: ''}
];

@@ -15,0 +15,0 @@ }

@@ -68,3 +68,3 @@ /**

/**
* this interface allows for more complex return values
* this type allows for more complex return values
* to be expressed from functions that would normally

@@ -71,0 +71,0 @@ * return a simple boolean

@@ -157,8 +157,10 @@ import { buildinfo, BuildInfoManager } from "../plugins/build-info/build-info-manager";

* NOTE: multiple `testId` values can be chained together
* @param testId a test identifier for your connected {AbstractTestCasePlugin}
* @param testIds a test identifier for your connected {AbstractTestCasePlugin}
* @returns this `Verifier` instance
*/
withTestId(testId: string): this {
if (testId) {
this._tests.add(testId);
withTestIds(...testIds: string[]): this {
if (testIds?.length) {
for (var i=0; i<testIds.length; i++) {
this._tests.add(testIds[i]);
}
}

@@ -171,8 +173,10 @@ return this;

* if the referenced `defectId` is _open_ then the `assertion` will not be run.
* @param defectId a defect identifier for your connected `DefectPlugin`
* @param defectIds a defect identifier for your connected `DefectPlugin`
* @returns this `Verifier` instance
*/
withKnownDefectId(defectId: string): this {
if (defectId) {
this._defects.add(defectId);
withKnownDefectIds(...defectIds: string[]): this {
if (defectIds?.length) {
for (var i=0; i<defectIds.length; i++) {
this._defects.add(defectIds[i]);
}
}

@@ -282,3 +286,3 @@ return this;

let defectId: string = defects[i];
let defect: Defect = await this._defectMgr.getDefect(defectId);
let defect: Defect = await this.defectMgr.getDefect(defectId);
if (defect?.status == 'open') {

@@ -285,0 +289,0 @@ return {success: false, message: `Defect: '${defectId}' is open so test should not be run.`};

@@ -71,4 +71,4 @@ import { cloneDeep } from "lodash";

async level(): Promise<LogLevel> {
let lvl: string = await this.config('level', 'none');
return (LogLevel.isType(lvl)) ? lvl as LogLevel : 'none';
let lvl: string = await this.config('level', 'info');
return (LogLevel.isType(lvl)) ? lvl as LogLevel : 'info';
}

@@ -75,0 +75,0 @@

@@ -33,3 +33,3 @@ import { DefectManager, Defect, LogManager, rand, TestCaseManager, Verifier, verify } from "../../src";

})
.withTestId('C1234').and.withTestId('C2345')
.withTestIds('C1234','C2345')
.and.withTestCaseManager(tcMgr)

@@ -61,3 +61,3 @@ .and.withDefectManager(dMgr);

.and.withDescription('true should be true')
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234','C2345');

@@ -92,3 +92,3 @@ expect(tcMgr.shouldRun).toHaveBeenCalledTimes(2);

.and.withDescription('array contains "bar"')
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234','C2345');

@@ -125,3 +125,3 @@ expect(tcMgr.shouldRun).toHaveBeenCalledTimes(2);

.withDescription('true should be true')
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234').and.withTestIds('C2345');

@@ -162,3 +162,3 @@ expect(true).toBe(false); // force failure

.and.withDescription('failure expected due to true not being false')
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234').and.withTestIds('C2345');

@@ -198,3 +198,3 @@ expect('foo').toBe('bar'); // force failure

.and.withDefectManager(dMgr)
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234','C2345');

@@ -234,3 +234,3 @@ expect(tcMgr.shouldRun).toHaveBeenCalledTimes(2);

.and.withDefectManager(dMgr)
.and.withTestId('C1234').and.withTestId('C2345');
.and.withTestIds('C1234','C2345');

@@ -271,3 +271,3 @@ expect(tcMgr.shouldRun).toHaveBeenCalledWith('C1234');

.and.withDefectManager(dMgr)
.and.withTestId('C1234');
.and.withTestIds('C1234');

@@ -313,4 +313,4 @@ expect(tcMgr.shouldRun).toHaveBeenCalledTimes(1);

.and.withDefectManager(dMgr)
.and.withTestId('C1234')
.and.withKnownDefectId('DEFECT-123').and.withKnownDefectId('DEFECT-234');
.and.withTestIds('C1234')
.and.withKnownDefectIds('DEFECT-123','DEFECT-234');

@@ -350,4 +350,3 @@ expect(tcMgr.shouldRun).toHaveBeenCalledTimes(1);

.and.withDefectManager(dMgr)
.and.withKnownDefectId('DEFECT-123')
.and.withKnownDefectId('DEFECT-234');
.and.withKnownDefectIds('DEFECT-123','DEFECT-234');

@@ -354,0 +353,0 @@ expect(tcMgr.shouldRun).not.toHaveBeenCalled();

@@ -28,3 +28,3 @@ import { rand, verify } from "../src";

return count;
}).withTestId('C1234').and.withTestId('C2345')
}).withTestIds('C1234').and.withTestIds('C2345')
.and.withDescription('some tests require lots of actions')

@@ -31,0 +31,0 @@ .returns(10);

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

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
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc