create-mendix-widget-gleam 1.0.4 → 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 +16 -23
- package/package.json +1 -1
- package/src/index.mjs +78 -84
- package/src/scaffold.mjs +1 -2
- package/template/_gitignore +3 -0
- package/template/docs/glendix_guide.md +1365 -0
- package/template/gleam.toml +1 -0
- package/template/manifest.toml +2 -0
- package/template/src/{widget/__widget_name__.gleam → __widget_name__.gleam} +4 -7
- package/template/src/components/hello_world.gleam +13 -0
- package/template/src/editor_preview.gleam +12 -0
- package/template/src/__WidgetName__.editorConfig.js +0 -5
- package/template/src/__WidgetName__.js +0 -6
- package/template/src/scripts/build.gleam +0 -8
- package/template/src/scripts/cmd.gleam +0 -4
- package/template/src/scripts/cmd_ffi.mjs +0 -6
- package/template/src/scripts/dev.gleam +0 -8
- package/template/src/scripts/install.gleam +0 -8
- package/template/src/scripts/lint.gleam +0 -7
- package/template/src/scripts/lint_fix.gleam +0 -7
- package/template/src/scripts/release.gleam +0 -8
- package/template/src/scripts/start.gleam +0 -8
- package/template/src/widget/mendix/action.gleam +0 -41
- package/template/src/widget/mendix/big.gleam +0 -86
- package/template/src/widget/mendix/date.gleam +0 -92
- package/template/src/widget/mendix/dynamic_value.gleam +0 -30
- package/template/src/widget/mendix/editable_value.gleam +0 -73
- package/template/src/widget/mendix/file.gleam +0 -34
- package/template/src/widget/mendix/filter.gleam +0 -109
- package/template/src/widget/mendix/formatter.gleam +0 -18
- package/template/src/widget/mendix/icon.gleam +0 -34
- package/template/src/widget/mendix/list_attribute.gleam +0 -57
- package/template/src/widget/mendix/list_value.gleam +0 -106
- package/template/src/widget/mendix/reference.gleam +0 -47
- package/template/src/widget/mendix/selection.gleam +0 -31
- package/template/src/widget/mendix.gleam +0 -65
- package/template/src/widget/mendix_ffi.mjs +0 -530
- package/template/src/widget/react/event.gleam +0 -33
- package/template/src/widget/react/hook.gleam +0 -65
- package/template/src/widget/react/html.gleam +0 -156
- package/template/src/widget/react/prop.gleam +0 -106
- package/template/src/widget/react.gleam +0 -85
- package/template/src/widget/react_ffi.mjs +0 -184
- /package/template/src/{widget/editor_config.gleam → editor_config.gleam} +0 -0
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Gleam 언어로 Mendix Pluggable Widget 프로젝트를 스케폴딩하는 CLI 도구.
|
|
4
4
|
|
|
5
|
-
JSX 없이,
|
|
5
|
+
JSX 없이, **Gleam + [glendix](https://hexdocs.pm/glendix/)**로 React 컴포넌트를 작성하여 Mendix Studio Pro에서 동작하는 위젯을 만든다.
|
|
6
6
|
|
|
7
7
|
## 사용법
|
|
8
8
|
|
|
@@ -22,39 +22,32 @@ npx create-mendix-widget-gleam my-widget
|
|
|
22
22
|
```
|
|
23
23
|
my-widget/
|
|
24
24
|
src/
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
editor_config.gleam # Studio Pro 속성 패널
|
|
32
|
-
scripts/ # 빌드/개발 스크립트
|
|
33
|
-
gleam.toml # Gleam 프로젝트 설정
|
|
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 의존성 포함)
|
|
34
31
|
CLAUDE.md # AI 어시스턴트용 프로젝트 컨텍스트
|
|
35
32
|
```
|
|
36
33
|
|
|
34
|
+
React/Mendix FFI 바인딩은 프로젝트에 포함되지 않으며, [glendix](https://hexdocs.pm/glendix/) Hex 패키지로 제공된다.
|
|
35
|
+
|
|
37
36
|
## 생성 후 시작하기
|
|
38
37
|
|
|
39
38
|
```bash
|
|
40
39
|
cd my-widget
|
|
41
|
-
gleam run -m
|
|
42
|
-
gleam run -m
|
|
43
|
-
gleam run -m
|
|
40
|
+
gleam run -m glendix/install # 의존성 설치
|
|
41
|
+
gleam run -m glendix/dev # 개발 서버 시작
|
|
42
|
+
gleam run -m glendix/build # 프로덕션 빌드 (.mpk 생성)
|
|
44
43
|
```
|
|
45
44
|
|
|
46
|
-
##
|
|
45
|
+
## glendix — React + Mendix 바인딩
|
|
47
46
|
|
|
48
|
-
생성된
|
|
47
|
+
생성된 프로젝트는 [glendix](https://hexdocs.pm/glendix/) Hex 패키지를 의존성으로 사용한다. glendix가 React 원시 함수와 Mendix Pluggable Widget API 전체에 대한 타입 안전한 Gleam 바인딩을 제공한다:
|
|
49
48
|
|
|
50
|
-
- **
|
|
51
|
-
- **
|
|
52
|
-
- **ListValue** — 데이터 목록 (필터, 정렬, 페이지네이션)
|
|
53
|
-
- **SelectionValue** — 단일/다중 선택
|
|
54
|
-
- **ReferenceValue** — 연관 관계 (단일/다중 참조)
|
|
55
|
-
- **JsDate / Big** — JS Date, Big.js 고정밀 십진수 래퍼
|
|
56
|
-
- **Filter** — 필터 조건 빌더
|
|
57
|
-
- **그 외** — DynamicValue, FileValue, WebIcon, ValueFormatter 등
|
|
49
|
+
- **React** — `react`, `react/prop`, `react/hook`, `react/event`, `react/html`
|
|
50
|
+
- **Mendix** — `mendix`, `mendix/editable_value`, `mendix/action`, `mendix/list_value`, `mendix/selection`, `mendix/reference`, `mendix/date`, `mendix/big`, `mendix/filter` 등
|
|
58
51
|
|
|
59
52
|
## 라이선스
|
|
60
53
|
|
package/package.json
CHANGED
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
|
|
113
|
-
${CYAN}gleam run -m
|
|
114
|
-
${CYAN}gleam run -m
|
|
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
|
|
|
@@ -125,57 +125,45 @@ Gleam 언어로 Mendix Pluggable Widget을 개발하여 "Hello World"를 화면
|
|
|
125
125
|
|
|
126
126
|
## Goal
|
|
127
127
|
|
|
128
|
-
**JSX를 사용하지 않고, 오직 Gleam으로만** 위젯을 작성한다. Gleam 코드를 JavaScript로 컴파일하고, 컴파일된 JS가 곧 Mendix Pluggable Widget의 진입점이 된다.
|
|
128
|
+
**JSX를 사용하지 않고, 오직 Gleam으로만** 위젯을 작성한다. Gleam 코드를 JavaScript로 컴파일하고, 컴파일된 JS가 곧 Mendix Pluggable Widget의 진입점이 된다. React와 Mendix API 바인딩은 [glendix](https://hexdocs.pm/glendix/) 패키지가 제공한다.
|
|
129
129
|
|
|
130
130
|
## Tech Stack
|
|
131
131
|
|
|
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
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
react/ # React 모듈 (prop, hook, event, html)
|
|
148
|
-
mendix.gleam # Mendix 핵심 타입 + Props 접근자
|
|
149
|
-
mendix/ # Mendix API 모듈 (editable_value, action, list_value 등)
|
|
150
|
-
editor_config.gleam # Studio Pro 속성 패널 설정
|
|
151
|
-
scripts/ # 빌드/개발 스크립트 (gleam run -m으로 실행)
|
|
152
|
-
cmd.gleam # 셸 명령어 실행 유틸리티
|
|
153
|
-
cmd_ffi.mjs # Node.js child_process FFI
|
|
154
|
-
install.gleam # npm 의존성 설치
|
|
155
|
-
build.gleam # 프로덕션 빌드
|
|
156
|
-
dev.gleam # 개발 서버
|
|
157
|
-
start.gleam # Mendix 테스트 프로젝트 연동
|
|
158
|
-
release.gleam # 릴리즈 빌드
|
|
159
|
-
lint.gleam # ESLint 실행
|
|
160
|
-
lint_fix.gleam # ESLint 자동 수정
|
|
161
|
-
${names.pascalCase}.js # 브릿지 진입점
|
|
162
|
-
${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 공유 컴포넌트
|
|
163
147
|
${names.pascalCase}.xml # 위젯 속성 정의
|
|
164
148
|
package.xml # Mendix 패키지 매니페스트
|
|
165
149
|
ui/
|
|
166
150
|
${names.pascalCase}.css # 위젯 스타일시트
|
|
167
|
-
gleam.toml # Gleam 프로젝트 설정
|
|
151
|
+
gleam.toml # Gleam 프로젝트 설정 (glendix 의존성 포함)
|
|
168
152
|
docs/
|
|
169
153
|
gleam_language_tour.md # Gleam 언어 레퍼런스
|
|
154
|
+
glendix_guide.md # glendix 사용 가이드
|
|
170
155
|
\`\`\`
|
|
171
156
|
|
|
157
|
+
React/Mendix FFI 바인딩은 이 프로젝트에 포함되지 않으며, [glendix](https://hexdocs.pm/glendix/) Hex 패키지로 제공된다.
|
|
158
|
+
|
|
172
159
|
## Build Pipeline
|
|
173
160
|
|
|
174
161
|
\`\`\`
|
|
175
|
-
[src
|
|
176
|
-
↓ gleam run -m
|
|
177
|
-
[build/dev/javascript/${names.snakeCase}
|
|
178
|
-
|
|
162
|
+
[src/*.gleam] + [glendix 패키지 (Hex)]
|
|
163
|
+
↓ gleam run -m glendix/build
|
|
164
|
+
[build/dev/javascript/${names.snakeCase}/*.mjs]
|
|
165
|
+
[build/dev/javascript/glendix/glendix/*.mjs]
|
|
166
|
+
↓ 브릿지 JS (자동 생성)가 import
|
|
179
167
|
↓ Rollup (pluggable-widgets-tools build:web)
|
|
180
168
|
[dist/1.0.0/mendix.${names.lowerCase}.${names.pascalCase}.mpk]
|
|
181
169
|
\`\`\`
|
|
@@ -183,54 +171,62 @@ docs/
|
|
|
183
171
|
## Commands
|
|
184
172
|
|
|
185
173
|
\`\`\`bash
|
|
186
|
-
gleam run -m
|
|
187
|
-
gleam run -m
|
|
188
|
-
gleam run -m
|
|
189
|
-
gleam run -m
|
|
190
|
-
gleam run -m
|
|
191
|
-
gleam run -m
|
|
192
|
-
gleam run -m
|
|
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 # 릴리즈 빌드
|
|
193
181
|
gleam build --target javascript # Gleam → JS 컴파일만
|
|
194
182
|
gleam test # Gleam 테스트 실행
|
|
195
183
|
gleam format # Gleam 코드 포맷팅
|
|
196
184
|
\`\`\`
|
|
197
185
|
|
|
198
|
-
##
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
-
|
|
202
|
-
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
205
|
-
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
- \`
|
|
212
|
-
- \`
|
|
213
|
-
- \`
|
|
214
|
-
- \`
|
|
215
|
-
- \`
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
- \`mendix
|
|
219
|
-
- \`mendix/
|
|
220
|
-
- \`mendix/
|
|
221
|
-
- \`mendix/
|
|
222
|
-
- \`mendix/
|
|
186
|
+
## glendix Guide
|
|
187
|
+
|
|
188
|
+
\`docs/glendix_guide.md\` 파일에 glendix 패키지의 사용법이 수록되어 있다. 주요 내용:
|
|
189
|
+
- 프로젝트 설정 및 첫 번째 위젯 만들기
|
|
190
|
+
- 핵심 개념: opaque 타입, undefined ↔ Option 변환, 파이프라인 API
|
|
191
|
+
- React 바인딩: 엘리먼트 생성, Props 빌더, HTML 태그 함수, Hooks, 이벤트 처리, 조건부/리스트 렌더링, 스타일
|
|
192
|
+
- Mendix 바인딩: Props 접근, ValueStatus, EditableValue, ActionValue, DynamicValue, ListValue, ListAttribute, Selection, Reference, Filter, JsDate, Big 등
|
|
193
|
+
- 실전 패턴: 폼 입력 위젯, 데이터 테이블, 검색 가능 리스트, 컴포넌트 합성
|
|
194
|
+
- 트러블슈팅
|
|
195
|
+
|
|
196
|
+
## glendix Modules
|
|
197
|
+
|
|
198
|
+
React:
|
|
199
|
+
- \`glendix/react\` — 핵심 타입 + createElement + fragment/text/none + 조건부 렌더링
|
|
200
|
+
- \`glendix/react/prop\` — Props 파이프라인 빌더
|
|
201
|
+
- \`glendix/react/hook\` — React Hooks (useState, useEffect 등)
|
|
202
|
+
- \`glendix/react/event\` — 이벤트 타입 + 값 추출
|
|
203
|
+
- \`glendix/react/html\` — HTML 태그 편의 함수
|
|
204
|
+
|
|
205
|
+
Mendix:
|
|
206
|
+
- \`glendix/mendix\` — \`ValueStatus\`, \`ObjectItem\`, Props 접근자
|
|
207
|
+
- \`glendix/mendix/editable_value\` — 편집 가능한 값
|
|
208
|
+
- \`glendix/mendix/action\` — 액션 실행
|
|
209
|
+
- \`glendix/mendix/dynamic_value\` — 동적 읽기 전용 값
|
|
210
|
+
- \`glendix/mendix/list_value\` — 리스트 데이터 + 정렬/필터
|
|
211
|
+
- \`glendix/mendix/list_attribute\` — 리스트 아이템별 접근
|
|
212
|
+
- \`glendix/mendix/selection\` — 단일/다중 선택
|
|
213
|
+
- \`glendix/mendix/reference\` — 참조 관계 값
|
|
214
|
+
- \`glendix/mendix/date\` — JS Date 래퍼
|
|
215
|
+
- \`glendix/mendix/big\` — Big.js 고정밀 십진수 래퍼
|
|
216
|
+
- \`glendix/mendix/file\` — 파일/이미지
|
|
217
|
+
- \`glendix/mendix/icon\` — 아이콘
|
|
218
|
+
- \`glendix/mendix/formatter\` — 값 포맷팅/파싱
|
|
219
|
+
- \`glendix/mendix/filter\` — 필터 조건 빌더
|
|
223
220
|
|
|
224
221
|
## Mendix Widget Conventions
|
|
225
222
|
|
|
226
223
|
- 위젯 ID: \`mendix.${names.lowerCase}.${names.pascalCase}\`
|
|
227
|
-
- JSX 파일을 작성하지 않는다. 모든 React 로직은 Gleam +
|
|
228
|
-
-
|
|
224
|
+
- JSX 파일을 작성하지 않는다. 모든 React 로직은 Gleam + glendix로 구현
|
|
225
|
+
- 위젯 프로젝트에 FFI 파일을 직접 작성하지 않는다 — React/Mendix FFI는 glendix가 제공
|
|
229
226
|
|
|
230
227
|
## Code Style
|
|
231
228
|
|
|
232
229
|
- Gleam 파일: \`gleam format\` 사용
|
|
233
|
-
- FFI 파일(\`react_ffi.mjs\`, \`mendix_ffi.mjs\`): API 노출만 담당, 비즈니스 로직 금지
|
|
234
230
|
- 한국어 주석 사용
|
|
235
231
|
`;
|
|
236
232
|
|
|
@@ -258,19 +254,19 @@ Gleam 언어로 작성된 Mendix Pluggable Widget.
|
|
|
258
254
|
### 설치
|
|
259
255
|
|
|
260
256
|
\`\`\`bash
|
|
261
|
-
gleam run -m
|
|
257
|
+
gleam run -m glendix/install
|
|
262
258
|
\`\`\`
|
|
263
259
|
|
|
264
260
|
### 개발
|
|
265
261
|
|
|
266
262
|
\`\`\`bash
|
|
267
|
-
gleam run -m
|
|
263
|
+
gleam run -m glendix/dev
|
|
268
264
|
\`\`\`
|
|
269
265
|
|
|
270
266
|
### 빌드
|
|
271
267
|
|
|
272
268
|
\`\`\`bash
|
|
273
|
-
gleam run -m
|
|
269
|
+
gleam run -m glendix/build
|
|
274
270
|
\`\`\`
|
|
275
271
|
|
|
276
272
|
빌드 결과물(\`.mpk\`)은 \`dist/\` 디렉토리에 생성됩니다.
|
|
@@ -278,10 +274,10 @@ gleam run -m scripts/build
|
|
|
278
274
|
### 기타 명령어
|
|
279
275
|
|
|
280
276
|
\`\`\`bash
|
|
281
|
-
gleam run -m
|
|
282
|
-
gleam run -m
|
|
283
|
-
gleam run -m
|
|
284
|
-
gleam run -m
|
|
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 # 릴리즈 빌드
|
|
285
281
|
gleam build --target javascript # Gleam → JS 컴파일만
|
|
286
282
|
gleam test # 테스트 실행
|
|
287
283
|
gleam format # 코드 포맷팅
|
|
@@ -291,22 +287,20 @@ gleam format # 코드 포맷팅
|
|
|
291
287
|
|
|
292
288
|
\`\`\`
|
|
293
289
|
src/
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
mendix.gleam + mendix/ # Mendix API 모듈 계층
|
|
300
|
-
editor_config.gleam # Studio Pro 속성 패널
|
|
301
|
-
scripts/ # 빌드/개발 스크립트
|
|
302
|
-
${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 공유 컴포넌트
|
|
303
295
|
${names.pascalCase}.xml # 위젯 속성 정의
|
|
304
296
|
\`\`\`
|
|
305
297
|
|
|
298
|
+
React/Mendix FFI 바인딩은 [glendix](https://hexdocs.pm/glendix/) Hex 패키지로 제공됩니다.
|
|
299
|
+
|
|
306
300
|
## 기술 스택
|
|
307
301
|
|
|
308
302
|
- **Gleam** → JavaScript 컴파일
|
|
309
|
-
- **
|
|
303
|
+
- **[glendix](https://hexdocs.pm/glendix/)** — React + Mendix API Gleam 바인딩
|
|
310
304
|
- **Mendix Pluggable Widget** (React 19)
|
|
311
305
|
- **${pm}** — 패키지 매니저
|
|
312
306
|
|
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
|
-
|
|
46
|
-
.replace(/\{\{RUNNER\}\}/g, pmConfig.runner);
|
|
45
|
+
;
|
|
47
46
|
}
|
|
48
47
|
|
|
49
48
|
/**
|