rapidkit 1.0.0-beta.4 → 1.0.0-beta.6

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 CHANGED
@@ -5,22 +5,69 @@ import { createProject } from './create.js';
5
5
  import { generateDemoKit } from './demo-kit.js';
6
6
  import inquirer from 'inquirer';
7
7
  import path from 'path';
8
+ import { logger } from './logger.js';
9
+ import { checkForUpdates, getVersion } from './update-checker.js';
10
+ import { loadUserConfig } from './config.js';
11
+ import { validateProjectName } from './validation.js';
12
+ import { RapidKitError } from './errors.js';
13
+ import * as fsExtra from 'fs-extra';
14
+ let currentProjectPath = null;
15
+ let cleanupInProgress = false;
8
16
  const program = new Command();
9
17
  program
10
18
  .name('create-rapidkit')
11
19
  .description('Create a RapidKit development environment or workspace')
12
- .version('1.0.0-beta.4')
20
+ .version(getVersion())
13
21
  .argument('[directory-name]', 'Name of the workspace or project directory')
14
22
  .option('--skip-git', 'Skip git initialization')
15
- .option('--test-mode', 'Install RapidKit from local path (for testing only)')
23
+ .option('--test-mode', 'Install RapidKit from local path (for development/testing only)')
16
24
  .option('--demo', 'Create workspace with demo kit templates (no Python installation required)')
17
25
  .option('--demo-only', 'Generate a demo project in current directory (used by demo workspace)')
26
+ .option('--debug', 'Enable debug logging')
27
+ .option('--dry-run', 'Show what would be created without creating it')
28
+ .option('--no-update-check', 'Skip checking for updates')
18
29
  .action(async (directoryName, options) => {
19
30
  try {
31
+ if (options.debug) {
32
+ logger.setDebug(true);
33
+ logger.debug('Debug mode enabled');
34
+ }
35
+ const userConfig = await loadUserConfig();
36
+ logger.debug('User config loaded', userConfig);
37
+ if (options.updateCheck !== false) {
38
+ await checkForUpdates();
39
+ }
20
40
  console.log(chalk.blue.bold('\nšŸš€ Welcome to create-rapidkit!\n'));
21
41
  if (options.demoOnly) {
22
42
  const projectName = directoryName || 'my-fastapi-project';
43
+ try {
44
+ validateProjectName(projectName);
45
+ }
46
+ catch (error) {
47
+ if (error instanceof RapidKitError) {
48
+ logger.error(`\nāŒ ${error.message}`);
49
+ if (error.details) {
50
+ logger.warn(`šŸ’” ${error.details}\n`);
51
+ }
52
+ process.exit(1);
53
+ }
54
+ throw error;
55
+ }
23
56
  const projectPath = path.resolve(process.cwd(), projectName);
57
+ currentProjectPath = projectPath;
58
+ if (options.dryRun) {
59
+ console.log(chalk.cyan('\nšŸ” Dry-run mode - showing what would be created:\n'));
60
+ console.log(chalk.white('šŸ“‚ Project path:'), projectPath);
61
+ console.log(chalk.white('šŸ“¦ Project type:'), 'FastAPI demo project');
62
+ console.log(chalk.white('šŸ“ Files to create:'));
63
+ console.log(chalk.gray(' - src/main.py'));
64
+ console.log(chalk.gray(' - src/cli.py'));
65
+ console.log(chalk.gray(' - src/routing/'));
66
+ console.log(chalk.gray(' - tests/'));
67
+ console.log(chalk.gray(' - pyproject.toml'));
68
+ console.log(chalk.gray(' - README.md\n'));
69
+ return;
70
+ }
24
71
  const answers = await inquirer.prompt([
25
72
  {
26
73
  type: 'input',
@@ -51,12 +98,28 @@ program
51
98
  return;
52
99
  }
53
100
  const workspaceName = directoryName || 'rapidkit-workspace';
101
+ try {
102
+ validateProjectName(workspaceName);
103
+ }
104
+ catch (error) {
105
+ if (error instanceof RapidKitError) {
106
+ logger.error(`\nāŒ ${error.message}`);
107
+ if (error.details) {
108
+ logger.warn(`šŸ’” ${error.details}\n`);
109
+ }
110
+ process.exit(1);
111
+ }
112
+ throw error;
113
+ }
114
+ currentProjectPath = path.resolve(process.cwd(), workspaceName);
54
115
  if (options.demo) {
55
116
  console.log(chalk.gray('This will create a workspace with demo kit templates.\nYou can generate demo projects inside without installing Python RapidKit.\n'));
56
117
  await createProject(workspaceName, {
57
- skipGit: options.skipGit,
118
+ skipGit: options.skipGit || userConfig.skipGit,
58
119
  testMode: false,
59
120
  demoMode: true,
121
+ dryRun: options.dryRun,
122
+ userConfig,
60
123
  });
61
124
  return;
62
125
  }
@@ -74,15 +137,62 @@ program
74
137
  }
75
138
  console.log(chalk.yellow('āš ļø Running in TEST MODE - Installing from local path\n'));
76
139
  await createProject(workspaceName, {
77
- skipGit: options.skipGit,
140
+ skipGit: options.skipGit || userConfig.skipGit,
78
141
  testMode: options.testMode,
79
142
  demoMode: false,
143
+ dryRun: options.dryRun,
144
+ userConfig,
80
145
  });
81
146
  }
82
147
  catch (error) {
83
- console.error(chalk.red('\nāŒ Failed to create RapidKit environment:'), error);
148
+ if (error instanceof RapidKitError) {
149
+ logger.error(`\nāŒ ${error.message}`);
150
+ if (error.details) {
151
+ logger.warn(`šŸ’” ${error.details}`);
152
+ }
153
+ logger.debug('Error code:', error.code);
154
+ }
155
+ else {
156
+ logger.error('\nāŒ An unexpected error occurred:');
157
+ console.error(error);
158
+ }
84
159
  process.exit(1);
85
160
  }
161
+ finally {
162
+ currentProjectPath = null;
163
+ }
164
+ });
165
+ process.on('SIGINT', async () => {
166
+ if (cleanupInProgress)
167
+ return;
168
+ cleanupInProgress = true;
169
+ console.log(chalk.yellow('\n\nāš ļø Interrupted by user'));
170
+ if (currentProjectPath && (await fsExtra.pathExists(currentProjectPath))) {
171
+ console.log(chalk.gray('Cleaning up partial installation...'));
172
+ try {
173
+ await fsExtra.remove(currentProjectPath);
174
+ console.log(chalk.green('āœ“ Cleanup complete'));
175
+ }
176
+ catch (error) {
177
+ logger.debug('Cleanup failed:', error);
178
+ }
179
+ }
180
+ process.exit(130);
181
+ });
182
+ process.on('SIGTERM', async () => {
183
+ if (cleanupInProgress)
184
+ return;
185
+ cleanupInProgress = true;
186
+ logger.debug('Received SIGTERM');
187
+ if (currentProjectPath && (await fsExtra.pathExists(currentProjectPath))) {
188
+ try {
189
+ await fsExtra.remove(currentProjectPath);
190
+ }
191
+ catch (error) {
192
+ logger.debug('Cleanup failed:', error);
193
+ }
194
+ }
195
+ process.exit(143);
86
196
  });
87
197
  program.parse();
88
198
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ declare class Logger {
2
+ private debugEnabled;
3
+ setDebug(enabled: boolean): void;
4
+ debug(message: string, ...args: unknown[]): void;
5
+ info(message: string, ...args: unknown[]): void;
6
+ success(message: string, ...args: unknown[]): void;
7
+ warn(message: string, ...args: unknown[]): void;
8
+ error(message: string, ...args: unknown[]): void;
9
+ step(stepNum: number, total: number, message: string): void;
10
+ }
11
+ export declare const logger: Logger;
12
+ export {};
13
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAKA,cAAM,MAAM;IACV,OAAO,CAAC,YAAY,CAAS;IAE7B,QAAQ,CAAC,OAAO,EAAE,OAAO;IAIzB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAMzC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAIxC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAIxC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAIzC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAGrD;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,29 @@
1
+ import chalk from 'chalk';
2
+ class Logger {
3
+ debugEnabled = false;
4
+ setDebug(enabled) {
5
+ this.debugEnabled = enabled;
6
+ }
7
+ debug(message, ...args) {
8
+ if (this.debugEnabled) {
9
+ console.log(chalk.gray(`[DEBUG] ${message}`), ...args);
10
+ }
11
+ }
12
+ info(message, ...args) {
13
+ console.log(chalk.blue(message), ...args);
14
+ }
15
+ success(message, ...args) {
16
+ console.log(chalk.green(message), ...args);
17
+ }
18
+ warn(message, ...args) {
19
+ console.log(chalk.yellow(message), ...args);
20
+ }
21
+ error(message, ...args) {
22
+ console.error(chalk.red(message), ...args);
23
+ }
24
+ step(stepNum, total, message) {
25
+ console.log(chalk.cyan(`\n[${stepNum}/${total}]`), chalk.white(message));
26
+ }
27
+ }
28
+ export const logger = new Logger();
29
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,MAAM;IACF,YAAY,GAAG,KAAK,CAAC;IAE7B,QAAQ,CAAC,OAAgB;QACvB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,GAAG,IAAe;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,KAAa,EAAE,OAAe;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function checkForUpdates(): Promise<void>;
2
+ export declare function getVersion(): string;
3
+ //# sourceMappingURL=update-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"AAUA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBrD;AAKD,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
@@ -0,0 +1,28 @@
1
+ import { execa } from 'execa';
2
+ import chalk from 'chalk';
3
+ import { logger } from './logger.js';
4
+ const PACKAGE_NAME = 'rapidkit';
5
+ const CURRENT_VERSION = '1.0.0-beta.6';
6
+ export async function checkForUpdates() {
7
+ try {
8
+ logger.debug('Checking for updates...');
9
+ const { stdout } = await execa('npm', ['view', PACKAGE_NAME, 'version'], {
10
+ timeout: 3000,
11
+ });
12
+ const latestVersion = stdout.trim();
13
+ if (latestVersion && latestVersion !== CURRENT_VERSION) {
14
+ console.log(chalk.yellow(`\nāš ļø Update available: ${CURRENT_VERSION} → ${latestVersion}`));
15
+ console.log(chalk.cyan('Run: npm install -g rapidkit@latest\n'));
16
+ }
17
+ else {
18
+ logger.debug('You are using the latest version');
19
+ }
20
+ }
21
+ catch (_error) {
22
+ logger.debug('Could not check for updates');
23
+ }
24
+ }
25
+ export function getVersion() {
26
+ return CURRENT_VERSION;
27
+ }
28
+ //# sourceMappingURL=update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,MAAM,eAAe,GAAG,cAAc,CAAC;AAKvC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAExC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE;YACvE,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAEpC,IAAI,aAAa,IAAI,aAAa,KAAK,eAAe,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,eAAe,MAAM,aAAa,EAAE,CAAC,CAAC,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAEhB,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,UAAU;IACxB,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare class Cache {
2
+ private static instance;
3
+ private memoryCache;
4
+ private constructor();
5
+ static getInstance(): Cache;
6
+ private getCacheKey;
7
+ private getCachePath;
8
+ get<T>(key: string, version?: string): Promise<T | null>;
9
+ set<T>(key: string, data: T, version?: string): Promise<void>;
10
+ invalidate(key: string): Promise<void>;
11
+ clear(): Promise<void>;
12
+ }
13
+ export declare function getCachedOrFetch<T>(key: string, fetcher: () => Promise<T>, version?: string): Promise<T>;
14
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAgBA,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAA0C;IAE7D,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,KAAK;IAO3B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAId,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAgC/D,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B;AAKD,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,CAAC,CAAC,CAWZ"}
@@ -0,0 +1,96 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { createHash } from 'crypto';
5
+ import { logger } from '../logger.js';
6
+ const CACHE_DIR = path.join(os.homedir(), '.rapidkit', 'cache');
7
+ const CACHE_TTL = 24 * 60 * 60 * 1000;
8
+ export class Cache {
9
+ static instance;
10
+ memoryCache = new Map();
11
+ constructor() { }
12
+ static getInstance() {
13
+ if (!Cache.instance) {
14
+ Cache.instance = new Cache();
15
+ }
16
+ return Cache.instance;
17
+ }
18
+ getCacheKey(key) {
19
+ return createHash('md5').update(key).digest('hex');
20
+ }
21
+ getCachePath(key) {
22
+ return path.join(CACHE_DIR, `${this.getCacheKey(key)}.json`);
23
+ }
24
+ async get(key, version = '1.0') {
25
+ const memEntry = this.memoryCache.get(key);
26
+ if (memEntry && memEntry.version === version) {
27
+ if (Date.now() - memEntry.timestamp < CACHE_TTL) {
28
+ logger.debug(`Cache hit (memory): ${key}`);
29
+ return memEntry.data;
30
+ }
31
+ }
32
+ try {
33
+ const cachePath = this.getCachePath(key);
34
+ const content = await fs.readFile(cachePath, 'utf-8');
35
+ const entry = JSON.parse(content);
36
+ if (entry.version === version && Date.now() - entry.timestamp < CACHE_TTL) {
37
+ logger.debug(`Cache hit (disk): ${key}`);
38
+ this.memoryCache.set(key, entry);
39
+ return entry.data;
40
+ }
41
+ await fs.unlink(cachePath).catch(() => { });
42
+ }
43
+ catch (_error) {
44
+ logger.debug(`Cache miss: ${key}`);
45
+ }
46
+ return null;
47
+ }
48
+ async set(key, data, version = '1.0') {
49
+ const entry = {
50
+ data,
51
+ timestamp: Date.now(),
52
+ version,
53
+ };
54
+ this.memoryCache.set(key, entry);
55
+ try {
56
+ await fs.mkdir(CACHE_DIR, { recursive: true });
57
+ const cachePath = this.getCachePath(key);
58
+ await fs.writeFile(cachePath, JSON.stringify(entry), 'utf-8');
59
+ logger.debug(`Cache set: ${key}`);
60
+ }
61
+ catch (_error) {
62
+ logger.debug(`Cache write failed: ${key}`, _error);
63
+ }
64
+ }
65
+ async invalidate(key) {
66
+ this.memoryCache.delete(key);
67
+ try {
68
+ const cachePath = this.getCachePath(key);
69
+ await fs.unlink(cachePath);
70
+ logger.debug(`Cache invalidated: ${key}`);
71
+ }
72
+ catch {
73
+ }
74
+ }
75
+ async clear() {
76
+ this.memoryCache.clear();
77
+ try {
78
+ const files = await fs.readdir(CACHE_DIR);
79
+ await Promise.all(files.map((file) => fs.unlink(path.join(CACHE_DIR, file))));
80
+ logger.debug('Cache cleared');
81
+ }
82
+ catch {
83
+ }
84
+ }
85
+ }
86
+ export async function getCachedOrFetch(key, fetcher, version = '1.0') {
87
+ const cache = Cache.getInstance();
88
+ const cached = await cache.get(key, version);
89
+ if (cached !== null) {
90
+ return cached;
91
+ }
92
+ const data = await fetcher();
93
+ await cache.set(key, data, version);
94
+ return data;
95
+ }
96
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAChE,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAQtC,MAAM,OAAO,KAAK;IACR,MAAM,CAAC,QAAQ,CAAQ;IACvB,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;IAE7D,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,KAAK,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,UAAkB,KAAK;QAE/C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;gBAC3C,OAAO,QAAQ,CAAC,IAAgB,CAAC;YACnC,CAAC;QACH,CAAC;QAGD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,KAAK,GAAkB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEjD,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;gBAC1E,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;gBAEzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACjC,OAAO,KAAK,CAAC,IAAI,CAAC;YACpB,CAAC;YAGD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,IAAO,EAAE,UAAkB,KAAK;QACxD,MAAM,KAAK,GAAkB;YAC3B,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO;SACR,CAAC;QAGF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAGjC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9E,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACH,CAAC;CACF;AAKD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,OAAyB,EACzB,UAAkB,KAAK;IAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAI,GAAG,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ interface PerformanceMetric {
2
+ name: string;
3
+ duration: number;
4
+ timestamp: number;
5
+ }
6
+ export declare class PerformanceMonitor {
7
+ private static instance;
8
+ private metrics;
9
+ private timers;
10
+ private constructor();
11
+ static getInstance(): PerformanceMonitor;
12
+ start(name: string): void;
13
+ end(name: string): number;
14
+ getMetrics(): PerformanceMetric[];
15
+ clear(): void;
16
+ summary(): void;
17
+ }
18
+ export declare function measurePerformance(target: object, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor;
19
+ export declare function measure<T>(name: string, fn: () => Promise<T>): Promise<T>;
20
+ export {};
21
+ //# sourceMappingURL=performance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../src/utils/performance.ts"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAA6B;IAE3C,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAoBzB,UAAU,IAAI,iBAAiB,EAAE;IAIjC,KAAK,IAAI,IAAI;IAKb,OAAO,IAAI,IAAI;CAkBhB;AAKD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,kBAAkB,sBAiB/B;AAKD,wBAAsB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAQ/E"}
@@ -0,0 +1,81 @@
1
+ import { performance } from 'perf_hooks';
2
+ import { logger } from '../logger.js';
3
+ export class PerformanceMonitor {
4
+ static instance;
5
+ metrics = [];
6
+ timers = new Map();
7
+ constructor() { }
8
+ static getInstance() {
9
+ if (!PerformanceMonitor.instance) {
10
+ PerformanceMonitor.instance = new PerformanceMonitor();
11
+ }
12
+ return PerformanceMonitor.instance;
13
+ }
14
+ start(name) {
15
+ this.timers.set(name, performance.now());
16
+ logger.debug(`Performance timer started: ${name}`);
17
+ }
18
+ end(name) {
19
+ const startTime = this.timers.get(name);
20
+ if (!startTime) {
21
+ logger.warn(`Performance timer not found: ${name}`);
22
+ return 0;
23
+ }
24
+ const duration = performance.now() - startTime;
25
+ this.timers.delete(name);
26
+ this.metrics.push({
27
+ name,
28
+ duration,
29
+ timestamp: Date.now(),
30
+ });
31
+ logger.debug(`Performance timer ended: ${name} (${duration.toFixed(2)}ms)`);
32
+ return duration;
33
+ }
34
+ getMetrics() {
35
+ return [...this.metrics];
36
+ }
37
+ clear() {
38
+ this.metrics = [];
39
+ this.timers.clear();
40
+ }
41
+ summary() {
42
+ if (this.metrics.length === 0) {
43
+ return;
44
+ }
45
+ console.log('\nšŸ“Š Performance Summary:');
46
+ const sorted = [...this.metrics].sort((a, b) => b.duration - a.duration);
47
+ sorted.forEach((metric, index) => {
48
+ if (index < 10) {
49
+ console.log(` ${metric.name}: ${metric.duration.toFixed(2)}ms`);
50
+ }
51
+ });
52
+ const total = this.metrics.reduce((sum, m) => sum + m.duration, 0);
53
+ console.log(` Total: ${total.toFixed(2)}ms\n`);
54
+ }
55
+ }
56
+ export function measurePerformance(target, propertyKey, descriptor) {
57
+ const originalMethod = descriptor.value;
58
+ descriptor.value = async function (...args) {
59
+ const monitor = PerformanceMonitor.getInstance();
60
+ const timerName = `${target.constructor.name}.${propertyKey}`;
61
+ monitor.start(timerName);
62
+ try {
63
+ return await originalMethod.apply(this, args);
64
+ }
65
+ finally {
66
+ monitor.end(timerName);
67
+ }
68
+ };
69
+ return descriptor;
70
+ }
71
+ export async function measure(name, fn) {
72
+ const monitor = PerformanceMonitor.getInstance();
73
+ monitor.start(name);
74
+ try {
75
+ return await fn();
76
+ }
77
+ finally {
78
+ monitor.end(name);
79
+ }
80
+ }
81
+ //# sourceMappingURL=performance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.js","sourceRoot":"","sources":["../../src/utils/performance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function validateProjectName(name: string): boolean;
2
+ export declare function toSnakeCase(name: string): string;
3
+ export declare function toKebabCase(name: string): string;
4
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAsDzD;AAKD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAKD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -0,0 +1,46 @@
1
+ import validateNpmPackageName from 'validate-npm-package-name';
2
+ import { InvalidProjectNameError } from './errors.js';
3
+ export function validateProjectName(name) {
4
+ const npmCheck = validateNpmPackageName(name);
5
+ if (!npmCheck.validForNewPackages) {
6
+ const errors = npmCheck.errors || [];
7
+ const warnings = npmCheck.warnings || [];
8
+ const issues = [...errors, ...warnings];
9
+ throw new InvalidProjectNameError(name, `NPM validation failed: ${issues.join(', ')}`);
10
+ }
11
+ if (!/^[a-z][a-z0-9_-]*$/.test(name)) {
12
+ throw new InvalidProjectNameError(name, 'Must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores');
13
+ }
14
+ const reservedNames = [
15
+ 'test',
16
+ 'tests',
17
+ 'src',
18
+ 'dist',
19
+ 'build',
20
+ 'lib',
21
+ 'python',
22
+ 'pip',
23
+ 'poetry',
24
+ 'node',
25
+ 'npm',
26
+ 'rapidkit',
27
+ 'create-rapidkit',
28
+ ];
29
+ if (reservedNames.includes(name.toLowerCase())) {
30
+ throw new InvalidProjectNameError(name, `"${name}" is a reserved name. Please choose a different name.`);
31
+ }
32
+ if (name.length < 2) {
33
+ throw new InvalidProjectNameError(name, 'Name must be at least 2 characters long');
34
+ }
35
+ if (name.length > 214) {
36
+ throw new InvalidProjectNameError(name, 'Name must be less than 214 characters');
37
+ }
38
+ return true;
39
+ }
40
+ export function toSnakeCase(name) {
41
+ return name.replace(/-/g, '_');
42
+ }
43
+ export function toKebabCase(name) {
44
+ return name.replace(/_/g, '-');
45
+ }
46
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAKtD,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAE9C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;QACxC,MAAM,IAAI,uBAAuB,CAAC,IAAI,EAAE,0BAA0B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAID,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,uBAAuB,CAC/B,IAAI,EACJ,0GAA0G,CAC3G,CAAC;IACJ,CAAC;IAGD,MAAM,aAAa,GAAG;QACpB,MAAM;QACN,OAAO;QACP,KAAK;QACL,MAAM;QACN,OAAO;QACP,KAAK;QACL,QAAQ;QACR,KAAK;QACL,QAAQ;QACR,MAAM;QACN,KAAK;QACL,UAAU;QACV,iBAAiB;KAClB,CAAC;IAEF,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,uBAAuB,CAC/B,IAAI,EACJ,IAAI,IAAI,uDAAuD,CAChE,CAAC;IACJ,CAAC;IAGD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,uBAAuB,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,uBAAuB,CAAC,IAAI,EAAE,uCAAuC,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAKD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAKD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rapidkit",
3
- "version": "1.0.0-beta.4",
3
+ "version": "1.0.0-beta.6",
4
4
  "type": "module",
5
5
  "description": "Create RapidKit projects with a single command - The official CLI for RapidKit framework",
6
6
  "keywords": [
@@ -30,8 +30,16 @@
30
30
  "scripts": {
31
31
  "build": "tsc",
32
32
  "dev": "tsc --watch",
33
- "prepare": "npm run build",
34
- "test": "echo \"No tests yet\" && exit 0"
33
+ "prepare": "husky",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "test:coverage": "vitest run --coverage",
37
+ "lint": "eslint src --ext .ts",
38
+ "lint:fix": "eslint src --ext .ts --fix",
39
+ "format": "prettier --write \"src/**/*.ts\"",
40
+ "format:check": "prettier --check \"src/**/*.ts\"",
41
+ "typecheck": "tsc --noEmit",
42
+ "validate": "npm run typecheck && npm run lint && npm run format:check && npm test"
35
43
  },
36
44
  "dependencies": {
37
45
  "chalk": "^5.3.0",
@@ -49,9 +57,24 @@
49
57
  "@types/node": "^20.14.0",
50
58
  "@types/nunjucks": "^3.2.6",
51
59
  "@types/validate-npm-package-name": "^4.0.2",
52
- "typescript": "^5.5.0"
60
+ "@typescript-eslint/eslint-plugin": "^8.46.2",
61
+ "@typescript-eslint/parser": "^8.46.2",
62
+ "@vitest/coverage-v8": "^2.0.0",
63
+ "@vitest/ui": "^2.0.0",
64
+ "eslint": "^8.57.1",
65
+ "husky": "^9.1.7",
66
+ "lint-staged": "^15.5.2",
67
+ "prettier": "^3.6.2",
68
+ "typescript": "^5.5.0",
69
+ "vitest": "^2.0.0"
53
70
  },
54
71
  "engines": {
55
72
  "node": ">=18.0.0"
73
+ },
74
+ "lint-staged": {
75
+ "*.ts": [
76
+ "eslint --fix",
77
+ "prettier --write"
78
+ ]
56
79
  }
57
80
  }