canopycms 0.0.61 → 0.0.63

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 (237) hide show
  1. package/dist/ai/index.d.ts +9 -0
  2. package/dist/ai/index.d.ts.map +1 -1
  3. package/dist/ai/index.js +9 -0
  4. package/dist/ai/index.js.map +1 -1
  5. package/dist/ai/json-to-markdown.js +1 -2
  6. package/dist/ai/json-to-markdown.js.map +1 -1
  7. package/dist/ai/to-plain-text.d.ts +57 -0
  8. package/dist/ai/to-plain-text.d.ts.map +1 -0
  9. package/dist/ai/to-plain-text.js +255 -0
  10. package/dist/ai/to-plain-text.js.map +1 -0
  11. package/dist/ai/transform-components.d.ts.map +1 -1
  12. package/dist/ai/transform-components.js +70 -5
  13. package/dist/ai/transform-components.js.map +1 -1
  14. package/dist/api/__test__/mock-client.d.ts +5 -1
  15. package/dist/api/__test__/mock-client.d.ts.map +1 -1
  16. package/dist/api/__test__/mock-client.js +9 -2
  17. package/dist/api/__test__/mock-client.js.map +1 -1
  18. package/dist/api/admin-branch-health.d.ts +36 -1
  19. package/dist/api/admin-branch-health.d.ts.map +1 -1
  20. package/dist/api/admin-branch-health.js +176 -2
  21. package/dist/api/admin-branch-health.js.map +1 -1
  22. package/dist/api/admin.d.ts +8 -1
  23. package/dist/api/admin.d.ts.map +1 -1
  24. package/dist/api/admin.js.map +1 -1
  25. package/dist/api/branch.d.ts.map +1 -1
  26. package/dist/api/branch.js +16 -2
  27. package/dist/api/branch.js.map +1 -1
  28. package/dist/api/client.d.ts +5 -1
  29. package/dist/api/client.d.ts.map +1 -1
  30. package/dist/api/client.js +6 -0
  31. package/dist/api/client.js.map +1 -1
  32. package/dist/api/content.d.ts +11 -5
  33. package/dist/api/content.d.ts.map +1 -1
  34. package/dist/api/content.js +79 -6
  35. package/dist/api/content.js.map +1 -1
  36. package/dist/api/entries.d.ts +10 -0
  37. package/dist/api/entries.d.ts.map +1 -1
  38. package/dist/api/entries.js +40 -15
  39. package/dist/api/entries.js.map +1 -1
  40. package/dist/api/schema.d.ts +4 -4
  41. package/dist/api/schema.d.ts.map +1 -1
  42. package/dist/api/schema.js +13 -13
  43. package/dist/api/schema.js.map +1 -1
  44. package/dist/assets/transform.d.ts.map +1 -1
  45. package/dist/assets/transform.js +19 -6
  46. package/dist/assets/transform.js.map +1 -1
  47. package/dist/authorization/branch.d.ts +55 -3
  48. package/dist/authorization/branch.d.ts.map +1 -1
  49. package/dist/authorization/branch.js +55 -9
  50. package/dist/authorization/branch.js.map +1 -1
  51. package/dist/authorization/types.d.ts +1 -1
  52. package/dist/authorization/types.d.ts.map +1 -1
  53. package/dist/branch-health.d.ts +13 -0
  54. package/dist/branch-health.d.ts.map +1 -1
  55. package/dist/branch-health.js +23 -0
  56. package/dist/branch-health.js.map +1 -1
  57. package/dist/build-canopy.d.ts +49 -0
  58. package/dist/build-canopy.d.ts.map +1 -0
  59. package/dist/build-canopy.js +51 -0
  60. package/dist/build-canopy.js.map +1 -0
  61. package/dist/cli/cli.js +935 -562
  62. package/dist/cli/generate-ai-content.js +837 -480
  63. package/dist/cli/init.js +25 -7
  64. package/dist/cli/template-files/Dockerfile.cms.template +19 -1
  65. package/dist/cli/template-files/canopycms.config.ts.template +25 -1
  66. package/dist/cli/template-files/cms-stack.ts.template +7 -1
  67. package/dist/client.d.ts +1 -0
  68. package/dist/client.d.ts.map +1 -1
  69. package/dist/client.js.map +1 -1
  70. package/dist/config/schemas/field.d.ts +15 -15
  71. package/dist/config/types.d.ts +2 -2
  72. package/dist/config/types.d.ts.map +1 -1
  73. package/dist/config/types.js +0 -1
  74. package/dist/config/types.js.map +1 -1
  75. package/dist/config/validation.d.ts +9 -0
  76. package/dist/config/validation.d.ts.map +1 -1
  77. package/dist/config/validation.js +14 -0
  78. package/dist/config/validation.js.map +1 -1
  79. package/dist/content-id-index.d.ts +97 -5
  80. package/dist/content-id-index.d.ts.map +1 -1
  81. package/dist/content-id-index.js +170 -18
  82. package/dist/content-id-index.js.map +1 -1
  83. package/dist/content-listing.d.ts +110 -5
  84. package/dist/content-listing.d.ts.map +1 -1
  85. package/dist/content-listing.js +164 -23
  86. package/dist/content-listing.js.map +1 -1
  87. package/dist/content-reader.d.ts +41 -4
  88. package/dist/content-reader.d.ts.map +1 -1
  89. package/dist/content-reader.js +17 -4
  90. package/dist/content-reader.js.map +1 -1
  91. package/dist/content-store.d.ts +91 -8
  92. package/dist/content-store.d.ts.map +1 -1
  93. package/dist/content-store.js +443 -258
  94. package/dist/content-store.js.map +1 -1
  95. package/dist/content-tree.d.ts +31 -2
  96. package/dist/content-tree.d.ts.map +1 -1
  97. package/dist/content-tree.js +22 -5
  98. package/dist/content-tree.js.map +1 -1
  99. package/dist/context.d.ts +30 -10
  100. package/dist/context.d.ts.map +1 -1
  101. package/dist/context.js +55 -4
  102. package/dist/context.js.map +1 -1
  103. package/dist/editor/BranchManager.d.ts.map +1 -1
  104. package/dist/editor/BranchManager.js +18 -6
  105. package/dist/editor/BranchManager.js.map +1 -1
  106. package/dist/editor/CanopyEditor.d.ts.map +1 -1
  107. package/dist/editor/CanopyEditor.js +2 -2
  108. package/dist/editor/CanopyEditor.js.map +1 -1
  109. package/dist/editor/CanopyEditorPage.d.ts +9 -1
  110. package/dist/editor/CanopyEditorPage.d.ts.map +1 -1
  111. package/dist/editor/CanopyEditorPage.js +9 -2
  112. package/dist/editor/CanopyEditorPage.js.map +1 -1
  113. package/dist/editor/Editor.d.ts +9 -1
  114. package/dist/editor/Editor.d.ts.map +1 -1
  115. package/dist/editor/Editor.js +58 -24
  116. package/dist/editor/Editor.js.map +1 -1
  117. package/dist/editor/FormRenderer.d.ts.map +1 -1
  118. package/dist/editor/FormRenderer.js +12 -0
  119. package/dist/editor/FormRenderer.js.map +1 -1
  120. package/dist/editor/admin/SystemHealthPanel.js +6 -2
  121. package/dist/editor/admin/SystemHealthPanel.js.map +1 -1
  122. package/dist/editor/components/EntryCreateModal.d.ts +9 -1
  123. package/dist/editor/components/EntryCreateModal.d.ts.map +1 -1
  124. package/dist/editor/components/EntryCreateModal.js +4 -1
  125. package/dist/editor/components/EntryCreateModal.js.map +1 -1
  126. package/dist/editor/fields/DateTimeField.d.ts +46 -0
  127. package/dist/editor/fields/DateTimeField.d.ts.map +1 -0
  128. package/dist/editor/fields/DateTimeField.js +66 -0
  129. package/dist/editor/fields/DateTimeField.js.map +1 -0
  130. package/dist/editor/fields/NumberField.d.ts +34 -0
  131. package/dist/editor/fields/NumberField.d.ts.map +1 -0
  132. package/dist/editor/fields/NumberField.js +53 -0
  133. package/dist/editor/fields/NumberField.js.map +1 -0
  134. package/dist/editor/fields/NumberListField.d.ts +25 -0
  135. package/dist/editor/fields/NumberListField.d.ts.map +1 -0
  136. package/dist/editor/fields/NumberListField.js +53 -0
  137. package/dist/editor/fields/NumberListField.js.map +1 -0
  138. package/dist/editor/hooks/useBranchManager.d.ts.map +1 -1
  139. package/dist/editor/hooks/useBranchManager.js +115 -26
  140. package/dist/editor/hooks/useBranchManager.js.map +1 -1
  141. package/dist/editor/hooks/useDraftManager.d.ts +8 -0
  142. package/dist/editor/hooks/useDraftManager.d.ts.map +1 -1
  143. package/dist/editor/hooks/useDraftManager.js +261 -21
  144. package/dist/editor/hooks/useDraftManager.js.map +1 -1
  145. package/dist/editor/hooks/useEntryManager.d.ts +21 -0
  146. package/dist/editor/hooks/useEntryManager.d.ts.map +1 -1
  147. package/dist/editor/hooks/useEntryManager.js +25 -2
  148. package/dist/editor/hooks/useEntryManager.js.map +1 -1
  149. package/dist/editor/theme.d.ts +8 -8
  150. package/dist/entry-schema.d.ts +228 -8
  151. package/dist/entry-schema.d.ts.map +1 -1
  152. package/dist/entry-schema.js +124 -0
  153. package/dist/entry-schema.js.map +1 -1
  154. package/dist/git-manager.d.ts +51 -7
  155. package/dist/git-manager.d.ts.map +1 -1
  156. package/dist/git-manager.js +105 -14
  157. package/dist/git-manager.js.map +1 -1
  158. package/dist/http/handler.d.ts.map +1 -1
  159. package/dist/http/handler.js +70 -27
  160. package/dist/http/handler.js.map +1 -1
  161. package/dist/http/router.d.ts.map +1 -1
  162. package/dist/http/router.js +40 -3
  163. package/dist/http/router.js.map +1 -1
  164. package/dist/index.d.ts +1 -0
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +7 -0
  167. package/dist/index.js.map +1 -1
  168. package/dist/operating-mode/deployment-name-fixtures.d.ts +29 -0
  169. package/dist/operating-mode/deployment-name-fixtures.d.ts.map +1 -0
  170. package/dist/operating-mode/deployment-name-fixtures.js +55 -0
  171. package/dist/operating-mode/deployment-name-fixtures.js.map +1 -0
  172. package/dist/operating-mode/deployment-name.d.ts +9 -0
  173. package/dist/operating-mode/deployment-name.d.ts.map +1 -1
  174. package/dist/operating-mode/deployment-name.js +9 -1
  175. package/dist/operating-mode/deployment-name.js.map +1 -1
  176. package/dist/operating-mode/index.d.ts +2 -1
  177. package/dist/operating-mode/index.d.ts.map +1 -1
  178. package/dist/operating-mode/index.js +4 -1
  179. package/dist/operating-mode/index.js.map +1 -1
  180. package/dist/operating-mode/mode-env.d.ts +58 -0
  181. package/dist/operating-mode/mode-env.d.ts.map +1 -0
  182. package/dist/operating-mode/mode-env.js +97 -0
  183. package/dist/operating-mode/mode-env.js.map +1 -0
  184. package/dist/resolve-canopy-user.d.ts +34 -0
  185. package/dist/resolve-canopy-user.d.ts.map +1 -0
  186. package/dist/resolve-canopy-user.js +55 -0
  187. package/dist/resolve-canopy-user.js.map +1 -0
  188. package/dist/schema/schema-store.d.ts +53 -2
  189. package/dist/schema/schema-store.d.ts.map +1 -1
  190. package/dist/schema/schema-store.js +92 -21
  191. package/dist/schema/schema-store.js.map +1 -1
  192. package/dist/server.d.ts +60 -0
  193. package/dist/server.d.ts.map +1 -1
  194. package/dist/server.js +58 -0
  195. package/dist/server.js.map +1 -1
  196. package/dist/services.d.ts +1 -2
  197. package/dist/services.d.ts.map +1 -1
  198. package/dist/services.js +42 -12
  199. package/dist/services.js.map +1 -1
  200. package/dist/settings-workspace.d.ts +40 -0
  201. package/dist/settings-workspace.d.ts.map +1 -1
  202. package/dist/settings-workspace.js +139 -151
  203. package/dist/settings-workspace.js.map +1 -1
  204. package/dist/static/index.d.ts +65 -5
  205. package/dist/static/index.d.ts.map +1 -1
  206. package/dist/static/index.js +65 -12
  207. package/dist/static/index.js.map +1 -1
  208. package/dist/static/seo.d.ts +150 -0
  209. package/dist/static/seo.d.ts.map +1 -0
  210. package/dist/static/seo.js +189 -0
  211. package/dist/static/seo.js.map +1 -0
  212. package/dist/types.d.ts +10 -0
  213. package/dist/types.d.ts.map +1 -1
  214. package/dist/utils/content-write-lock.d.ts +127 -0
  215. package/dist/utils/content-write-lock.d.ts.map +1 -0
  216. package/dist/utils/content-write-lock.js +170 -0
  217. package/dist/utils/content-write-lock.js.map +1 -0
  218. package/dist/utils/error.d.ts +1 -1
  219. package/dist/utils/error.js +1 -1
  220. package/dist/utils/git.d.ts +16 -0
  221. package/dist/utils/git.d.ts.map +1 -1
  222. package/dist/utils/git.js +22 -0
  223. package/dist/utils/git.js.map +1 -1
  224. package/dist/utils/sanitize-href.d.ts +74 -3
  225. package/dist/utils/sanitize-href.d.ts.map +1 -1
  226. package/dist/utils/sanitize-href.js +125 -6
  227. package/dist/utils/sanitize-href.js.map +1 -1
  228. package/dist/validation/entry-link-validator.d.ts +1 -1
  229. package/dist/validation/entry-link-validator.js +3 -3
  230. package/dist/validation/entry-link-validator.js.map +1 -1
  231. package/dist/validation/entry-validator.js +1 -1
  232. package/dist/validation/entry-validator.js.map +1 -1
  233. package/dist/worker/cms-worker.d.ts +13 -0
  234. package/dist/worker/cms-worker.d.ts.map +1 -1
  235. package/dist/worker/cms-worker.js +326 -264
  236. package/dist/worker/cms-worker.js.map +1 -1
  237. package/package.json +2 -2
@@ -0,0 +1,170 @@
1
+ /**
2
+ * [SYNC-C1] Cross-host mutual exclusion between the worker's rebase loop and
3
+ * content writes against the same branch working tree.
4
+ *
5
+ * Production runs a Lambda (API) and an EC2 worker over one EFS filesystem.
6
+ * `ContentStore`'s write/delete/rename critical sections were guarded only by
7
+ * the in-process mutex (`utils/async-mutex`), which does not cross that
8
+ * boundary, while `CmsWorker.rebaseActiveBranches()` rewrites the very same
9
+ * working tree. A write landing after `git rebase` started is destroyed two
10
+ * ways -- `git checkout --theirs <file>` overwrites it with the branch's
11
+ * committed version (and the rebase then SUCCEEDS, logging nothing), and
12
+ * `git rebase --abort` hard-resets the tree. Either way the editor already got
13
+ * its 200. This lock is what serializes the two.
14
+ *
15
+ * **Asymmetric by design.** The worker retries every branch on its next sync
16
+ * cycle (~5 minutes) while the editor is a person waiting on a save, so the
17
+ * worker yields and the writer waits:
18
+ *
19
+ * - Worker: {@link tryAcquireContentWriteLock} -- zero retries. On contention
20
+ * it skips that branch this cycle (an extension of the existing
21
+ * skip-dirty-branches behavior) and picks it up next cycle.
22
+ * - Writers: {@link withContentWriteLock} -- a short bounded wait, then a
23
+ * retriable failure the API surfaces as a 409.
24
+ *
25
+ * **Reads never take this lock.** An extra EFS round-trip on every read is not
26
+ * an acceptable price, and a read racing a rebase gets a consistent-enough
27
+ * older or newer file, never a destroyed one.
28
+ *
29
+ * ## Why the lock is anchored on `{branchRoot}/.canopy-meta`
30
+ *
31
+ * proper-lockfile keys its module-level `locks{}` bookkeeping (refresh timer,
32
+ * release function) by the **target path** passed to `lock()`, NOT by
33
+ * `lockfilePath`. The provisioning lock targets `path.dirname(branchRoot)` --
34
+ * the shared content-branches directory -- so anchoring here on that same
35
+ * directory with a different lock NAME would land on the same registry key:
36
+ * one process holding both (a Lambda container provisioning a workspace and
37
+ * writing content) would have the second acquisition clobber the first's
38
+ * bookkeeping. Targeting `{branchRoot}/.canopy-meta` instead gives:
39
+ *
40
+ * - a distinct in-process registry key from the provisioning lock (and from
41
+ * every other branch's content lock -- the provisioning locks already share
42
+ * one key across branches);
43
+ * - a distinct on-disk lock directory, so the server-enforced mkdir cannot
44
+ * collide either; and
45
+ * - no deadlock potential: the two locks are never both required, and the only
46
+ * possible acquisition order (provision, then write) is consistent.
47
+ *
48
+ * `.canopy-meta/` is git-excluded in every branch clone (`ensureGitExclude`),
49
+ * so the lock directory can never dirty the working tree or be swept into
50
+ * `git add .` at publish time.
51
+ *
52
+ * ## Honest caveat (do not oversell this)
53
+ *
54
+ * `proper-lockfile` decides a holder is dead by reading the lock directory's
55
+ * mtime with `fs.stat`, which on EFS is served through the NFS attribute
56
+ * cache. A live holder refreshes every `stale/2`, but a waiter can read a
57
+ * cached mtime and conclude the lock is stale when it is not, taking it over.
58
+ * The failure mode of a bad takeover is exactly today's behavior (two
59
+ * unsynchronized writers), so this is a strict improvement -- not a proof of
60
+ * mutual exclusion. See docs/concurrency.md.
61
+ */
62
+ import path from 'node:path';
63
+ import { isNodeError } from './error.js';
64
+ import { tryAcquireProvisioningLock } from './provisioning-lock.js';
65
+ /** Directory the lock marker lives in, relative to the branch root. */
66
+ const META_DIR = '.canopy-meta';
67
+ /** On-disk name of the lock marker (a directory, created by mkdir). */
68
+ export const CONTENT_WRITE_LOCK_NAME = 'content-write.lock';
69
+ /**
70
+ * Default bounded wait for a content write.
71
+ *
72
+ * Deliberately short. A rebase holds this lock for a fetch plus a replay plus
73
+ * N conflict rounds of git subprocesses on EFS -- far longer than any wait an
74
+ * interactive save can absorb, and longer than the API's own latency budget.
75
+ * So the wait is not sized to outlast a rebase (nothing reasonable could); it
76
+ * is sized to absorb lock handoff and the short holds of other writers, and to
77
+ * turn everything longer into a fast, explicit "retry" the editor can act on
78
+ * rather than a request that hangs toward the Lambda timeout. The worker
79
+ * revisits the branch next cycle, so the blocked state is transient.
80
+ *
81
+ * This is ALSO the writer-vs-writer budget, not only the rebase one. The lock
82
+ * is per-branch-root, so every write to one branch now serializes behind it
83
+ * where in-process serialization used to be per-entry -- bounded on Lambda
84
+ * (one invocation per container), but real under `next dev` and build-time
85
+ * provisioning across worker processes. The case to watch is a write whose
86
+ * in-lock path triggers a full `idIndex()` rescan of a large tree over EFS:
87
+ * that can plausibly exceed this budget and start 409ing unrelated saves.
88
+ * Making it configurable for prod tuning is tracked in
89
+ * .claude/future-tasks/content-write-lock-tuning-and-granularity.md.
90
+ */
91
+ export const DEFAULT_CONTENT_WRITE_LOCK_WAIT_MS = 2000;
92
+ /**
93
+ * Thrown when the bounded wait expires with the branch's content lock still
94
+ * held. Retriable -- callers translate this into a 409 with a message that
95
+ * says so.
96
+ *
97
+ * The message says "syncing OR another save" because BOTH produce it. The
98
+ * lock is taken by `write`/`delete`/`renameEntry` and by the admin
99
+ * repair-content-duplicates action as well as by the worker's rebase, so a
100
+ * message naming only the rebase was a confident claim about something that
101
+ * may not be happening. `api/content.ts` routes this error ahead of the
102
+ * generic conflict specifically so the editor sees this wording, which makes
103
+ * the wording load-bearing rather than cosmetic.
104
+ */
105
+ export class ContentWriteLockBusyError extends Error {
106
+ constructor(message = 'This branch is busy (syncing with the base branch, or another save is in flight); the change was not saved. Try again in a moment.') {
107
+ super(message);
108
+ this.name = 'ContentWriteLockBusyError';
109
+ }
110
+ }
111
+ /** The directory proper-lockfile anchors on -- also its in-process registry key. */
112
+ function lockTargetDir(branchRoot) {
113
+ return path.join(path.resolve(branchRoot), META_DIR);
114
+ }
115
+ const sleep = (ms) => new Promise((resolve) => {
116
+ setTimeout(resolve, ms);
117
+ });
118
+ /**
119
+ * Acquire the branch's content-write lock WITHOUT waiting.
120
+ *
121
+ * Throws an error with `code === 'ELOCKED'` when a live holder has it. Used by
122
+ * the worker's rebase loop (which skips the branch and retries next cycle) and
123
+ * by tests standing in for a writer.
124
+ */
125
+ export function tryAcquireContentWriteLock(branchRoot) {
126
+ return tryAcquireProvisioningLock(lockTargetDir(branchRoot), CONTENT_WRITE_LOCK_NAME);
127
+ }
128
+ /**
129
+ * Acquire the branch's content-write lock with a short bounded wait.
130
+ *
131
+ * Retries ONLY on genuine contention (`ELOCKED`), the same discipline
132
+ * `withOccFileLock` uses: proper-lockfile's own retry loop retries blindly on
133
+ * any error, which would burn the whole budget re-hitting e.g. ENOENT after
134
+ * the branch directory was deleted out from under the caller.
135
+ *
136
+ * @throws ContentWriteLockBusyError when the budget expires under contention.
137
+ */
138
+ export async function acquireContentWriteLock(branchRoot, waitMs = DEFAULT_CONTENT_WRITE_LOCK_WAIT_MS) {
139
+ const startedAt = Date.now();
140
+ for (let attempt = 0;; attempt++) {
141
+ try {
142
+ return await tryAcquireContentWriteLock(branchRoot);
143
+ }
144
+ catch (err) {
145
+ if (!isNodeError(err) || err.code !== 'ELOCKED')
146
+ throw err;
147
+ const remaining = waitMs - (Date.now() - startedAt);
148
+ if (remaining <= 0)
149
+ throw new ContentWriteLockBusyError();
150
+ // Exponential backoff with jitter, capped so a long budget still polls
151
+ // often enough to pick the lock up promptly when the holder releases.
152
+ const base = Math.min(40 * 2 ** attempt, 250);
153
+ await sleep(Math.min(base * (0.5 + Math.random()), remaining));
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Run `fn` holding the branch's content-write lock, releasing it in a
159
+ * `finally` so a throw can never strand it.
160
+ */
161
+ export async function withContentWriteLock(branchRoot, fn, waitMs = DEFAULT_CONTENT_WRITE_LOCK_WAIT_MS) {
162
+ const release = await acquireContentWriteLock(branchRoot, waitMs);
163
+ try {
164
+ return await fn();
165
+ }
166
+ finally {
167
+ await release();
168
+ }
169
+ }
170
+ //# sourceMappingURL=content-write-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-write-lock.js","sourceRoot":"","sources":["../../src/utils/content-write-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAEhE,uEAAuE;AACvE,MAAM,QAAQ,GAAG,cAAc,CAAA;AAE/B,uEAAuE;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAA;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAA;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YACE,OAAO,GAAG,oIAAoI;QAE9I,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;IACzC,CAAC;CACF;AAED,oFAAoF;AACpF,SAAS,aAAa,CAAC,UAAkB;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAC1C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AACzB,CAAC,CAAC,CAAA;AAEJ;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAAkB;IAC3D,OAAO,0BAA0B,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,uBAAuB,CAAC,CAAA;AACvF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAkB,EAClB,SAAiB,kCAAkC;IAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,0BAA0B,CAAC,UAAU,CAAC,CAAA;QACrD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;gBAAE,MAAM,GAAG,CAAA;YAC1D,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAA;YACnD,IAAI,SAAS,IAAI,CAAC;gBAAE,MAAM,IAAI,yBAAyB,EAAE,CAAA;YACzD,uEAAuE;YACvE,sEAAsE;YACtE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,GAAG,CAAC,CAAA;YAC7C,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,EAAoB,EACpB,SAAiB,kCAAkC;IAEnD,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IACjE,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAA;IACnB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -15,7 +15,7 @@
15
15
  * try {
16
16
  * await riskyOperation()
17
17
  * } catch (err: unknown) {
18
- * console.error('Operation failed:', getErrorMessage(err))
18
+ * canopyLogError('Operation failed:', getErrorMessage(err))
19
19
  * }
20
20
  * ```
21
21
  */
@@ -15,7 +15,7 @@
15
15
  * try {
16
16
  * await riskyOperation()
17
17
  * } catch (err: unknown) {
18
- * console.error('Operation failed:', getErrorMessage(err))
18
+ * canopyLogError('Operation failed:', getErrorMessage(err))
19
19
  * }
20
20
  * ```
21
21
  */
@@ -56,6 +56,22 @@ export declare function isNonFastForwardRejection(message: string): boolean;
56
56
  * callers MUST pin the locale (`gitChildEnv`/`gitNetworkChildEnv`).
57
57
  */
58
58
  export declare function isStaleLeaseRejection(message: string): boolean;
59
+ /**
60
+ * Whether a `git fetch <remote> <branch>` failure is specifically "that ref
61
+ * doesn't exist on the remote" -- the ONLY benign fetch outcome, meaning the
62
+ * branch has never been pushed.
63
+ *
64
+ * Narrow on purpose, and the narrowness is the whole point. This predicate
65
+ * exists because a bare `catch` around the fetch classified EVERY failure --
66
+ * unreachable remote, auth denial, permission error on the workspace, corrupt
67
+ * object store -- as "nothing to pull", which callers then logged as normal
68
+ * and proceeded past. Anything this does not recognize must reach the caller
69
+ * as the genuine error it is.
70
+ *
71
+ * Same locale caveat as the predicates above: the text is gettext-translated,
72
+ * so callers MUST run git with a locale-pinning env (`gitChildEnv`).
73
+ */
74
+ export declare function isMissingRemoteRefFailure(message: string): boolean;
59
75
  /**
60
76
  * Detect the current HEAD branch name for a given repository root.
61
77
  * Returns the branch name, or the provided fallback (default 'main')
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAmBtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOvD;AAyBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKlE;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,EAAE,aAAa,CAAA;IACnB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlB"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAmBtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOvD;AAyBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKlE;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAOD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElE;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,IAAI,EAAE,aAAa,CAAA;IACnB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlB"}
package/dist/utils/git.js CHANGED
@@ -115,6 +115,28 @@ const STALE_LEASE_REASON = 'stale info';
115
115
  export function isStaleLeaseRejection(message) {
116
116
  return message.includes(REJECTED_MARKER) && message.includes(STALE_LEASE_REASON);
117
117
  }
118
+ // git's message when `git fetch <remote> <branch>` names a ref the remote does
119
+ // not have. Both spellings occur: modern git prints the lowercase form, older
120
+ // versions and some transports capitalize it.
121
+ const MISSING_REMOTE_REF_REASONS = ["couldn't find remote ref", "Couldn't find remote ref"];
122
+ /**
123
+ * Whether a `git fetch <remote> <branch>` failure is specifically "that ref
124
+ * doesn't exist on the remote" -- the ONLY benign fetch outcome, meaning the
125
+ * branch has never been pushed.
126
+ *
127
+ * Narrow on purpose, and the narrowness is the whole point. This predicate
128
+ * exists because a bare `catch` around the fetch classified EVERY failure --
129
+ * unreachable remote, auth denial, permission error on the workspace, corrupt
130
+ * object store -- as "nothing to pull", which callers then logged as normal
131
+ * and proceeded past. Anything this does not recognize must reach the caller
132
+ * as the genuine error it is.
133
+ *
134
+ * Same locale caveat as the predicates above: the text is gettext-translated,
135
+ * so callers MUST run git with a locale-pinning env (`gitChildEnv`).
136
+ */
137
+ export function isMissingRemoteRefFailure(message) {
138
+ return MISSING_REMOTE_REF_REASONS.some((reason) => message.includes(reason));
139
+ }
118
140
  /**
119
141
  * Detect the current HEAD branch name for a given repository root.
120
142
  * Returns the branch name, or the provided fallback (default 'main')
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,80 @@
1
+ /**
2
+ * Whether `url` declares an explicit scheme (`https:`, `mailto:`, `javascript:`, ...).
3
+ *
4
+ * This is the property that actually distinguishes "the author asked for another origin" from
5
+ * "the parser inferred one" -- see `sanitizeHref`'s doc for why a `startsWith('//')` /
6
+ * `startsWith('scheme://')` check is not sufficient on its own (WHATWG URL treats backslash as
7
+ * equivalent to forward slash for special schemes, so `/\evil.com`, `\\evil.com` and `\/evil.com`
8
+ * are all protocol-relative in effect despite declaring no scheme). Exported so every "is this
9
+ * URL off-site" check in the package shares one answer instead of re-deriving it -- see
10
+ * `isImplicitlyOffOrigin` below and `static/seo.ts`'s `isAbsoluteUrl`.
11
+ */
12
+ export declare function declaresScheme(url: string): boolean;
13
+ /**
14
+ * Whether `url`, resolved as a URL reference against a fixed sentinel origin, lands on a
15
+ * DIFFERENT origin than the sentinel WITHOUT itself declaring a scheme.
16
+ *
17
+ * True for a literal protocol-relative reference (`//host`) and for every WHATWG
18
+ * backslash-equivalent spelling that a browser resolves the same way (`/\host`, `\\host`,
19
+ * `\/host`, and combinations with stripped whitespace/control characters) -- these all read as
20
+ * "site-relative" to a naive string check but actually redefine the authority. False for a
21
+ * normal site-relative path (`/about`, `docs/guide`) and for a scheme-qualified absolute URL
22
+ * (`declaresScheme` already identifies those as intentionally off-site on their own).
23
+ *
24
+ * Callers that want to treat a LITERAL `//host` as an intentionally-supported off-site pointer
25
+ * (e.g. `static/seo.ts`'s `isAbsoluteUrl`, for a CDN-hosted `ogImage`) should check that
26
+ * separately and only fall back to this function to catch the spellings that slip past a
27
+ * `startsWith('//')` check.
28
+ */
29
+ export declare function isImplicitlyOffOrigin(url: string): boolean;
30
+ /**
31
+ * If `url` `isImplicitlyOffOrigin`, discard the authority it spoofed and return just the
32
+ * path/search/hash it resolved to -- e.g. `/\evil.com/x` (which parses to origin
33
+ * `https://evil.com`) becomes `/x`. Otherwise return `url` unchanged.
34
+ *
35
+ * This re-parses with the SAME sentinel technique rather than pattern-matching leading
36
+ * slash/backslash characters: WHATWG URL also strips tabs, newlines, and carriage returns during
37
+ * parsing (wherever they appear, not just at the edges), so `/\t/evil.com` is exactly as
38
+ * off-origin as `/\evil.com` despite having no leading backslash-or-slash run for a regex to
39
+ * find. Re-parsing gets this right for free instead of re-deriving the quirk a second time.
40
+ *
41
+ * Useful for a caller that wants to keep emitting SOME value for an implicitly-off-origin input
42
+ * rather than rejecting it outright (`sanitizeHref` rejects to a fallback instead; see
43
+ * `static/seo.ts`'s `resolveSeoUrl`, which has no fallback concept and must always return a
44
+ * same-origin string).
45
+ */
46
+ export declare function neutralizeImplicitOffOrigin(url: string): string;
1
47
  /**
2
48
  * Sanitize an untrusted URL for use in `href` attributes.
3
49
  *
4
- * Parses the input with `new URL()` and only allows `http:` and `https:` protocols,
5
- * blocking `javascript:`, `data:`, `vbscript:`, and other dangerous schemes.
6
- * Returns the fallback (default `'#'`) for invalid or disallowed URLs.
50
+ * Handles both absolute URLs (`https://example.com`) and relative
51
+ * references (`/about`, `docs/guide`, `#section`, `?q=1`) by parsing
52
+ * against a fixed sentinel base, then only allows `http:` and `https:`
53
+ * protocols, blocking `javascript:`, `data:`, `vbscript:`, and other
54
+ * dangerous schemes (an absolute URL supplies its own protocol regardless
55
+ * of the sentinel). Returns the fallback (default `'#'`) for invalid,
56
+ * empty, or disallowed input.
57
+ *
58
+ * Design decisions (deliberate, not oversights):
59
+ * - Protocol-relative input is rejected rather than resolved onto the
60
+ * sentinel's `https:` scheme. In a CMS content field, `//host` is far more
61
+ * likely to be a paste error or an injection attempt than an intentional
62
+ * protocol-relative link, so we don't let it through as an absolute
63
+ * off-site URL. This is enforced by checking whether the input DECLARES a
64
+ * scheme, not by matching a `//` prefix: WHATWG URL treats backslash as
65
+ * equivalent to slash for special schemes, so `/\evil.com`, `\\evil.com`
66
+ * and `\/evil.com` are all protocol-relative in effect. An earlier version
67
+ * of this function checked `startsWith('//')` and let all three through as
68
+ * `https://evil.com/` -- an open redirect out of the one function whose
69
+ * job is to prevent exactly that.
70
+ * - Fragment-only (`#section`) and query-only (`?q=1`) input resolves
71
+ * against the sentinel with pathname `/`; we strip that synthetic leading
72
+ * slash so the result stays a same-page reference (`#section`) instead of
73
+ * silently becoming a navigation to the site root (`/#section`).
74
+ * - Path-relative input with no leading slash (`docs/guide`) is returned as
75
+ * a root-relative path (`/docs/guide`). There is no notion of "current
76
+ * page" at sanitize time, so true path-relative resolution can't be
77
+ * reproduced faithfully - root-relative is the closest safe behavior.
7
78
  *
8
79
  * This utility breaks CodeQL's taint chain by constructing a new string from
9
80
  * the parsed URL rather than passing the original input through.
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize-href.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize-href.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAUhE"}
1
+ {"version":3,"file":"sanitize-href.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize-href.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAwChE"}
@@ -1,9 +1,100 @@
1
+ // Fixed sentinel base so relative references (root-relative, path-relative,
2
+ // fragment-only, query-only) resolve instead of throwing under `new URL()`.
3
+ // Never exposed in output - see the relative-reference branch below.
4
+ const SENTINEL_BASE = 'https://relative.invalid';
5
+ /**
6
+ * Whether `url` declares an explicit scheme (`https:`, `mailto:`, `javascript:`, ...).
7
+ *
8
+ * This is the property that actually distinguishes "the author asked for another origin" from
9
+ * "the parser inferred one" -- see `sanitizeHref`'s doc for why a `startsWith('//')` /
10
+ * `startsWith('scheme://')` check is not sufficient on its own (WHATWG URL treats backslash as
11
+ * equivalent to forward slash for special schemes, so `/\evil.com`, `\\evil.com` and `\/evil.com`
12
+ * are all protocol-relative in effect despite declaring no scheme). Exported so every "is this
13
+ * URL off-site" check in the package shares one answer instead of re-deriving it -- see
14
+ * `isImplicitlyOffOrigin` below and `static/seo.ts`'s `isAbsoluteUrl`.
15
+ */
16
+ export function declaresScheme(url) {
17
+ return /^[a-z][a-z0-9+.-]*:/i.test(url.trim());
18
+ }
19
+ /**
20
+ * Whether `url`, resolved as a URL reference against a fixed sentinel origin, lands on a
21
+ * DIFFERENT origin than the sentinel WITHOUT itself declaring a scheme.
22
+ *
23
+ * True for a literal protocol-relative reference (`//host`) and for every WHATWG
24
+ * backslash-equivalent spelling that a browser resolves the same way (`/\host`, `\\host`,
25
+ * `\/host`, and combinations with stripped whitespace/control characters) -- these all read as
26
+ * "site-relative" to a naive string check but actually redefine the authority. False for a
27
+ * normal site-relative path (`/about`, `docs/guide`) and for a scheme-qualified absolute URL
28
+ * (`declaresScheme` already identifies those as intentionally off-site on their own).
29
+ *
30
+ * Callers that want to treat a LITERAL `//host` as an intentionally-supported off-site pointer
31
+ * (e.g. `static/seo.ts`'s `isAbsoluteUrl`, for a CDN-hosted `ogImage`) should check that
32
+ * separately and only fall back to this function to catch the spellings that slip past a
33
+ * `startsWith('//')` check.
34
+ */
35
+ export function isImplicitlyOffOrigin(url) {
36
+ if (declaresScheme(url))
37
+ return false;
38
+ try {
39
+ return new URL(url, SENTINEL_BASE).origin !== SENTINEL_BASE;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ /**
46
+ * If `url` `isImplicitlyOffOrigin`, discard the authority it spoofed and return just the
47
+ * path/search/hash it resolved to -- e.g. `/\evil.com/x` (which parses to origin
48
+ * `https://evil.com`) becomes `/x`. Otherwise return `url` unchanged.
49
+ *
50
+ * This re-parses with the SAME sentinel technique rather than pattern-matching leading
51
+ * slash/backslash characters: WHATWG URL also strips tabs, newlines, and carriage returns during
52
+ * parsing (wherever they appear, not just at the edges), so `/\t/evil.com` is exactly as
53
+ * off-origin as `/\evil.com` despite having no leading backslash-or-slash run for a regex to
54
+ * find. Re-parsing gets this right for free instead of re-deriving the quirk a second time.
55
+ *
56
+ * Useful for a caller that wants to keep emitting SOME value for an implicitly-off-origin input
57
+ * rather than rejecting it outright (`sanitizeHref` rejects to a fallback instead; see
58
+ * `static/seo.ts`'s `resolveSeoUrl`, which has no fallback concept and must always return a
59
+ * same-origin string).
60
+ */
61
+ export function neutralizeImplicitOffOrigin(url) {
62
+ if (!isImplicitlyOffOrigin(url))
63
+ return url;
64
+ const parsed = new URL(url, SENTINEL_BASE);
65
+ return parsed.pathname + parsed.search + parsed.hash;
66
+ }
1
67
  /**
2
68
  * Sanitize an untrusted URL for use in `href` attributes.
3
69
  *
4
- * Parses the input with `new URL()` and only allows `http:` and `https:` protocols,
5
- * blocking `javascript:`, `data:`, `vbscript:`, and other dangerous schemes.
6
- * Returns the fallback (default `'#'`) for invalid or disallowed URLs.
70
+ * Handles both absolute URLs (`https://example.com`) and relative
71
+ * references (`/about`, `docs/guide`, `#section`, `?q=1`) by parsing
72
+ * against a fixed sentinel base, then only allows `http:` and `https:`
73
+ * protocols, blocking `javascript:`, `data:`, `vbscript:`, and other
74
+ * dangerous schemes (an absolute URL supplies its own protocol regardless
75
+ * of the sentinel). Returns the fallback (default `'#'`) for invalid,
76
+ * empty, or disallowed input.
77
+ *
78
+ * Design decisions (deliberate, not oversights):
79
+ * - Protocol-relative input is rejected rather than resolved onto the
80
+ * sentinel's `https:` scheme. In a CMS content field, `//host` is far more
81
+ * likely to be a paste error or an injection attempt than an intentional
82
+ * protocol-relative link, so we don't let it through as an absolute
83
+ * off-site URL. This is enforced by checking whether the input DECLARES a
84
+ * scheme, not by matching a `//` prefix: WHATWG URL treats backslash as
85
+ * equivalent to slash for special schemes, so `/\evil.com`, `\\evil.com`
86
+ * and `\/evil.com` are all protocol-relative in effect. An earlier version
87
+ * of this function checked `startsWith('//')` and let all three through as
88
+ * `https://evil.com/` -- an open redirect out of the one function whose
89
+ * job is to prevent exactly that.
90
+ * - Fragment-only (`#section`) and query-only (`?q=1`) input resolves
91
+ * against the sentinel with pathname `/`; we strip that synthetic leading
92
+ * slash so the result stays a same-page reference (`#section`) instead of
93
+ * silently becoming a navigation to the site root (`/#section`).
94
+ * - Path-relative input with no leading slash (`docs/guide`) is returned as
95
+ * a root-relative path (`/docs/guide`). There is no notion of "current
96
+ * page" at sanitize time, so true path-relative resolution can't be
97
+ * reproduced faithfully - root-relative is the closest safe behavior.
7
98
  *
8
99
  * This utility breaks CodeQL's taint chain by constructing a new string from
9
100
  * the parsed URL rather than passing the original input through.
@@ -16,11 +107,39 @@
16
107
  * ```
17
108
  */
18
109
  export function sanitizeHref(url, fallback = '#') {
110
+ const trimmed = url.trim();
111
+ if (trimmed === '')
112
+ return fallback;
19
113
  try {
20
- const parsed = new URL(url);
21
- if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {
22
- return parsed.href;
114
+ const parsed = new URL(trimmed, SENTINEL_BASE);
115
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
116
+ return fallback;
117
+ }
118
+ // Reject protocol-relative references in EVERY spelling, by testing the
119
+ // property we actually care about rather than by enumerating syntax.
120
+ //
121
+ // A string-prefix check on '//' is not sufficient: WHATWG URL treats a
122
+ // backslash as equivalent to a forward slash for special schemes, so
123
+ // '/\evil.com', '\\evil.com' and '\/evil.com' are all protocol-relative
124
+ // in effect and each resolved to https://evil.com/ while sailing past a
125
+ // startsWith('//') guard. Tabs and newlines are stripped during parsing
126
+ // too, so the set of spellings is not one you can enumerate confidently.
127
+ //
128
+ // The property that actually distinguishes "the author asked for another
129
+ // origin" from "the parser inferred one" is whether the input DECLARES a
130
+ // scheme. If it does not and still resolved off the sentinel, it is
131
+ // protocol-relative however it was written.
132
+ if (parsed.origin !== SENTINEL_BASE && !declaresScheme(trimmed))
133
+ return fallback;
134
+ if (parsed.origin === SENTINEL_BASE) {
135
+ // Input was relative: return it as a relative reference rather than
136
+ // an absolute URL rebased onto the sentinel host.
137
+ const relative = parsed.pathname + parsed.search + parsed.hash;
138
+ // Fragment-only/query-only input resolves with pathname '/'; strip
139
+ // that synthetic leading slash so it stays a same-page reference.
140
+ return parsed.pathname === '/' && !trimmed.startsWith('/') ? relative.slice(1) : relative;
23
141
  }
142
+ return parsed.href;
24
143
  }
25
144
  catch {
26
145
  // invalid URL
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize-href.js","sourceRoot":"","sources":["../../src/utils/sanitize-href.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,QAAQ,GAAG,GAAG;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
1
+ {"version":3,"file":"sanitize-href.js","sourceRoot":"","sources":["../../src/utils/sanitize-href.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,qEAAqE;AACrE,MAAM,aAAa,GAAG,0BAA0B,CAAA;AAEhD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,MAAM,KAAK,aAAa,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACrD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAA;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAC1C,OAAO,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAA;AACtD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,QAAQ,GAAG,GAAG;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAA;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;QAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,wEAAwE;QACxE,qEAAqE;QACrE,EAAE;QACF,uEAAuE;QACvE,qEAAqE;QACrE,wEAAwE;QACxE,wEAAwE;QACxE,wEAAwE;QACxE,yEAAyE;QACzE,EAAE;QACF,yEAAyE;QACzE,yEAAyE;QACzE,oEAAoE;QACpE,4CAA4C;QAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAA;QAEhF,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACpC,oEAAoE;YACpE,kDAAkD;YAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAA;YAC9D,mEAAmE;YACnE,kEAAkE;YAClE,OAAO,MAAM,CAAC,QAAQ,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC3F,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -20,7 +20,7 @@ export interface EntryLinkValidationResult {
20
20
  /**
21
21
  * Validate entry links in body/markdown/mdx fields of the provided data.
22
22
  *
23
- * Scans all markdown, mdx, and rich-text fields for entry:ID patterns
23
+ * Scans all markdown and mdx fields for entry:ID patterns
24
24
  * and checks that each referenced ID exists in the content index.
25
25
  */
26
26
  export declare function validateEntryLinks(data: Record<string, unknown>, schema: readonly FieldConfig[], idIndex: ContentIdIndex, bodyContent?: string): EntryLinkValidationResult;
@@ -11,7 +11,7 @@ import { findFieldsByType } from './field-traversal.js';
11
11
  /**
12
12
  * Validate entry links in body/markdown/mdx fields of the provided data.
13
13
  *
14
- * Scans all markdown, mdx, and rich-text fields for entry:ID patterns
14
+ * Scans all markdown and mdx fields for entry:ID patterns
15
15
  * and checks that each referenced ID exists in the content index.
16
16
  */
17
17
  export function validateEntryLinks(data, schema, idIndex, bodyContent) {
@@ -20,8 +20,8 @@ export function validateEntryLinks(data, schema, idIndex, bodyContent) {
20
20
  if (bodyContent) {
21
21
  checkText(bodyContent, 'body', 'body', idIndex, warnings);
22
22
  }
23
- // Check markdown/mdx/rich-text fields in structured data
24
- const markdownTypes = ['markdown', 'mdx', 'rich-text'];
23
+ // Check markdown/mdx fields in structured data
24
+ const markdownTypes = ['markdown', 'mdx'];
25
25
  for (const fieldType of markdownTypes) {
26
26
  const contexts = findFieldsByType(schema, data, fieldType);
27
27
  for (const ctx of contexts) {
@@ -1 +1 @@
1
- {"version":3,"file":"entry-link-validator.js","sourceRoot":"","sources":["../../src/validation/entry-link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAapD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAA6B,EAC7B,MAA8B,EAC9B,OAAuB,EACvB,WAAoB;IAEpB,MAAM,QAAQ,GAAuB,EAAE,CAAA;IAEvC,sEAAsE;IACtE,IAAI,WAAW,EAAE,CAAC;QAChB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAED,yDAAyD;IACzD,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAU,CAAA;IAC/D,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;QAC1D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC/C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAED,SAAS,SAAS,CAChB,IAAY,EACZ,SAAiB,EACjB,SAAiB,EACjB,OAAuB,EACvB,QAA4B;IAE5B,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,SAAS;gBAChB,SAAS;gBACT,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO,EAAE,sCAAsC,IAAI,CAAC,EAAE,EAAE;aACzD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"entry-link-validator.js","sourceRoot":"","sources":["../../src/validation/entry-link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAapD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAA6B,EAC7B,MAA8B,EAC9B,OAAuB,EACvB,WAAoB;IAEpB,MAAM,QAAQ,GAAuB,EAAE,CAAA;IAEvC,sEAAsE;IACtE,IAAI,WAAW,EAAE,CAAC;QAChB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAED,+CAA+C;IAC/C,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,KAAK,CAAU,CAAA;IAClD,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;QAC1D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC/C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAA;AACrB,CAAC;AAED,SAAS,SAAS,CAChB,IAAY,EACZ,SAAiB,EACjB,SAAiB,EACjB,OAAuB,EACvB,QAA4B;IAE5B,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,SAAS;gBAChB,SAAS;gBACT,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO,EAAE,sCAAsC,IAAI,CAAC,EAAE,EAAE;aACzD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -28,7 +28,7 @@ import { findBodyFieldName } from '../utils/body-field.js';
28
28
  import { isDataOnlyFormat } from '../utils/format.js';
29
29
  const KNOWN_FIELD_TYPES = new Set(fieldTypes);
30
30
  /** Field types whose value is a plain string. */
31
- const STRING_FIELD_TYPES = new Set(['string', 'rich-text', 'markdown', 'mdx', 'code']);
31
+ const STRING_FIELD_TYPES = new Set(['string', 'markdown', 'mdx', 'code']);
32
32
  function isPlainRecord(value) {
33
33
  return typeof value === 'object' && value !== null && !Array.isArray(value);
34
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"entry-validator.js","sourceRoot":"","sources":["../../src/validation/entry-validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry-validator.js","sourceRoot":"","sources":["../../src/validation/entry-validator.ts"],"names":[],"mappings":"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"}