@stack-dev/cli 0.3.0 → 0.3.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/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +6 -0
- package/dist/index.js +219 -256
- package/dist/index.mjs +219 -256
- package/package.json +3 -3
- package/src/packages/cli-app/create-cli-app.ts +9 -7
- package/src/packages/fastify-app/create-fastify-app.ts +9 -7
- package/src/packages/files/eslint-config-file-generator.ts +33 -0
- package/src/packages/files/prettier-config-file-generator.ts +14 -0
- package/src/packages/files/tsconfig-file-generator.ts +34 -0
- package/src/packages/library-package/create-library-package.ts +9 -7
- package/src/packages/react-package/styled-components-react-package/create-styled-components-react-package.ts +8 -6
- package/src/packages/react-package/unstyled-react-package/create-unstyled-react-package.ts +8 -6
- package/src/packages/vite-react-app/create-vite-react-app.ts +9 -6
- package/src/utils/workspace.ts +23 -8
- package/src/workspace/create-workspace.ts +9 -5
- package/src/workspace/eslint-config.ts +75 -0
- package/src/workspace/prettier-config.ts +45 -0
- package/src/packages/cli-app/files/eslint-config-file-generator.ts +0 -11
- package/src/packages/cli-app/files/prettier-config-file-generator.ts +0 -11
- package/src/packages/cli-app/files/tsconfig-file-generator.ts +0 -15
- package/src/packages/fastify-app/files/eslint-config-file-generator.ts +0 -11
- package/src/packages/fastify-app/files/prettier-config-file-generator.ts +0 -11
- package/src/packages/fastify-app/files/tsconfig-file-generator.ts +0 -15
- package/src/packages/library-package/files/eslint-config-file-generator.ts +0 -11
- package/src/packages/library-package/files/prettier-config-file-generator.ts +0 -11
- package/src/packages/library-package/files/tsconfig-file-generator.ts +0 -15
- package/src/packages/react-package/styled-components-react-package/files/eslint-config-file-generator.ts +0 -18
- package/src/packages/react-package/styled-components-react-package/files/prettier-config-file-generator.ts +0 -11
- package/src/packages/react-package/styled-components-react-package/files/tsconfig-file-generator.ts +0 -15
- package/src/packages/react-package/unstyled-react-package/files/eslint-config-file-generator.ts +0 -18
- package/src/packages/react-package/unstyled-react-package/files/prettier-config-file-generator.ts +0 -11
- package/src/packages/react-package/unstyled-react-package/files/tsconfig-file-generator.ts +0 -15
- package/src/packages/vite-react-app/files/eslint-config-file-generator.ts +0 -11
- package/src/packages/vite-react-app/files/prettier-config-file-generator.ts +0 -11
- package/src/packages/vite-react-app/files/tsconfig-file-generator.ts +0 -15
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stack-dev/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"bin": {
|
|
6
6
|
"stack": "./dist/index.js"
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"prettier": "^3.6.2",
|
|
23
23
|
"prettier-plugin-organize-imports": "^4.2.0",
|
|
24
24
|
"tsup": "^7.3.0",
|
|
25
|
-
"@stack-dev/eslint-config": "0.2.0",
|
|
26
25
|
"@stack-dev/prettier-config": "0.2.0",
|
|
27
|
-
"@stack-dev/typescript-config": "0.2.0"
|
|
26
|
+
"@stack-dev/typescript-config": "0.2.0",
|
|
27
|
+
"@stack-dev/eslint-config": "0.2.0"
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "tsup src/index.ts --dts --format esm,cjs",
|
|
@@ -4,10 +4,10 @@ import { Dependency, PackageJSON } from '../../package-json';
|
|
|
4
4
|
import { PackageGenerator } from '../../utils/package-generator';
|
|
5
5
|
import { getNamespace, getWorkspaceRoot } from '../../utils/workspace';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { makeEslintConfigGenerator } from '../files/eslint-config-file-generator';
|
|
8
|
+
import { makePrettierConfigFileGenerator } from '../files/prettier-config-file-generator';
|
|
9
|
+
import { makeBaseTsconfigFileGenerator } from '../files/tsconfig-file-generator';
|
|
8
10
|
import { INDEX_FILE_GENERATOR } from './files/index-file-generator';
|
|
9
|
-
import { PRETTIER_CONFIG_FILE_GENERATOR } from './files/prettier-config-file-generator';
|
|
10
|
-
import { TSCONFIG_FILE_GENERATOR } from './files/tsconfig-file-generator';
|
|
11
11
|
import { TSUP_FILE_GENERATOR } from './files/tsup-file-generator';
|
|
12
12
|
import { VITEST_CONFIG_FILE_GENERATOR } from './files/vitest-config-file-generator';
|
|
13
13
|
|
|
@@ -25,10 +25,10 @@ export async function createCliApp(name: string): Promise<void> {
|
|
|
25
25
|
makeAppPackageGenerator(packageName, namespace),
|
|
26
26
|
[
|
|
27
27
|
INDEX_FILE_GENERATOR,
|
|
28
|
-
|
|
28
|
+
makeBaseTsconfigFileGenerator('tsconfig.json', namespace),
|
|
29
29
|
TSUP_FILE_GENERATOR,
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
makePrettierConfigFileGenerator('prettier.config.mjs', namespace),
|
|
31
|
+
makeEslintConfigGenerator('eslint.config.mjs', namespace),
|
|
32
32
|
VITEST_CONFIG_FILE_GENERATOR,
|
|
33
33
|
],
|
|
34
34
|
);
|
|
@@ -60,8 +60,10 @@ function makeAppPackageGenerator(packageName: string, namespace: string) {
|
|
|
60
60
|
type: 'module',
|
|
61
61
|
scripts: {
|
|
62
62
|
dev: 'tsx watch src/index.ts',
|
|
63
|
-
|
|
63
|
+
prebuild: 'pnpm check-types',
|
|
64
|
+
build: 'tsup',
|
|
64
65
|
start: 'node dist/index.mjs',
|
|
66
|
+
'check-types': 'tsc --noEmit',
|
|
65
67
|
lint: 'eslint .',
|
|
66
68
|
format: 'prettier . --write',
|
|
67
69
|
test: 'vitest run',
|
|
@@ -4,10 +4,10 @@ import { Dependency, PackageJSON } from '../../package-json';
|
|
|
4
4
|
import { PackageGenerator } from '../../utils/package-generator';
|
|
5
5
|
import { getNamespace, getWorkspaceRoot } from '../../utils/workspace';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { makeEslintConfigGenerator } from '../files/eslint-config-file-generator';
|
|
8
|
+
import { makePrettierConfigFileGenerator } from '../files/prettier-config-file-generator';
|
|
9
|
+
import { makeBaseTsconfigFileGenerator } from '../files/tsconfig-file-generator';
|
|
8
10
|
import { INDEX_FILE_GENERATOR } from './files/index-file-generator';
|
|
9
|
-
import { PRETTIER_CONFIG_FILE_GENERATOR } from './files/prettier-config-file-generator';
|
|
10
|
-
import { TSCONFIG_FILE_GENERATOR } from './files/tsconfig-file-generator';
|
|
11
11
|
import { TSUP_FILE_GENERATOR } from './files/tsup-file-generator';
|
|
12
12
|
import { VITEST_CONFIG_FILE_GENERATOR } from './files/vitest-config-file-generator';
|
|
13
13
|
|
|
@@ -25,10 +25,10 @@ export async function createFastifyApp(name: string): Promise<void> {
|
|
|
25
25
|
makeAppPackageGenerator(packageName, namespace),
|
|
26
26
|
[
|
|
27
27
|
INDEX_FILE_GENERATOR,
|
|
28
|
-
|
|
28
|
+
makeBaseTsconfigFileGenerator('tsconfig.json', namespace),
|
|
29
29
|
TSUP_FILE_GENERATOR,
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
makePrettierConfigFileGenerator('prettier.config.mjs', namespace),
|
|
31
|
+
makeEslintConfigGenerator('eslint.config.mjs', namespace),
|
|
32
32
|
VITEST_CONFIG_FILE_GENERATOR,
|
|
33
33
|
],
|
|
34
34
|
);
|
|
@@ -65,8 +65,10 @@ function makeAppPackageGenerator(packageName: string, namespace: string) {
|
|
|
65
65
|
type: 'module',
|
|
66
66
|
scripts: {
|
|
67
67
|
dev: 'tsx watch src/index.ts',
|
|
68
|
-
|
|
68
|
+
prebuild: 'pnpm check-types',
|
|
69
|
+
build: 'tsup',
|
|
69
70
|
start: 'node dist/index.mjs',
|
|
71
|
+
'check-types': 'tsc --noEmit',
|
|
70
72
|
lint: 'eslint .',
|
|
71
73
|
format: 'prettier . --write',
|
|
72
74
|
test: 'vitest run',
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FileGenerator } from '../../file-generator';
|
|
2
|
+
import { FileGeneratorImp } from '../../file-generator/file-generator-imp';
|
|
3
|
+
|
|
4
|
+
export function makeEslintConfigGenerator(
|
|
5
|
+
filepath: string,
|
|
6
|
+
namespace: string,
|
|
7
|
+
): FileGenerator {
|
|
8
|
+
const ESLINT_CONFIG = `import base from '${namespace}/eslint-config/base.mjs';
|
|
9
|
+
|
|
10
|
+
export default [...base, { ignores: ['**/dist/**'] }];
|
|
11
|
+
`;
|
|
12
|
+
|
|
13
|
+
return new FileGeneratorImp(filepath, ESLINT_CONFIG);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function makeReactEslintConfigGenerator(
|
|
17
|
+
filepath: string,
|
|
18
|
+
namespace: string,
|
|
19
|
+
): FileGenerator {
|
|
20
|
+
const ESLINT_CONFIG = `import base from '${namespace}/eslint-config/base.mjs';
|
|
21
|
+
import react from '${namespace}/eslint-config/react.mjs';
|
|
22
|
+
|
|
23
|
+
export default [
|
|
24
|
+
...base,
|
|
25
|
+
...react,
|
|
26
|
+
{
|
|
27
|
+
ignores: ['**/dist/**', '**/coverage/**']
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
`;
|
|
31
|
+
|
|
32
|
+
return new FileGeneratorImp(filepath, ESLINT_CONFIG);
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FileGenerator } from '../../file-generator';
|
|
2
|
+
import { FileGeneratorImp } from '../../file-generator/file-generator-imp';
|
|
3
|
+
|
|
4
|
+
export function makePrettierConfigFileGenerator(
|
|
5
|
+
filepath: string,
|
|
6
|
+
namespace: string,
|
|
7
|
+
): FileGenerator {
|
|
8
|
+
const PRETTIER_CONFIG = `import base from '${namespace}/prettier-config/base.mjs';
|
|
9
|
+
|
|
10
|
+
export default base;
|
|
11
|
+
`;
|
|
12
|
+
|
|
13
|
+
return new FileGeneratorImp(filepath, PRETTIER_CONFIG);
|
|
14
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { FileGenerator } from '../../file-generator';
|
|
2
|
+
import { FileGeneratorImp } from '../../file-generator/file-generator-imp';
|
|
3
|
+
|
|
4
|
+
export function makeBaseTsconfigFileGenerator(
|
|
5
|
+
filepath: string,
|
|
6
|
+
namespace: string,
|
|
7
|
+
): FileGenerator {
|
|
8
|
+
const TSCONFIG = `{
|
|
9
|
+
"extends": "${namespace}/typescript-config/tsconfig.base.json",
|
|
10
|
+
"compilerOptions": {
|
|
11
|
+
"outDir": "dist"
|
|
12
|
+
},
|
|
13
|
+
"include": ["src"]
|
|
14
|
+
}
|
|
15
|
+
`;
|
|
16
|
+
|
|
17
|
+
return new FileGeneratorImp(filepath, TSCONFIG);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function makeReactTsconfigFileGenerator(
|
|
21
|
+
filepath: string,
|
|
22
|
+
namespace: string,
|
|
23
|
+
): FileGenerator {
|
|
24
|
+
const TSCONFIG = `{
|
|
25
|
+
"extends": "${namespace}/typescript-config/tsconfig.react.json",
|
|
26
|
+
"compilerOptions": {
|
|
27
|
+
"outDir": "dist"
|
|
28
|
+
},
|
|
29
|
+
"include": ["src"]
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
return new FileGeneratorImp(filepath, TSCONFIG);
|
|
34
|
+
}
|
|
@@ -4,12 +4,12 @@ import path from 'node:path';
|
|
|
4
4
|
import { PackageJsonGenerator } from '../../file-generator';
|
|
5
5
|
import { Dependency, PackageJSON } from '../../package-json';
|
|
6
6
|
import { PackageGenerator } from '../../utils/package-generator';
|
|
7
|
+
import { makeEslintConfigGenerator } from '../files/eslint-config-file-generator';
|
|
8
|
+
import { makePrettierConfigFileGenerator } from '../files/prettier-config-file-generator';
|
|
9
|
+
import { makeBaseTsconfigFileGenerator } from '../files/tsconfig-file-generator';
|
|
7
10
|
import { ADD_FILE_GENERATOR } from './files/add-file-generator';
|
|
8
11
|
import { ADD_SPEC_FILE_GENERATOR } from './files/add-spec-file-generator';
|
|
9
|
-
import { ESLINT_CONFIG_FILE_GENERATOR } from './files/eslint-config-file-generator';
|
|
10
12
|
import { INDEX_FILE_GENERATOR } from './files/index-file-generator';
|
|
11
|
-
import { PRETTIER_CONFIG_FILE_GENERATOR } from './files/prettier-config-file-generator';
|
|
12
|
-
import { TSCONFIG_FILE_GENERATOR } from './files/tsconfig-file-generator';
|
|
13
13
|
import { TSUP_CONFIG_FILE_GENERATOR } from './files/tsup-config-file-generator';
|
|
14
14
|
import { VITEST_CONFIG_FILE_GENERATOR } from './files/vitest-config-file-generator';
|
|
15
15
|
|
|
@@ -30,9 +30,9 @@ export async function createLibraryPackage(name: string): Promise<void> {
|
|
|
30
30
|
ADD_FILE_GENERATOR,
|
|
31
31
|
ADD_SPEC_FILE_GENERATOR,
|
|
32
32
|
TSUP_CONFIG_FILE_GENERATOR,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
makeBaseTsconfigFileGenerator('tsconfig.json', namespace),
|
|
34
|
+
makePrettierConfigFileGenerator('prettier.config.mjs', namespace),
|
|
35
|
+
makeEslintConfigGenerator('eslint.config.mjs', namespace),
|
|
36
36
|
VITEST_CONFIG_FILE_GENERATOR,
|
|
37
37
|
],
|
|
38
38
|
);
|
|
@@ -71,8 +71,10 @@ function makePackageGenerator(packageName: string, namespace: string) {
|
|
|
71
71
|
},
|
|
72
72
|
},
|
|
73
73
|
scripts: {
|
|
74
|
+
prebuild: 'pnpm check-types',
|
|
74
75
|
build: 'tsup',
|
|
75
|
-
|
|
76
|
+
'check-types': 'tsc --noEmit',
|
|
77
|
+
lint: 'eslint .',
|
|
76
78
|
format: 'prettier . --write',
|
|
77
79
|
test: 'vitest run',
|
|
78
80
|
'test:watch': 'vitest',
|
|
@@ -3,12 +3,12 @@ import { PackageJsonGenerator } from '../../../file-generator';
|
|
|
3
3
|
import { Dependency, PackageJSON } from '../../../package-json';
|
|
4
4
|
import { PackageGenerator } from '../../../utils/package-generator';
|
|
5
5
|
import { getNamespace, getWorkspaceRoot } from '../../../utils/workspace';
|
|
6
|
+
import { makeReactEslintConfigGenerator } from '../../files/eslint-config-file-generator';
|
|
7
|
+
import { makePrettierConfigFileGenerator } from '../../files/prettier-config-file-generator';
|
|
8
|
+
import { makeReactTsconfigFileGenerator } from '../../files/tsconfig-file-generator';
|
|
6
9
|
import { BUTTON_FILE_GENERATOR } from './files/button-file-generator';
|
|
7
10
|
import { BUTTON_SPEC_FILE_GENERATOR } from './files/button-spec-file-generator';
|
|
8
|
-
import { ESLINT_CONFIG_FILE_GENERATOR } from './files/eslint-config-file-generator';
|
|
9
11
|
import { INDEX_FILE_GENERATOR } from './files/index-file-generator';
|
|
10
|
-
import { PRETTIER_CONFIG_FILE_GENERATOR } from './files/prettier-config-file-generator';
|
|
11
|
-
import { TSCONFIG_FILE_GENERATOR } from './files/tsconfig-file-generator';
|
|
12
12
|
import { TSUP_CONFIG_FILE_GENERATOR } from './files/tsup-config-file-generator';
|
|
13
13
|
import { VITEST_CONFIG_FILE_GENERATOR } from './files/vitest-config-file-generator';
|
|
14
14
|
|
|
@@ -31,9 +31,9 @@ export async function createStyledComponentsReactPackage(
|
|
|
31
31
|
BUTTON_FILE_GENERATOR,
|
|
32
32
|
BUTTON_SPEC_FILE_GENERATOR,
|
|
33
33
|
TSUP_CONFIG_FILE_GENERATOR,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
makeReactTsconfigFileGenerator('tsconfig.json', namespace),
|
|
35
|
+
makePrettierConfigFileGenerator('prettier.config.mjs', namespace),
|
|
36
|
+
makeReactEslintConfigGenerator('eslint.config.mjs', namespace),
|
|
37
37
|
VITEST_CONFIG_FILE_GENERATOR,
|
|
38
38
|
],
|
|
39
39
|
);
|
|
@@ -94,8 +94,10 @@ function makePackageGenerator(packageName: string, namespace: string) {
|
|
|
94
94
|
// Removed './index.css' as it's no longer produced by Styled Components
|
|
95
95
|
},
|
|
96
96
|
scripts: {
|
|
97
|
+
prebuild: 'pnpm check-types',
|
|
97
98
|
build: 'tsup',
|
|
98
99
|
dev: 'tsup --watch', // Helpful for local lib dev
|
|
100
|
+
'check-types': 'tsc --noEmit',
|
|
99
101
|
lint: 'eslint .',
|
|
100
102
|
format: 'prettier . --write',
|
|
101
103
|
test: 'vitest run',
|
|
@@ -3,12 +3,12 @@ import { PackageJsonGenerator } from '../../../file-generator';
|
|
|
3
3
|
import { Dependency, PackageJSON } from '../../../package-json';
|
|
4
4
|
import { PackageGenerator } from '../../../utils/package-generator';
|
|
5
5
|
import { getNamespace, getWorkspaceRoot } from '../../../utils/workspace';
|
|
6
|
+
import { makeReactEslintConfigGenerator } from '../../files/eslint-config-file-generator';
|
|
7
|
+
import { makePrettierConfigFileGenerator } from '../../files/prettier-config-file-generator';
|
|
8
|
+
import { makeReactTsconfigFileGenerator } from '../../files/tsconfig-file-generator';
|
|
6
9
|
import { BUTTON_FILE_GENERATOR } from './files/button-file-generator';
|
|
7
10
|
import { BUTTON_SPEC_FILE_GENERATOR } from './files/button-spec-file-generator';
|
|
8
|
-
import { ESLINT_CONFIG_FILE_GENERATOR } from './files/eslint-config-file-generator';
|
|
9
11
|
import { INDEX_FILE_GENERATOR } from './files/index-file-generator';
|
|
10
|
-
import { PRETTIER_CONFIG_FILE_GENERATOR } from './files/prettier-config-file-generator';
|
|
11
|
-
import { TSCONFIG_FILE_GENERATOR } from './files/tsconfig-file-generator';
|
|
12
12
|
import { TSUP_CONFIG_FILE_GENERATOR } from './files/tsup-config-file-generator';
|
|
13
13
|
import { VITEST_CONFIG_FILE_GENERATOR } from './files/vitest-config-file-generator';
|
|
14
14
|
|
|
@@ -29,9 +29,9 @@ export async function createUnstyledReactPackage(name: string): Promise<void> {
|
|
|
29
29
|
BUTTON_FILE_GENERATOR,
|
|
30
30
|
BUTTON_SPEC_FILE_GENERATOR,
|
|
31
31
|
TSUP_CONFIG_FILE_GENERATOR,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
makeReactTsconfigFileGenerator('tsconfig.json', namespace),
|
|
33
|
+
makePrettierConfigFileGenerator('prettier.config.mjs', namespace),
|
|
34
|
+
makeReactEslintConfigGenerator('eslint.config.mjs', namespace),
|
|
35
35
|
VITEST_CONFIG_FILE_GENERATOR,
|
|
36
36
|
],
|
|
37
37
|
);
|
|
@@ -88,8 +88,10 @@ function makePackageGenerator(packageName: string, namespace: string) {
|
|
|
88
88
|
// Removed './index.css' as it's no longer produced by Styled Components
|
|
89
89
|
},
|
|
90
90
|
scripts: {
|
|
91
|
+
prebuild: 'pnpm check-types',
|
|
91
92
|
build: 'tsup',
|
|
92
93
|
dev: 'tsup --watch', // Helpful for local lib dev
|
|
94
|
+
'check-types': 'tsc --noEmit',
|
|
93
95
|
lint: 'eslint .',
|
|
94
96
|
format: 'prettier . --write',
|
|
95
97
|
test: 'vitest run',
|
|
@@ -8,10 +8,10 @@ import { INDEX_HTML_FILE_GENERATOR } from './files/index-html-file-generator';
|
|
|
8
8
|
import { MAIN_FILE_GENERATOR } from './files/main-file-generator';
|
|
9
9
|
import { VITE_CONFIG_FILE_GENERATOR } from './files/vite-config-file-generator';
|
|
10
10
|
|
|
11
|
+
import { makeReactEslintConfigGenerator } from '../files/eslint-config-file-generator';
|
|
12
|
+
import { makePrettierConfigFileGenerator } from '../files/prettier-config-file-generator';
|
|
13
|
+
import { makeReactTsconfigFileGenerator } from '../files/tsconfig-file-generator';
|
|
11
14
|
import { APP_FILE_GENERATOR } from './files/app-file-generator';
|
|
12
|
-
import { ESLINT_CONFIG_FILE_GENERATOR } from './files/eslint-config-file-generator';
|
|
13
|
-
import { PRETTIER_CONFIG_FILE_GENERATOR } from './files/prettier-config-file-generator';
|
|
14
|
-
import { TSCONFIG_FILE_GENERATOR } from './files/tsconfig-file-generator';
|
|
15
15
|
import { VITEST_CONFIG_FILE_GENERATOR } from './files/vitest-config-file-generator';
|
|
16
16
|
|
|
17
17
|
export async function createViteReactApp(name: string): Promise<void> {
|
|
@@ -31,9 +31,9 @@ export async function createViteReactApp(name: string): Promise<void> {
|
|
|
31
31
|
INDEX_HTML_FILE_GENERATOR,
|
|
32
32
|
MAIN_FILE_GENERATOR,
|
|
33
33
|
APP_FILE_GENERATOR,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
makeReactTsconfigFileGenerator('tsconfig.json', namespace),
|
|
35
|
+
makePrettierConfigFileGenerator('prettier.config.mjs', namespace),
|
|
36
|
+
makeReactEslintConfigGenerator('eslint.config.mjs', namespace),
|
|
37
37
|
VITEST_CONFIG_FILE_GENERATOR,
|
|
38
38
|
],
|
|
39
39
|
);
|
|
@@ -69,8 +69,11 @@ function makeAppPackageGenerator(packageName: string, namespace: string) {
|
|
|
69
69
|
build: 'tsc && vite build',
|
|
70
70
|
preview: 'vite preview',
|
|
71
71
|
start: 'pnpm run preview',
|
|
72
|
+
'check-types': 'tsc --noEmit',
|
|
72
73
|
lint: 'eslint .',
|
|
73
74
|
format: 'prettier . --write',
|
|
75
|
+
test: 'vitest run',
|
|
76
|
+
'test:watch': 'vitest',
|
|
74
77
|
},
|
|
75
78
|
},
|
|
76
79
|
});
|
package/src/utils/workspace.ts
CHANGED
|
@@ -61,18 +61,33 @@ export async function getWorkspaceRoot(
|
|
|
61
61
|
return getWorkspaceRoot(parent);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
export async function tryGettingNamespace(
|
|
65
|
+
directory: string,
|
|
66
|
+
): Promise<string | undefined> {
|
|
67
|
+
try {
|
|
68
|
+
const root = await getWorkspaceRoot(directory);
|
|
69
|
+
const packageJson = await getDirectoryPackageJson(root);
|
|
70
|
+
|
|
71
|
+
const result = packageJson.name;
|
|
72
|
+
|
|
73
|
+
if (!result) {
|
|
74
|
+
return undefined;
|
|
75
|
+
} else {
|
|
76
|
+
return `@${result}`;
|
|
77
|
+
}
|
|
78
|
+
} catch (e) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
64
83
|
export async function getNamespace(
|
|
65
84
|
directory: string = process.cwd(),
|
|
66
85
|
): Promise<string> {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
const packageJson = await getDirectoryPackageJson(root);
|
|
70
|
-
|
|
71
|
-
const result = packageJson.name;
|
|
86
|
+
const namespace = await tryGettingNamespace(directory);
|
|
72
87
|
|
|
73
|
-
if (!
|
|
74
|
-
throw new Error('Missing
|
|
88
|
+
if (!namespace) {
|
|
89
|
+
throw new Error('Missing namespace.');
|
|
75
90
|
}
|
|
76
91
|
|
|
77
|
-
return
|
|
92
|
+
return namespace;
|
|
78
93
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import fs from 'fs/promises';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import { tryGettingNamespace } from '../utils/workspace';
|
|
4
|
+
import { makeEslintConfig } from './eslint-config';
|
|
5
|
+
import { makePrettierConfig } from './prettier-config';
|
|
4
6
|
import { makeRootPackage } from './root-package';
|
|
5
7
|
import { makeTypescriptConfig } from './typescript-config';
|
|
6
8
|
|
|
@@ -17,13 +19,15 @@ export async function createWorkspace(name: string, directory: string) {
|
|
|
17
19
|
const PACKAGES = [
|
|
18
20
|
await makeRootPackage(fullPath, name),
|
|
19
21
|
await makeTypescriptConfig(fullPath, namespace),
|
|
22
|
+
await makeEslintConfig(fullPath, namespace),
|
|
23
|
+
await makePrettierConfig(fullPath, namespace),
|
|
20
24
|
];
|
|
21
25
|
|
|
22
26
|
await Promise.all(PACKAGES.map((p) => p.generate()));
|
|
23
27
|
|
|
24
|
-
await fs.mkdir(path.join(fullPath, 'apps'));
|
|
25
|
-
await fs.mkdir(path.join(fullPath, 'configs'));
|
|
26
|
-
await fs.mkdir(path.join(fullPath, 'packages'));
|
|
28
|
+
await fs.mkdir(path.join(fullPath, 'apps'), { recursive: true });
|
|
29
|
+
await fs.mkdir(path.join(fullPath, 'configs'), { recursive: true });
|
|
30
|
+
await fs.mkdir(path.join(fullPath, 'packages'), { recursive: true });
|
|
27
31
|
|
|
28
32
|
console.log(`✅ Workspace created at: ${fullPath}`);
|
|
29
33
|
console.log('');
|
|
@@ -31,7 +35,7 @@ export async function createWorkspace(name: string, directory: string) {
|
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
async function validateNotInWorkspace(directory: string): Promise<void> {
|
|
34
|
-
const namespace = await
|
|
38
|
+
const namespace = await tryGettingNamespace(directory);
|
|
35
39
|
|
|
36
40
|
if (namespace !== undefined) {
|
|
37
41
|
throw new Error(`Currently in workspace "${namespace}".`);
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { PackageJsonGenerator } from '../file-generator';
|
|
3
|
+
import { FileGeneratorImp } from '../file-generator/file-generator-imp';
|
|
4
|
+
import { Dependency, PackageJSON } from '../package-json';
|
|
5
|
+
import { PackageGenerator } from '../utils/package-generator';
|
|
6
|
+
|
|
7
|
+
export async function makeEslintConfig(
|
|
8
|
+
directory: string,
|
|
9
|
+
namespace: string,
|
|
10
|
+
): Promise<PackageGenerator> {
|
|
11
|
+
const packageJsonModel = new PackageJSON({
|
|
12
|
+
name: `${namespace}/eslint-config`,
|
|
13
|
+
peerDependencies: [
|
|
14
|
+
new Dependency('eslint', '^9.32.0'),
|
|
15
|
+
new Dependency('typescript', '^5.8.3'),
|
|
16
|
+
],
|
|
17
|
+
dependencies: [
|
|
18
|
+
new Dependency('@eslint/js', '^9.32.0'),
|
|
19
|
+
new Dependency('eslint-plugin-react', '^7.37.5'),
|
|
20
|
+
new Dependency('typescript-eslint', '^8.38.0'),
|
|
21
|
+
],
|
|
22
|
+
additionalData: {
|
|
23
|
+
version: '0.1.0',
|
|
24
|
+
private: true,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const fullPath = path.join(directory, 'configs/eslint-config');
|
|
29
|
+
|
|
30
|
+
return new PackageGenerator(
|
|
31
|
+
fullPath,
|
|
32
|
+
new PackageJsonGenerator(packageJsonModel, namespace),
|
|
33
|
+
[BASE_FILE_GENERATOR, REACT_FILE_GENERATOR],
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const BASE = `import eslint from "@eslint/js";
|
|
38
|
+
import tseslint from "typescript-eslint";
|
|
39
|
+
|
|
40
|
+
export default tseslint.config(
|
|
41
|
+
eslint.configs.recommended,
|
|
42
|
+
tseslint.configs.strict,
|
|
43
|
+
tseslint.configs.stylistic,
|
|
44
|
+
{
|
|
45
|
+
rules: {
|
|
46
|
+
"@typescript-eslint/array-type": ["error", { default: "generic" }],
|
|
47
|
+
"@typescript-eslint/consistent-type-definitions": "off",
|
|
48
|
+
"@typescript-eslint/class-literal-property-style": ["error", "getters"],
|
|
49
|
+
},
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
`;
|
|
53
|
+
|
|
54
|
+
const BASE_FILE_GENERATOR = new FileGeneratorImp('base.mjs', BASE);
|
|
55
|
+
|
|
56
|
+
const REACT = `import eslint from "@eslint/js";
|
|
57
|
+
import pluginReact from "eslint-plugin-react";
|
|
58
|
+
import tseslint from "typescript-eslint";
|
|
59
|
+
|
|
60
|
+
export default tseslint.config(
|
|
61
|
+
eslint.configs.recommended,
|
|
62
|
+
tseslint.configs.strict,
|
|
63
|
+
pluginReact.configs.flat.recommended,
|
|
64
|
+
pluginReact.configs.flat["jsx-runtime"],
|
|
65
|
+
{
|
|
66
|
+
settings: {
|
|
67
|
+
react: {
|
|
68
|
+
version: "detect",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
`;
|
|
74
|
+
|
|
75
|
+
const REACT_FILE_GENERATOR = new FileGeneratorImp('react.mjs', REACT);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { PackageJsonGenerator } from '../file-generator';
|
|
3
|
+
import { FileGeneratorImp } from '../file-generator/file-generator-imp';
|
|
4
|
+
import { Dependency, PackageJSON } from '../package-json';
|
|
5
|
+
import { PackageGenerator } from '../utils/package-generator';
|
|
6
|
+
|
|
7
|
+
export async function makePrettierConfig(
|
|
8
|
+
directory: string,
|
|
9
|
+
namespace: string,
|
|
10
|
+
): Promise<PackageGenerator> {
|
|
11
|
+
const packageJsonModel = new PackageJSON({
|
|
12
|
+
name: `${namespace}/prettier-config`,
|
|
13
|
+
peerDependencies: [new Dependency('prettier', '^3.6.2')],
|
|
14
|
+
dependencies: [
|
|
15
|
+
new Dependency('prettier-plugin-organize-imports', '^4.2.0'),
|
|
16
|
+
],
|
|
17
|
+
additionalData: {
|
|
18
|
+
version: '0.1.0',
|
|
19
|
+
private: true,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const fullPath = path.join(directory, 'configs/prettier-config');
|
|
24
|
+
|
|
25
|
+
return new PackageGenerator(
|
|
26
|
+
fullPath,
|
|
27
|
+
new PackageJsonGenerator(packageJsonModel, namespace),
|
|
28
|
+
[BASE_FILE_GENERATOR],
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const BASE = `/**
|
|
33
|
+
* @see https://prettier.io/docs/configuration
|
|
34
|
+
* @type {import("prettier").Config}
|
|
35
|
+
*/
|
|
36
|
+
const config = {
|
|
37
|
+
tabWidth: 2,
|
|
38
|
+
singleQuote: true,
|
|
39
|
+
plugins: [import.meta.resolve("prettier-plugin-organize-imports")],
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default config;
|
|
43
|
+
`;
|
|
44
|
+
|
|
45
|
+
const BASE_FILE_GENERATOR = new FileGeneratorImp('base.mjs', BASE);
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { FileGeneratorImp } from '../../../file-generator/file-generator-imp';
|
|
2
|
-
|
|
3
|
-
const ESLINT_CONFIG = `import base from '@stack-dev/eslint-config/base.mjs';
|
|
4
|
-
|
|
5
|
-
export default [...base, { ignores: ['**/dist/**'] }];
|
|
6
|
-
`;
|
|
7
|
-
|
|
8
|
-
export const ESLINT_CONFIG_FILE_GENERATOR = new FileGeneratorImp(
|
|
9
|
-
'eslint.config.mjs',
|
|
10
|
-
ESLINT_CONFIG,
|
|
11
|
-
);
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { FileGeneratorImp } from '../../../file-generator/file-generator-imp';
|
|
2
|
-
|
|
3
|
-
const PRETTIER_CONFIG = `import base from '@stack-dev/prettier-config/base.mjs';
|
|
4
|
-
|
|
5
|
-
export default base;
|
|
6
|
-
`;
|
|
7
|
-
|
|
8
|
-
export const PRETTIER_CONFIG_FILE_GENERATOR = new FileGeneratorImp(
|
|
9
|
-
'prettier.config.mjs',
|
|
10
|
-
PRETTIER_CONFIG,
|
|
11
|
-
);
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { FileGeneratorImp } from '../../../file-generator/file-generator-imp';
|
|
2
|
-
|
|
3
|
-
const TSCONFIG = `{
|
|
4
|
-
"extends": "@stack-dev/typescript-config/tsconfig.base.json",
|
|
5
|
-
"compilerOptions": {
|
|
6
|
-
"outDir": "dist"
|
|
7
|
-
},
|
|
8
|
-
"include": ["src"]
|
|
9
|
-
}
|
|
10
|
-
`;
|
|
11
|
-
|
|
12
|
-
export const TSCONFIG_FILE_GENERATOR = new FileGeneratorImp(
|
|
13
|
-
'tsconfig.json',
|
|
14
|
-
TSCONFIG,
|
|
15
|
-
);
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { FileGeneratorImp } from '../../../file-generator/file-generator-imp';
|
|
2
|
-
|
|
3
|
-
const ESLINT_CONFIG = `import base from '@stack-dev/eslint-config/base.mjs';
|
|
4
|
-
|
|
5
|
-
export default [...base, { ignores: ['**/dist/**'] }];
|
|
6
|
-
`;
|
|
7
|
-
|
|
8
|
-
export const ESLINT_CONFIG_FILE_GENERATOR = new FileGeneratorImp(
|
|
9
|
-
'eslint.config.mjs',
|
|
10
|
-
ESLINT_CONFIG,
|
|
11
|
-
);
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { FileGeneratorImp } from '../../../file-generator/file-generator-imp';
|
|
2
|
-
|
|
3
|
-
const PRETTIER_CONFIG = `import base from '@stack-dev/prettier-config/base.mjs';
|
|
4
|
-
|
|
5
|
-
export default base;
|
|
6
|
-
`;
|
|
7
|
-
|
|
8
|
-
export const PRETTIER_CONFIG_FILE_GENERATOR = new FileGeneratorImp(
|
|
9
|
-
'prettier.config.mjs',
|
|
10
|
-
PRETTIER_CONFIG,
|
|
11
|
-
);
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { FileGeneratorImp } from '../../../file-generator/file-generator-imp';
|
|
2
|
-
|
|
3
|
-
const TSCONFIG = `{
|
|
4
|
-
"extends": "@stack-dev/typescript-config/tsconfig.base.json",
|
|
5
|
-
"compilerOptions": {
|
|
6
|
-
"outDir": "dist"
|
|
7
|
-
},
|
|
8
|
-
"include": ["src"]
|
|
9
|
-
}
|
|
10
|
-
`;
|
|
11
|
-
|
|
12
|
-
export const TSCONFIG_FILE_GENERATOR = new FileGeneratorImp(
|
|
13
|
-
'tsconfig.json',
|
|
14
|
-
TSCONFIG,
|
|
15
|
-
);
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { FileGeneratorImp } from '../../../file-generator/file-generator-imp';
|
|
2
|
-
|
|
3
|
-
const ESLINT_CONFIG = `import base from '@stack-dev/eslint-config/base.mjs';
|
|
4
|
-
|
|
5
|
-
export default [...base, { ignores: ['**/dist/**'] }];
|
|
6
|
-
`;
|
|
7
|
-
|
|
8
|
-
export const ESLINT_CONFIG_FILE_GENERATOR = new FileGeneratorImp(
|
|
9
|
-
'eslint.config.mjs',
|
|
10
|
-
ESLINT_CONFIG,
|
|
11
|
-
);
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { FileGeneratorImp } from '../../../file-generator/file-generator-imp';
|
|
2
|
-
|
|
3
|
-
const PRETTIER_CONFIG = `import base from '@stack-dev/prettier-config/base.mjs';
|
|
4
|
-
|
|
5
|
-
export default base;
|
|
6
|
-
`;
|
|
7
|
-
|
|
8
|
-
export const PRETTIER_CONFIG_FILE_GENERATOR = new FileGeneratorImp(
|
|
9
|
-
'prettier.config.mjs',
|
|
10
|
-
PRETTIER_CONFIG,
|
|
11
|
-
);
|