htmx demos working: activation, fetch, swap, OOB filtering, test runner page
- htmx-boot-subtree! wired into process-elements for auto-activation
- Fixed cond compilation bug in hx-verb-info (Clojure-style flat cond)
- Platform io-fetch upgraded: method/body/headers support, full response dict
- Replaced perform IO ops with browser primitives (set-timeout, browser-confirm, etc)
- SX→HTML rendering in hx-do-swap with OOB section filtering
- hx-collect-params: collects input name/value for all methods
- Handler naming: ex-{slug} convention, removed perform IO dependencies
- Test runner page at (test.(applications.(htmx))) with iframe-based runner
- Header "test" link on every page linking to test URL
- Page file restructure: 285 files moved to URL-matching paths (a/b/c/index.sx)
- page-functions.sx: ~100 component name references updated
- _test added to skip_dirs, test- file prefix convention for test files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
176
sx/sx/applications/htmx/runner.sx
Normal file
176
sx/sx/applications/htmx/runner.sx
Normal file
@@ -0,0 +1,176 @@
|
||||
;; Test runner page for the htmx demo
|
||||
;; URL: /sx/(test.(applications.(htmx)))
|
||||
|
||||
(defcomp
|
||||
()
|
||||
(~docs/page
|
||||
:title "Test: htmx demos"
|
||||
(p
|
||||
(~tw :tokens "text-stone-500 mb-4")
|
||||
"Running tests against "
|
||||
(a
|
||||
:href "/sx/(applications.(htmx))"
|
||||
(~tw :tokens "text-violet-600 underline")
|
||||
"/sx/(applications.(htmx))"))
|
||||
(div
|
||||
(~tw :tokens "flex items-center gap-4 mb-4")
|
||||
(button
|
||||
:id "run-btn"
|
||||
(~tw
|
||||
:tokens "px-4 py-2 bg-violet-600 text-white rounded hover:bg-violet-700 transition-colors")
|
||||
"Run All Tests")
|
||||
(span :id "test-status" (~tw :tokens "text-sm text-stone-500") "Ready"))
|
||||
(div :id "test-summary" (~tw :tokens "mb-4"))
|
||||
(div
|
||||
:id "test-list"
|
||||
(~tw :tokens "space-y-2 mb-6")
|
||||
(details
|
||||
:class "sx-test-item"
|
||||
:data-test "click-to-load"
|
||||
(~tw :tokens "border border-stone-200 rounded-lg overflow-hidden")
|
||||
(summary
|
||||
(~tw
|
||||
:tokens "px-4 py-2 cursor-pointer hover:bg-stone-50 flex items-center gap-2")
|
||||
(span :data-role "test-icon" (~tw :tokens "font-bold") "○")
|
||||
(span (~tw :tokens "font-medium") "click-to-load")
|
||||
(span
|
||||
(~tw :tokens "text-sm text-stone-400 ml-auto")
|
||||
"Click button, verify content loads"))
|
||||
(div
|
||||
(~tw :tokens "px-4 py-3 bg-stone-50 border-t border-stone-200")
|
||||
(pre
|
||||
(~tw
|
||||
:tokens "text-xs font-mono whitespace-pre-wrap text-stone-600")
|
||||
"(deftest click-to-load\n :runner :playwright\n :url \"/sx/(applications.(htmx))\"\n (click \"button[hx-get]\")\n (wait 2000)\n (assert-text \"#click-result\" :contains \"Content loaded!\"))")))
|
||||
(details
|
||||
:class "sx-test-item"
|
||||
:data-test "click-no-oob-leak"
|
||||
(~tw :tokens "border border-stone-200 rounded-lg overflow-hidden")
|
||||
(summary
|
||||
(~tw
|
||||
:tokens "px-4 py-2 cursor-pointer hover:bg-stone-50 flex items-center gap-2")
|
||||
(span :data-role "test-icon" (~tw :tokens "font-bold") "○")
|
||||
(span (~tw :tokens "font-medium") "click-no-oob-leak")
|
||||
(span
|
||||
(~tw :tokens "text-sm text-stone-400 ml-auto")
|
||||
"OOB swap sections filtered from content"))
|
||||
(div
|
||||
(~tw :tokens "px-4 py-3 bg-stone-50 border-t border-stone-200")
|
||||
(pre
|
||||
(~tw
|
||||
:tokens "text-xs font-mono whitespace-pre-wrap text-stone-600")
|
||||
"(deftest click-no-oob-leak\n :runner :playwright\n :url \"/sx/(applications.(htmx))\"\n (click \"button[hx-get]\")\n (wait 2000)\n (assert-text \"#click-result\" :not-contains \"defcomp\"))")))
|
||||
(details
|
||||
:class "sx-test-item"
|
||||
:data-test "search-debounce"
|
||||
(~tw :tokens "border border-stone-200 rounded-lg overflow-hidden")
|
||||
(summary
|
||||
(~tw
|
||||
:tokens "px-4 py-2 cursor-pointer hover:bg-stone-50 flex items-center gap-2")
|
||||
(span :data-role "test-icon" (~tw :tokens "font-bold") "○")
|
||||
(span (~tw :tokens "font-medium") "search-debounce")
|
||||
(span
|
||||
(~tw :tokens "text-sm text-stone-400 ml-auto")
|
||||
"Type in search, results appear after debounce"))
|
||||
(div
|
||||
(~tw :tokens "px-4 py-3 bg-stone-50 border-t border-stone-200")
|
||||
(pre
|
||||
(~tw
|
||||
:tokens "text-xs font-mono whitespace-pre-wrap text-stone-600")
|
||||
"(deftest search-debounce\n :runner :playwright\n :url \"/sx/(applications.(htmx))\"\n (fill \"input[hx-get]\" \"hx-get\")\n (wait 1500)\n (assert-text \"#search-results\" :contains \"GET request\"))")))
|
||||
(details
|
||||
:class "sx-test-item"
|
||||
:data-test "search-no-results"
|
||||
(~tw :tokens "border border-stone-200 rounded-lg overflow-hidden")
|
||||
(summary
|
||||
(~tw
|
||||
:tokens "px-4 py-2 cursor-pointer hover:bg-stone-50 flex items-center gap-2")
|
||||
(span :data-role "test-icon" (~tw :tokens "font-bold") "○")
|
||||
(span (~tw :tokens "font-medium") "search-no-results")
|
||||
(span
|
||||
(~tw :tokens "text-sm text-stone-400 ml-auto")
|
||||
"Non-matching query shows no results"))
|
||||
(div
|
||||
(~tw :tokens "px-4 py-3 bg-stone-50 border-t border-stone-200")
|
||||
(pre
|
||||
(~tw
|
||||
:tokens "text-xs font-mono whitespace-pre-wrap text-stone-600")
|
||||
"(deftest search-no-results\n :runner :playwright\n :url \"/sx/(applications.(htmx))\"\n (fill \"input[hx-get]\" \"xyznonexistent\")\n (wait 1500)\n (assert-text \"#search-results\" :contains \"No results\"))")))
|
||||
(details
|
||||
:class "sx-test-item"
|
||||
:data-test "tab-overview"
|
||||
(~tw :tokens "border border-stone-200 rounded-lg overflow-hidden")
|
||||
(summary
|
||||
(~tw
|
||||
:tokens "px-4 py-2 cursor-pointer hover:bg-stone-50 flex items-center gap-2")
|
||||
(span :data-role "test-icon" (~tw :tokens "font-bold") "○")
|
||||
(span (~tw :tokens "font-medium") "tab-overview")
|
||||
(span
|
||||
(~tw :tokens "text-sm text-stone-400 ml-auto")
|
||||
"Click overview tab, verify content"))
|
||||
(div
|
||||
(~tw :tokens "px-4 py-3 bg-stone-50 border-t border-stone-200")
|
||||
(pre
|
||||
(~tw
|
||||
:tokens "text-xs font-mono whitespace-pre-wrap text-stone-600")
|
||||
"(deftest tab-overview\n :runner :playwright\n :url \"/sx/(applications.(htmx))\"\n (click \"button[hx-get*='tab=overview']\")\n (wait 2000)\n (assert-text \"#htmx-tab-content\" :contains \"htmx gives you access\"))")))
|
||||
(details
|
||||
:class "sx-test-item"
|
||||
:data-test "tab-features"
|
||||
(~tw :tokens "border border-stone-200 rounded-lg overflow-hidden")
|
||||
(summary
|
||||
(~tw
|
||||
:tokens "px-4 py-2 cursor-pointer hover:bg-stone-50 flex items-center gap-2")
|
||||
(span :data-role "test-icon" (~tw :tokens "font-bold") "○")
|
||||
(span (~tw :tokens "font-medium") "tab-features")
|
||||
(span
|
||||
(~tw :tokens "text-sm text-stone-400 ml-auto")
|
||||
"Click features tab, verify list"))
|
||||
(div
|
||||
(~tw :tokens "px-4 py-3 bg-stone-50 border-t border-stone-200")
|
||||
(pre
|
||||
(~tw
|
||||
:tokens "text-xs font-mono whitespace-pre-wrap text-stone-600")
|
||||
"(deftest tab-features\n :runner :playwright\n :url \"/sx/(applications.(htmx))\"\n (click \"button[hx-get*='tab=features']\")\n (wait 2000)\n (assert-text \"#htmx-tab-content\" :contains \"Any element\"))")))
|
||||
(details
|
||||
:class "sx-test-item"
|
||||
:data-test "append-item"
|
||||
(~tw :tokens "border border-stone-200 rounded-lg overflow-hidden")
|
||||
(summary
|
||||
(~tw
|
||||
:tokens "px-4 py-2 cursor-pointer hover:bg-stone-50 flex items-center gap-2")
|
||||
(span :data-role "test-icon" (~tw :tokens "font-bold") "○")
|
||||
(span (~tw :tokens "font-medium") "append-item")
|
||||
(span
|
||||
(~tw :tokens "text-sm text-stone-400 ml-auto")
|
||||
"POST appends new item to list"))
|
||||
(div
|
||||
(~tw :tokens "px-4 py-3 bg-stone-50 border-t border-stone-200")
|
||||
(pre
|
||||
(~tw
|
||||
:tokens "text-xs font-mono whitespace-pre-wrap text-stone-600")
|
||||
"(deftest append-item\n :runner :playwright\n :url \"/sx/(applications.(htmx))\"\n (click \"button[hx-post*='api.append']\")\n (wait 2000)\n (assert-count \"#item-list > *\" :gte 1))")))
|
||||
(details
|
||||
:class "sx-test-item"
|
||||
:data-test "form-submit"
|
||||
(~tw :tokens "border border-stone-200 rounded-lg overflow-hidden")
|
||||
(summary
|
||||
(~tw
|
||||
:tokens "px-4 py-2 cursor-pointer hover:bg-stone-50 flex items-center gap-2")
|
||||
(span :data-role "test-icon" (~tw :tokens "font-bold") "○")
|
||||
(span (~tw :tokens "font-medium") "form-submit")
|
||||
(span
|
||||
(~tw :tokens "text-sm text-stone-400 ml-auto")
|
||||
"POST form data, verify name in response"))
|
||||
(div
|
||||
(~tw :tokens "px-4 py-3 bg-stone-50 border-t border-stone-200")
|
||||
(pre
|
||||
(~tw
|
||||
:tokens "text-xs font-mono whitespace-pre-wrap text-stone-600")
|
||||
"(deftest form-submit\n :runner :playwright\n :url \"/sx/(applications.(htmx))\"\n (fill \"form[hx-post] input[name='name']\" \"Alice\")\n (fill \"form[hx-post] input[name='email']\" \"alice@test.com\")\n (click \"form[hx-post] button[type='submit']\")\n (wait 2000)\n (assert-text \"#form-result\" :contains \"Alice\"))"))))
|
||||
(iframe
|
||||
:id "test-iframe"
|
||||
:src "/sx/(applications.(htmx))"
|
||||
(~tw :tokens "w-full border border-stone-200 rounded-lg")
|
||||
:style "height:600px")
|
||||
(script :src "/static/scripts/sx-test-runner.js?v=7")))
|
||||
@@ -53,4 +53,11 @@
|
||||
(span
|
||||
(~tw :tokens "text-stone-300 text-xs")
|
||||
:style "margin-left:0.5em;"
|
||||
(a
|
||||
:href (str "/sx/(test." (slice path 4) ")")
|
||||
:data-sx-no-boost "true"
|
||||
:target "_self"
|
||||
(~tw :tokens "text-violet-400 text-xs hover:text-violet-600")
|
||||
:style "text-decoration:none;margin-right:0.4em;"
|
||||
"test")
|
||||
(str "· " path))))))))
|
||||
|
||||
@@ -18,11 +18,7 @@
|
||||
(list (make-symbol default-name))
|
||||
(list (slug->component slug prefix infix suffix))))))
|
||||
|
||||
(define
|
||||
home
|
||||
(fn
|
||||
(content)
|
||||
(if (nil? content) (quote (~docs-content/home-content)) content)))
|
||||
(define home (fn (content) (if (nil? content) (quote (~home)) content)))
|
||||
|
||||
(define language (fn (content) (if (nil? content) (quote (<>)) content)))
|
||||
|
||||
@@ -42,18 +38,13 @@
|
||||
|
||||
(define
|
||||
reactive
|
||||
(fn
|
||||
(content)
|
||||
(if
|
||||
(nil? content)
|
||||
(quote (~reactive-islands/index/reactive-islands-index-content))
|
||||
content)))
|
||||
(fn (content) (if (nil? content) (quote (~geography/reactive)) content)))
|
||||
|
||||
(define
|
||||
examples
|
||||
(make-page-fn
|
||||
"~reactive-islands/demo/reactive-islands-demo-content"
|
||||
"~reactive-islands/demo/example-"
|
||||
"~geography/reactive/examples"
|
||||
"~geography/reactive/examples/"
|
||||
nil
|
||||
""))
|
||||
|
||||
@@ -63,34 +54,28 @@
|
||||
(slug)
|
||||
(if
|
||||
(nil? slug)
|
||||
(quote (~geography/cek/cek-content))
|
||||
(quote (~geography/cek))
|
||||
(case
|
||||
slug
|
||||
"demo"
|
||||
(quote (~geography/cek/cek-demo-content))
|
||||
(quote (~geography/cek/demo))
|
||||
"freeze"
|
||||
(quote (~geography/cek/cek-freeze-content))
|
||||
(quote (~geography/cek/freeze))
|
||||
"content"
|
||||
(quote (~geography/cek/cek-content-address-content))
|
||||
:else (quote (~geography/cek/cek-content))))))
|
||||
(quote (~geography/cek/content))
|
||||
:else (quote (~geography/cek))))))
|
||||
|
||||
(define
|
||||
provide
|
||||
(fn
|
||||
(content)
|
||||
(if (nil? content) (quote (~geography/provide-content)) content)))
|
||||
(fn (content) (if (nil? content) (quote (~geography/provide)) content)))
|
||||
|
||||
(define
|
||||
scopes
|
||||
(fn
|
||||
(content)
|
||||
(if (nil? content) (quote (~geography/scopes-content)) content)))
|
||||
(fn (content) (if (nil? content) (quote (~geography/scopes)) content)))
|
||||
|
||||
(define
|
||||
spreads
|
||||
(fn
|
||||
(content)
|
||||
(if (nil? content) (quote (~geography/spreads-content)) content)))
|
||||
(fn (content) (if (nil? content) (quote (~geography/spreads)) content)))
|
||||
|
||||
(define
|
||||
marshes
|
||||
@@ -98,20 +83,20 @@
|
||||
(slug)
|
||||
(if
|
||||
(nil? slug)
|
||||
(quote (~reactive-islands/marshes/reactive-islands-marshes-content))
|
||||
(quote (~geography/marshes))
|
||||
(case
|
||||
slug
|
||||
"hypermedia-feeds"
|
||||
(quote (~reactive-islands/marshes/example-hypermedia-feeds))
|
||||
(quote (~geography/marshes/hypermedia-feeds))
|
||||
"server-signals"
|
||||
(quote (~reactive-islands/marshes/example-server-signals))
|
||||
(quote (~geography/marshes/server-signals))
|
||||
"on-settle"
|
||||
(quote (~reactive-islands/marshes/example-on-settle))
|
||||
(quote (~geography/marshes/on-settle))
|
||||
"signal-triggers"
|
||||
(quote (~reactive-islands/marshes/example-signal-triggers))
|
||||
(quote (~geography/marshes/signal-triggers))
|
||||
"view-transform"
|
||||
(quote (~reactive-islands/marshes/example-view-transform))
|
||||
:else (quote (~reactive-islands/marshes/reactive-islands-marshes-content))))))
|
||||
(quote (~geography/marshes/view-transform))
|
||||
:else (quote (~geography/marshes))))))
|
||||
|
||||
(define
|
||||
isomorphism
|
||||
@@ -119,14 +104,14 @@
|
||||
(slug)
|
||||
(if
|
||||
(nil? slug)
|
||||
(quote (~plans/isomorphic/plan-isomorphic-content))
|
||||
(quote (~geography/isomorphism))
|
||||
(case
|
||||
slug
|
||||
"bundle-analyzer"
|
||||
(let
|
||||
((data (helper "bundle-analyzer-data")))
|
||||
(quasiquote
|
||||
(~analyzer/bundle-analyzer-content
|
||||
(~geography/isomorphism/bundle-analyzer
|
||||
:pages (unquote (get data "pages"))
|
||||
:total-components (unquote (get data "total-components"))
|
||||
:total-macros (unquote (get data "total-macros"))
|
||||
@@ -136,7 +121,7 @@
|
||||
(let
|
||||
((data (helper "routing-analyzer-data")))
|
||||
(quasiquote
|
||||
(~routing-analyzer/content
|
||||
(~geography/isomorphism/routing-analyzer
|
||||
:pages (unquote (get data "pages"))
|
||||
:total-pages (unquote (get data "total-pages"))
|
||||
:client-count (unquote (get data "client-count"))
|
||||
@@ -146,35 +131,35 @@
|
||||
(let
|
||||
((data (helper "data-test-data")))
|
||||
(quasiquote
|
||||
(~data-test/content
|
||||
(~geography/isomorphism/data-test
|
||||
:server-time (unquote (get data "server-time"))
|
||||
:items (unquote (get data "items"))
|
||||
:phase (unquote (get data "phase"))
|
||||
:transport (unquote (get data "transport")))))
|
||||
"async-io"
|
||||
(quote (~async-io-demo/content))
|
||||
(quote (~geography/isomorphism/async-io))
|
||||
"affinity"
|
||||
(let
|
||||
((data (helper "affinity-demo-data")))
|
||||
(quasiquote
|
||||
(~affinity-demo/content
|
||||
(~geography/isomorphism/affinity
|
||||
:components (unquote (get data "components"))
|
||||
:page-plans (unquote (get data "page-plans")))))
|
||||
"optimistic"
|
||||
(let
|
||||
((data (helper "optimistic-demo-data")))
|
||||
(quasiquote
|
||||
(~optimistic-demo/content
|
||||
(~geography/isomorphism/optimistic
|
||||
:items (unquote (get data "items"))
|
||||
:server-time (unquote (get data "server-time")))))
|
||||
"offline"
|
||||
(let
|
||||
((data (helper "offline-demo-data")))
|
||||
(quasiquote
|
||||
(~offline-demo/content
|
||||
(~geography/isomorphism/offline
|
||||
:notes (unquote (get data "notes"))
|
||||
:server-time (unquote (get data "server-time")))))
|
||||
:else (quote (~plans/isomorphic/plan-isomorphic-content))))))
|
||||
:else (quote (~geography/isomorphism))))))
|
||||
|
||||
(define
|
||||
doc
|
||||
@@ -182,32 +167,34 @@
|
||||
(slug)
|
||||
(if
|
||||
(nil? slug)
|
||||
(quote (~docs-content/docs-introduction-content))
|
||||
(quote (~language/doc/introduction))
|
||||
(case
|
||||
slug
|
||||
"introduction"
|
||||
(quote (~docs-content/docs-introduction-content))
|
||||
(quote (~language/doc/introduction))
|
||||
"getting-started"
|
||||
(quote (~docs-content/docs-getting-started-content))
|
||||
(quote (~language/doc/getting-started))
|
||||
"components"
|
||||
(quote (~docs-content/docs-components-content))
|
||||
(quote (~language/doc/components))
|
||||
"evaluator"
|
||||
(quote (~docs-content/docs-evaluator-content))
|
||||
(quote (~language/doc/evaluator))
|
||||
"primitives"
|
||||
(let
|
||||
((data (helper "primitives-data")))
|
||||
(quasiquote
|
||||
(~docs-content/docs-primitives-content
|
||||
:prims (~docs/primitives-tables :primitives (unquote data)))))
|
||||
(~language/doc/primitives
|
||||
:prims (~language/doc/_shared/primitives-tables
|
||||
:primitives (unquote data)))))
|
||||
"special-forms"
|
||||
(let
|
||||
((data (helper "special-forms-data")))
|
||||
(quasiquote
|
||||
(~docs-content/docs-special-forms-content
|
||||
:forms (~docs/special-forms-tables :forms (unquote data)))))
|
||||
(~language/doc/special-forms
|
||||
:forms (~language/doc/_shared/special-forms-tables
|
||||
:forms (unquote data)))))
|
||||
"server-rendering"
|
||||
(quote (~docs-content/docs-server-rendering-content))
|
||||
:else (quote (~docs-content/docs-introduction-content))))))
|
||||
(quote (~language/doc/server-rendering))
|
||||
:else (quote (~language/doc/introduction))))))
|
||||
|
||||
(define
|
||||
spec
|
||||
@@ -215,7 +202,7 @@
|
||||
(slug)
|
||||
(cond
|
||||
(nil? slug)
|
||||
(quote (~specs/architecture-content))
|
||||
(quote (~language/spec))
|
||||
(not (= (type-of slug) "string"))
|
||||
slug
|
||||
:else (case
|
||||
@@ -224,42 +211,42 @@
|
||||
(let
|
||||
((files (make-spec-files core-spec-items)))
|
||||
(quasiquote
|
||||
(~specs/overview-content
|
||||
(~language/spec/_shared/overview-content
|
||||
:spec-title "Core Language"
|
||||
:spec-files (unquote files))))
|
||||
"adapters"
|
||||
(let
|
||||
((files (make-spec-files adapter-spec-items)))
|
||||
(quasiquote
|
||||
(~specs/overview-content
|
||||
(~language/spec/_shared/overview-content
|
||||
:spec-title "Adapters"
|
||||
:spec-files (unquote files))))
|
||||
"browser"
|
||||
(let
|
||||
((files (make-spec-files browser-spec-items)))
|
||||
(quasiquote
|
||||
(~specs/overview-content
|
||||
(~language/spec/_shared/overview-content
|
||||
:spec-title "Browser Runtime"
|
||||
:spec-files (unquote files))))
|
||||
"reactive"
|
||||
(let
|
||||
((files (make-spec-files reactive-spec-items)))
|
||||
(quasiquote
|
||||
(~specs/overview-content
|
||||
(~language/spec/_shared/overview-content
|
||||
:spec-title "Reactive System"
|
||||
:spec-files (unquote files))))
|
||||
"host"
|
||||
(let
|
||||
((files (make-spec-files host-spec-items)))
|
||||
(quasiquote
|
||||
(~specs/overview-content
|
||||
(~language/spec/_shared/overview-content
|
||||
:spec-title "Host Interface"
|
||||
:spec-files (unquote files))))
|
||||
"extensions"
|
||||
(let
|
||||
((files (make-spec-files extension-spec-items)))
|
||||
(quasiquote
|
||||
(~specs/overview-content
|
||||
(~language/spec/_shared/overview-content
|
||||
:spec-title "Extensions"
|
||||
:spec-files (unquote files))))
|
||||
:else (let
|
||||
@@ -269,13 +256,14 @@
|
||||
(let
|
||||
((src (helper "read-spec-file" (get found-spec "filename"))))
|
||||
(quasiquote
|
||||
(~specs/detail-content
|
||||
(~language/spec/_shared/detail-content
|
||||
:spec-title (unquote (get found-spec "title"))
|
||||
:spec-desc (unquote (get found-spec "desc"))
|
||||
:spec-filename (unquote (get found-spec "filename"))
|
||||
:spec-source (unquote src)
|
||||
:spec-prose (unquote (get found-spec "prose")))))
|
||||
(quasiquote (~specs/not-found :slug (unquote slug)))))))))
|
||||
(quasiquote
|
||||
(~language/spec/_shared/not-found :slug (unquote slug)))))))))
|
||||
|
||||
(define
|
||||
explore
|
||||
@@ -332,17 +320,18 @@
|
||||
(slug)
|
||||
(if
|
||||
(nil? slug)
|
||||
(quote (~specs/bootstrappers-index-content))
|
||||
(quote (~language/bootstrapper))
|
||||
(let
|
||||
((data (helper "bootstrapper-data" slug)))
|
||||
(if
|
||||
(get data "bootstrapper-not-found")
|
||||
(quasiquote (~specs/not-found :slug (unquote slug)))
|
||||
(quasiquote
|
||||
(~language/bootstrapper/_shared/not-found :slug (unquote slug)))
|
||||
(case
|
||||
slug
|
||||
"self-hosting"
|
||||
(quasiquote
|
||||
(~specs/bootstrapper-self-hosting-content
|
||||
(~language/bootstrapper/self-hosting
|
||||
:py-sx-source (unquote (get data "py-sx-source"))
|
||||
:g0-output (unquote (get data "g0-output"))
|
||||
:g1-output (unquote (get data "g1-output"))
|
||||
@@ -353,7 +342,7 @@
|
||||
:verification-status (unquote (get data "verification-status"))))
|
||||
"self-hosting-js"
|
||||
(quasiquote
|
||||
(~specs/bootstrapper-self-hosting-js-content
|
||||
(~language/bootstrapper/self-hosting-js
|
||||
:js-sx-source (unquote (get data "js-sx-source"))
|
||||
:defines-matched (unquote (get data "defines-matched"))
|
||||
:defines-total (unquote (get data "defines-total"))
|
||||
@@ -361,14 +350,14 @@
|
||||
:verification-status (unquote (get data "verification-status"))))
|
||||
"python"
|
||||
(quasiquote
|
||||
(~specs/bootstrapper-py-content
|
||||
(~language/bootstrapper/python
|
||||
:bootstrapper-source (unquote (get data "bootstrapper-source"))
|
||||
:bootstrapped-output (unquote (get data "bootstrapped-output"))))
|
||||
"page-helpers"
|
||||
(let
|
||||
((ph-data (helper "page-helpers-demo-data")))
|
||||
(quasiquote
|
||||
(~page-helpers-demo/content
|
||||
(~language/bootstrapper/page-helpers
|
||||
:sf-categories (unquote (get ph-data "sf-categories"))
|
||||
:sf-total (unquote (get ph-data "sf-total"))
|
||||
:sf-ms (unquote (get ph-data "sf-ms"))
|
||||
@@ -386,7 +375,7 @@
|
||||
:req-attrs (unquote (get ph-data "req-attrs"))
|
||||
:attr-keys (unquote (get ph-data "attr-keys")))))
|
||||
:else (quasiquote
|
||||
(~specs/bootstrapper-js-content
|
||||
(~language/bootstrapper/javascript
|
||||
:bootstrapper-source (unquote (get data "bootstrapper-source"))
|
||||
:bootstrapped-output (unquote (get data "bootstrapped-output"))))))))))
|
||||
|
||||
@@ -397,9 +386,9 @@
|
||||
(if
|
||||
(nil? slug)
|
||||
(let
|
||||
((data (helper "run-modular-tests" "all")))
|
||||
((data (perform (list (quote io-test-data)))))
|
||||
(quasiquote
|
||||
(~testing/overview-content
|
||||
(~language/test
|
||||
:server-results (unquote (get data "server-results"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:eval-source (unquote (get data "eval-source"))
|
||||
@@ -408,80 +397,85 @@
|
||||
:render-source (unquote (get data "render-source"))
|
||||
:deps-source (unquote (get data "deps-source"))
|
||||
:engine-source (unquote (get data "engine-source")))))
|
||||
(case
|
||||
slug
|
||||
"runners"
|
||||
(quote (~testing/runners-content))
|
||||
:else (let
|
||||
((data (helper "run-modular-tests" slug)))
|
||||
(case
|
||||
slug
|
||||
"eval"
|
||||
(quasiquote
|
||||
(~testing/spec-content
|
||||
:spec-name "eval"
|
||||
:spec-title "Evaluator Tests"
|
||||
:spec-desc "81 tests covering the core evaluator and all primitives."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"parser"
|
||||
(quasiquote
|
||||
(~testing/spec-content
|
||||
:spec-name "parser"
|
||||
:spec-title "Parser Tests"
|
||||
:spec-desc "39 tests covering tokenization and parsing."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"router"
|
||||
(quasiquote
|
||||
(~testing/spec-content
|
||||
:spec-name "router"
|
||||
:spec-title "Router Tests"
|
||||
:spec-desc "18 tests covering client-side route matching."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"render"
|
||||
(quasiquote
|
||||
(~testing/spec-content
|
||||
:spec-name "render"
|
||||
:spec-title "Renderer Tests"
|
||||
:spec-desc "23 tests covering HTML rendering."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"deps"
|
||||
(quasiquote
|
||||
(~testing/spec-content
|
||||
:spec-name "deps"
|
||||
:spec-title "Dependency Analysis Tests"
|
||||
:spec-desc "33 tests covering component dependency analysis."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"engine"
|
||||
(quasiquote
|
||||
(~testing/spec-content
|
||||
:spec-name "engine"
|
||||
:spec-title "Engine Tests"
|
||||
:spec-desc "37 tests covering engine pure functions."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"orchestration"
|
||||
(quasiquote
|
||||
(~testing/spec-content
|
||||
:spec-name "orchestration"
|
||||
:spec-title "Orchestration Tests"
|
||||
:spec-desc "17 tests covering orchestration."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
:else (quasiquote
|
||||
(~testing/overview-content
|
||||
:server-results (unquote (get data "server-results"))))))))))
|
||||
(if
|
||||
(not (string? slug))
|
||||
(quote (~applications/htmx/runner))
|
||||
(case
|
||||
slug
|
||||
"runners"
|
||||
(quote (~language/test/runners))
|
||||
"applications"
|
||||
(quote (~applications/htmx/runner))
|
||||
:else (let
|
||||
((data (perform (list (quote io-test-data) slug))))
|
||||
(case
|
||||
slug
|
||||
"eval"
|
||||
(quasiquote
|
||||
(~language/test/_shared/spec-content
|
||||
:spec-name "eval"
|
||||
:spec-title "Evaluator Tests"
|
||||
:spec-desc "81 tests covering the core evaluator."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"parser"
|
||||
(quasiquote
|
||||
(~language/test/_shared/spec-content
|
||||
:spec-name "parser"
|
||||
:spec-title "Parser Tests"
|
||||
:spec-desc "39 tests covering tokenization and parsing."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"router"
|
||||
(quasiquote
|
||||
(~language/test/_shared/spec-content
|
||||
:spec-name "router"
|
||||
:spec-title "Router Tests"
|
||||
:spec-desc "18 tests covering client-side route matching."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"render"
|
||||
(quasiquote
|
||||
(~language/test/_shared/spec-content
|
||||
:spec-name "render"
|
||||
:spec-title "Renderer Tests"
|
||||
:spec-desc "23 tests covering HTML rendering."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"deps"
|
||||
(quasiquote
|
||||
(~language/test/_shared/spec-content
|
||||
:spec-name "deps"
|
||||
:spec-title "Dependency Analysis Tests"
|
||||
:spec-desc "33 tests covering component dependency analysis."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"engine"
|
||||
(quasiquote
|
||||
(~language/test/_shared/spec-content
|
||||
:spec-name "engine"
|
||||
:spec-title "Engine Tests"
|
||||
:spec-desc "37 tests covering engine pure functions."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
"orchestration"
|
||||
(quasiquote
|
||||
(~language/test/_shared/spec-content
|
||||
:spec-name "orchestration"
|
||||
:spec-title "Orchestration Tests"
|
||||
:spec-desc "17 tests covering orchestration."
|
||||
:spec-source (unquote (get data "spec-source"))
|
||||
:framework-source (unquote (get data "framework-source"))
|
||||
:server-results (unquote (get data "server-results"))))
|
||||
:else (quasiquote
|
||||
(~language/test
|
||||
:server-results (unquote (get data "server-results")))))))))))
|
||||
|
||||
(define
|
||||
reference
|
||||
@@ -489,57 +483,57 @@
|
||||
(slug)
|
||||
(if
|
||||
(nil? slug)
|
||||
(quote (~examples/reference-index-content))
|
||||
(quote (~geography/hypermedia/reference))
|
||||
(let
|
||||
((data (helper "reference-data" slug)))
|
||||
(case
|
||||
slug
|
||||
"attributes"
|
||||
(quasiquote
|
||||
(~reference/attrs-content
|
||||
:req-table (~docs/attr-table-from-data
|
||||
(~geography/hypermedia/reference/attributes
|
||||
:req-table (~geography/hypermedia/reference/_shared/attr-table-from-data
|
||||
:title "Request Attributes"
|
||||
:attrs (unquote (get data "req-attrs")))
|
||||
:beh-table (~docs/attr-table-from-data
|
||||
:beh-table (~geography/hypermedia/reference/_shared/attr-table-from-data
|
||||
:title "Behavior Attributes"
|
||||
:attrs (unquote (get data "beh-attrs")))
|
||||
:uniq-table (~docs/attr-table-from-data
|
||||
:uniq-table (~geography/hypermedia/reference/_shared/attr-table-from-data
|
||||
:title "Unique to sx"
|
||||
:attrs (unquote (get data "uniq-attrs")))))
|
||||
"headers"
|
||||
(quasiquote
|
||||
(~reference/headers-content
|
||||
:req-table (~docs/headers-table-from-data
|
||||
(~geography/hypermedia/reference/headers
|
||||
:req-table (~geography/hypermedia/reference/_shared/headers-table-from-data
|
||||
:title "Request Headers"
|
||||
:headers (unquote (get data "req-headers")))
|
||||
:resp-table (~docs/headers-table-from-data
|
||||
:resp-table (~geography/hypermedia/reference/_shared/headers-table-from-data
|
||||
:title "Response Headers"
|
||||
:headers (unquote (get data "resp-headers")))))
|
||||
"events"
|
||||
(quasiquote
|
||||
(~reference/events-content
|
||||
:table (~docs/two-col-table-from-data
|
||||
(~geography/hypermedia/reference/events
|
||||
:table (~geography/hypermedia/reference/_shared/two-col-table-from-data
|
||||
:intro "sx fires custom DOM events at various points in the request lifecycle."
|
||||
:col1 "Event"
|
||||
:col2 "Description"
|
||||
:items (unquote (get data "events-list")))))
|
||||
"js-api"
|
||||
(quasiquote
|
||||
(~reference/js-api-content
|
||||
:table (~docs/two-col-table-from-data
|
||||
(~geography/hypermedia/reference/js-api
|
||||
:table (~geography/hypermedia/reference/_shared/two-col-table-from-data
|
||||
:intro "The client-side sx.js library exposes a public API for programmatic use."
|
||||
:col1 "Method"
|
||||
:col2 "Description"
|
||||
:items (unquote (get data "js-api-list")))))
|
||||
:else (quasiquote
|
||||
(~reference/attrs-content
|
||||
:req-table (~docs/attr-table-from-data
|
||||
(~geography/hypermedia/reference/attributes
|
||||
:req-table (~geography/hypermedia/reference/_shared/attr-table-from-data
|
||||
:title "Request Attributes"
|
||||
:attrs (unquote (get data "req-attrs")))
|
||||
:beh-table (~docs/attr-table-from-data
|
||||
:beh-table (~geography/hypermedia/reference/_shared/attr-table-from-data
|
||||
:title "Behavior Attributes"
|
||||
:attrs (unquote (get data "beh-attrs")))
|
||||
:uniq-table (~docs/attr-table-from-data
|
||||
:uniq-table (~geography/hypermedia/reference/_shared/attr-table-from-data
|
||||
:title "Unique to sx"
|
||||
:attrs (unquote (get data "uniq-attrs"))))))))))
|
||||
|
||||
@@ -557,9 +551,11 @@
|
||||
((data (helper "attr-detail-data" slug)))
|
||||
(if
|
||||
(get data "attr-not-found")
|
||||
(quasiquote (~reference/attr-not-found :slug (unquote slug)))
|
||||
(quasiquote
|
||||
(~reference/attr-detail-content
|
||||
(~geography/hypermedia/reference/_shared/attr-not-found
|
||||
:slug (unquote slug)))
|
||||
(quasiquote
|
||||
(~geography/hypermedia/reference/_shared/attr-detail-content
|
||||
:title (unquote (get data "attr-title"))
|
||||
:description (unquote (get data "attr-description"))
|
||||
:demo (unquote (get data "attr-demo"))
|
||||
@@ -571,9 +567,11 @@
|
||||
((data (helper "header-detail-data" slug)))
|
||||
(if
|
||||
(get data "header-not-found")
|
||||
(quasiquote (~reference/attr-not-found :slug (unquote slug)))
|
||||
(quasiquote
|
||||
(~reference/header-detail-content
|
||||
(~geography/hypermedia/reference/_shared/attr-not-found
|
||||
:slug (unquote slug)))
|
||||
(quasiquote
|
||||
(~geography/hypermedia/reference/_shared/header-detail-content
|
||||
:title (unquote (get data "header-title"))
|
||||
:direction (unquote (get data "header-direction"))
|
||||
:description (unquote (get data "header-description"))
|
||||
@@ -584,9 +582,11 @@
|
||||
((data (helper "event-detail-data" slug)))
|
||||
(if
|
||||
(get data "event-not-found")
|
||||
(quasiquote (~reference/attr-not-found :slug (unquote slug)))
|
||||
(quasiquote
|
||||
(~reference/event-detail-content
|
||||
(~geography/hypermedia/reference/_shared/attr-not-found
|
||||
:slug (unquote slug)))
|
||||
(quasiquote
|
||||
(~geography/hypermedia/reference/_shared/event-detail-content
|
||||
:title (unquote (get data "event-title"))
|
||||
:description (unquote (get data "event-description"))
|
||||
:example-code (unquote (get data "event-example"))
|
||||
@@ -600,26 +600,26 @@
|
||||
(if
|
||||
(nil? slug)
|
||||
""
|
||||
(list (slug->component slug "~examples-content/example-" nil "")))))
|
||||
(list (slug->component slug "~geography/hypermedia/example/" nil "")))))
|
||||
|
||||
(define sx-urls (fn (slug) (quote (~sx-urls/urls-content))))
|
||||
(define sx-urls (fn (slug) (quote (~applications/sx-urls))))
|
||||
|
||||
(define cssx (make-page-fn "~cssx/overview-content" "~cssx/" nil "-content"))
|
||||
(define cssx (make-page-fn "~applications/cssx" "~applications/cssx/" nil ""))
|
||||
|
||||
(define
|
||||
protocol
|
||||
(make-page-fn "~protocols/wire-format-content" "~protocols/" nil "-content"))
|
||||
(make-page-fn "~applications/protocol" "~applications/protocol/" nil ""))
|
||||
|
||||
(define
|
||||
sx-pub
|
||||
(fn (slug) (if (nil? slug) (quote (~sx-pub/overview-content)) nil)))
|
||||
(fn (slug) (if (nil? slug) (quote (~applications/sx-pub)) nil)))
|
||||
|
||||
(define
|
||||
sx-tools
|
||||
(fn
|
||||
(&key title &rest args)
|
||||
(quasiquote
|
||||
(~sx-tools/overview-content
|
||||
(~tools/sx-tools
|
||||
:title (unquote (or title "SX Tools"))
|
||||
(splice-unquote args)))))
|
||||
|
||||
@@ -630,7 +630,7 @@
|
||||
(fn
|
||||
(&key title &rest args)
|
||||
(quasiquote
|
||||
(~playground/content
|
||||
(~tools/playground
|
||||
:title (unquote (or title "Playground"))
|
||||
(splice-unquote args)))))
|
||||
|
||||
@@ -639,29 +639,27 @@
|
||||
(fn
|
||||
(&key title &rest args)
|
||||
(quasiquote
|
||||
(~services-tools/overview-content
|
||||
(~tools/services
|
||||
:title (unquote (or title "Services"))
|
||||
(splice-unquote args)))))
|
||||
|
||||
(define
|
||||
reactive-runtime
|
||||
(make-page-fn
|
||||
"~reactive-runtime/overview-content"
|
||||
"~reactive-runtime/"
|
||||
"~geography/reactive-runtime"
|
||||
"~geography/reactive-runtime/"
|
||||
nil
|
||||
"-content"))
|
||||
""))
|
||||
|
||||
(define
|
||||
native-browser
|
||||
(make-page-fn
|
||||
"~applications/native-browser/content"
|
||||
"~applications/native-browser"
|
||||
"~applications/native-browser/"
|
||||
nil
|
||||
"-content"))
|
||||
""))
|
||||
|
||||
(define
|
||||
essay
|
||||
(make-page-fn "~essays/index/essays-index-content" "~essays/" "/essay-" ""))
|
||||
(define essay (make-page-fn "~etc/essay" "~etc/essay/" nil ""))
|
||||
|
||||
(define
|
||||
philosophy
|
||||
@@ -669,67 +667,53 @@
|
||||
(slug)
|
||||
(if
|
||||
(nil? slug)
|
||||
(quote (~essays/philosophy-index/content))
|
||||
(quote (~etc/philosophy))
|
||||
(case
|
||||
slug
|
||||
"sx-manifesto"
|
||||
(quote (~essay-sx-manifesto))
|
||||
(quote (~etc/philosophy/sx-manifesto))
|
||||
"godel-escher-bach"
|
||||
(quote (~essays/godel-escher-bach/essay-godel-escher-bach))
|
||||
(quote (~etc/philosophy/godel-escher-bach))
|
||||
"wittgenstein"
|
||||
(quote (~essays/sx-and-wittgenstein/essay-sx-and-wittgenstein))
|
||||
(quote (~etc/philosophy/wittgenstein))
|
||||
"dennett"
|
||||
(quote (~essays/sx-and-dennett/essay-sx-and-dennett))
|
||||
(quote (~etc/philosophy/dennett))
|
||||
"existentialism"
|
||||
(quote (~essays/s-existentialism/essay-s-existentialism))
|
||||
(quote (~etc/philosophy/existentialism))
|
||||
"platonic-sx"
|
||||
(quote (~essays/platonic-sx/essay-platonic-sx))
|
||||
:else (quote (~essays/philosophy-index/content))))))
|
||||
(quote (~etc/philosophy/platonic-sx))
|
||||
:else (quote (~etc/philosophy))))))
|
||||
|
||||
(define
|
||||
plan
|
||||
(make-page-fn
|
||||
"~plans/index/plans-index-content"
|
||||
"~plans/"
|
||||
"/plan-"
|
||||
"-content"))
|
||||
(define plan (make-page-fn "~etc/plan" "~etc/plan/" nil ""))
|
||||
|
||||
(define
|
||||
capabilities
|
||||
(fn
|
||||
(&key title &rest args)
|
||||
(quasiquote (~geography/capabilities-content))))
|
||||
(fn (&key title &rest args) (quasiquote (~geography/capabilities))))
|
||||
|
||||
(define
|
||||
modules
|
||||
(fn (&key title &rest args) (quasiquote (~geography/modules-content))))
|
||||
(fn (&key title &rest args) (quasiquote (~geography/modules))))
|
||||
|
||||
(define
|
||||
eval-rules
|
||||
(fn (&key title &rest args) (quasiquote (~geography/eval-rules-content))))
|
||||
(fn (&key title &rest args) (quasiquote (~geography/eval-rules))))
|
||||
|
||||
(define
|
||||
hyperscript
|
||||
(make-page-fn
|
||||
"~hyperscript/playground-content"
|
||||
"~hyperscript/"
|
||||
"~applications/hyperscript"
|
||||
"~applications/hyperscript/"
|
||||
nil
|
||||
"-content"))
|
||||
""))
|
||||
|
||||
(define htmx (make-page-fn "~htmx/demo-content" "~htmx/" nil "-content"))
|
||||
(define htmx (make-page-fn "~applications/htmx" "~applications/htmx/" nil ""))
|
||||
|
||||
(define
|
||||
sxtp
|
||||
(make-page-fn
|
||||
"~applications/sxtp/content"
|
||||
"~applications/sxtp/"
|
||||
nil
|
||||
"-content"))
|
||||
(define sxtp (make-page-fn "~applications/sxtp" "~applications/sxtp/" nil ""))
|
||||
|
||||
(define
|
||||
graphql
|
||||
(make-page-fn "~graphql/demo-content" "~graphql/" nil "-content"))
|
||||
(make-page-fn "~applications/graphql" "~applications/graphql/" nil ""))
|
||||
|
||||
(define
|
||||
pretext
|
||||
(make-page-fn "~pretext-demo/content" "~pretext-demo/" nil "-content"))
|
||||
(make-page-fn "~applications/pretext" "~applications/pretext/" nil ""))
|
||||
|
||||
Reference in New Issue
Block a user