@atom8n/node-cli 0.17.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 (152) hide show
  1. package/README.md +289 -0
  2. package/bin/n8n-node.mjs +5 -0
  3. package/dist/build.tsbuildinfo +1 -0
  4. package/dist/commands/build.d.ts +8 -0
  5. package/dist/commands/build.js +61 -0
  6. package/dist/commands/build.js.map +1 -0
  7. package/dist/commands/cloud-support.d.ts +14 -0
  8. package/dist/commands/cloud-support.js +136 -0
  9. package/dist/commands/cloud-support.js.map +1 -0
  10. package/dist/commands/dev/index.d.ts +10 -0
  11. package/dist/commands/dev/index.js +103 -0
  12. package/dist/commands/dev/index.js.map +1 -0
  13. package/dist/commands/dev/utils.d.ts +27 -0
  14. package/dist/commands/dev/utils.js +462 -0
  15. package/dist/commands/dev/utils.js.map +1 -0
  16. package/dist/commands/lint.d.ts +13 -0
  17. package/dist/commands/lint.js +124 -0
  18. package/dist/commands/lint.js.map +1 -0
  19. package/dist/commands/new/index.d.ts +14 -0
  20. package/dist/commands/new/index.js +141 -0
  21. package/dist/commands/new/index.js.map +1 -0
  22. package/dist/commands/new/prompts.d.ts +3 -0
  23. package/dist/commands/new/prompts.js +42 -0
  24. package/dist/commands/new/prompts.js.map +1 -0
  25. package/dist/commands/new/utils.d.ts +1 -0
  26. package/dist/commands/new/utils.js +13 -0
  27. package/dist/commands/new/utils.js.map +1 -0
  28. package/dist/commands/prerelease.d.ts +8 -0
  29. package/dist/commands/prerelease.js +20 -0
  30. package/dist/commands/prerelease.js.map +1 -0
  31. package/dist/commands/release.d.ts +7 -0
  32. package/dist/commands/release.js +52 -0
  33. package/dist/commands/release.js.map +1 -0
  34. package/dist/configs/eslint.d.ts +3 -0
  35. package/dist/configs/eslint.js +65 -0
  36. package/dist/configs/eslint.js.map +1 -0
  37. package/dist/index.d.ts +16 -0
  38. package/dist/index.js +23 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/template/core.d.ts +29 -0
  41. package/dist/template/core.js +55 -0
  42. package/dist/template/core.js.map +1 -0
  43. package/dist/template/templates/declarative/custom/ast.d.ts +17 -0
  44. package/dist/template/templates/declarative/custom/ast.js +110 -0
  45. package/dist/template/templates/declarative/custom/ast.js.map +1 -0
  46. package/dist/template/templates/declarative/custom/ast.ts +161 -0
  47. package/dist/template/templates/declarative/custom/prompts.d.ts +3 -0
  48. package/dist/template/templates/declarative/custom/prompts.js +80 -0
  49. package/dist/template/templates/declarative/custom/prompts.js.map +1 -0
  50. package/dist/template/templates/declarative/custom/prompts.ts +87 -0
  51. package/dist/template/templates/declarative/custom/template/README.md +46 -0
  52. package/dist/template/templates/declarative/custom/template/nodes/Example/Example.node.json +18 -0
  53. package/dist/template/templates/declarative/custom/template/nodes/Example/Example.node.ts +50 -0
  54. package/dist/template/templates/declarative/custom/template/nodes/Example/example.dark.svg +13 -0
  55. package/dist/template/templates/declarative/custom/template/nodes/Example/example.svg +13 -0
  56. package/dist/template/templates/declarative/custom/template/nodes/Example/resources/company/getAll.ts +61 -0
  57. package/dist/template/templates/declarative/custom/template/nodes/Example/resources/company/index.ts +34 -0
  58. package/dist/template/templates/declarative/custom/template/nodes/Example/resources/user/create.ts +26 -0
  59. package/dist/template/templates/declarative/custom/template/nodes/Example/resources/user/get.ts +17 -0
  60. package/dist/template/templates/declarative/custom/template/nodes/Example/resources/user/index.ts +60 -0
  61. package/dist/template/templates/declarative/custom/template/package.json +48 -0
  62. package/dist/template/templates/declarative/custom/template/tsconfig.json +25 -0
  63. package/dist/template/templates/declarative/custom/template.d.ts +2 -0
  64. package/dist/template/templates/declarative/custom/template.js +83 -0
  65. package/dist/template/templates/declarative/custom/template.js.map +1 -0
  66. package/dist/template/templates/declarative/custom/template.ts +121 -0
  67. package/dist/template/templates/declarative/custom/types.d.ts +9 -0
  68. package/dist/template/templates/declarative/custom/types.js +3 -0
  69. package/dist/template/templates/declarative/custom/types.js.map +1 -0
  70. package/dist/template/templates/declarative/custom/types.ts +8 -0
  71. package/dist/template/templates/declarative/github-issues/template/README.md +73 -0
  72. package/dist/template/templates/declarative/github-issues/template/credentials/GithubIssuesApi.credentials.ts +45 -0
  73. package/dist/template/templates/declarative/github-issues/template/credentials/GithubIssuesOAuth2Api.credentials.ts +54 -0
  74. package/dist/template/templates/declarative/github-issues/template/icons/github.dark.svg +3 -0
  75. package/dist/template/templates/declarative/github-issues/template/icons/github.svg +3 -0
  76. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/GithubIssues.node.json +18 -0
  77. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/GithubIssues.node.ts +96 -0
  78. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/listSearch/getIssues.ts +49 -0
  79. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/listSearch/getRepositories.ts +50 -0
  80. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/listSearch/getUsers.ts +49 -0
  81. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/resources/issue/create.ts +74 -0
  82. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/resources/issue/get.ts +14 -0
  83. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/resources/issue/getAll.ts +124 -0
  84. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/resources/issue/index.ts +75 -0
  85. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/resources/issueComment/getAll.ts +65 -0
  86. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/resources/issueComment/index.ts +47 -0
  87. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/shared/descriptions.ts +151 -0
  88. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/shared/transport.ts +32 -0
  89. package/dist/template/templates/declarative/github-issues/template/nodes/GithubIssues/shared/utils.ts +14 -0
  90. package/dist/template/templates/declarative/github-issues/template/package.json +51 -0
  91. package/dist/template/templates/declarative/github-issues/template/tsconfig.json +25 -0
  92. package/dist/template/templates/declarative/github-issues/template.d.ts +1 -0
  93. package/dist/template/templates/declarative/github-issues/template.js +14 -0
  94. package/dist/template/templates/declarative/github-issues/template.js.map +1 -0
  95. package/dist/template/templates/declarative/github-issues/template.ts +9 -0
  96. package/dist/template/templates/index.d.ts +15 -0
  97. package/dist/template/templates/index.js +28 -0
  98. package/dist/template/templates/index.js.map +1 -0
  99. package/dist/template/templates/index.ts +35 -0
  100. package/dist/template/templates/programmatic/example/template/README.md +46 -0
  101. package/dist/template/templates/programmatic/example/template/nodes/Example/Example.node.json +18 -0
  102. package/dist/template/templates/programmatic/example/template/nodes/Example/Example.node.ts +78 -0
  103. package/dist/template/templates/programmatic/example/template/nodes/Example/example.dark.svg +13 -0
  104. package/dist/template/templates/programmatic/example/template/nodes/Example/example.svg +13 -0
  105. package/dist/template/templates/programmatic/example/template/package.json +48 -0
  106. package/dist/template/templates/programmatic/example/template/tsconfig.json +25 -0
  107. package/dist/template/templates/programmatic/example/template.d.ts +1 -0
  108. package/dist/template/templates/programmatic/example/template.js +14 -0
  109. package/dist/template/templates/programmatic/example/template.js.map +1 -0
  110. package/dist/template/templates/programmatic/example/template.ts +9 -0
  111. package/dist/template/templates/shared/credentials/apiKey.credentials.ts +42 -0
  112. package/dist/template/templates/shared/credentials/basicAuth.credentials.ts +50 -0
  113. package/dist/template/templates/shared/credentials/bearer.credentials.ts +42 -0
  114. package/dist/template/templates/shared/credentials/custom.credentials.ts +48 -0
  115. package/dist/template/templates/shared/credentials/oauth2AuthorizationCode.credentials.ts +51 -0
  116. package/dist/template/templates/shared/credentials/oauth2ClientCredentials.credentials.ts +45 -0
  117. package/dist/template/templates/shared/default/.github/workflows/ci.yml +28 -0
  118. package/dist/template/templates/shared/default/.prettierrc.js +51 -0
  119. package/dist/template/templates/shared/default/.vscode/launch.json +12 -0
  120. package/dist/template/templates/shared/default/CHANGELOG.md +0 -0
  121. package/dist/template/templates/shared/default/eslint.config.mjs +3 -0
  122. package/dist/utils/ast.d.ts +11 -0
  123. package/dist/utils/ast.js +32 -0
  124. package/dist/utils/ast.js.map +1 -0
  125. package/dist/utils/child-process.d.ts +17 -0
  126. package/dist/utils/child-process.js +65 -0
  127. package/dist/utils/child-process.js.map +1 -0
  128. package/dist/utils/command-suggestions.d.ts +6 -0
  129. package/dist/utils/command-suggestions.js +30 -0
  130. package/dist/utils/command-suggestions.js.map +1 -0
  131. package/dist/utils/filesystem.d.ts +12 -0
  132. package/dist/utils/filesystem.js +105 -0
  133. package/dist/utils/filesystem.js.map +1 -0
  134. package/dist/utils/git.d.ts +7 -0
  135. package/dist/utils/git.js +36 -0
  136. package/dist/utils/git.js.map +1 -0
  137. package/dist/utils/json.d.ts +1 -0
  138. package/dist/utils/json.js +12 -0
  139. package/dist/utils/json.js.map +1 -0
  140. package/dist/utils/package-manager.d.ts +4 -0
  141. package/dist/utils/package-manager.js +48 -0
  142. package/dist/utils/package-manager.js.map +1 -0
  143. package/dist/utils/package.d.ts +15 -0
  144. package/dist/utils/package.js +53 -0
  145. package/dist/utils/package.js.map +1 -0
  146. package/dist/utils/prompts.d.ts +5 -0
  147. package/dist/utils/prompts.js +65 -0
  148. package/dist/utils/prompts.js.map +1 -0
  149. package/dist/utils/validation.d.ts +3 -0
  150. package/dist/utils/validation.js +23 -0
  151. package/dist/utils/validation.js.map +1 -0
  152. package/package.json +77 -0
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const prompts_1 = require("@clack/prompts");
7
+ const core_1 = require("@oclif/core");
8
+ const promises_1 = __importDefault(require("node:fs/promises"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const picocolors_1 = __importDefault(require("picocolors"));
11
+ const child_process_1 = require("../utils/child-process");
12
+ const command_suggestions_1 = require("../utils/command-suggestions");
13
+ const package_1 = require("../utils/package");
14
+ const prompts_2 = require("../utils/prompts");
15
+ const validation_1 = require("../utils/validation");
16
+ class Lint extends core_1.Command {
17
+ async run() {
18
+ const { flags } = await this.parse(Lint);
19
+ (0, prompts_1.intro)(await (0, prompts_2.getCommandHeader)('n8n-node lint'));
20
+ await (0, prompts_2.ensureN8nPackage)('lint');
21
+ await this.checkStrictMode();
22
+ const args = ['.'];
23
+ if (flags.fix) {
24
+ args.push('--fix');
25
+ }
26
+ let eslintOutput = '';
27
+ try {
28
+ await (0, child_process_1.runCommand)('eslint', args, {
29
+ context: 'local',
30
+ stdio: 'pipe',
31
+ env: { ...process.env, FORCE_COLOR: '1' },
32
+ alwaysPrintOutput: true,
33
+ printOutput: ({ stdout, stderr }) => {
34
+ eslintOutput = Buffer.concat([...stdout, ...stderr]).toString();
35
+ process.stdout.write(Buffer.concat(stdout));
36
+ process.stderr.write(Buffer.concat(stderr));
37
+ },
38
+ });
39
+ }
40
+ catch (error) {
41
+ if (error instanceof child_process_1.ChildProcessError) {
42
+ await this.handleLintErrors(eslintOutput);
43
+ if (error.signal) {
44
+ process.kill(process.pid, error.signal);
45
+ }
46
+ else {
47
+ process.exit(error.code ?? 0);
48
+ }
49
+ }
50
+ throw error;
51
+ }
52
+ }
53
+ async checkStrictMode() {
54
+ try {
55
+ const workingDir = process.cwd();
56
+ const packageJson = await (0, package_1.getPackageJson)(workingDir);
57
+ if (!packageJson?.n8n?.strict) {
58
+ return;
59
+ }
60
+ await this.verifyEslintConfig(workingDir);
61
+ }
62
+ catch (error) {
63
+ return;
64
+ }
65
+ }
66
+ async verifyEslintConfig(workingDir) {
67
+ const eslintConfigPath = node_path_1.default.resolve(workingDir, 'eslint.config.mjs');
68
+ const templatePath = node_path_1.default.resolve(__dirname, '../template/templates/shared/default/eslint.config.mjs');
69
+ const expectedConfig = await promises_1.default.readFile(templatePath, 'utf-8');
70
+ try {
71
+ const currentConfig = await promises_1.default.readFile(eslintConfigPath, 'utf-8');
72
+ const normalizedCurrent = currentConfig.replace(/\s+/g, ' ').trim();
73
+ const normalizedExpected = expectedConfig.replace(/\s+/g, ' ').trim();
74
+ if (normalizedCurrent !== normalizedExpected) {
75
+ const enableCommand = await (0, command_suggestions_1.suggestCloudSupportCommand)('enable');
76
+ this.log(`${picocolors_1.default.red('Strict mode violation:')} ${picocolors_1.default.cyan('eslint.config.mjs')} has been modified from the default configuration.
77
+
78
+ ${picocolors_1.default.dim('Expected:')}
79
+ ${picocolors_1.default.gray(expectedConfig)}
80
+
81
+ To restore default config: ${enableCommand}
82
+ To disable strict mode: set ${picocolors_1.default.yellow('"strict": false')} in ${picocolors_1.default.cyan('package.json')} under the ${picocolors_1.default.yellow('"n8n"')} section.`);
83
+ process.exit(1);
84
+ }
85
+ }
86
+ catch (error) {
87
+ if ((0, validation_1.isEnoentError)(error)) {
88
+ const enableCommand = await (0, command_suggestions_1.suggestCloudSupportCommand)('enable');
89
+ this.log(`${picocolors_1.default.red('Strict mode violation:')} ${picocolors_1.default.cyan('eslint.config.mjs')} not found. Expected default configuration.
90
+
91
+ To create default config: ${enableCommand}`);
92
+ process.exit(1);
93
+ }
94
+ throw error;
95
+ }
96
+ }
97
+ async handleLintErrors(eslintOutput) {
98
+ if (this.containsCloudOnlyErrors(eslintOutput)) {
99
+ const disableCommand = await (0, command_suggestions_1.suggestCloudSupportCommand)('disable');
100
+ this.log(`${picocolors_1.default.yellow('⚠️ n8n Cloud compatibility issues detected')}
101
+
102
+ These lint failures prevent verification to n8n Cloud.
103
+
104
+ To disable cloud compatibility checks:
105
+ ${disableCommand}
106
+
107
+ ${picocolors_1.default.dim(`Note: This will switch to ${picocolors_1.default.magenta('configWithoutCloudSupport')} and disable strict mode`)}`);
108
+ }
109
+ }
110
+ containsCloudOnlyErrors(errorMessage) {
111
+ const cloudOnlyRules = [
112
+ '@n8n/community-nodes/no-restricted-imports',
113
+ '@n8n/community-nodes/no-restricted-globals',
114
+ ];
115
+ return cloudOnlyRules.some((rule) => errorMessage.includes(rule));
116
+ }
117
+ }
118
+ Lint.description = 'Lint the node in the current directory. Includes auto-fixing. In strict mode, verifies eslint config is unchanged from default.';
119
+ Lint.examples = ['<%= config.bin %> <%= command.id %>'];
120
+ Lint.flags = {
121
+ fix: core_1.Flags.boolean({ description: 'Automatically fix problems', default: false }),
122
+ };
123
+ exports.default = Lint;
124
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class New extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ name: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ force: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ 'skip-install': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ template: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const prompts_1 = require("@clack/prompts");
7
+ const core_1 = require("@oclif/core");
8
+ const change_case_1 = require("change-case");
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const prompts_2 = require("./prompts");
12
+ const utils_1 = require("./utils");
13
+ const templates_1 = require("../../template/templates");
14
+ const child_process_1 = require("../../utils/child-process");
15
+ const filesystem_1 = require("../../utils/filesystem");
16
+ const git_1 = require("../../utils/git");
17
+ const package_manager_1 = require("../../utils/package-manager");
18
+ const prompts_3 = require("../../utils/prompts");
19
+ const validation_1 = require("../../utils/validation");
20
+ class New extends core_1.Command {
21
+ async run() {
22
+ const { flags, args } = await this.parse(New);
23
+ const [typeFlag, templateFlag] = flags.template?.split('/') ?? [];
24
+ (0, prompts_1.intro)(await (0, utils_1.createIntro)());
25
+ const nodeName = args.name ?? (await (0, prompts_2.nodeNamePrompt)());
26
+ const invalidNodeNameError = (0, validation_1.validateNodeName)(nodeName);
27
+ if (invalidNodeNameError)
28
+ return (0, prompts_3.onCancel)(invalidNodeNameError);
29
+ const destination = node_path_1.default.resolve(process.cwd(), nodeName);
30
+ let overwrite = false;
31
+ if (await (0, filesystem_1.folderExists)(destination)) {
32
+ if (!flags.force) {
33
+ const shouldOverwrite = await (0, prompts_1.confirm)({
34
+ message: `./${nodeName} already exists, do you want to overwrite?`,
35
+ });
36
+ if ((0, prompts_1.isCancel)(shouldOverwrite) || !shouldOverwrite)
37
+ return (0, prompts_3.onCancel)();
38
+ }
39
+ overwrite = true;
40
+ }
41
+ const type = typeFlag ?? (await (0, prompts_2.nodeTypePrompt)());
42
+ if (!(0, templates_1.isTemplateType)(type)) {
43
+ return (0, prompts_3.onCancel)(`Invalid template type: ${type}`);
44
+ }
45
+ let template = templates_1.templates.programmatic.example;
46
+ if (templateFlag) {
47
+ const name = (0, change_case_1.camelCase)(templateFlag);
48
+ if (!(0, templates_1.isTemplateName)(type, name)) {
49
+ return (0, prompts_3.onCancel)(`Invalid template name: ${name} for type: ${type}`);
50
+ }
51
+ template = (0, templates_1.getTemplate)(type, name);
52
+ }
53
+ else if (type === 'declarative') {
54
+ const chosenTemplate = await (0, prompts_2.declarativeTemplatePrompt)();
55
+ template = (0, templates_1.getTemplate)('declarative', chosenTemplate);
56
+ }
57
+ const config = (await template.prompts?.()) ?? {};
58
+ const packageManager = (await (0, package_manager_1.detectPackageManager)()) ?? 'npm';
59
+ const templateData = {
60
+ destinationPath: destination,
61
+ nodePackageName: nodeName,
62
+ config,
63
+ user: (0, git_1.tryReadGitUser)(),
64
+ packageManager: {
65
+ name: packageManager,
66
+ installCommand: packageManager === 'npm' ? 'ci' : 'install',
67
+ },
68
+ };
69
+ const copyingSpinner = (0, prompts_1.spinner)();
70
+ copyingSpinner.start('Copying files');
71
+ if (overwrite) {
72
+ await promises_1.default.rm(destination, { recursive: true, force: true });
73
+ }
74
+ await (0, filesystem_1.delayAtLeast)(template.run(templateData), 1000);
75
+ copyingSpinner.stop('Files copied');
76
+ const gitSpinner = (0, prompts_1.spinner)();
77
+ gitSpinner.start('Initializing git repository');
78
+ try {
79
+ await (0, git_1.initGit)(destination);
80
+ gitSpinner.stop('Git repository initialized');
81
+ }
82
+ catch (error) {
83
+ if (error instanceof child_process_1.ChildProcessError) {
84
+ gitSpinner.stop(`Could not initialize git repository: ${error.message}`, error.code ?? undefined);
85
+ process.exit(error.code ?? 1);
86
+ }
87
+ else {
88
+ throw error;
89
+ }
90
+ }
91
+ if (!flags['skip-install']) {
92
+ const installingSpinner = (0, prompts_1.spinner)();
93
+ installingSpinner.start('Installing dependencies');
94
+ try {
95
+ await (0, filesystem_1.delayAtLeast)((0, child_process_1.runCommand)(packageManager, ['install'], {
96
+ cwd: destination,
97
+ printOutput: ({ stdout, stderr }) => {
98
+ prompts_1.log.error(stdout.concat(stderr).toString());
99
+ },
100
+ }), 1000);
101
+ }
102
+ catch (error) {
103
+ if (error instanceof child_process_1.ChildProcessError) {
104
+ installingSpinner.stop(`Could not install dependencies: ${error.message}`, error.code ?? undefined);
105
+ process.exit(error.code ?? 1);
106
+ }
107
+ else {
108
+ throw error;
109
+ }
110
+ }
111
+ installingSpinner.stop('Dependencies installed');
112
+ }
113
+ (0, prompts_1.note)(`cd ./${nodeName} && ${packageManager} run dev
114
+
115
+ 📚 Documentation: https://docs.n8n.io/integrations/creating-nodes/build/${type}-style-node/
116
+ 💬 Community: https://community.n8n.io`, 'Next Steps');
117
+ (0, prompts_1.outro)(`Created ./${nodeName} ✨`);
118
+ }
119
+ }
120
+ New.description = 'Create a starter community node in a new directory';
121
+ New.examples = [
122
+ '<%= config.bin %> <%= command.id %>',
123
+ '<%= config.bin %> <%= command.id %> n8n-nodes-my-app --skip-install',
124
+ '<%= config.bin %> <%= command.id %> n8n-nodes-my-app --force',
125
+ '<%= config.bin %> <%= command.id %> n8n-nodes-my-app --template declarative/custom',
126
+ ];
127
+ New.args = {
128
+ name: core_1.Args.string({ name: 'Name' }),
129
+ };
130
+ New.flags = {
131
+ force: core_1.Flags.boolean({
132
+ char: 'f',
133
+ description: 'Overwrite destination folder if it already exists',
134
+ }),
135
+ 'skip-install': core_1.Flags.boolean({ description: 'Skip installing dependencies' }),
136
+ template: core_1.Flags.string({
137
+ options: ['declarative/github-issues', 'declarative/custom', 'programmatic/example'],
138
+ }),
139
+ };
140
+ exports.default = New;
141
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/new/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const nodeNamePrompt: () => Promise<string>;
2
+ export declare const nodeTypePrompt: () => Promise<"declarative" | "programmatic">;
3
+ export declare const declarativeTemplatePrompt: () => Promise<"custom" | "githubIssues">;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.declarativeTemplatePrompt = exports.nodeTypePrompt = exports.nodeNamePrompt = void 0;
4
+ const prompts_1 = require("@clack/prompts");
5
+ const templates_1 = require("../../template/templates");
6
+ const prompts_2 = require("../../utils/prompts");
7
+ const validation_1 = require("../../utils/validation");
8
+ const nodeNamePrompt = async () => await (0, prompts_2.withCancelHandler)((0, prompts_1.text)({
9
+ message: "Package name (must start with 'n8n-nodes-' or '@org/n8n-nodes-')",
10
+ placeholder: 'n8n-nodes-my-app',
11
+ validate: validation_1.validateNodeName,
12
+ defaultValue: 'n8n-nodes-my-app',
13
+ }));
14
+ exports.nodeNamePrompt = nodeNamePrompt;
15
+ const nodeTypePrompt = async () => await (0, prompts_2.withCancelHandler)((0, prompts_1.select)({
16
+ message: 'What kind of node are you building?',
17
+ options: [
18
+ {
19
+ label: 'HTTP API',
20
+ value: 'declarative',
21
+ hint: 'Low-code, faster approval for n8n Cloud',
22
+ },
23
+ {
24
+ label: 'Other',
25
+ value: 'programmatic',
26
+ hint: 'Programmatic node with full flexibility',
27
+ },
28
+ ],
29
+ initialValue: 'declarative',
30
+ }));
31
+ exports.nodeTypePrompt = nodeTypePrompt;
32
+ const declarativeTemplatePrompt = async () => await (0, prompts_2.withCancelHandler)((0, prompts_1.select)({
33
+ message: 'What template do you want to use?',
34
+ options: Object.entries(templates_1.templates.declarative).map(([value, template]) => ({
35
+ value: value,
36
+ label: template.name,
37
+ hint: template.description,
38
+ })),
39
+ initialValue: 'githubIssues',
40
+ }));
41
+ exports.declarativeTemplatePrompt = declarativeTemplatePrompt;
42
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/new/prompts.ts"],"names":[],"mappings":";;;AAAA,4CAA8C;AAE9C,wDAAqD;AACrD,iDAAwD;AACxD,uDAA0D;AAEnD,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE,CACxC,MAAM,IAAA,2BAAiB,EACtB,IAAA,cAAI,EAAC;IACJ,OAAO,EAAE,kEAAkE;IAC3E,WAAW,EAAE,kBAAkB;IAC/B,QAAQ,EAAE,6BAAgB;IAC1B,YAAY,EAAE,kBAAkB;CAChC,CAAC,CACF,CAAC;AARU,QAAA,cAAc,kBAQxB;AAEI,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE,CACxC,MAAM,IAAA,2BAAiB,EACtB,IAAA,gBAAM,EAAiC;IACtC,OAAO,EAAE,qCAAqC;IAC9C,OAAO,EAAE;QACR;YACC,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,yCAAyC;SAC/C;QACD;YACC,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,yCAAyC;SAC/C;KACD;IACD,YAAY,EAAE,aAAa;CAC3B,CAAC,CACF,CAAC;AAlBU,QAAA,cAAc,kBAkBxB;AAEI,MAAM,yBAAyB,GAAG,KAAK,IAAI,EAAE,CACnD,MAAM,IAAA,2BAAiB,EACtB,IAAA,gBAAM,EAAqC;IAC1C,OAAO,EAAE,mCAAmC;IAC5C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,qBAAS,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,KAAK,EAAE,KAA2C;QAClD,KAAK,EAAE,QAAQ,CAAC,IAAI;QACpB,IAAI,EAAE,QAAQ,CAAC,WAAW;KAC1B,CAAC,CAAC;IACH,YAAY,EAAE,cAAc;CAC5B,CAAC,CACF,CAAC;AAXU,QAAA,yBAAyB,6BAWnC"}
@@ -0,0 +1 @@
1
+ export declare const createIntro: () => Promise<string>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIntro = void 0;
4
+ const package_manager_1 = require("../../utils/package-manager");
5
+ const prompts_1 = require("../../utils/prompts");
6
+ const createIntro = async () => {
7
+ const maybePackageManager = (0, package_manager_1.detectPackageManagerFromUserAgent)();
8
+ const packageManager = maybePackageManager ?? 'npm';
9
+ const commandName = maybePackageManager ? `${packageManager} create @n8n/node` : 'n8n-node new';
10
+ return await (0, prompts_1.getCommandHeader)(commandName);
11
+ };
12
+ exports.createIntro = createIntro;
13
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/commands/new/utils.ts"],"names":[],"mappings":";;;AAAA,iEAAgF;AAChF,iDAAuD;AAEhD,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;IACrC,MAAM,mBAAmB,GAAG,IAAA,mDAAiC,GAAE,CAAC;IAChE,MAAM,cAAc,GAAG,mBAAmB,IAAI,KAAK,CAAC;IACpD,MAAM,WAAW,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,cAAc,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC;IAChG,OAAO,MAAM,IAAA,0BAAgB,EAAC,WAAW,CAAC,CAAC;AAC5C,CAAC,CAAC;AALW,QAAA,WAAW,eAKtB"}
@@ -0,0 +1,8 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Prerelease extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {};
6
+ static hidden: boolean;
7
+ run(): Promise<void>;
8
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const package_manager_1 = require("../utils/package-manager");
5
+ class Prerelease extends core_1.Command {
6
+ async run() {
7
+ await this.parse(Prerelease);
8
+ const packageManager = (await (0, package_manager_1.detectPackageManager)()) ?? 'npm';
9
+ if (!process.env.RELEASE_MODE) {
10
+ this.log(`Run \`${packageManager} run release\` to publish the package`);
11
+ process.exit(1);
12
+ }
13
+ }
14
+ }
15
+ Prerelease.description = 'Only for internal use. Prevent npm publish, instead require npm run release';
16
+ Prerelease.examples = ['<%= config.bin %> <%= command.id %>'];
17
+ Prerelease.flags = {};
18
+ Prerelease.hidden = true;
19
+ exports.default = Prerelease;
20
+ //# sourceMappingURL=prerelease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerelease.js","sourceRoot":"","sources":["../../src/commands/prerelease.ts"],"names":[],"mappings":";;AAAA,sCAAsC;AAEtC,8DAAgE;AAEhE,MAAqB,UAAW,SAAQ,cAAO;IAO9C,KAAK,CAAC,GAAG;QACR,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAE7B,MAAM,cAAc,GAAG,CAAC,MAAM,IAAA,sCAAoB,GAAE,CAAC,IAAI,KAAK,CAAC;QAE/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,SAAS,cAAc,uCAAuC,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;;AAfe,sBAAW,GAC1B,6EAA6E,CAAC;AAC/D,mBAAQ,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACnD,gBAAK,GAAG,EAAE,CAAC;AACX,iBAAM,GAAG,IAAI,CAAC;kBALV,UAAU"}
@@ -0,0 +1,7 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Release extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {};
6
+ run(): Promise<void>;
7
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const prompts_1 = require("@clack/prompts");
4
+ const core_1 = require("@oclif/core");
5
+ const child_process_1 = require("../utils/child-process");
6
+ const package_manager_1 = require("../utils/package-manager");
7
+ const prompts_2 = require("../utils/prompts");
8
+ class Release extends core_1.Command {
9
+ async run() {
10
+ await this.parse(Release);
11
+ (0, prompts_1.intro)(await (0, prompts_2.getCommandHeader)('n8n-node release'));
12
+ const pm = (await (0, package_manager_1.detectPackageManager)()) ?? 'npm';
13
+ try {
14
+ await (0, child_process_1.runCommand)('release-it', [
15
+ '-n',
16
+ '--git.requireBranch main',
17
+ '--git.requireCleanWorkingDir',
18
+ '--git.requireUpstream',
19
+ '--git.requireCommits',
20
+ '--git.commit',
21
+ '--git.tag',
22
+ '--git.push',
23
+ '--git.changelog="npx auto-changelog --stdout --unreleased --commit-limit false -u --hide-credit"',
24
+ '--github.release',
25
+ `--hooks.before:init="${pm} run lint && ${pm} run build"`,
26
+ '--hooks.after:bump="npx auto-changelog -p"',
27
+ ], {
28
+ stdio: 'inherit',
29
+ context: 'local',
30
+ env: {
31
+ RELEASE_MODE: 'true',
32
+ },
33
+ });
34
+ }
35
+ catch (error) {
36
+ if (error instanceof child_process_1.ChildProcessError) {
37
+ if (error.signal) {
38
+ process.kill(process.pid, error.signal);
39
+ }
40
+ else {
41
+ process.exit(error.code ?? 0);
42
+ }
43
+ }
44
+ throw error;
45
+ }
46
+ }
47
+ }
48
+ Release.description = 'Publish your community node package to npm';
49
+ Release.examples = ['<%= config.bin %> <%= command.id %>'];
50
+ Release.flags = {};
51
+ exports.default = Release;
52
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":";;AAAA,4CAAuC;AACvC,sCAAsC;AAEtC,0DAAuE;AACvE,8DAAgE;AAChE,8CAAoD;AAEpD,MAAqB,OAAQ,SAAQ,cAAO;IAK3C,KAAK,CAAC,GAAG;QACR,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE1B,IAAA,eAAK,EAAC,MAAM,IAAA,0BAAgB,EAAC,kBAAkB,CAAC,CAAC,CAAC;QAElD,MAAM,EAAE,GAAG,CAAC,MAAM,IAAA,sCAAoB,GAAE,CAAC,IAAI,KAAK,CAAC;QAEnD,IAAI,CAAC;YACJ,MAAM,IAAA,0BAAU,EACf,YAAY,EACZ;gBACC,IAAI;gBACJ,0BAA0B;gBAC1B,8BAA8B;gBAC9B,uBAAuB;gBACvB,sBAAsB;gBACtB,cAAc;gBACd,WAAW;gBACX,YAAY;gBACZ,kGAAkG;gBAClG,kBAAkB;gBAClB,wBAAwB,EAAE,gBAAgB,EAAE,aAAa;gBACzD,4CAA4C;aAC5C,EACD;gBACC,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,OAAO;gBAChB,GAAG,EAAE;oBACJ,YAAY,EAAE,MAAM;iBACpB;aACD,CACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,iCAAiB,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;gBAC/B,CAAC;YACF,CAAC;YACD,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;;AA9Ce,mBAAW,GAAG,4CAA4C,CAAC;AAC3D,gBAAQ,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACnD,aAAK,GAAG,EAAE,CAAC;kBAHP,OAAO"}
@@ -0,0 +1,3 @@
1
+ export declare const config: import("@typescript-eslint/utils/dist/ts-eslint").FlatConfig.ConfigArray;
2
+ export declare const configWithoutCloudSupport: import("@typescript-eslint/utils/dist/ts-eslint").FlatConfig.ConfigArray;
3
+ export default config;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.configWithoutCloudSupport = exports.config = void 0;
7
+ const js_1 = __importDefault(require("@eslint/js"));
8
+ const eslint_plugin_community_nodes_1 = require("@n8n/eslint-plugin-community-nodes");
9
+ const config_1 = require("eslint/config");
10
+ const eslint_import_resolver_typescript_1 = require("eslint-import-resolver-typescript");
11
+ const eslint_plugin_import_x_1 = __importDefault(require("eslint-plugin-import-x"));
12
+ const eslint_plugin_n8n_nodes_base_1 = __importDefault(require("eslint-plugin-n8n-nodes-base"));
13
+ const typescript_eslint_1 = __importDefault(require("typescript-eslint"));
14
+ function createConfig(supportCloud = true) {
15
+ return typescript_eslint_1.default.config((0, config_1.globalIgnores)(['dist']), {
16
+ files: ['**/*.ts'],
17
+ extends: [
18
+ js_1.default.configs.recommended,
19
+ typescript_eslint_1.default.configs.recommended,
20
+ supportCloud
21
+ ? eslint_plugin_community_nodes_1.n8nCommunityNodesPlugin.configs.recommended
22
+ : eslint_plugin_community_nodes_1.n8nCommunityNodesPlugin.configs.recommendedWithoutN8nCloudSupport,
23
+ eslint_plugin_import_x_1.default.configs['flat/recommended'],
24
+ ],
25
+ rules: {
26
+ 'prefer-spread': 'off',
27
+ 'no-console': 'error',
28
+ },
29
+ }, {
30
+ plugins: { 'n8n-nodes-base': eslint_plugin_n8n_nodes_base_1.default },
31
+ settings: {
32
+ 'import-x/resolver-next': [(0, eslint_import_resolver_typescript_1.createTypeScriptImportResolver)()],
33
+ },
34
+ }, {
35
+ files: ['package.json'],
36
+ rules: {
37
+ ...eslint_plugin_n8n_nodes_base_1.default.configs.community.rules,
38
+ },
39
+ languageOptions: {
40
+ parser: typescript_eslint_1.default.parser,
41
+ parserOptions: {
42
+ extraFileExtensions: ['.json'],
43
+ },
44
+ },
45
+ }, {
46
+ files: ['./credentials/**/*.ts'],
47
+ rules: {
48
+ ...eslint_plugin_n8n_nodes_base_1.default.configs.credentials.rules,
49
+ 'n8n-nodes-base/cred-class-field-documentation-url-miscased': 'off',
50
+ 'n8n-nodes-base/cred-class-field-type-options-password-missing': 'off',
51
+ },
52
+ }, {
53
+ files: ['./nodes/**/*.ts'],
54
+ rules: {
55
+ ...eslint_plugin_n8n_nodes_base_1.default.configs.nodes.rules,
56
+ 'n8n-nodes-base/node-class-description-inputs-wrong-regular-node': 'off',
57
+ 'n8n-nodes-base/node-class-description-outputs-wrong': 'off',
58
+ 'n8n-nodes-base/node-param-type-options-max-value-present': 'off',
59
+ },
60
+ });
61
+ }
62
+ exports.config = createConfig();
63
+ exports.configWithoutCloudSupport = createConfig(false);
64
+ exports.default = exports.config;
65
+ //# sourceMappingURL=eslint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../../src/configs/eslint.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAgC;AAChC,sFAA6E;AAC7E,0CAA8C;AAC9C,yFAAmF;AACnF,oFAAkD;AAClD,gGAA0D;AAC1D,0EAA+D;AAE/D,SAAS,YAAY,CAAC,YAAY,GAAG,IAAI;IACxC,OAAO,2BAAQ,CAAC,MAAM,CACrB,IAAA,sBAAa,EAAC,CAAC,MAAM,CAAC,CAAC,EACvB;QACC,KAAK,EAAE,CAAC,SAAS,CAAC;QAClB,OAAO,EAAE;YACR,YAAM,CAAC,OAAO,CAAC,WAAW;YAC1B,2BAAQ,CAAC,OAAO,CAAC,WAAW;YAC5B,YAAY;gBACX,CAAC,CAAC,uDAAuB,CAAC,OAAO,CAAC,WAAW;gBAC7C,CAAC,CAAC,uDAAuB,CAAC,OAAO,CAAC,iCAAiC;YACpE,gCAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC;SACxC;QACD,KAAK,EAAE;YACN,eAAe,EAAE,KAAK;YACtB,YAAY,EAAE,OAAO;SACrB;KACD,EACD;QACC,OAAO,EAAE,EAAE,gBAAgB,EAAE,sCAAc,EAAE;QAC7C,QAAQ,EAAE;YACT,wBAAwB,EAAE,CAAC,IAAA,kEAA8B,GAAE,CAAC;SAC5D;KACD,EACD;QACC,KAAK,EAAE,CAAC,cAAc,CAAC;QACvB,KAAK,EAAE;YACN,GAAG,sCAAc,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK;SACzC;QACD,eAAe,EAAE;YAChB,MAAM,EAAE,2BAAQ,CAAC,MAAM;YACvB,aAAa,EAAE;gBACd,mBAAmB,EAAE,CAAC,OAAO,CAAC;aAC9B;SACD;KACD,EACD;QACC,KAAK,EAAE,CAAC,uBAAuB,CAAC;QAChC,KAAK,EAAE;YACN,GAAG,sCAAc,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK;YAE3C,4DAA4D,EAAE,KAAK;YAEnE,+DAA+D,EAAE,KAAK;SACtE;KACD,EACD;QACC,KAAK,EAAE,CAAC,iBAAiB,CAAC;QAC1B,KAAK,EAAE;YACN,GAAG,sCAAc,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;YAErC,iEAAiE,EAAE,KAAK;YACxE,qDAAqD,EAAE,KAAK;YAE5D,0DAA0D,EAAE,KAAK;SACjE;KACD,CACD,CAAC;AACH,CAAC;AACY,QAAA,MAAM,GAAG,YAAY,EAAE,CAAC;AACxB,QAAA,yBAAyB,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AAE7D,kBAAe,cAAM,CAAC"}
@@ -0,0 +1,16 @@
1
+ import Build from './commands/build';
2
+ import CloudSupport from './commands/cloud-support';
3
+ import Dev from './commands/dev';
4
+ import Lint from './commands/lint';
5
+ import New from './commands/new';
6
+ import Prerelease from './commands/prerelease';
7
+ import Release from './commands/release';
8
+ export declare const commands: {
9
+ new: typeof New;
10
+ build: typeof Build;
11
+ dev: typeof Dev;
12
+ prerelease: typeof Prerelease;
13
+ release: typeof Release;
14
+ lint: typeof Lint;
15
+ 'cloud-support': typeof CloudSupport;
16
+ };
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.commands = void 0;
7
+ const build_1 = __importDefault(require("./commands/build"));
8
+ const cloud_support_1 = __importDefault(require("./commands/cloud-support"));
9
+ const dev_1 = __importDefault(require("./commands/dev"));
10
+ const lint_1 = __importDefault(require("./commands/lint"));
11
+ const new_1 = __importDefault(require("./commands/new"));
12
+ const prerelease_1 = __importDefault(require("./commands/prerelease"));
13
+ const release_1 = __importDefault(require("./commands/release"));
14
+ exports.commands = {
15
+ new: new_1.default,
16
+ build: build_1.default,
17
+ dev: dev_1.default,
18
+ prerelease: prerelease_1.default,
19
+ release: release_1.default,
20
+ lint: lint_1.default,
21
+ 'cloud-support': cloud_support_1.default,
22
+ };
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,6DAAqC;AACrC,6EAAoD;AACpD,yDAAiC;AACjC,2DAAmC;AACnC,yDAAiC;AACjC,uEAA+C;AAC/C,iEAAyC;AAE5B,QAAA,QAAQ,GAAG;IACvB,GAAG,EAAE,aAAG;IACR,KAAK,EAAE,eAAK;IACZ,GAAG,EAAE,aAAG;IACR,UAAU,EAAE,oBAAU;IACtB,OAAO,EAAE,iBAAO;IAChB,IAAI,EAAE,cAAI;IAEV,eAAe,EAAE,uBAAY;CAC7B,CAAC"}
@@ -0,0 +1,29 @@
1
+ export type TemplateData<Config extends object = object> = {
2
+ destinationPath: string;
3
+ nodePackageName: string;
4
+ user?: Partial<{
5
+ name: string;
6
+ email: string;
7
+ }>;
8
+ packageManager: {
9
+ name: 'npm' | 'yarn' | 'pnpm';
10
+ installCommand: string;
11
+ };
12
+ config: Config;
13
+ };
14
+ type Require<T, K extends keyof T> = T & {
15
+ [P in K]-?: T[P];
16
+ };
17
+ export type Template<Config extends object = object> = {
18
+ name: string;
19
+ description: string;
20
+ path: string;
21
+ prompts?: () => Promise<Config>;
22
+ run?: (data: TemplateData<Config>) => Promise<void>;
23
+ };
24
+ export type TemplateWithRun<Config extends object = object> = Require<Template<Config>, 'run'>;
25
+ export declare function copyTemplateFilesToDestination<Config extends object>(template: Template<Config>, data: TemplateData): Promise<void>;
26
+ export declare function copyDefaultTemplateFilesToDestination(data: TemplateData): Promise<void>;
27
+ export declare function templateStaticFiles(data: TemplateData): Promise<void>;
28
+ export declare function createTemplate<Config extends object>(template: Template<Config>): TemplateWithRun<Config>;
29
+ export {};