openkitt 0.1.2
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/README.md +236 -0
- package/dist/ast/engine.d.ts +26 -0
- package/dist/ast/engine.js +130 -0
- package/dist/ast/engine.js.map +1 -0
- package/dist/ast/operations.d.ts +13 -0
- package/dist/ast/operations.js +329 -0
- package/dist/ast/operations.js.map +1 -0
- package/dist/ast/validator.d.ts +19 -0
- package/dist/ast/validator.js +281 -0
- package/dist/ast/validator.js.map +1 -0
- package/dist/audit/logger.d.ts +14 -0
- package/dist/audit/logger.js +102 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +401 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/create-confirm.d.ts +13 -0
- package/dist/commands/create-confirm.js +38 -0
- package/dist/commands/create-confirm.js.map +1 -0
- package/dist/commands/create-infra.d.ts +20 -0
- package/dist/commands/create-infra.js +63 -0
- package/dist/commands/create-infra.js.map +1 -0
- package/dist/commands/create-manifest.d.ts +10 -0
- package/dist/commands/create-manifest.js +21 -0
- package/dist/commands/create-manifest.js.map +1 -0
- package/dist/commands/create-packages.d.ts +17 -0
- package/dist/commands/create-packages.js +69 -0
- package/dist/commands/create-packages.js.map +1 -0
- package/dist/commands/create-pipeline.d.ts +15 -0
- package/dist/commands/create-pipeline.js +57 -0
- package/dist/commands/create-pipeline.js.map +1 -0
- package/dist/commands/create-scaffolding.d.ts +12 -0
- package/dist/commands/create-scaffolding.js +137 -0
- package/dist/commands/create-scaffolding.js.map +1 -0
- package/dist/commands/create-staging.d.ts +13 -0
- package/dist/commands/create-staging.js +17 -0
- package/dist/commands/create-staging.js.map +1 -0
- package/dist/commands/create-transforms.d.ts +10 -0
- package/dist/commands/create-transforms.js +33 -0
- package/dist/commands/create-transforms.js.map +1 -0
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.js +155 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +2 -0
- package/dist/commands/delete.js +83 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/deploy.d.ts +5 -0
- package/dist/commands/deploy.js +371 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/domain.d.ts +2 -0
- package/dist/commands/domain.js +90 -0
- package/dist/commands/domain.js.map +1 -0
- package/dist/commands/env.d.ts +2 -0
- package/dist/commands/env.js +153 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/help.d.ts +3 -0
- package/dist/commands/help.js +107 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +217 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +142 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +235 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.js +90 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/publish.d.ts +2 -0
- package/dist/commands/publish.js +113 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/run.d.ts +14 -0
- package/dist/commands/run.js +196 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/settings.d.ts +3 -0
- package/dist/commands/settings.js +278 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +88 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/versions.d.ts +2 -0
- package/dist/commands/versions.js +242 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/credentials/config.d.ts +12 -0
- package/dist/credentials/config.js +196 -0
- package/dist/credentials/config.js.map +1 -0
- package/dist/credentials/encryption.d.ts +9 -0
- package/dist/credentials/encryption.js +100 -0
- package/dist/credentials/encryption.js.map +1 -0
- package/dist/credentials/keychain.d.ts +8 -0
- package/dist/credentials/keychain.js +236 -0
- package/dist/credentials/keychain.js.map +1 -0
- package/dist/credentials/railway.d.ts +9 -0
- package/dist/credentials/railway.js +69 -0
- package/dist/credentials/railway.js.map +1 -0
- package/dist/llm/client.d.ts +59 -0
- package/dist/llm/client.js +530 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/operations.d.ts +39 -0
- package/dist/llm/operations.js +131 -0
- package/dist/llm/operations.js.map +1 -0
- package/dist/llm/rate-limiter.d.ts +20 -0
- package/dist/llm/rate-limiter.js +57 -0
- package/dist/llm/rate-limiter.js.map +1 -0
- package/dist/llm/scaffolding.d.ts +51 -0
- package/dist/llm/scaffolding.js +118 -0
- package/dist/llm/scaffolding.js.map +1 -0
- package/dist/manifest/drift.d.ts +6 -0
- package/dist/manifest/drift.js +45 -0
- package/dist/manifest/drift.js.map +1 -0
- package/dist/manifest/reader.d.ts +12 -0
- package/dist/manifest/reader.js +99 -0
- package/dist/manifest/reader.js.map +1 -0
- package/dist/manifest/types.d.ts +31 -0
- package/dist/manifest/types.js +2 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/manifest/writer.d.ts +9 -0
- package/dist/manifest/writer.js +142 -0
- package/dist/manifest/writer.js.map +1 -0
- package/dist/mcp/client.d.ts +21 -0
- package/dist/mcp/client.js +213 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/lifecycle.d.ts +12 -0
- package/dist/mcp/lifecycle.js +149 -0
- package/dist/mcp/lifecycle.js.map +1 -0
- package/dist/mcp/project-guard.d.ts +14 -0
- package/dist/mcp/project-guard.js +27 -0
- package/dist/mcp/project-guard.js.map +1 -0
- package/dist/prompts/operations.d.ts +1 -0
- package/dist/prompts/operations.js +160 -0
- package/dist/prompts/operations.js.map +1 -0
- package/dist/prompts/scaffolding.d.ts +1 -0
- package/dist/prompts/scaffolding.js +331 -0
- package/dist/prompts/scaffolding.js.map +1 -0
- package/dist/prompts/version.d.ts +2 -0
- package/dist/prompts/version.js +3 -0
- package/dist/prompts/version.js.map +1 -0
- package/dist/sandbox/command-allowlist.d.ts +6 -0
- package/dist/sandbox/command-allowlist.js +103 -0
- package/dist/sandbox/command-allowlist.js.map +1 -0
- package/dist/sandbox/package-allowlist.d.ts +6 -0
- package/dist/sandbox/package-allowlist.js +49 -0
- package/dist/sandbox/package-allowlist.js.map +1 -0
- package/dist/sandbox/scanner.d.ts +25 -0
- package/dist/sandbox/scanner.js +196 -0
- package/dist/sandbox/scanner.js.map +1 -0
- package/dist/sandbox/staging.d.ts +12 -0
- package/dist/sandbox/staging.js +107 -0
- package/dist/sandbox/staging.js.map +1 -0
- package/dist/scaffold/frameworks/express.d.ts +3 -0
- package/dist/scaffold/frameworks/express.js +242 -0
- package/dist/scaffold/frameworks/express.js.map +1 -0
- package/dist/scaffold/frameworks/hono.d.ts +3 -0
- package/dist/scaffold/frameworks/hono.js +238 -0
- package/dist/scaffold/frameworks/hono.js.map +1 -0
- package/dist/scaffold/frameworks/nextjs.d.ts +3 -0
- package/dist/scaffold/frameworks/nextjs.js +447 -0
- package/dist/scaffold/frameworks/nextjs.js.map +1 -0
- package/dist/scaffold/frameworks/tanstack-start.d.ts +3 -0
- package/dist/scaffold/frameworks/tanstack-start.js +280 -0
- package/dist/scaffold/frameworks/tanstack-start.js.map +1 -0
- package/dist/scaffold/index.d.ts +4 -0
- package/dist/scaffold/index.js +138 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/integrations/backend.d.ts +3 -0
- package/dist/scaffold/integrations/backend.js +403 -0
- package/dist/scaffold/integrations/backend.js.map +1 -0
- package/dist/scaffold/integrations/posthog.d.ts +2 -0
- package/dist/scaffold/integrations/posthog.js +21 -0
- package/dist/scaffold/integrations/posthog.js.map +1 -0
- package/dist/scaffold/integrations/sentry.d.ts +2 -0
- package/dist/scaffold/integrations/sentry.js +16 -0
- package/dist/scaffold/integrations/sentry.js.map +1 -0
- package/dist/scaffold/integrations/storybook.d.ts +2 -0
- package/dist/scaffold/integrations/storybook.js +79 -0
- package/dist/scaffold/integrations/storybook.js.map +1 -0
- package/dist/scaffold/integrations/vitest.d.ts +2 -0
- package/dist/scaffold/integrations/vitest.js +37 -0
- package/dist/scaffold/integrations/vitest.js.map +1 -0
- package/dist/scaffold/package-builder.d.ts +3 -0
- package/dist/scaffold/package-builder.js +136 -0
- package/dist/scaffold/package-builder.js.map +1 -0
- package/dist/scaffold/packages.d.ts +4 -0
- package/dist/scaffold/packages.js +144 -0
- package/dist/scaffold/packages.js.map +1 -0
- package/dist/scaffold/types.d.ts +20 -0
- package/dist/scaffold/types.js +2 -0
- package/dist/scaffold/types.js.map +1 -0
- package/dist/types.d.ts +11 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/auth-guard.d.ts +5 -0
- package/dist/utils/auth-guard.js +52 -0
- package/dist/utils/auth-guard.js.map +1 -0
- package/dist/utils/cleanup.d.ts +2 -0
- package/dist/utils/cleanup.js +37 -0
- package/dist/utils/cleanup.js.map +1 -0
- package/dist/utils/constraints.d.ts +11 -0
- package/dist/utils/constraints.js +162 -0
- package/dist/utils/constraints.js.map +1 -0
- package/dist/utils/display.d.ts +32 -0
- package/dist/utils/display.js +103 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/global-config.d.ts +8 -0
- package/dist/utils/global-config.js +39 -0
- package/dist/utils/global-config.js.map +1 -0
- package/dist/utils/pm.d.ts +4 -0
- package/dist/utils/pm.js +40 -0
- package/dist/utils/pm.js.map +1 -0
- package/dist/utils/prerequisites.d.ts +9 -0
- package/dist/utils/prerequisites.js +96 -0
- package/dist/utils/prerequisites.js.map +1 -0
- package/dist/utils/prompts.d.ts +25 -0
- package/dist/utils/prompts.js +148 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/validation.d.ts +9 -0
- package/dist/utils/validation.js +38 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/versions/compat.d.ts +13 -0
- package/dist/versions/compat.js +127 -0
- package/dist/versions/compat.js.map +1 -0
- package/dist/versions/integrity.d.ts +9 -0
- package/dist/versions/integrity.js +60 -0
- package/dist/versions/integrity.js.map +1 -0
- package/dist/versions/parser.d.ts +13 -0
- package/dist/versions/parser.js +106 -0
- package/dist/versions/parser.js.map +1 -0
- package/dist/versions/registry.d.ts +30 -0
- package/dist/versions/registry.js +165 -0
- package/dist/versions/registry.js.map +1 -0
- package/package.json +58 -0
- package/scripts/publish.sh +254 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare function success(message: string): void;
|
|
2
|
+
export declare function error(message: string): void;
|
|
3
|
+
export declare function warn(message: string): void;
|
|
4
|
+
export declare function info(message: string): void;
|
|
5
|
+
export declare function dim(message: string): string;
|
|
6
|
+
export interface Spinner {
|
|
7
|
+
/** Update the spinner message mid-flight. */
|
|
8
|
+
message(msg: string): void;
|
|
9
|
+
/** Stop with a success tick. */
|
|
10
|
+
succeed(msg: string): void;
|
|
11
|
+
/** Stop with a failure cross. */
|
|
12
|
+
fail(msg: string): void;
|
|
13
|
+
/** Stop with a warning. */
|
|
14
|
+
warn(msg: string): void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create and immediately start an animated @clack/prompts spinner.
|
|
18
|
+
* Returns a handle so the caller can update or stop it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createSpinner(initialMessage: string): Spinner;
|
|
21
|
+
export declare function printLink(label: string, url: string): void;
|
|
22
|
+
export interface ContextBannerParams {
|
|
23
|
+
inputTokens: number;
|
|
24
|
+
outputTokens: number;
|
|
25
|
+
provider: string;
|
|
26
|
+
model: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Print the context-usage banner (token count, % of context window used, cost).
|
|
30
|
+
* Displayed after scaffolding generation and before the confirm prompt.
|
|
31
|
+
*/
|
|
32
|
+
export declare function renderContextBanner(params: ContextBannerParams): void;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
export function success(message) {
|
|
4
|
+
console.log(`${pc.green('✓')} ${message}`);
|
|
5
|
+
}
|
|
6
|
+
export function error(message) {
|
|
7
|
+
console.log(`${pc.red('✗')} ${message}`);
|
|
8
|
+
}
|
|
9
|
+
export function warn(message) {
|
|
10
|
+
console.log(`${pc.yellow('⚠')} ${message}`);
|
|
11
|
+
}
|
|
12
|
+
export function info(message) {
|
|
13
|
+
console.log(`${pc.blue('ℹ')} ${message}`);
|
|
14
|
+
}
|
|
15
|
+
export function dim(message) {
|
|
16
|
+
return pc.dim(message);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create and immediately start an animated @clack/prompts spinner.
|
|
20
|
+
* Returns a handle so the caller can update or stop it.
|
|
21
|
+
*/
|
|
22
|
+
export function createSpinner(initialMessage) {
|
|
23
|
+
const s = p.spinner();
|
|
24
|
+
s.start(initialMessage);
|
|
25
|
+
return {
|
|
26
|
+
message: (msg) => s.message(msg),
|
|
27
|
+
succeed: (msg) => s.stop(msg, 0),
|
|
28
|
+
fail: (msg) => s.stop(msg, 1),
|
|
29
|
+
warn: (msg) => s.stop(msg, 2),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function printLink(label, url) {
|
|
33
|
+
const hyperlink = `\u001B]8;;${url}\u001B\\${label}\u001B]8;;\u001B\\`;
|
|
34
|
+
console.log(` ${pc.cyan('\u2192')} ${hyperlink}`);
|
|
35
|
+
}
|
|
36
|
+
// Per-million-token prices [input, output] in USD.
|
|
37
|
+
// Covers the models users are most likely to have configured.
|
|
38
|
+
const MODEL_PRICING = {
|
|
39
|
+
// Anthropic
|
|
40
|
+
'claude-opus-4-5': [15, 75],
|
|
41
|
+
'claude-opus-4': [15, 75],
|
|
42
|
+
'claude-sonnet-4-5': [3, 15],
|
|
43
|
+
'claude-sonnet-4-20250514': [3, 15],
|
|
44
|
+
'claude-3-7-sonnet-20250219': [3, 15],
|
|
45
|
+
'claude-3-5-sonnet-20241022': [3, 15],
|
|
46
|
+
'claude-3-5-haiku-20241022': [0.8, 4],
|
|
47
|
+
'claude-haiku-4-5': [0.8, 4],
|
|
48
|
+
// OpenAI
|
|
49
|
+
'gpt-4o': [2.5, 10],
|
|
50
|
+
'gpt-4o-mini': [0.15, 0.6],
|
|
51
|
+
'o3': [10, 40],
|
|
52
|
+
'o4-mini': [1.1, 4.4],
|
|
53
|
+
// Gemini
|
|
54
|
+
'gemini-2.0-flash': [0.1, 0.4],
|
|
55
|
+
'gemini-2.5-pro-preview-05-06': [1.25, 10],
|
|
56
|
+
};
|
|
57
|
+
function resolvePrice(model) {
|
|
58
|
+
if (model in MODEL_PRICING)
|
|
59
|
+
return MODEL_PRICING[model];
|
|
60
|
+
// Fuzzy fallback: find the first key that the model string starts with.
|
|
61
|
+
const key = Object.keys(MODEL_PRICING).find((k) => model.startsWith(k));
|
|
62
|
+
return key ? MODEL_PRICING[key] : null;
|
|
63
|
+
}
|
|
64
|
+
function formatCost(usd) {
|
|
65
|
+
if (usd === 0)
|
|
66
|
+
return '$0.00';
|
|
67
|
+
if (usd < 0.001)
|
|
68
|
+
return `$${usd.toFixed(6)}`;
|
|
69
|
+
if (usd < 0.01)
|
|
70
|
+
return `$${usd.toFixed(4)}`;
|
|
71
|
+
return `$${usd.toFixed(2)}`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Print the context-usage banner (token count, % of context window used, cost).
|
|
75
|
+
* Displayed after scaffolding generation and before the confirm prompt.
|
|
76
|
+
*/
|
|
77
|
+
export function renderContextBanner(params) {
|
|
78
|
+
const { inputTokens, outputTokens, provider, model } = params;
|
|
79
|
+
const totalTokens = inputTokens + outputTokens;
|
|
80
|
+
// Anthropic context window sizes by model family (output tokens excluded from window math).
|
|
81
|
+
const contextWindow = /opus/.test(model) ? 200_000 : 200_000;
|
|
82
|
+
const pctUsed = contextWindow > 0 ? Math.min(100, Math.round((inputTokens / contextWindow) * 100)) : 0;
|
|
83
|
+
const pricing = resolvePrice(model);
|
|
84
|
+
const costUsd = pricing
|
|
85
|
+
? (inputTokens / 1_000_000) * pricing[0] + (outputTokens / 1_000_000) * pricing[1]
|
|
86
|
+
: null;
|
|
87
|
+
const providerLabel = provider.charAt(0).toUpperCase() + provider.slice(1);
|
|
88
|
+
const width = 36;
|
|
89
|
+
const border = pc.dim('─'.repeat(width));
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log(` ${pc.dim(border)}`);
|
|
92
|
+
console.log(` ${pc.dim('│')} ${pc.bold('Context')}${' '.repeat(width - 9)}${pc.dim('│')}`);
|
|
93
|
+
console.log(` ${pc.dim('│')} ${pc.cyan(totalTokens.toLocaleString())} ${pc.dim('tokens')}${' '.repeat(Math.max(0, width - 2 - totalTokens.toLocaleString().length - 7))}${pc.dim('│')}`);
|
|
94
|
+
console.log(` ${pc.dim('│')} ${pc.yellow(`${pctUsed}%`)} ${pc.dim('of context window used')}${' '.repeat(Math.max(0, width - 2 - String(pctUsed).length - 1 - 22))}${pc.dim('│')}`);
|
|
95
|
+
if (costUsd !== null) {
|
|
96
|
+
const costStr = formatCost(costUsd);
|
|
97
|
+
console.log(` ${pc.dim('│')} ${pc.green(costStr)} ${pc.dim('spent')}${' '.repeat(Math.max(0, width - 2 - costStr.length - 6))}${pc.dim('│')}`);
|
|
98
|
+
}
|
|
99
|
+
console.log(` ${pc.dim('│')} ${pc.dim(`${providerLabel} · ${model}`)}${' '.repeat(Math.max(0, width - 2 - providerLabel.length - 3 - model.length))}${pc.dim('│')}`);
|
|
100
|
+
console.log(` ${pc.dim(border)}`);
|
|
101
|
+
console.log('');
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface GlobalConfig {
|
|
2
|
+
workspacePath?: string;
|
|
3
|
+
}
|
|
4
|
+
export declare function readGlobalConfig(): GlobalConfig;
|
|
5
|
+
export declare function writeGlobalConfig(config: GlobalConfig): void;
|
|
6
|
+
export declare function setGlobalWorkspacePath(workspacePath: string): void;
|
|
7
|
+
export declare function getGlobalWorkspacePath(): string | null;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
function getGlobalConfigPath() {
|
|
5
|
+
return join(homedir(), '.kitt', 'workspace.json');
|
|
6
|
+
}
|
|
7
|
+
export function readGlobalConfig() {
|
|
8
|
+
const configPath = getGlobalConfigPath();
|
|
9
|
+
if (!existsSync(configPath)) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const raw = readFileSync(configPath, 'utf-8').trim();
|
|
14
|
+
if (!raw)
|
|
15
|
+
return {};
|
|
16
|
+
const parsed = JSON.parse(raw);
|
|
17
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function writeGlobalConfig(config) {
|
|
27
|
+
const configPath = getGlobalConfigPath();
|
|
28
|
+
const configDir = join(homedir(), '.kitt');
|
|
29
|
+
mkdirSync(configDir, { recursive: true });
|
|
30
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
31
|
+
}
|
|
32
|
+
export function setGlobalWorkspacePath(workspacePath) {
|
|
33
|
+
const existing = readGlobalConfig();
|
|
34
|
+
writeGlobalConfig({ ...existing, workspacePath });
|
|
35
|
+
}
|
|
36
|
+
export function getGlobalWorkspacePath() {
|
|
37
|
+
return readGlobalConfig().workspacePath ?? null;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=global-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-config.js","sourceRoot":"","sources":["../../src/utils/global-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAMjC,SAAS,mBAAmB;IAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,MAAsB,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,aAAqB;IAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,iBAAiB,CAAC,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,gBAAgB,EAAE,CAAC,aAAa,IAAI,IAAI,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type PackageManager = 'bun' | 'npm' | 'pnpm' | 'yarn';
|
|
2
|
+
export declare const DEFAULT_PM: PackageManager;
|
|
3
|
+
export declare function getCommand(pm: PackageManager, operation: 'execute' | 'add' | 'remove' | 'run'): string;
|
|
4
|
+
export declare function getLockfile(pm: PackageManager): string;
|
package/dist/utils/pm.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const COMMANDS = {
|
|
2
|
+
bun: {
|
|
3
|
+
execute: 'bunx',
|
|
4
|
+
add: 'bun add',
|
|
5
|
+
remove: 'bun remove',
|
|
6
|
+
run: 'bun run',
|
|
7
|
+
},
|
|
8
|
+
npm: {
|
|
9
|
+
execute: 'npx',
|
|
10
|
+
add: 'npm install',
|
|
11
|
+
remove: 'npm uninstall',
|
|
12
|
+
run: 'npm run',
|
|
13
|
+
},
|
|
14
|
+
pnpm: {
|
|
15
|
+
execute: 'pnpm dlx',
|
|
16
|
+
add: 'pnpm add',
|
|
17
|
+
remove: 'pnpm remove',
|
|
18
|
+
run: 'pnpm run',
|
|
19
|
+
},
|
|
20
|
+
yarn: {
|
|
21
|
+
execute: 'yarn dlx',
|
|
22
|
+
add: 'yarn add',
|
|
23
|
+
remove: 'yarn remove',
|
|
24
|
+
run: 'yarn run',
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
const LOCKFILES = {
|
|
28
|
+
bun: 'bun.lockb',
|
|
29
|
+
npm: 'package-lock.json',
|
|
30
|
+
pnpm: 'pnpm-lock.yaml',
|
|
31
|
+
yarn: 'yarn.lock',
|
|
32
|
+
};
|
|
33
|
+
export const DEFAULT_PM = 'bun';
|
|
34
|
+
export function getCommand(pm, operation) {
|
|
35
|
+
return COMMANDS[pm][operation];
|
|
36
|
+
}
|
|
37
|
+
export function getLockfile(pm) {
|
|
38
|
+
return LOCKFILES[pm];
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=pm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm.js","sourceRoot":"","sources":["../../src/utils/pm.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAmD;IAC/D,GAAG,EAAE;QACH,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,SAAS;QACd,MAAM,EAAE,YAAY;QACpB,GAAG,EAAE,SAAS;KACf;IACD,GAAG,EAAE;QACH,OAAO,EAAE,KAAK;QACd,GAAG,EAAE,aAAa;QAClB,MAAM,EAAE,eAAe;QACvB,GAAG,EAAE,SAAS;KACf;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,UAAU;QACnB,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;KAChB;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,UAAU;QACnB,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;KAChB;CACF,CAAC;AAEF,MAAM,SAAS,GAAmC;IAChD,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,mBAAmB;IACxB,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,WAAW;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAmB,KAAK,CAAC;AAEhD,MAAM,UAAU,UAAU,CACxB,EAAkB,EAClB,SAA+C;IAE/C,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAkB;IAC5C,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface PrerequisiteStatus {
|
|
2
|
+
name: string;
|
|
3
|
+
found: boolean;
|
|
4
|
+
version?: string;
|
|
5
|
+
installUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function checkPrerequisites(): Promise<PrerequisiteStatus[]>;
|
|
8
|
+
export declare function displayPrerequisites(statuses: PrerequisiteStatus[]): void;
|
|
9
|
+
export declare function displayLlmStatus(): Promise<void>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
function getNodeVersion() {
|
|
4
|
+
try {
|
|
5
|
+
const output = execSync("node --version", {
|
|
6
|
+
encoding: "utf-8",
|
|
7
|
+
stdio: "pipe"
|
|
8
|
+
}).trim();
|
|
9
|
+
return output.replace(/^v/, "");
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return "";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function getBunVersion() {
|
|
16
|
+
try {
|
|
17
|
+
const output = execSync("bun --version", {
|
|
18
|
+
encoding: "utf-8",
|
|
19
|
+
stdio: "pipe"
|
|
20
|
+
}).trim();
|
|
21
|
+
return output;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function getRailwayVersion() {
|
|
28
|
+
try {
|
|
29
|
+
const output = execSync("railway --version", {
|
|
30
|
+
encoding: "utf-8",
|
|
31
|
+
stdio: "pipe"
|
|
32
|
+
}).trim();
|
|
33
|
+
return output || null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function checkPrerequisites() {
|
|
40
|
+
const nodeVersion = getNodeVersion();
|
|
41
|
+
const bunVersion = getBunVersion();
|
|
42
|
+
const railwayVersion = getRailwayVersion();
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
name: "Node.js",
|
|
46
|
+
found: !!nodeVersion,
|
|
47
|
+
version: nodeVersion || undefined
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "Bun",
|
|
51
|
+
found: !!bunVersion,
|
|
52
|
+
version: bunVersion || undefined,
|
|
53
|
+
installUrl: bunVersion ? undefined : "https://bun.sh"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "Railway CLI",
|
|
57
|
+
found: !!railwayVersion,
|
|
58
|
+
version: railwayVersion || undefined,
|
|
59
|
+
installUrl: railwayVersion ? undefined : "https://docs.railway.com/cli"
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
export function displayPrerequisites(statuses) {
|
|
64
|
+
for (const status of statuses) {
|
|
65
|
+
if (status.found) {
|
|
66
|
+
const version = status.version ? `v${status.version}` : "";
|
|
67
|
+
const paddedName = status.name.padEnd(12);
|
|
68
|
+
console.log(` ${pc.green("✓")} ${paddedName} ${version}`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const paddedName = status.name.padEnd(12);
|
|
72
|
+
const installMsg = status.installUrl
|
|
73
|
+
? `not found. Install: ${status.installUrl}`
|
|
74
|
+
: "not found";
|
|
75
|
+
console.log(` ${pc.red("✗")} ${paddedName} ${installMsg}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export async function displayLlmStatus() {
|
|
80
|
+
const paddedName = "LLM".padEnd(12);
|
|
81
|
+
try {
|
|
82
|
+
const { isLlmConfigured, getLlmConfig } = await import('../credentials/config.js');
|
|
83
|
+
const [configured, config] = await Promise.all([isLlmConfigured(), getLlmConfig()]);
|
|
84
|
+
if (configured && config) {
|
|
85
|
+
const label = `${config.provider[0].toUpperCase()}${config.provider.slice(1)} (${config.model})`;
|
|
86
|
+
console.log(` ${pc.green("✓")} ${paddedName} ${label}`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.log(` ${pc.yellow("!")} ${paddedName} not configured`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
console.log(` ${pc.yellow("!")} ${paddedName} not configured`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=prerequisites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../src/utils/prerequisites.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type AppType = 'frontend' | 'backend';
|
|
2
|
+
export interface AppSelections {
|
|
3
|
+
appType: AppType;
|
|
4
|
+
appName: string;
|
|
5
|
+
framework: string;
|
|
6
|
+
integrations: string[];
|
|
7
|
+
orm?: string;
|
|
8
|
+
database?: string;
|
|
9
|
+
jobsProvider?: string;
|
|
10
|
+
paymentsProvider?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class CancelError extends Error {
|
|
13
|
+
constructor(message?: string);
|
|
14
|
+
}
|
|
15
|
+
export declare function promptAppType(): Promise<AppType>;
|
|
16
|
+
export declare function promptAppName(workspaceDir: string): Promise<string>;
|
|
17
|
+
export declare function promptFramework(appType: AppType): Promise<string>;
|
|
18
|
+
export declare function promptIntegrations(appType: AppType): Promise<string[]>;
|
|
19
|
+
export declare function promptDatabaseOptions(): Promise<{
|
|
20
|
+
orm: string;
|
|
21
|
+
database: string;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function promptPaymentsProvider(): Promise<string>;
|
|
24
|
+
export declare function promptJobsProvider(): Promise<string>;
|
|
25
|
+
export declare function runSelectionFlow(workspaceDir: string): Promise<AppSelections>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { warn } from './display.js';
|
|
3
|
+
import { sanitizeInput, validateAppName, validateAppNameUniqueness } from './validation.js';
|
|
4
|
+
export class CancelError extends Error {
|
|
5
|
+
constructor(message = 'Creation cancelled.') {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'CancelError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function handleCancel(result) {
|
|
11
|
+
if (p.isCancel(result)) {
|
|
12
|
+
warn('Creation cancelled.');
|
|
13
|
+
throw new CancelError();
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
export async function promptAppType() {
|
|
18
|
+
const appType = await p.select({
|
|
19
|
+
message: 'What type of app are you creating?',
|
|
20
|
+
options: [
|
|
21
|
+
{ label: 'Frontend', value: 'frontend' },
|
|
22
|
+
{ label: 'Backend', value: 'backend' },
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
return handleCancel(appType);
|
|
26
|
+
}
|
|
27
|
+
export async function promptAppName(workspaceDir) {
|
|
28
|
+
const appName = await p.text({
|
|
29
|
+
message: 'App name:',
|
|
30
|
+
validate: (value) => {
|
|
31
|
+
const sanitized = sanitizeInput(String(value ?? ''));
|
|
32
|
+
const formatValidation = validateAppName(sanitized);
|
|
33
|
+
if (!formatValidation.valid) {
|
|
34
|
+
return formatValidation.error;
|
|
35
|
+
}
|
|
36
|
+
const uniquenessValidation = validateAppNameUniqueness(sanitized, workspaceDir);
|
|
37
|
+
return uniquenessValidation.valid ? undefined : uniquenessValidation.error;
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
return sanitizeInput(handleCancel(appName));
|
|
41
|
+
}
|
|
42
|
+
export async function promptFramework(appType) {
|
|
43
|
+
const framework = await p.select({
|
|
44
|
+
message: 'Select framework:',
|
|
45
|
+
options: appType === 'frontend'
|
|
46
|
+
? [
|
|
47
|
+
{ label: 'TanStack Start', value: 'tanstack-start' },
|
|
48
|
+
{ label: 'Next.js', value: 'nextjs' },
|
|
49
|
+
]
|
|
50
|
+
: [
|
|
51
|
+
{ label: 'Express.js', value: 'express' },
|
|
52
|
+
{ label: 'Hono', value: 'hono' },
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
return handleCancel(framework);
|
|
56
|
+
}
|
|
57
|
+
export async function promptIntegrations(appType) {
|
|
58
|
+
const integrations = await p.multiselect({
|
|
59
|
+
message: 'Select optional integrations:',
|
|
60
|
+
required: false,
|
|
61
|
+
options: appType === 'frontend'
|
|
62
|
+
? [
|
|
63
|
+
{ label: 'Storybook', value: 'storybook' },
|
|
64
|
+
{ label: 'Auth', value: 'auth' },
|
|
65
|
+
{ label: 'Payments', value: 'payments' },
|
|
66
|
+
{ label: 'Email', value: 'email' },
|
|
67
|
+
{ label: 'Database + ORM', value: 'database' },
|
|
68
|
+
{ label: 'Background Jobs', value: 'background-jobs' },
|
|
69
|
+
{ label: 'Playwright', value: 'playwright' },
|
|
70
|
+
]
|
|
71
|
+
: [
|
|
72
|
+
{ label: 'Auth', value: 'auth' },
|
|
73
|
+
{ label: 'Payments', value: 'payments' },
|
|
74
|
+
{ label: 'Email', value: 'email' },
|
|
75
|
+
{ label: 'Database + ORM', value: 'database' },
|
|
76
|
+
{ label: 'Background Jobs', value: 'background-jobs' },
|
|
77
|
+
{ label: 'Redis', value: 'redis' },
|
|
78
|
+
{ label: 'Playwright', value: 'playwright' },
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
return handleCancel(integrations);
|
|
82
|
+
}
|
|
83
|
+
export async function promptDatabaseOptions() {
|
|
84
|
+
const orm = handleCancel(await p.select({
|
|
85
|
+
message: 'Select ORM:',
|
|
86
|
+
options: [
|
|
87
|
+
{ label: 'Drizzle', value: 'drizzle' },
|
|
88
|
+
{ label: 'Prisma', value: 'prisma' },
|
|
89
|
+
],
|
|
90
|
+
}));
|
|
91
|
+
const database = handleCancel(await p.select({
|
|
92
|
+
message: 'Select database:',
|
|
93
|
+
options: [
|
|
94
|
+
{ label: 'PostgreSQL', value: 'postgresql' },
|
|
95
|
+
{ label: 'MySQL', value: 'mysql' },
|
|
96
|
+
{ label: 'SQLite', value: 'sqlite' },
|
|
97
|
+
],
|
|
98
|
+
}));
|
|
99
|
+
return {
|
|
100
|
+
orm,
|
|
101
|
+
database,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export async function promptPaymentsProvider() {
|
|
105
|
+
const provider = await p.select({
|
|
106
|
+
message: 'Select payments provider:',
|
|
107
|
+
options: [
|
|
108
|
+
{ label: 'Stripe', value: 'stripe' },
|
|
109
|
+
{ label: 'Polar', value: 'polar' },
|
|
110
|
+
],
|
|
111
|
+
});
|
|
112
|
+
return handleCancel(provider);
|
|
113
|
+
}
|
|
114
|
+
export async function promptJobsProvider() {
|
|
115
|
+
const provider = await p.select({
|
|
116
|
+
message: 'Select background jobs provider:',
|
|
117
|
+
options: [
|
|
118
|
+
{ label: 'BullMQ', value: 'bullmq' },
|
|
119
|
+
{ label: 'Trigger.dev', value: 'trigger-dev' },
|
|
120
|
+
],
|
|
121
|
+
});
|
|
122
|
+
return handleCancel(provider);
|
|
123
|
+
}
|
|
124
|
+
export async function runSelectionFlow(workspaceDir) {
|
|
125
|
+
const appType = await promptAppType();
|
|
126
|
+
const appName = await promptAppName(workspaceDir);
|
|
127
|
+
const framework = await promptFramework(appType);
|
|
128
|
+
const integrations = await promptIntegrations(appType);
|
|
129
|
+
const selections = {
|
|
130
|
+
appType,
|
|
131
|
+
appName,
|
|
132
|
+
framework,
|
|
133
|
+
integrations,
|
|
134
|
+
};
|
|
135
|
+
if (integrations.includes('database')) {
|
|
136
|
+
const { orm, database } = await promptDatabaseOptions();
|
|
137
|
+
selections.orm = orm;
|
|
138
|
+
selections.database = database;
|
|
139
|
+
}
|
|
140
|
+
if (integrations.includes('payments')) {
|
|
141
|
+
selections.paymentsProvider = await promptPaymentsProvider();
|
|
142
|
+
}
|
|
143
|
+
if (integrations.includes('background-jobs')) {
|
|
144
|
+
selections.jobsProvider = await promptJobsProvider();
|
|
145
|
+
}
|
|
146
|
+
return selections;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function validateAppName(name: string): {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
error?: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function sanitizeInput(input: string): string;
|
|
6
|
+
export declare function validateAppNameUniqueness(name: string, workspaceDir: string): {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
error?: string;
|
|
9
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { readManifest } from '../manifest/reader.js';
|
|
4
|
+
const APP_NAME_REGEX = /^[a-z][a-z0-9-]{1,48}[a-z0-9]$/;
|
|
5
|
+
export function validateAppName(name) {
|
|
6
|
+
if (!name || name.length === 0) {
|
|
7
|
+
return { valid: false, error: 'App name is required' };
|
|
8
|
+
}
|
|
9
|
+
if (name.length < 3) {
|
|
10
|
+
return { valid: false, error: 'App name must be at least 3 characters' };
|
|
11
|
+
}
|
|
12
|
+
if (name.length > 50) {
|
|
13
|
+
return { valid: false, error: 'App name must be at most 50 characters' };
|
|
14
|
+
}
|
|
15
|
+
if (!APP_NAME_REGEX.test(name)) {
|
|
16
|
+
return {
|
|
17
|
+
valid: false,
|
|
18
|
+
error: 'App name must start with a letter and contain only lowercase letters, numbers, and hyphens',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return { valid: true };
|
|
22
|
+
}
|
|
23
|
+
export function sanitizeInput(input) {
|
|
24
|
+
return input.trim().replace(/[\x00-\x1F\x7F]/g, '');
|
|
25
|
+
}
|
|
26
|
+
export function validateAppNameUniqueness(name, workspaceDir) {
|
|
27
|
+
const manifest = readManifest(workspaceDir);
|
|
28
|
+
const existsInManifest = manifest !== null && name in manifest.apps;
|
|
29
|
+
const existsInAppsDirectory = existsSync(join(workspaceDir, 'apps', name));
|
|
30
|
+
if (existsInManifest || existsInAppsDirectory) {
|
|
31
|
+
return {
|
|
32
|
+
valid: false,
|
|
33
|
+
error: `App "${name}" already exists. Choose a different name.`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { valid: true };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAExD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;IACzD,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,4FAA4F;SACpG,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,YAAoB;IAC1E,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAAG,QAAQ,KAAK,IAAI,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC;IACpE,MAAM,qBAAqB,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3E,IAAI,gBAAgB,IAAI,qBAAqB,EAAE,CAAC;QAC9C,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,QAAQ,IAAI,4CAA4C;SAChE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface CompatIssue {
|
|
2
|
+
package: string;
|
|
3
|
+
version: string;
|
|
4
|
+
peer: string;
|
|
5
|
+
required: string;
|
|
6
|
+
installed: string | null;
|
|
7
|
+
optional: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface CompatResult {
|
|
10
|
+
errors: CompatIssue[];
|
|
11
|
+
warnings: CompatIssue[];
|
|
12
|
+
}
|
|
13
|
+
export declare function checkCompatibility(displayVersions: Record<string, string>, resolvedIntegrations: string[], framework: string): Promise<CompatResult>;
|