chore: Update integration script to use performance testing code from private repo (#15991)
Clean up the perf folder and update integration commnds to use the new repo Co-authored-by: Satish Gandham <satish@appsmith.com>
This commit is contained in:
parent
44d1885ae9
commit
a76fd48ddc
14
.github/workflows/integration-tests-command.yml
vendored
14
.github/workflows/integration-tests-command.yml
vendored
|
|
@ -1330,6 +1330,7 @@ jobs:
|
|||
# Only run if the build step is successful
|
||||
if: success()
|
||||
runs-on: buildjet-4vcpu-ubuntu-2004
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: app/client
|
||||
|
|
@ -1350,6 +1351,19 @@ jobs:
|
|||
- 27017:27017
|
||||
|
||||
steps:
|
||||
- name: Checkout Performance Infra code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: appsmithorg/performance-infra
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
ref: main
|
||||
path: app/client/perf
|
||||
|
||||
- name: List files
|
||||
run: ls
|
||||
ls perf
|
||||
|
||||
|
||||
# Check out merge commitGIT BRANCH
|
||||
- name: Fork based /ok-to-test-perf checkout
|
||||
uses: actions/checkout@v2
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
const { summaries } = require("./src/summary");
|
||||
const path = require("path");
|
||||
|
||||
global.APP_ROOT = path.join(__dirname); //Going back one level from src folder to /perf
|
||||
|
||||
summaries(`${__dirname}/traces/reports`);
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
{
|
||||
"name": "ui-performance-infra",
|
||||
"version": "1.0.0",
|
||||
"description": "Tools to automate chrome performance profiling",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@supabase/supabase-js": "^1.30.2",
|
||||
"median": "^0.0.2",
|
||||
"node-stdev": "^1.0.1",
|
||||
"puppeteer": "^13.5.1",
|
||||
"sanitize-filename": "^1.6.3",
|
||||
"tracelib": "^1.0.1"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
### Adding credentials to app export
|
||||
- In the exported app add this property under `datasourceList` in the item corresponding to the plugin you are adding credentials for.
|
||||
|
||||
```
|
||||
"datasourceConfiguration": {
|
||||
"connection": {
|
||||
"mode": "READ_WRITE",
|
||||
"ssl": {
|
||||
"authType": "DEFAULT"
|
||||
}
|
||||
},
|
||||
"endpoints": [{
|
||||
"host": "localhost",
|
||||
"port": 5432
|
||||
}],
|
||||
"sshProxyEnabled": false
|
||||
},
|
||||
```
|
||||
- Add this key at the top level
|
||||
```
|
||||
"decryptedFields": {
|
||||
"PostgresGolden": {
|
||||
"password": "********",
|
||||
"authType": "com.appsmith.external.models.DBAuth",
|
||||
"dbAuth": {
|
||||
"authenticationType": "dbAuth",
|
||||
"authenticationType": "dbAuth",
|
||||
"username": "********",
|
||||
"databaseName": "db_name"
|
||||
}
|
||||
}
|
||||
},
|
||||
```
|
||||
|
|
@ -1,138 +0,0 @@
|
|||
const { createClient } = require("@supabase/supabase-js");
|
||||
const fs = require("fs");
|
||||
const { actions } = require("../../tests/actions");
|
||||
const { parseReports } = require("../summary");
|
||||
const supabaseUrl = "https://ymiketujsffsmdmgpmut.supabase.co";
|
||||
const os = require("os");
|
||||
const hostname = os.hostname();
|
||||
|
||||
const metricsToLog = [
|
||||
"scripting",
|
||||
"painting",
|
||||
"rendering",
|
||||
"idle",
|
||||
"other",
|
||||
"ForcedLayout",
|
||||
"ForcedStyle",
|
||||
"LongHandler",
|
||||
"LongTask",
|
||||
];
|
||||
|
||||
const supabaseKey = process.env.APPSMITH_PERF_SUPABASE_SECRET || "empty";
|
||||
const supabase = createClient(supabaseUrl, supabaseKey);
|
||||
|
||||
const actionRows = Object.keys(actions).map((action) => ({
|
||||
name: actions[action],
|
||||
}));
|
||||
|
||||
const createActions = async () => {
|
||||
const errors = [];
|
||||
|
||||
await Promise.all(
|
||||
actionRows.map(async (action) => {
|
||||
const { data, error } = await supabase
|
||||
.from("action")
|
||||
.upsert([action], { ignoreDuplicates: true });
|
||||
if (error) {
|
||||
errors.push(error);
|
||||
}
|
||||
}),
|
||||
);
|
||||
|
||||
console.log(errors);
|
||||
};
|
||||
|
||||
const createMetrics = async () => {
|
||||
const errors = [];
|
||||
|
||||
await Promise.all(
|
||||
metricsToLog.map(async (metric) => {
|
||||
const { data, error } = await supabase
|
||||
.from("metric")
|
||||
.upsert([{ name: metric }], { ignoreDuplicates: true });
|
||||
if (error) {
|
||||
errors.push(error);
|
||||
}
|
||||
}),
|
||||
);
|
||||
|
||||
console.log(errors);
|
||||
};
|
||||
|
||||
const createRunMeta = async () => {
|
||||
let prId;
|
||||
try {
|
||||
const ev = JSON.parse(
|
||||
fs.readFileSync(process.env.GITHUB_EVENT_PATH, "utf8"),
|
||||
);
|
||||
|
||||
prId = ev.client_payload.pull_request.number;
|
||||
} catch (e) {
|
||||
console.log("Error fetching PR id", e);
|
||||
}
|
||||
const { data, error } = await supabase.from("run_meta").insert([
|
||||
{
|
||||
gh_run_number: process.env?.GITHUB_RUN_NUMBER || 1,
|
||||
commit_id: process.env?.GITHUB_SHA,
|
||||
branch: process.env?.GITHUB_REF_NAME,
|
||||
gh_run_id: process.env?.GITHUB_RUN_ID || 1,
|
||||
pull_request_id: prId || parsePullRequestId(process.env.GITHUB_REF),
|
||||
runner_name: process.env?.RUNNER_NAME,
|
||||
host_name: hostname,
|
||||
machine: process.env?.MACHINE || "buildjet-4vcpu-ubuntu-2004", // Hardcoded temporarily. Should be removed
|
||||
},
|
||||
]);
|
||||
if (data) {
|
||||
return data[0];
|
||||
}
|
||||
console.log(error);
|
||||
};
|
||||
const saveData = async (results) => {
|
||||
const run_meta = await createRunMeta();
|
||||
|
||||
const rows = [];
|
||||
Object.keys(results).forEach((action) => {
|
||||
Object.keys(results[action]).forEach((metric) => {
|
||||
let row = {};
|
||||
row["action"] = action;
|
||||
row["metric"] = metric;
|
||||
row["meta"] = run_meta.id;
|
||||
const runs = results[action][metric];
|
||||
runs.forEach((value, i) => {
|
||||
row = { ...row, value };
|
||||
rows.push(row);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const { data, error } = await supabase.from("run").insert(rows);
|
||||
|
||||
if (error) {
|
||||
console.log(error);
|
||||
}
|
||||
};
|
||||
|
||||
exports.saveToSupabase = async () => {
|
||||
const results = await parseReports(
|
||||
`${APP_ROOT}/traces/reports`,
|
||||
["scripting", "painting", "rendering", "idle", "other"],
|
||||
["ForcedLayout", "ForcedStyle", "LongHandler", "LongTask"],
|
||||
);
|
||||
|
||||
await createMetrics();
|
||||
await createActions();
|
||||
await saveData(results);
|
||||
};
|
||||
|
||||
"use strict";
|
||||
|
||||
const parsePullRequestId = (githubRef) => {
|
||||
const result = /refs\/pull\/(\d+)\/merge/g.exec(githubRef);
|
||||
if (!result) {
|
||||
return -1;
|
||||
}
|
||||
const [, pullRequestId] = result;
|
||||
return pullRequestId;
|
||||
};
|
||||
|
||||
createMetrics();
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
const glob = require("glob");
|
||||
const path = require("path");
|
||||
const { summaries } = require("./summary");
|
||||
const { saveToSupabase } = require("./ci/supabase");
|
||||
var cp = require("child_process");
|
||||
var fs = require("fs");
|
||||
|
||||
// Create the directory
|
||||
global.APP_ROOT = path.join(__dirname, ".."); //Going back one level from src folder to /perf
|
||||
const dir = `${APP_ROOT}/traces/reports`;
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
|
||||
glob("./tests/*.perf.js", {}, async function(er, files) {
|
||||
// Initial setup
|
||||
await cp.execSync(`node ./tests/initial-setup.js`, { stdio: "inherit" });
|
||||
|
||||
files.forEach(async (file) => {
|
||||
await cp.execSync(`node ${file}`, { stdio: "inherit" }); // Logging to terminal, log it to a file in future?
|
||||
});
|
||||
await summaries(`${APP_ROOT}/traces/reports`);
|
||||
await saveToSupabase();
|
||||
});
|
||||
|
|
@ -1,233 +0,0 @@
|
|||
const Tracelib = require("tracelib");
|
||||
const puppeteer = require("puppeteer");
|
||||
var sanitize = require("sanitize-filename");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const {
|
||||
delay,
|
||||
getFormattedTime,
|
||||
login,
|
||||
sortObjectKeys,
|
||||
} = require("./utils/utils");
|
||||
|
||||
const {
|
||||
cleanTheHost,
|
||||
setChromeProcessPriority,
|
||||
} = require("./utils/system-cleanup");
|
||||
|
||||
const selectors = {
|
||||
appMoreIcon: "span.t--options-icon",
|
||||
workspaceImportAppOption: '[data-cy*="t--workspace-import-app"]',
|
||||
fileInput: "#fileInput",
|
||||
importButton: '[data-cy*="t--workspace-import-app-button"]',
|
||||
createNewApp: ".createnew",
|
||||
};
|
||||
|
||||
module.exports = class Perf {
|
||||
constructor(launchOptions = {}) {
|
||||
this.iteration = launchOptions.iteration || 0; // Current iteration number
|
||||
this.launchOptions = {
|
||||
defaultViewport: null,
|
||||
args: ["--window-size=1920,1080"],
|
||||
ignoreHTTPSErrors: true, // @todo Remove it after initial testing
|
||||
...launchOptions,
|
||||
};
|
||||
|
||||
if (process.env.PERF_TEST_ENV === "dev") {
|
||||
this.launchOptions.executablePath =
|
||||
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
|
||||
this.launchOptions.devtools = true;
|
||||
this.launchOptions.headless = false;
|
||||
}
|
||||
|
||||
this.traces = [];
|
||||
this.currentTrace = null;
|
||||
this.browser = null;
|
||||
|
||||
// Initial setup
|
||||
this.currentTestFile = process.argv[1]
|
||||
.split("/")
|
||||
.pop()
|
||||
.replace(".perf.js", "");
|
||||
global.APP_ROOT = path.join(__dirname, ".."); //Going back one level from src folder to /perf
|
||||
|
||||
process.on("unhandledRejection", this.handleRejections);
|
||||
}
|
||||
|
||||
handleRejections = async (reason = "", p = "") => {
|
||||
console.error("Unhandled Rejection at: Promise", p, "reason:", reason);
|
||||
const fileName = sanitize(`${this.currentTestFile}__${this.currentTrace}`);
|
||||
|
||||
if (!this.page) {
|
||||
console.warn("No page instance was found", this.currentTestFile);
|
||||
return;
|
||||
}
|
||||
const screenshotPath = `${APP_ROOT}/traces/reports/${fileName}-${getFormattedTime()}.png`;
|
||||
await this.page.screenshot({
|
||||
path: screenshotPath,
|
||||
});
|
||||
|
||||
const pageContent = await this.page.evaluate(() => {
|
||||
return document.querySelector("body").innerHTML;
|
||||
});
|
||||
|
||||
fs.writeFile(
|
||||
`${APP_ROOT}/traces/reports/${fileName}-${getFormattedTime()}.html`,
|
||||
pageContent,
|
||||
(err) => {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
if (this.currentTrace) {
|
||||
await this.stopTrace();
|
||||
}
|
||||
this.browser.close();
|
||||
};
|
||||
/**
|
||||
* Launches the browser and, gives you the page
|
||||
*/
|
||||
launch = async () => {
|
||||
await cleanTheHost();
|
||||
await delay(3000);
|
||||
this.browser = await puppeteer.launch(this.launchOptions);
|
||||
const pages_ = await this.browser.pages();
|
||||
this.page = pages_[0];
|
||||
|
||||
await setChromeProcessPriority();
|
||||
await this._login();
|
||||
};
|
||||
|
||||
_login = async () => {
|
||||
await login(this.page);
|
||||
await delay(2000, "after login");
|
||||
};
|
||||
|
||||
startTrace = async (action = "foo") => {
|
||||
if (this.currentTrace) {
|
||||
console.warn(
|
||||
"Trace already in progress. You can run only one trace at a time",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
this.currentTrace = action;
|
||||
await delay(3000, `before starting trace ${action}`);
|
||||
await this.page._client.send("HeapProfiler.enable");
|
||||
await this.page._client.send("HeapProfiler.collectGarbage");
|
||||
await delay(1000, `After clearing memory`);
|
||||
|
||||
const path = `${APP_ROOT}/traces/${action}-${
|
||||
this.iteration
|
||||
}-${getFormattedTime()}-chrome-profile.json`;
|
||||
|
||||
await this.page.tracing.start({
|
||||
path: path,
|
||||
screenshots: true,
|
||||
});
|
||||
this.traces.push({ action, path });
|
||||
};
|
||||
|
||||
stopTrace = async () => {
|
||||
this.currentTrace = null;
|
||||
await delay(3000, "before stopping the trace");
|
||||
await this.page.tracing.stop();
|
||||
};
|
||||
|
||||
getPage = () => {
|
||||
if (this.page) return this.page;
|
||||
throw Error("Can't find the page, please call launch method.");
|
||||
};
|
||||
|
||||
loadDSL = async (dsl) => {
|
||||
const selector = selectors.createNewApp;
|
||||
await this.page.waitForSelector(selector);
|
||||
await this.page.click(selector);
|
||||
// We goto the newly created app.
|
||||
// Lets update the page
|
||||
await this.page.waitForNavigation();
|
||||
|
||||
const currentUrl = this.page.url();
|
||||
const pageId = currentUrl
|
||||
.split("/")[5]
|
||||
?.split("-")
|
||||
.pop();
|
||||
|
||||
await this.page.evaluate(
|
||||
async ({ dsl, pageId }) => {
|
||||
const layoutId = await fetch(`/api/v1/pages/${pageId}`)
|
||||
.then((response) => response.json())
|
||||
.then((data) => data.data.layouts[0].id);
|
||||
|
||||
const pageSaveUrl = "/api/v1/layouts/" + layoutId + "/pages/" + pageId;
|
||||
await fetch(pageSaveUrl, {
|
||||
headers: {
|
||||
accept: "application/json, text/plain, */*",
|
||||
"content-type": "application/json",
|
||||
},
|
||||
|
||||
referrerPolicy: "strict-origin-when-cross-origin",
|
||||
body: JSON.stringify(dsl),
|
||||
method: "PUT",
|
||||
mode: "cors",
|
||||
credentials: "include",
|
||||
})
|
||||
.then((res) =>
|
||||
console.log("Save page with new DSL response:", res.json()),
|
||||
)
|
||||
.catch((err) => {
|
||||
console.log("Save page with new DSL error:", err);
|
||||
});
|
||||
},
|
||||
{ pageId, dsl },
|
||||
);
|
||||
await this.page.goto(currentUrl.replace("generate-page", ""), {
|
||||
waitUntil: "networkidle2",
|
||||
timeout: 60000,
|
||||
});
|
||||
};
|
||||
|
||||
importApplication = async (jsonPath) => {
|
||||
await this.page.waitForSelector(selectors.appMoreIcon);
|
||||
await this.page.click(selectors.appMoreIcon);
|
||||
await this.page.waitForSelector(selectors.workspaceImportAppOption);
|
||||
await this.page.click(selectors.workspaceImportAppOption);
|
||||
|
||||
const elementHandle = await this.page.$(selectors.fileInput);
|
||||
await elementHandle.uploadFile(jsonPath);
|
||||
|
||||
await this.page.waitForNavigation();
|
||||
await this.page.reload();
|
||||
};
|
||||
|
||||
generateReport = async () => {
|
||||
const report = {};
|
||||
this.traces.forEach(({ action, path }) => {
|
||||
report[action] = {};
|
||||
const trace = require(path);
|
||||
const tasks = new Tracelib.default(trace.traceEvents);
|
||||
report[action].path = path;
|
||||
report[action].summary = sortObjectKeys(tasks.getSummary());
|
||||
report[action].warnings = sortObjectKeys(tasks.getWarningCounts());
|
||||
});
|
||||
|
||||
await fs.writeFile(
|
||||
`${APP_ROOT}/traces/reports/${getFormattedTime()}.json`,
|
||||
JSON.stringify(report, "", 4),
|
||||
(err) => {
|
||||
if (err) {
|
||||
console.log("Error writing file", err);
|
||||
} else {
|
||||
console.log("Successfully wrote report");
|
||||
}
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
close = async () => {
|
||||
this.browser.close();
|
||||
};
|
||||
};
|
||||
|
|
@ -1,119 +0,0 @@
|
|||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const sd = require("node-stdev");
|
||||
|
||||
var median = require("median");
|
||||
|
||||
exports.summaries = async (directory) => {
|
||||
const results = await parseReports(
|
||||
directory,
|
||||
["scripting", "painting", "rendering"],
|
||||
[],
|
||||
);
|
||||
|
||||
generateMarkdown(results);
|
||||
};
|
||||
|
||||
const parseReports = async (
|
||||
directory,
|
||||
summaryFields = [],
|
||||
warningFields = [],
|
||||
) => {
|
||||
const files = await fs.promises.readdir(directory);
|
||||
const results = {};
|
||||
files.forEach((file) => {
|
||||
if (file.endsWith(".json")) {
|
||||
const content = require(`${directory}/${file}`);
|
||||
Object.keys(content).forEach((key) => {
|
||||
if (!results[key]) {
|
||||
results[key] = {};
|
||||
}
|
||||
summaryFields.forEach((summaryField) => {
|
||||
if (!results[key][summaryField]) {
|
||||
results[key][summaryField] = [];
|
||||
}
|
||||
results[key][summaryField].push(
|
||||
parseFloat(content[key].summary[summaryField].toFixed(2)),
|
||||
);
|
||||
});
|
||||
warningFields.forEach((warningField) => {
|
||||
if (!results[key][warningField]) {
|
||||
results[key][warningField] = [];
|
||||
}
|
||||
results[key][warningField].push(
|
||||
parseFloat(content[key].warnings[warningField]),
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
const getMaxSize = (results) => {
|
||||
let size = 0;
|
||||
Object.keys(results).forEach((key) => {
|
||||
const action = results[key];
|
||||
size = Math.max(action["scripting"].length, size);
|
||||
});
|
||||
|
||||
return size;
|
||||
};
|
||||
|
||||
const generateMarkdown = (results) => {
|
||||
const size = getMaxSize(results);
|
||||
let markdown = `<details><summary>Click to view performance test results</summary>\n\n| `;
|
||||
for (let i = 0; i < size; i++) {
|
||||
markdown = markdown + `| Run ${i + 1} `;
|
||||
}
|
||||
markdown = markdown + `| Median | Mean | SD.Sample | SD.Population`;
|
||||
|
||||
markdown += "|\n";
|
||||
|
||||
for (let i = 0; i <= size + 4; i++) {
|
||||
markdown = markdown + `| ------------- `;
|
||||
}
|
||||
markdown += "|\n";
|
||||
|
||||
Object.keys(results).forEach((key) => {
|
||||
const action = results[key];
|
||||
markdown += `**${key}**`;
|
||||
for (let i = 0; i <= size + 4; i++) {
|
||||
markdown += `| `;
|
||||
}
|
||||
markdown += "|\n";
|
||||
|
||||
Object.keys(action).forEach((key) => {
|
||||
const length = action[key].length;
|
||||
markdown += `| ${key} | `;
|
||||
markdown += action[key].reduce((sum, val) => `${sum} | ${val} `);
|
||||
if (length < size) {
|
||||
for (let i = 0; i < size - action[key].length; i++) {
|
||||
markdown += " | ";
|
||||
}
|
||||
}
|
||||
// Add median
|
||||
markdown += `| ${median(action[key])}`;
|
||||
// Add average
|
||||
const avg = parseFloat(
|
||||
(action[key].reduce((sum, val) => sum + val, 0) / length).toFixed(2),
|
||||
);
|
||||
markdown += `| ${avg} | ${((sd.sample(action[key]) / avg) * 100).toFixed(
|
||||
2,
|
||||
)} | ${((sd.population(action[key]) / avg) * 100).toFixed(2)}`;
|
||||
|
||||
markdown += "| \n";
|
||||
});
|
||||
});
|
||||
|
||||
markdown += "</details>";
|
||||
|
||||
fs.writeFile(`${APP_ROOT}/traces/reports/summary.md`, markdown, (err) => {
|
||||
if (err) {
|
||||
console.log("Error writing file", err);
|
||||
} else {
|
||||
console.log("Successfully wrote summary");
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
exports.parseReports = parseReports;
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
const cp = require("child_process");
|
||||
|
||||
exports.cleanTheHost = async () => {
|
||||
await cp.exec("pidof chrome", (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
console.log(`error: ${error.message}`);
|
||||
return;
|
||||
}
|
||||
if (stderr) {
|
||||
console.log(`stderr: ${stderr}`);
|
||||
return;
|
||||
}
|
||||
console.log(`Killing chrome processes: ${stdout}`);
|
||||
stdout.split(" ").forEach((PID) => {
|
||||
cp.exec(`sudo kill -9 ${PID}`, (error, stdout, stder) => {
|
||||
if (error) {
|
||||
console.log(`Kill error: ${error.message}`);
|
||||
return;
|
||||
}
|
||||
if (stderr) {
|
||||
console.log(`Kill stderr: ${stderr}`);
|
||||
return;
|
||||
}
|
||||
if (stdout) {
|
||||
console.log(`Kill stdout: ${stdout}`);
|
||||
return;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Clear OS caches
|
||||
await cp.exec("sync; echo 3 | sudo tee /proc/sys/vm/drop_caches");
|
||||
};
|
||||
|
||||
exports.setChromeProcessPriority = async () => {
|
||||
await cp.exec("pidof chrome", (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
console.log(`error: ${error.message}`);
|
||||
return;
|
||||
}
|
||||
if (stderr) {
|
||||
console.log(`stderr: ${stderr}`);
|
||||
return;
|
||||
}
|
||||
console.log(`stdout: setting priority: ${stdout}`);
|
||||
|
||||
// Set priority of chrome processes to maximum
|
||||
stdout.split(" ").forEach((PID) => {
|
||||
cp.execSync(`sudo renice -20 ${PID}`);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
|
@ -1,144 +0,0 @@
|
|||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const delay = (time, msg = "") => {
|
||||
console.log(`waiting ${msg}:`, time / 1000, "s");
|
||||
return new Promise(function(resolve) {
|
||||
setTimeout(resolve, time);
|
||||
});
|
||||
};
|
||||
|
||||
exports.delay = delay;
|
||||
|
||||
exports.getDevToolsPage = async (browser) => {
|
||||
const targets = await browser.targets();
|
||||
const devtoolsTarget = targets.filter((t) => {
|
||||
return t.type() === "other" && t.url().startsWith("devtools://");
|
||||
})[0];
|
||||
|
||||
// Hack to get a page pointing to the devtools
|
||||
devtoolsTarget._targetInfo.type = "page";
|
||||
const devtoolsPage = await devtoolsTarget.page();
|
||||
return devtoolsPage;
|
||||
};
|
||||
|
||||
exports.gotoProfiler = async (devtoolsPage) => {
|
||||
await devtoolsPage.bringToFront();
|
||||
await devtoolsPage.keyboard.down("MetaLeft");
|
||||
await devtoolsPage.keyboard.press("[");
|
||||
await devtoolsPage.keyboard.up("MetaLeft");
|
||||
};
|
||||
|
||||
exports.getProfilerFrame = async (devtoolsPage) => {
|
||||
const frames = await devtoolsPage.frames();
|
||||
const reactProfiler = frames[2]; // This is not foolproof
|
||||
return reactProfiler;
|
||||
};
|
||||
|
||||
exports.startReactProfile = async (reactProfiler) => {
|
||||
const recordButton =
|
||||
"#container > div > div > div > div > div.Toolbar___30kHu > button.Button___1-PiG.InactiveRecordToggle___2CUtF";
|
||||
await reactProfiler.waitForSelector(recordButton);
|
||||
const container = await reactProfiler.$(recordButton);
|
||||
console.log("Starting recording");
|
||||
await reactProfiler.evaluate((el) => el.click(), container);
|
||||
console.log("Recording started");
|
||||
};
|
||||
|
||||
exports.stopReactProfile = async (reactProfiler) => {
|
||||
const stopRecordingButton =
|
||||
"#container > div > div > div > div > div.Toolbar___30kHu > button.Button___1-PiG.ActiveRecordToggle___1Cpcb";
|
||||
await reactProfiler.waitForSelector(stopRecordingButton);
|
||||
const container = await reactProfiler.$(stopRecordingButton);
|
||||
console.log("Stopping recording");
|
||||
await reactProfiler.evaluate((el) => el.click(), container);
|
||||
console.log("Recording stopped");
|
||||
};
|
||||
|
||||
exports.downloadReactProfile = async (reactProfiler) => {
|
||||
const saveProfileButton =
|
||||
"#container > div > div > div > div.LeftColumn___3I7-I > div.Toolbar___30kHu > button:nth-child(8)";
|
||||
await reactProfiler.waitForSelector(saveProfileButton);
|
||||
const container = await reactProfiler.$(saveProfileButton);
|
||||
await reactProfiler.evaluate((el) => el.click(), container);
|
||||
console.log("Downloaded the profile");
|
||||
};
|
||||
|
||||
exports.saveProfile = async (reactProfiler, name) => {
|
||||
const anchorSelector =
|
||||
"#container > div > div > div > div.LeftColumn___3I7-I > div.Toolbar___30kHu > a";
|
||||
await reactProfiler.waitForSelector(anchorSelector);
|
||||
const anchor = await reactProfiler.$(anchorSelector);
|
||||
await reactProfiler.evaluate(
|
||||
(el) => console.log(el.getAttribute("href")),
|
||||
anchor,
|
||||
);
|
||||
const attr = await reactProfiler.$$eval(anchorSelector, (el) =>
|
||||
el.map((x) => x.getAttribute("href")),
|
||||
);
|
||||
|
||||
const url = attr[0];
|
||||
|
||||
const profile = await reactProfiler.evaluate(async (href) => {
|
||||
const blob = await fetch(href).then(async (r) => r.blob());
|
||||
const text = await blob.text();
|
||||
return text;
|
||||
}, url);
|
||||
const location = path.join(__dirname, `/profiles/${name}.json`);
|
||||
fs.writeFileSync(location, profile);
|
||||
};
|
||||
|
||||
exports.login = async (page) => {
|
||||
const url = "https://dev.appsmith.com/user/login";
|
||||
// const url = "http://localhost/user/login";
|
||||
|
||||
await page.goto(url);
|
||||
await page.setViewport({ width: 1920, height: 1080 });
|
||||
|
||||
await delay(1000, "before login");
|
||||
|
||||
const emailSelector = "input[name='username']";
|
||||
const passwordSelector = "input[name='password']";
|
||||
const buttonSelector = "button[type='submit']";
|
||||
|
||||
await page.waitForSelector(emailSelector);
|
||||
await page.waitForSelector(passwordSelector);
|
||||
await page.waitForSelector(buttonSelector);
|
||||
|
||||
await page.type(emailSelector, "hello@myemail.com");
|
||||
await page.type(passwordSelector, "qwerty1234");
|
||||
delay(1000, "before clicking login button");
|
||||
await page.click(buttonSelector);
|
||||
};
|
||||
|
||||
exports.getFormattedTime = () => {
|
||||
var today = new Date();
|
||||
var y = today.getFullYear();
|
||||
var m = today.getMonth() + 1;
|
||||
var d = today.getDate();
|
||||
var h = today.getHours();
|
||||
var mi = today.getMinutes();
|
||||
var s = today.getSeconds();
|
||||
return y + "-" + m + "-" + d + "-" + h + "-" + mi + "-" + s;
|
||||
};
|
||||
|
||||
exports.sortObjectKeys = (obj) => {
|
||||
const sortedObj = {};
|
||||
Object.keys(obj)
|
||||
.sort()
|
||||
.forEach((key) => {
|
||||
sortedObj[key] = obj[key];
|
||||
});
|
||||
return sortedObj;
|
||||
};
|
||||
|
||||
exports.makeid = (length = 8) => {
|
||||
var result = "";
|
||||
var characters =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
var charactersLength = characters.length;
|
||||
for (var i = 0; i < length; i++) {
|
||||
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
|
@ -1 +0,0 @@
|
|||
node ./src/index.js
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
exports.actions = {
|
||||
SELECT_CATEGORY: "SELECT_CATEGORY",
|
||||
BIND_TABLE_DATA: "BIND_TABLE_DATA",
|
||||
CLICK_ON_TABLE_ROW: "CLICK_ON_TABLE_ROW",
|
||||
UPDATE_POST_TITLE: "UPDATE_POST_TITLE",
|
||||
OPEN_MODAL: "OPEN_MODAL",
|
||||
CLOSE_MODAL: "CLOSE_MODAL",
|
||||
SELECT_WIDGET_MENU_OPEN: "SELECT_WIDGET_MENU_OPEN",
|
||||
SELECT_WIDGET_SELECT_OPTION: "SELECT_WIDGET_SELECT_OPTION",
|
||||
};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
|
@ -1,85 +0,0 @@
|
|||
exports.dsl = {
|
||||
dsl: {
|
||||
widgetName: "MainContainer",
|
||||
backgroundColor: "none",
|
||||
rightColumn: 1936,
|
||||
snapColumns: 64,
|
||||
detachFromLayout: true,
|
||||
widgetId: "0",
|
||||
topRow: 0,
|
||||
bottomRow: 1290,
|
||||
containerStyle: "none",
|
||||
snapRows: 125,
|
||||
parentRowSpace: 1,
|
||||
type: "CANVAS_WIDGET",
|
||||
canExtend: true,
|
||||
version: 46,
|
||||
minHeight: 1292,
|
||||
parentColumnSpace: 1,
|
||||
dynamicBindingPathList: [],
|
||||
leftColumn: 0,
|
||||
children: [
|
||||
{
|
||||
isVisible: true,
|
||||
text: "<h1>{{Input1.text}}</h1>",
|
||||
fontSize: "HEADING1",
|
||||
fontStyle: "BOLD",
|
||||
textAlign: "LEFT",
|
||||
textColor: "#231F20",
|
||||
widgetName: "Text1",
|
||||
version: 1,
|
||||
type: "TEXT_WIDGET",
|
||||
hideCard: false,
|
||||
displayName: "Text",
|
||||
key: "4ln743vbxf",
|
||||
iconSVG: "/static/media/icon.97c59b52.svg",
|
||||
widgetId: "oylox3e28e",
|
||||
renderMode: "CANVAS",
|
||||
isLoading: false,
|
||||
parentColumnSpace: 30.0625,
|
||||
parentRowSpace: 10,
|
||||
leftColumn: 1,
|
||||
rightColumn: 39,
|
||||
topRow: 16,
|
||||
bottomRow: 40,
|
||||
parentId: "0",
|
||||
dynamicBindingPathList: [
|
||||
{
|
||||
key: "text",
|
||||
},
|
||||
],
|
||||
dynamicTriggerPathList: [],
|
||||
},
|
||||
{
|
||||
isVisible: true,
|
||||
inputType: "TEXT",
|
||||
label: "",
|
||||
widgetName: "Input1",
|
||||
version: 1,
|
||||
defaultText: "",
|
||||
iconAlign: "left",
|
||||
autoFocus: false,
|
||||
labelStyle: "",
|
||||
resetOnSubmit: true,
|
||||
isRequired: false,
|
||||
isDisabled: false,
|
||||
allowCurrencyChange: false,
|
||||
type: "INPUT_WIDGET",
|
||||
hideCard: false,
|
||||
displayName: "Input",
|
||||
key: "4xvbov2itw",
|
||||
iconSVG: "/static/media/icon.9f505595.svg",
|
||||
widgetId: "d454uqlxd0",
|
||||
renderMode: "CANVAS",
|
||||
isLoading: false,
|
||||
parentColumnSpace: 30.0625,
|
||||
parentRowSpace: 10,
|
||||
leftColumn: 1,
|
||||
rightColumn: 12,
|
||||
topRow: 9,
|
||||
bottomRow: 13,
|
||||
parentId: "0",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,116 +0,0 @@
|
|||
const path = require("path");
|
||||
const Perf = require("../src/perf.js");
|
||||
const dsl = require("./dsl/simple-typing").dsl;
|
||||
const { actions } = require("./actions");
|
||||
const { delay, makeid } = require("../src/utils/utils");
|
||||
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
|
||||
|
||||
const SEL = {
|
||||
category: "div.rc-select-item[title=Uncategorized]",
|
||||
multiSelect: ".rc-select",
|
||||
table: "#tablejabdu9f16g",
|
||||
tableData: ".t--property-control-tabledata textarea",
|
||||
tableRow:
|
||||
"#tablejabdu9f16g > div.tableWrap > div > div:nth-child(1) > div > div.tbody.no-scroll > div:nth-child(6) > div:nth-child(2)",
|
||||
titleInput: ".appsmith_widget_armli8hauj input",
|
||||
updateButton:
|
||||
"#comment-overlay-wrapper-4gnygu5jew > div > div > div > div > button",
|
||||
tableRowCell:
|
||||
"#tablejabdu9f16g > div.tableWrap > div > div:nth-child(1) > div > div.tbody.no-scroll > div:nth-child(6) > div:nth-child(2) > div > span > span > span",
|
||||
deletePostButton:
|
||||
"#tablejabdu9f16g > div.tableWrap > div > div:nth-child(1) > div > div.tbody.no-scroll > div:nth-child(1) > div:last-child > div > div > button",
|
||||
modalTitle: "#reyoxo4oec",
|
||||
closeModal:
|
||||
"#comment-overlay-wrapper-lryg8kw537 > div > div > div > div > button",
|
||||
};
|
||||
|
||||
async function testGoldenApp(iteration) {
|
||||
const perf = new Perf({ iteration });
|
||||
try {
|
||||
await perf.launch();
|
||||
const page = perf.getPage();
|
||||
|
||||
await perf.importApplication(
|
||||
`${APP_ROOT}/tests/dsl/blog-admin-app-postgres.json`,
|
||||
);
|
||||
|
||||
await delay(5000, "for newly created page to settle down");
|
||||
// Make the elements of the dropdown render
|
||||
await page.waitForSelector(SEL.multiSelect);
|
||||
await page.click(SEL.multiSelect);
|
||||
|
||||
await perf.startTrace(actions.SELECT_CATEGORY);
|
||||
await page.waitForSelector(SEL.category);
|
||||
await page.click(SEL.category);
|
||||
|
||||
await perf.stopTrace();
|
||||
|
||||
// Focus on the table widget
|
||||
await page.waitForSelector(SEL.table);
|
||||
|
||||
// Not sure why it needs two clicks to focus
|
||||
await page.click(SEL.table);
|
||||
await page.click(SEL.table);
|
||||
|
||||
// Profile table Data binding
|
||||
await perf.startTrace(actions.BIND_TABLE_DATA);
|
||||
await page.waitForSelector(SEL.tableData);
|
||||
await page.type(SEL.tableData, "{{SelectQuery.data}}");
|
||||
await page.waitForSelector(SEL.tableRow);
|
||||
await perf.stopTrace();
|
||||
|
||||
// Click on table row
|
||||
await perf.startTrace(actions.CLICK_ON_TABLE_ROW);
|
||||
await page.click(SEL.tableRow);
|
||||
await page.waitForFunction(
|
||||
`document.querySelector("${SEL.titleInput}").value.includes("Template: Comments")`,
|
||||
);
|
||||
|
||||
await perf.stopTrace();
|
||||
|
||||
// Edit title
|
||||
await page.waitForSelector(SEL.titleInput);
|
||||
await perf.startTrace(actions.UPDATE_POST_TITLE);
|
||||
|
||||
const randomString = makeid();
|
||||
await page.type(SEL.titleInput, randomString);
|
||||
await delay(5000, "For the evaluations to comeback?");
|
||||
|
||||
await page.waitForSelector(SEL.updateButton);
|
||||
await page.click(SEL.updateButton);
|
||||
// When the row is updated, selected row changes.
|
||||
// await page.waitForSelector(SEL.tableRowCell);
|
||||
await page.waitForFunction(
|
||||
`document.querySelector("${SEL.table}").textContent.includes("${randomString}")`,
|
||||
);
|
||||
await perf.stopTrace();
|
||||
|
||||
// Open modal
|
||||
await page.waitForSelector(SEL.deletePostButton);
|
||||
await perf.startTrace(actions.OPEN_MODAL);
|
||||
await page.click(SEL.deletePostButton);
|
||||
await page.waitForSelector(SEL.modalTitle);
|
||||
await perf.stopTrace();
|
||||
|
||||
// Close modal
|
||||
await page.waitForSelector(SEL.closeModal);
|
||||
await perf.startTrace(actions.CLOSE_MODAL);
|
||||
await page.click(SEL.closeModal);
|
||||
await delay(3000, "wait after closing modal");
|
||||
await perf.stopTrace();
|
||||
|
||||
await perf.generateReport();
|
||||
await perf.close();
|
||||
} catch (e) {
|
||||
await perf.handleRejections(e);
|
||||
await perf.close();
|
||||
}
|
||||
}
|
||||
|
||||
async function runTests() {
|
||||
for (let i = 0; i < 5; i++) {
|
||||
await testGoldenApp(i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
runTests();
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
const puppeteer = require("puppeteer");
|
||||
|
||||
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
|
||||
|
||||
(async () => {
|
||||
const browser = await puppeteer.launch({
|
||||
args: ["--window-size=1920,1080"],
|
||||
ignoreHTTPSErrors: true,
|
||||
});
|
||||
let page = await browser.newPage();
|
||||
await page.goto("https://dev.appsmith.com/setup/welcome");
|
||||
// await page.goto("http://localhost/setup/welcome");
|
||||
// Since we are not testing the initial setup, just send the post request directly.
|
||||
// Could be moved to bash script as well.
|
||||
await page.evaluate(async () => {
|
||||
const url = "https://dev.appsmith.com/api/v1/users/super";
|
||||
// const url = "http://localhost/api/v1/users/super";
|
||||
await fetch(url, {
|
||||
headers: {
|
||||
accept:
|
||||
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
|
||||
"accept-language": "en-US,en;q=0.9,fr-CA;q=0.8,fr;q=0.7",
|
||||
"cache-control": "no-cache",
|
||||
"content-type": "application/x-www-form-urlencoded",
|
||||
},
|
||||
|
||||
referrerPolicy: "strict-origin-when-cross-origin",
|
||||
body:
|
||||
"name=Im+Puppeteer&email=hello%40myemail.com&password=qwerty1234&allowCollectingAnonymousData=true&signupForNewsletter=true&role=engineer&useCase=just+exploring",
|
||||
method: "POST",
|
||||
mode: "cors",
|
||||
credentials: "include",
|
||||
})
|
||||
.then((res) =>
|
||||
console.log("Save page with new DSL response:", res.json()),
|
||||
)
|
||||
.catch((err) => {
|
||||
console.log("Save page with new DSL error:", err);
|
||||
});
|
||||
});
|
||||
console.log("Initial setup is successful");
|
||||
await browser.close();
|
||||
})();
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
const path = require("path");
|
||||
const Perf = require("../src/perf.js");
|
||||
const dsl = require("./dsl/simple-typing").dsl;
|
||||
|
||||
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
|
||||
|
||||
async function sampleTest(iteration) {
|
||||
const perf = new Perf({ iteration });
|
||||
try {
|
||||
await perf.launch();
|
||||
|
||||
const page = perf.getPage();
|
||||
await perf.loadDSL(dsl);
|
||||
|
||||
const selector = "input.bp3-input"; // Input selector
|
||||
await page.waitForSelector(selector);
|
||||
const input = await page.$(selector);
|
||||
|
||||
await perf.startTrace("Edit input");
|
||||
await page.type(selector, "Hello Appsmith");
|
||||
await perf.stopTrace();
|
||||
|
||||
await perf.startTrace("Clear input");
|
||||
await input.click({ clickCount: 3 });
|
||||
await input.press("Backspace");
|
||||
await perf.stopTrace();
|
||||
|
||||
await perf.startTrace("Edit input again");
|
||||
await page.type(selector, "Howdy satish");
|
||||
await perf.stopTrace();
|
||||
|
||||
await perf.generateReport();
|
||||
await perf.close();
|
||||
} catch (e) {
|
||||
await perf.handleRejections(e);
|
||||
await perf.close();
|
||||
}
|
||||
}
|
||||
|
||||
async function runTests() {
|
||||
for (let i = 0; i < 5; i++) {
|
||||
await sampleTest(i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
runTests();
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
const path = require("path");
|
||||
const Perf = require("../src/perf");
|
||||
const { delay } = require("../src/utils/utils");
|
||||
const { actions } = require("./actions");
|
||||
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
|
||||
|
||||
const SEL = {
|
||||
select_button: ".select-button",
|
||||
options_list: ".menu-virtual-list",
|
||||
first_option_item: ".menu-item-text:nth-child(1)",
|
||||
};
|
||||
|
||||
async function testSelectOptionsRender(iteration) {
|
||||
const perf = new Perf({ iteration });
|
||||
try {
|
||||
await perf.launch();
|
||||
const page = perf.getPage();
|
||||
|
||||
perf.importApplication(`${APP_ROOT}/tests/dsl/stress-select-widget.json`);
|
||||
await delay(5000, "for newly created page to settle down");
|
||||
|
||||
await page.waitForSelector(SEL.select_button);
|
||||
await perf.startTrace(actions.SELECT_WIDGET_MENU_OPEN);
|
||||
await page.click(SEL.select_button);
|
||||
await page.waitForSelector(SEL.options_list);
|
||||
await delay(2000, "wait after opening options list");
|
||||
await perf.stopTrace();
|
||||
|
||||
await perf.startTrace(actions.SELECT_WIDGET_SELECT_OPTION);
|
||||
await page.click(SEL.first_option_item);
|
||||
await delay(2000, "wait after selecting option item");
|
||||
await perf.stopTrace();
|
||||
|
||||
await perf.generateReport();
|
||||
await perf.close();
|
||||
} catch (e) {
|
||||
await perf.handleRejections(e);
|
||||
await perf.close();
|
||||
}
|
||||
}
|
||||
|
||||
async function runTests() {
|
||||
for (let i = 0; i < 5; i++) {
|
||||
await testSelectOptionsRender(i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
runTests();
|
||||
|
|
@ -1,600 +0,0 @@
|
|||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@supabase/gotrue-js@^1.22.0":
|
||||
version "1.22.1"
|
||||
resolved "https://registry.yarnpkg.com/@supabase/gotrue-js/-/gotrue-js-1.22.1.tgz#28cba21713a25045e94f99fa26b66dbb3b808f92"
|
||||
integrity sha512-Uqiw03Sd/PYGrjq/sfEGyRcZh868y2B2fxVtZgkUAGDHnQ84K1MpsGiIMCL6x/9JPKDCOkzpSZQdKIohcY8l2Q==
|
||||
dependencies:
|
||||
cross-fetch "^3.0.6"
|
||||
|
||||
"@supabase/postgrest-js@^0.36.0":
|
||||
version "0.36.0"
|
||||
resolved "https://registry.yarnpkg.com/@supabase/postgrest-js/-/postgrest-js-0.36.0.tgz#a734b9ce92fad86f825e6d707ffe638f0e85887a"
|
||||
integrity sha512-KOnhVy8tEr/qNnvOLpFqwOkt7ilRDFMXY+JJfmLjS3+eZuna1G57w4zb3L0SdY6BL7AKnfzP5BG3yHTAuJPSww==
|
||||
dependencies:
|
||||
cross-fetch "^3.0.6"
|
||||
|
||||
"@supabase/realtime-js@^1.3.5":
|
||||
version "1.3.5"
|
||||
resolved "https://registry.yarnpkg.com/@supabase/realtime-js/-/realtime-js-1.3.5.tgz#6ade8a97ae4c600bbe8b7615fd987e2bd956c582"
|
||||
integrity sha512-If+C0A6eT1BflFOOZNlnGw/91gNuj7f/M19/WutsPM0pjhx++8Dj0YH8z+tbgxX0nf/2UGVUMMgTBckzpk9R3g==
|
||||
dependencies:
|
||||
"@types/websocket" "^1.0.3"
|
||||
websocket "^1.0.34"
|
||||
|
||||
"@supabase/storage-js@^1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@supabase/storage-js/-/storage-js-1.5.1.tgz#0f451210972284a10c0e2edeea40daac9001c969"
|
||||
integrity sha512-W82st1RvkChVJ/FTCcPXFXfS3V0Z4rZuMnoDnB9/NI5i9r9zspZS40tHpUQ+vbN6R6k0pfr/Waa1jcEd3YAtrQ==
|
||||
dependencies:
|
||||
cross-fetch "^3.1.0"
|
||||
|
||||
"@supabase/supabase-js@^1.30.2":
|
||||
version "1.30.2"
|
||||
resolved "https://registry.yarnpkg.com/@supabase/supabase-js/-/supabase-js-1.30.2.tgz#f18e590197211db734a914aa5a70c2a21f03d0b1"
|
||||
integrity sha512-r/hOnJ6Rx91NnAnT+/eFcrknAYCERvLi6y9lNRgfXqYZ9XFKNh9O8tSVSTmb9INS2vPfSY6fuPCS7M4791tOWw==
|
||||
dependencies:
|
||||
"@supabase/gotrue-js" "^1.22.0"
|
||||
"@supabase/postgrest-js" "^0.36.0"
|
||||
"@supabase/realtime-js" "^1.3.5"
|
||||
"@supabase/storage-js" "^1.5.1"
|
||||
|
||||
"@types/node@*":
|
||||
version "17.0.18"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074"
|
||||
integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==
|
||||
|
||||
"@types/websocket@^1.0.3":
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.5.tgz#3fb80ed8e07f88e51961211cd3682a3a4a81569c"
|
||||
integrity sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/yauzl@^2.9.1":
|
||||
version "2.9.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a"
|
||||
integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
agent-base@6:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
||||
integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
|
||||
dependencies:
|
||||
debug "4"
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||
|
||||
base64-js@^1.3.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||
|
||||
bl@^4.0.3:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
|
||||
integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
|
||||
dependencies:
|
||||
buffer "^5.5.0"
|
||||
inherits "^2.0.4"
|
||||
readable-stream "^3.4.0"
|
||||
|
||||
brace-expansion@^1.1.7:
|
||||
version "1.1.11"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
concat-map "0.0.1"
|
||||
|
||||
buffer-crc32@~0.2.3:
|
||||
version "0.2.13"
|
||||
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
||||
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
|
||||
|
||||
buffer@^5.2.1, buffer@^5.5.0:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
|
||||
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
|
||||
dependencies:
|
||||
base64-js "^1.3.1"
|
||||
ieee754 "^1.1.13"
|
||||
|
||||
bufferutil@^4.0.1:
|
||||
version "4.0.6"
|
||||
resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433"
|
||||
integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==
|
||||
dependencies:
|
||||
node-gyp-build "^4.3.0"
|
||||
|
||||
chownr@^1.1.1:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
|
||||
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
||||
|
||||
cross-fetch@3.1.5, cross-fetch@^3.0.6, cross-fetch@^3.1.0:
|
||||
version "3.1.5"
|
||||
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
|
||||
integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
|
||||
dependencies:
|
||||
node-fetch "2.6.7"
|
||||
|
||||
d@1, d@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
|
||||
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
|
||||
dependencies:
|
||||
es5-ext "^0.10.50"
|
||||
type "^1.0.1"
|
||||
|
||||
debug@4, debug@4.3.3, debug@^4.1.1:
|
||||
version "4.3.3"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
|
||||
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
|
||||
dependencies:
|
||||
ms "2.1.2"
|
||||
|
||||
debug@^2.2.0:
|
||||
version "2.6.9"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
||||
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
devtools-protocol@0.0.969999:
|
||||
version "0.0.969999"
|
||||
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.969999.tgz#3d6be0a126b3607bb399ae2719b471dda71f3478"
|
||||
integrity sha512-6GfzuDWU0OFAuOvBokXpXPLxjOJ5DZ157Ue3sGQQM3LgAamb8m0R0ruSfN0DDu+XG5XJgT50i6zZ/0o8RglreQ==
|
||||
|
||||
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
|
||||
version "1.4.4"
|
||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
||||
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
||||
dependencies:
|
||||
once "^1.4.0"
|
||||
|
||||
es5-ext@^0.10.35, es5-ext@^0.10.50:
|
||||
version "0.10.53"
|
||||
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
|
||||
integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
|
||||
dependencies:
|
||||
es6-iterator "~2.0.3"
|
||||
es6-symbol "~3.1.3"
|
||||
next-tick "~1.0.0"
|
||||
|
||||
es6-iterator@~2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
|
||||
integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
|
||||
dependencies:
|
||||
d "1"
|
||||
es5-ext "^0.10.35"
|
||||
es6-symbol "^3.1.1"
|
||||
|
||||
es6-symbol@^3.1.1, es6-symbol@~3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
|
||||
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
|
||||
dependencies:
|
||||
d "^1.0.1"
|
||||
ext "^1.1.2"
|
||||
|
||||
ext@^1.1.2:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
|
||||
integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
|
||||
dependencies:
|
||||
type "^2.5.0"
|
||||
|
||||
extract-zip@2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
|
||||
integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
|
||||
dependencies:
|
||||
debug "^4.1.1"
|
||||
get-stream "^5.1.0"
|
||||
yauzl "^2.10.0"
|
||||
optionalDependencies:
|
||||
"@types/yauzl" "^2.9.1"
|
||||
|
||||
fd-slicer@~1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
|
||||
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
|
||||
dependencies:
|
||||
pend "~1.2.0"
|
||||
|
||||
find-up@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
|
||||
integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
|
||||
dependencies:
|
||||
locate-path "^5.0.0"
|
||||
path-exists "^4.0.0"
|
||||
|
||||
fs-constants@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
||||
|
||||
fs.realpath@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
|
||||
|
||||
get-stream@^5.1.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
|
||||
integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
|
||||
dependencies:
|
||||
pump "^3.0.0"
|
||||
|
||||
glob@^7.1.3:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
|
||||
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
https-proxy-agent@5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
|
||||
integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
|
||||
dependencies:
|
||||
agent-base "6"
|
||||
debug "4"
|
||||
|
||||
ieee754@^1.1.13:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
||||
|
||||
inflight@^1.0.4:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
|
||||
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
|
||||
dependencies:
|
||||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2, inherits@^2.0.3, inherits@^2.0.4:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
||||
is-typedarray@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
||||
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
|
||||
|
||||
locate-path@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
|
||||
integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
|
||||
dependencies:
|
||||
p-locate "^4.1.0"
|
||||
|
||||
lodash@^4.17.2:
|
||||
version "4.17.21"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
||||
|
||||
median@^0.0.2:
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/median/-/median-0.0.2.tgz#1b7172bc221eb3e9bf4f479fadaadefc50c44787"
|
||||
integrity sha1-G3FyvCIes+m/T0efrare/FDER4c=
|
||||
|
||||
minimatch@^3.0.4:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.1.tgz#879ad447200773912898b46cd516a7abbb5e50b0"
|
||||
integrity sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
mkdirp-classic@^0.5.2:
|
||||
version "0.5.3"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
|
||||
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||
|
||||
ms@2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||
|
||||
next-tick@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
|
||||
integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
|
||||
|
||||
node-fetch@2.6.7:
|
||||
version "2.6.7"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
|
||||
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
|
||||
dependencies:
|
||||
whatwg-url "^5.0.0"
|
||||
|
||||
node-gyp-build@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3"
|
||||
integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==
|
||||
|
||||
node-stdev@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/node-stdev/-/node-stdev-1.0.1.tgz#7a4ba4ae44123683b9f4f06a25e0ec88b1ff1c54"
|
||||
integrity sha1-ekukrkQSNoO59PBqJeDsiLH/HFQ=
|
||||
dependencies:
|
||||
lodash "^4.17.2"
|
||||
|
||||
once@^1.3.0, once@^1.3.1, once@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
p-limit@^2.2.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
|
||||
integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
|
||||
dependencies:
|
||||
p-try "^2.0.0"
|
||||
|
||||
p-locate@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
|
||||
integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
|
||||
dependencies:
|
||||
p-limit "^2.2.0"
|
||||
|
||||
p-try@^2.0.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
|
||||
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
|
||||
|
||||
path-exists@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
|
||||
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
|
||||
|
||||
path-is-absolute@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||
|
||||
pend@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
||||
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
|
||||
|
||||
pkg-dir@4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
|
||||
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
|
||||
dependencies:
|
||||
find-up "^4.0.0"
|
||||
|
||||
progress@2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
||||
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
||||
|
||||
proxy-from-env@1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
|
||||
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
|
||||
|
||||
pump@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
|
||||
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
|
||||
dependencies:
|
||||
end-of-stream "^1.1.0"
|
||||
once "^1.3.1"
|
||||
|
||||
puppeteer@^13.5.1:
|
||||
version "13.5.1"
|
||||
resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-13.5.1.tgz#d0f751bf36120efc2ebf74c7562a204a84e500e9"
|
||||
integrity sha512-wWxO//vMiqxlvuzHMAJ0pRJeDHvDtM7DQpW1GKdStz2nZo2G42kOXBDgkmQ+zqjwMCFofKGesBeeKxIkX9BO+w==
|
||||
dependencies:
|
||||
cross-fetch "3.1.5"
|
||||
debug "4.3.3"
|
||||
devtools-protocol "0.0.969999"
|
||||
extract-zip "2.0.1"
|
||||
https-proxy-agent "5.0.0"
|
||||
pkg-dir "4.2.0"
|
||||
progress "2.0.3"
|
||||
proxy-from-env "1.1.0"
|
||||
rimraf "3.0.2"
|
||||
tar-fs "2.1.1"
|
||||
unbzip2-stream "1.4.3"
|
||||
ws "8.5.0"
|
||||
|
||||
readable-stream@^3.1.1, readable-stream@^3.4.0:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
|
||||
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
|
||||
dependencies:
|
||||
inherits "^2.0.3"
|
||||
string_decoder "^1.1.1"
|
||||
util-deprecate "^1.0.1"
|
||||
|
||||
rimraf@3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
|
||||
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
safe-buffer@~5.2.0:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
||||
|
||||
sanitize-filename@^1.6.3:
|
||||
version "1.6.3"
|
||||
resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378"
|
||||
integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==
|
||||
dependencies:
|
||||
truncate-utf8-bytes "^1.0.0"
|
||||
|
||||
string_decoder@^1.1.1:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
|
||||
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
|
||||
dependencies:
|
||||
safe-buffer "~5.2.0"
|
||||
|
||||
tar-fs@2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
|
||||
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
|
||||
dependencies:
|
||||
chownr "^1.1.1"
|
||||
mkdirp-classic "^0.5.2"
|
||||
pump "^3.0.0"
|
||||
tar-stream "^2.1.4"
|
||||
|
||||
tar-stream@^2.1.4:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
|
||||
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
|
||||
dependencies:
|
||||
bl "^4.0.3"
|
||||
end-of-stream "^1.4.1"
|
||||
fs-constants "^1.0.0"
|
||||
inherits "^2.0.3"
|
||||
readable-stream "^3.1.1"
|
||||
|
||||
through@^2.3.8:
|
||||
version "2.3.8"
|
||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
||||
|
||||
tr46@~0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
|
||||
integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
|
||||
|
||||
tracelib@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/tracelib/-/tracelib-1.0.1.tgz#bb44ea96c19b8d7a6c85a6ee1cac9945c5b75c64"
|
||||
integrity sha512-T2Vkpa/7Vdm3sV8nXRn8vZ0tnq6wlnO4Zx7Pux+JA1W6DMlg5EtbNcPZu/L7XRTPc9S0eAKhEFR4p/u0GcsDpQ==
|
||||
|
||||
truncate-utf8-bytes@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
|
||||
integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys=
|
||||
dependencies:
|
||||
utf8-byte-length "^1.0.1"
|
||||
|
||||
type@^1.0.1:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
|
||||
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
|
||||
|
||||
type@^2.5.0:
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f"
|
||||
integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
|
||||
|
||||
typedarray-to-buffer@^3.1.5:
|
||||
version "3.1.5"
|
||||
resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
|
||||
integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
|
||||
dependencies:
|
||||
is-typedarray "^1.0.0"
|
||||
|
||||
unbzip2-stream@1.4.3:
|
||||
version "1.4.3"
|
||||
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
|
||||
integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
|
||||
dependencies:
|
||||
buffer "^5.2.1"
|
||||
through "^2.3.8"
|
||||
|
||||
utf-8-validate@^5.0.2:
|
||||
version "5.0.8"
|
||||
resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58"
|
||||
integrity sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA==
|
||||
dependencies:
|
||||
node-gyp-build "^4.3.0"
|
||||
|
||||
utf8-byte-length@^1.0.1:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
|
||||
integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=
|
||||
|
||||
util-deprecate@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
|
||||
|
||||
webidl-conversions@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
|
||||
integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
|
||||
|
||||
websocket@^1.0.34:
|
||||
version "1.0.34"
|
||||
resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
|
||||
integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
|
||||
dependencies:
|
||||
bufferutil "^4.0.1"
|
||||
debug "^2.2.0"
|
||||
es5-ext "^0.10.50"
|
||||
typedarray-to-buffer "^3.1.5"
|
||||
utf-8-validate "^5.0.2"
|
||||
yaeti "^0.0.6"
|
||||
|
||||
whatwg-url@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
|
||||
integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
|
||||
dependencies:
|
||||
tr46 "~0.0.3"
|
||||
webidl-conversions "^3.0.0"
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||
|
||||
ws@8.5.0:
|
||||
version "8.5.0"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
|
||||
integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
|
||||
|
||||
yaeti@^0.0.6:
|
||||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
|
||||
integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
|
||||
|
||||
yauzl@^2.10.0:
|
||||
version "2.10.0"
|
||||
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
||||
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
|
||||
dependencies:
|
||||
buffer-crc32 "~0.2.3"
|
||||
fd-slicer "~1.1.0"
|
||||
Loading…
Reference in New Issue
Block a user