@relayfile/adapter-core 0.1.0 → 0.1.1
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/dist/src/index.d.ts +0 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/runtime/schema-adapter.d.ts +40 -5
- package/dist/src/runtime/schema-adapter.d.ts.map +1 -1
- package/dist/src/runtime/schema-adapter.js +6 -4
- package/dist/src/runtime/schema-adapter.js.map +1 -1
- package/package.json +1 -1
- package/dist/tests/docs/change-detector.test.d.ts +0 -2
- package/dist/tests/docs/change-detector.test.d.ts.map +0 -1
- package/dist/tests/docs/change-detector.test.js +0 -24
- package/dist/tests/docs/change-detector.test.js.map +0 -1
- package/dist/tests/docs/crawler.test.d.ts +0 -2
- package/dist/tests/docs/crawler.test.d.ts.map +0 -1
- package/dist/tests/docs/crawler.test.js +0 -55
- package/dist/tests/docs/crawler.test.js.map +0 -1
- package/dist/tests/docs/extractor.test.d.ts +0 -2
- package/dist/tests/docs/extractor.test.d.ts.map +0 -1
- package/dist/tests/docs/extractor.test.js +0 -63
- package/dist/tests/docs/extractor.test.js.map +0 -1
- package/dist/tests/docs/generator.test.d.ts +0 -2
- package/dist/tests/docs/generator.test.d.ts.map +0 -1
- package/dist/tests/docs/generator.test.js +0 -46
- package/dist/tests/docs/generator.test.js.map +0 -1
- package/dist/tests/drift/drift-checker.test.d.ts +0 -2
- package/dist/tests/drift/drift-checker.test.d.ts.map +0 -1
- package/dist/tests/drift/drift-checker.test.js +0 -59
- package/dist/tests/drift/drift-checker.test.js.map +0 -1
- package/dist/tests/round-trip/fake-connection.d.ts +0 -29
- package/dist/tests/round-trip/fake-connection.d.ts.map +0 -1
- package/dist/tests/round-trip/fake-connection.js +0 -174
- package/dist/tests/round-trip/fake-connection.js.map +0 -1
- package/dist/tests/round-trip/github-pulls.test.d.ts +0 -2
- package/dist/tests/round-trip/github-pulls.test.d.ts.map +0 -1
- package/dist/tests/round-trip/github-pulls.test.js +0 -12
- package/dist/tests/round-trip/github-pulls.test.js.map +0 -1
- package/dist/tests/round-trip/harness.d.ts +0 -74
- package/dist/tests/round-trip/harness.d.ts.map +0 -1
- package/dist/tests/round-trip/harness.js +0 -323
- package/dist/tests/round-trip/harness.js.map +0 -1
- package/dist/tests/round-trip/vfs-snapshot.d.ts +0 -45
- package/dist/tests/round-trip/vfs-snapshot.d.ts.map +0 -1
- package/dist/tests/round-trip/vfs-snapshot.js +0 -218
- package/dist/tests/round-trip/vfs-snapshot.js.map +0 -1
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { ConnectionProvider, ProxyHeaders, ProxyMethod, ProxyQuery, ProxyResponse } from "@relayfile/sdk";
|
|
2
|
-
export interface HttpReplayRequest {
|
|
3
|
-
method: ProxyMethod;
|
|
4
|
-
baseUrl: string;
|
|
5
|
-
endpoint: string;
|
|
6
|
-
connectionId: string;
|
|
7
|
-
headers?: ProxyHeaders;
|
|
8
|
-
body?: unknown;
|
|
9
|
-
query?: ProxyQuery;
|
|
10
|
-
}
|
|
11
|
-
export interface HttpReplayInteraction<TData = unknown> {
|
|
12
|
-
request: HttpReplayRequest;
|
|
13
|
-
response: ProxyResponse<TData>;
|
|
14
|
-
}
|
|
15
|
-
export type HttpReplayFixture = readonly HttpReplayInteraction[] | {
|
|
16
|
-
interactions?: readonly HttpReplayInteraction[];
|
|
17
|
-
requests?: readonly HttpReplayInteraction[];
|
|
18
|
-
http?: readonly HttpReplayInteraction[];
|
|
19
|
-
};
|
|
20
|
-
export interface FakeConnectionProvider extends ConnectionProvider {
|
|
21
|
-
readonly calls: HttpReplayRequest[];
|
|
22
|
-
readonly remaining: number;
|
|
23
|
-
assertExhausted(): void;
|
|
24
|
-
}
|
|
25
|
-
export interface FakeConnectionOptions {
|
|
26
|
-
name?: string;
|
|
27
|
-
}
|
|
28
|
-
export declare function createFakeConnection(fixture: HttpReplayFixture, options?: FakeConnectionOptions): FakeConnectionProvider;
|
|
29
|
-
//# sourceMappingURL=fake-connection.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fake-connection.d.ts","sourceRoot":"","sources":["../../../tests/round-trip/fake-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,UAAU,EAEV,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB,CAAC,KAAK,GAAG,OAAO;IACpD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,iBAAiB,GACzB,SAAS,qBAAqB,EAAE,GAChC;IACE,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,QAAQ,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC5C,IAAI,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACzC,CAAC;AAEN,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,eAAe,IAAI,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,qBAA0B,GAClC,sBAAsB,CA4DxB"}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
export function createFakeConnection(fixture, options = {}) {
|
|
2
|
-
const interactions = normalizeFixture(fixture);
|
|
3
|
-
const calls = [];
|
|
4
|
-
let nextInteractionIndex = 0;
|
|
5
|
-
return {
|
|
6
|
-
name: options.name ?? "fake-connection",
|
|
7
|
-
calls,
|
|
8
|
-
get remaining() {
|
|
9
|
-
return interactions.length - nextInteractionIndex;
|
|
10
|
-
},
|
|
11
|
-
async proxy(request) {
|
|
12
|
-
const actual = sanitizeRequest(request);
|
|
13
|
-
const interaction = interactions[nextInteractionIndex];
|
|
14
|
-
calls.push(actual);
|
|
15
|
-
if (!interaction) {
|
|
16
|
-
throw new Error([
|
|
17
|
-
`Unexpected HTTP replay call #${calls.length}.`,
|
|
18
|
-
`Received: ${stableStringify(actual)}`,
|
|
19
|
-
].join("\n"));
|
|
20
|
-
}
|
|
21
|
-
const expected = sanitizeRequest(interaction.request);
|
|
22
|
-
if (!requestsMatch(expected, actual)) {
|
|
23
|
-
throw new Error([
|
|
24
|
-
`HTTP replay call #${calls.length} did not match the fixture.`,
|
|
25
|
-
`Expected: ${stableStringify(expected)}`,
|
|
26
|
-
`Received: ${stableStringify(actual)}`,
|
|
27
|
-
].join("\n"));
|
|
28
|
-
}
|
|
29
|
-
nextInteractionIndex += 1;
|
|
30
|
-
return cloneResponse(interaction.response);
|
|
31
|
-
},
|
|
32
|
-
async healthCheck() {
|
|
33
|
-
return true;
|
|
34
|
-
},
|
|
35
|
-
assertExhausted() {
|
|
36
|
-
if (nextInteractionIndex === interactions.length) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const unused = interactions
|
|
40
|
-
.slice(nextInteractionIndex)
|
|
41
|
-
.map((interaction) => sanitizeRequest(interaction.request));
|
|
42
|
-
throw new Error([
|
|
43
|
-
`HTTP replay fixture has ${unused.length} unused interaction(s).`,
|
|
44
|
-
`Unused: ${stableStringify(unused)}`,
|
|
45
|
-
].join("\n"));
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
function normalizeFixture(fixture) {
|
|
50
|
-
const interactions = Array.isArray(fixture)
|
|
51
|
-
? fixture
|
|
52
|
-
: fixture.interactions ?? fixture.requests ?? fixture.http;
|
|
53
|
-
if (!interactions) {
|
|
54
|
-
throw new Error("HTTP replay fixture must be an array or an object with interactions, requests, or http.");
|
|
55
|
-
}
|
|
56
|
-
return interactions.map((interaction, index) => normalizeInteraction(interaction, index));
|
|
57
|
-
}
|
|
58
|
-
function normalizeInteraction(interaction, index) {
|
|
59
|
-
if (!isRecord(interaction)) {
|
|
60
|
-
throw new Error(`HTTP replay interaction #${index + 1} must be an object.`);
|
|
61
|
-
}
|
|
62
|
-
if (!isRecord(interaction.request)) {
|
|
63
|
-
throw new Error(`HTTP replay interaction #${index + 1} must include request.`);
|
|
64
|
-
}
|
|
65
|
-
if (!isRecord(interaction.response)) {
|
|
66
|
-
throw new Error(`HTTP replay interaction #${index + 1} must include response.`);
|
|
67
|
-
}
|
|
68
|
-
if (typeof interaction.response.status !== "number") {
|
|
69
|
-
throw new Error(`HTTP replay interaction #${index + 1} response.status must be a number.`);
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
request: sanitizeRequest(interaction.request),
|
|
73
|
-
response: {
|
|
74
|
-
status: interaction.response.status,
|
|
75
|
-
headers: normalizeHeaders(interaction.response.headers) ?? {},
|
|
76
|
-
data: cloneValue(interaction.response.data),
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
function sanitizeRequest(request) {
|
|
81
|
-
const { endpoint, query } = splitEndpoint(request.endpoint);
|
|
82
|
-
return stripUndefined({
|
|
83
|
-
method: request.method,
|
|
84
|
-
baseUrl: request.baseUrl,
|
|
85
|
-
endpoint,
|
|
86
|
-
connectionId: request.connectionId,
|
|
87
|
-
headers: normalizeHeaders(request.headers),
|
|
88
|
-
body: cloneValue(request.body),
|
|
89
|
-
query: normalizeQuery({ ...query, ...(request.query ?? {}) }),
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
function splitEndpoint(endpoint) {
|
|
93
|
-
const [path, rawQuery] = endpoint.split("?", 2);
|
|
94
|
-
if (!rawQuery) {
|
|
95
|
-
return { endpoint, query: {} };
|
|
96
|
-
}
|
|
97
|
-
const query = {};
|
|
98
|
-
const params = new URLSearchParams(rawQuery);
|
|
99
|
-
params.forEach((value, key) => {
|
|
100
|
-
query[key] = value;
|
|
101
|
-
});
|
|
102
|
-
return { endpoint: path, query };
|
|
103
|
-
}
|
|
104
|
-
function normalizeHeaders(headers) {
|
|
105
|
-
if (!isRecord(headers)) {
|
|
106
|
-
return undefined;
|
|
107
|
-
}
|
|
108
|
-
const normalized = {};
|
|
109
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
110
|
-
if (typeof value === "string") {
|
|
111
|
-
normalized[key.toLowerCase()] = value;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
115
|
-
}
|
|
116
|
-
function normalizeQuery(query) {
|
|
117
|
-
if (!isRecord(query)) {
|
|
118
|
-
return undefined;
|
|
119
|
-
}
|
|
120
|
-
const normalized = {};
|
|
121
|
-
for (const [key, value] of Object.entries(query)) {
|
|
122
|
-
const scalar = stringifyScalar(value);
|
|
123
|
-
if (scalar !== undefined) {
|
|
124
|
-
normalized[key] = scalar;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
128
|
-
}
|
|
129
|
-
function requestsMatch(expected, actual) {
|
|
130
|
-
return stableStringify(expected) === stableStringify(actual);
|
|
131
|
-
}
|
|
132
|
-
function cloneResponse(response) {
|
|
133
|
-
return {
|
|
134
|
-
status: response.status,
|
|
135
|
-
headers: { ...response.headers },
|
|
136
|
-
data: cloneValue(response.data),
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
function cloneValue(value) {
|
|
140
|
-
if (value === undefined || value === null || typeof value !== "object") {
|
|
141
|
-
return value;
|
|
142
|
-
}
|
|
143
|
-
return JSON.parse(JSON.stringify(value));
|
|
144
|
-
}
|
|
145
|
-
function stringifyScalar(value) {
|
|
146
|
-
if (typeof value === "string") {
|
|
147
|
-
return value;
|
|
148
|
-
}
|
|
149
|
-
if (typeof value === "number" ||
|
|
150
|
-
typeof value === "boolean" ||
|
|
151
|
-
typeof value === "bigint") {
|
|
152
|
-
return String(value);
|
|
153
|
-
}
|
|
154
|
-
return undefined;
|
|
155
|
-
}
|
|
156
|
-
function stripUndefined(value) {
|
|
157
|
-
return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
|
|
158
|
-
}
|
|
159
|
-
function stableStringify(value) {
|
|
160
|
-
if (Array.isArray(value)) {
|
|
161
|
-
return `[${value.map((item) => stableStringify(item)).join(",")}]`;
|
|
162
|
-
}
|
|
163
|
-
if (isRecord(value)) {
|
|
164
|
-
return `{${Object.keys(value)
|
|
165
|
-
.sort()
|
|
166
|
-
.map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`)
|
|
167
|
-
.join(",")}}`;
|
|
168
|
-
}
|
|
169
|
-
return JSON.stringify(value) ?? "undefined";
|
|
170
|
-
}
|
|
171
|
-
function isRecord(value) {
|
|
172
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=fake-connection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fake-connection.js","sourceRoot":"","sources":["../../../tests/round-trip/fake-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-pulls.test.d.ts","sourceRoot":"","sources":["../../../tests/round-trip/github-pulls.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { dirname, resolve } from "node:path";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
|
-
import { describe, test } from "vitest";
|
|
4
|
-
import { expectRoundTripFixture } from "./harness.js";
|
|
5
|
-
const testDir = dirname(fileURLToPath(import.meta.url));
|
|
6
|
-
const manifestPath = resolve(testDir, "../../fixtures/round-trip/github-pulls/manifest.json");
|
|
7
|
-
describe("GitHub pull request round trip", () => {
|
|
8
|
-
test("snapshot matches the GitHub pull-request fixture", async () => {
|
|
9
|
-
await expectRoundTripFixture(manifestPath);
|
|
10
|
-
});
|
|
11
|
-
});
|
|
12
|
-
//# sourceMappingURL=github-pulls.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-pulls.test.js","sourceRoot":"","sources":["../../../tests/round-trip/github-pulls.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,MAAM,YAAY,GAAG,OAAO,CAC1B,OAAO,EACP,sDAAsD,CACvD,CAAC;AAEF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { SchemaAdapter } from "../../src/runtime/schema-adapter.js";
|
|
2
|
-
import type { MappingSpec, ValidationIssue } from "../../src/spec/types.js";
|
|
3
|
-
import { type HttpReplayRequest } from "./fake-connection.js";
|
|
4
|
-
import { type StoredVfsFile, type VfsSnapshotClient, type VfsSnapshotOptions } from "./vfs-snapshot.js";
|
|
5
|
-
export interface RoundTripManifest {
|
|
6
|
-
schemaVersion: 1;
|
|
7
|
-
name: string;
|
|
8
|
-
description?: string;
|
|
9
|
-
adapter?: string;
|
|
10
|
-
mapping: string;
|
|
11
|
-
openapi?: string;
|
|
12
|
-
fixture: string;
|
|
13
|
-
expectedSnapshot: string;
|
|
14
|
-
sync: RoundTripSyncManifest;
|
|
15
|
-
replay?: RoundTripReplayManifest;
|
|
16
|
-
githubFixtureShape?: RoundTripFixtureShapeManifest;
|
|
17
|
-
initialFiles?: Record<string, StoredVfsFile>;
|
|
18
|
-
snapshot?: RoundTripSnapshotManifest;
|
|
19
|
-
}
|
|
20
|
-
export interface RoundTripSyncManifest {
|
|
21
|
-
resourceName: string;
|
|
22
|
-
workspaceId: string;
|
|
23
|
-
connectionId?: string;
|
|
24
|
-
input?: Record<string, unknown>;
|
|
25
|
-
params?: Record<string, unknown>;
|
|
26
|
-
query?: Record<string, unknown>;
|
|
27
|
-
options?: Record<string, unknown>;
|
|
28
|
-
}
|
|
29
|
-
export interface RoundTripReplayManifest {
|
|
30
|
-
baseUrl?: string;
|
|
31
|
-
requests?: readonly RoundTripReplayRequest[];
|
|
32
|
-
}
|
|
33
|
-
export interface RoundTripReplayRequest {
|
|
34
|
-
method: HttpReplayRequest["method"];
|
|
35
|
-
baseUrl?: string;
|
|
36
|
-
endpoint: string;
|
|
37
|
-
connectionId?: string;
|
|
38
|
-
headers?: HttpReplayRequest["headers"];
|
|
39
|
-
body?: unknown;
|
|
40
|
-
query?: HttpReplayRequest["query"];
|
|
41
|
-
sourceFixture?: string;
|
|
42
|
-
}
|
|
43
|
-
export interface RoundTripSnapshotManifest {
|
|
44
|
-
includeSyncState?: boolean;
|
|
45
|
-
runtimeOnlyFields?: readonly string[];
|
|
46
|
-
}
|
|
47
|
-
export interface RoundTripFixtureShapeManifest {
|
|
48
|
-
data?: string;
|
|
49
|
-
provider?: string;
|
|
50
|
-
exports?: readonly string[];
|
|
51
|
-
}
|
|
52
|
-
export interface LoadedRoundTripManifest {
|
|
53
|
-
manifestPath: string;
|
|
54
|
-
manifestDir: string;
|
|
55
|
-
manifest: RoundTripManifest;
|
|
56
|
-
}
|
|
57
|
-
export interface RoundTripRunOptions {
|
|
58
|
-
cwd?: string;
|
|
59
|
-
snapshot?: VfsSnapshotOptions;
|
|
60
|
-
}
|
|
61
|
-
export interface RoundTripRunResult {
|
|
62
|
-
manifest: RoundTripManifest;
|
|
63
|
-
mappingSpec: MappingSpec;
|
|
64
|
-
validationIssues: ValidationIssue[];
|
|
65
|
-
syncResult: Awaited<ReturnType<SchemaAdapter["sync"]>>;
|
|
66
|
-
actualSnapshot: string;
|
|
67
|
-
expectedSnapshot: string;
|
|
68
|
-
vfs: VfsSnapshotClient;
|
|
69
|
-
}
|
|
70
|
-
export declare function describeRoundTripFixture(manifestPath: string, options?: RoundTripRunOptions): void;
|
|
71
|
-
export declare function expectRoundTripFixture(manifestPath: string, options?: RoundTripRunOptions): Promise<RoundTripRunResult>;
|
|
72
|
-
export declare function runRoundTripFixture(manifestPath: string, options?: RoundTripRunOptions): Promise<RoundTripRunResult>;
|
|
73
|
-
export declare function loadRoundTripManifest(manifestPath: string, cwd?: string): Promise<LoadedRoundTripManifest>;
|
|
74
|
-
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../tests/round-trip/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,323 +0,0 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { dirname, resolve } from "node:path";
|
|
3
|
-
import { pathToFileURL } from "node:url";
|
|
4
|
-
import { describe, expect, test } from "vitest";
|
|
5
|
-
import { loadServiceSpecFromMapping } from "../../src/ingest/index.js";
|
|
6
|
-
import { SchemaAdapter, } from "../../src/runtime/schema-adapter.js";
|
|
7
|
-
import { loadMappingSpec, validateMappingSpec, } from "../../src/spec/parser.js";
|
|
8
|
-
import { createFakeConnection, } from "./fake-connection.js";
|
|
9
|
-
import { createVfsSnapshotClient, } from "./vfs-snapshot.js";
|
|
10
|
-
export function describeRoundTripFixture(manifestPath, options = {}) {
|
|
11
|
-
describe(`round-trip fixture ${manifestPath}`, () => {
|
|
12
|
-
test("syncs into the expected VFS snapshot", async () => {
|
|
13
|
-
await expectRoundTripFixture(manifestPath, options);
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
export async function expectRoundTripFixture(manifestPath, options = {}) {
|
|
18
|
-
const result = await runRoundTripFixture(manifestPath, options);
|
|
19
|
-
expect(result.validationIssues.filter((issue) => issue.level === "error"), formatValidationIssues(result.validationIssues)).toEqual([]);
|
|
20
|
-
expect(result.syncResult.errors).toEqual([]);
|
|
21
|
-
expect(result.actualSnapshot).toBe(result.expectedSnapshot);
|
|
22
|
-
return result;
|
|
23
|
-
}
|
|
24
|
-
export async function runRoundTripFixture(manifestPath, options = {}) {
|
|
25
|
-
const { manifest, manifestDir } = await loadRoundTripManifest(manifestPath, options.cwd);
|
|
26
|
-
const mappingSpec = await loadMappingSpec(manifest.mapping, manifestDir);
|
|
27
|
-
const sourceSpec = withManifestSourceOverrides(mappingSpec, manifest);
|
|
28
|
-
const serviceSpec = await loadServiceSpecFromMapping(sourceSpec, manifestDir);
|
|
29
|
-
const validation = validateMappingSpec(mappingSpec, serviceSpec);
|
|
30
|
-
const httpFixture = await loadHttpReplayFixture(manifest, manifestDir);
|
|
31
|
-
const replayFixture = await materializeReplayFixture(manifest, manifestDir, httpFixture, mappingSpec);
|
|
32
|
-
const provider = createFakeConnection(replayFixture, {
|
|
33
|
-
name: manifest.adapter ?? mappingSpec.adapter.name,
|
|
34
|
-
});
|
|
35
|
-
const vfs = createVfsSnapshotClient(manifest.initialFiles ?? {});
|
|
36
|
-
const adapter = new SchemaAdapter({
|
|
37
|
-
client: vfs.client,
|
|
38
|
-
provider,
|
|
39
|
-
spec: mappingSpec,
|
|
40
|
-
defaultConnectionId: manifest.sync.connectionId,
|
|
41
|
-
});
|
|
42
|
-
const syncResult = await adapter.sync(manifest.sync.workspaceId, manifest.sync.resourceName, buildSyncOptions(manifest));
|
|
43
|
-
provider.assertExhausted();
|
|
44
|
-
const snapshotOptions = buildSnapshotOptions(manifest, options.snapshot);
|
|
45
|
-
const actualSnapshot = normalizeSnapshotText(vfs.snapshotJsonl(snapshotOptions));
|
|
46
|
-
const expectedSnapshot = normalizeSnapshotText(await readFile(resolve(manifestDir, manifest.expectedSnapshot), "utf8"));
|
|
47
|
-
return {
|
|
48
|
-
manifest,
|
|
49
|
-
mappingSpec,
|
|
50
|
-
validationIssues: validation.issues,
|
|
51
|
-
syncResult,
|
|
52
|
-
actualSnapshot,
|
|
53
|
-
expectedSnapshot,
|
|
54
|
-
vfs,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
export async function loadRoundTripManifest(manifestPath, cwd = process.cwd()) {
|
|
58
|
-
const absolutePath = resolve(cwd, manifestPath);
|
|
59
|
-
const parsed = await readJsonFile(absolutePath);
|
|
60
|
-
const manifest = parseRoundTripManifest(parsed, absolutePath);
|
|
61
|
-
return {
|
|
62
|
-
manifestPath: absolutePath,
|
|
63
|
-
manifestDir: dirname(absolutePath),
|
|
64
|
-
manifest,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
function withManifestSourceOverrides(spec, manifest) {
|
|
68
|
-
if (!manifest.openapi) {
|
|
69
|
-
return spec;
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
...spec,
|
|
73
|
-
adapter: {
|
|
74
|
-
...spec.adapter,
|
|
75
|
-
source: {
|
|
76
|
-
...spec.adapter.source,
|
|
77
|
-
openapi: manifest.openapi,
|
|
78
|
-
postman: undefined,
|
|
79
|
-
samples: undefined,
|
|
80
|
-
docs: undefined,
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
async function loadHttpReplayFixture(manifest, manifestDir) {
|
|
86
|
-
return readJsonFile(resolve(manifestDir, manifest.fixture));
|
|
87
|
-
}
|
|
88
|
-
async function materializeReplayFixture(manifest, manifestDir, httpFixture, mappingSpec) {
|
|
89
|
-
if (!manifest.replay?.requests?.length) {
|
|
90
|
-
return httpFixture;
|
|
91
|
-
}
|
|
92
|
-
const rawInteractions = readReplayInteractions(httpFixture);
|
|
93
|
-
const fixtureExports = await loadFixtureExports(manifest, manifestDir);
|
|
94
|
-
return {
|
|
95
|
-
interactions: manifest.replay.requests.map((request, index) => {
|
|
96
|
-
const fallback = rawInteractions[index];
|
|
97
|
-
const data = readFixtureExport(fixtureExports, request.sourceFixture) ??
|
|
98
|
-
readFallbackResponseData(fallback?.response.data, request);
|
|
99
|
-
return {
|
|
100
|
-
request: buildReplayRequest(manifest, mappingSpec, request, fallback?.request),
|
|
101
|
-
response: {
|
|
102
|
-
status: fallback?.response.status ?? 200,
|
|
103
|
-
headers: fallback?.response.headers ?? {},
|
|
104
|
-
data,
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
}),
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
function buildReplayRequest(manifest, mappingSpec, request, fallback) {
|
|
111
|
-
return {
|
|
112
|
-
method: request.method,
|
|
113
|
-
baseUrl: request.baseUrl ??
|
|
114
|
-
manifest.replay?.baseUrl ??
|
|
115
|
-
fallback?.baseUrl ??
|
|
116
|
-
mappingSpec.adapter.baseUrl ??
|
|
117
|
-
"",
|
|
118
|
-
endpoint: request.endpoint,
|
|
119
|
-
connectionId: request.connectionId ??
|
|
120
|
-
manifest.sync.connectionId ??
|
|
121
|
-
fallback?.connectionId ??
|
|
122
|
-
"",
|
|
123
|
-
headers: request.headers,
|
|
124
|
-
body: request.body,
|
|
125
|
-
query: request.query,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
function buildSyncOptions(manifest) {
|
|
129
|
-
return stripUndefined({
|
|
130
|
-
...(manifest.sync.options ?? {}),
|
|
131
|
-
connectionId: manifest.sync.connectionId,
|
|
132
|
-
input: manifest.sync.input,
|
|
133
|
-
params: manifest.sync.params,
|
|
134
|
-
query: manifest.sync.query,
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
function buildSnapshotOptions(manifest, overrides) {
|
|
138
|
-
const includeSyncState = manifest.snapshot?.includeSyncState ?? true;
|
|
139
|
-
return {
|
|
140
|
-
...overrides,
|
|
141
|
-
runtimeOnlyFields: overrides?.runtimeOnlyFields ?? manifest.snapshot?.runtimeOnlyFields,
|
|
142
|
-
includePath: overrides?.includePath ??
|
|
143
|
-
(includeSyncState
|
|
144
|
-
? undefined
|
|
145
|
-
: (path) => !path.startsWith(".sync-state/")),
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
function readReplayInteractions(fixture) {
|
|
149
|
-
if (Array.isArray(fixture)) {
|
|
150
|
-
return fixture;
|
|
151
|
-
}
|
|
152
|
-
return fixture.interactions ?? fixture.requests ?? fixture.http ?? [];
|
|
153
|
-
}
|
|
154
|
-
async function loadFixtureExports(manifest, manifestDir) {
|
|
155
|
-
const dataPath = manifest.githubFixtureShape?.data;
|
|
156
|
-
if (!dataPath) {
|
|
157
|
-
return {};
|
|
158
|
-
}
|
|
159
|
-
const moduleUrl = pathToFileURL(resolve(manifestDir, dataPath)).href;
|
|
160
|
-
return import(moduleUrl);
|
|
161
|
-
}
|
|
162
|
-
function readFixtureExport(exports, exportName) {
|
|
163
|
-
if (!exportName) {
|
|
164
|
-
return undefined;
|
|
165
|
-
}
|
|
166
|
-
return cloneJson(exports[exportName]);
|
|
167
|
-
}
|
|
168
|
-
function readFallbackResponseData(data, request) {
|
|
169
|
-
if (request.sourceFixture && Array.isArray(data) && data.length === 1) {
|
|
170
|
-
return cloneJson(data[0]);
|
|
171
|
-
}
|
|
172
|
-
return cloneJson(data);
|
|
173
|
-
}
|
|
174
|
-
function parseRoundTripManifest(value, location) {
|
|
175
|
-
const manifest = readRecord(value, location);
|
|
176
|
-
const schemaVersion = readNumber(manifest.schemaVersion, "schemaVersion");
|
|
177
|
-
if (schemaVersion !== 1) {
|
|
178
|
-
throw new Error("schemaVersion must be 1");
|
|
179
|
-
}
|
|
180
|
-
const sync = readRecord(manifest.sync, "sync");
|
|
181
|
-
const replay = manifest.replay === undefined
|
|
182
|
-
? undefined
|
|
183
|
-
: parseReplayManifest(readRecord(manifest.replay, "replay"));
|
|
184
|
-
const githubFixtureShape = manifest.githubFixtureShape === undefined
|
|
185
|
-
? undefined
|
|
186
|
-
: parseFixtureShapeManifest(readRecord(manifest.githubFixtureShape, "githubFixtureShape"));
|
|
187
|
-
const snapshot = manifest.snapshot === undefined
|
|
188
|
-
? undefined
|
|
189
|
-
: parseSnapshotManifest(readRecord(manifest.snapshot, "snapshot"));
|
|
190
|
-
return {
|
|
191
|
-
schemaVersion: 1,
|
|
192
|
-
name: readRequiredString(manifest.name, "name"),
|
|
193
|
-
description: readString(manifest.description),
|
|
194
|
-
adapter: readString(manifest.adapter),
|
|
195
|
-
mapping: readRequiredString(manifest.mapping, "mapping"),
|
|
196
|
-
openapi: readString(manifest.openapi),
|
|
197
|
-
fixture: readRequiredString(manifest.fixture, "fixture"),
|
|
198
|
-
expectedSnapshot: readRequiredString(manifest.expectedSnapshot, "expectedSnapshot"),
|
|
199
|
-
sync: {
|
|
200
|
-
resourceName: readRequiredString(sync.resourceName, "sync.resourceName"),
|
|
201
|
-
workspaceId: readRequiredString(sync.workspaceId, "sync.workspaceId"),
|
|
202
|
-
connectionId: readString(sync.connectionId),
|
|
203
|
-
input: readOptionalRecord(sync.input, "sync.input"),
|
|
204
|
-
params: readOptionalRecord(sync.params, "sync.params"),
|
|
205
|
-
query: readOptionalRecord(sync.query, "sync.query"),
|
|
206
|
-
options: readOptionalRecord(sync.options, "sync.options"),
|
|
207
|
-
},
|
|
208
|
-
replay,
|
|
209
|
-
githubFixtureShape,
|
|
210
|
-
initialFiles: manifest.initialFiles === undefined
|
|
211
|
-
? undefined
|
|
212
|
-
: readRecord(manifest.initialFiles, "initialFiles"),
|
|
213
|
-
snapshot,
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
function parseFixtureShapeManifest(value) {
|
|
217
|
-
return {
|
|
218
|
-
data: readString(value.data),
|
|
219
|
-
provider: readString(value.provider),
|
|
220
|
-
exports: Array.isArray(value.exports)
|
|
221
|
-
? value.exports.filter((item) => typeof item === "string")
|
|
222
|
-
: undefined,
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
function parseReplayManifest(value) {
|
|
226
|
-
const requests = Array.isArray(value.requests)
|
|
227
|
-
? value.requests.map((item, index) => parseReplayRequest(readRecord(item, `replay.requests[${index}]`)))
|
|
228
|
-
: undefined;
|
|
229
|
-
return {
|
|
230
|
-
baseUrl: readString(value.baseUrl),
|
|
231
|
-
requests,
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
function parseReplayRequest(value) {
|
|
235
|
-
return {
|
|
236
|
-
method: readHttpMethod(value.method, "replay.requests.method"),
|
|
237
|
-
baseUrl: readString(value.baseUrl),
|
|
238
|
-
endpoint: readRequiredString(value.endpoint, "replay.requests.endpoint"),
|
|
239
|
-
connectionId: readString(value.connectionId),
|
|
240
|
-
headers: readOptionalStringRecord(value.headers, "replay.requests.headers"),
|
|
241
|
-
body: value.body,
|
|
242
|
-
query: readOptionalStringRecord(value.query, "replay.requests.query"),
|
|
243
|
-
sourceFixture: readString(value.sourceFixture),
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
function parseSnapshotManifest(value) {
|
|
247
|
-
return {
|
|
248
|
-
includeSyncState: typeof value.includeSyncState === "boolean"
|
|
249
|
-
? value.includeSyncState
|
|
250
|
-
: undefined,
|
|
251
|
-
runtimeOnlyFields: Array.isArray(value.runtimeOnlyFields)
|
|
252
|
-
? value.runtimeOnlyFields.filter((item) => typeof item === "string")
|
|
253
|
-
: undefined,
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
async function readJsonFile(path) {
|
|
257
|
-
return JSON.parse(await readFile(path, "utf8"));
|
|
258
|
-
}
|
|
259
|
-
function normalizeSnapshotText(value) {
|
|
260
|
-
const trimmed = value.trimEnd();
|
|
261
|
-
return trimmed.length > 0 ? `${trimmed}\n` : "";
|
|
262
|
-
}
|
|
263
|
-
function formatValidationIssues(issues) {
|
|
264
|
-
if (issues.length === 0) {
|
|
265
|
-
return "Mapping validation produced no issues.";
|
|
266
|
-
}
|
|
267
|
-
return issues
|
|
268
|
-
.map((issue) => `${issue.level}: ${issue.path}: ${issue.message}`)
|
|
269
|
-
.join("\n");
|
|
270
|
-
}
|
|
271
|
-
function readHttpMethod(value, field) {
|
|
272
|
-
if (value === "DELETE" ||
|
|
273
|
-
value === "GET" ||
|
|
274
|
-
value === "PATCH" ||
|
|
275
|
-
value === "POST" ||
|
|
276
|
-
value === "PUT") {
|
|
277
|
-
return value;
|
|
278
|
-
}
|
|
279
|
-
throw new Error(`${field} must be one of DELETE, GET, PATCH, POST, PUT`);
|
|
280
|
-
}
|
|
281
|
-
function readRequiredString(value, field) {
|
|
282
|
-
const stringValue = readString(value);
|
|
283
|
-
if (!stringValue) {
|
|
284
|
-
throw new Error(`${field} must be a non-empty string`);
|
|
285
|
-
}
|
|
286
|
-
return stringValue;
|
|
287
|
-
}
|
|
288
|
-
function readString(value) {
|
|
289
|
-
return typeof value === "string" && value.trim().length > 0
|
|
290
|
-
? value
|
|
291
|
-
: undefined;
|
|
292
|
-
}
|
|
293
|
-
function readNumber(value, field) {
|
|
294
|
-
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
295
|
-
throw new Error(`${field} must be a number`);
|
|
296
|
-
}
|
|
297
|
-
return value;
|
|
298
|
-
}
|
|
299
|
-
function readOptionalRecord(value, field) {
|
|
300
|
-
return value === undefined ? undefined : readRecord(value, field);
|
|
301
|
-
}
|
|
302
|
-
function readRecord(value, field) {
|
|
303
|
-
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
304
|
-
throw new Error(`${field} must be an object`);
|
|
305
|
-
}
|
|
306
|
-
return value;
|
|
307
|
-
}
|
|
308
|
-
function readOptionalStringRecord(value, field) {
|
|
309
|
-
if (value === undefined) {
|
|
310
|
-
return undefined;
|
|
311
|
-
}
|
|
312
|
-
return Object.fromEntries(Object.entries(readRecord(value, field)).filter((entry) => typeof entry[1] === "string"));
|
|
313
|
-
}
|
|
314
|
-
function stripUndefined(value) {
|
|
315
|
-
return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
|
|
316
|
-
}
|
|
317
|
-
function cloneJson(value) {
|
|
318
|
-
if (value === undefined || value === null || typeof value !== "object") {
|
|
319
|
-
return value;
|
|
320
|
-
}
|
|
321
|
-
return JSON.parse(JSON.stringify(value));
|
|
322
|
-
}
|
|
323
|
-
//# sourceMappingURL=harness.js.map
|