mwork

    moon.work / moon.mod manifest parsing with stable dependency topological sorting for MoonBit workspaces

    moonbit
    workspace
    manifest
    toposort
    moon.work
    Download zip
    Author
    Version
    0.3.0
    License
    MIT
    Last updated
    7 hours ago
    Downloads
    6

    #chensuiyi/mwork

    moon.work / moon.mod workspace toolkit for MoonBit: parse the member list and module manifests, topologically sort members by dependencies, rewrite version lines and import pins. Parsing is powered by moonbitlang/moon_config (toolchain-grade).

    #Install

    moon add chensuiyi/mwork

    #Features

    • parse_members: member directories from moon.work
    • parse_mod: manifest → Member (name / version / import paths, @version stripped) via moonbitlang/moon_config
    • topo_sort: Kahn's algorithm, stable on the moon.work declaration order
    • sync_pins: rewrite import pins across a manifest to given versions (line-preserving)
    • replace_version: rewrite the first exact version = "old" line

    #Scenarios

    • Release orchestration: bump + publish all members in dependency order
    • Workspace analysis: who depends on whom, which pins are stale

    #API

    FunctionDescription
    parse_members(text)Member directories from moon.work
    parse_mod(dir, text)Manifest → Member
    topo_sort(selected, items)Dependencies first, stable
    replace_version(text, old, next)Rewrite the first exact version line
    sync_pins(text, pins)Rewrite import pins to given versions

    // Parse the workspace, topologically sort, bump, sync pins
    let dirs = @mwork.parse_members(moon_work_text)
    let members = dirs.map(fn(d) { @mwork.parse_mod(d, read(d)) })
    let order = @mwork.topo_sort(selected, members)

    let text = @mwork.replace_version(manifest, "0.1.0", "0.2.0")
    let synced = @mwork.sync_pins(manifest, [("chensuiyi/fndash", "0.2.0")])

    #Author

    #License

    MIT

    #chensuiyi/mwork

    MoonBit 工作区清单工具:解析 moon.work 成员列表与 moon.mod 清单(name / version / imports),按依赖关系做稳定拓扑排序,重写版本行与 import pin。解析由 moonbitlang/moon_config 驱动。

    #安装

    moon add chensuiyi/mwork

    #功能

    • parse_members:从 moon.work 提取成员目录
    • parse_mod:清单 → Member(name / version / 去 @version 的 import 路径),由 moonbitlang/moon_config 驱动
    • topo_sort:Kahn 算法,平局保持 moon.work 声明顺序
    • sync_pins:按给定版本重写 manifest 内的 import pin(保留行格式)
    • replace_version:重写首个精确匹配的 version = "old" 行

    #场景

    • 发布编排:按拓扑序 bump + publish 全体成员
    • 工作区分析:谁依赖谁、哪个 pin 过期

    #API

    函数说明
    parse_members(text)从 moon.work 提取成员目录
    parse_mod(dir, text)清单 → Member
    topo_sort(selected, items)被依赖者先,稳定排序
    replace_version(text, old, next)重写首个精确匹配的版本行
    sync_pins(text, pins)按给定版本重写 import pin

    #用法示例

    // 解析工作区、拓扑排序、bump、同步 pin
    let dirs = @mwork.parse_members(moon_work_text)
    let members = dirs.map(fn(d) { @mwork.parse_mod(d, read(d)) })
    let order = @mwork.topo_sort(selected, members)

    let text = @mwork.replace_version(manifest, "0.1.0", "0.2.0")
    let synced = @mwork.sync_pins(manifest, [("chensuiyi/fndash", "0.2.0")])

    #作者

    陈随易 (@chenbimo)

    #协议

    MIT

    ManifestError

    pub(all) suberror ManifestError {
    Missing(dir~ : String)
    }

    ManifestError::output

    fn ManifestError::output(self : ManifestError, logger : &Logger) -> Unit

    ManifestError::to_string

    fn ManifestError::to_string(self : ManifestError) -> String

    Member

    pub(all) struct Member {
    dir : String
    name : String
    version : String
    imports : Array[String]
    }

    One workspace member: directory, module name, current version, and the member modules it imports.

    parse_members

    fn parse_members(text : String) -> Array[String]

    Directory names from the members list of moon.work, parsed with moonbitlang/moon_config (toolchain-grade parsing).

    parse_mod

    fn parse_mod(dir : String, text : String) -> Member raise ManifestError

    Parse one moon.mod text: module name, version and the module paths in the import list (any @version suffix stripped). Raises Missing when name or version cannot be found.

    replace_version

    fn replace_version(text : String, old : String, next : String) -> String

    Replace version = "old" with version = "next" in a moon.mod text. Only the first exact-match line is rewritten; the caller reads and writes the file.

    sync_pins

    fn sync_pins(text : String, pins : Array[(String, String)]) -> String

    Apply version pins to a moon.mod text: for each (module, version) pair, every import line whose module path is module (with or without an @version suffix) is rewritten to module@version. Indentation and any trailing text after the closing quote (e.g. a comma) are preserved; lines for modules not in pins and everything that is not an import line are left untouched.

    topo_sort

    fn topo_sort(selected : Array[Member], items : Array[Member]) -> Array[Member]

    Order selected members so that a member never publishes before a selected member it imports. Stable: ties keep the moon.work member order.