init
This commit is contained in:
46
.gitignore
vendored
Normal file
46
.gitignore
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
.pnp
|
||||
.pnp.js
|
||||
.yarn
|
||||
|
||||
# testing
|
||||
examples/coverage/coverage/*
|
||||
.nyc_output
|
||||
|
||||
# next.js
|
||||
.next/
|
||||
out/
|
||||
build
|
||||
dist
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# turbo
|
||||
.turbo
|
||||
|
||||
# Cypress test outputs
|
||||
**/cypress/videos/
|
||||
**/cypress/screenshots/
|
||||
|
||||
# ENV file
|
||||
.env
|
||||
|
||||
# parcel
|
||||
.parcel-cache
|
||||
dist
|
||||
1
bin/cli.d.ts
vendored
Executable file
1
bin/cli.d.ts
vendored
Executable file
@@ -0,0 +1 @@
|
||||
#!/usr/bin/env node
|
||||
3640
bin/cli.js
Executable file
3640
bin/cli.js
Executable file
File diff suppressed because it is too large
Load Diff
3600
bin/cli.mjs
Executable file
3600
bin/cli.mjs
Executable file
File diff suppressed because it is too large
Load Diff
346
index.d.ts
vendored
Normal file
346
index.d.ts
vendored
Normal file
@@ -0,0 +1,346 @@
|
||||
type TestState = "failed" | "passed" | "pending" | "skipped";
|
||||
type TestAttemptState = "failed" | "passed" | "pending";
|
||||
type TestingType$1 = "e2e" | "component";
|
||||
interface MochaError {
|
||||
message: string;
|
||||
name: string;
|
||||
stack: string;
|
||||
parsedStack: MochaParsedStackItem[];
|
||||
codeFrame: MochaCodeFrame;
|
||||
}
|
||||
interface MochaInvocationDetails {
|
||||
function: string;
|
||||
fileUrl: string;
|
||||
originalFile: string;
|
||||
relativeFile: string;
|
||||
absoluteFile: string;
|
||||
line: number;
|
||||
column: number;
|
||||
whitespace: string;
|
||||
stack: string;
|
||||
}
|
||||
interface MochaCodeFrame {
|
||||
line: number;
|
||||
column: number;
|
||||
originalFile: string;
|
||||
relativeFile: string;
|
||||
absoluteFile: string;
|
||||
frame: string;
|
||||
language: string;
|
||||
}
|
||||
interface MochaParsedStackItem {
|
||||
message: string;
|
||||
whitespace: string;
|
||||
function?: string;
|
||||
fileUrl?: string;
|
||||
originalFile?: string;
|
||||
relativeFile?: string;
|
||||
absoluteFile?: string;
|
||||
line?: number;
|
||||
column?: number;
|
||||
}
|
||||
interface MochaHook {
|
||||
title: string;
|
||||
hookName: string;
|
||||
hookId: string;
|
||||
pending: boolean;
|
||||
body: string;
|
||||
type: string;
|
||||
file: null | string;
|
||||
invocationDetails: MochaInvocationDetails;
|
||||
currentRetry: number;
|
||||
retries: number;
|
||||
_slow: number;
|
||||
}
|
||||
type TimingKey = "before each" | "after each" | "after all" | "before all";
|
||||
type Timing = {
|
||||
[key in TimingKey]?: HookTimingItem;
|
||||
} & {
|
||||
lifecycle: number;
|
||||
test: TimingItem;
|
||||
};
|
||||
interface HookTimingItem extends TimingItem {
|
||||
hookId: string;
|
||||
}
|
||||
interface TimingItem {
|
||||
fnDuration: number;
|
||||
afterFnDuration: number;
|
||||
}
|
||||
|
||||
declare namespace Cypress12 {
|
||||
namespace SpecAfter {
|
||||
interface Payload {
|
||||
error: string | null;
|
||||
hooks: Hooks[] | null;
|
||||
reporter?: string;
|
||||
reporterStats: ReporterStats | null;
|
||||
screenshots: Screenshot[];
|
||||
spec: Spec;
|
||||
stats: Stats;
|
||||
tests: Test[] | null;
|
||||
video: string | null;
|
||||
}
|
||||
interface Spec {
|
||||
absolute: string;
|
||||
baseName: string;
|
||||
fileExtension: string;
|
||||
fileName: string;
|
||||
name: string;
|
||||
relative: string;
|
||||
relativeToCommonRoot: string;
|
||||
specFileExtension: string;
|
||||
specType: string;
|
||||
}
|
||||
interface Screenshot {
|
||||
height: number;
|
||||
name: string | null;
|
||||
path: string;
|
||||
screenshotId: string;
|
||||
takenAt: string;
|
||||
testAttemptIndex: number;
|
||||
testId: string;
|
||||
width: number;
|
||||
}
|
||||
interface ReporterStats {
|
||||
suites: number;
|
||||
tests: number;
|
||||
passes: number;
|
||||
pending: number;
|
||||
failures: number;
|
||||
start: string;
|
||||
end: string;
|
||||
duration: number;
|
||||
}
|
||||
interface Stats {
|
||||
suites: number;
|
||||
tests: number;
|
||||
passes: number;
|
||||
pending: number;
|
||||
skipped: number;
|
||||
failures: number;
|
||||
wallClockStartedAt: string;
|
||||
wallClockEndedAt: string;
|
||||
wallClockDuration: number;
|
||||
}
|
||||
interface Test {
|
||||
attempts: TestAttempt[];
|
||||
body: string;
|
||||
displayError: string | null;
|
||||
state: TestState;
|
||||
title: string[];
|
||||
testId: string;
|
||||
}
|
||||
interface Hooks {
|
||||
hookId: string;
|
||||
hookName: "before each" | "after each" | "before all" | "after all";
|
||||
title: string[];
|
||||
body: string;
|
||||
}
|
||||
interface TestAttempt {
|
||||
error: TestError | null;
|
||||
failedFromHookId: string | null;
|
||||
state: TestAttemptState;
|
||||
timings: Timing | null;
|
||||
videoTimestamp: number;
|
||||
wallClockDuration: number;
|
||||
wallClockStartedAt: string;
|
||||
}
|
||||
interface TestError {
|
||||
message: string;
|
||||
name: string;
|
||||
stack: string;
|
||||
codeFrame: CodeFrame | null;
|
||||
}
|
||||
interface CodeFrame {
|
||||
line: number | null;
|
||||
column: number | null;
|
||||
originalFile: string | null;
|
||||
relativeFile: string | null;
|
||||
absoluteFile: string | null;
|
||||
frame: string | null;
|
||||
language: string | null;
|
||||
}
|
||||
}
|
||||
namespace TestAfter {
|
||||
interface Payload extends TestBefore.Payload {
|
||||
duration: number;
|
||||
err?: MochaError;
|
||||
hooks: MochaHook[];
|
||||
timings: Timing;
|
||||
}
|
||||
}
|
||||
namespace TestBefore {
|
||||
interface Payload {
|
||||
async: boolean;
|
||||
body: string;
|
||||
currentRetry: number;
|
||||
fullTitle: string;
|
||||
hooks?: MochaHook[];
|
||||
id: string;
|
||||
invocationDetails?: MochaInvocationDetails;
|
||||
order: number;
|
||||
pending: boolean;
|
||||
retries: number;
|
||||
state: string;
|
||||
sync: boolean;
|
||||
timedOut: boolean;
|
||||
timings: Pick<Timing, "lifecycle">;
|
||||
title: string;
|
||||
type: string;
|
||||
wallClockStartedAt: string;
|
||||
}
|
||||
}
|
||||
namespace ScreenshotAfter {
|
||||
interface Payload {
|
||||
testAttemptIndex: number;
|
||||
size: number;
|
||||
takenAt: string;
|
||||
dimensions: {
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
multipart: boolean;
|
||||
specName: string;
|
||||
name: string | null;
|
||||
testFailure: boolean;
|
||||
path: string;
|
||||
scaled: boolean;
|
||||
duration: number;
|
||||
blackout: string[];
|
||||
}
|
||||
}
|
||||
namespace ModuleAPI {
|
||||
type Result = CompletedResult | FailureResult;
|
||||
interface FailureResult {
|
||||
status: "failed";
|
||||
failures: number;
|
||||
message: string;
|
||||
}
|
||||
interface CompletedResult {
|
||||
browserName: string;
|
||||
browserPath: string;
|
||||
browserVersion: string;
|
||||
config: Config;
|
||||
cypressVersion: string;
|
||||
endedTestsAt: string;
|
||||
osName: string;
|
||||
osVersion: string;
|
||||
runs: Run[];
|
||||
startedTestsAt: string;
|
||||
status: "finished" | "failed";
|
||||
totalDuration: number;
|
||||
totalFailed: number;
|
||||
totalPassed: number;
|
||||
totalPending: number;
|
||||
totalSkipped: number;
|
||||
totalSuites: number;
|
||||
totalTests: number;
|
||||
}
|
||||
interface Run {
|
||||
error: SpecAfter.Payload["error"];
|
||||
hooks: SpecAfter.Payload["hooks"];
|
||||
reporter?: SpecAfter.Payload["reporter"];
|
||||
reporterStats: SpecAfter.Payload["reporterStats"];
|
||||
shouldUploadVideo: boolean;
|
||||
spec: SpecAfter.Spec;
|
||||
stats: Stats;
|
||||
tests: Test[] | null;
|
||||
video: string | null;
|
||||
}
|
||||
interface Test {
|
||||
title: string[];
|
||||
state: TestState;
|
||||
body: string;
|
||||
displayError: string | null;
|
||||
attempts: TestAttempt[];
|
||||
}
|
||||
interface TestAttempt {
|
||||
state: SpecAfter.TestAttempt["state"];
|
||||
error: SpecAfter.TestAttempt["error"];
|
||||
videoTimestamp: number;
|
||||
duration: number | null;
|
||||
startedAt: string;
|
||||
screenshots: Screenshot[];
|
||||
}
|
||||
interface Screenshot {
|
||||
name: string | null;
|
||||
takenAt: string;
|
||||
path: string;
|
||||
height: number;
|
||||
width: number;
|
||||
}
|
||||
interface Stats {
|
||||
duration: number;
|
||||
endedAt: string;
|
||||
failures: number;
|
||||
passes: number;
|
||||
pending: number;
|
||||
skipped: number;
|
||||
startedAt: string;
|
||||
suites: number;
|
||||
tests: number;
|
||||
}
|
||||
interface Config {
|
||||
specPattern: string;
|
||||
video: boolean;
|
||||
videoUploadOnPasses: boolean;
|
||||
version: string;
|
||||
testingType: TestingType$1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type TestingType = Cypress.TestingType;
|
||||
declare enum DebugMode {
|
||||
None = "none",
|
||||
All = "all",
|
||||
Cc = "cc",
|
||||
Cypress = "cypress",
|
||||
CommitInfo = "commit-info"
|
||||
}
|
||||
type StrippedCypressModuleAPIOptions = Omit<Partial<CypressCommandLine.CypressRunOptions>, "autoCancelAfterFailures" | "tag" | "spec" | "exit" | "headed" | "record" | "headless" | "noExit" | "parallel" | "key" | "tag" | "group" | "ciBuildId" | "cloudConfigFile">;
|
||||
type CcRunParameters = StrippedCypressModuleAPIOptions & {
|
||||
ciBuildId?: string;
|
||||
batchSize?: number;
|
||||
record?: boolean;
|
||||
cloudServiceUrl?: string;
|
||||
env?: object;
|
||||
group?: string;
|
||||
recordKey?: string;
|
||||
parallel?: boolean;
|
||||
projectId?: string;
|
||||
spec?: string | string[];
|
||||
tag?: string | string[];
|
||||
testingType?: TestingType;
|
||||
autoCancelAfterFailures?: number | false;
|
||||
headed?: boolean;
|
||||
cloudConfigFile?: string;
|
||||
cloudDebug?: DebugMode | true | string | string[];
|
||||
experimentalCoverageRecording?: boolean;
|
||||
};
|
||||
interface CcRunAPI extends CcRunParameters {
|
||||
}
|
||||
|
||||
declare function run(params?: CcRunAPI): Promise<CypressCommandLine.CypressRunResult | CypressCommandLine.CypressFailedRunResult | {
|
||||
runUrl: string;
|
||||
browserName: string;
|
||||
browserPath: string;
|
||||
browserVersion: string;
|
||||
config: Cypress12.ModuleAPI.Config;
|
||||
cypressVersion: string;
|
||||
endedTestsAt: string;
|
||||
osName: string;
|
||||
osVersion: string;
|
||||
runs: Cypress12.ModuleAPI.Run[];
|
||||
startedTestsAt: string;
|
||||
status: "finished" | "failed";
|
||||
totalDuration: number;
|
||||
totalFailed: number;
|
||||
totalPassed: number;
|
||||
totalPending: number;
|
||||
totalSkipped: number;
|
||||
totalSuites: number;
|
||||
totalTests: number;
|
||||
} | undefined>;
|
||||
|
||||
export { CcRunAPI, run };
|
||||
137
package.json
Normal file
137
package.json
Normal file
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"name": "@krivega/cc",
|
||||
"version": "4.0.0",
|
||||
"main": "./index.js",
|
||||
"author": {
|
||||
"name": "Krivega Dmitriy",
|
||||
"email": "mr.krivega@gmail.com",
|
||||
"url": "https://krivega.com"
|
||||
},
|
||||
"license": "GPL-3.0-or-later",
|
||||
"engines": {
|
||||
"node": ">=14.7.0"
|
||||
},
|
||||
"scripts": {
|
||||
"rm": "rimraf out",
|
||||
"lint": "TIMING=1 eslint \"**/*.ts*\"",
|
||||
"test": "jest",
|
||||
"test:watch": "jest --watch",
|
||||
"release": "release-it",
|
||||
"release:npm": "npm run build && ./publish.js",
|
||||
"dev": "tsup-node --watch",
|
||||
"build": "tsup-node --dts"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@release-it/conventional-changelog": "^7.0.0",
|
||||
"@swc/core": "^1.3.86",
|
||||
"@swc/jest": "^0.2.29",
|
||||
"@types/bluebird": "^3.5.38",
|
||||
"@types/debug": "^4.1.7",
|
||||
"@types/getos": "^3.0.1",
|
||||
"@types/is-ci": "^3.0.0",
|
||||
"@types/jest": "^29.2.4",
|
||||
"@types/lodash": "^4.14.191",
|
||||
"@types/ws": "^8.5.4",
|
||||
"cypress": "^13.2.0",
|
||||
"esbuild": "^0.16.5",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-custom": "latest",
|
||||
"jest": "^29.3.1",
|
||||
"nock": "^13.2.9",
|
||||
"release-it": "^16.1.5",
|
||||
"rimraf": "^3.0.2",
|
||||
"tsconfig": "*",
|
||||
"tsup": "^7.0.0",
|
||||
"typescript": "^4.7.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"@cypress/commit-info": "^2.2.0",
|
||||
"axios": "^1.2.0",
|
||||
"axios-retry": "^3.4.0",
|
||||
"bluebird": "^3.7.2",
|
||||
"chalk": "^4.1.2",
|
||||
"commander": "^10.0.0",
|
||||
"common-path-prefix": "^3.0.0",
|
||||
"cy2": "^3.4.2",
|
||||
"date-fns": "^2.30.0",
|
||||
"debug": "^4.3.4",
|
||||
"execa": "^5.1.1",
|
||||
"fast-safe-stringify": "^2.1.1",
|
||||
"getos": "^3.2.1",
|
||||
"globby": "^11.1.0",
|
||||
"is-absolute": "^1.0.0",
|
||||
"lil-http-terminator": "^1.2.3",
|
||||
"lodash": "^4.17.21",
|
||||
"nanoid": "^3.3.4",
|
||||
"plur": "^4.0.0",
|
||||
"pretty-ms": "^7.0.1",
|
||||
"source-map-support": "^0.5.21",
|
||||
"table": "^6.8.1",
|
||||
"tmp-promise": "^3.0.3",
|
||||
"ts-pattern": "^4.3.0",
|
||||
"ws": "^8.13.0"
|
||||
},
|
||||
"bin": "./bin/cli.js",
|
||||
"files": [
|
||||
"*"
|
||||
],
|
||||
"tsup": {
|
||||
"entry": [
|
||||
"./index.ts",
|
||||
"./bin/*.ts",
|
||||
"./plugin/*.ts",
|
||||
"./support/*.ts"
|
||||
],
|
||||
"external": [
|
||||
"cypress"
|
||||
],
|
||||
"format": [
|
||||
"cjs",
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"shims": true,
|
||||
"clean": true,
|
||||
"sourcemap": "inline",
|
||||
"platform": "node",
|
||||
"target": "esnext"
|
||||
},
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./index.mjs",
|
||||
"require": "./index.js",
|
||||
"types": "./index.d.ts"
|
||||
},
|
||||
"./plugin": {
|
||||
"import": "./plugin/index.js",
|
||||
"require": "./plugin/index.js",
|
||||
"types": "./plugin/index.d.ts"
|
||||
},
|
||||
"./support": {
|
||||
"import": "./support/index.js",
|
||||
"require": "./support/index.js",
|
||||
"types": "./support/index.d.ts"
|
||||
},
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"release-it": {
|
||||
"github": {
|
||||
"release": true,
|
||||
"releaseName": "v${version}"
|
||||
},
|
||||
"npm": {
|
||||
"publish": false
|
||||
},
|
||||
"git": {
|
||||
"requireCleanWorkingDir": false,
|
||||
"commitMessage": "chore: release v${version}",
|
||||
"tagName": "v${version}"
|
||||
},
|
||||
"plugins": {
|
||||
"@release-it/conventional-changelog": {
|
||||
"preset": "angular",
|
||||
"infile": "../../CHANGELOG.md"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
plugin/index.d.ts
vendored
Normal file
3
plugin/index.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
declare function cloudPlugin(on: Cypress.PluginEvents, config: Cypress.PluginConfigOptions): Promise<Cypress.PluginConfigOptions>;
|
||||
|
||||
export { cloudPlugin, cloudPlugin as default };
|
||||
144
plugin/index.js
Normal file
144
plugin/index.js
Normal file
@@ -0,0 +1,144 @@
|
||||
"use strict";
|
||||
var __create = Object.create;
|
||||
var __defProp = Object.defineProperty;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __getProtoOf = Object.getPrototypeOf;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __export = (target, all) => {
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __copyProps = (to, from, except, desc) => {
|
||||
if (from && typeof from === "object" || typeof from === "function") {
|
||||
for (let key of __getOwnPropNames(from))
|
||||
if (!__hasOwnProp.call(to, key) && key !== except)
|
||||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||||
}
|
||||
return to;
|
||||
};
|
||||
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
||||
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
||||
mod
|
||||
));
|
||||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||||
|
||||
var plugin_exports = {};
|
||||
__export(plugin_exports, {
|
||||
cloudPlugin: () => cloudPlugin,
|
||||
default: () => plugin_default
|
||||
});
|
||||
module.exports = __toCommonJS(plugin_exports);
|
||||
var import_debug = __toESM(require("debug"));
|
||||
var import_fs = __toESM(require("fs"));
|
||||
var import_util2 = require("util");
|
||||
var import_ws = __toESM(require("ws"));
|
||||
|
||||
var import_chalk = __toESM(require("chalk"));
|
||||
var import_util = __toESM(require("util"));
|
||||
var log = (...args) => console.log(import_util.default.format(...args));
|
||||
var format = import_util.default.format;
|
||||
var withWarning = (msg) => import_chalk.default.bgYellow.black(" WARNING ") + " " + msg;
|
||||
var warn = (...args) => log(withWarning(import_util.default.format(...args)));
|
||||
var cyan = import_chalk.default.cyan;
|
||||
var blue = import_chalk.default.blueBright;
|
||||
var red = import_chalk.default.red;
|
||||
var green = import_chalk.default.greenBright;
|
||||
var gray = import_chalk.default.gray;
|
||||
var white = import_chalk.default.white;
|
||||
var magenta = import_chalk.default.magenta;
|
||||
var bold = import_chalk.default.bold;
|
||||
var dim = import_chalk.default.dim;
|
||||
|
||||
var Event = ((Event2) => {
|
||||
Event2["RUN_CANCELLED"] = "run:cancelled";
|
||||
Event2["RUN_RESULT"] = "run:result";
|
||||
Event2["TEST_AFTER_RUN"] = "test:after:run";
|
||||
Event2["TEST_BEFORE_RUN"] = "test:before:run";
|
||||
Event2["AFTER_SCREENSHOT"] = "after:screenshot";
|
||||
Event2["AFTER_SPEC"] = "after:spec";
|
||||
return Event2;
|
||||
})(Event || {});
|
||||
var allEvents = Object.values(Event);
|
||||
|
||||
var import_events = __toESM(require("events"));
|
||||
|
||||
var _debug = (0, import_debug.default)("cc:plugin");
|
||||
async function cloudPlugin(on, config) {
|
||||
function debug(...args) {
|
||||
if (config.env.cc_debug_enabled) {
|
||||
_debug((0, import_util2.format)(...args));
|
||||
}
|
||||
}
|
||||
if (!config.env.cc_marker) {
|
||||
warn(
|
||||
`Cc plugin is not installed properly - missing required variables in ${dim(
|
||||
"cypress.env"
|
||||
)}. Please refer to: self`
|
||||
);
|
||||
}
|
||||
let ws = null;
|
||||
function sendToWS(message) {
|
||||
if (ws) {
|
||||
ws.send(JSON.stringify(message));
|
||||
}
|
||||
}
|
||||
if (config.env.cc_ws) {
|
||||
debug("setting port to %s", config.env.cc_ws);
|
||||
await new Promise((resolve) => {
|
||||
ws = new import_ws.default(`ws://localhost:${config.env.cc_ws}`);
|
||||
ws.on("open", () => {
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
on("after:screenshot", (details) => {
|
||||
sendToWS({
|
||||
type: "after:screenshot",
|
||||
payload: details
|
||||
});
|
||||
});
|
||||
on("task", {
|
||||
"cc:test:after:run": (test) => {
|
||||
debug("cc:test:after:run task received %o", test);
|
||||
sendToWS({
|
||||
type: "test:after:run",
|
||||
payload: test
|
||||
});
|
||||
return null;
|
||||
},
|
||||
"cc:test:before:run": (test) => {
|
||||
debug("cc:test:before:run task received %o", test);
|
||||
sendToWS({
|
||||
type: "test:before:run",
|
||||
payload: test
|
||||
});
|
||||
return null;
|
||||
}
|
||||
});
|
||||
on("before:spec", (spec) => {
|
||||
debug("before:spec task received %o", spec);
|
||||
sendToWS({ type: "before:spec", payload: { spec } });
|
||||
});
|
||||
on("after:spec", (spec, results) => {
|
||||
debug("after:spec task received %o", spec);
|
||||
sendToWS({
|
||||
type: "after:spec",
|
||||
payload: {
|
||||
spec,
|
||||
results
|
||||
}
|
||||
});
|
||||
});
|
||||
debug("cc plugin loaded");
|
||||
if (config.env.cc_temp_file) {
|
||||
debug("dumping config to '%s'", config.env.cc_temp_file);
|
||||
import_fs.default.writeFileSync(config.env.cc_temp_file, JSON.stringify(config));
|
||||
debug("config is availabe at '%s'", config.env.cc_temp_file);
|
||||
}
|
||||
return config;
|
||||
}
|
||||
var plugin_default = cloudPlugin;
|
||||
0 && (module.exports = {
|
||||
cloudPlugin
|
||||
});
|
||||
113
plugin/index.mjs
Normal file
113
plugin/index.mjs
Normal file
@@ -0,0 +1,113 @@
|
||||
import Debug from "debug";
|
||||
import fs from "fs";
|
||||
import { format as format2 } from "util";
|
||||
import WebSocket from "ws";
|
||||
|
||||
import chalk from "chalk";
|
||||
import util from "util";
|
||||
var log = (...args) => console.log(util.format(...args));
|
||||
var format = util.format;
|
||||
var withWarning = (msg) => chalk.bgYellow.black(" WARNING ") + " " + msg;
|
||||
var warn = (...args) => log(withWarning(util.format(...args)));
|
||||
var cyan = chalk.cyan;
|
||||
var blue = chalk.blueBright;
|
||||
var red = chalk.red;
|
||||
var green = chalk.greenBright;
|
||||
var gray = chalk.gray;
|
||||
var white = chalk.white;
|
||||
var magenta = chalk.magenta;
|
||||
var bold = chalk.bold;
|
||||
var dim = chalk.dim;
|
||||
|
||||
var Event = ((Event2) => {
|
||||
Event2["RUN_CANCELLED"] = "run:cancelled";
|
||||
Event2["RUN_RESULT"] = "run:result";
|
||||
Event2["TEST_AFTER_RUN"] = "test:after:run";
|
||||
Event2["TEST_BEFORE_RUN"] = "test:before:run";
|
||||
Event2["AFTER_SCREENSHOT"] = "after:screenshot";
|
||||
Event2["AFTER_SPEC"] = "after:spec";
|
||||
return Event2;
|
||||
})(Event || {});
|
||||
var allEvents = Object.values(Event);
|
||||
|
||||
|
||||
var _debug = Debug("cc:plugin");
|
||||
async function cloudPlugin(on, config) {
|
||||
function debug(...args) {
|
||||
if (config.env.cc_debug_enabled) {
|
||||
_debug(format2(...args));
|
||||
}
|
||||
}
|
||||
if (!config.env.cc_marker) {
|
||||
warn(
|
||||
`Cc plugin is not installed properly - missing required variables in ${dim(
|
||||
"cypress.env"
|
||||
)}. Please refer to: self`
|
||||
);
|
||||
}
|
||||
let ws = null;
|
||||
function sendToWS(message) {
|
||||
if (ws) {
|
||||
ws.send(JSON.stringify(message));
|
||||
}
|
||||
}
|
||||
if (config.env.cc_ws) {
|
||||
debug("setting port to %s", config.env.cc_ws);
|
||||
await new Promise((resolve) => {
|
||||
ws = new WebSocket(`ws://localhost:${config.env.cc_ws}`);
|
||||
ws.on("open", () => {
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
on("after:screenshot", (details) => {
|
||||
sendToWS({
|
||||
type: "after:screenshot",
|
||||
payload: details
|
||||
});
|
||||
});
|
||||
on("task", {
|
||||
"cc:test:after:run": (test) => {
|
||||
debug("cc:test:after:run task received %o", test);
|
||||
sendToWS({
|
||||
type: "test:after:run",
|
||||
payload: test
|
||||
});
|
||||
return null;
|
||||
},
|
||||
"cc:test:before:run": (test) => {
|
||||
debug("cc:test:before:run task received %o", test);
|
||||
sendToWS({
|
||||
type: "test:before:run",
|
||||
payload: test
|
||||
});
|
||||
return null;
|
||||
}
|
||||
});
|
||||
on("before:spec", (spec) => {
|
||||
debug("before:spec task received %o", spec);
|
||||
sendToWS({ type: "before:spec", payload: { spec } });
|
||||
});
|
||||
on("after:spec", (spec, results) => {
|
||||
debug("after:spec task received %o", spec);
|
||||
sendToWS({
|
||||
type: "after:spec",
|
||||
payload: {
|
||||
spec,
|
||||
results
|
||||
}
|
||||
});
|
||||
});
|
||||
debug("cc plugin loaded");
|
||||
if (config.env.cc_temp_file) {
|
||||
debug("dumping config to '%s'", config.env.cc_temp_file);
|
||||
fs.writeFileSync(config.env.cc_temp_file, JSON.stringify(config));
|
||||
debug("config is availabe at '%s'", config.env.cc_temp_file);
|
||||
}
|
||||
return config;
|
||||
}
|
||||
var plugin_default = cloudPlugin;
|
||||
export {
|
||||
cloudPlugin,
|
||||
plugin_default as default
|
||||
};
|
||||
2
support/index.d.ts
vendored
Normal file
2
support/index.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
export { }
|
||||
103
support/index.js
Normal file
103
support/index.js
Normal file
File diff suppressed because one or more lines are too long
79
support/index.mjs
Normal file
79
support/index.mjs
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user