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.
- package/README.md +1329 -589
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +11 -4
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/caption.d.ts.map +1 -1
- package/dist/commands/caption.js +74 -2
- package/dist/commands/caption.js.map +1 -1
- package/dist/commands/fonts.d.ts +3 -0
- package/dist/commands/fonts.d.ts.map +1 -0
- package/dist/commands/fonts.js +384 -0
- package/dist/commands/fonts.js.map +1 -0
- package/dist/commands/localize.d.ts.map +1 -1
- package/dist/commands/localize.js +150 -14
- package/dist/commands/localize.js.map +1 -1
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +123 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/style.d.ts.map +1 -1
- package/dist/commands/style.js +92 -1
- package/dist/commands/style.js.map +1 -1
- package/dist/core/compose.d.ts +4 -0
- package/dist/core/compose.d.ts.map +1 -1
- package/dist/core/compose.js +102 -9
- package/dist/core/compose.js.map +1 -1
- package/dist/services/fonts.d.ts +71 -0
- package/dist/services/fonts.d.ts.map +1 -0
- package/dist/services/fonts.js +314 -0
- package/dist/services/fonts.js.map +1 -0
- package/dist/services/translation.d.ts +18 -0
- package/dist/services/translation.d.ts.map +1 -0
- package/dist/services/translation.js +201 -0
- package/dist/services/translation.js.map +1 -0
- package/dist/types/ai.d.ts +25 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js +73 -0
- package/dist/types/ai.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/language.d.ts +32 -0
- package/dist/utils/language.d.ts.map +1 -0
- package/dist/utils/language.js +103 -0
- package/dist/utils/language.js.map +1 -0
- 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"}
|
package/dist/types/ai.js
ADDED
|
@@ -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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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.
|
|
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
|
},
|