From 0f7dd3cf30127142b8beb537f1e3c1f82577de9a Mon Sep 17 00:00:00 2001 From: GGOBP Date: Mon, 7 Sep 2026 12:28:55 +0900 Subject: [PATCH] refactor(js)!: delegate array conversion to gleam_javascript Delegate glendix/js/array conversions to gleam/javascript/array and remove the handwritten JavaScript adapter and its externals. from_list and to_list keep their names, labels, and element-order behavior, so list |> array.from_list |> array.to_list is unchanged. The project's style gate forbids type aliases, so the former opaque JsArray(element) type cannot be preserved as a re-export and is removed; annotate values with gleam/javascript/array.Array(element) instead. This is a source-breaking change for callers that named JsArray explicitly, so bump the package to 6.0.0 and document the migration in the READMEs. Tests cover empty, singleton, and ordered Int round trips plus a String round trip for generic-element typing. glendix -> mendraw keeps its declared Hex source form. Closes #11. --- README.ja.md | 11 ++++++++++- README.ko.md | 11 ++++++++++- README.md | 11 ++++++++++- gleam.toml | 2 +- glendix_guide.ja.md | 2 +- glendix_guide.ko.md | 2 +- glendix_guide.md | 2 +- src/glendix/js/array.gleam | 30 ++++++++++++++---------------- src/glendix/js/array_ffi.mjs | 7 ------- test/glendix_test.gleam | 20 ++++++++++++++++---- 10 files changed, 64 insertions(+), 34 deletions(-) delete mode 100644 src/glendix/js/array_ffi.mjs diff --git a/README.ja.md b/README.ja.md index 0a09bed..6e5f993 100644 --- a/README.ja.md +++ b/README.ja.md @@ -20,7 +20,7 @@ Glendix は Marketplace やブラウザ自動化を実装しません。 ```toml [dependencies] -glendix = ">= 5.1.0 and < 6.0.0" +glendix = ">= 6.0.0 and < 7.0.0" ``` Mendix クライアント値または MPK コンポーネントが必要な場合だけ `mendraw`、 @@ -219,6 +219,15 @@ JavaScript 設定、最終 MPK ビルドを担当します。 | `gleam run -m glendix/lint_fix` | lint 修正 | | `gleam run -m glendix/release` | release ビルド | +## 6.0.0 の破壊的変更 + +`glendix/js/array` は変換を `gleam/javascript/array` に委譲するようになり、手書き +の JavaScript アダプターを同梱しなくなりました。`from_list` と `to_list` は関数 +名・ラベル・要素順序の挙動を維持するため、一般的な +`list |> array.from_list |> array.to_list` の利用方法は変わりません。従来の +opaque 型 `glendix/js/array.JsArray(element)` は削除されたので、値の型は +`gleam/javascript/array.Array(element)` で注釈してください。 + ## 開発 ```sh diff --git a/README.ko.md b/README.ko.md index ee6e75d..378fece 100644 --- a/README.ko.md +++ b/README.ko.md @@ -19,7 +19,7 @@ Glendix는 Marketplace나 브라우저 자동화를 구현하지 않는다. ```toml [dependencies] -glendix = ">= 5.1.0 and < 6.0.0" +glendix = ">= 6.0.0 and < 7.0.0" ``` Mendix 클라이언트 값이나 MPK 컴포넌트가 필요할 때만 `mendraw`를 추가하고, @@ -215,6 +215,15 @@ JavaScript 설정, 최종 MPK 빌드를 담당한다. Marketplace 위젯을 쓰 | `gleam run -m glendix/lint_fix` | lint 수정 | | `gleam run -m glendix/release` | release 빌드 | +## 6.0.0 호환성 변경 + +`glendix/js/array`는 이제 변환을 `gleam/javascript/array`에 위임하며 수기 +JavaScript 어댑터를 더 이상 포함하지 않는다. `from_list`와 `to_list`는 함수 +이름·label·원소 순서 동작을 그대로 유지하므로 일반적인 +`list |> array.from_list |> array.to_list` 사용은 변경되지 않는다. 기존 opaque +타입 `glendix/js/array.JsArray(element)`는 제거되었으므로 값의 타입은 +`gleam/javascript/array.Array(element)`로 표기한다. + ## 개발 ```sh diff --git a/README.md b/README.md index 8bb9a59..34a773f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Glendix does not implement Marketplace access or browser automation. ```toml [dependencies] -glendix = ">= 5.1.0 and < 6.0.0" +glendix = ">= 6.0.0 and < 7.0.0" ``` Add `mendraw` only when the project uses Mendix client values or installed MPK @@ -282,6 +282,15 @@ Projects that do not use Marketplace widgets omit the first two steps. | `gleam run -m glendix/lint_fix` | Apply lint fixes | | `gleam run -m glendix/release` | Run the release build | +## Breaking changes in 6.0.0 + +`glendix/js/array` now delegates its conversions to `gleam/javascript/array` +and no longer ships a handwritten JavaScript adapter. The `from_list` and +`to_list` functions keep their names, labels, and element-order behavior, so the +common `list |> array.from_list |> array.to_list` usage is unchanged. The former +opaque `glendix/js/array.JsArray(element)` type is removed; annotate values with +`gleam/javascript/array.Array(element)` instead. + ## Development ```sh diff --git a/gleam.toml b/gleam.toml index d2a2cc6..e383e6e 100644 --- a/gleam.toml +++ b/gleam.toml @@ -1,5 +1,5 @@ name = "glendix" -version = "5.1.0" +version = "6.0.0" gleam = ">= 1.17.0" target = "javascript" description = "Mendix widget build tooling with external React bindings and a Lustre bridge" diff --git a/glendix_guide.ja.md b/glendix_guide.ja.md index 8efc1e6..19edc45 100644 --- a/glendix_guide.ja.md +++ b/glendix_guide.ja.md @@ -20,7 +20,7 @@ Glendix は Marketplace やブラウザ自動化を実装しません。 ```toml [dependencies] -glendix = ">= 5.1.0 and < 6.0.0" +glendix = ">= 6.0.0 and < 7.0.0" ``` Mendix クライアント値または MPK コンポーネントが必要な場合だけ `mendraw`、 diff --git a/glendix_guide.ko.md b/glendix_guide.ko.md index 6811d85..acecff3 100644 --- a/glendix_guide.ko.md +++ b/glendix_guide.ko.md @@ -19,7 +19,7 @@ Glendix는 Marketplace나 브라우저 자동화를 구현하지 않는다. ```toml [dependencies] -glendix = ">= 5.1.0 and < 6.0.0" +glendix = ">= 6.0.0 and < 7.0.0" ``` Mendix 클라이언트 값이나 MPK 컴포넌트가 필요할 때만 `mendraw`를 추가하고, diff --git a/glendix_guide.md b/glendix_guide.md index 905a7db..bd72f72 100644 --- a/glendix_guide.md +++ b/glendix_guide.md @@ -21,7 +21,7 @@ Glendix does not implement Marketplace access or browser automation. ```toml [dependencies] -glendix = ">= 5.1.0 and < 6.0.0" +glendix = ">= 6.0.0 and < 7.0.0" ``` Add `mendraw` only when the project uses Mendix client values or installed MPK diff --git a/src/glendix/js/array.gleam b/src/glendix/js/array.gleam index 355be59..304e04d 100644 --- a/src/glendix/js/array.gleam +++ b/src/glendix/js/array.gleam @@ -1,22 +1,20 @@ -//// Converts between Gleam lists and JavaScript arrays at the FFI boundary. +//// Converts between Gleam lists and JavaScript arrays. +//// +//// The conversions delegate to `gleam/javascript/array`, so the standard +//// `Array(element)` type is the JavaScript array representation and Glendix no +//// longer owns equivalent runtime code. The former opaque `JsArray(element)` +//// type is removed; annotate values with `gleam/javascript/array.Array` +//// instead. See the repository README for the migration note. //// -/// Represents a JavaScript array whose elements have a known Gleam type. -pub type JsArray(element) +import gleam/javascript/array as javascript_array -/// Converts a Gleam list into a JavaScript array. -pub fn from_list(list list: List(element)) -> JsArray(element) { - list_to_array(list) +/// Converts a Gleam list into a JavaScript array, preserving element order. +pub fn from_list(list list: List(element)) -> javascript_array.Array(element) { + javascript_array.from_list(list) } -/// Converts a JavaScript array into a Gleam list. -pub fn to_list(array array: JsArray(element)) -> List(element) { - array_to_list(array) +/// Converts a JavaScript array into a Gleam list, preserving element order. +pub fn to_list(array array: javascript_array.Array(element)) -> List(element) { + javascript_array.to_list(array) } - -// -- FFI -- -@external(javascript, "./array_ffi.mjs", "list_to_array") -fn list_to_array(list: List(element)) -> JsArray(element) - -@external(javascript, "./array_ffi.mjs", "array_to_list") -fn array_to_list(array: JsArray(element)) -> List(element) diff --git a/src/glendix/js/array_ffi.mjs b/src/glendix/js/array_ffi.mjs deleted file mode 100644 index 66a9747..0000000 --- a/src/glendix/js/array_ffi.mjs +++ /dev/null @@ -1,7 +0,0 @@ -import { toList } from "../../gleam.mjs"; -export function list_to_array(list) { - return list.toArray(); -} -export function array_to_list(array) { - return toList(array); -} diff --git a/test/glendix_test.gleam b/test/glendix_test.gleam index a4bf82f..5681626 100644 --- a/test/glendix_test.gleam +++ b/test/glendix_test.gleam @@ -1,6 +1,7 @@ //// Exercises Glendix pure domain logic and JavaScript FFI contracts. //// +import gleam/javascript/array as javascript_array import gleam/javascript/promise import gleam/json import gleam/list @@ -217,12 +218,23 @@ pub fn define_failed_file_write_contract_test() -> Nil { } } -/// Verifies the JavaScript array FFI preserves element order. -pub fn javascript_array_round_trip_test() -> Nil { - [1, 2, 3] +/// Verifies Int list round trips preserve empty, singleton, and ordered values. +pub fn javascript_array_int_round_trip_test() -> Nil { + let examples = [[], [1], [1, 2, 3]] + list.each(examples, fn(example) { + let standard_array: javascript_array.Array(Int) = array.from_list(example) + standard_array + |> array.to_list + |> should.equal(example) + }) +} + +/// Verifies the conversion is generic over the element type. +pub fn javascript_array_string_round_trip_test() -> Nil { + ["glendix", "js", "array"] |> array.from_list |> array.to_list - |> should.equal([1, 2, 3]) + |> should.equal(["glendix", "js", "array"]) } /// Verifies the JavaScript JSON FFI parses and serializes typed JSON values.