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.
@@ -427,4 +427,4 @@ export {
427
427
  escAttr,
428
428
  SelectorPickerElement
429
429
  };
430
- //# sourceMappingURL=chunk-VT2GLZ62.js.map
430
+ //# sourceMappingURL=chunk-24WFAT4W.js.map
@@ -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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nexport function escAttr(s: string): string {\n return s.replace(/\"/g, '&quot;').replace(/</g, '&lt;');\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\">&lt;${escHtml(row.tag)}&gt;</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
- setSwal2DataCyAttribute: () => setSwal2DataCyAttribute,
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 should = (body) => `cy.get('${selector}').should(${body})`;
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 SENSITIVE_KEYS = /* @__PURE__ */ new Set([
3285
+ var SENSITIVE_SUBSTRINGS = [
3297
3286
  "password",
3298
- "token",
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
- "access_token",
3303
- "refresh_token"
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
- return SENSITIVE_KEYS.has(key.toLowerCase());
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">Funciones detectadas</span>
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">Asignaci\xF3n de bloques</span>
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.10.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
- setSwal2DataCyAttribute,
8227
- showToast,
8228
- transformationService,
8229
- translationService
8209
+ showToast
8230
8210
  });
8231
8211
  //# sourceMappingURL=index.cjs.map