Skip to content

Commit 77eed6a

Browse files
committed
AINATIVEM-41 pretify src files
1 parent 2382a9a commit 77eed6a

28 files changed

Lines changed: 642 additions & 616 deletions

.prettierrc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
{
2-
"semi": true,
3-
"singleQuote": true,
4-
"trailingComma": "all",
5-
"printWidth": 100
2+
"printWidth": 120,
3+
"singleQuote": true,
4+
"useTabs": true,
5+
"tabWidth": 4,
6+
"trailingComma": "all",
7+
"quoteProps": "consistent",
8+
"proseWrap": "always"
69
}

package-lock.json

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@
88
},
99
"scripts": {
1010
"build": "tsc",
11+
"format": "prettier --write src",
1112
"lint": "eslint src",
1213
"test": "vitest run",
1314
"typecheck": "tsc --noEmit"
1415
},
1516
"dependencies": {
1617
"@clack/prompts": "^0.9.0",
18+
"dedent": "^1.7.2",
1719
"fs-extra": "^11.2.0",
1820
"prettier": "^3.3.0"
1921
},
2022
"devDependencies": {
2123
"@eslint/js": "^9.0.0",
24+
"@types/dedent": "^0.7.2",
2225
"@types/fs-extra": "^11.0.4",
2326
"@types/node": "^20.0.0",
2427
"eslint": "^9.0.0",

src/cli.ts

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,32 @@ import { promptWebhooks } from './prompts/webhooks.js';
77
import { nodeGenerator } from './generators/node/index.js';
88

99
async function main(): Promise<void> {
10-
clack.intro('create-pipedrive-app');
10+
clack.intro('create-pipedrive-app');
1111

12-
const nameOrPath = await promptProjectName(process.argv[2]);
13-
const database = await promptDatabase();
14-
const appExtensions = await promptAppExtensions();
15-
const webhooks = await promptWebhooks();
12+
const nameOrPath = await promptProjectName(process.argv[2]);
13+
const database = await promptDatabase();
14+
const appExtensions = await promptAppExtensions();
15+
const webhooks = await promptWebhooks();
1616

17-
const outputDir = resolve(process.cwd(), nameOrPath);
18-
const projectName = basename(outputDir);
17+
const outputDir = resolve(process.cwd(), nameOrPath);
18+
const projectName = basename(outputDir);
1919

20-
try {
21-
await nodeGenerator.generate(outputDir, { projectName, database, appExtensions, webhooks });
22-
} catch (error) {
23-
clack.log.error(
24-
`Generation failed: ${error instanceof Error ? error.message : String(error)}`,
25-
);
26-
process.exit(1);
27-
}
20+
try {
21+
await nodeGenerator.generate(outputDir, { projectName, database, appExtensions, webhooks });
22+
} catch (error) {
23+
clack.log.error(`Generation failed: ${error instanceof Error ? error.message : String(error)}`);
24+
process.exit(1);
25+
}
2826

29-
clack.outro(`✓ Created ${projectName}`);
27+
clack.outro(`✓ Created ${projectName}`);
3028

31-
const needsDocker = database === 'postgres' || database === 'mysql';
32-
console.log('\nNext steps:');
33-
console.log(` cd ${nameOrPath}`);
34-
console.log(' cp .env.example .env');
35-
if (needsDocker) console.log(' docker-compose up -d');
36-
console.log(' npm install');
37-
console.log(' npm run dev');
29+
const needsDocker = database === 'postgres' || database === 'mysql';
30+
console.log('\nNext steps:');
31+
console.log(` cd ${nameOrPath}`);
32+
console.log(' cp .env.example .env');
33+
if (needsDocker) console.log(' docker-compose up -d');
34+
console.log(' npm install');
35+
console.log(' npm run dev');
3836
}
3937

4038
main();

src/generators/interface.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ export type Database = 'postgres' | 'mysql' | 'sqlite';
22
export type AppExtensionType = 'custom-panel' | 'custom-modal';
33

44
export interface GeneratorOptions {
5-
projectName: string;
6-
database: Database;
7-
webhooks: boolean;
8-
appExtensions: AppExtensionType[];
5+
projectName: string;
6+
database: Database;
7+
webhooks: boolean;
8+
appExtensions: AppExtensionType[];
99
}
1010

1111
export interface Generator {
12-
generate(outputDir: string, options: GeneratorOptions): Promise<void>;
12+
generate(outputDir: string, options: GeneratorOptions): Promise<void>;
1313
}

src/generators/node/app.test.ts

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,78 +7,78 @@ import type { GeneratorOptions } from '../interface.js';
77
const tmpDir = join(tmpdir(), 'cpa-app-test');
88

99
afterEach(async () => {
10-
await remove(tmpDir);
10+
await remove(tmpDir);
1111
});
1212

1313
async function getAppContent(options: GeneratorOptions): Promise<string> {
14-
const { generateApp } = await import('./app.js');
15-
await generateApp(tmpDir, options);
16-
return readFile(join(tmpDir, 'src/app.ts'), 'utf-8');
14+
const { generateApp } = await import('./app.js');
15+
await generateApp(tmpDir, options);
16+
return readFile(join(tmpDir, 'src/app.ts'), 'utf-8');
1717
}
1818

1919
describe('generateApp', () => {
20-
it('always imports express and oauthRouter', async () => {
21-
const content = await getAppContent({
22-
projectName: 'test-app',
23-
database: 'postgres',
24-
webhooks: false,
25-
appExtensions: [],
26-
});
27-
expect(content).toContain("from 'express'");
28-
expect(content).toContain("from './oauth/index.js'");
29-
expect(content).toContain("app.use('/oauth'");
30-
});
20+
it('always imports express and oauthRouter', async () => {
21+
const content = await getAppContent({
22+
projectName: 'test-app',
23+
database: 'postgres',
24+
webhooks: false,
25+
appExtensions: [],
26+
});
27+
expect(content).toContain("from 'express'");
28+
expect(content).toContain("from './oauth/index.js'");
29+
expect(content).toContain("app.use('/oauth'");
30+
});
3131

32-
it('includes webhooks import and mount when webhooks is true', async () => {
33-
const content = await getAppContent({
34-
projectName: 'test-app',
35-
database: 'postgres',
36-
webhooks: true,
37-
appExtensions: [],
38-
});
39-
expect(content).toContain("from './webhooks/index.js'");
40-
expect(content).toContain("app.use('/webhooks'");
41-
});
32+
it('includes webhooks import and mount when webhooks is true', async () => {
33+
const content = await getAppContent({
34+
projectName: 'test-app',
35+
database: 'postgres',
36+
webhooks: true,
37+
appExtensions: [],
38+
});
39+
expect(content).toContain("from './webhooks/index.js'");
40+
expect(content).toContain("app.use('/webhooks'");
41+
});
4242

43-
it('excludes webhooks when webhooks is false', async () => {
44-
const content = await getAppContent({
45-
projectName: 'test-app',
46-
database: 'postgres',
47-
webhooks: false,
48-
appExtensions: [],
49-
});
50-
expect(content).not.toContain('./webhooks/index.js');
51-
});
43+
it('excludes webhooks when webhooks is false', async () => {
44+
const content = await getAppContent({
45+
projectName: 'test-app',
46+
database: 'postgres',
47+
webhooks: false,
48+
appExtensions: [],
49+
});
50+
expect(content).not.toContain('./webhooks/index.js');
51+
});
5252

53-
it('includes panel import and mount when custom-panel is selected', async () => {
54-
const content = await getAppContent({
55-
projectName: 'test-app',
56-
database: 'postgres',
57-
webhooks: false,
58-
appExtensions: ['custom-panel'],
59-
});
60-
expect(content).toContain("from './app-extensions/panel/index.js'");
61-
expect(content).toContain("app.use('/extensions/panel'");
62-
});
53+
it('includes panel import and mount when custom-panel is selected', async () => {
54+
const content = await getAppContent({
55+
projectName: 'test-app',
56+
database: 'postgres',
57+
webhooks: false,
58+
appExtensions: ['custom-panel'],
59+
});
60+
expect(content).toContain("from './app-extensions/panel/index.js'");
61+
expect(content).toContain("app.use('/extensions/panel'");
62+
});
6363

64-
it('includes modal import and mount when custom-modal is selected', async () => {
65-
const content = await getAppContent({
66-
projectName: 'test-app',
67-
database: 'postgres',
68-
webhooks: false,
69-
appExtensions: ['custom-modal'],
70-
});
71-
expect(content).toContain("from './app-extensions/modal/index.js'");
72-
expect(content).toContain("app.use('/extensions/modal'");
73-
});
64+
it('includes modal import and mount when custom-modal is selected', async () => {
65+
const content = await getAppContent({
66+
projectName: 'test-app',
67+
database: 'postgres',
68+
webhooks: false,
69+
appExtensions: ['custom-modal'],
70+
});
71+
expect(content).toContain("from './app-extensions/modal/index.js'");
72+
expect(content).toContain("app.use('/extensions/modal'");
73+
});
7474

75-
it('excludes extension imports when appExtensions is empty', async () => {
76-
const content = await getAppContent({
77-
projectName: 'test-app',
78-
database: 'sqlite',
79-
webhooks: false,
80-
appExtensions: [],
81-
});
82-
expect(content).not.toContain('./app-extensions');
83-
});
75+
it('excludes extension imports when appExtensions is empty', async () => {
76+
const content = await getAppContent({
77+
projectName: 'test-app',
78+
database: 'sqlite',
79+
webhooks: false,
80+
appExtensions: [],
81+
});
82+
expect(content).not.toContain('./app-extensions');
83+
});
8484
});

src/generators/node/app.ts

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,41 @@
1+
import dedent from 'dedent';
12
import { join } from 'path';
23
import { writeFile } from '../../utils/writeFile.js';
34
import type { GeneratorOptions } from '../interface.js';
45

56
export async function generateApp(outputDir: string, options: GeneratorOptions): Promise<void> {
6-
const webhooksImport = options.webhooks
7-
? `import webhooksRouter from './webhooks/index.js';`
8-
: '';
9-
const panelImport = options.appExtensions.includes('custom-panel')
10-
? `import panelRouter from './app-extensions/panel/index.js';`
11-
: '';
12-
const modalImport = options.appExtensions.includes('custom-modal')
13-
? `import modalRouter from './app-extensions/modal/index.js';`
14-
: '';
7+
const webhooksImport = options.webhooks ? `import webhooksRouter from './webhooks/index.js';` : '';
8+
const panelImport = options.appExtensions.includes('custom-panel')
9+
? `import panelRouter from './app-extensions/panel/index.js';`
10+
: '';
11+
const modalImport = options.appExtensions.includes('custom-modal')
12+
? `import modalRouter from './app-extensions/modal/index.js';`
13+
: '';
1514

16-
const webhooksMount = options.webhooks ? `app.use('/webhooks', webhooksRouter);` : '';
17-
const panelMount = options.appExtensions.includes('custom-panel')
18-
? `app.use('/extensions/panel', panelRouter);`
19-
: '';
20-
const modalMount = options.appExtensions.includes('custom-modal')
21-
? `app.use('/extensions/modal', modalRouter);`
22-
: '';
15+
const webhooksMount = options.webhooks ? `app.use('/webhooks', webhooksRouter);` : '';
16+
const panelMount = options.appExtensions.includes('custom-panel')
17+
? `app.use('/extensions/panel', panelRouter);`
18+
: '';
19+
const modalMount = options.appExtensions.includes('custom-modal')
20+
? `app.use('/extensions/modal', modalRouter);`
21+
: '';
2322

24-
const content = `import express from 'express';
25-
import oauthRouter from './oauth/index.js';
26-
${webhooksImport}
27-
${panelImport}
28-
${modalImport}
23+
const content = dedent`
24+
import express from 'express';
25+
import oauthRouter from './oauth/index.js';
26+
${webhooksImport}
27+
${panelImport}
28+
${modalImport}
2929
30-
const app = express();
30+
const app = express();
3131
32-
app.use('/oauth', oauthRouter);
33-
${webhooksMount}
34-
${panelMount}
35-
${modalMount}
32+
app.use('/oauth', oauthRouter);
33+
${webhooksMount}
34+
${panelMount}
35+
${modalMount}
3636
37-
export default app;
38-
`;
37+
export default app;
38+
`;
3939

40-
await writeFile(join(outputDir, 'src/app.ts'), content);
40+
await writeFile(join(outputDir, 'src/app.ts'), content);
4141
}

0 commit comments

Comments
 (0)