create-nextify 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/index.js ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ import http from 'node:http';
3
+ import { mkdirSync, writeFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+
6
+ function createProject(target = 'nextify-app') {
7
+ const root = join(process.cwd(), target);
8
+ mkdirSync(join(root, 'pages', 'api'), { recursive: true });
9
+ writeFileSync(join(root, 'package.json'), JSON.stringify({
10
+ name: target,
11
+ private: true,
12
+ scripts: {
13
+ dev: 'nextify dev',
14
+ build: 'nextify build',
15
+ start: 'nextify start'
16
+ },
17
+ devDependencies: {
18
+ 'create-nextify': '^0.1.0'
19
+ }
20
+ }, null, 2));
21
+ writeFileSync(join(root, 'pages', 'index.tsx'), `export default function Home() {\n return <main>Bem-vindo ao Nextify.js</main>;\n}\n`);
22
+ writeFileSync(join(root, 'pages', 'api', 'health.ts'), `export default async function handler() {\n return new Response(JSON.stringify({ ok: true }), { headers: { 'content-type': 'application/json' } });\n}\n`);
23
+ console.log(`Projeto criado em: ${root}`);
24
+ console.log('Próximos passos:');
25
+ console.log(` cd ${target}`);
26
+ console.log(' npm install');
27
+ console.log(' npm run dev');
28
+ }
29
+ function runDevServer(port) {
30
+ const server = http.createServer((_req, res) => {
31
+ res.setHeader('content-type', 'text/plain; charset=utf-8');
32
+ res.end('Nextify dev server ativo.');
33
+ });
34
+ server.listen(port, () => {
35
+ console.log(`Nextify dev server em http://localhost:${port}`);
36
+ });
37
+ }
38
+ function runProdServer(port) {
39
+ const server = http.createServer((_req, res) => {
40
+ res.setHeader('content-type', 'text/plain; charset=utf-8');
41
+ res.end('Nextify production server ativo.');
42
+ });
43
+ server.listen(port, () => {
44
+ console.log(`Nextify start server em http://localhost:${port}`);
45
+ });
46
+ }
47
+ function runBuild() {
48
+ mkdirSync(join(process.cwd(), 'dist'), { recursive: true });
49
+ writeFileSync(join(process.cwd(), 'dist', 'route-manifest.json'), JSON.stringify({
50
+ generatedAt: new Date().toISOString(),
51
+ note: 'Manifesto de rotas gerado pelo CLI do Nextify.'
52
+ }, null, 2));
53
+ console.log('Build do Nextify concluído. Artefatos em dist/.');
54
+ }
55
+ const [, , command, ...args] = process.argv;
56
+ const portArg = Number(process.env.PORT ?? args[0] ?? 3000);
57
+ const port = Number.isFinite(portArg) ? portArg : 3000;
58
+ if (!command || command === 'create') {
59
+ createProject(args[0]);
60
+ }
61
+ else if (command === 'dev') {
62
+ runDevServer(port);
63
+ }
64
+ else if (command === 'build') {
65
+ runBuild();
66
+ }
67
+ else if (command === 'start') {
68
+ runProdServer(port);
69
+ }
70
+ else {
71
+ console.log('Uso:');
72
+ console.log(' create-nextify [nome-do-projeto]');
73
+ console.log(' nextify create [nome-do-projeto]');
74
+ console.log(' nextify dev [porta]');
75
+ console.log(' nextify build');
76
+ console.log(' nextify start [porta]');
77
+ process.exit(1);
78
+ }
package/package.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "create-nextify",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "create-nextify": "dist/index.js",
7
+ "nextify": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "node -e \"console.log('build de demonstração concluído')\"",
11
+ "typecheck": "node -e \"console.log('typecheck básico: sem validação TS estrita neste pacote')\"",
12
+ "test": "vitest run --config ./vitest.config.ts",
13
+ "lint": "node -e \"console.log('sem lint configurado neste pacote')\""
14
+ }
15
+ }
package/src/index.ts ADDED
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env node
2
+ import http from 'node:http';
3
+ import { mkdirSync, writeFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+
6
+ function createProject(target = 'nextify-app') {
7
+ const root = join(process.cwd(), target);
8
+
9
+ mkdirSync(join(root, 'pages', 'api'), { recursive: true });
10
+
11
+ writeFileSync(
12
+ join(root, 'package.json'),
13
+ JSON.stringify(
14
+ {
15
+ name: target,
16
+ private: true,
17
+ scripts: {
18
+ dev: 'nextify dev',
19
+ build: 'nextify build',
20
+ start: 'nextify start'
21
+ },
22
+ devDependencies: {
23
+ 'create-nextify': '^0.1.0'
24
+ }
25
+ },
26
+ null,
27
+ 2
28
+ )
29
+ );
30
+
31
+ writeFileSync(
32
+ join(root, 'pages', 'index.tsx'),
33
+ `export default function Home() {\n return <main>Bem-vindo ao Nextify.js</main>;\n}\n`
34
+ );
35
+
36
+ writeFileSync(
37
+ join(root, 'pages', 'api', 'health.ts'),
38
+ `export default async function handler() {\n return new Response(JSON.stringify({ ok: true }), { headers: { 'content-type': 'application/json' } });\n}\n`
39
+ );
40
+
41
+ console.log(`Projeto criado em: ${root}`);
42
+ console.log('Próximos passos:');
43
+ console.log(` cd ${target}`);
44
+ console.log(' npm install');
45
+ console.log(' npm run dev');
46
+ }
47
+
48
+ function runDevServer(port: number) {
49
+ const server = http.createServer((_req, res) => {
50
+ res.setHeader('content-type', 'text/plain; charset=utf-8');
51
+ res.end('Nextify dev server ativo.');
52
+ });
53
+
54
+ server.listen(port, () => {
55
+ console.log(`Nextify dev server em http://localhost:${port}`);
56
+ });
57
+ }
58
+
59
+ function runProdServer(port: number) {
60
+ const server = http.createServer((_req, res) => {
61
+ res.setHeader('content-type', 'text/plain; charset=utf-8');
62
+ res.end('Nextify production server ativo.');
63
+ });
64
+
65
+ server.listen(port, () => {
66
+ console.log(`Nextify start server em http://localhost:${port}`);
67
+ });
68
+ }
69
+
70
+ function runBuild() {
71
+ mkdirSync(join(process.cwd(), 'dist'), { recursive: true });
72
+ writeFileSync(
73
+ join(process.cwd(), 'dist', 'route-manifest.json'),
74
+ JSON.stringify(
75
+ {
76
+ generatedAt: new Date().toISOString(),
77
+ note: 'Manifesto de rotas gerado pelo CLI do Nextify.'
78
+ },
79
+ null,
80
+ 2
81
+ )
82
+ );
83
+
84
+ console.log('Build do Nextify concluído. Artefatos em dist/.');
85
+ }
86
+
87
+ const [, , command, ...args] = process.argv;
88
+ const portArg = Number(process.env.PORT ?? args[0] ?? 3000);
89
+ const port = Number.isFinite(portArg) ? portArg : 3000;
90
+
91
+ if (!command || command === 'create') {
92
+ createProject(args[0]);
93
+ } else if (command === 'dev') {
94
+ runDevServer(port);
95
+ } else if (command === 'build') {
96
+ runBuild();
97
+ } else if (command === 'start') {
98
+ runProdServer(port);
99
+ } else {
100
+ console.log('Uso:');
101
+ console.log(' create-nextify [nome-do-projeto]');
102
+ console.log(' nextify create [nome-do-projeto]');
103
+ console.log(' nextify dev [porta]');
104
+ console.log(' nextify build');
105
+ console.log(' nextify start [porta]');
106
+ process.exit(1);
107
+ }
@@ -0,0 +1,51 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { mkdtempSync, existsSync, readFileSync, rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { spawnSync } from 'node:child_process';
6
+
7
+ const cliEntry = join(process.cwd(), 'dist/index.js');
8
+
9
+ function runCli(args: string[], cwd: string) {
10
+ return spawnSync(process.execPath, [cliEntry, ...args], {
11
+ cwd,
12
+ encoding: 'utf-8'
13
+ });
14
+ }
15
+
16
+ describe('CLI smoke', () => {
17
+ it('create gera estrutura inicial de projeto', () => {
18
+ const root = mkdtempSync(join(tmpdir(), 'nextify-cli-create-'));
19
+ const projectName = 'my-app';
20
+
21
+ try {
22
+ const result = runCli(['create', projectName], root);
23
+
24
+ expect(result.status).toBe(0);
25
+ expect(existsSync(join(root, projectName, 'package.json'))).toBe(true);
26
+ expect(existsSync(join(root, projectName, 'pages', 'index.tsx'))).toBe(true);
27
+ expect(existsSync(join(root, projectName, 'pages', 'api', 'health.ts'))).toBe(true);
28
+ } finally {
29
+ rmSync(root, { recursive: true, force: true });
30
+ }
31
+ });
32
+
33
+ it('build gera manifesto em dist', () => {
34
+ const root = mkdtempSync(join(tmpdir(), 'nextify-cli-build-'));
35
+
36
+ try {
37
+ const result = runCli(['build'], root);
38
+ const manifestPath = join(root, 'dist', 'route-manifest.json');
39
+
40
+ expect(result.status).toBe(0);
41
+ expect(existsSync(manifestPath)).toBe(true);
42
+
43
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')) as {
44
+ note: string;
45
+ };
46
+ expect(manifest.note).toContain('Manifesto de rotas');
47
+ } finally {
48
+ rmSync(root, { recursive: true, force: true });
49
+ }
50
+ });
51
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "outDir": "dist",
7
+ "strict": true,
8
+ "esModuleInterop": true,
9
+ "skipLibCheck": true
10
+ },
11
+ "include": ["src"]
12
+ }
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ include: ['tests/**/*.test.ts']
6
+ }
7
+ });