@owlmeans/planning 0.1.18-rc.9 → 0.1.18

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 (295) hide show
  1. package/README.md +122 -29
  2. package/agent-meta/manifest.json +131 -4
  3. package/agent-meta/skills/planning/SKILL.md +78 -171
  4. package/agent-meta/skills/planning/parts/collaboration.md +67 -0
  5. package/agent-meta/skills/planning/parts/errors.md +51 -0
  6. package/agent-meta/skills/planning/parts/fold.md +69 -0
  7. package/agent-meta/skills/planning/parts/mounting.md +64 -0
  8. package/agent-meta/skills/planning/parts/types.md +141 -0
  9. package/build/aliases/types.d.ts +72 -0
  10. package/build/aliases/types.d.ts.map +1 -0
  11. package/build/aliases/types.js +2 -0
  12. package/build/aliases/types.js.map +1 -0
  13. package/build/aliases.d.ts +4 -0
  14. package/build/aliases.d.ts.map +1 -0
  15. package/build/aliases.js +28 -0
  16. package/build/aliases.js.map +1 -0
  17. package/build/consts.d.ts +43 -34
  18. package/build/consts.d.ts.map +1 -1
  19. package/build/consts.js +49 -25
  20. package/build/consts.js.map +1 -1
  21. package/build/entrypoints/types.d.ts +105 -0
  22. package/build/entrypoints/types.d.ts.map +1 -0
  23. package/build/entrypoints/types.js +2 -0
  24. package/build/entrypoints/types.js.map +1 -0
  25. package/build/entrypoints.d.ts +5 -1
  26. package/build/entrypoints.d.ts.map +1 -1
  27. package/build/entrypoints.js +24 -6
  28. package/build/entrypoints.js.map +1 -1
  29. package/build/errors.d.ts +41 -0
  30. package/build/errors.d.ts.map +1 -1
  31. package/build/errors.js +61 -0
  32. package/build/errors.js.map +1 -1
  33. package/build/helpers/app/consts.local.d.ts +5 -0
  34. package/build/helpers/app/consts.local.d.ts.map +1 -0
  35. package/build/helpers/app/consts.local.js +5 -0
  36. package/build/helpers/app/consts.local.js.map +1 -0
  37. package/build/helpers/app/types.d.ts +53 -0
  38. package/build/helpers/app/types.d.ts.map +1 -0
  39. package/build/helpers/app/types.js +2 -0
  40. package/build/helpers/app/types.js.map +1 -0
  41. package/build/helpers/app.d.ts +4 -0
  42. package/build/helpers/app.d.ts.map +1 -0
  43. package/build/helpers/app.js +139 -0
  44. package/build/helpers/app.js.map +1 -0
  45. package/build/helpers/apply/consts.local.d.ts +7 -0
  46. package/build/helpers/apply/consts.local.d.ts.map +1 -0
  47. package/build/helpers/apply/consts.local.js +9 -0
  48. package/build/helpers/apply/consts.local.js.map +1 -0
  49. package/build/helpers/apply/types.d.ts +32 -0
  50. package/build/helpers/apply/types.d.ts.map +1 -0
  51. package/build/helpers/apply/types.js +2 -0
  52. package/build/helpers/apply/types.js.map +1 -0
  53. package/build/helpers/apply.d.ts +5 -23
  54. package/build/helpers/apply.d.ts.map +1 -1
  55. package/build/helpers/apply.js +127 -144
  56. package/build/helpers/apply.js.map +1 -1
  57. package/build/helpers/card/types.d.ts +20 -0
  58. package/build/helpers/card/types.d.ts.map +1 -0
  59. package/build/helpers/card/types.js +2 -0
  60. package/build/helpers/card/types.js.map +1 -0
  61. package/build/helpers/card.d.ts +11 -7
  62. package/build/helpers/card.d.ts.map +1 -1
  63. package/build/helpers/card.js +41 -28
  64. package/build/helpers/card.js.map +1 -1
  65. package/build/helpers/changes/consts.local.d.ts +13 -0
  66. package/build/helpers/changes/consts.local.d.ts.map +1 -0
  67. package/build/helpers/changes/consts.local.js +13 -0
  68. package/build/helpers/changes/consts.local.js.map +1 -0
  69. package/build/helpers/changes/types.d.ts +58 -0
  70. package/build/helpers/changes/types.d.ts.map +1 -0
  71. package/build/helpers/changes/types.js +2 -0
  72. package/build/helpers/changes/types.js.map +1 -0
  73. package/build/helpers/changes.d.ts +11 -42
  74. package/build/helpers/changes.d.ts.map +1 -1
  75. package/build/helpers/changes.js +237 -251
  76. package/build/helpers/changes.js.map +1 -1
  77. package/build/helpers/code/types.d.ts +27 -0
  78. package/build/helpers/code/types.d.ts.map +1 -0
  79. package/build/helpers/code/types.js +2 -0
  80. package/build/helpers/code/types.js.map +1 -0
  81. package/build/helpers/code.d.ts +6 -17
  82. package/build/helpers/code.d.ts.map +1 -1
  83. package/build/helpers/code.js +39 -40
  84. package/build/helpers/code.js.map +1 -1
  85. package/build/helpers/index.d.ts +16 -0
  86. package/build/helpers/index.d.ts.map +1 -1
  87. package/build/helpers/index.js +4 -0
  88. package/build/helpers/index.js.map +1 -1
  89. package/build/helpers/query/types.d.ts +23 -0
  90. package/build/helpers/query/types.d.ts.map +1 -0
  91. package/build/helpers/query/types.js +2 -0
  92. package/build/helpers/query/types.js.map +1 -0
  93. package/build/helpers/query.d.ts +25 -17
  94. package/build/helpers/query.d.ts.map +1 -1
  95. package/build/helpers/query.js +108 -280
  96. package/build/helpers/query.js.map +1 -1
  97. package/build/helpers/reply/consts.d.ts +2 -0
  98. package/build/helpers/reply/consts.d.ts.map +1 -0
  99. package/build/helpers/reply/consts.js +2 -0
  100. package/build/helpers/reply/consts.js.map +1 -0
  101. package/build/helpers/reply/types.d.ts +10 -0
  102. package/build/helpers/reply/types.d.ts.map +1 -0
  103. package/build/helpers/reply/types.js +2 -0
  104. package/build/helpers/reply/types.js.map +1 -0
  105. package/build/helpers/reply.d.ts +5 -0
  106. package/build/helpers/reply.d.ts.map +1 -0
  107. package/build/helpers/reply.js +29 -0
  108. package/build/helpers/reply.js.map +1 -0
  109. package/build/helpers/scoped/types.d.ts +73 -0
  110. package/build/helpers/scoped/types.d.ts.map +1 -0
  111. package/build/helpers/scoped/types.js +2 -0
  112. package/build/helpers/scoped/types.js.map +1 -0
  113. package/build/helpers/scoped.d.ts +25 -0
  114. package/build/helpers/scoped.d.ts.map +1 -0
  115. package/build/helpers/scoped.js +223 -0
  116. package/build/helpers/scoped.js.map +1 -0
  117. package/build/helpers/specification/types.d.ts +24 -0
  118. package/build/helpers/specification/types.d.ts.map +1 -0
  119. package/build/helpers/specification/types.js +2 -0
  120. package/build/helpers/specification/types.js.map +1 -0
  121. package/build/helpers/specification.d.ts +9 -13
  122. package/build/helpers/specification.d.ts.map +1 -1
  123. package/build/helpers/specification.js +47 -44
  124. package/build/helpers/specification.js.map +1 -1
  125. package/build/helpers/status/types.d.ts +48 -0
  126. package/build/helpers/status/types.d.ts.map +1 -0
  127. package/build/helpers/status/types.js +2 -0
  128. package/build/helpers/status/types.js.map +1 -0
  129. package/build/helpers/status.d.ts +16 -29
  130. package/build/helpers/status.d.ts.map +1 -1
  131. package/build/helpers/status.js +77 -73
  132. package/build/helpers/status.js.map +1 -1
  133. package/build/helpers/types.local.d.ts +17 -0
  134. package/build/helpers/types.local.d.ts.map +1 -0
  135. package/build/helpers/types.local.js +2 -0
  136. package/build/helpers/types.local.js.map +1 -0
  137. package/build/helpers/validate/types.d.ts +31 -0
  138. package/build/helpers/validate/types.d.ts.map +1 -0
  139. package/build/helpers/validate/types.js +2 -0
  140. package/build/helpers/validate/types.js.map +1 -0
  141. package/build/helpers/validate.d.ts +8 -19
  142. package/build/helpers/validate.d.ts.map +1 -1
  143. package/build/helpers/validate.js +79 -79
  144. package/build/helpers/validate.js.map +1 -1
  145. package/build/helpers/wire/types.d.ts +28 -0
  146. package/build/helpers/wire/types.d.ts.map +1 -0
  147. package/build/helpers/wire/types.js +2 -0
  148. package/build/helpers/wire/types.js.map +1 -0
  149. package/build/helpers/wire.d.ts +4 -0
  150. package/build/helpers/wire.d.ts.map +1 -0
  151. package/build/helpers/wire.js +216 -0
  152. package/build/helpers/wire.js.map +1 -0
  153. package/build/i18n/be.json +5 -0
  154. package/build/i18n/de.json +5 -0
  155. package/build/i18n/en.json +5 -0
  156. package/build/i18n/es.json +5 -0
  157. package/build/i18n/fr.json +5 -0
  158. package/build/i18n/pl.json +5 -0
  159. package/build/i18n/ru.json +5 -0
  160. package/build/i18n/uk.json +5 -0
  161. package/build/i18n.js +3 -3
  162. package/build/i18n.js.map +1 -1
  163. package/build/index.d.ts +7 -0
  164. package/build/index.d.ts.map +1 -1
  165. package/build/index.js +3 -0
  166. package/build/index.js.map +1 -1
  167. package/build/models/index.d.ts +2 -3
  168. package/build/models/index.d.ts.map +1 -1
  169. package/build/models/index.js +1 -15
  170. package/build/models/index.js.map +1 -1
  171. package/build/models/model.d.ts +5 -0
  172. package/build/models/model.d.ts.map +1 -0
  173. package/build/models/model.js +16 -0
  174. package/build/models/model.js.map +1 -0
  175. package/build/models/project.d.ts +2 -1
  176. package/build/models/project.d.ts.map +1 -1
  177. package/build/models/project.js.map +1 -1
  178. package/build/models/specification.d.ts +2 -1
  179. package/build/models/specification.d.ts.map +1 -1
  180. package/build/models/specification.js.map +1 -1
  181. package/build/models/types.d.ts +69 -0
  182. package/build/models/types.d.ts.map +1 -0
  183. package/build/models/types.js +2 -0
  184. package/build/models/types.js.map +1 -0
  185. package/build/models/workcard.d.ts +2 -1
  186. package/build/models/workcard.d.ts.map +1 -1
  187. package/build/models/workcard.js +12 -12
  188. package/build/models/workcard.js.map +1 -1
  189. package/build/registry.d.ts +3 -2
  190. package/build/registry.d.ts.map +1 -1
  191. package/build/registry.js +51 -3
  192. package/build/registry.js.map +1 -1
  193. package/build/resources/mentions.d.ts +4 -0
  194. package/build/resources/mentions.d.ts.map +1 -0
  195. package/build/resources/mentions.js +15 -0
  196. package/build/resources/mentions.js.map +1 -0
  197. package/build/resources/protocol/types.d.ts +30 -0
  198. package/build/resources/protocol/types.d.ts.map +1 -0
  199. package/build/resources/protocol/types.js +2 -0
  200. package/build/resources/protocol/types.js.map +1 -0
  201. package/build/resources/protocol.d.ts +6 -0
  202. package/build/resources/protocol.d.ts.map +1 -0
  203. package/build/resources/protocol.js +31 -0
  204. package/build/resources/protocol.js.map +1 -0
  205. package/build/resources/types.d.ts +146 -0
  206. package/build/resources/types.d.ts.map +1 -0
  207. package/build/resources/types.js +2 -0
  208. package/build/resources/types.js.map +1 -0
  209. package/build/resources/types.local.d.ts +6 -0
  210. package/build/resources/types.local.d.ts.map +1 -0
  211. package/build/resources/types.local.js +2 -0
  212. package/build/resources/types.local.js.map +1 -0
  213. package/build/schemas.d.ts +21 -2
  214. package/build/schemas.d.ts.map +1 -1
  215. package/build/schemas.js +164 -2
  216. package/build/schemas.js.map +1 -1
  217. package/build/types.d.ts +330 -151
  218. package/build/types.d.ts.map +1 -1
  219. package/build/utils.d.ts +6 -0
  220. package/build/utils.d.ts.map +1 -0
  221. package/build/utils.js +6 -0
  222. package/build/utils.js.map +1 -0
  223. package/package.json +13 -13
  224. package/src/aliases/types.ts +41 -0
  225. package/src/aliases.ts +34 -0
  226. package/src/consts.ts +50 -25
  227. package/src/entrypoints/types.ts +77 -0
  228. package/src/entrypoints.ts +53 -24
  229. package/src/errors.ts +71 -0
  230. package/src/helpers/app/consts.local.ts +5 -0
  231. package/src/helpers/app/types.ts +54 -0
  232. package/src/helpers/app.ts +158 -0
  233. package/src/helpers/apply/consts.local.ts +10 -0
  234. package/src/helpers/apply/types.ts +32 -0
  235. package/src/helpers/apply.ts +141 -153
  236. package/src/helpers/card/types.ts +20 -0
  237. package/src/helpers/card.ts +59 -33
  238. package/src/helpers/changes/consts.local.ts +17 -0
  239. package/src/helpers/changes/types.ts +66 -0
  240. package/src/helpers/changes.ts +270 -280
  241. package/src/helpers/code/types.ts +31 -0
  242. package/src/helpers/code.ts +52 -48
  243. package/src/helpers/index.ts +17 -0
  244. package/src/helpers/query/types.ts +26 -0
  245. package/src/helpers/query.ts +144 -314
  246. package/src/helpers/reply/consts.ts +1 -0
  247. package/src/helpers/reply/types.ts +13 -0
  248. package/src/helpers/reply.ts +27 -0
  249. package/src/helpers/scoped/types.ts +78 -0
  250. package/src/helpers/scoped.ts +281 -0
  251. package/src/helpers/specification/types.ts +26 -0
  252. package/src/helpers/specification.ts +69 -51
  253. package/src/helpers/status/types.ts +46 -0
  254. package/src/helpers/status.ts +117 -93
  255. package/src/helpers/types.local.ts +18 -0
  256. package/src/helpers/validate/types.ts +31 -0
  257. package/src/helpers/validate.ts +89 -77
  258. package/src/helpers/wire/types.ts +31 -0
  259. package/src/helpers/wire.ts +252 -0
  260. package/src/i18n/be.json +5 -0
  261. package/src/i18n/de.json +5 -0
  262. package/src/i18n/en.json +5 -0
  263. package/src/i18n/es.json +5 -0
  264. package/src/i18n/fr.json +5 -0
  265. package/src/i18n/pl.json +5 -0
  266. package/src/i18n/ru.json +5 -0
  267. package/src/i18n/uk.json +5 -0
  268. package/src/i18n.ts +4 -3
  269. package/src/index.ts +8 -0
  270. package/src/models/index.ts +2 -17
  271. package/src/models/model.ts +18 -0
  272. package/src/models/project.ts +2 -1
  273. package/src/models/specification.ts +2 -1
  274. package/src/models/types.ts +70 -0
  275. package/src/models/workcard.ts +14 -16
  276. package/src/registry.ts +55 -4
  277. package/src/resources/mentions.ts +11 -0
  278. package/src/resources/protocol/types.ts +21 -0
  279. package/src/resources/protocol.ts +36 -0
  280. package/src/resources/types.local.ts +5 -0
  281. package/src/resources/types.ts +148 -0
  282. package/src/schemas.ts +179 -4
  283. package/src/types.ts +334 -130
  284. package/src/utils.ts +9 -0
  285. package/tests/app.spec.ts +188 -0
  286. package/tests/apply.spec.ts +95 -31
  287. package/tests/code.spec.ts +9 -9
  288. package/tests/csp.spec.ts +122 -0
  289. package/tests/entrypoints.spec.ts +18 -2
  290. package/tests/error-status.spec.ts +6 -1
  291. package/tests/models.spec.ts +24 -16
  292. package/tests/query.spec.ts +13 -15
  293. package/tests/schemas.spec.ts +8 -8
  294. package/tests/scoped.spec.ts +161 -0
  295. package/tests/status.spec.ts +31 -22
@@ -1,162 +1,145 @@
1
- import { IntrinsicStatus, TransitionAction } from '../consts.js';
1
+ import { IntrinsicStatus, PlanningResourceKind, TransitionAction } from '../consts.js';
2
2
  import { PlanningError } from '../errors.js';
3
- /** Never written by a transition's `changes`: the fold takes them from the transition itself. */
4
- const IDENTITY_KEYS = new Set(['id', 'kind', 'type', 'entityId', 'seq', 'head', 'createdAt']);
5
- /** Cannot be cleared: a record without them is not a record. */
6
- const REQUIRED_KEYS = new Set([
7
- ...IDENTITY_KEYS, 'title', 'parents', 'status', 'intrinsic', 'flows', 'labels', 'fields',
8
- ]);
9
- /** Merged shallowly into the card's own map rather than replacing it. */
10
- const MERGED_KEYS = new Set(['fields', 'flows']);
3
+ import { IDENTITY_KEYS, MERGED_KEYS, REQUIRED_KEYS } from './apply/consts.local.js';
11
4
  const clean = (record) => Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
12
- const outOfOrder = (card, transition) => new PlanningError(`fold:out-of-order:${transition.card}:${card?.seq ?? 0}:${transition.seq}`);
13
- const unsetOn = (record, paths) => {
14
- for (const path of paths ?? []) {
15
- const dot = path.indexOf('.');
16
- if (dot > 0) {
17
- const head = path.slice(0, dot);
18
- const map = record[head];
19
- if (MERGED_KEYS.has(head) && map != null && typeof map === 'object') {
20
- delete map[path.slice(dot + 1)];
5
+ export const createApplyHelper = () => {
6
+ const outOfOrder = (card, transition) => new PlanningError(`fold:out-of-order:${transition.card}:${card?.seq ?? 0}:${transition.seq}`);
7
+ const unsetOn = (record, paths) => {
8
+ for (const path of paths ?? []) {
9
+ const dot = path.indexOf('.');
10
+ if (dot > 0) {
11
+ const head = path.slice(0, dot);
12
+ const map = record[head];
13
+ if (MERGED_KEYS.has(head) && map != null && typeof map === 'object') {
14
+ delete map[path.slice(dot + 1)];
15
+ }
16
+ continue;
17
+ }
18
+ if (!REQUIRED_KEYS.has(path)) {
19
+ delete record[path];
21
20
  }
22
- continue;
23
- }
24
- if (!REQUIRED_KEYS.has(path)) {
25
- delete record[path];
26
- }
27
- }
28
- };
29
- const writeChanges = (record, changes) => {
30
- for (const [key, value] of Object.entries(changes)) {
31
- if (value === undefined || IDENTITY_KEYS.has(key)) {
32
- continue;
33
21
  }
34
- if (MERGED_KEYS.has(key)) {
35
- const merged = { ...(record[key] ?? {}) };
36
- for (const [entry, entryValue] of Object.entries(value ?? {})) {
37
- if (entryValue === null) {
38
- delete merged[entry];
22
+ };
23
+ const writeChanges = (record, changes) => {
24
+ for (const [key, value] of Object.entries(changes)) {
25
+ if (value === undefined || IDENTITY_KEYS.has(key)) {
26
+ continue;
27
+ }
28
+ if (MERGED_KEYS.has(key)) {
29
+ const merged = { ...(record[key] ?? {}) };
30
+ for (const [entry, entryValue] of Object.entries(value ?? {})) {
31
+ if (entryValue === null) {
32
+ delete merged[entry];
33
+ }
34
+ else if (entryValue !== undefined) {
35
+ merged[entry] = entryValue;
36
+ }
39
37
  }
40
- else if (entryValue !== undefined) {
41
- merged[entry] = entryValue;
38
+ record[key] = merged;
39
+ continue;
40
+ }
41
+ if (value === null) {
42
+ if (!REQUIRED_KEYS.has(key)) {
43
+ delete record[key];
42
44
  }
45
+ continue;
43
46
  }
44
- record[key] = merged;
45
- continue;
47
+ record[key] = value;
46
48
  }
47
- if (value === null) {
48
- if (!REQUIRED_KEYS.has(key)) {
49
- delete record[key];
49
+ };
50
+ const applyTransition = (card, transition) => {
51
+ if (card != null && transition.seq <= card.seq) {
52
+ return card;
53
+ }
54
+ if (card == null) {
55
+ if (transition.action === TransitionAction.Delete) {
56
+ return null;
57
+ }
58
+ if (transition.action !== TransitionAction.Create || transition.seq !== 1) {
59
+ throw outOfOrder(card, transition);
50
60
  }
51
- continue;
52
61
  }
53
- record[key] = value;
54
- }
55
- };
56
- /**
57
- * THE fold: the card after one transition. Pure, total, no I/O — every store (memory, Mongo, a
58
- * client mirror) folds with this and nothing else, so one log always means one card.
59
- *
60
- * - An already-applied transition (`seq <= card.seq`) returns the card unchanged: re-folding is
61
- * safe.
62
- * - Anything but the next seq (`card.seq + 1`, or 1 for a create with no card) is refused with
63
- * `PlanningError('fold:out-of-order')`.
64
- * - `create` builds the whole record from `changes` plus the transition's identity; `delete`
65
- * answers `null`; `link`/`unlink` only move `seq`/`head`/`updatedAt` (the edges are
66
- * {@link applyRelationship}'s); `update`/`transit` write `changes` — `fields` and `flows` merge,
67
- * everything else replaces — and clear `unset`.
68
- * - Every result has `seq = transition.seq`, `head = max(head, seq)`, `updatedAt = transition.at`.
69
- *
70
- * @throws {PlanningError} `planning:fold:out-of-order:…`
71
- */
72
- export const applyTransition = (card, transition) => {
73
- if (card != null && transition.seq <= card.seq) {
74
- return card;
75
- }
76
- if (card == null) {
62
+ else if (transition.seq !== card.seq + 1) {
63
+ throw outOfOrder(card, transition);
64
+ }
77
65
  if (transition.action === TransitionAction.Delete) {
78
66
  return null;
79
67
  }
80
- if (transition.action !== TransitionAction.Create || transition.seq !== 1) {
81
- throw outOfOrder(card, transition);
68
+ const head = Math.max(card?.head ?? card?.seq ?? 0, transition.seq);
69
+ const changes = structuredClone(transition.changes ?? {});
70
+ if (transition.action === TransitionAction.Create) {
71
+ const record = {
72
+ parents: [], labels: [], fields: {}, flows: {}, status: '', intrinsic: IntrinsicStatus.Planned,
73
+ };
74
+ writeChanges(record, changes);
75
+ unsetOn(record, transition.unset);
76
+ return clean({
77
+ ...record,
78
+ id: transition.card,
79
+ kind: transition.kind,
80
+ type: transition.type,
81
+ entityId: transition.entityId,
82
+ seq: transition.seq,
83
+ head,
84
+ createdAt: transition.at,
85
+ updatedAt: transition.at,
86
+ });
82
87
  }
83
- }
84
- else if (transition.seq !== card.seq + 1) {
85
- throw outOfOrder(card, transition);
86
- }
87
- if (transition.action === TransitionAction.Delete) {
88
- return null;
89
- }
90
- const head = Math.max(card?.head ?? card?.seq ?? 0, transition.seq);
91
- const changes = structuredClone(transition.changes ?? {});
92
- if (transition.action === TransitionAction.Create) {
93
- const record = {
94
- parents: [], labels: [], fields: {}, flows: {}, status: '', intrinsic: IntrinsicStatus.Planned,
95
- };
96
- writeChanges(record, changes);
97
- unsetOn(record, transition.unset);
98
- return clean({
99
- ...record,
100
- id: transition.card,
101
- kind: transition.kind,
102
- type: transition.type,
103
- entityId: transition.entityId,
104
- seq: transition.seq,
105
- head,
106
- createdAt: transition.at,
107
- updatedAt: transition.at,
108
- });
109
- }
110
- const record = structuredClone(card);
111
- if (transition.action === TransitionAction.Update || transition.action === TransitionAction.Transit) {
112
- writeChanges(record, changes);
113
- unsetOn(record, transition.unset);
114
- }
115
- record.seq = transition.seq;
116
- record.head = head;
117
- record.updatedAt = transition.at;
118
- return clean(record);
119
- };
120
- const edgeOf = (transition, draft) => clean({
121
- entityId: transition.entityId,
122
- type: draft.type,
123
- from: draft.from ?? transition.card,
124
- to: draft.to,
125
- project: transition.project,
126
- fields: draft.fields == null ? undefined : structuredClone(draft.fields),
127
- createdAt: transition.at,
128
- transition: transition.id,
129
- });
130
- const sameEdge = (left, right) => left.entityId === right.entityId && left.from === right.from && left.to === right.to && left.type === right.type;
131
- /**
132
- * The relationships after one transition. Pure and total, like {@link applyTransition}.
133
- *
134
- * `create` adds its `links`, `link` adds its `link`, `unlink` removes the matching edge, and a
135
- * `delete` removes every edge touching the card. An edge that already exists is kept as it is, so
136
- * re-folding adds nothing. Every other action answers the list unchanged. Always a new array.
137
- */
138
- export const applyRelationship = (links, transition) => {
139
- const add = (drafts) => drafts.reduce((result, draft) => {
140
- const edge = edgeOf(transition, draft);
141
- return result.some(existing => sameEdge(existing, edge)) ? result : [...result, edge];
142
- }, [...links]);
143
- switch (transition.action) {
144
- case TransitionAction.Create:
145
- return add(transition.links ?? []);
146
- case TransitionAction.Link:
147
- return add(transition.link == null ? [] : [transition.link]);
148
- case TransitionAction.Unlink: {
149
- if (transition.link == null) {
150
- return [...links];
88
+ const record = structuredClone(card);
89
+ if (transition.action === TransitionAction.Update || transition.action === TransitionAction.Transit) {
90
+ writeChanges(record, changes);
91
+ unsetOn(record, transition.unset);
92
+ }
93
+ record.seq = transition.seq;
94
+ record.head = head;
95
+ record.updatedAt = transition.at;
96
+ return clean(record);
97
+ };
98
+ const edgeOf = (transition, draft) => clean({
99
+ entityId: transition.entityId,
100
+ type: draft.type,
101
+ from: draft.from ?? transition.card,
102
+ to: draft.to,
103
+ fromKind: draft.fromKind,
104
+ toKind: draft.toKind,
105
+ project: transition.project,
106
+ fields: draft.fields == null ? undefined : structuredClone(draft.fields),
107
+ createdAt: transition.at,
108
+ transition: transition.id,
109
+ });
110
+ const sameEdge = (left, right) => left.entityId === right.entityId && left.from === right.from && left.to === right.to && left.type === right.type
111
+ && (left.fromKind ?? PlanningResourceKind.Workcard) === (right.fromKind ?? PlanningResourceKind.Workcard)
112
+ && (left.toKind ?? PlanningResourceKind.Workcard) === (right.toKind ?? PlanningResourceKind.Workcard);
113
+ const applyRelationship = (links, transition) => {
114
+ const add = (drafts) => drafts.reduce((result, draft) => {
115
+ const edge = edgeOf(transition, draft);
116
+ return result.some(existing => sameEdge(existing, edge)) ? result : [...result, edge];
117
+ }, [...links]);
118
+ switch (transition.action) {
119
+ case TransitionAction.Create:
120
+ return add(transition.links ?? []);
121
+ case TransitionAction.Link:
122
+ return add(transition.link == null ? [] : [transition.link]);
123
+ case TransitionAction.Unlink: {
124
+ if (transition.link == null) {
125
+ return [...links];
126
+ }
127
+ const edge = edgeOf(transition, transition.link);
128
+ return links.filter(existing => !sameEdge(existing, edge));
151
129
  }
152
- const edge = edgeOf(transition, transition.link);
153
- return links.filter(existing => !sameEdge(existing, edge));
130
+ case TransitionAction.Delete:
131
+ return links.filter(existing => existing.entityId !== transition.entityId
132
+ || !((existing.from === transition.card && (existing.fromKind ?? PlanningResourceKind.Workcard) === PlanningResourceKind.Workcard)
133
+ || (existing.to === transition.card && (existing.toKind ?? PlanningResourceKind.Workcard) === PlanningResourceKind.Workcard)));
134
+ default:
135
+ return [...links];
154
136
  }
155
- case TransitionAction.Delete:
156
- return links.filter(existing => existing.entityId !== transition.entityId
157
- || (existing.from !== transition.card && existing.to !== transition.card));
158
- default:
159
- return [...links];
160
- }
137
+ };
138
+ return { applyTransition, applyRelationship };
161
139
  };
140
+ export const applyHelper = createApplyHelper();
141
+ /** @deprecated compat:factory-refactor — use `applyHelper.applyTransition(…)` */
142
+ export const applyTransition = (card, transition) => applyHelper.applyTransition(card, transition);
143
+ /** @deprecated compat:factory-refactor — use `applyHelper.applyRelationship(…)` */
144
+ export const applyRelationship = (links, transition) => applyHelper.applyRelationship(links, transition);
162
145
  //# sourceMappingURL=apply.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/helpers/apply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/helpers/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Card, Project, Specification, Workcard, WorkcardDraft } from '../../types.js';
2
+ /** The kind guards and the parent rules every record keeps. */
3
+ export interface CardHelper {
4
+ isProject: (card?: Workcard | null) => card is Project;
5
+ isCard: (card?: Workcard | null) => card is Card;
6
+ isSpecification: (card?: Workcard | null) => card is Specification;
7
+ /** `parents` with `parent` first and no repeats — the invariant every record keeps. */
8
+ normalizeParents: (parent?: string | null, parents?: string[] | null) => string[];
9
+ /** A draft with the collections every record carries filled in. */
10
+ cardDefaults: (draft: WorkcardDraft) => WorkcardDraft & Required<Pick<WorkcardDraft, 'parents' | 'labels' | 'fields'>>;
11
+ /** A transition was allocated for the card and has not been folded yet. */
12
+ isPending: (card: Pick<Workcard, 'seq' | 'head'>) => boolean;
13
+ parentOf: (card: Workcard) => string | undefined;
14
+ /**
15
+ * The project a card belongs to: a project is its own; a card under a project is that project's;
16
+ * anything deeper is its parent's project, which needs the parent to answer.
17
+ */
18
+ projectOf: (card: Workcard, parent?: Workcard | null) => string | undefined;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/helpers/card/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE3F,+DAA+D;AAC/D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,OAAO,CAAA;IACtD,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,CAAA;IAChD,eAAe,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,aAAa,CAAA;IAClE,uFAAuF;IACvF,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,KAAK,MAAM,EAAE,CAAA;IACjF,mEAAmE;IACnE,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAA;IACtH,2EAA2E;IAC3E,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,OAAO,CAAA;IAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,CAAA;IAChD;;;OAGG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,MAAM,GAAG,SAAS,CAAA;CAC5E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/helpers/card/types.ts"],"names":[],"mappings":""}
@@ -1,17 +1,21 @@
1
1
  import type { Card, Project, Specification, Workcard, WorkcardDraft } from '../types.js';
2
+ import type { CardHelper } from './card/types.js';
3
+ export declare const createCardHelper: () => CardHelper;
4
+ export declare const cardHelper: CardHelper;
5
+ /** @deprecated compat:factory-refactor — use `cardHelper.isProject(…)` */
2
6
  export declare const isProject: (card?: Workcard | null) => card is Project;
7
+ /** @deprecated compat:factory-refactor — use `cardHelper.isCard(…)` */
3
8
  export declare const isCard: (card?: Workcard | null) => card is Card;
9
+ /** @deprecated compat:factory-refactor — use `cardHelper.isSpecification(…)` */
4
10
  export declare const isSpecification: (card?: Workcard | null) => card is Specification;
5
- /** `parents` with `parent` first and no repeats — the invariant every record keeps. */
11
+ /** @deprecated compat:factory-refactor — use `cardHelper.normalizeParents(…)` */
6
12
  export declare const normalizeParents: (parent?: string | null, parents?: string[] | null) => string[];
7
- /** A draft with the collections every record carries filled in. */
13
+ /** @deprecated compat:factory-refactor — use `cardHelper.cardDefaults(…)` */
8
14
  export declare const cardDefaults: (draft: WorkcardDraft) => WorkcardDraft & Required<Pick<WorkcardDraft, 'parents' | 'labels' | 'fields'>>;
9
- /** A transition was allocated for the card and has not been folded yet. */
15
+ /** @deprecated compat:factory-refactor — use `cardHelper.isPending(…)` */
10
16
  export declare const isPending: (card: Pick<Workcard, 'seq' | 'head'>) => boolean;
17
+ /** @deprecated compat:factory-refactor — use `cardHelper.parentOf(…)` */
11
18
  export declare const parentOf: (card: Workcard) => string | undefined;
12
- /**
13
- * The project a card belongs to: a project is its own; a card under a project is that project's;
14
- * anything deeper is its parent's project, which needs the parent to answer.
15
- */
19
+ /** @deprecated compat:factory-refactor — use `cardHelper.projectOf(…)` */
16
20
  export declare const projectOf: (card: Workcard, parent?: Workcard | null) => string | undefined;
17
21
  //# sourceMappingURL=card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/helpers/card.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAExF,eAAO,MAAM,SAAS,UAAW,QAAQ,GAAG,IAAI,KAAG,IAAI,IAAI,OAA8C,CAAA;AAEzG,eAAO,MAAM,MAAM,UAAW,QAAQ,GAAG,IAAI,KAAG,IAAI,IAAI,IAAwC,CAAA;AAEhG,eAAO,MAAM,eAAe,UAAW,QAAQ,GAAG,IAAI,KAAG,IAAI,IAAI,aACtB,CAAA;AAE3C,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,YAAa,MAAM,GAAG,IAAI,YAAY,MAAM,EAAE,GAAG,IAAI,KAAG,MAAM,EAE/D,CAAA;AAE5B,mEAAmE;AACnE,eAAO,MAAM,YAAY,UAAW,aAAa,KAAG,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAK/H,CAAA;AAEF,2EAA2E;AAC3E,eAAO,MAAM,SAAS,SAAU,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC,KAAG,OAA6C,CAAA;AAE9G,eAAO,MAAM,QAAQ,SAAU,QAAQ,KAAG,MAAM,GAAG,SAA2C,CAAA;AAE9F;;;GAGG;AACH,eAAO,MAAM,SAAS,SAAU,QAAQ,WAAW,QAAQ,GAAG,IAAI,KAAG,MAAM,GAAG,SAS7E,CAAA"}
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/helpers/card.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,gBAAgB,QAAO,UAmCnC,CAAA;AAED,eAAO,MAAM,UAAU,YAAqB,CAAA;AAE5C,0EAA0E;AAC1E,eAAO,MAAM,SAAS,UAAW,QAAQ,GAAG,IAAI,KAAG,IAAI,IAAI,OAAqC,CAAA;AAEhG,uEAAuE;AACvE,eAAO,MAAM,MAAM,UAAW,QAAQ,GAAG,IAAI,KAAG,IAAI,IAAI,IAA+B,CAAA;AAEvF,gFAAgF;AAChF,eAAO,MAAM,eAAe,UAAW,QAAQ,GAAG,IAAI,KAAG,IAAI,IAAI,aAAiD,CAAA;AAElH,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,YAAa,MAAM,GAAG,IAAI,YAAY,MAAM,EAAE,GAAG,IAAI,KAAG,MAAM,EAC7C,CAAA;AAE9C,6EAA6E;AAC7E,eAAO,MAAM,YAAY,UAAW,aAAa,KAAG,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC,CACjG,CAAA;AAEhC,0EAA0E;AAC1E,eAAO,MAAM,SAAS,SAAU,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC,KAAG,OAAqC,CAAA;AAEtG,yEAAyE;AACzE,eAAO,MAAM,QAAQ,SAAU,QAAQ,KAAG,MAAM,GAAG,SAAsC,CAAA;AAEzF,0EAA0E;AAC1E,eAAO,MAAM,SAAS,SAAU,QAAQ,WAAW,QAAQ,GAAG,IAAI,KAAG,MAAM,GAAG,SAA+C,CAAA"}
@@ -1,31 +1,44 @@
1
1
  import { WorkcardKind } from '../consts.js';
2
- export const isProject = (card) => card?.kind === WorkcardKind.Project;
3
- export const isCard = (card) => card?.kind === WorkcardKind.Card;
4
- export const isSpecification = (card) => card?.kind === WorkcardKind.Specification;
5
- /** `parents` with `parent` first and no repeats — the invariant every record keeps. */
6
- export const normalizeParents = (parent, parents) => [...new Set([...(parent != null && parent !== '' ? [parent] : []), ...(parents ?? [])])]
7
- .filter(id => id !== '');
8
- /** A draft with the collections every record carries filled in. */
9
- export const cardDefaults = (draft) => ({
10
- ...draft,
11
- parents: normalizeParents(draft.parent, draft.parents),
12
- labels: [...new Set(draft.labels ?? [])],
13
- fields: draft.fields ?? {},
14
- });
15
- /** A transition was allocated for the card and has not been folded yet. */
16
- export const isPending = (card) => (card.head ?? card.seq) > card.seq;
17
- export const parentOf = (card) => card.parent ?? card.parents[0];
18
- /**
19
- * The project a card belongs to: a project is its own; a card under a project is that project's;
20
- * anything deeper is its parent's project, which needs the parent to answer.
21
- */
22
- export const projectOf = (card, parent) => {
23
- if (isProject(card)) {
24
- return card.id;
25
- }
26
- if (parent != null) {
27
- return isProject(parent) ? parent.id : parent.parent;
28
- }
29
- return card.parent;
2
+ export const createCardHelper = () => {
3
+ const isProject = (card) => card?.kind === WorkcardKind.Project;
4
+ const isCard = (card) => card?.kind === WorkcardKind.Card;
5
+ const isSpecification = (card) => card?.kind === WorkcardKind.Specification;
6
+ const normalizeParents = (parent, parents) => [...new Set([...(parent != null && parent !== '' ? [parent] : []), ...(parents ?? [])])]
7
+ .filter(id => id !== '');
8
+ const cardDefaults = (draft) => ({
9
+ ...draft,
10
+ parents: normalizeParents(draft.parent, draft.parents),
11
+ labels: [...new Set(draft.labels ?? [])],
12
+ fields: draft.fields ?? {},
13
+ });
14
+ const isPending = (card) => (card.head ?? card.seq) > card.seq;
15
+ const parentOf = (card) => card.parent ?? card.parents[0];
16
+ const projectOf = (card, parent) => {
17
+ if (isProject(card)) {
18
+ return card.id;
19
+ }
20
+ if (parent != null) {
21
+ return isProject(parent) ? parent.id : parent.parent;
22
+ }
23
+ return card.parent;
24
+ };
25
+ return { isProject, isCard, isSpecification, normalizeParents, cardDefaults, isPending, parentOf, projectOf };
30
26
  };
27
+ export const cardHelper = createCardHelper();
28
+ /** @deprecated compat:factory-refactor — use `cardHelper.isProject(…)` */
29
+ export const isProject = (card) => cardHelper.isProject(card);
30
+ /** @deprecated compat:factory-refactor — use `cardHelper.isCard(…)` */
31
+ export const isCard = (card) => cardHelper.isCard(card);
32
+ /** @deprecated compat:factory-refactor — use `cardHelper.isSpecification(…)` */
33
+ export const isSpecification = (card) => cardHelper.isSpecification(card);
34
+ /** @deprecated compat:factory-refactor — use `cardHelper.normalizeParents(…)` */
35
+ export const normalizeParents = (parent, parents) => cardHelper.normalizeParents(parent, parents);
36
+ /** @deprecated compat:factory-refactor — use `cardHelper.cardDefaults(…)` */
37
+ export const cardDefaults = (draft) => cardHelper.cardDefaults(draft);
38
+ /** @deprecated compat:factory-refactor — use `cardHelper.isPending(…)` */
39
+ export const isPending = (card) => cardHelper.isPending(card);
40
+ /** @deprecated compat:factory-refactor — use `cardHelper.parentOf(…)` */
41
+ export const parentOf = (card) => cardHelper.parentOf(card);
42
+ /** @deprecated compat:factory-refactor — use `cardHelper.projectOf(…)` */
43
+ export const projectOf = (card, parent) => cardHelper.projectOf(card, parent);
31
44
  //# sourceMappingURL=card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/helpers/card.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG3C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAsB,EAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,YAAY,CAAC,OAAO,CAAA;AAEzG,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAsB,EAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,YAAY,CAAC,IAAI,CAAA;AAEhG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAsB,EAAyB,EAAE,CAC/E,IAAI,EAAE,IAAI,KAAK,YAAY,CAAC,aAAa,CAAA;AAE3C,uFAAuF;AACvF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAsB,EAAE,OAAyB,EAAY,EAAE,CAC9F,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KACrF,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAE5B,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAoB,EAAkF,EAAE,CAAC,CAAC;IACrI,GAAG,KAAK;IACR,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;IACtD,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;CAC3B,CAAC,CAAA;AAEF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAoC,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAA;AAE9G,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAsB,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAE9F;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAc,EAAE,MAAwB,EAAsB,EAAE;IACxF,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IACD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IACtD,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC,CAAA"}
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/helpers/card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Never in a caller's changes: the transition itself carries them. */
2
+ export declare const IDENTITY_KEYS: string[];
3
+ /** Written once, from a create's draft; never by `changes` or `unset`, whatever the action. */
4
+ export declare const PROVENANCE_KEYS: string[];
5
+ /** Move only through `transit` (or a create's draft). */
6
+ export declare const FLOW_KEYS: string[];
7
+ /** Computed by the executor, never supplied. */
8
+ export declare const DERIVED_KEYS: string[];
9
+ /** Cannot be cleared. */
10
+ export declare const REQUIRED_KEYS: string[];
11
+ /** Changing one of these produces a new revision of a revisioned document. */
12
+ export declare const CONTENT_KEYS: string[];
13
+ //# sourceMappingURL=consts.local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.local.d.ts","sourceRoot":"","sources":["../../../src/helpers/changes/consts.local.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,aAAa,UAA+E,CAAA;AAEzG,+FAA+F;AAC/F,eAAO,MAAM,eAAe,UAAgB,CAAA;AAE5C,yDAAyD;AACzD,eAAO,MAAM,SAAS,UAA+C,CAAA;AAErE,gDAAgD;AAChD,eAAO,MAAM,YAAY,UAA4B,CAAA;AAErD,yBAAyB;AACzB,eAAO,MAAM,aAAa,UAAiE,CAAA;AAE3F,8EAA8E;AAC9E,eAAO,MAAM,YAAY,UAAuC,CAAA"}
@@ -0,0 +1,13 @@
1
+ /** Never in a caller's changes: the transition itself carries them. */
2
+ export const IDENTITY_KEYS = ['id', 'kind', 'type', 'entityId', 'seq', 'head', 'parentType', 'createdAt'];
3
+ /** Written once, from a create's draft; never by `changes` or `unset`, whatever the action. */
4
+ export const PROVENANCE_KEYS = ['createdBy'];
5
+ /** Move only through `transit` (or a create's draft). */
6
+ export const FLOW_KEYS = ['status', 'intrinsic', 'flows', 'closedAt'];
7
+ /** Computed by the executor, never supplied. */
8
+ export const DERIVED_KEYS = ['revision', 'bodyChars'];
9
+ /** Cannot be cleared. */
10
+ export const REQUIRED_KEYS = ['title', 'parents', 'labels', 'fields', 'category', 'format'];
11
+ /** Changing one of these produces a new revision of a revisioned document. */
12
+ export const CONTENT_KEYS = ['body', 'ref', 'format', 'version'];
13
+ //# sourceMappingURL=consts.local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.local.js","sourceRoot":"","sources":["../../../src/helpers/changes/consts.local.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAA;AAEzG,+FAA+F;AAC/F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,WAAW,CAAC,CAAA;AAE5C,yDAAyD;AACzD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;AAErE,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;AAErD,yBAAyB;AACzB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;AAE3F,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA"}
@@ -0,0 +1,58 @@
1
+ import type { AnyTypeSchema, SpecificationSlot, TransitionExecution, Workcard, WorkcardChanges } from '../../types.js';
2
+ import type { FlowLookup } from '../types.local.js';
3
+ export interface ChangeSet {
4
+ changes: WorkcardChanges;
5
+ unset: string[];
6
+ /** Transit only: the flow that moved, and the move. */
7
+ flow?: string;
8
+ from?: string;
9
+ to?: string;
10
+ }
11
+ /** What a transition records — computed from an execution, and the guards it must pass first. */
12
+ export interface ChangesHelper {
13
+ /** Structural equality over JSON values. */
14
+ sameValue: (left: unknown, right: unknown) => boolean;
15
+ /** A shallow merge that drops keys patched to `null`. */
16
+ mergeFields: (base?: Record<string, unknown> | null, patch?: Record<string, unknown> | null) => Record<string, unknown>;
17
+ /** A copy of the record with the paths (`key`, `fields.key`, `flows.id`) removed. */
18
+ applyUnset: <T extends object>(record: T, unset?: string[]) => T;
19
+ /**
20
+ * Refuse an execution that writes what only the transition, the flow or the executor may write.
21
+ *
22
+ * `status`/`intrinsic`/`flows`/`closedAt` move only through `transit` (a create's draft may name
23
+ * the initial status); `code` is fixed once minted unless the type's policy says `mutable`;
24
+ * `category` is fixed; `revision`/`bodyChars` are computed; `createdBy` is the create DRAFT's
25
+ * alone — named in `changes` or `unset` it is refused on every action, so an owner check
26
+ * (`card.createdBy === profileId`) can trust it.
27
+ *
28
+ * @throws {PlanningError} `planning:immutable:<field>`
29
+ */
30
+ assertMutable: (exec: TransitionExecution, type: AnyTypeSchema) => void;
31
+ /**
32
+ * The `changes`/`unset` a transition records (plan step 9).
33
+ *
34
+ * - `create`: the whole initial record from the draft (overlaid by `exec.changes`) — `parents`
35
+ * normalized, every flow at its initial status (the draft's `status` for the primary one),
36
+ * `status`/`intrinsic` mirrored, `closedAt` when it starts closed; a specification gets its
37
+ * format, `bodyChars` and revision 1 when the slot is revisioned.
38
+ * - `update`: only what differs; `null` or `exec.unset` clears a field that has a value; a moved
39
+ * `parent` replaces the old one in `parents`; a revisioned document whose content changed gets
40
+ * `revision + 1`. An update that changes nothing is empty ({@link ChangesHelper.isEmptyChange}).
41
+ * - `transit`: `flows[flow] = rule.to`, `status` when the flow is primary, `intrinsic` when it
42
+ * moves, `closedAt` set on entering closed and cleared on leaving it — plus the caller's own
43
+ * changes, diffed as in an update.
44
+ * - `link`, `unlink`, `delete`: nothing.
45
+ *
46
+ * `createdBy` comes from a create's draft only: `changes` and `unset` never carry it, on any action
47
+ * ({@link ChangesHelper.assertMutable} refuses an execution that tries).
48
+ *
49
+ * @throws {IllegalTransition} a transit the flow does not offer from the current status
50
+ * @throws {PlanningError} `malformed:*` for an execution missing what its action needs
51
+ */
52
+ computeChanges: (card: Workcard | null | undefined, exec: TransitionExecution, type: AnyTypeSchema, registry: FlowLookup, at: string, opts?: {
53
+ slot?: SpecificationSlot | null;
54
+ }) => ChangeSet;
55
+ /** Nothing to write: no changed value and nothing to clear. */
56
+ isEmptyChange: (set: Pick<ChangeSet, 'changes' | 'unset'>) => boolean;
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/helpers/changes/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EACjF,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,eAAe,CAAA;IACxB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,iGAAiG;AACjG,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAA;IACrD,yDAAyD;IACzD,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvH,qFAAqF;IACrF,UAAU,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAChE;;;;;;;;;;OAUG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;IACvE;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,cAAc,EAAE,CACd,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACjC,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,UAAU,EACpB,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;KAAE,KACvC,SAAS,CAAA;IACd,+DAA+D;IAC/D,aAAa,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,KAAK,OAAO,CAAA;CACtE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/helpers/changes/types.ts"],"names":[],"mappings":""}