@snaptrude/create-snaptrude-plugin 0.0.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/dist/index.cjs ADDED
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+
26
+ // src/index.ts
27
+ var import_prompts = require("@inquirer/prompts");
28
+
29
+ // package.json
30
+ var package_default = {
31
+ name: "@snaptrude/create-snaptrude-plugin",
32
+ version: "0.0.1",
33
+ type: "module",
34
+ main: "./dist/index.js",
35
+ module: "./dist/index.js",
36
+ types: "./dist/index.d.ts",
37
+ bin: {
38
+ "create-snaptrude-plugin": "dist/index.js"
39
+ },
40
+ files: [
41
+ "dist"
42
+ ],
43
+ publishConfig: {
44
+ access: "public"
45
+ },
46
+ scripts: {
47
+ "check-types": "tsc --noEmit",
48
+ build: "tsup",
49
+ dev: "tsup --watch",
50
+ "clean-dist": "rm -rf dist"
51
+ },
52
+ devDependencies: {
53
+ "@types/node": "^25.3.5",
54
+ tsup: "^8.5.1",
55
+ typescript: "^5.5.4"
56
+ },
57
+ dependencies: {
58
+ "@commander-js/extra-typings": "^14.0.0",
59
+ "@inquirer/prompts": "^8.3.0",
60
+ commander: "^14.0.3",
61
+ "simple-git": "^3.32.3",
62
+ "update-check": "^1.5.4"
63
+ }
64
+ };
65
+
66
+ // src/index.ts
67
+ var import_update_check = __toESM(require("update-check"), 1);
68
+ var import_extra_typings = require("@commander-js/extra-typings");
69
+ var import_simple_git = __toESM(require("simple-git"), 1);
70
+ var import_promises = require("fs/promises");
71
+ var import_node_path = require("path");
72
+ var import_node_os = require("os");
73
+ var CHECK_UPDATE = false;
74
+ var DEFAULT_VERBOSE = false;
75
+ var DEFAULT_PLUGIN_NAME = "my-plugin";
76
+ async function updatePackageJson(targetDir, pluginName) {
77
+ const packageJsonPath = (0, import_node_path.join)(targetDir, "package.json");
78
+ const packageJson = await (0, import_promises.readFile)(packageJsonPath, "utf8");
79
+ const packageJsonObject = JSON.parse(packageJson);
80
+ packageJsonObject.name = pluginName;
81
+ await (0, import_promises.writeFile)(packageJsonPath, JSON.stringify(packageJsonObject, null, 2));
82
+ }
83
+ var UNWANTED_DIRS = [];
84
+ var UNWANTED_FILES = [];
85
+ async function removeUnwantedFiles(targetDir, verbose = true) {
86
+ if (verbose) console.log(`Removing unwanted files from ${targetDir}`);
87
+ for (const dir of UNWANTED_DIRS) {
88
+ await (0, import_promises.rm)((0, import_node_path.join)(targetDir, dir), { recursive: true, force: true });
89
+ }
90
+ for (const file of UNWANTED_FILES) {
91
+ await (0, import_promises.rm)((0, import_node_path.join)(targetDir, file), { force: true });
92
+ }
93
+ }
94
+ var EXAMPLES_REPO = "https://bitbucket.org/snaptrude/snaptrude-plugin-examples.git";
95
+ var EXAMPLES_REPO_COMMIT = "ad6df49f1ca57a6ce87a46ffde4ee4d3ab47befa";
96
+ var EXAMPLE_PATH_IN_REPO = "snaptrude-plugin";
97
+ async function createExampleRepo(targetDir, verbose = true) {
98
+ if (verbose) console.log(`Creating example repo in ${targetDir}`);
99
+ const tmpDir = await (0, import_promises.mkdtemp)((0, import_node_path.join)((0, import_node_os.tmpdir)(), "snaptrude-plugin-"));
100
+ if (verbose) console.log(`Create temporary directory for clone: ${tmpDir}`);
101
+ try {
102
+ const git = (0, import_simple_git.default)(tmpDir);
103
+ if (verbose) console.log(`Cloning example repo to ${tmpDir}`);
104
+ await git.clone(EXAMPLES_REPO, ".", ["--no-checkout", "--depth=1"]);
105
+ if (verbose)
106
+ console.log(`Fetching specific commit: ${EXAMPLES_REPO_COMMIT}`);
107
+ await git.fetch(["origin", EXAMPLES_REPO_COMMIT, "--depth=1"]);
108
+ if (verbose)
109
+ console.log(`Checking out specific commit: ${EXAMPLES_REPO_COMMIT}`);
110
+ await git.checkout(EXAMPLES_REPO_COMMIT);
111
+ if (verbose)
112
+ console.log(`Copying example directory to target: ${targetDir}`);
113
+ await (0, import_promises.cp)((0, import_node_path.join)(tmpDir, EXAMPLE_PATH_IN_REPO), targetDir, { recursive: true });
114
+ } catch (error) {
115
+ console.error("Error cloning example repo:", error);
116
+ throw error;
117
+ } finally {
118
+ if (verbose) console.log(`Cleaning up temporary directory: ${tmpDir}`);
119
+ await (0, import_promises.rm)(tmpDir, { recursive: true, force: true });
120
+ }
121
+ }
122
+ async function createPlugin(targetDir, pluginName, verbose = true) {
123
+ await createExampleRepo(targetDir, verbose);
124
+ await removeUnwantedFiles(targetDir, verbose);
125
+ await updatePackageJson(targetDir, pluginName);
126
+ if (verbose) console.log(`Plugin created successfully in ${targetDir}`);
127
+ }
128
+ async function runCliMode() {
129
+ const program = new import_extra_typings.Command().version(package_default.version).addOption(
130
+ new import_extra_typings.Option("-v, --verbose", "Verbose output").default(DEFAULT_VERBOSE)
131
+ ).addOption(new import_extra_typings.Option("-n, --name <name>", "The name of the plugin"));
132
+ program.parse();
133
+ return program.opts();
134
+ }
135
+ async function runInteractiveMode() {
136
+ const pluginName = await (0, import_prompts.input)({
137
+ message: "What is the name of your plugin?",
138
+ required: true,
139
+ default: DEFAULT_PLUGIN_NAME,
140
+ validate: (value) => {
141
+ if (!/^[a-z0-9-]+$/.test(value)) {
142
+ return "Plugin name must only contain lowercase letters, numbers, and hyphens";
143
+ }
144
+ return true;
145
+ }
146
+ });
147
+ return { pluginName };
148
+ }
149
+ async function main() {
150
+ if (CHECK_UPDATE) {
151
+ const update = await (0, import_update_check.default)(package_default);
152
+ if (update)
153
+ console.log(
154
+ `Update available: ${update.latest} (current: ${package_default.version})`
155
+ );
156
+ }
157
+ console.log(`${package_default.name} v${package_default.version}`);
158
+ const cliOpts = await runCliMode();
159
+ const cwd = process.cwd();
160
+ if (cliOpts.verbose) console.log("Verbose output enabled");
161
+ if (cliOpts.verbose) console.log("Current working directory:", cwd);
162
+ const pluginName = cliOpts.name ?? (await runInteractiveMode()).pluginName;
163
+ const pluginDir = (0, import_node_path.join)(cwd, pluginName);
164
+ if (cliOpts.verbose) console.log(`Creating plugin: ${pluginName}`);
165
+ await (0, import_promises.mkdir)(pluginDir, { recursive: true });
166
+ await createPlugin(pluginDir, pluginName, cliOpts.verbose);
167
+ }
168
+ main();
169
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\n\nimport { input } from \"@inquirer/prompts\"\nimport packageJson from \"../package.json\"\nimport updateCheck from \"update-check\"\nimport { Command, Option } from \"@commander-js/extra-typings\"\nimport simpleGit from \"simple-git\"\nimport { cp, mkdir, readFile, rm, writeFile, mkdtemp } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { tmpdir } from \"node:os\"\n\n/**\n * Check for updates.\n */\nconst CHECK_UPDATE = false\n\nconst DEFAULT_VERBOSE = false\nconst DEFAULT_PLUGIN_NAME = \"my-plugin\"\n\nasync function updatePackageJson(targetDir: string, pluginName: string) {\n const packageJsonPath = join(targetDir, \"package.json\")\n const packageJson = await readFile(packageJsonPath, \"utf8\")\n const packageJsonObject = JSON.parse(packageJson)\n packageJsonObject.name = pluginName\n await writeFile(packageJsonPath, JSON.stringify(packageJsonObject, null, 2))\n}\n\nconst UNWANTED_DIRS: string[] = []\nconst UNWANTED_FILES: string[] = []\n\nasync function removeUnwantedFiles(targetDir: string, verbose: boolean = true) {\n if (verbose) console.log(`Removing unwanted files from ${targetDir}`)\n for (const dir of UNWANTED_DIRS) {\n await rm(join(targetDir, dir), { recursive: true, force: true })\n }\n for (const file of UNWANTED_FILES) {\n await rm(join(targetDir, file), { force: true })\n }\n}\n\nconst EXAMPLES_REPO =\n \"https://bitbucket.org/snaptrude/snaptrude-plugin-examples.git\"\nconst EXAMPLES_REPO_COMMIT = \"ad6df49f1ca57a6ce87a46ffde4ee4d3ab47befa\"\nconst EXAMPLE_PATH_IN_REPO = \"snaptrude-plugin\"\n\nasync function createExampleRepo(targetDir: string, verbose: boolean = true) {\n if (verbose) console.log(`Creating example repo in ${targetDir}`)\n const tmpDir = await mkdtemp(join(tmpdir(), \"snaptrude-plugin-\"))\n if (verbose) console.log(`Create temporary directory for clone: ${tmpDir}`)\n try {\n const git = simpleGit(tmpDir)\n if (verbose) console.log(`Cloning example repo to ${tmpDir}`)\n // Shallow clone the repo into the temp directory\n await git.clone(EXAMPLES_REPO, \".\", [\"--no-checkout\", \"--depth=1\"])\n\n if (verbose)\n console.log(`Fetching specific commit: ${EXAMPLES_REPO_COMMIT}`)\n await git.fetch([\"origin\", EXAMPLES_REPO_COMMIT, \"--depth=1\"])\n if (verbose)\n console.log(`Checking out specific commit: ${EXAMPLES_REPO_COMMIT}`)\n await git.checkout(EXAMPLES_REPO_COMMIT)\n if (verbose)\n console.log(`Copying example directory to target: ${targetDir}`)\n await cp(join(tmpDir, EXAMPLE_PATH_IN_REPO), targetDir, { recursive: true })\n } catch (error) {\n console.error(\"Error cloning example repo:\", error)\n throw error\n } finally {\n if (verbose) console.log(`Cleaning up temporary directory: ${tmpDir}`)\n await rm(tmpDir, { recursive: true, force: true })\n }\n}\n\nasync function createPlugin(\n targetDir: string,\n pluginName: string,\n verbose: boolean = true,\n) {\n await createExampleRepo(targetDir, verbose)\n await removeUnwantedFiles(targetDir, verbose)\n await updatePackageJson(targetDir, pluginName)\n if (verbose) console.log(`Plugin created successfully in ${targetDir}`)\n}\n\nasync function runCliMode() {\n const program = new Command()\n .version(packageJson.version)\n .addOption(\n new Option(\"-v, --verbose\", \"Verbose output\").default(DEFAULT_VERBOSE),\n )\n .addOption(new Option(\"-n, --name <name>\", \"The name of the plugin\"))\n program.parse()\n return program.opts()\n}\n\nasync function runInteractiveMode() {\n const pluginName = await input({\n message: \"What is the name of your plugin?\",\n required: true,\n default: DEFAULT_PLUGIN_NAME,\n validate: (value) => {\n if (!/^[a-z0-9-]+$/.test(value)) {\n return \"Plugin name must only contain lowercase letters, numbers, and hyphens\"\n }\n return true\n },\n })\n return { pluginName }\n}\n\nasync function main() {\n if (CHECK_UPDATE) {\n const update = await updateCheck(packageJson)\n if (update)\n console.log(\n `Update available: ${update.latest} (current: ${packageJson.version})`,\n )\n }\n console.log(`${packageJson.name} v${packageJson.version}`)\n\n const cliOpts = await runCliMode()\n const cwd = process.cwd()\n if (cliOpts.verbose) console.log(\"Verbose output enabled\")\n if (cliOpts.verbose) console.log(\"Current working directory:\", cwd)\n const pluginName = cliOpts.name ?? (await runInteractiveMode()).pluginName\n const pluginDir = join(cwd, pluginName)\n if (cliOpts.verbose) console.log(`Creating plugin: ${pluginName}`)\n await mkdir(pluginDir, { recursive: true })\n await createPlugin(pluginDir, pluginName, cliOpts.verbose)\n}\n\nmain()\n","{\n \"name\": \"@snaptrude/create-snaptrude-plugin\",\n \"version\": \"0.0.1\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"create-snaptrude-plugin\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"check-types\": \"tsc --noEmit\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"clean-dist\": \"rm -rf dist\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^25.3.5\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.5.4\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@inquirer/prompts\": \"^8.3.0\",\n \"commander\": \"^14.0.3\",\n \"simple-git\": \"^3.32.3\",\n \"update-check\": \"^1.5.4\"\n }\n}\n"],"mappings":"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","names":["simpleGit","updateCheck"]}
package/dist/index.js ADDED
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import { input } from "@inquirer/prompts";
5
+
6
+ // package.json
7
+ var package_default = {
8
+ name: "@snaptrude/create-snaptrude-plugin",
9
+ version: "0.0.1",
10
+ type: "module",
11
+ main: "./dist/index.js",
12
+ module: "./dist/index.js",
13
+ types: "./dist/index.d.ts",
14
+ bin: {
15
+ "create-snaptrude-plugin": "dist/index.js"
16
+ },
17
+ files: [
18
+ "dist"
19
+ ],
20
+ publishConfig: {
21
+ access: "public"
22
+ },
23
+ scripts: {
24
+ "check-types": "tsc --noEmit",
25
+ build: "tsup",
26
+ dev: "tsup --watch",
27
+ "clean-dist": "rm -rf dist"
28
+ },
29
+ devDependencies: {
30
+ "@types/node": "^25.3.5",
31
+ tsup: "^8.5.1",
32
+ typescript: "^5.5.4"
33
+ },
34
+ dependencies: {
35
+ "@commander-js/extra-typings": "^14.0.0",
36
+ "@inquirer/prompts": "^8.3.0",
37
+ commander: "^14.0.3",
38
+ "simple-git": "^3.32.3",
39
+ "update-check": "^1.5.4"
40
+ }
41
+ };
42
+
43
+ // src/index.ts
44
+ import updateCheck from "update-check";
45
+ import { Command, Option } from "@commander-js/extra-typings";
46
+ import simpleGit from "simple-git";
47
+ import { cp, mkdir, readFile, rm, writeFile, mkdtemp } from "fs/promises";
48
+ import { join } from "path";
49
+ import { tmpdir } from "os";
50
+ var CHECK_UPDATE = false;
51
+ var DEFAULT_VERBOSE = false;
52
+ var DEFAULT_PLUGIN_NAME = "my-plugin";
53
+ async function updatePackageJson(targetDir, pluginName) {
54
+ const packageJsonPath = join(targetDir, "package.json");
55
+ const packageJson = await readFile(packageJsonPath, "utf8");
56
+ const packageJsonObject = JSON.parse(packageJson);
57
+ packageJsonObject.name = pluginName;
58
+ await writeFile(packageJsonPath, JSON.stringify(packageJsonObject, null, 2));
59
+ }
60
+ var UNWANTED_DIRS = [];
61
+ var UNWANTED_FILES = [];
62
+ async function removeUnwantedFiles(targetDir, verbose = true) {
63
+ if (verbose) console.log(`Removing unwanted files from ${targetDir}`);
64
+ for (const dir of UNWANTED_DIRS) {
65
+ await rm(join(targetDir, dir), { recursive: true, force: true });
66
+ }
67
+ for (const file of UNWANTED_FILES) {
68
+ await rm(join(targetDir, file), { force: true });
69
+ }
70
+ }
71
+ var EXAMPLES_REPO = "https://bitbucket.org/snaptrude/snaptrude-plugin-examples.git";
72
+ var EXAMPLES_REPO_COMMIT = "ad6df49f1ca57a6ce87a46ffde4ee4d3ab47befa";
73
+ var EXAMPLE_PATH_IN_REPO = "snaptrude-plugin";
74
+ async function createExampleRepo(targetDir, verbose = true) {
75
+ if (verbose) console.log(`Creating example repo in ${targetDir}`);
76
+ const tmpDir = await mkdtemp(join(tmpdir(), "snaptrude-plugin-"));
77
+ if (verbose) console.log(`Create temporary directory for clone: ${tmpDir}`);
78
+ try {
79
+ const git = simpleGit(tmpDir);
80
+ if (verbose) console.log(`Cloning example repo to ${tmpDir}`);
81
+ await git.clone(EXAMPLES_REPO, ".", ["--no-checkout", "--depth=1"]);
82
+ if (verbose)
83
+ console.log(`Fetching specific commit: ${EXAMPLES_REPO_COMMIT}`);
84
+ await git.fetch(["origin", EXAMPLES_REPO_COMMIT, "--depth=1"]);
85
+ if (verbose)
86
+ console.log(`Checking out specific commit: ${EXAMPLES_REPO_COMMIT}`);
87
+ await git.checkout(EXAMPLES_REPO_COMMIT);
88
+ if (verbose)
89
+ console.log(`Copying example directory to target: ${targetDir}`);
90
+ await cp(join(tmpDir, EXAMPLE_PATH_IN_REPO), targetDir, { recursive: true });
91
+ } catch (error) {
92
+ console.error("Error cloning example repo:", error);
93
+ throw error;
94
+ } finally {
95
+ if (verbose) console.log(`Cleaning up temporary directory: ${tmpDir}`);
96
+ await rm(tmpDir, { recursive: true, force: true });
97
+ }
98
+ }
99
+ async function createPlugin(targetDir, pluginName, verbose = true) {
100
+ await createExampleRepo(targetDir, verbose);
101
+ await removeUnwantedFiles(targetDir, verbose);
102
+ await updatePackageJson(targetDir, pluginName);
103
+ if (verbose) console.log(`Plugin created successfully in ${targetDir}`);
104
+ }
105
+ async function runCliMode() {
106
+ const program = new Command().version(package_default.version).addOption(
107
+ new Option("-v, --verbose", "Verbose output").default(DEFAULT_VERBOSE)
108
+ ).addOption(new Option("-n, --name <name>", "The name of the plugin"));
109
+ program.parse();
110
+ return program.opts();
111
+ }
112
+ async function runInteractiveMode() {
113
+ const pluginName = await input({
114
+ message: "What is the name of your plugin?",
115
+ required: true,
116
+ default: DEFAULT_PLUGIN_NAME,
117
+ validate: (value) => {
118
+ if (!/^[a-z0-9-]+$/.test(value)) {
119
+ return "Plugin name must only contain lowercase letters, numbers, and hyphens";
120
+ }
121
+ return true;
122
+ }
123
+ });
124
+ return { pluginName };
125
+ }
126
+ async function main() {
127
+ if (CHECK_UPDATE) {
128
+ const update = await updateCheck(package_default);
129
+ if (update)
130
+ console.log(
131
+ `Update available: ${update.latest} (current: ${package_default.version})`
132
+ );
133
+ }
134
+ console.log(`${package_default.name} v${package_default.version}`);
135
+ const cliOpts = await runCliMode();
136
+ const cwd = process.cwd();
137
+ if (cliOpts.verbose) console.log("Verbose output enabled");
138
+ if (cliOpts.verbose) console.log("Current working directory:", cwd);
139
+ const pluginName = cliOpts.name ?? (await runInteractiveMode()).pluginName;
140
+ const pluginDir = join(cwd, pluginName);
141
+ if (cliOpts.verbose) console.log(`Creating plugin: ${pluginName}`);
142
+ await mkdir(pluginDir, { recursive: true });
143
+ await createPlugin(pluginDir, pluginName, cliOpts.verbose);
144
+ }
145
+ main();
146
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\n\nimport { input } from \"@inquirer/prompts\"\nimport packageJson from \"../package.json\"\nimport updateCheck from \"update-check\"\nimport { Command, Option } from \"@commander-js/extra-typings\"\nimport simpleGit from \"simple-git\"\nimport { cp, mkdir, readFile, rm, writeFile, mkdtemp } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { tmpdir } from \"node:os\"\n\n/**\n * Check for updates.\n */\nconst CHECK_UPDATE = false\n\nconst DEFAULT_VERBOSE = false\nconst DEFAULT_PLUGIN_NAME = \"my-plugin\"\n\nasync function updatePackageJson(targetDir: string, pluginName: string) {\n const packageJsonPath = join(targetDir, \"package.json\")\n const packageJson = await readFile(packageJsonPath, \"utf8\")\n const packageJsonObject = JSON.parse(packageJson)\n packageJsonObject.name = pluginName\n await writeFile(packageJsonPath, JSON.stringify(packageJsonObject, null, 2))\n}\n\nconst UNWANTED_DIRS: string[] = []\nconst UNWANTED_FILES: string[] = []\n\nasync function removeUnwantedFiles(targetDir: string, verbose: boolean = true) {\n if (verbose) console.log(`Removing unwanted files from ${targetDir}`)\n for (const dir of UNWANTED_DIRS) {\n await rm(join(targetDir, dir), { recursive: true, force: true })\n }\n for (const file of UNWANTED_FILES) {\n await rm(join(targetDir, file), { force: true })\n }\n}\n\nconst EXAMPLES_REPO =\n \"https://bitbucket.org/snaptrude/snaptrude-plugin-examples.git\"\nconst EXAMPLES_REPO_COMMIT = \"ad6df49f1ca57a6ce87a46ffde4ee4d3ab47befa\"\nconst EXAMPLE_PATH_IN_REPO = \"snaptrude-plugin\"\n\nasync function createExampleRepo(targetDir: string, verbose: boolean = true) {\n if (verbose) console.log(`Creating example repo in ${targetDir}`)\n const tmpDir = await mkdtemp(join(tmpdir(), \"snaptrude-plugin-\"))\n if (verbose) console.log(`Create temporary directory for clone: ${tmpDir}`)\n try {\n const git = simpleGit(tmpDir)\n if (verbose) console.log(`Cloning example repo to ${tmpDir}`)\n // Shallow clone the repo into the temp directory\n await git.clone(EXAMPLES_REPO, \".\", [\"--no-checkout\", \"--depth=1\"])\n\n if (verbose)\n console.log(`Fetching specific commit: ${EXAMPLES_REPO_COMMIT}`)\n await git.fetch([\"origin\", EXAMPLES_REPO_COMMIT, \"--depth=1\"])\n if (verbose)\n console.log(`Checking out specific commit: ${EXAMPLES_REPO_COMMIT}`)\n await git.checkout(EXAMPLES_REPO_COMMIT)\n if (verbose)\n console.log(`Copying example directory to target: ${targetDir}`)\n await cp(join(tmpDir, EXAMPLE_PATH_IN_REPO), targetDir, { recursive: true })\n } catch (error) {\n console.error(\"Error cloning example repo:\", error)\n throw error\n } finally {\n if (verbose) console.log(`Cleaning up temporary directory: ${tmpDir}`)\n await rm(tmpDir, { recursive: true, force: true })\n }\n}\n\nasync function createPlugin(\n targetDir: string,\n pluginName: string,\n verbose: boolean = true,\n) {\n await createExampleRepo(targetDir, verbose)\n await removeUnwantedFiles(targetDir, verbose)\n await updatePackageJson(targetDir, pluginName)\n if (verbose) console.log(`Plugin created successfully in ${targetDir}`)\n}\n\nasync function runCliMode() {\n const program = new Command()\n .version(packageJson.version)\n .addOption(\n new Option(\"-v, --verbose\", \"Verbose output\").default(DEFAULT_VERBOSE),\n )\n .addOption(new Option(\"-n, --name <name>\", \"The name of the plugin\"))\n program.parse()\n return program.opts()\n}\n\nasync function runInteractiveMode() {\n const pluginName = await input({\n message: \"What is the name of your plugin?\",\n required: true,\n default: DEFAULT_PLUGIN_NAME,\n validate: (value) => {\n if (!/^[a-z0-9-]+$/.test(value)) {\n return \"Plugin name must only contain lowercase letters, numbers, and hyphens\"\n }\n return true\n },\n })\n return { pluginName }\n}\n\nasync function main() {\n if (CHECK_UPDATE) {\n const update = await updateCheck(packageJson)\n if (update)\n console.log(\n `Update available: ${update.latest} (current: ${packageJson.version})`,\n )\n }\n console.log(`${packageJson.name} v${packageJson.version}`)\n\n const cliOpts = await runCliMode()\n const cwd = process.cwd()\n if (cliOpts.verbose) console.log(\"Verbose output enabled\")\n if (cliOpts.verbose) console.log(\"Current working directory:\", cwd)\n const pluginName = cliOpts.name ?? (await runInteractiveMode()).pluginName\n const pluginDir = join(cwd, pluginName)\n if (cliOpts.verbose) console.log(`Creating plugin: ${pluginName}`)\n await mkdir(pluginDir, { recursive: true })\n await createPlugin(pluginDir, pluginName, cliOpts.verbose)\n}\n\nmain()\n","{\n \"name\": \"@snaptrude/create-snaptrude-plugin\",\n \"version\": \"0.0.1\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"create-snaptrude-plugin\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"check-types\": \"tsc --noEmit\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"clean-dist\": \"rm -rf dist\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^25.3.5\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.5.4\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@inquirer/prompts\": \"^8.3.0\",\n \"commander\": \"^14.0.3\",\n \"simple-git\": \"^3.32.3\",\n \"update-check\": \"^1.5.4\"\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@snaptrude/create-snaptrude-plugin",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "create-snaptrude-plugin": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^25.3.5",
19
+ "tsup": "^8.5.1",
20
+ "typescript": "^5.5.4"
21
+ },
22
+ "dependencies": {
23
+ "@commander-js/extra-typings": "^14.0.0",
24
+ "@inquirer/prompts": "^8.3.0",
25
+ "commander": "^14.0.3",
26
+ "simple-git": "^3.32.3",
27
+ "update-check": "^1.5.4"
28
+ },
29
+ "scripts": {
30
+ "check-types": "tsc --noEmit",
31
+ "build": "tsup",
32
+ "dev": "tsup --watch",
33
+ "clean-dist": "rm -rf dist"
34
+ }
35
+ }