@relayfile/adapter-core 0.1.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 +89 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +430 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/docs/change-detector.d.ts +23 -0
- package/dist/src/docs/change-detector.d.ts.map +1 -0
- package/dist/src/docs/change-detector.js +126 -0
- package/dist/src/docs/change-detector.js.map +1 -0
- package/dist/src/docs/crawler.d.ts +22 -0
- package/dist/src/docs/crawler.d.ts.map +1 -0
- package/dist/src/docs/crawler.js +296 -0
- package/dist/src/docs/crawler.js.map +1 -0
- package/dist/src/docs/extractor.d.ts +12 -0
- package/dist/src/docs/extractor.d.ts.map +1 -0
- package/dist/src/docs/extractor.js +549 -0
- package/dist/src/docs/extractor.js.map +1 -0
- package/dist/src/docs/generator.d.ts +14 -0
- package/dist/src/docs/generator.d.ts.map +1 -0
- package/dist/src/docs/generator.js +368 -0
- package/dist/src/docs/generator.js.map +1 -0
- package/dist/src/docs/mapping-generator.d.ts +13 -0
- package/dist/src/docs/mapping-generator.d.ts.map +1 -0
- package/dist/src/docs/mapping-generator.js +104 -0
- package/dist/src/docs/mapping-generator.js.map +1 -0
- package/dist/src/docs/types.d.ts +110 -0
- package/dist/src/docs/types.d.ts.map +1 -0
- package/dist/src/docs/types.js +2 -0
- package/dist/src/docs/types.js.map +1 -0
- package/dist/src/docs/updater.d.ts +11 -0
- package/dist/src/docs/updater.d.ts.map +1 -0
- package/dist/src/docs/updater.js +133 -0
- package/dist/src/docs/updater.js.map +1 -0
- package/dist/src/drift/drift-checker.d.ts +13 -0
- package/dist/src/drift/drift-checker.d.ts.map +1 -0
- package/dist/src/drift/drift-checker.js +200 -0
- package/dist/src/drift/drift-checker.js.map +1 -0
- package/dist/src/generate/adapter-generator.d.ts +4 -0
- package/dist/src/generate/adapter-generator.d.ts.map +1 -0
- package/dist/src/generate/adapter-generator.js +115 -0
- package/dist/src/generate/adapter-generator.js.map +1 -0
- package/dist/src/generate/types-generator.d.ts +3 -0
- package/dist/src/generate/types-generator.d.ts.map +1 -0
- package/dist/src/generate/types-generator.js +105 -0
- package/dist/src/generate/types-generator.js.map +1 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +21 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ingest/index.d.ts +4 -0
- package/dist/src/ingest/index.d.ts.map +1 -0
- package/dist/src/ingest/index.js +34 -0
- package/dist/src/ingest/index.js.map +1 -0
- package/dist/src/ingest/openapi.d.ts +8 -0
- package/dist/src/ingest/openapi.d.ts.map +1 -0
- package/dist/src/ingest/openapi.js +187 -0
- package/dist/src/ingest/openapi.js.map +1 -0
- package/dist/src/ingest/postman.d.ts +3 -0
- package/dist/src/ingest/postman.d.ts.map +1 -0
- package/dist/src/ingest/postman.js +14 -0
- package/dist/src/ingest/postman.js.map +1 -0
- package/dist/src/ingest/sample.d.ts +4 -0
- package/dist/src/ingest/sample.d.ts.map +1 -0
- package/dist/src/ingest/sample.js +72 -0
- package/dist/src/ingest/sample.js.map +1 -0
- package/dist/src/ingest/shared.d.ts +6 -0
- package/dist/src/ingest/shared.d.ts.map +1 -0
- package/dist/src/ingest/shared.js +52 -0
- package/dist/src/ingest/shared.js.map +1 -0
- package/dist/src/ingest/types.d.ts +44 -0
- package/dist/src/ingest/types.d.ts.map +1 -0
- package/dist/src/ingest/types.js +2 -0
- package/dist/src/ingest/types.js.map +1 -0
- package/dist/src/runtime/schema-adapter.d.ts +71 -0
- package/dist/src/runtime/schema-adapter.d.ts.map +1 -0
- package/dist/src/runtime/schema-adapter.js +887 -0
- package/dist/src/runtime/schema-adapter.js.map +1 -0
- package/dist/src/spec/parser.d.ts +9 -0
- package/dist/src/spec/parser.d.ts.map +1 -0
- package/dist/src/spec/parser.js +371 -0
- package/dist/src/spec/parser.js.map +1 -0
- package/dist/src/spec/template.d.ts +8 -0
- package/dist/src/spec/template.d.ts.map +1 -0
- package/dist/src/spec/template.js +75 -0
- package/dist/src/spec/template.js.map +1 -0
- package/dist/src/spec/types.d.ts +88 -0
- package/dist/src/spec/types.d.ts.map +1 -0
- package/dist/src/spec/types.js +2 -0
- package/dist/src/spec/types.js.map +1 -0
- package/dist/tests/docs/change-detector.test.d.ts +2 -0
- package/dist/tests/docs/change-detector.test.d.ts.map +1 -0
- package/dist/tests/docs/change-detector.test.js +24 -0
- package/dist/tests/docs/change-detector.test.js.map +1 -0
- package/dist/tests/docs/crawler.test.d.ts +2 -0
- package/dist/tests/docs/crawler.test.d.ts.map +1 -0
- package/dist/tests/docs/crawler.test.js +55 -0
- package/dist/tests/docs/crawler.test.js.map +1 -0
- package/dist/tests/docs/extractor.test.d.ts +2 -0
- package/dist/tests/docs/extractor.test.d.ts.map +1 -0
- package/dist/tests/docs/extractor.test.js +63 -0
- package/dist/tests/docs/extractor.test.js.map +1 -0
- package/dist/tests/docs/generator.test.d.ts +2 -0
- package/dist/tests/docs/generator.test.d.ts.map +1 -0
- package/dist/tests/docs/generator.test.js +46 -0
- package/dist/tests/docs/generator.test.js.map +1 -0
- package/dist/tests/drift/drift-checker.test.d.ts +2 -0
- package/dist/tests/drift/drift-checker.test.d.ts.map +1 -0
- package/dist/tests/drift/drift-checker.test.js +59 -0
- package/dist/tests/drift/drift-checker.test.js.map +1 -0
- package/dist/tests/round-trip/fake-connection.d.ts +29 -0
- package/dist/tests/round-trip/fake-connection.d.ts.map +1 -0
- package/dist/tests/round-trip/fake-connection.js +174 -0
- package/dist/tests/round-trip/fake-connection.js.map +1 -0
- package/dist/tests/round-trip/github-pulls.test.d.ts +2 -0
- package/dist/tests/round-trip/github-pulls.test.d.ts.map +1 -0
- package/dist/tests/round-trip/github-pulls.test.js +12 -0
- package/dist/tests/round-trip/github-pulls.test.js.map +1 -0
- package/dist/tests/round-trip/harness.d.ts +74 -0
- package/dist/tests/round-trip/harness.d.ts.map +1 -0
- package/dist/tests/round-trip/harness.js +323 -0
- package/dist/tests/round-trip/harness.js.map +1 -0
- package/dist/tests/round-trip/vfs-snapshot.d.ts +45 -0
- package/dist/tests/round-trip/vfs-snapshot.d.ts.map +1 -0
- package/dist/tests/round-trip/vfs-snapshot.js +218 -0
- package/dist/tests/round-trip/vfs-snapshot.js.map +1 -0
- package/dist/tests/runtime/schema-adapter.sync.test.d.ts +2 -0
- package/dist/tests/runtime/schema-adapter.sync.test.d.ts.map +1 -0
- package/dist/tests/runtime/schema-adapter.sync.test.js +962 -0
- package/dist/tests/runtime/schema-adapter.sync.test.js.map +1 -0
- package/dist/tests/runtime/schema-adapter.test.d.ts +2 -0
- package/dist/tests/runtime/schema-adapter.test.d.ts.map +1 -0
- package/dist/tests/runtime/schema-adapter.test.js +100 -0
- package/dist/tests/runtime/schema-adapter.test.js.map +1 -0
- package/dist/tests/spec/parser.test.d.ts +2 -0
- package/dist/tests/spec/parser.test.d.ts.map +1 -0
- package/dist/tests/spec/parser.test.js +248 -0
- package/dist/tests/spec/parser.test.js.map +1 -0
- package/mappings/github.mapping.yaml +35 -0
- package/mappings/slack.mapping.yaml +18 -0
- package/package.json +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# @relayfile/adapter-core
|
|
2
|
+
|
|
3
|
+
`@relayfile/adapter-core` replaces hand-written relayfile adapters with a mapping file plus an API spec. It supports runtime execution through `SchemaAdapter`, code generation for zero-dependency adapters, and drift detection against upstream API specs.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @relayfile/adapter-core @relayfile/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Mapping Spec
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
adapter:
|
|
15
|
+
name: github
|
|
16
|
+
version: "1.0.0"
|
|
17
|
+
baseUrl: https://api.github.com
|
|
18
|
+
source:
|
|
19
|
+
openapi: https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.yaml
|
|
20
|
+
webhooks:
|
|
21
|
+
pull_request:
|
|
22
|
+
path: /github/repos/{{repository.owner.login}}/{{repository.name}}/pulls/{{number}}/metadata.json
|
|
23
|
+
writebacks:
|
|
24
|
+
review:
|
|
25
|
+
match: /github/repos/*/*/pulls/*/reviews/*.json
|
|
26
|
+
endpoint: POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
See [../../docs/MAPPING_YAML_SPEC.md](../../docs/MAPPING_YAML_SPEC.md) for the full mapping YAML specification.
|
|
30
|
+
|
|
31
|
+
## CLI
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx adapter-core init --service github --openapi https://example.com/openapi.yaml
|
|
35
|
+
npx adapter-core validate --spec mappings/github.mapping.yaml
|
|
36
|
+
npx adapter-core generate --spec mappings/github.mapping.yaml --outdir src/generated
|
|
37
|
+
npx adapter-core drift --spec mappings/github.mapping.yaml --baseline src/generated/service-spec.snapshot.json
|
|
38
|
+
npx adapter-core docs-to-spec --url https://docs.example.com/api --out specs --service example
|
|
39
|
+
npx adapter-core docs-check --spec specs/example.openapi.yaml
|
|
40
|
+
npx adapter-core docs-update --spec specs/example.openapi.yaml
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Docs-To-Spec
|
|
44
|
+
|
|
45
|
+
For APIs that only publish documentation pages, `adapter-core` can crawl those docs, extract API structure with an LLM, and emit both an OpenAPI spec and a mapping file.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx adapter-core docs-to-spec \
|
|
49
|
+
--url https://docs.example.com/api-reference \
|
|
50
|
+
--out ./specs \
|
|
51
|
+
--service example \
|
|
52
|
+
--paths /api-reference/endpoints,/api-reference/webhooks \
|
|
53
|
+
--sync-trigger content-hash
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Generated OpenAPI files store crawl metadata in `x-docs-source`. That enables:
|
|
57
|
+
|
|
58
|
+
- `docs-check` to do a cheap hash, RSS, or GitHub-release check before any crawl or LLM call
|
|
59
|
+
- `docs-update` to re-crawl, diff against the current spec, preserve `x-human-edited: true` sections, and mark removed operations as deprecated
|
|
60
|
+
|
|
61
|
+
Generated mapping files use `adapter.source.docs` so the existing runtime and generator pipeline can load documentation-backed adapters the same way it loads OpenAPI or Postman-backed adapters.
|
|
62
|
+
|
|
63
|
+
## Runtime
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { SchemaAdapter, loadMappingSpec } from "@relayfile/adapter-core";
|
|
67
|
+
|
|
68
|
+
const spec = await loadMappingSpec("./mappings/github.mapping.yaml");
|
|
69
|
+
const adapter = new SchemaAdapter({
|
|
70
|
+
client,
|
|
71
|
+
provider,
|
|
72
|
+
spec,
|
|
73
|
+
defaultConnectionId: "conn_123"
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## What It Generates
|
|
78
|
+
|
|
79
|
+
- `adapter.generated.ts`: static mapping logic for path resolution and writeback matching
|
|
80
|
+
- `types.generated.ts`: TypeScript types derived from OpenAPI schemas
|
|
81
|
+
- `service-spec.snapshot.json`: normalized baseline for future drift checks
|
|
82
|
+
|
|
83
|
+
## Drift Detection
|
|
84
|
+
|
|
85
|
+
`detectDrift()` compares two normalized `ServiceSpec` objects and reports:
|
|
86
|
+
|
|
87
|
+
- breaking changes: removed endpoints, removed fields, required field additions, type changes
|
|
88
|
+
- warnings: possible property renames
|
|
89
|
+
- additions: new endpoints, new schemas, optional field additions
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import YAML from "yaml";
|
|
5
|
+
import { ChangeDetector, defaultSyncConfig, } from "./docs/change-detector.js";
|
|
6
|
+
import { DocsCrawler } from "./docs/crawler.js";
|
|
7
|
+
import { APIExtractor } from "./docs/extractor.js";
|
|
8
|
+
import { SpecGenerator } from "./docs/generator.js";
|
|
9
|
+
import { MappingGenerator } from "./docs/mapping-generator.js";
|
|
10
|
+
import { SpecUpdater } from "./docs/updater.js";
|
|
11
|
+
import { detectDrift } from "./drift/drift-checker.js";
|
|
12
|
+
import { generateAdapterModule } from "./generate/adapter-generator.js";
|
|
13
|
+
import { generateTypeDefinitions } from "./generate/types-generator.js";
|
|
14
|
+
import { loadServiceSpecFromMapping } from "./ingest/index.js";
|
|
15
|
+
import { loadMappingSpec, validateMappingSpec, } from "./spec/parser.js";
|
|
16
|
+
async function main(argv) {
|
|
17
|
+
const [command, ...args] = argv;
|
|
18
|
+
const flags = parseFlags(args);
|
|
19
|
+
switch (command) {
|
|
20
|
+
case "generate":
|
|
21
|
+
await handleGenerate(flags);
|
|
22
|
+
return;
|
|
23
|
+
case "validate":
|
|
24
|
+
await handleValidate(flags);
|
|
25
|
+
return;
|
|
26
|
+
case "drift":
|
|
27
|
+
await handleDrift(flags);
|
|
28
|
+
return;
|
|
29
|
+
case "init":
|
|
30
|
+
await handleInit(flags);
|
|
31
|
+
return;
|
|
32
|
+
case "docs-to-spec":
|
|
33
|
+
await handleDocsToSpec(flags);
|
|
34
|
+
return;
|
|
35
|
+
case "docs-update":
|
|
36
|
+
await handleDocsUpdate(flags);
|
|
37
|
+
return;
|
|
38
|
+
case "docs-check":
|
|
39
|
+
await handleDocsCheck(flags);
|
|
40
|
+
return;
|
|
41
|
+
case "help":
|
|
42
|
+
case undefined:
|
|
43
|
+
printHelp();
|
|
44
|
+
return;
|
|
45
|
+
default:
|
|
46
|
+
throw new Error(`Unknown command "${command}"`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function handleGenerate(flags) {
|
|
50
|
+
const specPath = requireString(flags.spec, "--spec is required");
|
|
51
|
+
const outdir = requireString(flags.outdir, "--outdir is required");
|
|
52
|
+
const mappingSpec = await loadMappingSpec(specPath);
|
|
53
|
+
const cwd = dirname(resolve(specPath));
|
|
54
|
+
const serviceSpec = await loadServiceSpecFromMapping(mappingSpec, cwd);
|
|
55
|
+
const validation = validateMappingSpec(mappingSpec, serviceSpec);
|
|
56
|
+
if (!validation.valid) {
|
|
57
|
+
throw new Error(renderValidation(validation.issues));
|
|
58
|
+
}
|
|
59
|
+
const adapterCode = generateAdapterModule(mappingSpec, serviceSpec);
|
|
60
|
+
const typesCode = generateTypeDefinitions(serviceSpec);
|
|
61
|
+
const outputDir = resolve(outdir);
|
|
62
|
+
await mkdir(outputDir, { recursive: true });
|
|
63
|
+
await writeFile(resolve(outputDir, "adapter.generated.ts"), adapterCode);
|
|
64
|
+
await writeFile(resolve(outputDir, "types.generated.ts"), typesCode);
|
|
65
|
+
await writeFile(resolve(outputDir, "service-spec.snapshot.json"), `${JSON.stringify(serviceSpec, null, 2)}\n`);
|
|
66
|
+
process.stdout.write(`${JSON.stringify({
|
|
67
|
+
command: "generate",
|
|
68
|
+
outdir: outputDir,
|
|
69
|
+
files: [
|
|
70
|
+
"adapter.generated.ts",
|
|
71
|
+
"types.generated.ts",
|
|
72
|
+
"service-spec.snapshot.json",
|
|
73
|
+
],
|
|
74
|
+
}, null, 2)}\n`);
|
|
75
|
+
}
|
|
76
|
+
async function handleValidate(flags) {
|
|
77
|
+
const specPath = requireString(flags.spec, "--spec is required");
|
|
78
|
+
const mappingSpec = await loadMappingSpec(specPath);
|
|
79
|
+
const cwd = dirname(resolve(specPath));
|
|
80
|
+
const serviceSpec = await loadServiceSpecFromMapping(mappingSpec, cwd);
|
|
81
|
+
const result = validateMappingSpec(mappingSpec, serviceSpec);
|
|
82
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
83
|
+
if (!result.valid) {
|
|
84
|
+
process.exitCode = 1;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function handleDrift(flags) {
|
|
88
|
+
const specPath = requireString(flags.spec, "--spec is required");
|
|
89
|
+
const baselinePath = readOptionalString(flags.baseline) ??
|
|
90
|
+
resolve(dirname(resolve(specPath)), ".adapter-core", "service-spec.snapshot.json");
|
|
91
|
+
const mappingSpec = await loadMappingSpec(specPath);
|
|
92
|
+
const cwd = dirname(resolve(specPath));
|
|
93
|
+
const current = await loadServiceSpecFromMapping(mappingSpec, cwd);
|
|
94
|
+
const baseline = await loadSnapshot(baselinePath);
|
|
95
|
+
const report = detectDrift(baseline, current);
|
|
96
|
+
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
97
|
+
if (report.breaking.length > 0) {
|
|
98
|
+
process.exitCode = 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function handleInit(flags) {
|
|
102
|
+
const service = requireString(flags.service, "--service is required");
|
|
103
|
+
const openapi = readOptionalString(flags.openapi);
|
|
104
|
+
const postman = readOptionalString(flags.postman);
|
|
105
|
+
const output = readOptionalString(flags.out) ?? `${service}.mapping.yaml`;
|
|
106
|
+
const spec = {
|
|
107
|
+
adapter: {
|
|
108
|
+
name: service,
|
|
109
|
+
version: "1.0.0",
|
|
110
|
+
source: {
|
|
111
|
+
...(openapi ? { openapi } : {}),
|
|
112
|
+
...(postman ? { postman } : {}),
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
webhooks: {
|
|
116
|
+
example: {
|
|
117
|
+
path: `/${service}/events/{{id}}.json`,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
resources: {},
|
|
121
|
+
writebacks: {},
|
|
122
|
+
};
|
|
123
|
+
await mkdir(dirname(resolve(output)), { recursive: true });
|
|
124
|
+
await writeFile(resolve(output), YAML.stringify(spec));
|
|
125
|
+
process.stdout.write(`${JSON.stringify({ command: "init", output: resolve(output) }, null, 2)}\n`);
|
|
126
|
+
}
|
|
127
|
+
async function handleDocsToSpec(flags) {
|
|
128
|
+
const url = requireString(flags.url, "--url is required");
|
|
129
|
+
const out = requireString(flags.out, "--out is required");
|
|
130
|
+
const docsSource = parseDocsSourceFlags(flags, url);
|
|
131
|
+
const sync = parseSyncFlags(flags);
|
|
132
|
+
const llm = parseLlmFlags(flags);
|
|
133
|
+
const serviceName = readOptionalString(flags.service) ?? inferServiceName(url);
|
|
134
|
+
const outputDir = resolve(out);
|
|
135
|
+
const pages = await new DocsCrawler(docsSource).crawl();
|
|
136
|
+
const extracted = await new APIExtractor(llm).extract(pages);
|
|
137
|
+
const spec = new SpecGenerator().generate(extracted, {
|
|
138
|
+
apiName: serviceName,
|
|
139
|
+
docsSource,
|
|
140
|
+
sync,
|
|
141
|
+
llm,
|
|
142
|
+
});
|
|
143
|
+
const mapping = new MappingGenerator().generate(extracted, {
|
|
144
|
+
serviceName,
|
|
145
|
+
docsSource,
|
|
146
|
+
sync,
|
|
147
|
+
llm,
|
|
148
|
+
});
|
|
149
|
+
await mkdir(outputDir, { recursive: true });
|
|
150
|
+
const specPath = resolve(outputDir, `${serviceName}.openapi.yaml`);
|
|
151
|
+
const mappingPath = resolve(outputDir, `${serviceName}.mapping.yaml`);
|
|
152
|
+
await writeFile(specPath, spec);
|
|
153
|
+
await writeFile(mappingPath, mapping);
|
|
154
|
+
process.stdout.write(`${JSON.stringify({
|
|
155
|
+
command: "docs-to-spec",
|
|
156
|
+
service: serviceName,
|
|
157
|
+
spec: specPath,
|
|
158
|
+
mapping: mappingPath,
|
|
159
|
+
pages: pages.length,
|
|
160
|
+
endpoints: extracted.endpoints.length,
|
|
161
|
+
webhooks: extracted.webhooks.length,
|
|
162
|
+
}, null, 2)}\n`);
|
|
163
|
+
}
|
|
164
|
+
async function handleDocsUpdate(flags) {
|
|
165
|
+
const specPath = requireString(flags.spec, "--spec is required");
|
|
166
|
+
const specLocation = resolve(specPath);
|
|
167
|
+
const existingSpec = await readFile(specLocation, "utf8");
|
|
168
|
+
const document = asRecord(YAML.parse(existingSpec), "OpenAPI document");
|
|
169
|
+
const metadata = readDocsMetadata(document);
|
|
170
|
+
const detector = new ChangeDetector();
|
|
171
|
+
const syncConfig = defaultSyncConfig(metadata.url, metadata.sync);
|
|
172
|
+
const detectorResult = flags.force === true ? undefined : await detector.check(syncConfig);
|
|
173
|
+
if (detectorResult && !detectorResult.changed) {
|
|
174
|
+
process.stdout.write(`${JSON.stringify({
|
|
175
|
+
command: "docs-update",
|
|
176
|
+
changed: false,
|
|
177
|
+
reason: detectorResult.reason,
|
|
178
|
+
spec: specLocation,
|
|
179
|
+
}, null, 2)}\n`);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const pages = await new DocsCrawler({
|
|
183
|
+
url: metadata.url,
|
|
184
|
+
crawlPaths: metadata.crawlPaths,
|
|
185
|
+
selectors: metadata.selectors,
|
|
186
|
+
}).crawl();
|
|
187
|
+
const extracted = await new APIExtractor(metadata.llm).extract(pages);
|
|
188
|
+
const info = asLooseRecord(document.info);
|
|
189
|
+
const updater = new SpecUpdater();
|
|
190
|
+
const result = updater.update({
|
|
191
|
+
existingSpec,
|
|
192
|
+
extracted,
|
|
193
|
+
apiName: typeof info?.title === "string"
|
|
194
|
+
? info.title
|
|
195
|
+
: inferServiceName(metadata.url),
|
|
196
|
+
apiVersion: typeof info?.version === "string" ? info.version : "1.0.0",
|
|
197
|
+
docsSource: {
|
|
198
|
+
url: metadata.url,
|
|
199
|
+
crawlPaths: metadata.crawlPaths,
|
|
200
|
+
selectors: metadata.selectors,
|
|
201
|
+
},
|
|
202
|
+
sync: metadata.sync,
|
|
203
|
+
llm: metadata.llm,
|
|
204
|
+
serviceNameForMapping: readOptionalString(flags.service) ?? inferServiceName(metadata.url),
|
|
205
|
+
});
|
|
206
|
+
await writeFile(specLocation, result.spec);
|
|
207
|
+
const mappingLocation = readOptionalString(flags.mapping) ?? inferMappingPath(specLocation);
|
|
208
|
+
if (result.mapping) {
|
|
209
|
+
await writeFile(resolve(mappingLocation), result.mapping);
|
|
210
|
+
}
|
|
211
|
+
if (detectorResult) {
|
|
212
|
+
await detector.record(syncConfig, detectorResult);
|
|
213
|
+
}
|
|
214
|
+
process.stdout.write(`${JSON.stringify({
|
|
215
|
+
command: "docs-update",
|
|
216
|
+
changed: result.changed,
|
|
217
|
+
spec: specLocation,
|
|
218
|
+
mapping: resolve(mappingLocation),
|
|
219
|
+
warnings: result.warnings,
|
|
220
|
+
changes: result.changes,
|
|
221
|
+
}, null, 2)}\n`);
|
|
222
|
+
}
|
|
223
|
+
async function handleDocsCheck(flags) {
|
|
224
|
+
const specPath = requireString(flags.spec, "--spec is required");
|
|
225
|
+
const existingSpec = await readFile(resolve(specPath), "utf8");
|
|
226
|
+
const document = asRecord(YAML.parse(existingSpec), "OpenAPI document");
|
|
227
|
+
const metadata = readDocsMetadata(document);
|
|
228
|
+
const detector = new ChangeDetector();
|
|
229
|
+
const config = defaultSyncConfig(metadata.url, metadata.sync);
|
|
230
|
+
const result = await detector.check(config);
|
|
231
|
+
await detector.record(config, result);
|
|
232
|
+
process.stdout.write(`${JSON.stringify({ command: "docs-check", ...result }, null, 2)}\n`);
|
|
233
|
+
}
|
|
234
|
+
function parseFlags(args) {
|
|
235
|
+
const output = {};
|
|
236
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
237
|
+
const arg = args[index];
|
|
238
|
+
if (!arg.startsWith("--")) {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const key = arg.slice(2);
|
|
242
|
+
const next = args[index + 1];
|
|
243
|
+
if (!next || next.startsWith("--")) {
|
|
244
|
+
output[key] = true;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
output[key] = next;
|
|
248
|
+
index += 1;
|
|
249
|
+
}
|
|
250
|
+
return output;
|
|
251
|
+
}
|
|
252
|
+
async function loadSnapshot(location) {
|
|
253
|
+
const text = await readFile(resolve(location), "utf8");
|
|
254
|
+
return JSON.parse(text);
|
|
255
|
+
}
|
|
256
|
+
function requireString(value, message) {
|
|
257
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
258
|
+
throw new Error(message);
|
|
259
|
+
}
|
|
260
|
+
return value;
|
|
261
|
+
}
|
|
262
|
+
function readOptionalString(value) {
|
|
263
|
+
return typeof value === "string" && value.trim().length > 0 ? value : undefined;
|
|
264
|
+
}
|
|
265
|
+
function renderValidation(issues) {
|
|
266
|
+
return issues
|
|
267
|
+
.map((issue) => `${issue.level.toUpperCase()}: ${issue.path}: ${issue.message}`)
|
|
268
|
+
.join("\n");
|
|
269
|
+
}
|
|
270
|
+
function printHelp() {
|
|
271
|
+
process.stdout.write(`adapter-core
|
|
272
|
+
|
|
273
|
+
Commands:
|
|
274
|
+
generate --spec <mapping> --outdir <dir>
|
|
275
|
+
validate --spec <mapping>
|
|
276
|
+
drift --spec <mapping> [--baseline <snapshot>]
|
|
277
|
+
init --service <name> (--openapi <url> | --postman <url>) [--out <file>]
|
|
278
|
+
docs-to-spec --url <docs-url> --out <dir> [--service <name>] [--paths <a,b>]
|
|
279
|
+
docs-update --spec <openapi.yaml> [--mapping <mapping.yaml>] [--force]
|
|
280
|
+
docs-check --spec <openapi.yaml>
|
|
281
|
+
`);
|
|
282
|
+
}
|
|
283
|
+
function parseDocsSourceFlags(flags, url) {
|
|
284
|
+
return {
|
|
285
|
+
url,
|
|
286
|
+
crawlPaths: parseCsv(flags.paths),
|
|
287
|
+
selectors: {
|
|
288
|
+
content: readOptionalString(flags["content-selector"]),
|
|
289
|
+
codeBlock: readOptionalString(flags["code-selector"]),
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
function parseSyncFlags(flags) {
|
|
294
|
+
const trigger = readOptionalString(flags["sync-trigger"]);
|
|
295
|
+
if (!trigger) {
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
if (trigger !== "content-hash" &&
|
|
299
|
+
trigger !== "changelog-rss" &&
|
|
300
|
+
trigger !== "github-release") {
|
|
301
|
+
throw new Error("--sync-trigger must be content-hash, changelog-rss, or github-release");
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
trigger,
|
|
305
|
+
feedUrl: readOptionalString(flags["feed-url"]),
|
|
306
|
+
repo: readOptionalString(flags.repo),
|
|
307
|
+
stateFile: readOptionalString(flags["state-file"]),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
function parseLlmFlags(flags) {
|
|
311
|
+
const hasLlmFlag = [
|
|
312
|
+
flags["llm-provider"],
|
|
313
|
+
flags["llm-endpoint"],
|
|
314
|
+
flags["llm-model"],
|
|
315
|
+
flags["llm-max-tokens"],
|
|
316
|
+
flags["llm-concurrency"],
|
|
317
|
+
flags["llm-chunk-size"],
|
|
318
|
+
].some((value) => value !== undefined);
|
|
319
|
+
if (!hasLlmFlag) {
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
const provider = readOptionalString(flags["llm-provider"]);
|
|
323
|
+
return {
|
|
324
|
+
provider: provider === "anthropic" || provider === "custom" || provider === "openai"
|
|
325
|
+
? provider
|
|
326
|
+
: undefined,
|
|
327
|
+
endpoint: readOptionalString(flags["llm-endpoint"]),
|
|
328
|
+
model: readOptionalString(flags["llm-model"]),
|
|
329
|
+
maxTokens: readOptionalNumber(flags["llm-max-tokens"]),
|
|
330
|
+
concurrency: readOptionalNumber(flags["llm-concurrency"]),
|
|
331
|
+
chunkSize: readOptionalNumber(flags["llm-chunk-size"]),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
function parseCsv(value) {
|
|
335
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
const items = value
|
|
339
|
+
.split(",")
|
|
340
|
+
.map((item) => item.trim())
|
|
341
|
+
.filter(Boolean);
|
|
342
|
+
return items.length > 0 ? items : undefined;
|
|
343
|
+
}
|
|
344
|
+
function readOptionalNumber(value) {
|
|
345
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
const parsed = Number(value);
|
|
349
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
350
|
+
}
|
|
351
|
+
function inferServiceName(url) {
|
|
352
|
+
const parsed = new URL(url);
|
|
353
|
+
const parts = [parsed.hostname.replace(/^www\./, ""), parsed.pathname]
|
|
354
|
+
.join(" ")
|
|
355
|
+
.split(/[^a-zA-Z0-9]+/)
|
|
356
|
+
.filter(Boolean);
|
|
357
|
+
return parts[0]?.toLowerCase() ?? "docs-api";
|
|
358
|
+
}
|
|
359
|
+
function inferMappingPath(specPath) {
|
|
360
|
+
if (/\.openapi\.ya?ml$/i.test(specPath)) {
|
|
361
|
+
return specPath.replace(/\.openapi\.ya?ml$/i, ".mapping.yaml");
|
|
362
|
+
}
|
|
363
|
+
if (/\.ya?ml$/i.test(specPath)) {
|
|
364
|
+
return specPath.replace(/\.ya?ml$/i, ".mapping.yaml");
|
|
365
|
+
}
|
|
366
|
+
return `${specPath}.mapping.yaml`;
|
|
367
|
+
}
|
|
368
|
+
function readDocsMetadata(document) {
|
|
369
|
+
const metadata = asRecord(document["x-docs-source"], "x-docs-source");
|
|
370
|
+
const sync = asLooseRecord(metadata.sync);
|
|
371
|
+
const llm = asLooseRecord(metadata.llm);
|
|
372
|
+
const selectors = asLooseRecord(metadata.selectors);
|
|
373
|
+
return {
|
|
374
|
+
url: requireField(metadata.url, "x-docs-source.url"),
|
|
375
|
+
crawlPaths: Array.isArray(metadata.crawlPaths)
|
|
376
|
+
? metadata.crawlPaths.filter((item) => typeof item === "string")
|
|
377
|
+
: undefined,
|
|
378
|
+
selectors: selectors
|
|
379
|
+
? {
|
|
380
|
+
content: typeof selectors.content === "string" ? selectors.content : undefined,
|
|
381
|
+
codeBlock: typeof selectors.codeBlock === "string" ? selectors.codeBlock : undefined,
|
|
382
|
+
pagination: typeof selectors.pagination === "string" ? selectors.pagination : undefined,
|
|
383
|
+
}
|
|
384
|
+
: undefined,
|
|
385
|
+
sync: sync
|
|
386
|
+
? {
|
|
387
|
+
trigger: requireField(sync.trigger, "x-docs-source.sync.trigger"),
|
|
388
|
+
feedUrl: typeof sync.feedUrl === "string" ? sync.feedUrl : undefined,
|
|
389
|
+
repo: typeof sync.repo === "string" ? sync.repo : undefined,
|
|
390
|
+
}
|
|
391
|
+
: undefined,
|
|
392
|
+
llm: llm
|
|
393
|
+
? {
|
|
394
|
+
provider: llm.provider === "anthropic" ||
|
|
395
|
+
llm.provider === "custom" ||
|
|
396
|
+
llm.provider === "openai"
|
|
397
|
+
? llm.provider
|
|
398
|
+
: undefined,
|
|
399
|
+
endpoint: typeof llm.endpoint === "string" ? llm.endpoint : undefined,
|
|
400
|
+
model: typeof llm.model === "string" ? llm.model : undefined,
|
|
401
|
+
maxTokens: typeof llm.maxTokens === "number" ? llm.maxTokens : undefined,
|
|
402
|
+
concurrency: typeof llm.concurrency === "number" ? llm.concurrency : undefined,
|
|
403
|
+
chunkSize: typeof llm.chunkSize === "number" ? llm.chunkSize : undefined,
|
|
404
|
+
}
|
|
405
|
+
: undefined,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
function asRecord(value, label) {
|
|
409
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
410
|
+
throw new Error(`${label} must be an object`);
|
|
411
|
+
}
|
|
412
|
+
return value;
|
|
413
|
+
}
|
|
414
|
+
function asLooseRecord(value) {
|
|
415
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
416
|
+
? value
|
|
417
|
+
: undefined;
|
|
418
|
+
}
|
|
419
|
+
function requireField(value, label) {
|
|
420
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
421
|
+
throw new Error(`${label} is required`);
|
|
422
|
+
}
|
|
423
|
+
return value;
|
|
424
|
+
}
|
|
425
|
+
main(process.argv.slice(2)).catch((error) => {
|
|
426
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
427
|
+
process.stderr.write(`${message}\n`);
|
|
428
|
+
process.exit(1);
|
|
429
|
+
});
|
|
430
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ChangeDetectionResult, DocsSyncConfig } from "./types.js";
|
|
2
|
+
export interface ChangeDetectorCheckInput extends DocsSyncConfig {
|
|
3
|
+
url: string;
|
|
4
|
+
githubToken?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class ChangeDetector {
|
|
7
|
+
private readonly fetchImpl;
|
|
8
|
+
private readonly stateFile;
|
|
9
|
+
constructor(options?: {
|
|
10
|
+
fetchImpl?: typeof fetch;
|
|
11
|
+
stateFile?: string;
|
|
12
|
+
});
|
|
13
|
+
check(input: ChangeDetectorCheckInput): Promise<ChangeDetectionResult>;
|
|
14
|
+
record(input: ChangeDetectorCheckInput, result: Pick<ChangeDetectionResult, "currentHash" | "stateKey">): Promise<void>;
|
|
15
|
+
private getStateKey;
|
|
16
|
+
private readCurrentValue;
|
|
17
|
+
private readContentHash;
|
|
18
|
+
private readFeedValue;
|
|
19
|
+
private readGitHubReleaseValue;
|
|
20
|
+
private loadState;
|
|
21
|
+
}
|
|
22
|
+
export declare function defaultSyncConfig(url: string, sync?: DocsSyncConfig): ChangeDetectorCheckInput;
|
|
23
|
+
//# sourceMappingURL=change-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-detector.d.ts","sourceRoot":"","sources":["../../../src/docs/change-detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EAEf,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAKhE,KAAK,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoBtE,MAAM,CACV,KAAK,EAAE,wBAAwB,EAC/B,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,aAAa,GAAG,UAAU,CAAC,GAC9D,OAAO,CAAC,IAAI,CAAC;IAQhB,OAAO,CAAC,WAAW;YAUL,gBAAgB;YAahB,eAAe;YAYf,aAAa;YAsBb,sBAAsB;YA2CtB,SAAS;CASxB;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,cAAc,GACpB,wBAAwB,CAQ1B"}
|