do-functions-cli 1.0.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,70 +1,70 @@
1
- # do-functions-cli
2
-
3
- ![npm version](https://img.shields.io/npm/v/do-functions-cli.svg)
4
- ![license](https://img.shields.io/badge/license-MIT-blue.svg)
5
-
6
- A CLI tool to streamline working with DigitalOcean Serverless Functions.
7
-
8
- ## Features
9
-
10
- - Create new function packages via an interactive `create` command
11
- - Support for multiple languages (JavaScript, TypeScript, more to come)
12
- - Auto-install dependencies in the generated package (optional)
13
- - Automatically update the root `project.yml` with the new package/function (optional)
14
-
15
- ## Installation
16
-
17
- Global:
18
-
19
- ```bash
20
- npm i -g do-functions-cli
21
- ```
22
-
23
- Local:
24
-
25
- ```bash
26
- npm i -D do-functions-cli
27
- ```
28
-
29
- ## Usage
30
-
31
- Run the CLI and follow the prompts:
32
-
33
- ```bash
34
- # Show help
35
- npx do-functions-cli --help
36
-
37
- # Create a new function
38
- npx do-functions-cli create
39
- ```
40
-
41
- ## Roadmap / Ideas
42
-
43
- - Non-interactive flags for commands (see below)
44
- - Additional commands: `validate`, `deploy`, etc.
45
-
46
- ## Planned CLI Flags
47
-
48
- - `--packages-dir <path>`: Set root packages directory (defaults to `./packages`).
49
- - `--function <package/name>`: Provide function identifier directly.
50
- - `--<language>`: Choose template language (e.g., `--javascript`, `--typescript`).
51
- - `--install` / `--no-install`: Control dependency installation step.
52
- - `--add-project` / `--no-add-project`: Control `project.yml` auto-update.
53
- - `--dry-run`: Show intended actions without any file changes.
54
- - `--verbose`: Print detailed logs for troubleshooting.
55
-
56
- ## Troubleshooting
57
-
58
- - If `project.yml` parsing fails, ensure the file is valid YAML and matches the expected schema:
59
-
60
- ```yaml
61
- packages:
62
- - name: Package Name
63
- functions:
64
- - name: sample/func1
65
- runtime: nodejs:18
66
- web: true
67
- ...
68
- ```
69
-
70
- - Ensure Node.js 18+ for best compatibility with templates and runtime.
1
+ # do-functions-cli
2
+
3
+ ![npm version](https://img.shields.io/npm/v/do-functions-cli.svg)
4
+ ![license](https://img.shields.io/badge/license-MIT-blue.svg)
5
+
6
+ A CLI tool to streamline working with DigitalOcean Serverless Functions.
7
+
8
+ ### NOTE: This project has no affiliation with [do-functions](https://github.com/mrbrianevans/do-functions), but was heavily inspired by it. I will likely end up incorporating some of the features of that project into this one.
9
+
10
+ ## Features
11
+
12
+ - Create new function packages via an interactive `create` command
13
+ - Support for multiple languages (JavaScript, TypeScript, more to come)
14
+ - Auto-install dependencies in the generated package (optional)
15
+ - Automatically update the root `project.yml` with the new package/function (optional)
16
+
17
+ ## Installation
18
+
19
+ Global:
20
+
21
+ ```bash
22
+ npm i -g do-functions-cli
23
+ ```
24
+
25
+ Local:
26
+
27
+ ```bash
28
+ npm i -D do-functions-cli
29
+ ```
30
+
31
+ ## Usage
32
+
33
+ Run the CLI and follow the prompts:
34
+
35
+ ```bash
36
+ # Show help
37
+ npx do-functions-cli --help
38
+
39
+ # Create a new function
40
+ npx do-functions-cli create
41
+ ```
42
+
43
+ ## Roadmap / Ideas
44
+
45
+ - Non-interactive flags for commands (see below)
46
+ - Additional commands: `validate`, `deploy`, etc.
47
+
48
+ ## Planned CLI Flags
49
+
50
+ - `--<language>`: Choose template language (e.g., `--javascript`, `--typescript`).
51
+ - `--install` / `--no-install`: Control dependency installation step.
52
+ - `--add-project` / `--no-add-project`: Control `project.yml` auto-update.
53
+ - `--dry-run`: Show intended actions without any file changes.
54
+ - `--verbose`: Print detailed logs for troubleshooting.
55
+
56
+ ## Troubleshooting
57
+
58
+ - If `project.yml` parsing fails, ensure the file is valid YAML and matches the expected schema:
59
+
60
+ ```yaml
61
+ packages:
62
+ - name: sample
63
+ functions:
64
+ - name: hello
65
+ runtime: nodejs:18
66
+ web: true
67
+ ...
68
+ ```
69
+
70
+ - Ensure Node.js 18+ for best compatibility with templates and runtime.
package/dist/cli.js CHANGED
@@ -23,10 +23,11 @@ program.parse(process.argv);
23
23
  process.on('uncaughtException', (error) => {
24
24
  if (error instanceof Error && error.name === 'ExitPromptError') {
25
25
  console.log('👋 until next time!');
26
+ process.exit(0);
26
27
  }
27
28
  else {
28
- // Rethrow unknown errors for proper error handling and exit
29
- throw error;
29
+ console.error(error);
30
+ process.exit(1);
30
31
  }
31
32
  });
32
33
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,aAAa,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,cAAc,CAAC;AAE9B,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnF,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC;AAEvC,kCAAkC;AAClC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,yDAAyD,CAAC;KACtE,OAAO,CAAC,UAAU,CAAC,CAAC;AAEvB,sEAAsE;AACtE,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,2CAA2C;AAC3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B;;;;;GAKG;AACH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,4DAA4D;QAC5D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,aAAa,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,cAAc,CAAC;AAE9B,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnF,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC;AAEvC,kCAAkC;AAClC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,yDAAyD,CAAC;KACtE,OAAO,CAAC,UAAU,CAAC,CAAC;AAEvB,sEAAsE;AACtE,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,2CAA2C;AAC3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B;;;;;GAKG;AACH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,QAAA,MAAM,aAAa,SAAwB,CAAC;AAmH5C,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,QAAA,MAAM,aAAa,SAAwB,CAAC;AAiI5C,eAAe,aAAa,CAAC"}
@@ -17,21 +17,34 @@ import * as util from 'node:util';
17
17
  import ora from 'ora';
18
18
  import { scaffoldFunction, updateProjectConfig } from '../utils/util.js';
19
19
  import { validateFunctionName } from '../utils/validators.js';
20
+ import { CreateOptionsSchema } from '../schemas/createOptions.js';
21
+ import * as z from "zod";
20
22
  // Promisify exec to use async/await syntax
21
23
  const exec = util.promisify(child_process.exec);
22
24
  const createCommand = new Command('create');
23
- createCommand.description('create a new serverless function');
24
- createCommand.option('-y, --yes', 'skip all optional prompts and use defaults');
25
- createCommand.action(async (options) => {
26
- const userPackagesDir = await input({
27
- message: 'Enter the root function packages directory:',
28
- default: './packages',
29
- });
30
- const userFuncPath = await input({
25
+ createCommand
26
+ .description('create a new serverless function')
27
+ .option('-y, --yes', 'skip all optional prompts and use defaults')
28
+ .option('--packages-dir <dir>', 'specify the root packages directory')
29
+ .option('-f, --func <name>', 'specify the package/function name')
30
+ .action(async (options) => {
31
+ const parsedOptionsResult = CreateOptionsSchema.safeParse(options);
32
+ if (!parsedOptionsResult.success) {
33
+ const prettyError = z.prettifyError(parsedOptionsResult.error);
34
+ console.log(prettyError);
35
+ return;
36
+ }
37
+ const parsedOptions = parsedOptionsResult.data;
38
+ const userPackagesDir = parsedOptions.packagesDir ||
39
+ (await input({
40
+ message: 'Enter the root function packages directory:',
41
+ default: './packages',
42
+ }));
43
+ const userFuncPath = parsedOptions.func || (await input({
31
44
  message: 'Enter the package/function name to create:',
32
45
  default: 'sample/hello',
33
46
  validate: validateFunctionName,
34
- });
47
+ }));
35
48
  const [pkgName, funcName] = userFuncPath.split('/');
36
49
  const resolvedFuncDir = path.resolve(userPackagesDir, userFuncPath);
37
50
  if (await fs.exists(resolvedFuncDir)) {
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import * as z from "zod";
2
+ export declare const CreateOptionsSchema: z.ZodObject<{
3
+ packagesDir: z.ZodOptional<z.ZodString>;
4
+ func: z.ZodOptional<z.ZodString>;
5
+ }, z.core.$strip>;
6
+ export type CreateOptions = z.infer<typeof CreateOptionsSchema>;
7
+ //# sourceMappingURL=createOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createOptions.d.ts","sourceRoot":"","sources":["../../src/schemas/createOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import * as z from "zod";
2
+ export const CreateOptionsSchema = z.object({
3
+ packagesDir: z.string().optional(),
4
+ func: z.string().regex(/^[a-z]+\/[a-z]+$/).optional(),
5
+ });
6
+ //# sourceMappingURL=createOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createOptions.js","sourceRoot":"","sources":["../../src/schemas/createOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE;CACtD,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "do-functions-cli",
3
- "version": "1.0.0",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,24 +0,0 @@
1
- export type LanguageChoice = 'typescript' | 'javascript';
2
- /**
3
- * Get the template directory for a function depending on language choice.
4
- */
5
- export declare function getTemplateDir(funcLanguage: LanguageChoice): string;
6
- export type ScaffoldOptions = {
7
- targetDir: string;
8
- funcPath: string;
9
- funcLanguage: LanguageChoice;
10
- };
11
- /**
12
- * Scaffolds a function directory by emptying target and copying template, then updating package.json name.
13
- */
14
- export declare function scaffoldFunction({ targetDir, funcPath, funcLanguage, }: ScaffoldOptions): Promise<void>;
15
- export type UpdateStatus = 'created-new-config' | 'added-package' | 'added-function' | 'function-exists' | 'error';
16
- export type UpdateResult = {
17
- status: UpdateStatus;
18
- };
19
- /**
20
- * Update or create the project.yml configuration with the given package and function.
21
- * Uses early returns for clarity. Returns a status describing the performed action.
22
- */
23
- export declare function updateProjectConfig(projectYmlPath: string, pkgName: string, funcName: string): Promise<UpdateResult>;
24
- //# sourceMappingURL=scaffold.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/utils/scaffold.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,YAAY,CAAC;AAEzD;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,cAAc,GAAG,MAAM,CAOnE;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,cAAc,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,SAAS,EACT,QAAQ,EACR,YAAY,GACb,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjC;AAED,MAAM,MAAM,YAAY,GACpB,oBAAoB,GACpB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,OAAO,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CA+BvB"}
@@ -1,56 +0,0 @@
1
- import fs from 'fs-extra';
2
- import * as path from 'node:path';
3
- import { DEFAULT_RUNTIME } from '../constants.js';
4
- import { DOProjectYmlSchema } from '../schemas/doProjectYml.js';
5
- import YAML from 'yaml';
6
- import { fileURLToPath } from 'node:url';
7
- /**
8
- * Get the template directory for a function depending on language choice.
9
- */
10
- export function getTemplateDir(funcLanguage) {
11
- return path.join(fileURLToPath(new URL('../../', import.meta.url)), 'templates', 'functions', funcLanguage);
12
- }
13
- /**
14
- * Scaffolds a function directory by emptying target and copying template, then updating package.json name.
15
- */
16
- export async function scaffoldFunction({ targetDir, funcPath, funcLanguage, }) {
17
- await fs.emptyDir(targetDir);
18
- const templateDir = getTemplateDir(funcLanguage);
19
- await fs.copy(templateDir, targetDir);
20
- const packageJsonPath = path.join(targetDir, 'package.json');
21
- const packageJson = await fs.readJson(packageJsonPath);
22
- await fs.writeJson(packageJsonPath, { name: `@${funcPath}`, ...packageJson }, { spaces: 2 });
23
- }
24
- /**
25
- * Update or create the project.yml configuration with the given package and function.
26
- * Uses early returns for clarity. Returns a status describing the performed action.
27
- */
28
- export async function updateProjectConfig(projectYmlPath, pkgName, funcName) {
29
- try {
30
- const functionObj = { name: funcName, runtime: DEFAULT_RUNTIME, web: true };
31
- const exists = await fs.exists(projectYmlPath);
32
- if (!exists) {
33
- const initial = { packages: [{ name: pkgName, functions: [functionObj] }] };
34
- await fs.writeFile(projectYmlPath, YAML.stringify(initial));
35
- return { status: 'created-new-config' };
36
- }
37
- const parsed = DOProjectYmlSchema.parse(YAML.parse(await fs.readFile(projectYmlPath, 'utf-8')));
38
- const pkg = parsed.packages.find((p) => p.name === pkgName);
39
- if (!pkg) {
40
- parsed.packages.push({ name: pkgName, functions: [functionObj] });
41
- await fs.writeFile(projectYmlPath, YAML.stringify(parsed));
42
- return { status: 'added-package' };
43
- }
44
- if (pkg.functions.find((f) => f.name === funcName)) {
45
- return { status: 'function-exists' }; // No write needed
46
- }
47
- pkg.functions.push(functionObj);
48
- await fs.writeFile(projectYmlPath, YAML.stringify(parsed));
49
- return { status: 'added-function' };
50
- }
51
- catch (e) {
52
- console.error(e);
53
- return { status: 'error' };
54
- }
55
- }
56
- //# sourceMappingURL=scaffold.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/utils/scaffold.ts"],"names":[],"mappings":"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"}