Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
e430d38
chore: install commander;
uFloppyDisk Mar 25, 2025
3d50809
refactor: move validator functions to file;
uFloppyDisk Mar 25, 2025
c7797cb
refactor: single source of truth for cli args and interactive prompts;
uFloppyDisk Mar 26, 2025
ab3b0a9
fix(cli): accept string for pluginName flag;
uFloppyDisk Mar 28, 2025
1b7d497
refactor(schema): move initial value to schema-level;
uFloppyDisk Mar 28, 2025
9faa399
feat: ingest cli args and options;
uFloppyDisk Mar 28, 2025
6ca29fc
feat: merge cli args into prompt initial values;
uFloppyDisk Mar 28, 2025
8635062
feat: override prompts with cli args;
uFloppyDisk Mar 28, 2025
5e05c8b
fix: validate positional arguments;
uFloppyDisk Mar 28, 2025
d9fabde
feat: add forced/preanswered interactive mode flags;
uFloppyDisk Mar 28, 2025
04c5cd5
fix: pluginName option implies pluginSameName is false;
uFloppyDisk Mar 28, 2025
16810a1
feat: add author/description/initialVersion flags;
uFloppyDisk Mar 28, 2025
fc73cc3
feat: allow skip prompts for setup tasks with flag;
uFloppyDisk Mar 28, 2025
9b61628
chore(schema): kebab case flags;
uFloppyDisk Mar 28, 2025
4d9415a
feat: validate args and options;
uFloppyDisk Mar 28, 2025
5fdcd1a
refactor(addCommandLineArguments): DRY;
uFloppyDisk Mar 29, 2025
cf4bf66
fix: prompt preanswer regression when no args passed;
uFloppyDisk Mar 29, 2025
30e64b8
refactor(addCommandLineArguments): remove unnecessary function;
uFloppyDisk Mar 29, 2025
6b6b332
chore(cli-args): clarify -y flag effect in long name and description;
uFloppyDisk Mar 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
"description": "",
"dependencies": {
"chalk": "^5.4.1",
"commander": "^13.1.0",
"gradient-string": "^3.0.0",
"ora": "^8.2.0",
"prompts": "^2.4.2",
Expand Down
6 changes: 5 additions & 1 deletion src/__tests__/parameters.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { validateNonEmptyString, validatePathDoesNotExist, validateStringIsNotPath } from "~/parameters";
import { vol } from "memfs";
import fs from "fs";
import {
validateNonEmptyString,
validatePathDoesNotExist,
validateStringIsNotPath
} from "~/validations";

jest.mock("fs");

Expand Down
46 changes: 44 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,52 @@ import path from "path";
import pkg from "package.json";

import prompts from "prompts";
import parameters from "~/parameters";
import { addCommandLineArguments, programSchema, createPrompts, ProgramOption } from "~/parameters";
import generatePluginFiles from "~/generatePluginFiles";
import { IS_PRODUCTION, TARGET_BASE, TEMPLATE_BASE } from "~/constants";
import { createSpinner, error, renderCliInfo, renderGoodbye, renderMasthead, warn } from "~/vanity";
import { promiseWithSpinner } from "./helpers";
import { program } from "commander";

program.version(pkg.version);
const lookup = addCommandLineArguments(program, programSchema);

const parsedOpts = program.parse().opts();

const options = programSchema.reduce<Record<string, ProgramOption>>((acc, s) => {
const opt = parsedOpts?.[lookup[s.key]];
acc[s.key] = {
value: opt ?? (s.initial ?? null),
wasSet: opt != null,
}

return acc;
}, {});

const positionalArgs = programSchema.filter(s => s.arg && s.arg.type === "argument");
for (const [i, arg] of positionalArgs.entries()) {
if (!program.args[i]) continue;

options[arg.key].value = program.args[i];
options[arg.key].wasSet = true;
};

(() => {
if (options["forceInteractive"].value) return;

let preanswered = Object.entries(options);

const wereSet = preanswered.filter(o => o[1].wasSet);
if (wereSet.length <= 0) return;

if (options["interactive"].value) {
preanswered = wereSet;
}

preanswered = preanswered.map(o => [o[0], o[1].value]);

prompts.override(Object.fromEntries(preanswered));
})();

renderMasthead();
renderCliInfo();
Expand Down Expand Up @@ -53,7 +94,8 @@ const generateProject = new Promise<void>(async (resolve, reject) => {
return false;
}

const answers = await prompts(parameters, { onCancel });
const interactivePrompts = createPrompts(programSchema, options);
const answers = await prompts(interactivePrompts, { onCancel });
if (cancelled) {
warn("Cancelled making a CounterStrikeSharp plugin.");
return resolve();
Expand Down
Loading