@jterrazz/test 16.1.1 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -171
- package/dist/browser/index.js +2 -2980
- package/dist/browser/services.js +2 -0
- package/dist/browser/stubs.js +2 -0
- package/dist/checker.d.ts +6 -1
- package/dist/checker.js +4534 -2628
- package/dist/config.d.ts +40 -0
- package/dist/config.js +309 -0
- package/dist/in-place.global-setup.d.ts +11 -0
- package/dist/in-place.global-setup.js +21 -0
- package/dist/index.d.ts +1653 -3004
- package/dist/index.js +5226 -3845
- package/dist/mobile-session.global-setup.d.ts +14 -0
- package/dist/mobile-session.global-setup.js +31 -0
- package/dist/oxlint.cjs +6069 -5634
- package/dist/oxlint.d.cts +43 -7212
- package/dist/oxlint.d.ts +43 -7212
- package/dist/oxlint.js +6127 -5693
- package/dist/route-coverage.global-setup.d.ts +42 -0
- package/dist/route-coverage.global-setup.js +2 -0
- package/dist/services.d.ts +3 -0
- package/dist/services.global-setup.d.ts +43 -0
- package/dist/services.global-setup.js +2 -0
- package/dist/services.js +597 -0
- package/dist/shared-appium.adapter.js +428 -0
- package/dist/shared-artifacts.js +32 -0
- package/dist/shared-chapter.js +7 -0
- package/dist/shared-container.port.d.ts +31 -0
- package/dist/shared-derived-projects.js +58 -0
- package/dist/shared-device.port.d.ts +189 -0
- package/dist/shared-exchange.js +447 -0
- package/dist/shared-in-place.js +172 -0
- package/dist/shared-index.browser.js +3191 -0
- package/dist/shared-index.services.d.ts +346 -0
- package/dist/shared-index.stubs.d.ts +287 -0
- package/dist/shared-json-shape.js +17 -0
- package/dist/shared-landmarks.js +71 -0
- package/dist/shared-ledger.js +68 -0
- package/dist/shared-literate-plugin.js +183 -0
- package/dist/shared-manifest.js +1321 -0
- package/dist/shared-pause.js +11 -0
- package/dist/shared-peer.js +88 -0
- package/dist/shared-playwright.adapter.js +330 -0
- package/dist/shared-process.adapter.js +74 -0
- package/dist/shared-refusal.js +35 -0
- package/dist/shared-resolve.js +24 -0
- package/dist/shared-route-coverage.global-setup.js +187 -0
- package/dist/shared-scenario-failure.js +198 -0
- package/dist/shared-serve.js +365 -0
- package/dist/shared-service-images.js +10 -0
- package/dist/shared-services.global-setup.js +179 -0
- package/dist/shared-session-ledger.js +301 -0
- package/dist/shared-setup-entry.js +12 -0
- package/dist/shared-source-scan.js +133 -0
- package/dist/shared-spec-document.js +365 -0
- package/dist/shared-specifications.js +26 -0
- package/dist/shared-stream-body.js +130 -0
- package/dist/shared-stub-server.js +190 -0
- package/dist/shared-temp-root.global-setup.js +80 -0
- package/dist/shared-test-baseline.js +26 -0
- package/dist/shared-test-section.js +58 -0
- package/dist/shared-testcontainers.adapter.js +203 -0
- package/dist/shared-tokens.js +55 -0
- package/dist/shared-yaml-document.js +119 -0
- package/dist/stubs.d.ts +2 -0
- package/dist/stubs.js +657 -0
- package/dist/temp-root.global-setup.d.ts +7 -0
- package/dist/temp-root.global-setup.js +2 -0
- package/dist/vitest.d.ts +97 -163
- package/dist/vitest.js +373 -525
- package/docs/README.md +82 -36
- package/docs/concepts/architecture.md +118 -0
- package/docs/concepts/conventions.md +333 -0
- package/docs/guides/api-specs.md +374 -0
- package/docs/guides/cli-specs.md +564 -0
- package/docs/guides/component-specs.md +252 -0
- package/docs/guides/develop.md +94 -0
- package/docs/guides/integration-specs.md +181 -0
- package/docs/guides/job-specs.md +180 -0
- package/docs/guides/lint-specs.md +174 -0
- package/docs/guides/mobile-specs.md +319 -0
- package/docs/guides/module-tests.md +149 -0
- package/docs/guides/release.md +43 -0
- package/docs/guides/spec-documents.md +189 -0
- package/docs/guides/website-specs.md +413 -0
- package/docs/reference/assertions.md +345 -0
- package/docs/reference/glossary.md +20 -0
- package/docs/reference/linting.md +483 -0
- package/docs/reference/services.md +236 -0
- package/docs/reference/stubs.md +498 -0
- package/docs/reference/time-and-doubles.md +137 -0
- package/docs/reference/tokens.md +258 -0
- package/docs/reference/visitor.md +221 -0
- package/docs/start/getting-started.md +187 -0
- package/docs/start/set-up-a-project.md +214 -0
- package/package.json +50 -30
- package/schema/spec.schema.json +43 -17
- package/dist/appium.adapter.js +0 -489
- package/dist/artifacts.js +0 -32
- package/dist/fixtures.js +0 -110
- package/dist/literate.js +0 -1747
- package/dist/match.js +0 -804
- package/dist/playwright.adapter.js +0 -438
- package/dist/server.js +0 -160
- package/dist/stream.js +0 -321
- package/dist/substring-warning.js +0 -282
- package/docs/01-architecture.md +0 -95
- package/docs/02-developing.md +0 -351
- package/docs/03-testing.md +0 -495
- package/docs/04-operating.md +0 -101
- package/docs/05-module-tests.md +0 -152
- package/docs/06-integration.md +0 -180
- package/docs/07-component.md +0 -246
- package/docs/08-website.md +0 -404
- package/docs/09-mobile.md +0 -270
- package/docs/10-api.md +0 -264
- package/docs/11-jobs.md +0 -157
- package/docs/12-cli.md +0 -677
- package/docs/13-elements.md +0 -248
- package/docs/14-assertions.md +0 -314
- package/docs/15-tokens.md +0 -253
- package/docs/16-contracts.md +0 -438
- package/docs/17-services.md +0 -188
- package/docs/18-conventions.md +0 -332
- package/docs/19-linting.md +0 -512
- package/docs/decisions/001-v9-conventions-on-three-channels.md +0 -50
- package/docs/decisions/002-the-statique-channel-holds-only-what-upstream-does-not.md +0 -49
- package/docs/decisions/003-a-rendered-component-is-a-facet-on-vitest-browser-mode.md +0 -84
- package/docs/decisions/004-a-module-against-real-services-or-a-golden-is-the-integration-facet.md +0 -81
- package/docs/decisions/005-the-doubles-ladder-is-closed.md +0 -86
- package/docs/decisions/006-the-catalogue-reaches-a-file-by-its-role.md +0 -245
- package/docs/decisions/007-compose-mode-leaves-the-package.md +0 -53
- package/docs/decisions/008-vitest-5-node-24-and-the-native-seams-as-optional-peers.md +0 -75
- package/docs/decisions/_template.md +0 -22
- package/docs/reference/classes/Matcher.md +0 -120
- package/docs/reference/classes/ProcessHandle.md +0 -368
- package/docs/reference/functions/defineContract.md +0 -39
- package/docs/reference/functions/defineContracts.md +0 -36
- package/docs/reference/functions/disabled.md +0 -28
- package/docs/reference/functions/enabled.md +0 -20
- package/docs/reference/functions/focused.md +0 -26
- package/docs/reference/functions/mockOf.md +0 -79
- package/docs/reference/functions/postgres.md +0 -31
- package/docs/reference/functions/process.md +0 -33
- package/docs/reference/functions/redis.md +0 -28
- package/docs/reference/functions/required.md +0 -41
- package/docs/reference/functions/selected.md +0 -26
- package/docs/reference/functions/sqlite.md +0 -33
- package/docs/reference/functions/testId.md +0 -20
- package/docs/reference/functions/text.md +0 -40
- package/docs/reference/functions/valued.md +0 -28
- package/docs/reference/functions/waitUntil.md +0 -46
- package/docs/reference/functions/within.md +0 -29
- package/docs/reference/index.md +0 -196
- package/docs/reference/interfaces/BaseResult.md +0 -87
- package/docs/reference/interfaces/CallResult.md +0 -160
- package/docs/reference/interfaces/CaptureScope.md +0 -82
- package/docs/reference/interfaces/CliResult.md +0 -253
- package/docs/reference/interfaces/ContainerAccessor.md +0 -166
- package/docs/reference/interfaces/DirectoryAccessor.md +0 -33
- package/docs/reference/interfaces/FetchResult.md +0 -180
- package/docs/reference/interfaces/FilesystemAccessor.md +0 -46
- package/docs/reference/interfaces/HttpResult.md +0 -126
- package/docs/reference/interfaces/JsonAccessor.md +0 -46
- package/docs/reference/interfaces/PageResult.md +0 -356
- package/docs/reference/interfaces/RenderResult.md +0 -72
- package/docs/reference/interfaces/RenderedText.md +0 -110
- package/docs/reference/interfaces/ResponseAccessor.md +0 -47
- package/docs/reference/interfaces/ScreenResult.md +0 -128
- package/docs/reference/interfaces/TableAccessor.md +0 -26
- package/docs/reference/interfaces/TextAccessor.md +0 -96
- package/docs/reference/type-aliases/ApiHandle.md +0 -68
- package/docs/reference/type-aliases/ApiSpecification.md +0 -213
- package/docs/reference/type-aliases/ApiSpecificationOptions.md +0 -68
- package/docs/reference/type-aliases/BrowserConsoleMessage.md +0 -30
- package/docs/reference/type-aliases/BrowserLinkElement.md +0 -50
- package/docs/reference/type-aliases/BrowserMetaElement.md +0 -40
- package/docs/reference/type-aliases/BrowserOpenOptions.md +0 -87
- package/docs/reference/type-aliases/BrowserPage.md +0 -132
- package/docs/reference/type-aliases/BrowserPort.md +0 -51
- package/docs/reference/type-aliases/CliEnv.md +0 -11
- package/docs/reference/type-aliases/CliHandle.md +0 -80
- package/docs/reference/type-aliases/CliInput.md +0 -36
- package/docs/reference/type-aliases/CliOutput.md +0 -46
- package/docs/reference/type-aliases/CliPort.md +0 -58
- package/docs/reference/type-aliases/CliSpecification.md +0 -144
- package/docs/reference/type-aliases/CliSpecificationOptions.md +0 -134
- package/docs/reference/type-aliases/ComponentChain.md +0 -156
- package/docs/reference/type-aliases/ComponentScenario.md +0 -20
- package/docs/reference/type-aliases/ComponentUi.md +0 -47
- package/docs/reference/type-aliases/ComponentVisitor.md +0 -10
- package/docs/reference/type-aliases/ContainerPort.md +0 -113
- package/docs/reference/type-aliases/Contract.md +0 -68
- package/docs/reference/type-aliases/ContractInput.md +0 -13
- package/docs/reference/type-aliases/ContractRequest.md +0 -95
- package/docs/reference/type-aliases/ContractResponder.md +0 -23
- package/docs/reference/type-aliases/ContractResponse.md +0 -78
- package/docs/reference/type-aliases/ContractResponseValue.md +0 -13
- package/docs/reference/type-aliases/Contracts.md +0 -48
- package/docs/reference/type-aliases/DatabaseKeys.md +0 -16
- package/docs/reference/type-aliases/DatabasePort.md +0 -72
- package/docs/reference/type-aliases/DeviceOpenOptions.md +0 -46
- package/docs/reference/type-aliases/DevicePort.md +0 -51
- package/docs/reference/type-aliases/DeviceScreen.md +0 -32
- package/docs/reference/type-aliases/DeviceTimeouts.md +0 -39
- package/docs/reference/type-aliases/DockerSpecConfig.md +0 -43
- package/docs/reference/type-aliases/DomMount.md +0 -21
- package/docs/reference/type-aliases/ElementKind.md +0 -27
- package/docs/reference/type-aliases/ElementMatch.md +0 -74
- package/docs/reference/type-aliases/ElementOptions.md +0 -29
- package/docs/reference/type-aliases/ElementRef.md +0 -128
- package/docs/reference/type-aliases/ExecOptions.md +0 -37
- package/docs/reference/type-aliases/FileAccessor.md +0 -54
- package/docs/reference/type-aliases/HonoApp.md +0 -31
- package/docs/reference/type-aliases/HttpContractFilter.md +0 -49
- package/docs/reference/type-aliases/HttpResponseInit.md +0 -46
- package/docs/reference/type-aliases/HttpStreamInit.md +0 -58
- package/docs/reference/type-aliases/IntegrationHandle.md +0 -46
- package/docs/reference/type-aliases/IntegrationSpecification.md +0 -111
- package/docs/reference/type-aliases/IntegrationSpecificationOptions.md +0 -42
- package/docs/reference/type-aliases/Intercept.md +0 -19
- package/docs/reference/type-aliases/InterceptOptions.md +0 -28
- package/docs/reference/type-aliases/InterceptScope.md +0 -11
- package/docs/reference/type-aliases/IsolationStrategy.md +0 -75
- package/docs/reference/type-aliases/JobHandle.md +0 -34
- package/docs/reference/type-aliases/JobsHandle.md +0 -57
- package/docs/reference/type-aliases/JobsResult.md +0 -16
- package/docs/reference/type-aliases/JobsSpecification.md +0 -94
- package/docs/reference/type-aliases/JobsSpecificationOptions.md +0 -56
- package/docs/reference/type-aliases/LandmarkKind.md +0 -20
- package/docs/reference/type-aliases/LiterateRunFlags.md +0 -27
- package/docs/reference/type-aliases/LiterateServeRegistration.md +0 -70
- package/docs/reference/type-aliases/MatchFixtureOptions.md +0 -27
- package/docs/reference/type-aliases/MatchableRequest.md +0 -61
- package/docs/reference/type-aliases/MatcherKind.md +0 -34
- package/docs/reference/type-aliases/MobileBackendOptions.md +0 -28
- package/docs/reference/type-aliases/MobileElementKind.md +0 -14
- package/docs/reference/type-aliases/MobileElementMatch.md +0 -60
- package/docs/reference/type-aliases/MobileElementRef.md +0 -20
- package/docs/reference/type-aliases/MobileHandle.md +0 -65
- package/docs/reference/type-aliases/MobileScenario.md +0 -20
- package/docs/reference/type-aliases/MobileSpecification.md +0 -51
- package/docs/reference/type-aliases/MobileSpecificationOptions.md +0 -126
- package/docs/reference/type-aliases/MobileVisitor.md +0 -81
- package/docs/reference/type-aliases/MockOfOptions.md +0 -26
- package/docs/reference/type-aliases/MockPort.md +0 -10
- package/docs/reference/type-aliases/PinnedClock.md +0 -10
- package/docs/reference/type-aliases/PostgresOptions.md +0 -32
- package/docs/reference/type-aliases/ProcessOptions.md +0 -112
- package/docs/reference/type-aliases/RedisOptions.md +0 -20
- package/docs/reference/type-aliases/RenderSubject.md +0 -12
- package/docs/reference/type-aliases/ScreenNode.md +0 -67
- package/docs/reference/type-aliases/ServerPort.md +0 -36
- package/docs/reference/type-aliases/ServerResponse.md +0 -46
- package/docs/reference/type-aliases/ServerSpec.md +0 -21
- package/docs/reference/type-aliases/ServiceHandle.md +0 -216
- package/docs/reference/type-aliases/ServiceRecord.md +0 -12
- package/docs/reference/type-aliases/SpecDocument.md +0 -84
- package/docs/reference/type-aliases/SpecEnvToken.md +0 -21
- package/docs/reference/type-aliases/SpecFileAssertion.md +0 -27
- package/docs/reference/type-aliases/SpecFixture.md +0 -30
- package/docs/reference/type-aliases/SpecKind.md +0 -8
- package/docs/reference/type-aliases/SpecRun.md +0 -108
- package/docs/reference/type-aliases/SpecServeEntry.md +0 -40
- package/docs/reference/type-aliases/SpecStream.md +0 -32
- package/docs/reference/type-aliases/SpecificationConfig.md +0 -290
- package/docs/reference/type-aliases/SqliteOptions.md +0 -36
- package/docs/reference/type-aliases/SseEvent.md +0 -58
- package/docs/reference/type-aliases/StreamBody.md +0 -61
- package/docs/reference/type-aliases/TextFilter.md +0 -22
- package/docs/reference/type-aliases/VisitScenario.md +0 -20
- package/docs/reference/type-aliases/Visitor.md +0 -215
- package/docs/reference/type-aliases/WaitUntilOptions.md +0 -46
- package/docs/reference/type-aliases/WebsiteBackendOptions.md +0 -37
- package/docs/reference/type-aliases/WebsiteHandle.md +0 -51
- package/docs/reference/type-aliases/WebsiteSpecification.md +0 -118
- package/docs/reference/type-aliases/WebsiteSpecificationOptions.md +0 -40
- package/docs/reference/variables/anthropic.md +0 -19
- package/docs/reference/variables/banner.md +0 -10
- package/docs/reference/variables/button.md +0 -10
- package/docs/reference/variables/clock.md +0 -16
- package/docs/reference/variables/complementary.md +0 -10
- package/docs/reference/variables/component.md +0 -10
- package/docs/reference/variables/content.md +0 -10
- package/docs/reference/variables/contentinfo.md +0 -10
- package/docs/reference/variables/dialog.md +0 -10
- package/docs/reference/variables/field.md +0 -10
- package/docs/reference/variables/form.md +0 -10
- package/docs/reference/variables/heading.md +0 -10
- package/docs/reference/variables/http.md +0 -40
- package/docs/reference/variables/intercept.md +0 -11
- package/docs/reference/variables/link.md +0 -10
- package/docs/reference/variables/listitem.md +0 -10
- package/docs/reference/variables/main.md +0 -10
- package/docs/reference/variables/match.md +0 -8
- package/docs/reference/variables/navigation.md +0 -10
- package/docs/reference/variables/openai.md +0 -21
- package/docs/reference/variables/option.md +0 -17
- package/docs/reference/variables/region.md +0 -10
- package/docs/reference/variables/row.md +0 -10
- package/docs/reference/variables/search.md +0 -10
- package/docs/reference/variables/specification.md +0 -8
- package/docs/reference/variables/status.md +0 -10
- package/docs/reference/variables/table.md +0 -10
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { i as safeRealpath } from "./shared-resolve.js";
|
|
2
|
+
import { t as isRecord } from "./shared-json-shape.js";
|
|
3
|
+
import { n as refusal } from "./shared-refusal.js";
|
|
4
|
+
import { r as closingOf, t as argumentSpans } from "./shared-source-scan.js";
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { spawnSync } from "node:child_process";
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
//#region src/chain/paths/caller.ts
|
|
11
|
+
const TEST_FILE = /\.test\.[cm]?[jt]s$/u;
|
|
12
|
+
const FRAME_LOCATION = /^at (?:.*? \((?<wrapped>[^()]+)\)|(?:async )?(?<bare>[^()\s]+))$/u;
|
|
13
|
+
const POSITION = /^(?<file>.+):(?<line>\d+):(?<column>\d+)$/u;
|
|
14
|
+
function stackFrames(stack) {
|
|
15
|
+
const frames = [];
|
|
16
|
+
for (const text of stack.split("\n")) {
|
|
17
|
+
const groups = FRAME_LOCATION.exec(text.trim())?.groups;
|
|
18
|
+
const position = POSITION.exec(groups?.wrapped ?? groups?.bare ?? "")?.groups;
|
|
19
|
+
if (position?.file === void 0 || position.file.startsWith("node:")) continue;
|
|
20
|
+
const file = position.file.startsWith("file:") ? fileURLToPath(position.file) : position.file;
|
|
21
|
+
frames.push({
|
|
22
|
+
column: Number(position.column),
|
|
23
|
+
file,
|
|
24
|
+
line: Number(position.line)
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return frames;
|
|
28
|
+
}
|
|
29
|
+
function callerFrames() {
|
|
30
|
+
const { stack } = /* @__PURE__ */ new Error("@jterrazz/test: reading the call site");
|
|
31
|
+
return stackFrames(stack ?? "").filter(({ file }) => file !== import.meta.filename);
|
|
32
|
+
}
|
|
33
|
+
const SOURCE_LOCATION = join("chain", "paths");
|
|
34
|
+
const FRAMEWORK_DIR = safeRealpath(import.meta.dirname);
|
|
35
|
+
/** From a build, `dist/` plus the `src/` its source maps point back to: a mapped frame is still the framework's. */
|
|
36
|
+
function frameworkTreesOf(frameworkDir) {
|
|
37
|
+
return frameworkDir.endsWith(`${sep}${SOURCE_LOCATION}`) ? [resolve(frameworkDir, "../..")] : [frameworkDir, resolve(frameworkDir, "..", "src")];
|
|
38
|
+
}
|
|
39
|
+
const FRAMEWORK_TREES = frameworkTreesOf(FRAMEWORK_DIR);
|
|
40
|
+
function isStrictlyInside(directory, path) {
|
|
41
|
+
const rest = relative(directory, path);
|
|
42
|
+
return rest !== "" && !rest.startsWith("..") && !isAbsolute(rest);
|
|
43
|
+
}
|
|
44
|
+
/** By identity, never by substring: a consumer's own `src/chain/` is not this package's. */
|
|
45
|
+
function isFrameworkFrame(filePath, frameworkTrees = FRAMEWORK_TREES) {
|
|
46
|
+
if (TEST_FILE.test(filePath)) return false;
|
|
47
|
+
const real = safeRealpath(filePath);
|
|
48
|
+
return frameworkTrees.some((tree) => isStrictlyInside(safeRealpath(tree), real));
|
|
49
|
+
}
|
|
50
|
+
/** Must be called before the first `await`: async resumption drops the caller's frames. */
|
|
51
|
+
function getCallerDir() {
|
|
52
|
+
const caller = callerFrames().find(({ file }) => !file.includes("node_modules") && !isFrameworkFrame(file));
|
|
53
|
+
return caller === void 0 ? process.cwd() : dirname(caller.file);
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/expectations/in-place/formatter.ts
|
|
57
|
+
const FORMATTER = join("node_modules", ".bin", "oxfmt");
|
|
58
|
+
function formatterOf(file) {
|
|
59
|
+
for (let directory = dirname(file);; directory = dirname(directory)) {
|
|
60
|
+
const binary = join(directory, FORMATTER);
|
|
61
|
+
if (existsSync(binary)) return binary;
|
|
62
|
+
if (dirname(directory) === directory) return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function formatRewritten(files) {
|
|
66
|
+
for (const file of files) {
|
|
67
|
+
const binary = formatterOf(file);
|
|
68
|
+
if (binary !== void 0) {
|
|
69
|
+
const project = dirname(dirname(dirname(binary)));
|
|
70
|
+
spawnSync(binary, [file], {
|
|
71
|
+
cwd: project,
|
|
72
|
+
stdio: "ignore"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
//#region src/expectations/in-place/in-place.ts
|
|
79
|
+
const TO_MATCH = /\btoMatch\s*\(/gu;
|
|
80
|
+
const LITERAL = /^(?:['"`{[]|-?\d|(?:null|true|false|undefined)$)/u;
|
|
81
|
+
function callSiteOf(stack) {
|
|
82
|
+
return stackFrames(stack).find(({ file }) => !file.includes(`${sep}node_modules${sep}`) && !isFrameworkFrame(file));
|
|
83
|
+
}
|
|
84
|
+
function lineStartOf(source, line) {
|
|
85
|
+
let offset = 0;
|
|
86
|
+
for (let current = 1; current < line; current += 1) offset = source.indexOf("\n", offset) + 1;
|
|
87
|
+
return offset;
|
|
88
|
+
}
|
|
89
|
+
/** The call a frame points at, by its name or its parenthesis, among the calls of its line; its value's span, trimmed. */
|
|
90
|
+
function locateArgument(source, site) {
|
|
91
|
+
const lineStart = lineStartOf(source, site.line);
|
|
92
|
+
const position = lineStart + site.column - 1;
|
|
93
|
+
TO_MATCH.lastIndex = lineStart;
|
|
94
|
+
for (const found of source.matchAll(TO_MATCH)) {
|
|
95
|
+
if (found.index + 7 < position) continue;
|
|
96
|
+
const open = found.index + found[0].length - 1;
|
|
97
|
+
const [span = {
|
|
98
|
+
end: open + 1,
|
|
99
|
+
start: open + 1
|
|
100
|
+
}] = argumentSpans(source, open + 1, closingOf(source, open));
|
|
101
|
+
const line = source.slice(source.lastIndexOf("\n", found.index) + 1);
|
|
102
|
+
return {
|
|
103
|
+
...span,
|
|
104
|
+
indent: line.slice(0, line.length - line.trimStart().length)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const LEDGERS = /* @__PURE__ */ new Map();
|
|
109
|
+
const isPending = (value) => isRecord(value) && typeof value.file === "string" && typeof value.source === "string";
|
|
110
|
+
let pendingFolder = null;
|
|
111
|
+
/** Read at each write: the folder is the project's, and one worker may serve several. */
|
|
112
|
+
function deferRewritesTo(folder) {
|
|
113
|
+
pendingFolder = folder;
|
|
114
|
+
}
|
|
115
|
+
function save(file, source, folder) {
|
|
116
|
+
if (folder === void 0) {
|
|
117
|
+
writeFileSync(file, source);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
mkdirSync(folder, { recursive: true });
|
|
121
|
+
const name = createHash("sha256").update(file).digest("hex");
|
|
122
|
+
const pending = {
|
|
123
|
+
file,
|
|
124
|
+
source
|
|
125
|
+
};
|
|
126
|
+
writeFileSync(join(folder, `${name}.json`), JSON.stringify(pending));
|
|
127
|
+
}
|
|
128
|
+
function writePendingRewrites(folder) {
|
|
129
|
+
if (!existsSync(folder)) return;
|
|
130
|
+
const written = [];
|
|
131
|
+
for (const name of readdirSync(folder).filter((entry) => entry.endsWith(".json"))) {
|
|
132
|
+
const pending = JSON.parse(readFileSync(join(folder, name), "utf8"));
|
|
133
|
+
if (isPending(pending)) {
|
|
134
|
+
writeFileSync(pending.file, pending.source);
|
|
135
|
+
written.push(pending.file);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
rmSync(folder, { recursive: true });
|
|
139
|
+
formatRewritten(written);
|
|
140
|
+
}
|
|
141
|
+
function writeInPlace(site, render, folder = pendingFolder?.()) {
|
|
142
|
+
const ledger = LEDGERS.get(site.file) ?? {
|
|
143
|
+
edits: /* @__PURE__ */ new Map(),
|
|
144
|
+
original: readFileSync(site.file, "utf8")
|
|
145
|
+
};
|
|
146
|
+
LEDGERS.set(site.file, ledger);
|
|
147
|
+
const span = locateArgument(ledger.original, site);
|
|
148
|
+
if (span === void 0) throw new Error(refusal({
|
|
149
|
+
fix: "call `.toMatch(` on the expect() written at that line, not through an alias",
|
|
150
|
+
found: `update mode: no toMatch( stands at ${site.file}:${site.line}:${site.column}, so the value in place cannot be written`,
|
|
151
|
+
read: "docs/reference/tokens.md#a-value-written-in-place-is-rewritten-in-the-test",
|
|
152
|
+
why: "A value written in place is rewritten where its `toMatch(` stands."
|
|
153
|
+
}));
|
|
154
|
+
const written = ledger.original.slice(span.start, span.end);
|
|
155
|
+
if (written !== "" && !LITERAL.test(written)) throw new Error(refusal({
|
|
156
|
+
fix: "write the expectation as a literal in `toMatch(`, or record it by hand: a table's rows are recorded one by one, never from the last row",
|
|
157
|
+
found: `update mode: toMatch(${written}) at ${site.file}:${site.line}:${site.column} holds a name or a call, not a literal`,
|
|
158
|
+
read: "docs/reference/tokens.md#a-value-written-in-place-is-rewritten-in-the-test",
|
|
159
|
+
why: "Update mode rewrites the literal a `toMatch(` holds; a variable stands for values the rewrite would replace by the last one it saw."
|
|
160
|
+
}));
|
|
161
|
+
ledger.edits.set(span.start, {
|
|
162
|
+
end: span.end,
|
|
163
|
+
text: render(span.indent)
|
|
164
|
+
});
|
|
165
|
+
let source = ledger.original;
|
|
166
|
+
for (const [start, edit] of [...ledger.edits].toSorted(([a], [b]) => b - a)) source = source.slice(0, start) + edit.text + source.slice(edit.end);
|
|
167
|
+
save(site.file, source, folder);
|
|
168
|
+
}
|
|
169
|
+
//#endregion
|
|
170
|
+
export { callerFrames as a, writePendingRewrites as i, deferRewritesTo as n, getCallerDir as o, writeInPlace as r, callSiteOf as t };
|
|
171
|
+
|
|
172
|
+
//# sourceMappingURL=shared-in-place.js.map
|