@slicemedia/devkit-cli 0.0.0-bootstrap.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.
Files changed (51) hide show
  1. package/README.md +46 -3
  2. package/bin/slicemedia-devkit.js +2 -0
  3. package/dist/args.d.ts +10 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +48 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +4 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/build.d.ts +19 -0
  12. package/dist/build.d.ts.map +1 -0
  13. package/dist/build.js +73 -0
  14. package/dist/build.js.map +1 -0
  15. package/dist/commands.d.ts +18 -0
  16. package/dist/commands.d.ts.map +1 -0
  17. package/dist/commands.js +286 -0
  18. package/dist/commands.js.map +1 -0
  19. package/dist/dev.d.ts +8 -0
  20. package/dist/dev.d.ts.map +1 -0
  21. package/dist/dev.js +20 -0
  22. package/dist/dev.js.map +1 -0
  23. package/dist/discovery.d.ts +3 -0
  24. package/dist/discovery.d.ts.map +1 -0
  25. package/dist/discovery.js +216 -0
  26. package/dist/discovery.js.map +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +7 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/output.d.ts +8 -0
  32. package/dist/output.d.ts.map +1 -0
  33. package/dist/output.js +28 -0
  34. package/dist/output.js.map +1 -0
  35. package/dist/sanitize.d.ts +22 -0
  36. package/dist/sanitize.d.ts.map +1 -0
  37. package/dist/sanitize.js +342 -0
  38. package/dist/sanitize.js.map +1 -0
  39. package/dist/types.d.ts +20 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/webflow/client.d.ts +75 -0
  44. package/dist/webflow/client.d.ts.map +1 -0
  45. package/dist/webflow/client.js +186 -0
  46. package/dist/webflow/client.js.map +1 -0
  47. package/dist/webflow/scan.d.ts +17 -0
  48. package/dist/webflow/scan.d.ts.map +1 -0
  49. package/dist/webflow/scan.js +51 -0
  50. package/dist/webflow/scan.js.map +1 -0
  51. package/package.json +48 -8
@@ -0,0 +1,342 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { lstat, readFile, readdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { gunzipSync, inflateRawSync } from "node:zlib";
5
+ const builtInIgnores = new Set(["node_modules", ".git"]);
6
+ const defaultMaxFileBytes = 32 * 1024 * 1024;
7
+ const defaultMaxArchiveEntryBytes = 24 * 1024 * 1024;
8
+ const maxArchiveEntries = 10_000;
9
+ const brandWords = ["slice", "media"];
10
+ const lowerCaseBrandIdentifier = brandWords.join("");
11
+ const upperCaseBrandIdentifier = lowerCaseBrandIdentifier.toUpperCase();
12
+ const titleCaseBrandWords = ["Slice", "Media"];
13
+ const brandNamingRules = [
14
+ {
15
+ name: "brand-style:invalid",
16
+ expression: new RegExp([brandWords[0], String.raw `[\s_-]*`, brandWords[1]].join(""), "gi"),
17
+ isAllowedMatch: isAllowedBrandMatch,
18
+ },
19
+ ];
20
+ const secretRules = [
21
+ {
22
+ name: "generic-secret:private-key",
23
+ expression: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/g,
24
+ },
25
+ {
26
+ name: "generic-secret:github-token",
27
+ expression: /\bgh[pousr]_[A-Za-z0-9]{30,255}\b/g,
28
+ },
29
+ {
30
+ name: "generic-secret:aws-access-key",
31
+ expression: /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/g,
32
+ },
33
+ {
34
+ name: "generic-secret:assigned-value",
35
+ expression: /\b(?:api[_-]?key|access[_-]?token|client[_-]?secret|password|private[_-]?token)\s*[:=]\s*["'][A-Za-z0-9_./+=-]{20,}["']/gi,
36
+ },
37
+ {
38
+ name: "generic-secret:bearer-token",
39
+ expression: /\bBearer\s+[A-Za-z0-9._~+/=-]{24,}\b/gi,
40
+ },
41
+ ];
42
+ export async function sanitizeTree(options) {
43
+ const root = path.resolve(options.root);
44
+ const forbiddenTerms = normalizeForbiddenTerms(options.forbiddenTerms ?? []);
45
+ const ignores = new Set([...builtInIgnores, ...(options.additionalIgnores ?? [])]);
46
+ const maxFileBytes = options.maxFileBytes ?? defaultMaxFileBytes;
47
+ const maxArchiveEntryBytes = options.maxArchiveEntryBytes ?? defaultMaxArchiveEntryBytes;
48
+ const files = await collectFiles(root, root, ignores);
49
+ const findings = [];
50
+ for (const file of files) {
51
+ const relative = normalizePath(path.relative(root, file));
52
+ findings.push(...scanName(relative, forbiddenTerms, "filename", relative));
53
+ const stat = await lstat(file);
54
+ if (stat.size > maxFileBytes) {
55
+ findings.push({ kind: "unscanned", path: relative, rule: "file-size-limit" });
56
+ continue;
57
+ }
58
+ const contents = await readFile(file);
59
+ findings.push(...scanContents(contents, forbiddenTerms, "content", relative));
60
+ findings.push(...scanArchive(relative, contents, forbiddenTerms, maxArchiveEntryBytes, 0));
61
+ }
62
+ if (options.includeGitHistory === true) {
63
+ findings.push(...scanGitHistory(root, forbiddenTerms));
64
+ }
65
+ const safeFindings = findings.map((finding) => ({
66
+ ...finding,
67
+ path: forbiddenTerms.some((term) => containsPrivateTerm(finding.path, term))
68
+ ? "[redacted-private-path]"
69
+ : finding.path,
70
+ }));
71
+ const unique = deduplicateFindings(safeFindings);
72
+ return { ok: unique.length === 0, scannedFiles: files.length, findings: unique };
73
+ }
74
+ export function forbiddenTermsFromEnvironment(value = process.env.SLICEMEDIA_FORBIDDEN_TERMS) {
75
+ if (value === undefined || value.trim() === "")
76
+ return [];
77
+ const trimmed = value.trim();
78
+ if (trimmed.startsWith("[")) {
79
+ const parsed = JSON.parse(trimmed);
80
+ if (!Array.isArray(parsed) || !parsed.every((item) => typeof item === "string")) {
81
+ throw new Error("SLICEMEDIA_FORBIDDEN_TERMS JSON must be an array of strings.");
82
+ }
83
+ return normalizeForbiddenTerms(parsed);
84
+ }
85
+ return normalizeForbiddenTerms(trimmed.split(/[\n,]/u));
86
+ }
87
+ function normalizeForbiddenTerms(terms) {
88
+ return [...new Set(terms.map((term) => term.trim()).filter(Boolean))];
89
+ }
90
+ async function collectFiles(root, directory, ignores) {
91
+ const directoryEntries = await readdir(directory, { withFileTypes: true });
92
+ const collected = await Promise.all(directoryEntries.map(async (entry) => {
93
+ if (ignores.has(entry.name))
94
+ return [];
95
+ const target = path.join(directory, entry.name);
96
+ const relativeSegments = path.relative(root, target).split(path.sep);
97
+ if (relativeSegments.some((segment) => ignores.has(segment)))
98
+ return [];
99
+ if (entry.isDirectory())
100
+ return collectFiles(root, target, ignores);
101
+ if (entry.isFile())
102
+ return [target];
103
+ return [];
104
+ }));
105
+ return collected.flat().sort((left, right) => left.localeCompare(right));
106
+ }
107
+ function scanName(name, forbiddenTerms, kind, findingPath) {
108
+ const findings = forbiddenTerms.flatMap((term, index) => containsPrivateTerm(name, term)
109
+ ? [{ kind, path: findingPath, rule: `forbidden-term:${index + 1}` }]
110
+ : []);
111
+ findings.push(...scanRules([name], brandNamingRules, kind, findingPath));
112
+ return findings;
113
+ }
114
+ function scanContents(contents, forbiddenTerms, kind, findingPath) {
115
+ const texts = binaryTextViews(contents);
116
+ const findings = [];
117
+ for (const [index, term] of forbiddenTerms.entries()) {
118
+ if (texts.some((text) => containsPrivateTerm(text, term))) {
119
+ findings.push({ kind, path: findingPath, rule: `forbidden-term:${index + 1}` });
120
+ }
121
+ }
122
+ findings.push(...scanRules(texts, brandNamingRules, kind, findingPath), ...scanRules(texts, secretRules, kind, findingPath));
123
+ return findings;
124
+ }
125
+ function containsPrivateTerm(text, term) {
126
+ const bytes = Buffer.from(term, "utf8");
127
+ const normalizedText = text.toLocaleLowerCase("en-US");
128
+ return (normalizedText.includes(term.toLocaleLowerCase("en-US")) ||
129
+ text.includes(bytes.toString("base64")) ||
130
+ normalizedText.includes(bytes.toString("hex")));
131
+ }
132
+ function scanRules(texts, rules, kind, findingPath) {
133
+ return rules.flatMap((rule) => texts.some((text) => testRule(rule, text))
134
+ ? [{ kind, path: findingPath, rule: rule.name }]
135
+ : []);
136
+ }
137
+ function binaryTextViews(contents) {
138
+ const utf8 = contents.toString("utf8");
139
+ const views = [utf8];
140
+ if (contents.includes(0)) {
141
+ views.push(contents.toString("utf16le"));
142
+ }
143
+ return views;
144
+ }
145
+ function testExpression(expression, text) {
146
+ expression.lastIndex = 0;
147
+ return expression.test(text);
148
+ }
149
+ function testRule(rule, text) {
150
+ if (rule.isAllowedMatch === undefined)
151
+ return testExpression(rule.expression, text);
152
+ rule.expression.lastIndex = 0;
153
+ let match = rule.expression.exec(text);
154
+ while (match !== null) {
155
+ if (!rule.isAllowedMatch(match[0]))
156
+ return true;
157
+ match = rule.expression.exec(text);
158
+ }
159
+ return false;
160
+ }
161
+ function isAllowedBrandMatch(value) {
162
+ if (value === lowerCaseBrandIdentifier || value === upperCaseBrandIdentifier)
163
+ return true;
164
+ const [firstWord, secondWord] = titleCaseBrandWords;
165
+ if (!value.startsWith(firstWord) || !value.endsWith(secondWord))
166
+ return false;
167
+ const separator = value.slice(firstWord.length, value.length - secondWord.length);
168
+ return /^\s+$/u.test(separator);
169
+ }
170
+ function scanArchive(archivePath, contents, forbiddenTerms, maxEntryBytes, depth) {
171
+ if (depth > 2) {
172
+ return [{ kind: "unscanned", path: archivePath, rule: "archive-depth-limit" }];
173
+ }
174
+ const extension = archivePath.toLocaleLowerCase("en-US");
175
+ let entries;
176
+ try {
177
+ if (/\.(?:zip|jar|war|whl)$/u.test(extension)) {
178
+ entries = readZipEntries(contents, maxEntryBytes);
179
+ }
180
+ else if (/\.(?:tgz|tar\.gz)$/u.test(extension)) {
181
+ entries = readTarEntries(gunzipSync(contents, { maxOutputLength: maxEntryBytes }), maxEntryBytes);
182
+ }
183
+ else if (extension.endsWith(".tar")) {
184
+ entries = readTarEntries(contents, maxEntryBytes);
185
+ }
186
+ else if (extension.endsWith(".gz")) {
187
+ entries = [
188
+ {
189
+ name: archivePath.replace(/\.gz$/iu, ""),
190
+ contents: gunzipSync(contents, { maxOutputLength: maxEntryBytes }),
191
+ },
192
+ ];
193
+ }
194
+ else {
195
+ return [];
196
+ }
197
+ }
198
+ catch {
199
+ return [{ kind: "unscanned", path: archivePath, rule: "archive-invalid" }];
200
+ }
201
+ const findings = [];
202
+ for (const entry of entries) {
203
+ const nestedPath = `${archivePath}!/${normalizePath(entry.name)}`;
204
+ findings.push(...scanName(entry.name, forbiddenTerms, "archive-filename", nestedPath));
205
+ if (entry.issue !== undefined) {
206
+ findings.push({ kind: "unscanned", path: nestedPath, rule: entry.issue });
207
+ continue;
208
+ }
209
+ if (entry.contents === undefined)
210
+ continue;
211
+ findings.push(...scanContents(entry.contents, forbiddenTerms, "archive-content", nestedPath), ...scanArchive(nestedPath, entry.contents, forbiddenTerms, maxEntryBytes, depth + 1));
212
+ }
213
+ return findings;
214
+ }
215
+ function readZipEntries(buffer, maxEntryBytes) {
216
+ const eocdOffset = findEndOfCentralDirectory(buffer);
217
+ if (eocdOffset === -1)
218
+ throw new Error("Missing ZIP directory.");
219
+ const entryCount = buffer.readUInt16LE(eocdOffset + 10);
220
+ let offset = buffer.readUInt32LE(eocdOffset + 16);
221
+ if (entryCount > maxArchiveEntries)
222
+ throw new Error("ZIP entry limit exceeded.");
223
+ const entries = [];
224
+ for (let index = 0; index < entryCount; index += 1) {
225
+ if (buffer.readUInt32LE(offset) !== 0x02014b50)
226
+ throw new Error("Invalid ZIP directory.");
227
+ const flags = buffer.readUInt16LE(offset + 8);
228
+ const method = buffer.readUInt16LE(offset + 10);
229
+ const compressedSize = buffer.readUInt32LE(offset + 20);
230
+ const uncompressedSize = buffer.readUInt32LE(offset + 24);
231
+ const nameLength = buffer.readUInt16LE(offset + 28);
232
+ const extraLength = buffer.readUInt16LE(offset + 30);
233
+ const commentLength = buffer.readUInt16LE(offset + 32);
234
+ const localOffset = buffer.readUInt32LE(offset + 42);
235
+ const name = buffer.subarray(offset + 46, offset + 46 + nameLength).toString("utf8");
236
+ offset += 46 + nameLength + extraLength + commentLength;
237
+ if (name.endsWith("/"))
238
+ continue;
239
+ if ((flags & 1) !== 0) {
240
+ entries.push({ name, issue: "archive-encrypted" });
241
+ continue;
242
+ }
243
+ if (uncompressedSize > maxEntryBytes || compressedSize > maxEntryBytes) {
244
+ entries.push({ name, issue: "archive-entry-size-limit" });
245
+ continue;
246
+ }
247
+ if (buffer.readUInt32LE(localOffset) !== 0x04034b50)
248
+ throw new Error("Invalid ZIP entry.");
249
+ const localNameLength = buffer.readUInt16LE(localOffset + 26);
250
+ const localExtraLength = buffer.readUInt16LE(localOffset + 28);
251
+ const dataOffset = localOffset + 30 + localNameLength + localExtraLength;
252
+ const compressed = buffer.subarray(dataOffset, dataOffset + compressedSize);
253
+ if (method === 0)
254
+ entries.push({ name, contents: Buffer.from(compressed) });
255
+ else if (method === 8)
256
+ entries.push({
257
+ name,
258
+ contents: inflateRawSync(compressed, { maxOutputLength: maxEntryBytes }),
259
+ });
260
+ else
261
+ entries.push({ name, issue: `archive-compression-${method}` });
262
+ }
263
+ return entries;
264
+ }
265
+ function findEndOfCentralDirectory(buffer) {
266
+ const minimum = Math.max(0, buffer.length - 65_557);
267
+ for (let offset = buffer.length - 22; offset >= minimum; offset -= 1) {
268
+ if (buffer.readUInt32LE(offset) === 0x06054b50)
269
+ return offset;
270
+ }
271
+ return -1;
272
+ }
273
+ function readTarEntries(buffer, maxEntryBytes) {
274
+ const entries = [];
275
+ let offset = 0;
276
+ while (offset + 512 <= buffer.length && entries.length < maxArchiveEntries) {
277
+ const header = buffer.subarray(offset, offset + 512);
278
+ if (header.every((byte) => byte === 0))
279
+ break;
280
+ const name = readNullTerminated(header.subarray(0, 100));
281
+ const prefix = readNullTerminated(header.subarray(345, 500));
282
+ const fullName = prefix === "" ? name : `${prefix}/${name}`;
283
+ const rawSize = readNullTerminated(header.subarray(124, 136)).trim();
284
+ const size = Number.parseInt(rawSize || "0", 8);
285
+ if (!Number.isSafeInteger(size) || size < 0)
286
+ throw new Error("Invalid TAR size.");
287
+ const type = header[156];
288
+ const dataOffset = offset + 512;
289
+ if ((type === 0 || type === 48) && fullName !== "") {
290
+ if (size > maxEntryBytes) {
291
+ entries.push({ name: fullName, issue: "archive-entry-size-limit" });
292
+ }
293
+ else {
294
+ entries.push({ name: fullName, contents: buffer.subarray(dataOffset, dataOffset + size) });
295
+ }
296
+ }
297
+ offset = dataOffset + Math.ceil(size / 512) * 512;
298
+ }
299
+ if (entries.length >= maxArchiveEntries)
300
+ throw new Error("TAR entry limit exceeded.");
301
+ return entries;
302
+ }
303
+ function readNullTerminated(buffer) {
304
+ const end = buffer.indexOf(0);
305
+ return buffer.subarray(0, end === -1 ? undefined : end).toString("utf8");
306
+ }
307
+ function scanGitHistory(root, forbiddenTerms) {
308
+ let history;
309
+ try {
310
+ // Scan publishable refs while excluding editor-owned checkpoint namespaces under refs/*.
311
+ history = execFileSync("git", [
312
+ "-C",
313
+ root,
314
+ "log",
315
+ "HEAD",
316
+ "--branches",
317
+ "--tags",
318
+ "--remotes",
319
+ "--format=commit:%H",
320
+ "--name-status",
321
+ "-p",
322
+ ], { encoding: "utf8", maxBuffer: 64 * 1024 * 1024, stdio: ["ignore", "pipe", "ignore"] });
323
+ }
324
+ catch {
325
+ return [{ kind: "unscanned", path: "git-history", rule: "git-history-unavailable" }];
326
+ }
327
+ return scanContents(Buffer.from(history), forbiddenTerms, "content", "git-history").map((finding) => ({ ...finding, kind: "git-history" }));
328
+ }
329
+ function deduplicateFindings(findings) {
330
+ const unique = new Map();
331
+ for (const finding of findings) {
332
+ unique.set(`${finding.kind}\0${finding.path}\0${finding.rule}`, finding);
333
+ }
334
+ return [...unique.values()].sort((left, right) => {
335
+ const byPath = left.path.localeCompare(right.path);
336
+ return byPath === 0 ? left.rule.localeCompare(right.rule) : byPath;
337
+ });
338
+ }
339
+ function normalizePath(value) {
340
+ return value.split(path.sep).join("/");
341
+ }
342
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export type ScriptPlacement = "head" | "body-end";
2
+ export interface AddonEntry {
3
+ readonly name: string;
4
+ readonly input: string;
5
+ readonly version?: string;
6
+ readonly description: string;
7
+ readonly placement: ScriptPlacement;
8
+ readonly dependencies: readonly string[];
9
+ readonly attributes: readonly string[];
10
+ readonly scriptAttributes: Readonly<Record<string, string>>;
11
+ readonly defaultOptions?: Readonly<Record<string, unknown>>;
12
+ readonly api: Readonly<Record<string, unknown>>;
13
+ }
14
+ export interface CommandResult<T = unknown> {
15
+ readonly ok: boolean;
16
+ readonly command: string;
17
+ readonly summary: string;
18
+ readonly data: T;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,UAAU,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ export interface Pagination {
2
+ readonly limit?: number;
3
+ readonly offset?: number;
4
+ readonly total?: number;
5
+ readonly next?: string | null;
6
+ }
7
+ export interface PaginatedResponse {
8
+ readonly pagination?: Pagination;
9
+ }
10
+ export interface WebflowComponent {
11
+ readonly id: string;
12
+ readonly name?: string;
13
+ readonly description?: string;
14
+ readonly [key: string]: unknown;
15
+ }
16
+ export interface WebflowComponentProperty {
17
+ readonly propertyId: string;
18
+ readonly label?: string;
19
+ readonly type?: string;
20
+ readonly value?: unknown;
21
+ readonly [key: string]: unknown;
22
+ }
23
+ export interface RegisteredScript {
24
+ readonly id: string;
25
+ readonly displayName: string;
26
+ readonly hostedLocation: string;
27
+ readonly version: string;
28
+ readonly integrityHash?: string;
29
+ readonly [key: string]: unknown;
30
+ }
31
+ export interface AppliedScript {
32
+ readonly id: string;
33
+ readonly location: "header" | "footer";
34
+ readonly version: string;
35
+ readonly attributes?: Readonly<Record<string, string>>;
36
+ }
37
+ export interface SiteCustomCode {
38
+ readonly scripts: readonly AppliedScript[];
39
+ readonly createdOn?: string;
40
+ readonly lastUpdated?: string;
41
+ }
42
+ export interface WebflowSite {
43
+ readonly id: string;
44
+ readonly workspaceId?: string;
45
+ readonly displayName?: string;
46
+ readonly shortName?: string;
47
+ readonly lastPublished?: string | null;
48
+ readonly lastUpdated?: string | null;
49
+ readonly [key: string]: unknown;
50
+ }
51
+ export interface WebflowClientOptions {
52
+ readonly token?: string;
53
+ readonly baseUrl?: string;
54
+ readonly fetch?: typeof fetch;
55
+ readonly retries?: number;
56
+ readonly sleep?: (milliseconds: number) => Promise<void>;
57
+ }
58
+ export declare class WebflowHttpError extends Error {
59
+ readonly status: number;
60
+ readonly responseBody: unknown;
61
+ readonly responseReceived = true;
62
+ constructor(status: number, responseBody: unknown);
63
+ }
64
+ export declare class WebflowClient {
65
+ #private;
66
+ constructor(options?: WebflowClientOptions);
67
+ listComponents(siteId: string): Promise<readonly WebflowComponent[]>;
68
+ getSite(siteId: string): Promise<WebflowSite>;
69
+ listComponentProperties(siteId: string, componentId: string): Promise<readonly WebflowComponentProperty[]>;
70
+ listRegisteredScripts(siteId: string): Promise<readonly RegisteredScript[]>;
71
+ getCustomCode(siteId: string): Promise<SiteCustomCode>;
72
+ }
73
+ export declare function webflowTokenFromEnvironment(env?: NodeJS.ProcessEnv): string;
74
+ export declare function webflowOAuthTokenFromEnvironment(env?: NodeJS.ProcessEnv): string;
75
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/webflow/client.ts"],"names":[],"mappings":"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"}