@anth0nycodes/license-generator 0.1.3 → 0.2.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/.github/PULL_REQUEST_TEMPLATE.md +0 -1
- package/CONTRIBUTING.md +5 -4
- package/README.md +39 -7
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/helpers.d.ts +5 -0
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +27 -0
- package/dist/helpers.js.map +1 -1
- package/dist/index.js +56 -7
- package/dist/index.js.map +1 -1
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +2 -1
- package/dist/license.js.map +1 -1
- package/package.json +1 -1
- package/src/constants.ts +1 -0
- package/src/helpers.ts +37 -1
- package/src/index.ts +76 -5
- package/src/license.ts +3 -4
|
@@ -33,7 +33,6 @@ Fixes #
|
|
|
33
33
|
|
|
34
34
|
- [ ] Tested locally with `pnpm dev`
|
|
35
35
|
- [ ] Tested built version with `pnpm build && pnpm start`
|
|
36
|
-
- [ ] Tested as installed package with `pnpm link`
|
|
37
36
|
- [ ] Tested with different license types
|
|
38
37
|
- [ ] Tested edge cases (existing LICENSE file, etc.)
|
|
39
38
|
|
package/CONTRIBUTING.md
CHANGED
|
@@ -17,17 +17,20 @@ Please be respectful and considerate in your interactions with other contributor
|
|
|
17
17
|
|
|
18
18
|
1. Fork the repository on GitHub
|
|
19
19
|
2. Clone your fork locally:
|
|
20
|
+
|
|
20
21
|
```bash
|
|
21
22
|
git clone https://github.com/YOUR_USERNAME/license-generator.git
|
|
22
23
|
cd license-generator
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
3. Install dependencies:
|
|
27
|
+
|
|
26
28
|
```bash
|
|
27
29
|
pnpm install
|
|
28
30
|
```
|
|
29
31
|
|
|
30
32
|
4. Create a new branch for your feature or bug fix:
|
|
33
|
+
|
|
31
34
|
```bash
|
|
32
35
|
git checkout -b feature/your-feature-name
|
|
33
36
|
```
|
|
@@ -45,10 +48,6 @@ pnpm build
|
|
|
45
48
|
|
|
46
49
|
# Run the built version
|
|
47
50
|
pnpm start
|
|
48
|
-
|
|
49
|
-
# Test as an installed package
|
|
50
|
-
pnpm link
|
|
51
|
-
generate-license
|
|
52
51
|
```
|
|
53
52
|
|
|
54
53
|
### Making Changes
|
|
@@ -66,11 +65,13 @@ generate-license
|
|
|
66
65
|
### Pull Request Process
|
|
67
66
|
|
|
68
67
|
1. Commit your changes with clear, descriptive commit messages:
|
|
68
|
+
|
|
69
69
|
```bash
|
|
70
70
|
git commit -m "Add feature: description of your changes"
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
2. Push to your fork:
|
|
74
|
+
|
|
74
75
|
```bash
|
|
75
76
|
git push origin feature/your-feature-name
|
|
76
77
|
```
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ An interactive CLI tool to quickly generate open-source licenses for your projec
|
|
|
4
4
|
|
|
5
5
|
## Demo
|
|
6
6
|
|
|
7
|
-
https://github.com/user-attachments/assets/25d4a68b-4cb3-4570-ac57-88d955bbcb53
|
|
7
|
+
<https://github.com/user-attachments/assets/25d4a68b-4cb3-4570-ac57-88d955bbcb53>
|
|
8
8
|
|
|
9
9
|
## Features
|
|
10
10
|
|
|
@@ -27,6 +27,8 @@ npm install -g @anth0nycodes/license-generator
|
|
|
27
27
|
|
|
28
28
|
## Usage
|
|
29
29
|
|
|
30
|
+
### Interactive Mode (Default)
|
|
31
|
+
|
|
30
32
|
```bash
|
|
31
33
|
generate-license
|
|
32
34
|
```
|
|
@@ -38,6 +40,41 @@ The CLI will guide you through:
|
|
|
38
40
|
3. **Enter copyright year** - Defaults to the current year
|
|
39
41
|
4. **Confirm** - The LICENSE file will be created in your current directory
|
|
40
42
|
|
|
43
|
+
### Options
|
|
44
|
+
|
|
45
|
+
#### Quick Mode
|
|
46
|
+
|
|
47
|
+
Generate a license instantly using your saved default license, current year, and GitHub username:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
generate-license --quick
|
|
51
|
+
# or
|
|
52
|
+
generate-license -q
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
#### Set Default License
|
|
56
|
+
|
|
57
|
+
Set a default license for quick mode:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
generate-license --set <license-key>
|
|
61
|
+
# or
|
|
62
|
+
generate-license -s <license-key>
|
|
63
|
+
|
|
64
|
+
# Example:
|
|
65
|
+
generate-license --set mit
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### List Available Licenses
|
|
69
|
+
|
|
70
|
+
View all available license keys that can be used with the `--set` option:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
generate-license --list
|
|
74
|
+
# or
|
|
75
|
+
generate-license --ls
|
|
76
|
+
```
|
|
77
|
+
|
|
41
78
|
## Supported Licenses
|
|
42
79
|
|
|
43
80
|
This tool uses the GitHub Licenses API, which includes:
|
|
@@ -59,6 +96,7 @@ This tool uses the GitHub Licenses API, which includes:
|
|
|
59
96
|
## Requirements
|
|
60
97
|
|
|
61
98
|
- Node.js 20.x or higher
|
|
99
|
+
- Git
|
|
62
100
|
|
|
63
101
|
## Development
|
|
64
102
|
|
|
@@ -86,12 +124,6 @@ Contributions are welcome! Please feel free to submit a Pull Request.
|
|
|
86
124
|
|
|
87
125
|
For detailed guidelines on how to contribute, please see our [Contributing Guide](CONTRIBUTING.md).
|
|
88
126
|
|
|
89
|
-
## Author
|
|
90
|
-
|
|
91
|
-
**Anthony Hoang**
|
|
92
|
-
|
|
93
|
-
- GitHub: [@anth0nycodes](https://github.com/anth0nycodes)
|
|
94
|
-
|
|
95
127
|
## Links
|
|
96
128
|
|
|
97
129
|
- [npm package](https://www.npmjs.com/package/@anth0nycodes/license-generator)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,oCAAoC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,iCAAiC,CAAC"}
|
package/dist/helpers.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
export declare function getGitUsername(): string;
|
|
2
2
|
export declare function fileExists(path: string): Promise<boolean>;
|
|
3
|
+
export interface Config {
|
|
4
|
+
defaultLicense?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function getConfig(): Promise<Config>;
|
|
7
|
+
export declare function setConfig(config: Config): Promise<void>;
|
|
3
8
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,WAG7B;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,oBAO5C;AAKD,MAAM,WAAW,MAAM;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAQjD;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,iBAc7C"}
|
package/dist/helpers.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import { constants } from "node:fs";
|
|
3
3
|
import { access } from "node:fs/promises";
|
|
4
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { homedir } from "node:os";
|
|
4
7
|
export function getGitUsername() {
|
|
5
8
|
const uncleanName = String(execSync("git config user.name"));
|
|
6
9
|
return uncleanName.replace(/\r?\n/g, "");
|
|
@@ -14,4 +17,28 @@ export async function fileExists(path) {
|
|
|
14
17
|
return false;
|
|
15
18
|
}
|
|
16
19
|
}
|
|
20
|
+
const CONFIG_DIR = join(homedir(), ".license-generator");
|
|
21
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
22
|
+
export async function getConfig() {
|
|
23
|
+
try {
|
|
24
|
+
const content = await readFile(CONFIG_FILE, "utf8");
|
|
25
|
+
return JSON.parse(content);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// config doesn't exist yet, return empty config
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function setConfig(config) {
|
|
33
|
+
try {
|
|
34
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
35
|
+
const existingConfig = await getConfig();
|
|
36
|
+
const updatedConfig = { ...existingConfig, ...config };
|
|
37
|
+
await writeFile(CONFIG_FILE, JSON.stringify(updatedConfig, null, 2), "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error(`Error occurred in setConfig: ${error}`);
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
17
44
|
//# sourceMappingURL=helpers.js.map
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,cAAc;IAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC7D,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAMpD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,SAAS,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QACvD,MAAM,SAAS,CACb,WAAW,EACX,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,EACtC,MAAM,CACP,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,19 +5,68 @@ import inquirer from "inquirer";
|
|
|
5
5
|
import { createLicense, getLicenseContent, getLicenses } from "./license.js";
|
|
6
6
|
import color from "picocolors";
|
|
7
7
|
import { getGitUsername } from "./helpers.js";
|
|
8
|
+
import { getConfig, setConfig } from "./helpers.js";
|
|
9
|
+
import { BASE_URL } from "./constants.js";
|
|
8
10
|
const main = async () => {
|
|
11
|
+
const licenses = await getLicenses();
|
|
9
12
|
program
|
|
10
13
|
.name("License Generator")
|
|
11
14
|
.description("A CLI application that generates open-source licenses for your repositories.")
|
|
12
|
-
.
|
|
13
|
-
|
|
14
|
-
.option("
|
|
15
|
-
.
|
|
16
|
-
|
|
15
|
+
.version("0.1.3");
|
|
16
|
+
program
|
|
17
|
+
.option("--ls, --list", "list all available license keys")
|
|
18
|
+
.option("-q, --quick", "alternative to interactive mode, generate a license using the saved license")
|
|
19
|
+
.option("-s, --set <license>", "set a default license for -q / --quick option");
|
|
17
20
|
program.parse();
|
|
21
|
+
const opts = program.opts();
|
|
22
|
+
// Lists all available license keys
|
|
23
|
+
if (opts.list) {
|
|
24
|
+
const availableLicenseKeys = licenses
|
|
25
|
+
.map((license) => `${color.yellow(license.name)}: ${license.key}`)
|
|
26
|
+
.join("\n");
|
|
27
|
+
console.log(`Available license keys:\n${availableLicenseKeys}`);
|
|
28
|
+
process.exit(0);
|
|
29
|
+
}
|
|
30
|
+
// Skips interactive mode and generates a license with the saved default license
|
|
31
|
+
if (opts.quick) {
|
|
32
|
+
let name;
|
|
33
|
+
let year = String(new Date().getFullYear());
|
|
34
|
+
try {
|
|
35
|
+
name = getGitUsername();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error("Error: Git username not configured.");
|
|
39
|
+
console.error("Please run: git config --global user.name 'Your Name'");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const config = await getConfig();
|
|
43
|
+
let licenseKey = config.defaultLicense || "mit";
|
|
44
|
+
const licenseOptionContent = await getLicenseContent(`${BASE_URL}/${licenseKey}`);
|
|
45
|
+
try {
|
|
46
|
+
await createLicense(licenseOptionContent, year, name);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error(`Error occurred in createLicense: ${error}`);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Sets a default license
|
|
55
|
+
if (opts.set) {
|
|
56
|
+
const licenseKey = opts.set.toLowerCase();
|
|
57
|
+
const isValid = licenses.some((l) => l.key === licenseKey);
|
|
58
|
+
if (!isValid) {
|
|
59
|
+
console.error(`Error: "${licenseKey}" is not a valid license.`);
|
|
60
|
+
console.error("Available licenses:", licenses.map((l) => l.key).join(", "));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
await setConfig({ defaultLicense: licenseKey });
|
|
64
|
+
console.log(`Default license set to: ${color.blueBright(licenseKey)}`);
|
|
65
|
+
console.log(`Use --quick to generate with this license.`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Interactive mode
|
|
18
69
|
intro(color.blueBright("License Generator"));
|
|
19
|
-
const BASE_URL = "https://api.github.com/licenses";
|
|
20
|
-
const licenses = await getLicenses();
|
|
21
70
|
// List all available licenses from github api
|
|
22
71
|
const licenseOption = await select({
|
|
23
72
|
message: "Select a license:",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/license.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAOA,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,mBAAmB;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,WAAW,4BAQhC;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,mBAAmB,CAAC,CAgB9B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,iBA2Bb"}
|
package/dist/license.js
CHANGED
|
@@ -3,9 +3,10 @@ import color from "picocolors";
|
|
|
3
3
|
import { writeFile } from "node:fs/promises";
|
|
4
4
|
import { fileExists } from "./helpers.js";
|
|
5
5
|
import { cancel, confirm, spinner } from "@clack/prompts";
|
|
6
|
+
import { BASE_URL } from "./constants.js";
|
|
6
7
|
export async function getLicenses() {
|
|
7
8
|
try {
|
|
8
|
-
const { data } = await axios.get(
|
|
9
|
+
const { data } = await axios.get(BASE_URL);
|
|
9
10
|
return data;
|
|
10
11
|
}
|
|
11
12
|
catch (error) {
|
package/dist/license.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAoB1C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAA6B,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAkC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrE,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA4B,EAC5B,IAAY,EACZ,IAAY;IAEZ,IAAI,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/B,IAAI,IAAI,GAAG,WAAW;SACnB,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;SAC1B,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;SAC1B,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC;SAC9B,UAAU,CAAC,2BAA2B,EAAE,IAAI,CAAC;SAC7C,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;SAC1B,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAExC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC;YACnC,OAAO,EAAE,yCAAyC;SACnD,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
package/package.json
CHANGED
package/src/constants.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const BASE_URL = "https://api.github.com/licenses";
|
package/src/helpers.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import { constants } from "node:fs";
|
|
3
3
|
import { access } from "node:fs/promises";
|
|
4
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { homedir } from "node:os";
|
|
4
7
|
|
|
5
8
|
export function getGitUsername() {
|
|
6
9
|
const uncleanName = String(execSync("git config user.name"));
|
|
7
10
|
return uncleanName.replace(/\r?\n/g, "");
|
|
8
11
|
}
|
|
9
12
|
|
|
10
|
-
export async function fileExists(path: string)
|
|
13
|
+
export async function fileExists(path: string) {
|
|
11
14
|
try {
|
|
12
15
|
await access(path, constants.F_OK);
|
|
13
16
|
return true;
|
|
@@ -15,3 +18,36 @@ export async function fileExists(path: string): Promise<boolean> {
|
|
|
15
18
|
return false;
|
|
16
19
|
}
|
|
17
20
|
}
|
|
21
|
+
|
|
22
|
+
const CONFIG_DIR = join(homedir(), ".license-generator");
|
|
23
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
24
|
+
|
|
25
|
+
export interface Config {
|
|
26
|
+
defaultLicense?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function getConfig(): Promise<Config> {
|
|
30
|
+
try {
|
|
31
|
+
const content = await readFile(CONFIG_FILE, "utf8");
|
|
32
|
+
return JSON.parse(content);
|
|
33
|
+
} catch {
|
|
34
|
+
// config doesn't exist yet, return empty config
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function setConfig(config: Config) {
|
|
40
|
+
try {
|
|
41
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
42
|
+
const existingConfig = await getConfig();
|
|
43
|
+
const updatedConfig = { ...existingConfig, ...config };
|
|
44
|
+
await writeFile(
|
|
45
|
+
CONFIG_FILE,
|
|
46
|
+
JSON.stringify(updatedConfig, null, 2),
|
|
47
|
+
"utf8",
|
|
48
|
+
);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error(`Error occurred in setConfig: ${error}`);
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -6,23 +6,94 @@ import inquirer from "inquirer";
|
|
|
6
6
|
import { createLicense, getLicenseContent, getLicenses } from "./license.js";
|
|
7
7
|
import color from "picocolors";
|
|
8
8
|
import { getGitUsername } from "./helpers.js";
|
|
9
|
+
import { getConfig, setConfig } from "./helpers.js";
|
|
10
|
+
import { BASE_URL } from "./constants.js";
|
|
9
11
|
|
|
10
12
|
const main = async () => {
|
|
13
|
+
const licenses = await getLicenses();
|
|
14
|
+
|
|
11
15
|
program
|
|
12
16
|
.name("License Generator")
|
|
13
17
|
.description(
|
|
14
18
|
"A CLI application that generates open-source licenses for your repositories.",
|
|
15
19
|
)
|
|
16
|
-
.version("0.
|
|
20
|
+
.version("0.2.0");
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
program
|
|
23
|
+
.option("--ls, --list", "list all available license keys")
|
|
24
|
+
.option(
|
|
25
|
+
"-q, --quick",
|
|
26
|
+
"alternative to interactive mode, generate a license using the saved default license",
|
|
27
|
+
)
|
|
28
|
+
.option(
|
|
29
|
+
"-s, --set <license>",
|
|
30
|
+
"set a default license for -q / --quick option",
|
|
31
|
+
);
|
|
19
32
|
|
|
20
33
|
program.parse();
|
|
21
34
|
|
|
22
|
-
|
|
35
|
+
const opts = program.opts();
|
|
23
36
|
|
|
24
|
-
|
|
25
|
-
|
|
37
|
+
// Lists all available license keys
|
|
38
|
+
if (opts.list) {
|
|
39
|
+
const availableLicenseKeys = licenses
|
|
40
|
+
.map((license) => `${color.yellow(license.name)}: ${license.key}`)
|
|
41
|
+
.join("\n");
|
|
42
|
+
console.log(`Available license keys:\n${availableLicenseKeys}`);
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Skips interactive mode and generates a license with the saved default license
|
|
47
|
+
if (opts.quick) {
|
|
48
|
+
let name: string;
|
|
49
|
+
let year = String(new Date().getFullYear());
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
name = getGitUsername();
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error("Error: Git username not configured.");
|
|
55
|
+
console.error("Please run: git config --global user.name 'Your Name'");
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const config = await getConfig();
|
|
60
|
+
let licenseKey = config.defaultLicense || "mit";
|
|
61
|
+
|
|
62
|
+
const licenseOptionContent = await getLicenseContent(
|
|
63
|
+
`${BASE_URL}/${licenseKey}`,
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
await createLicense(licenseOptionContent, year, name);
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.error(`Error occurred in createLicense: ${error}`);
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Sets a default license
|
|
76
|
+
if (opts.set) {
|
|
77
|
+
const licenseKey = opts.set.toLowerCase();
|
|
78
|
+
const isValid = licenses.some((l) => l.key === licenseKey);
|
|
79
|
+
|
|
80
|
+
if (!isValid) {
|
|
81
|
+
console.error(`Error: "${licenseKey}" is not a valid license.`);
|
|
82
|
+
console.error(
|
|
83
|
+
"Available licenses:",
|
|
84
|
+
licenses.map((l) => l.key).join(", "),
|
|
85
|
+
);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
await setConfig({ defaultLicense: licenseKey });
|
|
90
|
+
console.log(`Default license set to: ${color.blueBright(licenseKey)}`);
|
|
91
|
+
console.log(`Use --quick to generate with this license.`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Interactive mode
|
|
96
|
+
intro(color.blueBright("License Generator"));
|
|
26
97
|
|
|
27
98
|
// List all available licenses from github api
|
|
28
99
|
const licenseOption = await select({
|
package/src/license.ts
CHANGED
|
@@ -3,6 +3,7 @@ import color from "picocolors";
|
|
|
3
3
|
import { writeFile } from "node:fs/promises";
|
|
4
4
|
import { fileExists } from "./helpers.js";
|
|
5
5
|
import { cancel, confirm, spinner } from "@clack/prompts";
|
|
6
|
+
import { BASE_URL } from "./constants.js";
|
|
6
7
|
|
|
7
8
|
interface LicenseShape {
|
|
8
9
|
key: string;
|
|
@@ -22,11 +23,9 @@ interface LicenseContentShape {
|
|
|
22
23
|
body: string;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
export async function getLicenses()
|
|
26
|
+
export async function getLicenses() {
|
|
26
27
|
try {
|
|
27
|
-
const { data }: { data: LicenseShape[] } = await axios.get(
|
|
28
|
-
"https://api.github.com/licenses",
|
|
29
|
-
);
|
|
28
|
+
const { data }: { data: LicenseShape[] } = await axios.get(BASE_URL);
|
|
30
29
|
return data;
|
|
31
30
|
} catch (error) {
|
|
32
31
|
console.error(`Error in getLicenses: ${error}`);
|