@pavlos-samaras/react-cli 1.0.1 → 1.1.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 +52 -14
- package/dist/bin/ct.js +39 -13
- 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 +6 -6
- package/dist/utils/generateComponent.d.ts.map +1 -1
- package/dist/utils/generateComponent.js +26 -16
- package/dist/utils/generateComponent.js.map +1 -1
- package/dist/utils/generateHook.d.ts +6 -0
- package/dist/utils/generateHook.d.ts.map +1 -0
- package/dist/utils/generateHook.js +32 -0
- package/dist/utils/generateHook.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,61 @@
|
|
|
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";
|
|
7
11
|
const require = createRequire(import.meta.url);
|
|
8
12
|
const { version } = require("../../package.json");
|
|
9
13
|
const program = new Command();
|
|
10
|
-
const TYPES = ["component"];
|
|
11
14
|
program.name("ct").description("My React CLI").version(version);
|
|
12
15
|
program
|
|
13
16
|
.command("generate <type> <name>")
|
|
14
17
|
.alias("g")
|
|
15
18
|
.description("Generate a component, e.g. ct g component Button")
|
|
16
|
-
.option("-d, --dir <
|
|
19
|
+
.option("-d, --dir <dir>", "target folder (default depends on type)")
|
|
17
20
|
.option("-f, --feature <feature>", "put component under a feature")
|
|
18
21
|
.option("--ts", "create a .tsx file")
|
|
19
|
-
.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
.option("-y, --yes", "use default options and skip prompts")
|
|
23
|
+
.action((type, name, options) => {
|
|
24
|
+
if (!TYPES.includes(type)) {
|
|
25
|
+
console.log(chalk.red(`Unknown type: ${type}`));
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const dir = options.dir ?? DEFAULT_DIRS[type];
|
|
22
30
|
if (type === "component") {
|
|
23
31
|
const pathToComponent = options.feature
|
|
24
|
-
? `src/features/${options.feature}/${
|
|
25
|
-
: `src/${
|
|
32
|
+
? `src/features/${options.feature}/${dir}`
|
|
33
|
+
: `src/${dir}`;
|
|
26
34
|
const folder = path.join(process.cwd(), pathToComponent, name);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
applySpinner({ name, folder }, async () => {
|
|
36
|
+
fs.mkdirSync(folder, { recursive: true });
|
|
37
|
+
const { JSX, stylesheet, hook, test } = await generateComponent(folder, name, options);
|
|
38
|
+
fs.writeFileSync(JSX.pathToFile, JSX.content);
|
|
39
|
+
fs.writeFileSync(stylesheet.pathToFile, stylesheet.content);
|
|
40
|
+
fs.writeFileSync(hook.pathToFile, hook.content);
|
|
41
|
+
fs.writeFileSync(test.pathToFile, test.content);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (type === "hook") {
|
|
45
|
+
if (!/^use[A-Z]\w+$/.test(name)) {
|
|
46
|
+
console.log(chalk.red("Hook must start with 'use' followed by a capital letter"));
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const pathToHook = options.feature
|
|
51
|
+
? `src/features/${options.feature}/${dir}`
|
|
52
|
+
: `src/shared/${dir}`;
|
|
53
|
+
const folder = path.join(process.cwd(), pathToHook);
|
|
54
|
+
applySpinner({ name, folder }, async () => {
|
|
55
|
+
fs.mkdirSync(folder, { recursive: true });
|
|
56
|
+
const hook = await generateHook(folder, name, options);
|
|
57
|
+
fs.writeFileSync(hook.pathToFile, hook.content);
|
|
58
|
+
});
|
|
33
59
|
}
|
|
34
60
|
});
|
|
35
61
|
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,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,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,19 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const generateComponent: (name: string, options:
|
|
1
|
+
import type { GeneratorOptions } from "../types/generator.js";
|
|
2
|
+
export declare const generateComponent: (folder: string, name: string, options: GeneratorOptions) => Promise<{
|
|
3
3
|
JSX: {
|
|
4
|
-
|
|
4
|
+
pathToFile: string;
|
|
5
5
|
content: string;
|
|
6
6
|
};
|
|
7
7
|
stylesheet: {
|
|
8
|
-
|
|
8
|
+
pathToFile: string;
|
|
9
9
|
content: string;
|
|
10
10
|
};
|
|
11
11
|
hook: {
|
|
12
|
-
|
|
12
|
+
pathToFile: string;
|
|
13
13
|
content: string;
|
|
14
14
|
};
|
|
15
15
|
test: {
|
|
16
|
-
|
|
16
|
+
pathToFile: string;
|
|
17
17
|
content: string;
|
|
18
18
|
};
|
|
19
19
|
}>;
|
|
@@ -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":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM9D,eAAO,MAAM,iBAAiB,WACpB,MAAM,QACR,MAAM,WACH,gBAAgB;;QAuCrB,UAAU;QACV,OAAO;;;QAOP,UAAU;QACV,OAAO;;;QAGP,UAAU;QACV,OAAO;;;QAGP,UAAU;QACV,OAAO;;EAGZ,CAAC"}
|
|
@@ -1,10 +1,18 @@
|
|
|
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
|
+
const DEFAULTS = { componentExt: "tsx", style: "scss" };
|
|
7
|
+
export const generateComponent = async (folder, name, options) => {
|
|
6
8
|
let componentExt;
|
|
7
|
-
if (options.ts
|
|
9
|
+
if (options.ts !== undefined) {
|
|
10
|
+
componentExt = options.ts ? "tsx" : "jsx";
|
|
11
|
+
}
|
|
12
|
+
else if (options.yes) {
|
|
13
|
+
componentExt = DEFAULTS.componentExt;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
8
16
|
const answer = await prompts({
|
|
9
17
|
type: "select",
|
|
10
18
|
name: "ts",
|
|
@@ -17,32 +25,34 @@ export const generateComponent = async (name, options) => {
|
|
|
17
25
|
});
|
|
18
26
|
componentExt = answer.ts;
|
|
19
27
|
}
|
|
20
|
-
const stylesheetExt =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
const stylesheetExt = options.yes
|
|
29
|
+
? { style: DEFAULTS.style }
|
|
30
|
+
: await prompts({
|
|
31
|
+
type: "select",
|
|
32
|
+
name: "style",
|
|
33
|
+
message: "What stylesheet to use",
|
|
34
|
+
choices: [
|
|
35
|
+
{ title: "CSS", value: "css" },
|
|
36
|
+
{ title: "SCSS", value: "scss" },
|
|
37
|
+
],
|
|
38
|
+
initial: 1,
|
|
39
|
+
});
|
|
30
40
|
const componentLanguage = componentExt?.replace("x", "");
|
|
31
41
|
return {
|
|
32
42
|
JSX: {
|
|
33
|
-
|
|
43
|
+
pathToFile: path.join(folder, `${name}.${componentExt}`),
|
|
34
44
|
content: buildComponentTemplate(name, stylesheetExt.style, componentLanguage),
|
|
35
45
|
},
|
|
36
46
|
stylesheet: {
|
|
37
|
-
|
|
47
|
+
pathToFile: path.join(folder, `${name}.module.${stylesheetExt.style}`),
|
|
38
48
|
content: buildStylesheetTemplate(name),
|
|
39
49
|
},
|
|
40
50
|
hook: {
|
|
41
|
-
|
|
51
|
+
pathToFile: path.join(folder, `use${name}.${componentLanguage}`),
|
|
42
52
|
content: buildHookTemplate(name),
|
|
43
53
|
},
|
|
44
54
|
test: {
|
|
45
|
-
|
|
55
|
+
pathToFile: path.join(folder, `${name}.test.${componentLanguage}`),
|
|
46
56
|
content: "",
|
|
47
57
|
},
|
|
48
58
|
};
|
|
@@ -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;AAE/D,OAAO,uBAAuB,MAAM,4BAA4B,CAAC;AACjE,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,IAAY,EACZ,OAAyB,EACzB,EAAE;IACF,IAAI,
|
|
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;AAE/D,OAAO,uBAAuB,MAAM,4BAA4B,CAAC;AACjE,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AAErD,MAAM,QAAQ,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,MAAc,EACd,IAAY,EACZ,OAAyB,EACzB,EAAE;IACF,IAAI,YAAgC,CAAC;IAErC,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC7B,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACvB,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC3B,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC9B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;aAC9B;YACD,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,YAAY,GAAG,MAAM,CAAC,EAAY,CAAC;IACrC,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG;QAC/B,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE;QAC3B,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,iBAAiB,GAAG,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAE,CAAC;IAE1D,OAAO;QACL,GAAG,EAAE;YACH,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,YAAY,EAAE,CAAC;YACxD,OAAO,EAAE,sBAAsB,CAC7B,IAAI,EACJ,aAAa,CAAC,KAAK,EACnB,iBAAiB,CAClB;SACF;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,iBAAiB,EAAE,CAAC;YAChE,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC;SACjC;QACD,IAAI,EAAE;YACJ,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,iBAAiB,EAAE,CAAC;YAClE,OAAO,EAAE,EAAE;SACZ;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -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;AAM9D,eAAO,MAAM,YAAY,WACf,MAAM,QACR,MAAM,WACH,gBAAgB;;;EA2B1B,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import prompts from "prompts";
|
|
3
|
+
import buildHookTemplate from "../templates/hook.js";
|
|
4
|
+
const DEFAULTS = { componentExt: "tsx", style: "scss" };
|
|
5
|
+
export const generateHook = async (folder, name, options) => {
|
|
6
|
+
let componentExt;
|
|
7
|
+
if (options.ts !== undefined) {
|
|
8
|
+
componentExt = options.ts ? "tsx" : "jsx";
|
|
9
|
+
}
|
|
10
|
+
else if (options.yes) {
|
|
11
|
+
componentExt = DEFAULTS.componentExt;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
const answer = await prompts({
|
|
15
|
+
type: "select",
|
|
16
|
+
name: "ts",
|
|
17
|
+
message: "Use TypeScript?",
|
|
18
|
+
choices: [
|
|
19
|
+
{ title: "Yes", value: "tsx" },
|
|
20
|
+
{ title: "No", value: "jsx" },
|
|
21
|
+
],
|
|
22
|
+
initial: 0,
|
|
23
|
+
});
|
|
24
|
+
componentExt = answer.ts;
|
|
25
|
+
}
|
|
26
|
+
const componentLanguage = componentExt?.replace("x", "");
|
|
27
|
+
return {
|
|
28
|
+
pathToFile: path.join(folder, `${name}.${componentLanguage}`),
|
|
29
|
+
content: buildHookTemplate(name),
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
//# 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,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,iBAAiB,MAAM,sBAAsB,CAAC;AAErD,MAAM,QAAQ,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAExD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,MAAc,EACd,IAAY,EACZ,OAAyB,EACzB,EAAE;IACF,IAAI,YAAgC,CAAC;IAErC,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC7B,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACvB,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC3B,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC9B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;aAC9B;YACD,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,YAAY,GAAG,MAAM,CAAC,EAAY,CAAC;IACrC,CAAC;IACD,MAAM,iBAAiB,GAAG,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAE,CAAC;IAE1D,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,iBAAiB,EAAE,CAAC;QAC7D,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pavlos-samaras/react-cli",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
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":""}
|