dsh-claude-design 2.11.1 → 2.12.1

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/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // dsh-claude-design 2.11.1: built from baoyu-design.
1
+ // dsh-claude-design 2.12.1: built from baoyu-design.
2
2
  var define_PLUGIN_default = { name: "claude-design", provider: "dsh-claude-design", skills: [{ name: "claude-design", description: "Make and revise designs in the Design (canvas) artifact format (project/canvas.json plus one .dc.html Design Component file per artboard) as local files, then open them in a local canvas editor where the user can view the artboards side by side, retype copy and adjust tweaks. Use when the user asks for an editable canvas of artboards in this format, names claude-design or the Design (canvas) type, or wants to revise a folder that holds project/canvas.json. Not for a one-off HTML prototype or a design exploration outside this format.", comments: true }] };
3
3
 
4
4
  import { readFile } from "node:fs/promises";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-claude-design",
3
- "version": "2.11.1",
3
+ "version": "2.12.1",
4
4
  "description": "DeepSeek Harness plugin: the claude-design skill from baoyu-design. The agent writes canvases of artboards as files and opens them in a local canvas editor.",
5
5
  "keywords": [
6
6
  "dsh",
@@ -24,6 +24,18 @@
24
24
  "icon": "./icon.svg",
25
25
  "baoyuDesign": {
26
26
  "releaseNotes": [
27
+ {
28
+ "version": "2.12.1",
29
+ "date": "2026-11-07",
30
+ "en": "### Fixes\n- **A long comment thread no longer runs off the bottom of the window.** The open card used to have no height limit, so the last replies and the reply box could be out of reach. In every editor it now stops at 60% of the window (never under 320px, and never taller than the room on the side it opens toward). The comments scroll inside it and the reply box stays below. After you reply, the thread follows to your reply; a long reply from the agent lines up at its top, and scrolling up stops the following (reported by @congee949, [#34](https://github.com/JimLiu/baoyu-design/issues/34)).\n- **`claude-design` and `claude-slides` opened on their own now keep the address bar on where you are.** Under `open` or DeepSeek Harness's browser there is no claude.ai frame to do it, so switching pages or slides left the address as it was, a pasted `#page-…` or `#slide-…` link did nothing once the page had loaded, and **Copy link to page** and **Copy link to slide** could not copy. In `claude-design` the address now names the page, switching to another page adds a history entry (up to 20), and Back and Forward move between them. In `claude-slides` the address follows the current slide without filling the history. Both follow a changed address to its place, and the copy shortcuts copy the page's address with the place in it and say **Link copied.** On claude.ai nothing changes. This is the address part of [#33](https://github.com/JimLiu/baoyu-design/issues/33), reported by @congee949; the previous/next page buttons and page keys it asks for are not in this release.",
31
+ "zh": "### 修复\n- **很长的评论串不再顶出窗口下沿。** 以前打开的评论卡片没有高度上限,最后几条回复和回复框可能够不到。现在所有编辑器里,卡片最高是窗口的 60%(不低于 320px,也不超过它朝向那一侧的空间),评论在卡片里滚动,回复框固定在下面。你回复之后,评论串会跟到你的回复;Agent 的长回复从它的开头对齐,往上滚就不再跟随(@congee949 报告,[#34](https://github.com/JimLiu/baoyu-design/issues/34))。\n- **单独打开的 `claude-design` 和 `claude-slides`,地址栏现在会跟着你所在的位置。** 用 `open` 或在 DeepSeek Harness 的浏览器里打开时,没有 claude.ai 的外层框架来做这件事:切页或切幻灯片,地址栏不变;贴一个 `#page-…` 或 `#slide-…` 的链接,页面加载之后没有反应;**Copy link to page**、**Copy link to slide** 复制不了。现在 `claude-design` 的地址栏写的是当前页,切到另一页会多一条历史记录(最多 20 条),后退、前进能在页之间来回;`claude-slides` 的地址栏跟着当前幻灯片走,但不往历史里添记录。地址被改成另一个位置时,两者都会跟过去;复制快捷键复制的是带着位置的本页地址,并提示 **Link copied.**。在 claude.ai 上没有变化。这是 [#33](https://github.com/JimLiu/baoyu-design/issues/33)(@congee949 报告)里地址栏的那部分,它要的上一页/下一页按钮和切页快捷键这个版本没有做。"
32
+ },
33
+ {
34
+ "version": "2.12.0",
35
+ "date": "2026-11-06",
36
+ "en": "### Features\n- **Comments, in every editor, follow claude.ai's comment layer more closely.** A thread whose pin is out of the window gets a **More comments** tab with its count at that edge instead of a pin, and a click opens the nearest one. Pins on the same spot sit side by side. The **All comments** panel has **Send all to Agent**, which gives the agent every thread at once (`comments --wait` returns them together). An edited message says **edited**, a resolved thread says **Reply to reopen…**, and the panel has an empty state and, when the filter hides everything, **Show N resolved**.\n- **`claude-slides`, `claude-design`, `claude-design-system`, `claude-dashboard` and `claude-motion` follow claude.ai's 2026-11-05 update.** In all five: a button shows that it is working while its action runs, a dialog gives focus back to where it was, toasts can be reached from the keyboard, tabs have an underline style, and the icon set has 34 more icons. Properties can be copied and pasted in slides, design and the dashboard's edit mode.\n- `claude-slides`: speaker notes can be edited in the Canvas view, and the presentation has jump keys (Home, End).\n- `claude-design`: grid cells can be dragged and moved with the keyboard, and a tall artboard's PDF export is split across pages.\n- `claude-design-system`: a system holds up to 4,096 files a version, 4,080 of them its own (1,024 before), and `agent.md` and `gemini.md` are refused as file names, like `claude.md` and `agents.md`.\n- `claude-dashboard`: an attached file can be up to 15 MiB, a document written by the agent carries an `edit` stamp the page reads, and `check` knows the new rules for `dash/look`.\n- `claude-motion`: `check` warns about a module named `scene-…` or `layer-…`, which are the player's own names.\n\n### Documentation\n- Every editor's `SKILL.md` and reference follow the same update. `claude-slides` and `claude-design` choose typefaces from the brief and the subject, Inter with Space Grotesk when it is neutral. `claude-dashboard` has new looks and questions pages and reworked pages on data sources, features, design systems and reading aloud.\n- `claude-motion` is reworked: a new film is asked about before anything is made, a film left half-way is taken up again on a later turn instead of started over, a named design system is read before the first scene, and a few kinds of film are refused (for or against a political party, candidate or ballot measure; a promo for gambling or a crypto coin, token or exchange; a fight or combat scene). New reference pages cover each.",
37
+ "zh": "### 新功能\n- **所有编辑器的评论层更接近 claude.ai 的评论层。** 图钉不在窗口里的评论,不再画图钉,改成在那一侧边缘贴一个带数量的 **More comments** 标签,点一下就打开离得最近的一条。同一个位置的图钉并排排开。**All comments** 面板里有 **Send all to Agent**,一次把所有评论串发给 Agent(`comments --wait` 一起返回)。改过的消息会标 **edited**,已解决的评论串显示 **Reply to reopen…**,面板有了空状态;筛选把评论全藏起来时,显示 **Show N resolved**。\n- **`claude-slides`、`claude-design`、`claude-design-system`、`claude-dashboard` 和 `claude-motion` 跟上了 claude.ai 2026-11-05 的更新。** 五个编辑器都有:按钮在操作进行时显示忙的状态,对话框关闭后把焦点还给原来的位置,提示条可以用键盘切过去,标签页多了下划线样式,图标多了 34 个。幻灯片、设计稿和仪表盘的编辑模式里可以复制、粘贴属性。\n- `claude-slides`:演讲者备注可以在 Canvas 视图里直接编辑,演示时多了跳转键(Home、End)。\n- `claude-design`:网格的单元格可以拖动,也可以用键盘移动;很高的画板导出 PDF 时拆成多页。\n- `claude-design-system`:一个设计系统每个版本最多 4,096 个文件,其中自己的 4,080 个(以前是 1,024);`agent.md` 和 `gemini.md` 和 `claude.md`、`agents.md` 一样,不能用作文件名。\n- `claude-dashboard`:附件最大 15 MiB;Agent 写的文档带 `edit` 戳,页面会读它;`check` 认识 `dash/look` 的新规则。\n- `claude-motion`:`check` 对名字以 `scene-` 或 `layer-` 开头的模块给出警告,这两类是播放器自己的名字。\n\n### 文档\n- 每个编辑器的 `SKILL.md` 和 reference 都跟着这次更新。`claude-slides` 和 `claude-design` 按需求和主题选字体,中性的就用 Inter 搭 Space Grotesk。`claude-dashboard` 新增了 looks 和 questions 两页,数据来源、功能、设计系统和朗读几页重写了。\n- `claude-motion` 重写:新片先问再做,做到一半的影片下一轮会接着做,不重来;指定了设计系统,先读它再画第一场;还有几类片子不做(支持或反对某个政党、公职候选人或公投议案;赌博、加密币、代币或交易所的宣传片;打斗或战斗场面)。各有新的 reference 页。"
38
+ },
27
39
  {
28
40
  "version": "2.11.1",
29
41
  "date": "2026-11-05",
@@ -59,18 +71,6 @@
59
71
  "date": "2026-11-04",
60
72
  "en": "### Fixes\n- DeepSeek Harness on Windows: the plugins only recognized a shell tool named `bash`, and on Windows it is named `pwsh`, so they never noticed an `open`. The folder stayed off the **Artifacts** page, **Send to Agent** never appeared, and comments did not reach the agent. They now recognize both names (by @leil894-collab, [#31](https://github.com/JimLiu/baoyu-design/pull/31); reported by @EmotionTowel, [#30](https://github.com/JimLiu/baoyu-design/issues/30)).",
61
73
  "zh": "### 修复\n- Windows 上的 DeepSeek Harness:插件只认名叫 `bash` 的 shell 工具,而它在 Windows 上叫 `pwsh`,所以一直注意不到 `open`。文件夹不会出现在作品页,**Send to Agent** 不出现,评论也到不了 Agent。现在两个名字都认(by @leil894-collab,[#31](https://github.com/JimLiu/baoyu-design/pull/31);@EmotionTowel 报告,[#30](https://github.com/JimLiu/baoyu-design/issues/30))。"
62
- },
63
- {
64
- "version": "2.9.0",
65
- "date": "2026-11-03",
66
- "en": "### Features\n- **ChatGPT plugins.** The skills now also come as plugins for the ChatGPT desktop app and Codex: Baoyu Slides, Baoyu Canvas, Baoyu Design System, Baoyu Dashboard, Baoyu Motion (with `motion-director` and `dataviz`) and Baoyu Dataviz. This repository is their marketplace: run `codex plugin marketplace add JimLiu/baoyu-design --sparse .agents/plugins --sparse chatgpt-plugins`, then install the ones you want. [chatgpt-plugins/README.md](chatgpt-plugins/README.md) has the steps.\n- DeepSeek Harness: each deck, canvas, design system, dashboard and film on the **Artifacts** page now has a real thumbnail, taken from its own editor and retaken when its files change. This needs the desktop app; in `dsh web` a card keeps a drawn picture of its type.\n- The **Artifacts** page's tiles and **+** menu start a new session with the input filled in, such as `/claude-slides Make me a slide deck about: `, and sending it loads that skill. Only plugins that are on get a tile.\n- The **Artifacts** page has grid and list views, search, sorting (last opened, last edited, date created, name) and filters (type, date opened, sharing, pinned).\n- Each card on the **Artifacts** page has a menu to pin, rename, copy the link or delete. Rename changes the title in the artifact itself, so its editor shows the new name. Delete moves the folder to `baoyu-design/trash/` in the app's data folder, with an Undo; a folder that also holds other files stays where it is and only leaves the list.\n\n### Fixes\n- In a sandbox that blocks local network, such as Codex's default one, `open` said `PORT_IN_USE`, as if every port were taken. It now says `NETWORK_BLOCKED` and how to run the command, and the skills say which commands need local network.",
67
- "zh": "### 新功能\n- **ChatGPT 插件。** 这些技能也做成了 ChatGPT 桌面版和 Codex 的插件:Baoyu Slides、Baoyu Canvas、Baoyu Design System、Baoyu Dashboard、Baoyu Motion(带 `motion-director` 和 `dataviz`)和 Baoyu Dataviz。本仓库就是它们的 marketplace:运行 `codex plugin marketplace add JimLiu/baoyu-design --sparse .agents/plugins --sparse chatgpt-plugins`,再装你要的插件。步骤见 [chatgpt-plugins/README.zh-CN.md](chatgpt-plugins/README.zh-CN.md)。\n- DeepSeek Harness:**Artifacts** 页(中文界面是「作品」)上的幻灯片、画布、设计系统、仪表盘和影片现在都有真实的缩略图,从各自的编辑器里截取,文件改过后会重新截。这要在桌面版里;`dsh web` 的卡片仍然是画出来的类型示意图。\n- 作品页顶部的入口和 **+** 菜单会新开一个会话,并填好输入框,比如 `/claude-slides 帮我做一份幻灯片,主题是:`,发送时会加载对应的技能。只有开着的插件才有入口。\n- 作品页可以切换网格和列表,可以搜索、排序(最近打开、最近修改、创建时间、名称)和筛选(类型、打开时间、共享、已固定)。\n- 作品页的每张卡片都有菜单,可以固定、重命名、复制链接和删除。重命名改的是作品本身的标题,编辑器里也会显示新名字。删除会把文件夹移到应用数据目录的 `baoyu-design/trash/`,可以撤销;文件夹里还有别的文件时,文件夹留在原处,只从列表移除。\n\n### 修复\n- 在不允许访问本机网络的沙箱里(比如 Codex 的默认沙箱),`open` 会报 `PORT_IN_USE`,好像所有端口都被占了。现在它报 `NETWORK_BLOCKED`,并说明该怎么运行;技能说明里也写了哪些命令要访问本机网络。"
68
- },
69
- {
70
- "version": "2.8.2",
71
- "date": "2026-11-02",
72
- "en": "### Fixes\n- `claude-slides`: in a PowerPoint export, Chinese, Japanese or Korean text could show as boxes when its East Asian font was missing on the reader's computer or held none of those characters: Arial in the basic-fonts export, a Latin family, or an embedded subset that left characters out of a long deck. That text now names a font Windows and Office have instead (Microsoft YaHei, Microsoft JhengHei, Yu Gothic or Malgun Gothic). Text the embedded font holds, text without these characters and the Google Slides export are unchanged ([#29](https://github.com/JimLiu/baoyu-design/issues/29)).",
73
- "zh": "### 修复\n- `claude-slides`:导出 PowerPoint 时,如果中日韩文字用的东亚字体在对方电脑上没有,或者这个字体本身不含这些字(basic 字体导出里的 Arial、拉丁字体、长 deck 里漏了字的内嵌子集),文字可能显示成方块。这类文字现在改用 Windows 和 Office 常见的字体(Microsoft YaHei、Microsoft JhengHei、Yu Gothic 或 Malgun Gothic)。内嵌字体装得下的文字、不含这些字的文字和 Google Slides 导出都不变([#29](https://github.com/JimLiu/baoyu-design/issues/29))。"
74
74
  }
75
75
  ]
76
76
  },
@@ -96,7 +96,7 @@
96
96
  "dsh": ">=0.2.0-0"
97
97
  },
98
98
  "dependencies": {
99
- "dsh-claude-artifacts": "^2.11.1"
99
+ "dsh-claude-artifacts": "^2.12.1"
100
100
  },
101
101
  "dsh": {
102
102
  "bundle": {
@@ -143,9 +143,9 @@ The reference pages address the appifacts-design skill's files; their FORMAT rul
143
143
 
144
144
  ## Designing well (full: `artifact-type/reference/craft.md`)
145
145
 
146
- - No filler, invented stats or lorem ipsum; missing facts become placeholders like [YOUR PRICE].
147
- - Rationale and option notes go in your reply, never in an artboard; design levers are `data-props` tweaks, never widgets.
148
- - No design system? Commit to a small one, from the subject: 1–3 typefaces, a ground, 0–2 accents of like chroma and lightness. Cream, serif display and clay are your habit: only if the brief or brand asks. Branded Anthropic work: Ivory #FAF9F5, Slate #141413, Clay #D97757, serif display over sans body (stacks: `brand-colors.md`, `brand-typography.md`).
146
+ - No filler, invented stats or lorem ipsum; missing facts become [YOUR PRICE] placeholders.
147
+ - Rationale and options go in your reply, not an artboard; design levers are `data-props` tweaks, never widgets.
148
+ - No design system? Make one: type from the subject; if neutral, Inter, Space Grotesk headings in Latin script; a ground, 0–2 accents of like chroma/lightness. Cream, serif display and clay are your habit: only if the brief or brand asks. Branded Anthropic work: Ivory #FAF9F5, Slate #141413, Clay #D97757, serif display over sans body (stacks: `brand-colors.md`, `brand-typography.md`).
149
149
  - No AI tropes (gradient washes, left-border cards, emoji). Touch targets ≥44px; print body ≥12pt; no fake status bars; PAGEs work at phone width. Over-tall beats clipped (a PAGE's phone version excepted: it is a phone screen). Recreations are exact only from real source; no other company's proprietary design.
150
150
  - Accessible as drawn: real `<button>`, `<a href>`, `<input>` + `<label>` even in a static mockup; never `role`/`onClick` on a div or span (Tab skips it); `aria-label` on icon-only buttons; SVG: decor `aria-hidden="true"`, else `role="img" aria-label`. Text 4.5:1, even 11px grey labels (3:1 at 24px+); 4.3:1 still fails: pick shades that pass. Colors that must be told apart also differ in lightness, not hue alone; prefer blue/orange to red/green.
151
151
 
@@ -24,7 +24,10 @@ subject, asset or brand IS input; with nobody to ask, commit to one
24
24
  nameable direction and say so rather than ending on a question. Once
25
25
  settled, a decision stays settled. Then commit to a small system:
26
26
 
27
- - A type pairing: Google Fonts load in the artifact (one
27
+ - A type pairing: for new work in Latin script with no brand or design
28
+ system, type from the brief and subject; if neutral (apps, data), Inter for text and Space Grotesk for headings. Work added to an existing design keeps
29
+ its faces.
30
+ Google Fonts load in the artifact (one
28
31
  `fonts.googleapis.com/css2?family=…&display=swap` `<link>` in
29
32
  `<helmet>`; no other webfont host does); 1–3 families, each with a
30
33
  system fallback of close metrics (shown while the font loads and
@@ -54,9 +57,8 @@ direction before building:
54
57
  Bold maximalism and refined minimalism both work — the key is
55
58
  intentionality, not intensity. Then execute with precision:
56
59
 
57
- - **Typography**: choose fonts that are beautiful, unique, and
58
- interesting. Opt for distinctive, characterful choices. Pair a
59
- distinctive display font with a refined body font.
60
+ - **Typography**: the default pairing above, unless the brief calls
61
+ for other faces.
60
62
  - **Color & theme**: commit to a cohesive aesthetic. Dominant colors
61
63
  with sharp accents outperform timid, evenly-distributed palettes.
62
64
  - **Motion**: where a design carries animation (CSS in the artboard),
@@ -70,8 +72,8 @@ intentionality, not intensity. Then execute with precision:
70
72
  geometric patterns, layered transparencies, dramatic shadows,
71
73
  decorative borders, grain overlays.
72
74
 
73
- Vary between light and dark themes, different fonts, different
74
- aesthetics — NEVER converge on the same choices across generations.
75
+ Vary between light and dark themes and different aesthetics — NEVER
76
+ converge on the same look across generations.
75
77
  And match implementation complexity to the aesthetic vision:
76
78
  maximalist designs need elaborate effects; minimalist designs need
77
79
  restraint, precision, and careful attention to spacing and subtle
@@ -1226,8 +1226,8 @@ import path7 from "node:path";
1226
1226
  var DESIGN_SYSTEM_FILE = "design-system.json";
1227
1227
  var BLOBS_DIR = "_blobs";
1228
1228
  var DESIGN_SYSTEM_LIMITS = {
1229
- files: 1024,
1230
- ownFiles: 1008,
1229
+ files: 4096,
1230
+ ownFiles: 4080,
1231
1231
  totalBytes: 256 * 1024 * 1024,
1232
1232
  fileBytes: 15 * 1024 * 1024,
1233
1233
  publishBytes: 16 * 1024 * 1024,
@@ -1273,7 +1273,9 @@ var REFUSED_TOOL_FILENAMES = /* @__PURE__ */ new Set([
1273
1273
  "deno.jsonc",
1274
1274
  "claude.md",
1275
1275
  "claude.local.md",
1276
- "agents.md"
1276
+ "agents.md",
1277
+ "agent.md",
1278
+ "gemini.md"
1277
1279
  ]);
1278
1280
  var WINDOWS_SHORT_NAME_PATTERN = /~\d/;
1279
1281
  var IMAGE_SLOT_STATE_FILENAME = ".image-slots.state.json";
@@ -17110,57 +17110,7 @@ Content-Type: ${value2.type || "application/octet-stream"}\r
17110
17110
  };
17111
17111
 
17112
17112
  // node_modules/happy-dom/lib/fetch/certificate/FetchHTTPSCertificate.js
17113
- var FetchHTTPSCertificate_default = {
17114
- cert: `-----BEGIN CERTIFICATE-----
17115
- MIIDYzCCAkugAwIBAgIUJRKB/H66hpet1VfUlm0CiXqePA4wDQYJKoZIhvcNAQEL
17116
- BQAwQTELMAkGA1UEBhMCU0UxDjAMBgNVBAgMBVNrYW5lMQ4wDAYDVQQHDAVNYWxt
17117
- bzESMBAGA1UECgwJSGFwcHkgRE9NMB4XDTIyMTAxMTIyMDM0OVoXDTMyMTAwODIy
17118
- MDM0OVowQTELMAkGA1UEBhMCU0UxDjAMBgNVBAgMBVNrYW5lMQ4wDAYDVQQHDAVN
17119
- YWxtbzESMBAGA1UECgwJSGFwcHkgRE9NMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
17120
- MIIBCgKCAQEAqerQSQEg/SxVxRiwlItithr5e5EMZo1nsqt/xOxagbmpW3IEmt0j
17121
- bpbH7iEF4DDEo7KAOwUCOwVWeFxRoag8lG2ax48wrgjlCna45XDn0Xeg1ARajL04
17122
- gs46HZ0VrzIloVGfln0zgt/Vum5BNqs9Oc5fQoBmoP3cAn3dn4ZVcP0AKthtcyPl
17123
- q2DuNRN0PV0D2RtMSiAy9l1Ko6N5x+sAeClDyOL+sTDLngZBVeZyOKt9Id15S8Zt
17124
- XtA6VMgHnnF3jChn7pag77rsd/y5iANAVNZYqRl+Eg7xaDcsvbgH46UBOrBcB39Q
17125
- tTh5Mtjoxep5e3ZDFG+kQ1HUE+iz5O5n0wIDAQABo1MwUTAdBgNVHQ4EFgQU69s9
17126
- YSobG/m2SN4L/7zTaF7iDbwwHwYDVR0jBBgwFoAU69s9YSobG/m2SN4L/7zTaF7i
17127
- DbwwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAi/WUXx2oal8L
17128
- YnPlIuKfh49n/K18wXSYG//oFYwxfVxqpYH8hUiXVm/GUcXCxS++hUkaKLqXmH9q
17129
- MKJiCrZr3vS+2nsBKopkICu/TLdROl0sAI9lByfnEbfSAzjxe1IWJdK8NdY0y5m5
17130
- 9pEr/URVIAp/CxrneyASb4q0Jg5To3FR7vYc+2X6wZn0MundKMg6Dp9/A37jiF3l
17131
- Tt/EJp299YZcsUzh+LnRuggRjnoOVu1aLcLFlaUiwZfy9m8mLG6B/mdW/qNzNMh9
17132
- Oqvg1zfGdpz/4D/2UUUBn6pq1vbsoAaF3OesoA3mfDcegDf/H9woJlpT0Wql+e68
17133
- Y3FblSokcA==
17134
- -----END CERTIFICATE-----`,
17135
- key: `-----BEGIN PRIVATE KEY-----
17136
- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCp6tBJASD9LFXF
17137
- GLCUi2K2Gvl7kQxmjWeyq3/E7FqBualbcgSa3SNulsfuIQXgMMSjsoA7BQI7BVZ4
17138
- XFGhqDyUbZrHjzCuCOUKdrjlcOfRd6DUBFqMvTiCzjodnRWvMiWhUZ+WfTOC39W6
17139
- bkE2qz05zl9CgGag/dwCfd2fhlVw/QAq2G1zI+WrYO41E3Q9XQPZG0xKIDL2XUqj
17140
- o3nH6wB4KUPI4v6xMMueBkFV5nI4q30h3XlLxm1e0DpUyAeecXeMKGfulqDvuux3
17141
- /LmIA0BU1lipGX4SDvFoNyy9uAfjpQE6sFwHf1C1OHky2OjF6nl7dkMUb6RDUdQT
17142
- 6LPk7mfTAgMBAAECggEAKkwTkTjAt4UjzK56tl+EMQTB+ep/hb/JgoaChci4Nva6
17143
- m9LkJpDJ0yuhlTuPNOGu8XjrxsVWas7HWarRf0Zb3i7yip6wZYI9Ub+AA015x4DZ
17144
- /i0fRU2NFbK0cM67qSL4jxG8gj+kZP3HPGNZxHwX/53JxMolwgmvjMc8NgvAlSFd
17145
- NnV9h4xtbhUh1NGS5zmP3iU2rwnE8JrIEzwy6axLom7nekAgkdcbAr0UoBs8gcgH
17146
- aYNhU4Gz3tGcZZ0IXAfT/bJIH1Ko8AGv4pssWc3BXcmmNdm/+kzvHIxEIV7Qegmo
17147
- XG1ZyZCyD/0b4/3e8ySDBEDqwR+HeyTW2isWG2agAQKBgQDp44aTwr3dkIXY30xv
17148
- FPfUOipg/B49dWnffYJ9MWc1FT9ijNPAngWSk0EIiEQIazICcUBI4Yji6/KeyqLJ
17149
- GdLpDi1CkKqtyh73mjELinYp3EUQgEa77aQogGa2+nMOVfu+O5CtloUrv/A18jX3
17150
- +VEyaEASK0fWmnSI0OdlxQHIAQKBgQC5+xOls2F3MlKASvWRLlnW1wHqlDTtVoYg
17151
- 5Nh8syZH4Ci2UH8tON3A5/7SWNM0t1cgV6Cw4zW8Z2spgIT/W0iYYrQ4hHL1xdCu
17152
- +CxL1km4Gy8Uwpsd+KdFahFqF/XTmLzW0HXLxWSK0fTwmdV0SFrKF3MXfTCU2AeZ
17153
- jJoMFb6P0wKBgQC3Odw6s0vkYAzLGhuZxfZkVvDOK5RRF0NKpttr0iEFL9EJFkPo
17154
- 2KKK8jr3QTDy229BBJGUxsJi6u6VwS8HlehpVQbV59kd7oKV/EBBx0XMg1fDlopT
17155
- PNbmN7i/zbIG4AsoOyebJZjL7kBzMn1e9vzKHWtcEHXlw/hZGja8vjooAQKBgAeg
17156
- xK2HLfg1mCyq5meN/yFQsENu0LzrT5UJzddPgcJw7zqLEqxIKNBAs7Ls8by3yFsL
17157
- PQwERa/0jfCl1M6kb9XQNpQa2pw6ANUsWKTDpUJn2wZ+9N3F1RaDwzMWyH5lRVmK
17158
- M0qoTfdjpSg5Jwgd75taWt4bxGJWeflSSv8z5R0BAoGAWL8c527AbeBvx2tOYKkD
17159
- 2TFranvANNcoMrbeviZSkkGvMNDP3p8b6juJwXOIeWNr8q4vFgCzLmq6d1/9gYm2
17160
- 3XJwwyD0LKlqzkBrrKU47qrnmMosUrIRlrAzd3HbShOptxc6Iz2apSaUDKGKXkaw
17161
- gl5OpEjeliU7Mus0BVS858g=
17162
- -----END PRIVATE KEY-----`
17163
- };
17113
+ var FetchHTTPSCertificate_default = { cert: "", key: "" };
17164
17114
 
17165
17115
  // node_modules/happy-dom/lib/fetch/utilities/VirtualServerUtility.js
17166
17116
  var NOT_FOUND_HTML = "<html><head><title>Happy DOM Virtual Server - 404 Not Found</title></head><body><h1>Happy DOM Virtual Server - 404 Not Found</h1></body></html>";
@@ -69087,6 +69037,7 @@ this.Function = globalThis.Function;
69087
69037
  let templateDepths;
69088
69038
  let templateDollar;
69089
69039
  let blockComment;
69040
+ let blockCommentJustOpened;
69090
69041
  let regex;
69091
69042
  let regexCharacterClass;
69092
69043
  let escapedRegex;
@@ -69101,6 +69052,7 @@ this.Function = globalThis.Function;
69101
69052
  let ended2;
69102
69053
  let pendingChain;
69103
69054
  let bufferOffset;
69055
+ let stopped;
69104
69056
  function reset() {
69105
69057
  buffer2 = "";
69106
69058
  parenDepth = braceDepth = bracketDepth = 0;
@@ -69110,8 +69062,9 @@ this.Function = globalThis.Function;
69110
69062
  statementStart = 0;
69111
69063
  templateDepths = [];
69112
69064
  templateDollar = false;
69113
- blockComment = false;
69065
+ blockComment = blockCommentJustOpened = false;
69114
69066
  regex = regexCharacterClass = escapedRegex = false;
69067
+ stopped = false;
69115
69068
  pendingSlash = false;
69116
69069
  lastSignificantChar = "";
69117
69070
  arrowBodyPending = false;
@@ -69223,7 +69176,7 @@ this.Function = globalThis.Function;
69223
69176
  return;
69224
69177
  }
69225
69178
  if (input === "*") {
69226
- blockComment = true;
69179
+ blockComment = blockCommentJustOpened = true;
69227
69180
  return;
69228
69181
  }
69229
69182
  if (lastSignificantChar === "" || "([{,;=!&|?:+-*%^~<>".indexOf(lastSignificantChar) >= 0 || regexAfterKeywords && REGEX_PREFIX_KEYWORDS.test(
@@ -69233,10 +69186,12 @@ this.Function = globalThis.Function;
69233
69186
  else lastSignificantChar = "/";
69234
69187
  }
69235
69188
  if (blockComment) {
69236
- if (input === "/" && buffer2[buffer2.length - 2] === "*") {
69189
+ if (input === "/" && buffer2[buffer2.length - 2] === "*" && !blockCommentJustOpened) {
69237
69190
  if (blockComment = false, controlEnd >= 0 && atTopLevel())
69238
69191
  continuationStart = buffer2.length;
69239
69192
  }
69193
+ if (blockCommentJustOpened = false, input === "`" && buffer2.endsWith("```") && buffer2.slice(buffer2.lastIndexOf("\n") + 1, -3).trim() === "")
69194
+ stopped = true;
69240
69195
  return;
69241
69196
  }
69242
69197
  if (lineComment) {
@@ -69252,7 +69207,7 @@ this.Function = globalThis.Function;
69252
69207
  }
69253
69208
  if (quote !== null) {
69254
69209
  if (escapedString) {
69255
- escapedString = input === "\\";
69210
+ escapedString = false;
69256
69211
  templateDollar = false;
69257
69212
  return;
69258
69213
  }
@@ -69267,6 +69222,7 @@ this.Function = globalThis.Function;
69267
69222
  templateDepths.push(braceDepth);
69268
69223
  braceDepth++;
69269
69224
  quote = null;
69225
+ lastSignificantChar = "{";
69270
69226
  return;
69271
69227
  }
69272
69228
  templateDollar = input === "$";
@@ -69274,10 +69230,15 @@ this.Function = globalThis.Function;
69274
69230
  if (input === quote) {
69275
69231
  lastSignificantChar = input;
69276
69232
  quote = null;
69233
+ stopped = input === "`" && buffer2.endsWith("```");
69277
69234
  }
69278
69235
  return;
69279
69236
  }
69280
69237
  if (regex) {
69238
+ if (input === "\n" || input === "\r" || input === "\u2028" || input === "\u2029") {
69239
+ stopped = true;
69240
+ return;
69241
+ }
69281
69242
  if (escapedRegex) {
69282
69243
  escapedRegex = false;
69283
69244
  return;
@@ -69307,6 +69268,7 @@ this.Function = globalThis.Function;
69307
69268
  case "`":
69308
69269
  quote = input;
69309
69270
  lastSignificantChar = input;
69271
+ stopped = buffer2.endsWith("```");
69310
69272
  return;
69311
69273
  case "(":
69312
69274
  parenDepth++;
@@ -69384,7 +69346,7 @@ this.Function = globalThis.Function;
69384
69346
  return;
69385
69347
  }
69386
69348
  input = String(input);
69387
- for (let index = 0; index < input.length; index++) {
69349
+ for (let index = 0; index < input.length && !stopped; index++) {
69388
69350
  buffer2 += input[index];
69389
69351
  acceptCharacter(input[index]);
69390
69352
  }
@@ -69392,12 +69354,17 @@ this.Function = globalThis.Function;
69392
69354
  }
69393
69355
  function describeOpenSyntax() {
69394
69356
  let items2 = [];
69395
- if (quote)
69357
+ if (stopped && !regex)
69358
+ items2.push("three backticks in a row, like a Markdown fence mark");
69359
+ else if (quote)
69396
69360
  items2.push(
69397
69361
  quote === "`" ? "a template literal" : "a string (" + quote + ")"
69398
69362
  );
69399
69363
  if (blockComment) items2.push("a block comment");
69400
- if (regex) items2.push("a regular expression");
69364
+ if (regex)
69365
+ items2.push(
69366
+ stopped ? "a regular expression that runs past its line, or a division taken for one" : "a regular expression"
69367
+ );
69401
69368
  if (parenDepth) items2.push(parenDepth + " \xD7 (");
69402
69369
  if (bracketDepth) items2.push(bracketDepth + " \xD7 [");
69403
69370
  if (braceDepth) items2.push(braceDepth + " \xD7 {");
@@ -69406,7 +69373,7 @@ this.Function = globalThis.Function;
69406
69373
  function value2() {
69407
69374
  if (ended2) return;
69408
69375
  ended2 = true;
69409
- let value22 = quote !== null || blockComment || regex;
69376
+ let value22 = stopped || quote !== null || blockComment || regex;
69410
69377
  if (!value22) {
69411
69378
  if (pendingSlash) {
69412
69379
  pendingSlash = false;
@@ -69450,6 +69417,10 @@ this.Function = globalThis.Function;
69450
69417
  end: value2,
69451
69418
  reset,
69452
69419
  tail: () => buffer2.slice(statementStart),
69420
+ inTextOrComment: () => stopped || quote === "`" || templateDepths.length > 0 && quote === null || blockComment,
69421
+ get stopped() {
69422
+ return stopped;
69423
+ },
69453
69424
  get count() {
69454
69425
  return statementCount;
69455
69426
  }
@@ -72435,8 +72406,8 @@ this.Function = globalThis.Function;
72435
72406
  return;
72436
72407
  }
72437
72408
  let value22 = stream.tail();
72438
- if (value22.length > limits.maxChars || value22.length > limits.maxLines && value22.split(`
72439
- `).length > limits.maxLines) {
72409
+ if (!stream.stopped && (value22.length > limits.maxChars || value22.length > limits.maxLines && value22.split(`
72410
+ `).length > limits.maxLines)) {
72440
72411
  emitStatementError(
72441
72412
  "a statement is over " + limits.maxLines + " lines / " + limits.maxChars + " characters; dropped",
72442
72413
  value22
@@ -72476,7 +72447,7 @@ this.Function = globalThis.Function;
72476
72447
  if (!value4) continue;
72477
72448
  if (consumedLineChars === 0 && !useLineSplitter) {
72478
72449
  let value7 = incomingLine.replace(/\r?\n$/, "");
72479
- if (CODE_FENCE.test(value7) && !insideTemplate()) {
72450
+ if (CODE_FENCE.test(value7) && !insideTemplate() && !stream.inTextOrComment()) {
72480
72451
  if (restartStream(), insideCodeFence = insideCodeFence !== true, insideCodeFence)
72481
72452
  recognizedCode = true;
72482
72453
  } else if (insideCodeFence === false) reportSkippedProse(value7);