appshot-cli 0.8.7 → 0.9.1

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 (65) hide show
  1. package/README.md +784 -15
  2. package/dist/cli.js +24 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/build.d.ts.map +1 -1
  5. package/dist/commands/build.js +16 -2
  6. package/dist/commands/build.js.map +1 -1
  7. package/dist/commands/export.d.ts +3 -0
  8. package/dist/commands/export.d.ts.map +1 -0
  9. package/dist/commands/export.js +382 -0
  10. package/dist/commands/export.js.map +1 -0
  11. package/dist/commands/order.d.ts +3 -0
  12. package/dist/commands/order.d.ts.map +1 -0
  13. package/dist/commands/order.js +321 -0
  14. package/dist/commands/order.js.map +1 -0
  15. package/dist/commands/preset.d.ts +5 -0
  16. package/dist/commands/preset.d.ts.map +1 -0
  17. package/dist/commands/preset.js +191 -0
  18. package/dist/commands/preset.js.map +1 -0
  19. package/dist/commands/quickstart.d.ts +3 -0
  20. package/dist/commands/quickstart.d.ts.map +1 -0
  21. package/dist/commands/quickstart.js +326 -0
  22. package/dist/commands/quickstart.js.map +1 -0
  23. package/dist/commands/style.d.ts.map +1 -1
  24. package/dist/commands/style.js +98 -0
  25. package/dist/commands/style.js.map +1 -1
  26. package/dist/commands/template.d.ts +3 -0
  27. package/dist/commands/template.d.ts.map +1 -0
  28. package/dist/commands/template.js +399 -0
  29. package/dist/commands/template.js.map +1 -0
  30. package/dist/core/compose.d.ts +16 -0
  31. package/dist/core/compose.d.ts.map +1 -1
  32. package/dist/core/compose.js +342 -83
  33. package/dist/core/compose.js.map +1 -1
  34. package/dist/services/doctor.js +1 -1
  35. package/dist/services/export-validator.d.ts +23 -0
  36. package/dist/services/export-validator.d.ts.map +1 -0
  37. package/dist/services/export-validator.js +209 -0
  38. package/dist/services/export-validator.js.map +1 -0
  39. package/dist/services/fastlane-config-generator.d.ts +17 -0
  40. package/dist/services/fastlane-config-generator.d.ts.map +1 -0
  41. package/dist/services/fastlane-config-generator.js +343 -0
  42. package/dist/services/fastlane-config-generator.js.map +1 -0
  43. package/dist/services/fastlane-language-mapper.d.ts +33 -0
  44. package/dist/services/fastlane-language-mapper.d.ts.map +1 -0
  45. package/dist/services/fastlane-language-mapper.js +167 -0
  46. package/dist/services/fastlane-language-mapper.js.map +1 -0
  47. package/dist/services/screenshot-order.d.ts +41 -0
  48. package/dist/services/screenshot-order.d.ts.map +1 -0
  49. package/dist/services/screenshot-order.js +211 -0
  50. package/dist/services/screenshot-order.js.map +1 -0
  51. package/dist/services/screenshot-organizer.d.ts +44 -0
  52. package/dist/services/screenshot-organizer.d.ts.map +1 -0
  53. package/dist/services/screenshot-organizer.js +234 -0
  54. package/dist/services/screenshot-organizer.js.map +1 -0
  55. package/dist/templates/registry.d.ts +73 -0
  56. package/dist/templates/registry.d.ts.map +1 -0
  57. package/dist/templates/registry.js +724 -0
  58. package/dist/templates/registry.js.map +1 -0
  59. package/dist/types.d.ts +15 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/utils/validation.d.ts +36 -0
  62. package/dist/utils/validation.d.ts.map +1 -0
  63. package/dist/utils/validation.js +143 -0
  64. package/dist/utils/validation.js.map +1 -0
  65. package/package.json +3 -2
@@ -0,0 +1,399 @@
1
+ import { Command } from 'commander';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import pc from 'picocolors';
5
+ import inquirer from 'inquirer';
6
+ import { loadConfig } from '../core/files.js';
7
+ import { templates, getTemplate, applyTemplateToConfig, getTemplateCaptionSuggestions, getTemplateCategories } from '../templates/registry.js';
8
+ import { validateTemplateId, sanitizeCaption, validateJson } from '../utils/validation.js';
9
+ export default function templateCmd() {
10
+ const cmd = new Command('template')
11
+ .description('Apply professional screenshot templates for quick App Store setup')
12
+ .argument('[template]', 'template ID to apply (e.g., modern, minimal, bold)')
13
+ .option('--list', 'list all available templates')
14
+ .option('--preview <id>', 'preview template configuration')
15
+ .option('--caption <text>', 'add a single caption to all screenshots')
16
+ .option('--captions <json>', 'add multiple captions as JSON')
17
+ .option('--device <name>', 'apply template to specific device only')
18
+ .option('--no-backup', 'skip creating backup of current config')
19
+ .option('--dry-run', 'preview changes without applying')
20
+ .addHelpText('after', `
21
+ ${pc.bold('Available Templates:')}
22
+ ${pc.cyan('modern')} - Eye-catching gradient with floating device
23
+ ${pc.cyan('minimal')} - Soft pastel background with elegant typography
24
+ ${pc.cyan('bold')} - Dark dramatic gradient with overlay captions
25
+ ${pc.cyan('elegant')} - Sophisticated monochrome design
26
+ ${pc.cyan('showcase')} - Custom backgrounds with partial frames
27
+ ${pc.cyan('playful')} - Bright, fun gradients for games
28
+ ${pc.cyan('corporate')} - Clean, professional for business apps
29
+
30
+ ${pc.bold('Examples:')}
31
+ ${pc.dim('# Apply a template')}
32
+ $ appshot template modern
33
+
34
+ ${pc.dim('# Apply with caption')}
35
+ $ appshot template minimal --caption "Beautiful & Simple"
36
+
37
+ ${pc.dim('# List all templates')}
38
+ $ appshot template --list
39
+
40
+ ${pc.dim('# Preview template settings')}
41
+ $ appshot template --preview bold
42
+
43
+ ${pc.dim('# Apply to specific device')}
44
+ $ appshot template elegant --device iphone
45
+
46
+ ${pc.bold('Quick Start:')}
47
+ $ appshot template modern --caption "Your App Name"
48
+ $ appshot build
49
+
50
+ ${pc.bold('Output:')}
51
+ Updates ${pc.cyan('.appshot/config.json')} with template settings`)
52
+ .action(async (templateId, opts) => {
53
+ try {
54
+ // List templates
55
+ if (opts.list) {
56
+ listTemplates();
57
+ return;
58
+ }
59
+ // Preview template
60
+ if (opts.preview) {
61
+ if (!validateTemplateId(opts.preview)) {
62
+ console.error(pc.red(`Template "${opts.preview}" not found`));
63
+ console.log(pc.dim('Run "appshot template --list" to see available templates'));
64
+ process.exit(1);
65
+ }
66
+ previewTemplate(opts.preview);
67
+ return;
68
+ }
69
+ // Interactive selection if no template specified
70
+ if (!templateId) {
71
+ templateId = await selectTemplate();
72
+ }
73
+ // Validate template
74
+ if (!validateTemplateId(templateId)) {
75
+ console.error(pc.red(`Template "${templateId}" not found`));
76
+ console.log(pc.dim('Run "appshot template --list" to see available templates'));
77
+ process.exit(1);
78
+ }
79
+ const template = getTemplate(templateId);
80
+ if (!template) {
81
+ // This shouldn't happen after validation, but keep as safety
82
+ console.error(pc.red(`Template "${templateId}" not found`));
83
+ process.exit(1);
84
+ }
85
+ // Load current configuration
86
+ const configPath = path.join(process.cwd(), '.appshot', 'config.json');
87
+ let config;
88
+ try {
89
+ config = await loadConfig();
90
+ }
91
+ catch {
92
+ console.log(pc.yellow('No existing config found, creating new one'));
93
+ config = createDefaultConfig();
94
+ }
95
+ // Backup current config
96
+ if (!opts.noBackup && await fileExists(configPath)) {
97
+ const backupPath = configPath.replace('.json', '.backup.json');
98
+ await fs.copyFile(configPath, backupPath);
99
+ console.log(pc.dim(`Backup saved to ${path.basename(backupPath)}`));
100
+ }
101
+ // Apply template
102
+ const newConfig = applyTemplateToConfig(templateId, config);
103
+ // Apply to specific device only if requested
104
+ if (opts.device && newConfig.devices) {
105
+ const deviceConfig = newConfig.devices[opts.device];
106
+ if (!deviceConfig) {
107
+ console.error(pc.red(`Device "${opts.device}" not found in configuration`));
108
+ process.exit(1);
109
+ }
110
+ // Keep original config but update only specified device
111
+ config.devices = config.devices || {};
112
+ config.devices[opts.device] = {
113
+ ...config.devices[opts.device],
114
+ ...deviceConfig
115
+ };
116
+ }
117
+ else {
118
+ config = newConfig;
119
+ }
120
+ // Add captions if provided
121
+ if (opts.caption || opts.captions) {
122
+ await addCaptions(config, opts.caption, opts.captions);
123
+ }
124
+ // Dry run mode
125
+ if (opts.dryRun) {
126
+ console.log(pc.bold('\n🔍 Dry Run - Configuration Preview:\n'));
127
+ console.log(JSON.stringify(config, null, 2));
128
+ console.log(pc.dim('\nNo changes made. Remove --dry-run to apply template.'));
129
+ return;
130
+ }
131
+ // Save configuration
132
+ await fs.mkdir(path.dirname(configPath), { recursive: true });
133
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2));
134
+ // Success message
135
+ console.log('\n' + pc.green('✨'), pc.bold(`Template "${template.name}" applied successfully!`));
136
+ console.log(pc.dim(template.description));
137
+ // Show what was configured
138
+ console.log('\n' + pc.cyan('Template Configuration:'));
139
+ console.log(` Background: ${template.background.mode === 'gradient' ? 'Gradient' : 'Image/Auto'}`);
140
+ console.log(` Device Scale: ${Math.round(template.deviceStyle.frameScale * 100)}%`);
141
+ console.log(` Caption Position: ${template.captionStyle.position || 'above'}`);
142
+ console.log(` Font: ${template.captionStyle.font}`);
143
+ if (template.deviceOverrides && Object.keys(template.deviceOverrides).length > 0) {
144
+ console.log(` Device Optimizations: ${Object.keys(template.deviceOverrides).join(', ')}`);
145
+ }
146
+ // Suggest next steps
147
+ console.log('\n' + pc.bold('Next Steps:'));
148
+ console.log(' 1. Add your screenshots to', pc.cyan('screenshots/'));
149
+ if (!opts.caption && !opts.captions) {
150
+ console.log(' 2. Add captions:', pc.cyan('appshot caption --device iphone'));
151
+ console.log(' 3. Build screenshots:', pc.cyan('appshot build'));
152
+ }
153
+ else {
154
+ console.log(' 2. Build screenshots:', pc.cyan('appshot build'));
155
+ }
156
+ // Show caption suggestions
157
+ if (!opts.caption && !opts.captions) {
158
+ const suggestions = getTemplateCaptionSuggestions(templateId);
159
+ console.log('\n' + pc.dim('Caption suggestions for this template:'));
160
+ console.log(pc.dim(` Hero: "${suggestions.hero[0]}"`));
161
+ console.log(pc.dim(` Feature: "${suggestions.features[0]}"`));
162
+ }
163
+ }
164
+ catch (error) {
165
+ console.error(pc.red('Error:'), error instanceof Error ? error.message : String(error));
166
+ process.exit(1);
167
+ }
168
+ });
169
+ return cmd;
170
+ }
171
+ /**
172
+ * List all available templates
173
+ */
174
+ function listTemplates() {
175
+ console.log(pc.bold('\n📱 Screenshot Templates\n'));
176
+ const categories = getTemplateCategories();
177
+ for (const category of categories) {
178
+ console.log(pc.cyan(category.toUpperCase()));
179
+ console.log(pc.dim('─'.repeat(50)));
180
+ const categoryTemplates = templates.filter(t => t.category === category);
181
+ for (const template of categoryTemplates) {
182
+ console.log(`\n ${pc.bold(template.id)}`);
183
+ console.log(` ${template.name}`);
184
+ console.log(` ${pc.dim(template.description)}`);
185
+ // Show key features
186
+ const features = [];
187
+ if (template.background.mode === 'gradient') {
188
+ features.push('Gradient');
189
+ }
190
+ else if (template.background.mode === 'auto') {
191
+ features.push('Auto Background');
192
+ }
193
+ if (template.deviceStyle.partialFrame) {
194
+ features.push('Partial Frame');
195
+ }
196
+ if (template.captionStyle.position === 'overlay') {
197
+ features.push('Overlay Caption');
198
+ }
199
+ else if (template.captionStyle.position === 'below') {
200
+ features.push('Bottom Caption');
201
+ }
202
+ if (features.length > 0) {
203
+ console.log(` ${pc.green('Features:')} ${features.join(', ')}`);
204
+ }
205
+ }
206
+ console.log();
207
+ }
208
+ console.log(pc.dim('─'.repeat(50)));
209
+ console.log(pc.dim('\nUse "appshot template <id>" to apply a template'));
210
+ console.log(pc.dim('Use "appshot template --preview <id>" for detailed view'));
211
+ }
212
+ /**
213
+ * Preview template configuration
214
+ */
215
+ function previewTemplate(templateId) {
216
+ const template = getTemplate(templateId);
217
+ if (!template) {
218
+ console.error(pc.red(`Template "${templateId}" not found`));
219
+ process.exit(1);
220
+ }
221
+ console.log(pc.bold(`\n📋 Template: ${template.name}\n`));
222
+ console.log(pc.dim(template.description));
223
+ console.log();
224
+ // Background
225
+ console.log(pc.cyan('Background:'));
226
+ if (template.background.mode === 'gradient' && template.background.gradient) {
227
+ console.log(` Type: Gradient (${template.background.gradient.direction})`);
228
+ console.log(` Colors: ${template.background.gradient.colors.join(' → ')}`);
229
+ }
230
+ else if (template.background.mode === 'auto') {
231
+ console.log(' Type: Auto-detect (looks for background.png)');
232
+ if (template.background.gradient) {
233
+ console.log(' Fallback: Gradient');
234
+ }
235
+ }
236
+ // Device Style
237
+ console.log('\n' + pc.cyan('Device Style:'));
238
+ console.log(` Scale: ${Math.round(template.deviceStyle.frameScale * 100)}%`);
239
+ console.log(` Position: ${typeof template.deviceStyle.framePosition === 'number'
240
+ ? `${template.deviceStyle.framePosition}% from top`
241
+ : template.deviceStyle.framePosition}`);
242
+ if (template.deviceStyle.partialFrame) {
243
+ console.log(` Partial Frame: Yes (${template.deviceStyle.frameOffset || 25}% cut)`);
244
+ }
245
+ // Caption Style
246
+ console.log('\n' + pc.cyan('Caption Style:'));
247
+ console.log(` Font: ${template.captionStyle.font}`);
248
+ console.log(` Size: ${template.captionStyle.fontsize}px`);
249
+ console.log(` Color: ${template.captionStyle.color}`);
250
+ console.log(` Position: ${template.captionStyle.position || 'above'}`);
251
+ if (template.captionStyle.background) {
252
+ console.log(` Background: ${template.captionStyle.background.color} (${Math.round((template.captionStyle.background.opacity || 1) * 100)}% opacity)`);
253
+ }
254
+ if (template.captionStyle.border) {
255
+ console.log(` Border: ${template.captionStyle.border.width || 1}px ${template.captionStyle.border.color || 'default'}`);
256
+ }
257
+ // Device Overrides
258
+ if (template.deviceOverrides && Object.keys(template.deviceOverrides).length > 0) {
259
+ console.log('\n' + pc.cyan('Device-Specific Settings:'));
260
+ for (const [device, override] of Object.entries(template.deviceOverrides)) {
261
+ const settings = [];
262
+ if (override.frameScale)
263
+ settings.push(`scale: ${Math.round(override.frameScale * 100)}%`);
264
+ if (override.captionSize)
265
+ settings.push(`font: ${override.captionSize}px`);
266
+ if (override.framePosition !== undefined)
267
+ settings.push(`position: ${override.framePosition}`);
268
+ console.log(` ${device}: ${settings.join(', ')}`);
269
+ }
270
+ }
271
+ // Caption Suggestions
272
+ const suggestions = getTemplateCaptionSuggestions(templateId);
273
+ console.log('\n' + pc.cyan('Caption Suggestions:'));
274
+ console.log(` Hero: "${suggestions.hero[0]}"`);
275
+ console.log(` Feature: "${suggestions.features[0]}"`);
276
+ console.log(` CTA: "${suggestions.cta[0]}"`);
277
+ console.log('\n' + pc.dim('─'.repeat(50)));
278
+ console.log(pc.green('Apply this template:'), pc.cyan(`appshot template ${templateId}`));
279
+ }
280
+ /**
281
+ * Interactive template selection
282
+ */
283
+ async function selectTemplate() {
284
+ console.log(pc.bold('\n🎨 Select a Screenshot Template\n'));
285
+ // Not used - choices are built in categorizedChoices below
286
+ // Add separators by category
287
+ const categorizedChoices = [];
288
+ const categories = getTemplateCategories();
289
+ for (const category of categories) {
290
+ categorizedChoices.push(new inquirer.Separator(`── ${category.toUpperCase()} ──`));
291
+ const categoryTemplates = templates.filter(t => t.category === category);
292
+ for (const template of categoryTemplates) {
293
+ categorizedChoices.push({
294
+ name: `${pc.bold(template.name)} - ${template.description}`,
295
+ value: template.id,
296
+ short: template.name
297
+ });
298
+ }
299
+ }
300
+ const answer = await inquirer.prompt([{
301
+ type: 'list',
302
+ name: 'template',
303
+ message: 'Choose a template:',
304
+ choices: categorizedChoices,
305
+ pageSize: 12
306
+ }]);
307
+ return answer.template;
308
+ }
309
+ /**
310
+ * Create default configuration
311
+ */
312
+ function createDefaultConfig() {
313
+ return {
314
+ output: './final',
315
+ frames: './frames',
316
+ devices: {
317
+ iphone: {
318
+ input: './screenshots/iphone',
319
+ resolution: '1290x2796',
320
+ autoFrame: true
321
+ },
322
+ ipad: {
323
+ input: './screenshots/ipad',
324
+ resolution: '2048x2732',
325
+ autoFrame: true
326
+ },
327
+ mac: {
328
+ input: './screenshots/mac',
329
+ resolution: '2880x1800',
330
+ autoFrame: true
331
+ },
332
+ watch: {
333
+ input: './screenshots/watch',
334
+ resolution: '410x502',
335
+ autoFrame: true
336
+ }
337
+ }
338
+ };
339
+ }
340
+ /**
341
+ * Add captions to configuration
342
+ */
343
+ async function addCaptions(config, singleCaption, captionsJson) {
344
+ const captionsDir = path.join(process.cwd(), '.appshot', 'captions');
345
+ await fs.mkdir(captionsDir, { recursive: true });
346
+ if (singleCaption) {
347
+ // Sanitize the caption
348
+ const sanitizedCaption = sanitizeCaption(singleCaption);
349
+ // Apply single caption to all devices
350
+ if (config.devices) {
351
+ for (const device of Object.keys(config.devices)) {
352
+ const captionFile = path.join(captionsDir, `${device}.json`);
353
+ // Load existing captions or create new
354
+ let captions = {};
355
+ try {
356
+ const existing = await fs.readFile(captionFile, 'utf-8');
357
+ captions = JSON.parse(existing);
358
+ }
359
+ catch {
360
+ // File doesn't exist yet
361
+ }
362
+ // Add caption to all screenshots (we'll use a generic key)
363
+ captions['default'] = sanitizedCaption;
364
+ await fs.writeFile(captionFile, JSON.stringify(captions, null, 2));
365
+ }
366
+ }
367
+ console.log(pc.dim(`Caption "${sanitizedCaption}" added to all devices`));
368
+ }
369
+ else if (captionsJson) {
370
+ // Parse and apply JSON captions
371
+ try {
372
+ const captions = validateJson(captionsJson);
373
+ if (config.devices) {
374
+ for (const device of Object.keys(config.devices)) {
375
+ const captionFile = path.join(captionsDir, `${device}.json`);
376
+ await fs.writeFile(captionFile, JSON.stringify(captions, null, 2));
377
+ }
378
+ }
379
+ console.log(pc.dim('Captions added from JSON'));
380
+ }
381
+ catch {
382
+ console.error(pc.red('Invalid JSON for captions'));
383
+ process.exit(1);
384
+ }
385
+ }
386
+ }
387
+ /**
388
+ * Check if file exists
389
+ */
390
+ async function fileExists(filePath) {
391
+ try {
392
+ await fs.access(filePath);
393
+ return true;
394
+ }
395
+ catch {
396
+ return false;
397
+ }
398
+ }
399
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,19 @@
1
1
  import type { GradientConfig, CaptionConfig, DeviceConfig, BackgroundConfig } from '../types.js';
2
+ export interface LayoutDebugInfo {
3
+ mode: 'above' | 'below' | 'overlay';
4
+ framePosition: string | number | undefined;
5
+ frameScale?: number | undefined;
6
+ deviceTop: number;
7
+ deviceBottom: number;
8
+ deviceHeight: number;
9
+ captionTop: number;
10
+ captionHeight: number;
11
+ marginTop?: number;
12
+ marginBottom?: number;
13
+ bottomSpacing?: number;
14
+ rectY?: number;
15
+ rectBottom?: number;
16
+ }
2
17
  export interface ComposeOptions {
3
18
  screenshot: Buffer;
4
19
  frame?: Buffer | null;
@@ -24,6 +39,7 @@ export interface ComposeOptions {
24
39
  outputWidth: number;
25
40
  outputHeight: number;
26
41
  verbose?: boolean;
42
+ onDebug?: (info: LayoutDebugInfo) => void;
27
43
  }
28
44
  /**
29
45
  * Compose a complete App Store screenshot with gradient, caption, and framed device
@@ -1 +1 @@
1
- {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/core/compose.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqIjG,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,CAAC,EAAE,MAAM,CAAC;YACV,CAAC,EAAE,MAAM,CAAC;YACV,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;QACjD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAm0BxF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;QACjD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFlB;AAqGD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB7H;AAED,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA0F1D"}
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/core/compose.ts"],"names":[],"mappings":"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"}