@exanderal/stackcraft 0.0.1 → 0.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/dist/add/index.d.ts +2 -0
- package/dist/add/index.d.ts.map +1 -0
- package/dist/add/index.js +7 -0
- package/dist/add/index.js.map +1 -0
- package/dist/create/index.d.ts +2 -0
- package/dist/create/index.d.ts.map +1 -0
- package/dist/create/index.js +50 -0
- package/dist/create/index.js.map +1 -0
- package/dist/create/scaffold.d.ts +3 -0
- package/dist/create/scaffold.d.ts.map +1 -0
- package/dist/create/scaffold.js +22 -0
- package/dist/create/scaffold.js.map +1 -0
- package/dist/create/scaffolders/__tests__/web-vite.test.d.ts +2 -0
- package/dist/create/scaffolders/__tests__/web-vite.test.d.ts.map +1 -0
- package/dist/create/scaffolders/__tests__/web-vite.test.js +31 -0
- package/dist/create/scaffolders/__tests__/web-vite.test.js.map +1 -0
- package/dist/create/scaffolders/api-nestjs-rest.d.ts +3 -0
- package/dist/create/scaffolders/api-nestjs-rest.d.ts.map +1 -0
- package/dist/create/scaffolders/api-nestjs-rest.js +14 -0
- package/dist/create/scaffolders/api-nestjs-rest.js.map +1 -0
- package/dist/create/scaffolders/base.d.ts +3 -0
- package/dist/create/scaffolders/base.d.ts.map +1 -0
- package/dist/create/scaffolders/base.js +14 -0
- package/dist/create/scaffolders/base.js.map +1 -0
- package/dist/create/scaffolders/utils/copy.d.ts +2 -0
- package/dist/create/scaffolders/utils/copy.d.ts.map +1 -0
- package/dist/create/scaffolders/utils/copy.js +34 -0
- package/dist/create/scaffolders/utils/copy.js.map +1 -0
- package/dist/create/scaffolders/web-nextjs.d.ts +3 -0
- package/dist/create/scaffolders/web-nextjs.d.ts.map +1 -0
- package/dist/create/scaffolders/web-nextjs.js +14 -0
- package/dist/create/scaffolders/web-nextjs.js.map +1 -0
- package/dist/create/scaffolders/web-vite.d.ts +3 -0
- package/dist/create/scaffolders/web-vite.d.ts.map +1 -0
- package/dist/create/scaffolders/web-vite.js +14 -0
- package/dist/create/scaffolders/web-vite.js.map +1 -0
- package/dist/create/types.d.ts +11 -0
- package/dist/create/types.d.ts.map +1 -0
- package/dist/create/types.js +2 -0
- package/dist/create/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/eslint/index.js +9 -0
- package/package.json +39 -4
- package/prettier/index.js +8 -0
- package/templates/api-nestjs-rest/.prettierrc +4 -0
- package/templates/api-nestjs-rest/eslint.config.mjs +34 -0
- package/templates/api-nestjs-rest/nest-cli.json +8 -0
- package/templates/api-nestjs-rest/package.json +74 -0
- package/templates/api-nestjs-rest/project.json +21 -0
- package/templates/api-nestjs-rest/src/app.controller.spec.ts +22 -0
- package/templates/api-nestjs-rest/src/app.controller.ts +12 -0
- package/templates/api-nestjs-rest/src/app.module.ts +10 -0
- package/templates/api-nestjs-rest/src/app.service.ts +8 -0
- package/templates/api-nestjs-rest/src/main.ts +8 -0
- package/templates/api-nestjs-rest/test/app.e2e-spec.ts +25 -0
- package/templates/api-nestjs-rest/test/jest-e2e.json +9 -0
- package/templates/api-nestjs-rest/tsconfig.build.json +4 -0
- package/templates/api-nestjs-rest/tsconfig.json +21 -0
- package/templates/base/.gitkeep +0 -0
- package/templates/base/nx.json +16 -0
- package/templates/base/package.json +14 -0
- package/templates/base/pnpm-workspace.yaml +3 -0
- package/templates/base/tsconfig.base.json +8 -0
- package/templates/web-nextjs/AGENTS.md +5 -0
- package/templates/web-nextjs/CLAUDE.md +1 -0
- package/templates/web-nextjs/app/favicon.ico +0 -0
- package/templates/web-nextjs/app/globals.css +10 -0
- package/templates/web-nextjs/app/layout.tsx +30 -0
- package/templates/web-nextjs/app/page.tsx +3 -0
- package/templates/web-nextjs/next.config.ts +8 -0
- package/templates/web-nextjs/package.json +23 -0
- package/templates/web-nextjs/project.json +17 -0
- package/templates/web-nextjs/public/file.svg +1 -0
- package/templates/web-nextjs/public/globe.svg +1 -0
- package/templates/web-nextjs/public/window.svg +1 -0
- package/templates/web-nextjs/tsconfig.json +34 -0
- package/templates/web-vite/eslint.config.js +23 -0
- package/templates/web-vite/index.html +13 -0
- package/templates/web-vite/package.json +30 -0
- package/templates/web-vite/project.json +21 -0
- package/templates/web-vite/public/favicon.svg +1 -0
- package/templates/web-vite/src/App.tsx +5 -0
- package/templates/web-vite/src/index.css +8 -0
- package/templates/web-vite/src/main.tsx +10 -0
- package/templates/web-vite/tsconfig.app.json +28 -0
- package/templates/web-vite/tsconfig.json +7 -0
- package/templates/web-vite/tsconfig.node.json +26 -0
- package/templates/web-vite/vite.config.ts +7 -0
- package/tsconfig/base.json +13 -0
- package/CLAUDE.md +0 -95
- package/index.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/add/index.ts"],"names":[],"mappings":"AAEA,wBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,iBAIxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,KAAe;IACvC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACvB,+BAA+B;IAC/B,KAAK,CAAC,cAAc,CAAC,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/create/index.ts"],"names":[],"mappings":"AAKA,wBAAsB,MAAM,kBAmD3B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { cancel, intro, isCancel, outro, select, spinner, text } from '@clack/prompts';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { scaffold } from './scaffold.js';
|
|
4
|
+
export async function create() {
|
|
5
|
+
intro('stackcraft — spin up a production-ready monorepo');
|
|
6
|
+
const projectName = await text({
|
|
7
|
+
message: 'Project name',
|
|
8
|
+
placeholder: 'my-app',
|
|
9
|
+
validate: (v) => (!v ? 'Required' : undefined),
|
|
10
|
+
});
|
|
11
|
+
if (isCancel(projectName)) {
|
|
12
|
+
cancel('Cancelled.');
|
|
13
|
+
process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
const frontend = await select({
|
|
16
|
+
message: 'Frontend',
|
|
17
|
+
options: [
|
|
18
|
+
{ value: 'vite', label: 'Vite + React', hint: 'Fast dev server, great for SPAs' },
|
|
19
|
+
{ value: 'nextjs', label: 'Next.js', hint: 'Full-stack React with SSR/SSG' },
|
|
20
|
+
],
|
|
21
|
+
});
|
|
22
|
+
if (isCancel(frontend)) {
|
|
23
|
+
cancel('Cancelled.');
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
const packageManager = await select({
|
|
27
|
+
message: 'Package manager',
|
|
28
|
+
options: [
|
|
29
|
+
{ value: 'pnpm', label: 'pnpm', hint: 'recommended' },
|
|
30
|
+
{ value: 'npm', label: 'npm' },
|
|
31
|
+
],
|
|
32
|
+
});
|
|
33
|
+
if (isCancel(packageManager)) {
|
|
34
|
+
cancel('Cancelled.');
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
const config = {
|
|
38
|
+
projectName: projectName,
|
|
39
|
+
frontend: frontend,
|
|
40
|
+
backend: 'nestjs-rest',
|
|
41
|
+
packageManager: packageManager,
|
|
42
|
+
targetDir: resolve(process.cwd(), projectName),
|
|
43
|
+
};
|
|
44
|
+
const s = spinner();
|
|
45
|
+
s.start('Scaffolding your project...');
|
|
46
|
+
await scaffold(config, (msg) => s.message(msg));
|
|
47
|
+
s.stop('Done!');
|
|
48
|
+
outro(`cd ${config.projectName} && ${config.packageManager} dev`);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/create/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,KAAK,CAAC,kDAAkD,CAAC,CAAA;IAEzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;QAC7B,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,QAAQ;QACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;KAC/C,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,YAAY,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,iCAAiC,EAAE;YACjF,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,+BAA+B,EAAE;SAC7E;KACF,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,YAAY,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC;QAClC,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;YACrD,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;SAC/B;KACF,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,YAAY,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,WAAW,EAAE,WAAqB;QAClC,QAAQ,EAAE,QAAoB;QAC9B,OAAO,EAAE,aAAwB;QACjC,cAAc,EAAE,cAAgC;QAChD,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAqB,CAAC;KACzD,CAAA;IAED,MAAM,CAAC,GAAG,OAAO,EAAE,CAAA;IACnB,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACtC,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEf,KAAK,CAAC,MAAM,MAAM,CAAC,WAAW,OAAO,MAAM,CAAC,cAAc,MAAM,CAAC,CAAA;AACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/create/scaffold.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,iBAiBlF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import { scaffoldNestjsRest } from './scaffolders/api-nestjs-rest.js';
|
|
3
|
+
import { scaffoldBase } from './scaffolders/base.js';
|
|
4
|
+
import { scaffoldNextjs } from './scaffolders/web-nextjs.js';
|
|
5
|
+
import { scaffoldVite } from './scaffolders/web-vite.js';
|
|
6
|
+
export async function scaffold(config, onStep) {
|
|
7
|
+
onStep('Creating workspace...');
|
|
8
|
+
await scaffoldBase(config);
|
|
9
|
+
onStep('Adding API...');
|
|
10
|
+
await scaffoldNestjsRest(config);
|
|
11
|
+
if (config.frontend === 'vite') {
|
|
12
|
+
onStep('Adding Vite + React app...');
|
|
13
|
+
await scaffoldVite(config);
|
|
14
|
+
}
|
|
15
|
+
else if (config.frontend === 'nextjs') {
|
|
16
|
+
onStep('Adding Next.js app...');
|
|
17
|
+
await scaffoldNextjs(config);
|
|
18
|
+
}
|
|
19
|
+
onStep('Installing dependencies...');
|
|
20
|
+
await execa(config.packageManager, ['install'], { cwd: config.targetDir });
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/create/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAGxD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAqB,EAAE,MAA6B;IACjF,MAAM,CAAC,uBAAuB,CAAC,CAAA;IAC/B,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;IAE1B,MAAM,CAAC,eAAe,CAAC,CAAA;IACvB,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAEhC,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,CAAC,4BAA4B,CAAC,CAAA;QACpC,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,uBAAuB,CAAC,CAAA;QAC/B,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,CAAC,4BAA4B,CAAC,CAAA;IACpC,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;AAC5E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-vite.test.d.ts","sourceRoot":"","sources":["../../../../src/create/scaffolders/__tests__/web-vite.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
vi.mock('node:fs/promises', () => ({
|
|
3
|
+
mkdir: vi.fn().mockResolvedValue(undefined),
|
|
4
|
+
cp: vi.fn().mockResolvedValue(undefined),
|
|
5
|
+
readdir: vi.fn().mockResolvedValue([]),
|
|
6
|
+
readFile: vi.fn().mockResolvedValue(''),
|
|
7
|
+
writeFile: vi.fn().mockResolvedValue(undefined),
|
|
8
|
+
}));
|
|
9
|
+
const CONFIG = {
|
|
10
|
+
projectName: 'my-app',
|
|
11
|
+
frontend: 'vite',
|
|
12
|
+
backend: 'nestjs-rest',
|
|
13
|
+
packageManager: 'pnpm',
|
|
14
|
+
targetDir: '/tmp/my-app',
|
|
15
|
+
};
|
|
16
|
+
describe('scaffoldVite', () => {
|
|
17
|
+
afterEach(() => vi.clearAllMocks());
|
|
18
|
+
it('creates the apps/web directory', async () => {
|
|
19
|
+
const { mkdir } = await import('node:fs/promises');
|
|
20
|
+
const { scaffoldVite } = await import('../web-vite.js');
|
|
21
|
+
await scaffoldVite(CONFIG);
|
|
22
|
+
expect(mkdir).toHaveBeenCalledWith(expect.stringContaining('apps/web'), { recursive: true });
|
|
23
|
+
});
|
|
24
|
+
it('copies the web-vite template into apps/web', async () => {
|
|
25
|
+
const { cp } = await import('node:fs/promises');
|
|
26
|
+
const { scaffoldVite } = await import('../web-vite.js');
|
|
27
|
+
await scaffoldVite(CONFIG);
|
|
28
|
+
expect(cp).toHaveBeenCalledWith(expect.stringContaining('web-vite'), expect.stringContaining('apps/web'), { recursive: true });
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=web-vite.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-vite.test.js","sourceRoot":"","sources":["../../../../src/create/scaffolders/__tests__/web-vite.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE5D,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;IAC3C,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;IACxC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACtC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACvC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;CAChD,CAAC,CAAC,CAAA;AAEH,MAAM,MAAM,GAAG;IACb,WAAW,EAAE,QAAQ;IACrB,QAAQ,EAAE,MAAe;IACzB,OAAO,EAAE,aAAsB;IAC/B,cAAc,EAAE,MAAe;IAC/B,SAAS,EAAE,aAAa;CACzB,CAAA;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAA;IAEnC,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAA;QAClD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;QAEvD,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QAE1B,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAChC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,EACnC,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAA;QAC/C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;QAEvD,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QAE1B,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAC7B,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,EACnC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,EACnC,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-nestjs-rest.d.ts","sourceRoot":"","sources":["../../../src/create/scaffolders/api-nestjs-rest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,iBAO7D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { copyTemplate } from './utils/copy.js';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const TEMPLATES_DIR = join(__dirname, '..', '..', '..', 'templates');
|
|
7
|
+
export async function scaffoldNestjsRest(config) {
|
|
8
|
+
const appDir = join(config.targetDir, 'apps', 'api');
|
|
9
|
+
await mkdir(appDir, { recursive: true });
|
|
10
|
+
await copyTemplate(join(TEMPLATES_DIR, 'api-nestjs-rest'), appDir, {
|
|
11
|
+
projectName: config.projectName,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=api-nestjs-rest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-nestjs-rest.js","sourceRoot":"","sources":["../../../src/create/scaffolders/api-nestjs-rest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;AAEpE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAqB;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACpD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAExC,MAAM,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE;QACjE,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/create/scaffolders/base.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,iBAOvD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { copyTemplate } from './utils/copy.js';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const TEMPLATES_DIR = join(__dirname, '..', '..', '..', 'templates');
|
|
7
|
+
export async function scaffoldBase(config) {
|
|
8
|
+
await mkdir(join(config.targetDir, 'apps'), { recursive: true });
|
|
9
|
+
await mkdir(join(config.targetDir, 'packages'), { recursive: true });
|
|
10
|
+
await copyTemplate(join(TEMPLATES_DIR, 'base'), config.targetDir, {
|
|
11
|
+
projectName: config.projectName,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/create/scaffolders/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;AAEpE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAqB;IACtD,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChE,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEpE,MAAM,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE;QAChE,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../../src/create/scaffolders/utils/copy.ts"],"names":[],"mappings":"AAmCA,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAI7B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { cp, readFile, readdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const TEXT_EXTENSIONS = new Set([
|
|
4
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
5
|
+
'.json', '.css', '.html', '.md',
|
|
6
|
+
'.yaml', '.yml', '.env',
|
|
7
|
+
'.gitignore', '.prettierrc', '.eslintrc', '.mjs',
|
|
8
|
+
]);
|
|
9
|
+
function isTextFile(name) {
|
|
10
|
+
const dotIndex = name.lastIndexOf('.');
|
|
11
|
+
const ext = dotIndex !== -1 ? name.slice(dotIndex) : name;
|
|
12
|
+
return TEXT_EXTENSIONS.has(ext) || name.startsWith('.');
|
|
13
|
+
}
|
|
14
|
+
async function substituteVars(dir, vars) {
|
|
15
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
16
|
+
await Promise.all(entries.map(async (entry) => {
|
|
17
|
+
const fullPath = join(dir, entry.name);
|
|
18
|
+
if (entry.isDirectory()) {
|
|
19
|
+
await substituteVars(fullPath, vars);
|
|
20
|
+
}
|
|
21
|
+
else if (isTextFile(entry.name)) {
|
|
22
|
+
let content = await readFile(fullPath, 'utf-8');
|
|
23
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
24
|
+
content = content.replaceAll(`{{${key}}}`, value);
|
|
25
|
+
}
|
|
26
|
+
await writeFile(fullPath, content, 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
export async function copyTemplate(src, dest, vars) {
|
|
31
|
+
await cp(src, dest, { recursive: true });
|
|
32
|
+
await substituteVars(dest, vars);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../../src/create/scaffolders/utils/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC5C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;IAC/B,OAAO,EAAE,MAAM,EAAE,MAAM;IACvB,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM;CACjD,CAAC,CAAA;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,GAAG,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACzD,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AACzD,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,IAA4B;IACrE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAE3D,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACtC,CAAC;aAAM,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAA;YACnD,CAAC;YACD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAW,EACX,IAAY,EACZ,IAA4B;IAE5B,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-nextjs.d.ts","sourceRoot":"","sources":["../../../src/create/scaffolders/web-nextjs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,iBAOzD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { copyTemplate } from './utils/copy.js';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const TEMPLATES_DIR = join(__dirname, '..', '..', '..', 'templates');
|
|
7
|
+
export async function scaffoldNextjs(config) {
|
|
8
|
+
const appDir = join(config.targetDir, 'apps', 'web');
|
|
9
|
+
await mkdir(appDir, { recursive: true });
|
|
10
|
+
await copyTemplate(join(TEMPLATES_DIR, 'web-nextjs'), appDir, {
|
|
11
|
+
projectName: config.projectName,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=web-nextjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-nextjs.js","sourceRoot":"","sources":["../../../src/create/scaffolders/web-nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;AAEpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAqB;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACpD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAExC,MAAM,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE;QAC5D,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-vite.d.ts","sourceRoot":"","sources":["../../../src/create/scaffolders/web-vite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,iBAOvD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { copyTemplate } from './utils/copy.js';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const TEMPLATES_DIR = join(__dirname, '..', '..', '..', 'templates');
|
|
7
|
+
export async function scaffoldVite(config) {
|
|
8
|
+
const appDir = join(config.targetDir, 'apps', 'web');
|
|
9
|
+
await mkdir(appDir, { recursive: true });
|
|
10
|
+
await copyTemplate(join(TEMPLATES_DIR, 'web-vite'), appDir, {
|
|
11
|
+
projectName: config.projectName,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=web-vite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-vite.js","sourceRoot":"","sources":["../../../src/create/scaffolders/web-vite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;AAEpE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAqB;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACpD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAExC,MAAM,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE;QAC1D,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type PackageManager = 'pnpm' | 'npm';
|
|
2
|
+
export type Frontend = 'vite' | 'nextjs';
|
|
3
|
+
export type Backend = 'nestjs-rest';
|
|
4
|
+
export interface ProjectConfig {
|
|
5
|
+
projectName: string;
|
|
6
|
+
frontend: Frontend;
|
|
7
|
+
backend: Backend;
|
|
8
|
+
packageManager: PackageManager;
|
|
9
|
+
targetDir: string;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/create/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAA;AAC3C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;AACxC,MAAM,MAAM,OAAO,GAAG,aAAa,CAAA;AAEnC,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/create/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { create } from './create/index.js';
|
|
3
|
+
import { add } from './add/index.js';
|
|
4
|
+
const [, , command, ...args] = process.argv;
|
|
5
|
+
async function main() {
|
|
6
|
+
if (command === 'add') {
|
|
7
|
+
await add(args);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
await create();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
main().catch((err) => {
|
|
14
|
+
console.error(err);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,MAAM,CAAC,EAAE,AAAD,EAAG,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAA;AAE3C,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,CAAC,IAAI,CAAC,CAAA;IACjB,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,EAAE,CAAA;IAChB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
package/eslint/index.js
ADDED
package/package.json
CHANGED
|
@@ -1,20 +1,55 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exanderal/stackcraft",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "Opinionated full-stack project scaffolding CLI
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Opinionated full-stack project scaffolding CLI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"stackcraft": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
"./eslint": "./eslint/index.js",
|
|
11
|
+
"./tsconfig/base": "./tsconfig/base.json",
|
|
12
|
+
"./prettier": "./prettier/index.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"eslint",
|
|
17
|
+
"tsconfig",
|
|
18
|
+
"prettier",
|
|
19
|
+
"templates"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"dev": "tsc --watch",
|
|
24
|
+
"lint": "tsc --noEmit",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@clack/prompts": "^0.9.0",
|
|
30
|
+
"execa": "^9.4.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22.0.0",
|
|
34
|
+
"typescript": "^5.7.0",
|
|
35
|
+
"vitest": "^3.0.0"
|
|
36
|
+
},
|
|
6
37
|
"keywords": [
|
|
7
38
|
"cli",
|
|
8
39
|
"scaffold",
|
|
9
40
|
"nestjs",
|
|
10
41
|
"vite",
|
|
11
42
|
"react",
|
|
12
|
-
"monorepo"
|
|
43
|
+
"monorepo",
|
|
44
|
+
"nx"
|
|
13
45
|
],
|
|
14
46
|
"author": "exanderal",
|
|
15
47
|
"license": "MIT",
|
|
16
48
|
"repository": {
|
|
17
49
|
"type": "git",
|
|
18
50
|
"url": "https://github.com/exanderal/stackcraft"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18"
|
|
19
54
|
}
|
|
20
55
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import eslint from '@eslint/js';
|
|
3
|
+
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
|
|
4
|
+
import globals from 'globals';
|
|
5
|
+
import tseslint from 'typescript-eslint';
|
|
6
|
+
|
|
7
|
+
export default tseslint.config(
|
|
8
|
+
{
|
|
9
|
+
ignores: ['eslint.config.mjs'],
|
|
10
|
+
},
|
|
11
|
+
eslint.configs.recommended,
|
|
12
|
+
...tseslint.configs.recommendedTypeChecked,
|
|
13
|
+
eslintPluginPrettierRecommended,
|
|
14
|
+
{
|
|
15
|
+
languageOptions: {
|
|
16
|
+
globals: {
|
|
17
|
+
...globals.node,
|
|
18
|
+
...globals.jest,
|
|
19
|
+
},
|
|
20
|
+
sourceType: 'commonjs',
|
|
21
|
+
parserOptions: {
|
|
22
|
+
projectService: true,
|
|
23
|
+
tsconfigRootDir: import.meta.dirname,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
rules: {
|
|
29
|
+
'@typescript-eslint/no-explicit-any': 'off',
|
|
30
|
+
'@typescript-eslint/no-floating-promises': 'warn',
|
|
31
|
+
'@typescript-eslint/no-unsafe-argument': 'warn'
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
);
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{projectName}}-api",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "",
|
|
5
|
+
"author": "",
|
|
6
|
+
"private": true,
|
|
7
|
+
"license": "UNLICENSED",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"dev": "nest start --watch",
|
|
10
|
+
"build": "nest build",
|
|
11
|
+
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
12
|
+
"start": "nest start",
|
|
13
|
+
"start:dev": "nest start --watch",
|
|
14
|
+
"start:debug": "nest start --debug --watch",
|
|
15
|
+
"start:prod": "node dist/main",
|
|
16
|
+
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
17
|
+
"test": "jest",
|
|
18
|
+
"test:watch": "jest --watch",
|
|
19
|
+
"test:cov": "jest --coverage",
|
|
20
|
+
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
21
|
+
"test:e2e": "jest --config ./test/jest-e2e.json"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@nestjs/common": "^11.0.1",
|
|
25
|
+
"@nestjs/core": "^11.0.1",
|
|
26
|
+
"@nestjs/platform-express": "^11.0.1",
|
|
27
|
+
"reflect-metadata": "^0.2.2",
|
|
28
|
+
"rxjs": "^7.8.1"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@eslint/eslintrc": "^3.2.0",
|
|
32
|
+
"@eslint/js": "^9.18.0",
|
|
33
|
+
"@nestjs/cli": "^11.0.0",
|
|
34
|
+
"@nestjs/schematics": "^11.0.0",
|
|
35
|
+
"@nestjs/testing": "^11.0.1",
|
|
36
|
+
"@swc/cli": "^0.6.0",
|
|
37
|
+
"@swc/core": "^1.10.7",
|
|
38
|
+
"@types/express": "^5.0.0",
|
|
39
|
+
"@types/jest": "^29.5.14",
|
|
40
|
+
"@types/node": "^22.10.7",
|
|
41
|
+
"@types/supertest": "^6.0.2",
|
|
42
|
+
"eslint": "^9.18.0",
|
|
43
|
+
"eslint-config-prettier": "^10.0.1",
|
|
44
|
+
"eslint-plugin-prettier": "^5.2.2",
|
|
45
|
+
"globals": "^16.0.0",
|
|
46
|
+
"jest": "^29.7.0",
|
|
47
|
+
"prettier": "^3.4.2",
|
|
48
|
+
"source-map-support": "^0.5.21",
|
|
49
|
+
"supertest": "^7.0.0",
|
|
50
|
+
"ts-jest": "^29.2.5",
|
|
51
|
+
"ts-loader": "^9.5.2",
|
|
52
|
+
"ts-node": "^10.9.2",
|
|
53
|
+
"tsconfig-paths": "^4.2.0",
|
|
54
|
+
"typescript": "^5.7.3",
|
|
55
|
+
"typescript-eslint": "^8.20.0"
|
|
56
|
+
},
|
|
57
|
+
"jest": {
|
|
58
|
+
"moduleFileExtensions": [
|
|
59
|
+
"js",
|
|
60
|
+
"json",
|
|
61
|
+
"ts"
|
|
62
|
+
],
|
|
63
|
+
"rootDir": "src",
|
|
64
|
+
"testRegex": ".*\\.spec\\.ts$",
|
|
65
|
+
"transform": {
|
|
66
|
+
"^.+\\.(t|j)s$": "ts-jest"
|
|
67
|
+
},
|
|
68
|
+
"collectCoverageFrom": [
|
|
69
|
+
"**/*.(t|j)s"
|
|
70
|
+
],
|
|
71
|
+
"coverageDirectory": "../coverage",
|
|
72
|
+
"testEnvironment": "node"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "api",
|
|
3
|
+
"targets": {
|
|
4
|
+
"dev": {
|
|
5
|
+
"executor": "nx:run-commands",
|
|
6
|
+
"options": { "command": "pnpm run dev", "cwd": "{projectRoot}" }
|
|
7
|
+
},
|
|
8
|
+
"build": {
|
|
9
|
+
"executor": "nx:run-commands",
|
|
10
|
+
"options": { "command": "pnpm run build", "cwd": "{projectRoot}" }
|
|
11
|
+
},
|
|
12
|
+
"lint": {
|
|
13
|
+
"executor": "nx:run-commands",
|
|
14
|
+
"options": { "command": "pnpm run lint", "cwd": "{projectRoot}" }
|
|
15
|
+
},
|
|
16
|
+
"test": {
|
|
17
|
+
"executor": "nx:run-commands",
|
|
18
|
+
"options": { "command": "pnpm run test", "cwd": "{projectRoot}" }
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|