@hozu/cli 0.7.0 → 0.9.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 (189) hide show
  1. package/dist/cdp.d.ts.map +1 -1
  2. package/dist/cdp.js +1 -0
  3. package/dist/cdp.js.map +1 -1
  4. package/dist/commands/add-component.d.ts +5 -0
  5. package/dist/commands/add-component.d.ts.map +1 -0
  6. package/dist/commands/add-component.js +125 -0
  7. package/dist/commands/add-component.js.map +1 -0
  8. package/dist/commands/add-kit.d.ts +2 -0
  9. package/dist/commands/add-kit.d.ts.map +1 -0
  10. package/dist/commands/add-kit.js +20 -0
  11. package/dist/commands/add-kit.js.map +1 -0
  12. package/dist/commands/add-widget.d.ts.map +1 -1
  13. package/dist/commands/add-widget.js +4 -5
  14. package/dist/commands/add-widget.js.map +1 -1
  15. package/dist/commands/add.d.ts +1 -0
  16. package/dist/commands/add.d.ts.map +1 -1
  17. package/dist/commands/add.js +5 -11
  18. package/dist/commands/add.js.map +1 -1
  19. package/dist/commands/app.d.ts +27 -0
  20. package/dist/commands/app.d.ts.map +1 -0
  21. package/dist/commands/app.js +148 -0
  22. package/dist/commands/app.js.map +1 -0
  23. package/dist/commands/browse-page.d.ts +2 -0
  24. package/dist/commands/browse-page.d.ts.map +1 -0
  25. package/dist/commands/browse-page.js +228 -0
  26. package/dist/commands/browse-page.js.map +1 -0
  27. package/dist/commands/browse-tab.d.ts +80 -0
  28. package/dist/commands/browse-tab.d.ts.map +1 -0
  29. package/dist/commands/browse-tab.js +431 -0
  30. package/dist/commands/browse-tab.js.map +1 -0
  31. package/dist/commands/browse-world.d.ts +36 -0
  32. package/dist/commands/browse-world.d.ts.map +1 -0
  33. package/dist/commands/browse-world.js +108 -0
  34. package/dist/commands/browse-world.js.map +1 -0
  35. package/dist/commands/browse.d.ts +24 -3
  36. package/dist/commands/browse.d.ts.map +1 -1
  37. package/dist/commands/browse.js +343 -409
  38. package/dist/commands/browse.js.map +1 -1
  39. package/dist/commands/build.js +8 -8
  40. package/dist/commands/build.js.map +1 -1
  41. package/dist/commands/check.d.ts +1 -2
  42. package/dist/commands/check.d.ts.map +1 -1
  43. package/dist/commands/check.js +34 -28
  44. package/dist/commands/check.js.map +1 -1
  45. package/dist/commands/components.d.ts +21 -0
  46. package/dist/commands/components.d.ts.map +1 -0
  47. package/dist/commands/components.js +143 -0
  48. package/dist/commands/components.js.map +1 -0
  49. package/dist/commands/docs.d.ts +2 -2
  50. package/dist/commands/docs.d.ts.map +1 -1
  51. package/dist/commands/docs.js +15 -3
  52. package/dist/commands/docs.js.map +1 -1
  53. package/dist/commands/explain.js +1 -1
  54. package/dist/commands/explain.js.map +1 -1
  55. package/dist/commands/graph.js +2 -2
  56. package/dist/commands/graph.js.map +1 -1
  57. package/dist/commands/impact.d.ts +3 -2
  58. package/dist/commands/impact.d.ts.map +1 -1
  59. package/dist/commands/impact.js +8 -3
  60. package/dist/commands/impact.js.map +1 -1
  61. package/dist/commands/inspect.d.ts +1 -1
  62. package/dist/commands/inspect.d.ts.map +1 -1
  63. package/dist/commands/inspect.js +7 -1
  64. package/dist/commands/inspect.js.map +1 -1
  65. package/dist/commands/kits.d.ts +16 -0
  66. package/dist/commands/kits.d.ts.map +1 -0
  67. package/dist/commands/kits.js +172 -0
  68. package/dist/commands/kits.js.map +1 -0
  69. package/dist/commands/map.d.ts +12 -0
  70. package/dist/commands/map.d.ts.map +1 -1
  71. package/dist/commands/map.js +101 -5
  72. package/dist/commands/map.js.map +1 -1
  73. package/dist/commands/migrate-agent.d.ts +12 -0
  74. package/dist/commands/migrate-agent.d.ts.map +1 -0
  75. package/dist/commands/migrate-agent.js +6 -0
  76. package/dist/commands/migrate-agent.js.map +1 -0
  77. package/dist/commands/migrate-app.d.ts +15 -0
  78. package/dist/commands/migrate-app.d.ts.map +1 -0
  79. package/dist/commands/migrate-app.js +334 -0
  80. package/dist/commands/migrate-app.js.map +1 -0
  81. package/dist/commands/migrate-ast.d.ts +63 -0
  82. package/dist/commands/migrate-ast.d.ts.map +1 -0
  83. package/dist/commands/migrate-ast.js +257 -0
  84. package/dist/commands/migrate-ast.js.map +1 -0
  85. package/dist/commands/migrate-forms.d.ts +4 -0
  86. package/dist/commands/migrate-forms.d.ts.map +1 -0
  87. package/dist/commands/migrate-forms.js +120 -0
  88. package/dist/commands/migrate-forms.js.map +1 -0
  89. package/dist/commands/migrate-freshness.d.ts +4 -0
  90. package/dist/commands/migrate-freshness.d.ts.map +1 -0
  91. package/dist/commands/migrate-freshness.js +47 -0
  92. package/dist/commands/migrate-freshness.js.map +1 -0
  93. package/dist/commands/migrate-head.d.ts +8 -0
  94. package/dist/commands/migrate-head.d.ts.map +1 -0
  95. package/dist/commands/migrate-head.js +132 -0
  96. package/dist/commands/migrate-head.js.map +1 -0
  97. package/dist/commands/migrate-links.d.ts +5 -0
  98. package/dist/commands/migrate-links.d.ts.map +1 -0
  99. package/dist/commands/migrate-links.js +55 -0
  100. package/dist/commands/migrate-links.js.map +1 -0
  101. package/dist/commands/migrate-lists.d.ts +9 -0
  102. package/dist/commands/migrate-lists.d.ts.map +1 -0
  103. package/dist/commands/migrate-lists.js +225 -0
  104. package/dist/commands/migrate-lists.js.map +1 -0
  105. package/dist/commands/migrate-normalize.d.ts +27 -0
  106. package/dist/commands/migrate-normalize.d.ts.map +1 -0
  107. package/dist/commands/migrate-normalize.js +252 -0
  108. package/dist/commands/migrate-normalize.js.map +1 -0
  109. package/dist/commands/migrate-ops.d.ts +4 -0
  110. package/dist/commands/migrate-ops.d.ts.map +1 -0
  111. package/dist/commands/migrate-ops.js +192 -0
  112. package/dist/commands/migrate-ops.js.map +1 -0
  113. package/dist/commands/migrate-parts.d.ts +7 -0
  114. package/dist/commands/migrate-parts.d.ts.map +1 -0
  115. package/dist/commands/migrate-parts.js +166 -0
  116. package/dist/commands/migrate-parts.js.map +1 -0
  117. package/dist/commands/migrate-stale.d.ts +24 -0
  118. package/dist/commands/migrate-stale.d.ts.map +1 -0
  119. package/dist/commands/migrate-stale.js +114 -0
  120. package/dist/commands/migrate-stale.js.map +1 -0
  121. package/dist/commands/migrate.d.ts +21 -0
  122. package/dist/commands/migrate.d.ts.map +1 -0
  123. package/dist/commands/migrate.js +358 -0
  124. package/dist/commands/migrate.js.map +1 -0
  125. package/dist/commands/plan.d.ts.map +1 -1
  126. package/dist/commands/plan.js +2 -6
  127. package/dist/commands/plan.js.map +1 -1
  128. package/dist/commands/render.d.ts +10 -0
  129. package/dist/commands/render.d.ts.map +1 -0
  130. package/dist/commands/render.js +79 -0
  131. package/dist/commands/render.js.map +1 -0
  132. package/dist/commands/request.d.ts +13 -16
  133. package/dist/commands/request.d.ts.map +1 -1
  134. package/dist/commands/request.js +140 -161
  135. package/dist/commands/request.js.map +1 -1
  136. package/dist/commands/scaffold.d.ts.map +1 -1
  137. package/dist/commands/scaffold.js +10 -8
  138. package/dist/commands/scaffold.js.map +1 -1
  139. package/dist/commands/seed-lock.d.ts +2 -0
  140. package/dist/commands/seed-lock.d.ts.map +1 -0
  141. package/dist/commands/seed-lock.js +6 -0
  142. package/dist/commands/seed-lock.js.map +1 -0
  143. package/dist/commands/serve.d.ts +6 -0
  144. package/dist/commands/serve.d.ts.map +1 -0
  145. package/dist/commands/serve.js +31 -0
  146. package/dist/commands/serve.js.map +1 -0
  147. package/dist/commands/skill.d.ts.map +1 -1
  148. package/dist/commands/skill.js +1 -2
  149. package/dist/commands/skill.js.map +1 -1
  150. package/dist/commands/validate.d.ts +13 -0
  151. package/dist/commands/validate.d.ts.map +1 -1
  152. package/dist/commands/validate.js +56 -9
  153. package/dist/commands/validate.js.map +1 -1
  154. package/dist/contract.d.ts +163 -11
  155. package/dist/contract.d.ts.map +1 -1
  156. package/dist/index.d.ts +1 -0
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +1 -0
  159. package/dist/index.js.map +1 -1
  160. package/dist/main.d.ts +8 -0
  161. package/dist/main.d.ts.map +1 -1
  162. package/dist/main.js +159 -47
  163. package/dist/main.js.map +1 -1
  164. package/dist/output.d.ts.map +1 -1
  165. package/dist/output.js +40 -3
  166. package/dist/output.js.map +1 -1
  167. package/dist/render.d.ts.map +1 -1
  168. package/dist/render.js +5 -1
  169. package/dist/render.js.map +1 -1
  170. package/dist/styles.d.ts +12 -1
  171. package/dist/styles.d.ts.map +1 -1
  172. package/dist/styles.js +19 -9
  173. package/dist/styles.js.map +1 -1
  174. package/dist/uses.d.ts +6 -0
  175. package/dist/uses.d.ts.map +1 -0
  176. package/dist/uses.js +72 -0
  177. package/dist/uses.js.map +1 -0
  178. package/package.json +7 -7
  179. package/schema/browse.schema.json +184 -4
  180. package/schema/check.schema.json +114 -9
  181. package/schema/docs-components.schema.json +197 -0
  182. package/schema/impact.schema.json +107 -1
  183. package/schema/inspect.schema.json +341 -24
  184. package/schema/map.schema.json +90 -0
  185. package/schema/plan.schema.json +8 -22
  186. package/schema/render.schema.json +333 -0
  187. package/schema/request.schema.json +133 -8
  188. package/schema/skill.schema.json +22 -1
  189. package/schema/validate.schema.json +39 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browse-page.d.ts","sourceRoot":"","sources":["../../src/commands/browse-page.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,QAkOZ,CAAA"}
@@ -0,0 +1,228 @@
1
+ export const PAGE = String.raw `(() => {
2
+ const norm = (s) => (s ?? '').replace(/\s+/g, ' ').trim().toLowerCase()
3
+ const shown = (el) => { const r = el.getBoundingClientRect(); return r.width > 0 || r.height > 0 }
4
+ const nameOf = (el) => {
5
+ const aria = el.getAttribute('aria-label')
6
+ if (aria) return aria
7
+ const by = el.getAttribute('aria-labelledby')
8
+ if (by) return by.split(/\s+/).map((id) => document.getElementById(id)?.textContent ?? '').join(' ')
9
+ if (el.labels && el.labels.length) return [...el.labels].map((l) => l.textContent).join(' ')
10
+ if (el.tagName === 'INPUT' && ['submit', 'button'].includes(el.type)) return el.value
11
+ if (el.placeholder) return el.placeholder
12
+ if (el.getAttribute('title') && !el.textContent.trim()) return el.getAttribute('title')
13
+ return el.textContent
14
+ }
15
+ const KINDS = {
16
+ fill: 'input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=button]):not([type=image]):not([type=reset]), textarea, [contenteditable=true]',
17
+ select: 'select',
18
+ check: 'input[type=checkbox], input[type=radio]',
19
+ click: 'button, a[href], [role=button], [role=link], [role=tab], [role=option], [role=menuitem], [role=checkbox], [role=switch], input[type=submit], input[type=button], input[type=image], summary, [title], label',
20
+ }
21
+ const SCOPES = 'li, tr, form, [role=listitem], [role=row]'
22
+ const scopeOf = (within) => {
23
+ if (within === null) return { roots: [null] }
24
+ const want = norm(within)
25
+ const all = [...document.querySelectorAll(SCOPES)].filter((el) => shown(el) && norm(el.innerText).includes(want))
26
+ const exact = all.filter((el) => el.innerText.split('\n').some((l) => norm(l) === want))
27
+ const pool = exact.length ? exact : all
28
+ const roots = pool.filter((el) => !pool.some((o) => o !== el && el.contains(o)))
29
+ if (!roots.length) return { error: 'No list item, table row or form contains "' + within + '"' }
30
+ return { roots }
31
+ }
32
+ const inside = (root, el) => root === null || root.contains(el) || (root.tagName === 'FORM' && el.form === root)
33
+ const note = (count, scoped) =>
34
+ [count > 1 ? count + ' matched; used the first' : null, scoped > 1 ? scoped + ' places contain the text and the target; used the first' : null]
35
+ .filter(Boolean).join('; ') || null
36
+ const find = (kind, name, within) => {
37
+ const scope = scopeOf(within)
38
+ if (scope.error) return scope
39
+ const want = norm(name)
40
+ let all = []
41
+ const found = scope.roots.map((root) => {
42
+ const pool = [...document.querySelectorAll(KINDS[kind])].filter((el) => shown(el) && inside(root, el))
43
+ all = all.concat(pool)
44
+ let hits = pool.filter((el) => norm(nameOf(el)) === want || norm(el.getAttribute('title')) === want)
45
+ if (!hits.length && kind !== 'click') hits = pool.filter((el) => norm(el.getAttribute('name')) === want)
46
+ if (!hits.length && kind === 'click')
47
+ hits = [...(root ?? document.body).querySelectorAll('*')].filter(
48
+ (el) => shown(el) && norm(el.textContent) === want && ![...el.children].some((c) => norm(c.textContent) === want),
49
+ )
50
+ return hits
51
+ }).filter((hits) => hits.length)
52
+ if (!found.length) {
53
+ const names = [...new Set(all.map((el) => (nameOf(el) ?? '').replace(/\s+/g, ' ').trim()).filter(Boolean))]
54
+ return { error: 'No ' + kind + ' target named "' + name + '"' + (within === null ? '' : ' in "' + within + '"') + (names.length ? '. ' + (within === null ? 'On the page' : 'There') + ': ' + names.slice(0, 20).map((n) => JSON.stringify(n.slice(0, 40))).join(', ') : '') }
55
+ }
56
+ return { els: found[0], scoped: found.length }
57
+ }
58
+ const setValue = (el, value) => {
59
+ const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : el instanceof HTMLSelectElement ? HTMLSelectElement.prototype : HTMLInputElement.prototype
60
+ el.focus()
61
+ if (el.isContentEditable) el.textContent = value
62
+ else Object.getOwnPropertyDescriptor(proto, 'value').set.call(el, value)
63
+ el.dispatchEvent(new Event('input', { bubbles: true }))
64
+ el.dispatchEvent(new Event('change', { bubbles: true }))
65
+ }
66
+ const jsOnly = (el) => {
67
+ const tag = el.tagName.toLowerCase()
68
+ const type = (el.getAttribute('type') ?? '').toLowerCase()
69
+ if (tag === 'a') return el.hasAttribute('href') ? null : 'a link without href'
70
+ if (tag === 'button') return type === 'button' ? 'a type=button button' : el.form ? null : 'a button outside a form'
71
+ if (tag === 'input') {
72
+ if (type === 'button') return 'a type=button input'
73
+ if (['submit', 'image', 'reset'].includes(type)) return el.form ? null : 'a button outside a form'
74
+ return null
75
+ }
76
+ if (tag === 'label') return el.control ? null : 'a label without a control'
77
+ if (['summary', 'select', 'option', 'textarea'].includes(tag)) return null
78
+ const host = el.parentElement?.closest('a[href], button, label, summary, input')
79
+ if (host) return jsOnly(host)
80
+ const role = el.getAttribute('role')
81
+ return 'a <' + tag + '>' + (role ? ' with role=' + role : '') + ' has no native action'
82
+ }
83
+ const at = (el) => {
84
+ el.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' })
85
+ const r = el.getBoundingClientRect()
86
+ const x = r.left + r.width / 2
87
+ const y = r.top + r.height / 2
88
+ const top = document.elementFromPoint(x, y)
89
+ const label = el.control ?? null
90
+ const hit = top && (el.contains(top) || top.contains(el) || top === label || (top.tagName === 'LABEL' && top.control === el))
91
+ return { x, y, covered: hit ? null : top ? '<' + top.tagName.toLowerCase() + '>' : 'nothing' }
92
+ }
93
+ const FILLED = Symbol.for('hozu.browse.filled')
94
+ const formName = (form) => {
95
+ const own = form.getAttribute('aria-label') ?? (form.getAttribute('aria-labelledby') ? nameOf(form) : null) ?? form.querySelector('legend')?.textContent
96
+ const buttons = [...form.elements].filter((e) => (e.tagName === 'BUTTON' && (e.getAttribute('type') ?? 'submit') === 'submit') || (e.tagName === 'INPUT' && ['submit', 'image'].includes(e.type)))
97
+ return { names: [own, ...buttons.map((b) => nameOf(b))].filter(Boolean).map((n) => n.replace(/\s+/g, ' ').trim()), buttons }
98
+ }
99
+ const TEXT_TYPES = ['text', 'search', 'email', 'url', 'tel', 'password', 'number', 'date', 'datetime-local', 'month', 'time', 'week']
100
+ return {
101
+ point(name, within) {
102
+ const f = find('click', name, within)
103
+ if (f.error) return f
104
+ return { ...at(f.els[0]), jsOnly: jsOnly(f.els[0]), note: note(f.els.length, f.scoped) }
105
+ },
106
+ checkable(name, within) {
107
+ const f = find('check', name, within)
108
+ if (f.error) return f
109
+ const el = f.els[0]
110
+ return { ...at(el), checked: el.checked, radio: el.type === 'radio', note: note(f.els.length, f.scoped) }
111
+ },
112
+ fill(name, value, within) {
113
+ const f = find('fill', name, within)
114
+ if (f.error) return f
115
+ const done = (window[FILLED] ??= new WeakSet())
116
+ const index = Math.max(0, f.els.findIndex((el) => !done.has(el)))
117
+ done.add(f.els[index])
118
+ setValue(f.els[index], value)
119
+ return { note: f.els.length > 1 ? 'filled ' + (index + 1) + ' of ' + f.els.length + ' named "' + name + '"' : note(1, f.scoped) }
120
+ },
121
+ select(name, option, within) {
122
+ const f = find('select', name, within)
123
+ if (f.error) return f
124
+ const el = f.els[0]
125
+ const o = [...el.options].find((o) => norm(o.textContent) === norm(option) || o.value === option)
126
+ if (!o) return { error: 'Select "' + name + '" has no option "' + option + '". Options: ' + [...el.options].map((o) => JSON.stringify(o.textContent.trim())).join(', ') }
127
+ if (el.multiple) {
128
+ el.focus()
129
+ o.selected = true
130
+ el.dispatchEvent(new Event('input', { bubbles: true }))
131
+ el.dispatchEvent(new Event('change', { bubbles: true }))
132
+ } else setValue(el, o.value)
133
+ return { note: note(f.els.length, f.scoped) }
134
+ },
135
+ submit(label, within) {
136
+ const scope = scopeOf(within)
137
+ if (scope.error) return scope
138
+ const want = norm(label)
139
+ const forms = [...document.forms].filter((f) => scope.roots.some((root) => inside(root, f) || root?.contains(f)))
140
+ const hits = forms.filter((f) => formName(f).names.some((n) => norm(n) === want))
141
+ if (!hits.length) {
142
+ const names = forms.map((f) => formName(f).names[0]).filter(Boolean)
143
+ return { error: 'No form named "' + label + '"' + (names.length ? '. Forms: ' + names.slice(0, 20).map((n) => JSON.stringify(n.slice(0, 40))).join(', ') : '') }
144
+ }
145
+ const form = hits[0]
146
+ form.requestSubmit(formName(form).buttons[0])
147
+ return { note: note(hits.length, 1) }
148
+ },
149
+ keyJsOnly(key) {
150
+ const el = document.activeElement
151
+ const tag = el && el !== document.body ? el.tagName.toLowerCase() : null
152
+ if (key === 'Tab') return null
153
+ if (key === 'Enter') {
154
+ if (!tag) return 'nothing is focused'
155
+ if (tag === 'a') return el.hasAttribute('href') ? null : 'a link without href'
156
+ if (tag === 'button') return jsOnly(el)
157
+ if (tag === 'textarea') return 'Enter in a textarea adds a line'
158
+ if (tag === 'input') {
159
+ if (!el.form) return 'Enter in a field outside a form'
160
+ const buttons = formName(el.form).buttons
161
+ const fields = [...el.form.elements].filter((e) => e.tagName === 'INPUT' && TEXT_TYPES.includes(e.type))
162
+ if (!buttons.length && fields.length > 1) return 'the form has no submit button'
163
+ return TEXT_TYPES.includes(el.type) ? null : jsOnly(el)
164
+ }
165
+ return 'Enter on a <' + tag + '> has no native action'
166
+ }
167
+ if (key === 'Space' || key.length === 1) return tag ? null : 'nothing is focused'
168
+ return key + ' has no native action'
169
+ },
170
+ snapshot() {
171
+ const clean = (s) => (s ?? '').replace(/[ \t]+/g, ' ').replace(/\n\s*\n+/g, '\n').trim()
172
+ const text = clean(document.body?.innerText)
173
+ const component = [...document.querySelectorAll('[data-hozu-component]')].flatMap((el) => clean(el.innerText).split('\n').filter(Boolean))
174
+ const url = new URL(location.href)
175
+ url.searchParams.delete('__hozu')
176
+ return { url: url.pathname + url.search, title: document.title, text, component }
177
+ },
178
+ report(selectors, expected) {
179
+ const components = []
180
+ const hydrated = document.documentElement.hasAttribute('data-hozu-ready') || !document.getElementById('hozu-payload')
181
+ for (const el of document.querySelectorAll('[data-hozu-component]')) {
182
+ const name = el.getAttribute('data-hozu-component')
183
+ const state = el.getAttribute('data-hozu-component-state')
184
+ const load = expected.find(([n]) => n === name)?.[1]
185
+ const r = el.getBoundingClientRect()
186
+ const empty = !el.children.length && !el.textContent.trim()
187
+ components.push({
188
+ name,
189
+ state: state === 'loading' ? 'not mounted' : state,
190
+ width: Math.round(r.width),
191
+ height: Math.round(r.height),
192
+ canvases: el.querySelectorAll('canvas').length,
193
+ elements: el.querySelectorAll('*').length,
194
+ hint:
195
+ state === 'failed'
196
+ ? 'its setup threw; see errors'
197
+ : state === 'loading'
198
+ ? load === 'visible' && (r.bottom < 0 || r.top > innerHeight)
199
+ ? "load: 'visible' mounts it when it scrolls into view"
200
+ : load === 'idle'
201
+ ? "load: 'idle' mounts it when the browser is idle"
202
+ : 'its module has not loaded; see errors'
203
+ : r.height === 0
204
+ ? 'it has no height, so a map or canvas inside shows nothing: give it a height class such as h-64'
205
+ : empty
206
+ ? 'it mounted but rendered nothing'
207
+ : null,
208
+ })
209
+ }
210
+ if (!hydrated)
211
+ for (const [name] of expected)
212
+ components.push({
213
+ name, state: 'not mounted', width: null, height: null, canvases: 0, elements: 0,
214
+ hint: 'the page did not hydrate; see errors',
215
+ })
216
+ const elements = []
217
+ for (const sel of selectors)
218
+ for (const el of document.querySelectorAll(sel)) {
219
+ const attrs = {}
220
+ for (const a of el.attributes) attrs[a.name] = a.value
221
+ const text = (el.innerText ?? el.textContent ?? '').replace(/\s+/g, ' ').trim()
222
+ elements.push({ selector: sel, tag: el.tagName.toLowerCase(), attrs, text: text.length > 120 ? text.slice(0, 120) + '…' : text })
223
+ }
224
+ return { hydrated, components, elements }
225
+ },
226
+ }
227
+ })()`;
228
+ //# sourceMappingURL=browse-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browse-page.js","sourceRoot":"","sources":["../../src/commands/browse-page.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkOzB,CAAA"}
@@ -0,0 +1,80 @@
1
+ import type { Cdp } from '../cdp.ts';
2
+ import type { BrowseError, BrowseMode } from '../contract.ts';
3
+ import type { WorldRequest } from './browse-world.ts';
4
+ export declare const ORIGIN = "http://localhost";
5
+ export declare const sleep: (ms: number) => Promise<unknown>;
6
+ interface Head {
7
+ id: number;
8
+ status: number;
9
+ headers: [string, string][];
10
+ stream: boolean;
11
+ body?: Uint8Array;
12
+ }
13
+ /** One app world (module graph, data, session store) per mode, in its own worker. */
14
+ export declare class World {
15
+ readonly cookies: Promise<(string | null)[]>;
16
+ private readonly worker;
17
+ private next;
18
+ private readonly heads;
19
+ private readonly chunks;
20
+ constructor(config: string | undefined, cwd: string, sessions: (string | undefined)[]);
21
+ fetch(request: Omit<Extract<WorldRequest, {
22
+ url: string;
23
+ }>, 'id'>, onChunk: (c: string | null) => void): Promise<Head>;
24
+ cancel(id: number): void;
25
+ close(): Promise<number>;
26
+ }
27
+ export interface Snapshot {
28
+ url: string;
29
+ title: string;
30
+ text: string;
31
+ component: string[];
32
+ }
33
+ export interface StepResult {
34
+ ok: boolean;
35
+ note: string | null;
36
+ jsOnly: string | null;
37
+ }
38
+ /** One browser context and page for one actor in one mode. */
39
+ export declare class Tab {
40
+ sessionId: string;
41
+ targetId: string;
42
+ status: number;
43
+ loaded: boolean;
44
+ requested: boolean;
45
+ snapshot: Snapshot;
46
+ readonly sessions: Set<string>;
47
+ private readonly prerender;
48
+ private readonly tracked;
49
+ private readonly urls;
50
+ private readonly live;
51
+ private readonly invalidPosts;
52
+ private lastActivity;
53
+ private activity;
54
+ private marked;
55
+ private location;
56
+ private prerendering;
57
+ private readonly cdp;
58
+ private readonly world;
59
+ readonly mode: BrowseMode;
60
+ readonly actor: string | null;
61
+ private readonly errors;
62
+ constructor(cdp: Cdp, world: World, mode: BrowseMode, actor: string | null, errors: BrowseError[]);
63
+ send(method: string, params?: Record<string, unknown>, session?: string): Promise<any>;
64
+ start(cookie: string | null, reducedMotion: boolean): Promise<void>;
65
+ private enable;
66
+ private error;
67
+ handle(method: string, params: any, session: string): boolean;
68
+ private fulfill;
69
+ private paused;
70
+ evaluate(expression: string): Promise<any>;
71
+ page(call: string): Promise<any>;
72
+ mark(): void;
73
+ settle(): Promise<void>;
74
+ open(path: string): Promise<void>;
75
+ look(): Promise<Snapshot>;
76
+ mouse(x: number, y: number): Promise<void>;
77
+ key(name: string): Promise<void>;
78
+ }
79
+ export {};
80
+ //# sourceMappingURL=browse-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browse-tab.d.ts","sourceRoot":"","sources":["../../src/commands/browse-tab.ts"],"names":[],"mappings":"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"}