lib-e2e-cypress-for-dummys-ts 0.10.0 → 1.0.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.
- package/LICENSE +21 -0
- package/README.md +767 -744
- package/dist/{chunk-VT2GLZ62.js → chunk-24WFAT4W.js} +1 -1
- package/dist/chunk-24WFAT4W.js.map +1 -0
- package/dist/index.cjs +81 -101
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -48
- package/dist/index.d.ts +2 -48
- package/dist/index.js +82 -85
- package/dist/index.js.map +1 -1
- package/dist/runner.js +0 -0
- package/dist/selector-picker-KJUXPXHH.js +7 -0
- package/package.json +74 -74
- package/dist/chunk-VT2GLZ62.js.map +0 -1
- package/dist/selector-picker-ZEZ2G5K6.js +0 -7
- /package/dist/{selector-picker-ZEZ2G5K6.js.map → selector-picker-KJUXPXHH.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/code-format.utils.ts","../src/utils/selector-quality.utils.ts","../src/components/selector-picker/selector-picker.styles.ts","../src/utils/html.utils.ts","../src/components/selector-picker/selector-picker.template.ts","../src/components/selector-picker/selector-picker.ts"],"sourcesContent":["function gcd(a: number, b: number): number {\n while (b) { const t = b; b = a % b; a = t; }\n return a;\n}\n\n/**\n * Escapes backslashes and single quotes so a value can be safely embedded inside\n * a single-quoted JavaScript string literal — e.g. an `it('…')` / `describe('…')`\n * name. Without this, a test named `User's login` produces broken generated JS.\n */\nexport function escapeSingleQuotes(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\n/**\n * Escapes double quotes so a value can be safely embedded inside a CSS\n * double-quoted attribute selector, e.g. [data-cy=\"VALUE\"].\n * The result must subsequently pass through escapeSingleQuotes when it is\n * placed inside a single-quoted JS string literal (the JS layer doubles the\n * backslash introduced here).\n */\nexport function escapeCssAttrValue(value: string): string {\n return value.replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Normalizes indentation in a code block and prefixes every line with baseIndent.\n *\n * Algorithm:\n * 1. Strip trailing whitespace from each line.\n * 2. Find the minimum leading-whitespace count of non-empty lines (dedent).\n * 3. Compute the indent step as the GCD of all non-zero relative indent values,\n * so the original indent unit (4-space, 8-space, etc.) maps to 2-space levels.\n * 4. Re-emit each line as: baseIndent + ' '.repeat(level) + trimmedContent.\n *\n * This handles multi-line interceptor/command blocks that were stored with\n * inconsistent or file-origin indentation.\n */\nexport function normalizeBlock(code: string, baseIndent: string): string {\n const lines = code.split('\\n').map(l => l.trimEnd());\n const nonEmpty = lines.filter(l => l.trim().length > 0);\n if (!nonEmpty.length) return '';\n\n const indents = nonEmpty.map(l => l.length - l.trimStart().length);\n const minIndent = Math.min(...indents);\n const relIndents = [...new Set(indents.map(n => n - minIndent).filter(n => n > 0))];\n const step = relIndents.length > 0 ? relIndents.reduce(gcd) : 2;\n\n return lines\n .map(l => {\n if (!l.trim()) return '';\n const level = Math.round((l.length - l.trimStart().length - minIndent) / step);\n return baseIndent + ' '.repeat(level) + l.trimStart();\n })\n .join('\\n');\n}\n","import { escapeCssAttrValue } from './code-format.utils';\n\nexport type SelectorQuality = 'excellent' | 'good' | 'acceptable' | 'poor';\n\nexport const FORBIDDEN_ID_PREFIXES = [\n 'cdk-', 'mat-', 'p-', 'ng-', 'mdc-',\n 'primeng-', 'auto-', 'field-', 'input-', 'select-',\n];\n\nexport function getSelectorQuality(el: HTMLElement): SelectorQuality {\n if (\n el.hasAttribute('data-cy') ||\n el.hasAttribute('data-testid') ||\n el.hasAttribute('aria-label')\n ) {\n return 'excellent';\n }\n\n const rawId = el.id;\n if (\n rawId &&\n rawId.length < 25 &&\n /^[a-zA-Z][\\w-]*$/.test(rawId) &&\n !FORBIDDEN_ID_PREFIXES.some((p) => rawId.startsWith(p)) &&\n !/^\\d+$/.test(rawId)\n ) {\n return 'good';\n }\n\n if (typeof el.className === 'string' && el.className.trim().length > 0) {\n return 'acceptable';\n }\n\n return 'poor';\n}\n\n/** Returns the best cy.get() selector string for a given element. */\nexport function buildPickerSelector(el: HTMLElement): string {\n const dataCy = el.getAttribute('data-cy');\n if (dataCy) return `[data-cy=\"${escapeCssAttrValue(dataCy)}\"]`;\n\n const dataTestid = el.getAttribute('data-testid');\n if (dataTestid) return `[data-testid=\"${escapeCssAttrValue(dataTestid)}\"]`;\n\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return `[aria-label=\"${escapeCssAttrValue(ariaLabel)}\"]`;\n\n const rawId = el.id;\n if (\n rawId &&\n rawId.length < 25 &&\n /^[a-zA-Z][\\w-]*$/.test(rawId) &&\n !FORBIDDEN_ID_PREFIXES.some((p) => rawId.startsWith(p)) &&\n !/^\\d+$/.test(rawId)\n ) {\n return `#${rawId}`;\n }\n\n if (typeof el.className === 'string' && el.className.trim().length > 0) {\n const classes = el.className.trim().split(/\\s+/);\n return classes.map((c) => `.${c}`).join('');\n }\n\n return el.tagName.toLowerCase();\n}\n\n/** Human-readable key attribute/selector preview for a picker row (raw, unescaped). */\nexport function keyAttrDisplay(el: HTMLElement): string {\n for (const attr of ['data-cy', 'data-testid', 'aria-label']) {\n const v = el.getAttribute(attr);\n if (v) return `${attr}=\"${v}\"`;\n }\n if (el.id) return `id=\"${el.id}\"`;\n if (el.className && el.className.trim()) {\n return el.className.trim().split(/\\s+/).map((c) => `.${c}`).join('');\n }\n return '';\n}\n\n/** Plain, serializable view-model for one picker row — no DOM held. */\nexport interface PickerRow {\n quality: SelectorQuality;\n selector: string;\n tag: string;\n attr: string;\n}\n\n/** Reads an element once and returns the plain data a picker row needs to render. */\nexport function describePickerRow(el: HTMLElement): PickerRow {\n return {\n quality: getSelectorQuality(el),\n selector: buildPickerSelector(el),\n tag: el.tagName.toLowerCase(),\n attr: keyAttrDisplay(el),\n };\n}\n","export const SELECTOR_PICKER_STYLES = `\n :host {\n position: fixed;\n z-index: 2147483647;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n pointer-events: none;\n }\n\n .overlay {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n pointer-events: all;\n background: #161b22;\n border: 1px solid #30363d;\n border-radius: 10px;\n box-shadow: 0 8px 32px rgba(0,0,0,0.6);\n min-width: 420px;\n max-width: 600px;\n font-family: 'Segoe UI', system-ui, sans-serif;\n color: #e6edf3;\n font-size: 13px;\n }\n\n .header {\n padding: 12px 16px 8px;\n border-bottom: 1px solid #21262d;\n font-weight: 600;\n font-size: 13px;\n color: #8b949e;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n }\n\n .list {\n max-height: 320px;\n overflow-y: auto;\n padding: 6px 0;\n }\n\n .row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 14px;\n cursor: pointer;\n border-radius: 6px;\n margin: 1px 6px;\n transition: background 0.1s;\n }\n\n .row:hover,\n .row.selected {\n background: #21262d;\n }\n\n .row.selected {\n outline: 2px solid #388bfd;\n outline-offset: -2px;\n }\n\n .quality-badge {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n }\n\n .badge-excellent { background: #238636; }\n .badge-good { background: #1f6feb; }\n .badge-acceptable{ background: #9e6a03; }\n .badge-poor { background: #da3633; }\n\n .tag-name {\n font-family: monospace;\n font-size: 12px;\n color: #8b949e;\n flex-shrink: 0;\n }\n\n .attr-value {\n font-family: monospace;\n font-size: 12px;\n color: #c9d1d9;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .selector-preview {\n font-family: monospace;\n font-size: 11px;\n color: #58a6ff;\n flex-shrink: 0;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .poor-warning {\n font-size: 10px;\n color: #f85149;\n margin-left: auto;\n }\n\n .footer {\n padding: 8px 14px 10px;\n border-top: 1px solid #21262d;\n display: flex;\n gap: 16px;\n font-size: 11px;\n color: #484f58;\n }\n\n .hint kbd {\n background: #21262d;\n border: 1px solid #30363d;\n border-radius: 3px;\n padding: 1px 5px;\n font-size: 10px;\n color: #8b949e;\n }\n`;\n","export function escHtml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nexport function escAttr(s: string): string {\n return s.replace(/\"/g, '"').replace(/</g, '<');\n}\n","import type { PickerRow, SelectorQuality } from '../../utils/selector-quality.utils';\nimport { escHtml } from '../../utils/html.utils';\n\nconst QUALITY_EMOJI: Record<SelectorQuality, string> = {\n excellent: '🟢',\n good: '🔵',\n acceptable: '🟡',\n poor: '🔴',\n};\n\nconst QUALITY_CLASS: Record<SelectorQuality, string> = {\n excellent: 'badge-excellent',\n good: 'badge-good',\n acceptable: 'badge-acceptable',\n poor: 'badge-poor',\n};\n\nexport function renderPickerRows(\n rows: PickerRow[],\n selectedIndex: number,\n t: (key: string) => string,\n): string {\n return rows.map((row, i) => {\n const isSelected = i === selectedIndex;\n const isPoor = row.quality === 'poor';\n\n return `\n <div class=\"row${isSelected ? ' selected' : ''}\" data-idx=\"${i}\" role=\"option\" aria-selected=\"${isSelected}\">\n <span class=\"quality-badge ${QUALITY_CLASS[row.quality]}\" title=\"${escHtml(t(`SELECTOR_PICKER.QUALITY_${row.quality.toUpperCase()}`))}\">\n ${QUALITY_EMOJI[row.quality]}\n </span>\n <span class=\"tag-name\"><${escHtml(row.tag)}></span>\n ${row.attr ? `<span class=\"attr-value\">${escHtml(row.attr)}</span>` : '<span class=\"attr-value\"></span>'}\n <span class=\"selector-preview\">${escHtml(row.selector)}</span>\n ${isPoor ? `<span class=\"poor-warning\" title=\"${escHtml(t('SELECTOR_PICKER.QUALITY_POOR'))}\">⚠</span>` : ''}\n </div>`;\n }).join('');\n}\n\nexport function renderPicker(\n rows: PickerRow[],\n selectedIndex: number,\n t: (key: string) => string,\n): string {\n return `\n <div class=\"overlay\" role=\"listbox\">\n <div class=\"header\">${escHtml(t('SELECTOR_PICKER.TITLE'))}</div>\n <div class=\"list\">\n ${renderPickerRows(rows, selectedIndex, t)}\n </div>\n <div class=\"footer\">\n <span class=\"hint\"><kbd>↑↓</kbd> ${escHtml(t('SELECTOR_PICKER.PREVIEW_LABEL'))}</span>\n <span class=\"hint\"><kbd>Enter</kbd> ${escHtml(t('SELECTOR_PICKER.CONFIRM_HINT'))}</span>\n <span class=\"hint\"><kbd>Esc</kbd> ${escHtml(t('SELECTOR_PICKER.CANCEL_HINT'))}</span>\n </div>\n </div>`;\n}\n","import type { RecordingService } from '../../services/recording.service';\nimport type { TranslationService } from '../../services/translation.service';\nimport { describePickerRow, type PickerRow } from '../../utils/selector-quality.utils';\nimport { escapeSingleQuotes } from '../../utils/code-format.utils';\nimport { SELECTOR_PICKER_STYLES } from './selector-picker.styles';\nimport { renderPicker } from './selector-picker.template';\n\nconst OWN_DATA_CY = 'lib-e2e-cypress-for-dummys';\nconst MAX_ANCESTORS = 10;\n\nexport class SelectorPickerElement extends HTMLElement {\n targetElement: HTMLElement | null = null;\n recording!: RecordingService;\n translation!: TranslationService;\n\n private shadow: ShadowRoot;\n private ancestors: HTMLElement[] = [];\n private rows: PickerRow[] = [];\n private selectedIndex = 0;\n private keyHandler: ((e: KeyboardEvent) => void) | null = null;\n private unsubRecording: (() => void) | null = null;\n private unsubPause: (() => void) | null = null;\n\n constructor() {\n super();\n this.shadow = this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback(): void {\n this.setAttribute('data-cy', 'lib-e2e-cypress-for-dummys');\n this.ancestors = this.buildAncestors();\n this.rows = this.ancestors.map(describePickerRow);\n this.selectedIndex = this.findBestIndex();\n this.render();\n this.attachKeyListener();\n this.attachRowClickListeners();\n this.subscribeToRecordingChanges();\n }\n\n disconnectedCallback(): void {\n this.detachKeyListener();\n this.unsubRecording?.();\n this.unsubPause?.();\n }\n\n private t(key: string): string {\n return this.translation?.translate(key) ?? key;\n }\n\n // ── Ancestor chain ──────────────────────────────────────────────────────────\n\n private buildAncestors(): HTMLElement[] {\n const chain: HTMLElement[] = [];\n let current: HTMLElement | null = this.targetElement;\n\n while (current && current.tagName.toLowerCase() !== 'html' && chain.length < MAX_ANCESTORS) {\n if (current.getAttribute('data-cy') === OWN_DATA_CY) {\n current = current.parentElement;\n continue;\n }\n chain.push(current);\n current = current.parentElement;\n }\n\n return chain;\n }\n\n private findBestIndex(): number {\n for (let i = 0; i < this.rows.length; i++) {\n const q = this.rows[i].quality;\n if (q === 'excellent' || q === 'good' || q === 'acceptable') return i;\n }\n return 0;\n }\n\n // ── Rendering ───────────────────────────────────────────────────────────────\n\n private render(): void {\n this.shadow.innerHTML = `<style>${SELECTOR_PICKER_STYLES}</style>${renderPicker(\n this.rows,\n this.selectedIndex,\n this.t.bind(this),\n )}`;\n }\n\n // ── Keyboard ────────────────────────────────────────────────────────────────\n\n private attachKeyListener(): void {\n this.keyHandler = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.stopPropagation();\n e.preventDefault();\n this.selectedIndex = (this.selectedIndex + 1) % this.ancestors.length;\n this.render();\n this.attachRowClickListeners();\n } else if (e.key === 'ArrowUp') {\n e.stopPropagation();\n e.preventDefault();\n this.selectedIndex = (this.selectedIndex - 1 + this.ancestors.length) % this.ancestors.length;\n this.render();\n this.attachRowClickListeners();\n } else if (e.key === 'Enter') {\n e.stopPropagation();\n this.confirm(this.selectedIndex);\n } else if (e.key === 'Escape') {\n e.stopPropagation();\n this.cancel();\n }\n };\n window.addEventListener('keydown', this.keyHandler, { capture: true });\n }\n\n private detachKeyListener(): void {\n if (this.keyHandler) {\n window.removeEventListener('keydown', this.keyHandler, { capture: true });\n this.keyHandler = null;\n }\n }\n\n // ── Row click listeners ─────────────────────────────────────────────────────\n\n private attachRowClickListeners(): void {\n this.shadow.querySelectorAll('[data-idx]').forEach((row) => {\n (row as HTMLElement).addEventListener('click', () => {\n const idx = parseInt((row as HTMLElement).dataset['idx'] ?? '0', 10);\n this.confirm(idx);\n });\n });\n }\n\n // ── Recording auto-close ────────────────────────────────────────────────────\n\n private subscribeToRecordingChanges(): void {\n this.unsubRecording = this.recording.onRecordingChange((isRecording) => {\n if (!isRecording) this.closeSilently();\n });\n this.unsubPause = this.recording.onPauseChange((isPaused) => {\n if (isPaused) this.closeSilently();\n });\n }\n\n // ── Actions ─────────────────────────────────────────────────────────────────\n\n private confirm(index: number): void {\n const row = this.rows[index];\n if (!row) return;\n const command = `cy.get('${escapeSingleQuotes(row.selector)}').click()`;\n this.recording.appendCommand(command);\n this.dispatchEvent(new CustomEvent('selectorchosen', { detail: command, bubbles: true, composed: true }));\n this.closeSilently();\n }\n\n private cancel(): void {\n this.dispatchEvent(new CustomEvent('pickercancelled', { bubbles: true, composed: true }));\n this.closeSilently();\n }\n\n private closeSilently(): void {\n this.detachKeyListener();\n this.unsubRecording?.();\n this.unsubPause?.();\n this.unsubRecording = null;\n this.unsubPause = null;\n this.remove();\n }\n}\n\nif (!customElements.get('lib-e2e-selector-picker')) {\n customElements.define('lib-e2e-selector-picker', SelectorPickerElement);\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -497,14 +497,11 @@ var init_selector_picker = __esm({
|
|
|
497
497
|
// src/index.ts
|
|
498
498
|
var index_exports = {};
|
|
499
499
|
__export(index_exports, {
|
|
500
|
-
ACTIVE_SESSION_BREADCRUMB_KEY: () => ACTIVE_SESSION_BREADCRUMB_KEY,
|
|
501
500
|
AdvancedTestEditorElement: () => AdvancedTestEditorElement,
|
|
502
501
|
AdvancedTestTransformationService: () => AdvancedTestTransformationService,
|
|
503
502
|
ConfigurationElement: () => ConfigurationElement,
|
|
504
503
|
DB_SCHEMA: () => DB_SCHEMA,
|
|
505
504
|
DB_STORE_NAMES: () => DB_STORE_NAMES,
|
|
506
|
-
DEFAULT_RESUME_TTL_MINUTES: () => DEFAULT_RESUME_TTL_MINUTES,
|
|
507
|
-
DRAG_THRESHOLD: () => DRAG_THRESHOLD,
|
|
508
505
|
FilePreviewElement: () => FilePreviewElement,
|
|
509
506
|
HelpPanelElement: () => HelpPanelElement,
|
|
510
507
|
HttpMonitor: () => HttpMonitor,
|
|
@@ -513,25 +510,16 @@ __export(index_exports, {
|
|
|
513
510
|
LOCALE_BY_LANG: () => LOCALE_BY_LANG,
|
|
514
511
|
LibE2eRecorderElement: () => LibE2eRecorderElement,
|
|
515
512
|
PersistenceService: () => PersistenceService,
|
|
516
|
-
RESUME_TTL_CONFIG_KEY: () => RESUME_TTL_CONFIG_KEY,
|
|
517
513
|
RecordingService: () => RecordingService,
|
|
518
514
|
SCROLLBAR_STYLES: () => SCROLLBAR_STYLES,
|
|
519
515
|
SUPPORTED_LANGS: () => SUPPORTED_LANGS,
|
|
520
516
|
SaveTestElement: () => SaveTestElement,
|
|
521
517
|
SelectorPickerElement: () => SelectorPickerElement,
|
|
522
|
-
TOGGLE_MARGIN: () => TOGGLE_MARGIN,
|
|
523
518
|
TestEditorElement: () => TestEditorElement,
|
|
524
519
|
TestPrevisualizerElement: () => TestPrevisualizerElement,
|
|
525
520
|
TransformationService: () => TransformationService,
|
|
526
521
|
TranslationService: () => TranslationService,
|
|
527
522
|
VERSION: () => VERSION,
|
|
528
|
-
_resetHttpMonitorState: () => _resetHttpMonitorState,
|
|
529
|
-
advancedTestTransformationService: () => advancedTestTransformationService,
|
|
530
|
-
boxOffsetForDirection: () => boxOffsetForDirection,
|
|
531
|
-
boxTopLeftFor: () => boxTopLeftFor,
|
|
532
|
-
clampTogglePosition: () => clampTogglePosition,
|
|
533
|
-
defaultTogglePosition: () => defaultTogglePosition,
|
|
534
|
-
ensurePopupDimensions: () => ensurePopupDimensions,
|
|
535
523
|
generateAlias: () => generateAlias,
|
|
536
524
|
inferAssertionCommand: () => inferAssertionCommand,
|
|
537
525
|
injectStyles: () => injectStyles,
|
|
@@ -540,13 +528,8 @@ __export(index_exports, {
|
|
|
540
528
|
localeForLang: () => localeForLang,
|
|
541
529
|
makeModalResizable: () => makeModalResizable,
|
|
542
530
|
makeSwalDraggable: () => makeSwalDraggable,
|
|
543
|
-
makeSwalDraggableByContentId: () => makeSwalDraggableByContentId,
|
|
544
|
-
resolveExpandDirection: () => resolveExpandDirection,
|
|
545
531
|
selectTestsForExport: () => selectTestsForExport,
|
|
546
|
-
|
|
547
|
-
showToast: () => showToast,
|
|
548
|
-
transformationService: () => transformationService,
|
|
549
|
-
translationService: () => translationService
|
|
532
|
+
showToast: () => showToast
|
|
550
533
|
});
|
|
551
534
|
module.exports = __toCommonJS(index_exports);
|
|
552
535
|
|
|
@@ -635,11 +618,6 @@ var DB_SCHEMA = {
|
|
|
635
618
|
};
|
|
636
619
|
var DB_STORE_NAMES = DB_SCHEMA.stores.map((s) => s.name);
|
|
637
620
|
|
|
638
|
-
// src/models/active-session.model.ts
|
|
639
|
-
var ACTIVE_SESSION_BREADCRUMB_KEY = "e2e-active-session";
|
|
640
|
-
var RESUME_TTL_CONFIG_KEY = "resumeRecencyTtlMinutes";
|
|
641
|
-
var DEFAULT_RESUME_TTL_MINUTES = 30;
|
|
642
|
-
|
|
643
621
|
// src/utils/subject.ts
|
|
644
622
|
var Subject = class {
|
|
645
623
|
_value;
|
|
@@ -782,6 +760,8 @@ var I18N_ES = {
|
|
|
782
760
|
LOGIN_SETUP_FILE_NAME_LABEL: "Nombre del fichero",
|
|
783
761
|
LOGIN_SETUP_FILE_NAME_PH: "Ej: cypress/common-services/login.service.ts",
|
|
784
762
|
LOGIN_SETUP_RESCAN: "\u{1F504} Re-escanear",
|
|
763
|
+
LOGIN_SETUP_FUNCTIONS_DETECTED: "Funciones detectadas",
|
|
764
|
+
LOGIN_SETUP_BLOCK_ASSIGN: "Asignaci\xF3n de bloques",
|
|
785
765
|
LOGIN_SETUP_NO_FUNCTIONS: "No se encontraron funciones exportadas. Rellena el scaffold y re-escanea.",
|
|
786
766
|
LOGIN_SETUP_BEFORE_LABEL: "Funci\xF3n before() (una vez por suite)",
|
|
787
767
|
LOGIN_SETUP_BEFORE_EACH_LABEL: "Funci\xF3n beforeEach() (antes de cada test)",
|
|
@@ -1099,6 +1079,8 @@ var I18N_EN = {
|
|
|
1099
1079
|
LOGIN_SETUP_FILE_NAME_LABEL: "File name",
|
|
1100
1080
|
LOGIN_SETUP_FILE_NAME_PH: "E.g.: cypress/common-services/login.service.ts",
|
|
1101
1081
|
LOGIN_SETUP_RESCAN: "\u{1F504} Re-scan",
|
|
1082
|
+
LOGIN_SETUP_FUNCTIONS_DETECTED: "Detected functions",
|
|
1083
|
+
LOGIN_SETUP_BLOCK_ASSIGN: "Block assignment",
|
|
1102
1084
|
LOGIN_SETUP_NO_FUNCTIONS: "No exported functions found. Fill in the scaffold and re-scan.",
|
|
1103
1085
|
LOGIN_SETUP_BEFORE_LABEL: "before() function (once per suite)",
|
|
1104
1086
|
LOGIN_SETUP_BEFORE_EACH_LABEL: "beforeEach() function (before every test)",
|
|
@@ -1417,6 +1399,8 @@ var I18N_FR = {
|
|
|
1417
1399
|
LOGIN_SETUP_FILE_NAME_LABEL: "Nom du fichier",
|
|
1418
1400
|
LOGIN_SETUP_FILE_NAME_PH: "Ex : cypress/common-services/login.service.ts",
|
|
1419
1401
|
LOGIN_SETUP_RESCAN: "\u{1F504} Re-scanner",
|
|
1402
|
+
LOGIN_SETUP_FUNCTIONS_DETECTED: "Fonctions d\xE9tect\xE9es",
|
|
1403
|
+
LOGIN_SETUP_BLOCK_ASSIGN: "Affectation des blocs",
|
|
1420
1404
|
LOGIN_SETUP_NO_FUNCTIONS: "Aucune fonction export\xE9e trouv\xE9e. Remplissez le scaffold et re-scannez.",
|
|
1421
1405
|
LOGIN_SETUP_BEFORE_LABEL: "Fonction before() (une fois par suite)",
|
|
1422
1406
|
LOGIN_SETUP_BEFORE_EACH_LABEL: "Fonction beforeEach() (avant chaque test)",
|
|
@@ -1741,6 +1725,8 @@ var I18N_IT = {
|
|
|
1741
1725
|
LOGIN_SETUP_FILE_NAME_LABEL: "Nome del file",
|
|
1742
1726
|
LOGIN_SETUP_FILE_NAME_PH: "Es: cypress/common-services/login.service.ts",
|
|
1743
1727
|
LOGIN_SETUP_RESCAN: "\u{1F504} Re-scansiona",
|
|
1728
|
+
LOGIN_SETUP_FUNCTIONS_DETECTED: "Funzioni rilevate",
|
|
1729
|
+
LOGIN_SETUP_BLOCK_ASSIGN: "Assegnazione dei blocchi",
|
|
1744
1730
|
LOGIN_SETUP_NO_FUNCTIONS: "Nessuna funzione esportata trovata. Compila lo scaffold e ri-scansiona.",
|
|
1745
1731
|
LOGIN_SETUP_BEFORE_LABEL: "Funzione before() (una volta per suite)",
|
|
1746
1732
|
LOGIN_SETUP_BEFORE_EACH_LABEL: "Funzione beforeEach() (prima di ogni test)",
|
|
@@ -2065,6 +2051,8 @@ var I18N_DE = {
|
|
|
2065
2051
|
LOGIN_SETUP_FILE_NAME_LABEL: "Dateiname",
|
|
2066
2052
|
LOGIN_SETUP_FILE_NAME_PH: "Z. B.: cypress/common-services/login.service.ts",
|
|
2067
2053
|
LOGIN_SETUP_RESCAN: "\u{1F504} Erneut scannen",
|
|
2054
|
+
LOGIN_SETUP_FUNCTIONS_DETECTED: "Erkannte Funktionen",
|
|
2055
|
+
LOGIN_SETUP_BLOCK_ASSIGN: "Blockzuweisung",
|
|
2068
2056
|
LOGIN_SETUP_NO_FUNCTIONS: "Keine exportierten Funktionen gefunden. Scaffold ausf\xFCllen und erneut scannen.",
|
|
2069
2057
|
LOGIN_SETUP_BEFORE_LABEL: "before()-Funktion (einmal pro Suite)",
|
|
2070
2058
|
LOGIN_SETUP_BEFORE_EACH_LABEL: "beforeEach()-Funktion (vor jedem Test)",
|
|
@@ -2374,7 +2362,8 @@ init_selector_quality_utils();
|
|
|
2374
2362
|
init_code_format_utils();
|
|
2375
2363
|
var MAX_TEXT_LENGTH = 60;
|
|
2376
2364
|
function inferAssertionCommand(el, selector) {
|
|
2377
|
-
const
|
|
2365
|
+
const safeSelector = escapeSingleQuotes(selector);
|
|
2366
|
+
const should = (body) => `cy.get('${safeSelector}').should(${body})`;
|
|
2378
2367
|
const tag = el.tagName.toLowerCase();
|
|
2379
2368
|
if (tag === "input") {
|
|
2380
2369
|
const input = el;
|
|
@@ -2522,8 +2511,8 @@ var RecordingService = class {
|
|
|
2522
2511
|
}
|
|
2523
2512
|
registerInterceptor(method, url, alias, fixtureFile) {
|
|
2524
2513
|
if (!this.isRecording$.getValue() || this.isPaused$.getValue()) return;
|
|
2525
|
-
const wildcard = this.urlToWildcard(url, method);
|
|
2526
|
-
const command = fixtureFile ? `cy.intercept('${method}', '${wildcard}', { fixture: '${fixtureFile}' }).as('${alias}')` : `cy.intercept('${method}', '${wildcard}').as('${alias}')`;
|
|
2514
|
+
const wildcard = escapeSingleQuotes(this.urlToWildcard(url, method));
|
|
2515
|
+
const command = fixtureFile ? `cy.intercept('${method}', '${wildcard}', { fixture: '${escapeSingleQuotes(fixtureFile)}' }).as('${alias}')` : `cy.intercept('${method}', '${wildcard}').as('${alias}')`;
|
|
2527
2516
|
const current = this.interceptors$.getValue();
|
|
2528
2517
|
if (!current.includes(command)) {
|
|
2529
2518
|
this.interceptors$.next([...current, command]);
|
|
@@ -3293,17 +3282,38 @@ ${commands.map((c) => normalizeBlock(c, " ")).join("\n")}
|
|
|
3293
3282
|
init_code_format_utils();
|
|
3294
3283
|
|
|
3295
3284
|
// src/utils/redact.utils.ts
|
|
3296
|
-
var
|
|
3285
|
+
var SENSITIVE_SUBSTRINGS = [
|
|
3297
3286
|
"password",
|
|
3298
|
-
"
|
|
3287
|
+
"passwd",
|
|
3288
|
+
"passphrase",
|
|
3299
3289
|
"secret",
|
|
3290
|
+
"token",
|
|
3291
|
+
// access_token, refresh_token, id_token, csrf_token…
|
|
3292
|
+
"apikey",
|
|
3293
|
+
// api_key, x-api-key — NOT bare "key" (avoids "normalKey")
|
|
3300
3294
|
"authorization",
|
|
3301
3295
|
"cookie",
|
|
3302
|
-
"
|
|
3303
|
-
"
|
|
3296
|
+
"credential",
|
|
3297
|
+
"privatekey",
|
|
3298
|
+
"sessionid",
|
|
3299
|
+
"creditcard",
|
|
3300
|
+
"cardnumber",
|
|
3301
|
+
"cvv"
|
|
3302
|
+
];
|
|
3303
|
+
var SENSITIVE_EXACT = /* @__PURE__ */ new Set([
|
|
3304
|
+
"auth",
|
|
3305
|
+
"pwd",
|
|
3306
|
+
"pin",
|
|
3307
|
+
"otp",
|
|
3308
|
+
"ssn"
|
|
3304
3309
|
]);
|
|
3310
|
+
function normalizeKey(key) {
|
|
3311
|
+
return key.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
3312
|
+
}
|
|
3305
3313
|
function isSensitiveKey(key) {
|
|
3306
|
-
|
|
3314
|
+
const normalized = normalizeKey(key);
|
|
3315
|
+
if (SENSITIVE_EXACT.has(normalized)) return true;
|
|
3316
|
+
return SENSITIVE_SUBSTRINGS.some((s) => normalized.includes(s));
|
|
3307
3317
|
}
|
|
3308
3318
|
function redactSensitiveFields(obj) {
|
|
3309
3319
|
if (Array.isArray(obj)) {
|
|
@@ -3503,12 +3513,6 @@ function _restoreXhr() {
|
|
|
3503
3513
|
window.XMLHttpRequest = _originalXHR;
|
|
3504
3514
|
_originalXHR = null;
|
|
3505
3515
|
}
|
|
3506
|
-
function _resetHttpMonitorState() {
|
|
3507
|
-
_refCount = 0;
|
|
3508
|
-
_originalFetch = null;
|
|
3509
|
-
_originalXHR = null;
|
|
3510
|
-
_recordings.clear();
|
|
3511
|
-
}
|
|
3512
3516
|
var HttpMonitor = class {
|
|
3513
3517
|
constructor(recording) {
|
|
3514
3518
|
this.recording = recording;
|
|
@@ -3768,18 +3772,6 @@ function makeSwalDraggable() {
|
|
|
3768
3772
|
if (!dragArea) return;
|
|
3769
3773
|
applyDraggable(swal, dragArea);
|
|
3770
3774
|
}
|
|
3771
|
-
function makeSwalDraggableByContentId(contentId) {
|
|
3772
|
-
const content = document.getElementById(contentId);
|
|
3773
|
-
if (!content) {
|
|
3774
|
-
makeSwalDraggable();
|
|
3775
|
-
return;
|
|
3776
|
-
}
|
|
3777
|
-
const swal = content.closest(".swal2-popup") ?? document.querySelector(".swal2-popup");
|
|
3778
|
-
if (!swal) return;
|
|
3779
|
-
const dragArea = resolveDragArea(swal);
|
|
3780
|
-
if (!dragArea) return;
|
|
3781
|
-
applyDraggable(swal, dragArea);
|
|
3782
|
-
}
|
|
3783
3775
|
function setSwal2DataCyAttribute(dataCy = "lib-e2e-cypress-for-dummys") {
|
|
3784
3776
|
document.querySelector(".swal2-container")?.setAttribute("data-cy", dataCy);
|
|
3785
3777
|
document.querySelector(".swal2-html-container")?.setAttribute("data-cy", dataCy);
|
|
@@ -3838,37 +3830,6 @@ function isLocalHost(hostname) {
|
|
|
3838
3830
|
return h === "localhost" || h.endsWith(".localhost") || h === "127.0.0.1" || h === "::1" || h === "0.0.0.0";
|
|
3839
3831
|
}
|
|
3840
3832
|
|
|
3841
|
-
// src/utils/widget-position.utils.ts
|
|
3842
|
-
var TOGGLE_MARGIN = 30;
|
|
3843
|
-
var DRAG_THRESHOLD = 5;
|
|
3844
|
-
var DEFAULT_EDGE_OFFSET = 46;
|
|
3845
|
-
function boxOffsetForDirection(dir) {
|
|
3846
|
-
return {
|
|
3847
|
-
x: dir.endsWith("left") ? 144 : 46,
|
|
3848
|
-
y: dir.startsWith("up") ? 144 : 46
|
|
3849
|
-
};
|
|
3850
|
-
}
|
|
3851
|
-
function clampTogglePosition(x, y, vw, vh, margin = TOGGLE_MARGIN) {
|
|
3852
|
-
const maxX = Math.max(margin, vw - margin);
|
|
3853
|
-
const maxY = Math.max(margin, vh - margin);
|
|
3854
|
-
return {
|
|
3855
|
-
x: Math.min(Math.max(x, margin), maxX),
|
|
3856
|
-
y: Math.min(Math.max(y, margin), maxY)
|
|
3857
|
-
};
|
|
3858
|
-
}
|
|
3859
|
-
function resolveExpandDirection(x, y, vw, vh) {
|
|
3860
|
-
const vertical = y < vh / 2 ? "down" : "up";
|
|
3861
|
-
const horizontal = x < vw / 2 ? "right" : "left";
|
|
3862
|
-
return `${vertical}-${horizontal}`;
|
|
3863
|
-
}
|
|
3864
|
-
function defaultTogglePosition(vw, vh) {
|
|
3865
|
-
return { x: vw - DEFAULT_EDGE_OFFSET, y: vh - DEFAULT_EDGE_OFFSET };
|
|
3866
|
-
}
|
|
3867
|
-
function boxTopLeftFor(toggleCentre, dir) {
|
|
3868
|
-
const off = boxOffsetForDirection(dir);
|
|
3869
|
-
return { x: toggleCentre.x - off.x, y: toggleCentre.y - off.y };
|
|
3870
|
-
}
|
|
3871
|
-
|
|
3872
3833
|
// src/index.ts
|
|
3873
3834
|
init_selector_picker();
|
|
3874
3835
|
|
|
@@ -4811,6 +4772,11 @@ if (!customElements.get("lib-e2e-test-editor")) {
|
|
|
4811
4772
|
customElements.define("lib-e2e-test-editor", TestEditorElement);
|
|
4812
4773
|
}
|
|
4813
4774
|
|
|
4775
|
+
// src/models/active-session.model.ts
|
|
4776
|
+
var ACTIVE_SESSION_BREADCRUMB_KEY = "e2e-active-session";
|
|
4777
|
+
var RESUME_TTL_CONFIG_KEY = "resumeRecencyTtlMinutes";
|
|
4778
|
+
var DEFAULT_RESUME_TTL_MINUTES = 30;
|
|
4779
|
+
|
|
4814
4780
|
// src/utils/login-setup.utils.ts
|
|
4815
4781
|
var EXPORT_FN_RE = /^(?!\/\/).*\bexport\s+(?:async\s+)?function\s+(\w+)|^(?!\/\/).*\bexport\s+const\s+(\w+)\s*=\s*(?:async\s*)?\(/gm;
|
|
4816
4782
|
function extractExportedFunctions(fileContent) {
|
|
@@ -5396,11 +5362,11 @@ function renderLoginSetupOverlay(state, t) {
|
|
|
5396
5362
|
</select>
|
|
5397
5363
|
</div>`;
|
|
5398
5364
|
const functionsSection = hasContent ? fns.length > 0 ? `<div class="ls-section">
|
|
5399
|
-
<span class="ls-section-label"
|
|
5365
|
+
<span class="ls-section-label">${t("CONFIG.LOGIN_SETUP_FUNCTIONS_DETECTED")}</span>
|
|
5400
5366
|
<div class="ls-fns">${fns.map((fn) => `<span class="ls-fn-chip">${escHtml(fn)}</span>`).join("")}</div>
|
|
5401
5367
|
</div>
|
|
5402
5368
|
<div class="ls-section">
|
|
5403
|
-
<span class="ls-section-label"
|
|
5369
|
+
<span class="ls-section-label">${t("CONFIG.LOGIN_SETUP_BLOCK_ASSIGN")}</span>
|
|
5404
5370
|
${fnDropdown("login-setup-before-fn", t("CONFIG.LOGIN_SETUP_BEFORE_LABEL"), beforeFn)}
|
|
5405
5371
|
${fnDropdown("login-setup-before-each-fn", t("CONFIG.LOGIN_SETUP_BEFORE_EACH_LABEL"), beforeEachFn)}
|
|
5406
5372
|
</div>` : `<div class="ls-empty-state">
|
|
@@ -7322,6 +7288,37 @@ function mountComponentInSwal(tagName, container, props, events) {
|
|
|
7322
7288
|
return el;
|
|
7323
7289
|
}
|
|
7324
7290
|
|
|
7291
|
+
// src/utils/widget-position.utils.ts
|
|
7292
|
+
var TOGGLE_MARGIN = 30;
|
|
7293
|
+
var DRAG_THRESHOLD = 5;
|
|
7294
|
+
var DEFAULT_EDGE_OFFSET = 46;
|
|
7295
|
+
function boxOffsetForDirection(dir) {
|
|
7296
|
+
return {
|
|
7297
|
+
x: dir.endsWith("left") ? 144 : 46,
|
|
7298
|
+
y: dir.startsWith("up") ? 144 : 46
|
|
7299
|
+
};
|
|
7300
|
+
}
|
|
7301
|
+
function clampTogglePosition(x, y, vw, vh, margin = TOGGLE_MARGIN) {
|
|
7302
|
+
const maxX = Math.max(margin, vw - margin);
|
|
7303
|
+
const maxY = Math.max(margin, vh - margin);
|
|
7304
|
+
return {
|
|
7305
|
+
x: Math.min(Math.max(x, margin), maxX),
|
|
7306
|
+
y: Math.min(Math.max(y, margin), maxY)
|
|
7307
|
+
};
|
|
7308
|
+
}
|
|
7309
|
+
function resolveExpandDirection(x, y, vw, vh) {
|
|
7310
|
+
const vertical = y < vh / 2 ? "down" : "up";
|
|
7311
|
+
const horizontal = x < vw / 2 ? "right" : "left";
|
|
7312
|
+
return `${vertical}-${horizontal}`;
|
|
7313
|
+
}
|
|
7314
|
+
function defaultTogglePosition(vw, vh) {
|
|
7315
|
+
return { x: vw - DEFAULT_EDGE_OFFSET, y: vh - DEFAULT_EDGE_OFFSET };
|
|
7316
|
+
}
|
|
7317
|
+
function boxTopLeftFor(toggleCentre, dir) {
|
|
7318
|
+
const off = boxOffsetForDirection(dir);
|
|
7319
|
+
return { x: toggleCentre.x - off.x, y: toggleCentre.y - off.y };
|
|
7320
|
+
}
|
|
7321
|
+
|
|
7325
7322
|
// src/utils/fixture-convert.utils.ts
|
|
7326
7323
|
function toFixtureInterceptors(interceptors, fixtures) {
|
|
7327
7324
|
const fixtureNames = new Set(fixtures.map((f) => f.name));
|
|
@@ -8174,17 +8171,14 @@ if (!customElements.get("lib-e2e-recorder")) {
|
|
|
8174
8171
|
}
|
|
8175
8172
|
|
|
8176
8173
|
// src/index.ts
|
|
8177
|
-
var VERSION = "0.
|
|
8174
|
+
var VERSION = "1.0.0";
|
|
8178
8175
|
// Annotate the CommonJS export names for ESM import in node:
|
|
8179
8176
|
0 && (module.exports = {
|
|
8180
|
-
ACTIVE_SESSION_BREADCRUMB_KEY,
|
|
8181
8177
|
AdvancedTestEditorElement,
|
|
8182
8178
|
AdvancedTestTransformationService,
|
|
8183
8179
|
ConfigurationElement,
|
|
8184
8180
|
DB_SCHEMA,
|
|
8185
8181
|
DB_STORE_NAMES,
|
|
8186
|
-
DEFAULT_RESUME_TTL_MINUTES,
|
|
8187
|
-
DRAG_THRESHOLD,
|
|
8188
8182
|
FilePreviewElement,
|
|
8189
8183
|
HelpPanelElement,
|
|
8190
8184
|
HttpMonitor,
|
|
@@ -8193,25 +8187,16 @@ var VERSION = "0.10.0";
|
|
|
8193
8187
|
LOCALE_BY_LANG,
|
|
8194
8188
|
LibE2eRecorderElement,
|
|
8195
8189
|
PersistenceService,
|
|
8196
|
-
RESUME_TTL_CONFIG_KEY,
|
|
8197
8190
|
RecordingService,
|
|
8198
8191
|
SCROLLBAR_STYLES,
|
|
8199
8192
|
SUPPORTED_LANGS,
|
|
8200
8193
|
SaveTestElement,
|
|
8201
8194
|
SelectorPickerElement,
|
|
8202
|
-
TOGGLE_MARGIN,
|
|
8203
8195
|
TestEditorElement,
|
|
8204
8196
|
TestPrevisualizerElement,
|
|
8205
8197
|
TransformationService,
|
|
8206
8198
|
TranslationService,
|
|
8207
8199
|
VERSION,
|
|
8208
|
-
_resetHttpMonitorState,
|
|
8209
|
-
advancedTestTransformationService,
|
|
8210
|
-
boxOffsetForDirection,
|
|
8211
|
-
boxTopLeftFor,
|
|
8212
|
-
clampTogglePosition,
|
|
8213
|
-
defaultTogglePosition,
|
|
8214
|
-
ensurePopupDimensions,
|
|
8215
8200
|
generateAlias,
|
|
8216
8201
|
inferAssertionCommand,
|
|
8217
8202
|
injectStyles,
|
|
@@ -8220,12 +8205,7 @@ var VERSION = "0.10.0";
|
|
|
8220
8205
|
localeForLang,
|
|
8221
8206
|
makeModalResizable,
|
|
8222
8207
|
makeSwalDraggable,
|
|
8223
|
-
makeSwalDraggableByContentId,
|
|
8224
|
-
resolveExpandDirection,
|
|
8225
8208
|
selectTestsForExport,
|
|
8226
|
-
|
|
8227
|
-
showToast,
|
|
8228
|
-
transformationService,
|
|
8229
|
-
translationService
|
|
8209
|
+
showToast
|
|
8230
8210
|
});
|
|
8231
8211
|
//# sourceMappingURL=index.cjs.map
|