@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/README.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# @lovision/plugin-dev
|
|
2
|
+
|
|
3
|
+
Local development toolchain for Instinct plugins.
|
|
4
|
+
|
|
5
|
+
Provides:
|
|
6
|
+
|
|
7
|
+
- `plugin-dev dev`
|
|
8
|
+
- serves `manifest.json` and the built worker bundle over local HTTPS
|
|
9
|
+
- compatible with the existing sideload/session flow
|
|
10
|
+
- `plugin-dev build`
|
|
11
|
+
- emits a single-file bundle JSON accepted by the host upload flow
|
|
12
|
+
- `plugin-dev validate`
|
|
13
|
+
- runs manifest and bundle validation with actionable diagnostics
|
|
14
|
+
- `create-instinct-plugin`
|
|
15
|
+
- scaffolds a starter plugin project
|
|
16
|
+
|
|
17
|
+
This package is tooling-only. Worker runtime APIs stay in
|
|
18
|
+
`@lovision/plugin-sdk`.
|
|
19
|
+
|
|
20
|
+
Task-first external-developer guides live under:
|
|
21
|
+
|
|
22
|
+
- [`docs/plugin-system-guides/external-developers/README.md`](../../docs/plugin-system-guides/external-developers/README.md)
|
|
23
|
+
- [`Getting Started`](../../docs/plugin-system-guides/external-developers/getting-started.md)
|
|
24
|
+
- [`Manifest, Permissions, and Network Allowlist`](../../docs/plugin-system-guides/external-developers/manifest-permissions-and-network.md)
|
|
25
|
+
- [`Diagnostics: Lanes, Rows, and Traces`](../../docs/plugin-system-guides/external-developers/diagnostics.md)
|
|
26
|
+
|
|
27
|
+
## Typical flow
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
create-instinct-plugin my-plugin
|
|
31
|
+
cd my-plugin
|
|
32
|
+
npm install
|
|
33
|
+
bun run dev
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The `dev` command prints a `manifestUrl` that can be added through the editor's
|
|
37
|
+
plugin development surface.
|
|
38
|
+
|
|
39
|
+
To build a formal-installable artifact:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
bun run build
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
To validate the current project:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
bun run validate
|
|
49
|
+
```
|
package/dist/build.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type PluginBundle } from "@lovision/plugin-spec";
|
|
2
|
+
import { type ToolDiagnostic } from "./shared.js";
|
|
3
|
+
export type BuildPluginBundleOptions = {
|
|
4
|
+
outfile?: string;
|
|
5
|
+
projectRoot?: string;
|
|
6
|
+
write?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type BuildPluginBundleResult = {
|
|
9
|
+
bundle: PluginBundle;
|
|
10
|
+
outputFile: string | null;
|
|
11
|
+
warnings: readonly ToolDiagnostic[];
|
|
12
|
+
};
|
|
13
|
+
export declare function buildPluginBundle(options?: BuildPluginBundleOptions): Promise<BuildPluginBundleResult>;
|
|
14
|
+
export declare function buildMainBundleSource(entrypointPath: string): Promise<string>;
|
|
15
|
+
export declare function buildRuntimeSource(entrypointPath: string): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,YAAY,EAGlB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAQL,KAAK,cAAc,EAEpB,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACrC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CA4DlC;AAED,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,wBAAsB,kBAAkB,CACtC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAyDjB"}
|
package/dist/build.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { loadBundle } from "@lovision/plugin-host";
|
|
7
|
+
import { SUPPORTED_PACKAGE_FORMAT, SUPPORTED_PACKAGE_FORMAT_V2, } from "@lovision/plugin-spec";
|
|
8
|
+
import { createCryptoRandomUuidPolyfill, ensurePluginProjectExists, manifestDiagnosticToToolDiagnostic, parseJsonText, readOptionalUiEntry, readProjectResourceText, sanitizeFileStem, ToolingError, } from "./shared.js";
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
export async function buildPluginBundle(options = {}) {
|
|
11
|
+
const paths = await ensurePluginProjectExists(options.projectRoot);
|
|
12
|
+
const manifestText = await Bun.file(paths.manifestPath).text();
|
|
13
|
+
const manifest = parseJsonText(manifestText, "manifest.json");
|
|
14
|
+
const mainBundleSource = await buildMainBundleSource(paths.sourceEntryPath);
|
|
15
|
+
const uiEntry = readOptionalUiEntry(manifest);
|
|
16
|
+
const bundleCandidate = uiEntry === null
|
|
17
|
+
? {
|
|
18
|
+
packageFormat: SUPPORTED_PACKAGE_FORMAT,
|
|
19
|
+
manifest,
|
|
20
|
+
mainBundle: mainBundleSource,
|
|
21
|
+
}
|
|
22
|
+
: {
|
|
23
|
+
packageFormat: SUPPORTED_PACKAGE_FORMAT_V2,
|
|
24
|
+
manifest,
|
|
25
|
+
mainBundle: mainBundleSource,
|
|
26
|
+
uiResources: {
|
|
27
|
+
[uiEntry]: {
|
|
28
|
+
contentType: "text/html; charset=utf-8",
|
|
29
|
+
source: await readProjectResourceText(paths.projectRoot, uiEntry),
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const validation = loadBundle(bundleCandidate);
|
|
34
|
+
if (!validation.ok) {
|
|
35
|
+
throw new ToolingError("Plugin bundle validation failed", validation.errors
|
|
36
|
+
.map(manifestDiagnosticToToolDiagnostic)
|
|
37
|
+
.concat(validation.warnings.map(manifestDiagnosticToToolDiagnostic)));
|
|
38
|
+
}
|
|
39
|
+
const outputFile = options.write === false
|
|
40
|
+
? null
|
|
41
|
+
: resolve(options.outfile ??
|
|
42
|
+
join(paths.distDir, `${sanitizeFileStem(validation.manifest.id)}.bundle.json`));
|
|
43
|
+
if (outputFile) {
|
|
44
|
+
await mkdir(dirname(outputFile), { recursive: true });
|
|
45
|
+
await writeFile(outputFile, JSON.stringify(validation.bundle, null, 2), "utf8");
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
bundle: validation.bundle,
|
|
49
|
+
outputFile,
|
|
50
|
+
warnings: validation.warnings.map(manifestDiagnosticToToolDiagnostic),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function buildMainBundleSource(entrypointPath) {
|
|
54
|
+
const runtimeSource = await buildRuntimeSource(entrypointPath);
|
|
55
|
+
return `${createCryptoRandomUuidPolyfill()}\n${runtimeSource}`;
|
|
56
|
+
}
|
|
57
|
+
export async function buildRuntimeSource(entrypointPath) {
|
|
58
|
+
const outdir = await mkdtemp(join(tmpdir(), "plugin-dev-build-"));
|
|
59
|
+
const outfile = join(outdir, "main.js");
|
|
60
|
+
const projectRoot = resolve(entrypointPath, "..", "..");
|
|
61
|
+
try {
|
|
62
|
+
await execFileAsync("bun", [
|
|
63
|
+
"build",
|
|
64
|
+
"--target=browser",
|
|
65
|
+
"--format=esm",
|
|
66
|
+
"--sourcemap=none",
|
|
67
|
+
"--outfile",
|
|
68
|
+
outfile,
|
|
69
|
+
entrypointPath,
|
|
70
|
+
], {
|
|
71
|
+
cwd: projectRoot,
|
|
72
|
+
maxBuffer: 20 * 1024 * 1024,
|
|
73
|
+
});
|
|
74
|
+
return await readFile(outfile, "utf8");
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
const stderr = error != null &&
|
|
78
|
+
typeof error === "object" &&
|
|
79
|
+
"stderr" in error &&
|
|
80
|
+
typeof error.stderr === "string"
|
|
81
|
+
? error.stderr.trim()
|
|
82
|
+
: "";
|
|
83
|
+
const stdout = error != null &&
|
|
84
|
+
typeof error === "object" &&
|
|
85
|
+
"stdout" in error &&
|
|
86
|
+
typeof error.stdout === "string"
|
|
87
|
+
? error.stdout.trim()
|
|
88
|
+
: "";
|
|
89
|
+
const message = stderr.length > 0
|
|
90
|
+
? stderr
|
|
91
|
+
: stdout.length > 0
|
|
92
|
+
? stdout
|
|
93
|
+
: error instanceof Error
|
|
94
|
+
? error.message
|
|
95
|
+
: String(error);
|
|
96
|
+
throw new ToolingError("Plugin source build failed", [
|
|
97
|
+
{
|
|
98
|
+
severity: "error",
|
|
99
|
+
path: "<build>",
|
|
100
|
+
message,
|
|
101
|
+
},
|
|
102
|
+
]);
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
await rm(outdir, { force: true, recursive: true });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AASA,wBAAsB,eAAe,CACnC,IAAI,WAAwB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { buildPluginBundle } from "./build.js";
|
|
3
|
+
import { runCreatePluginCli } from "./create-plugin.js";
|
|
4
|
+
import { startPluginDevServer } from "./dev.js";
|
|
5
|
+
import { publishPluginProject } from "./publish.js";
|
|
6
|
+
import { printDiagnostics, ToolingError } from "./shared.js";
|
|
7
|
+
import { validateBundleFile, validatePluginProject } from "./validate.js";
|
|
8
|
+
export async function runPluginDevCli(args = process.argv.slice(2)) {
|
|
9
|
+
const [command, ...rest] = args;
|
|
10
|
+
switch (command) {
|
|
11
|
+
case "build":
|
|
12
|
+
await runBuildCli(rest);
|
|
13
|
+
return;
|
|
14
|
+
case "create":
|
|
15
|
+
await runCreatePluginCli(rest);
|
|
16
|
+
return;
|
|
17
|
+
case "dev":
|
|
18
|
+
await runDevCli(rest);
|
|
19
|
+
return;
|
|
20
|
+
case "publish":
|
|
21
|
+
await runPublishCli(rest);
|
|
22
|
+
return;
|
|
23
|
+
case "validate":
|
|
24
|
+
await runValidateCli(rest);
|
|
25
|
+
return;
|
|
26
|
+
default:
|
|
27
|
+
printHelp();
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function runBuildCli(args) {
|
|
32
|
+
const projectRoot = readFlag(args, "--project");
|
|
33
|
+
const outfile = readFlag(args, "--outfile");
|
|
34
|
+
const result = await buildPluginBundle({
|
|
35
|
+
outfile: outfile ?? undefined,
|
|
36
|
+
projectRoot: projectRoot ?? undefined,
|
|
37
|
+
});
|
|
38
|
+
if (result.warnings.length > 0) {
|
|
39
|
+
printDiagnostics(result.warnings);
|
|
40
|
+
}
|
|
41
|
+
if (result.outputFile) {
|
|
42
|
+
console.log(`Built bundle at ${result.outputFile}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function runDevCli(args) {
|
|
46
|
+
const host = readFlag(args, "--host");
|
|
47
|
+
const portValue = readFlag(args, "--port");
|
|
48
|
+
const projectRoot = readFlag(args, "--project");
|
|
49
|
+
const port = portValue == null || portValue.length === 0 ? undefined : Number(portValue);
|
|
50
|
+
const server = await startPluginDevServer({
|
|
51
|
+
host: host ?? undefined,
|
|
52
|
+
port,
|
|
53
|
+
projectRoot: projectRoot ?? undefined,
|
|
54
|
+
});
|
|
55
|
+
console.log(`manifestUrl=${server.manifestUrl}`);
|
|
56
|
+
console.log("Press Ctrl+C to stop.");
|
|
57
|
+
const teardown = async () => {
|
|
58
|
+
await server.close();
|
|
59
|
+
process.exit(0);
|
|
60
|
+
};
|
|
61
|
+
process.once("SIGINT", () => {
|
|
62
|
+
void teardown();
|
|
63
|
+
});
|
|
64
|
+
process.once("SIGTERM", () => {
|
|
65
|
+
void teardown();
|
|
66
|
+
});
|
|
67
|
+
await new Promise(() => undefined);
|
|
68
|
+
}
|
|
69
|
+
async function runValidateCli(args) {
|
|
70
|
+
const bundleFile = readFlag(args, "--bundle");
|
|
71
|
+
const projectRoot = readFlag(args, "--project");
|
|
72
|
+
const result = bundleFile != null
|
|
73
|
+
? await validateBundleFile(bundleFile)
|
|
74
|
+
: await validatePluginProject(projectRoot ?? undefined);
|
|
75
|
+
if (result.diagnostics.length > 0) {
|
|
76
|
+
printDiagnostics(result.diagnostics);
|
|
77
|
+
}
|
|
78
|
+
if (!result.ok) {
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log(bundleFile ? "Bundle validation passed." : "Project validation passed.");
|
|
83
|
+
}
|
|
84
|
+
async function runPublishCli(args) {
|
|
85
|
+
const projectRoot = readFlag(args, "--project");
|
|
86
|
+
const server = readFlag(args, "--server");
|
|
87
|
+
const token = readFlag(args, "--token");
|
|
88
|
+
const changelog = readFlag(args, "--changelog");
|
|
89
|
+
const result = await publishPluginProject({
|
|
90
|
+
changelog: changelog ?? undefined,
|
|
91
|
+
projectRoot: projectRoot ?? undefined,
|
|
92
|
+
server: server ?? undefined,
|
|
93
|
+
token: token ?? undefined,
|
|
94
|
+
});
|
|
95
|
+
console.log(`versionId=${result.version.id}`);
|
|
96
|
+
console.log(`status=${result.version.status}`);
|
|
97
|
+
console.log(`artifactPath=${result.version.artifact_path}`);
|
|
98
|
+
}
|
|
99
|
+
function readFlag(args, name) {
|
|
100
|
+
const index = args.indexOf(name);
|
|
101
|
+
if (index === -1)
|
|
102
|
+
return null;
|
|
103
|
+
return args[index + 1] ?? null;
|
|
104
|
+
}
|
|
105
|
+
function printHelp() {
|
|
106
|
+
console.log(`Usage:
|
|
107
|
+
plugin-dev dev [--project <dir>] [--host <host>] [--port <port>]
|
|
108
|
+
plugin-dev build [--project <dir>] [--outfile <path>]
|
|
109
|
+
plugin-dev publish [--project <dir>] [--server <url>] [--token <token>] [--changelog <text>]
|
|
110
|
+
plugin-dev validate [--project <dir>] [--bundle <file>]
|
|
111
|
+
plugin-dev create <target-directory> [--template base|data-filler-lite|design-lint-panel|batch-layout-organizer|data-filler-full|export-selection|asset-browser] [--force] [--file-deps]`);
|
|
112
|
+
}
|
|
113
|
+
if (import.meta.main) {
|
|
114
|
+
runPluginDevCli().catch((error) => {
|
|
115
|
+
if (error instanceof ToolingError) {
|
|
116
|
+
printDiagnostics(error.diagnostics);
|
|
117
|
+
process.exitCode = 1;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
throw error;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE5B,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEhC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;QACT,KAAK,KAAK;YACR,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO;QACT,KAAK,SAAS;YACZ,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO;QACT,KAAK,UAAU;YACb,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT;YACE,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAuB;IAChD,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,OAAO,EAAE,OAAO,IAAI,SAAS;QAC7B,WAAW,EAAE,WAAW,IAAI,SAAS;KACtC,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAuB;IAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,IAAI,GACR,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,IAAI,EAAE,IAAI,IAAI,SAAS;QACvB,IAAI;QACJ,WAAW,EAAE,WAAW,IAAI,SAAS;KACtC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAErC,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC1B,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QAC3B,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAuB;IACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GACV,UAAU,IAAI,IAAI;QAChB,CAAC,CAAC,MAAM,kBAAkB,CAAC,UAAU,CAAC;QACtC,CAAC,CAAC,MAAM,qBAAqB,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;IAE5D,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CACT,UAAU,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,4BAA4B,CACxE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAuB;IAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,SAAS,EAAE,SAAS,IAAI,SAAS;QACjC,WAAW,EAAE,WAAW,IAAI,SAAS;QACrC,MAAM,EAAE,MAAM,IAAI,SAAS;QAC3B,KAAK,EAAE,KAAK,IAAI,SAAS;KAC1B,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,QAAQ,CAAC,IAAuB,EAAE,IAAY;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;2LAK6K,CAAC,CAAC;AAC7L,CAAC;AAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAChC,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;YAClC,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACpC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { type DependencyMode, type PluginTemplateName } from "./shared.js";
|
|
3
|
+
export type CreatePluginProjectOptions = {
|
|
4
|
+
dependencyMode?: DependencyMode;
|
|
5
|
+
force?: boolean;
|
|
6
|
+
pluginId?: string;
|
|
7
|
+
pluginNameEn?: string;
|
|
8
|
+
pluginNameZh?: string;
|
|
9
|
+
targetDirectory: string;
|
|
10
|
+
template?: PluginTemplateName;
|
|
11
|
+
};
|
|
12
|
+
export type CreatedPluginProject = {
|
|
13
|
+
packageName: string;
|
|
14
|
+
pluginId: string;
|
|
15
|
+
projectRoot: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function createPluginProject(options: CreatePluginProjectOptions): Promise<CreatedPluginProject>;
|
|
18
|
+
export declare function runCreatePluginCli(args?: string[]): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=create-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-plugin.d.ts","sourceRoot":"","sources":["../src/create-plugin.ts"],"names":[],"mappings":";AAIA,OAAO,EAGL,KAAK,cAAc,EAInB,KAAK,kBAAkB,EASxB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,0BAA0B,GAAG;IACvC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAiE/B;AAED,wBAAsB,kBAAkB,CACtC,IAAI,WAAwB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
4
|
+
import { buildTemplateTokens, collectTemplateFiles, dependencySpecsForMode, directoryHasEntries, ensureDirectory, packageNameFromTarget, readTextFile, renderTemplate, sanitizePluginId, TEMPLATE_ROOTS, ToolingError, titleCaseSlug, toOutputTemplatePath, } from "./shared.js";
|
|
5
|
+
export async function createPluginProject(options) {
|
|
6
|
+
const projectRoot = resolve(options.targetDirectory);
|
|
7
|
+
const packageName = packageNameFromTarget(projectRoot);
|
|
8
|
+
const projectHasEntries = await directoryHasEntries(projectRoot);
|
|
9
|
+
if (projectHasEntries && !options.force) {
|
|
10
|
+
throw new ToolingError("Target directory is not empty", [
|
|
11
|
+
{
|
|
12
|
+
severity: "error",
|
|
13
|
+
path: projectRoot,
|
|
14
|
+
message: "Refusing to scaffold into a non-empty directory without --force",
|
|
15
|
+
},
|
|
16
|
+
]);
|
|
17
|
+
}
|
|
18
|
+
const pluginId = options.pluginId ?? sanitizePluginId(packageName);
|
|
19
|
+
const pluginNameEn = options.pluginNameEn ?? titleCaseSlug(packageName);
|
|
20
|
+
const pluginNameZh = options.pluginNameZh ?? `${pluginNameEn} 插件`;
|
|
21
|
+
const template = options.template ?? "base";
|
|
22
|
+
const templateRoot = TEMPLATE_ROOTS[template];
|
|
23
|
+
if (!templateRoot) {
|
|
24
|
+
throw new ToolingError("Unknown plugin template", [
|
|
25
|
+
{
|
|
26
|
+
severity: "error",
|
|
27
|
+
path: "template",
|
|
28
|
+
message: `Unsupported plugin template: ${template}`,
|
|
29
|
+
},
|
|
30
|
+
]);
|
|
31
|
+
}
|
|
32
|
+
const commandNameEn = commandNameForTemplate(template, pluginNameEn, "en");
|
|
33
|
+
const commandNameZh = commandNameForTemplate(template, pluginNameEn, "zh-CN");
|
|
34
|
+
const dependencySpecs = dependencySpecsForMode(projectRoot, options.dependencyMode);
|
|
35
|
+
const tokens = buildTemplateTokens({
|
|
36
|
+
commandNameEn,
|
|
37
|
+
commandNameZh,
|
|
38
|
+
engineSpec: dependencySpecs.engineSpec,
|
|
39
|
+
packageName,
|
|
40
|
+
pluginDevSpec: dependencySpecs.pluginDevSpec,
|
|
41
|
+
pluginHostSpec: dependencySpecs.pluginHostSpec,
|
|
42
|
+
pluginId,
|
|
43
|
+
pluginNameEn,
|
|
44
|
+
pluginNameZh,
|
|
45
|
+
pluginSdkSpec: dependencySpecs.pluginSdkSpec,
|
|
46
|
+
pluginSpecSpec: dependencySpecs.pluginSpecSpec,
|
|
47
|
+
utilsSpec: dependencySpecs.utilsSpec,
|
|
48
|
+
});
|
|
49
|
+
await ensureDirectory(projectRoot);
|
|
50
|
+
const templateFiles = await collectTemplateFiles(templateRoot);
|
|
51
|
+
for (const templateFile of templateFiles) {
|
|
52
|
+
const relativePath = relative(templateRoot, templateFile);
|
|
53
|
+
const outputPath = join(projectRoot, toOutputTemplatePath(relativePath));
|
|
54
|
+
const templateText = await readTextFile(templateFile);
|
|
55
|
+
await ensureDirectory(dirname(outputPath));
|
|
56
|
+
await writeFile(outputPath, renderTemplate(templateText, tokens), "utf8");
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
packageName,
|
|
60
|
+
pluginId,
|
|
61
|
+
projectRoot,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export async function runCreatePluginCli(args = process.argv.slice(2)) {
|
|
65
|
+
const force = args.includes("--force");
|
|
66
|
+
const fileDeps = args.includes("--file-deps");
|
|
67
|
+
const hasTemplateFlag = args.includes("--template");
|
|
68
|
+
const templateValue = readFlag(args, "--template");
|
|
69
|
+
const template = parseTemplate(templateValue, hasTemplateFlag);
|
|
70
|
+
const targetDirectory = positionalArgs(args)[0] ?? "instinct-plugin";
|
|
71
|
+
const created = await createPluginProject({
|
|
72
|
+
dependencyMode: fileDeps ? { kind: "file" } : { kind: "registry" },
|
|
73
|
+
force,
|
|
74
|
+
targetDirectory,
|
|
75
|
+
template,
|
|
76
|
+
});
|
|
77
|
+
console.log(`Created plugin project at ${created.projectRoot}`);
|
|
78
|
+
console.log(`pluginId=${created.pluginId}`);
|
|
79
|
+
}
|
|
80
|
+
function parseTemplate(value, hasTemplateFlag) {
|
|
81
|
+
if (!hasTemplateFlag)
|
|
82
|
+
return undefined;
|
|
83
|
+
if (value == null || value.length === 0 || value.startsWith("--")) {
|
|
84
|
+
throw new ToolingError("Missing plugin template", [
|
|
85
|
+
{
|
|
86
|
+
severity: "error",
|
|
87
|
+
path: "--template",
|
|
88
|
+
message: "Expected a plugin template name after --template",
|
|
89
|
+
},
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
if (value === "ai-layout-assistant" ||
|
|
93
|
+
value === "asset-browser" ||
|
|
94
|
+
value === "base" ||
|
|
95
|
+
value === "batch-layout-organizer" ||
|
|
96
|
+
value === "data-filler-full" ||
|
|
97
|
+
value === "data-filler-lite" ||
|
|
98
|
+
value === "design-lint-panel" ||
|
|
99
|
+
value === "export-selection" ||
|
|
100
|
+
value === "review-submitter") {
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
throw new ToolingError("Unknown plugin template", [
|
|
104
|
+
{
|
|
105
|
+
severity: "error",
|
|
106
|
+
path: "--template",
|
|
107
|
+
message: `Unsupported plugin template: ${value}`,
|
|
108
|
+
},
|
|
109
|
+
]);
|
|
110
|
+
}
|
|
111
|
+
function commandNameForTemplate(template, pluginNameEn, locale) {
|
|
112
|
+
if (template === "ai-layout-assistant") {
|
|
113
|
+
return locale === "zh-CN"
|
|
114
|
+
? "打开 AI Layout Assistant"
|
|
115
|
+
: "Open AI Layout Assistant";
|
|
116
|
+
}
|
|
117
|
+
if (template === "asset-browser") {
|
|
118
|
+
return locale === "zh-CN" ? "打开 Asset Browser" : "Open Asset Browser";
|
|
119
|
+
}
|
|
120
|
+
if (template === "batch-layout-organizer") {
|
|
121
|
+
return locale === "zh-CN"
|
|
122
|
+
? "打开 Batch Layout Organizer"
|
|
123
|
+
: "Open Batch Layout Organizer";
|
|
124
|
+
}
|
|
125
|
+
if (template === "data-filler-full") {
|
|
126
|
+
return locale === "zh-CN" ? "打开 Data Filler" : "Open Data Filler";
|
|
127
|
+
}
|
|
128
|
+
if (template === "data-filler-lite") {
|
|
129
|
+
return locale === "zh-CN"
|
|
130
|
+
? "打开 Data Filler Lite"
|
|
131
|
+
: "Open Data Filler Lite";
|
|
132
|
+
}
|
|
133
|
+
if (template === "design-lint-panel") {
|
|
134
|
+
return locale === "zh-CN"
|
|
135
|
+
? "打开 Design Lint Panel"
|
|
136
|
+
: "Open Design Lint Panel";
|
|
137
|
+
}
|
|
138
|
+
if (template === "export-selection") {
|
|
139
|
+
return locale === "zh-CN"
|
|
140
|
+
? "打开 Export Selection"
|
|
141
|
+
: "Open Export Selection";
|
|
142
|
+
}
|
|
143
|
+
if (template === "review-submitter") {
|
|
144
|
+
return locale === "zh-CN"
|
|
145
|
+
? "打开 Review Submitter"
|
|
146
|
+
: "Open Review Submitter";
|
|
147
|
+
}
|
|
148
|
+
return locale === "zh-CN" ? `运行 ${pluginNameEn}` : `Run ${pluginNameEn}`;
|
|
149
|
+
}
|
|
150
|
+
function readFlag(args, name) {
|
|
151
|
+
const index = args.indexOf(name);
|
|
152
|
+
if (index === -1)
|
|
153
|
+
return null;
|
|
154
|
+
return args[index + 1] ?? null;
|
|
155
|
+
}
|
|
156
|
+
function positionalArgs(args) {
|
|
157
|
+
const values = [];
|
|
158
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
159
|
+
const arg = args[index];
|
|
160
|
+
if (!arg)
|
|
161
|
+
continue;
|
|
162
|
+
if (arg === "--template") {
|
|
163
|
+
index += 1;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (arg === "--force" || arg === "--file-deps")
|
|
167
|
+
continue;
|
|
168
|
+
if (arg.startsWith("--"))
|
|
169
|
+
continue;
|
|
170
|
+
values.push(arg);
|
|
171
|
+
}
|
|
172
|
+
return values;
|
|
173
|
+
}
|
|
174
|
+
if (import.meta.main) {
|
|
175
|
+
runCreatePluginCli().catch((error) => {
|
|
176
|
+
if (error instanceof ToolingError) {
|
|
177
|
+
for (const diagnostic of error.diagnostics) {
|
|
178
|
+
console.error(`[${diagnostic.severity}] ${diagnostic.path}: ${diagnostic.message}`);
|
|
179
|
+
}
|
|
180
|
+
process.exitCode = 1;
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
throw error;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=create-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-plugin.js","sourceRoot":"","sources":["../src/create-plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/dev.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type StartPluginDevServerOptions = {
|
|
2
|
+
host?: string;
|
|
3
|
+
port?: number;
|
|
4
|
+
projectRoot?: string;
|
|
5
|
+
};
|
|
6
|
+
export type PluginDevServer = {
|
|
7
|
+
close(): Promise<void>;
|
|
8
|
+
host: string;
|
|
9
|
+
manifestUrl: string;
|
|
10
|
+
port: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function startPluginDevServer(options?: StartPluginDevServerOptions): Promise<PluginDevServer>;
|
|
13
|
+
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AAkEA,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,eAAe,CAAC,CA0D1B"}
|