@lovision/plugin-dev 1.0.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 +49 -0
- package/dist/build.d.ts +16 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +108 -0
- package/dist/build.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +123 -0
- package/dist/cli.js.map +1 -0
- package/dist/create-plugin.d.ts +19 -0
- package/dist/create-plugin.d.ts.map +1 -0
- package/dist/create-plugin.js +186 -0
- package/dist/create-plugin.js.map +1 -0
- package/dist/dev.d.ts +13 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +206 -0
- package/dist/dev.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/publish.d.ts +15 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +55 -0
- package/dist/publish.js.map +1 -0
- package/dist/shared.d.ts +93 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +436 -0
- package/dist/shared.js.map +1 -0
- package/dist/templates/ai-layout-assistant/README.md.template +24 -0
- package/dist/templates/ai-layout-assistant/eslint.config.mjs +19 -0
- package/dist/templates/ai-layout-assistant/manifest.json.template +38 -0
- package/dist/templates/ai-layout-assistant/package.json.template +18 -0
- package/dist/templates/ai-layout-assistant/src/main.ts.template +345 -0
- package/dist/templates/ai-layout-assistant/tsconfig.json +14 -0
- package/dist/templates/ai-layout-assistant/ui.html.template +114 -0
- package/dist/templates/asset-browser/README.md.template +24 -0
- package/dist/templates/asset-browser/eslint.config.mjs +19 -0
- package/dist/templates/asset-browser/manifest.json.template +29 -0
- package/dist/templates/asset-browser/package.json.template +18 -0
- package/dist/templates/asset-browser/src/main.ts.template +177 -0
- package/dist/templates/asset-browser/tsconfig.json +14 -0
- package/dist/templates/asset-browser/ui.html.template +137 -0
- package/dist/templates/base/README.md.template +34 -0
- package/dist/templates/base/eslint.config.mjs +19 -0
- package/dist/templates/base/manifest.json.template +22 -0
- package/dist/templates/base/package.json.template +18 -0
- package/dist/templates/base/src/main.ts.template +20 -0
- package/dist/templates/base/tsconfig.json +14 -0
- package/dist/templates/batch-layout-organizer/README.md.template +24 -0
- package/dist/templates/batch-layout-organizer/eslint.config.mjs +19 -0
- package/dist/templates/batch-layout-organizer/manifest.json.template +31 -0
- package/dist/templates/batch-layout-organizer/package.json.template +18 -0
- package/dist/templates/batch-layout-organizer/src/main.ts.template +324 -0
- package/dist/templates/batch-layout-organizer/tsconfig.json +14 -0
- package/dist/templates/batch-layout-organizer/ui.html.template +116 -0
- package/dist/templates/data-filler-full/README.md.template +32 -0
- package/dist/templates/data-filler-full/eslint.config.mjs +19 -0
- package/dist/templates/data-filler-full/manifest.json.template +31 -0
- package/dist/templates/data-filler-full/package.json.template +18 -0
- package/dist/templates/data-filler-full/src/main.ts.template +412 -0
- package/dist/templates/data-filler-full/tsconfig.json +14 -0
- package/dist/templates/data-filler-full/ui.html.template +221 -0
- package/dist/templates/data-filler-lite/README.md.template +47 -0
- package/dist/templates/data-filler-lite/eslint.config.mjs +19 -0
- package/dist/templates/data-filler-lite/manifest.json.template +29 -0
- package/dist/templates/data-filler-lite/package.json.template +18 -0
- package/dist/templates/data-filler-lite/src/main.ts.template +222 -0
- package/dist/templates/data-filler-lite/tsconfig.json +14 -0
- package/dist/templates/data-filler-lite/ui.html.template +180 -0
- package/dist/templates/design-lint-panel/README.md.template +33 -0
- package/dist/templates/design-lint-panel/eslint.config.mjs +19 -0
- package/dist/templates/design-lint-panel/manifest.json.template +29 -0
- package/dist/templates/design-lint-panel/package.json.template +18 -0
- package/dist/templates/design-lint-panel/src/main.ts.template +221 -0
- package/dist/templates/design-lint-panel/tsconfig.json +14 -0
- package/dist/templates/design-lint-panel/ui.html.template +172 -0
- package/dist/templates/export-selection/README.md.template +26 -0
- package/dist/templates/export-selection/eslint.config.mjs +19 -0
- package/dist/templates/export-selection/manifest.json.template +31 -0
- package/dist/templates/export-selection/package.json.template +18 -0
- package/dist/templates/export-selection/src/main.ts.template +386 -0
- package/dist/templates/export-selection/tsconfig.json +14 -0
- package/dist/templates/export-selection/ui.html.template +163 -0
- package/dist/templates/review-submitter/README.md.template +24 -0
- package/dist/templates/review-submitter/eslint.config.mjs +19 -0
- package/dist/templates/review-submitter/manifest.json.template +35 -0
- package/dist/templates/review-submitter/package.json.template +18 -0
- package/dist/templates/review-submitter/src/main.ts.template +306 -0
- package/dist/templates/review-submitter/tsconfig.json +14 -0
- package/dist/templates/review-submitter/ui.html.template +114 -0
- package/dist/validate.d.ts +8 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +42 -0
- package/dist/validate.js.map +1 -0
- package/package.json +46 -0
package/dist/shared.js
ADDED
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { constants as fsConstants } from "node:fs";
|
|
3
|
+
import { access, mkdir, readdir, readFile, realpath } from "node:fs/promises";
|
|
4
|
+
import { basename, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
6
|
+
export class ToolingError extends Error {
|
|
7
|
+
diagnostics;
|
|
8
|
+
constructor(message, diagnostics) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.diagnostics = diagnostics;
|
|
11
|
+
this.name = "ToolingError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export const PACKAGE_ROOT = fileURLToPath(new URL("..", import.meta.url));
|
|
15
|
+
export const TEMPLATE_ROOT = fileURLToPath(new URL("./templates/base", import.meta.url));
|
|
16
|
+
export const TEMPLATE_ROOTS = {
|
|
17
|
+
"ai-layout-assistant": fileURLToPath(new URL("./templates/ai-layout-assistant", import.meta.url)),
|
|
18
|
+
"asset-browser": fileURLToPath(new URL("./templates/asset-browser", import.meta.url)),
|
|
19
|
+
base: TEMPLATE_ROOT,
|
|
20
|
+
"batch-layout-organizer": fileURLToPath(new URL("./templates/batch-layout-organizer", import.meta.url)),
|
|
21
|
+
"data-filler-full": fileURLToPath(new URL("./templates/data-filler-full", import.meta.url)),
|
|
22
|
+
"data-filler-lite": fileURLToPath(new URL("./templates/data-filler-lite", import.meta.url)),
|
|
23
|
+
"design-lint-panel": fileURLToPath(new URL("./templates/design-lint-panel", import.meta.url)),
|
|
24
|
+
"export-selection": fileURLToPath(new URL("./templates/export-selection", import.meta.url)),
|
|
25
|
+
"review-submitter": fileURLToPath(new URL("./templates/review-submitter", import.meta.url)),
|
|
26
|
+
};
|
|
27
|
+
export const WORKSPACE_PLUGIN_SDK_ROOT = fileURLToPath(new URL("../../plugin-sdk", import.meta.url));
|
|
28
|
+
export const WORKSPACE_PLUGIN_SPEC_ROOT = fileURLToPath(new URL("../../plugin-spec", import.meta.url));
|
|
29
|
+
export const WORKSPACE_ENGINE_ROOT = fileURLToPath(new URL("../../engine", import.meta.url));
|
|
30
|
+
export const WORKSPACE_UTILS_ROOT = fileURLToPath(new URL("../../utils", import.meta.url));
|
|
31
|
+
export const DEFAULT_MANIFEST_FILE = "manifest.json";
|
|
32
|
+
export const DEFAULT_SOURCE_ENTRY_FILE = "src/main.ts";
|
|
33
|
+
export const DEFAULT_MANIFEST_ROUTE = "/manifest.json";
|
|
34
|
+
export const DEFAULT_MAIN_ROUTE = "/dist/main.js";
|
|
35
|
+
export const DEFAULT_HOST = "localhost";
|
|
36
|
+
export function resolvePluginProjectPaths(projectRoot = process.cwd()) {
|
|
37
|
+
const root = resolve(projectRoot);
|
|
38
|
+
return {
|
|
39
|
+
projectRoot: root,
|
|
40
|
+
manifestPath: join(root, DEFAULT_MANIFEST_FILE),
|
|
41
|
+
sourceEntryPath: join(root, DEFAULT_SOURCE_ENTRY_FILE),
|
|
42
|
+
distDir: join(root, "dist"),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export async function ensurePluginProjectExists(projectRoot = process.cwd()) {
|
|
46
|
+
const paths = resolvePluginProjectPaths(projectRoot);
|
|
47
|
+
await assertPathExists(paths.manifestPath, "manifest.json");
|
|
48
|
+
await assertPathExists(paths.sourceEntryPath, "src/main.ts");
|
|
49
|
+
return paths;
|
|
50
|
+
}
|
|
51
|
+
export async function assertPathExists(filePath, label) {
|
|
52
|
+
try {
|
|
53
|
+
await access(filePath, fsConstants.F_OK);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new ToolingError(`Missing ${label}`, [
|
|
57
|
+
{
|
|
58
|
+
severity: "error",
|
|
59
|
+
path: filePath,
|
|
60
|
+
message: `${label} not found`,
|
|
61
|
+
},
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function ensureDirectory(directoryPath) {
|
|
66
|
+
await mkdir(directoryPath, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
export async function readTextFile(filePath) {
|
|
69
|
+
return await readFile(filePath, "utf8");
|
|
70
|
+
}
|
|
71
|
+
export function parseJsonText(text, sourceLabel) {
|
|
72
|
+
let parsed;
|
|
73
|
+
try {
|
|
74
|
+
parsed = JSON.parse(text);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
78
|
+
throw new ToolingError(`Invalid JSON in ${sourceLabel}`, [
|
|
79
|
+
{
|
|
80
|
+
severity: "error",
|
|
81
|
+
path: sourceLabel,
|
|
82
|
+
message,
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
if (parsed == null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
87
|
+
throw new ToolingError(`Invalid JSON root in ${sourceLabel}`, [
|
|
88
|
+
{
|
|
89
|
+
severity: "error",
|
|
90
|
+
path: sourceLabel,
|
|
91
|
+
message: "JSON root must be a plain object",
|
|
92
|
+
},
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
return parsed;
|
|
96
|
+
}
|
|
97
|
+
export function tryParseJsonText(text) {
|
|
98
|
+
try {
|
|
99
|
+
const parsed = JSON.parse(text);
|
|
100
|
+
if (parsed == null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return parsed;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function readOptionalUiEntry(manifest) {
|
|
110
|
+
const uiEntry = manifest.ui;
|
|
111
|
+
if (uiEntry === undefined)
|
|
112
|
+
return null;
|
|
113
|
+
if (typeof uiEntry !== "string" ||
|
|
114
|
+
uiEntry.length === 0 ||
|
|
115
|
+
uiEntry.trim().length === 0) {
|
|
116
|
+
throw new ToolingError("Invalid manifest.ui", [
|
|
117
|
+
{
|
|
118
|
+
severity: "error",
|
|
119
|
+
path: "manifest.ui",
|
|
120
|
+
message: "manifest.ui must be a non-empty string",
|
|
121
|
+
},
|
|
122
|
+
]);
|
|
123
|
+
}
|
|
124
|
+
return uiEntry;
|
|
125
|
+
}
|
|
126
|
+
export function resolveProjectResourceRoute(resourceEntry) {
|
|
127
|
+
const parsed = parseRelativeResourceEntry(resourceEntry);
|
|
128
|
+
return parsed.route;
|
|
129
|
+
}
|
|
130
|
+
export async function resolveProjectResourcePath(projectRoot, resourceEntry) {
|
|
131
|
+
const parsed = parseRelativeResourceEntry(resourceEntry);
|
|
132
|
+
const root = resolve(projectRoot);
|
|
133
|
+
const resourcePath = resolve(root, parsed.filesystemPath);
|
|
134
|
+
assertPathInsideRoot(root, resourcePath, resourceEntry);
|
|
135
|
+
let rootRealPath;
|
|
136
|
+
let resourceRealPath;
|
|
137
|
+
try {
|
|
138
|
+
[rootRealPath, resourceRealPath] = await Promise.all([
|
|
139
|
+
realpath(root),
|
|
140
|
+
realpath(resourcePath),
|
|
141
|
+
]);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
throwUnreadableResourceError(resourceEntry);
|
|
145
|
+
}
|
|
146
|
+
assertPathInsideRoot(rootRealPath, resourceRealPath, resourceEntry);
|
|
147
|
+
return resourceRealPath;
|
|
148
|
+
}
|
|
149
|
+
export async function readProjectResourceText(projectRoot, resourceEntry) {
|
|
150
|
+
const resourcePath = await resolveProjectResourcePath(projectRoot, resourceEntry);
|
|
151
|
+
try {
|
|
152
|
+
return await readFile(resourcePath, "utf8");
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
throwUnreadableResourceError(resourceEntry);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function parseRelativeResourceEntry(resourceEntry) {
|
|
159
|
+
if (resourceEntry.startsWith("//") ||
|
|
160
|
+
resourceEntry.startsWith("/") ||
|
|
161
|
+
resourceEntry.includes("\\") ||
|
|
162
|
+
/^[A-Za-z][A-Za-z\d+.-]*:/.test(resourceEntry)) {
|
|
163
|
+
throwResourcePathError(resourceEntry);
|
|
164
|
+
}
|
|
165
|
+
const pathEnd = findResourcePathEnd(resourceEntry);
|
|
166
|
+
const rawPath = resourceEntry.slice(0, pathEnd);
|
|
167
|
+
if (rawPath.length === 0) {
|
|
168
|
+
throwResourcePathError(resourceEntry);
|
|
169
|
+
}
|
|
170
|
+
let decodedRawPath;
|
|
171
|
+
try {
|
|
172
|
+
decodedRawPath = decodeURIComponent(rawPath);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
throwResourcePathError(resourceEntry);
|
|
176
|
+
}
|
|
177
|
+
if (decodedRawPath.startsWith("/") ||
|
|
178
|
+
decodedRawPath.includes("\\") ||
|
|
179
|
+
decodedRawPath.split("/").includes("..")) {
|
|
180
|
+
throwResourcePathError(resourceEntry);
|
|
181
|
+
}
|
|
182
|
+
let resolvedUrl;
|
|
183
|
+
try {
|
|
184
|
+
resolvedUrl = new URL(resourceEntry, `https://${DEFAULT_HOST}${DEFAULT_MANIFEST_ROUTE}`);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
throwResourcePathError(resourceEntry);
|
|
188
|
+
}
|
|
189
|
+
const expectedOrigin = `https://${DEFAULT_HOST}`;
|
|
190
|
+
if (resolvedUrl.origin !== expectedOrigin) {
|
|
191
|
+
throwResourcePathError(resourceEntry);
|
|
192
|
+
}
|
|
193
|
+
let decodedPathname;
|
|
194
|
+
try {
|
|
195
|
+
decodedPathname = decodeURIComponent(resolvedUrl.pathname);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
throwResourcePathError(resourceEntry);
|
|
199
|
+
}
|
|
200
|
+
const filesystemPath = decodedPathname.replace(/^\/+/, "");
|
|
201
|
+
if (filesystemPath.length === 0 ||
|
|
202
|
+
filesystemPath.includes("\\") ||
|
|
203
|
+
isAbsolute(filesystemPath)) {
|
|
204
|
+
throwResourcePathError(resourceEntry);
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
filesystemPath,
|
|
208
|
+
route: `${resolvedUrl.pathname}${resolvedUrl.search}`,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function findResourcePathEnd(resourceEntry) {
|
|
212
|
+
const queryIndex = resourceEntry.indexOf("?");
|
|
213
|
+
const hashIndex = resourceEntry.indexOf("#");
|
|
214
|
+
const indexes = [queryIndex, hashIndex].filter((index) => index >= 0);
|
|
215
|
+
return indexes.length === 0 ? resourceEntry.length : Math.min(...indexes);
|
|
216
|
+
}
|
|
217
|
+
function assertPathInsideRoot(root, resourcePath, resourceEntry) {
|
|
218
|
+
const relativePath = relative(root, resourcePath);
|
|
219
|
+
if (relativePath.length === 0 ||
|
|
220
|
+
relativePath === ".." ||
|
|
221
|
+
relativePath.startsWith(`..${sep}`) ||
|
|
222
|
+
isAbsolute(relativePath)) {
|
|
223
|
+
throwResourcePathError(resourceEntry);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function throwUnreadableResourceError(resourceEntry) {
|
|
227
|
+
throw new ToolingError("UI resource is not readable", [
|
|
228
|
+
{
|
|
229
|
+
severity: "error",
|
|
230
|
+
path: "manifest.ui",
|
|
231
|
+
message: `UI resource not found or unreadable: ${resourceEntry}`,
|
|
232
|
+
},
|
|
233
|
+
]);
|
|
234
|
+
}
|
|
235
|
+
function throwResourcePathError(resourceEntry) {
|
|
236
|
+
throw new ToolingError("Invalid UI resource path", [
|
|
237
|
+
{
|
|
238
|
+
severity: "error",
|
|
239
|
+
path: "manifest.ui",
|
|
240
|
+
message: `manifest.ui must be a relative path inside the plugin project: ${resourceEntry}`,
|
|
241
|
+
},
|
|
242
|
+
]);
|
|
243
|
+
}
|
|
244
|
+
export function computeEtag(text) {
|
|
245
|
+
return `"${createHash("sha1").update(text).digest("hex").slice(0, 12)}"`;
|
|
246
|
+
}
|
|
247
|
+
export function createCryptoRandomUuidPolyfill() {
|
|
248
|
+
return `
|
|
249
|
+
(() => {
|
|
250
|
+
const root = globalThis;
|
|
251
|
+
const cryptoLike = root.crypto ?? {};
|
|
252
|
+
if (typeof cryptoLike.randomUUID === "function") {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const hex = (value) => value.toString(16).padStart(2, "0");
|
|
257
|
+
const randomBytes = () => {
|
|
258
|
+
const bytes = new Uint8Array(16);
|
|
259
|
+
if (typeof cryptoLike.getRandomValues === "function") {
|
|
260
|
+
cryptoLike.getRandomValues(bytes);
|
|
261
|
+
return bytes;
|
|
262
|
+
}
|
|
263
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
264
|
+
bytes[index] = Math.floor(Math.random() * 256);
|
|
265
|
+
}
|
|
266
|
+
return bytes;
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
cryptoLike.randomUUID = () => {
|
|
270
|
+
const bytes = randomBytes();
|
|
271
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
272
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
273
|
+
return (
|
|
274
|
+
hex(bytes[0]) +
|
|
275
|
+
hex(bytes[1]) +
|
|
276
|
+
hex(bytes[2]) +
|
|
277
|
+
hex(bytes[3]) +
|
|
278
|
+
"-" +
|
|
279
|
+
hex(bytes[4]) +
|
|
280
|
+
hex(bytes[5]) +
|
|
281
|
+
"-" +
|
|
282
|
+
hex(bytes[6]) +
|
|
283
|
+
hex(bytes[7]) +
|
|
284
|
+
"-" +
|
|
285
|
+
hex(bytes[8]) +
|
|
286
|
+
hex(bytes[9]) +
|
|
287
|
+
"-" +
|
|
288
|
+
hex(bytes[10]) +
|
|
289
|
+
hex(bytes[11]) +
|
|
290
|
+
hex(bytes[12]) +
|
|
291
|
+
hex(bytes[13]) +
|
|
292
|
+
hex(bytes[14]) +
|
|
293
|
+
hex(bytes[15])
|
|
294
|
+
);
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
if (root.crypto === undefined) {
|
|
298
|
+
root.crypto = cryptoLike;
|
|
299
|
+
}
|
|
300
|
+
})();
|
|
301
|
+
`.trim();
|
|
302
|
+
}
|
|
303
|
+
export function manifestDiagnosticToToolDiagnostic(diagnostic) {
|
|
304
|
+
return {
|
|
305
|
+
severity: diagnostic.severity,
|
|
306
|
+
path: formatPath(diagnostic.path),
|
|
307
|
+
message: diagnostic.message,
|
|
308
|
+
code: diagnostic.code,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
export function formatPath(path) {
|
|
312
|
+
if (path.length === 0)
|
|
313
|
+
return "<root>";
|
|
314
|
+
return path
|
|
315
|
+
.map((part, index) => typeof part === "number" ? `[${part}]` : index === 0 ? part : `.${part}`)
|
|
316
|
+
.join("");
|
|
317
|
+
}
|
|
318
|
+
export function sanitizePackageName(input) {
|
|
319
|
+
const normalized = input
|
|
320
|
+
.trim()
|
|
321
|
+
.toLowerCase()
|
|
322
|
+
.replace(/[^a-z0-9._-]+/g, "-")
|
|
323
|
+
.replace(/^-+|-+$/g, "");
|
|
324
|
+
return normalized.length > 0 ? normalized : "instinct-plugin";
|
|
325
|
+
}
|
|
326
|
+
export function sanitizePluginId(input) {
|
|
327
|
+
const slug = sanitizePackageName(input).replace(/[^a-z0-9._-]+/g, "-");
|
|
328
|
+
return `com.example.${slug}`;
|
|
329
|
+
}
|
|
330
|
+
export function titleCaseSlug(input) {
|
|
331
|
+
return sanitizePackageName(input)
|
|
332
|
+
.split(/[-_.]+/)
|
|
333
|
+
.filter((part) => part.length > 0)
|
|
334
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
335
|
+
.join(" ");
|
|
336
|
+
}
|
|
337
|
+
export function sanitizeFileStem(input) {
|
|
338
|
+
return input.replace(/[^a-zA-Z0-9._-]+/g, "-");
|
|
339
|
+
}
|
|
340
|
+
export async function directoryHasEntries(directoryPath) {
|
|
341
|
+
try {
|
|
342
|
+
const entries = await readdir(directoryPath);
|
|
343
|
+
return entries.length > 0;
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
export function toFileDependencySpecifier(_fromDirectory, absoluteDependencyPath) {
|
|
350
|
+
return pathToFileURL(resolve(absoluteDependencyPath)).href;
|
|
351
|
+
}
|
|
352
|
+
export function buildTemplateTokens(opts) {
|
|
353
|
+
const localSupportDeps = opts.pluginHostSpec.length === 0 || opts.pluginSpecSpec.length === 0
|
|
354
|
+
? ""
|
|
355
|
+
: `,\n "@lovision/plugin-host": "${opts.pluginHostSpec}",\n "@lovision/plugin-spec": "${opts.pluginSpecSpec}"`;
|
|
356
|
+
const localOverrides = opts.engineSpec.length === 0 ||
|
|
357
|
+
opts.pluginHostSpec.length === 0 ||
|
|
358
|
+
opts.pluginSdkSpec.length === 0 ||
|
|
359
|
+
opts.pluginSpecSpec.length === 0 ||
|
|
360
|
+
opts.utilsSpec.length === 0
|
|
361
|
+
? ""
|
|
362
|
+
: `,\n "overrides": {\n "@lovision/engine": "${opts.engineSpec}",\n "@lovision/plugin-host": "${opts.pluginHostSpec}",\n "@lovision/plugin-sdk": "${opts.pluginSdkSpec}",\n "@lovision/plugin-spec": "${opts.pluginSpecSpec}",\n "@lovision/utils": "${opts.utilsSpec}"\n }`;
|
|
363
|
+
return {
|
|
364
|
+
__PACKAGE_NAME__: opts.packageName,
|
|
365
|
+
__PLUGIN_ID__: opts.pluginId,
|
|
366
|
+
__PLUGIN_NAME_EN__: opts.pluginNameEn,
|
|
367
|
+
__PLUGIN_NAME_ZH__: opts.pluginNameZh,
|
|
368
|
+
__COMMAND_NAME_EN__: opts.commandNameEn,
|
|
369
|
+
__COMMAND_NAME_ZH__: opts.commandNameZh,
|
|
370
|
+
__ENGINE_SPEC__: opts.engineSpec,
|
|
371
|
+
__PLUGIN_SDK_SPEC__: opts.pluginSdkSpec,
|
|
372
|
+
__PLUGIN_DEV_SPEC__: opts.pluginDevSpec,
|
|
373
|
+
__LOCAL_SUPPORT_DEPS__: localSupportDeps,
|
|
374
|
+
__LOCAL_OVERRIDES__: localOverrides,
|
|
375
|
+
__UTILS_SPEC__: opts.utilsSpec,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
export function renderTemplate(source, tokens) {
|
|
379
|
+
return Object.entries(tokens).reduce((current, [needle, value]) => current.replaceAll(needle, value), source);
|
|
380
|
+
}
|
|
381
|
+
export function toOutputTemplatePath(templatePath) {
|
|
382
|
+
return templatePath.endsWith(".template")
|
|
383
|
+
? templatePath.slice(0, -".template".length)
|
|
384
|
+
: templatePath;
|
|
385
|
+
}
|
|
386
|
+
export function printDiagnostics(diagnostics) {
|
|
387
|
+
for (const diagnostic of diagnostics) {
|
|
388
|
+
const prefix = diagnostic.code != null
|
|
389
|
+
? `[${diagnostic.severity}] ${diagnostic.code}`
|
|
390
|
+
: `[${diagnostic.severity}]`;
|
|
391
|
+
console.error(`${prefix} ${diagnostic.path}: ${diagnostic.message}`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
export async function collectTemplateFiles(root) {
|
|
395
|
+
const out = [];
|
|
396
|
+
const queue = [root];
|
|
397
|
+
while (queue.length > 0) {
|
|
398
|
+
const current = queue.shift();
|
|
399
|
+
if (!current)
|
|
400
|
+
continue;
|
|
401
|
+
const entries = await readdir(current, { withFileTypes: true });
|
|
402
|
+
for (const entry of entries) {
|
|
403
|
+
const fullPath = join(current, entry.name);
|
|
404
|
+
if (entry.isDirectory()) {
|
|
405
|
+
queue.push(fullPath);
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
out.push(fullPath);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return out.sort((left, right) => left.localeCompare(right));
|
|
412
|
+
}
|
|
413
|
+
export function dependencySpecsForMode(targetDirectory, mode) {
|
|
414
|
+
if (mode?.kind === "file") {
|
|
415
|
+
return {
|
|
416
|
+
engineSpec: toFileDependencySpecifier(targetDirectory, resolve(WORKSPACE_ENGINE_ROOT)),
|
|
417
|
+
pluginDevSpec: toFileDependencySpecifier(targetDirectory, resolve(mode.pluginDevPath ?? PACKAGE_ROOT)),
|
|
418
|
+
pluginHostSpec: toFileDependencySpecifier(targetDirectory, resolve(mode.pluginHostPath ?? join(PACKAGE_ROOT, "..", "plugin-host"))),
|
|
419
|
+
pluginSdkSpec: toFileDependencySpecifier(targetDirectory, resolve(mode.pluginSdkPath ?? WORKSPACE_PLUGIN_SDK_ROOT)),
|
|
420
|
+
pluginSpecSpec: toFileDependencySpecifier(targetDirectory, resolve(mode.pluginSpecPath ?? WORKSPACE_PLUGIN_SPEC_ROOT)),
|
|
421
|
+
utilsSpec: toFileDependencySpecifier(targetDirectory, resolve(WORKSPACE_UTILS_ROOT)),
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
engineSpec: "",
|
|
426
|
+
pluginDevSpec: mode?.pluginDevSpec ?? "latest",
|
|
427
|
+
pluginHostSpec: mode?.pluginHostSpec ?? "",
|
|
428
|
+
pluginSdkSpec: mode?.pluginSdkSpec ?? "latest",
|
|
429
|
+
pluginSpecSpec: mode?.pluginSpecSpec ?? "",
|
|
430
|
+
utilsSpec: "",
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
export function packageNameFromTarget(targetDirectory) {
|
|
434
|
+
return sanitizePackageName(basename(resolve(targetDirectory)));
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# AI Layout Assistant
|
|
2
|
+
|
|
3
|
+
This acceptance template asks the host integration bridge for a layout suggestion with `ctx.integrations.invoke`, then applies the returned card layout through `ctx.nodes.create`. The plugin receives only structured suggestion data from the host and never handles raw AI credentials.
|
|
4
|
+
|
|
5
|
+
## Development
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run dev
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Copy the printed `manifestUrl=...`, open the editor shell, then use Dev Panel -> Development -> Add by URL.
|
|
13
|
+
|
|
14
|
+
## Use
|
|
15
|
+
|
|
16
|
+
Run **Open AI Layout Assistant**, then click **Analyze layout** to request a host-side `ai.layout/suggest-layout` result. Click **Apply suggestion** to create visible cards on the canvas with `ctx.nodes.create`.
|
|
17
|
+
|
|
18
|
+
## Formal install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm run build
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Upload the generated `dist/*.bundle.json` through Dev Panel -> Formal install, confirm the install dialog, then run the command from MainMenu.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import pluginSdkConfig from "@lovision/plugin-sdk/eslint-config";
|
|
2
|
+
import tsParser from "@typescript-eslint/parser";
|
|
3
|
+
|
|
4
|
+
const pluginFiles = ["src/**/*.ts"];
|
|
5
|
+
|
|
6
|
+
export default [
|
|
7
|
+
{
|
|
8
|
+
files: pluginFiles,
|
|
9
|
+
languageOptions: {
|
|
10
|
+
parser: tsParser,
|
|
11
|
+
ecmaVersion: "latest",
|
|
12
|
+
sourceType: "module",
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
...pluginSdkConfig.map((entry) => ({
|
|
16
|
+
...entry,
|
|
17
|
+
files: pluginFiles,
|
|
18
|
+
})),
|
|
19
|
+
];
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "__PLUGIN_ID__",
|
|
3
|
+
"name": {
|
|
4
|
+
"en": "AI Layout Assistant",
|
|
5
|
+
"zh-CN": "AI Layout Assistant"
|
|
6
|
+
},
|
|
7
|
+
"version": "0.1.0",
|
|
8
|
+
"apiVersion": "1.0",
|
|
9
|
+
"editorType": ["design"],
|
|
10
|
+
"main": "./dist/main.js",
|
|
11
|
+
"ui": "./ui.html",
|
|
12
|
+
"documentAccess": "current-page",
|
|
13
|
+
"permissions": [
|
|
14
|
+
"document:read",
|
|
15
|
+
"document:write.create",
|
|
16
|
+
"integration:invoke",
|
|
17
|
+
"notify",
|
|
18
|
+
"selection:read",
|
|
19
|
+
"ui:panel"
|
|
20
|
+
],
|
|
21
|
+
"integrationAccess": {
|
|
22
|
+
"allowedOperations": [
|
|
23
|
+
{
|
|
24
|
+
"integrationId": "ai.layout",
|
|
25
|
+
"operations": ["suggest-layout"]
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"commands": [
|
|
30
|
+
{
|
|
31
|
+
"id": "run",
|
|
32
|
+
"name": {
|
|
33
|
+
"en": "__COMMAND_NAME_EN__",
|
|
34
|
+
"zh-CN": "__COMMAND_NAME_ZH__"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "__PACKAGE_NAME__",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "plugin-dev dev",
|
|
7
|
+
"build": "plugin-dev build",
|
|
8
|
+
"validate": "plugin-dev validate",
|
|
9
|
+
"lint": "eslint src --max-warnings=0"
|
|
10
|
+
},
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"@lovision/plugin-dev": "__PLUGIN_DEV_SPEC__",
|
|
13
|
+
"@lovision/plugin-sdk": "__PLUGIN_SDK_SPEC__"__LOCAL_SUPPORT_DEPS__,
|
|
14
|
+
"@typescript-eslint/parser": "^8.30.0",
|
|
15
|
+
"eslint": "^9.25.1",
|
|
16
|
+
"typescript": "^5.8.3"
|
|
17
|
+
}__LOCAL_OVERRIDES__
|
|
18
|
+
}
|