@pavlos-samaras/react-cli 1.0.1 → 1.1.1
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 +52 -14
- package/dist/bin/ct.js +62 -16
- package/dist/bin/ct.js.map +1 -1
- package/dist/constants/generator.d.ts +3 -0
- package/dist/constants/generator.d.ts.map +1 -0
- package/dist/constants/generator.js +6 -0
- package/dist/constants/generator.js.map +1 -0
- package/dist/types/generator.d.ts +7 -0
- package/dist/types/generator.d.ts.map +1 -0
- package/dist/types/generator.js +2 -0
- package/dist/types/generator.js.map +1 -0
- package/dist/utils/applySpinner.d.ts +5 -0
- package/dist/utils/applySpinner.d.ts.map +1 -0
- package/dist/utils/applySpinner.js +16 -0
- package/dist/utils/applySpinner.js.map +1 -0
- package/dist/utils/generateComponent.d.ts +7 -6
- package/dist/utils/generateComponent.d.ts.map +1 -1
- package/dist/utils/generateComponent.js +19 -27
- package/dist/utils/generateComponent.js.map +1 -1
- package/dist/utils/generateHook.d.ts +7 -0
- package/dist/utils/generateHook.d.ts.map +1 -0
- package/dist/utils/generateHook.js +12 -0
- package/dist/utils/generateHook.js.map +1 -0
- package/dist/utils/loadConfig.d.ts +10 -0
- package/dist/utils/loadConfig.d.ts.map +1 -0
- package/dist/utils/loadConfig.js +16 -0
- package/dist/utils/loadConfig.js.map +1 -0
- package/dist/utils/validators.d.ts +3 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +13 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +3 -1
- package/dist/types/component.d.ts +0 -6
- package/dist/types/component.d.ts.map +0 -1
- package/dist/types/component.js +0 -2
- package/dist/types/component.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,32 +1,62 @@
|
|
|
1
1
|
# React CLI
|
|
2
2
|
|
|
3
|
-
A simple command-line tool for generating React components.
|
|
3
|
+
A simple command-line tool for generating React components and hooks.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install
|
|
9
|
-
npm run build
|
|
10
|
-
npm link
|
|
8
|
+
npm install -g @pavlos-samaras/react-cli
|
|
11
9
|
```
|
|
12
10
|
|
|
13
11
|
## Usage
|
|
14
12
|
|
|
15
|
-
Generate a component in `src/components/<Name>`:
|
|
16
|
-
|
|
17
13
|
```bash
|
|
18
|
-
ct generate
|
|
14
|
+
ct generate <type> <name> [options]
|
|
19
15
|
```
|
|
20
16
|
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
`g` is a shorthand for `generate`.
|
|
18
|
+
|
|
19
|
+
### Types
|
|
20
|
+
|
|
21
|
+
| Type | Output |
|
|
22
|
+
| ----------- | --------------------------------------------------------------------------------------- |
|
|
23
|
+
| `component` | A folder with the component, a CSS/SCSS module, a hook and a test file |
|
|
24
|
+
| `hook` | A single hook file. The name must start with `use` followed by a capital (e.g. `useAuth`) |
|
|
25
|
+
|
|
26
|
+
### Options
|
|
27
|
+
|
|
28
|
+
| Option | Description |
|
|
29
|
+
| ------------------------- | ------------------------------------------------------------------------ |
|
|
30
|
+
| `-d, --dir <dir>` | Target folder inside `src/` (or inside the feature). Default depends on the type: `components` or `hooks` |
|
|
31
|
+
| `-f, --feature <feature>` | Put the output under `src/features/<feature>/` |
|
|
32
|
+
| `--ts` | Use TypeScript without prompting |
|
|
33
|
+
| `-y, --yes` | Use the defaults (TypeScript, SCSS) and skip all prompts |
|
|
34
|
+
|
|
35
|
+
Without `--ts` or `-y`, the CLI asks whether to use TypeScript and (for
|
|
36
|
+
components) which stylesheet to use.
|
|
37
|
+
|
|
38
|
+
### Output locations
|
|
39
|
+
|
|
40
|
+
| Command | Output |
|
|
41
|
+
| ---------------------------------------- | -------------------------------------------- |
|
|
42
|
+
| `ct g component Button` | `src/components/Button/` |
|
|
43
|
+
| `ct g component Button -f auth` | `src/features/auth/components/Button/` |
|
|
44
|
+
| `ct g component Button -d ui` | `src/ui/Button/` |
|
|
45
|
+
| `ct g hook useAuth` | `src/shared/hooks/useAuth.ts` |
|
|
46
|
+
| `ct g hook useAuth -f auth` | `src/features/auth/hooks/useAuth.ts` |
|
|
47
|
+
|
|
48
|
+
### Examples
|
|
23
49
|
|
|
24
50
|
```bash
|
|
25
|
-
|
|
26
|
-
|
|
51
|
+
# Component with all defaults, no prompts
|
|
52
|
+
ct g component Button -y
|
|
53
|
+
|
|
54
|
+
# TypeScript component under a feature
|
|
55
|
+
ct g component LoginForm --feature auth --ts
|
|
27
56
|
|
|
28
|
-
|
|
29
|
-
|
|
57
|
+
# Hook under a feature
|
|
58
|
+
ct g hook useSession -f auth -y
|
|
59
|
+
```
|
|
30
60
|
|
|
31
61
|
## Development
|
|
32
62
|
|
|
@@ -35,3 +65,11 @@ Run the CLI directly from the TypeScript source:
|
|
|
35
65
|
```bash
|
|
36
66
|
npm run dev -- generate component Button
|
|
37
67
|
```
|
|
68
|
+
|
|
69
|
+
To link the local build globally instead:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npm install
|
|
73
|
+
npm run build
|
|
74
|
+
npm link
|
|
75
|
+
```
|
package/dist/bin/ct.js
CHANGED
|
@@ -1,35 +1,81 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
|
+
import chalk from "chalk";
|
|
4
5
|
import { createRequire } from "module";
|
|
5
6
|
import { Command } from "commander";
|
|
6
7
|
import { generateComponent } from "../utils/generateComponent.js";
|
|
8
|
+
import { applySpinner } from "../utils/applySpinner.js";
|
|
9
|
+
import { DEFAULT_DIRS, TYPES } from "../constants/generator.js";
|
|
10
|
+
import { generateHook } from "../utils/generateHook.js";
|
|
11
|
+
import { isReactProject } from "../utils/validators.js";
|
|
12
|
+
import { loadConfig } from "../utils/loadConfig.js";
|
|
7
13
|
const require = createRequire(import.meta.url);
|
|
8
14
|
const { version } = require("../../package.json");
|
|
9
15
|
const program = new Command();
|
|
10
|
-
const TYPES = ["component"];
|
|
11
16
|
program.name("ct").description("My React CLI").version(version);
|
|
12
17
|
program
|
|
13
18
|
.command("generate <type> <name>")
|
|
14
19
|
.alias("g")
|
|
15
|
-
.description("Generate a
|
|
16
|
-
.option("-d, --dir <
|
|
17
|
-
.option("-f, --feature <feature>", "put
|
|
18
|
-
.option("--ts", "
|
|
19
|
-
.
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
.description("Generate a <type>, e.g. ct g component Button")
|
|
21
|
+
.option("-d, --dir <dir>", "target folder")
|
|
22
|
+
.option("-f, --feature <feature>", "put <type> under a feature")
|
|
23
|
+
.option("--ts", "use Typescript")
|
|
24
|
+
.option("--force", "skip safety checks and overwrite")
|
|
25
|
+
.action((type, name, options) => {
|
|
26
|
+
if (!isReactProject() && !options.force) {
|
|
27
|
+
console.log(chalk.yellow("This doesn't look like a React project (no react in package.json)."));
|
|
28
|
+
console.log(chalk.gray("Run ct from your project root, or use --force."));
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const config = loadConfig() ?? {};
|
|
33
|
+
if (!TYPES.includes(type)) {
|
|
34
|
+
console.log(chalk.red(`Unknown type: ${type}`));
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
22
38
|
if (type === "component") {
|
|
39
|
+
const dir = options.dir ?? config.dir?.component ?? "components";
|
|
23
40
|
const pathToComponent = options.feature
|
|
24
|
-
? `src/features/${options.feature}/${
|
|
25
|
-
: `src/${
|
|
41
|
+
? `src/features/${options.feature}/${dir}`
|
|
42
|
+
: `src/${dir}`;
|
|
26
43
|
const folder = path.join(process.cwd(), pathToComponent, name);
|
|
27
|
-
fs.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
44
|
+
if (fs.existsSync(folder) && !options.force) {
|
|
45
|
+
console.log(chalk.yellow(`${name} already exists. Use --force to overwrite it.`));
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
applySpinner({ name, folder }, async () => {
|
|
50
|
+
fs.mkdirSync(folder, { recursive: true });
|
|
51
|
+
const { JSX, stylesheet, hook, test } = await generateComponent(folder, name, options, config);
|
|
52
|
+
fs.writeFileSync(JSX.pathToFile, JSX.content);
|
|
53
|
+
fs.writeFileSync(stylesheet.pathToFile, stylesheet.content);
|
|
54
|
+
fs.writeFileSync(hook.pathToFile, hook.content);
|
|
55
|
+
fs.writeFileSync(test.pathToFile, test.content);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (type === "hook") {
|
|
59
|
+
if (!/^use[A-Z]\w+$/.test(name)) {
|
|
60
|
+
console.log(chalk.red("Hook must start with 'use' followed by a capital letter"));
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const dir = options.dir ?? config.dir?.hook ?? "hooks";
|
|
65
|
+
const pathToHook = options.feature
|
|
66
|
+
? `src/features/${options.feature}/${dir}`
|
|
67
|
+
: `src/shared/${dir}`;
|
|
68
|
+
const folder = path.join(process.cwd(), pathToHook);
|
|
69
|
+
if (fs.existsSync(folder) && !options.force) {
|
|
70
|
+
console.log(chalk.yellow(`${name} already exists. Use --force to overwrite it.`));
|
|
71
|
+
process.exitCode = 1;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
applySpinner({ name, folder }, async () => {
|
|
75
|
+
fs.mkdirSync(folder, { recursive: true });
|
|
76
|
+
const hook = await generateHook(folder, name, options, config);
|
|
77
|
+
fs.writeFileSync(hook.pathToFile, hook.content);
|
|
78
|
+
});
|
|
33
79
|
}
|
|
34
80
|
});
|
|
35
81
|
program.parse();
|
package/dist/bin/ct.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ct.js","sourceRoot":"","sources":["../../src/bin/ct.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"ct.js","sourceRoot":"","sources":["../../src/bin/ct.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/constants/generator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,UAAwB,CAAC;AAE3C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/constants/generator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,SAAS,EAAE,YAAY;IACvB,IAAI,EAAE,OAAO;CACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/types/generator.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/types/generator.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applySpinner.d.ts","sourceRoot":"","sources":["../../src/utils/applySpinner.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,YACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,YAC/B,MAAM,IAAI,SAarB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
export const applySpinner = (options, callback) => {
|
|
4
|
+
const { name, folder } = options;
|
|
5
|
+
const spinner = ora(`Creating ${name}...`).start();
|
|
6
|
+
try {
|
|
7
|
+
callback();
|
|
8
|
+
spinner.succeed(`Created ${chalk.cyan(name)} in ${chalk.gray(folder)}`);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
spinner.fail(chalk.red(`Could not create ${name}`));
|
|
12
|
+
console.error(error);
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=applySpinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applySpinner.js","sourceRoot":"","sources":["../../src/utils/applySpinner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAyC,EACzC,QAAoB,EACpB,EAAE;IACF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { GeneratorOptions } from "../types/generator.js";
|
|
2
|
+
import type { CtConfig } from "./loadConfig.js";
|
|
3
|
+
export declare const generateComponent: (folder: string, name: string, options: GeneratorOptions, config: CtConfig) => Promise<{
|
|
3
4
|
JSX: {
|
|
4
|
-
|
|
5
|
+
pathToFile: string;
|
|
5
6
|
content: string;
|
|
6
7
|
};
|
|
7
8
|
stylesheet: {
|
|
8
|
-
|
|
9
|
+
pathToFile: string;
|
|
9
10
|
content: string;
|
|
10
11
|
};
|
|
11
12
|
hook: {
|
|
12
|
-
|
|
13
|
+
pathToFile: string;
|
|
13
14
|
content: string;
|
|
14
15
|
};
|
|
15
16
|
test: {
|
|
16
|
-
|
|
17
|
+
pathToFile: string;
|
|
17
18
|
content: string;
|
|
18
19
|
};
|
|
19
20
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateComponent.d.ts","sourceRoot":"","sources":["../../src/utils/generateComponent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generateComponent.d.ts","sourceRoot":"","sources":["../../src/utils/generateComponent.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,eAAO,MAAM,iBAAiB,WACpB,MAAM,QACR,MAAM,WACH,gBAAgB,UACjB,QAAQ;;QAqBZ,UAAU;QACV,OAAO;;;QAGP,UAAU;QACV,OAAO;;;QAGP,UAAU;QACV,OAAO;;;QAGP,UAAU;QACV,OAAO;;EAGZ,CAAC"}
|
|
@@ -1,48 +1,40 @@
|
|
|
1
|
+
import path from "path";
|
|
1
2
|
import prompts from "prompts";
|
|
2
3
|
import buildComponentTemplate from "../templates/component.js";
|
|
3
4
|
import buildStylesheetTemplate from "../templates/stylesheet.js";
|
|
4
5
|
import buildHookTemplate from "../templates/hook.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import { isTypescriptUsed } from "./validators.js";
|
|
7
|
+
export const generateComponent = async (folder, name, options, config) => {
|
|
8
|
+
const stylesheetExt = config.stylesheet
|
|
9
|
+
? { style: config.stylesheet }
|
|
10
|
+
: await prompts({
|
|
9
11
|
type: "select",
|
|
10
|
-
name: "
|
|
11
|
-
message: "
|
|
12
|
+
name: "style",
|
|
13
|
+
message: "What stylesheet to use",
|
|
12
14
|
choices: [
|
|
13
|
-
{ title: "
|
|
14
|
-
{ title: "
|
|
15
|
+
{ title: "CSS", value: "css" },
|
|
16
|
+
{ title: "SCSS", value: "scss" },
|
|
15
17
|
],
|
|
16
|
-
initial:
|
|
18
|
+
initial: 1,
|
|
17
19
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
type: "select",
|
|
22
|
-
name: "style",
|
|
23
|
-
message: "What stylesheet to use",
|
|
24
|
-
choices: [
|
|
25
|
-
{ title: "CSS", value: "css" },
|
|
26
|
-
{ title: "SCSS", value: "scss" },
|
|
27
|
-
],
|
|
28
|
-
initial: 1,
|
|
29
|
-
});
|
|
30
|
-
const componentLanguage = componentExt?.replace("x", "");
|
|
20
|
+
const useTs = options.ts ?? config.typescript ?? isTypescriptUsed();
|
|
21
|
+
const JsxExt = useTs ? "tsx" : "jsx";
|
|
22
|
+
const languageExt = useTs ? "ts" : "js";
|
|
31
23
|
return {
|
|
32
24
|
JSX: {
|
|
33
|
-
|
|
34
|
-
content: buildComponentTemplate(name, stylesheetExt.style,
|
|
25
|
+
pathToFile: path.join(folder, `${name}.${JsxExt}`),
|
|
26
|
+
content: buildComponentTemplate(name, stylesheetExt.style, languageExt),
|
|
35
27
|
},
|
|
36
28
|
stylesheet: {
|
|
37
|
-
|
|
29
|
+
pathToFile: path.join(folder, `${name}.module.${stylesheetExt.style}`),
|
|
38
30
|
content: buildStylesheetTemplate(name),
|
|
39
31
|
},
|
|
40
32
|
hook: {
|
|
41
|
-
|
|
33
|
+
pathToFile: path.join(folder, `use${name}.${languageExt}`),
|
|
42
34
|
content: buildHookTemplate(name),
|
|
43
35
|
},
|
|
44
36
|
test: {
|
|
45
|
-
|
|
37
|
+
pathToFile: path.join(folder, `${name}.test.${languageExt}`),
|
|
46
38
|
content: "",
|
|
47
39
|
},
|
|
48
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateComponent.js","sourceRoot":"","sources":["../../src/utils/generateComponent.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"generateComponent.js","sourceRoot":"","sources":["../../src/utils/generateComponent.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAC/D,OAAO,uBAAuB,MAAM,4BAA4B,CAAC;AACjE,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,MAAc,EACd,IAAY,EACZ,OAAyB,EACzB,MAAgB,EAChB,EAAE;IACF,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU;QACrC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE;QAC9B,CAAC,CAAC,MAAM,OAAO,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC9B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aACjC;YACD,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,gBAAgB,EAAE,CAAC;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAExC,OAAO;QACL,GAAG,EAAE;YACH,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;YAClD,OAAO,EAAE,sBAAsB,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC;SACxE;QACD,UAAU,EAAE;YACV,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,WAAW,aAAa,CAAC,KAAK,EAAE,CAAC;YACtE,OAAO,EAAE,uBAAuB,CAAC,IAAI,CAAC;SACvC;QACD,IAAI,EAAE;YACJ,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC1D,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC;SACjC;QACD,IAAI,EAAE;YACJ,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,WAAW,EAAE,CAAC;YAC5D,OAAO,EAAE,EAAE;SACZ;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GeneratorOptions } from "../types/generator.js";
|
|
2
|
+
import type { CtConfig } from "./loadConfig.js";
|
|
3
|
+
export declare const generateHook: (folder: string, name: string, options: GeneratorOptions, config: CtConfig) => Promise<{
|
|
4
|
+
pathToFile: string;
|
|
5
|
+
content: string;
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=generateHook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateHook.d.ts","sourceRoot":"","sources":["../../src/utils/generateHook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,eAAO,MAAM,YAAY,WACf,MAAM,QACR,MAAM,WACH,gBAAgB,UACjB,QAAQ;;;EASjB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import buildHookTemplate from "../templates/hook.js";
|
|
3
|
+
import { isTypescriptUsed } from "./validators.js";
|
|
4
|
+
export const generateHook = async (folder, name, options, config) => {
|
|
5
|
+
const useTs = options.ts ?? config.typescript ?? isTypescriptUsed();
|
|
6
|
+
const languageExt = useTs ? "ts" : "js";
|
|
7
|
+
return {
|
|
8
|
+
pathToFile: path.join(folder, `${name}.${languageExt}`),
|
|
9
|
+
content: buildHookTemplate(name),
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=generateHook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateHook.js","sourceRoot":"","sources":["../../src/utils/generateHook.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,MAAc,EACd,IAAY,EACZ,OAAyB,EACzB,MAAgB,EAChB,EAAE;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,gBAAgB,EAAE,CAAC;IACpE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAExC,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC;QACvD,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/utils/loadConfig.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE;QACJ,SAAS,EAAE,YAAY,CAAC;QACxB,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;IACF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,UAAU,QAAO,QAAQ,GAAG,SAUxC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
export const loadConfig = () => {
|
|
5
|
+
const configPath = path.join(process.cwd(), "ct.config.json");
|
|
6
|
+
if (!fs.existsSync(configPath))
|
|
7
|
+
return;
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
console.log(chalk.yellow("ct.config.json is not valid JSON, ignoring it."));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=loadConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/utils/loadConfig.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,MAAM,CAAC,MAAM,UAAU,GAAG,GAAyB,EAAE;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IAEvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,eAM1B,CAAC;AAEF,eAAO,MAAM,gBAAgB,eAE5B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
export const isReactProject = () => {
|
|
4
|
+
const pkgPath = path.join(process.cwd(), "package.json");
|
|
5
|
+
if (!fs.existsSync(pkgPath))
|
|
6
|
+
return false;
|
|
7
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
8
|
+
return Boolean(pkg.dependencies?.react || pkg.devDependencies?.react);
|
|
9
|
+
};
|
|
10
|
+
export const isTypescriptUsed = () => {
|
|
11
|
+
return fs.existsSync(path.join(process.cwd(), "tsconfig.json"));
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE;IACnC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pavlos-samaras/react-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"author": "sammern-stack",
|
|
5
5
|
"description": "A CLI to generate React code",
|
|
6
6
|
"keywords": [
|
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
"build:link": "npm run build && npm link"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
+
"chalk": "^6.0.1",
|
|
23
24
|
"commander": "^15.0.0",
|
|
25
|
+
"ora": "^10.0.0",
|
|
24
26
|
"prompts": "^2.4.2"
|
|
25
27
|
},
|
|
26
28
|
"devDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/types/component.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,CAAC;CACd,CAAA"}
|
package/dist/types/component.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/types/component.ts"],"names":[],"mappings":""}
|