@offscript/sdk 0.1.8 → 0.1.10
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.
- package/dist/adapters/nuxt.cjs +3 -3
- package/dist/adapters/nuxt.js +2 -2
- package/dist/adapters/vanilla.cjs +5 -5
- package/dist/adapters/vanilla.js +3 -3
- package/dist/adapters/vue.cjs +3 -3
- package/dist/adapters/vue.js +2 -2
- package/dist/{chunk-AQG5MIW5.js → chunk-3AUFYXCH.js} +3 -3
- package/dist/chunk-3AUFYXCH.js.map +1 -0
- package/dist/{chunk-IOIVKJTV.js → chunk-4F52C3KC.js} +3 -3
- package/dist/{chunk-IOIVKJTV.js.map → chunk-4F52C3KC.js.map} +1 -1
- package/dist/{chunk-ZB2LSKD2.cjs → chunk-7JIK7MZN.cjs} +3 -3
- package/dist/chunk-7JIK7MZN.cjs.map +1 -0
- package/dist/{chunk-E53R6UOC.cjs → chunk-AX3BKPZJ.cjs} +52 -19
- package/dist/chunk-AX3BKPZJ.cjs.map +1 -0
- package/dist/{chunk-YIKWNN5R.cjs → chunk-FMMJ3ZE4.cjs} +4 -4
- package/dist/{chunk-YIKWNN5R.cjs.map → chunk-FMMJ3ZE4.cjs.map} +1 -1
- package/dist/{chunk-W27UMAEC.js → chunk-GWBQSYQQ.js} +47 -14
- package/dist/chunk-GWBQSYQQ.js.map +1 -0
- package/dist/core/OffscriptSDK.d.ts +1 -1
- package/dist/index.cjs +20 -20
- package/dist/index.js +3 -3
- package/dist/playwright.cjs +13 -13
- package/dist/playwright.js +1 -1
- package/dist/recorders/RRWebRecorder.d.ts +1 -0
- package/dist/types/events.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-AQG5MIW5.js.map +0 -1
- package/dist/chunk-E53R6UOC.cjs.map +0 -1
- package/dist/chunk-W27UMAEC.js.map +0 -1
- package/dist/chunk-ZB2LSKD2.cjs.map +0 -1
package/dist/adapters/nuxt.cjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var chunkAX3BKPZJ_cjs = require('../chunk-AX3BKPZJ.cjs');
|
|
4
|
+
require('../chunk-7JIK7MZN.cjs');
|
|
5
5
|
|
|
6
6
|
// src/adapters/nuxt.ts
|
|
7
7
|
function createNuxtOffscript(config) {
|
|
8
8
|
if (typeof window === "undefined") return null;
|
|
9
|
-
const sdk = new
|
|
9
|
+
const sdk = new chunkAX3BKPZJ_cjs.Offscript(config);
|
|
10
10
|
void sdk.init().catch(() => void 0);
|
|
11
11
|
return sdk;
|
|
12
12
|
}
|
package/dist/adapters/nuxt.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
3
|
+
var chunkFMMJ3ZE4_cjs = require('../chunk-FMMJ3ZE4.cjs');
|
|
4
|
+
require('../chunk-AX3BKPZJ.cjs');
|
|
5
|
+
require('../chunk-7JIK7MZN.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
Object.defineProperty(exports, "createOffscript", {
|
|
10
10
|
enumerable: true,
|
|
11
|
-
get: function () { return
|
|
11
|
+
get: function () { return chunkFMMJ3ZE4_cjs.createOffscript; }
|
|
12
12
|
});
|
|
13
13
|
Object.defineProperty(exports, "startOffscript", {
|
|
14
14
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkFMMJ3ZE4_cjs.startOffscript; }
|
|
16
16
|
});
|
|
17
17
|
//# sourceMappingURL=vanilla.cjs.map
|
|
18
18
|
//# sourceMappingURL=vanilla.cjs.map
|
package/dist/adapters/vanilla.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { createOffscript, startOffscript } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { createOffscript, startOffscript } from '../chunk-4F52C3KC.js';
|
|
2
|
+
import '../chunk-GWBQSYQQ.js';
|
|
3
|
+
import '../chunk-3AUFYXCH.js';
|
|
4
4
|
//# sourceMappingURL=vanilla.js.map
|
|
5
5
|
//# sourceMappingURL=vanilla.js.map
|
package/dist/adapters/vue.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
3
|
+
var chunkAX3BKPZJ_cjs = require('../chunk-AX3BKPZJ.cjs');
|
|
4
|
+
require('../chunk-7JIK7MZN.cjs');
|
|
5
5
|
|
|
6
6
|
// src/adapters/vue.ts
|
|
7
7
|
var OFFSCRIPT_KEY = "$offscript";
|
|
8
8
|
var OffscriptPlugin = {
|
|
9
9
|
install(app, config) {
|
|
10
|
-
const sdk = new
|
|
10
|
+
const sdk = new chunkAX3BKPZJ_cjs.Offscript(config);
|
|
11
11
|
void sdk.init().catch(() => void 0);
|
|
12
12
|
if (app.config?.globalProperties) {
|
|
13
13
|
app.config.globalProperties[OFFSCRIPT_KEY] = sdk;
|
package/dist/adapters/vue.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/types/events.ts
|
|
2
2
|
var SCHEMA_VERSION = "1.0";
|
|
3
|
-
var SDK_VERSION = "0.1.
|
|
3
|
+
var SDK_VERSION = "0.1.10";
|
|
4
4
|
var ACTION_SCHEMA_VERSION = "1.0";
|
|
5
5
|
|
|
6
6
|
// src/playwright/SelectorGenerator.ts
|
|
@@ -421,5 +421,5 @@ function validatePlaywrightContract(c) {
|
|
|
421
421
|
}
|
|
422
422
|
|
|
423
423
|
export { ACTION_SCHEMA_VERSION, CONTRACT_LIMITATIONS, PLAYWRIGHT_CONTRACT_KIND, PLAYWRIGHT_CONTRACT_VERSION, SCHEMA_VERSION, SDK_VERSION, SelectorGenerator, accessibleName, buildPlaywrightContract, implicitRole, isStableClass, isStableId, labelText, normalizeActions, validatePlaywrightContract };
|
|
424
|
-
//# sourceMappingURL=chunk-
|
|
425
|
-
//# sourceMappingURL=chunk-
|
|
424
|
+
//# sourceMappingURL=chunk-3AUFYXCH.js.map
|
|
425
|
+
//# sourceMappingURL=chunk-3AUFYXCH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/events.ts","../src/playwright/SelectorGenerator.ts","../src/playwright/ActionNormalizer.ts","../src/playwright/PlaywrightDataContract.ts"],"names":["css"],"mappings":"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","file":"chunk-3AUFYXCH.js","sourcesContent":["export const SCHEMA_VERSION = \"1.0\";\nexport const SDK_VERSION = \"0.1.10\";\n\nexport type EventKind =\n | \"rrweb\"\n | \"action\"\n | \"http\"\n | \"console\"\n | \"error\"\n | \"context\"\n | \"iframe\"\n | \"lifecycle\";\n\n/** Envelope comum a todos os eventos. A ordem canônica é (tabId, sequence). */\nexport interface OffscriptEvent<T = unknown> {\n /** Identificador único (idempotência). */\n id: string;\n kind: EventKind;\n tabId: string;\n pageId: string;\n /** Sequência monotônica por aba, persistida entre páginas. */\n sequence: number;\n /** Momento em que o fato ocorreu (epoch ms). */\n timestamp: number;\n /** Ação do usuário mais recente dentro da janela de correlação. */\n relatedActionId?: string;\n relatedActionDeltaMs?: number;\n data: T;\n}\n\nexport const ACTION_SCHEMA_VERSION = \"1.0\";\n\nexport type ActionType =\n | \"click\"\n | \"dblclick\"\n | \"hover\"\n | \"mousemove\"\n | \"drag\"\n | \"input\"\n | \"keydown\"\n | \"select\"\n | \"check\"\n | \"scroll\"\n | \"navigate\"\n | \"reload\"\n | \"focus\"\n | \"blur\";\n\nexport interface SelectorCandidate {\n strategy: \"testid\" | \"attribute\" | \"role\" | \"label\" | \"placeholder\" | \"id\" | \"css\";\n /** Seletor em sintaxe Playwright (ex.: `role=button[name=\"Salvar\"]`). */\n selector: string;\n /** Único no documento no momento da ação. */\n unique: boolean;\n matches: number;\n}\n\nexport interface ElementDescriptor {\n tag: string;\n id?: string;\n role?: string;\n name?: string;\n text?: string;\n type?: string;\n testId?: string;\n classes?: string[];\n href?: string;\n inputName?: string;\n rect?: { x: number; y: number; width: number; height: number };\n}\n\nexport interface RecordedAction {\n schemaVersion: string;\n id: string;\n timestamp: number;\n /** Mesma sequência do envelope do evento. */\n sequence: number;\n type: ActionType;\n url: string;\n selector?: string;\n selectorCandidates?: SelectorCandidate[];\n selectorUnique?: boolean;\n element?: ElementDescriptor;\n coordinates?: { x: number; y: number };\n viewport?: { width: number; height: number };\n payload?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport interface HttpEventData {\n requestId: string;\n transport: \"fetch\" | \"xhr\";\n url: string;\n method: string;\n query?: Record<string, string | string[]>;\n requestHeaders?: Record<string, string>;\n requestBody?: CapturedBody;\n status?: number;\n statusText?: string;\n responseHeaders?: Record<string, string>;\n responseBody?: CapturedBody;\n startedAt: number;\n endedAt: number;\n durationMs: number;\n /** fetch: tempo até os headers; xhr: até loadend. */\n error?: { name: string; message: string };\n aborted?: boolean;\n /** Quantas requisições estavam em andamento quando esta começou. */\n concurrent: number;\n}\n\nexport interface CapturedBody {\n kind: \"text\" | \"json\" | \"form\" | \"binary\" | \"omitted\";\n value?: unknown;\n size?: number;\n truncated?: boolean;\n reason?: string;\n}\n\nexport interface ConsoleEventData {\n level: \"log\" | \"info\" | \"warn\" | \"error\";\n args: unknown[];\n message: string;\n stack?: string;\n url: string;\n}\n\nexport interface ErrorEventData {\n source: \"window.onerror\" | \"unhandledrejection\" | \"resource\";\n message: string;\n name?: string;\n stack?: string;\n file?: string;\n line?: number;\n column?: number;\n url: string;\n}\n\nexport interface ContextEventData {\n reason: \"initial\" | \"viewport\" | \"navigation\" | \"visibility\" | \"page-load\";\n url: string;\n referrer?: string;\n title?: string;\n navigationType?: string;\n browser?: { name?: string; version?: string };\n os?: string;\n userAgent: string;\n screen: { width: number; height: number };\n viewport: { width: number; height: number };\n devicePixelRatio: number;\n language: string;\n timezone?: string;\n online: boolean;\n visibility?: string;\n sdkVersion: string;\n /** A gravação guardou senhas, tokens e demais valores sem máscara. */\n captureSensitiveValues?: boolean;\n}\n\nexport interface IframeEventData {\n phase: \"present\" | \"removed\" | \"focus\" | \"blur\" | \"resized\";\n provider?: \"seatsio\" | \"unknown\";\n origin?: string;\n path?: string;\n crossOrigin: boolean;\n rect: { x: number; y: number; width: number; height: number };\n index: number;\n limitation: string;\n}\n\nexport interface LifecycleEventData {\n type:\n | \"recording-start\"\n | \"page-start\"\n | \"page-end\"\n | \"pause\"\n | \"resume\"\n | \"stop\"\n | \"navigation\"\n | \"overflow\"\n | \"recorder-error\";\n detail?: Record<string, unknown>;\n}\n","import type { ElementDescriptor, SelectorCandidate } from \"../types/events\";\n\nexport interface SelectorOptions {\n testIdAttributes: string[];\n stableAttributes: string[];\n}\n\nexport interface SelectorResult {\n selector: string;\n unique: boolean;\n candidates: SelectorCandidate[];\n}\n\nconst IMPLICIT_ROLES: Array<[string, string]> = [\n [\"a[href]\", \"link\"],\n [\"button\", \"button\"],\n [\"input[type=button],input[type=submit],input[type=reset]\", \"button\"],\n [\"input[type=checkbox]\", \"checkbox\"],\n [\"input[type=radio]\", \"radio\"],\n [\"input[type=range]\", \"slider\"],\n [\"input[type=search]\", \"searchbox\"],\n [\"input:not([type]),input[type=text],input[type=email],input[type=tel],input[type=url],input[type=password]\", \"textbox\"],\n [\"input[type=number]\", \"spinbutton\"],\n [\"textarea\", \"textbox\"],\n [\"select\", \"combobox\"],\n [\"h1,h2,h3,h4,h5,h6\", \"heading\"],\n [\"img[alt]\", \"img\"],\n [\"nav\", \"navigation\"],\n [\"main\", \"main\"],\n [\"ul,ol\", \"list\"],\n [\"li\", \"listitem\"],\n [\"table\", \"table\"],\n [\"dialog\", \"dialog\"],\n];\n\n/** Classes com cara de geradas (CSS-in-JS, hashes, utilitárias de estado). */\nconst UNSTABLE_CLASS = /^(css|sc|jsx|emotion|styled|_|svelte|ng-|ember|v-)[-_a-z0-9]*[0-9a-f]{4,}|^[a-z]{1,3}-(?=[0-9a-zA-Z]*\\d)[0-9a-zA-Z]{5,}$|\\b(?=[0-9a-f]*\\d)[0-9a-f]{6,}\\b|^(active|focus|hover|open|show|selected|disabled|loading|is-|has-)/i;\nconst UNSTABLE_ID = /\\d{4,}|[0-9a-f]{8,}|:r[0-9a-z]+:|^(ember|react|vue|__|ui-id-|headlessui)|^[a-z]+-[0-9a-f]{5,}$/i;\n\nconst q = (s: string): string => `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\nconst cssEsc = (s: string): string => (typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(s) : s.replace(/([^\\w-])/g, \"\\\\$1\"));\n\nexport function isStableId(id: string): boolean {\n return !!id && !UNSTABLE_ID.test(id);\n}\nexport function isStableClass(c: string): boolean {\n return !!c && !UNSTABLE_CLASS.test(c);\n}\n\nexport function implicitRole(el: Element): string | undefined {\n const explicit = el.getAttribute(\"role\");\n if (explicit) return explicit.split(/\\s+/)[0];\n for (const [sel, role] of IMPLICIT_ROLES) {\n try {\n if (el.matches(sel)) return role;\n } catch {\n /* seletor inválido no ambiente */\n }\n }\n return undefined;\n}\n\nconst norm = (s: string | null | undefined): string => (s ?? \"\").replace(/\\s+/g, \" \").trim();\n\nexport function labelText(el: Element): string {\n const doc = el.ownerDocument;\n const id = el.getAttribute(\"id\");\n if (id) {\n const l = doc.querySelector(`label[for=\"${cssEsc(id)}\"]`);\n if (l) return norm(l.textContent);\n }\n const wrap = el.closest(\"label\");\n if (wrap) return norm(wrap.textContent);\n return \"\";\n}\n\n/** Nome acessível simplificado (aria-labelledby, aria-label, label, alt, title, conteúdo). */\nexport function accessibleName(el: Element): string {\n const by = el.getAttribute(\"aria-labelledby\");\n if (by) {\n const t = by\n .split(/\\s+/)\n .map((id) => norm(el.ownerDocument.getElementById(id)?.textContent))\n .filter(Boolean)\n .join(\" \");\n if (t) return t;\n }\n const aria = norm(el.getAttribute(\"aria-label\"));\n if (aria) return aria;\n const tag = el.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") {\n const type = (el as HTMLInputElement).type;\n if (type === \"submit\" || type === \"button\" || type === \"reset\") return norm((el as HTMLInputElement).value);\n return labelText(el) || norm(el.getAttribute(\"placeholder\")) || norm(el.getAttribute(\"title\"));\n }\n if (tag === \"img\") return norm(el.getAttribute(\"alt\"));\n const text = norm(el.textContent);\n return (text || norm(el.getAttribute(\"title\"))).slice(0, 80);\n}\n\nfunction count(doc: Document, css: string): number {\n try {\n return doc.querySelectorAll(css).length;\n } catch {\n return 0;\n }\n}\n\nexport class SelectorGenerator {\n constructor(private readonly opts: SelectorOptions) {}\n\n generate(el: Element): SelectorResult {\n const doc = el.ownerDocument;\n const candidates: SelectorCandidate[] = [];\n const push = (strategy: SelectorCandidate[\"strategy\"], selector: string, matches: number) => {\n if (candidates.some((c) => c.selector === selector)) return;\n candidates.push({ strategy, selector, unique: matches === 1, matches });\n };\n\n for (const attr of this.opts.testIdAttributes) {\n const v = el.getAttribute(attr);\n if (v) push(\"testid\", `[${attr}=${q(v)}]`, count(doc, `[${attr}=${q(v)}]`));\n }\n for (const attr of this.opts.stableAttributes) {\n const v = el.getAttribute(attr);\n if (!v || attr === \"aria-label\") continue;\n const tag = el.tagName.toLowerCase();\n const css = `${tag}[${attr}=${q(v)}]`;\n push(\"attribute\", css, count(doc, css));\n }\n\n const role = implicitRole(el);\n const name = role ? accessibleName(el) : \"\";\n if (role && name) {\n push(\"role\", `role=${role}[name=${q(name)}]`, this.countRole(doc, role, name));\n }\n const label = [\"input\", \"textarea\", \"select\"].includes(el.tagName.toLowerCase()) ? labelText(el) : \"\";\n if (label) push(\"label\", `label=${q(label)}`, this.countByLabel(doc, label));\n const ph = el.getAttribute(\"placeholder\");\n if (ph) push(\"placeholder\", `[placeholder=${q(ph)}]`, count(doc, `[placeholder=${q(ph)}]`));\n\n const id = el.getAttribute(\"id\");\n if (id && isStableId(id)) push(\"id\", `#${cssEsc(id)}`, count(doc, `#${cssEsc(id)}`));\n\n const css = this.structuralCss(el);\n push(\"css\", css, count(doc, css));\n\n // Preferência: primeiro candidato único na ordem de prioridade; senão o primeiro; css como último.\n const best = candidates.find((c) => c.unique) ?? candidates[0];\n return { selector: best.selector, unique: best.unique, candidates };\n }\n\n private countRole(doc: Document, role: string, name: string): number {\n const sels = IMPLICIT_ROLES.filter(([, r]) => r === role).map(([s]) => s);\n sels.push(`[role=${q(role)}]`);\n let n = 0;\n let all: NodeListOf<Element>;\n try {\n all = doc.querySelectorAll(sels.join(\",\"));\n } catch {\n return 0;\n }\n all.forEach((e) => {\n if (accessibleName(e) === name) n++;\n });\n return n;\n }\n\n private countByLabel(doc: Document, label: string): number {\n let n = 0;\n doc.querySelectorAll(\"input,textarea,select\").forEach((e) => {\n if (labelText(e) === label) n++;\n });\n return n;\n }\n\n /** CSS estrutural: ancora no ancestral estável mais próximo; usa tag + classes estáveis + nth-of-type. */\n structuralCss(el: Element): string {\n const parts: string[] = [];\n let cur: Element | null = el;\n let depth = 0;\n while (cur && cur.nodeType === 1 && depth < 6) {\n const tag = cur.tagName.toLowerCase();\n if (tag === \"html\") break;\n const tid = this.opts.testIdAttributes.map((a) => [a, cur!.getAttribute(a)] as const).find(([, v]) => v);\n if (tid && cur !== el) {\n parts.unshift(`[${tid[0]}=${q(tid[1]!)}]`);\n break;\n }\n const id = cur.getAttribute(\"id\");\n if (id && isStableId(id)) {\n parts.unshift(`#${cssEsc(id)}`);\n break;\n }\n let seg = tag;\n const classes = Array.from(cur.classList).filter(isStableClass).slice(0, 2);\n if (classes.length) seg += classes.map((c) => `.${cssEsc(c)}`).join(\"\");\n const parent: Element | null = cur.parentElement;\n if (parent) {\n const same = Array.from(parent.children).filter((c) => c.tagName === cur!.tagName);\n if (same.length > 1) seg += `:nth-of-type(${same.indexOf(cur) + 1})`;\n }\n parts.unshift(seg);\n cur = parent;\n depth++;\n }\n return parts.join(\" > \");\n }\n\n describe(el: Element): ElementDescriptor {\n const tag = el.tagName.toLowerCase();\n const isField = tag === \"input\" || tag === \"textarea\" || tag === \"select\";\n const testId = this.opts.testIdAttributes.map((a) => el.getAttribute(a)).find(Boolean) ?? undefined;\n const role = implicitRole(el);\n const d: ElementDescriptor = { tag };\n const id = el.getAttribute(\"id\");\n if (id && isStableId(id)) d.id = id;\n if (role) d.role = role;\n const name = accessibleName(el);\n if (name) d.name = name.slice(0, 80);\n // Nunca inclui conteúdo textual de campos de formulário.\n if (!isField) {\n const text = norm(el.textContent);\n if (text) d.text = text.slice(0, 80);\n }\n const type = el.getAttribute(\"type\");\n if (type) d.type = type;\n if (testId) d.testId = testId;\n const classes = Array.from(el.classList).filter(isStableClass).slice(0, 5);\n if (classes.length) d.classes = classes;\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\");\n if (href) d.href = href.split(\"#\")[0].split(\"?\")[0].slice(0, 200);\n }\n const nm = el.getAttribute(\"name\");\n if (nm && isField) d.inputName = nm;\n const r = el.getBoundingClientRect?.();\n if (r) d.rect = { x: Math.round(r.x), y: Math.round(r.y), width: Math.round(r.width), height: Math.round(r.height) };\n return d;\n }\n}\n","import type { RecordedAction } from \"../types/events\";\n\nexport type StepType = \"click\" | \"dblclick\" | \"fill\" | \"press\" | \"select\" | \"check\" | \"uncheck\" | \"hover\" | \"drag\" | \"scroll\" | \"navigate\" | \"reload\";\n\nexport interface NormalizedStep {\n type: StepType;\n timestamp: number;\n url: string;\n selector?: string;\n selectorUnique?: boolean;\n selectorCandidates?: RecordedAction[\"selectorCandidates\"];\n element?: RecordedAction[\"element\"];\n coordinates?: { x: number; y: number };\n viewport?: { width: number; height: number };\n args?: Record<string, unknown>;\n expectsNavigation?: { to: string };\n sourceActionIds: string[];\n causedByActionId?: string;\n metadata?: Record<string, unknown>;\n}\n\nconst CLICK_DEDUP_MS = 600;\nconst NAV_AFTER_ACTION_MS = 2500;\n\n/**\n * Converte ações brutas em passos semânticos mínimos, sem perder rastreabilidade:\n * - click, click, dblclick → dblclick\n * - click em checkbox/radio + check → check/uncheck\n * - vários input no mesmo campo → um único fill\n * - input + Enter → fill + press\n * - focus/blur/mousemove/hover isolados são descartados (preservados apenas nos eventos brutos)\n * - scrolls consecutivos no mesmo alvo → um scroll\n * - navigate logo após click/Enter → vira `expectsNavigation` do passo causador\n */\nexport function normalizeActions(actions: readonly RecordedAction[]): NormalizedStep[] {\n const steps: NormalizedStep[] = [];\n const consumed = new Set<string>();\n\n for (let i = 0; i < actions.length; i++) {\n const a = actions[i];\n if (consumed.has(a.id)) continue;\n const base = (type: StepType, args?: Record<string, unknown>, src: string[] = [a.id]): NormalizedStep => ({\n type,\n timestamp: a.timestamp,\n url: a.url,\n selector: a.selector,\n selectorUnique: a.selectorUnique,\n selectorCandidates: a.selectorCandidates,\n element: a.element,\n coordinates: a.coordinates,\n viewport: a.viewport,\n args,\n sourceActionIds: src,\n });\n\n switch (a.type) {\n case \"click\": {\n // clique seguido de check no mesmo elemento (ou no seu input associado)\n const next = actions[i + 1];\n if (next && (next.type === \"check\") && next.timestamp - a.timestamp < 200) {\n consumed.add(next.id);\n const checked = next.payload?.checked !== false;\n steps.push({ ...base(checked ? \"check\" : \"uncheck\", { value: next.payload?.value }, [a.id, next.id]), selector: next.selector ?? a.selector, selectorCandidates: next.selectorCandidates ?? a.selectorCandidates, selectorUnique: next.selectorUnique ?? a.selectorUnique, element: next.element ?? a.element });\n break;\n }\n // click, click, dblclick\n const dbl = findDbl(actions, i);\n if (dbl) {\n for (let j = i; j <= dbl.index; j++) if (actions[j].selector === a.selector && (actions[j].type === \"click\" || actions[j].type === \"dblclick\")) consumed.add(actions[j].id);\n steps.push(base(\"dblclick\", { intervalMs: dbl.action.payload?.intervalMs }, collect(actions, i, dbl.index, a.selector)));\n break;\n }\n // cliques repetidos idênticos em sequência curta permanecem como cliques (intenção do usuário)\n steps.push(base(\"click\", { button: a.payload?.button, modifiers: a.payload?.modifiers }));\n break;\n }\n case \"dblclick\":\n steps.push(base(\"dblclick\", { intervalMs: a.payload?.intervalMs }));\n break;\n case \"check\":\n steps.push(base(a.payload?.checked === false ? \"uncheck\" : \"check\", { value: a.payload?.value }));\n break;\n case \"input\": {\n // último input do mesmo campo sem interrupção por outras ações\n let last = a;\n const src = [a.id];\n for (let j = i + 1; j < actions.length; j++) {\n const n = actions[j];\n if (n.type === \"input\" && n.selector === a.selector) {\n last = n;\n src.push(n.id);\n consumed.add(n.id);\n } else if (n.type === \"focus\" || n.type === \"blur\" || n.type === \"hover\" || n.type === \"mousemove\") continue;\n else break;\n }\n const p = last.payload ?? {};\n steps.push({ ...base(\"fill\", p.valueCaptured ? { value: p.value } : { valueRef: p.valueRef, valueCaptured: false, length: p.length }, src), timestamp: last.timestamp });\n break;\n }\n case \"keydown\": {\n const mods = (a.payload?.modifiers as string[] | undefined) ?? [];\n const key = a.payload?.key as string;\n if (!key) break;\n const held = mods.filter((m) => m !== key && (m !== \"Shift\" || key.length === 1));\n steps.push(base(\"press\", { key: [...held, key].join(\"+\"), code: a.payload?.code }));\n break;\n }\n case \"select\":\n steps.push(base(\"select\", { values: a.payload?.values, labels: a.payload?.labels }));\n break;\n case \"hover\":\n // hover só importa quando é seguido de clique em outro elemento dependente (menus). Mantém enter seguido de click.\n if (a.payload?.phase === \"enter\") {\n const n = actions.slice(i + 1).find((x) => x.type !== \"mousemove\" && x.type !== \"focus\" && x.type !== \"blur\");\n if (n && n.type === \"click\" && n.selector !== a.selector && n.timestamp - a.timestamp < 3000) steps.push(base(\"hover\"));\n }\n break;\n case \"drag\":\n steps.push(base(\"drag\", { from: a.payload?.from, to: a.payload?.to, target: a.payload?.target, trajectory: a.payload?.trajectory, durationMs: a.payload?.durationMs }));\n break;\n case \"scroll\": {\n let last = a;\n const src = [a.id];\n for (let j = i + 1; j < actions.length; j++) {\n const n = actions[j];\n if (n.type === \"scroll\" && n.selector === a.selector && n.payload?.target === a.payload?.target && n.timestamp - last.timestamp < 1500) {\n last = n;\n src.push(n.id);\n consumed.add(n.id);\n } else break;\n }\n steps.push({ ...base(\"scroll\", { from: a.payload?.from, to: last.payload?.to, target: a.payload?.target }, src) });\n break;\n }\n case \"navigate\": {\n const prev = steps[steps.length - 1];\n const to = a.payload?.to as string;\n // Navegação causada pela ação anterior: anexa como expectativa em vez de passo duplicado.\n if (prev && !prev.expectsNavigation && [\"click\", \"press\", \"dblclick\"].includes(prev.type) && a.timestamp - prev.timestamp < NAV_AFTER_ACTION_MS && a.payload?.kind !== \"history\") {\n prev.expectsNavigation = { to };\n prev.sourceActionIds = [...prev.sourceActionIds, a.id];\n } else {\n steps.push(base(\"navigate\", { to, from: a.payload?.from, kind: a.payload?.kind }));\n }\n break;\n }\n case \"reload\":\n steps.push(base(\"reload\", { url: a.payload?.url }));\n break;\n default:\n break; // focus, blur, mousemove\n }\n }\n\n // causedBy: passo seguinte a um clique cuja navegação já foi atribuída\n for (let i = 1; i < steps.length; i++) {\n const prev = steps[i - 1];\n if (prev.expectsNavigation) steps[i].causedByActionId = prev.sourceActionIds[0];\n }\n return steps;\n}\n\nfunction findDbl(actions: readonly RecordedAction[], i: number): { index: number; action: RecordedAction } | null {\n const a = actions[i];\n for (let j = i + 1; j < actions.length && j <= i + 3; j++) {\n const n = actions[j];\n if (n.timestamp - a.timestamp > CLICK_DEDUP_MS) break;\n if (n.type === \"dblclick\" && n.selector === a.selector) return { index: j, action: n };\n if (n.type !== \"click\" || n.selector !== a.selector) break;\n }\n return null;\n}\n\nfunction collect(actions: readonly RecordedAction[], from: number, to: number, selector?: string): string[] {\n const ids: string[] = [];\n for (let j = from; j <= to; j++) if (actions[j].selector === selector) ids.push(actions[j].id);\n return ids;\n}\n","import type { ActionType, ContextEventData, RecordedAction, SelectorCandidate } from \"../types/events\";\nimport { SDK_VERSION } from \"../types/events\";\nimport { normalizeActions, type NormalizedStep } from \"./ActionNormalizer\";\n\n/**\n * Contrato versionado entre o SDK e o futuro motor de automação (serviço externo).\n * O SDK NÃO executa Playwright. Uma reprodução bem-sucedida dos passos não equivale a aprovação do teste:\n * assertions continuam vinculadas aos casos de teste no painel.\n */\nexport const PLAYWRIGHT_CONTRACT_VERSION = \"1.0\";\nexport const PLAYWRIGHT_CONTRACT_KIND = \"offscript.playwright-recording\";\n\nexport interface PlaywrightStep {\n index: number;\n type: NormalizedStep[\"type\"];\n timestamp: number;\n /** Intervalo desde o passo anterior (ms), limitado a 30s. */\n waitBeforeMs: number;\n url: string;\n /** Melhor seletor (sintaxe Playwright) e alternativas em ordem de preferência. */\n selector?: string;\n selectorUnique?: boolean;\n selectorCandidates?: SelectorCandidate[];\n element?: RecordedAction[\"element\"];\n coordinates?: { x: number; y: number };\n viewport?: { width: number; height: number };\n /** Parâmetros do passo (valor permitido, tecla, destino...). Valores sensíveis chegam como `valueRef`. */\n args?: Record<string, unknown>;\n /** Navegação esperada após este passo. */\n expectsNavigation?: { to: string };\n /** Rastreabilidade para investigação: ações brutas que originaram o passo. */\n sourceActionIds: string[];\n causedByActionId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaywrightRecording {\n contractVersion: string;\n kind: typeof PLAYWRIGHT_CONTRACT_KIND;\n generatedAt: number;\n sdkVersion: string;\n initialConditions: {\n url?: string;\n viewport?: { width: number; height: number };\n userAgent?: string;\n language?: string;\n timezone?: string;\n deviceScaleFactor?: number;\n browser?: { name?: string; version?: string };\n };\n steps: PlaywrightStep[];\n stats: { rawActions: number; steps: number; merged: number };\n limitations: string[];\n /** Campo livre para extensões compatíveis. */\n extensions?: Record<string, unknown>;\n}\n\nexport const CONTRACT_LIMITATIONS = [\n \"Conteúdo de iframes cross-origin (ex.: seats.io) não é capturado; interações dentro deles não geram passos.\",\n \"Valores de campos não autorizados são substituídos por referências (valueRef) e não podem ser reproduzidos.\",\n \"O contrato descreve ações, não resultados esperados: assertions pertencem aos casos de teste.\",\n];\n\nexport interface BuildInput {\n actions: readonly RecordedAction[];\n contexts?: readonly ContextEventData[];\n extensions?: Record<string, unknown>;\n}\n\n/** Constrói o contrato a partir das ações gravadas. Pode ser usado no navegador ou no backend. */\nexport function buildPlaywrightContract(input: BuildInput): PlaywrightRecording {\n const ordered = [...input.actions].sort((a, b) => a.sequence - b.sequence);\n const steps = normalizeActions(ordered);\n const first = input.contexts?.[0];\n let prev = steps[0]?.timestamp ?? 0;\n const out: PlaywrightStep[] = steps.map((s, i) => {\n const wait = Math.min(30_000, Math.max(0, s.timestamp - prev));\n prev = s.timestamp;\n return {\n index: i,\n type: s.type,\n timestamp: s.timestamp,\n waitBeforeMs: i === 0 ? 0 : wait,\n url: s.url,\n selector: s.selector,\n selectorUnique: s.selectorUnique,\n selectorCandidates: s.selectorCandidates,\n element: s.element,\n coordinates: s.coordinates,\n viewport: s.viewport,\n args: s.args,\n expectsNavigation: s.expectsNavigation,\n sourceActionIds: s.sourceActionIds,\n causedByActionId: s.causedByActionId,\n metadata: s.metadata,\n };\n });\n return {\n contractVersion: PLAYWRIGHT_CONTRACT_VERSION,\n kind: PLAYWRIGHT_CONTRACT_KIND,\n generatedAt: Date.now(),\n sdkVersion: SDK_VERSION,\n initialConditions: {\n url: ordered[0]?.url ?? first?.url,\n viewport: first?.viewport ?? ordered[0]?.viewport,\n userAgent: first?.userAgent,\n language: first?.language,\n timezone: first?.timezone,\n deviceScaleFactor: first?.devicePixelRatio,\n browser: first?.browser,\n },\n steps: out,\n stats: { rawActions: ordered.length, steps: out.length, merged: ordered.length - out.length },\n limitations: CONTRACT_LIMITATIONS,\n extensions: input.extensions,\n };\n}\n\nconst STEP_TYPES: ReadonlySet<string> = new Set([\"click\", \"dblclick\", \"fill\", \"press\", \"select\", \"check\", \"uncheck\", \"hover\", \"drag\", \"scroll\", \"navigate\", \"reload\"]);\n\n/** Validação estrutural do contrato (usada em testes e por consumidores). Retorna a lista de problemas. */\nexport function validatePlaywrightContract(c: unknown): string[] {\n const errors: string[] = [];\n const o = c as Partial<PlaywrightRecording> | null;\n if (!o || typeof o !== \"object\") return [\"contrato ausente\"];\n if (o.kind !== PLAYWRIGHT_CONTRACT_KIND) errors.push(\"kind inválido\");\n if (!o.contractVersion || !/^\\d+\\.\\d+$/.test(o.contractVersion)) errors.push(\"contractVersion inválida\");\n else if (o.contractVersion.split(\".\")[0] !== PLAYWRIGHT_CONTRACT_VERSION.split(\".\")[0]) errors.push(`versão major incompatível: ${o.contractVersion}`);\n if (!Array.isArray(o.steps)) return [...errors, \"steps ausente\"];\n let lastTs = -Infinity;\n o.steps.forEach((s, i) => {\n if (s.index !== i) errors.push(`steps[${i}].index inconsistente`);\n if (!STEP_TYPES.has(s.type)) errors.push(`steps[${i}].type desconhecido: ${s.type}`);\n if (typeof s.timestamp !== \"number\") errors.push(`steps[${i}].timestamp inválido`);\n else if (s.timestamp < lastTs) errors.push(`steps[${i}] fora de ordem`);\n else lastTs = s.timestamp;\n if (!s.sourceActionIds?.length) errors.push(`steps[${i}].sourceActionIds vazio`);\n const needsSelector = ![\"navigate\", \"reload\", \"scroll\"].includes(s.type) || (s.type === \"scroll\" && s.args?.target === \"element\");\n if (needsSelector && !s.selector) errors.push(`steps[${i}] (${s.type}) sem seletor`);\n if (s.type === \"navigate\" && !s.args?.to) errors.push(`steps[${i}] navigate sem destino`);\n });\n return errors;\n}\n\nexport type { ActionType };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Offscript } from './chunk-
|
|
1
|
+
import { Offscript } from './chunk-GWBQSYQQ.js';
|
|
2
2
|
|
|
3
3
|
// src/adapters/vanilla.ts
|
|
4
4
|
async function createOffscript(config) {
|
|
@@ -13,5 +13,5 @@ async function startOffscript(config) {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export { createOffscript, startOffscript };
|
|
16
|
-
//# sourceMappingURL=chunk-
|
|
17
|
-
//# sourceMappingURL=chunk-
|
|
16
|
+
//# sourceMappingURL=chunk-4F52C3KC.js.map
|
|
17
|
+
//# sourceMappingURL=chunk-4F52C3KC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/vanilla.ts"],"names":[],"mappings":";;;AAIA,eAAsB,gBAAgB,MAAA,EAA6C;AACjF,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,MAAM,CAAA;AAChC,EAAA,MAAM,IAAI,IAAA,EAAK;AACf,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,eAAe,MAAA,EAA6C;AAChF,EAAA,MAAM,GAAA,GAAM,MAAM,eAAA,CAAgB,MAAM,CAAA;AACxC,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,OAAO,GAAA;AACT","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/adapters/vanilla.ts"],"names":[],"mappings":";;;AAIA,eAAsB,gBAAgB,MAAA,EAA6C;AACjF,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,MAAM,CAAA;AAChC,EAAA,MAAM,IAAI,IAAA,EAAK;AACf,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,eAAe,MAAA,EAA6C;AAChF,EAAA,MAAM,GAAA,GAAM,MAAM,eAAA,CAAgB,MAAM,CAAA;AACxC,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,OAAO,GAAA;AACT","file":"chunk-4F52C3KC.js","sourcesContent":["import { Offscript } from \"../core/OffscriptSDK\";\nimport type { OffscriptConfig } from \"../types/config\";\n\n/** Atalho para aplicações JS tradicionais, Blade e MPA: inicializa a captura local. */\nexport async function createOffscript(config: OffscriptConfig): Promise<Offscript> {\n const sdk = new Offscript(config);\n await sdk.init();\n return sdk;\n}\n\nexport async function startOffscript(config: OffscriptConfig): Promise<Offscript> {\n const sdk = await createOffscript(config);\n await sdk.startRecording();\n return sdk;\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/types/events.ts
|
|
4
4
|
var SCHEMA_VERSION = "1.0";
|
|
5
|
-
var SDK_VERSION = "0.1.
|
|
5
|
+
var SDK_VERSION = "0.1.10";
|
|
6
6
|
var ACTION_SCHEMA_VERSION = "1.0";
|
|
7
7
|
|
|
8
8
|
// src/playwright/SelectorGenerator.ts
|
|
@@ -437,5 +437,5 @@ exports.isStableId = isStableId;
|
|
|
437
437
|
exports.labelText = labelText;
|
|
438
438
|
exports.normalizeActions = normalizeActions;
|
|
439
439
|
exports.validatePlaywrightContract = validatePlaywrightContract;
|
|
440
|
-
//# sourceMappingURL=chunk-
|
|
441
|
-
//# sourceMappingURL=chunk-
|
|
440
|
+
//# sourceMappingURL=chunk-7JIK7MZN.cjs.map
|
|
441
|
+
//# sourceMappingURL=chunk-7JIK7MZN.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/events.ts","../src/playwright/SelectorGenerator.ts","../src/playwright/ActionNormalizer.ts","../src/playwright/PlaywrightDataContract.ts"],"names":["css"],"mappings":"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","file":"chunk-7JIK7MZN.cjs","sourcesContent":["export const SCHEMA_VERSION = \"1.0\";\nexport const SDK_VERSION = \"0.1.10\";\n\nexport type EventKind =\n | \"rrweb\"\n | \"action\"\n | \"http\"\n | \"console\"\n | \"error\"\n | \"context\"\n | \"iframe\"\n | \"lifecycle\";\n\n/** Envelope comum a todos os eventos. A ordem canônica é (tabId, sequence). */\nexport interface OffscriptEvent<T = unknown> {\n /** Identificador único (idempotência). */\n id: string;\n kind: EventKind;\n tabId: string;\n pageId: string;\n /** Sequência monotônica por aba, persistida entre páginas. */\n sequence: number;\n /** Momento em que o fato ocorreu (epoch ms). */\n timestamp: number;\n /** Ação do usuário mais recente dentro da janela de correlação. */\n relatedActionId?: string;\n relatedActionDeltaMs?: number;\n data: T;\n}\n\nexport const ACTION_SCHEMA_VERSION = \"1.0\";\n\nexport type ActionType =\n | \"click\"\n | \"dblclick\"\n | \"hover\"\n | \"mousemove\"\n | \"drag\"\n | \"input\"\n | \"keydown\"\n | \"select\"\n | \"check\"\n | \"scroll\"\n | \"navigate\"\n | \"reload\"\n | \"focus\"\n | \"blur\";\n\nexport interface SelectorCandidate {\n strategy: \"testid\" | \"attribute\" | \"role\" | \"label\" | \"placeholder\" | \"id\" | \"css\";\n /** Seletor em sintaxe Playwright (ex.: `role=button[name=\"Salvar\"]`). */\n selector: string;\n /** Único no documento no momento da ação. */\n unique: boolean;\n matches: number;\n}\n\nexport interface ElementDescriptor {\n tag: string;\n id?: string;\n role?: string;\n name?: string;\n text?: string;\n type?: string;\n testId?: string;\n classes?: string[];\n href?: string;\n inputName?: string;\n rect?: { x: number; y: number; width: number; height: number };\n}\n\nexport interface RecordedAction {\n schemaVersion: string;\n id: string;\n timestamp: number;\n /** Mesma sequência do envelope do evento. */\n sequence: number;\n type: ActionType;\n url: string;\n selector?: string;\n selectorCandidates?: SelectorCandidate[];\n selectorUnique?: boolean;\n element?: ElementDescriptor;\n coordinates?: { x: number; y: number };\n viewport?: { width: number; height: number };\n payload?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport interface HttpEventData {\n requestId: string;\n transport: \"fetch\" | \"xhr\";\n url: string;\n method: string;\n query?: Record<string, string | string[]>;\n requestHeaders?: Record<string, string>;\n requestBody?: CapturedBody;\n status?: number;\n statusText?: string;\n responseHeaders?: Record<string, string>;\n responseBody?: CapturedBody;\n startedAt: number;\n endedAt: number;\n durationMs: number;\n /** fetch: tempo até os headers; xhr: até loadend. */\n error?: { name: string; message: string };\n aborted?: boolean;\n /** Quantas requisições estavam em andamento quando esta começou. */\n concurrent: number;\n}\n\nexport interface CapturedBody {\n kind: \"text\" | \"json\" | \"form\" | \"binary\" | \"omitted\";\n value?: unknown;\n size?: number;\n truncated?: boolean;\n reason?: string;\n}\n\nexport interface ConsoleEventData {\n level: \"log\" | \"info\" | \"warn\" | \"error\";\n args: unknown[];\n message: string;\n stack?: string;\n url: string;\n}\n\nexport interface ErrorEventData {\n source: \"window.onerror\" | \"unhandledrejection\" | \"resource\";\n message: string;\n name?: string;\n stack?: string;\n file?: string;\n line?: number;\n column?: number;\n url: string;\n}\n\nexport interface ContextEventData {\n reason: \"initial\" | \"viewport\" | \"navigation\" | \"visibility\" | \"page-load\";\n url: string;\n referrer?: string;\n title?: string;\n navigationType?: string;\n browser?: { name?: string; version?: string };\n os?: string;\n userAgent: string;\n screen: { width: number; height: number };\n viewport: { width: number; height: number };\n devicePixelRatio: number;\n language: string;\n timezone?: string;\n online: boolean;\n visibility?: string;\n sdkVersion: string;\n /** A gravação guardou senhas, tokens e demais valores sem máscara. */\n captureSensitiveValues?: boolean;\n}\n\nexport interface IframeEventData {\n phase: \"present\" | \"removed\" | \"focus\" | \"blur\" | \"resized\";\n provider?: \"seatsio\" | \"unknown\";\n origin?: string;\n path?: string;\n crossOrigin: boolean;\n rect: { x: number; y: number; width: number; height: number };\n index: number;\n limitation: string;\n}\n\nexport interface LifecycleEventData {\n type:\n | \"recording-start\"\n | \"page-start\"\n | \"page-end\"\n | \"pause\"\n | \"resume\"\n | \"stop\"\n | \"navigation\"\n | \"overflow\"\n | \"recorder-error\";\n detail?: Record<string, unknown>;\n}\n","import type { ElementDescriptor, SelectorCandidate } from \"../types/events\";\n\nexport interface SelectorOptions {\n testIdAttributes: string[];\n stableAttributes: string[];\n}\n\nexport interface SelectorResult {\n selector: string;\n unique: boolean;\n candidates: SelectorCandidate[];\n}\n\nconst IMPLICIT_ROLES: Array<[string, string]> = [\n [\"a[href]\", \"link\"],\n [\"button\", \"button\"],\n [\"input[type=button],input[type=submit],input[type=reset]\", \"button\"],\n [\"input[type=checkbox]\", \"checkbox\"],\n [\"input[type=radio]\", \"radio\"],\n [\"input[type=range]\", \"slider\"],\n [\"input[type=search]\", \"searchbox\"],\n [\"input:not([type]),input[type=text],input[type=email],input[type=tel],input[type=url],input[type=password]\", \"textbox\"],\n [\"input[type=number]\", \"spinbutton\"],\n [\"textarea\", \"textbox\"],\n [\"select\", \"combobox\"],\n [\"h1,h2,h3,h4,h5,h6\", \"heading\"],\n [\"img[alt]\", \"img\"],\n [\"nav\", \"navigation\"],\n [\"main\", \"main\"],\n [\"ul,ol\", \"list\"],\n [\"li\", \"listitem\"],\n [\"table\", \"table\"],\n [\"dialog\", \"dialog\"],\n];\n\n/** Classes com cara de geradas (CSS-in-JS, hashes, utilitárias de estado). */\nconst UNSTABLE_CLASS = /^(css|sc|jsx|emotion|styled|_|svelte|ng-|ember|v-)[-_a-z0-9]*[0-9a-f]{4,}|^[a-z]{1,3}-(?=[0-9a-zA-Z]*\\d)[0-9a-zA-Z]{5,}$|\\b(?=[0-9a-f]*\\d)[0-9a-f]{6,}\\b|^(active|focus|hover|open|show|selected|disabled|loading|is-|has-)/i;\nconst UNSTABLE_ID = /\\d{4,}|[0-9a-f]{8,}|:r[0-9a-z]+:|^(ember|react|vue|__|ui-id-|headlessui)|^[a-z]+-[0-9a-f]{5,}$/i;\n\nconst q = (s: string): string => `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\nconst cssEsc = (s: string): string => (typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(s) : s.replace(/([^\\w-])/g, \"\\\\$1\"));\n\nexport function isStableId(id: string): boolean {\n return !!id && !UNSTABLE_ID.test(id);\n}\nexport function isStableClass(c: string): boolean {\n return !!c && !UNSTABLE_CLASS.test(c);\n}\n\nexport function implicitRole(el: Element): string | undefined {\n const explicit = el.getAttribute(\"role\");\n if (explicit) return explicit.split(/\\s+/)[0];\n for (const [sel, role] of IMPLICIT_ROLES) {\n try {\n if (el.matches(sel)) return role;\n } catch {\n /* seletor inválido no ambiente */\n }\n }\n return undefined;\n}\n\nconst norm = (s: string | null | undefined): string => (s ?? \"\").replace(/\\s+/g, \" \").trim();\n\nexport function labelText(el: Element): string {\n const doc = el.ownerDocument;\n const id = el.getAttribute(\"id\");\n if (id) {\n const l = doc.querySelector(`label[for=\"${cssEsc(id)}\"]`);\n if (l) return norm(l.textContent);\n }\n const wrap = el.closest(\"label\");\n if (wrap) return norm(wrap.textContent);\n return \"\";\n}\n\n/** Nome acessível simplificado (aria-labelledby, aria-label, label, alt, title, conteúdo). */\nexport function accessibleName(el: Element): string {\n const by = el.getAttribute(\"aria-labelledby\");\n if (by) {\n const t = by\n .split(/\\s+/)\n .map((id) => norm(el.ownerDocument.getElementById(id)?.textContent))\n .filter(Boolean)\n .join(\" \");\n if (t) return t;\n }\n const aria = norm(el.getAttribute(\"aria-label\"));\n if (aria) return aria;\n const tag = el.tagName.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") {\n const type = (el as HTMLInputElement).type;\n if (type === \"submit\" || type === \"button\" || type === \"reset\") return norm((el as HTMLInputElement).value);\n return labelText(el) || norm(el.getAttribute(\"placeholder\")) || norm(el.getAttribute(\"title\"));\n }\n if (tag === \"img\") return norm(el.getAttribute(\"alt\"));\n const text = norm(el.textContent);\n return (text || norm(el.getAttribute(\"title\"))).slice(0, 80);\n}\n\nfunction count(doc: Document, css: string): number {\n try {\n return doc.querySelectorAll(css).length;\n } catch {\n return 0;\n }\n}\n\nexport class SelectorGenerator {\n constructor(private readonly opts: SelectorOptions) {}\n\n generate(el: Element): SelectorResult {\n const doc = el.ownerDocument;\n const candidates: SelectorCandidate[] = [];\n const push = (strategy: SelectorCandidate[\"strategy\"], selector: string, matches: number) => {\n if (candidates.some((c) => c.selector === selector)) return;\n candidates.push({ strategy, selector, unique: matches === 1, matches });\n };\n\n for (const attr of this.opts.testIdAttributes) {\n const v = el.getAttribute(attr);\n if (v) push(\"testid\", `[${attr}=${q(v)}]`, count(doc, `[${attr}=${q(v)}]`));\n }\n for (const attr of this.opts.stableAttributes) {\n const v = el.getAttribute(attr);\n if (!v || attr === \"aria-label\") continue;\n const tag = el.tagName.toLowerCase();\n const css = `${tag}[${attr}=${q(v)}]`;\n push(\"attribute\", css, count(doc, css));\n }\n\n const role = implicitRole(el);\n const name = role ? accessibleName(el) : \"\";\n if (role && name) {\n push(\"role\", `role=${role}[name=${q(name)}]`, this.countRole(doc, role, name));\n }\n const label = [\"input\", \"textarea\", \"select\"].includes(el.tagName.toLowerCase()) ? labelText(el) : \"\";\n if (label) push(\"label\", `label=${q(label)}`, this.countByLabel(doc, label));\n const ph = el.getAttribute(\"placeholder\");\n if (ph) push(\"placeholder\", `[placeholder=${q(ph)}]`, count(doc, `[placeholder=${q(ph)}]`));\n\n const id = el.getAttribute(\"id\");\n if (id && isStableId(id)) push(\"id\", `#${cssEsc(id)}`, count(doc, `#${cssEsc(id)}`));\n\n const css = this.structuralCss(el);\n push(\"css\", css, count(doc, css));\n\n // Preferência: primeiro candidato único na ordem de prioridade; senão o primeiro; css como último.\n const best = candidates.find((c) => c.unique) ?? candidates[0];\n return { selector: best.selector, unique: best.unique, candidates };\n }\n\n private countRole(doc: Document, role: string, name: string): number {\n const sels = IMPLICIT_ROLES.filter(([, r]) => r === role).map(([s]) => s);\n sels.push(`[role=${q(role)}]`);\n let n = 0;\n let all: NodeListOf<Element>;\n try {\n all = doc.querySelectorAll(sels.join(\",\"));\n } catch {\n return 0;\n }\n all.forEach((e) => {\n if (accessibleName(e) === name) n++;\n });\n return n;\n }\n\n private countByLabel(doc: Document, label: string): number {\n let n = 0;\n doc.querySelectorAll(\"input,textarea,select\").forEach((e) => {\n if (labelText(e) === label) n++;\n });\n return n;\n }\n\n /** CSS estrutural: ancora no ancestral estável mais próximo; usa tag + classes estáveis + nth-of-type. */\n structuralCss(el: Element): string {\n const parts: string[] = [];\n let cur: Element | null = el;\n let depth = 0;\n while (cur && cur.nodeType === 1 && depth < 6) {\n const tag = cur.tagName.toLowerCase();\n if (tag === \"html\") break;\n const tid = this.opts.testIdAttributes.map((a) => [a, cur!.getAttribute(a)] as const).find(([, v]) => v);\n if (tid && cur !== el) {\n parts.unshift(`[${tid[0]}=${q(tid[1]!)}]`);\n break;\n }\n const id = cur.getAttribute(\"id\");\n if (id && isStableId(id)) {\n parts.unshift(`#${cssEsc(id)}`);\n break;\n }\n let seg = tag;\n const classes = Array.from(cur.classList).filter(isStableClass).slice(0, 2);\n if (classes.length) seg += classes.map((c) => `.${cssEsc(c)}`).join(\"\");\n const parent: Element | null = cur.parentElement;\n if (parent) {\n const same = Array.from(parent.children).filter((c) => c.tagName === cur!.tagName);\n if (same.length > 1) seg += `:nth-of-type(${same.indexOf(cur) + 1})`;\n }\n parts.unshift(seg);\n cur = parent;\n depth++;\n }\n return parts.join(\" > \");\n }\n\n describe(el: Element): ElementDescriptor {\n const tag = el.tagName.toLowerCase();\n const isField = tag === \"input\" || tag === \"textarea\" || tag === \"select\";\n const testId = this.opts.testIdAttributes.map((a) => el.getAttribute(a)).find(Boolean) ?? undefined;\n const role = implicitRole(el);\n const d: ElementDescriptor = { tag };\n const id = el.getAttribute(\"id\");\n if (id && isStableId(id)) d.id = id;\n if (role) d.role = role;\n const name = accessibleName(el);\n if (name) d.name = name.slice(0, 80);\n // Nunca inclui conteúdo textual de campos de formulário.\n if (!isField) {\n const text = norm(el.textContent);\n if (text) d.text = text.slice(0, 80);\n }\n const type = el.getAttribute(\"type\");\n if (type) d.type = type;\n if (testId) d.testId = testId;\n const classes = Array.from(el.classList).filter(isStableClass).slice(0, 5);\n if (classes.length) d.classes = classes;\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\");\n if (href) d.href = href.split(\"#\")[0].split(\"?\")[0].slice(0, 200);\n }\n const nm = el.getAttribute(\"name\");\n if (nm && isField) d.inputName = nm;\n const r = el.getBoundingClientRect?.();\n if (r) d.rect = { x: Math.round(r.x), y: Math.round(r.y), width: Math.round(r.width), height: Math.round(r.height) };\n return d;\n }\n}\n","import type { RecordedAction } from \"../types/events\";\n\nexport type StepType = \"click\" | \"dblclick\" | \"fill\" | \"press\" | \"select\" | \"check\" | \"uncheck\" | \"hover\" | \"drag\" | \"scroll\" | \"navigate\" | \"reload\";\n\nexport interface NormalizedStep {\n type: StepType;\n timestamp: number;\n url: string;\n selector?: string;\n selectorUnique?: boolean;\n selectorCandidates?: RecordedAction[\"selectorCandidates\"];\n element?: RecordedAction[\"element\"];\n coordinates?: { x: number; y: number };\n viewport?: { width: number; height: number };\n args?: Record<string, unknown>;\n expectsNavigation?: { to: string };\n sourceActionIds: string[];\n causedByActionId?: string;\n metadata?: Record<string, unknown>;\n}\n\nconst CLICK_DEDUP_MS = 600;\nconst NAV_AFTER_ACTION_MS = 2500;\n\n/**\n * Converte ações brutas em passos semânticos mínimos, sem perder rastreabilidade:\n * - click, click, dblclick → dblclick\n * - click em checkbox/radio + check → check/uncheck\n * - vários input no mesmo campo → um único fill\n * - input + Enter → fill + press\n * - focus/blur/mousemove/hover isolados são descartados (preservados apenas nos eventos brutos)\n * - scrolls consecutivos no mesmo alvo → um scroll\n * - navigate logo após click/Enter → vira `expectsNavigation` do passo causador\n */\nexport function normalizeActions(actions: readonly RecordedAction[]): NormalizedStep[] {\n const steps: NormalizedStep[] = [];\n const consumed = new Set<string>();\n\n for (let i = 0; i < actions.length; i++) {\n const a = actions[i];\n if (consumed.has(a.id)) continue;\n const base = (type: StepType, args?: Record<string, unknown>, src: string[] = [a.id]): NormalizedStep => ({\n type,\n timestamp: a.timestamp,\n url: a.url,\n selector: a.selector,\n selectorUnique: a.selectorUnique,\n selectorCandidates: a.selectorCandidates,\n element: a.element,\n coordinates: a.coordinates,\n viewport: a.viewport,\n args,\n sourceActionIds: src,\n });\n\n switch (a.type) {\n case \"click\": {\n // clique seguido de check no mesmo elemento (ou no seu input associado)\n const next = actions[i + 1];\n if (next && (next.type === \"check\") && next.timestamp - a.timestamp < 200) {\n consumed.add(next.id);\n const checked = next.payload?.checked !== false;\n steps.push({ ...base(checked ? \"check\" : \"uncheck\", { value: next.payload?.value }, [a.id, next.id]), selector: next.selector ?? a.selector, selectorCandidates: next.selectorCandidates ?? a.selectorCandidates, selectorUnique: next.selectorUnique ?? a.selectorUnique, element: next.element ?? a.element });\n break;\n }\n // click, click, dblclick\n const dbl = findDbl(actions, i);\n if (dbl) {\n for (let j = i; j <= dbl.index; j++) if (actions[j].selector === a.selector && (actions[j].type === \"click\" || actions[j].type === \"dblclick\")) consumed.add(actions[j].id);\n steps.push(base(\"dblclick\", { intervalMs: dbl.action.payload?.intervalMs }, collect(actions, i, dbl.index, a.selector)));\n break;\n }\n // cliques repetidos idênticos em sequência curta permanecem como cliques (intenção do usuário)\n steps.push(base(\"click\", { button: a.payload?.button, modifiers: a.payload?.modifiers }));\n break;\n }\n case \"dblclick\":\n steps.push(base(\"dblclick\", { intervalMs: a.payload?.intervalMs }));\n break;\n case \"check\":\n steps.push(base(a.payload?.checked === false ? \"uncheck\" : \"check\", { value: a.payload?.value }));\n break;\n case \"input\": {\n // último input do mesmo campo sem interrupção por outras ações\n let last = a;\n const src = [a.id];\n for (let j = i + 1; j < actions.length; j++) {\n const n = actions[j];\n if (n.type === \"input\" && n.selector === a.selector) {\n last = n;\n src.push(n.id);\n consumed.add(n.id);\n } else if (n.type === \"focus\" || n.type === \"blur\" || n.type === \"hover\" || n.type === \"mousemove\") continue;\n else break;\n }\n const p = last.payload ?? {};\n steps.push({ ...base(\"fill\", p.valueCaptured ? { value: p.value } : { valueRef: p.valueRef, valueCaptured: false, length: p.length }, src), timestamp: last.timestamp });\n break;\n }\n case \"keydown\": {\n const mods = (a.payload?.modifiers as string[] | undefined) ?? [];\n const key = a.payload?.key as string;\n if (!key) break;\n const held = mods.filter((m) => m !== key && (m !== \"Shift\" || key.length === 1));\n steps.push(base(\"press\", { key: [...held, key].join(\"+\"), code: a.payload?.code }));\n break;\n }\n case \"select\":\n steps.push(base(\"select\", { values: a.payload?.values, labels: a.payload?.labels }));\n break;\n case \"hover\":\n // hover só importa quando é seguido de clique em outro elemento dependente (menus). Mantém enter seguido de click.\n if (a.payload?.phase === \"enter\") {\n const n = actions.slice(i + 1).find((x) => x.type !== \"mousemove\" && x.type !== \"focus\" && x.type !== \"blur\");\n if (n && n.type === \"click\" && n.selector !== a.selector && n.timestamp - a.timestamp < 3000) steps.push(base(\"hover\"));\n }\n break;\n case \"drag\":\n steps.push(base(\"drag\", { from: a.payload?.from, to: a.payload?.to, target: a.payload?.target, trajectory: a.payload?.trajectory, durationMs: a.payload?.durationMs }));\n break;\n case \"scroll\": {\n let last = a;\n const src = [a.id];\n for (let j = i + 1; j < actions.length; j++) {\n const n = actions[j];\n if (n.type === \"scroll\" && n.selector === a.selector && n.payload?.target === a.payload?.target && n.timestamp - last.timestamp < 1500) {\n last = n;\n src.push(n.id);\n consumed.add(n.id);\n } else break;\n }\n steps.push({ ...base(\"scroll\", { from: a.payload?.from, to: last.payload?.to, target: a.payload?.target }, src) });\n break;\n }\n case \"navigate\": {\n const prev = steps[steps.length - 1];\n const to = a.payload?.to as string;\n // Navegação causada pela ação anterior: anexa como expectativa em vez de passo duplicado.\n if (prev && !prev.expectsNavigation && [\"click\", \"press\", \"dblclick\"].includes(prev.type) && a.timestamp - prev.timestamp < NAV_AFTER_ACTION_MS && a.payload?.kind !== \"history\") {\n prev.expectsNavigation = { to };\n prev.sourceActionIds = [...prev.sourceActionIds, a.id];\n } else {\n steps.push(base(\"navigate\", { to, from: a.payload?.from, kind: a.payload?.kind }));\n }\n break;\n }\n case \"reload\":\n steps.push(base(\"reload\", { url: a.payload?.url }));\n break;\n default:\n break; // focus, blur, mousemove\n }\n }\n\n // causedBy: passo seguinte a um clique cuja navegação já foi atribuída\n for (let i = 1; i < steps.length; i++) {\n const prev = steps[i - 1];\n if (prev.expectsNavigation) steps[i].causedByActionId = prev.sourceActionIds[0];\n }\n return steps;\n}\n\nfunction findDbl(actions: readonly RecordedAction[], i: number): { index: number; action: RecordedAction } | null {\n const a = actions[i];\n for (let j = i + 1; j < actions.length && j <= i + 3; j++) {\n const n = actions[j];\n if (n.timestamp - a.timestamp > CLICK_DEDUP_MS) break;\n if (n.type === \"dblclick\" && n.selector === a.selector) return { index: j, action: n };\n if (n.type !== \"click\" || n.selector !== a.selector) break;\n }\n return null;\n}\n\nfunction collect(actions: readonly RecordedAction[], from: number, to: number, selector?: string): string[] {\n const ids: string[] = [];\n for (let j = from; j <= to; j++) if (actions[j].selector === selector) ids.push(actions[j].id);\n return ids;\n}\n","import type { ActionType, ContextEventData, RecordedAction, SelectorCandidate } from \"../types/events\";\nimport { SDK_VERSION } from \"../types/events\";\nimport { normalizeActions, type NormalizedStep } from \"./ActionNormalizer\";\n\n/**\n * Contrato versionado entre o SDK e o futuro motor de automação (serviço externo).\n * O SDK NÃO executa Playwright. Uma reprodução bem-sucedida dos passos não equivale a aprovação do teste:\n * assertions continuam vinculadas aos casos de teste no painel.\n */\nexport const PLAYWRIGHT_CONTRACT_VERSION = \"1.0\";\nexport const PLAYWRIGHT_CONTRACT_KIND = \"offscript.playwright-recording\";\n\nexport interface PlaywrightStep {\n index: number;\n type: NormalizedStep[\"type\"];\n timestamp: number;\n /** Intervalo desde o passo anterior (ms), limitado a 30s. */\n waitBeforeMs: number;\n url: string;\n /** Melhor seletor (sintaxe Playwright) e alternativas em ordem de preferência. */\n selector?: string;\n selectorUnique?: boolean;\n selectorCandidates?: SelectorCandidate[];\n element?: RecordedAction[\"element\"];\n coordinates?: { x: number; y: number };\n viewport?: { width: number; height: number };\n /** Parâmetros do passo (valor permitido, tecla, destino...). Valores sensíveis chegam como `valueRef`. */\n args?: Record<string, unknown>;\n /** Navegação esperada após este passo. */\n expectsNavigation?: { to: string };\n /** Rastreabilidade para investigação: ações brutas que originaram o passo. */\n sourceActionIds: string[];\n causedByActionId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaywrightRecording {\n contractVersion: string;\n kind: typeof PLAYWRIGHT_CONTRACT_KIND;\n generatedAt: number;\n sdkVersion: string;\n initialConditions: {\n url?: string;\n viewport?: { width: number; height: number };\n userAgent?: string;\n language?: string;\n timezone?: string;\n deviceScaleFactor?: number;\n browser?: { name?: string; version?: string };\n };\n steps: PlaywrightStep[];\n stats: { rawActions: number; steps: number; merged: number };\n limitations: string[];\n /** Campo livre para extensões compatíveis. */\n extensions?: Record<string, unknown>;\n}\n\nexport const CONTRACT_LIMITATIONS = [\n \"Conteúdo de iframes cross-origin (ex.: seats.io) não é capturado; interações dentro deles não geram passos.\",\n \"Valores de campos não autorizados são substituídos por referências (valueRef) e não podem ser reproduzidos.\",\n \"O contrato descreve ações, não resultados esperados: assertions pertencem aos casos de teste.\",\n];\n\nexport interface BuildInput {\n actions: readonly RecordedAction[];\n contexts?: readonly ContextEventData[];\n extensions?: Record<string, unknown>;\n}\n\n/** Constrói o contrato a partir das ações gravadas. Pode ser usado no navegador ou no backend. */\nexport function buildPlaywrightContract(input: BuildInput): PlaywrightRecording {\n const ordered = [...input.actions].sort((a, b) => a.sequence - b.sequence);\n const steps = normalizeActions(ordered);\n const first = input.contexts?.[0];\n let prev = steps[0]?.timestamp ?? 0;\n const out: PlaywrightStep[] = steps.map((s, i) => {\n const wait = Math.min(30_000, Math.max(0, s.timestamp - prev));\n prev = s.timestamp;\n return {\n index: i,\n type: s.type,\n timestamp: s.timestamp,\n waitBeforeMs: i === 0 ? 0 : wait,\n url: s.url,\n selector: s.selector,\n selectorUnique: s.selectorUnique,\n selectorCandidates: s.selectorCandidates,\n element: s.element,\n coordinates: s.coordinates,\n viewport: s.viewport,\n args: s.args,\n expectsNavigation: s.expectsNavigation,\n sourceActionIds: s.sourceActionIds,\n causedByActionId: s.causedByActionId,\n metadata: s.metadata,\n };\n });\n return {\n contractVersion: PLAYWRIGHT_CONTRACT_VERSION,\n kind: PLAYWRIGHT_CONTRACT_KIND,\n generatedAt: Date.now(),\n sdkVersion: SDK_VERSION,\n initialConditions: {\n url: ordered[0]?.url ?? first?.url,\n viewport: first?.viewport ?? ordered[0]?.viewport,\n userAgent: first?.userAgent,\n language: first?.language,\n timezone: first?.timezone,\n deviceScaleFactor: first?.devicePixelRatio,\n browser: first?.browser,\n },\n steps: out,\n stats: { rawActions: ordered.length, steps: out.length, merged: ordered.length - out.length },\n limitations: CONTRACT_LIMITATIONS,\n extensions: input.extensions,\n };\n}\n\nconst STEP_TYPES: ReadonlySet<string> = new Set([\"click\", \"dblclick\", \"fill\", \"press\", \"select\", \"check\", \"uncheck\", \"hover\", \"drag\", \"scroll\", \"navigate\", \"reload\"]);\n\n/** Validação estrutural do contrato (usada em testes e por consumidores). Retorna a lista de problemas. */\nexport function validatePlaywrightContract(c: unknown): string[] {\n const errors: string[] = [];\n const o = c as Partial<PlaywrightRecording> | null;\n if (!o || typeof o !== \"object\") return [\"contrato ausente\"];\n if (o.kind !== PLAYWRIGHT_CONTRACT_KIND) errors.push(\"kind inválido\");\n if (!o.contractVersion || !/^\\d+\\.\\d+$/.test(o.contractVersion)) errors.push(\"contractVersion inválida\");\n else if (o.contractVersion.split(\".\")[0] !== PLAYWRIGHT_CONTRACT_VERSION.split(\".\")[0]) errors.push(`versão major incompatível: ${o.contractVersion}`);\n if (!Array.isArray(o.steps)) return [...errors, \"steps ausente\"];\n let lastTs = -Infinity;\n o.steps.forEach((s, i) => {\n if (s.index !== i) errors.push(`steps[${i}].index inconsistente`);\n if (!STEP_TYPES.has(s.type)) errors.push(`steps[${i}].type desconhecido: ${s.type}`);\n if (typeof s.timestamp !== \"number\") errors.push(`steps[${i}].timestamp inválido`);\n else if (s.timestamp < lastTs) errors.push(`steps[${i}] fora de ordem`);\n else lastTs = s.timestamp;\n if (!s.sourceActionIds?.length) errors.push(`steps[${i}].sourceActionIds vazio`);\n const needsSelector = ![\"navigate\", \"reload\", \"scroll\"].includes(s.type) || (s.type === \"scroll\" && s.args?.target === \"element\");\n if (needsSelector && !s.selector) errors.push(`steps[${i}] (${s.type}) sem seletor`);\n if (s.type === \"navigate\" && !s.args?.to) errors.push(`steps[${i}] navigate sem destino`);\n });\n return errors;\n}\n\nexport type { ActionType };\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk7JIK7MZN_cjs = require('./chunk-7JIK7MZN.cjs');
|
|
4
4
|
|
|
5
5
|
// src/types/config.ts
|
|
6
6
|
var DEFAULT_RECORDING = {
|
|
@@ -347,7 +347,7 @@ var ActionRecorder = class {
|
|
|
347
347
|
this.scrollState = /* @__PURE__ */ new Map();
|
|
348
348
|
this.move = [];
|
|
349
349
|
const r = sink.config.recording;
|
|
350
|
-
this.gen = new
|
|
350
|
+
this.gen = new chunk7JIK7MZN_cjs.SelectorGenerator({ testIdAttributes: r.testIdAttributes, stableAttributes: r.stableAttributes });
|
|
351
351
|
}
|
|
352
352
|
start() {
|
|
353
353
|
const d = this.d;
|
|
@@ -411,7 +411,7 @@ var ActionRecorder = class {
|
|
|
411
411
|
emit(draft, el, extra) {
|
|
412
412
|
const s = this.sink.sanitizer;
|
|
413
413
|
const data = {
|
|
414
|
-
schemaVersion:
|
|
414
|
+
schemaVersion: chunk7JIK7MZN_cjs.ACTION_SCHEMA_VERSION,
|
|
415
415
|
type: draft.type,
|
|
416
416
|
url: s.sanitizeUrl(location.href),
|
|
417
417
|
viewport: { width: window.innerWidth, height: window.innerHeight },
|
|
@@ -672,7 +672,7 @@ function collectContext(reason, captureSensitiveValues = false) {
|
|
|
672
672
|
timezone: safe(() => Intl.DateTimeFormat().resolvedOptions().timeZone),
|
|
673
673
|
online: nav.onLine,
|
|
674
674
|
visibility: document.visibilityState,
|
|
675
|
-
sdkVersion:
|
|
675
|
+
sdkVersion: chunk7JIK7MZN_cjs.SDK_VERSION,
|
|
676
676
|
captureSensitiveValues
|
|
677
677
|
};
|
|
678
678
|
}
|
|
@@ -1266,6 +1266,7 @@ var RRWebRecorder = class {
|
|
|
1266
1266
|
this.needsSnapshot = false;
|
|
1267
1267
|
this.snapshotsTaken = 0;
|
|
1268
1268
|
this.settling = false;
|
|
1269
|
+
this.recoveringSnapshot = false;
|
|
1269
1270
|
}
|
|
1270
1271
|
async start() {
|
|
1271
1272
|
this.stopped = false;
|
|
@@ -1297,7 +1298,6 @@ var RRWebRecorder = class {
|
|
|
1297
1298
|
// erros internos do rrweb não propagam
|
|
1298
1299
|
};
|
|
1299
1300
|
this.stopFn = mod.record(options) ?? void 0;
|
|
1300
|
-
this.scheduleSnapshot();
|
|
1301
1301
|
}
|
|
1302
1302
|
/** Captura o DOM depois do ciclo de renderização atual (Vue, React, etc.). */
|
|
1303
1303
|
scheduleSnapshot() {
|
|
@@ -1365,7 +1365,9 @@ var RRWebRecorder = class {
|
|
|
1365
1365
|
const emitted = this.sink.emit("rrweb", event, { priority, at: event.timestamp });
|
|
1366
1366
|
if (event.type === 2) {
|
|
1367
1367
|
this.needsSnapshot = !emitted;
|
|
1368
|
-
if (emitted)
|
|
1368
|
+
if (emitted) {
|
|
1369
|
+
this.snapshotsTaken++;
|
|
1370
|
+
}
|
|
1369
1371
|
}
|
|
1370
1372
|
if (!emitted && event.type === 3) this.needsSnapshot = true;
|
|
1371
1373
|
});
|
|
@@ -1403,11 +1405,16 @@ var RRWebRecorder = class {
|
|
|
1403
1405
|
}
|
|
1404
1406
|
}
|
|
1405
1407
|
takeFullSnapshot() {
|
|
1406
|
-
if (this.stopped) return;
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
this.
|
|
1410
|
-
|
|
1408
|
+
if (this.stopped || this.recoveringSnapshot) return;
|
|
1409
|
+
this.recoveringSnapshot = true;
|
|
1410
|
+
try {
|
|
1411
|
+
guard(this.sink, this.name, () => {
|
|
1412
|
+
if (!this.mod?.record) return;
|
|
1413
|
+
this.mod.record.takeFullSnapshot(true);
|
|
1414
|
+
});
|
|
1415
|
+
} finally {
|
|
1416
|
+
this.recoveringSnapshot = false;
|
|
1417
|
+
}
|
|
1411
1418
|
}
|
|
1412
1419
|
addCustomEvent(tag, payload) {
|
|
1413
1420
|
if (this.stopped) return;
|
|
@@ -1426,7 +1433,8 @@ var RRWebRecorder = class {
|
|
|
1426
1433
|
this.takeFullSnapshot();
|
|
1427
1434
|
}
|
|
1428
1435
|
stop() {
|
|
1429
|
-
|
|
1436
|
+
const snapshotPending = this.settling || this.scheduledSnapshotFrame !== void 0;
|
|
1437
|
+
if (!this.stopped && !this.paused && snapshotPending) this.takeFullSnapshot();
|
|
1430
1438
|
this.stopped = true;
|
|
1431
1439
|
this.cancelScheduledSnapshot();
|
|
1432
1440
|
safe(() => this.stopFn?.());
|
|
@@ -2295,6 +2303,24 @@ function tokenFingerprint(token) {
|
|
|
2295
2303
|
}
|
|
2296
2304
|
return `${first >>> 0}.${second >>> 0}`;
|
|
2297
2305
|
}
|
|
2306
|
+
async function encodeRecordingPayload(payload) {
|
|
2307
|
+
const json = JSON.stringify(payload);
|
|
2308
|
+
const CompressionStreamCtor = globalThis.CompressionStream;
|
|
2309
|
+
if (!CompressionStreamCtor) return { body: json };
|
|
2310
|
+
try {
|
|
2311
|
+
const stream = new CompressionStreamCtor("gzip");
|
|
2312
|
+
const writer = stream.writable.getWriter();
|
|
2313
|
+
const compressedBody = new Response(stream.readable).blob();
|
|
2314
|
+
await writer.write(new TextEncoder().encode(json));
|
|
2315
|
+
await writer.close();
|
|
2316
|
+
return {
|
|
2317
|
+
body: await compressedBody,
|
|
2318
|
+
contentEncoding: "gzip"
|
|
2319
|
+
};
|
|
2320
|
+
} catch {
|
|
2321
|
+
return { body: json };
|
|
2322
|
+
}
|
|
2323
|
+
}
|
|
2298
2324
|
var Offscript = class {
|
|
2299
2325
|
constructor(config = {}) {
|
|
2300
2326
|
this.bus = new Emitter();
|
|
@@ -2504,7 +2530,7 @@ var Offscript = class {
|
|
|
2504
2530
|
this.rrweb = this.actions = this.context = void 0;
|
|
2505
2531
|
this.payload = this.buildPayload();
|
|
2506
2532
|
this.setStatus("stopped");
|
|
2507
|
-
|
|
2533
|
+
if (this.store) this.save(this.store.flush());
|
|
2508
2534
|
this.bus.emit("recordingEnd", this.payload);
|
|
2509
2535
|
return this.payload;
|
|
2510
2536
|
}
|
|
@@ -2526,10 +2552,17 @@ var Offscript = class {
|
|
|
2526
2552
|
if (!["https:", "http:"].includes(url.protocol)) throw new ConfigError("Endpoint HTTP inv\xE1lido");
|
|
2527
2553
|
const payload = await this.stopRecording();
|
|
2528
2554
|
try {
|
|
2555
|
+
const encodedPayload = await encodeRecordingPayload(payload);
|
|
2556
|
+
const headers = {
|
|
2557
|
+
"Content-Type": "application/json",
|
|
2558
|
+
Accept: "application/json",
|
|
2559
|
+
Authorization: `Bearer ${token}`
|
|
2560
|
+
};
|
|
2561
|
+
if (encodedPayload.contentEncoding) headers["Content-Encoding"] = encodedPayload.contentEncoding;
|
|
2529
2562
|
const response = await fetch(url.href, {
|
|
2530
2563
|
method: "POST",
|
|
2531
|
-
headers
|
|
2532
|
-
body:
|
|
2564
|
+
headers,
|
|
2565
|
+
body: encodedPayload.body
|
|
2533
2566
|
});
|
|
2534
2567
|
if (!response.ok) throw new OffscriptError("TRANSPORT_FAILED", `Falha ao enviar grava\xE7\xE3o: HTTP ${response.status}`, { status: response.status });
|
|
2535
2568
|
this.submitted = true;
|
|
@@ -2591,7 +2624,7 @@ var Offscript = class {
|
|
|
2591
2624
|
this.destroyed = true;
|
|
2592
2625
|
}
|
|
2593
2626
|
exportPlaywrightData() {
|
|
2594
|
-
return
|
|
2627
|
+
return chunk7JIK7MZN_cjs.buildPlaywrightContract({ actions: this.actionLog, contexts: this.contextLog });
|
|
2595
2628
|
}
|
|
2596
2629
|
getRecordedActions() {
|
|
2597
2630
|
return this.actionLog;
|
|
@@ -2736,7 +2769,7 @@ var Offscript = class {
|
|
|
2736
2769
|
this.bus.emit("statusChange", { from, to });
|
|
2737
2770
|
}
|
|
2738
2771
|
};
|
|
2739
|
-
Offscript.version =
|
|
2772
|
+
Offscript.version = chunk7JIK7MZN_cjs.SDK_VERSION;
|
|
2740
2773
|
|
|
2741
2774
|
exports.ConfigError = ConfigError;
|
|
2742
2775
|
exports.DEFAULT_PRIVACY = DEFAULT_PRIVACY;
|
|
@@ -2745,5 +2778,5 @@ exports.DataSanitizer = DataSanitizer;
|
|
|
2745
2778
|
exports.InvalidStateError = InvalidStateError;
|
|
2746
2779
|
exports.Offscript = Offscript;
|
|
2747
2780
|
exports.OffscriptError = OffscriptError;
|
|
2748
|
-
//# sourceMappingURL=chunk-
|
|
2749
|
-
//# sourceMappingURL=chunk-
|
|
2781
|
+
//# sourceMappingURL=chunk-AX3BKPZJ.cjs.map
|
|
2782
|
+
//# sourceMappingURL=chunk-AX3BKPZJ.cjs.map
|