create-mendix-widget-gleam 2.0.18 → 2.0.21

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 +1 -1
  2. package/package.json +1 -1
  3. package/src/i18n.mjs +394 -334
  4. package/src/index.mjs +284 -231
  5. package/src/licenses.mjs +147 -0
  6. package/src/prompts.mjs +247 -142
  7. package/src/scaffold.mjs +108 -97
  8. package/src/templates/claude_md.mjs +3 -3
  9. package/src/templates/readme_md.mjs +10 -10
  10. package/template/gleam.toml +2 -2
  11. package/template/package.json +6 -6
  12. package/template/src/__WidgetName__.xml +1 -1
  13. package/template/src/package.xml +2 -2
  14. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@command.cache +0 -0
  15. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@cursor.cache +0 -0
  16. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@cursor.cache_meta +0 -0
  17. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@event.cache +0 -0
  18. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@internal@consts.cache +0 -0
  19. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@stdout.cache +0 -0
  20. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@style.cache +0 -0
  21. package/tui/build/dev/javascript/etch/_gleam_artefacts/etch@terminal.cache +0 -0
  22. package/tui/build/dev/javascript/etch/etch/event.mjs +36 -30
  23. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@application.cache +0 -0
  24. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@atom.cache +0 -0
  25. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@charlist.cache +0 -0
  26. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@node.cache +0 -0
  27. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@port.cache +0 -0
  28. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@process.cache +0 -0
  29. package/tui/build/dev/javascript/gleam_erlang/_gleam_artefacts/gleam@erlang@reference.cache +0 -0
  30. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@array.cache +0 -0
  31. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@promise.cache +0 -0
  32. package/tui/build/dev/javascript/gleam_javascript/_gleam_artefacts/gleam@javascript@symbol.cache +0 -0
  33. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache +0 -0
  34. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache +0 -0
  35. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache_inline +0 -0
  36. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache +0 -0
  37. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache +0 -0
  38. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache +0 -0
  39. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache +0 -0
  40. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache_meta +0 -0
  41. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache +0 -0
  42. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache +0 -0
  43. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache +0 -0
  44. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache +0 -0
  45. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache +0 -0
  46. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache +0 -0
  47. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache +0 -0
  48. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache +0 -0
  49. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache +0 -0
  50. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache_inline +0 -0
  51. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache +0 -0
  52. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache +0 -0
  53. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache_meta +0 -0
  54. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache +0 -0
  55. package/tui/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache +0 -0
  56. package/tui/build/dev/javascript/gleam_version +1 -1
  57. package/tui/build/dev/javascript/prelude.mjs +10 -26
  58. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui.cache +0 -0
  59. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui.cache_meta +0 -0
  60. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui@prompt.cache +0 -0
  61. package/tui/build/dev/javascript/tui/_gleam_artefacts/tui@prompt.cache_meta +0 -0
  62. package/tui/build/dev/javascript/tui/tui/prompt.mjs +713 -52
  63. package/tui/build/dev/javascript/tui/tui.mjs +438 -51
  64. package/tui/build/dev/javascript/tui/tui_ffi.mjs +12 -0
  65. package/template/LICENSE +0 -15
package/src/i18n.mjs CHANGED
@@ -1,334 +1,394 @@
1
- /**
2
- * i18n — CLI UI strings + template comment translations
3
- */
4
-
5
- export const LANG_CHOICES = ["en", "ko", "ja"];
6
-
7
- const LANG_LABELS = {
8
- en: "English",
9
- ko: "한국어",
10
- ja: "日本語",
11
- };
12
-
13
- export function getLangLabel(lang) {
14
- return LANG_LABELS[lang] ?? LANG_LABELS["en"];
15
- }
16
-
17
- // ---------------------------------------------------------------------------
18
- // CLI UI messages
19
- // ---------------------------------------------------------------------------
20
-
21
- const messages = {
22
- en: {
23
- // index.mjs
24
- "error.invalidName": "Error: Invalid project name.",
25
- "summary.title": "Project configuration:",
26
- "summary.directory": "Directory:",
27
- "summary.widgetName": "Widget name:",
28
- "summary.gleamModule": "Gleam module:",
29
- "summary.packageManager": "Package manager:",
30
- "summary.language": "Language:",
31
- "progress.generatingFiles": "Generating files...",
32
- "progress.filesCreated": "{count} files created",
33
- "progress.claudeMdCreated": "CLAUDE.md created",
34
- "progress.readmeCreated": "README.md created",
35
- "progress.gitInit": "Git repository initialized",
36
- "progress.gleamCompiling": "Compiling Gleam...",
37
- "progress.gleamCompiled": "Gleam compilation complete",
38
- "error.gleamCompileFail":
39
- " Gleam compilation failed. Run manually in the project directory:",
40
- "progress.depsInstalling": "Installing dependencies... ({pm})",
41
- "progress.depsInstalled": "Dependencies installed",
42
- "error.depsInstallFail":
43
- "⚠ Dependency installation failed. Run manually in the project directory:",
44
- "progress.playwrightInstalling": "Installing Playwright Chromium...",
45
- "progress.playwrightInstalled": "Playwright Chromium installed",
46
- "progress.playwrightExists": "Playwright Chromium already installed",
47
- "error.playwrightFail":
48
- "⚠ Playwright browser installation failed. Run manually in the project directory:",
49
- "progress.buildingWidget": "Building widget...",
50
- "progress.widgetBuilt": "Widget build complete",
51
- "error.buildFail":
52
- "⚠ Build failed. Run manually in the project directory:",
53
- "done.title": "Project created successfully!",
54
- "done.nextSteps": "Next steps:",
55
- "done.devServer": "# Start dev server",
56
- "done.prodBuild": "# Production build",
57
- "done.marketplace": "# Download Marketplace widgets",
58
-
59
- // prompts.mjs
60
- "prompt.projectName": "Project name:",
61
- "prompt.cancelled": "Cancelled.",
62
- "validate.nameRequired": "Please enter a project name.",
63
- "validate.needAlpha": "Must contain valid alphabetic characters.",
64
- "validate.invalidChars":
65
- "Must start with a letter and contain only letters, numbers, hyphens, or underscores.",
66
- "error.dirExists": "Error: Directory '{name}' already exists.",
67
- "prompt.pmSelect": "Select package manager:",
68
- "prompt.pmDetected": "detected: {detected}",
69
- "prompt.pmDetectedMarker": " detected",
70
- "prompt.pmChoose": "Choose (1-{count}, default: {default}):",
71
- },
72
-
73
- ko: {
74
- // index.mjs
75
- "error.invalidName": "오류: 유효하지 않은 프로젝트 이름입니다.",
76
- "summary.title": "프로젝트 설정:",
77
- "summary.directory": "디렉토리:",
78
- "summary.widgetName": "위젯 이름:",
79
- "summary.gleamModule": "Gleam 모듈:",
80
- "summary.packageManager": "패키지 매니저:",
81
- "summary.language": "언어:",
82
- "progress.generatingFiles": "파일 생성 중...",
83
- "progress.filesCreated": "{count}개 파일 생성 완료",
84
- "progress.claudeMdCreated": "CLAUDE.md 생성 완료",
85
- "progress.readmeCreated": "README.md 생성 완료",
86
- "progress.gitInit": "git 저장소 초기화 완료",
87
- "progress.gleamCompiling": "Gleam 컴파일 중...",
88
- "progress.gleamCompiled": "Gleam 컴파일 완료",
89
- "error.gleamCompileFail":
90
- " Gleam 컴파일 실패. 프로젝트 디렉토리에서 직접 실행하세요:",
91
- "progress.depsInstalling": "의존성 설치 중... ({pm})",
92
- "progress.depsInstalled": "의존성 설치 완료",
93
- "error.depsInstallFail":
94
- "⚠ 의존성 설치 실패. 프로젝트 디렉토리에서 직접 실행하세요:",
95
- "progress.playwrightInstalling": "Playwright Chromium 설치 중...",
96
- "progress.playwrightInstalled": "Playwright Chromium 설치 완료",
97
- "progress.playwrightExists": "Playwright Chromium 이미 설치됨",
98
- "error.playwrightFail":
99
- " Playwright 브라우저 설치 실패. 프로젝트 디렉토리에서 직접 실행하세요:",
100
- "progress.buildingWidget": "위젯 빌드 중...",
101
- "progress.widgetBuilt": "위젯 빌드 완료",
102
- "error.buildFail":
103
- " 빌드 실패. 프로젝트 디렉토리에서 직접 실행하세요:",
104
- "done.title": "프로젝트가 생성되었습니다!",
105
- "done.nextSteps": "다음 단계:",
106
- "done.devServer": "# 개발 서버 시작",
107
- "done.prodBuild": "# 프로덕션 빌드",
108
- "done.marketplace": "# Marketplace 위젯 다운로드",
109
-
110
- // prompts.mjs
111
- "prompt.projectName": "프로젝트 이름:",
112
- "prompt.cancelled": "취소되었습니다.",
113
- "validate.nameRequired": "프로젝트 이름을 입력해주세요.",
114
- "validate.needAlpha": "유효한 영문자를 포함해야 합니다.",
115
- "validate.invalidChars":
116
- "영문자로 시작해야 하며, 영문자/숫자/-/_ 만 사용 가능합니다.",
117
- "error.dirExists": "오류: '{name}' 디렉토리가 이미 존재합니다.",
118
- "prompt.pmSelect": "패키지 매니저 선택:",
119
- "prompt.pmDetected": "감지: {detected}",
120
- "prompt.pmDetectedMarker": "← 감지됨",
121
- "prompt.pmChoose": "선택 (1-{count}, 기본: {default}):",
122
- },
123
-
124
- ja: {
125
- // index.mjs
126
- "error.invalidName": "エラー: 無効なプロジェクト名です。",
127
- "summary.title": "プロジェクト設定:",
128
- "summary.directory": "ディレクトリ:",
129
- "summary.widgetName": "ウィジェット名:",
130
- "summary.gleamModule": "Gleamモジュール:",
131
- "summary.packageManager": "パッケージマネージャー:",
132
- "summary.language": "言語:",
133
- "progress.generatingFiles": "ファイル生成中...",
134
- "progress.filesCreated": "{count}個のファイル生成完了",
135
- "progress.claudeMdCreated": "CLAUDE.md 生成完了",
136
- "progress.readmeCreated": "README.md 生成完了",
137
- "progress.gitInit": "gitリポジトリ初期化完了",
138
- "progress.gleamCompiling": "Gleamコンパイル中...",
139
- "progress.gleamCompiled": "Gleamコンパイル完了",
140
- "error.gleamCompileFail":
141
- " Gleamコンパイル失敗。プロジェクトディレクトリで直接実行してください:",
142
- "progress.depsInstalling": "依存関係インストール中... ({pm})",
143
- "progress.depsInstalled": "依存関係インストール完了",
144
- "error.depsInstallFail":
145
- " 依存関係インストール失敗。プロジェクトディレクトリで直接実行してください:",
146
- "progress.playwrightInstalling": "Playwright Chromiumインストール中...",
147
- "progress.playwrightInstalled": "Playwright Chromiumインストール完了",
148
- "progress.playwrightExists": "Playwright Chromiumインストール済み",
149
- "error.playwrightFail":
150
- " Playwrightブラウザインストール失敗。プロジェクトディレクトリで直接実行してください:",
151
- "progress.buildingWidget": "ウィジェットビルド中...",
152
- "progress.widgetBuilt": "ウィジェットビルド完了",
153
- "error.buildFail":
154
- " ビルド失敗。プロジェクトディレクトリで直接実行してください:",
155
- "done.title": "プロジェクトが作成されました!",
156
- "done.nextSteps": "次のステップ:",
157
- "done.devServer": "# 開発サーバー起動",
158
- "done.prodBuild": "# プロダクションビルド",
159
- "done.marketplace": "# Marketplaceウィジェットダウンロード",
160
-
161
- // prompts.mjs
162
- "prompt.projectName": "プロジェクト名:",
163
- "prompt.cancelled": "キャンセルされました。",
164
- "validate.nameRequired": "プロジェクト名を入力してください。",
165
- "validate.needAlpha": "有効なアルファベットを含む必要があります。",
166
- "validate.invalidChars":
167
- "英字で始まり、英字/数字/-/_ のみ使用可能です。",
168
- "error.dirExists": "エラー: '{name}' ディレクトリは既に存在します。",
169
- "prompt.pmSelect": "パッケージマネージャー選択:",
170
- "prompt.pmDetected": "検出: {detected}",
171
- "prompt.pmDetectedMarker": "← 検出済み",
172
- "prompt.pmChoose": "選択 (1-{count}, デフォルト: {default}):",
173
- },
174
- };
175
-
176
- /**
177
- * Translate a CLI message key.
178
- * Supports {param} interpolation: t("en", "progress.filesCreated", { count: 5 })
179
- */
180
- export function t(lang, key, params = {}) {
181
- const msg = messages[lang]?.[key] ?? messages["en"][key] ?? key;
182
- return msg.replace(/\{(\w+)\}/g, (_, k) => params[k] ?? `{${k}}`);
183
- }
184
-
185
- // ---------------------------------------------------------------------------
186
- // Template file comments (for {{I18N:*}} placeholders)
187
- // ---------------------------------------------------------------------------
188
-
189
- const templateComments = {
190
- en: {
191
- // __widget_name__.gleam
192
- widget_main_1: '// Mendix Pluggable Widget - "Hello World"',
193
- widget_main_2:
194
- "// React functional component: fn(JsProps) -> ReactElement",
195
- widget_main_doc:
196
- "/// Main widget function - called by Mendix runtime as a React component",
197
-
198
- // editor_config.gleam
199
- editor_config_1: "// Mendix Studio Pro property panel configuration",
200
- editor_config_2: "// Defines getProperties, check, getPreview, etc.",
201
- editor_config_3: "// External types (JS objects passed by Mendix)",
202
- editor_config_doc:
203
- "/// Property panel configuration - controls widget property visibility in Studio Pro",
204
-
205
- // editor_preview.gleam
206
- editor_preview_1: "// Mendix Studio Pro design view preview",
207
- editor_preview_2:
208
- "// Renders the widget's visual preview in Studio Pro",
209
- editor_preview_doc:
210
- "/// Studio Pro design view preview - renders the widget's visual representation",
211
-
212
- // components/hello_world.gleam
213
- hello_world_1: "// Hello World component",
214
- hello_world_2:
215
- "// Shared between widget runtime and Studio Pro preview",
216
- hello_world_doc: "/// Render Hello World UI",
217
-
218
- // _gitignore
219
- gitignore_deps: "# Dependencies",
220
- gitignore_lockfiles: "# Package manager lock files",
221
- gitignore_pm_cache: "# Package manager cache/config",
222
- gitignore_gleam_build: "# Gleam compilation output",
223
- gitignore_mendix_build: "# Mendix widget build output",
224
- gitignore_env: "# Environment variables",
225
- gitignore_logs: "# Logs",
226
- gitignore_os: "# OS",
227
- gitignore_ide: "# IDE",
228
- gitignore_test_project: "# Mendix test project",
229
- gitignore_test_artifacts: "# Test artifacts",
230
- gitignore_bridge:
231
- "# Auto-generated bridge files (created/deleted by glendix at build time)",
232
- gitignore_ai: "# AI",
233
- gitignore_marketplace: "# Mendix marketplace cache/config",
234
- },
235
-
236
- ko: {
237
- // __widget_name__.gleam
238
- widget_main_1: '// Mendix Pluggable Widget - "Hello World"',
239
- widget_main_2:
240
- "// React 함수형 컴포넌트: fn(JsProps) -> ReactElement",
241
- widget_main_doc:
242
- "/// 위젯 메인 함수 - Mendix 런타임이 React 컴포넌트로 호출",
243
-
244
- // editor_config.gleam
245
- editor_config_1: "// Mendix Studio Pro 속성 패널 설정",
246
- editor_config_2: "// getProperties, check, getPreview 등을 정의",
247
- editor_config_3: "// 외부 타입 (Mendix가 전달하는 JS 객체)",
248
- editor_config_doc:
249
- "/// 속성 패널 설정 - Studio Pro에서 위젯 속성의 가시성을 제어",
250
-
251
- // editor_preview.gleam
252
- editor_preview_1: "// Mendix Studio Pro 디자인 미리보기",
253
- editor_preview_2:
254
- "// Studio Pro에서 위젯의 시각적 미리보기를 렌더링",
255
- editor_preview_doc:
256
- "/// Studio Pro 디자인 미리보기 - 위젯의 시각적 표현을 렌더링",
257
-
258
- // components/hello_world.gleam
259
- hello_world_1: "// Hello World 컴포넌트",
260
- hello_world_2: "// 위젯 런타임과 Studio Pro 미리보기에서 공유",
261
- hello_world_doc: "/// Hello World UI 렌더링",
262
-
263
- // _gitignore
264
- gitignore_deps: "# 의존성",
265
- gitignore_lockfiles: "# 패키지 매니저 lock 파일",
266
- gitignore_pm_cache: "# 패키지 매니저 캐시/설정",
267
- gitignore_gleam_build: "# Gleam 컴파일 출력",
268
- gitignore_mendix_build: "# Mendix 위젯 빌드 출력",
269
- gitignore_env: "# 환경 변수",
270
- gitignore_logs: "# 로그",
271
- gitignore_os: "# OS",
272
- gitignore_ide: "# IDE",
273
- gitignore_test_project: "# Mendix 테스트 프로젝트",
274
- gitignore_test_artifacts: "# 테스트 산출물",
275
- gitignore_bridge:
276
- "# 자동 생성 브릿지 파일 (glendix가 빌드 시 생성/삭제)",
277
- gitignore_ai: "# AI",
278
- gitignore_marketplace: "# Mendix marketplace 캐시/설정",
279
- },
280
-
281
- ja: {
282
- // __widget_name__.gleam
283
- widget_main_1: '// Mendix Pluggable Widget - "Hello World"',
284
- widget_main_2:
285
- "// React関数コンポーネント: fn(JsProps) -> ReactElement",
286
- widget_main_doc:
287
- "/// ウィジェットメイン関数 - MendixランタイムがReactコンポーネントとして呼び出し",
288
-
289
- // editor_config.gleam
290
- editor_config_1: "// Mendix Studio Proプロパティパネル設定",
291
- editor_config_2: "// getProperties、check、getPreview等を定義",
292
- editor_config_3: "// 外部型(Mendixが渡すJSオブジェクト)",
293
- editor_config_doc:
294
- "/// プロパティパネル設定 - Studio Proでウィジェットプロパティの表示/非表示を制御",
295
-
296
- // editor_preview.gleam
297
- editor_preview_1: "// Mendix Studio Proデザインビュープレビュー",
298
- editor_preview_2:
299
- "// Studio Proでウィジェットのビジュアルプレビューをレンダリング",
300
- editor_preview_doc:
301
- "/// Studio Proデザインビュープレビュー - ウィジェットのビジュアル表現をレンダリング",
302
-
303
- // components/hello_world.gleam
304
- hello_world_1: "// Hello Worldコンポーネント",
305
- hello_world_2:
306
- "// ウィジェットランタイムとStudio Proプレビューで共有",
307
- hello_world_doc: "/// Hello World UIのレンダリング",
308
-
309
- // _gitignore
310
- gitignore_deps: "# 依存関係",
311
- gitignore_lockfiles: "# パッケージマネージャーlockファイル",
312
- gitignore_pm_cache: "# パッケージマネージャーキャッシュ/設定",
313
- gitignore_gleam_build: "# Gleamコンパイル出力",
314
- gitignore_mendix_build: "# Mendixウィジェットビルド出力",
315
- gitignore_env: "# 環境変数",
316
- gitignore_logs: "# ログ",
317
- gitignore_os: "# OS",
318
- gitignore_ide: "# IDE",
319
- gitignore_test_project: "# Mendixテストプロジェクト",
320
- gitignore_test_artifacts: "# テスト成果物",
321
- gitignore_bridge:
322
- "# 自動生成ブリッジファイル(glendixがビルド時に生成/削除)",
323
- gitignore_ai: "# AI",
324
- gitignore_marketplace: "# Mendix marketplaceキャッシュ/設定",
325
- },
326
- };
327
-
328
- /**
329
- * Get template comment translations for the given language.
330
- * Used for {{I18N:*}} placeholder replacement in template files.
331
- */
332
- export function getTemplateComments(lang) {
333
- return templateComments[lang] ?? templateComments["en"];
334
- }
1
+ /**
2
+ * i18n — CLI UI strings + template comment translations
3
+ */
4
+
5
+ export const LANG_CHOICES = ["en", "ko", "ja"];
6
+
7
+ const LANG_LABELS = {
8
+ en: "English",
9
+ ko: "한국어",
10
+ ja: "日本語",
11
+ };
12
+
13
+ export function getLangLabel(lang) {
14
+ return LANG_LABELS[lang] ?? LANG_LABELS["en"];
15
+ }
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // CLI UI messages
19
+ // ---------------------------------------------------------------------------
20
+
21
+ const messages = {
22
+ en: {
23
+ // index.mjs
24
+ "error.invalidName": "Error: Invalid project name.",
25
+ "summary.title": "Project configuration:",
26
+ "summary.directory": "Directory:",
27
+ "summary.widgetName": "Widget name:",
28
+ "summary.gleamModule": "Gleam module:",
29
+ "summary.packageManager": "Package manager:",
30
+ "summary.language": "Language:",
31
+ "summary.organization": "Organization:",
32
+ "summary.copyright": "Copyright:",
33
+ "summary.license": "License:",
34
+ "summary.version": "Version:",
35
+ "summary.author": "Author:",
36
+ "summary.projectPath": "Project path:",
37
+ "progress.generatingFiles": "Generating files...",
38
+ "progress.filesCreated": "{count} files created",
39
+ "progress.claudeMdCreated": "CLAUDE.md created",
40
+ "progress.readmeCreated": "README.md created",
41
+ "progress.licenseCreated": "LICENSE created",
42
+ "progress.gitInit": "Git repository initialized",
43
+ "progress.gleamCompiling": "Compiling Gleam...",
44
+ "progress.gleamCompiled": "Gleam compilation complete",
45
+ "error.gleamCompileFail":
46
+ "⚠ Gleam compilation failed. Run manually in the project directory:",
47
+ "progress.depsInstalling": "Installing dependencies... ({pm})",
48
+ "progress.depsInstalled": "Dependencies installed",
49
+ "error.depsInstallFail":
50
+ "⚠ Dependency installation failed. Run manually in the project directory:",
51
+ "progress.playwrightInstalling": "Installing Playwright Chromium...",
52
+ "progress.playwrightInstalled": "Playwright Chromium installed",
53
+ "progress.playwrightExists": "Playwright Chromium already installed",
54
+ "error.playwrightFail":
55
+ "⚠ Playwright browser installation failed. Run manually in the project directory:",
56
+ "progress.buildingWidget": "Building widget...",
57
+ "progress.widgetBuilt": "Widget build complete",
58
+ "error.buildFail":
59
+ "⚠ Build failed. Run manually in the project directory:",
60
+ "done.title": "Project created successfully!",
61
+ "done.nextSteps": "Next steps:",
62
+ "done.devServer": "# Start dev server",
63
+ "done.prodBuild": "# Production build",
64
+ "done.marketplace": "# Download Marketplace widgets",
65
+
66
+ // prompts.mjs
67
+ "prompt.projectName": "Project name:",
68
+ "prompt.cancelled": "Cancelled.",
69
+ "validate.nameRequired": "Please enter a project name.",
70
+ "validate.needAlpha": "Must contain valid alphabetic characters.",
71
+ "validate.invalidChars":
72
+ "Must start with a letter and contain only letters, numbers, hyphens, or underscores.",
73
+ "error.dirExists": "Error: Directory '{name}' already exists.",
74
+ "prompt.orgName": "Organization:",
75
+ "prompt.copyright": "Copyright:",
76
+ "prompt.licenseSelect": "Select license:",
77
+ "prompt.version": "Version:",
78
+ "prompt.author": "Author:",
79
+ "prompt.projectPath": "Test project path:",
80
+ "validate.orgRequired": "Please enter an organization name.",
81
+ "validate.orgInvalid":
82
+ "Must start with lowercase letter (a-z, 0-9, hyphens only).",
83
+ "validate.copyrightRequired": "Please enter copyright text.",
84
+ "validate.versionInvalid": "Must be semver format (e.g. 0.0.1).",
85
+ "validate.authorRequired": "Please enter author name.",
86
+ "validate.pathRequired": "Please enter project path.",
87
+ "prompt.pmSelect": "Select package manager:",
88
+ "prompt.pmDetected": "detected: {detected}",
89
+ "prompt.pmDetectedMarker": "← detected",
90
+ "prompt.pmChoose": "Choose (1-{count}, default: {default}):",
91
+ },
92
+
93
+ ko: {
94
+ // index.mjs
95
+ "error.invalidName": "오류: 유효하지 않은 프로젝트 이름입니다.",
96
+ "summary.title": "프로젝트 설정:",
97
+ "summary.directory": "디렉토리:",
98
+ "summary.widgetName": "위젯 이름:",
99
+ "summary.gleamModule": "Gleam 모듈:",
100
+ "summary.packageManager": "패키지 매니저:",
101
+ "summary.language": "언어:",
102
+ "summary.organization": "조직:",
103
+ "summary.copyright": "저작권:",
104
+ "summary.license": "라이센스:",
105
+ "summary.version": "버전:",
106
+ "summary.author": "작성자:",
107
+ "summary.projectPath": "프로젝트 경로:",
108
+ "progress.generatingFiles": "파일 생성 중...",
109
+ "progress.filesCreated": "{count}개 파일 생성 완료",
110
+ "progress.claudeMdCreated": "CLAUDE.md 생성 완료",
111
+ "progress.readmeCreated": "README.md 생성 완료",
112
+ "progress.licenseCreated": "LICENSE 생성 완료",
113
+ "progress.gitInit": "git 저장소 초기화 완료",
114
+ "progress.gleamCompiling": "Gleam 컴파일 중...",
115
+ "progress.gleamCompiled": "Gleam 컴파일 완료",
116
+ "error.gleamCompileFail":
117
+ " Gleam 컴파일 실패. 프로젝트 디렉토리에서 직접 실행하세요:",
118
+ "progress.depsInstalling": "의존성 설치 중... ({pm})",
119
+ "progress.depsInstalled": "의존성 설치 완료",
120
+ "error.depsInstallFail":
121
+ " 의존성 설치 실패. 프로젝트 디렉토리에서 직접 실행하세요:",
122
+ "progress.playwrightInstalling": "Playwright Chromium 설치 중...",
123
+ "progress.playwrightInstalled": "Playwright Chromium 설치 완료",
124
+ "progress.playwrightExists": "Playwright Chromium 이미 설치됨",
125
+ "error.playwrightFail":
126
+ " Playwright 브라우저 설치 실패. 프로젝트 디렉토리에서 직접 실행하세요:",
127
+ "progress.buildingWidget": "위젯 빌드 중...",
128
+ "progress.widgetBuilt": "위젯 빌드 완료",
129
+ "error.buildFail":
130
+ " 빌드 실패. 프로젝트 디렉토리에서 직접 실행하세요:",
131
+ "done.title": "프로젝트가 생성되었습니다!",
132
+ "done.nextSteps": "다음 단계:",
133
+ "done.devServer": "# 개발 서버 시작",
134
+ "done.prodBuild": "# 프로덕션 빌드",
135
+ "done.marketplace": "# Marketplace 위젯 다운로드",
136
+
137
+ // prompts.mjs
138
+ "prompt.projectName": "프로젝트 이름:",
139
+ "prompt.cancelled": "취소되었습니다.",
140
+ "validate.nameRequired": "프로젝트 이름을 입력해주세요.",
141
+ "validate.needAlpha": "유효한 영문자를 포함해야 합니다.",
142
+ "validate.invalidChars":
143
+ "영문자로 시작해야 하며, 영문자/숫자/-/_ 만 사용 가능합니다.",
144
+ "error.dirExists": "오류: '{name}' 디렉토리가 이미 존재합니다.",
145
+ "prompt.orgName": "조직:",
146
+ "prompt.copyright": "저작권:",
147
+ "prompt.licenseSelect": "라이센스 선택:",
148
+ "prompt.version": "버전:",
149
+ "prompt.author": "작성자:",
150
+ "prompt.projectPath": "테스트 프로젝트 경로:",
151
+ "validate.orgRequired": "조직 이름을 입력해주세요.",
152
+ "validate.orgInvalid":
153
+ "소문자로 시작, 소문자/숫자/하이픈만 사용 가능합니다.",
154
+ "validate.copyrightRequired": "저작권 문구를 입력해주세요.",
155
+ "validate.versionInvalid": "semver 형식이어야 합니다 (예: 0.0.1).",
156
+ "validate.authorRequired": "작성자를 입력해주세요.",
157
+ "validate.pathRequired": "프로젝트 경로를 입력해주세요.",
158
+ "prompt.pmSelect": "패키지 매니저 선택:",
159
+ "prompt.pmDetected": "감지: {detected}",
160
+ "prompt.pmDetectedMarker": "← 감지됨",
161
+ "prompt.pmChoose": "선택 (1-{count}, 기본: {default}):",
162
+ },
163
+
164
+ ja: {
165
+ // index.mjs
166
+ "error.invalidName": "エラー: 無効なプロジェクト名です。",
167
+ "summary.title": "プロジェクト設定:",
168
+ "summary.directory": "ディレクトリ:",
169
+ "summary.widgetName": "ウィジェット名:",
170
+ "summary.gleamModule": "Gleamモジュール:",
171
+ "summary.packageManager": "パッケージマネージャー:",
172
+ "summary.language": "言語:",
173
+ "summary.organization": "組織:",
174
+ "summary.copyright": "著作権:",
175
+ "summary.license": "ライセンス:",
176
+ "summary.version": "バージョン:",
177
+ "summary.author": "作者:",
178
+ "summary.projectPath": "プロジェクトパス:",
179
+ "progress.generatingFiles": "ファイル生成中...",
180
+ "progress.filesCreated": "{count}個のファイル生成完了",
181
+ "progress.claudeMdCreated": "CLAUDE.md 生成完了",
182
+ "progress.readmeCreated": "README.md 生成完了",
183
+ "progress.licenseCreated": "LICENSE 生成完了",
184
+ "progress.gitInit": "gitリポジトリ初期化完了",
185
+ "progress.gleamCompiling": "Gleamコンパイル中...",
186
+ "progress.gleamCompiled": "Gleamコンパイル完了",
187
+ "error.gleamCompileFail":
188
+ "⚠ Gleamコンパイル失敗。プロジェクトディレクトリで直接実行してください:",
189
+ "progress.depsInstalling": "依存関係インストール中... ({pm})",
190
+ "progress.depsInstalled": "依存関係インストール完了",
191
+ "error.depsInstallFail":
192
+ " 依存関係インストール失敗。プロジェクトディレクトリで直接実行してください:",
193
+ "progress.playwrightInstalling": "Playwright Chromiumインストール中...",
194
+ "progress.playwrightInstalled": "Playwright Chromiumインストール完了",
195
+ "progress.playwrightExists": "Playwright Chromiumインストール済み",
196
+ "error.playwrightFail":
197
+ "⚠ Playwrightブラウザインストール失敗。プロジェクトディレクトリで直接実行してください:",
198
+ "progress.buildingWidget": "ウィジェットビルド中...",
199
+ "progress.widgetBuilt": "ウィジェットビルド完了",
200
+ "error.buildFail":
201
+ " ビルド失敗。プロジェクトディレクトリで直接実行してください:",
202
+ "done.title": "プロジェクトが作成されました!",
203
+ "done.nextSteps": "次のステップ:",
204
+ "done.devServer": "# 開発サーバー起動",
205
+ "done.prodBuild": "# プロダクションビルド",
206
+ "done.marketplace": "# Marketplaceウィジェットダウンロード",
207
+
208
+ // prompts.mjs
209
+ "prompt.projectName": "プロジェクト名:",
210
+ "prompt.cancelled": "キャンセルされました。",
211
+ "validate.nameRequired": "プロジェクト名を入力してください。",
212
+ "validate.needAlpha": "有効なアルファベットを含む必要があります。",
213
+ "validate.invalidChars":
214
+ "英字で始まり、英字/数字/-/_ のみ使用可能です。",
215
+ "error.dirExists": "エラー: '{name}' ディレクトリは既に存在します。",
216
+ "prompt.orgName": "組織:",
217
+ "prompt.copyright": "著作権:",
218
+ "prompt.licenseSelect": "ライセンス選択:",
219
+ "prompt.version": "バージョン:",
220
+ "prompt.author": "作者:",
221
+ "prompt.projectPath": "テストプロジェクトパス:",
222
+ "validate.orgRequired": "組織名を入力してください。",
223
+ "validate.orgInvalid":
224
+ "小文字で始まり、小文字/数字/ハイフンのみ使用可能です。",
225
+ "validate.copyrightRequired": "著作権テキストを入力してください。",
226
+ "validate.versionInvalid": "semver形式でなければなりません(例:0.0.1)。",
227
+ "validate.authorRequired": "作者名を入力してください。",
228
+ "validate.pathRequired": "プロジェクトパスを入力してください。",
229
+ "prompt.pmSelect": "パッケージマネージャー選択:",
230
+ "prompt.pmDetected": "検出: {detected}",
231
+ "prompt.pmDetectedMarker": "← 検出済み",
232
+ "prompt.pmChoose": "選択 (1-{count}, デフォルト: {default}):",
233
+ },
234
+ };
235
+
236
+ /**
237
+ * Translate a CLI message key.
238
+ * Supports {param} interpolation: t("en", "progress.filesCreated", { count: 5 })
239
+ */
240
+ export function t(lang, key, params = {}) {
241
+ const msg = messages[lang]?.[key] ?? messages["en"][key] ?? key;
242
+ return msg.replace(/\{(\w+)\}/g, (_, k) => params[k] ?? `{${k}}`);
243
+ }
244
+
245
+ // ---------------------------------------------------------------------------
246
+ // Template file comments (for {{I18N:*}} placeholders)
247
+ // ---------------------------------------------------------------------------
248
+
249
+ const templateComments = {
250
+ en: {
251
+ // __widget_name__.gleam
252
+ widget_main_1: '// Mendix Pluggable Widget - "Hello World"',
253
+ widget_main_2:
254
+ "// React functional component: fn(JsProps) -> ReactElement",
255
+ widget_main_doc:
256
+ "/// Main widget function - called by Mendix runtime as a React component",
257
+
258
+ // editor_config.gleam
259
+ editor_config_1: "// Mendix Studio Pro property panel configuration",
260
+ editor_config_2: "// Defines getProperties, check, getPreview, etc.",
261
+ editor_config_3: "// External types (JS objects passed by Mendix)",
262
+ editor_config_doc:
263
+ "/// Property panel configuration - controls widget property visibility in Studio Pro",
264
+
265
+ // editor_preview.gleam
266
+ editor_preview_1: "// Mendix Studio Pro design view preview",
267
+ editor_preview_2:
268
+ "// Renders the widget's visual preview in Studio Pro",
269
+ editor_preview_doc:
270
+ "/// Studio Pro design view preview - renders the widget's visual representation",
271
+
272
+ // components/hello_world.gleam
273
+ hello_world_1: "// Hello World component",
274
+ hello_world_2:
275
+ "// Shared between widget runtime and Studio Pro preview",
276
+ hello_world_doc: "/// Render Hello World UI",
277
+
278
+ // _gitignore
279
+ gitignore_deps: "# Dependencies",
280
+ gitignore_lockfiles: "# Package manager lock files",
281
+ gitignore_pm_cache: "# Package manager cache/config",
282
+ gitignore_gleam_build: "# Gleam compilation output",
283
+ gitignore_mendix_build: "# Mendix widget build output",
284
+ gitignore_env: "# Environment variables",
285
+ gitignore_logs: "# Logs",
286
+ gitignore_os: "# OS",
287
+ gitignore_ide: "# IDE",
288
+ gitignore_test_project: "# Mendix test project",
289
+ gitignore_test_artifacts: "# Test artifacts",
290
+ gitignore_bridge:
291
+ "# Auto-generated bridge files (created/deleted by glendix at build time)",
292
+ gitignore_ai: "# AI",
293
+ gitignore_marketplace: "# Mendix marketplace cache/config",
294
+ },
295
+
296
+ ko: {
297
+ // __widget_name__.gleam
298
+ widget_main_1: '// Mendix Pluggable Widget - "Hello World"',
299
+ widget_main_2:
300
+ "// React 함수형 컴포넌트: fn(JsProps) -> ReactElement",
301
+ widget_main_doc:
302
+ "/// 위젯 메인 함수 - Mendix 런타임이 React 컴포넌트로 호출",
303
+
304
+ // editor_config.gleam
305
+ editor_config_1: "// Mendix Studio Pro 속성 패널 설정",
306
+ editor_config_2: "// getProperties, check, getPreview 등을 정의",
307
+ editor_config_3: "// 외부 타입 (Mendix가 전달하는 JS 객체)",
308
+ editor_config_doc:
309
+ "/// 속성 패널 설정 - Studio Pro에서 위젯 속성의 가시성을 제어",
310
+
311
+ // editor_preview.gleam
312
+ editor_preview_1: "// Mendix Studio Pro 디자인 뷰 미리보기",
313
+ editor_preview_2:
314
+ "// Studio Pro에서 위젯의 시각적 미리보기를 렌더링",
315
+ editor_preview_doc:
316
+ "/// Studio Pro 디자인 뷰 미리보기 - 위젯의 시각적 표현을 렌더링",
317
+
318
+ // components/hello_world.gleam
319
+ hello_world_1: "// Hello World 컴포넌트",
320
+ hello_world_2: "// 위젯 런타임과 Studio Pro 미리보기에서 공유",
321
+ hello_world_doc: "/// Hello World UI 렌더링",
322
+
323
+ // _gitignore
324
+ gitignore_deps: "# 의존성",
325
+ gitignore_lockfiles: "# 패키지 매니저 lock 파일",
326
+ gitignore_pm_cache: "# 패키지 매니저 캐시/설정",
327
+ gitignore_gleam_build: "# Gleam 컴파일 출력",
328
+ gitignore_mendix_build: "# Mendix 위젯 빌드 출력",
329
+ gitignore_env: "# 환경 변수",
330
+ gitignore_logs: "# 로그",
331
+ gitignore_os: "# OS",
332
+ gitignore_ide: "# IDE",
333
+ gitignore_test_project: "# Mendix 테스트 프로젝트",
334
+ gitignore_test_artifacts: "# 테스트 산출물",
335
+ gitignore_bridge:
336
+ "# 자동 생성 브릿지 파일 (glendix가 빌드 시 생성/삭제)",
337
+ gitignore_ai: "# AI",
338
+ gitignore_marketplace: "# Mendix marketplace 캐시/설정",
339
+ },
340
+
341
+ ja: {
342
+ // __widget_name__.gleam
343
+ widget_main_1: '// Mendix Pluggable Widget - "Hello World"',
344
+ widget_main_2:
345
+ "// React関数コンポーネント: fn(JsProps) -> ReactElement",
346
+ widget_main_doc:
347
+ "/// ウィジェットメイン関数 - MendixランタイムがReactコンポーネントとして呼び出し",
348
+
349
+ // editor_config.gleam
350
+ editor_config_1: "// Mendix Studio Proプロパティパネル設定",
351
+ editor_config_2: "// getProperties、check、getPreview等を定義",
352
+ editor_config_3: "// 外部型(Mendixが渡すJSオブジェクト)",
353
+ editor_config_doc:
354
+ "/// プロパティパネル設定 - Studio Proでウィジェットプロパティの表示/非表示を制御",
355
+
356
+ // editor_preview.gleam
357
+ editor_preview_1: "// Mendix Studio Proデザインビュープレビュー",
358
+ editor_preview_2:
359
+ "// Studio Proでウィジェットのビジュアルプレビューをレンダリング",
360
+ editor_preview_doc:
361
+ "/// Studio Proデザインビュープレビュー - ウィジェットのビジュアル表現をレンダリング",
362
+
363
+ // components/hello_world.gleam
364
+ hello_world_1: "// Hello Worldコンポーネント",
365
+ hello_world_2:
366
+ "// ウィジェットランタイムとStudio Proプレビューで共有",
367
+ hello_world_doc: "/// Hello World UIのレンダリング",
368
+
369
+ // _gitignore
370
+ gitignore_deps: "# 依存関係",
371
+ gitignore_lockfiles: "# パッケージマネージャーlockファイル",
372
+ gitignore_pm_cache: "# パッケージマネージャーキャッシュ/設定",
373
+ gitignore_gleam_build: "# Gleamコンパイル出力",
374
+ gitignore_mendix_build: "# Mendixウィジェットビルド出力",
375
+ gitignore_env: "# 環境変数",
376
+ gitignore_logs: "# ログ",
377
+ gitignore_os: "# OS",
378
+ gitignore_ide: "# IDE",
379
+ gitignore_test_project: "# Mendixテストプロジェクト",
380
+ gitignore_test_artifacts: "# テスト成果物",
381
+ gitignore_bridge:
382
+ "# 自動生成ブリッジファイル(glendixがビルド時に生成/削除)",
383
+ gitignore_ai: "# AI",
384
+ gitignore_marketplace: "# Mendix marketplaceキャッシュ/設定",
385
+ },
386
+ };
387
+
388
+ /**
389
+ * Get template comment translations for the given language.
390
+ * Used for {{I18N:*}} placeholder replacement in template files.
391
+ */
392
+ export function getTemplateComments(lang) {
393
+ return templateComments[lang] ?? templateComments["en"];
394
+ }