Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
22c48ce
Rename user-facing source files: remove eliom_ prefix
balat Mar 27, 2026
798f5e7
Update all references to use new module names
balat Mar 27, 2026
cae9310
Add Eliom wrapper module and update dune configuration
balat Mar 27, 2026
b0cc253
Add eliom.compat.server and eliom.compat.client libraries
balat Mar 27, 2026
9d94bbd
Modernize app.exe template
balat Mar 27, 2026
a4156c7
Migrate app.lib and basic.ppx templates to new module names
balat Mar 27, 2026
dc644ea
Update api.odocl, indexdoc, filelist and _tags for renamed modules
balat Mar 27, 2026
0966a74
Use Content.Html.T as Tools.Make parameter
balat Apr 30, 2026
c5900b5
Format ppx_eliom_utils.ml
balat Mar 27, 2026
fe4db0f
Wrap eliom modules under the Eliom.X namespace
balat Mar 27, 2026
0096118
Rename Eliom_client_value to Client_value
balat Mar 28, 2026
6e901f1
Rename Eliom_syntax to Syntax
balat Mar 28, 2026
6786aeb
Fix PPX client to use eliom_expr for Eliom_client_core references
balat Mar 28, 2026
3175bb7
Rename Eliom_client_core to Client_core
balat Mar 28, 2026
cd74a18
Use check_internal() accessor consistently in ppx_eliom_utils
balat Mar 28, 2026
ccf6ff7
Fix client PPX: use eliom_expr for get_injection to support wrapped m…
balat Mar 28, 2026
a6a67f0
Update Eliom.run references to Eliom.App.run in docs and templates
balat Mar 28, 2026
f7fb090
Move eliom-compat to a separate opam package
balat May 29, 2026
4d23021
ocamlbuild build: pass -internal to PPX invocations
balat May 29, 2026
784c10c
api.odocl: update module names
balat May 29, 2026
f5c8b4f
Replace ocamlbuild with shell script for wikidoc generation
balat May 29, 2026
a3b5ade
Remove eliom.ocamlbuild plugin and legacy build system
balat Mar 28, 2026
3ad310a
Add -internal-prefix flag to PPX for wrapped dependent libraries
balat Mar 28, 2026
9721cf1
.gitignore: ignore local untracked files; track eliom.opam.template
balat Mar 28, 2026
3637699
Rename Eliom_common to Common
balat Mar 28, 2026
aefc4aa
Rename all internal modules: remove eliom_/eliommod_ prefixes
balat Mar 31, 2026
ea1ee7e
Update indexdoc files with new module names
balat Mar 31, 2026
59e7aee
Run dune fmt
balat Mar 31, 2026
497dc81
Migrate to wrapped ocsigenserver module names
balat Apr 9, 2026
56d7836
Move sources into Eliom/ subdir for (include_subdirs qualified)
balat Apr 9, 2026
7e35977
Install distillery templates at lib/eliom/templates/<name>/
balat Apr 30, 2026
9203fda
Fix is_site_available: require non-empty sitedata stack during init
balat Apr 30, 2026
dc48eba
CHANGES: document the modernize work for 13.0
balat Apr 30, 2026
884e7f8
Common: rename Eliom_* exceptions to short forms
balat Apr 30, 2026
756cd25
Use short exception names internally in Common
balat Apr 30, 2026
f820a50
Update mli doc references to short exception name
balat Apr 30, 2026
d9fee2c
README: document make wikidoc workflow
balat May 1, 2026
2e2999e
Bump version to 13.0.0
balat May 29, 2026
ea25239
Update README Getting started example to new Eliom.Xxx namespace
balat May 29, 2026
5e67b34
Mark version as 13.0~dev (pre-release)
balat May 29, 2026
4eab42e
doc: update manual references to the new Eliom.Xxx module names
balat Jun 22, 2026
7f9e01f
Serialise persistent session groups with Deriving_Json
balat May 29, 2026
ad6843c
Switch persistent-cookie table to Ocsipersist.Column.Json
balat May 29, 2026
40ae369
Switch session-group table to a typed Column.Json table
balat May 29, 2026
f637d5f
Drop Marshal from Reference and State persistent tables
balat May 29, 2026
dd24446
doc: convert <<a_api>> references in .mli comments to odoc references
balat Jun 1, 2026
1b9e930
doc: convert <<a_manual>> references in .mli comments to odoc page refs
balat Jun 2, 2026
55a814a
doc: add the Eliom manual as odoc pages in the package (doc/*.mld)
balat Jun 2, 2026
94964a6
doc: drop the <<outline>> TOC placeholders from the manual pages
balat Jun 2, 2026
28a58c7
doc: regenerate server-services.mld (recover content lost to comment …
balat Jun 2, 2026
9e248ee
doc: fix two stale manual cross-references
balat Jun 2, 2026
55090e0
doc: use the framework overview as the package landing (doc/index.mld)
balat Jun 2, 2026
53a69e5
doc: build & deploy with wodoc (declarative client/server config)
balat Jun 7, 2026
b465775
doc(ci): pin odoc/odoc-driver from the balat/odoc fork (cross-lib lin…
balat Jun 7, 2026
511ac8f
doc: fix shared-menu URL (/wodoc/menu.html -> /doc/menu.html)
balat Jun 13, 2026
4827cea
doc: document the stable-version release (freeze) procedure
balat Jun 13, 2026
353bf89
doc: fix manual landing + cross-project/stale links
balat Jun 13, 2026
456e068
doc(ci): add a 'release' workflow_dispatch to publish a stable version
balat Jun 13, 2026
b6ffef0
doc: declare the manual nav in doc/wodoc, drop the wikicréole menu
balat Jun 13, 2026
62a174b
doc: fix URL example mangled by the wiki->mld conversion
balat Jun 14, 2026
ff060c4
doc(ci): serialise gh-pages deploys and stop interpolating the versio…
balat Jun 14, 2026
9ac2846
doc: remove stale {% %} wiki wrappers from doc comments
balat Jun 18, 2026
78a2e27
doc: link js_of_ocaml, tyxml and reactiveData docs on ocsigen.org
balat Jun 18, 2026
603d040
doc: link Lwt docs on ocsigen.org
balat Jun 19, 2026
578a053
doc: unify the two home pages into a single index.mld
balat Jun 20, 2026
28d7156
doc: add the home page to the manual navigation
balat Jun 20, 2026
b705b48
doc: port cross-project link conversion to the deriving branch
balat Jun 20, 2026
352038f
doc: fix stale module references in the manual (Eliom.Common, Eliom.C…
balat Jun 22, 2026
b0d90b9
Remove the obsolete wikidoc generation script
balat Jun 25, 2026
649c164
Require ocsigenserver >= 8.0 (and < 9.0)
balat Jun 26, 2026
b33fdb8
Switch to ocamlformat 0.29.0
balat Jun 26, 2026
96f9210
Merge pull request #889 from ocsigen/reformat-ocamlformat-0.29
balat Jun 26, 2026
3dc1cd0
Ignore generated _wodoc-html/ and _wodoc-md/ documentation output
balat Jun 26, 2026
1551040
Adapt to Ocsigen Server 8 baselib helper removals
balat Jun 26, 2026
6d4148d
Require ocsigenserver >= 8.0 (and < 9.0)
balat Jun 26, 2026
8328f5c
Merge pull request #891 from ocsigen/adapt-ocsigenserver-8
balat Jun 26, 2026
bc6abe1
CI: pin ocsipersist#master for Server 8
balat Jun 26, 2026
1be9b76
Merge pull request #892 from ocsigen/ci-server8-pins
balat Jun 26, 2026
235675b
Merge pull request #886 from ocsigen/fix-ocsigenserver-dep-bound
balat Jun 26, 2026
31cf82b
Merge branch 'master' into deriving
balat Jun 26, 2026
30f58ee
Reformat after merge (ocamlformat 0.29)
balat Jun 26, 2026
60aed26
Require js_of_ocaml 6.4
balat Jun 26, 2026
3295e96
Merge pull request #893 from ocsigen/jsoo-6.4
balat Jun 26, 2026
62c6780
ppx: leave plain .ml/.mli files untouched
balat Jul 3, 2026
9cfd32c
Merge remote-tracking branch 'origin/master' into deriving
balat Jul 17, 2026
14d00b4
Common/Reference: don't 500 on undeserialisable persistent/client data
balat Jul 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions .github/workflows/doc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@ on:
required: false
default: ""

# Serialise gh-pages writes: a push (rebuilds dev/) and a release
# workflow_dispatch (freezes <version>/ and repoints latest) must never push to
# gh-pages at the same time, or the second push fails non-fast-forward.
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
group: doc-deploy-${{ github.workflow }}
cancel-in-progress: false

jobs:
build-deploy:
Expand Down Expand Up @@ -117,6 +120,10 @@ jobs:
# No rebuild — the docs of a release are exactly the dev docs at that point.
if: github.repository == 'ocsigen/eliom' && github.event_name == 'workflow_dispatch' && github.event.inputs.version != ''
runs-on: ubuntu-latest
# Pass the user-supplied version through the environment; never interpolate
# it directly into a run: shell (avoids command injection from the input).
env:
VERSION: ${{ github.event.inputs.version }}
permissions:
contents: write
steps:
Expand All @@ -142,7 +149,7 @@ jobs:
# write the root index.html redirect if missing, refresh versions.json.
run: >-
opam exec -- wodoc release --site site --from dev
--version "${{ github.event.inputs.version }}"
--version "$VERSION"

- name: Commit and push gh-pages
run: |
Expand All @@ -151,5 +158,5 @@ jobs:
git config user.email "github-actions[bot]@users.noreply.github.com"
git add -A
git diff --cached --quiet \
|| git commit -m "Release doc ${{ github.event.inputs.version }} (freeze dev, repoint latest)"
|| git commit -m "Release doc $VERSION (freeze dev, repoint latest)"
git push
3 changes: 3 additions & 0 deletions .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ jobs:
token: ${{ github.token }}

- run: opam pin -y git+https://github.com/ocsigen/ocsigenserver#master
# ocsipersist's released version targets the old flat module names; the
# master pin tracks the Ocsigen Server 8 API.
- run: opam pin -yn git+https://github.com/ocsigen/ocsipersist#master
# Published js_of_ocaml (6.3.2) caps at ocaml < 5.5; pin master for
# 5.5 support (also pulls wasm_of_ocaml, hence the binaryen set-up).
- run: opam pin -y git+https://github.com/ocsigen/js_of_ocaml#master
Expand Down
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ src/**/*.mllib
src/**/*.mldylib
src/**/*.odocl

# Generated odoc/wodoc documentation output
_wodoc-html/
_wodoc-md/

ocsigen.org-data

_opam

# Local files (not part of the project)
AGENTS*.md
instructions
2026-*.md
doc/manual/menu.wiki
2 changes: 1 addition & 1 deletion .ocamlformat
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version=0.28.1
version=0.29.0
parse-docstrings = false
wrap-comments = false
break-cases = fit
Expand Down
103 changes: 102 additions & 1 deletion CHANGES
Original file line number Diff line number Diff line change
@@ -1,3 +1,104 @@
===== 13.0~dev =====
* PPX: the Eliom syntax extension is now a no-op on plain .ml/.mli files;
only .eliom/.eliomi files are processed as client-server code. This
prevents server-only .ml modules that create services at toplevel from
emitting client values that are never linked on the client (reported as
"Code generating the following client values is not linked on the client").
* Persistent storage: replace Stdlib.Marshal with Deriving_Json
** perssessgrp values (session-group keys) are now serialised with
Deriving_Json instead of Stdlib.Marshal. The on-disk format
becomes stable across OCaml versions and human-readable.
BREAKING: existing session-group entries from older Eliom
versions become unreadable; tables are renamed in later commits
to make this migration explicit.
** Persistent-cookie table (eliom_persist_cookies) now uses
Ocsipersist.Column.Json instead of Column.Marshal. The table
suffix is bumped to _v6. BREAKING: persistent cookies issued by
earlier Eliom versions are dropped on upgrade and clients are
asked to remove the cookie on next visit.
** Session-group table is migrated from Ocsipersist.Polymorphic to a
typed functorial table with Column.Json. Renamed from
__eliom_session_group_table to __eliom_session_group_table_v2.
BREAKING: existing session groups are dropped on upgrade.
** Eliom references and persistent session-data tables drop all
reliance on Stdlib.Marshal. The user-facing API now requires a
Deriving_Json codec:
Reference.eref ~persistent:("name", [%json: t]) v
State.create_persistent_table ~scope ~json:[%json: t] "name"
The stored values must be annotated with [@@deriving json].
Internally:
- The global persistent store (Ocsiper) now uses
Ocsipersist.Store_json.
- Per-site and per-user persistent tables use a typed
Ocsipersist functorial table with Column.Json registered
via Persistent_tables.create_json.
- The vestigial int64 column previously prefixed to every
session value is dropped.
- Ocsipersist.Polymorphic is no longer used in Eliom and the
Common.Ocsipersist.Polymorphic wrapper is removed.
BREAKING: existing per-reference / per-session persistent data
becomes unreadable on upgrade because the on-disk format changes
(Ocsipersist's Store_json stores in a different table than
Store; Polymorphic tables are not opened any more).
* Module namespace modernization
** Public modules are now accessed as Eliom.Service, Eliom.Content,
Eliom.Parameter, Eliom.Registration, Eliom.Client, ... instead of
the legacy flat Eliom_xxx prefix. Implemented with
(include_subdirs qualified) + (wrapped false) in dune.
** Eliom_common is now Eliom.Common; most internal modules lost
their eliom_/eliommod_ prefix as well (Content_core, Mod_main,
Mod_pagegen, ...). A few names are kept as-is for conflict
reasons (Eliom_form, Eliom_lazy, Eliom_react, Eliom_uri).
** New eliom-compat opam package: provides the legacy Eliom_xxx
module names as include-aliases of the new Eliom.Xxx modules,
to ease migration of existing code.
** BREAKING: Eliom.run is now Eliom.App.run (the auto-generated
wrapper module cannot contain val declarations).
* Eliom.Content.Html.T
** New named module type for the Tyxml HTML signature shared by F
and D, with Eliom's LINKS_AND_FORMS extensions. Use it as the
parameter signature of functors that need to abstract over the
F/D choice, instead of [module type of Content.Html.F]. The
latter triggers an OCaml strengthening bug in wrapped libraries.
Tools.Make, Ot.Icons.Make and the os_template Make functor all
use it.
* Distillery template install path
** Eliom's three templates (app.exe, app.lib, basic.ppx) are now
installed at lib/eliom/templates/<name>/ via the standard dune
(install (section lib_root) ... (with_prefix ...)) pattern.
Third-party packages (e.g. ocsigen-start) that ship templates
are expected to install at the same location.
* Build system
** Migrated to wrapped ocsigenserver module names (Ocsigen.Server,
Ocsigen.Extensions, Ocsigen.Request, Ocsigen.Response,
Ocsigen.Config, Ocsigen_base.Lib, Ocsigen_http.Header, ...).
** PPX gained -internal and -internal-prefix flags for compiling
wrapped libraries.
** Removed the eliom.ocamlbuild plugin and the legacy topkg/pkg
build artifacts. API documentation is now generated by
build/gen_wikidoc.sh (ocamldoc + wikidoc, no ocamlbuild
dependency); run via [make wikidoc].
* Exception renames
** Common.Eliom_site_information_not_available is now
Common.Site_information_not_available, Common.Eliom_do_redirection
is now Common.Do_redirection, and Common.Eliom_do_half_xhr_redirection
is now Common.Do_half_xhr_redirection. The old names are kept as
backwards-compatible aliases (exception X = Y).
** The internal client exception
Request_info.Eliom_no_raw_post_data_on_client was renamed to
No_raw_post_data_on_client (no alias kept, as it was not exposed).
* Bug fixes
** Syntax.is_site_available now checks that the sitedata stack is
actually non-empty during initialisation, instead of just
relying on Ocsigen.Extensions.during_initialisation. Fixes a
crash on startup
(Eliom_site_information_not_available "get_current_sitedata")
exposed by the new module link order: PPX-inserted top-level
close_server_section calls in extension-linked .eliom files
(Service_base, Content, Tools, ...) now correctly route their
compilation-unit data into !global_data when no site is active,
matching the design intent stated in the comment on
get_global_data.
===== 12.1.0 =====
* Compatibility with OCaml 5.5
(Outcometree's Otyp_object replaced open_row with a row field, and out_type
Expand All @@ -10,7 +111,7 @@
* Eliom_lib
** Deprecated logging functions were removed (#821)
These are: debug_exn, debug, error, error_any, jsdebug
* Full WASM support: build system and sending either js or wasm depending on the browser
* Full WASM support: build system and sending either js or wasm depending on the browser
* Use Log instead of Lwt_logs

===== 11.1 =====
Expand Down
34 changes: 0 additions & 34 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,42 +1,8 @@
### Building
BEST=$(if $(shell command -v ocamlopt 2> /dev/null),native,byte)
BUILDER=_build/build/build.$(BEST)

.PHONY: all
all:
dune build

### Doc
.PHONY: doc wikidoc doc man alldoc
DOCS_DIR=src/lib/client src/lib/server src/ocamlbuild src/ppx
DOCS_HTML=$(addsuffix /api.docdir/index.html,$(DOCS_DIR))
DOCS_WIKI=$(addsuffix /api.wikidocdir/index.wiki,$(DOCS_DIR))
DOCS_MAN= src/lib/client/api.mandocdir/man.3oc \
src/lib/server/api.mandocdir/man.3os \
src/ocamlbuild/api.mandocdir/man.3o \
src/ppx/api.mandocdir/man.3o
API_DIR=_build/doc/dev/api
doc: $(BUILDER)
$(BUILDER) $(DOCS_HTML)
wikidoc: $(BUILDER)
$(BUILDER) $(DOCS_WIKI)
man: $(BUILDER)
$(BUILDER) $(DOCS_MAN)
alldoc: man wikidoc doc

doccp: alldoc
mkdir -p $(API_DIR)/server $(API_DIR)/client $(API_DIR)/ocamlbuild $(API_DIR)/ppx
cp -Rf _build/src/lib/server/api.wikidocdir/*.wiki $(API_DIR)/server/
cp -Rf _build/src/lib/client/api.wikidocdir/*.wiki $(API_DIR)/client/
cp -Rf _build/src/ocamlbuild/api.wikidocdir/*.wiki $(API_DIR)/ocamlbuild/
cp -Rf _build/src/ppx/api.wikidocdir/*.wiki $(API_DIR)/ppx/
cp -Rf doc/index.wiki $(API_DIR)/

$(BUILDER): $(wildcard build/*.ml)
ocamlbuild -no-plugin -I src/ocamlbuild -no-links -use-ocamlfind build/build.$(BEST) 1> /dev/null
ocaml pkg/build.ml manpage=false native=true native-dynlink=true
builder: $(BUILDER)

### Cleaning ###
.PHONY: clean distclean
clean:
Expand Down
25 changes: 0 additions & 25 deletions README.build

This file was deleted.

30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,23 @@ Defining a service on path `/foo`, taking any GET parameters:

```ocaml
let myservice =
Eliom_service.create
~path:(Eliom_service.Path ["foo"])
~meth:(Eliom_service.Get (Eliom_parameter.any))
Eliom.Service.create
~path:(Eliom.Service.Path ["foo"])
~meth:(Eliom.Service.Get (Eliom.Parameter.any))
()

let () =
Eliom_registration.Html.register ~service:myservice
Eliom.Registration.Html.register ~service:myservice
(fun get_params () ->
Lwt.return
Eliom_content.Html.F.(html (head (title (txt "")))
Eliom.Content.Html.F.(html (head (title (txt "")))
(body [h1 [txt "Hello"]])))
```

Inserting a link towards that service, with parameters:

```ocaml
Eliom_content.Html.D.a ~service:myservice [txt "Home"] [("param1", "v1"); ("param2", "v2")]
Eliom.Content.Html.D.a ~service:myservice [txt "Home"] [("param1", "v1"); ("param2", "v2")]
```

Event handlers are written in OCaml:
Expand Down Expand Up @@ -90,22 +90,22 @@ let%client () =
Saving session data on the server using Eliom references:

```ocaml
let%server r = Eliom_reference.eref ~scope:Eliom_common.default_session_scope 0
let%server r = Eliom.Reference.eref ~scope:Eliom.Common.default_session_scope 0

let%server f () =
let%lwt v = Eliom_reference.get r in
Eliom_reference.set r (v + 1);
let%lwt v = Eliom.Reference.get r in
Eliom.Reference.set r (v + 1);
...

```
Where scope can be:
* `Eliom_common.default_session_scope` (different value for each browser),
* `Eliom_common.default_process_scope` (different value for each tab),
* `Eliom_common.default_group_scope` (different value for each user),
* `Eliom_common.site_scope` (value for the whole site),
* `Eliom_common.global_scope` (global value for the whole server).
* `Eliom.Common.default_session_scope` (different value for each browser),
* `Eliom.Common.default_process_scope` (different value for each tab),
* `Eliom.Common.default_group_scope` (different value for each user),
* `Eliom.Common.site_scope` (value for the whole site),
* `Eliom.Common.global_scope` (global value for the whole server).
Eliom references are persistant if you add optional parameter `~persistent`
to function `Eliom_reference.eref`.
to function `Eliom.Reference.eref`.

## Learning Eliom

Expand Down
1 change: 0 additions & 1 deletion _tags

This file was deleted.

1 change: 0 additions & 1 deletion build/_tags

This file was deleted.

Loading
Loading