Skip to content

Commit

Permalink
Merge pull request #12 from wilfreud/dev
Browse files Browse the repository at this point in the history
New release
  • Loading branch information
wilfreud authored Apr 24, 2024
2 parents 1020c21 + 0a0667b commit c525f65
Show file tree
Hide file tree
Showing 10 changed files with 186 additions and 177 deletions.
9 changes: 9 additions & 0 deletions .changeset/wicked-pumas-kneel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"quirgo": patch
---

- Better error handling; conditional display with --verbose
- New banner on init
- Removed unnecessary files
- Better handling of async calls in general
- Better handling of console output and spinner
19 changes: 6 additions & 13 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,17 @@

- Replace OctokitResponse<any> by proper typing!
- Consider writing tests (unit tests and whatnot)
- Add warning about gitbub's rate limit
- Changeset to major version when basic cli is active
- Octokit
- Check if user is authenticated
- Add warning about gitbub's rate limit (docs)
- Add a mini logger lib file
- Handle verbose properly

## From feedback

- [x] use more branches (e.g. `main`, `develop`, `feature/...`, `bugfix/...`), moost of them will be temporary till reviewing process
- [x] see if owner can be retrieved from GitHub access token, use default as username
- [] better README
- [] donner plus d'infos pour l'access token, permettre d'obtenir un lien pour le générer avec peut-etre en query params de quoi remplir le formulaire avec le minimum requis pour l'access token
- [] preciser les permissions accordees a quirgo sont les permissions minimales requises
- [] donner la possibilite de stocker le token, voire meme plusieurs
- [] set verbose to false at default in configuration
- [ ] better README
- [ ] donner plus d'infos pour l'access token, permettre d'obtenir un lien pour le générer avec peut-etre en query params de quoi remplir le formulaire avec le minimum requis pour l'access token
- [ ] preciser les permissions accordees a quirgo sont les permissions minimales requises
- [ ] donner la possibilite de stocker le token, voire meme plusieurs
- [x] set verbose to false at default in configuration
- [x] mutual exclusion for options --json && --env
- [] simplify the usage of --verbose (specially when default is false)

-- CLI --
Other: [gulp, jest]
148 changes: 79 additions & 69 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,10 @@ import { KeyValueType } from "./types/parsers.js";

console.log(BANNER);

/**
* TODO: handle the case when --env/--json is provided
* TODO: create todolist in README.md
* TODO: doc -> note feature about default owner if -o not specified
*
*/

// Declare the program
const program = new Command();

function errorColor(str: string) {
// Add ANSI escape codes to display text in red.
return `\x1b[31m${str}\x1b[0m`;
}

program.configureOutput({
// Visibly override write routines as example!
// writeOut: (str) => process.stdout.write(`[OUT] ${str}`),
// writeErr: (str) => process.stdout.write(str),
// Highlight errors in color.
outputError: (str, write) => write(chalk.red(str)),
});

Expand Down Expand Up @@ -71,15 +55,7 @@ program
new Option("-j, --json <path>", "Path to a JSON file to parse").conflicts(
"env"
)
)
.action((opts) => {
const { env, token, repo, owner, json } = opts;
if (token) repoManager = new RepoManager(token);

if (repo) config.repositoryName = repo;

if (owner) config.repositoryOwner = owner;
});
);

// Add commands
const varsCommand = new Command("vars");
Expand All @@ -92,10 +68,14 @@ varsCommand
try {
await fn();
const list = await repoManager?.listRepoVariables(config);
console.log("Total:", chalk.green(list?.data.total_count));
spinner.clear();
console.table(list?.data.variables);
console.log(chalk.bgGreen("Total: " + list?.data.total_count + " "));
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
});
varsCommand
Expand All @@ -105,7 +85,10 @@ varsCommand
await fn();
await createVariableFn(config, repoManager, parsedKeyValues, name, value);
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
})
.description("Create a new variable");
Expand All @@ -117,7 +100,10 @@ varsCommand
await fn();
await updateVariableFn(config, repoManager, parsedKeyValues, name, value);
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
})
.description("Update an existing variable");
Expand All @@ -129,7 +115,10 @@ varsCommand
await fn();
await removeVariableFn(config, repoManager, parsedKeyValues, name);
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
});

Expand All @@ -153,11 +142,21 @@ varsCommand.action(async () => {

switch (actionOption) {
case "list":
const variables = await repoManager?.listRepoVariables(config);
console.table(variables?.data.variables);
console.log(
chalk.bgGreen("Total: " + variables?.data.total_count + " ")
);
try {
const variables = await repoManager?.listRepoVariables(config);
spinner.clear();
console.table(variables?.data.variables);
console.log(
chalk.bgGreen("Total: " + variables?.data.total_count + " ")
);
} catch (err) {
if (config.verbose) console.error(err);
console.error(
chalk.red(
"An error occured; please check the repository infos (owner & name)"
)
);
}
break;

case "create":
Expand All @@ -176,7 +175,10 @@ varsCommand.action(async () => {
break;
}
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
});

Expand All @@ -191,10 +193,14 @@ secretsCommand
try {
await fn();
const secs = await repoManager?.listRepoSecrets(config);
spinner.clear();
console.table(secs?.data.secrets);
console.log(chalk.bgGreen("Total:", secs?.data.total_count));
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
});

Expand All @@ -206,7 +212,10 @@ secretsCommand
await fn();
await setSecretFn(config, repoManager, parsedKeyValues, name, value);
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
});

Expand All @@ -218,7 +227,10 @@ secretsCommand
await fn();
await removeSecretFn(config, repoManager, parsedKeyValues, name);
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
});

Expand All @@ -240,8 +252,9 @@ secretsCommand.action(async () => {
switch (actionOption) {
case "list":
const secrets = await repoManager?.listRepoSecrets(config);
console.table(secrets?.data.secrets);
spinner.clear();
console.log(chalk.bgGreen("Total: " + secrets?.data.total_count + " "));
console.table(secrets?.data.secrets);
break;

case "set":
Expand All @@ -256,11 +269,13 @@ secretsCommand.action(async () => {
break;
}
} catch (err) {
console.error(chalk.red(err));
if (config.verbose) console.error(err);
console.error(
chalk.red("An error occured; please check the repository infos")
);
}
});
program.hook("postAction", () => {
console.log("Command executed successfully 🚀");
spinner.stop().clear();
});

Expand All @@ -286,23 +301,22 @@ program.on("option:owner", (owner) => {
});

program.on("option:env", (env) => {
if (!program.getOptionValue("json"))
try {
parsedKeyValues = envParser(env, { verbose: config.verbose || false });
} catch (err) {
console.error(chalk.red(err));
process.exit(-1);
}
const verbose: boolean = program.opts().verbose;
try {
parsedKeyValues = envParser(env, { verbose });
} catch (err) {
console.error(chalk.red(err));
process.exit(-1);
}
});

program.on("option:json", (json) => {
if (!program.getOptionValue("env"))
try {
parsedKeyValues = jsonParser(json, { verbose: config.verbose || false });
} catch (err) {
console.error(chalk.red(err));
process.exit(-1);
}
try {
parsedKeyValues = jsonParser(json, { verbose: config.verbose || false });
} catch (err) {
console.error(chalk.red(err));
process.exit(-1);
}
});

program.action(() => {
Expand All @@ -329,16 +343,17 @@ async function fn() {
}

// check auth and set default owner

try {
config.repositoryOwner = (await repoManager.getUserLogin()) || "";
if (!config.repositoryOwner) {
config.repositoryOwner = (await repoManager.getUserLogin()) || "";

if (config.verbose) {
console.log(
chalk.cyan("-> Using"),
chalk.bgBlueBright(config.repositoryOwner),
chalk.cyan("as default repository owner")
);
if (config.verbose) {
console.log(
chalk.cyan("-> Using"),
chalk.bgBlueBright(config.repositoryOwner),
chalk.cyan("as default repository owner")
);
}
}
} catch (err: any) {
console.error(
Expand Down Expand Up @@ -369,8 +384,3 @@ async function fn() {
config.repositoryOwner = repoOwner;
}
}

// // If no command is provided, show help
// if (!process.argv.slice(2).length) {
// program.outputHelp();
// }
31 changes: 19 additions & 12 deletions src/lib/actions/secrets.actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Configuration } from "@/types/repository-manager";
import { RepoManager } from "../repository-manager";
import { input } from "@inquirer/prompts";
import chalk from "chalk";
import { spinner } from "../spinner.js";

/**
* Create a new secret in the repository.
Expand All @@ -24,15 +25,18 @@ export async function setSecretFn(
if (!value) value = await input({ message: "Secret value: " });
await repoManager?.setRepoSecret(config, name, value);
} else {
Object.keys(parsedKeyValues).map(async (key) => {
// here pause the spinner, set the secret, then start the spinner again
await repoManager?.setRepoSecret(
config,
key,
parsedKeyValues[key] as string
);
});
await Promise.all(
Object.keys(parsedKeyValues).map(async (key) => {
// here pause the spinner, set the secret, then start the spinner again
await repoManager?.setRepoSecret(
config,
key,
parsedKeyValues[key] as string
);
})
);
}
spinner.stopAndPersist();
console.log(chalk.green("🍭 Secret(s) set successfully!"));
}

Expand All @@ -50,12 +54,15 @@ export async function removeSecretFn(
name?: string
) {
if (Object.keys(parsedKeyValues).length > 0) {
Object.keys(parsedKeyValues).map(async (key) => {
await repoManager?.removeRepoSecret(config, key);
});
await Promise.all(
Object.keys(parsedKeyValues).map(async (key) => {
await repoManager?.removeRepoSecret(config, key);
})
);
} else {
if (!name) name = await input({ message: "Secret name: " });
await repoManager?.removeRepoSecret(config, name);
console.log(chalk.green("🍭 Secret(s) removed successfully!"));
}
spinner.stopAndPersist();
console.log(chalk.green("🍭 Secret(s) removed successfully!"));
}
Loading

0 comments on commit c525f65

Please sign in to comment.