@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.
- package/README.md +46 -3
- package/bin/slicemedia-devkit.js +2 -0
- package/dist/args.d.ts +10 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +48 -0
- package/dist/args.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -0
- package/dist/build.d.ts +19 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +73 -0
- package/dist/build.js.map +1 -0
- package/dist/commands.d.ts +18 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +286 -0
- package/dist/commands.js.map +1 -0
- package/dist/dev.d.ts +8 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +20 -0
- package/dist/dev.js.map +1 -0
- package/dist/discovery.d.ts +3 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +216 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +8 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +28 -0
- package/dist/output.js.map +1 -0
- package/dist/sanitize.d.ts +22 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +342 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/webflow/client.d.ts +75 -0
- package/dist/webflow/client.d.ts.map +1 -0
- package/dist/webflow/client.js +186 -0
- package/dist/webflow/client.js.map +1 -0
- package/dist/webflow/scan.d.ts +17 -0
- package/dist/webflow/scan.d.ts.map +1 -0
- package/dist/webflow/scan.js +51 -0
- package/dist/webflow/scan.js.map +1 -0
- package/package.json +48 -8
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { access, readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createServer } from "vite";
|
|
4
|
+
const sourceExtensions = new Set([".ts", ".tsx", ".js", ".mjs"]);
|
|
5
|
+
const namePattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
6
|
+
export async function discoverAddonEntries(root) {
|
|
7
|
+
const configured = await readConfig(root);
|
|
8
|
+
if (configured?.entries !== undefined) {
|
|
9
|
+
const entries = await Promise.all(configured.entries.map((entry) => normalizeConfiguredEntry(root, entry)));
|
|
10
|
+
return enrichFromExportedCatalog(root, entries);
|
|
11
|
+
}
|
|
12
|
+
const candidates = await discoverCandidates(root);
|
|
13
|
+
const entries = await Promise.all(candidates.map((input) => entryFromPath(input)));
|
|
14
|
+
return enrichFromExportedCatalog(root, entries);
|
|
15
|
+
}
|
|
16
|
+
async function enrichFromExportedCatalog(root, entries) {
|
|
17
|
+
if (entries.length === 0)
|
|
18
|
+
return entries;
|
|
19
|
+
const indexPath = path.join(root, "src", "index.ts");
|
|
20
|
+
let source;
|
|
21
|
+
try {
|
|
22
|
+
source = await readFile(indexPath, "utf8");
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (isMissing(error))
|
|
26
|
+
return entries;
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
if (!/\baddonDefinitions\b/u.test(source))
|
|
30
|
+
return entries;
|
|
31
|
+
const server = await createServer({
|
|
32
|
+
root,
|
|
33
|
+
configFile: false,
|
|
34
|
+
appType: "custom",
|
|
35
|
+
logLevel: "silent",
|
|
36
|
+
// Catalog discovery is a one-shot read. Disabling the file watcher avoids
|
|
37
|
+
// retaining project handles and bypasses platform watcher defects without
|
|
38
|
+
// changing local development or build behavior.
|
|
39
|
+
server: { middlewareMode: true, hmr: false, watch: null },
|
|
40
|
+
});
|
|
41
|
+
try {
|
|
42
|
+
const loaded = (await server.ssrLoadModule("/src/index.ts"));
|
|
43
|
+
if (!Array.isArray(loaded.addonDefinitions)) {
|
|
44
|
+
throw new Error(`${indexPath} exports addonDefinitions, but it is not an array.`);
|
|
45
|
+
}
|
|
46
|
+
const definitions = new Map();
|
|
47
|
+
for (const candidate of loaded.addonDefinitions) {
|
|
48
|
+
if (!isRecord(candidate) || typeof candidate.name !== "string") {
|
|
49
|
+
throw new Error(`${indexPath} contains invalid addon metadata.`);
|
|
50
|
+
}
|
|
51
|
+
definitions.set(candidate.name, candidate);
|
|
52
|
+
}
|
|
53
|
+
return entries.map((entry) => enrichEntry(entry, definitions.get(entry.name)));
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new Error(`Cannot load addonDefinitions from ${indexPath}: ${errorMessage(error)}`, {
|
|
57
|
+
cause: error,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await server.close();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function enrichEntry(entry, definition) {
|
|
65
|
+
if (definition === undefined)
|
|
66
|
+
return entry;
|
|
67
|
+
const description = typeof definition.description === "string" ? definition.description : entry.description;
|
|
68
|
+
const placement = definition.placement === "head" || definition.placement === "body-end"
|
|
69
|
+
? definition.placement
|
|
70
|
+
: entry.placement;
|
|
71
|
+
const attributes = Array.isArray(definition.attributes)
|
|
72
|
+
? definition.attributes
|
|
73
|
+
.filter(isRecord)
|
|
74
|
+
.map((attribute) => attribute.name)
|
|
75
|
+
.filter((name) => typeof name === "string")
|
|
76
|
+
: entry.attributes;
|
|
77
|
+
const dependencies = Array.isArray(definition.dependencies)
|
|
78
|
+
? definition.dependencies
|
|
79
|
+
.filter(isRecord)
|
|
80
|
+
.map((dependency) => dependency.name)
|
|
81
|
+
.filter((name) => typeof name === "string")
|
|
82
|
+
: entry.dependencies;
|
|
83
|
+
return {
|
|
84
|
+
...entry,
|
|
85
|
+
...(typeof definition.version === "string" ? { version: definition.version } : {}),
|
|
86
|
+
description,
|
|
87
|
+
placement,
|
|
88
|
+
attributes,
|
|
89
|
+
dependencies,
|
|
90
|
+
...(isRecord(definition.defaultOptions) && !Array.isArray(definition.defaultOptions)
|
|
91
|
+
? { defaultOptions: definition.defaultOptions }
|
|
92
|
+
: {}),
|
|
93
|
+
api: {
|
|
94
|
+
...entry.api,
|
|
95
|
+
...(typeof definition.entry === "string" ? { entry: definition.entry } : {}),
|
|
96
|
+
...(Array.isArray(definition.lifecycle) ? { lifecycle: definition.lifecycle } : {}),
|
|
97
|
+
...(Array.isArray(definition.options) ? { options: definition.options } : {}),
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async function readConfig(root) {
|
|
102
|
+
const configPath = path.join(root, "devkit.config.json");
|
|
103
|
+
try {
|
|
104
|
+
return JSON.parse(await readFile(configPath, "utf8"));
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (isMissing(error))
|
|
108
|
+
return undefined;
|
|
109
|
+
throw new Error(`Cannot read ${configPath}: ${errorMessage(error)}`, { cause: error });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function normalizeConfiguredEntry(root, entry) {
|
|
113
|
+
validateName(entry.name);
|
|
114
|
+
const input = path.resolve(root, entry.input);
|
|
115
|
+
await access(input);
|
|
116
|
+
const sidecar = await readSidecar(input);
|
|
117
|
+
return mergeEntry(entry.name, input, entry, sidecar);
|
|
118
|
+
}
|
|
119
|
+
async function discoverCandidates(root) {
|
|
120
|
+
const sourceRoot = path.join(root, "src");
|
|
121
|
+
const files = await walkIfPresent(sourceRoot);
|
|
122
|
+
return files
|
|
123
|
+
.filter((file) => {
|
|
124
|
+
const extension = path.extname(file);
|
|
125
|
+
if (!sourceExtensions.has(extension))
|
|
126
|
+
return false;
|
|
127
|
+
const relative = path.relative(sourceRoot, file).split(path.sep).join("/");
|
|
128
|
+
return (relative.startsWith("entries/") ||
|
|
129
|
+
/^[^/]+\/index\.(?:ts|tsx|js|mjs)$/.test(relative) ||
|
|
130
|
+
/(?:^|\/)addons\/[^/]+\/index\.(?:ts|tsx|js|mjs)$/.test(relative) ||
|
|
131
|
+
/(?:^|\/)addons\/[^/]+\.entry\.(?:ts|tsx|js|mjs)$/.test(relative));
|
|
132
|
+
})
|
|
133
|
+
.sort((left, right) => left.localeCompare(right));
|
|
134
|
+
}
|
|
135
|
+
async function entryFromPath(input) {
|
|
136
|
+
const parsed = path.parse(input);
|
|
137
|
+
const parent = path.basename(parsed.dir);
|
|
138
|
+
const rawName = parsed.name === "index" ? parent : parsed.name.replace(/\.entry$/, "");
|
|
139
|
+
const name = kebabCase(rawName);
|
|
140
|
+
validateName(name);
|
|
141
|
+
const sidecar = await readSidecar(input);
|
|
142
|
+
return mergeEntry(name, input, {}, sidecar);
|
|
143
|
+
}
|
|
144
|
+
async function readSidecar(input) {
|
|
145
|
+
const parsed = path.parse(input);
|
|
146
|
+
const sidecarPath = parsed.name === "index"
|
|
147
|
+
? path.join(parsed.dir, "addon.json")
|
|
148
|
+
: path.join(parsed.dir, `${parsed.name.replace(/\.entry$/, "")}.addon.json`);
|
|
149
|
+
try {
|
|
150
|
+
return JSON.parse(await readFile(sidecarPath, "utf8"));
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
if (isMissing(error))
|
|
154
|
+
return {};
|
|
155
|
+
throw new Error(`Cannot read addon metadata ${sidecarPath}: ${errorMessage(error)}`, {
|
|
156
|
+
cause: error,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function mergeEntry(name, input, preferred, fallback) {
|
|
161
|
+
const metadata = { ...fallback, ...preferred };
|
|
162
|
+
return {
|
|
163
|
+
name,
|
|
164
|
+
input,
|
|
165
|
+
...(metadata.version === undefined ? {} : { version: metadata.version }),
|
|
166
|
+
description: metadata.description ?? `Reusable ${name} addon.`,
|
|
167
|
+
placement: metadata.placement ?? "body-end",
|
|
168
|
+
dependencies: metadata.dependencies ?? [],
|
|
169
|
+
attributes: metadata.attributes ?? [],
|
|
170
|
+
scriptAttributes: metadata.scriptAttributes ?? {},
|
|
171
|
+
...(metadata.defaultOptions === undefined ? {} : { defaultOptions: metadata.defaultOptions }),
|
|
172
|
+
api: metadata.api ?? { entry: name },
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
async function walkIfPresent(directory) {
|
|
176
|
+
try {
|
|
177
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
178
|
+
const nested = await Promise.all(entries.map(async (entry) => {
|
|
179
|
+
const target = path.join(directory, entry.name);
|
|
180
|
+
if (entry.isDirectory())
|
|
181
|
+
return walkIfPresent(target);
|
|
182
|
+
return entry.isFile() ? [target] : [];
|
|
183
|
+
}));
|
|
184
|
+
return nested.flat();
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (isMissing(error))
|
|
188
|
+
return [];
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function kebabCase(value) {
|
|
193
|
+
return value
|
|
194
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
195
|
+
.replace(/[^a-zA-Z0-9]+/g, "-")
|
|
196
|
+
.replace(/^-|-$/g, "")
|
|
197
|
+
.toLowerCase();
|
|
198
|
+
}
|
|
199
|
+
function validateName(name) {
|
|
200
|
+
if (!namePattern.test(name)) {
|
|
201
|
+
throw new Error(`Addon name ${JSON.stringify(name)} must use lower-case kebab-case.`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function isMissing(error) {
|
|
205
|
+
return (typeof error === "object" &&
|
|
206
|
+
error !== null &&
|
|
207
|
+
"code" in error &&
|
|
208
|
+
error.code === "ENOENT");
|
|
209
|
+
}
|
|
210
|
+
function errorMessage(error) {
|
|
211
|
+
return error instanceof Error ? error.message : String(error);
|
|
212
|
+
}
|
|
213
|
+
function isRecord(value) {
|
|
214
|
+
return typeof value === "object" && value !== null;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { runCli, type CliDependencies } from "./commands.js";
|
|
2
|
+
export { buildSiteBundle, type BuildSiteBundleOptions, type BuildSiteBundleResult, } from "./build.js";
|
|
3
|
+
export { discoverAddonEntries } from "./discovery.js";
|
|
4
|
+
export { forbiddenTermsFromEnvironment, sanitizeTree, type SanitizeFinding, type SanitizeOptions, type SanitizeResult, } from "./sanitize.js";
|
|
5
|
+
export type { AddonEntry, CommandResult } from "./types.js";
|
|
6
|
+
export { WebflowClient, WebflowHttpError, webflowOAuthTokenFromEnvironment, webflowTokenFromEnvironment, type AppliedScript, type RegisteredScript, type SiteCustomCode, type WebflowComponentProperty, type WebflowClientOptions, type WebflowSite, } from "./webflow/client.js";
|
|
7
|
+
export { parseRenderedScripts, scanApiScripts, scanRenderedScripts } from "./webflow/scan.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,6BAA6B,EAC7B,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gCAAgC,EAChC,2BAA2B,EAC3B,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { runCli } from "./commands.js";
|
|
2
|
+
export { buildSiteBundle, } from "./build.js";
|
|
3
|
+
export { discoverAddonEntries } from "./discovery.js";
|
|
4
|
+
export { forbiddenTermsFromEnvironment, sanitizeTree, } from "./sanitize.js";
|
|
5
|
+
export { WebflowClient, WebflowHttpError, webflowOAuthTokenFromEnvironment, webflowTokenFromEnvironment, } from "./webflow/client.js";
|
|
6
|
+
export { parseRenderedScripts, scanApiScripts, scanRenderedScripts } from "./webflow/scan.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAwB,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,eAAe,GAGhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,6BAA6B,EAC7B,YAAY,GAIb,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gCAAgC,EAChC,2BAA2B,GAO5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CommandResult } from "./types.js";
|
|
2
|
+
export interface OutputWriter {
|
|
3
|
+
readonly info: (message: string) => void;
|
|
4
|
+
readonly error: (message: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare const consoleWriter: OutputWriter;
|
|
7
|
+
export declare function writeResult(result: CommandResult, json: boolean, writer?: OutputWriter): void;
|
|
8
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,aAAa,EAAE,YAG3B,CAAC;AAEF,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,OAAO,EACb,MAAM,GAAE,YAA4B,GACnC,IAAI,CAWN"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const consoleWriter = {
|
|
2
|
+
info: (message) => console.info(message),
|
|
3
|
+
error: (message) => console.error(message),
|
|
4
|
+
};
|
|
5
|
+
export function writeResult(result, json, writer = consoleWriter) {
|
|
6
|
+
if (json) {
|
|
7
|
+
writer.info(JSON.stringify(result, null, 2));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const marker = result.ok ? "OK" : "ERROR";
|
|
11
|
+
writer.info(`[${marker}] ${result.summary}`);
|
|
12
|
+
if (Array.isArray(result.data)) {
|
|
13
|
+
for (const item of result.data)
|
|
14
|
+
writer.info(formatItem(item));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function formatItem(item) {
|
|
18
|
+
if (typeof item === "string")
|
|
19
|
+
return `- ${item}`;
|
|
20
|
+
if (typeof item === "object" && item !== null) {
|
|
21
|
+
const record = item;
|
|
22
|
+
const label = record.name ?? record.path ?? record.rule ?? record.operation;
|
|
23
|
+
if (typeof label === "string")
|
|
24
|
+
return `- ${label}`;
|
|
25
|
+
}
|
|
26
|
+
return `- ${JSON.stringify(item)}`;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;IACxC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;CAC3C,CAAC;AAEF,MAAM,UAAU,WAAW,CACzB,MAAqB,EACrB,IAAa,EACb,SAAuB,aAAa;IAEpC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,IAAI,EAAE,CAAC;IACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,IAA+B,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC;QAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,KAAK,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type SanitizeFindingKind = "filename" | "content" | "archive-filename" | "archive-content" | "git-history" | "unscanned";
|
|
2
|
+
export interface SanitizeFinding {
|
|
3
|
+
readonly kind: SanitizeFindingKind;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly rule: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SanitizeOptions {
|
|
8
|
+
readonly root: string;
|
|
9
|
+
readonly forbiddenTerms?: readonly string[];
|
|
10
|
+
readonly includeGitHistory?: boolean;
|
|
11
|
+
readonly additionalIgnores?: readonly string[];
|
|
12
|
+
readonly maxFileBytes?: number;
|
|
13
|
+
readonly maxArchiveEntryBytes?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface SanitizeResult {
|
|
16
|
+
readonly ok: boolean;
|
|
17
|
+
readonly scannedFiles: number;
|
|
18
|
+
readonly findings: readonly SanitizeFinding[];
|
|
19
|
+
}
|
|
20
|
+
export declare function sanitizeTree(options: SanitizeOptions): Promise<SanitizeResult>;
|
|
21
|
+
export declare function forbiddenTermsFromEnvironment(value?: string | undefined): readonly string[];
|
|
22
|
+
//# sourceMappingURL=sanitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAC7B,UAAU,GAAG,SAAS,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,aAAa,GAAG,WAAW,CAAC;AAEhG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;CAC/C;AAuDD,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAmCpF;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,GAAE,MAAM,GAAG,SAAkD,GACjE,SAAS,MAAM,EAAE,CAWnB"}
|