Standardize settings file naming and relocate documentation files Fix code quality violations from rsx:check Reorganize user_management directory into logical subdirectories Move Quill Bundle to core and align with Tom Select pattern Simplify Site Settings page to focus on core site information Complete Phase 5: Multi-tenant authentication with login flow and site selection Add route query parameter rule and synchronize filename validation logic Fix critical bug in UpdateNpmCommand causing missing JavaScript stubs Implement filename convention rule and resolve VS Code auto-rename conflict Implement js-sanitizer RPC server to eliminate 900+ Node.js process spawns Implement RPC server architecture for JavaScript parsing WIP: Add RPC server infrastructure for JS parsing (partial implementation) Update jqhtml terminology from destroy to stop, fix datagrid DOM preservation Add JQHTML-CLASS-01 rule and fix redundant class names Improve code quality rules and resolve violations Remove legacy fatal error format in favor of unified 'fatal' error type Filter internal keys from window.rsxapp output Update button styling and comprehensive form/modal documentation Add conditional fly-in animation for modals Fix non-deterministic bundle compilation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
508 lines
15 KiB
JavaScript
Executable File
508 lines
15 KiB
JavaScript
Executable File
"use strict";
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
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 __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
var teleReceiver_exports = {};
|
|
__export(teleReceiver_exports, {
|
|
TeleReporterReceiver: () => TeleReporterReceiver,
|
|
TeleSuite: () => TeleSuite,
|
|
TeleTestCase: () => TeleTestCase,
|
|
TeleTestResult: () => TeleTestResult,
|
|
baseFullConfig: () => baseFullConfig,
|
|
computeTestCaseOutcome: () => computeTestCaseOutcome,
|
|
parseRegexPatterns: () => parseRegexPatterns,
|
|
serializeRegexPatterns: () => serializeRegexPatterns
|
|
});
|
|
module.exports = __toCommonJS(teleReceiver_exports);
|
|
class TeleReporterReceiver {
|
|
constructor(reporter, options = {}) {
|
|
this.isListing = false;
|
|
this._tests = /* @__PURE__ */ new Map();
|
|
this._rootSuite = new TeleSuite("", "root");
|
|
this._options = options;
|
|
this._reporter = reporter;
|
|
}
|
|
reset() {
|
|
this._rootSuite._entries = [];
|
|
this._tests.clear();
|
|
}
|
|
dispatch(message) {
|
|
const { method, params } = message;
|
|
if (method === "onConfigure") {
|
|
this._onConfigure(params.config);
|
|
return;
|
|
}
|
|
if (method === "onProject") {
|
|
this._onProject(params.project);
|
|
return;
|
|
}
|
|
if (method === "onBegin") {
|
|
this._onBegin();
|
|
return;
|
|
}
|
|
if (method === "onTestBegin") {
|
|
this._onTestBegin(params.testId, params.result);
|
|
return;
|
|
}
|
|
if (method === "onTestEnd") {
|
|
this._onTestEnd(params.test, params.result);
|
|
return;
|
|
}
|
|
if (method === "onStepBegin") {
|
|
this._onStepBegin(params.testId, params.resultId, params.step);
|
|
return;
|
|
}
|
|
if (method === "onAttach") {
|
|
this._onAttach(params.testId, params.resultId, params.attachments);
|
|
return;
|
|
}
|
|
if (method === "onStepEnd") {
|
|
this._onStepEnd(params.testId, params.resultId, params.step);
|
|
return;
|
|
}
|
|
if (method === "onError") {
|
|
this._onError(params.error);
|
|
return;
|
|
}
|
|
if (method === "onStdIO") {
|
|
this._onStdIO(params.type, params.testId, params.resultId, params.data, params.isBase64);
|
|
return;
|
|
}
|
|
if (method === "onEnd")
|
|
return this._onEnd(params.result);
|
|
if (method === "onExit")
|
|
return this._onExit();
|
|
}
|
|
_onConfigure(config) {
|
|
this._rootDir = config.rootDir;
|
|
this._config = this._parseConfig(config);
|
|
this._reporter.onConfigure?.(this._config);
|
|
}
|
|
_onProject(project) {
|
|
let projectSuite = this._options.mergeProjects ? this._rootSuite.suites.find((suite) => suite.project().name === project.name) : void 0;
|
|
if (!projectSuite) {
|
|
projectSuite = new TeleSuite(project.name, "project");
|
|
this._rootSuite._addSuite(projectSuite);
|
|
}
|
|
projectSuite._project = this._parseProject(project);
|
|
for (const suite of project.suites)
|
|
this._mergeSuiteInto(suite, projectSuite);
|
|
}
|
|
_onBegin() {
|
|
this._reporter.onBegin?.(this._rootSuite);
|
|
}
|
|
_onTestBegin(testId, payload) {
|
|
const test = this._tests.get(testId);
|
|
if (this._options.clearPreviousResultsWhenTestBegins)
|
|
test.results = [];
|
|
const testResult = test._createTestResult(payload.id);
|
|
testResult.retry = payload.retry;
|
|
testResult.workerIndex = payload.workerIndex;
|
|
testResult.parallelIndex = payload.parallelIndex;
|
|
testResult.setStartTimeNumber(payload.startTime);
|
|
this._reporter.onTestBegin?.(test, testResult);
|
|
}
|
|
_onTestEnd(testEndPayload, payload) {
|
|
const test = this._tests.get(testEndPayload.testId);
|
|
test.timeout = testEndPayload.timeout;
|
|
test.expectedStatus = testEndPayload.expectedStatus;
|
|
const result = test.results.find((r) => r._id === payload.id);
|
|
result.duration = payload.duration;
|
|
result.status = payload.status;
|
|
result.errors = payload.errors;
|
|
result.error = result.errors?.[0];
|
|
if (!!payload.attachments)
|
|
result.attachments = this._parseAttachments(payload.attachments);
|
|
if (payload.annotations) {
|
|
this._absoluteAnnotationLocationsInplace(payload.annotations);
|
|
result.annotations = payload.annotations;
|
|
test.annotations = payload.annotations;
|
|
}
|
|
this._reporter.onTestEnd?.(test, result);
|
|
result._stepMap = /* @__PURE__ */ new Map();
|
|
}
|
|
_onStepBegin(testId, resultId, payload) {
|
|
const test = this._tests.get(testId);
|
|
const result = test.results.find((r) => r._id === resultId);
|
|
const parentStep = payload.parentStepId ? result._stepMap.get(payload.parentStepId) : void 0;
|
|
const location = this._absoluteLocation(payload.location);
|
|
const step = new TeleTestStep(payload, parentStep, location, result);
|
|
if (parentStep)
|
|
parentStep.steps.push(step);
|
|
else
|
|
result.steps.push(step);
|
|
result._stepMap.set(payload.id, step);
|
|
this._reporter.onStepBegin?.(test, result, step);
|
|
}
|
|
_onStepEnd(testId, resultId, payload) {
|
|
const test = this._tests.get(testId);
|
|
const result = test.results.find((r) => r._id === resultId);
|
|
const step = result._stepMap.get(payload.id);
|
|
step._endPayload = payload;
|
|
step.duration = payload.duration;
|
|
step.error = payload.error;
|
|
this._reporter.onStepEnd?.(test, result, step);
|
|
}
|
|
_onAttach(testId, resultId, attachments) {
|
|
const test = this._tests.get(testId);
|
|
const result = test.results.find((r) => r._id === resultId);
|
|
result.attachments.push(...attachments.map((a) => ({
|
|
name: a.name,
|
|
contentType: a.contentType,
|
|
path: a.path,
|
|
body: a.base64 && globalThis.Buffer ? Buffer.from(a.base64, "base64") : void 0
|
|
})));
|
|
}
|
|
_onError(error) {
|
|
this._reporter.onError?.(error);
|
|
}
|
|
_onStdIO(type, testId, resultId, data, isBase64) {
|
|
const chunk = isBase64 ? globalThis.Buffer ? Buffer.from(data, "base64") : atob(data) : data;
|
|
const test = testId ? this._tests.get(testId) : void 0;
|
|
const result = test && resultId ? test.results.find((r) => r._id === resultId) : void 0;
|
|
if (type === "stdout") {
|
|
result?.stdout.push(chunk);
|
|
this._reporter.onStdOut?.(chunk, test, result);
|
|
} else {
|
|
result?.stderr.push(chunk);
|
|
this._reporter.onStdErr?.(chunk, test, result);
|
|
}
|
|
}
|
|
async _onEnd(result) {
|
|
await this._reporter.onEnd?.({
|
|
status: result.status,
|
|
startTime: new Date(result.startTime),
|
|
duration: result.duration
|
|
});
|
|
}
|
|
_onExit() {
|
|
return this._reporter.onExit?.();
|
|
}
|
|
_parseConfig(config) {
|
|
const result = { ...baseFullConfig, ...config };
|
|
if (this._options.configOverrides) {
|
|
result.configFile = this._options.configOverrides.configFile;
|
|
result.reportSlowTests = this._options.configOverrides.reportSlowTests;
|
|
result.quiet = this._options.configOverrides.quiet;
|
|
result.reporter = [...this._options.configOverrides.reporter];
|
|
}
|
|
return result;
|
|
}
|
|
_parseProject(project) {
|
|
return {
|
|
metadata: project.metadata,
|
|
name: project.name,
|
|
outputDir: this._absolutePath(project.outputDir),
|
|
repeatEach: project.repeatEach,
|
|
retries: project.retries,
|
|
testDir: this._absolutePath(project.testDir),
|
|
testIgnore: parseRegexPatterns(project.testIgnore),
|
|
testMatch: parseRegexPatterns(project.testMatch),
|
|
timeout: project.timeout,
|
|
grep: parseRegexPatterns(project.grep),
|
|
grepInvert: parseRegexPatterns(project.grepInvert),
|
|
dependencies: project.dependencies,
|
|
teardown: project.teardown,
|
|
snapshotDir: this._absolutePath(project.snapshotDir),
|
|
use: project.use
|
|
};
|
|
}
|
|
_parseAttachments(attachments) {
|
|
return attachments.map((a) => {
|
|
return {
|
|
...a,
|
|
body: a.base64 && globalThis.Buffer ? Buffer.from(a.base64, "base64") : void 0
|
|
};
|
|
});
|
|
}
|
|
_mergeSuiteInto(jsonSuite, parent) {
|
|
let targetSuite = parent.suites.find((s) => s.title === jsonSuite.title);
|
|
if (!targetSuite) {
|
|
targetSuite = new TeleSuite(jsonSuite.title, parent.type === "project" ? "file" : "describe");
|
|
parent._addSuite(targetSuite);
|
|
}
|
|
targetSuite.location = this._absoluteLocation(jsonSuite.location);
|
|
jsonSuite.entries.forEach((e) => {
|
|
if ("testId" in e)
|
|
this._mergeTestInto(e, targetSuite);
|
|
else
|
|
this._mergeSuiteInto(e, targetSuite);
|
|
});
|
|
}
|
|
_mergeTestInto(jsonTest, parent) {
|
|
let targetTest = this._options.mergeTestCases ? parent.tests.find((s) => s.title === jsonTest.title && s.repeatEachIndex === jsonTest.repeatEachIndex) : void 0;
|
|
if (!targetTest) {
|
|
targetTest = new TeleTestCase(jsonTest.testId, jsonTest.title, this._absoluteLocation(jsonTest.location), jsonTest.repeatEachIndex);
|
|
parent._addTest(targetTest);
|
|
this._tests.set(targetTest.id, targetTest);
|
|
}
|
|
this._updateTest(jsonTest, targetTest);
|
|
}
|
|
_updateTest(payload, test) {
|
|
test.id = payload.testId;
|
|
test.location = this._absoluteLocation(payload.location);
|
|
test.retries = payload.retries;
|
|
test.tags = payload.tags ?? [];
|
|
test.annotations = payload.annotations ?? [];
|
|
this._absoluteAnnotationLocationsInplace(test.annotations);
|
|
return test;
|
|
}
|
|
_absoluteAnnotationLocationsInplace(annotations) {
|
|
for (const annotation of annotations) {
|
|
if (annotation.location)
|
|
annotation.location = this._absoluteLocation(annotation.location);
|
|
}
|
|
}
|
|
_absoluteLocation(location) {
|
|
if (!location)
|
|
return location;
|
|
return {
|
|
...location,
|
|
file: this._absolutePath(location.file)
|
|
};
|
|
}
|
|
_absolutePath(relativePath) {
|
|
if (relativePath === void 0)
|
|
return;
|
|
return this._options.resolvePath ? this._options.resolvePath(this._rootDir, relativePath) : this._rootDir + "/" + relativePath;
|
|
}
|
|
}
|
|
class TeleSuite {
|
|
constructor(title, type) {
|
|
this._entries = [];
|
|
this._requireFile = "";
|
|
this._parallelMode = "none";
|
|
this.title = title;
|
|
this._type = type;
|
|
}
|
|
get type() {
|
|
return this._type;
|
|
}
|
|
get suites() {
|
|
return this._entries.filter((e) => e.type !== "test");
|
|
}
|
|
get tests() {
|
|
return this._entries.filter((e) => e.type === "test");
|
|
}
|
|
entries() {
|
|
return this._entries;
|
|
}
|
|
allTests() {
|
|
const result = [];
|
|
const visit = (suite) => {
|
|
for (const entry of suite.entries()) {
|
|
if (entry.type === "test")
|
|
result.push(entry);
|
|
else
|
|
visit(entry);
|
|
}
|
|
};
|
|
visit(this);
|
|
return result;
|
|
}
|
|
titlePath() {
|
|
const titlePath = this.parent ? this.parent.titlePath() : [];
|
|
if (this.title || this._type !== "describe")
|
|
titlePath.push(this.title);
|
|
return titlePath;
|
|
}
|
|
project() {
|
|
return this._project ?? this.parent?.project();
|
|
}
|
|
_addTest(test) {
|
|
test.parent = this;
|
|
this._entries.push(test);
|
|
}
|
|
_addSuite(suite) {
|
|
suite.parent = this;
|
|
this._entries.push(suite);
|
|
}
|
|
}
|
|
class TeleTestCase {
|
|
constructor(id, title, location, repeatEachIndex) {
|
|
this.fn = () => {
|
|
};
|
|
this.results = [];
|
|
this.type = "test";
|
|
this.expectedStatus = "passed";
|
|
this.timeout = 0;
|
|
this.annotations = [];
|
|
this.retries = 0;
|
|
this.tags = [];
|
|
this.repeatEachIndex = 0;
|
|
this.id = id;
|
|
this.title = title;
|
|
this.location = location;
|
|
this.repeatEachIndex = repeatEachIndex;
|
|
}
|
|
titlePath() {
|
|
const titlePath = this.parent ? this.parent.titlePath() : [];
|
|
titlePath.push(this.title);
|
|
return titlePath;
|
|
}
|
|
outcome() {
|
|
return computeTestCaseOutcome(this);
|
|
}
|
|
ok() {
|
|
const status = this.outcome();
|
|
return status === "expected" || status === "flaky" || status === "skipped";
|
|
}
|
|
_createTestResult(id) {
|
|
const result = new TeleTestResult(this.results.length, id);
|
|
this.results.push(result);
|
|
return result;
|
|
}
|
|
}
|
|
class TeleTestStep {
|
|
constructor(payload, parentStep, location, result) {
|
|
this.duration = -1;
|
|
this.steps = [];
|
|
this._startTime = 0;
|
|
this.title = payload.title;
|
|
this.category = payload.category;
|
|
this.location = location;
|
|
this.parent = parentStep;
|
|
this._startTime = payload.startTime;
|
|
this._result = result;
|
|
}
|
|
titlePath() {
|
|
const parentPath = this.parent?.titlePath() || [];
|
|
return [...parentPath, this.title];
|
|
}
|
|
get startTime() {
|
|
return new Date(this._startTime);
|
|
}
|
|
set startTime(value) {
|
|
this._startTime = +value;
|
|
}
|
|
get attachments() {
|
|
return this._endPayload?.attachments?.map((index) => this._result.attachments[index]) ?? [];
|
|
}
|
|
get annotations() {
|
|
return this._endPayload?.annotations ?? [];
|
|
}
|
|
}
|
|
class TeleTestResult {
|
|
constructor(retry, id) {
|
|
this.parallelIndex = -1;
|
|
this.workerIndex = -1;
|
|
this.duration = -1;
|
|
this.stdout = [];
|
|
this.stderr = [];
|
|
this.attachments = [];
|
|
this.annotations = [];
|
|
this.status = "skipped";
|
|
this.steps = [];
|
|
this.errors = [];
|
|
this._stepMap = /* @__PURE__ */ new Map();
|
|
this._startTime = 0;
|
|
this.retry = retry;
|
|
this._id = id;
|
|
}
|
|
setStartTimeNumber(startTime) {
|
|
this._startTime = startTime;
|
|
}
|
|
get startTime() {
|
|
return new Date(this._startTime);
|
|
}
|
|
set startTime(value) {
|
|
this._startTime = +value;
|
|
}
|
|
}
|
|
const baseFullConfig = {
|
|
forbidOnly: false,
|
|
fullyParallel: false,
|
|
globalSetup: null,
|
|
globalTeardown: null,
|
|
globalTimeout: 0,
|
|
grep: /.*/,
|
|
grepInvert: null,
|
|
maxFailures: 0,
|
|
metadata: {},
|
|
preserveOutput: "always",
|
|
projects: [],
|
|
reporter: [[process.env.CI ? "dot" : "list"]],
|
|
reportSlowTests: {
|
|
max: 5,
|
|
threshold: 3e5
|
|
/* 5 minutes */
|
|
},
|
|
configFile: "",
|
|
rootDir: "",
|
|
quiet: false,
|
|
shard: null,
|
|
updateSnapshots: "missing",
|
|
updateSourceMethod: "patch",
|
|
version: "",
|
|
workers: 0,
|
|
webServer: null
|
|
};
|
|
function serializeRegexPatterns(patterns) {
|
|
if (!Array.isArray(patterns))
|
|
patterns = [patterns];
|
|
return patterns.map((s) => {
|
|
if (typeof s === "string")
|
|
return { s };
|
|
return { r: { source: s.source, flags: s.flags } };
|
|
});
|
|
}
|
|
function parseRegexPatterns(patterns) {
|
|
return patterns.map((p) => {
|
|
if (p.s !== void 0)
|
|
return p.s;
|
|
return new RegExp(p.r.source, p.r.flags);
|
|
});
|
|
}
|
|
function computeTestCaseOutcome(test) {
|
|
let skipped = 0;
|
|
let didNotRun = 0;
|
|
let expected = 0;
|
|
let interrupted = 0;
|
|
let unexpected = 0;
|
|
for (const result of test.results) {
|
|
if (result.status === "interrupted") {
|
|
++interrupted;
|
|
} else if (result.status === "skipped" && test.expectedStatus === "skipped") {
|
|
++skipped;
|
|
} else if (result.status === "skipped") {
|
|
++didNotRun;
|
|
} else if (result.status === test.expectedStatus) {
|
|
++expected;
|
|
} else {
|
|
++unexpected;
|
|
}
|
|
}
|
|
if (expected === 0 && unexpected === 0)
|
|
return "skipped";
|
|
if (unexpected === 0)
|
|
return "expected";
|
|
if (expected === 0 && skipped === 0)
|
|
return "unexpected";
|
|
return "flaky";
|
|
}
|
|
// Annotate the CommonJS export names for ESM import in node:
|
|
0 && (module.exports = {
|
|
TeleReporterReceiver,
|
|
TeleSuite,
|
|
TeleTestCase,
|
|
TeleTestResult,
|
|
baseFullConfig,
|
|
computeTestCaseOutcome,
|
|
parseRegexPatterns,
|
|
serializeRegexPatterns
|
|
});
|