@pierre/diffs 1.1.0-beta.14 → 1.1.0-beta.16

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/style.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../src/style.css"],"sourcesContent":["@layer base, theme, unsafe;\n\n@layer base {\n :host {\n --diffs-bg: #fff;\n --diffs-fg: #000;\n --diffs-font-fallback:\n 'SF Mono', Monaco, Consolas, 'Ubuntu Mono', 'Liberation Mono',\n 'Courier New', monospace;\n --diffs-header-font-fallback:\n system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue',\n 'Noto Sans', 'Liberation Sans', Arial, sans-serif;\n\n --diffs-mixer: light-dark(black, white);\n --diffs-gap-fallback: 8px;\n\n /*\n // Available CSS Color Overrides\n --diffs-bg-buffer-override\n --diffs-bg-hover-override\n --diffs-bg-context-override\n --diffs-bg-separator-override\n\n --diffs-fg-number-override\n --diffs-fg-number-addition-override\n --diffs-fg-number-deletion-override\n\n --diffs-deletion-color-override\n --diffs-addition-color-override\n --diffs-modified-color-override\n\n --diffs-bg-deletion-override\n --diffs-bg-deletion-number-override\n --diffs-bg-deletion-hover-override\n --diffs-bg-deletion-emphasis-override\n\n --diffs-bg-addition-override\n --diffs-bg-addition-number-override\n --diffs-bg-addition-hover-override\n --diffs-bg-addition-emphasis-override\n\n // Line Selection Color Overrides (for enableLineSelection)\n --diffs-selection-color-override\n --diffs-bg-selection-override\n --diffs-bg-selection-number-override\n --diffs-bg-selection-background-override\n --diffs-bg-selection-number-background-override\n\n // Available CSS Layout Overrides\n --diffs-gap-inline\n --diffs-gap-block\n --diffs-gap-style\n --diffs-tab-size\n */\n\n color-scheme: light dark;\n display: block;\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n font-size: var(--diffs-font-size, 13px);\n line-height: var(--diffs-line-height, 20px);\n font-feature-settings: var(--diffs-font-features);\n }\n\n /* NOTE(mdo): Some semantic HTML elements (e.g. `pre`, `code`) have default\n * user-agent styles. These must be overridden to use our custom styles. */\n pre,\n code,\n [data-error-wrapper] {\n isolation: isolate;\n margin: 0;\n padding: 0;\n display: block;\n outline: none;\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n }\n\n pre,\n code {\n background-color: var(--diffs-bg);\n }\n\n code {\n contain: content;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n [data-icon-sprite] {\n display: none;\n }\n\n /* NOTE(mdo): Headers and separators are within pre/code, so we need to reset\n * their font-family explicitly. */\n [data-diffs-header],\n [data-separator] {\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n }\n\n [data-file-info] {\n padding: 10px;\n font-weight: 700;\n color: var(--fg);\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n background-color: color-mix(in lab, var(--bg) 98%, var(--fg));\n border-block: 1px solid color-mix(in lab, var(--bg) 95%, var(--fg));\n }\n\n [data-diffs-header],\n [data-diff],\n [data-file],\n [data-error-wrapper],\n [data-virtualizer-buffer] {\n --diffs-bg: light-dark(var(--diffs-light-bg), var(--diffs-dark-bg));\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-buffer: var(\n --diffs-bg-buffer-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))\n )\n );\n --diffs-bg-hover: var(\n --diffs-bg-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 97%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-mixer))\n )\n );\n\n --diffs-bg-context: var(\n --diffs-bg-context-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))\n )\n );\n --diffs-bg-context-number: var(\n --diffs-bg-context-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg-context) 80%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-bg-context) 60%, var(--diffs-bg))\n )\n );\n\n --diffs-bg-separator: var(\n --diffs-bg-separator-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))\n )\n );\n\n --diffs-fg: light-dark(var(--diffs-light), var(--diffs-dark));\n --diffs-fg-number: var(\n --diffs-fg-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))\n )\n );\n\n --diffs-deletion-base: var(\n --diffs-deletion-color-override,\n light-dark(\n var(\n --diffs-light-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n ),\n var(\n --diffs-dark-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n )\n )\n );\n --diffs-addition-base: var(\n --diffs-addition-color-override,\n light-dark(\n var(\n --diffs-light-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n ),\n var(\n --diffs-dark-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n )\n )\n );\n --diffs-modified-base: var(\n --diffs-modified-color-override,\n light-dark(\n var(\n --diffs-light-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n ),\n var(\n --diffs-dark-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n )\n )\n );\n\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-deletion: var(\n --diffs-bg-deletion-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-number: var(\n --diffs-bg-deletion-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-hover: var(\n --diffs-bg-deletion-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-emphasis: var(\n --diffs-bg-deletion-emphasis-override,\n light-dark(\n rgb(from var(--diffs-deletion-base) r g b / 0.15),\n rgb(from var(--diffs-deletion-base) r g b / 0.2)\n )\n );\n\n --diffs-bg-addition: var(\n --diffs-bg-addition-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-number: var(\n --diffs-bg-addition-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-hover: var(\n --diffs-bg-addition-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 70%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-emphasis: var(\n --diffs-bg-addition-emphasis-override,\n light-dark(\n rgb(from var(--diffs-addition-base) r g b / 0.15),\n rgb(from var(--diffs-addition-base) r g b / 0.2)\n )\n );\n\n --diffs-selection-base: var(--diffs-modified-base);\n --diffs-selection-number-fg: light-dark(\n color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer))\n );\n --diffs-bg-selection: var(\n --diffs-bg-selection-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 82%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base))\n )\n );\n --diffs-bg-selection-number: var(\n --diffs-bg-selection-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 60%, var(--diffs-selection-base))\n )\n );\n\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-diff],\n [data-file] {\n /* This feels a bit crazy to me... so I need to think about it a bit more... */\n --diffs-grid-number-column-width: minmax(min-content, max-content);\n --diffs-code-grid: var(--diffs-grid-number-column-width) 1fr;\n\n &[data-dehydrated] {\n --diffs-code-grid: var(--diffs-grid-number-column-width) minmax(0, 1fr);\n }\n\n &[data-theme-type='light'],\n & {\n [data-line] span {\n color: light-dark(\n var(--diffs-token-light, var(--diffs-light)),\n var(--diffs-token-dark, var(--diffs-dark))\n );\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n }\n\n &[data-theme-type='dark'] [data-line] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n\n &:hover [data-code]::-webkit-scrollbar-thumb {\n background-color: var(--diffs-bg-context);\n }\n }\n\n [data-line] span {\n background-color: light-dark(\n var(--diffs-token-light-bg, inherit),\n var(--diffs-token-dark-bg, inherit)\n );\n }\n\n [data-line],\n [data-gutter-buffer],\n [data-line-annotation],\n [data-no-newline] {\n color: var(--diffs-fg);\n background-color: var(--diffs-line-bg, var(--diffs-bg));\n }\n\n [data-no-newline] {\n user-select: none;\n\n span {\n opacity: 0.6;\n }\n }\n\n @media (prefers-color-scheme: dark) {\n [data-diffs-header],\n [data-error-wrapper],\n [data-diff],\n [data-file] {\n color-scheme: dark;\n }\n\n [data-content] [data-line] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n }\n\n [data-diffs-header],\n [data-diff],\n [data-file] {\n &[data-theme-type='light'] {\n color-scheme: light;\n }\n\n &[data-theme-type='dark'] {\n color-scheme: dark;\n }\n }\n\n [data-diff-type='split'][data-overflow='scroll'] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n\n [data-additions] {\n border-left: 1px solid var(--diffs-bg);\n }\n\n [data-deletions] {\n border-right: 1px solid var(--diffs-bg);\n }\n }\n\n [data-code] {\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: var(--diffs-code-grid);\n overflow: scroll clip;\n overscroll-behavior-x: none;\n tab-size: var(--diffs-tab-size, 2);\n align-self: flex-start;\n padding-top: var(--diffs-gap-block, var(--diffs-gap-fallback));\n padding-bottom: max(\n 0px,\n calc(var(--diffs-gap-block, var(--diffs-gap-fallback)) - 6px)\n );\n container-type: inline-size;\n }\n\n [data-code]::-webkit-scrollbar {\n width: 0;\n height: 6px;\n }\n\n [data-code]::-webkit-scrollbar-track {\n background: transparent;\n }\n\n [data-code]::-webkit-scrollbar-thumb {\n background-color: transparent;\n border: 1px solid transparent;\n background-clip: content-box;\n border-radius: 3px;\n }\n\n [data-code]::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n\n /*\n * If we apply these rules globally it will mean that webkit will opt into the\n * standards compliant version of custom css scrollbars, which we do not want\n * because the custom stuff will look better\n */\n @supports (-moz-appearance: none) {\n [data-code] {\n scrollbar-width: thin;\n scrollbar-color: var(--diffs-bg-context) transparent;\n padding-bottom: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n }\n\n [data-diffs-header] ~ [data-diff],\n [data-diffs-header] ~ [data-file] {\n [data-code],\n &[data-overflow='wrap'] {\n padding-top: 0;\n }\n }\n\n [data-gutter] {\n display: grid;\n grid-template-rows: subgrid;\n grid-template-columns: subgrid;\n grid-column: 1;\n z-index: 3;\n position: relative;\n background-color: var(--diffs-bg);\n\n [data-gutter-buffer],\n [data-column-number] {\n border-right: var(--diffs-gap-style, 2px solid var(--diffs-bg));\n }\n }\n\n [data-content] {\n display: grid;\n grid-template-rows: subgrid;\n grid-template-columns: subgrid;\n grid-column: 2;\n min-width: 0;\n }\n\n [data-diff-type='split'][data-overflow='wrap'] {\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: repeat(2, var(--diffs-code-grid));\n padding-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n\n [data-deletions] {\n display: contents;\n\n [data-gutter] {\n grid-column: 1;\n }\n\n [data-content] {\n grid-column: 2;\n border-right: 1px solid var(--diffs-bg);\n }\n }\n\n [data-additions] {\n display: contents;\n\n [data-gutter] {\n grid-column: 3;\n border-left: 1px solid var(--diffs-bg);\n }\n\n [data-content] {\n grid-column: 4;\n }\n }\n }\n\n [data-overflow='scroll'] [data-gutter] {\n position: sticky;\n left: 0;\n }\n\n [data-line-annotation][data-selected-line] {\n background-color: unset;\n\n &::before {\n content: '';\n /* FIXME(amadeus): This needs to be audited ... */\n position: sticky;\n top: 0;\n left: 0;\n display: block;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-annotation-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-interactive-lines] [data-line] {\n cursor: pointer;\n }\n\n [data-content-buffer],\n [data-gutter-buffer] {\n position: relative;\n user-select: none;\n min-height: 1lh;\n }\n\n [data-gutter-buffer='annotation'] {\n min-height: 0;\n }\n\n [data-gutter-buffer='buffer'] {\n background-size: 8px 8px;\n background-position: 0 0;\n background-origin: border-box;\n background-color: var(--diffs-bg);\n /* This is incredibley expensive... */\n background-image: repeating-linear-gradient(\n -45deg,\n transparent,\n transparent calc(3px * 1.414),\n rgb(from var(--diffs-bg-buffer) r g b / 0.8) calc(3px * 1.414),\n rgb(from var(--diffs-bg-buffer) r g b / 0.8) calc(4px * 1.414)\n );\n }\n\n [data-content-buffer] {\n grid-column: 1;\n /* We multiply by 1.414 (√2) to better approximate the diagonal repeat distance */\n background-size: 8px 8px;\n background-position: 5px 0;\n background-origin: border-box;\n background-color: var(--diffs-bg);\n /* This is incredibley expensive... */\n background-image: repeating-linear-gradient(\n -45deg,\n transparent,\n transparent calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(4px * 1.414)\n );\n }\n\n [data-separator] {\n box-sizing: content-box;\n background-color: var(--diffs-bg);\n }\n\n [data-separator='simple'] {\n min-height: 4px;\n }\n\n [data-separator='line-info'],\n [data-separator='line-info-basic'],\n [data-separator='metadata'],\n [data-separator='simple'] {\n background-color: var(--diffs-bg-separator);\n }\n\n [data-separator='line-info'],\n [data-separator='line-info-basic'],\n [data-separator='metadata'] {\n height: 32px;\n position: relative;\n }\n\n [data-separator-wrapper] {\n user-select: none;\n fill: currentColor;\n position: absolute;\n inset-inline: 0;\n display: flex;\n align-items: center;\n background-color: var(--diffs-bg);\n height: 100%;\n }\n\n [data-content] [data-separator-wrapper] {\n display: none;\n }\n\n [data-separator='metadata'] [data-separator-wrapper] {\n inset-inline: 100% auto;\n padding-inline: 1ch;\n height: 100%;\n background-color: var(--diffs-bg-separator);\n color: var(--diffs-fg-number);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: min-content;\n }\n\n [data-separator='line-info'] {\n margin-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-separator='line-info-basic'],\n [data-separator='metadata'] {\n margin-block: 0;\n }\n\n [data-separator='line-info'][data-separator-first] {\n margin-top: 0;\n }\n\n [data-separator='line-info'][data-separator-last] {\n margin-bottom: 0;\n }\n\n [data-expand-index] [data-separator-wrapper] {\n display: grid;\n grid-template-columns: 32px auto;\n }\n\n [data-expand-index] [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: 32px 32px auto;\n }\n\n [data-expand-button],\n [data-separator-content] {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n background-color: var(--diffs-bg-separator);\n }\n\n [data-expand-button] {\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n min-width: 32px;\n align-self: stretch;\n color: var(--diffs-fg-number);\n border-right: 2px solid var(--diffs-bg);\n\n &:hover {\n color: var(--diffs-fg);\n }\n }\n\n [data-expand-down] [data-icon] {\n transform: scaleY(-1);\n }\n\n [data-separator-content] {\n flex: 1 1 auto;\n padding: 0 1ch;\n height: 100%;\n color: var(--diffs-fg-number);\n\n overflow: hidden;\n justify-content: flex-start;\n }\n\n [data-separator='line-info'],\n [data-separator='line-info-basic'] {\n [data-separator-content] {\n height: 100%;\n user-select: none;\n overflow: clip;\n }\n }\n\n @supports (width: 1cqi) {\n [data-unified] {\n [data-separator='line-info'] [data-separator-wrapper] {\n padding-inline: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n width: 100cqi;\n\n [data-separator-content] {\n border-radius: 6px;\n }\n }\n\n [data-separator='line-info'][data-expand-index]\n [data-separator-wrapper]\n [data-separator-content] {\n border-top-left-radius: unset;\n border-bottom-left-radius: unset;\n }\n }\n\n [data-gutter] {\n [data-separator='line-info'] [data-separator-wrapper] {\n padding-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n }\n\n [data-separator='line-info'] [data-separator-content] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n }\n\n [data-separator='line-info'][data-expand-index] [data-separator-content] {\n border-top-left-radius: unset;\n border-bottom-left-radius: unset;\n }\n }\n\n [data-additions] {\n [data-content] [data-separator='line-info'] {\n background-color: var(--diffs-bg);\n\n [data-separator-wrapper] {\n display: none;\n }\n }\n\n [data-gutter] [data-separator='line-info'] [data-separator-wrapper] {\n display: block;\n height: 100%;\n background-color: var(--diffs-bg-separator);\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n\n [data-separator-content],\n [data-expand-button] {\n display: none;\n }\n }\n }\n\n [data-overflow='scroll']\n [data-additions]\n [data-gutter]\n [data-separator='line-info']\n [data-separator-wrapper] {\n width: calc(100cqi - var(--diffs-gap-inline, var(--diffs-gap-fallback)));\n }\n\n [data-overflow='wrap']\n [data-additions]\n [data-content]\n [data-separator='line-info']\n [data-separator-wrapper] {\n background-color: var(--diffs-bg-separator);\n display: block;\n height: 100%;\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n\n [data-separator-content],\n [data-expand-button] {\n display: none;\n }\n }\n\n [data-separator='line-info'] [data-separator-wrapper] {\n [data-expand-both],\n [data-expand-down],\n [data-expand-up] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n }\n }\n\n @media (pointer: fine) {\n [data-separator='line-info'] [data-separator-wrapper] {\n &[data-separator-multi-button] {\n [data-expand-up] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: unset;\n }\n\n [data-expand-down] {\n border-bottom-left-radius: 6px;\n border-top-left-radius: unset;\n }\n }\n }\n }\n }\n\n @media (pointer: coarse) {\n [data-separator='line-info-basic']\n [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: 34px 34px auto;\n\n [data-separator-content] {\n grid-column: unset;\n grid-row: unset;\n }\n }\n\n @supports (width: 1cqi) {\n [data-separator='line-info'] [data-separator-wrapper] {\n [data-expand-both],\n [data-expand-down],\n [data-expand-up] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n }\n\n &[data-separator-multi-button] {\n [data-expand-up] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n }\n\n [data-expand-down] {\n border-bottom-left-radius: unset;\n border-top-left-radius: unset;\n }\n }\n }\n }\n }\n\n @media (pointer: fine) {\n [data-separator-wrapper][data-separator-multi-button] {\n display: grid;\n grid-template-rows: 50% 50%;\n\n [data-separator-content] {\n grid-column: 2;\n grid-row: 1 / -1;\n min-width: min-content;\n }\n\n [data-expand-button] {\n grid-column: 1;\n }\n }\n\n [data-separator='line-info'] [data-separator-wrapper],\n [data-separator='line-info']\n [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: 34px auto;\n }\n\n [data-separator='line-info-basic'][data-expand-index]\n [data-separator-wrapper] {\n grid-template-columns: 100% auto;\n }\n\n [data-separator='line-info'],\n [data-separator='line-info-basic'] {\n [data-separator-multi-button] {\n [data-expand-up] {\n border-bottom: 1px solid var(--diffs-bg);\n border-right: 2px solid var(--diffs-bg);\n }\n [data-expand-down] {\n border-top: 1px solid var(--diffs-bg);\n border-right: 2px solid var(--diffs-bg);\n }\n }\n }\n }\n\n [data-additions] [data-gutter] [data-separator-wrapper],\n [data-additions] [data-separator='line-info-basic'] [data-separator-wrapper],\n [data-content] [data-separator-wrapper] {\n display: none;\n }\n\n [data-line-annotation],\n [data-gutter-buffer='annotation'] {\n --diffs-line-bg: var(--diffs-bg-context);\n }\n\n [data-line-annotation] {\n min-height: var(--diffs-annotation-min-height, 0);\n z-index: 2;\n }\n\n [data-separator='custom'] {\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-line],\n [data-column-number],\n [data-no-newline] {\n position: relative;\n padding-inline: 1ch;\n }\n\n [data-indicators='classic'] [data-line] {\n padding-inline-start: 2ch;\n }\n\n [data-indicators='classic'] {\n [data-line-type='change-addition'],\n [data-line-type='change-deletion'] {\n &[data-no-newline],\n &[data-line] {\n &::before {\n display: inline-block;\n width: 1ch;\n height: 1lh;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n }\n }\n }\n\n [data-line-type='change-addition'] {\n &[data-line],\n &[data-no-newline] {\n &::before {\n content: '+';\n color: var(--diffs-addition-base);\n }\n }\n }\n\n [data-line-type='change-deletion'] {\n &[data-line],\n &[data-no-newline] {\n &::before {\n content: '-';\n color: var(--diffs-deletion-base);\n }\n }\n }\n }\n\n [data-indicators='bars'] {\n [data-line-type='change-deletion'],\n [data-line-type='change-addition'] {\n &[data-column-number] {\n &::before {\n content: '';\n display: block;\n width: 4px;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n contain: strict;\n }\n }\n }\n\n [data-line-type='change-deletion'] {\n &[data-column-number] {\n &::before {\n background-image: linear-gradient(\n 0deg,\n var(--diffs-bg-deletion) 50%,\n var(--diffs-deletion-base) 50%\n );\n background-repeat: repeat;\n background-size: 2px 2px;\n background-size: calc(1lh / round(1lh / 2px))\n calc(1lh / round(1lh / 2px));\n }\n }\n }\n\n [data-line-type='change-addition'] {\n &[data-column-number] {\n &::before {\n background-color: var(--diffs-addition-base);\n }\n }\n }\n }\n\n [data-overflow='wrap'] {\n [data-line],\n [data-annotation-content] {\n white-space: pre-wrap;\n word-break: break-word;\n }\n }\n\n [data-overflow='scroll'] [data-line] {\n white-space: pre;\n min-height: 1lh;\n }\n\n [data-column-number] {\n box-sizing: content-box;\n text-align: right;\n user-select: none;\n background-color: var(--diffs-bg);\n color: var(--diffs-fg-number);\n padding-left: 2ch;\n }\n\n [data-line-number-content] {\n display: inline-block;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n }\n\n [data-disable-line-numbers] {\n [data-column-number] {\n min-width: 4px;\n padding: 0;\n }\n\n [data-line-number-content] {\n display: none;\n }\n\n [data-hover-slot] {\n right: unset;\n left: 0;\n justify-content: flex-start;\n }\n\n &[data-indicators='bars'] [data-hover-slot] {\n /* Using 5px here because theres a 1px separator after the bar */\n left: 5px;\n }\n }\n\n [data-file][data-disable-line-numbers] {\n [data-gutter-buffer],\n [data-column-number] {\n min-width: 0;\n border-right: 0;\n }\n }\n\n [data-interactive-line-numbers] [data-column-number] {\n cursor: pointer;\n }\n\n [data-diff-span] {\n border-radius: 3px;\n box-decoration-break: clone;\n }\n\n [data-line-type='change-addition'] {\n &[data-column-number] {\n color: var(\n --diffs-fg-number-addition-override,\n var(--diffs-addition-base)\n );\n }\n\n > [data-diff-span] {\n background-color: var(--diffs-bg-addition-emphasis);\n }\n }\n\n [data-line-type='change-deletion'] {\n &[data-column-number] {\n color: var(\n --diffs-fg-number-deletion-override,\n var(--diffs-deletion-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-deletion-emphasis);\n }\n }\n\n [data-background] [data-line-type='change-addition'] {\n --diffs-line-bg: var(--diffs-bg-addition);\n\n &[data-column-number] {\n background-color: var(--diffs-bg-addition-number);\n }\n }\n\n [data-background] [data-line-type='change-deletion'] {\n --diffs-line-bg: var(--diffs-bg-deletion);\n\n &[data-column-number] {\n background-color: var(--diffs-bg-deletion-number);\n }\n }\n\n @media (pointer: fine) {\n [data-column-number],\n [data-line] {\n &[data-hovered] {\n background-color: var(--diffs-bg-hover);\n }\n }\n\n [data-background] {\n [data-column-number],\n [data-line] {\n &[data-hovered] {\n &[data-line-type='change-deletion'] {\n background-color: var(--diffs-bg-deletion-hover);\n }\n\n &[data-line-type='change-addition'] {\n background-color: var(--diffs-bg-addition-hover);\n }\n }\n }\n }\n }\n\n [data-diffs-header] {\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-height: calc(\n 1lh + (var(--diffs-gap-block, var(--diffs-gap-fallback)) * 3)\n );\n padding-inline: 16px;\n top: 0;\n z-index: 2;\n }\n\n [data-header-content] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-header-content] [data-prev-name],\n [data-header-content] [data-title] {\n direction: rtl;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-prev-name] {\n opacity: 0.7;\n }\n\n [data-rename-icon] {\n fill: currentColor;\n flex-shrink: 0;\n flex-grow: 0;\n }\n\n [data-diffs-header] [data-metadata] {\n display: flex;\n align-items: center;\n gap: 1ch;\n white-space: nowrap;\n }\n\n [data-diffs-header] [data-additions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-addition-base);\n }\n\n [data-diffs-header] [data-deletions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-deletion-base);\n }\n\n [data-annotation-content] {\n position: relative;\n display: flow-root;\n align-self: flex-start;\n z-index: 2;\n min-width: 0;\n isolation: isolate;\n }\n\n /* Sticky positioning has a composite costs, so we should _only_ pay it if we\n * need to */\n [data-overflow='scroll'] [data-annotation-content] {\n position: sticky;\n width: var(--diffs-column-content-width, auto);\n left: var(--diffs-column-number-width, 0);\n }\n\n /* Undo some of the stuff that the 'pre' tag does */\n [data-annotation-slot] {\n text-wrap-mode: wrap;\n word-break: normal;\n white-space-collapse: collapse;\n }\n\n [data-change-icon] {\n fill: currentColor;\n flex-shrink: 0;\n }\n\n [data-change-icon='change'],\n [data-change-icon='rename-pure'],\n [data-change-icon='rename-changed'] {\n color: var(--diffs-modified-base);\n }\n\n [data-change-icon='new'] {\n color: var(--diffs-addition-base);\n }\n\n [data-change-icon='deleted'] {\n color: var(--diffs-deletion-base);\n }\n\n [data-change-icon='file'] {\n opacity: 0.6;\n }\n\n /* Line selection highlighting */\n [data-selected-line] {\n &[data-gutter-buffer='annotation'],\n &[data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: var(--diffs-bg-selection-number);\n }\n\n &[data-line] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-line-type='change-addition'],\n [data-line-type='change-deletion'] {\n &[data-selected-line] {\n &[data-line],\n &[data-line][data-hovered] {\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 82%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n )\n );\n }\n\n &[data-column-number],\n &[data-column-number][data-hovered] {\n color: var(--diffs-selection-number-fg);\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 60%,\n var(--diffs-selection-base)\n )\n );\n }\n }\n }\n\n [data-hover-slot] {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: flex-end;\n }\n\n [data-unmodified-lines] {\n display: block;\n overflow: hidden;\n min-width: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 0 1 auto;\n }\n\n [data-error-wrapper] {\n overflow: auto;\n padding: var(--diffs-gap-block, var(--diffs-gap-fallback))\n var(--diffs-gap-inline, var(--diffs-gap-fallback));\n max-height: 400px;\n scrollbar-width: none;\n\n [data-error-message] {\n font-weight: bold;\n font-size: 18px;\n color: var(--diffs-deletion-base);\n }\n\n [data-error-stack] {\n color: var(--diffs-fg-number);\n }\n }\n\n [data-placeholder] {\n contain: strict;\n }\n}\n"],"mappings":";oBAAA"}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../src/style.css"],"sourcesContent":["@layer base, theme, unsafe;\n\n@layer base {\n :host {\n --diffs-bg: #fff;\n --diffs-fg: #000;\n --diffs-font-fallback:\n 'SF Mono', Monaco, Consolas, 'Ubuntu Mono', 'Liberation Mono',\n 'Courier New', monospace;\n --diffs-header-font-fallback:\n system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue',\n 'Noto Sans', 'Liberation Sans', Arial, sans-serif;\n\n --diffs-mixer: light-dark(black, white);\n --diffs-gap-fallback: 8px;\n\n /*\n // Available CSS Color Overrides\n --diffs-bg-buffer-override\n --diffs-bg-hover-override\n --diffs-bg-context-override\n --diffs-bg-separator-override\n\n --diffs-fg-number-override\n --diffs-fg-number-addition-override\n --diffs-fg-number-deletion-override\n\n --diffs-deletion-color-override\n --diffs-addition-color-override\n --diffs-modified-color-override\n\n --diffs-bg-deletion-override\n --diffs-bg-deletion-number-override\n --diffs-bg-deletion-hover-override\n --diffs-bg-deletion-emphasis-override\n\n --diffs-bg-addition-override\n --diffs-bg-addition-number-override\n --diffs-bg-addition-hover-override\n --diffs-bg-addition-emphasis-override\n\n // Line Selection Color Overrides (for enableLineSelection)\n --diffs-selection-color-override\n --diffs-bg-selection-override\n --diffs-bg-selection-number-override\n --diffs-bg-selection-background-override\n --diffs-bg-selection-number-background-override\n\n // Available CSS Layout Overrides\n --diffs-gap-inline\n --diffs-gap-block\n --diffs-gap-style\n --diffs-tab-size\n */\n\n color-scheme: light dark;\n display: block;\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n font-size: var(--diffs-font-size, 13px);\n line-height: var(--diffs-line-height, 20px);\n font-feature-settings: var(--diffs-font-features);\n }\n\n /* NOTE(mdo): Some semantic HTML elements (e.g. `pre`, `code`) have default\n * user-agent styles. These must be overridden to use our custom styles. */\n pre,\n code,\n [data-error-wrapper] {\n isolation: isolate;\n margin: 0;\n padding: 0;\n display: block;\n outline: none;\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n }\n\n pre,\n code {\n background-color: var(--diffs-bg);\n }\n\n code {\n contain: content;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n [data-icon-sprite] {\n display: none;\n }\n\n /* NOTE(mdo): Headers and separators are within pre/code, so we need to reset\n * their font-family explicitly. */\n [data-diffs-header],\n [data-separator] {\n font-family: var(\n --diffs-header-font-family,\n var(--diffs-header-font-fallback)\n );\n }\n\n [data-file-info] {\n padding: 10px;\n font-weight: 700;\n color: var(--fg);\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n background-color: color-mix(in lab, var(--bg) 98%, var(--fg));\n border-block: 1px solid color-mix(in lab, var(--bg) 95%, var(--fg));\n }\n\n [data-diffs-header],\n [data-diff],\n [data-file],\n [data-error-wrapper],\n [data-virtualizer-buffer] {\n --diffs-bg: light-dark(var(--diffs-light-bg), var(--diffs-dark-bg));\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-buffer: var(\n --diffs-bg-buffer-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))\n )\n );\n --diffs-bg-hover: var(\n --diffs-bg-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 97%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-mixer))\n )\n );\n\n --diffs-bg-context: var(\n --diffs-bg-context-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))\n )\n );\n --diffs-bg-context-number: var(\n --diffs-bg-context-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg-context) 80%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-bg-context) 60%, var(--diffs-bg))\n )\n );\n\n --diffs-bg-separator: var(\n --diffs-bg-separator-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))\n )\n );\n\n --diffs-fg: light-dark(var(--diffs-light), var(--diffs-dark));\n --diffs-fg-number: var(\n --diffs-fg-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),\n color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))\n )\n );\n\n --diffs-deletion-base: var(\n --diffs-deletion-color-override,\n light-dark(\n var(\n --diffs-light-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n ),\n var(\n --diffs-dark-deletion-color,\n var(--diffs-deletion-color, rgb(255, 0, 0))\n )\n )\n );\n --diffs-addition-base: var(\n --diffs-addition-color-override,\n light-dark(\n var(\n --diffs-light-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n ),\n var(\n --diffs-dark-addition-color,\n var(--diffs-addition-color, rgb(0, 255, 0))\n )\n )\n );\n --diffs-modified-base: var(\n --diffs-modified-color-override,\n light-dark(\n var(\n --diffs-light-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n ),\n var(\n --diffs-dark-modified-color,\n var(--diffs-modified-color, rgb(0, 0, 255))\n )\n )\n );\n\n /* NOTE(amadeus): we cannot use 'in oklch' because current versions of cursor\n * and vscode use an older build of chrome that appears to have a bug with\n * color-mix and 'in oklch', so use 'in lab' instead */\n --diffs-bg-deletion: var(\n --diffs-bg-deletion-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-number: var(\n --diffs-bg-deletion-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-hover: var(\n --diffs-bg-deletion-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-deletion-base))\n )\n );\n --diffs-bg-deletion-emphasis: var(\n --diffs-bg-deletion-emphasis-override,\n light-dark(\n rgb(from var(--diffs-deletion-base) r g b / 0.15),\n rgb(from var(--diffs-deletion-base) r g b / 0.2)\n )\n );\n\n --diffs-bg-addition: var(\n --diffs-bg-addition-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-number: var(\n --diffs-bg-addition-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 91%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-hover: var(\n --diffs-bg-addition-hover-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base)),\n color-mix(in lab, var(--diffs-bg) 70%, var(--diffs-addition-base))\n )\n );\n --diffs-bg-addition-emphasis: var(\n --diffs-bg-addition-emphasis-override,\n light-dark(\n rgb(from var(--diffs-addition-base) r g b / 0.15),\n rgb(from var(--diffs-addition-base) r g b / 0.2)\n )\n );\n\n --diffs-selection-base: var(--diffs-modified-base);\n --diffs-selection-number-fg: light-dark(\n color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),\n color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer))\n );\n --diffs-bg-selection: var(\n --diffs-bg-selection-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 82%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base))\n )\n );\n --diffs-bg-selection-number: var(\n --diffs-bg-selection-number-override,\n light-dark(\n color-mix(in lab, var(--diffs-bg) 75%, var(--diffs-selection-base)),\n color-mix(in lab, var(--diffs-bg) 60%, var(--diffs-selection-base))\n )\n );\n\n background-color: var(--diffs-bg);\n color: var(--diffs-fg);\n }\n\n [data-diff],\n [data-file] {\n /* This feels a bit crazy to me... so I need to think about it a bit more... */\n --diffs-grid-number-column-width: minmax(min-content, max-content);\n --diffs-code-grid: var(--diffs-grid-number-column-width) 1fr;\n\n &[data-dehydrated] {\n --diffs-code-grid: var(--diffs-grid-number-column-width) minmax(0, 1fr);\n }\n\n &[data-theme-type='light'],\n & {\n [data-line] span {\n color: light-dark(\n var(--diffs-token-light, var(--diffs-light)),\n var(--diffs-token-dark, var(--diffs-dark))\n );\n font-weight: var(--diffs-token-light-font-weight, inherit);\n font-style: var(--diffs-token-light-font-style, inherit);\n text-decoration: var(--diffs-token-light-text-decoration, inherit);\n }\n }\n\n &[data-theme-type='dark'] [data-line] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n\n &:hover [data-code]::-webkit-scrollbar-thumb {\n background-color: var(--diffs-bg-context);\n }\n }\n\n [data-line] span {\n background-color: light-dark(\n var(--diffs-token-light-bg, inherit),\n var(--diffs-token-dark-bg, inherit)\n );\n }\n\n [data-line],\n [data-gutter-buffer],\n [data-line-annotation],\n [data-no-newline] {\n color: var(--diffs-fg);\n background-color: var(--diffs-line-bg, var(--diffs-bg));\n }\n\n [data-no-newline] {\n user-select: none;\n\n span {\n opacity: 0.6;\n }\n }\n\n @media (prefers-color-scheme: dark) {\n [data-diffs-header],\n [data-error-wrapper],\n [data-diff],\n [data-file] {\n color-scheme: dark;\n }\n\n [data-content] [data-line] span {\n font-weight: var(--diffs-token-dark-font-weight, inherit);\n font-style: var(--diffs-token-dark-font-style, inherit);\n text-decoration: var(--diffs-token-dark-text-decoration, inherit);\n }\n }\n\n [data-diffs-header],\n [data-diff],\n [data-file] {\n &[data-theme-type='light'] {\n color-scheme: light;\n }\n\n &[data-theme-type='dark'] {\n color-scheme: dark;\n }\n }\n\n [data-diff-type='split'][data-overflow='scroll'] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n\n [data-additions] {\n border-left: 1px solid var(--diffs-bg);\n }\n\n [data-deletions] {\n border-right: 1px solid var(--diffs-bg);\n }\n }\n\n [data-code] {\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: var(--diffs-code-grid);\n overflow: scroll clip;\n overscroll-behavior-x: none;\n tab-size: var(--diffs-tab-size, 2);\n align-self: flex-start;\n padding-top: var(--diffs-gap-block, var(--diffs-gap-fallback));\n padding-bottom: max(\n 0px,\n calc(var(--diffs-gap-block, var(--diffs-gap-fallback)) - 6px)\n );\n }\n\n [data-container-size] {\n container-type: inline-size;\n }\n\n [data-code]::-webkit-scrollbar {\n width: 0;\n height: 6px;\n }\n\n [data-code]::-webkit-scrollbar-track {\n background: transparent;\n }\n\n [data-code]::-webkit-scrollbar-thumb {\n background-color: transparent;\n border: 1px solid transparent;\n background-clip: content-box;\n border-radius: 3px;\n }\n\n [data-code]::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n\n /*\n * If we apply these rules globally it will mean that webkit will opt into the\n * standards compliant version of custom css scrollbars, which we do not want\n * because the custom stuff will look better\n */\n @supports (-moz-appearance: none) {\n [data-code] {\n scrollbar-width: thin;\n scrollbar-color: var(--diffs-bg-context) transparent;\n padding-bottom: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n }\n\n [data-diffs-header] ~ [data-diff],\n [data-diffs-header] ~ [data-file] {\n [data-code],\n &[data-overflow='wrap'] {\n padding-top: 0;\n }\n }\n\n [data-gutter] {\n display: grid;\n grid-template-rows: subgrid;\n grid-template-columns: subgrid;\n grid-column: 1;\n z-index: 3;\n position: relative;\n background-color: var(--diffs-bg);\n\n [data-gutter-buffer],\n [data-column-number] {\n border-right: var(--diffs-gap-style, 2px solid var(--diffs-bg));\n }\n }\n\n [data-content] {\n display: grid;\n grid-template-rows: subgrid;\n grid-template-columns: subgrid;\n grid-column: 2;\n min-width: 0;\n }\n\n [data-diff-type='split'][data-overflow='wrap'] {\n display: grid;\n grid-auto-flow: dense;\n grid-template-columns: repeat(2, var(--diffs-code-grid));\n padding-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n\n [data-deletions] {\n display: contents;\n\n [data-gutter] {\n grid-column: 1;\n }\n\n [data-content] {\n grid-column: 2;\n border-right: 1px solid var(--diffs-bg);\n }\n }\n\n [data-additions] {\n display: contents;\n\n [data-gutter] {\n grid-column: 3;\n border-left: 1px solid var(--diffs-bg);\n }\n\n [data-content] {\n grid-column: 4;\n }\n }\n }\n\n [data-overflow='scroll'] [data-gutter] {\n position: sticky;\n left: 0;\n }\n\n [data-line-annotation][data-selected-line] {\n background-color: unset;\n\n &::before {\n content: '';\n /* FIXME(amadeus): This needs to be audited ... */\n position: sticky;\n top: 0;\n left: 0;\n display: block;\n border-right: var(--diffs-gap-style, 1px solid var(--diffs-bg));\n background-color: var(--diffs-bg-selection-number);\n }\n\n [data-annotation-content] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-interactive-lines] [data-line] {\n cursor: pointer;\n }\n\n [data-content-buffer],\n [data-gutter-buffer] {\n position: relative;\n user-select: none;\n min-height: 1lh;\n }\n\n [data-gutter-buffer='annotation'] {\n min-height: 0;\n }\n\n [data-gutter-buffer='buffer'] {\n background-size: 8px 8px;\n background-position: 0 0;\n background-origin: border-box;\n background-color: var(--diffs-bg);\n /* This is incredibley expensive... */\n background-image: repeating-linear-gradient(\n -45deg,\n transparent,\n transparent calc(3px * 1.414),\n rgb(from var(--diffs-bg-buffer) r g b / 0.8) calc(3px * 1.414),\n rgb(from var(--diffs-bg-buffer) r g b / 0.8) calc(4px * 1.414)\n );\n }\n\n [data-content-buffer] {\n grid-column: 1;\n /* We multiply by 1.414 (√2) to better approximate the diagonal repeat distance */\n background-size: 8px 8px;\n background-position: 5px 0;\n background-origin: border-box;\n background-color: var(--diffs-bg);\n /* This is incredibley expensive... */\n background-image: repeating-linear-gradient(\n -45deg,\n transparent,\n transparent calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(3px * 1.414),\n var(--diffs-bg-buffer) calc(4px * 1.414)\n );\n }\n\n [data-separator] {\n box-sizing: content-box;\n background-color: var(--diffs-bg);\n }\n\n [data-separator='simple'] {\n min-height: 4px;\n }\n\n [data-separator='line-info'],\n [data-separator='line-info-basic'],\n [data-separator='metadata'],\n [data-separator='simple'] {\n background-color: var(--diffs-bg-separator);\n }\n\n [data-separator='line-info'],\n [data-separator='line-info-basic'],\n [data-separator='metadata'] {\n height: 32px;\n position: relative;\n }\n\n [data-separator-wrapper] {\n user-select: none;\n fill: currentColor;\n position: absolute;\n inset-inline: 0;\n display: flex;\n align-items: center;\n background-color: var(--diffs-bg);\n height: 100%;\n }\n\n [data-content] [data-separator-wrapper] {\n display: none;\n }\n\n [data-separator='metadata'] [data-separator-wrapper] {\n inset-inline: 100% auto;\n padding-inline: 1ch;\n height: 100%;\n background-color: var(--diffs-bg-separator);\n color: var(--diffs-fg-number);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: min-content;\n }\n\n [data-separator='line-info'] {\n margin-block: var(--diffs-gap-block, var(--diffs-gap-fallback));\n }\n\n [data-separator='line-info-basic'],\n [data-separator='metadata'] {\n margin-block: 0;\n }\n\n [data-separator='line-info'][data-separator-first] {\n margin-top: 0;\n }\n\n [data-separator='line-info'][data-separator-last] {\n margin-bottom: 0;\n }\n\n [data-expand-index] [data-separator-wrapper] {\n display: grid;\n grid-template-columns: 32px auto;\n }\n\n [data-expand-index] [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: 32px 32px auto;\n }\n\n [data-expand-button],\n [data-separator-content] {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n background-color: var(--diffs-bg-separator);\n }\n\n [data-expand-button] {\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n min-width: 32px;\n align-self: stretch;\n color: var(--diffs-fg-number);\n border-right: 2px solid var(--diffs-bg);\n\n &:hover {\n color: var(--diffs-fg);\n }\n }\n\n [data-expand-down] [data-icon] {\n transform: scaleY(-1);\n }\n\n [data-separator-content] {\n flex: 1 1 auto;\n padding: 0 1ch;\n height: 100%;\n color: var(--diffs-fg-number);\n\n overflow: hidden;\n justify-content: flex-start;\n }\n\n [data-separator='line-info'],\n [data-separator='line-info-basic'] {\n [data-separator-content] {\n height: 100%;\n user-select: none;\n overflow: clip;\n }\n }\n\n @supports (width: 1cqi) {\n [data-unified] {\n [data-separator='line-info'] [data-separator-wrapper] {\n padding-inline: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n width: 100cqi;\n\n [data-separator-content] {\n border-radius: 6px;\n }\n }\n\n [data-separator='line-info'][data-expand-index]\n [data-separator-wrapper]\n [data-separator-content] {\n border-top-left-radius: unset;\n border-bottom-left-radius: unset;\n }\n }\n\n [data-gutter] {\n [data-separator='line-info'] [data-separator-wrapper] {\n padding-left: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n }\n\n [data-separator='line-info'] [data-separator-content] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n }\n\n [data-separator='line-info'][data-expand-index] [data-separator-content] {\n border-top-left-radius: unset;\n border-bottom-left-radius: unset;\n }\n }\n\n [data-additions] {\n [data-content] [data-separator='line-info'] {\n background-color: var(--diffs-bg);\n\n [data-separator-wrapper] {\n display: none;\n }\n }\n\n [data-gutter] [data-separator='line-info'] [data-separator-wrapper] {\n display: block;\n height: 100%;\n background-color: var(--diffs-bg-separator);\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n\n [data-separator-content],\n [data-expand-button] {\n display: none;\n }\n }\n }\n\n [data-overflow='scroll']\n [data-additions]\n [data-gutter]\n [data-separator='line-info']\n [data-separator-wrapper] {\n width: calc(100cqi - var(--diffs-gap-inline, var(--diffs-gap-fallback)));\n }\n\n [data-overflow='wrap']\n [data-additions]\n [data-content]\n [data-separator='line-info']\n [data-separator-wrapper] {\n background-color: var(--diffs-bg-separator);\n display: block;\n height: 100%;\n margin-right: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n\n [data-separator-content],\n [data-expand-button] {\n display: none;\n }\n }\n\n [data-separator='line-info'] [data-separator-wrapper] {\n [data-expand-both],\n [data-expand-down],\n [data-expand-up] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n }\n }\n\n @media (pointer: fine) {\n [data-separator='line-info'] [data-separator-wrapper] {\n &[data-separator-multi-button] {\n [data-expand-up] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: unset;\n }\n\n [data-expand-down] {\n border-bottom-left-radius: 6px;\n border-top-left-radius: unset;\n }\n }\n }\n }\n }\n\n @media (pointer: coarse) {\n [data-separator='line-info-basic']\n [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: 34px 34px auto;\n\n [data-separator-content] {\n grid-column: unset;\n grid-row: unset;\n }\n }\n\n @supports (width: 1cqi) {\n [data-separator='line-info'] [data-separator-wrapper] {\n [data-expand-both],\n [data-expand-down],\n [data-expand-up] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n }\n\n &[data-separator-multi-button] {\n [data-expand-up] {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n }\n\n [data-expand-down] {\n border-bottom-left-radius: unset;\n border-top-left-radius: unset;\n }\n }\n }\n }\n }\n\n @media (pointer: fine) {\n [data-separator-wrapper][data-separator-multi-button] {\n display: grid;\n grid-template-rows: 50% 50%;\n\n [data-separator-content] {\n grid-column: 2;\n grid-row: 1 / -1;\n min-width: min-content;\n }\n\n [data-expand-button] {\n grid-column: 1;\n }\n }\n\n [data-separator='line-info'] [data-separator-wrapper],\n [data-separator='line-info']\n [data-separator-wrapper][data-separator-multi-button] {\n grid-template-columns: 34px auto;\n }\n\n [data-separator='line-info-basic'][data-expand-index]\n [data-separator-wrapper] {\n grid-template-columns: 100% auto;\n }\n\n [data-separator='line-info'],\n [data-separator='line-info-basic'] {\n [data-separator-multi-button] {\n [data-expand-up] {\n border-bottom: 1px solid var(--diffs-bg);\n border-right: 2px solid var(--diffs-bg);\n }\n [data-expand-down] {\n border-top: 1px solid var(--diffs-bg);\n border-right: 2px solid var(--diffs-bg);\n }\n }\n }\n }\n\n [data-additions] [data-gutter] [data-separator-wrapper],\n [data-additions] [data-separator='line-info-basic'] [data-separator-wrapper],\n [data-content] [data-separator-wrapper] {\n display: none;\n }\n\n [data-line-annotation],\n [data-gutter-buffer='annotation'] {\n --diffs-line-bg: var(--diffs-bg-context);\n }\n\n [data-line-annotation] {\n min-height: var(--diffs-annotation-min-height, 0);\n z-index: 2;\n }\n\n [data-separator='custom'] {\n display: grid;\n grid-template-columns: subgrid;\n }\n\n [data-line],\n [data-column-number],\n [data-no-newline] {\n position: relative;\n padding-inline: 1ch;\n }\n\n [data-indicators='classic'] [data-line] {\n padding-inline-start: 2ch;\n }\n\n [data-indicators='classic'] {\n [data-line-type='change-addition'],\n [data-line-type='change-deletion'] {\n &[data-no-newline],\n &[data-line] {\n &::before {\n display: inline-block;\n width: 1ch;\n height: 1lh;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n }\n }\n }\n\n [data-line-type='change-addition'] {\n &[data-line],\n &[data-no-newline] {\n &::before {\n content: '+';\n color: var(--diffs-addition-base);\n }\n }\n }\n\n [data-line-type='change-deletion'] {\n &[data-line],\n &[data-no-newline] {\n &::before {\n content: '-';\n color: var(--diffs-deletion-base);\n }\n }\n }\n }\n\n [data-indicators='bars'] {\n [data-line-type='change-deletion'],\n [data-line-type='change-addition'] {\n &[data-column-number] {\n &::before {\n content: '';\n display: block;\n width: 4px;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n user-select: none;\n contain: strict;\n }\n }\n }\n\n [data-line-type='change-deletion'] {\n &[data-column-number] {\n &::before {\n background-image: linear-gradient(\n 0deg,\n var(--diffs-bg-deletion) 50%,\n var(--diffs-deletion-base) 50%\n );\n background-repeat: repeat;\n background-size: 2px 2px;\n background-size: calc(1lh / round(1lh / 2px))\n calc(1lh / round(1lh / 2px));\n }\n }\n }\n\n [data-line-type='change-addition'] {\n &[data-column-number] {\n &::before {\n background-color: var(--diffs-addition-base);\n }\n }\n }\n }\n\n [data-overflow='wrap'] {\n [data-line],\n [data-annotation-content] {\n white-space: pre-wrap;\n word-break: break-word;\n }\n }\n\n [data-overflow='scroll'] [data-line] {\n white-space: pre;\n min-height: 1lh;\n }\n\n [data-column-number] {\n box-sizing: content-box;\n text-align: right;\n user-select: none;\n background-color: var(--diffs-bg);\n color: var(--diffs-fg-number);\n padding-left: 2ch;\n }\n\n [data-line-number-content] {\n display: inline-block;\n min-width: var(\n --diffs-min-number-column-width,\n var(--diffs-min-number-column-width-default, 3ch)\n );\n }\n\n [data-disable-line-numbers] {\n [data-column-number] {\n min-width: 4px;\n padding: 0;\n }\n\n [data-line-number-content] {\n display: none;\n }\n\n [data-hover-slot] {\n right: unset;\n left: 0;\n justify-content: flex-start;\n }\n\n &[data-indicators='bars'] [data-hover-slot] {\n /* Using 5px here because theres a 1px separator after the bar */\n left: 5px;\n }\n }\n\n [data-file][data-disable-line-numbers] {\n [data-gutter-buffer],\n [data-column-number] {\n min-width: 0;\n border-right: 0;\n }\n }\n\n [data-interactive-line-numbers] [data-column-number] {\n cursor: pointer;\n }\n\n [data-diff-span] {\n border-radius: 3px;\n box-decoration-break: clone;\n }\n\n [data-line-type='change-addition'] {\n &[data-column-number] {\n color: var(\n --diffs-fg-number-addition-override,\n var(--diffs-addition-base)\n );\n }\n\n > [data-diff-span] {\n background-color: var(--diffs-bg-addition-emphasis);\n }\n }\n\n [data-line-type='change-deletion'] {\n &[data-column-number] {\n color: var(\n --diffs-fg-number-deletion-override,\n var(--diffs-deletion-base)\n );\n }\n\n [data-diff-span] {\n background-color: var(--diffs-bg-deletion-emphasis);\n }\n }\n\n [data-background] [data-line-type='change-addition'] {\n --diffs-line-bg: var(--diffs-bg-addition);\n\n &[data-column-number] {\n background-color: var(--diffs-bg-addition-number);\n }\n }\n\n [data-background] [data-line-type='change-deletion'] {\n --diffs-line-bg: var(--diffs-bg-deletion);\n\n &[data-column-number] {\n background-color: var(--diffs-bg-deletion-number);\n }\n }\n\n @media (pointer: fine) {\n [data-column-number],\n [data-line] {\n &[data-hovered] {\n background-color: var(--diffs-bg-hover);\n }\n }\n\n [data-background] {\n [data-column-number],\n [data-line] {\n &[data-hovered] {\n &[data-line-type='change-deletion'] {\n background-color: var(--diffs-bg-deletion-hover);\n }\n\n &[data-line-type='change-addition'] {\n background-color: var(--diffs-bg-addition-hover);\n }\n }\n }\n }\n }\n\n [data-diffs-header] {\n position: relative;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-height: calc(\n 1lh + (var(--diffs-gap-block, var(--diffs-gap-fallback)) * 3)\n );\n padding-inline: 16px;\n top: 0;\n z-index: 2;\n }\n\n [data-header-content] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--diffs-gap-inline, var(--diffs-gap-fallback));\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-header-content] [data-prev-name],\n [data-header-content] [data-title] {\n direction: rtl;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n white-space: nowrap;\n }\n\n [data-prev-name] {\n opacity: 0.7;\n }\n\n [data-rename-icon] {\n fill: currentColor;\n flex-shrink: 0;\n flex-grow: 0;\n }\n\n [data-diffs-header] [data-metadata] {\n display: flex;\n align-items: center;\n gap: 1ch;\n white-space: nowrap;\n }\n\n [data-diffs-header] [data-additions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-addition-base);\n }\n\n [data-diffs-header] [data-deletions-count] {\n font-family: var(--diffs-font-family, var(--diffs-font-fallback));\n color: var(--diffs-deletion-base);\n }\n\n [data-annotation-content] {\n position: relative;\n display: flow-root;\n align-self: flex-start;\n z-index: 2;\n min-width: 0;\n isolation: isolate;\n }\n\n /* Sticky positioning has a composite costs, so we should _only_ pay it if we\n * need to */\n [data-overflow='scroll'] [data-annotation-content] {\n position: sticky;\n width: var(--diffs-column-content-width, auto);\n left: var(--diffs-column-number-width, 0);\n }\n\n /* Undo some of the stuff that the 'pre' tag does */\n [data-annotation-slot] {\n text-wrap-mode: wrap;\n word-break: normal;\n white-space-collapse: collapse;\n }\n\n [data-change-icon] {\n fill: currentColor;\n flex-shrink: 0;\n }\n\n [data-change-icon='change'],\n [data-change-icon='rename-pure'],\n [data-change-icon='rename-changed'] {\n color: var(--diffs-modified-base);\n }\n\n [data-change-icon='new'] {\n color: var(--diffs-addition-base);\n }\n\n [data-change-icon='deleted'] {\n color: var(--diffs-deletion-base);\n }\n\n [data-change-icon='file'] {\n opacity: 0.6;\n }\n\n /* Line selection highlighting */\n [data-selected-line] {\n &[data-gutter-buffer='annotation'],\n &[data-column-number] {\n color: var(--diffs-selection-number-fg);\n background-color: var(--diffs-bg-selection-number);\n }\n\n &[data-line] {\n background-color: var(--diffs-bg-selection);\n }\n }\n\n [data-line-type='change-addition'],\n [data-line-type='change-deletion'] {\n &[data-selected-line] {\n &[data-line],\n &[data-line][data-hovered] {\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 82%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n )\n );\n }\n\n &[data-column-number],\n &[data-column-number][data-hovered] {\n color: var(--diffs-selection-number-fg);\n background-color: light-dark(\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 75%,\n var(--diffs-selection-base)\n ),\n color-mix(\n in lab,\n var(--diffs-line-bg, var(--diffs-bg)) 60%,\n var(--diffs-selection-base)\n )\n );\n }\n }\n }\n\n [data-hover-slot] {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n display: flex;\n justify-content: flex-end;\n }\n\n [data-unmodified-lines] {\n display: block;\n overflow: hidden;\n min-width: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 0 1 auto;\n }\n\n [data-error-wrapper] {\n overflow: auto;\n padding: var(--diffs-gap-block, var(--diffs-gap-fallback))\n var(--diffs-gap-inline, var(--diffs-gap-fallback));\n max-height: 400px;\n scrollbar-width: none;\n\n [data-error-message] {\n font-weight: bold;\n font-size: 18px;\n color: var(--diffs-deletion-base);\n }\n\n [data-error-stack] {\n color: var(--diffs-fg-number);\n }\n }\n\n [data-placeholder] {\n contain: strict;\n }\n}\n"],"mappings":";oBAAA"}
@@ -4,12 +4,14 @@ interface CreateCodeNodeProps {
4
4
  code?: HTMLElement;
5
5
  columnType?: 'additions' | 'deletions' | 'unified';
6
6
  rowSpan?: number;
7
+ containerSize?: boolean;
7
8
  }
8
9
  declare function getOrCreateCodeNode({
9
10
  code,
10
11
  pre,
11
12
  columnType,
12
- rowSpan
13
+ rowSpan,
14
+ containerSize
13
15
  }?: CreateCodeNodeProps): HTMLElement;
14
16
  //#endregion
15
17
  export { getOrCreateCodeNode };
@@ -1 +1 @@
1
- {"version":3,"file":"getOrCreateCodeNode.d.ts","names":["CreateCodeNodeProps","HTMLPreElement","HTMLElement","getOrCreateCodeNode","code","pre","columnType","rowSpan"],"sources":["../../src/utils/getOrCreateCodeNode.d.ts"],"sourcesContent":["interface CreateCodeNodeProps {\n pre?: HTMLPreElement;\n code?: HTMLElement;\n columnType?: 'additions' | 'deletions' | 'unified';\n rowSpan?: number;\n}\nexport declare function getOrCreateCodeNode({ code, pre, columnType, rowSpan }?: CreateCodeNodeProps): HTMLElement;\nexport {};\n//# sourceMappingURL=getOrCreateCodeNode.d.ts.map"],"mappings":";UAAUA,mBAAAA;EAAAA,GAAAA,CAAAA,EACAC,cADAD;EAMcG,IAAAA,CAAAA,EAJbD,WAIaC;EAAsBC,UAAAA,CAAAA,EAAAA,WAAAA,GAAAA,WAAAA,GAAAA,SAAAA;EAAMC,OAAAA,CAAAA,EAAAA,MAAAA;;AAAiBE,iBAA7CJ,mBAAAA,CAA6CI;EAAAA,IAAAA;EAAAA,GAAAA;EAAAA,UAAAA;EAAAA;AAAAA,CAAAA,CAAAA,EAAYP,mBAAZO,CAAAA,EAAkCL,WAAlCK"}
1
+ {"version":3,"file":"getOrCreateCodeNode.d.ts","names":["CreateCodeNodeProps","HTMLPreElement","HTMLElement","getOrCreateCodeNode","code","pre","columnType","rowSpan","containerSize"],"sources":["../../src/utils/getOrCreateCodeNode.d.ts"],"sourcesContent":["interface CreateCodeNodeProps {\n pre?: HTMLPreElement;\n code?: HTMLElement;\n columnType?: 'additions' | 'deletions' | 'unified';\n rowSpan?: number;\n containerSize?: boolean;\n}\nexport declare function getOrCreateCodeNode({ code, pre, columnType, rowSpan, containerSize }?: CreateCodeNodeProps): HTMLElement;\nexport {};\n//# sourceMappingURL=getOrCreateCodeNode.d.ts.map"],"mappings":";UAAUA,mBAAAA;EAAAA,GAAAA,CAAAA,EACAC,cADAD;EAOcG,IAAAA,CAAAA,EALbD,WAKaC;EAAsBC,UAAAA,CAAAA,EAAAA,WAAAA,GAAAA,WAAAA,GAAAA,SAAAA;EAAMC,OAAAA,CAAAA,EAAAA,MAAAA;EAAKC,aAAAA,CAAAA,EAAAA,OAAAA;;AAAqBE,iBAAtDL,mBAAAA,CAAsDK;EAAAA,IAAAA;EAAAA,GAAAA;EAAAA,UAAAA;EAAAA,OAAAA;EAAAA;AAAAA,CAAAA,CAAAA,EAAkBR,mBAAlBQ,CAAAA,EAAwCN,WAAxCM"}
@@ -1,13 +1,15 @@
1
1
  //#region src/utils/getOrCreateCodeNode.ts
2
- function getOrCreateCodeNode({ code, pre, columnType, rowSpan } = {}) {
2
+ function getOrCreateCodeNode({ code, pre, columnType, rowSpan, containerSize = false } = {}) {
3
3
  if (code == null) {
4
4
  code = document.createElement("code");
5
- code.dataset.code = "";
6
- if (columnType != null) code.dataset[columnType] = "";
5
+ code.setAttribute("data-code", "");
6
+ if (columnType != null) code.setAttribute(`data-${columnType}`, "");
7
7
  pre?.appendChild(code);
8
8
  }
9
9
  if (rowSpan != null) code.style.setProperty("grid-row", `span ${rowSpan}`);
10
10
  else code.style.removeProperty("grid-row");
11
+ if (containerSize) code.setAttribute("data-container-size", "");
12
+ else code.removeAttribute("data-container-size");
11
13
  return code;
12
14
  }
13
15
 
@@ -1 +1 @@
1
- {"version":3,"file":"getOrCreateCodeNode.js","names":[],"sources":["../../src/utils/getOrCreateCodeNode.ts"],"sourcesContent":["interface CreateCodeNodeProps {\n pre?: HTMLPreElement;\n code?: HTMLElement;\n columnType?: 'additions' | 'deletions' | 'unified';\n rowSpan?: number;\n}\n\nexport function getOrCreateCodeNode({\n code,\n pre,\n columnType,\n rowSpan,\n}: CreateCodeNodeProps = {}): HTMLElement {\n if (code == null) {\n code = document.createElement('code');\n code.dataset.code = '';\n if (columnType != null) {\n code.dataset[columnType] = '';\n }\n pre?.appendChild(code);\n }\n if (rowSpan != null) {\n code.style.setProperty('grid-row', `span ${rowSpan}`);\n } else {\n code.style.removeProperty('grid-row');\n }\n return code;\n}\n"],"mappings":";AAOA,SAAgB,oBAAoB,EAClC,MACA,KACA,YACA,YACuB,EAAE,EAAe;AACxC,KAAI,QAAQ,MAAM;AAChB,SAAO,SAAS,cAAc,OAAO;AACrC,OAAK,QAAQ,OAAO;AACpB,MAAI,cAAc,KAChB,MAAK,QAAQ,cAAc;AAE7B,OAAK,YAAY,KAAK;;AAExB,KAAI,WAAW,KACb,MAAK,MAAM,YAAY,YAAY,QAAQ,UAAU;KAErD,MAAK,MAAM,eAAe,WAAW;AAEvC,QAAO"}
1
+ {"version":3,"file":"getOrCreateCodeNode.js","names":[],"sources":["../../src/utils/getOrCreateCodeNode.ts"],"sourcesContent":["interface CreateCodeNodeProps {\n pre?: HTMLPreElement;\n code?: HTMLElement;\n columnType?: 'additions' | 'deletions' | 'unified';\n rowSpan?: number;\n containerSize?: boolean;\n}\n\nexport function getOrCreateCodeNode({\n code,\n pre,\n columnType,\n rowSpan,\n containerSize = false,\n}: CreateCodeNodeProps = {}): HTMLElement {\n if (code == null) {\n code = document.createElement('code');\n code.setAttribute('data-code', '');\n if (columnType != null) {\n code.setAttribute(`data-${columnType}`, '');\n }\n pre?.appendChild(code);\n }\n if (rowSpan != null) {\n code.style.setProperty('grid-row', `span ${rowSpan}`);\n } else {\n code.style.removeProperty('grid-row');\n }\n if (containerSize) {\n code.setAttribute('data-container-size', '');\n } else {\n code.removeAttribute('data-container-size');\n }\n return code;\n}\n"],"mappings":";AAQA,SAAgB,oBAAoB,EAClC,MACA,KACA,YACA,SACA,gBAAgB,UACO,EAAE,EAAe;AACxC,KAAI,QAAQ,MAAM;AAChB,SAAO,SAAS,cAAc,OAAO;AACrC,OAAK,aAAa,aAAa,GAAG;AAClC,MAAI,cAAc,KAChB,MAAK,aAAa,QAAQ,cAAc,GAAG;AAE7C,OAAK,YAAY,KAAK;;AAExB,KAAI,WAAW,KACb,MAAK,MAAM,YAAY,YAAY,QAAQ,UAAU;KAErD,MAAK,MAAM,eAAe,WAAW;AAEvC,KAAI,cACF,MAAK,aAAa,uBAAuB,GAAG;KAE5C,MAAK,gBAAgB,sBAAsB;AAE7C,QAAO"}
@@ -71,7 +71,7 @@ declare class WorkerPoolManager {
71
71
  private _queuedDrain;
72
72
  private queueDrain;
73
73
  private assignWorkerToTask;
74
- private clearWorkerTask;
74
+ private cleanWorkerAndTask;
75
75
  private executeTask;
76
76
  private getAvailableWorker;
77
77
  private generateRequestId;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPoolManager.d.ts","names":["LRUMapPkg","FileContents","FileDiffMetadata","HunkExpansionRegion","RenderDiffOptions","RenderDiffResult","RenderFileOptions","RenderFileResult","SupportedLanguages","ThemedDiffResult","ThemedFileResult","DiffRendererInstance","FileRendererInstance","WorkerInitializationRenderOptions","WorkerPoolOptions","WorkerRenderingOptions","WorkerStats","GetCachesResult","LRUMap","ThemeSubscriber","WorkerPoolManager","langs","theme","lineDiffType","tokenizeMaxLineLength","preferredHighlighter","Partial","Promise","Map"],"sources":["../../src/worker/WorkerPoolManager.d.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\nimport type { FileContents, FileDiffMetadata, HunkExpansionRegion, RenderDiffOptions, RenderDiffResult, RenderFileOptions, RenderFileResult, SupportedLanguages, ThemedDiffResult, ThemedFileResult } from '../types';\nimport type { DiffRendererInstance, FileRendererInstance, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerStats } from './types';\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\ninterface ThemeSubscriber {\n rerender(): void;\n}\nexport declare class WorkerPoolManager {\n private options;\n private highlighter;\n private readonly preferredHighlighter;\n private renderOptions;\n private initialized;\n private workers;\n private taskQueue;\n private pendingTasks;\n private nextRequestId;\n private themeSubscribers;\n private workersFailed;\n private instanceRequestMap;\n private statSubscribers;\n private fileCache;\n private diffCache;\n private _queuedBroadcast;\n constructor(options: WorkerPoolOptions, { langs, theme, lineDiffType, tokenizeMaxLineLength, preferredHighlighter }: WorkerInitializationRenderOptions);\n isWorkingPool(): boolean;\n getFileResultCache(file: FileContents): RenderFileResult | undefined;\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined;\n inspectCaches(): GetCachesResult;\n evictFileFromCache(cacheKey: string): boolean;\n evictDiffFromCache(cacheKey: string): boolean;\n setRenderOptions({ theme, lineDiffType, tokenizeMaxLineLength }: Partial<WorkerRenderingOptions>): Promise<void>;\n getFileRenderOptions(): RenderFileOptions;\n getDiffRenderOptions(): RenderDiffOptions;\n private setRenderOptionsOnWorkers;\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void;\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void;\n subscribeToStatChanges(callback: (stats: WorkerStats) => unknown): () => void;\n private queueBroadcastStateChanges;\n private _broadcastStateChanges;\n cleanUpPendingTasks(instance: FileRendererInstance | DiffRendererInstance): void;\n isInitialized(): boolean;\n initialize(languages?: SupportedLanguages[]): Promise<void>;\n private initializeWorkers;\n private drainQueue;\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void;\n getPlainFileAST(file: FileContents, startingLine: number, totalLines: number, lines?: string[]): ThemedFileResult | undefined;\n highlightDiffAST(instance: DiffRendererInstance, diff: FileDiffMetadata): void;\n getPlainDiffAST(diff: FileDiffMetadata, startingLine: number, totalLines: number, expandedHunks?: Map<number, HunkExpansionRegion> | true, collapsedContextThreshold?: number): ThemedDiffResult | undefined;\n terminate(): void;\n private terminateWorkers;\n getStats(): WorkerStats;\n private submitTask;\n private resolveLanguagesAndExecuteTask;\n private handleWorkerMessage;\n private _queuedDrain;\n private queueDrain;\n private assignWorkerToTask;\n private clearWorkerTask;\n private executeTask;\n private getAvailableWorker;\n private generateRequestId;\n}\nexport {};\n//# sourceMappingURL=WorkerPoolManager.d.ts.map"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerPoolManager.d.ts","names":["LRUMapPkg","FileContents","FileDiffMetadata","HunkExpansionRegion","RenderDiffOptions","RenderDiffResult","RenderFileOptions","RenderFileResult","SupportedLanguages","ThemedDiffResult","ThemedFileResult","DiffRendererInstance","FileRendererInstance","WorkerInitializationRenderOptions","WorkerPoolOptions","WorkerRenderingOptions","WorkerStats","GetCachesResult","LRUMap","ThemeSubscriber","WorkerPoolManager","langs","theme","lineDiffType","tokenizeMaxLineLength","preferredHighlighter","Partial","Promise","Map"],"sources":["../../src/worker/WorkerPoolManager.d.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\nimport type { FileContents, FileDiffMetadata, HunkExpansionRegion, RenderDiffOptions, RenderDiffResult, RenderFileOptions, RenderFileResult, SupportedLanguages, ThemedDiffResult, ThemedFileResult } from '../types';\nimport type { DiffRendererInstance, FileRendererInstance, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerStats } from './types';\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\ninterface ThemeSubscriber {\n rerender(): void;\n}\nexport declare class WorkerPoolManager {\n private options;\n private highlighter;\n private readonly preferredHighlighter;\n private renderOptions;\n private initialized;\n private workers;\n private taskQueue;\n private pendingTasks;\n private nextRequestId;\n private themeSubscribers;\n private workersFailed;\n private instanceRequestMap;\n private statSubscribers;\n private fileCache;\n private diffCache;\n private _queuedBroadcast;\n constructor(options: WorkerPoolOptions, { langs, theme, lineDiffType, tokenizeMaxLineLength, preferredHighlighter }: WorkerInitializationRenderOptions);\n isWorkingPool(): boolean;\n getFileResultCache(file: FileContents): RenderFileResult | undefined;\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined;\n inspectCaches(): GetCachesResult;\n evictFileFromCache(cacheKey: string): boolean;\n evictDiffFromCache(cacheKey: string): boolean;\n setRenderOptions({ theme, lineDiffType, tokenizeMaxLineLength }: Partial<WorkerRenderingOptions>): Promise<void>;\n getFileRenderOptions(): RenderFileOptions;\n getDiffRenderOptions(): RenderDiffOptions;\n private setRenderOptionsOnWorkers;\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void;\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void;\n subscribeToStatChanges(callback: (stats: WorkerStats) => unknown): () => void;\n private queueBroadcastStateChanges;\n private _broadcastStateChanges;\n cleanUpPendingTasks(instance: FileRendererInstance | DiffRendererInstance): void;\n isInitialized(): boolean;\n initialize(languages?: SupportedLanguages[]): Promise<void>;\n private initializeWorkers;\n private drainQueue;\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void;\n getPlainFileAST(file: FileContents, startingLine: number, totalLines: number, lines?: string[]): ThemedFileResult | undefined;\n highlightDiffAST(instance: DiffRendererInstance, diff: FileDiffMetadata): void;\n getPlainDiffAST(diff: FileDiffMetadata, startingLine: number, totalLines: number, expandedHunks?: Map<number, HunkExpansionRegion> | true, collapsedContextThreshold?: number): ThemedDiffResult | undefined;\n terminate(): void;\n private terminateWorkers;\n getStats(): WorkerStats;\n private submitTask;\n private resolveLanguagesAndExecuteTask;\n private handleWorkerMessage;\n private _queuedDrain;\n private queueDrain;\n private assignWorkerToTask;\n private cleanWorkerAndTask;\n private executeTask;\n private getAvailableWorker;\n private generateRequestId;\n}\nexport {};\n//# sourceMappingURL=WorkerPoolManager.d.ts.map"],"mappings":"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"}
@@ -391,7 +391,7 @@ var WorkerPoolManager = class {
391
391
  else task.request.resolvedLanguages = await resolveLanguages(workerMissingLangs);
392
392
  this.executeTask(availableWorker, task);
393
393
  } catch {
394
- this.clearWorkerTask(task, availableWorker);
394
+ this.cleanWorkerAndTask(availableWorker, task);
395
395
  }
396
396
  }
397
397
  handleWorkerMessage(managedWorker, response) {
@@ -442,7 +442,7 @@ var WorkerPoolManager = class {
442
442
  } catch (error) {
443
443
  if (error !== IGNORE_RESPONSE) console.error(error, task, response);
444
444
  }
445
- if (task != null) this.clearWorkerTask(task, managedWorker);
445
+ this.cleanWorkerAndTask(managedWorker, task);
446
446
  this.queueBroadcastStateChanges();
447
447
  if (this.taskQueue.size > 0) this.queueDrain();
448
448
  }
@@ -460,10 +460,12 @@ var WorkerPoolManager = class {
460
460
  }
461
461
  this.pendingTasks.set(task.id, task);
462
462
  }
463
- clearWorkerTask(task, managedWorker) {
463
+ cleanWorkerAndTask(managedWorker, task) {
464
464
  managedWorker.request_id = void 0;
465
- if ("instance" in task) this.instanceRequestMap.delete(task.instance);
466
- this.pendingTasks.delete(task.id);
465
+ if (task != null) {
466
+ if ("instance" in task) this.instanceRequestMap.delete(task.instance);
467
+ this.pendingTasks.delete(task.id);
468
+ }
467
469
  }
468
470
  executeTask(managedWorker, task) {
469
471
  this.assignWorkerToTask(task, managedWorker);
@@ -471,7 +473,7 @@ var WorkerPoolManager = class {
471
473
  try {
472
474
  managedWorker.worker.postMessage(task.request);
473
475
  } catch (error) {
474
- this.clearWorkerTask(task, managedWorker);
476
+ this.cleanWorkerAndTask(managedWorker, task);
475
477
  console.error("Failed to post message to worker:", error);
476
478
  if ("instance" in task) task.instance.onHighlightError(error);
477
479
  else if ("reject" in task) task.reject(error);
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPoolManager.js","names":["options: WorkerPoolOptions","newRenderOptions: WorkerRenderingOptions","resolvedThemes: ThemeRegistrationResolved[]","taskPromises: Promise<void>[]","task: SetRenderOptionsWorkerTask","resolvedLanguages: ResolvedLanguage[]","initPromises: Promise<unknown>[]","managedWorker: ManagedWorker","task: InitializeWorkerTask","task: RenderFileTask | RenderDiffTask","worker: ManagedWorker | undefined"],"sources":["../../src/worker/WorkerPoolManager.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport { getResolvedLanguages } from '../highlighter/languages/getResolvedLanguages';\nimport { hasResolvedLanguages } from '../highlighter/languages/hasResolvedLanguages';\nimport { resolveLanguages } from '../highlighter/languages/resolveLanguages';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { attachResolvedThemes } from '../highlighter/themes/attachResolvedThemes';\nimport { getResolvedThemes } from '../highlighter/themes/getResolvedThemes';\nimport { hasResolvedThemes } from '../highlighter/themes/hasResolvedThemes';\nimport { resolveThemes } from '../highlighter/themes/resolveThemes';\nimport type {\n DiffsHighlighter,\n FileContents,\n FileDiffMetadata,\n HighlighterTypes,\n HunkExpansionRegion,\n RenderDiffOptions,\n RenderDiffResult,\n RenderFileOptions,\n RenderFileResult,\n SupportedLanguages,\n ThemedDiffResult,\n ThemedFileResult,\n ThemeRegistrationResolved,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getThemes } from '../utils/getThemes';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport { renderFileWithHighlighter } from '../utils/renderFileWithHighlighter';\nimport type {\n AllWorkerTasks,\n DiffRendererInstance,\n FileRendererInstance,\n InitializeWorkerTask,\n RenderDiffRequest,\n RenderDiffTask,\n RenderFileRequest,\n RenderFileTask,\n ResolvedLanguage,\n SetRenderOptionsWorkerTask,\n SubmitRequest,\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n WorkerRenderingOptions,\n WorkerRequestId,\n WorkerResponse,\n WorkerStats,\n} from './types';\n\nconst IGNORE_RESPONSE = Symbol('IGNORE_RESPONSE');\n\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n request_id: string | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n}\n\ninterface ThemeSubscriber {\n rerender(): void;\n}\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private readonly preferredHighlighter: HighlighterTypes;\n private renderOptions: WorkerRenderingOptions;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n private taskQueue = new Map<\n FileRendererInstance | DiffRendererInstance,\n RenderDiffTask | RenderFileTask\n >();\n private pendingTasks = new Map<WorkerRequestId, AllWorkerTasks>();\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\n private instanceRequestMap = new Map<\n FileRendererInstance | DiffRendererInstance,\n string\n >();\n private statSubscribers = new Set<(stats: WorkerStats) => unknown>();\n private fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n private diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n private _queuedBroadcast: number | undefined;\n\n constructor(\n private options: WorkerPoolOptions,\n {\n langs,\n theme = DEFAULT_THEMES,\n lineDiffType = 'word-alt',\n tokenizeMaxLineLength = 1000,\n preferredHighlighter = 'shiki-js',\n }: WorkerInitializationRenderOptions\n ) {\n this.preferredHighlighter = preferredHighlighter;\n this.renderOptions = { theme, lineDiffType, tokenizeMaxLineLength };\n this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n void this.initialize(langs);\n }\n\n isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n evictDiffFromCache(cacheKey: string): boolean {\n try {\n return this.diffCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n async setRenderOptions({\n theme = DEFAULT_THEMES,\n lineDiffType = 'word-alt',\n tokenizeMaxLineLength = 1000,\n }: Partial<WorkerRenderingOptions>): Promise<void> {\n const newRenderOptions: WorkerRenderingOptions = {\n theme,\n lineDiffType,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const themesEqual = areThemesEqual(\n newRenderOptions.theme,\n this.renderOptions.theme\n );\n if (\n themesEqual &&\n newRenderOptions.lineDiffType === this.renderOptions.lineDiffType &&\n newRenderOptions.tokenizeMaxLineLength ===\n this.renderOptions.tokenizeMaxLineLength\n ) {\n return;\n }\n\n const themeNames = getThemes(theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (!themesEqual) {\n if (hasResolvedThemes(themeNames)) {\n resolvedThemes = getResolvedThemes(themeNames);\n } else {\n resolvedThemes = await resolveThemes(themeNames);\n }\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n await this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes);\n } else {\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes: themeNames,\n langs: ['text'],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes),\n ]);\n this.highlighter = highlighter;\n }\n\n this.renderOptions = newRenderOptions;\n this.diffCache.clear();\n this.fileCache.clear();\n\n for (const instance of this.themeSubscribers) {\n instance.rerender();\n }\n }\n\n getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme } = this.renderOptions;\n return { theme, tokenizeMaxLineLength };\n }\n\n getDiffRenderOptions(): RenderDiffOptions {\n return { ...this.renderOptions };\n }\n\n private async setRenderOptionsOnWorkers(\n renderOptions: WorkerRenderingOptions,\n resolvedThemes: ThemeRegistrationResolved[]\n ): Promise<void> {\n if (this.workersFailed) {\n return;\n }\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const taskPromises: Promise<void>[] = [];\n for (const managedWorker of this.workers) {\n if (!managedWorker.initialized) {\n console.log({ managedWorker });\n throw new Error(\n 'setRenderOptionsOnWorkers: Somehow we have an uninitialized worker'\n );\n }\n taskPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: SetRenderOptionsWorkerTask = {\n type: 'set-render-options',\n id,\n request: {\n type: 'set-render-options',\n id,\n renderOptions,\n resolvedThemes,\n },\n resolve,\n reject,\n requestStart: Date.now(),\n };\n // NOTE(amadeus): We intentionally ignore the normal pending requests\n // infra because these tasks should technically interrupt the normal\n // flow and should be processed by the worker when ready immediately\n this.pendingTasks.set(id, task);\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void {\n this.themeSubscribers.add(instance);\n this.queueBroadcastStateChanges();\n return () => {\n this.unsubscribeToThemeChanges(instance);\n this.queueBroadcastStateChanges();\n };\n }\n\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n subscribeToStatChanges(\n callback: (stats: WorkerStats) => unknown\n ): () => void {\n this.statSubscribers.add(callback);\n callback(this.getStats());\n return () => {\n this.statSubscribers.delete(callback);\n };\n }\n\n private queueBroadcastStateChanges() {\n if (this._queuedBroadcast != null) return;\n this._queuedBroadcast = requestAnimationFrame(this._broadcastStateChanges);\n }\n\n private _broadcastStateChanges = () => {\n if (this._queuedBroadcast != null) {\n cancelAnimationFrame(this._queuedBroadcast);\n this._queuedBroadcast = undefined;\n }\n const stats = this.getStats();\n for (const callback of this.statSubscribers) {\n callback(stats);\n }\n };\n\n cleanUpPendingTasks(\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n this.taskQueue.delete(instance);\n const requestId = this.instanceRequestMap.get(instance);\n if (requestId != null) {\n this.pendingTasks.delete(requestId);\n this.instanceRequestMap.delete(instance);\n }\n this.queueBroadcastStateChanges();\n }\n\n isInitialized(): boolean {\n return this.initialized === true;\n }\n\n async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\n this.initialized = new Promise((resolve, reject) => {\n void (async () => {\n try {\n const themes = getThemes(this.renderOptions.theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (hasResolvedThemes(themes)) {\n resolvedThemes = getResolvedThemes(themes);\n } else {\n resolvedThemes = await resolveThemes(themes);\n }\n\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\n }\n\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes,\n langs: ['text', ...languages],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.initializeWorkers(resolvedThemes, resolvedLanguages),\n ]);\n\n // If we were terminated while initializing, we should probably kill\n // any workers that may have been created\n if (this.initialized === false) {\n this.terminateWorkers();\n throw new Error(\n 'WorkerPoolManager: workers failed to initialize'\n );\n }\n this.highlighter = highlighter;\n this.initialized = true;\n this.diffCache.clear();\n this.fileCache.clear();\n this.drainQueue();\n this.queueBroadcastStateChanges();\n resolve();\n } catch (e) {\n this.initialized = false;\n this.workersFailed = true;\n this.queueBroadcastStateChanges();\n reject(e);\n }\n })();\n });\n this.queueBroadcastStateChanges();\n } else {\n return this.initialized;\n }\n }\n\n private async initializeWorkers(\n resolvedThemes: ThemeRegistrationResolved[],\n resolvedLanguages: ResolvedLanguage[]\n ): Promise<void> {\n this.workersFailed = false;\n const initPromises: Promise<unknown>[] = [];\n if (this.workers.length > 0) {\n this.terminateWorkers();\n }\n for (let i = 0; i < (this.options.poolSize ?? 8); i++) {\n const worker = this.options.workerFactory();\n const managedWorker: ManagedWorker = {\n worker,\n request_id: undefined,\n initialized: false,\n langs: new Set(['text', ...resolvedLanguages.map(({ name }) => name)]),\n };\n worker.addEventListener(\n 'message',\n (event: MessageEvent<WorkerResponse>) => {\n this.handleWorkerMessage(managedWorker, event.data);\n }\n );\n worker.addEventListener('error', (error) =>\n console.error('Worker error:', error, managedWorker)\n );\n this.workers.push(managedWorker);\n initPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: InitializeWorkerTask = {\n type: 'initialize',\n id,\n request: {\n type: 'initialize',\n id,\n renderOptions: this.renderOptions,\n preferredHighlighter: this.preferredHighlighter,\n resolvedThemes,\n resolvedLanguages,\n },\n resolve() {\n managedWorker.initialized = true;\n resolve();\n },\n reject,\n requestStart: Date.now(),\n };\n this.pendingTasks.set(id, task);\n this.executeTask(managedWorker, task);\n })\n );\n }\n await Promise.all(initPromises);\n }\n\n private drainQueue = () => {\n this._queuedDrain = undefined;\n // If we are initializing or things got cancelled while initializing, we\n // should not attempt to drain the queue\n if (this.initialized !== true || this.taskQueue.size === 0) {\n return;\n }\n for (const [instance, task] of this.taskQueue) {\n // If we have a request in progress for the same instance, we should wait\n // for it to finish\n if (this.instanceRequestMap.has(instance)) {\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void {\n const computedLang = file.lang ?? getFiletypeFromFileName(file.name);\n if (computedLang === 'text') return;\n // If we already have a task in progress for this same file content, we\n // should drop it\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'file' &&\n areFilesEqual(file, task.request.file)\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'file', file });\n }\n\n getPlainFileAST(\n file: FileContents,\n startingLine: number,\n totalLines: number,\n lines?: string[]\n ): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n void this.initialize();\n return undefined;\n }\n return renderFileWithHighlighter(\n file,\n this.highlighter,\n this.renderOptions,\n { forcePlainText: true, startingLine, totalLines, lines }\n );\n }\n\n highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n const computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n if (computedLang === 'text') return;\n // If we already have a task in progress for this same diff content, we\n // should ignore executing it again\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'diff' &&\n task.request.diff === diff\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'diff', diff });\n }\n\n getPlainDiffAST(\n diff: FileDiffMetadata,\n startingLine: number,\n totalLines: number,\n expandedHunks?: Map<number, HunkExpansionRegion> | true,\n collapsedContextThreshold?: number\n ): ThemedDiffResult | undefined {\n return this.highlighter != null\n ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, {\n forcePlainText: true,\n startingLine,\n totalLines,\n expandedHunks,\n collapsedContextThreshold,\n })\n : undefined;\n }\n\n terminate(): void {\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.instanceRequestMap.clear();\n this.taskQueue.clear();\n this.pendingTasks.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n this.queueBroadcastStateChanges();\n }\n\n private terminateWorkers() {\n for (const managedWorker of this.workers) {\n managedWorker.worker.terminate();\n }\n this.workers.length = 0;\n }\n\n getStats(): WorkerStats {\n return {\n managerState: (() => {\n if (this.initialized === false) {\n return 'waiting';\n }\n if (this.initialized !== true) {\n return 'initializing';\n }\n return 'initialized';\n })(),\n totalWorkers: this.workers.length,\n workersFailed: this.workersFailed,\n busyWorkers: this.workers.filter((w) => w.request_id != null).length,\n queuedTasks: this.taskQueue.size,\n pendingTasks: this.pendingTasks.size,\n themeSubscribers: this.themeSubscribers.size,\n fileCacheSize: this.fileCache.size,\n diffCacheSize: this.diffCache.size,\n };\n }\n\n private submitTask(\n instance: FileRendererInstance,\n request: Omit<RenderFileRequest, 'id'>\n ): void;\n private submitTask(\n instance: DiffRendererInstance,\n request: Omit<RenderDiffRequest, 'id'>\n ): void;\n private submitTask(\n instance: FileRendererInstance | DiffRendererInstance,\n request: SubmitRequest\n ): void {\n if (this.initialized === false) {\n void this.initialize();\n }\n\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const task: RenderFileTask | RenderDiffTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instance: instance as FileRendererInstance,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instance: instance as DiffRendererInstance,\n requestStart,\n };\n }\n })();\n\n this.taskQueue.set(instance, task);\n this.queueDrain();\n }\n\n private async resolveLanguagesAndExecuteTask(\n availableWorker: ManagedWorker,\n task: RenderFileTask | RenderDiffTask,\n langs: SupportedLanguages[]\n ): Promise<void> {\n try {\n // Add resolved languages if required\n const workerMissingLangs = langs.filter(\n (lang) => !availableWorker.langs.has(lang)\n );\n\n if (workerMissingLangs.length > 0) {\n if (hasResolvedLanguages(workerMissingLangs)) {\n task.request.resolvedLanguages =\n getResolvedLanguages(workerMissingLangs);\n } else {\n task.request.resolvedLanguages =\n await resolveLanguages(workerMissingLangs);\n }\n }\n this.executeTask(availableWorker, task);\n } catch {\n this.clearWorkerTask(task, availableWorker);\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.pendingTasks.get(response.id);\n try {\n if (task == null) {\n // If we can't find a task for this response, it probably means the\n // component has been unmounted, so we should silently ignore it\n throw IGNORE_RESPONSE;\n } else if (response.type === 'error') {\n const error = new Error(response.error);\n if (response.stack) {\n error.stack = response.stack;\n }\n if ('reject' in task) {\n task.reject(error);\n } else {\n task.instance.onHighlightError(error);\n }\n throw error;\n } else {\n // If we've gotten a newer request from the same instance, we should\n // ignore this response either because it's out of order or because we\n // have a newer more important request\n if (\n 'instance' in task &&\n this.instanceRequestMap.get(task.instance) !== response.id\n ) {\n throw IGNORE_RESPONSE;\n }\n switch (response.requestType) {\n case 'initialize':\n if (task.type !== 'initialize') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'set-render-options':\n if (task.type !== 'set-render-options') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'file': {\n if (task.type !== 'file') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n const { instance, request } = task;\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.file, result, options);\n break;\n }\n case 'diff': {\n if (task.type !== 'diff') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n const { instance, request } = task;\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.diff, result, options);\n break;\n }\n }\n }\n } catch (error) {\n if (error !== IGNORE_RESPONSE) {\n console.error(error, task, response);\n }\n }\n\n if (task != null) {\n this.clearWorkerTask(task, managedWorker);\n }\n this.queueBroadcastStateChanges();\n if (this.taskQueue.size > 0) {\n // We queue drain so that potentially multiple workers can free up\n // allowing for better language matches if possible\n this.queueDrain();\n }\n }\n\n private _queuedDrain: Promise<void> | undefined;\n private queueDrain() {\n if (this._queuedDrain != null) return;\n this._queuedDrain = Promise.resolve().then(this.drainQueue);\n this.queueBroadcastStateChanges();\n }\n\n private assignWorkerToTask(\n task: AllWorkerTasks,\n managedWorker: ManagedWorker\n ) {\n managedWorker.request_id = task.id;\n if ('instance' in task) {\n this.taskQueue.delete(task.instance);\n this.instanceRequestMap.set(task.instance, task.id);\n }\n this.pendingTasks.set(task.id, task);\n }\n\n private clearWorkerTask(task: AllWorkerTasks, managedWorker: ManagedWorker) {\n managedWorker.request_id = undefined;\n if ('instance' in task) {\n this.instanceRequestMap.delete(task.instance);\n }\n this.pendingTasks.delete(task.id);\n }\n\n private executeTask(\n managedWorker: ManagedWorker,\n task: AllWorkerTasks\n ): void {\n this.assignWorkerToTask(task, managedWorker);\n for (const lang of getLangsFromTask(task)) {\n managedWorker.langs.add(lang);\n }\n try {\n managedWorker.worker.postMessage(task.request);\n } catch (error) {\n this.clearWorkerTask(task, managedWorker);\n console.error('Failed to post message to worker:', error);\n if ('instance' in task) {\n task.instance.onHighlightError(error);\n } else if ('reject' in task) {\n task.reject(error as Error);\n }\n }\n this.queueBroadcastStateChanges();\n }\n\n private getAvailableWorker(\n langs: SupportedLanguages[]\n ): ManagedWorker | undefined {\n let worker: ManagedWorker | undefined;\n for (const managedWorker of this.workers) {\n if (managedWorker.request_id != null || !managedWorker.initialized) {\n continue;\n }\n worker = managedWorker;\n if (langs.length === 0) {\n break;\n }\n let hasEveryLang = true;\n for (const lang of langs) {\n if (!managedWorker.langs.has(lang)) {\n hasEveryLang = false;\n break;\n }\n }\n if (hasEveryLang) {\n break;\n }\n }\n return worker;\n }\n\n private generateRequestId(): WorkerRequestId {\n return `req_${++this.nextRequestId}`;\n }\n}\n\nfunction getLangsFromTask(task: AllWorkerTasks): SupportedLanguages[] {\n const langs = new Set<SupportedLanguages>();\n if (task.type === 'initialize' || task.type === 'set-render-options') {\n return [];\n }\n switch (task.type) {\n case 'file': {\n langs.add(\n task.request.file.lang ??\n getFiletypeFromFileName(task.request.file.name)\n );\n break;\n }\n case 'diff': {\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.name)\n );\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.prevName ?? '-')\n );\n break;\n }\n }\n langs.delete('text');\n return Array.from(langs);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerPoolManager.js","names":["options: WorkerPoolOptions","newRenderOptions: WorkerRenderingOptions","resolvedThemes: ThemeRegistrationResolved[]","taskPromises: Promise<void>[]","task: SetRenderOptionsWorkerTask","resolvedLanguages: ResolvedLanguage[]","initPromises: Promise<unknown>[]","managedWorker: ManagedWorker","task: InitializeWorkerTask","task: RenderFileTask | RenderDiffTask","worker: ManagedWorker | undefined"],"sources":["../../src/worker/WorkerPoolManager.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport { getResolvedLanguages } from '../highlighter/languages/getResolvedLanguages';\nimport { hasResolvedLanguages } from '../highlighter/languages/hasResolvedLanguages';\nimport { resolveLanguages } from '../highlighter/languages/resolveLanguages';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { attachResolvedThemes } from '../highlighter/themes/attachResolvedThemes';\nimport { getResolvedThemes } from '../highlighter/themes/getResolvedThemes';\nimport { hasResolvedThemes } from '../highlighter/themes/hasResolvedThemes';\nimport { resolveThemes } from '../highlighter/themes/resolveThemes';\nimport type {\n DiffsHighlighter,\n FileContents,\n FileDiffMetadata,\n HighlighterTypes,\n HunkExpansionRegion,\n RenderDiffOptions,\n RenderDiffResult,\n RenderFileOptions,\n RenderFileResult,\n SupportedLanguages,\n ThemedDiffResult,\n ThemedFileResult,\n ThemeRegistrationResolved,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getThemes } from '../utils/getThemes';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport { renderFileWithHighlighter } from '../utils/renderFileWithHighlighter';\nimport type {\n AllWorkerTasks,\n DiffRendererInstance,\n FileRendererInstance,\n InitializeWorkerTask,\n RenderDiffRequest,\n RenderDiffTask,\n RenderFileRequest,\n RenderFileTask,\n ResolvedLanguage,\n SetRenderOptionsWorkerTask,\n SubmitRequest,\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n WorkerRenderingOptions,\n WorkerRequestId,\n WorkerResponse,\n WorkerStats,\n} from './types';\n\nconst IGNORE_RESPONSE = Symbol('IGNORE_RESPONSE');\n\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n request_id: string | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n}\n\ninterface ThemeSubscriber {\n rerender(): void;\n}\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private readonly preferredHighlighter: HighlighterTypes;\n private renderOptions: WorkerRenderingOptions;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n private taskQueue = new Map<\n FileRendererInstance | DiffRendererInstance,\n RenderDiffTask | RenderFileTask\n >();\n private pendingTasks = new Map<WorkerRequestId, AllWorkerTasks>();\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\n private instanceRequestMap = new Map<\n FileRendererInstance | DiffRendererInstance,\n string\n >();\n private statSubscribers = new Set<(stats: WorkerStats) => unknown>();\n private fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n private diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n private _queuedBroadcast: number | undefined;\n\n constructor(\n private options: WorkerPoolOptions,\n {\n langs,\n theme = DEFAULT_THEMES,\n lineDiffType = 'word-alt',\n tokenizeMaxLineLength = 1000,\n preferredHighlighter = 'shiki-js',\n }: WorkerInitializationRenderOptions\n ) {\n this.preferredHighlighter = preferredHighlighter;\n this.renderOptions = { theme, lineDiffType, tokenizeMaxLineLength };\n this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n void this.initialize(langs);\n }\n\n isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n evictDiffFromCache(cacheKey: string): boolean {\n try {\n return this.diffCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n async setRenderOptions({\n theme = DEFAULT_THEMES,\n lineDiffType = 'word-alt',\n tokenizeMaxLineLength = 1000,\n }: Partial<WorkerRenderingOptions>): Promise<void> {\n const newRenderOptions: WorkerRenderingOptions = {\n theme,\n lineDiffType,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const themesEqual = areThemesEqual(\n newRenderOptions.theme,\n this.renderOptions.theme\n );\n if (\n themesEqual &&\n newRenderOptions.lineDiffType === this.renderOptions.lineDiffType &&\n newRenderOptions.tokenizeMaxLineLength ===\n this.renderOptions.tokenizeMaxLineLength\n ) {\n return;\n }\n\n const themeNames = getThemes(theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (!themesEqual) {\n if (hasResolvedThemes(themeNames)) {\n resolvedThemes = getResolvedThemes(themeNames);\n } else {\n resolvedThemes = await resolveThemes(themeNames);\n }\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n await this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes);\n } else {\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes: themeNames,\n langs: ['text'],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes),\n ]);\n this.highlighter = highlighter;\n }\n\n this.renderOptions = newRenderOptions;\n this.diffCache.clear();\n this.fileCache.clear();\n\n for (const instance of this.themeSubscribers) {\n instance.rerender();\n }\n }\n\n getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme } = this.renderOptions;\n return { theme, tokenizeMaxLineLength };\n }\n\n getDiffRenderOptions(): RenderDiffOptions {\n return { ...this.renderOptions };\n }\n\n private async setRenderOptionsOnWorkers(\n renderOptions: WorkerRenderingOptions,\n resolvedThemes: ThemeRegistrationResolved[]\n ): Promise<void> {\n if (this.workersFailed) {\n return;\n }\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const taskPromises: Promise<void>[] = [];\n for (const managedWorker of this.workers) {\n if (!managedWorker.initialized) {\n console.log({ managedWorker });\n throw new Error(\n 'setRenderOptionsOnWorkers: Somehow we have an uninitialized worker'\n );\n }\n taskPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: SetRenderOptionsWorkerTask = {\n type: 'set-render-options',\n id,\n request: {\n type: 'set-render-options',\n id,\n renderOptions,\n resolvedThemes,\n },\n resolve,\n reject,\n requestStart: Date.now(),\n };\n // NOTE(amadeus): We intentionally ignore the normal pending requests\n // infra because these tasks should technically interrupt the normal\n // flow and should be processed by the worker when ready immediately\n this.pendingTasks.set(id, task);\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void {\n this.themeSubscribers.add(instance);\n this.queueBroadcastStateChanges();\n return () => {\n this.unsubscribeToThemeChanges(instance);\n this.queueBroadcastStateChanges();\n };\n }\n\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n subscribeToStatChanges(\n callback: (stats: WorkerStats) => unknown\n ): () => void {\n this.statSubscribers.add(callback);\n callback(this.getStats());\n return () => {\n this.statSubscribers.delete(callback);\n };\n }\n\n private queueBroadcastStateChanges() {\n if (this._queuedBroadcast != null) return;\n this._queuedBroadcast = requestAnimationFrame(this._broadcastStateChanges);\n }\n\n private _broadcastStateChanges = () => {\n if (this._queuedBroadcast != null) {\n cancelAnimationFrame(this._queuedBroadcast);\n this._queuedBroadcast = undefined;\n }\n const stats = this.getStats();\n for (const callback of this.statSubscribers) {\n callback(stats);\n }\n };\n\n cleanUpPendingTasks(\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n this.taskQueue.delete(instance);\n const requestId = this.instanceRequestMap.get(instance);\n if (requestId != null) {\n this.pendingTasks.delete(requestId);\n this.instanceRequestMap.delete(instance);\n }\n this.queueBroadcastStateChanges();\n }\n\n isInitialized(): boolean {\n return this.initialized === true;\n }\n\n async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\n this.initialized = new Promise((resolve, reject) => {\n void (async () => {\n try {\n const themes = getThemes(this.renderOptions.theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (hasResolvedThemes(themes)) {\n resolvedThemes = getResolvedThemes(themes);\n } else {\n resolvedThemes = await resolveThemes(themes);\n }\n\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\n }\n\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes,\n langs: ['text', ...languages],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.initializeWorkers(resolvedThemes, resolvedLanguages),\n ]);\n\n // If we were terminated while initializing, we should probably kill\n // any workers that may have been created\n if (this.initialized === false) {\n this.terminateWorkers();\n throw new Error(\n 'WorkerPoolManager: workers failed to initialize'\n );\n }\n this.highlighter = highlighter;\n this.initialized = true;\n this.diffCache.clear();\n this.fileCache.clear();\n this.drainQueue();\n this.queueBroadcastStateChanges();\n resolve();\n } catch (e) {\n this.initialized = false;\n this.workersFailed = true;\n this.queueBroadcastStateChanges();\n reject(e);\n }\n })();\n });\n this.queueBroadcastStateChanges();\n } else {\n return this.initialized;\n }\n }\n\n private async initializeWorkers(\n resolvedThemes: ThemeRegistrationResolved[],\n resolvedLanguages: ResolvedLanguage[]\n ): Promise<void> {\n this.workersFailed = false;\n const initPromises: Promise<unknown>[] = [];\n if (this.workers.length > 0) {\n this.terminateWorkers();\n }\n for (let i = 0; i < (this.options.poolSize ?? 8); i++) {\n const worker = this.options.workerFactory();\n const managedWorker: ManagedWorker = {\n worker,\n request_id: undefined,\n initialized: false,\n langs: new Set(['text', ...resolvedLanguages.map(({ name }) => name)]),\n };\n worker.addEventListener(\n 'message',\n (event: MessageEvent<WorkerResponse>) => {\n this.handleWorkerMessage(managedWorker, event.data);\n }\n );\n worker.addEventListener('error', (error) =>\n console.error('Worker error:', error, managedWorker)\n );\n this.workers.push(managedWorker);\n initPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: InitializeWorkerTask = {\n type: 'initialize',\n id,\n request: {\n type: 'initialize',\n id,\n renderOptions: this.renderOptions,\n preferredHighlighter: this.preferredHighlighter,\n resolvedThemes,\n resolvedLanguages,\n },\n resolve() {\n managedWorker.initialized = true;\n resolve();\n },\n reject,\n requestStart: Date.now(),\n };\n this.pendingTasks.set(id, task);\n this.executeTask(managedWorker, task);\n })\n );\n }\n await Promise.all(initPromises);\n }\n\n private drainQueue = () => {\n this._queuedDrain = undefined;\n // If we are initializing or things got cancelled while initializing, we\n // should not attempt to drain the queue\n if (this.initialized !== true || this.taskQueue.size === 0) {\n return;\n }\n for (const [instance, task] of this.taskQueue) {\n // If we have a request in progress for the same instance, we should wait\n // for it to finish\n if (this.instanceRequestMap.has(instance)) {\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void {\n const computedLang = file.lang ?? getFiletypeFromFileName(file.name);\n if (computedLang === 'text') return;\n // If we already have a task in progress for this same file content, we\n // should drop it\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'file' &&\n areFilesEqual(file, task.request.file)\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'file', file });\n }\n\n getPlainFileAST(\n file: FileContents,\n startingLine: number,\n totalLines: number,\n lines?: string[]\n ): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n void this.initialize();\n return undefined;\n }\n return renderFileWithHighlighter(\n file,\n this.highlighter,\n this.renderOptions,\n { forcePlainText: true, startingLine, totalLines, lines }\n );\n }\n\n highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n const computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n if (computedLang === 'text') return;\n // If we already have a task in progress for this same diff content, we\n // should ignore executing it again\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'diff' &&\n task.request.diff === diff\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'diff', diff });\n }\n\n getPlainDiffAST(\n diff: FileDiffMetadata,\n startingLine: number,\n totalLines: number,\n expandedHunks?: Map<number, HunkExpansionRegion> | true,\n collapsedContextThreshold?: number\n ): ThemedDiffResult | undefined {\n return this.highlighter != null\n ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, {\n forcePlainText: true,\n startingLine,\n totalLines,\n expandedHunks,\n collapsedContextThreshold,\n })\n : undefined;\n }\n\n terminate(): void {\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.instanceRequestMap.clear();\n this.taskQueue.clear();\n this.pendingTasks.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n this.queueBroadcastStateChanges();\n }\n\n private terminateWorkers() {\n for (const managedWorker of this.workers) {\n managedWorker.worker.terminate();\n }\n this.workers.length = 0;\n }\n\n getStats(): WorkerStats {\n return {\n managerState: (() => {\n if (this.initialized === false) {\n return 'waiting';\n }\n if (this.initialized !== true) {\n return 'initializing';\n }\n return 'initialized';\n })(),\n totalWorkers: this.workers.length,\n workersFailed: this.workersFailed,\n busyWorkers: this.workers.filter((w) => w.request_id != null).length,\n queuedTasks: this.taskQueue.size,\n pendingTasks: this.pendingTasks.size,\n themeSubscribers: this.themeSubscribers.size,\n fileCacheSize: this.fileCache.size,\n diffCacheSize: this.diffCache.size,\n };\n }\n\n private submitTask(\n instance: FileRendererInstance,\n request: Omit<RenderFileRequest, 'id'>\n ): void;\n private submitTask(\n instance: DiffRendererInstance,\n request: Omit<RenderDiffRequest, 'id'>\n ): void;\n private submitTask(\n instance: FileRendererInstance | DiffRendererInstance,\n request: SubmitRequest\n ): void {\n if (this.initialized === false) {\n void this.initialize();\n }\n\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const task: RenderFileTask | RenderDiffTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instance: instance as FileRendererInstance,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instance: instance as DiffRendererInstance,\n requestStart,\n };\n }\n })();\n\n this.taskQueue.set(instance, task);\n this.queueDrain();\n }\n\n private async resolveLanguagesAndExecuteTask(\n availableWorker: ManagedWorker,\n task: RenderFileTask | RenderDiffTask,\n langs: SupportedLanguages[]\n ): Promise<void> {\n try {\n // Add resolved languages if required\n const workerMissingLangs = langs.filter(\n (lang) => !availableWorker.langs.has(lang)\n );\n\n if (workerMissingLangs.length > 0) {\n if (hasResolvedLanguages(workerMissingLangs)) {\n task.request.resolvedLanguages =\n getResolvedLanguages(workerMissingLangs);\n } else {\n task.request.resolvedLanguages =\n await resolveLanguages(workerMissingLangs);\n }\n }\n this.executeTask(availableWorker, task);\n } catch {\n this.cleanWorkerAndTask(availableWorker, task);\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.pendingTasks.get(response.id);\n try {\n if (task == null) {\n // If we can't find a task for this response, it probably means the\n // component has been unmounted, so we should silently ignore it\n throw IGNORE_RESPONSE;\n } else if (response.type === 'error') {\n const error = new Error(response.error);\n if (response.stack) {\n error.stack = response.stack;\n }\n if ('reject' in task) {\n task.reject(error);\n } else {\n task.instance.onHighlightError(error);\n }\n throw error;\n } else {\n // If we've gotten a newer request from the same instance, we should\n // ignore this response either because it's out of order or because we\n // have a newer more important request\n if (\n 'instance' in task &&\n this.instanceRequestMap.get(task.instance) !== response.id\n ) {\n throw IGNORE_RESPONSE;\n }\n switch (response.requestType) {\n case 'initialize':\n if (task.type !== 'initialize') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'set-render-options':\n if (task.type !== 'set-render-options') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'file': {\n if (task.type !== 'file') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n const { instance, request } = task;\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.file, result, options);\n break;\n }\n case 'diff': {\n if (task.type !== 'diff') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n const { instance, request } = task;\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.diff, result, options);\n break;\n }\n }\n }\n } catch (error) {\n if (error !== IGNORE_RESPONSE) {\n console.error(error, task, response);\n }\n }\n\n this.cleanWorkerAndTask(managedWorker, task);\n this.queueBroadcastStateChanges();\n if (this.taskQueue.size > 0) {\n // We queue drain so that potentially multiple workers can free up\n // allowing for better language matches if possible\n this.queueDrain();\n }\n }\n\n private _queuedDrain: Promise<void> | undefined;\n private queueDrain() {\n if (this._queuedDrain != null) return;\n this._queuedDrain = Promise.resolve().then(this.drainQueue);\n this.queueBroadcastStateChanges();\n }\n\n private assignWorkerToTask(\n task: AllWorkerTasks,\n managedWorker: ManagedWorker\n ) {\n managedWorker.request_id = task.id;\n if ('instance' in task) {\n this.taskQueue.delete(task.instance);\n this.instanceRequestMap.set(task.instance, task.id);\n }\n this.pendingTasks.set(task.id, task);\n }\n\n private cleanWorkerAndTask(\n managedWorker: ManagedWorker,\n task?: AllWorkerTasks\n ) {\n managedWorker.request_id = undefined;\n if (task != null) {\n if ('instance' in task) {\n this.instanceRequestMap.delete(task.instance);\n }\n this.pendingTasks.delete(task.id);\n }\n }\n\n private executeTask(\n managedWorker: ManagedWorker,\n task: AllWorkerTasks\n ): void {\n this.assignWorkerToTask(task, managedWorker);\n for (const lang of getLangsFromTask(task)) {\n managedWorker.langs.add(lang);\n }\n try {\n managedWorker.worker.postMessage(task.request);\n } catch (error) {\n this.cleanWorkerAndTask(managedWorker, task);\n console.error('Failed to post message to worker:', error);\n if ('instance' in task) {\n task.instance.onHighlightError(error);\n } else if ('reject' in task) {\n task.reject(error as Error);\n }\n }\n this.queueBroadcastStateChanges();\n }\n\n private getAvailableWorker(\n langs: SupportedLanguages[]\n ): ManagedWorker | undefined {\n let worker: ManagedWorker | undefined;\n for (const managedWorker of this.workers) {\n if (managedWorker.request_id != null || !managedWorker.initialized) {\n continue;\n }\n worker = managedWorker;\n if (langs.length === 0) {\n break;\n }\n let hasEveryLang = true;\n for (const lang of langs) {\n if (!managedWorker.langs.has(lang)) {\n hasEveryLang = false;\n break;\n }\n }\n if (hasEveryLang) {\n break;\n }\n }\n return worker;\n }\n\n private generateRequestId(): WorkerRequestId {\n return `req_${++this.nextRequestId}`;\n }\n}\n\nfunction getLangsFromTask(task: AllWorkerTasks): SupportedLanguages[] {\n const langs = new Set<SupportedLanguages>();\n if (task.type === 'initialize' || task.type === 'set-render-options') {\n return [];\n }\n switch (task.type) {\n case 'file': {\n langs.add(\n task.request.file.lang ??\n getFiletypeFromFileName(task.request.file.name)\n );\n break;\n }\n case 'diff': {\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.name)\n );\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.prevName ?? '-')\n );\n break;\n }\n }\n langs.delete('text');\n return Array.from(langs);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pierre/diffs",
3
- "version": "1.1.0-beta.14",
3
+ "version": "1.1.0-beta.16",
4
4
  "license": "apache-2.0",
5
5
  "files": [
6
6
  "dist",