@caelo-cms/shared 0.10.22 → 0.10.24

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.
Files changed (249) hide show
  1. package/dist/ai-tools.d.ts +289 -273
  2. package/dist/ai-tools.d.ts.map +1 -1
  3. package/dist/ai-tools.js +342 -323
  4. package/dist/ai-tools.js.map +1 -1
  5. package/dist/auth-forms.d.ts.map +1 -1
  6. package/dist/auth-forms.js +4 -1
  7. package/dist/auth-forms.js.map +1 -1
  8. package/dist/base-css.d.ts +35 -0
  9. package/dist/base-css.d.ts.map +1 -0
  10. package/dist/base-css.js +40 -0
  11. package/dist/base-css.js.map +1 -0
  12. package/dist/build-page.d.ts +330 -0
  13. package/dist/build-page.d.ts.map +1 -0
  14. package/dist/build-page.js +282 -0
  15. package/dist/build-page.js.map +1 -0
  16. package/dist/content.d.ts +322 -9
  17. package/dist/content.d.ts.map +1 -1
  18. package/dist/content.js +354 -11
  19. package/dist/content.js.map +1 -1
  20. package/dist/css-gradient-scan.d.ts +14 -0
  21. package/dist/css-gradient-scan.d.ts.map +1 -0
  22. package/dist/css-gradient-scan.js +81 -0
  23. package/dist/css-gradient-scan.js.map +1 -0
  24. package/dist/css-var-scan.d.ts +56 -0
  25. package/dist/css-var-scan.d.ts.map +1 -0
  26. package/dist/css-var-scan.js +97 -0
  27. package/dist/css-var-scan.js.map +1 -0
  28. package/dist/design-draft-shell.d.ts +21 -0
  29. package/dist/design-draft-shell.d.ts.map +1 -0
  30. package/dist/design-draft-shell.js +81 -0
  31. package/dist/design-draft-shell.js.map +1 -0
  32. package/dist/design-manifest.d.ts +36 -0
  33. package/dist/design-manifest.d.ts.map +1 -0
  34. package/dist/design-manifest.js +90 -0
  35. package/dist/design-manifest.js.map +1 -0
  36. package/dist/fonts.d.ts +89 -0
  37. package/dist/fonts.d.ts.map +1 -0
  38. package/dist/fonts.js +241 -0
  39. package/dist/fonts.js.map +1 -0
  40. package/dist/genesis-inventory.d.ts +32 -0
  41. package/dist/genesis-inventory.d.ts.map +1 -0
  42. package/dist/genesis-inventory.js +186 -0
  43. package/dist/genesis-inventory.js.map +1 -0
  44. package/dist/genesis.d.ts +102 -0
  45. package/dist/genesis.d.ts.map +1 -0
  46. package/dist/genesis.js +145 -0
  47. package/dist/genesis.js.map +1 -0
  48. package/dist/i18n.d.ts +29 -36
  49. package/dist/i18n.d.ts.map +1 -1
  50. package/dist/i18n.js +53 -128
  51. package/dist/i18n.js.map +1 -1
  52. package/dist/index.d.ts +28 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +28 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/interactions.d.ts +23 -0
  57. package/dist/interactions.d.ts.map +1 -0
  58. package/dist/interactions.js +44 -0
  59. package/dist/interactions.js.map +1 -0
  60. package/dist/media.d.ts +101 -16
  61. package/dist/media.d.ts.map +1 -1
  62. package/dist/media.js +126 -15
  63. package/dist/media.js.map +1 -1
  64. package/dist/page-log.d.ts +94 -0
  65. package/dist/page-log.d.ts.map +1 -0
  66. package/dist/page-log.js +111 -0
  67. package/dist/page-log.js.map +1 -0
  68. package/dist/preview-compose.d.ts +85 -12
  69. package/dist/preview-compose.d.ts.map +1 -1
  70. package/dist/preview-compose.js +157 -67
  71. package/dist/preview-compose.js.map +1 -1
  72. package/dist/proposal-status.d.ts +40 -0
  73. package/dist/proposal-status.d.ts.map +1 -0
  74. package/dist/proposal-status.js +34 -0
  75. package/dist/proposal-status.js.map +1 -0
  76. package/dist/responsive-images.d.ts +64 -0
  77. package/dist/responsive-images.d.ts.map +1 -0
  78. package/dist/responsive-images.js +98 -0
  79. package/dist/responsive-images.js.map +1 -0
  80. package/dist/safe-keys.d.ts +9 -0
  81. package/dist/safe-keys.d.ts.map +1 -0
  82. package/dist/safe-keys.js +20 -0
  83. package/dist/safe-keys.js.map +1 -0
  84. package/dist/seo.d.ts +11 -16
  85. package/dist/seo.d.ts.map +1 -1
  86. package/dist/seo.js +7 -23
  87. package/dist/seo.js.map +1 -1
  88. package/dist/skills.d.ts +14 -68
  89. package/dist/skills.d.ts.map +1 -1
  90. package/dist/skills.js +19 -113
  91. package/dist/skills.js.map +1 -1
  92. package/dist/strip-cdata.d.ts +7 -0
  93. package/dist/strip-cdata.d.ts.map +1 -0
  94. package/dist/strip-cdata.js +48 -0
  95. package/dist/strip-cdata.js.map +1 -0
  96. package/dist/structured-sets.d.ts +6 -52
  97. package/dist/structured-sets.d.ts.map +1 -1
  98. package/dist/structured-sets.js +6 -68
  99. package/dist/structured-sets.js.map +1 -1
  100. package/dist/subagents.d.ts +105 -3
  101. package/dist/subagents.d.ts.map +1 -1
  102. package/dist/subagents.js +224 -41
  103. package/dist/subagents.js.map +1 -1
  104. package/dist/template-engine.d.ts +85 -0
  105. package/dist/template-engine.d.ts.map +1 -0
  106. package/dist/template-engine.js +403 -0
  107. package/dist/template-engine.js.map +1 -0
  108. package/dist/theme-importers/auto-detect.d.ts +26 -0
  109. package/dist/theme-importers/auto-detect.d.ts.map +1 -0
  110. package/dist/theme-importers/auto-detect.js +42 -0
  111. package/dist/theme-importers/auto-detect.js.map +1 -0
  112. package/dist/theme-importers/css-comments.d.ts +12 -0
  113. package/dist/theme-importers/css-comments.d.ts.map +1 -0
  114. package/dist/theme-importers/css-comments.js +15 -0
  115. package/dist/theme-importers/css-comments.js.map +1 -0
  116. package/dist/theme-importers/dtcg.d.ts +46 -0
  117. package/dist/theme-importers/dtcg.d.ts.map +1 -0
  118. package/dist/theme-importers/dtcg.js +111 -0
  119. package/dist/theme-importers/dtcg.js.map +1 -0
  120. package/dist/theme-importers/loose.d.ts +3 -0
  121. package/dist/theme-importers/loose.d.ts.map +1 -0
  122. package/dist/theme-importers/loose.js +76 -0
  123. package/dist/theme-importers/loose.js.map +1 -0
  124. package/dist/theme-importers/shadcn.d.ts +24 -0
  125. package/dist/theme-importers/shadcn.d.ts.map +1 -0
  126. package/dist/theme-importers/shadcn.js +135 -0
  127. package/dist/theme-importers/shadcn.js.map +1 -0
  128. package/dist/theme-importers/style-dictionary.d.ts +17 -0
  129. package/dist/theme-importers/style-dictionary.d.ts.map +1 -0
  130. package/dist/theme-importers/style-dictionary.js +125 -0
  131. package/dist/theme-importers/style-dictionary.js.map +1 -0
  132. package/dist/theme-importers/tailwind.d.ts +3 -0
  133. package/dist/theme-importers/tailwind.d.ts.map +1 -0
  134. package/dist/theme-importers/tailwind.js +218 -0
  135. package/dist/theme-importers/tailwind.js.map +1 -0
  136. package/dist/theme-literal-binding.d.ts +37 -0
  137. package/dist/theme-literal-binding.d.ts.map +1 -0
  138. package/dist/theme-literal-binding.js +138 -0
  139. package/dist/theme-literal-binding.js.map +1 -0
  140. package/dist/theme-normalize.d.ts +31 -0
  141. package/dist/theme-normalize.d.ts.map +1 -0
  142. package/dist/theme-normalize.js +587 -0
  143. package/dist/theme-normalize.js.map +1 -0
  144. package/dist/theme-ramp.d.ts +55 -0
  145. package/dist/theme-ramp.d.ts.map +1 -0
  146. package/dist/theme-ramp.js +149 -0
  147. package/dist/theme-ramp.js.map +1 -0
  148. package/dist/theme-render.d.ts +105 -0
  149. package/dist/theme-render.d.ts.map +1 -0
  150. package/dist/theme-render.js +441 -0
  151. package/dist/theme-render.js.map +1 -0
  152. package/dist/themes-errors.d.ts +109 -0
  153. package/dist/themes-errors.d.ts.map +1 -0
  154. package/dist/themes-errors.js +170 -0
  155. package/dist/themes-errors.js.map +1 -0
  156. package/dist/themes.d.ts +343 -0
  157. package/dist/themes.d.ts.map +1 -0
  158. package/dist/themes.js +697 -0
  159. package/dist/themes.js.map +1 -0
  160. package/dist/version.d.ts +7 -4
  161. package/dist/version.d.ts.map +1 -1
  162. package/dist/version.js +6 -3
  163. package/dist/version.js.map +1 -1
  164. package/package.json +10 -2
  165. package/src/__tests__/redos-hardening.test.ts +160 -0
  166. package/src/ai-tools-add-module-modes.test.ts +106 -0
  167. package/src/ai-tools-position.test.ts +134 -0
  168. package/src/ai-tools.test.ts +81 -0
  169. package/src/ai-tools.ts +1105 -0
  170. package/src/auth-forms.ts +36 -0
  171. package/src/base-css.ts +42 -0
  172. package/src/build-page.test.ts +228 -0
  173. package/src/build-page.ts +319 -0
  174. package/src/cap-failures.ts +67 -0
  175. package/src/content.test.ts +170 -0
  176. package/src/content.ts +620 -0
  177. package/src/context.ts +43 -0
  178. package/src/css-gradient-scan.ts +88 -0
  179. package/src/css-var-scan.test.ts +96 -0
  180. package/src/css-var-scan.ts +144 -0
  181. package/src/derive-module-type.test.ts +80 -0
  182. package/src/design-draft-shell.test.ts +85 -0
  183. package/src/design-draft-shell.ts +109 -0
  184. package/src/design-manifest.ts +93 -0
  185. package/src/fonts.test.ts +157 -0
  186. package/src/fonts.ts +296 -0
  187. package/src/genesis-inventory.test.ts +86 -0
  188. package/src/genesis-inventory.ts +215 -0
  189. package/src/genesis-sanitize.test.ts +35 -0
  190. package/src/genesis.ts +158 -0
  191. package/src/i18n.test.ts +58 -0
  192. package/src/i18n.ts +91 -0
  193. package/src/index.test.ts +10 -0
  194. package/src/index.ts +59 -0
  195. package/src/interactions.ts +48 -0
  196. package/src/logger.ts +147 -0
  197. package/src/media.test.ts +160 -0
  198. package/src/media.ts +355 -0
  199. package/src/page-log.test.ts +163 -0
  200. package/src/page-log.ts +124 -0
  201. package/src/preview-compose.test.ts +637 -0
  202. package/src/preview-compose.ts +656 -0
  203. package/src/preview-scanner.test.ts +96 -0
  204. package/src/preview-scanner.ts +214 -0
  205. package/src/proposal-status.test.ts +69 -0
  206. package/src/proposal-status.ts +40 -0
  207. package/src/responsive-images.test.ts +104 -0
  208. package/src/responsive-images.ts +151 -0
  209. package/src/result.ts +29 -0
  210. package/src/safe-keys.ts +21 -0
  211. package/src/seo.test.ts +194 -0
  212. package/src/seo.ts +233 -0
  213. package/src/skills.ts +48 -0
  214. package/src/snapshots.test.ts +80 -0
  215. package/src/snapshots.ts +81 -0
  216. package/src/strip-cdata.test.ts +41 -0
  217. package/src/strip-cdata.ts +50 -0
  218. package/src/structured-sets.ts +114 -0
  219. package/src/subagents.test.ts +262 -0
  220. package/src/subagents.ts +432 -0
  221. package/src/template-engine.test.ts +379 -0
  222. package/src/template-engine.ts +520 -0
  223. package/src/theme-gradient.test.ts +92 -0
  224. package/src/theme-importers/__tests__/proto-pollution.test.ts +54 -0
  225. package/src/theme-importers/auto-detect.ts +84 -0
  226. package/src/theme-importers/css-comments.ts +15 -0
  227. package/src/theme-importers/dtcg.ts +106 -0
  228. package/src/theme-importers/loose.ts +76 -0
  229. package/src/theme-importers/shadcn.ts +133 -0
  230. package/src/theme-importers/style-dictionary.ts +125 -0
  231. package/src/theme-importers/tailwind.ts +217 -0
  232. package/src/theme-literal-binding.test.ts +71 -0
  233. package/src/theme-literal-binding.ts +159 -0
  234. package/src/theme-motion.test.ts +115 -0
  235. package/src/theme-normalize-envelope.test.ts +43 -0
  236. package/src/theme-normalize-gradient.test.ts +135 -0
  237. package/src/theme-normalize.ts +661 -0
  238. package/src/theme-ramp.ts +187 -0
  239. package/src/theme-render-sanitize.test.ts +45 -0
  240. package/src/theme-render.test.ts +119 -0
  241. package/src/theme-render.ts +487 -0
  242. package/src/theme-shadow.test.ts +56 -0
  243. package/src/themes-errors.ts +199 -0
  244. package/src/themes.ts +842 -0
  245. package/src/version.ts +66 -0
  246. package/dist/translation.d.ts +0 -127
  247. package/dist/translation.d.ts.map +0 -1
  248. package/dist/translation.js +0 -208
  249. package/dist/translation.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.js","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -19,16 +19,19 @@
19
19
  * Format: SemVer 2.0.0. Pre-1.0 minor bumps are breaking; post-1.0
20
20
  * follow standard SemVer.
21
21
  */
22
- export declare const CAELO_VERSION = "0.10.22";
22
+ export declare const CAELO_VERSION = "0.10.24";
23
23
  /**
24
24
  * Deprecated alias for back-compat — early P17 work spelled this
25
25
  * `CALEO_VERSION` (typo of "Caelo"). New code should import
26
- * `CAELO_VERSION`. Kept as a re-export so existing callers keep
27
- * compiling; remove once external consumers have migrated.
26
+ * `CAELO_VERSION`. Kept as a re-export so external consumers of this
27
+ * published package (plugin authors / embedders) keep compiling;
28
+ * removal is deferred to the next major bump. Knip flags this as a
29
+ * duplicate export — suppressed in `knip.json#ignoreIssues` because the
30
+ * alias is intentional, mirroring `subagents.ts`.
28
31
  *
29
32
  * @deprecated use CAELO_VERSION
30
33
  */
31
- export declare const CALEO_VERSION = "0.10.22";
34
+ export declare const CALEO_VERSION = "0.10.24";
32
35
  /**
33
36
  * Parsed shape — major/minor/patch + optional pre-release tag.
34
37
  * Stable interface for callers that need to feature-gate (rare —
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,YAAgB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,YAAY,CAYtE"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,YAAgB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,YAAY,CAYtE"}
package/dist/version.js CHANGED
@@ -20,12 +20,15 @@
20
20
  * Format: SemVer 2.0.0. Pre-1.0 minor bumps are breaking; post-1.0
21
21
  * follow standard SemVer.
22
22
  */
23
- export const CAELO_VERSION = "0.10.22";
23
+ export const CAELO_VERSION = "0.10.24";
24
24
  /**
25
25
  * Deprecated alias for back-compat — early P17 work spelled this
26
26
  * `CALEO_VERSION` (typo of "Caelo"). New code should import
27
- * `CAELO_VERSION`. Kept as a re-export so existing callers keep
28
- * compiling; remove once external consumers have migrated.
27
+ * `CAELO_VERSION`. Kept as a re-export so external consumers of this
28
+ * published package (plugin authors / embedders) keep compiling;
29
+ * removal is deferred to the next major bump. Knip flags this as a
30
+ * duplicate export — suppressed in `knip.json#ignoreIssues` because the
31
+ * alias is intentional, mirroring `subagents.ts`.
29
32
  *
30
33
  * @deprecated use CAELO_VERSION
31
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAgB3C,MAAM,UAAU,YAAY,CAAC,MAAc,aAAa;IACtD,MAAM,CAAC,GAAG,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;QACxB,GAAG;KACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAgB3C,MAAM,UAAU,YAAY,CAAC,MAAc,aAAa;IACtD,MAAM,CAAC,GAAG,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;QACxB,GAAG;KACJ,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caelo-cms/shared",
3
- "version": "0.10.22",
3
+ "version": "0.10.24",
4
4
  "private": false,
5
5
  "license": "MPL-2.0",
6
6
  "description": "Shared Zod schemas + types + the two-pass HTML composer used by every Caelo CMS workspace package. Stable enough for plugin authors and embedders to depend on directly.",
@@ -17,12 +17,15 @@
17
17
  "exports": {
18
18
  ".": {
19
19
  "types": "./dist/index.d.ts",
20
+ "bun": "./src/index.ts",
21
+ "development": "./src/index.ts",
20
22
  "import": "./dist/index.js",
21
23
  "default": "./dist/index.js"
22
24
  }
23
25
  },
24
26
  "files": [
25
27
  "dist/",
28
+ "src/",
26
29
  "README.md",
27
30
  "package.json"
28
31
  ],
@@ -32,7 +35,12 @@
32
35
  "prepublishOnly": "tsc -b --force"
33
36
  },
34
37
  "dependencies": {
38
+ "colorjs.io": "^0.7.1",
35
39
  "htmlparser2": "^12.0.0",
36
- "zod": "4.3.6"
40
+ "mustache": "^4.2.0",
41
+ "zod": "4.4.3"
42
+ },
43
+ "devDependencies": {
44
+ "@types/mustache": "^4.2.6"
37
45
  }
38
46
  }
@@ -0,0 +1,160 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+
3
+ /**
4
+ * Regression tests for the polynomial-ReDoS hardening (issue #113, S4).
5
+ * Two assertion classes per rewritten pattern:
6
+ * - termination bound: a pathological input completes well under a hard
7
+ * budget (a quadratic regex blows it by orders of magnitude, so the
8
+ * threshold is not flaky);
9
+ * - behaviour equivalence: the hardened form produces the same output as
10
+ * the documented intent on valid input.
11
+ */
12
+
13
+ import { describe, expect, it } from "bun:test";
14
+ import { fontFamilySlug, parseFontsCss } from "../fonts.js";
15
+ import { trimSlashes, trimTrailingSlashes } from "../i18n.js";
16
+ import { renderTemplate } from "../template-engine.js";
17
+ import { stripCssComments } from "../theme-importers/css-comments.js";
18
+
19
+ // 250ms, not 100: under CI coverage instrumentation on a loaded runner
20
+ // the LINEAR 100k-char scans measured up to ~113ms (PR #170 flake). A
21
+ // quadratic regression blows this by orders of magnitude (seconds), so
22
+ // the wider bound loses no detection power — it only stops punishing
23
+ // slow runners for being slow.
24
+ const BUDGET_MS = 250;
25
+
26
+ function underBudget(fn: () => void): number {
27
+ const t0 = performance.now();
28
+ fn();
29
+ return performance.now() - t0;
30
+ }
31
+
32
+ describe("trimSlashes / trimTrailingSlashes (S4)", () => {
33
+ it("terminates linearly on a long slash run not at end-of-string", () => {
34
+ const evil = `${"/".repeat(200_000)}x`;
35
+ expect(underBudget(() => trimSlashes(evil))).toBeLessThan(BUDGET_MS);
36
+ expect(underBudget(() => trimTrailingSlashes(evil))).toBeLessThan(BUDGET_MS);
37
+ });
38
+
39
+ it("is behaviour-equivalent to the old trims on valid input", () => {
40
+ expect(trimSlashes("//a/b//")).toBe("a/b");
41
+ expect(trimSlashes("a/b")).toBe("a/b");
42
+ expect(trimSlashes("///")).toBe("");
43
+ expect(trimSlashes("")).toBe("");
44
+ // base-URL case: trailing-only trim keeps the scheme's slashes.
45
+ expect(trimTrailingSlashes("https://example.com/")).toBe("https://example.com");
46
+ expect(trimTrailingSlashes("https://example.com///")).toBe("https://example.com");
47
+ });
48
+ });
49
+
50
+ describe("stripCssComments (S4)", () => {
51
+ it("terminates on a flood of unterminated comment openers", () => {
52
+ const evil = "/*".repeat(100_000);
53
+ expect(underBudget(() => stripCssComments(evil))).toBeLessThan(BUDGET_MS);
54
+ });
55
+
56
+ it("strips real comments and leaves non-comment text", () => {
57
+ expect(stripCssComments("a /* x */ b")).toBe("a b");
58
+ expect(stripCssComments("color: red;")).toBe("color: red;");
59
+ });
60
+ });
61
+
62
+ describe("renderTemplate SECTION_RE (S4)", () => {
63
+ it("scans a large closed section body linearly (no quadratic backtracking)", () => {
64
+ // A closed section with a 100k-char literal body. The tempered-dot scans
65
+ // it in one linear pass; the old lazy [\s\S]*? + backreference close was
66
+ // the polynomial shape this guards against.
67
+ const big = "x".repeat(100_000);
68
+ const html = `<nav>{{#nav_items}}${big}<a href="{{href}}">{{label}}</a>{{/nav_items}}</nav>`;
69
+ expect(
70
+ underBudget(() =>
71
+ renderTemplate({
72
+ html,
73
+ fields: [{ name: "nav_items", kind: "link-list" }],
74
+ contentValues: { nav_items: [{ label: "Docs", href: "/docs" }] },
75
+ }),
76
+ ),
77
+ ).toBeLessThan(BUDGET_MS);
78
+ });
79
+
80
+ it("still iterates a closed section the same way", () => {
81
+ const out = renderTemplate({
82
+ html: '<nav>{{#nav_items}}<a href="{{href}}">{{label}}</a>{{/nav_items}}</nav>',
83
+ fields: [{ name: "nav_items", kind: "link-list" }],
84
+ contentValues: {
85
+ nav_items: [
86
+ { label: "Docs", href: "/docs" },
87
+ { label: "Blog", href: "/blog" },
88
+ ],
89
+ },
90
+ });
91
+ expect(out.html).toBe('<nav><a href="/docs">Docs</a><a href="/blog">Blog</a></nav>');
92
+ });
93
+ });
94
+
95
+ describe("fonts.ts patterns (issue #150 CodeQL follow-up)", () => {
96
+ it("scans a payload of unclosed @font-face starts linearly", () => {
97
+ // [^{}]* aborts at the next `{`; the old [^}]* rescanned to EOF per
98
+ // start position (quadratic across matchAll).
99
+ const evil = "@font-face{".repeat(30_000);
100
+ expect(underBudget(() => parseFontsCss(evil))).toBeLessThan(BUDGET_MS);
101
+ });
102
+
103
+ it("scans an ambiguous url( run linearly and rejects oversized payloads", () => {
104
+ const evil = `@font-face{font-family:'X';src:${"url((".repeat(20_000)};}`;
105
+ expect(underBudget(() => parseFontsCss(evil))).toBeLessThan(BUDGET_MS);
106
+ expect(parseFontsCss(`x${"y".repeat(1_000_001)}`)).toEqual([]);
107
+ });
108
+
109
+ it("still parses a valid css2 block identically (behaviour equivalence)", () => {
110
+ const faces = parseFontsCss(
111
+ "@font-face{font-family:'Poppins';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/a.woff2) format('woff2');unicode-range:U+0000-00FF;}",
112
+ );
113
+ expect(faces).toEqual([
114
+ {
115
+ family: "Poppins",
116
+ style: "normal",
117
+ weight: "400",
118
+ unicodeRange: "U+0000-00FF",
119
+ srcUrl: "https://fonts.gstatic.com/a.woff2",
120
+ },
121
+ ]);
122
+ });
123
+
124
+ it("slugs an all-dash family name linearly (no -+$ backtracking)", () => {
125
+ const evil = "-".repeat(200_000);
126
+ expect(underBudget(() => fontFamilySlug(evil))).toBeLessThan(BUDGET_MS);
127
+ expect(fontFamilySlug(" Playfair Display ")).toBe("playfair-display");
128
+ expect(fontFamilySlug("--Weird--Name--")).toBe("weird-name");
129
+ });
130
+ });
131
+
132
+ describe("css gradient scanner + binding decl parse (issue #164 CodeQL follow-up)", () => {
133
+ it("scans a wall of unclosed gradient heads linearly", async () => {
134
+ const { scanCssGradients } = await import("../css-gradient-scan.js");
135
+ const evil = "conic-gradient(".repeat(20_000);
136
+ expect(underBudget(() => scanCssGradients(evil))).toBeLessThan(BUDGET_MS);
137
+ expect(scanCssGradients(evil)).toEqual([]);
138
+ });
139
+
140
+ it("still extracts nested-paren gradients correctly (behaviour equivalence)", async () => {
141
+ const { scanCssGradients } = await import("../css-gradient-scan.js");
142
+ const css =
143
+ "a{background:linear-gradient(135deg, rgba(15,23,42,0.5), #fff)} b{x:repeating-linear-gradient(45deg, #000 0 2px)}";
144
+ const found = scanCssGradients(css).map((m) => m.literal);
145
+ expect(found).toEqual([
146
+ "linear-gradient(135deg, rgba(15,23,42,0.5), #fff)",
147
+ "repeating-linear-gradient(45deg, #000 0 2px)",
148
+ ]);
149
+ });
150
+
151
+ it("builds the theme value map linearly on adversarial dash runs", async () => {
152
+ const { buildThemeValueMap } = await import("../theme-literal-binding.js");
153
+ const tokens = {
154
+ color: { primary: { $type: "color", $value: "#4f46e5" } },
155
+ } as unknown as import("../themes.js").ThemeDocument;
156
+ // The map parse consumes renderer OUTPUT, but harden the parse
157
+ // itself against pathological documents producing long dash names.
158
+ expect(underBudget(() => buildThemeValueMap(tokens))).toBeLessThan(BUDGET_MS);
159
+ });
160
+ });
@@ -0,0 +1,106 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+
3
+ /**
4
+ * issue #159 + audit #2 — `add_module` mode gate. Two shapes: place-existing
5
+ * via `moduleId`, or mint via `displayName` + `html`. A call with NEITHER
6
+ * fails at the boundary naming both valid shapes. A `moduleId` call is
7
+ * placement-only and TOLERATES extra authoring fields (§1A/§11 — a placement
8
+ * that can succeed must not fail over an extra field); the tool handler, not
9
+ * the schema, surfaces an info for any carried field that was not applied. The
10
+ * gate is identical across every `target` (page/layout/template), so it lives
11
+ * once on the unified schema.
12
+ */
13
+
14
+ import { describe, expect, it } from "bun:test";
15
+ import { addModuleToolInput } from "./ai-tools.js";
16
+
17
+ const BASE = {
18
+ target: "page" as const,
19
+ targetRef: "11111111-1111-4111-8111-111111111101",
20
+ blockName: "content",
21
+ position: "bottom" as const,
22
+ };
23
+
24
+ describe("addModuleToolInput modes (issue #159)", () => {
25
+ it("accepts place mode: moduleId alone", () => {
26
+ const r = addModuleToolInput.safeParse({
27
+ ...BASE,
28
+ moduleId: "11111111-1111-4111-8111-111111111102",
29
+ });
30
+ expect(r.success).toBe(true);
31
+ });
32
+
33
+ it("accepts mint mode: displayName + html (+ fields carrying content)", () => {
34
+ // 2026-07 — a mint with declared fields must bring its content in
35
+ // the same call (`values` or field defaults); bare fields would
36
+ // render empty placeholders and are rejected.
37
+ const r = addModuleToolInput.safeParse({
38
+ ...BASE,
39
+ displayName: "Hero",
40
+ html: "<h1>{{hero_title}}</h1>",
41
+ fields: [{ name: "hero_title", label: "Hero title", kind: "text" }],
42
+ values: { hero_title: "Welcome" },
43
+ });
44
+ expect(r.success).toBe(true);
45
+ });
46
+
47
+ it("rejects mint mode with fields but neither values nor defaults (empty placeholders)", () => {
48
+ const r = addModuleToolInput.safeParse({
49
+ ...BASE,
50
+ displayName: "Hero",
51
+ html: "<h1>{{hero_title}}</h1>",
52
+ fields: [{ name: "hero_title", label: "Hero title", kind: "text" }],
53
+ });
54
+ expect(r.success).toBe(false);
55
+ if (!r.success) {
56
+ expect(JSON.stringify(r.error.issues)).toContain("initial content");
57
+ }
58
+ });
59
+
60
+ it("accepts place mode against a layout target too", () => {
61
+ const r = addModuleToolInput.safeParse({
62
+ target: "layout",
63
+ targetRef: "site-default",
64
+ blockName: "footer",
65
+ position: "bottom",
66
+ moduleId: "11111111-1111-4111-8111-111111111102",
67
+ });
68
+ expect(r.success).toBe(true);
69
+ });
70
+
71
+ it("TOLERATES a moduleId call carrying authoring keys (incl. structural html) — placement-only, handler surfaces the ignored-authoring info", () => {
72
+ // §1A/§11 — a valid placement must never fail over an extra authoring
73
+ // field. moduleId + html passes; the tool handler (not the schema)
74
+ // reports that html was not applied and points at edit_module.
75
+ const r = addModuleToolInput.safeParse({
76
+ ...BASE,
77
+ moduleId: "11111111-1111-4111-8111-111111111102",
78
+ html: "<p>hi</p>",
79
+ });
80
+ expect(r.success).toBe(true);
81
+ });
82
+
83
+ it("TOLERATES moduleId + metadata (displayName) — a harmless redundant label on a reuse", () => {
84
+ const r = addModuleToolInput.safeParse({
85
+ ...BASE,
86
+ moduleId: "11111111-1111-4111-8111-111111111102",
87
+ displayName: "Site Header",
88
+ });
89
+ expect(r.success).toBe(true);
90
+ });
91
+
92
+ it("rejects a call with neither mode, pointing at both valid shapes", () => {
93
+ const r = addModuleToolInput.safeParse({ ...BASE });
94
+ expect(r.success).toBe(false);
95
+ if (!r.success) {
96
+ const msg = r.error.issues.map((i) => i.message).join(" ");
97
+ expect(msg).toContain("moduleId");
98
+ expect(msg).toContain("displayName");
99
+ }
100
+ });
101
+
102
+ it("rejects mint mode missing html", () => {
103
+ const r = addModuleToolInput.safeParse({ ...BASE, displayName: "Hero" });
104
+ expect(r.success).toBe(false);
105
+ });
106
+ });
@@ -0,0 +1,134 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+
3
+ /**
4
+ * v0.6.2 — `positionInputSchema` coercion test. The AI recurrently
5
+ * passes JSON-quoted numbers (`"0"`, `"42"`) to the `position` field
6
+ * on the three `add_module_to_*` tools even though the tool
7
+ * description says to use bare integers. The schema now coerces
8
+ * digit-only strings; non-numeric strings still fail cleanly.
9
+ *
10
+ * Pins the contract so a future "harden the validator" pass doesn't
11
+ * silently re-introduce the AI-facing schema-rejection that v0.6.2
12
+ * fixed.
13
+ */
14
+
15
+ import { describe, expect, it } from "bun:test";
16
+
17
+ import { addModuleToolInput, positionInputSchema } from "./ai-tools.js";
18
+
19
+ const UUID = "11111111-1111-4111-8111-aaaaaaaaaaaa";
20
+
21
+ describe("positionInputSchema (v0.6.2)", () => {
22
+ it("accepts literal 'top' / 'bottom'", () => {
23
+ expect(positionInputSchema.safeParse("top").success).toBe(true);
24
+ expect(positionInputSchema.safeParse("bottom").success).toBe(true);
25
+ });
26
+
27
+ it("accepts bare integers (0..1000)", () => {
28
+ expect(positionInputSchema.safeParse(0).success).toBe(true);
29
+ expect(positionInputSchema.safeParse(42).success).toBe(true);
30
+ expect(positionInputSchema.safeParse(1000).success).toBe(true);
31
+ });
32
+
33
+ it("coerces digit-only strings to integers (the v0.6.2 ergonomic fix)", () => {
34
+ const r0 = positionInputSchema.safeParse("0");
35
+ expect(r0.success).toBe(true);
36
+ if (r0.success) expect(r0.data).toBe(0);
37
+
38
+ const r42 = positionInputSchema.safeParse("42");
39
+ expect(r42.success).toBe(true);
40
+ if (r42.success) expect(r42.data).toBe(42);
41
+ });
42
+
43
+ it("rejects non-numeric strings (not 'top'/'bottom')", () => {
44
+ expect(positionInputSchema.safeParse("middle").success).toBe(false);
45
+ expect(positionInputSchema.safeParse("abc").success).toBe(false);
46
+ expect(positionInputSchema.safeParse("").success).toBe(false);
47
+ });
48
+
49
+ it("rejects negative + over-range integers", () => {
50
+ expect(positionInputSchema.safeParse(-1).success).toBe(false);
51
+ expect(positionInputSchema.safeParse(1001).success).toBe(false);
52
+ expect(positionInputSchema.safeParse("-1").success).toBe(false);
53
+ });
54
+
55
+ it("rejects floats + scientific notation strings", () => {
56
+ expect(positionInputSchema.safeParse(0.5).success).toBe(false);
57
+ expect(positionInputSchema.safeParse("0.5").success).toBe(false);
58
+ expect(positionInputSchema.safeParse("1e2").success).toBe(false);
59
+ });
60
+
61
+ // issue #106 (step-13 round-6) — the model sometimes OVER-quotes the
62
+ // literal, emitting the JSON string `"\"bottom\""` (the value WITH its
63
+ // surrounding quote characters) rather than `bottom`. The outer
64
+ // stripSurroundingQuotes preprocess unwraps one layer of matching quotes so
65
+ // these normalize instead of failing with a bare `Invalid input`.
66
+ describe("over-quoted literals (issue #106 round-6)", () => {
67
+ it("accepts an over-quoted 'bottom' / 'top'", () => {
68
+ const rb = positionInputSchema.safeParse('"bottom"');
69
+ expect(rb.success).toBe(true);
70
+ if (rb.success) expect(rb.data).toBe("bottom");
71
+
72
+ const rt = positionInputSchema.safeParse('"top"');
73
+ expect(rt.success).toBe(true);
74
+ if (rt.success) expect(rt.data).toBe("top");
75
+ });
76
+
77
+ it("accepts an over-quoted digit string and still coerces it to a number", () => {
78
+ const r = positionInputSchema.safeParse('"0"');
79
+ expect(r.success).toBe(true);
80
+ if (r.success) expect(r.data).toBe(0);
81
+ });
82
+
83
+ it("unwraps single-quoted literals too", () => {
84
+ const r = positionInputSchema.safeParse("'bottom'");
85
+ expect(r.success).toBe(true);
86
+ if (r.success) expect(r.data).toBe("bottom");
87
+ });
88
+
89
+ it("still rejects garbage even when over-quoted (no silent fallback, §2)", () => {
90
+ expect(positionInputSchema.safeParse('"middle"').success).toBe(false);
91
+ expect(positionInputSchema.safeParse('"abc"').success).toBe(false);
92
+ // only ONE layer is stripped — a doubly-quoted value stays invalid
93
+ expect(positionInputSchema.safeParse('""bottom""').success).toBe(false);
94
+ expect(positionInputSchema.safeParse(null).success).toBe(false);
95
+ expect(positionInputSchema.safeParse(undefined).success).toBe(false);
96
+ });
97
+ });
98
+
99
+ it("propagates to addModuleToolInput (target='page')", () => {
100
+ const r = addModuleToolInput.safeParse({
101
+ target: "page",
102
+ targetRef: UUID,
103
+ blockName: "content",
104
+ position: "0", // the AI's typical mistake
105
+ displayName: "x",
106
+ html: "<p>x</p>",
107
+ });
108
+ expect(r.success).toBe(true);
109
+ });
110
+
111
+ it("propagates to addModuleToolInput (target='template')", () => {
112
+ const r = addModuleToolInput.safeParse({
113
+ target: "template",
114
+ targetRef: UUID,
115
+ blockName: "content",
116
+ position: "3",
117
+ displayName: "x",
118
+ html: "<p>x</p>",
119
+ });
120
+ expect(r.success).toBe(true);
121
+ });
122
+
123
+ it("propagates to addModuleToolInput (target='layout')", () => {
124
+ const r = addModuleToolInput.safeParse({
125
+ target: "layout",
126
+ targetRef: "site-default",
127
+ blockName: "header",
128
+ position: "0",
129
+ displayName: "x",
130
+ html: "<p>x</p>",
131
+ });
132
+ expect(r.success).toBe(true);
133
+ });
134
+ });
@@ -0,0 +1,81 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+
3
+ import { describe, expect, it } from "bun:test";
4
+ import {
5
+ chatPublishInput,
6
+ chatSendMessageInput,
7
+ editModuleToolInput,
8
+ siteMemoryProposeToolInput,
9
+ } from "./ai-tools.js";
10
+
11
+ const UUID = "11111111-1111-4111-8111-111111111111";
12
+ const UUID_2 = "22222222-2222-4222-8222-222222222222";
13
+
14
+ describe("editModuleToolInput", () => {
15
+ it("accepts a minimal valid edit", () => {
16
+ const r = editModuleToolInput.safeParse({ moduleId: UUID, html: "<p>x</p>" });
17
+ expect(r.success).toBe(true);
18
+ });
19
+
20
+ it("rejects unknown keys (.strict)", () => {
21
+ const r = editModuleToolInput.safeParse({
22
+ moduleId: UUID,
23
+ html: "<p>x</p>",
24
+ pageId: UUID_2,
25
+ });
26
+ expect(r.success).toBe(false);
27
+ });
28
+
29
+ it("rejects oversized html", () => {
30
+ const r = editModuleToolInput.safeParse({
31
+ moduleId: UUID,
32
+ html: "x".repeat(300_000),
33
+ });
34
+ expect(r.success).toBe(false);
35
+ });
36
+ });
37
+
38
+ describe("siteMemoryProposeToolInput", () => {
39
+ it("accepts a valid proposal", () => {
40
+ const r = siteMemoryProposeToolInput.safeParse({
41
+ slot: "brand-voice",
42
+ body: "terse",
43
+ rationale: "user repeatedly asks for brevity",
44
+ });
45
+ expect(r.success).toBe(true);
46
+ });
47
+
48
+ it("rejects an unknown slot", () => {
49
+ const r = siteMemoryProposeToolInput.safeParse({
50
+ slot: "made-up-slot",
51
+ body: "x",
52
+ rationale: "y",
53
+ });
54
+ expect(r.success).toBe(false);
55
+ });
56
+ });
57
+
58
+ describe("chatSendMessageInput", () => {
59
+ it("accepts a message with chips", () => {
60
+ const r = chatSendMessageInput.safeParse({
61
+ chatSessionId: UUID,
62
+ content: "make these green",
63
+ chips: [{ moduleId: UUID_2, selector: "#hero h1", label: "Hero headline" }],
64
+ });
65
+ expect(r.success).toBe(true);
66
+ });
67
+
68
+ it("defaults chips to empty array when omitted", () => {
69
+ const r = chatSendMessageInput.safeParse({ chatSessionId: UUID, content: "hi" });
70
+ expect(r.success).toBe(true);
71
+ if (!r.success) return;
72
+ expect(r.data.chips).toEqual([]);
73
+ });
74
+ });
75
+
76
+ describe("chatPublishInput", () => {
77
+ it("requires uuid", () => {
78
+ expect(chatPublishInput.safeParse({ chatSessionId: UUID }).success).toBe(true);
79
+ expect(chatPublishInput.safeParse({ chatSessionId: "not-uuid" }).success).toBe(false);
80
+ });
81
+ });