{"id":50714936,"url":"https://github.com/squins/kwmdsl","last_synced_at":"2026-06-09T18:30:30.081Z","repository":{"id":362481880,"uuid":"814987547","full_name":"squins/kwmdsl","owner":"squins","description":"A lightweight Kotlin DSL for specifying markup for Wicket components","archived":false,"fork":false,"pushed_at":"2026-06-04T11:06:53.000Z","size":657,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-04T13:08:35.705Z","etag":null,"topics":["apache-wicket","kotlin-dsl"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/squins.png","metadata":{"files":{"readme":"README-background.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-06-14T05:47:13.000Z","updated_at":"2026-06-04T11:06:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/squins/kwmdsl","commit_stats":null,"previous_names":["squins/kwmdsl"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/squins/kwmdsl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squins%2Fkwmdsl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squins%2Fkwmdsl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squins%2Fkwmdsl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squins%2Fkwmdsl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/squins","download_url":"https://codeload.github.com/squins/kwmdsl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squins%2Fkwmdsl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34121020,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache-wicket","kotlin-dsl"],"created_at":"2026-06-09T18:30:29.200Z","updated_at":"2026-06-09T18:30:30.076Z","avatar_url":"https://github.com/squins.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Background\n\n## Motivation\n\nApache Wicket is a great front-end framework: fast, flexible and powerful. But working with the code of components can be a bit cumbersome: 2 files for 1 component, IDs that are strings and have to be manually synchronized, the hierarchy of descendent components that has to be kept synchronized between the markup and the code.\n\nKotlin has powerful DSL capabilities, and this DSL is the result of an attempt to improve the experience of Kotlin developers who use Wicket.\n\n## Prior Art\n\nThis is not the only solution making development with Wicket easier. But the existing ones did not meet the requirements (see [goals](#design-goals) below).\n\n### Tooling\n\nThere is a plug-in for IntelliJ ([WicketForge](https://plugins.jetbrains.com/plugin/1545-wicketforge)) to help, but that only works for Java code, does not find all ID occurrences, and is (unfortunately) no longer maintained.\n\n### DSLs\n\nThere have been earlier attempts at writing DSLs for Wicket, but each of these attempts came with its own limitations:\n\n* [kWicket](https://github.com/ageery/kwicket-core)\n  * A wrapper around Wicket components, with quite a bit of code per component.\n  * Fine for simple cases, makes customizations and Ajax more difficult.\n  * First- (components with wrapper) and second-class citizens.\n  * The markup is generated multiple times. This is flexible, but expensive.\n* [Wicket HTML DSL](https://github.com/noobymatze/wicket-html-dsl/)\n  * (Some) wrapper functions around common constructs.\n  * Fine for simple cases, makes customizations and Ajax more difficult.\n  * Cannot handle more complex markup: repeaters.\n* [Apache Wicket Groovy DSL](https://github.com/eugene-kamenev/wicket-groovy-DSL)\n  * A wrapper around Wicket components.\n  * Fine for simple cases, but makes customization more difficult.\n  * First- (components with wrapper) and second-class citizens.\n  * Only replaces component (hierarchy) creation, so hierarchy synchronization with markup is still needed. \n\n## Design Goals\n\nThe design of the DSL was to achieve the following goals:\n\n* Make it (a lot) easier to work with Wicket in Kotlin.\n* Keep the Wicket semantics. In other words, do things the same as Wicket does, just written down differently.\n* Support the common use cases. Wicket is very flexible and supporting all of that would require a full programming language. The DSL only has to support pages and components with static markup.\n* The required code structure must be acceptable to most Wicket developers.\n* Existing third-party components must be usable within having to request changes and/or having to write wrappers.\n* Improve the developer experience:\n  * 1 file instead of 2.\n  * Make markup easier to read (subjective).\n  * Have 1 location for the IDs plus references to them, so renaming an ID is an operation supported by the IDE.\n  * Define the hierarchy only once, so there is no longer a need to synchronize markup and code.\n  * Use references for component and page paths, so renaming and moving classes does not break the components.\n  * Make reusable snippets easy to write and use.\n* Allow mixing of markup types (HTML and DSL) in the same hierarchy.\n* Have a (very) small impact on the performance and memory usage of component instances.\n\n## Non-Goals\n\nThe following are not goals of the DSL:\n\n* Support everything that is possible with Wicket and HTML files.\n* Ensure only valid Wicket code can be written. You have to know what you are doing, just like with the HTML files.\n* Terse code. Where possible, the code is as terse as possible. But strong typing and a small runtime overhead take precedence.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsquins%2Fkwmdsl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsquins%2Fkwmdsl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsquins%2Fkwmdsl/lists"}