@pathmx/core 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/LICENSE.md +172 -0
  2. package/README.md +111 -0
  3. package/actions/actions.ts +307 -0
  4. package/actions/draft.ts +105 -0
  5. package/actions/transaction.ts +164 -0
  6. package/assets.ts +149 -0
  7. package/authority/access.ts +820 -0
  8. package/authority/actors.ts +271 -0
  9. package/authority/agents.ts +95 -0
  10. package/authority/credentials.ts +144 -0
  11. package/authority/model.ts +71 -0
  12. package/authority/sharing.ts +89 -0
  13. package/browser-bundle.ts +61 -0
  14. package/canonical.ts +41 -0
  15. package/cli/dev.ts +134 -0
  16. package/cli/export.ts +74 -0
  17. package/cli/index.ts +52 -0
  18. package/cli/lint.ts +164 -0
  19. package/cli/mv.ts +30 -0
  20. package/cli/perms.ts +182 -0
  21. package/cli/plugin-packages.ts +159 -0
  22. package/cli/plugins.ts +95 -0
  23. package/cli/query.ts +225 -0
  24. package/cli/readme.md +95 -0
  25. package/cli/release.ts +75 -0
  26. package/cli/rm.ts +22 -0
  27. package/cli/serve.ts +100 -0
  28. package/cli/tree.ts +131 -0
  29. package/cli/update.ts +78 -0
  30. package/cli/utils.ts +53 -0
  31. package/core.ts +96 -0
  32. package/database.ts +189 -0
  33. package/dependencies.ts +60 -0
  34. package/dist/pathmx.js +1224 -0
  35. package/document.ts +194 -0
  36. package/environment.ts +110 -0
  37. package/environments/bun-plugins.ts +68 -0
  38. package/environments/bun-publish.ts +194 -0
  39. package/environments/bun.ts +223 -0
  40. package/globals.d.ts +14 -0
  41. package/graph.ts +153 -0
  42. package/host/compiler.ts +314 -0
  43. package/host/create.ts +66 -0
  44. package/host/engine.ts +630 -0
  45. package/host/plugin-host.ts +487 -0
  46. package/host/render.ts +102 -0
  47. package/host/response.ts +20 -0
  48. package/host/shell.html +15 -0
  49. package/host/source-sync.ts +254 -0
  50. package/html-attributes.ts +15 -0
  51. package/html.ts +48 -0
  52. package/icons/LICENSE +43 -0
  53. package/icons/lucide.ts +54 -0
  54. package/index.ts +75 -0
  55. package/invalidation.ts +85 -0
  56. package/log.ts +84 -0
  57. package/ops/href.ts +87 -0
  58. package/ops/index.ts +9 -0
  59. package/ops/move-source.ts +114 -0
  60. package/ops/plan.ts +47 -0
  61. package/ops/remove-source.ts +70 -0
  62. package/package.json +46 -0
  63. package/path.ts +75 -0
  64. package/pattern.ts +314 -0
  65. package/perf.ts +88 -0
  66. package/plugins/actor-path.ts +43 -0
  67. package/plugins/actor-profile.ts +55 -0
  68. package/plugins/agent-browsing.ts +183 -0
  69. package/plugins/app-component.ts +23 -0
  70. package/plugins/block-layout/index.ts +78 -0
  71. package/plugins/block-layout/theme.css +90 -0
  72. package/plugins/callout/index.ts +236 -0
  73. package/plugins/callout/theme.css +138 -0
  74. package/plugins/canonical-links.ts +144 -0
  75. package/plugins/code-highlight/client.ts +89 -0
  76. package/plugins/code-highlight/index.ts +147 -0
  77. package/plugins/code-highlight/theme.css +89 -0
  78. package/plugins/context.ts +131 -0
  79. package/plugins/datatype/Datatype[wdth,wght].woff2 +0 -0
  80. package/plugins/datatype/OFL.txt +96 -0
  81. package/plugins/datatype/index.ts +287 -0
  82. package/plugins/definition-list.ts +236 -0
  83. package/plugins/directive-definitions.ts +13 -0
  84. package/plugins/embedding/client.ts +88 -0
  85. package/plugins/embedding/index.ts +43 -0
  86. package/plugins/image/index.ts +68 -0
  87. package/plugins/image/theme.css +43 -0
  88. package/plugins/include.ts +119 -0
  89. package/plugins/index.ts +91 -0
  90. package/plugins/input/authoring.ts +236 -0
  91. package/plugins/input/config.ts +85 -0
  92. package/plugins/input/index.ts +359 -0
  93. package/plugins/input/model.ts +173 -0
  94. package/plugins/input/state.ts +272 -0
  95. package/plugins/layout.ts +313 -0
  96. package/plugins/literate/client.ts +208 -0
  97. package/plugins/literate/index.ts +742 -0
  98. package/plugins/math/index.ts +140 -0
  99. package/plugins/meta.ts +42 -0
  100. package/plugins/navigation/index.ts +158 -0
  101. package/plugins/navigation/model.ts +364 -0
  102. package/plugins/preset.ts +65 -0
  103. package/plugins/query/index.ts +322 -0
  104. package/plugins/rss/index.ts +46 -0
  105. package/plugins/runtime/actions.ts +62 -0
  106. package/plugins/runtime/client.ts +8 -0
  107. package/plugins/runtime/document.ts +506 -0
  108. package/plugins/runtime/error.ts +154 -0
  109. package/plugins/runtime/heading-links.ts +31 -0
  110. package/plugins/runtime/index.ts +104 -0
  111. package/plugins/runtime/live.ts +51 -0
  112. package/plugins/runtime/navigation.ts +113 -0
  113. package/plugins/runtime/pending.ts +53 -0
  114. package/plugins/runtime/publication.ts +19 -0
  115. package/plugins/runtime/start.ts +177 -0
  116. package/plugins/runtime/static-client.ts +6 -0
  117. package/plugins/runtime/static-live.ts +188 -0
  118. package/plugins/runtime/view-transition.ts +72 -0
  119. package/plugins/runtime/viewport.ts +110 -0
  120. package/plugins/schema.ts +24 -0
  121. package/plugins/scripts.ts +140 -0
  122. package/plugins/source-preview/client.ts +256 -0
  123. package/plugins/source-preview/index.ts +132 -0
  124. package/plugins/source-preview/model.ts +11 -0
  125. package/plugins/source-preview/preview.css +107 -0
  126. package/plugins/styles.ts +145 -0
  127. package/plugins/theme/components.ts +10 -0
  128. package/plugins/theme/foundation.css +358 -0
  129. package/plugins/theme/index.ts +333 -0
  130. package/plugins/theme/prose.css +284 -0
  131. package/plugins/theme/scheme.js +63 -0
  132. package/plugins/theme/toggle.css +44 -0
  133. package/plugins/theme/view-transition.css +68 -0
  134. package/plugins/toc/client.ts +146 -0
  135. package/plugins/toc/index.ts +232 -0
  136. package/plugins/toc/theme.css +172 -0
  137. package/plugins/types.ts +538 -0
  138. package/problem.ts +41 -0
  139. package/project.ts +6 -0
  140. package/publish/build.ts +402 -0
  141. package/publish/concurrent.ts +32 -0
  142. package/publish/identity.ts +63 -0
  143. package/publish/index.ts +11 -0
  144. package/publish/location.ts +167 -0
  145. package/publish/model.ts +58 -0
  146. package/publish/plan.ts +300 -0
  147. package/publish/validate.ts +150 -0
  148. package/query/candidate-index.ts +101 -0
  149. package/query/dependency-index.ts +99 -0
  150. package/query/fields.ts +216 -0
  151. package/query/invalidation.ts +48 -0
  152. package/query/kernel.ts +776 -0
  153. package/query/model.ts +79 -0
  154. package/repository.ts +374 -0
  155. package/runtime-profile.ts +34 -0
  156. package/schema/model.ts +92 -0
  157. package/schema/registry.ts +642 -0
  158. package/schema/standard.ts +226 -0
  159. package/server/context.ts +94 -0
  160. package/server/css-imports.ts +66 -0
  161. package/server/http.ts +333 -0
  162. package/server/page.ts +21 -0
  163. package/server/protocols.ts +12 -0
  164. package/server/representations.ts +66 -0
  165. package/server/router.ts +131 -0
  166. package/server/routes.ts +202 -0
  167. package/server/serve.ts +5 -0
  168. package/server/watch.ts +120 -0
  169. package/source/blocks.ts +71 -0
  170. package/source/format.ts +164 -0
  171. package/source/index.ts +67 -0
  172. package/source/interpolate.ts +63 -0
  173. package/source/markdown/blocks.ts +46 -0
  174. package/source/markdown/comments.ts +32 -0
  175. package/source/markdown/fences.ts +67 -0
  176. package/source/markdown/headings.ts +88 -0
  177. package/source/markdown/index.ts +34 -0
  178. package/source/markdown/inline-code.ts +6 -0
  179. package/source/markdown/links.ts +326 -0
  180. package/source/markdown/lists.ts +223 -0
  181. package/source/markdown/prose.ts +74 -0
  182. package/source/markdown/scan.ts +79 -0
  183. package/source/markdown/text.ts +82 -0
  184. package/source/meta.ts +87 -0
  185. package/source/source.ts +121 -0
  186. package/source/topmatter.ts +57 -0
  187. package/source/utils.ts +21 -0
  188. package/source-diagnostic.ts +63 -0
  189. package/text-file.ts +26 -0
  190. package/util.ts +35 -0
  191. package/view/components.ts +499 -0
  192. package/view/model.ts +91 -0
  193. package/view/projection.ts +162 -0
  194. package/view/session.ts +146 -0
  195. package/view/syntax.ts +372 -0
@@ -0,0 +1,208 @@
1
+ type Cleanup = () => void
2
+
3
+ type Api = {
4
+ $: (selector: string) => Element | null
5
+ $$: (selector: string) => Element[]
6
+ on: (
7
+ target: EventTarget | string,
8
+ type: string,
9
+ handler: EventListenerOrEventListenerObject,
10
+ options?: boolean | AddEventListenerOptions,
11
+ ) => void
12
+ attrs: Record<string, string>
13
+ update: (fn: Cleanup) => void
14
+ cleanup: (fn: Cleanup) => void
15
+ }
16
+
17
+ type Setup = (el: Element, api: Api) => void | Cleanup
18
+ type Entry = [string, Setup]
19
+
20
+ type Instance = {
21
+ tag: string
22
+ attrs: Record<string, string>
23
+ cleanups: Cleanup[]
24
+ updates: Cleanup[]
25
+ }
26
+
27
+ declare global {
28
+ interface Window {
29
+ pmxq?: Entry[] | { push(entry: Entry): void }
30
+ __pmxCanonicalView?: HTMLElement
31
+ }
32
+ }
33
+
34
+ const registry = new Map<string, { setup: Setup; source: string }>()
35
+ const instances = new Map<Element, Instance>()
36
+ const executed = new WeakMap<HTMLScriptElement, string>()
37
+
38
+ function attrsOf(el: Element) {
39
+ const encoded = el.getAttribute("data-pmx-attrs")
40
+ if (!encoded) return {}
41
+ try {
42
+ const attrs = JSON.parse(encoded)
43
+ return attrs && typeof attrs === "object"
44
+ ? (attrs as Record<string, string>)
45
+ : {}
46
+ } catch {
47
+ return {}
48
+ }
49
+ }
50
+
51
+ function refreshAttrs(target: Record<string, string>, el: Element) {
52
+ for (const key of Object.keys(target)) delete target[key]
53
+ Object.assign(target, attrsOf(el))
54
+ }
55
+
56
+ function dispose(el: Element) {
57
+ const instance = instances.get(el)
58
+ if (!instance) return
59
+ instances.delete(el)
60
+ for (let i = instance.cleanups.length - 1; i >= 0; i--) {
61
+ try {
62
+ instance.cleanups[i]!()
63
+ } catch (error) {
64
+ console.error(error)
65
+ }
66
+ }
67
+ }
68
+
69
+ function accept([tag, setup]: Entry) {
70
+ if (typeof tag !== "string" || typeof setup !== "function") return
71
+ const source = setup.toString()
72
+ if (registry.get(tag)?.source === source) return
73
+ for (const [el, instance] of [...instances]) {
74
+ if (instance.tag === tag) dispose(el)
75
+ }
76
+ registry.set(tag, { setup, source })
77
+ }
78
+
79
+ function mount(el: Element, tag: string) {
80
+ if (instances.has(el)) return
81
+ const entry = registry.get(tag)
82
+ if (!entry) return
83
+
84
+ const abort = new AbortController()
85
+ const instance: Instance = {
86
+ tag,
87
+ attrs: attrsOf(el),
88
+ cleanups: [() => abort.abort()],
89
+ updates: [],
90
+ }
91
+ instances.set(el, instance)
92
+
93
+ const $ = (selector: string) => el.querySelector(selector)
94
+ const $$ = (selector: string) => [...el.querySelectorAll(selector)]
95
+ const cleanup = (fn: Cleanup) => {
96
+ instance.cleanups.push(fn)
97
+ }
98
+ const update = (fn: Cleanup) => {
99
+ instance.updates.push(fn)
100
+ fn()
101
+ }
102
+ const on: Api["on"] = (target, type, handler, options) => {
103
+ const node = typeof target === "string" ? $(target) : target
104
+ if (!node) {
105
+ throw new Error(
106
+ typeof target === "string"
107
+ ? `on: no match for ${target}`
108
+ : `on: missing target for ${type}`,
109
+ )
110
+ }
111
+ const opts =
112
+ typeof options === "boolean" ? { capture: options } : { ...options }
113
+ node.addEventListener(type, handler, {
114
+ ...opts,
115
+ signal: opts.signal
116
+ ? AbortSignal.any([opts.signal, abort.signal])
117
+ : abort.signal,
118
+ })
119
+ }
120
+
121
+ try {
122
+ const result = entry.setup(el, {
123
+ $,
124
+ $$,
125
+ on,
126
+ attrs: instance.attrs,
127
+ update,
128
+ cleanup,
129
+ })
130
+ if (typeof result === "function") cleanup(result)
131
+ } catch (error) {
132
+ console.error(`[pmx ${tag}]`, error)
133
+ dispose(el)
134
+ }
135
+ }
136
+
137
+ function reexecuteChangedScripts() {
138
+ for (const script of [
139
+ ...document.querySelectorAll("script[data-pmx-component]"),
140
+ ]) {
141
+ if (!(script instanceof HTMLScriptElement)) continue
142
+ const text = script.textContent ?? ""
143
+ if (executed.get(script) === text) continue
144
+ const clone = document.createElement("script")
145
+ for (const attr of script.attributes) {
146
+ clone.setAttribute(attr.name, attr.value)
147
+ }
148
+ clone.textContent = text
149
+ script.replaceWith(clone)
150
+ executed.set(clone, text)
151
+ }
152
+ }
153
+
154
+ function sweep() {
155
+ for (const el of [...instances.keys()]) {
156
+ const instance = instances.get(el)!
157
+ if (!el.isConnected || el.getAttribute("data-component") !== instance.tag) {
158
+ dispose(el)
159
+ }
160
+ }
161
+ reexecuteChangedScripts()
162
+ const active = new Set(
163
+ [...document.querySelectorAll("script[data-pmx-component]")]
164
+ .map((script) => script.getAttribute("data-pmx-component"))
165
+ .filter((tag): tag is string => !!tag),
166
+ )
167
+ for (const tag of registry.keys()) {
168
+ if (active.has(tag)) continue
169
+ registry.delete(tag)
170
+ for (const [el, instance] of [...instances]) {
171
+ if (instance.tag === tag) dispose(el)
172
+ }
173
+ }
174
+ const surviving = new Set(instances.keys())
175
+ for (const tag of registry.keys()) {
176
+ for (const el of document.querySelectorAll(
177
+ `[data-component="${CSS.escape(tag)}"]`,
178
+ )) {
179
+ mount(el, tag)
180
+ }
181
+ }
182
+ for (const [el, instance] of instances) {
183
+ if (!surviving.has(el)) continue
184
+ refreshAttrs(instance.attrs, el)
185
+ for (const fn of instance.updates) {
186
+ try {
187
+ fn()
188
+ } catch (error) {
189
+ console.error(`[pmx ${instance.tag}]`, error)
190
+ }
191
+ }
192
+ }
193
+ }
194
+
195
+ const queued = window.pmxq
196
+ window.pmxq = { push: accept }
197
+ if (Array.isArray(queued)) for (const entry of queued) accept(entry)
198
+
199
+ const canonicalView = document.querySelector("[data-pmx-view]")
200
+ if (
201
+ canonicalView instanceof HTMLElement &&
202
+ !(window.__pmxCanonicalView instanceof HTMLElement)
203
+ ) {
204
+ window.__pmxCanonicalView = canonicalView.cloneNode(true) as HTMLElement
205
+ }
206
+
207
+ sweep()
208
+ document.addEventListener("pmx:render", sweep)