andrud 1.0.1 → 1.0.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.
Files changed (121) hide show
  1. package/README.md +295 -306
  2. package/dist/__tests__/context.test.d.ts +5 -0
  3. package/dist/__tests__/context.test.d.ts.map +1 -0
  4. package/dist/__tests__/context.test.js +86 -0
  5. package/dist/__tests__/context.test.js.map +1 -0
  6. package/dist/__tests__/generator.test.d.ts +5 -0
  7. package/dist/__tests__/generator.test.d.ts.map +1 -0
  8. package/dist/__tests__/generator.test.js +83 -0
  9. package/dist/__tests__/generator.test.js.map +1 -0
  10. package/dist/__tests__/validation.test.d.ts +5 -0
  11. package/dist/__tests__/validation.test.d.ts.map +1 -0
  12. package/dist/__tests__/validation.test.js +81 -0
  13. package/dist/__tests__/validation.test.js.map +1 -0
  14. package/dist/cli/commands/create.d.ts +10 -0
  15. package/dist/cli/commands/create.d.ts.map +1 -0
  16. package/dist/cli/commands/create.js +203 -0
  17. package/dist/cli/commands/create.js.map +1 -0
  18. package/dist/cli/commands/info.d.ts +13 -0
  19. package/dist/cli/commands/info.d.ts.map +1 -0
  20. package/dist/cli/commands/info.js +153 -0
  21. package/dist/cli/commands/info.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts +15 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -0
  24. package/dist/cli/commands/init.js +141 -0
  25. package/dist/cli/commands/init.js.map +1 -0
  26. package/dist/cli/commands/list.d.ts +18 -0
  27. package/dist/cli/commands/list.d.ts.map +1 -0
  28. package/dist/cli/commands/list.js +122 -0
  29. package/dist/cli/commands/list.js.map +1 -0
  30. package/dist/cli/commands/new.d.ts +22 -0
  31. package/dist/cli/commands/new.d.ts.map +1 -0
  32. package/dist/cli/commands/new.js +245 -0
  33. package/dist/cli/commands/new.js.map +1 -0
  34. package/dist/cli/index.d.ts +5 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +99 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/core/config.d.ts +89 -0
  39. package/dist/core/config.d.ts.map +1 -0
  40. package/dist/core/config.js +151 -0
  41. package/dist/core/config.js.map +1 -0
  42. package/dist/core/context.d.ts +47 -0
  43. package/dist/core/context.d.ts.map +1 -0
  44. package/dist/core/context.js +175 -0
  45. package/dist/core/context.js.map +1 -0
  46. package/dist/core/generator.d.ts +44 -0
  47. package/dist/core/generator.d.ts.map +1 -0
  48. package/{src/core/generator.ts → dist/core/generator.js} +394 -484
  49. package/dist/core/generator.js.map +1 -0
  50. package/dist/core/types.d.ts +125 -0
  51. package/dist/core/types.d.ts.map +1 -0
  52. package/dist/core/types.js +22 -0
  53. package/dist/core/types.js.map +1 -0
  54. package/dist/templates/index.d.ts +36 -0
  55. package/dist/templates/index.d.ts.map +1 -0
  56. package/dist/templates/index.js +141 -0
  57. package/dist/templates/index.js.map +1 -0
  58. package/dist/ui/colors.d.ts +40 -0
  59. package/dist/ui/colors.d.ts.map +1 -0
  60. package/dist/ui/colors.js +117 -0
  61. package/dist/ui/colors.js.map +1 -0
  62. package/dist/ui/output.d.ts +69 -0
  63. package/dist/ui/output.d.ts.map +1 -0
  64. package/dist/ui/output.js +199 -0
  65. package/dist/ui/output.js.map +1 -0
  66. package/dist/ui/prompts.d.ts +20 -0
  67. package/dist/ui/prompts.d.ts.map +1 -0
  68. package/dist/ui/prompts.js +118 -0
  69. package/dist/ui/prompts.js.map +1 -0
  70. package/dist/ui/spinners.d.ts +30 -0
  71. package/dist/ui/spinners.d.ts.map +1 -0
  72. package/dist/ui/spinners.js +74 -0
  73. package/dist/ui/spinners.js.map +1 -0
  74. package/dist/ui/types.d.ts +35 -0
  75. package/dist/ui/types.d.ts.map +1 -0
  76. package/dist/ui/types.js +5 -0
  77. package/dist/ui/types.js.map +1 -0
  78. package/dist/utils/filesystem.d.ts +38 -0
  79. package/dist/utils/filesystem.d.ts.map +1 -0
  80. package/dist/utils/filesystem.js +181 -0
  81. package/dist/utils/filesystem.js.map +1 -0
  82. package/dist/utils/logger.d.ts +27 -0
  83. package/dist/utils/logger.d.ts.map +1 -0
  84. package/dist/utils/logger.js +52 -0
  85. package/dist/utils/logger.js.map +1 -0
  86. package/dist/utils/object.d.ts +140 -0
  87. package/dist/utils/object.d.ts.map +1 -0
  88. package/dist/utils/object.js +385 -0
  89. package/dist/utils/object.js.map +1 -0
  90. package/dist/utils/validation.d.ts +35 -0
  91. package/dist/utils/validation.d.ts.map +1 -0
  92. package/dist/utils/validation.js +270 -0
  93. package/dist/utils/validation.js.map +1 -0
  94. package/package.json +10 -21
  95. package/CHANGELOG.md +0 -70
  96. package/CONTRIBUTING.md +0 -132
  97. package/sc.png +0 -0
  98. package/src/__tests__/context.test.ts +0 -133
  99. package/src/__tests__/generator.test.ts +0 -107
  100. package/src/__tests__/validation.test.ts +0 -105
  101. package/src/cli/commands/create.ts +0 -252
  102. package/src/cli/commands/info.ts +0 -178
  103. package/src/cli/commands/init.ts +0 -186
  104. package/src/cli/commands/list.ts +0 -156
  105. package/src/cli/commands/new.ts +0 -316
  106. package/src/cli/index.ts +0 -116
  107. package/src/core/config.ts +0 -172
  108. package/src/core/context.ts +0 -212
  109. package/src/core/types.ts +0 -184
  110. package/src/templates/index.ts +0 -162
  111. package/src/types/gradient-string.d.ts +0 -25
  112. package/src/ui/colors.ts +0 -139
  113. package/src/ui/output.ts +0 -230
  114. package/src/ui/prompts.ts +0 -170
  115. package/src/ui/spinners.ts +0 -95
  116. package/src/ui/types.ts +0 -41
  117. package/src/utils/filesystem.ts +0 -222
  118. package/src/utils/logger.ts +0 -67
  119. package/src/utils/object.ts +0 -456
  120. package/src/utils/validation.ts +0 -345
  121. package/tsconfig.json +0 -25
@@ -0,0 +1,245 @@
1
+ /**
2
+ * New project creation command with interactive prompts
3
+ */
4
+ import { select, text, multiselect, isCancel, cancel } from '@clack/prompts';
5
+ import { printWelcome, printSuccess, printError, printSection, printKeyValue, printGoodbye, printSteps } from '../../ui/output.js';
6
+ import { validateAppName, validatePackageStructure, validateDirectoryPath } from '../../utils/validation.js';
7
+ import { generateProject } from '../../core/generator.js';
8
+ import { buildDefaultProjectContext, buildTemplateContext } from '../../core/context.js';
9
+ import { exists } from '../../utils/filesystem.js';
10
+ import { getTemplateMetadata, getAllTemplates } from '../../templates/index.js';
11
+ import pc from 'picocolors';
12
+ /**
13
+ * Create a new Android project
14
+ */
15
+ export async function createNewCommand(name, options = {}) {
16
+ try {
17
+ // Print welcome banner
18
+ printWelcome();
19
+ // Get all available templates
20
+ const templates = getAllTemplates();
21
+ // Step 1: Select template
22
+ let selectedTemplate;
23
+ if (options.template) {
24
+ const meta = getTemplateMetadata(options.template);
25
+ if (!meta) {
26
+ printError(`Unknown template: ${options.template}`);
27
+ console.log('Available templates:');
28
+ templates.forEach(t => console.log(` - ${t.id}`));
29
+ return;
30
+ }
31
+ selectedTemplate = options.template;
32
+ }
33
+ else {
34
+ const templateOptions = templates.map(t => ({
35
+ label: `${t.name}`,
36
+ value: t.id,
37
+ hint: t.keywords.slice(0, 2).join(', ')
38
+ }));
39
+ const templateResult = await select({
40
+ message: '? Select a project template',
41
+ options: templateOptions
42
+ });
43
+ if (isCancel(templateResult)) {
44
+ cancel();
45
+ return;
46
+ }
47
+ selectedTemplate = templateResult;
48
+ }
49
+ printSection(`Template: ${selectedTemplate}`);
50
+ // Step 2: Get app name
51
+ let appName;
52
+ if (name) {
53
+ const validation = validateAppName(name);
54
+ if (!validation.valid) {
55
+ printError('Invalid app name', validation.errors.join(', '));
56
+ return;
57
+ }
58
+ appName = validation.normalized ?? name;
59
+ }
60
+ else {
61
+ const nameResult = await text({
62
+ message: '? What is the app name?',
63
+ placeholder: 'MyAwesomeApp',
64
+ defaultValue: 'MyAwesomeApp',
65
+ validate: (value) => {
66
+ const result = validateAppName(value);
67
+ if (!result.valid) {
68
+ return result.errors[0];
69
+ }
70
+ return undefined;
71
+ }
72
+ });
73
+ if (isCancel(nameResult)) {
74
+ cancel();
75
+ return;
76
+ }
77
+ const validation = validateAppName(nameResult);
78
+ if (!validation.valid) {
79
+ printError('Invalid app name', validation.errors.join(', '));
80
+ return;
81
+ }
82
+ appName = validation.normalized ?? nameResult;
83
+ }
84
+ // Step 3: Get package name
85
+ let packageName;
86
+ if (options.packageName) {
87
+ const validation = validatePackageStructure(options.packageName);
88
+ if (!validation.valid) {
89
+ printError('Invalid package name', validation.errors.join(', '));
90
+ return;
91
+ }
92
+ packageName = options.packageName;
93
+ }
94
+ else {
95
+ // Generate default package name from app name
96
+ const defaultPackage = `com.example.${appName.toLowerCase().replace(/[^a-z0-9]/g, '')}`;
97
+ const packageResult = await text({
98
+ message: '? What is the package name?',
99
+ placeholder: 'com.example.myapp',
100
+ defaultValue: defaultPackage,
101
+ validate: (value) => {
102
+ const result = validatePackageStructure(value);
103
+ if (!result.valid) {
104
+ return result.errors[0];
105
+ }
106
+ return undefined;
107
+ }
108
+ });
109
+ if (isCancel(packageResult)) {
110
+ cancel();
111
+ return;
112
+ }
113
+ const validation = validatePackageStructure(packageResult);
114
+ if (!validation.valid) {
115
+ printError('Invalid package name', validation.errors.join(', '));
116
+ return;
117
+ }
118
+ packageName = packageResult;
119
+ }
120
+ // Step 4: Get project directory
121
+ let projectDirectory;
122
+ if (options.directory) {
123
+ const validation = validateDirectoryPath(options.directory);
124
+ if (!validation.valid) {
125
+ printError('Invalid directory', validation.errors.join(', '));
126
+ return;
127
+ }
128
+ projectDirectory = validation.normalized ?? options.directory;
129
+ }
130
+ else {
131
+ const defaultDir = `./${appName.toLowerCase().replace(/[^a-z0-9]/g, '-')}`;
132
+ const dirResult = await text({
133
+ message: '? In which directory should the project be created?',
134
+ placeholder: defaultDir,
135
+ defaultValue: defaultDir,
136
+ validate: (value) => {
137
+ const result = validateDirectoryPath(value);
138
+ if (!result.valid) {
139
+ return result.errors[0];
140
+ }
141
+ return undefined;
142
+ }
143
+ });
144
+ if (isCancel(dirResult)) {
145
+ cancel();
146
+ return;
147
+ }
148
+ const validation = validateDirectoryPath(dirResult);
149
+ if (!validation.valid) {
150
+ printError('Invalid directory', validation.errors.join(', '));
151
+ return;
152
+ }
153
+ projectDirectory = validation.normalized ?? dirResult;
154
+ }
155
+ // Step 5: Optional features
156
+ const featureOptions = [
157
+ { label: 'Git repository', value: 'git', hint: 'Initialize with git' },
158
+ { label: 'README.md', value: 'readme', hint: 'Generate readme' },
159
+ { label: 'AndroidX libraries', value: 'androidX', hint: 'Use AndroidX (recommended)', selected: true },
160
+ { label: 'Kotlin DSL', value: 'kotlinDsl', hint: 'Use Kotlin DSL for Gradle', selected: true }
161
+ ];
162
+ const featuresResult = await multiselect({
163
+ message: '? Select additional features (optional)',
164
+ options: featureOptions,
165
+ required: false
166
+ });
167
+ if (isCancel(featuresResult)) {
168
+ cancel();
169
+ return;
170
+ }
171
+ const selectedFeatures = featuresResult;
172
+ const features = {
173
+ git: selectedFeatures.includes('git') || options.git === true,
174
+ readme: selectedFeatures.includes('readme'),
175
+ androidX: selectedFeatures.includes('androidX'),
176
+ kotlinDsl: selectedFeatures.includes('kotlinDsl')
177
+ };
178
+ // Build context
179
+ const baseContext = buildDefaultProjectContext(appName, packageName, projectDirectory, selectedTemplate, features, options.minSdk, options.targetSdk);
180
+ const context = buildTemplateContext({
181
+ appName: baseContext.appName,
182
+ packageName: baseContext.packageName,
183
+ projectDirectory: baseContext.projectDirectory,
184
+ template: baseContext.template,
185
+ uiFramework: baseContext.uiFramework,
186
+ language: baseContext.language,
187
+ android: baseContext.android,
188
+ gradle: baseContext.gradle,
189
+ features: baseContext,
190
+ nativeCpp: baseContext.nativeCpp
191
+ });
192
+ // Check if directory exists
193
+ const dirExists = await exists(projectDirectory);
194
+ if (dirExists && !options.force) {
195
+ printError(`Directory "${projectDirectory}" already exists`, 'Use --force to overwrite existing files');
196
+ return;
197
+ }
198
+ // Generate project
199
+ console.log('');
200
+ printSection('Generating Project');
201
+ const result = await generateProject(context, {
202
+ overwrite: options.force,
203
+ dryRun: false,
204
+ skipInstall: options.skipInstall,
205
+ verbose: options.verbose ?? false
206
+ });
207
+ if (result.success) {
208
+ printSuccess('Project generated successfully!');
209
+ printKeyValue([
210
+ { key: 'Project', value: appName },
211
+ { key: 'Package', value: packageName },
212
+ { key: 'Template', value: selectedTemplate },
213
+ { key: 'Location', value: projectDirectory },
214
+ { key: 'Files created', value: result.generatedFiles.length.toString() },
215
+ { key: 'Duration', value: `${(result.duration / 1000).toFixed(1)}s` }
216
+ ]);
217
+ console.log('');
218
+ printSteps([
219
+ `cd ${projectDirectory}`,
220
+ 'Open in Android Studio: studio .',
221
+ 'Or build from command line: ./gradlew assembleDebug'
222
+ ]);
223
+ printGoodbye(true);
224
+ }
225
+ else {
226
+ printError('Project generation failed');
227
+ if (result.errors.length > 0) {
228
+ console.log('');
229
+ result.errors.forEach(err => {
230
+ console.log(` ${pc.red('•')} ${err.file ? `${err.file}: ` : ''}${err.message}`);
231
+ });
232
+ }
233
+ printGoodbye(false);
234
+ }
235
+ }
236
+ catch (error) {
237
+ printError('An unexpected error occurred', error.message);
238
+ if (process.env.DEBUG || process.env.VERBOSE) {
239
+ console.error(error);
240
+ }
241
+ printGoodbye(false);
242
+ process.exit(1);
243
+ }
244
+ }
245
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/cli/commands/new.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Command registration and main CLI entry point
3
+ */
4
+ export declare function runCli(): void;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+EH,wBAAgB,MAAM,IAAI,IAAI,CAgC7B"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Command registration and main CLI entry point
3
+ */
4
+ import { cac } from 'cac';
5
+ import pc from 'picocolors';
6
+ import { createCommand } from './commands/create.js';
7
+ import { createNewCommand } from './commands/new.js';
8
+ import { createInitCommand } from './commands/init.js';
9
+ import { createInfoCommand } from './commands/info.js';
10
+ import { createListCommand } from './commands/list.js';
11
+ const pkg = { version: '1.0.0' };
12
+ const cli = cac('andrud');
13
+ cli.version(pkg.version);
14
+ // Clean minimal help
15
+ function printHelp() {
16
+ console.log('');
17
+ console.log(` ${pc.cyan('andrud')} - Android Project Scaffolding`);
18
+ console.log('');
19
+ console.log(` ${pc.gray('andrud create')} Create a new project`);
20
+ console.log(` ${pc.gray('andrud list')} Show available templates`);
21
+ console.log(` ${pc.gray('andrud info <template>')} View template details`);
22
+ console.log('');
23
+ console.log(` ${pc.gray('andrud create MyApp')} Create with name`);
24
+ console.log('');
25
+ }
26
+ // Commands
27
+ cli
28
+ .command('create', 'Create a new Android project')
29
+ .alias('c')
30
+ .option('-f, --force', 'Overwrite existing files')
31
+ .example('andrud create')
32
+ .example('andrud create --force')
33
+ .action(createCommand);
34
+ cli
35
+ .command('new [name]', 'Create a new project')
36
+ .alias('n')
37
+ .option('-t, --template <type>', 'Template type')
38
+ .option('-p, --package <name>', 'Package name')
39
+ .option('-f, --force', 'Overwrite')
40
+ .example('andrud new MyApp -t kotlin-compose')
41
+ .action(createNewCommand);
42
+ cli
43
+ .command('init', 'Initialize in current directory')
44
+ .alias('i')
45
+ .option('-f, --force', 'Overwrite')
46
+ .example('andrud init')
47
+ .action(createInitCommand);
48
+ cli
49
+ .command('info [template]', 'Show template info')
50
+ .example('andrud info kotlin-compose')
51
+ .action(createInfoCommand);
52
+ cli
53
+ .command('list', 'List all templates')
54
+ .alias('ls')
55
+ .option('--json', 'Output as JSON')
56
+ .action(createListCommand);
57
+ cli.on('command:!', () => {
58
+ console.error(pc.red(` Unknown command. See ${pc.cyan('--help')}\n`));
59
+ });
60
+ process.on('uncaughtException', (error) => {
61
+ console.error(pc.red(` ${error.message}\n`));
62
+ process.exit(1);
63
+ });
64
+ process.on('unhandledRejection', (reason) => {
65
+ console.error(pc.red(` ${reason}\n`));
66
+ process.exit(1);
67
+ });
68
+ export function runCli() {
69
+ try {
70
+ const args = process.argv.slice(2);
71
+ // Show help
72
+ if (args.includes('--help') || args.includes('-h')) {
73
+ printHelp();
74
+ return;
75
+ }
76
+ // Show version
77
+ if (args.includes('--version') || args.includes('-V')) {
78
+ console.log(pkg.version);
79
+ return;
80
+ }
81
+ // Quick help on no args
82
+ if (args.length === 0) {
83
+ console.log('');
84
+ console.log(` ${pc.cyan('andrud')} - Create Android projects`);
85
+ console.log('');
86
+ console.log(` ${pc.gray('andrud create')} Start interactive setup`);
87
+ console.log(` ${pc.gray('andrud --help')} Show all commands`);
88
+ console.log('');
89
+ return;
90
+ }
91
+ cli.parse(process.argv, { run: true });
92
+ }
93
+ catch (error) {
94
+ console.error(pc.red(` ${error.message}\n`));
95
+ process.exit(1);
96
+ }
97
+ }
98
+ // Note: runCli() is called from bin/andrud.js
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Configuration constants for Android and Gradle versions
3
+ */
4
+ /**
5
+ * Default Android SDK configuration
6
+ */
7
+ export declare const ANDROID_SDK_DEFAULTS: {
8
+ MIN_SDK: number;
9
+ TARGET_SDK: number;
10
+ COMPILE_SDK: number;
11
+ BUILD_TOOLS_VERSION: string;
12
+ };
13
+ /**
14
+ * Gradle-related versions
15
+ */
16
+ export declare const GRADLE_VERSIONS: {
17
+ AGP: string;
18
+ GRADLE: string;
19
+ KOTLIN: string;
20
+ COMPOSE_COMPILER: string;
21
+ COMPOSE_BOM: string;
22
+ NDK: string;
23
+ };
24
+ /**
25
+ * AndroidX library versions
26
+ */
27
+ export declare const ANDROIDX_VERSIONS: {
28
+ CORE_KTX: string;
29
+ APP_COMPAT: string;
30
+ MATERIAL: string;
31
+ LIFECYCLE: string;
32
+ ACTIVITY: string;
33
+ CONSTRAINT_LAYOUT: string;
34
+ RECYCLER_VIEW: string;
35
+ CARD_VIEW: string;
36
+ SWIPE_REFRESH: string;
37
+ NAVIGATION: string;
38
+ ROOM: string;
39
+ WORK: string;
40
+ HILT: string;
41
+ };
42
+ /**
43
+ * Compose versions
44
+ */
45
+ export declare const COMPOSE_VERSIONS: {
46
+ BOM: string;
47
+ UI: string;
48
+ UI_GRAPHICS: string;
49
+ UI_TOOLING: string;
50
+ MATERIAL3: string;
51
+ MATERIAL_ICONS: string;
52
+ FOUNDATION: string;
53
+ ACTIVITY: string;
54
+ LIFECYCLE: string;
55
+ NAVIGATION: string;
56
+ };
57
+ /**
58
+ * Default Gradle properties for Android projects
59
+ */
60
+ export declare function getDefaultGradleProperties(): Record<string, string | number | boolean>;
61
+ /**
62
+ * Get recommended minimum SDK based on year
63
+ */
64
+ export declare function getRecommendedMinSdk(): number;
65
+ /**
66
+ * Get target SDK for a given year
67
+ */
68
+ export declare function getTargetSdkForYear(year: number): number;
69
+ /**
70
+ * Template-specific configurations
71
+ */
72
+ export interface TemplateConfig {
73
+ language: 'kotlin' | 'java';
74
+ uiFramework: 'xml' | 'compose' | 'none';
75
+ minSdk: number;
76
+ targetSdk: number;
77
+ compileSdk: number;
78
+ kotlinVersion: string;
79
+ agpVersion: string;
80
+ gradleVersion: string;
81
+ composeEnabled: boolean;
82
+ ndkVersion?: string;
83
+ }
84
+ export declare const TEMPLATE_CONFIGS: Record<string, TemplateConfig>;
85
+ /**
86
+ * Get template configuration
87
+ */
88
+ export declare function getTemplateConfig(template: string): TemplateConfig;
89
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;CAKhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;CAO3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;CAc7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;CAW5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAYtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC5B,WAAW,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CA8C3D,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAGlE"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Configuration constants for Android and Gradle versions
3
+ */
4
+ /**
5
+ * Default Android SDK configuration
6
+ */
7
+ export const ANDROID_SDK_DEFAULTS = {
8
+ MIN_SDK: 24,
9
+ TARGET_SDK: 36,
10
+ COMPILE_SDK: 36,
11
+ BUILD_TOOLS_VERSION: '36.0.0'
12
+ };
13
+ /**
14
+ * Gradle-related versions
15
+ */
16
+ export const GRADLE_VERSIONS = {
17
+ AGP: '8.7.3',
18
+ GRADLE: '8.14',
19
+ KOTLIN: '2.0.21',
20
+ COMPOSE_COMPILER: '1.5.14',
21
+ COMPOSE_BOM: '2024.09.03',
22
+ NDK: '28.2.13676358'
23
+ };
24
+ /**
25
+ * AndroidX library versions
26
+ */
27
+ export const ANDROIDX_VERSIONS = {
28
+ CORE_KTX: '1.15.0',
29
+ APP_COMPAT: '1.7.0',
30
+ MATERIAL: '1.12.0',
31
+ LIFECYCLE: '2.8.7',
32
+ ACTIVITY: '1.9.3',
33
+ CONSTRAINT_LAYOUT: '2.2.0',
34
+ RECYCLER_VIEW: '1.3.2',
35
+ CARD_VIEW: '1.0.0',
36
+ SWIPE_REFRESH: '1.1.0',
37
+ NAVIGATION: '2.8.4',
38
+ ROOM: '2.6.1',
39
+ WORK: '2.10.0',
40
+ HILT: '2.52'
41
+ };
42
+ /**
43
+ * Compose versions
44
+ */
45
+ export const COMPOSE_VERSIONS = {
46
+ BOM: '2025.01.00',
47
+ UI: '1.3.0',
48
+ UI_GRAPHICS: '1.3.0',
49
+ UI_TOOLING: '1.3.0',
50
+ MATERIAL3: '1.3.0',
51
+ MATERIAL_ICONS: '1.3.0',
52
+ FOUNDATION: '1.3.0',
53
+ ACTIVITY: '1.9.3',
54
+ LIFECYCLE: '2.8.7',
55
+ NAVIGATION: '2.8.4'
56
+ };
57
+ /**
58
+ * Default Gradle properties for Android projects
59
+ */
60
+ export function getDefaultGradleProperties() {
61
+ return {
62
+ 'org.gradle.jvmargs': '-Xmx2048m -Dfile.encoding=UTF-8',
63
+ 'android.useAndroidX': true,
64
+ 'android.enableJetifier': true,
65
+ 'kotlin.code.style': 'official',
66
+ 'org.gradle.parallel': true,
67
+ 'org.gradle.caching': true,
68
+ 'org.gradle.configureondemand': true,
69
+ 'android.nonTransitiveRClass': true,
70
+ 'android.defaults.buildfeatures.buildconfig': true
71
+ };
72
+ }
73
+ /**
74
+ * Get recommended minimum SDK based on year
75
+ */
76
+ export function getRecommendedMinSdk() {
77
+ return 24; // Android 7.0 Nougat
78
+ }
79
+ /**
80
+ * Get target SDK for a given year
81
+ */
82
+ export function getTargetSdkForYear(year) {
83
+ // By default, target the latest stable SDK
84
+ if (year >= 2024) {
85
+ return 35; // Android 15
86
+ }
87
+ else if (year >= 2023) {
88
+ return 34; // Android 14
89
+ }
90
+ else if (year >= 2022) {
91
+ return 33; // Android 13
92
+ }
93
+ else {
94
+ return 32; // Android 12L
95
+ }
96
+ }
97
+ export const TEMPLATE_CONFIGS = {
98
+ 'kotlin-compose': {
99
+ language: 'kotlin',
100
+ uiFramework: 'compose',
101
+ minSdk: 31,
102
+ targetSdk: 36,
103
+ compileSdk: 36,
104
+ kotlinVersion: GRADLE_VERSIONS.KOTLIN,
105
+ agpVersion: GRADLE_VERSIONS.AGP,
106
+ gradleVersion: GRADLE_VERSIONS.GRADLE,
107
+ composeEnabled: true
108
+ },
109
+ 'kotlin-xml': {
110
+ language: 'kotlin',
111
+ uiFramework: 'xml',
112
+ minSdk: 31,
113
+ targetSdk: 36,
114
+ compileSdk: 36,
115
+ kotlinVersion: GRADLE_VERSIONS.KOTLIN,
116
+ agpVersion: GRADLE_VERSIONS.AGP,
117
+ gradleVersion: GRADLE_VERSIONS.GRADLE,
118
+ composeEnabled: false
119
+ },
120
+ 'java-xml': {
121
+ language: 'java',
122
+ uiFramework: 'xml',
123
+ minSdk: 31,
124
+ targetSdk: 36,
125
+ compileSdk: 36,
126
+ kotlinVersion: '', // Not used for Java
127
+ agpVersion: GRADLE_VERSIONS.AGP,
128
+ gradleVersion: GRADLE_VERSIONS.GRADLE,
129
+ composeEnabled: false
130
+ },
131
+ 'native-cpp': {
132
+ language: 'kotlin',
133
+ uiFramework: 'xml',
134
+ minSdk: 31,
135
+ targetSdk: 36,
136
+ compileSdk: 36,
137
+ kotlinVersion: GRADLE_VERSIONS.KOTLIN,
138
+ agpVersion: GRADLE_VERSIONS.AGP,
139
+ gradleVersion: GRADLE_VERSIONS.GRADLE,
140
+ composeEnabled: false,
141
+ ndkVersion: GRADLE_VERSIONS.NDK
142
+ }
143
+ };
144
+ /**
145
+ * Get template configuration
146
+ */
147
+ export function getTemplateConfig(template) {
148
+ const config = TEMPLATE_CONFIGS[template];
149
+ return config ?? TEMPLATE_CONFIGS['kotlin-xml'];
150
+ }
151
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Context builder for generating Android project context
3
+ */
4
+ import type { TemplateType, TemplateContext, ProjectFeatures } from './types.js';
5
+ /**
6
+ * Build default context from basic parameters
7
+ */
8
+ export declare function buildDefaultProjectContext(appName: string, packageName: string, projectDirectory: string, template: TemplateType, features?: Partial<ProjectFeatures>, minSdk?: number, targetSdk?: number): Omit<TemplateContext, 'packagePath' | 'appNameSnake' | 'appNameKebab' | 'appNamePascal' | 'appNameCamel' | 'appNameLower' | 'year' | 'generatorVersion'>;
9
+ /**
10
+ * Build full template context with all derived values
11
+ */
12
+ export declare function buildTemplateContext(context: {
13
+ appName: string;
14
+ packageName: string;
15
+ projectDirectory: string;
16
+ template: string;
17
+ uiFramework: string;
18
+ language: 'kotlin' | 'java';
19
+ android: {
20
+ minSdk: number;
21
+ targetSdk: number;
22
+ compileSdk: number;
23
+ };
24
+ gradle: {
25
+ agpVersion: string;
26
+ gradleVersion: string;
27
+ kotlinVersion?: string;
28
+ composeCompilerVersion?: string;
29
+ composeBomVersion?: string;
30
+ };
31
+ features: Record<string, boolean>;
32
+ nativeCpp?: {
33
+ cppStandard: string;
34
+ ndkVersion?: string;
35
+ stlType?: string;
36
+ abiFilters?: string[];
37
+ };
38
+ year?: string;
39
+ }): TemplateContext;
40
+ /**
41
+ * Validate context has all required fields
42
+ */
43
+ export declare function validateContext(context: Partial<TemplateContext>): {
44
+ valid: boolean;
45
+ errors: string[];
46
+ };
47
+ //# sourceMappingURL=context.d.ts.map