@relayfile/adapter-core 0.3.25 → 0.3.27
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/cli.js +88 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/proactive/review-adapter.d.ts +107 -0
- package/dist/src/proactive/review-adapter.d.ts.map +1 -0
- package/dist/src/proactive/review-adapter.js +2 -0
- package/dist/src/proactive/review-adapter.js.map +1 -0
- package/dist/src/scope-keys/catalog-generator.d.ts +39 -0
- package/dist/src/scope-keys/catalog-generator.d.ts.map +1 -0
- package/dist/src/scope-keys/catalog-generator.js +393 -0
- package/dist/src/scope-keys/catalog-generator.js.map +1 -0
- package/dist/src/scope-keys/catalog.generated.d.ts +209 -0
- package/dist/src/scope-keys/catalog.generated.d.ts.map +1 -0
- package/dist/src/scope-keys/catalog.generated.js +250 -0
- package/dist/src/scope-keys/catalog.generated.js.map +1 -0
- package/dist/src/triggers/catalog-generator.js +2 -1
- package/dist/src/triggers/catalog-generator.js.map +1 -1
- package/dist/src/triggers/catalog.generated.d.ts +1 -5
- package/dist/src/triggers/catalog.generated.d.ts.map +1 -1
- package/dist/src/triggers/catalog.generated.js +3 -6
- package/dist/src/triggers/catalog.generated.js.map +1 -1
- package/dist/src/writeback-paths/catalog-generator.d.ts +51 -0
- package/dist/src/writeback-paths/catalog-generator.d.ts.map +1 -0
- package/dist/src/writeback-paths/catalog-generator.js +260 -0
- package/dist/src/writeback-paths/catalog-generator.js.map +1 -0
- package/dist/src/writeback-paths/catalog.generated.d.ts +470 -0
- package/dist/src/writeback-paths/catalog.generated.d.ts.map +1 -0
- package/dist/src/writeback-paths/catalog.generated.js +737 -0
- package/dist/src/writeback-paths/catalog.generated.js.map +1 -0
- package/dist/src/writeback-paths/index.d.ts +3 -0
- package/dist/src/writeback-paths/index.d.ts.map +1 -0
- package/dist/src/writeback-paths/index.js +3 -0
- package/dist/src/writeback-paths/index.js.map +1 -0
- package/dist/src/writeback-paths/resolver.d.ts +24 -0
- package/dist/src/writeback-paths/resolver.d.ts.map +1 -0
- package/dist/src/writeback-paths/resolver.js +59 -0
- package/dist/src/writeback-paths/resolver.js.map +1 -0
- package/dist/tests/scope-keys/catalog-generator.test.d.ts +2 -0
- package/dist/tests/scope-keys/catalog-generator.test.d.ts.map +1 -0
- package/dist/tests/scope-keys/catalog-generator.test.js +23 -0
- package/dist/tests/scope-keys/catalog-generator.test.js.map +1 -0
- package/dist/tests/writeback-paths/catalog-generator.test.d.ts +2 -0
- package/dist/tests/writeback-paths/catalog-generator.test.d.ts.map +1 -0
- package/dist/tests/writeback-paths/catalog-generator.test.js +56 -0
- package/dist/tests/writeback-paths/catalog-generator.test.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { access, mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { findRepoRoot } from "../triggers/catalog-generator.js";
|
|
5
|
+
const GENERATED_HEADER = `/**
|
|
6
|
+
* Generated by \`adapter-core writeback-paths generate\`.
|
|
7
|
+
*
|
|
8
|
+
* Writeback path templates are emitted verbatim from each adapter's
|
|
9
|
+
* \`resources.ts\` (\`{ name, path }\`) — the same source the writeback worker's
|
|
10
|
+
* \`classifyWrite\` routes drafts against. A consumer resolves a concrete draft
|
|
11
|
+
* path with \`writebackPath(provider, resource, params)\`.
|
|
12
|
+
*/
|
|
13
|
+
`;
|
|
14
|
+
const NON_ADAPTER_PACKAGES = new Set(["@relayfile/adapter-core", "@relayfile/webhook-server"]);
|
|
15
|
+
export async function generateWritebackPathCatalog(repoRoot) {
|
|
16
|
+
repoRoot = repoRoot ? resolve(repoRoot) : await findRepoRoot();
|
|
17
|
+
const packages = await listAdapterPackages(repoRoot);
|
|
18
|
+
const entries = [];
|
|
19
|
+
const adaptersWithoutWritebackPaths = [];
|
|
20
|
+
for (const adapterPackage of packages) {
|
|
21
|
+
const { resources, error } = await readAdapterResources(adapterPackage);
|
|
22
|
+
if (resources.length > 0) {
|
|
23
|
+
entries.push({ provider: adapterPackage.provider, resources });
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
adaptersWithoutWritebackPaths.push({
|
|
27
|
+
packageName: adapterPackage.packageName,
|
|
28
|
+
packagePath: adapterPackage.relativePath,
|
|
29
|
+
provider: adapterPackage.provider,
|
|
30
|
+
reason: error ?? "No resources.ts with writeback path templates",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
catalog: sortCatalog(entries),
|
|
35
|
+
adaptersWithoutWritebackPaths: adaptersWithoutWritebackPaths.sort(compareByPackagePath),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export async function writeWritebackPathCatalog(options = {}) {
|
|
39
|
+
const repoRoot = options.repoRoot ? resolve(options.repoRoot) : await findRepoRoot();
|
|
40
|
+
const generation = await generateWritebackPathCatalog(repoRoot);
|
|
41
|
+
const paths = writebackPathCatalogPaths(repoRoot);
|
|
42
|
+
const expectedFiles = new Map([
|
|
43
|
+
[paths.catalogJson, renderJson(generation.catalog)],
|
|
44
|
+
[paths.withoutJson, renderJson(generation.adaptersWithoutWritebackPaths)],
|
|
45
|
+
[paths.catalogTs, renderWritebackPathCatalogModule(generation)],
|
|
46
|
+
]);
|
|
47
|
+
if (options.check) {
|
|
48
|
+
const mismatches = [];
|
|
49
|
+
for (const [filePath, expected] of expectedFiles) {
|
|
50
|
+
let actual = "";
|
|
51
|
+
try {
|
|
52
|
+
actual = await readFile(filePath, "utf8");
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
mismatches.push(relative(repoRoot, filePath));
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Normalize line endings: a CRLF checkout (Windows, no enforced
|
|
59
|
+
// `.gitattributes`) must not read as a false out-of-sync mismatch.
|
|
60
|
+
if (normalizeEol(actual) !== normalizeEol(expected)) {
|
|
61
|
+
mismatches.push(relative(repoRoot, filePath));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (mismatches.length > 0) {
|
|
65
|
+
throw new Error(`Writeback-path catalog is out of sync. Run \`adapter-core writeback-paths generate\`. Stale files: ${mismatches.join(", ")}`);
|
|
66
|
+
}
|
|
67
|
+
return generation;
|
|
68
|
+
}
|
|
69
|
+
for (const [filePath, contents] of expectedFiles) {
|
|
70
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
71
|
+
await writeFile(filePath, contents);
|
|
72
|
+
}
|
|
73
|
+
return generation;
|
|
74
|
+
}
|
|
75
|
+
export function writebackPathCatalogPaths(repoRoot) {
|
|
76
|
+
const dir = join(repoRoot, "packages", "core", "src", "writeback-paths");
|
|
77
|
+
return {
|
|
78
|
+
catalogJson: join(dir, "catalog.generated.json"),
|
|
79
|
+
withoutJson: join(dir, "adapters-without-writeback-paths.generated.json"),
|
|
80
|
+
catalogTs: join(dir, "catalog.generated.ts"),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function renderWritebackPathCatalogModule(generation) {
|
|
84
|
+
return `${GENERATED_HEADER}
|
|
85
|
+
export const WRITEBACK_PATH_CATALOG = ${renderInlineJson(generation.catalog)} as const satisfies Record<
|
|
86
|
+
string,
|
|
87
|
+
Record<string, readonly { path: string; params: readonly string[] }[]>
|
|
88
|
+
>;
|
|
89
|
+
|
|
90
|
+
export const ADAPTERS_WITHOUT_WRITEBACK_PATHS = ${renderInlineJson(generation.adaptersWithoutWritebackPaths)} as const;
|
|
91
|
+
|
|
92
|
+
export type WritebackProvider = keyof typeof WRITEBACK_PATH_CATALOG;
|
|
93
|
+
export type WritebackResource<P extends WritebackProvider> =
|
|
94
|
+
keyof (typeof WRITEBACK_PATH_CATALOG)[P];
|
|
95
|
+
`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Read an adapter's writeback resources. Prefers the built `resources.js`
|
|
99
|
+
* (a plain `{ name, path }[]` array — the same module `classifyWrite`
|
|
100
|
+
* consumes); falls back to regex-parsing the `resources.ts` source so the
|
|
101
|
+
* catalog still generates when an adapter is unbuilt.
|
|
102
|
+
*/
|
|
103
|
+
async function readAdapterResources(adapterPackage) {
|
|
104
|
+
const builtEntryPoint = await firstExistingPath([
|
|
105
|
+
join(adapterPackage.dir, "dist", "resources.js"),
|
|
106
|
+
join(adapterPackage.dir, "dist", "src", "resources.js"),
|
|
107
|
+
]);
|
|
108
|
+
let importError;
|
|
109
|
+
if (builtEntryPoint) {
|
|
110
|
+
try {
|
|
111
|
+
const moduleExports = (await import(pathToFileURL(builtEntryPoint).href));
|
|
112
|
+
const resources = normalizeResources(moduleExports.resources);
|
|
113
|
+
if (resources.length > 0) {
|
|
114
|
+
return { resources };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Remember the import failure so it surfaces as the adapter's reason
|
|
119
|
+
// instead of a generic "no resources" message — a swallowed import
|
|
120
|
+
// error otherwise hides a real build/runtime problem.
|
|
121
|
+
importError = `Could not import built adapter resources: ${errorMessage(error)}`;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const sourceResources = await readResourcesFromSource(join(adapterPackage.dir, "src", "resources.ts"));
|
|
125
|
+
if (sourceResources.length > 0) {
|
|
126
|
+
return { resources: sourceResources };
|
|
127
|
+
}
|
|
128
|
+
return { resources: [], error: importError };
|
|
129
|
+
}
|
|
130
|
+
function normalizeResources(value) {
|
|
131
|
+
if (!Array.isArray(value)) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
const out = [];
|
|
135
|
+
for (const entry of value) {
|
|
136
|
+
if (!isRecord(entry))
|
|
137
|
+
continue;
|
|
138
|
+
const { name, path } = entry;
|
|
139
|
+
if (typeof name === "string" && name.length > 0 && typeof path === "string" && path.length > 0) {
|
|
140
|
+
out.push({ name, path });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
async function readResourcesFromSource(entryPoint) {
|
|
146
|
+
let contents;
|
|
147
|
+
try {
|
|
148
|
+
contents = await readFile(entryPoint, "utf8");
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
// Match `name: "x"` immediately followed by `path: "/y"` within each
|
|
154
|
+
// resource literal. `name` always precedes `path` in the generated file.
|
|
155
|
+
const pattern = /name:\s*["']([^"']+)["']\s*,\s*path:\s*["']([^"']+)["']/gu;
|
|
156
|
+
const out = [];
|
|
157
|
+
let match;
|
|
158
|
+
while ((match = pattern.exec(contents)) !== null) {
|
|
159
|
+
out.push({ name: match[1], path: match[2] });
|
|
160
|
+
}
|
|
161
|
+
return out;
|
|
162
|
+
}
|
|
163
|
+
function sortCatalog(entries) {
|
|
164
|
+
// provider → name → (path → variant). The inner map dedupes by path so an
|
|
165
|
+
// exact (name, path) repeat collapses, while genuinely distinct templates
|
|
166
|
+
// sharing a name are all retained (notion `pages`, asana `sections`, …).
|
|
167
|
+
const catalog = new Map();
|
|
168
|
+
for (const entry of entries) {
|
|
169
|
+
const byName = catalog.get(entry.provider) ?? new Map();
|
|
170
|
+
for (const resource of entry.resources) {
|
|
171
|
+
const byPath = byName.get(resource.name) ?? new Map();
|
|
172
|
+
if (!byPath.has(resource.path)) {
|
|
173
|
+
byPath.set(resource.path, { path: resource.path, params: extractParams(resource.path) });
|
|
174
|
+
}
|
|
175
|
+
byName.set(resource.name, byPath);
|
|
176
|
+
}
|
|
177
|
+
catalog.set(entry.provider, byName);
|
|
178
|
+
}
|
|
179
|
+
return Object.fromEntries([...catalog.entries()]
|
|
180
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
181
|
+
.map(([provider, byName]) => [
|
|
182
|
+
provider,
|
|
183
|
+
Object.fromEntries([...byName.entries()]
|
|
184
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
185
|
+
.map(([name, byPath]) => [
|
|
186
|
+
name,
|
|
187
|
+
[...byPath.values()].sort((left, right) => left.path.localeCompare(right.path)),
|
|
188
|
+
])),
|
|
189
|
+
]));
|
|
190
|
+
}
|
|
191
|
+
function normalizeEol(value) {
|
|
192
|
+
return value.replace(/\r\n/gu, "\n");
|
|
193
|
+
}
|
|
194
|
+
/** Placeholder names in template order, e.g. `/x/{a}/y/{b}` → `["a","b"]`. */
|
|
195
|
+
function extractParams(template) {
|
|
196
|
+
return [...template.matchAll(/\{([^}]+)\}/gu)].map((match) => match[1]);
|
|
197
|
+
}
|
|
198
|
+
async function listAdapterPackages(repoRoot) {
|
|
199
|
+
const packagesDir = join(repoRoot, "packages");
|
|
200
|
+
const names = await readdir(packagesDir);
|
|
201
|
+
const packages = [];
|
|
202
|
+
for (const name of names.sort()) {
|
|
203
|
+
const dir = join(packagesDir, name);
|
|
204
|
+
const packageJsonPath = join(dir, "package.json");
|
|
205
|
+
let packageJson;
|
|
206
|
+
try {
|
|
207
|
+
packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (!packageJson.name || NON_ADAPTER_PACKAGES.has(packageJson.name)) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
packages.push({
|
|
216
|
+
dir,
|
|
217
|
+
packageName: packageJson.name,
|
|
218
|
+
provider: inferProviderSlug(packageJson.name, name),
|
|
219
|
+
relativePath: relative(repoRoot, dir),
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return packages;
|
|
223
|
+
}
|
|
224
|
+
function inferProviderSlug(packageName, directoryName) {
|
|
225
|
+
if (packageName.startsWith("@relayfile/adapter-")) {
|
|
226
|
+
return packageName.slice("@relayfile/adapter-".length);
|
|
227
|
+
}
|
|
228
|
+
if (packageName.startsWith("@relayfile/")) {
|
|
229
|
+
return packageName.slice("@relayfile/".length);
|
|
230
|
+
}
|
|
231
|
+
return directoryName;
|
|
232
|
+
}
|
|
233
|
+
async function firstExistingPath(paths) {
|
|
234
|
+
for (const path of paths) {
|
|
235
|
+
try {
|
|
236
|
+
await access(path);
|
|
237
|
+
return path;
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Try the next candidate.
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
function compareByPackagePath(left, right) {
|
|
246
|
+
return left.packagePath.localeCompare(right.packagePath) || left.provider.localeCompare(right.provider);
|
|
247
|
+
}
|
|
248
|
+
function renderJson(value) {
|
|
249
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
250
|
+
}
|
|
251
|
+
function renderInlineJson(value) {
|
|
252
|
+
return JSON.stringify(value, null, 2);
|
|
253
|
+
}
|
|
254
|
+
function isRecord(value) {
|
|
255
|
+
return value !== null && typeof value === "object";
|
|
256
|
+
}
|
|
257
|
+
function errorMessage(error) {
|
|
258
|
+
return error instanceof Error ? error.message : String(error);
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=catalog-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-generator.js","sourceRoot":"","sources":["../../../src/writeback-paths/catalog-generator.ts"],"names":[],"mappings":"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"}
|