@kamaras/venpm 0.0.1 → 0.1.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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/actions/publish-index/action.yml +50 -0
  4. package/dist/cli/config-cmd.d.ts +3 -0
  5. package/dist/cli/config-cmd.d.ts.map +1 -0
  6. package/dist/cli/config-cmd.js +100 -0
  7. package/dist/cli/config-cmd.js.map +1 -0
  8. package/dist/cli/context.d.ts +6 -0
  9. package/dist/cli/context.d.ts.map +1 -0
  10. package/dist/cli/context.js +149 -0
  11. package/dist/cli/context.js.map +1 -0
  12. package/dist/cli/create.d.ts +23 -0
  13. package/dist/cli/create.d.ts.map +1 -0
  14. package/dist/cli/create.js +238 -0
  15. package/dist/cli/create.js.map +1 -0
  16. package/dist/cli/doctor.d.ts +3 -0
  17. package/dist/cli/doctor.d.ts.map +1 -0
  18. package/dist/cli/doctor.js +67 -0
  19. package/dist/cli/doctor.js.map +1 -0
  20. package/dist/cli/info.d.ts +5 -0
  21. package/dist/cli/info.d.ts.map +1 -0
  22. package/dist/cli/info.js +105 -0
  23. package/dist/cli/info.js.map +1 -0
  24. package/dist/cli/install.d.ts +5 -0
  25. package/dist/cli/install.d.ts.map +1 -0
  26. package/dist/cli/install.js +252 -0
  27. package/dist/cli/install.js.map +1 -0
  28. package/dist/cli/list.d.ts +5 -0
  29. package/dist/cli/list.d.ts.map +1 -0
  30. package/dist/cli/list.js +41 -0
  31. package/dist/cli/list.js.map +1 -0
  32. package/dist/cli/rebuild.d.ts +3 -0
  33. package/dist/cli/rebuild.d.ts.map +1 -0
  34. package/dist/cli/rebuild.js +74 -0
  35. package/dist/cli/rebuild.js.map +1 -0
  36. package/dist/cli/repo.d.ts +3 -0
  37. package/dist/cli/repo.d.ts.map +1 -0
  38. package/dist/cli/repo.js +93 -0
  39. package/dist/cli/repo.js.map +1 -0
  40. package/dist/cli/search.d.ts +5 -0
  41. package/dist/cli/search.d.ts.map +1 -0
  42. package/dist/cli/search.js +50 -0
  43. package/dist/cli/search.js.map +1 -0
  44. package/dist/cli/uninstall.d.ts +5 -0
  45. package/dist/cli/uninstall.d.ts.map +1 -0
  46. package/dist/cli/uninstall.js +69 -0
  47. package/dist/cli/uninstall.js.map +1 -0
  48. package/dist/cli/update.d.ts +5 -0
  49. package/dist/cli/update.d.ts.map +1 -0
  50. package/dist/cli/update.js +161 -0
  51. package/dist/cli/update.js.map +1 -0
  52. package/dist/cli/validate.d.ts +3 -0
  53. package/dist/cli/validate.d.ts.map +1 -0
  54. package/dist/cli/validate.js +99 -0
  55. package/dist/cli/validate.js.map +1 -0
  56. package/dist/core/builder.d.ts +31 -0
  57. package/dist/core/builder.d.ts.map +1 -0
  58. package/dist/core/builder.js +65 -0
  59. package/dist/core/builder.js.map +1 -0
  60. package/dist/core/cache.d.ts +17 -0
  61. package/dist/core/cache.d.ts.map +1 -0
  62. package/dist/core/cache.js +36 -0
  63. package/dist/core/cache.js.map +1 -0
  64. package/dist/core/config.d.ts +7 -0
  65. package/dist/core/config.d.ts.map +1 -0
  66. package/dist/core/config.js +32 -0
  67. package/dist/core/config.js.map +1 -0
  68. package/dist/core/detect.d.ts +28 -0
  69. package/dist/core/detect.d.ts.map +1 -0
  70. package/dist/core/detect.js +100 -0
  71. package/dist/core/detect.js.map +1 -0
  72. package/dist/core/fetcher.d.ts +21 -0
  73. package/dist/core/fetcher.d.ts.map +1 -0
  74. package/dist/core/fetcher.js +92 -0
  75. package/dist/core/fetcher.js.map +1 -0
  76. package/dist/core/json.d.ts +9 -0
  77. package/dist/core/json.d.ts.map +1 -0
  78. package/dist/core/json.js +10 -0
  79. package/dist/core/json.js.map +1 -0
  80. package/dist/core/lockfile.d.ts +9 -0
  81. package/dist/core/lockfile.d.ts.map +1 -0
  82. package/dist/core/lockfile.js +30 -0
  83. package/dist/core/lockfile.js.map +1 -0
  84. package/dist/core/log.d.ts +8 -0
  85. package/dist/core/log.d.ts.map +1 -0
  86. package/dist/core/log.js +24 -0
  87. package/dist/core/log.js.map +1 -0
  88. package/dist/core/paths.d.ts +4 -0
  89. package/dist/core/paths.d.ts.map +1 -0
  90. package/dist/core/paths.js +33 -0
  91. package/dist/core/paths.js.map +1 -0
  92. package/dist/core/prompt.d.ts +5 -0
  93. package/dist/core/prompt.d.ts.map +1 -0
  94. package/dist/core/prompt.js +67 -0
  95. package/dist/core/prompt.js.map +1 -0
  96. package/dist/core/registry.d.ts +52 -0
  97. package/dist/core/registry.d.ts.map +1 -0
  98. package/dist/core/registry.js +134 -0
  99. package/dist/core/registry.js.map +1 -0
  100. package/dist/core/resolver.d.ts +47 -0
  101. package/dist/core/resolver.d.ts.map +1 -0
  102. package/dist/core/resolver.js +153 -0
  103. package/dist/core/resolver.js.map +1 -0
  104. package/dist/core/schema.d.ts +8 -0
  105. package/dist/core/schema.d.ts.map +1 -0
  106. package/dist/core/schema.js +47 -0
  107. package/dist/core/schema.js.map +1 -0
  108. package/dist/core/types.d.ts +206 -0
  109. package/dist/core/types.d.ts.map +1 -0
  110. package/dist/core/types.js +3 -0
  111. package/dist/core/types.js.map +1 -0
  112. package/dist/index.d.ts +3 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +37 -0
  115. package/dist/index.js.map +1 -0
  116. package/package.json +42 -6
  117. package/schemas/v1/config.schema.json +53 -0
  118. package/schemas/v1/lockfile.schema.json +43 -0
  119. package/schemas/v1/plugins.schema.json +69 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 kamaras
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # venpm
2
+
3
+ Vencord Plugin Manager — install and manage userplugins from JSON indexes.
4
+
5
+ **Full documentation: [venpm.dev](https://venpm.dev)**
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install -g @kamaras/venpm
11
+ ```
12
+
13
+ Or run without installing:
14
+
15
+ ```bash
16
+ npx @kamaras/venpm doctor
17
+ ```
18
+
19
+ Requires Node.js 18+.
20
+
21
+ ## Quick Start
22
+
23
+ ```bash
24
+ venpm doctor # check environment
25
+ venpm config set vencord.path ~/Vencord
26
+
27
+ venpm search betterFolders # find plugins
28
+ venpm install BetterFolders # install a plugin
29
+ venpm list # list installed plugins
30
+ venpm update # update all plugins
31
+ venpm rebuild # rebuild Vencord
32
+ ```
33
+
34
+ ## For Plugin Authors
35
+
36
+ ```bash
37
+ venpm create my-plugins # scaffold a new plugin repo
38
+ venpm create my-plugins/MyPlugin # scaffold a plugin inside a repo
39
+ venpm validate plugins.json # validate your index file
40
+ ```
41
+
42
+ See [Publishing Plugins](https://venpm.dev/author/your-first-plugin) for the full walkthrough.
43
+
44
+ ## How It Works
45
+
46
+ 1. Authors publish a `plugins.json` index file ([spec](https://venpm.dev/author/plugin-index)) somewhere reachable — GitHub Releases, a raw URL, or any static host.
47
+ 2. Users add that URL with `venpm repo add <url>`.
48
+ 3. `venpm install <plugin>` resolves dependencies, fetches via git or tarball, and optionally rebuilds Vencord.
49
+
50
+ ## Development
51
+
52
+ ```bash
53
+ git clone https://github.com/theokyr/venpm.git && cd venpm
54
+ node scripts/setup.mjs
55
+ ```
56
+
57
+ ```bash
58
+ npm run dev # watch mode
59
+ npm test # 224 tests
60
+ npm run lint # type check
61
+ ```
62
+
63
+ ## License
64
+
65
+ MIT
@@ -0,0 +1,50 @@
1
+ name: "venpm Publish Index"
2
+ description: "Validate and publish a venpm plugin index as a GitHub Release"
3
+
4
+ inputs:
5
+ index-path:
6
+ description: "Path to plugins.json"
7
+ required: false
8
+ default: "plugins.json"
9
+ strict:
10
+ description: "Run strict validation (check URLs, deps)"
11
+ required: false
12
+ default: "true"
13
+
14
+ runs:
15
+ using: "composite"
16
+ steps:
17
+ - name: Setup Node.js
18
+ uses: actions/setup-node@v4
19
+ with:
20
+ node-version: "18"
21
+
22
+ - name: Validate index
23
+ shell: bash
24
+ run: |
25
+ STRICT_FLAG=""
26
+ if [ "${{ inputs.strict }}" = "true" ]; then
27
+ STRICT_FLAG="--strict"
28
+ fi
29
+ npx venpm validate "${{ inputs.index-path }}" $STRICT_FLAG
30
+
31
+ - name: Create plugin tarballs
32
+ shell: bash
33
+ run: |
34
+ PLUGINS_DIR=$(dirname "${{ inputs.index-path }}")/plugins
35
+ if [ -d "$PLUGINS_DIR" ]; then
36
+ mkdir -p dist
37
+ for plugin_dir in "$PLUGINS_DIR"/*/; do
38
+ plugin_name=$(basename "$plugin_dir")
39
+ tar -czf "dist/${plugin_name}.tar.gz" -C "$PLUGINS_DIR" "$plugin_name"
40
+ echo "Created dist/${plugin_name}.tar.gz"
41
+ done
42
+ fi
43
+
44
+ - name: Upload artifacts
45
+ uses: actions/upload-artifact@v4
46
+ with:
47
+ name: venpm-release
48
+ path: |
49
+ ${{ inputs.index-path }}
50
+ dist/*.tar.gz
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerConfigCommand(program: Command): void;
3
+ //# sourceMappingURL=config-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../src/cli/config-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgE5D"}
@@ -0,0 +1,100 @@
1
+ import { loadConfig, saveConfig } from "../core/config.js";
2
+ import { getConfigPath, getConfigDir } from "../core/paths.js";
3
+ import { jsonSuccess, jsonError, writeJson } from "../core/json.js";
4
+ import { createRealIOContext } from "./context.js";
5
+ function getNestedValue(obj, keys) {
6
+ let current = obj;
7
+ for (const key of keys) {
8
+ if (current === null || current === undefined || typeof current !== "object") {
9
+ return undefined;
10
+ }
11
+ current = current[key];
12
+ }
13
+ return current;
14
+ }
15
+ function setNestedValue(obj, keys, value) {
16
+ let current = obj;
17
+ for (let i = 0; i < keys.length - 1; i++) {
18
+ const key = keys[i];
19
+ if (current[key] === null || current[key] === undefined || typeof current[key] !== "object") {
20
+ current[key] = {};
21
+ }
22
+ current = current[key];
23
+ }
24
+ current[keys[keys.length - 1]] = value;
25
+ }
26
+ function coerceValue(raw) {
27
+ if (raw === "null")
28
+ return null;
29
+ if (raw === "true")
30
+ return true;
31
+ if (raw === "false")
32
+ return false;
33
+ // Try JSON parse for numbers/arrays/objects
34
+ try {
35
+ return JSON.parse(raw);
36
+ }
37
+ catch {
38
+ return raw;
39
+ }
40
+ }
41
+ export function registerConfigCommand(program) {
42
+ const config = program
43
+ .command("config")
44
+ .description("View or edit venpm configuration");
45
+ config
46
+ .command("set <key> <value>")
47
+ .description("Set a configuration value (dotted key path)")
48
+ .action(async (key, value) => {
49
+ const parentOpts = program.opts();
50
+ const ctx = createRealIOContext(parentOpts);
51
+ const configPath = parentOpts.config ?? getConfigPath();
52
+ const cfg = await loadConfig(ctx.fs, configPath);
53
+ const keys = key.split(".");
54
+ const coerced = coerceValue(value);
55
+ setNestedValue(cfg, keys, coerced);
56
+ await saveConfig(ctx.fs, configPath, cfg);
57
+ if (parentOpts.json) {
58
+ writeJson(jsonSuccess({ key, value: coerced }));
59
+ return;
60
+ }
61
+ ctx.logger.success(`Set ${key} = ${JSON.stringify(coerced)}`);
62
+ });
63
+ config
64
+ .command("get <key>")
65
+ .description("Get a configuration value (dotted key path)")
66
+ .action(async (key) => {
67
+ const parentOpts = program.opts();
68
+ const ctx = createRealIOContext(parentOpts);
69
+ const configPath = parentOpts.config ?? getConfigPath();
70
+ const cfg = await loadConfig(ctx.fs, configPath);
71
+ const keys = key.split(".");
72
+ const value = getNestedValue(cfg, keys);
73
+ if (value === undefined) {
74
+ if (parentOpts.json) {
75
+ writeJson(jsonError(`Key "${key}" not found in config`));
76
+ return;
77
+ }
78
+ ctx.logger.error(`Key "${key}" not found in config`);
79
+ process.exitCode = 1;
80
+ return;
81
+ }
82
+ if (parentOpts.json) {
83
+ writeJson(jsonSuccess({ key, value }));
84
+ return;
85
+ }
86
+ console.log(JSON.stringify(value, null, 2));
87
+ });
88
+ config
89
+ .command("path")
90
+ .description("Print the venpm config directory path")
91
+ .action(() => {
92
+ const parentOpts = program.opts();
93
+ if (parentOpts.json) {
94
+ writeJson(jsonSuccess({ path: getConfigDir() }));
95
+ return;
96
+ }
97
+ console.log(getConfigDir());
98
+ });
99
+ }
100
+ //# sourceMappingURL=config-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-cmd.js","sourceRoot":"","sources":["../../src/cli/config-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { IOContext, GlobalOptions } from "../core/types.js";
2
+ export declare function createRealIOContext(options: GlobalOptions & {
3
+ yes?: boolean;
4
+ quiet?: boolean;
5
+ }): IOContext;
6
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAkD,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CA4J1G"}
@@ -0,0 +1,149 @@
1
+ import { execFile as _execFile, spawn as _spawn } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import * as fsPromises from "node:fs/promises";
4
+ import { createPrompter } from "../core/prompt.js";
5
+ import { createLogger } from "../core/log.js";
6
+ const execFileAsync = promisify(_execFile);
7
+ export function createRealIOContext(options) {
8
+ const fs = {
9
+ async readFile(path, encoding) {
10
+ return fsPromises.readFile(path, { encoding });
11
+ },
12
+ async writeFile(path, data, encoding) {
13
+ return fsPromises.writeFile(path, data, { encoding: encoding ?? "utf8" });
14
+ },
15
+ async exists(path) {
16
+ try {
17
+ await fsPromises.access(path);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ },
24
+ async mkdir(path, opts) {
25
+ await fsPromises.mkdir(path, opts);
26
+ },
27
+ async rm(path, opts) {
28
+ await fsPromises.rm(path, opts);
29
+ },
30
+ async symlink(target, path) {
31
+ return fsPromises.symlink(target, path);
32
+ },
33
+ async readlink(path) {
34
+ return fsPromises.readlink(path);
35
+ },
36
+ async readdir(path) {
37
+ return fsPromises.readdir(path);
38
+ },
39
+ async stat(path) {
40
+ return fsPromises.stat(path);
41
+ },
42
+ async lstat(path) {
43
+ return fsPromises.lstat(path);
44
+ },
45
+ async copyDir(src, dest) {
46
+ await fsPromises.cp(src, dest, { recursive: true });
47
+ },
48
+ };
49
+ const http = {
50
+ async fetch(url, fetchOptions) {
51
+ const res = await globalThis.fetch(url, { headers: fetchOptions?.headers });
52
+ return {
53
+ ok: res.ok,
54
+ status: res.status,
55
+ headers: res.headers,
56
+ text: () => res.text(),
57
+ json: () => res.json(),
58
+ arrayBuffer: () => res.arrayBuffer(),
59
+ };
60
+ },
61
+ };
62
+ const git = {
63
+ async available() {
64
+ try {
65
+ await execFileAsync("git", ["--version"]);
66
+ return true;
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ },
72
+ async clone(url, dest, cloneOptions) {
73
+ const args = ["clone", "--filter=blob:none"];
74
+ if (cloneOptions?.sparse && cloneOptions.sparse.length > 0) {
75
+ args.push("--sparse");
76
+ }
77
+ if (cloneOptions?.branch) {
78
+ args.push("--branch", cloneOptions.branch);
79
+ }
80
+ if (cloneOptions?.depth !== undefined) {
81
+ args.push("--depth", String(cloneOptions.depth));
82
+ }
83
+ args.push(url, dest);
84
+ await execFileAsync("git", args);
85
+ if (cloneOptions?.sparse && cloneOptions.sparse.length > 0) {
86
+ await execFileAsync("git", ["-C", dest, "sparse-checkout", "set", ...cloneOptions.sparse]);
87
+ }
88
+ },
89
+ async pull(repoPath) {
90
+ await execFileAsync("git", ["-C", repoPath, "pull"]);
91
+ },
92
+ async revParse(repoPath, ref) {
93
+ const { stdout } = await execFileAsync("git", ["-C", repoPath, "rev-parse", ref]);
94
+ return stdout.trim();
95
+ },
96
+ async checkout(repoPath, ref) {
97
+ await execFileAsync("git", ["-C", repoPath, "checkout", ref]);
98
+ },
99
+ };
100
+ const shell = {
101
+ async exec(cmd, args, execOptions) {
102
+ try {
103
+ const { stdout, stderr } = await execFileAsync(cmd, args, {
104
+ cwd: execOptions?.cwd,
105
+ env: execOptions?.env ? { ...process.env, ...execOptions.env } : undefined,
106
+ });
107
+ return { stdout: stdout ?? "", stderr: stderr ?? "", exitCode: 0 };
108
+ }
109
+ catch (err) {
110
+ const e = err;
111
+ return {
112
+ stdout: e.stdout ?? "",
113
+ stderr: e.stderr ?? "",
114
+ exitCode: e.code ?? 1,
115
+ };
116
+ }
117
+ },
118
+ async spawn(cmd, args, spawnOptions) {
119
+ return new Promise((resolve, reject) => {
120
+ const child = _spawn(cmd, args, {
121
+ cwd: spawnOptions?.cwd,
122
+ detached: spawnOptions?.detached,
123
+ env: spawnOptions?.env ? { ...process.env, ...spawnOptions.env } : undefined,
124
+ stdio: "inherit",
125
+ });
126
+ if (spawnOptions?.detached) {
127
+ child.unref();
128
+ resolve();
129
+ }
130
+ else {
131
+ child.on("close", (code) => {
132
+ if (code === 0)
133
+ resolve();
134
+ else
135
+ reject(new Error(`${cmd} exited with code ${code}`));
136
+ });
137
+ child.on("error", reject);
138
+ }
139
+ });
140
+ },
141
+ };
142
+ const prompter = createPrompter({ yes: options.yes || options.json || false });
143
+ const logger = createLogger({
144
+ verbose: options.verbose ?? false,
145
+ quiet: options.quiet ?? false,
146
+ });
147
+ return { fs, http, git, shell, prompter, logger };
148
+ }
149
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Command } from "commander";
2
+ import type { FileSystem, IOContext, GlobalOptions } from "../core/types.js";
3
+ export interface CreateOptions extends GlobalOptions {
4
+ tsx?: boolean;
5
+ css?: boolean;
6
+ native?: boolean;
7
+ }
8
+ /**
9
+ * Walk up ancestor directories from startPath looking for a plugins.json whose
10
+ * $schema contains "venpm". Returns { path, data } if found, null otherwise.
11
+ */
12
+ export declare function findAncestorIndex(fs: FileSystem, startPath: string): Promise<{
13
+ path: string;
14
+ data: Record<string, unknown>;
15
+ } | null>;
16
+ /**
17
+ * Walk up ancestor directories from targetPath looking for a venpm plugins.json.
18
+ * Returns "plugin" if found, "repo" otherwise.
19
+ */
20
+ export declare function detectCreateMode(fs: FileSystem, targetPath: string): Promise<"repo" | "plugin">;
21
+ export declare function executeCreate(ctx: IOContext, targetPath: string, options: CreateOptions): Promise<void>;
22
+ export declare function registerCreateCommand(program: Command): void;
23
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/cli/create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAM7E,MAAM,WAAW,aAAc,SAAQ,aAAa;IAChD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CACnC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBjE;AAID;;;GAGG;AACH,wBAAsB,gBAAgB,CAClC,EAAE,EAAE,UAAU,EACd,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAG5B;AAwLD,wBAAsB,aAAa,CAC/B,GAAG,EAAE,SAAS,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B5D"}