@rudderhq/create-rudder-plugin 0.1.0-canary.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/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ This package is part of the Rudder project.
2
+
3
+ Rudder began as a fork of an early version of Paperclip.
4
+
5
+ Licensing for this package follows the repository-level transition:
6
+ - new Rudder contributions are made under the Apache License, Version 2.0
7
+ - upstream-derived Paperclip portions preserve the original MIT notice where applicable
8
+
9
+ Canonical project-level license and attribution texts live in the source repository:
10
+ - `LICENSE`
11
+ - `NOTICE`
12
+ - `LICENSES/MIT-PAPERCLIP`
13
+
14
+ Source repository: https://github.com/Undertone0809/rudder
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # @rudderhq/create-rudder-plugin
2
+
3
+ Scaffolding tool for creating new Rudder plugins.
4
+
5
+ ```bash
6
+ npx @rudderhq/create-rudder-plugin my-plugin
7
+ ```
8
+
9
+ Or with options:
10
+
11
+ ```bash
12
+ npx @rudderhq/create-rudder-plugin @acme/my-plugin \
13
+ --template connector \
14
+ --category connector \
15
+ --display-name "Acme Connector" \
16
+ --description "Syncs Acme data into Rudder" \
17
+ --author "Acme Inc"
18
+ ```
19
+
20
+ Supported templates: `default`, `connector`, `workspace`
21
+ Supported categories: `connector`, `workspace`, `automation`, `ui`
22
+
23
+ Generates:
24
+ - typed manifest + worker entrypoint
25
+ - example UI widget using the supported `@rudderhq/plugin-sdk/ui` hooks
26
+ - test file using `@rudderhq/plugin-sdk/testing`
27
+ - `esbuild` and `rollup` config files using SDK bundler presets
28
+ - dev server script for hot-reload (`rudder-plugin-dev-server`)
29
+
30
+ The scaffold intentionally uses plain React elements rather than host-provided UI kit components, because the current plugin runtime does not ship a stable shared component library yet.
31
+
32
+ Inside this repo, the generated package uses `@rudderhq/plugin-sdk` via `workspace:*`.
33
+
34
+ Outside this repo, the scaffold snapshots `@rudderhq/plugin-sdk` from your local Rudder checkout into a `.rudder-sdk/` tarball and points the generated package at that local file by default. You can override the SDK source explicitly:
35
+
36
+ ```bash
37
+ node packages/plugins/create-rudder-plugin/dist/index.js @acme/my-plugin \
38
+ --output /absolute/path/to/plugins \
39
+ --sdk-path /absolute/path/to/rudder/packages/plugins/sdk
40
+ ```
41
+
42
+ That gives you an outside-repo local development path before the SDK is published to npm.
43
+
44
+ ## Workflow after scaffolding
45
+
46
+ ```bash
47
+ cd my-plugin
48
+ pnpm install
49
+ pnpm dev # watch worker + manifest + ui bundles
50
+ pnpm dev:ui # local UI preview server with hot-reload events
51
+ pnpm test
52
+ ```
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ declare const VALID_TEMPLATES: readonly ["default", "connector", "workspace"];
3
+ type PluginTemplate = (typeof VALID_TEMPLATES)[number];
4
+ export interface ScaffoldPluginOptions {
5
+ pluginName: string;
6
+ outputDir: string;
7
+ template?: PluginTemplate;
8
+ displayName?: string;
9
+ description?: string;
10
+ author?: string;
11
+ category?: "connector" | "workspace" | "automation" | "ui";
12
+ sdkPath?: string;
13
+ }
14
+ /** Validate npm-style plugin package names (scoped or unscoped). */
15
+ export declare function isValidPluginName(name: string): boolean;
16
+ /**
17
+ * Generate a complete Rudder plugin starter project.
18
+ *
19
+ * Output includes manifest/worker/UI entries, SDK harness tests, bundler presets,
20
+ * and a local dev server script for hot-reload workflow.
21
+ */
22
+ export declare function scaffoldPluginProject(options: ScaffoldPluginOptions): string;
23
+ export {};
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,QAAA,MAAM,eAAe,gDAAiD,CAAC;AACvE,KAAK,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAGvD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,IAAI,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIvD;AAsFD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAmV5E"}
package/dist/index.js ADDED
@@ -0,0 +1,413 @@
1
+ #!/usr/bin/env node
2
+ import { execFileSync } from "node:child_process";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const VALID_TEMPLATES = ["default", "connector", "workspace"];
7
+ const VALID_CATEGORIES = new Set(["connector", "workspace", "automation", "ui"]);
8
+ /** Validate npm-style plugin package names (scoped or unscoped). */
9
+ export function isValidPluginName(name) {
10
+ const scopedPattern = /^@[a-z0-9_-]+\/[a-z0-9._-]+$/;
11
+ const unscopedPattern = /^[a-z0-9._-]+$/;
12
+ return scopedPattern.test(name) || unscopedPattern.test(name);
13
+ }
14
+ /** Convert `@scope/name` to an output directory basename (`name`). */
15
+ function packageToDirName(pluginName) {
16
+ return pluginName.replace(/^@[^/]+\//, "");
17
+ }
18
+ /** Convert an npm package name into a manifest-safe plugin id. */
19
+ function packageToManifestId(pluginName) {
20
+ if (!pluginName.startsWith("@")) {
21
+ return pluginName;
22
+ }
23
+ return pluginName.slice(1).replace("/", ".");
24
+ }
25
+ /** Build a human-readable display name from package name tokens. */
26
+ function makeDisplayName(pluginName) {
27
+ const raw = packageToDirName(pluginName).replace(/[._-]+/g, " ").trim();
28
+ return raw
29
+ .split(/\s+/)
30
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
31
+ .join(" ");
32
+ }
33
+ function writeFile(target, content) {
34
+ fs.mkdirSync(path.dirname(target), { recursive: true });
35
+ fs.writeFileSync(target, content);
36
+ }
37
+ function quote(value) {
38
+ return JSON.stringify(value);
39
+ }
40
+ function toPosixPath(value) {
41
+ return value.split(path.sep).join("/");
42
+ }
43
+ function formatFileDependency(absPath) {
44
+ return `file:${toPosixPath(path.resolve(absPath))}`;
45
+ }
46
+ function getLocalSdkPackagePath() {
47
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "sdk");
48
+ }
49
+ function getRepoRootFromSdkPath(sdkPath) {
50
+ return path.resolve(sdkPath, "..", "..", "..");
51
+ }
52
+ function getLocalSharedPackagePath(sdkPath) {
53
+ return path.resolve(getRepoRootFromSdkPath(sdkPath), "packages", "shared");
54
+ }
55
+ function isInsideDir(targetPath, parentPath) {
56
+ const relative = path.relative(parentPath, targetPath);
57
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
58
+ }
59
+ function packLocalPackage(packagePath, outputDir) {
60
+ const packageJsonPath = path.join(packagePath, "package.json");
61
+ if (!fs.existsSync(packageJsonPath)) {
62
+ throw new Error(`Package package.json not found at ${packageJsonPath}`);
63
+ }
64
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
65
+ const packageName = packageJson.name ?? path.basename(packagePath);
66
+ const packageVersion = packageJson.version ?? "0.0.0";
67
+ const tarballFileName = `${packageName.replace(/^@/, "").replace("/", "-")}-${packageVersion}.tgz`;
68
+ const sdkBundleDir = path.join(outputDir, ".rudder-sdk");
69
+ fs.mkdirSync(sdkBundleDir, { recursive: true });
70
+ execFileSync("pnpm", ["build"], { cwd: packagePath, stdio: "pipe" });
71
+ execFileSync("pnpm", ["pack", "--pack-destination", sdkBundleDir], { cwd: packagePath, stdio: "pipe" });
72
+ const tarballPath = path.join(sdkBundleDir, tarballFileName);
73
+ if (!fs.existsSync(tarballPath)) {
74
+ throw new Error(`Packed tarball was not created at ${tarballPath}`);
75
+ }
76
+ return tarballPath;
77
+ }
78
+ /**
79
+ * Generate a complete Rudder plugin starter project.
80
+ *
81
+ * Output includes manifest/worker/UI entries, SDK harness tests, bundler presets,
82
+ * and a local dev server script for hot-reload workflow.
83
+ */
84
+ export function scaffoldPluginProject(options) {
85
+ const template = options.template ?? "default";
86
+ if (!VALID_TEMPLATES.includes(template)) {
87
+ throw new Error(`Invalid template '${template}'. Expected one of: ${VALID_TEMPLATES.join(", ")}`);
88
+ }
89
+ if (!isValidPluginName(options.pluginName)) {
90
+ throw new Error("Invalid plugin name. Must be lowercase and may include scope, dots, underscores, or hyphens.");
91
+ }
92
+ if (options.category && !VALID_CATEGORIES.has(options.category)) {
93
+ throw new Error(`Invalid category '${options.category}'. Expected one of: ${[...VALID_CATEGORIES].join(", ")}`);
94
+ }
95
+ const outputDir = path.resolve(options.outputDir);
96
+ if (fs.existsSync(outputDir)) {
97
+ throw new Error(`Directory already exists: ${outputDir}`);
98
+ }
99
+ const displayName = options.displayName ?? makeDisplayName(options.pluginName);
100
+ const description = options.description ?? "A Rudder plugin";
101
+ const author = options.author ?? "Plugin Author";
102
+ const category = options.category ?? (template === "workspace" ? "workspace" : "connector");
103
+ const manifestId = packageToManifestId(options.pluginName);
104
+ const localSdkPath = path.resolve(options.sdkPath ?? getLocalSdkPackagePath());
105
+ const localSharedPath = getLocalSharedPackagePath(localSdkPath);
106
+ const repoRoot = getRepoRootFromSdkPath(localSdkPath);
107
+ const useWorkspaceSdk = isInsideDir(outputDir, repoRoot);
108
+ fs.mkdirSync(outputDir, { recursive: true });
109
+ const packedSharedTarball = useWorkspaceSdk ? null : packLocalPackage(localSharedPath, outputDir);
110
+ const sdkDependency = useWorkspaceSdk
111
+ ? "workspace:*"
112
+ : `file:${toPosixPath(path.relative(outputDir, packLocalPackage(localSdkPath, outputDir)))}`;
113
+ const packageJson = {
114
+ name: options.pluginName,
115
+ version: "0.1.0",
116
+ type: "module",
117
+ private: true,
118
+ description,
119
+ scripts: {
120
+ build: "node ./esbuild.config.mjs",
121
+ "build:rollup": "rollup -c",
122
+ dev: "node ./esbuild.config.mjs --watch",
123
+ "dev:ui": "rudder-plugin-dev-server --root . --ui-dir dist/ui --port 4177",
124
+ test: "vitest run --config ./vitest.config.ts",
125
+ typecheck: "tsc --noEmit"
126
+ },
127
+ rudderPlugin: {
128
+ manifest: "./dist/manifest.js",
129
+ worker: "./dist/worker.js",
130
+ ui: "./dist/ui/"
131
+ },
132
+ keywords: ["rudder", "plugin", category],
133
+ author,
134
+ license: "MIT",
135
+ ...(packedSharedTarball
136
+ ? {
137
+ pnpm: {
138
+ overrides: {
139
+ "@rudderhq/shared": `file:${toPosixPath(path.relative(outputDir, packedSharedTarball))}`,
140
+ },
141
+ },
142
+ }
143
+ : {}),
144
+ devDependencies: {
145
+ ...(packedSharedTarball
146
+ ? {
147
+ "@rudderhq/shared": `file:${toPosixPath(path.relative(outputDir, packedSharedTarball))}`,
148
+ }
149
+ : {}),
150
+ "@rudderhq/plugin-sdk": sdkDependency,
151
+ "@rollup/plugin-node-resolve": "^16.0.1",
152
+ "@rollup/plugin-typescript": "^12.1.2",
153
+ "@types/node": "^24.6.0",
154
+ "@types/react": "^19.0.8",
155
+ esbuild: "^0.27.3",
156
+ rollup: "^4.38.0",
157
+ tslib: "^2.8.1",
158
+ typescript: "^5.7.3",
159
+ vitest: "^3.0.5"
160
+ },
161
+ peerDependencies: {
162
+ react: ">=18"
163
+ }
164
+ };
165
+ writeFile(path.join(outputDir, "package.json"), `${JSON.stringify(packageJson, null, 2)}\n`);
166
+ const tsconfig = {
167
+ compilerOptions: {
168
+ target: "ES2022",
169
+ module: "NodeNext",
170
+ moduleResolution: "NodeNext",
171
+ lib: ["ES2022", "DOM"],
172
+ jsx: "react-jsx",
173
+ strict: true,
174
+ skipLibCheck: true,
175
+ declaration: true,
176
+ declarationMap: true,
177
+ sourceMap: true,
178
+ outDir: "dist",
179
+ rootDir: "."
180
+ },
181
+ include: ["src", "tests"],
182
+ exclude: ["dist", "node_modules"]
183
+ };
184
+ writeFile(path.join(outputDir, "tsconfig.json"), `${JSON.stringify(tsconfig, null, 2)}\n`);
185
+ writeFile(path.join(outputDir, "esbuild.config.mjs"), `import esbuild from "esbuild";
186
+ import { createPluginBundlerPresets } from "@rudderhq/plugin-sdk/bundlers";
187
+
188
+ const presets = createPluginBundlerPresets({ uiEntry: "src/ui/index.tsx" });
189
+ const watch = process.argv.includes("--watch");
190
+
191
+ const workerCtx = await esbuild.context(presets.esbuild.worker);
192
+ const manifestCtx = await esbuild.context(presets.esbuild.manifest);
193
+ const uiCtx = await esbuild.context(presets.esbuild.ui);
194
+
195
+ if (watch) {
196
+ await Promise.all([workerCtx.watch(), manifestCtx.watch(), uiCtx.watch()]);
197
+ console.log("esbuild watch mode enabled for worker, manifest, and ui");
198
+ } else {
199
+ await Promise.all([workerCtx.rebuild(), manifestCtx.rebuild(), uiCtx.rebuild()]);
200
+ await Promise.all([workerCtx.dispose(), manifestCtx.dispose(), uiCtx.dispose()]);
201
+ }
202
+ `);
203
+ writeFile(path.join(outputDir, "rollup.config.mjs"), `import { nodeResolve } from "@rollup/plugin-node-resolve";
204
+ import typescript from "@rollup/plugin-typescript";
205
+ import { createPluginBundlerPresets } from "@rudderhq/plugin-sdk/bundlers";
206
+
207
+ const presets = createPluginBundlerPresets({ uiEntry: "src/ui/index.tsx" });
208
+
209
+ function withPlugins(config) {
210
+ if (!config) return null;
211
+ return {
212
+ ...config,
213
+ plugins: [
214
+ nodeResolve({
215
+ extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs"],
216
+ }),
217
+ typescript({
218
+ tsconfig: "./tsconfig.json",
219
+ declaration: false,
220
+ declarationMap: false,
221
+ }),
222
+ ],
223
+ };
224
+ }
225
+
226
+ export default [
227
+ withPlugins(presets.rollup.manifest),
228
+ withPlugins(presets.rollup.worker),
229
+ withPlugins(presets.rollup.ui),
230
+ ].filter(Boolean);
231
+ `);
232
+ writeFile(path.join(outputDir, "vitest.config.ts"), `import { defineConfig } from "vitest/config";
233
+
234
+ export default defineConfig({
235
+ test: {
236
+ include: ["tests/**/*.spec.ts"],
237
+ environment: "node",
238
+ },
239
+ });
240
+ `);
241
+ writeFile(path.join(outputDir, "src", "manifest.ts"), `import type { PaperclipPluginManifestV1 } from "@rudderhq/plugin-sdk";
242
+
243
+ const manifest: PaperclipPluginManifestV1 = {
244
+ id: ${quote(manifestId)},
245
+ apiVersion: 1,
246
+ version: "0.1.0",
247
+ displayName: ${quote(displayName)},
248
+ description: ${quote(description)},
249
+ author: ${quote(author)},
250
+ categories: [${quote(category)}],
251
+ capabilities: [
252
+ "events.subscribe",
253
+ "plugin.state.read",
254
+ "plugin.state.write"
255
+ ],
256
+ entrypoints: {
257
+ worker: "./dist/worker.js",
258
+ ui: "./dist/ui"
259
+ },
260
+ ui: {
261
+ slots: [
262
+ {
263
+ type: "dashboardWidget",
264
+ id: "health-widget",
265
+ displayName: ${quote(`${displayName} Health`)},
266
+ exportName: "DashboardWidget"
267
+ }
268
+ ]
269
+ }
270
+ };
271
+
272
+ export default manifest;
273
+ `);
274
+ writeFile(path.join(outputDir, "src", "worker.ts"), `import { definePlugin, runWorker } from "@rudderhq/plugin-sdk";
275
+
276
+ const plugin = definePlugin({
277
+ async setup(ctx) {
278
+ ctx.events.on("issue.created", async (event) => {
279
+ const issueId = event.entityId ?? "unknown";
280
+ await ctx.state.set({ scopeKind: "issue", scopeId: issueId, stateKey: "seen" }, true);
281
+ ctx.logger.info("Observed issue.created", { issueId });
282
+ });
283
+
284
+ ctx.data.register("health", async () => {
285
+ return { status: "ok", checkedAt: new Date().toISOString() };
286
+ });
287
+
288
+ ctx.actions.register("ping", async () => {
289
+ ctx.logger.info("Ping action invoked");
290
+ return { pong: true, at: new Date().toISOString() };
291
+ });
292
+ },
293
+
294
+ async onHealth() {
295
+ return { status: "ok", message: "Plugin worker is running" };
296
+ }
297
+ });
298
+
299
+ export default plugin;
300
+ runWorker(plugin, import.meta.url);
301
+ `);
302
+ writeFile(path.join(outputDir, "src", "ui", "index.tsx"), `import { usePluginAction, usePluginData, type PluginWidgetProps } from "@rudderhq/plugin-sdk/ui";
303
+
304
+ type HealthData = {
305
+ status: "ok" | "degraded" | "error";
306
+ checkedAt: string;
307
+ };
308
+
309
+ export function DashboardWidget(_props: PluginWidgetProps) {
310
+ const { data, loading, error } = usePluginData<HealthData>("health");
311
+ const ping = usePluginAction("ping");
312
+
313
+ if (loading) return <div>Loading plugin health...</div>;
314
+ if (error) return <div>Plugin error: {error.message}</div>;
315
+
316
+ return (
317
+ <div style={{ display: "grid", gap: "0.5rem" }}>
318
+ <strong>${displayName}</strong>
319
+ <div>Health: {data?.status ?? "unknown"}</div>
320
+ <div>Checked: {data?.checkedAt ?? "never"}</div>
321
+ <button onClick={() => void ping()}>Ping Worker</button>
322
+ </div>
323
+ );
324
+ }
325
+ `);
326
+ writeFile(path.join(outputDir, "tests", "plugin.spec.ts"), `import { describe, expect, it } from "vitest";
327
+ import { createTestHarness } from "@rudderhq/plugin-sdk/testing";
328
+ import manifest from "../src/manifest.js";
329
+ import plugin from "../src/worker.js";
330
+
331
+ describe("plugin scaffold", () => {
332
+ it("registers data + actions and handles events", async () => {
333
+ const harness = createTestHarness({ manifest, capabilities: [...manifest.capabilities, "events.emit"] });
334
+ await plugin.definition.setup(harness.ctx);
335
+
336
+ await harness.emit("issue.created", { issueId: "iss_1" }, { entityId: "iss_1", entityType: "issue" });
337
+ expect(harness.getState({ scopeKind: "issue", scopeId: "iss_1", stateKey: "seen" })).toBe(true);
338
+
339
+ const data = await harness.getData<{ status: string }>("health");
340
+ expect(data.status).toBe("ok");
341
+
342
+ const action = await harness.performAction<{ pong: boolean }>("ping");
343
+ expect(action.pong).toBe(true);
344
+ });
345
+ });
346
+ `);
347
+ writeFile(path.join(outputDir, "README.md"), `# ${displayName}
348
+
349
+ ${description}
350
+
351
+ ## Development
352
+
353
+ \`\`\`bash
354
+ pnpm install
355
+ pnpm dev # watch builds
356
+ pnpm dev:ui # local dev server with hot-reload events
357
+ pnpm test
358
+ \`\`\`
359
+
360
+ ${sdkDependency.startsWith("file:")
361
+ ? `This scaffold snapshots \`@rudderhq/plugin-sdk\` and \`@rudderhq/shared\` from a local Rudder checkout at:\n\n\`${toPosixPath(localSdkPath)}\`\n\nThe packed tarballs live in \`.rudder-sdk/\` for local development. Before publishing this plugin, switch those dependencies to published package versions once they are available on npm.\n\n`
362
+ : ""}
363
+
364
+ ## Install Into Rudder
365
+
366
+ \`\`\`bash
367
+ curl -X POST http://127.0.0.1:3100/api/plugins/install \\
368
+ -H "Content-Type: application/json" \\
369
+ -d '{"packageName":"${toPosixPath(outputDir)}","isLocalPath":true}'
370
+ \`\`\`
371
+
372
+ ## Build Options
373
+
374
+ - \`pnpm build\` uses esbuild presets from \`@rudderhq/plugin-sdk/bundlers\`.
375
+ - \`pnpm build:rollup\` uses rollup presets from the same SDK.
376
+ `);
377
+ writeFile(path.join(outputDir, ".gitignore"), "dist\nnode_modules\n.rudder-sdk\n");
378
+ return outputDir;
379
+ }
380
+ function parseArg(name) {
381
+ const index = process.argv.indexOf(name);
382
+ if (index === -1)
383
+ return undefined;
384
+ return process.argv[index + 1];
385
+ }
386
+ /** CLI wrapper for `scaffoldPluginProject`. */
387
+ function runCli() {
388
+ const pluginName = process.argv[2];
389
+ if (!pluginName) {
390
+ // eslint-disable-next-line no-console
391
+ console.error("Usage: create-rudder-plugin <name> [--template default|connector|workspace] [--output <dir>] [--sdk-path <rudder-sdk-path>]");
392
+ process.exit(1);
393
+ }
394
+ const template = (parseArg("--template") ?? "default");
395
+ const outputRoot = parseArg("--output") ?? process.cwd();
396
+ const targetDir = path.resolve(outputRoot, packageToDirName(pluginName));
397
+ const out = scaffoldPluginProject({
398
+ pluginName,
399
+ outputDir: targetDir,
400
+ template,
401
+ displayName: parseArg("--display-name"),
402
+ description: parseArg("--description"),
403
+ author: parseArg("--author"),
404
+ category: parseArg("--category"),
405
+ sdkPath: parseArg("--sdk-path"),
406
+ });
407
+ // eslint-disable-next-line no-console
408
+ console.log(`Created plugin scaffold at ${out}`);
409
+ }
410
+ if (import.meta.url === `file://${process.argv[1]}`) {
411
+ runCli();
412
+ }
413
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@rudderhq/create-rudder-plugin",
3
+ "version": "0.1.0-canary.0",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "homepage": "https://github.com/Undertone0809/rudder",
6
+ "bugs": {
7
+ "url": "https://github.com/Undertone0809/rudder/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/Undertone0809/rudder",
12
+ "directory": "packages/plugins/create-rudder-plugin"
13
+ },
14
+ "type": "module",
15
+ "bin": {
16
+ "create-rudder-plugin": "./dist/index.js"
17
+ },
18
+ "exports": {
19
+ ".": "./src/index.ts"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public",
23
+ "bin": {
24
+ "create-rudder-plugin": "./dist/index.js"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js"
30
+ }
31
+ },
32
+ "main": "./dist/index.js",
33
+ "types": "./dist/index.d.ts"
34
+ },
35
+ "files": [
36
+ "dist"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsc",
40
+ "clean": "rm -rf dist",
41
+ "typecheck": "tsc --noEmit"
42
+ },
43
+ "dependencies": {
44
+ "@rudderhq/plugin-sdk": "0.1.0-canary.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^24.12.0",
48
+ "typescript": "^5.9.3"
49
+ }
50
+ }