@atlasauth/emulator-core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/dist/custom-html.d.ts +57 -0
  2. package/dist/custom-html.js +491 -0
  3. package/dist/custom-html.js.map +1 -0
  4. package/dist/engine.d.ts +1 -1
  5. package/dist/engine.js +4 -0
  6. package/dist/engine.js.map +1 -1
  7. package/dist/error-catalog.js +8 -0
  8. package/dist/error-catalog.js.map +1 -1
  9. package/dist/event-gate.js +60 -2
  10. package/dist/event-gate.js.map +1 -1
  11. package/dist/generic.js +5 -1
  12. package/dist/generic.js.map +1 -1
  13. package/dist/handlers/access-signals.d.ts +48 -0
  14. package/dist/handlers/access-signals.js +76 -0
  15. package/dist/handlers/access-signals.js.map +1 -0
  16. package/dist/handlers/approvals.js +54 -1
  17. package/dist/handlers/approvals.js.map +1 -1
  18. package/dist/handlers/authz-data.d.ts +2 -0
  19. package/dist/handlers/authz-data.js +627 -0
  20. package/dist/handlers/authz-data.js.map +1 -0
  21. package/dist/handlers/authz-layers.d.ts +229 -0
  22. package/dist/handlers/authz-layers.js +786 -0
  23. package/dist/handlers/authz-layers.js.map +1 -0
  24. package/dist/handlers/authz-state.d.ts +80 -0
  25. package/dist/handlers/authz-state.js +175 -0
  26. package/dist/handlers/authz-state.js.map +1 -0
  27. package/dist/handlers/authz.js +240 -177
  28. package/dist/handlers/authz.js.map +1 -1
  29. package/dist/handlers/billing.d.ts +99 -1
  30. package/dist/handlers/billing.js +556 -77
  31. package/dist/handlers/billing.js.map +1 -1
  32. package/dist/handlers/cedar-ext.d.ts +35 -0
  33. package/dist/handlers/cedar-ext.js +174 -0
  34. package/dist/handlers/cedar-ext.js.map +1 -0
  35. package/dist/handlers/cedar.d.ts +146 -0
  36. package/dist/handlers/cedar.js +689 -0
  37. package/dist/handlers/cedar.js.map +1 -0
  38. package/dist/handlers/connections.d.ts +4 -1
  39. package/dist/handlers/connections.js +267 -38
  40. package/dist/handlers/connections.js.map +1 -1
  41. package/dist/handlers/control.js +6 -1
  42. package/dist/handlers/control.js.map +1 -1
  43. package/dist/handlers/device.js +18 -1
  44. package/dist/handlers/device.js.map +1 -1
  45. package/dist/handlers/emu3-misc.d.ts +38 -0
  46. package/dist/handlers/emu3-misc.js +1056 -0
  47. package/dist/handlers/emu3-misc.js.map +1 -0
  48. package/dist/handlers/emu4-actions-access.d.ts +46 -0
  49. package/dist/handlers/emu4-actions-access.js +107 -0
  50. package/dist/handlers/emu4-actions-access.js.map +1 -0
  51. package/dist/handlers/emu4-actions-catalog-extra.d.ts +3 -0
  52. package/dist/handlers/emu4-actions-catalog-extra.js +204 -0
  53. package/dist/handlers/emu4-actions-catalog-extra.js.map +1 -0
  54. package/dist/handlers/emu4-actions-catalog.d.ts +3 -0
  55. package/dist/handlers/emu4-actions-catalog.js +143 -0
  56. package/dist/handlers/emu4-actions-catalog.js.map +1 -0
  57. package/dist/handlers/emu4-actions-def.d.ts +50 -0
  58. package/dist/handlers/emu4-actions-def.js +250 -0
  59. package/dist/handlers/emu4-actions-def.js.map +1 -0
  60. package/dist/handlers/emu4-actions-sandbox.d.ts +36 -0
  61. package/dist/handlers/emu4-actions-sandbox.js +318 -0
  62. package/dist/handlers/emu4-actions-sandbox.js.map +1 -0
  63. package/dist/handlers/emu4-actions-typegen.d.ts +5 -0
  64. package/dist/handlers/emu4-actions-typegen.js +73 -0
  65. package/dist/handlers/emu4-actions-typegen.js.map +1 -0
  66. package/dist/handlers/emu4-actions.d.ts +2 -0
  67. package/dist/handlers/emu4-actions.js +506 -0
  68. package/dist/handlers/emu4-actions.js.map +1 -0
  69. package/dist/handlers/emu4-authz-trust.d.ts +40 -0
  70. package/dist/handlers/emu4-authz-trust.js +488 -0
  71. package/dist/handlers/emu4-authz-trust.js.map +1 -0
  72. package/dist/handlers/emu4-authz.d.ts +2 -0
  73. package/dist/handlers/emu4-authz.js +752 -0
  74. package/dist/handlers/emu4-authz.js.map +1 -0
  75. package/dist/handlers/emu4-billing-core.d.ts +23 -0
  76. package/dist/handlers/emu4-billing-core.js +22 -0
  77. package/dist/handlers/emu4-billing-core.js.map +1 -0
  78. package/dist/handlers/emu4-billing-x.d.ts +2 -0
  79. package/dist/handlers/emu4-billing-x.js +489 -0
  80. package/dist/handlers/emu4-billing-x.js.map +1 -0
  81. package/dist/handlers/emu4-billing.d.ts +14 -0
  82. package/dist/handlers/emu4-billing.js +846 -0
  83. package/dist/handlers/emu4-billing.js.map +1 -0
  84. package/dist/handlers/emu4-clones.d.ts +2 -0
  85. package/dist/handlers/emu4-clones.js +322 -0
  86. package/dist/handlers/emu4-clones.js.map +1 -0
  87. package/dist/handlers/emu4-compliance.d.ts +8 -0
  88. package/dist/handlers/emu4-compliance.js +39 -0
  89. package/dist/handlers/emu4-compliance.js.map +1 -0
  90. package/dist/handlers/emu4-config.d.ts +14 -0
  91. package/dist/handlers/emu4-config.js +148 -0
  92. package/dist/handlers/emu4-config.js.map +1 -0
  93. package/dist/handlers/emu4-cookies.d.ts +8 -0
  94. package/dist/handlers/emu4-cookies.js +248 -0
  95. package/dist/handlers/emu4-cookies.js.map +1 -0
  96. package/dist/handlers/emu4-erasure.d.ts +2 -0
  97. package/dist/handlers/emu4-erasure.js +587 -0
  98. package/dist/handlers/emu4-erasure.js.map +1 -0
  99. package/dist/handlers/emu4-federation.d.ts +8 -0
  100. package/dist/handlers/emu4-federation.js +18 -0
  101. package/dist/handlers/emu4-federation.js.map +1 -0
  102. package/dist/handlers/emu4-journey-math.d.ts +42 -0
  103. package/dist/handlers/emu4-journey-math.js +99 -0
  104. package/dist/handlers/emu4-journey-math.js.map +1 -0
  105. package/dist/handlers/emu4-messaging.d.ts +21 -0
  106. package/dist/handlers/emu4-messaging.js +595 -0
  107. package/dist/handlers/emu4-messaging.js.map +1 -0
  108. package/dist/handlers/emu4-minors.d.ts +7 -0
  109. package/dist/handlers/emu4-minors.js +408 -0
  110. package/dist/handlers/emu4-minors.js.map +1 -0
  111. package/dist/handlers/emu4-oauth-audit.d.ts +5 -0
  112. package/dist/handlers/emu4-oauth-audit.js +17 -0
  113. package/dist/handlers/emu4-oauth-audit.js.map +1 -0
  114. package/dist/handlers/emu4-oauth-auth.d.ts +83 -0
  115. package/dist/handlers/emu4-oauth-auth.js +363 -0
  116. package/dist/handlers/emu4-oauth-auth.js.map +1 -0
  117. package/dist/handlers/emu4-oauth-delivery.d.ts +68 -0
  118. package/dist/handlers/emu4-oauth-delivery.js +207 -0
  119. package/dist/handlers/emu4-oauth-delivery.js.map +1 -0
  120. package/dist/handlers/emu4-oauth-keys.d.ts +11 -0
  121. package/dist/handlers/emu4-oauth-keys.js +268 -0
  122. package/dist/handlers/emu4-oauth-keys.js.map +1 -0
  123. package/dist/handlers/emu4-oauth-pub.d.ts +36 -0
  124. package/dist/handlers/emu4-oauth-pub.js +420 -0
  125. package/dist/handlers/emu4-oauth-pub.js.map +1 -0
  126. package/dist/handlers/emu4-oauth.d.ts +10 -0
  127. package/dist/handlers/emu4-oauth.js +23 -0
  128. package/dist/handlers/emu4-oauth.js.map +1 -0
  129. package/dist/handlers/emu4-policies.d.ts +2 -0
  130. package/dist/handlers/emu4-policies.js +408 -0
  131. package/dist/handlers/emu4-policies.js.map +1 -0
  132. package/dist/handlers/emu4-region.d.ts +2 -0
  133. package/dist/handlers/emu4-region.js +189 -0
  134. package/dist/handlers/emu4-region.js.map +1 -0
  135. package/dist/handlers/emu4-saml.d.ts +12 -0
  136. package/dist/handlers/emu4-saml.js +532 -0
  137. package/dist/handlers/emu4-saml.js.map +1 -0
  138. package/dist/handlers/emu4-shared.d.ts +44 -0
  139. package/dist/handlers/emu4-shared.js +90 -0
  140. package/dist/handlers/emu4-shared.js.map +1 -0
  141. package/dist/handlers/emu4-snapshots.d.ts +38 -0
  142. package/dist/handlers/emu4-snapshots.js +231 -0
  143. package/dist/handlers/emu4-snapshots.js.map +1 -0
  144. package/dist/handlers/emu4-sns.d.ts +9 -0
  145. package/dist/handlers/emu4-sns.js +21 -0
  146. package/dist/handlers/emu4-sns.js.map +1 -0
  147. package/dist/handlers/emu4-trust-binding.d.ts +27 -0
  148. package/dist/handlers/emu4-trust-binding.js +344 -0
  149. package/dist/handlers/emu4-trust-binding.js.map +1 -0
  150. package/dist/handlers/emu4-trust.d.ts +35 -0
  151. package/dist/handlers/emu4-trust.js +543 -0
  152. package/dist/handlers/emu4-trust.js.map +1 -0
  153. package/dist/handlers/fga-engine.d.ts +78 -0
  154. package/dist/handlers/fga-engine.js +663 -0
  155. package/dist/handlers/fga-engine.js.map +1 -0
  156. package/dist/handlers/hooks.js +13 -0
  157. package/dist/handlers/hooks.js.map +1 -1
  158. package/dist/handlers/index.js +14 -1
  159. package/dist/handlers/index.js.map +1 -1
  160. package/dist/handlers/machines.js +6 -0
  161. package/dist/handlers/machines.js.map +1 -1
  162. package/dist/handlers/messaging.d.ts +3 -1
  163. package/dist/handlers/messaging.js +455 -48
  164. package/dist/handlers/messaging.js.map +1 -1
  165. package/dist/handlers/oauth-adv.d.ts +191 -0
  166. package/dist/handlers/oauth-adv.js +1305 -0
  167. package/dist/handlers/oauth-adv.js.map +1 -0
  168. package/dist/handlers/oauth-flows.d.ts +25 -1
  169. package/dist/handlers/oauth-flows.js +111 -50
  170. package/dist/handlers/oauth-flows.js.map +1 -1
  171. package/dist/handlers/oauth.d.ts +24 -3
  172. package/dist/handlers/oauth.js +245 -60
  173. package/dist/handlers/oauth.js.map +1 -1
  174. package/dist/handlers/orgs.js +6 -0
  175. package/dist/handlers/orgs.js.map +1 -1
  176. package/dist/handlers/platform.d.ts +5 -0
  177. package/dist/handlers/platform.js +33 -15
  178. package/dist/handlers/platform.js.map +1 -1
  179. package/dist/handlers/scim.d.ts +2 -0
  180. package/dist/handlers/scim.js +198 -11
  181. package/dist/handlers/scim.js.map +1 -1
  182. package/dist/handlers/sessions.d.ts +2 -0
  183. package/dist/handlers/sessions.js +24 -16
  184. package/dist/handlers/sessions.js.map +1 -1
  185. package/dist/handlers/users.js +3 -0
  186. package/dist/handlers/users.js.map +1 -1
  187. package/dist/jwe.d.ts +18 -0
  188. package/dist/jwe.js +101 -0
  189. package/dist/jwe.js.map +1 -0
  190. package/dist/jws.js +2 -0
  191. package/dist/jws.js.map +1 -1
  192. package/dist/messaging-callbacks.d.ts +100 -0
  193. package/dist/messaging-callbacks.js +767 -0
  194. package/dist/messaging-callbacks.js.map +1 -0
  195. package/dist/openapi.js +41 -1
  196. package/dist/openapi.js.map +1 -1
  197. package/dist/parity-emu3-authz.d.ts +3 -0
  198. package/dist/parity-emu3-authz.js +61 -0
  199. package/dist/parity-emu3-authz.js.map +1 -0
  200. package/dist/parity-emu3-billing.d.ts +3 -0
  201. package/dist/parity-emu3-billing.js +25 -0
  202. package/dist/parity-emu3-billing.js.map +1 -0
  203. package/dist/parity-emu3-messaging.d.ts +3 -0
  204. package/dist/parity-emu3-messaging.js +27 -0
  205. package/dist/parity-emu3-messaging.js.map +1 -0
  206. package/dist/parity-emu3-misc.d.ts +2 -0
  207. package/dist/parity-emu3-misc.js +63 -0
  208. package/dist/parity-emu3-misc.js.map +1 -0
  209. package/dist/parity-emu3-oauth.d.ts +2 -0
  210. package/dist/parity-emu3-oauth.js +39 -0
  211. package/dist/parity-emu3-oauth.js.map +1 -0
  212. package/dist/parity-emu4-actions.d.ts +2 -0
  213. package/dist/parity-emu4-actions.js +38 -0
  214. package/dist/parity-emu4-actions.js.map +1 -0
  215. package/dist/parity-emu4-authz.d.ts +3 -0
  216. package/dist/parity-emu4-authz.js +68 -0
  217. package/dist/parity-emu4-authz.js.map +1 -0
  218. package/dist/parity-emu4-billing.d.ts +6 -0
  219. package/dist/parity-emu4-billing.js +44 -0
  220. package/dist/parity-emu4-billing.js.map +1 -0
  221. package/dist/parity-emu4-compliance.d.ts +2 -0
  222. package/dist/parity-emu4-compliance.js +92 -0
  223. package/dist/parity-emu4-compliance.js.map +1 -0
  224. package/dist/parity-emu4-federation.d.ts +2 -0
  225. package/dist/parity-emu4-federation.js +33 -0
  226. package/dist/parity-emu4-federation.js.map +1 -0
  227. package/dist/parity-emu4-messaging.d.ts +3 -0
  228. package/dist/parity-emu4-messaging.js +42 -0
  229. package/dist/parity-emu4-messaging.js.map +1 -0
  230. package/dist/parity-emu4-oauth.d.ts +2 -0
  231. package/dist/parity-emu4-oauth.js +55 -0
  232. package/dist/parity-emu4-oauth.js.map +1 -0
  233. package/dist/parity-emu4-trust.d.ts +2 -0
  234. package/dist/parity-emu4-trust.js +41 -0
  235. package/dist/parity-emu4-trust.js.map +1 -0
  236. package/dist/parity-routes.js +19 -1
  237. package/dist/parity-routes.js.map +1 -1
  238. package/dist/sns-cert.d.ts +9 -0
  239. package/dist/sns-cert.js +101 -0
  240. package/dist/sns-cert.js.map +1 -0
  241. package/dist/tokens.d.ts +69 -4
  242. package/dist/tokens.js +164 -38
  243. package/dist/tokens.js.map +1 -1
  244. package/package.json +2 -2
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Custom hosted HTML and CSS for a page template region (the `custom` component).
3
+ *
4
+ * The author's markup is never trusted, and never placed in the sign-in page itself. Three layers, each enough on its own:
5
+ *
6
+ * 1. Allowlist sanitizer (this file). Only the tags, attributes and CSS properties below survive; there is no script, no style
7
+ * attribute, no event handler, no form control, no iframe, no object, no SVG, no `url()`, no import and no custom property.
8
+ * Links and images are https (links also mailto) only. A write that contains anything else is refused with the reason;
9
+ * the same function runs again, leniently (dropping what it does not allow), every time the template is rendered, so a
10
+ * row that was edited in the database is just as safe.
11
+ * 2. Server-side render into a sandboxed iframe (`srcdoc`): `sandbox` without `allow-scripts` or `allow-same-origin`, so the
12
+ * frame has an opaque origin and cannot touch the sign-in form, read its fields, restyle it, or draw over it.
13
+ * 3. A content-security-policy inside the frame that allows no script, no connection, no form post and no base element, and
14
+ * images from https only.
15
+ *
16
+ * Template variables are a fixed list substituted into text (never into attributes), HTML-escaped.
17
+ *
18
+ * This is the same allowlist, tokenizer and CSS rules the Atlas API applies (copied, not imported: the emulator has no dependency on the
19
+ * server packages), so a block that is refused here is refused in production for the same reason.
20
+ */
21
+ export declare const MAX_CUSTOM_HTML_BYTES: number;
22
+ export declare const MAX_CUSTOM_CSS_BYTES: number;
23
+ export declare const MAX_CUSTOM_TAGS = 300;
24
+ export declare const CUSTOM_MIN_HEIGHT = 40;
25
+ export declare const CUSTOM_MAX_HEIGHT = 1200;
26
+ /** The variables a custom block may use as `{{name}}` in text. */
27
+ export declare const CUSTOM_VARIABLES: readonly ["year", "locale"];
28
+ export type CustomVariables = Partial<Record<(typeof CUSTOM_VARIABLES)[number], string>>;
29
+ export interface Sanitized {
30
+ out: string;
31
+ /** What was not allowed. Empty means the input was already clean. */
32
+ problems: string[];
33
+ }
34
+ /**
35
+ * Reduce markup to the allowlist. Returns the clean markup and every problem found (a tag, attribute or value that was
36
+ * dropped). `vars` substitutes `{{year}}` / `{{locale}}` in text (escaped); an unknown `{{name}}` is a problem.
37
+ */
38
+ export declare function sanitizeCustomHtml(input: string, opts?: {
39
+ vars?: CustomVariables;
40
+ }): Sanitized;
41
+ /** Reduce CSS to the allowlist: class/tag selectors, a fixed property list, no url(), no imports, no custom properties. */
42
+ export declare function sanitizeCustomCss(input: string): Sanitized;
43
+ /** The policy inside the frame: nothing runs, nothing connects, nothing posts; images from https only; no base element. */
44
+ export declare const CUSTOM_FRAME_CSP = "default-src 'none'; img-src https:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'";
45
+ /** The `sandbox` attribute value: popups only (for links), and never scripts, forms or the page's origin. */
46
+ export declare const CUSTOM_FRAME_SANDBOX = "allow-popups allow-popups-to-escape-sandbox";
47
+ /** The complete document placed in the iframe. `html` and `css` must already be sanitized. */
48
+ export declare function customFrameDocument(html: string, css: string, lang: string): string;
49
+ /** The iframe element for a custom block (sanitizes again: the stored value is not trusted at render time). */
50
+ export declare function renderCustomBlock(n: {
51
+ html: string;
52
+ css?: string;
53
+ height: number;
54
+ title?: string;
55
+ }, vars?: CustomVariables): string;
56
+ /** The `custom` component of a page template, validated like the API does: the same refusals, the same messages, the stored value is the sanitized form. */
57
+ export declare function parseCustomComponent(n: Record<string, unknown>, path: string, depth: number): Record<string, unknown>;
@@ -0,0 +1,491 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CUSTOM_FRAME_SANDBOX = exports.CUSTOM_FRAME_CSP = exports.CUSTOM_VARIABLES = exports.CUSTOM_MAX_HEIGHT = exports.CUSTOM_MIN_HEIGHT = exports.MAX_CUSTOM_TAGS = exports.MAX_CUSTOM_CSS_BYTES = exports.MAX_CUSTOM_HTML_BYTES = void 0;
4
+ exports.sanitizeCustomHtml = sanitizeCustomHtml;
5
+ exports.sanitizeCustomCss = sanitizeCustomCss;
6
+ exports.customFrameDocument = customFrameDocument;
7
+ exports.renderCustomBlock = renderCustomBlock;
8
+ exports.parseCustomComponent = parseCustomComponent;
9
+ const errors_1 = require("./errors");
10
+ const escapeHtml = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
11
+ /**
12
+ * Custom hosted HTML and CSS for a page template region (the `custom` component).
13
+ *
14
+ * The author's markup is never trusted, and never placed in the sign-in page itself. Three layers, each enough on its own:
15
+ *
16
+ * 1. Allowlist sanitizer (this file). Only the tags, attributes and CSS properties below survive; there is no script, no style
17
+ * attribute, no event handler, no form control, no iframe, no object, no SVG, no `url()`, no import and no custom property.
18
+ * Links and images are https (links also mailto) only. A write that contains anything else is refused with the reason;
19
+ * the same function runs again, leniently (dropping what it does not allow), every time the template is rendered, so a
20
+ * row that was edited in the database is just as safe.
21
+ * 2. Server-side render into a sandboxed iframe (`srcdoc`): `sandbox` without `allow-scripts` or `allow-same-origin`, so the
22
+ * frame has an opaque origin and cannot touch the sign-in form, read its fields, restyle it, or draw over it.
23
+ * 3. A content-security-policy inside the frame that allows no script, no connection, no form post and no base element, and
24
+ * images from https only.
25
+ *
26
+ * Template variables are a fixed list substituted into text (never into attributes), HTML-escaped.
27
+ *
28
+ * This is the same allowlist, tokenizer and CSS rules the Atlas API applies (copied, not imported: the emulator has no dependency on the
29
+ * server packages), so a block that is refused here is refused in production for the same reason.
30
+ */
31
+ exports.MAX_CUSTOM_HTML_BYTES = 16 * 1024;
32
+ exports.MAX_CUSTOM_CSS_BYTES = 8 * 1024;
33
+ exports.MAX_CUSTOM_TAGS = 300;
34
+ exports.CUSTOM_MIN_HEIGHT = 40;
35
+ exports.CUSTOM_MAX_HEIGHT = 1200;
36
+ /** The variables a custom block may use as `{{name}}` in text. */
37
+ exports.CUSTOM_VARIABLES = ['year', 'locale'];
38
+ const ALLOWED_TAGS = new Set([
39
+ 'div', 'span', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'a', 'img', 'br', 'hr', 'strong', 'em', 'b', 'i', 'u', 's', 'small', 'sub', 'sup',
40
+ 'blockquote', 'section', 'header', 'footer', 'nav', 'article', 'aside', 'main', 'figure', 'figcaption', 'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'caption',
41
+ 'pre', 'code', 'dl', 'dt', 'dd', 'address', 'mark', 'abbr', 'cite', 'q', 'time',
42
+ ]);
43
+ const VOID_TAGS = new Set(['br', 'hr', 'img']);
44
+ /** Tags whose content must never be kept as text when the tag itself is dropped. */
45
+ const DROP_CONTENT = new Set(['script', 'style', 'iframe', 'frame', 'frameset', 'object', 'embed', 'noscript', 'template', 'textarea', 'title', 'xmp', 'plaintext', 'svg', 'math', 'select', 'option', 'audio', 'video', 'canvas', 'applet', 'head']);
46
+ const SAFE_HTTPS = /^https:\/\/[^\s"'<>`\\]{1,2000}$/;
47
+ const SAFE_MAILTO = /^mailto:[^\s@"'<>`\\]+@[^\s@"'<>`\\]+$/;
48
+ const GLOBAL_ATTRS = new Set(['class', 'title', 'lang', 'dir', 'aria-label', 'aria-hidden']);
49
+ const TAG_ATTRS = { a: ['href'], img: ['src', 'alt', 'width', 'height'], td: ['colspan', 'rowspan'], th: ['colspan', 'rowspan'], time: ['datetime'] };
50
+ /** Attributes the renderer sets itself; an author's value is ignored (not an error). */
51
+ const IGNORED_ATTRS = new Set(['target', 'rel', 'loading', 'referrerpolicy']);
52
+ const ENTITY = /^&(?:[A-Za-z][A-Za-z0-9]{1,31}|#\d{1,7}|#x[0-9A-Fa-f]{1,6});/;
53
+ /** Text safe between tags: markup characters become entities; a valid entity (`&amp;`, `&#169;`) is kept. */
54
+ function escapeText(t) {
55
+ let out = '';
56
+ for (let i = 0; i < t.length; i++) {
57
+ const c = t[i];
58
+ if (c === '&') {
59
+ const m = ENTITY.exec(t.slice(i, i + 40));
60
+ if (m) {
61
+ out += m[0];
62
+ i += m[0].length - 1;
63
+ }
64
+ else
65
+ out += '&amp;';
66
+ }
67
+ else if (c === '<')
68
+ out += '&lt;';
69
+ else if (c === '>')
70
+ out += '&gt;';
71
+ else if (c === '\u0000')
72
+ continue;
73
+ else
74
+ out += c;
75
+ }
76
+ return out;
77
+ }
78
+ const VAR_RE = /\{\{\s*([A-Za-z_][A-Za-z0-9_.]*)\s*\}\}/g;
79
+ /** Parse the attributes of an open tag starting after its name. Returns null when the tag never ends. */
80
+ function readAttrs(src, from) {
81
+ const attrs = [];
82
+ let i = from;
83
+ for (;;) {
84
+ while (i < src.length && /\s/.test(src[i]))
85
+ i++;
86
+ if (i >= src.length)
87
+ return null;
88
+ if (src[i] === '>')
89
+ return { attrs, end: i + 1, selfClose: false };
90
+ if (src[i] === '/' && src[i + 1] === '>')
91
+ return { attrs, end: i + 2, selfClose: true };
92
+ if (src[i] === '/') {
93
+ i++;
94
+ continue;
95
+ }
96
+ const nm = /^[^\s"'<>\/=]+/.exec(src.slice(i, i + 200));
97
+ if (!nm) {
98
+ // A stray quote or "=" with no name: skip the character.
99
+ i++;
100
+ continue;
101
+ }
102
+ i += nm[0].length;
103
+ while (i < src.length && /\s/.test(src[i]))
104
+ i++;
105
+ let value = null;
106
+ if (src[i] === '=') {
107
+ i++;
108
+ while (i < src.length && /\s/.test(src[i]))
109
+ i++;
110
+ const q = src[i];
111
+ if (q === '"' || q === "'") {
112
+ const close = src.indexOf(q, i + 1);
113
+ if (close === -1)
114
+ return null;
115
+ value = src.slice(i + 1, close);
116
+ i = close + 1;
117
+ }
118
+ else {
119
+ const m = /^[^\s"'=<>`]+/.exec(src.slice(i, i + 2100));
120
+ value = m ? m[0] : '';
121
+ i += value.length;
122
+ }
123
+ }
124
+ attrs.push({ name: nm[0].toLowerCase(), value });
125
+ }
126
+ }
127
+ /**
128
+ * Reduce markup to the allowlist. Returns the clean markup and every problem found (a tag, attribute or value that was
129
+ * dropped). `vars` substitutes `{{year}}` / `{{locale}}` in text (escaped); an unknown `{{name}}` is a problem.
130
+ */
131
+ function sanitizeCustomHtml(input, opts = {}) {
132
+ const problems = [];
133
+ const note = (m) => {
134
+ if (problems.length < 20 && !problems.includes(m))
135
+ problems.push(m);
136
+ };
137
+ if (input.length > exports.MAX_CUSTOM_HTML_BYTES) {
138
+ note(`html is larger than ${exports.MAX_CUSTOM_HTML_BYTES / 1024} KB.`);
139
+ input = input.slice(0, exports.MAX_CUSTOM_HTML_BYTES);
140
+ }
141
+ let out = '';
142
+ const stack = [];
143
+ let tags = 0;
144
+ let i = 0;
145
+ let skip = null; // inside a dropped raw-content element
146
+ const text = (raw) => {
147
+ if (skip)
148
+ return;
149
+ const escaped = escapeText(raw);
150
+ out += escaped.replace(VAR_RE, (whole, name) => {
151
+ if (!exports.CUSTOM_VARIABLES.includes(name)) {
152
+ note(`{{${name}}} is not a variable. Available: ${exports.CUSTOM_VARIABLES.map((v) => `{{${v}}}`).join(', ')}.`);
153
+ return '';
154
+ }
155
+ const v = opts.vars?.[name];
156
+ return v === undefined ? whole : escapeHtml(v);
157
+ });
158
+ };
159
+ while (i < input.length) {
160
+ if (input[i] !== '<') {
161
+ const next = input.indexOf('<', i);
162
+ const end = next === -1 ? input.length : next;
163
+ text(input.slice(i, end));
164
+ i = end;
165
+ continue;
166
+ }
167
+ if (input.startsWith('<!--', i)) {
168
+ const close = input.indexOf('-->', i + 4);
169
+ i = close === -1 ? input.length : close + 3;
170
+ continue;
171
+ }
172
+ if (input[i + 1] === '!' || input[i + 1] === '?') {
173
+ note('Declarations, CDATA and processing instructions are not allowed.');
174
+ const close = input.indexOf('>', i);
175
+ i = close === -1 ? input.length : close + 1;
176
+ continue;
177
+ }
178
+ const closeTag = /^<\/([A-Za-z][A-Za-z0-9-]*)\s*>/.exec(input.slice(i, i + 80));
179
+ if (closeTag) {
180
+ const name = closeTag[1].toLowerCase();
181
+ i += closeTag[0].length;
182
+ if (skip) {
183
+ if (name === skip)
184
+ skip = null;
185
+ continue;
186
+ }
187
+ const at = stack.lastIndexOf(name);
188
+ if (at === -1) {
189
+ if (ALLOWED_TAGS.has(name))
190
+ note(`Unmatched </${name}>.`);
191
+ continue;
192
+ }
193
+ while (stack.length > at)
194
+ out += `</${stack.pop()}>`;
195
+ continue;
196
+ }
197
+ const open = /^<([A-Za-z][A-Za-z0-9-]*)/.exec(input.slice(i, i + 80));
198
+ if (!open) {
199
+ text('<');
200
+ i += 1;
201
+ continue;
202
+ }
203
+ const name = open[1].toLowerCase();
204
+ const parsed = readAttrs(input, i + open[0].length);
205
+ if (!parsed) {
206
+ note('A tag is never closed.');
207
+ break;
208
+ }
209
+ i = parsed.end;
210
+ if (skip)
211
+ continue;
212
+ if (!ALLOWED_TAGS.has(name)) {
213
+ note(`<${name}> is not allowed.`);
214
+ if (DROP_CONTENT.has(name) && !parsed.selfClose && !VOID_TAGS.has(name))
215
+ skip = name;
216
+ continue;
217
+ }
218
+ if (++tags > exports.MAX_CUSTOM_TAGS) {
219
+ note(`At most ${exports.MAX_CUSTOM_TAGS} tags.`);
220
+ break;
221
+ }
222
+ const allowed = new Set([...GLOBAL_ATTRS, ...(TAG_ATTRS[name] ?? [])]);
223
+ let html = `<${name}`;
224
+ let hasAlt = false;
225
+ const seen = new Set();
226
+ for (const a of parsed.attrs) {
227
+ if (IGNORED_ATTRS.has(a.name) || seen.has(a.name))
228
+ continue;
229
+ if (!allowed.has(a.name)) {
230
+ note(`The ${a.name} attribute is not allowed on <${name}>${a.name === 'style' ? ' (put CSS in the css field)' : ''}.`);
231
+ continue;
232
+ }
233
+ const v = a.value ?? '';
234
+ let ok = true;
235
+ switch (a.name) {
236
+ case 'class':
237
+ ok = /^[A-Za-z0-9_ -]{1,200}$/.test(v);
238
+ break;
239
+ case 'title':
240
+ case 'alt':
241
+ case 'aria-label':
242
+ ok = v.length <= 300 && !v.includes('\u0000');
243
+ break;
244
+ case 'lang':
245
+ ok = /^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8}){0,3}$/.test(v);
246
+ break;
247
+ case 'dir':
248
+ ok = v === 'ltr' || v === 'rtl' || v === 'auto';
249
+ break;
250
+ case 'aria-hidden':
251
+ ok = v === 'true' || v === 'false';
252
+ break;
253
+ case 'href':
254
+ ok = SAFE_HTTPS.test(v) || SAFE_MAILTO.test(v);
255
+ break;
256
+ case 'src':
257
+ ok = SAFE_HTTPS.test(v);
258
+ break;
259
+ case 'width':
260
+ case 'height':
261
+ ok = /^\d{1,4}$/.test(v) && Number(v) <= 2000;
262
+ break;
263
+ case 'colspan':
264
+ case 'rowspan':
265
+ ok = /^\d{1,2}$/.test(v) && Number(v) >= 1;
266
+ break;
267
+ case 'datetime':
268
+ ok = /^[0-9TZ:+.\- ]{1,40}$/.test(v);
269
+ break;
270
+ }
271
+ if (!ok) {
272
+ note(`${a.name} on <${name}> has a value that is not allowed${a.name === 'href' || a.name === 'src' ? ' (https only; links may also be mailto:)' : ''}.`);
273
+ continue;
274
+ }
275
+ seen.add(a.name);
276
+ if (a.name === 'alt')
277
+ hasAlt = true;
278
+ html += ` ${a.name}="${escapeHtml(v)}"`;
279
+ }
280
+ if (name === 'img') {
281
+ if (!hasAlt) {
282
+ note('<img> needs an alt attribute (use alt="" for a decorative image).');
283
+ html += ' alt=""';
284
+ }
285
+ if (!parsed.attrs.some((a) => a.name === 'src' && a.value && SAFE_HTTPS.test(a.value))) {
286
+ // An image with no valid source draws nothing: drop it.
287
+ note('<img> needs an https src.');
288
+ continue;
289
+ }
290
+ html += ' loading="lazy" referrerpolicy="no-referrer"';
291
+ }
292
+ if (name === 'a')
293
+ html += ' target="_blank" rel="noopener noreferrer"';
294
+ html += '>';
295
+ out += html;
296
+ if (!VOID_TAGS.has(name) && !parsed.selfClose)
297
+ stack.push(name);
298
+ else if (!VOID_TAGS.has(name) && parsed.selfClose)
299
+ out += `</${name}>`;
300
+ }
301
+ while (stack.length)
302
+ out += `</${stack.pop()}>`;
303
+ return { out, problems };
304
+ }
305
+ // ---------------------------------------------------------------------------------------------------------------------
306
+ // CSS
307
+ const BOX = (p) => [p, `${p}-top`, `${p}-right`, `${p}-bottom`, `${p}-left`];
308
+ const ALLOWED_PROPS = new Set([
309
+ 'color', 'background', 'background-color', 'background-image', 'background-size', 'background-position', 'background-repeat',
310
+ 'font', 'font-family', 'font-size', 'font-weight', 'font-style', 'line-height', 'letter-spacing', 'text-align', 'text-decoration', 'text-transform', 'text-indent', 'text-shadow',
311
+ 'white-space', 'word-break', 'overflow-wrap', 'vertical-align', 'list-style', 'list-style-type',
312
+ ...BOX('margin'), ...BOX('padding'), ...BOX('border'), 'border-width', 'border-style', 'border-color', 'border-radius', 'border-collapse', 'border-spacing',
313
+ 'width', 'min-width', 'max-width', 'height', 'min-height', 'max-height', 'box-sizing', 'aspect-ratio', 'object-fit',
314
+ 'display', 'flex', 'flex-direction', 'flex-wrap', 'flex-grow', 'flex-shrink', 'flex-basis', 'gap', 'row-gap', 'column-gap',
315
+ 'align-items', 'align-content', 'align-self', 'justify-content', 'justify-items', 'justify-self',
316
+ 'grid-template-columns', 'grid-template-rows', 'grid-column', 'grid-row', 'opacity', 'box-shadow', 'overflow', 'float', 'clear',
317
+ ]);
318
+ const ENUM_PROPS = {
319
+ display: ['block', 'inline', 'inline-block', 'flex', 'inline-flex', 'grid', 'none'],
320
+ overflow: ['visible', 'hidden', 'auto'],
321
+ float: ['left', 'right', 'none'],
322
+ clear: ['left', 'right', 'both', 'none'],
323
+ };
324
+ const ALLOWED_FUNCTIONS = new Set(['rgb', 'rgba', 'hsl', 'hsla', 'calc', 'min', 'max', 'clamp', 'linear-gradient', 'radial-gradient', 'repeat', 'minmax']);
325
+ const VALUE_CHARS = /^[#A-Za-z0-9%.,\s\-+*/()"']*$/;
326
+ const COMPOUND = /^(?:\*|[a-z][a-z0-9]*)?(?:\.[A-Za-z_][A-Za-z0-9_-]*|:(?:hover|focus|active|first-child|last-child|first-of-type|last-of-type|nth-child\((?:\d{1,3}|odd|even)\)))*$/;
327
+ const MEDIA = /^@media\s+(?:screen\s+and\s+)?\(\s*(?:(?:max|min)-width\s*:\s*\d{1,4}px|prefers-color-scheme\s*:\s*(?:dark|light))\s*\)(?:\s+and\s+\(\s*(?:max|min)-width\s*:\s*\d{1,4}px\s*\))?$/i;
328
+ function cssValueProblem(prop, value) {
329
+ if (!value || value.length > 300)
330
+ return 'value is empty or too long';
331
+ for (const m of value.toLowerCase().matchAll(/([a-z-]+)\s*\(/g))
332
+ if (!ALLOWED_FUNCTIONS.has(m[1]))
333
+ return `${m[1]}() is not allowed`;
334
+ if (/(?:^|[^a-z])(?:url|expression|javascript|behavior|image-set|attr|var|env)(?![a-z-])/i.test(value))
335
+ return 'value is not allowed';
336
+ if (!VALUE_CHARS.test(value))
337
+ return 'value has a character that is not allowed';
338
+ const en = ENUM_PROPS[prop];
339
+ if (en && !en.includes(value.toLowerCase()))
340
+ return `${prop} must be one of ${en.join(', ')}`;
341
+ return null;
342
+ }
343
+ /** A compound selector's element name, when it has one, must be a tag the markup may use (or body / html). */
344
+ function tagOk(compound) {
345
+ const tag = /^[a-z][a-z0-9]*/.exec(compound)?.[0];
346
+ return !tag || tag === 'body' || tag === 'html' || ALLOWED_TAGS.has(tag);
347
+ }
348
+ function sanitizeRules(css, note, inMedia) {
349
+ let out = '';
350
+ let i = 0;
351
+ while (i < css.length) {
352
+ const open = css.indexOf('{', i);
353
+ if (open === -1) {
354
+ const rest = css.slice(i).trim();
355
+ if (rest)
356
+ note(rest.startsWith('@') ? `${rest.split(/[\s(]/)[0]} is not allowed (only @media with max-width, min-width or prefers-color-scheme).` : 'A rule has no block.');
357
+ break;
358
+ }
359
+ const prelude = css.slice(i, open).trim();
360
+ let depth = 1;
361
+ let j = open + 1;
362
+ while (j < css.length && depth > 0) {
363
+ if (css[j] === '{')
364
+ depth++;
365
+ else if (css[j] === '}')
366
+ depth--;
367
+ j++;
368
+ }
369
+ if (depth !== 0) {
370
+ note('A block is never closed.');
371
+ break;
372
+ }
373
+ const body = css.slice(open + 1, j - 1);
374
+ i = j;
375
+ if (prelude.startsWith('@')) {
376
+ if (inMedia || !MEDIA.test(prelude.replace(/\s+/g, ' '))) {
377
+ note(`${prelude.split(/[\s(]/)[0]} is not allowed (only @media with max-width, min-width or prefers-color-scheme).`);
378
+ continue;
379
+ }
380
+ const inner = sanitizeRules(body, note, true);
381
+ if (inner)
382
+ out += `${prelude.replace(/\s+/g, ' ')}{${inner}}`;
383
+ continue;
384
+ }
385
+ const selectors = [];
386
+ let selectorsOk = prelude.length > 0 && prelude.length <= 300 && /^[A-Za-z0-9_\-.\s,>+~:*()]+$/.test(prelude);
387
+ if (selectorsOk) {
388
+ for (const sel of prelude.split(',')) {
389
+ const norm = sel.replace(/\s*([>+~])\s*/g, ' $1 ').trim().split(/\s+/);
390
+ const good = norm.length > 0 && norm.every((tok, k) => (/^[>+~]$/.test(tok) ? k > 0 && k < norm.length - 1 && !/^[>+~]$/.test(norm[k - 1]) : COMPOUND.test(tok) && tagOk(tok)));
391
+ if (!good) {
392
+ selectorsOk = false;
393
+ break;
394
+ }
395
+ selectors.push(norm.join(' ').replace(/ ([>+~]) /g, '$1'));
396
+ }
397
+ }
398
+ if (!selectorsOk) {
399
+ note(`Selector "${prelude.slice(0, 60)}" is not allowed (classes, allowed tags, :hover, :focus, :first-child, :last-child, combinators).`);
400
+ continue;
401
+ }
402
+ const decls = [];
403
+ for (const raw of body.split(';')) {
404
+ const d = raw.trim();
405
+ if (!d)
406
+ continue;
407
+ const colon = d.indexOf(':');
408
+ const prop = colon === -1 ? '' : d.slice(0, colon).trim().toLowerCase();
409
+ const value = colon === -1 ? '' : d.slice(colon + 1).trim();
410
+ if (!ALLOWED_PROPS.has(prop)) {
411
+ note(`The CSS property "${prop || d.slice(0, 30)}" is not allowed.`);
412
+ continue;
413
+ }
414
+ const bad = cssValueProblem(prop, value);
415
+ if (bad) {
416
+ note(`${prop}: ${bad}.`);
417
+ continue;
418
+ }
419
+ decls.push(`${prop}:${value.replace(/\s+/g, ' ')}`);
420
+ }
421
+ if (decls.length)
422
+ out += `${selectors.join(',')}{${decls.join(';')}}`;
423
+ }
424
+ return out;
425
+ }
426
+ /** Reduce CSS to the allowlist: class/tag selectors, a fixed property list, no url(), no imports, no custom properties. */
427
+ function sanitizeCustomCss(input) {
428
+ const problems = [];
429
+ const note = (m) => {
430
+ if (problems.length < 20 && !problems.includes(m))
431
+ problems.push(m);
432
+ };
433
+ if (input.length > exports.MAX_CUSTOM_CSS_BYTES) {
434
+ note(`css is larger than ${exports.MAX_CUSTOM_CSS_BYTES / 1024} KB.`);
435
+ input = input.slice(0, exports.MAX_CUSTOM_CSS_BYTES);
436
+ }
437
+ if (input.includes('\\'))
438
+ note('Backslash escapes are not allowed in css.');
439
+ const stripped = input.replace(/\/\*[\s\S]*?\*\//g, ' ').replace(/\\/g, '');
440
+ const open = stripped.indexOf('/*');
441
+ if (open !== -1)
442
+ note('A comment is never closed.');
443
+ return { out: sanitizeRules(open === -1 ? stripped : stripped.slice(0, open), note, false), problems };
444
+ }
445
+ // ---------------------------------------------------------------------------------------------------------------------
446
+ // The sandboxed frame
447
+ /** The policy inside the frame: nothing runs, nothing connects, nothing posts; images from https only; no base element. */
448
+ exports.CUSTOM_FRAME_CSP = "default-src 'none'; img-src https:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'";
449
+ /** The `sandbox` attribute value: popups only (for links), and never scripts, forms or the page's origin. */
450
+ exports.CUSTOM_FRAME_SANDBOX = 'allow-popups allow-popups-to-escape-sandbox';
451
+ const FRAME_BASE_CSS = 'html,body{margin:0;padding:0}body{font-family:system-ui,-apple-system,"Segoe UI",sans-serif;font-size:14px;line-height:1.5;color:#1f2937;background:transparent;word-wrap:break-word}img{max-width:100%;height:auto}a{color:#2563eb}';
452
+ /** The complete document placed in the iframe. `html` and `css` must already be sanitized. */
453
+ function customFrameDocument(html, css, lang) {
454
+ return `<!doctype html><html lang="${escapeHtml(lang)}"><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="${exports.CUSTOM_FRAME_CSP}"><meta name="viewport" content="width=device-width,initial-scale=1"><style>${FRAME_BASE_CSS}</style>${css ? `<style>${css}</style>` : ''}</head><body>${html}</body></html>`;
455
+ }
456
+ /** The iframe element for a custom block (sanitizes again: the stored value is not trusted at render time). */
457
+ function renderCustomBlock(n, vars = {}) {
458
+ const html = sanitizeCustomHtml(n.html, { vars }).out;
459
+ const css = n.css ? sanitizeCustomCss(n.css).out : '';
460
+ const height = Math.min(Math.max(Math.trunc(n.height) || exports.CUSTOM_MIN_HEIGHT, exports.CUSTOM_MIN_HEIGHT), exports.CUSTOM_MAX_HEIGHT);
461
+ const lang = vars.locale && /^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8}){0,3}$/.test(vars.locale) ? vars.locale : 'en';
462
+ return `<iframe class="tpl-custom" title="${escapeHtml(n.title || 'Custom content')}" sandbox="${exports.CUSTOM_FRAME_SANDBOX}" referrerpolicy="no-referrer" loading="lazy" height="${height}" srcdoc="${escapeHtml(customFrameDocument(html, css, lang))}"></iframe>`;
463
+ }
464
+ /** The `custom` component of a page template, validated like the API does: the same refusals, the same messages, the stored value is the sanitized form. */
465
+ function parseCustomComponent(n, path, depth) {
466
+ const fail = (p, message) => {
467
+ throw new errors_1.EmulatorError('VALIDATION_FAILED', `${p}: ${message}`, p);
468
+ };
469
+ if (depth > 0)
470
+ fail(path, 'a custom block cannot sit inside columns.');
471
+ const html = typeof n.html === 'string' && n.html.trim() !== '' ? n.html : fail(`${path}.html`, 'must be a non-empty string of HTML.');
472
+ if (n.css !== undefined && typeof n.css !== 'string')
473
+ fail(`${path}.css`, 'must be a string of CSS.');
474
+ const cleanHtml = sanitizeCustomHtml(html);
475
+ if (cleanHtml.problems.length)
476
+ fail(`${path}.html`, cleanHtml.problems.slice(0, 3).join(' '));
477
+ if (!cleanHtml.out.trim())
478
+ fail(`${path}.html`, 'has no content once sanitized.');
479
+ const cleanCss = n.css ? sanitizeCustomCss(n.css) : { out: '', problems: [] };
480
+ if (cleanCss.problems.length)
481
+ fail(`${path}.css`, cleanCss.problems.slice(0, 3).join(' '));
482
+ const height = typeof n.height === 'number' && Number.isInteger(n.height) && n.height >= exports.CUSTOM_MIN_HEIGHT && n.height <= exports.CUSTOM_MAX_HEIGHT ? n.height : fail(`${path}.height`, `is required: the frame's height in pixels, ${exports.CUSTOM_MIN_HEIGHT} to ${exports.CUSTOM_MAX_HEIGHT}.`);
483
+ let title;
484
+ if (n.title !== undefined) {
485
+ if (typeof n.title !== 'string' || n.title.trim() === '' || n.title.length > 120)
486
+ fail(`${path}.title`, 'must be a non-empty string of at most 120 characters.');
487
+ title = n.title;
488
+ }
489
+ return { type: 'custom', html: cleanHtml.out, ...(cleanCss.out ? { css: cleanCss.out } : {}), height, ...(title !== undefined ? { title } : {}) };
490
+ }
491
+ //# sourceMappingURL=custom-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-html.js","sourceRoot":"","sources":["../src/custom-html.ts"],"names":[],"mappings":"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"}
package/dist/engine.d.ts CHANGED
@@ -76,7 +76,7 @@ export declare class Engine {
76
76
  /** Last written body of each singleton settings route. */
77
77
  readonly singletons: Map<string, Obj>;
78
78
  /** Current-state presenters the change feed and snapshots read through. */
79
- readonly presenters: Map<"user" | "organization" | "membership" | "invitation" | "role_assignment" | "api_key" | "machine" | "machine_grant", {
79
+ readonly presenters: Map<"user" | "api_key" | "organization" | "membership" | "invitation" | "role_assignment" | "machine" | "machine_grant", {
80
80
  one(id: string): Obj | null;
81
81
  all(): string[];
82
82
  }>;
package/dist/engine.js CHANGED
@@ -13,6 +13,7 @@ const feed_1 = require("./feed");
13
13
  const messages_1 = require("./messages");
14
14
  const generic_1 = require("./generic");
15
15
  const platform_1 = require("./handlers/platform");
16
+ const emu4_trust_1 = require("./handlers/emu4-trust");
16
17
  const handlers_1 = require("./handlers");
17
18
  const toHeaders = (h) => {
18
19
  const out = new Headers();
@@ -256,6 +257,9 @@ class Engine {
256
257
  const reply = await handler({ engine: this, request, params, query: url.searchParams, body, key, op });
257
258
  // A handler says "success" with 200 or 201; the document decides which one (a create is 201 only where the API says so).
258
259
  const status = op && (reply.status === undefined || reply.status === 200 || reply.status === 201) ? op.successStatus : (reply.status ?? 200);
260
+ // Every successful write leaves an audit row (the tamper-evident audit chain covers these rows).
261
+ if (status < 400)
262
+ (0, emu4_trust_1.auditMutation)(this, { method, path, params, key, body: reply.body });
259
263
  const headers = { ...budgetHeaders, ...(reply.headers ?? {}) };
260
264
  if (unknown.length)
261
265
  headers['Atlas-Unknown-Fields'] = unknown.join(',');