appshot-cli 0.2.2 → 0.4.0

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 (46) hide show
  1. package/README.md +1329 -589
  2. package/dist/cli.js +5 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/build.d.ts.map +1 -1
  5. package/dist/commands/build.js +11 -4
  6. package/dist/commands/build.js.map +1 -1
  7. package/dist/commands/caption.d.ts.map +1 -1
  8. package/dist/commands/caption.js +74 -2
  9. package/dist/commands/caption.js.map +1 -1
  10. package/dist/commands/fonts.d.ts +3 -0
  11. package/dist/commands/fonts.d.ts.map +1 -0
  12. package/dist/commands/fonts.js +384 -0
  13. package/dist/commands/fonts.js.map +1 -0
  14. package/dist/commands/localize.d.ts.map +1 -1
  15. package/dist/commands/localize.js +150 -14
  16. package/dist/commands/localize.js.map +1 -1
  17. package/dist/commands/migrate.d.ts +3 -0
  18. package/dist/commands/migrate.d.ts.map +1 -0
  19. package/dist/commands/migrate.js +123 -0
  20. package/dist/commands/migrate.js.map +1 -0
  21. package/dist/commands/style.d.ts.map +1 -1
  22. package/dist/commands/style.js +92 -1
  23. package/dist/commands/style.js.map +1 -1
  24. package/dist/core/compose.d.ts +4 -0
  25. package/dist/core/compose.d.ts.map +1 -1
  26. package/dist/core/compose.js +102 -9
  27. package/dist/core/compose.js.map +1 -1
  28. package/dist/services/fonts.d.ts +71 -0
  29. package/dist/services/fonts.d.ts.map +1 -0
  30. package/dist/services/fonts.js +314 -0
  31. package/dist/services/fonts.js.map +1 -0
  32. package/dist/services/translation.d.ts +18 -0
  33. package/dist/services/translation.d.ts.map +1 -0
  34. package/dist/services/translation.js +201 -0
  35. package/dist/services/translation.js.map +1 -0
  36. package/dist/types/ai.d.ts +25 -0
  37. package/dist/types/ai.d.ts.map +1 -0
  38. package/dist/types/ai.js +73 -0
  39. package/dist/types/ai.js.map +1 -0
  40. package/dist/types.d.ts +2 -0
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/utils/language.d.ts +32 -0
  43. package/dist/utils/language.d.ts.map +1 -0
  44. package/dist/utils/language.js +103 -0
  45. package/dist/utils/language.js.map +1 -0
  46. package/package.json +3 -1
@@ -0,0 +1,25 @@
1
+ export type OpenAIModel = 'gpt-4o' | 'gpt-4o-mini' | 'gpt-4-turbo' | 'gpt-5' | 'gpt-5-mini' | 'gpt-5-nano' | 'o1' | 'o1-mini' | 'o3' | 'o3-mini';
2
+ export interface ModelConfig {
3
+ model: OpenAIModel;
4
+ maxTokensParam: 'max_tokens' | 'max_completion_tokens';
5
+ maxTokens: number;
6
+ temperature?: number;
7
+ contextWindow: number;
8
+ }
9
+ export declare const MODEL_CONFIGS: Record<OpenAIModel, ModelConfig>;
10
+ export interface TranslationOptions {
11
+ text: string;
12
+ targetLanguages: string[];
13
+ model?: OpenAIModel;
14
+ systemPrompt?: string;
15
+ }
16
+ export interface TranslationResult {
17
+ [lang: string]: string;
18
+ }
19
+ export interface AIConfig {
20
+ defaultModel: OpenAIModel;
21
+ temperature?: number;
22
+ systemPrompt?: string;
23
+ cache?: boolean;
24
+ }
25
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/types/ai.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,aAAa,GACb,aAAa,GACb,OAAO,GACP,YAAY,GACZ,YAAY,GACZ,IAAI,GACJ,SAAS,GACT,IAAI,GACJ,SAAS,CAAC;AAEd,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,EAAE,YAAY,GAAG,uBAAuB,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAuE1D,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
@@ -0,0 +1,73 @@
1
+ export const MODEL_CONFIGS = {
2
+ 'gpt-4o': {
3
+ model: 'gpt-4o',
4
+ maxTokensParam: 'max_tokens',
5
+ maxTokens: 16384,
6
+ temperature: 0.3,
7
+ contextWindow: 128000
8
+ },
9
+ 'gpt-4o-mini': {
10
+ model: 'gpt-4o-mini',
11
+ maxTokensParam: 'max_tokens',
12
+ maxTokens: 16384,
13
+ temperature: 0.3,
14
+ contextWindow: 128000
15
+ },
16
+ 'gpt-4-turbo': {
17
+ model: 'gpt-4-turbo',
18
+ maxTokensParam: 'max_tokens',
19
+ maxTokens: 4096,
20
+ temperature: 0.3,
21
+ contextWindow: 128000
22
+ },
23
+ 'gpt-5': {
24
+ model: 'gpt-5',
25
+ maxTokensParam: 'max_completion_tokens',
26
+ maxTokens: 16384,
27
+ temperature: 1, // GPT-5 models have fixed temperature
28
+ contextWindow: 200000
29
+ },
30
+ 'gpt-5-mini': {
31
+ model: 'gpt-5-mini',
32
+ maxTokensParam: 'max_completion_tokens',
33
+ maxTokens: 8192,
34
+ temperature: 1, // GPT-5 models have fixed temperature
35
+ contextWindow: 128000
36
+ },
37
+ 'gpt-5-nano': {
38
+ model: 'gpt-5-nano',
39
+ maxTokensParam: 'max_completion_tokens',
40
+ maxTokens: 4096,
41
+ temperature: 1, // GPT-5 models have fixed temperature
42
+ contextWindow: 64000
43
+ },
44
+ 'o1': {
45
+ model: 'o1',
46
+ maxTokensParam: 'max_completion_tokens',
47
+ maxTokens: 100000,
48
+ temperature: 1, // o1 models have fixed temperature
49
+ contextWindow: 200000
50
+ },
51
+ 'o1-mini': {
52
+ model: 'o1-mini',
53
+ maxTokensParam: 'max_completion_tokens',
54
+ maxTokens: 65536,
55
+ temperature: 1,
56
+ contextWindow: 128000
57
+ },
58
+ 'o3': {
59
+ model: 'o3',
60
+ maxTokensParam: 'max_completion_tokens',
61
+ maxTokens: 100000,
62
+ temperature: 1,
63
+ contextWindow: 200000
64
+ },
65
+ 'o3-mini': {
66
+ model: 'o3-mini',
67
+ maxTokensParam: 'max_completion_tokens',
68
+ maxTokens: 65536,
69
+ temperature: 1,
70
+ contextWindow: 128000
71
+ }
72
+ };
73
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/types/ai.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,aAAa,GAAqC;IAC7D,QAAQ,EAAE;QACR,KAAK,EAAE,QAAQ;QACf,cAAc,EAAE,YAAY;QAC5B,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,GAAG;QAChB,aAAa,EAAE,MAAM;KACtB;IACD,aAAa,EAAE;QACb,KAAK,EAAE,aAAa;QACpB,cAAc,EAAE,YAAY;QAC5B,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,GAAG;QAChB,aAAa,EAAE,MAAM;KACtB;IACD,aAAa,EAAE;QACb,KAAK,EAAE,aAAa;QACpB,cAAc,EAAE,YAAY;QAC5B,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,GAAG;QAChB,aAAa,EAAE,MAAM;KACtB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO;QACd,cAAc,EAAE,uBAAuB;QACvC,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,CAAC,EAAE,sCAAsC;QACtD,aAAa,EAAE,MAAM;KACtB;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,YAAY;QACnB,cAAc,EAAE,uBAAuB;QACvC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,EAAE,sCAAsC;QACtD,aAAa,EAAE,MAAM;KACtB;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,YAAY;QACnB,cAAc,EAAE,uBAAuB;QACvC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,CAAC,EAAE,sCAAsC;QACtD,aAAa,EAAE,KAAK;KACrB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,uBAAuB;QACvC,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,CAAC,EAAE,mCAAmC;QACnD,aAAa,EAAE,MAAM;KACtB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,SAAS;QAChB,cAAc,EAAE,uBAAuB;QACvC,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,MAAM;KACtB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,uBAAuB;QACvC,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,MAAM;KACtB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,SAAS;QAChB,cAAc,EAAE,uBAAuB;QACvC,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,MAAM;KACtB;CACF,CAAC"}
package/dist/types.d.ts CHANGED
@@ -27,6 +27,7 @@ export interface DeviceStyleConfig {
27
27
  captionSize?: number;
28
28
  captionPosition?: 'above' | 'overlay';
29
29
  captionBox?: CaptionBoxConfig;
30
+ captionFont?: string;
30
31
  }
31
32
  export interface DeviceConfig extends DeviceStyleConfig {
32
33
  input: string;
@@ -45,6 +46,7 @@ export interface AppshotConfig {
45
46
  devices: {
46
47
  [key: string]: DeviceConfig;
47
48
  };
49
+ defaultLanguage?: string;
48
50
  }
49
51
  export interface CaptionEntry {
50
52
  [lang: string]: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,32 @@
1
+ import type { CaptionsFile, AppshotConfig } from '../types.js';
2
+ /**
3
+ * Get the system's default language code
4
+ * Uses Intl API first, then environment variables, finally defaults to 'en'
5
+ */
6
+ export declare function getSystemLanguage(): string;
7
+ /**
8
+ * Detect available languages from caption structure
9
+ * Returns empty array for simple string captions
10
+ */
11
+ export declare function detectLanguagesFromCaptions(captions: CaptionsFile): string[];
12
+ /**
13
+ * Resolve which languages to build based on priority:
14
+ * 1. CLI --langs flag (highest priority)
15
+ * 2. Languages detected from caption objects
16
+ * 3. Config defaultLanguage setting
17
+ * 4. System detected language
18
+ * 5. Fallback to 'en'
19
+ */
20
+ export declare function resolveLanguages(cliLangs: string[] | undefined, captions: CaptionsFile, config: AppshotConfig): {
21
+ languages: string[];
22
+ source: string;
23
+ };
24
+ /**
25
+ * Validate language code format (basic ISO 639-1 validation)
26
+ */
27
+ export declare function isValidLanguageCode(code: string): boolean;
28
+ /**
29
+ * Normalize language code to lowercase, preserving region if present
30
+ */
31
+ export declare function normalizeLanguageCode(code: string): string;
32
+ //# sourceMappingURL=language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/utils/language.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAoB1C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAW5E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9B,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,aAAa,GACpB;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAwCzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO1D"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Get the system's default language code
3
+ * Uses Intl API first, then environment variables, finally defaults to 'en'
4
+ */
5
+ export function getSystemLanguage() {
6
+ try {
7
+ // Try Intl API first (most reliable in Node.js)
8
+ const locale = Intl.DateTimeFormat().resolvedOptions().locale;
9
+ // Extract language code (e.g., 'en' from 'en-US')
10
+ return locale.split('-')[0].toLowerCase();
11
+ }
12
+ catch {
13
+ // Fall back to environment variables
14
+ const envLang = process.env.LANG || process.env.LC_ALL || process.env.LC_MESSAGES || '';
15
+ if (envLang) {
16
+ // Extract language code from POSIX locale (e.g., 'en' from 'en_US.UTF-8')
17
+ const match = envLang.match(/^([a-z]{2})/i);
18
+ if (match) {
19
+ return match[1].toLowerCase();
20
+ }
21
+ }
22
+ // Default to English
23
+ return 'en';
24
+ }
25
+ }
26
+ /**
27
+ * Detect available languages from caption structure
28
+ * Returns empty array for simple string captions
29
+ */
30
+ export function detectLanguagesFromCaptions(captions) {
31
+ const languages = new Set();
32
+ for (const [_, value] of Object.entries(captions)) {
33
+ if (typeof value === 'object' && value !== null) {
34
+ // Caption entry with language keys
35
+ Object.keys(value).forEach(lang => languages.add(lang));
36
+ }
37
+ }
38
+ return Array.from(languages).sort();
39
+ }
40
+ /**
41
+ * Resolve which languages to build based on priority:
42
+ * 1. CLI --langs flag (highest priority)
43
+ * 2. Languages detected from caption objects
44
+ * 3. Config defaultLanguage setting
45
+ * 4. System detected language
46
+ * 5. Fallback to 'en'
47
+ */
48
+ export function resolveLanguages(cliLangs, captions, config) {
49
+ // Priority 1: CLI languages
50
+ if (cliLangs && cliLangs.length > 0) {
51
+ return {
52
+ languages: cliLangs,
53
+ source: 'command line'
54
+ };
55
+ }
56
+ // Priority 2: Detect from captions
57
+ const captionLangs = detectLanguagesFromCaptions(captions);
58
+ if (captionLangs.length > 0) {
59
+ return {
60
+ languages: captionLangs,
61
+ source: 'caption files'
62
+ };
63
+ }
64
+ // Priority 3: Config default language
65
+ if (config.defaultLanguage) {
66
+ return {
67
+ languages: [config.defaultLanguage],
68
+ source: 'config setting'
69
+ };
70
+ }
71
+ // Priority 4: System language
72
+ const systemLang = getSystemLanguage();
73
+ if (systemLang !== 'en') {
74
+ return {
75
+ languages: [systemLang],
76
+ source: `system locale (${systemLang.toUpperCase()})`
77
+ };
78
+ }
79
+ // Priority 5: Fallback
80
+ return {
81
+ languages: ['en'],
82
+ source: 'default'
83
+ };
84
+ }
85
+ /**
86
+ * Validate language code format (basic ISO 639-1 validation)
87
+ */
88
+ export function isValidLanguageCode(code) {
89
+ // Basic validation: 2-3 letter codes, optionally with region (e.g., zh-CN)
90
+ return /^[a-z]{2,3}(-[A-Z]{2})?$/.test(code);
91
+ }
92
+ /**
93
+ * Normalize language code to lowercase, preserving region if present
94
+ */
95
+ export function normalizeLanguageCode(code) {
96
+ const parts = code.split('-');
97
+ if (parts.length === 2) {
98
+ // Preserve format like zh-CN
99
+ return `${parts[0].toLowerCase()}-${parts[1].toUpperCase()}`;
100
+ }
101
+ return code.toLowerCase();
102
+ }
103
+ //# sourceMappingURL=language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/utils/language.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appshot-cli",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "description": "Generate App Store–ready screenshots with frames, gradients, and captions.",
5
5
  "bin": {
6
6
  "appshot": "bin/appshot.js"
@@ -18,10 +18,12 @@
18
18
  "clean:all": "rm -rf final/ dist/ .appshot/"
19
19
  },
20
20
  "dependencies": {
21
+ "@inquirer/prompts": "^7.8.3",
21
22
  "commander": "^12.0.0",
22
23
  "fuzzy": "^0.1.3",
23
24
  "inquirer": "^12.0.0",
24
25
  "inquirer-autocomplete-standalone": "^0.8.1",
26
+ "openai": "^5.13.1",
25
27
  "picocolors": "^1.0.0",
26
28
  "sharp": "^0.33.5"
27
29
  },