create-mendix-widget-gleam 1.0.5 → 1.0.6

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 CHANGED
@@ -22,11 +22,12 @@ npx create-mendix-widget-gleam my-widget
22
22
  ```
23
23
  my-widget/
24
24
  src/
25
- widget/ # Gleam 위젯 코드
26
- my_widget.gleam # 메인 위젯 모듈
27
- editor_config.gleam # Studio Pro 속성 패널
28
- scripts/ # 빌드/개발 스크립트
29
- gleam.toml # Gleam 프로젝트 설정 (glendix >= 1.0.0 의존성 포함)
25
+ my_widget.gleam # 메인 위젯 모듈
26
+ editor_config.gleam # Studio Pro 속성 패널
27
+ editor_preview.gleam # Studio Pro 디자인 뷰 미리보기
28
+ components/
29
+ hello_world.gleam # Hello World 공유 컴포넌트
30
+ gleam.toml # Gleam 프로젝트 설정 (glendix >= 1.1.0 의존성 포함)
30
31
  CLAUDE.md # AI 어시스턴트용 프로젝트 컨텍스트
31
32
  ```
32
33
 
@@ -36,9 +37,9 @@ React/Mendix FFI 바인딩은 프로젝트에 포함되지 않으며, [glendix](
36
37
 
37
38
  ```bash
38
39
  cd my-widget
39
- gleam run -m scripts/install # 의존성 설치
40
- gleam run -m scripts/dev # 개발 서버 시작
41
- gleam run -m scripts/build # 프로덕션 빌드 (.mpk 생성)
40
+ gleam run -m glendix/install # 의존성 설치
41
+ gleam run -m glendix/dev # 개발 서버 시작
42
+ gleam run -m glendix/build # 프로덕션 빌드 (.mpk 생성)
42
43
  ```
43
44
 
44
45
  ## glendix — React + Mendix 바인딩
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-mendix-widget-gleam",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Scaffold a Mendix Pluggable Widget powered by Gleam",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
package/src/index.mjs CHANGED
@@ -109,9 +109,9 @@ ${GREEN}${BOLD}프로젝트가 생성되었습니다!${RESET}
109
109
  ${BOLD}다음 단계:${RESET}
110
110
 
111
111
  ${CYAN}cd ${names.kebabCase}${RESET}
112
- ${CYAN}gleam run -m scripts/install${RESET} ${DIM}# 의존성 설치${RESET}
113
- ${CYAN}gleam run -m scripts/dev${RESET} ${DIM}# 개발 서버 시작${RESET}
114
- ${CYAN}gleam run -m scripts/build${RESET} ${DIM}# 프로덕션 빌드${RESET}
112
+ ${CYAN}gleam run -m glendix/install${RESET} ${DIM}# 의존성 설치${RESET}
113
+ ${CYAN}gleam run -m glendix/dev${RESET} ${DIM}# 개발 서버 시작${RESET}
114
+ ${CYAN}gleam run -m glendix/build${RESET} ${DIM}# 프로덕션 빌드${RESET}
115
115
  `);
116
116
  }
117
117
 
@@ -132,28 +132,18 @@ Gleam 언어로 Mendix Pluggable Widget을 개발하여 "Hello World"를 화면
132
132
  - **Gleam** → JavaScript 컴파일 (target: javascript)
133
133
  - **[glendix](https://hexdocs.pm/glendix/)** — React + Mendix Pluggable Widget API의 Gleam FFI 바인딩 (Hex 패키지)
134
134
  - **Mendix Pluggable Widget** (React 19)
135
- - **Package Manager**: ${pm} (npm 의존성은 \`gleam run -m scripts/install\`로 설치)
135
+ - **Package Manager**: ${pm} (npm 의존성은 \`gleam run -m glendix/install\`로 설치)
136
136
  - **Build**: \`@mendix/pluggable-widgets-tools\` (Rollup 기반)
137
137
 
138
138
  ## Architecture
139
139
 
140
140
  \`\`\`
141
141
  src/
142
- widget/ # 위젯 고유 코드 (개발자가 작업하는 곳)
143
- ${names.snakeCase}.gleam # 위젯 메인 모듈
144
- editor_config.gleam # Studio Pro 속성 패널 설정
145
- scripts/ # 빌드/개발 스크립트 (gleam run -m으로 실행)
146
- cmd.gleam # 명령어 실행 유틸리티
147
- cmd_ffi.mjs # Node.js child_process FFI
148
- install.gleam # npm 의존성 설치
149
- build.gleam # 프로덕션 빌드
150
- dev.gleam # 개발 서버
151
- start.gleam # Mendix 테스트 프로젝트 연동
152
- release.gleam # 릴리즈 빌드
153
- lint.gleam # ESLint 실행
154
- lint_fix.gleam # ESLint 자동 수정
155
- ${names.pascalCase}.js # 브릿지 진입점
156
- ${names.pascalCase}.editorConfig.js # 브릿지 (editorConfig)
142
+ ${names.snakeCase}.gleam # 위젯 메인 모듈
143
+ editor_config.gleam # Studio Pro 속성 패널 설정
144
+ editor_preview.gleam # Studio Pro 디자인 미리보기
145
+ components/
146
+ hello_world.gleam # Hello World 공유 컴포넌트
157
147
  ${names.pascalCase}.xml # 위젯 속성 정의
158
148
  package.xml # Mendix 패키지 매니페스트
159
149
  ui/
@@ -169,11 +159,11 @@ React/Mendix FFI 바인딩은 이 프로젝트에 포함되지 않으며, [glend
169
159
  ## Build Pipeline
170
160
 
171
161
  \`\`\`
172
- [src/widget/*.gleam] + [glendix 패키지 (Hex)]
173
- ↓ gleam run -m scripts/build
174
- [build/dev/javascript/${names.snakeCase}/widget/*.mjs]
162
+ [src/*.gleam] + [glendix 패키지 (Hex)]
163
+ ↓ gleam run -m glendix/build
164
+ [build/dev/javascript/${names.snakeCase}/*.mjs]
175
165
  [build/dev/javascript/glendix/glendix/*.mjs]
176
- src/${names.pascalCase}.js (브릿지)가 import
166
+ 브릿지 JS (자동 생성)가 import
177
167
  ↓ Rollup (pluggable-widgets-tools build:web)
178
168
  [dist/1.0.0/mendix.${names.lowerCase}.${names.pascalCase}.mpk]
179
169
  \`\`\`
@@ -181,13 +171,13 @@ React/Mendix FFI 바인딩은 이 프로젝트에 포함되지 않으며, [glend
181
171
  ## Commands
182
172
 
183
173
  \`\`\`bash
184
- gleam run -m scripts/install # 의존성 설치
185
- gleam run -m scripts/build # 위젯 프로덕션 빌드 (.mpk 생성)
186
- gleam run -m scripts/dev # 개발 서버 (HMR, port 3000)
187
- gleam run -m scripts/start # Mendix 테스트 프로젝트와 연동 개발
188
- gleam run -m scripts/lint # ESLint 실행
189
- gleam run -m scripts/lint_fix # ESLint 자동 수정
190
- gleam run -m scripts/release # 릴리즈 빌드
174
+ gleam run -m glendix/install # 의존성 설치
175
+ gleam run -m glendix/build # 위젯 프로덕션 빌드 (.mpk 생성)
176
+ gleam run -m glendix/dev # 개발 서버 (HMR, port 3000)
177
+ gleam run -m glendix/start # Mendix 테스트 프로젝트와 연동 개발
178
+ gleam run -m glendix/lint # ESLint 실행
179
+ gleam run -m glendix/lint_fix # ESLint 자동 수정
180
+ gleam run -m glendix/release # 릴리즈 빌드
191
181
  gleam build --target javascript # Gleam → JS 컴파일만
192
182
  gleam test # Gleam 테스트 실행
193
183
  gleam format # Gleam 코드 포맷팅
@@ -264,19 +254,19 @@ Gleam 언어로 작성된 Mendix Pluggable Widget.
264
254
  ### 설치
265
255
 
266
256
  \`\`\`bash
267
- gleam run -m scripts/install
257
+ gleam run -m glendix/install
268
258
  \`\`\`
269
259
 
270
260
  ### 개발
271
261
 
272
262
  \`\`\`bash
273
- gleam run -m scripts/dev
263
+ gleam run -m glendix/dev
274
264
  \`\`\`
275
265
 
276
266
  ### 빌드
277
267
 
278
268
  \`\`\`bash
279
- gleam run -m scripts/build
269
+ gleam run -m glendix/build
280
270
  \`\`\`
281
271
 
282
272
  빌드 결과물(\`.mpk\`)은 \`dist/\` 디렉토리에 생성됩니다.
@@ -284,10 +274,10 @@ gleam run -m scripts/build
284
274
  ### 기타 명령어
285
275
 
286
276
  \`\`\`bash
287
- gleam run -m scripts/start # Mendix 테스트 프로젝트 연동
288
- gleam run -m scripts/lint # ESLint 실행
289
- gleam run -m scripts/lint_fix # ESLint 자동 수정
290
- gleam run -m scripts/release # 릴리즈 빌드
277
+ gleam run -m glendix/start # Mendix 테스트 프로젝트 연동
278
+ gleam run -m glendix/lint # ESLint 실행
279
+ gleam run -m glendix/lint_fix # ESLint 자동 수정
280
+ gleam run -m glendix/release # 릴리즈 빌드
291
281
  gleam build --target javascript # Gleam → JS 컴파일만
292
282
  gleam test # 테스트 실행
293
283
  gleam format # 코드 포맷팅
@@ -297,11 +287,11 @@ gleam format # 코드 포맷팅
297
287
 
298
288
  \`\`\`
299
289
  src/
300
- widget/ # 위젯 고유 코드
301
- ${names.snakeCase}.gleam # 메인 위젯 모듈
302
- editor_config.gleam # Studio Pro 속성 패널
303
- scripts/ # 빌드/개발 스크립트
304
- ${names.pascalCase}.js # Mendix 브릿지 진입점
290
+ ${names.snakeCase}.gleam # 메인 위젯 모듈
291
+ editor_config.gleam # Studio Pro 속성 패널
292
+ editor_preview.gleam # Studio Pro 디자인 뷰 미리보기
293
+ components/
294
+ hello_world.gleam # Hello World 공유 컴포넌트
305
295
  ${names.pascalCase}.xml # 위젯 속성 정의
306
296
  \`\`\`
307
297
 
package/src/scaffold.mjs CHANGED
@@ -42,8 +42,7 @@ function replaceContent(content, names, pmConfig) {
42
42
  .replace(/\{\{LOWERCASE\}\}/g, names.lowerCase)
43
43
  .replace(/\{\{DISPLAY_NAME\}\}/g, names.displayName)
44
44
  .replace(/\{\{KEBAB_CASE\}\}/g, names.kebabCase)
45
- .replace(/\{\{INSTALL_COMMAND\}\}/g, pmConfig.install)
46
- .replace(/\{\{RUNNER\}\}/g, pmConfig.runner);
45
+ ;
47
46
  }
48
47
 
49
48
  /**
@@ -46,3 +46,6 @@ coverage/
46
46
  **/screenshot/
47
47
  **/screenshot-results/
48
48
  **/artifacts/
49
+
50
+ # 자동 생성 브릿지 파일 (glendix가 빌드 시 생성/삭제)
51
+ src/*.js
@@ -1,15 +1,12 @@
1
1
  // Mendix Pluggable Widget - "Hello World"
2
2
  // React 함수형 컴포넌트: fn(JsProps) -> ReactElement
3
3
 
4
+ import components/hello_world
4
5
  import glendix/mendix
5
6
  import glendix/react.{type JsProps, type ReactElement}
6
- import glendix/react/html
7
- import glendix/react/prop
8
7
 
9
8
  /// 위젯 메인 함수 - Mendix 런타임이 React 컴포넌트로 호출
10
9
  pub fn widget(props: JsProps) -> ReactElement {
11
10
  let sample_text = mendix.get_string_prop(props, "sampleText")
12
- html.div(prop.new() |> prop.class("widget-hello-world"), [
13
- react.text("Hello " <> sample_text),
14
- ])
11
+ hello_world.render(sample_text)
15
12
  }
@@ -0,0 +1,13 @@
1
+ // Hello World 컴포넌트
2
+ // 위젯 런타임과 Studio Pro 미리보기에서 공유
3
+
4
+ import glendix/react.{type ReactElement}
5
+ import glendix/react/html
6
+ import glendix/react/prop
7
+
8
+ /// Hello World UI 렌더링
9
+ pub fn render(sample_text: String) -> ReactElement {
10
+ html.div(prop.new() |> prop.class("widget-hello-world"), [
11
+ react.text("Hello " <> sample_text),
12
+ ])
13
+ }
@@ -0,0 +1,12 @@
1
+ // Mendix Studio Pro 디자인 뷰 미리보기
2
+ // Studio Pro에서 위젯의 시각적 미리보기를 렌더링
3
+
4
+ import components/hello_world
5
+ import glendix/mendix
6
+ import glendix/react.{type JsProps, type ReactElement}
7
+
8
+ /// Studio Pro 디자인 뷰 미리보기 - 위젯의 시각적 표현을 렌더링
9
+ pub fn preview(props: JsProps) -> ReactElement {
10
+ let sample_text = mendix.get_string_prop(props, "sampleText")
11
+ hello_world.render(sample_text)
12
+ }
@@ -1,5 +0,0 @@
1
- // 브릿지: Gleam 컴파일 출력을 Mendix editorConfig 진입점으로 연결
2
- // Gleam(snake_case) → Mendix(camelCase) 이름 변환만 담당
3
- import { get_properties } from "../build/dev/javascript/{{SNAKE_CASE}}/widget/editor_config.mjs";
4
-
5
- export const getProperties = get_properties;
@@ -1,6 +0,0 @@
1
- // 브릿지: Gleam 컴파일 출력을 Mendix 빌드 진입점으로 연결
2
- // 위젯 로직 없음 - re-export와 CSS import만 담당
3
- import { widget } from "../build/dev/javascript/{{SNAKE_CASE}}/widget/{{SNAKE_CASE}}.mjs";
4
- import "./ui/{{PASCAL_CASE}}.css";
5
-
6
- export const {{PASCAL_CASE}} = widget;
@@ -1,8 +0,0 @@
1
- // 위젯 프로덕션 빌드 (.mpk 생성)
2
- // gleam run 시 Gleam 컴파일이 먼저 자동 수행됨
3
-
4
- import scripts/cmd
5
-
6
- pub fn main() {
7
- cmd.exec("{{RUNNER}} pluggable-widgets-tools build:web")
8
- }
@@ -1,4 +0,0 @@
1
- // 셸 명령어 실행 유틸리티
2
-
3
- @external(javascript, "./cmd_ffi.mjs", "exec")
4
- pub fn exec(command: String) -> Nil
@@ -1,6 +0,0 @@
1
- // 셸 명령어 실행 FFI 어댑터
2
- import { execSync } from "node:child_process";
3
-
4
- export function exec(command) {
5
- execSync(command, { stdio: "inherit", shell: true });
6
- }
@@ -1,8 +0,0 @@
1
- // 개발 서버 시작 (HMR, port 3000)
2
- // gleam run 시 Gleam 컴파일이 먼저 자동 수행됨
3
-
4
- import scripts/cmd
5
-
6
- pub fn main() {
7
- cmd.exec("{{RUNNER}} pluggable-widgets-tools start:web")
8
- }
@@ -1,8 +0,0 @@
1
- // 의존성 설치
2
- // Gleam 의존성은 gleam run 실행 시 자동으로 다운로드됨
3
-
4
- import scripts/cmd
5
-
6
- pub fn main() {
7
- cmd.exec("{{INSTALL_COMMAND}}")
8
- }
@@ -1,7 +0,0 @@
1
- // ESLint 실행
2
-
3
- import scripts/cmd
4
-
5
- pub fn main() {
6
- cmd.exec("{{RUNNER}} pluggable-widgets-tools lint")
7
- }
@@ -1,7 +0,0 @@
1
- // ESLint 자동 수정
2
-
3
- import scripts/cmd
4
-
5
- pub fn main() {
6
- cmd.exec("{{RUNNER}} pluggable-widgets-tools lint:fix")
7
- }
@@ -1,8 +0,0 @@
1
- // 릴리즈 빌드
2
- // gleam run 시 Gleam 컴파일이 먼저 자동 수행됨
3
-
4
- import scripts/cmd
5
-
6
- pub fn main() {
7
- cmd.exec("{{RUNNER}} pluggable-widgets-tools release:web")
8
- }
@@ -1,8 +0,0 @@
1
- // Mendix 테스트 프로젝트와 연동 개발
2
- // gleam run 시 Gleam 컴파일이 먼저 자동 수행됨
3
-
4
- import scripts/cmd
5
-
6
- pub fn main() {
7
- cmd.exec("{{RUNNER}} pluggable-widgets-tools start:server")
8
- }