Skip to content
Open
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
ae7cc21
Replace xqlint parser with REx-generated XQuery 3.1 parser
joewiz Mar 15, 2026
770d4cf
Replace Ace editor with CodeMirror 6
joewiz Mar 15, 2026
aa1575c
Add Prettier-based code formatting for XQuery, XML, HTML, CSS, and more
joewiz Mar 15, 2026
4e77dae
Remove jQuery, jQuery UI, and AG Grid dependencies
joewiz Mar 15, 2026
85c9d6d
Add OpenAPI/Roaster REST API and remove legacy XQuery modules
joewiz Mar 15, 2026
a4b20a4
Redesign UI: toolbar, status bar, dialogs, tabs, dark mode, and outline
joewiz Mar 15, 2026
be322b0
Add CM6 autocomplete, semantic highlighting, and multi-language helpers
joewiz Mar 15, 2026
0578fb7
Add Cypress integration tests and remaining frontend updates
joewiz Mar 15, 2026
cf60941
Add tag matching, exist-next compat, and CI fixes
joewiz Mar 16, 2026
00bafd0
Add /api/query/references endpoint for find-all-references
joewiz Mar 16, 2026
150ef01
Add Tauri v2 scaffolding for eXide Desktop
joewiz Mar 16, 2026
9621143
Add Tauri filesystem/dialog plugins and desktop bridge
joewiz Mar 16, 2026
454e819
Add eXide Desktop: Tauri v2 native app with custom icon
joewiz Mar 16, 2026
aeef7ad
Add server connection page and store plugin for eXide Desktop
joewiz Mar 16, 2026
da98134
Add native macOS menu bar for eXide Desktop
joewiz Mar 17, 2026
0a61787
Add local filesystem pane for eXide Desktop
joewiz Mar 17, 2026
e046310
Add local file opening via custom localfs:// protocol
joewiz Mar 17, 2026
98216fc
Fix local file tab names, add connection timeout and cancel
joewiz Mar 17, 2026
29d826a
Add WebSocket transport layer for real-time LSP and monitoring
joewiz Mar 17, 2026
9d5be4f
Wire WebSocket auto-connect, monitoring, and LSP hover
joewiz Mar 17, 2026
3bcaf02
Fix WebSocket ping handling and add Cypress tests
joewiz Mar 17, 2026
42fe5f4
Fix LOCAL tab active indicator and match Collections pane styling
joewiz Mar 17, 2026
f4bacb1
Add WebSocket monitoring push and eXide channel subscription
joewiz Mar 17, 2026
d20cc86
Wire monitoring tab to WebSocket push for real-time updates
joewiz Mar 17, 2026
07c9629
Update monitor tests for WebSocket-based polling
joewiz Mar 17, 2026
b854b97
Push LSP diagnostics via WebSocket after compilation
joewiz Mar 17, 2026
505ec01
Stop JMX polling when WebSocket monitor takes over
joewiz Mar 17, 2026
0504a67
Fix monitoring: JMX running/recent queries via EXPath HTTP Client
joewiz Mar 17, 2026
8d37d65
Wire kill query button and add Cypress test
joewiz Mar 17, 2026
2c212c9
Fix duplicate namespace prefix in autocomplete and storage API path e…
joewiz Mar 18, 2026
def6732
Replace query execution with server-side cursor pagination via lsp:ev…
joewiz Mar 22, 2026
87ff519
Add AbortController-based cancel with update query warning
joewiz Mar 22, 2026
9110c49
Expand cancel warning to cover all state-modifying expressions
joewiz Mar 22, 2026
99a3085
Pass serialization parameters through cursor fetch pipeline
joewiz Mar 22, 2026
b640e92
Add pagination, large result, and serialization toggle tests
joewiz Mar 22, 2026
46cfbb2
Add Cypress tests for go-to-definition, references, tag matching, sco…
joewiz Mar 22, 2026
db773f8
Show compile/evaluate timing breakdown in results bar
joewiz Mar 22, 2026
3637f23
Update favicon to multi-resolution eXist X icon with transparent back…
joewiz Apr 4, 2026
23e5c33
Update LSP dependency from exist-lsp to exist-api package
joewiz Apr 4, 2026
60414ea
Add ws dev dependency for WebSocket endpoint testing
joewiz Apr 4, 2026
a23c9cf
Bump version to 3.6.0
joewiz Apr 12, 2026
da20fc6
Restore license header in collection.xconf.xsd
joewiz Apr 12, 2026
17c172b
Replace var with const/let in ui-init.js
joewiz Apr 12, 2026
42e6a71
Extract test file cleanup into cy.cleanupTestFiles() custom command
joewiz Apr 12, 2026
24ef119
Replace arbitrary cy.wait() with cy.intercept() named routes in autoc…
joewiz Apr 12, 2026
ea7d771
Remove committed REx.class binary; compile from REx.java on demand
joewiz Apr 12, 2026
1ddca80
Improve CI: unit tests, OpenAPI validation, gh CLI for Roaster download
joewiz Apr 12, 2026
46002c2
Separate copied results with newlines
joewiz Apr 13, 2026
ac72beb
Re-fetch page 1 when number-of-results changes
joewiz Apr 13, 2026
866b38d
Make active toggle buttons visually distinct from hover state
joewiz Apr 13, 2026
30dced8
Toggle menubar menu closed when clicking the active menu
joewiz Apr 13, 2026
699e333
[bugfix] Fix DB manager copy returning mixed sequence (SERE0023)
joewiz Apr 14, 2026
ca8e4e5
[test] Fix autocomplete insertion tests after cy.wait() removal
joewiz Apr 14, 2026
16fe4d0
Route query execution through exist-api, bump version to 4.0.0
joewiz Apr 14, 2026
27384e3
Add adaptive serialization Cypress tests
joewiz Apr 14, 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
20 changes: 17 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,28 @@ jobs:
- name: Build frontend Using node.js ${{ matrix.node-version }} and build EXPath Package
run: npm run build

- name: Download Roaster dependency
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would recommend using gh cli, and download both latest release and the min version as per expath-pkg.xml in a matrix

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[This response was co-authored with Claude Code. -Joe]

Done in commits ea7d771–1ddca80: replaced curl with gh release download (using the built-in GITHUB_TOKEN) for the Roaster dependency. The existing release/latest Docker matrix covers the most important cases — testing against the specific semver-min from expath-pkg.xml (6.1.0) would require an old Docker image that predates the Roaster/lsp:* dependencies this PR needs. Happy to add that as a separate matrix entry once we settle on the minimum version the full feature set requires.

run: curl -L -o build/roaster-1.12.0.xar https://github.com/eeditiones/roaster/releases/download/v1.12.0/roaster-1.12.0.xar

- name: Start eXist-db Docker Container
run: docker run --rm --name exist --volume $(pwd)/build:/exist/autodeploy:ro --publish 8080:8080 --detach existdb/existdb:${{ matrix.exist-version }}

- name: Wait for eXist-db Startup
run: timeout 90 sh -c 'until nc -z $0 $1; do sleep 3; done' localhost 8080
- name: Wait for eXist-db Startup and Package Deployment
run: |
for i in $(seq 1 24); do
HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/exist/apps/eXide/index.html || true)
echo "Attempt $i: HTTP $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "eXide is ready"
exit 0
fi
sleep 5
done
echo "Timed out waiting for eXide"
exit 1

- name: Run Cypress Integration Tests
run: npx cypress run
run: npx cypress run --spec 'cypress/e2e/*.cy.js'

- name: Upload Cypress Screenshots (on failure)
uses: actions/upload-artifact@v7
Expand Down
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
.DS_Store
.env
build/*
expath-pkg.xml

resources/scripts/xqlint.min.js
resources/scripts/ace
resources/scripts/prettier-bundle.js
resources/scripts/cm6-bundle.js
resources/scripts/ag-grid-bundle.js
resources/scripts/eXide.min.*
resources/scripts/jquery/jquery.plugins.min.*
resources/css/ag-grid-community/
Expand All @@ -18,8 +21,12 @@ node_modules/
cypress/videos/*.mp4
cypress/screenshots/**/*.png

CLAUDE.md

.*
!.gitignore
!.existdb.json
!.gitmodules
!.github
src-tauri/target/
dist-desktop/
6 changes: 0 additions & 6 deletions .gitmodules

This file was deleted.

8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

# eXide - a web-based XQuery IDE

eXide is a web-based XQuery IDE built around the [ace editor](https://ace.c9.io/). It is tightly integrated with the [eXist-db native XML database](https://exist-db.org).
eXide is a web-based XQuery IDE built around [CodeMirror 6](https://codemirror.net/). It is tightly integrated with the [eXist-db native XML database](https://exist-db.org).

## Features

Expand Down Expand Up @@ -52,7 +52,7 @@ To build eXide from scratch:
```bash
git clone git://github.com/eXist-db/eXide.git
cd eXide
git submodule update --init --recursive

```

Next, call `npm install` once:
Expand All @@ -73,15 +73,15 @@ You should now find a `.xar` file in the `build/` directory: `build/eXide-*.*.*.

We welcome contributions to help us improve both unit and integration tests. Current tests can be found in the `cypress/integration` folder.

eXide's GitHub repository is configured to run tests automatically on each PR via TravisCI (see `.travis.yml`).
eXide's GitHub repository is configured to run tests automatically on each PR via GitHub Actions.

To run tests locally, build and install eXide on localhost, and start the tests:

```shell
# clone the repo
git clone git://github.com/eXist-db/eXide.git
cd eXide
git submodule update --init --recursive

# build exide
npm install
# at this point if you are planning to build another branch change it now
Expand Down
10 changes: 0 additions & 10 deletions build.js

This file was deleted.

49 changes: 17 additions & 32 deletions controller.xq
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ declare variable $local:forwarded-for := request:get-header("X-Forwarded-URI");
declare variable $local:wants-json := tokenize(request:get-header('Accept'), ', ?') = 'application/json';

declare function local:get-user () as xs:string? {
let $login := login:set-user($local:login-domain, "P7D", false())
let $login := login:set-user($local:login-domain, xs:dayTimeDuration("P7D"), false())
let $user-id := request:get-attribute($local:login-domain || ".user")
return $user-id
};
Expand Down Expand Up @@ -105,6 +105,14 @@ else if ($local:method = 'get' and $exist:resource = "backdrop.svg") then
</forward>
</dispatch>

(: REST API — all /api/* requests are handled by Roaster.
: Placed before the unauthorized check so that Roaster can handle
: its own auth via OpenAPI security schemes and x-constraints. :)
else if (starts-with($exist:path, "/api/")) then
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<forward url="{$exist:controller}/modules/api/router.xq"/>
</dispatch>

(: handle unauthorized request :)

else if (not($user-allowed))
Expand Down Expand Up @@ -145,24 +153,6 @@ then (
<redirect url="index.html"/> <!-- maybe add additional parameters -->
</dispatch>
)
else if (starts-with($exist:path, "/store/")) then
let $resource := substring-after($exist:path, "/store")
return
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<forward url="{$exist:controller}/modules/store.xq">
<add-parameter name="path" value="{$resource}"/>
</forward>
</dispatch>

else if (starts-with($exist:path, "/check/")) then
let $resource := substring-after($exist:path, "/validate")
return
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<forward url="{$exist:controller}/modules/validate-xml.xq">
<add-parameter name="validate" value="no"/>
</forward>
</dispatch>

else if ($local:method = 'get' and $exist:resource = "index.html") then
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<view>
Expand Down Expand Up @@ -240,25 +230,20 @@ else if ($local:method = 'get' and starts-with($exist:path, '/results/')) then
</forward>
</dispatch>

else if ($local:method = 'post' and $exist:resource eq "outline") then
let $query := request:get-parameter("qu", ())
let $base := request:get-parameter("base", ())
return
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<!-- Query is executed by XQueryServlet -->
<forward url="modules/outline.xq">
<set-header name="Cache-Control" value="no-cache"/>
<set-attribute name="xquery.module-load-path" value="{$base}"/>
</forward>
</dispatch>

(: Disabled: debuger.xq is abandoned/non-functional
else if ($exist:resource eq "debug") then
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<!-- Query is executed by XQueryServlet -->
<forward url="modules/debuger.xq">
<set-header name="Cache-Control" value="no-cache"/>
</forward>
</dispatch>
:)

(: Block abandoned/non-functional modules :)
else if ($exist:resource = ("debuger.xq", "git.xq")) then (
response:set-status-code(410),
<gone>{ $exist:resource } is no longer available.</gone>
)

else if (ends-with($exist:path, ".xq")) then
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
Expand Down
Loading
Loading