@dzcalendar/core 0.0.0-stage → 1.0.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 (248) hide show
  1. package/LICENSE +21 -0
  2. package/actions/actions.d.ts +108 -0
  3. package/actions/actions.d.ts.map +1 -0
  4. package/actions/actions.js +76 -0
  5. package/actions/actions.js.map +1 -0
  6. package/commands/apply.d.ts +10 -0
  7. package/commands/apply.d.ts.map +1 -0
  8. package/commands/apply.js +328 -0
  9. package/commands/apply.js.map +1 -0
  10. package/commands/history.d.ts +52 -0
  11. package/commands/history.d.ts.map +1 -0
  12. package/commands/history.js +288 -0
  13. package/commands/history.js.map +1 -0
  14. package/commands/patch.d.ts +24 -0
  15. package/commands/patch.d.ts.map +1 -0
  16. package/commands/patch.js +133 -0
  17. package/commands/patch.js.map +1 -0
  18. package/commands/types.d.ts +120 -0
  19. package/commands/types.d.ts.map +1 -0
  20. package/commands/types.js +2 -0
  21. package/commands/types.js.map +1 -0
  22. package/commands.schema.json +1076 -0
  23. package/days.d.ts +12 -0
  24. package/days.d.ts.map +1 -0
  25. package/days.js +25 -0
  26. package/days.js.map +1 -0
  27. package/event/defaults.d.ts +7 -0
  28. package/event/defaults.d.ts.map +1 -0
  29. package/event/defaults.js +5 -0
  30. package/event/defaults.js.map +1 -0
  31. package/event/normalize.d.ts +70 -0
  32. package/event/normalize.d.ts.map +1 -0
  33. package/event/normalize.js +467 -0
  34. package/event/normalize.js.map +1 -0
  35. package/event/parse-temporal.d.ts +43 -0
  36. package/event/parse-temporal.d.ts.map +1 -0
  37. package/event/parse-temporal.js +153 -0
  38. package/event/parse-temporal.js.map +1 -0
  39. package/event/problems.d.ts +33 -0
  40. package/event/problems.d.ts.map +1 -0
  41. package/event/problems.js +2 -0
  42. package/event/problems.js.map +1 -0
  43. package/event/types.d.ts +142 -0
  44. package/event/types.d.ts.map +1 -0
  45. package/event/types.js +2 -0
  46. package/event/types.js.map +1 -0
  47. package/format/intl.d.ts +27 -0
  48. package/format/intl.d.ts.map +1 -0
  49. package/format/intl.js +73 -0
  50. package/format/intl.js.map +1 -0
  51. package/format/week.d.ts +20 -0
  52. package/format/week.d.ts.map +1 -0
  53. package/format/week.js +58 -0
  54. package/format/week.js.map +1 -0
  55. package/ids.d.ts +11 -0
  56. package/ids.d.ts.map +1 -0
  57. package/ids.js +5 -0
  58. package/ids.js.map +1 -0
  59. package/index.d.ts +92 -0
  60. package/index.d.ts.map +1 -0
  61. package/index.js +54 -0
  62. package/index.js.map +1 -0
  63. package/interaction/keymap.d.ts +147 -0
  64. package/interaction/keymap.d.ts.map +1 -0
  65. package/interaction/keymap.js +172 -0
  66. package/interaction/keymap.js.map +1 -0
  67. package/interaction/propose.d.ts +102 -0
  68. package/interaction/propose.d.ts.map +1 -0
  69. package/interaction/propose.js +212 -0
  70. package/interaction/propose.js.map +1 -0
  71. package/intervals.d.ts +30 -0
  72. package/intervals.d.ts.map +1 -0
  73. package/intervals.js +82 -0
  74. package/intervals.js.map +1 -0
  75. package/kernel.d.ts +341 -0
  76. package/kernel.d.ts.map +1 -0
  77. package/kernel.js +769 -0
  78. package/kernel.js.map +1 -0
  79. package/layout/column.d.ts +43 -0
  80. package/layout/column.d.ts.map +1 -0
  81. package/layout/column.js +69 -0
  82. package/layout/column.js.map +1 -0
  83. package/layout/rows.d.ts +41 -0
  84. package/layout/rows.d.ts.map +1 -0
  85. package/layout/rows.js +114 -0
  86. package/layout/rows.js.map +1 -0
  87. package/layout/virtual.d.ts +32 -0
  88. package/layout/virtual.d.ts.map +1 -0
  89. package/layout/virtual.js +79 -0
  90. package/layout/virtual.js.map +1 -0
  91. package/live.d.ts +8 -0
  92. package/live.d.ts.map +1 -0
  93. package/live.js +7 -0
  94. package/live.js.map +1 -0
  95. package/package.json +44 -4
  96. package/project/segment.d.ts +67 -0
  97. package/project/segment.d.ts.map +1 -0
  98. package/project/segment.js +162 -0
  99. package/project/segment.js.map +1 -0
  100. package/project/time-axis.d.ts +76 -0
  101. package/project/time-axis.d.ts.map +1 -0
  102. package/project/time-axis.js +165 -0
  103. package/project/time-axis.js.map +1 -0
  104. package/recurrence/edit.d.ts +49 -0
  105. package/recurrence/edit.d.ts.map +1 -0
  106. package/recurrence/edit.js +474 -0
  107. package/recurrence/edit.js.map +1 -0
  108. package/recurrence/engine.d.ts +32 -0
  109. package/recurrence/engine.d.ts.map +1 -0
  110. package/recurrence/engine.js +17 -0
  111. package/recurrence/engine.js.map +1 -0
  112. package/recurrence/expand.d.ts +37 -0
  113. package/recurrence/expand.d.ts.map +1 -0
  114. package/recurrence/expand.js +83 -0
  115. package/recurrence/expand.js.map +1 -0
  116. package/recurrence/series.d.ts +51 -0
  117. package/recurrence/series.d.ts.map +1 -0
  118. package/recurrence/series.js +92 -0
  119. package/recurrence/series.js.map +1 -0
  120. package/recurrence-entry.d.ts +2 -0
  121. package/recurrence-entry.d.ts.map +1 -0
  122. package/recurrence-entry.js +13 -0
  123. package/recurrence-entry.js.map +1 -0
  124. package/resource/owners.d.ts +17 -0
  125. package/resource/owners.d.ts.map +1 -0
  126. package/resource/owners.js +39 -0
  127. package/resource/owners.js.map +1 -0
  128. package/resource/rows.d.ts +49 -0
  129. package/resource/rows.d.ts.map +1 -0
  130. package/resource/rows.js +69 -0
  131. package/resource/rows.js.map +1 -0
  132. package/resource/tree.d.ts +21 -0
  133. package/resource/tree.d.ts.map +1 -0
  134. package/resource/tree.js +214 -0
  135. package/resource/tree.js.map +1 -0
  136. package/resource/types.d.ts +62 -0
  137. package/resource/types.d.ts.map +1 -0
  138. package/resource/types.js +2 -0
  139. package/resource/types.js.map +1 -0
  140. package/rules/business-hours.d.ts +34 -0
  141. package/rules/business-hours.d.ts.map +1 -0
  142. package/rules/business-hours.js +72 -0
  143. package/rules/business-hours.js.map +1 -0
  144. package/rules/validate.d.ts +62 -0
  145. package/rules/validate.d.ts.map +1 -0
  146. package/rules/validate.js +117 -0
  147. package/rules/validate.js.map +1 -0
  148. package/source/array-source.d.ts +21 -0
  149. package/source/array-source.d.ts.map +1 -0
  150. package/source/array-source.js +26 -0
  151. package/source/array-source.js.map +1 -0
  152. package/source/chunks.d.ts +15 -0
  153. package/source/chunks.d.ts.map +1 -0
  154. package/source/chunks.js +33 -0
  155. package/source/chunks.js.map +1 -0
  156. package/source/deferred.d.ts +84 -0
  157. package/source/deferred.d.ts.map +1 -0
  158. package/source/deferred.js +326 -0
  159. package/source/deferred.js.map +1 -0
  160. package/source/export.d.ts +14 -0
  161. package/source/export.d.ts.map +1 -0
  162. package/source/export.js +34 -0
  163. package/source/export.js.map +1 -0
  164. package/source/json-source.d.ts +41 -0
  165. package/source/json-source.d.ts.map +1 -0
  166. package/source/json-source.js +52 -0
  167. package/source/json-source.js.map +1 -0
  168. package/source/live.d.ts +57 -0
  169. package/source/live.d.ts.map +1 -0
  170. package/source/live.js +120 -0
  171. package/source/live.js.map +1 -0
  172. package/source/manager.d.ts +96 -0
  173. package/source/manager.d.ts.map +1 -0
  174. package/source/manager.js +579 -0
  175. package/source/manager.js.map +1 -0
  176. package/source/source.d.ts +101 -0
  177. package/source/source.d.ts.map +1 -0
  178. package/source/source.js +2 -0
  179. package/source/source.js.map +1 -0
  180. package/store/avl.d.ts +35 -0
  181. package/store/avl.d.ts.map +1 -0
  182. package/store/avl.js +93 -0
  183. package/store/avl.js.map +1 -0
  184. package/store/changes.d.ts +61 -0
  185. package/store/changes.d.ts.map +1 -0
  186. package/store/changes.js +12 -0
  187. package/store/changes.js.map +1 -0
  188. package/store/diff.d.ts +28 -0
  189. package/store/diff.d.ts.map +1 -0
  190. package/store/diff.js +86 -0
  191. package/store/diff.js.map +1 -0
  192. package/store/interval-tree.d.ts +16 -0
  193. package/store/interval-tree.d.ts.map +1 -0
  194. package/store/interval-tree.js +42 -0
  195. package/store/interval-tree.js.map +1 -0
  196. package/store/ordered-map.d.ts +20 -0
  197. package/store/ordered-map.d.ts.map +1 -0
  198. package/store/ordered-map.js +44 -0
  199. package/store/ordered-map.js.map +1 -0
  200. package/store/store.d.ts +144 -0
  201. package/store/store.d.ts.map +1 -0
  202. package/store/store.js +477 -0
  203. package/store/store.js.map +1 -0
  204. package/temporal.d.ts +24 -0
  205. package/temporal.d.ts.map +1 -0
  206. package/temporal.js +18 -0
  207. package/temporal.js.map +1 -0
  208. package/views/builtin.d.ts +11 -0
  209. package/views/builtin.d.ts.map +1 -0
  210. package/views/builtin.js +31 -0
  211. package/views/builtin.js.map +1 -0
  212. package/views/daygrid.d.ts +89 -0
  213. package/views/daygrid.d.ts.map +1 -0
  214. package/views/daygrid.js +138 -0
  215. package/views/daygrid.js.map +1 -0
  216. package/views/list.d.ts +38 -0
  217. package/views/list.d.ts.map +1 -0
  218. package/views/list.js +85 -0
  219. package/views/list.js.map +1 -0
  220. package/views/multimonth.d.ts +19 -0
  221. package/views/multimonth.d.ts.map +1 -0
  222. package/views/multimonth.js +21 -0
  223. package/views/multimonth.js.map +1 -0
  224. package/views/nav.d.ts +12 -0
  225. package/views/nav.d.ts.map +1 -0
  226. package/views/nav.js +43 -0
  227. package/views/nav.js.map +1 -0
  228. package/views/range.d.ts +17 -0
  229. package/views/range.d.ts.map +1 -0
  230. package/views/range.js +176 -0
  231. package/views/range.js.map +1 -0
  232. package/views/spec.d.ts +53 -0
  233. package/views/spec.d.ts.map +1 -0
  234. package/views/spec.js +2 -0
  235. package/views/spec.js.map +1 -0
  236. package/views/timegrid.d.ts +222 -0
  237. package/views/timegrid.d.ts.map +1 -0
  238. package/views/timegrid.js +332 -0
  239. package/views/timegrid.js.map +1 -0
  240. package/views.d.ts +10 -0
  241. package/views.d.ts.map +1 -0
  242. package/views.js +8 -0
  243. package/views.js.map +1 -0
  244. package/zone.d.ts +100 -0
  245. package/zone.d.ts.map +1 -0
  246. package/zone.js +199 -0
  247. package/zone.js.map +1 -0
  248. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Plinthworks
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,108 @@
1
+ import type { Command } from '../commands/types.js';
2
+ import type { EventInstance } from '../store/store.js';
3
+ import type { Instant, PlainDate, ZoneId } from '../temporal.js';
4
+ /**
5
+ * Where a context menu was opened: a moment in a time grid, a whole day, or
6
+ * an event. A moment carries its reading, so a menu on the repeated 02:30 can
7
+ * offer both, and one in a skipped hour can say where it lands.
8
+ */
9
+ export type ActionTarget = {
10
+ readonly kind: 'slot';
11
+ readonly date: PlainDate;
12
+ readonly instant: Instant;
13
+ readonly exists: boolean;
14
+ readonly ambiguous: boolean;
15
+ /** The other reading of a repeated wall time. */
16
+ readonly alternative: Instant | null;
17
+ readonly resourceId?: string;
18
+ } | {
19
+ readonly kind: 'day';
20
+ readonly date: PlainDate;
21
+ readonly resourceId?: string;
22
+ } | {
23
+ readonly kind: 'event';
24
+ readonly instance: EventInstance;
25
+ };
26
+ /**
27
+ * One menu entry, as data: the calendar renders it (themed, RTL, accessible),
28
+ * the application may keep, reorder, replace or add entries. Disabled entries
29
+ * stay visible with their reason.
30
+ */
31
+ export interface ActionItem {
32
+ readonly id: string;
33
+ readonly label: string;
34
+ readonly enabled: boolean;
35
+ readonly reason?: string;
36
+ readonly shortcut?: string;
37
+ /** A name the theme can draw an icon for. */
38
+ readonly icon?: string;
39
+ readonly children?: readonly ActionItem[];
40
+ /**
41
+ * The edit this entry stands for, when it is one (Phases 6–7): validated and
42
+ * undoable like any command. An application's entries usually carry `run`.
43
+ */
44
+ readonly command?: Command;
45
+ /** What runs. The built-ins call back into the calendar; an app's own entries carry their own. */
46
+ readonly run?: () => void;
47
+ }
48
+ /**
49
+ * "New event here", as the application receives it: a moment in a time
50
+ * grid, a date in a month — a whole day is not "midnight", which some days do
51
+ * not have (São Paulo, 4 November 2018).
52
+ */
53
+ export type CreateRequest = {
54
+ readonly allDay: false;
55
+ readonly start: Instant;
56
+ readonly resourceId?: string;
57
+ } | {
58
+ readonly allDay: true;
59
+ readonly start: PlainDate;
60
+ readonly resourceId?: string;
61
+ };
62
+ /** The words for the built-in entries, from the DOM's messages. */
63
+ export interface ActionLabels {
64
+ newEventAt(parts: {
65
+ time: string;
66
+ }): string;
67
+ /** A whole-day event, from a month cell. */
68
+ newEventOn(parts: {
69
+ date: string;
70
+ }): string;
71
+ readonly goToDay: string;
72
+ readonly openEvent: string;
73
+ readonly skippedHour: string;
74
+ readonly deleteEvent: string;
75
+ /** Grab mode (the keyboard's drag) on the event, from the menu. */
76
+ readonly moveEvent: string;
77
+ readonly resizeEvent: string;
78
+ /** The recurrence scope sub-menu. */
79
+ readonly scopeThis: string;
80
+ readonly scopeFollowing: string;
81
+ readonly scopeAll: string;
82
+ }
83
+ export interface ActionContext {
84
+ readonly displayZone: ZoneId;
85
+ readonly labels: ActionLabels;
86
+ /** Formats a moment for an entry, with its offset when it needs telling apart. */
87
+ readonly formatTime: (i: Instant, withOffset: boolean) => string;
88
+ readonly formatDate: (d: PlainDate) => string;
89
+ /** Callbacks the built-ins run. Editing entries join in Phases 6–7. */
90
+ readonly onCreateRequest?: (request: CreateRequest) => void;
91
+ readonly onGoToDay?: (d: PlainDate) => void;
92
+ readonly onOpen?: (instance: EventInstance) => void;
93
+ /** Runs an editing entry's command (through the calendar's history, so it can be undone). Without it, no editing entries. */
94
+ readonly onCommand?: (command: Command) => void;
95
+ /** "Move…" and "Change duration…": the calendar holds the event for the keyboard (grab mode). Without it, no such entries. */
96
+ readonly onGrab?: (instance: EventInstance, kind: 'move' | 'resize') => void;
97
+ /** Whether the view lets this event's length change (a month draws a timed event's day, not its hours). Default yes. */
98
+ readonly canResize?: (instance: EventInstance) => boolean;
99
+ /** Whether "Move…" is offered (default: the event's start is editable). */
100
+ readonly canMove?: (instance: EventInstance) => boolean;
101
+ }
102
+ /**
103
+ * The built-in entries for a target. Phase 4: read actions and the requests
104
+ * an application handles itself; Phases 6–8 add editing (move, resize,
105
+ * delete, series scope) as commands.
106
+ */
107
+ export declare function actionsFor(target: ActionTarget, ctx: ActionContext): ActionItem[];
108
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/actions/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * The built-in entries for a target. Phase 4: read actions and the requests
3
+ * an application handles itself; Phases 6–8 add editing (move, resize,
4
+ * delete, series scope) as commands.
5
+ */
6
+ export function actionsFor(target, ctx) {
7
+ const out = [];
8
+ if (target.kind === 'slot') {
9
+ if (ctx.onCreateRequest) {
10
+ const create = ctx.onCreateRequest;
11
+ // A repeated hour has two moments: offer both, told apart by offset.
12
+ const moments = target.ambiguous && target.alternative ? [target.instant, target.alternative] : [target.instant];
13
+ for (const [i, m] of moments.entries()) {
14
+ out.push({
15
+ id: moments.length > 1 ? `event.create.${i}` : 'event.create',
16
+ label: ctx.labels.newEventAt({ time: ctx.formatTime(m, moments.length > 1) }),
17
+ enabled: true,
18
+ ...(!target.exists && { reason: ctx.labels.skippedHour }),
19
+ run: () => create({ allDay: false, start: m, ...(target.resourceId !== undefined && { resourceId: target.resourceId }) }),
20
+ });
21
+ }
22
+ }
23
+ if (ctx.onGoToDay)
24
+ out.push({ id: 'view.goToDay', label: ctx.labels.goToDay, enabled: true, run: () => ctx.onGoToDay(target.date) });
25
+ }
26
+ else if (target.kind === 'day') {
27
+ if (ctx.onCreateRequest) {
28
+ const create = ctx.onCreateRequest;
29
+ out.push({
30
+ id: 'event.create',
31
+ label: ctx.labels.newEventOn({ date: ctx.formatDate(target.date) }),
32
+ enabled: true,
33
+ run: () => create({ allDay: true, start: target.date, ...(target.resourceId !== undefined && { resourceId: target.resourceId }) }),
34
+ });
35
+ }
36
+ if (ctx.onGoToDay)
37
+ out.push({ id: 'view.goToDay', label: ctx.labels.goToDay, enabled: true, run: () => ctx.onGoToDay(target.date) });
38
+ }
39
+ else {
40
+ if (ctx.onOpen) {
41
+ const open = ctx.onOpen;
42
+ out.push({ id: 'event.open', label: ctx.labels.openEvent, enabled: true, run: () => open(target.instance) });
43
+ }
44
+ const ev = target.instance.event;
45
+ if (ctx.onGrab && ev.display !== 'background') {
46
+ const grab = ctx.onGrab;
47
+ if (ctx.canMove?.(target.instance) ?? ev.perms.start)
48
+ out.push({ id: 'event.move', label: ctx.labels.moveEvent, enabled: true, shortcut: 'M', run: () => grab(target.instance, 'move') });
49
+ if (ev.perms.duration && (ctx.canResize?.(target.instance) ?? true))
50
+ out.push({ id: 'event.resize', label: ctx.labels.resizeEvent, enabled: true, run: () => grab(target.instance, 'resize') });
51
+ }
52
+ if (ctx.onCommand)
53
+ out.push(deleteEntry(target.instance, ctx.labels, ctx.onCommand));
54
+ }
55
+ return out;
56
+ }
57
+ /** "Delete": at once for an event; for an occurrence, a sub-menu says how far. */
58
+ function deleteEntry(instance, labels, onCommand) {
59
+ const ref = instance.event.ref;
60
+ if (!ref) {
61
+ const command = { type: 'event.delete', id: instance.event.id };
62
+ return { id: 'event.delete', label: labels.deleteEvent, enabled: true, icon: 'delete', command, run: () => onCommand(command) };
63
+ }
64
+ const scoped = (scope, label) => {
65
+ const command = { type: 'event.delete', id: ref.seriesId, key: ref.key, scope };
66
+ return { id: `event.delete.${scope}`, label, enabled: true, command, run: () => onCommand(command) };
67
+ };
68
+ return {
69
+ id: 'event.delete',
70
+ label: labels.deleteEvent,
71
+ enabled: true,
72
+ icon: 'delete',
73
+ children: [scoped('this', labels.scopeThis), scoped('following', labels.scopeFollowing), scoped('all', labels.scopeAll)],
74
+ };
75
+ }
76
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/actions/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { StoreSnapshot } from '../store/store.js';
2
+ import type { Command, CommandContext, CommandResult } from './types.js';
3
+ /**
4
+ * Turns a command into the mutations that carry it out, against a snapshot.
5
+ * Pure: nothing is applied here, so a command can be checked, previewed, or
6
+ * refused without touching the store. All or nothing — a batch with one bad
7
+ * command yields no mutation at all.
8
+ */
9
+ export declare function applyCommand(snap: StoreSnapshot, cmd: Command, ctx: CommandContext): CommandResult;
10
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AA8C5F;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,aAAa,CAiQlG"}
@@ -0,0 +1,328 @@
1
+ import { normalizeEvent } from '../event/normalize.js';
2
+ import { problem } from '../event/problems.js';
3
+ import { needRecurrence } from '../recurrence/engine.js';
4
+ import { materialize, parseInstanceKey } from '../recurrence/series.js';
5
+ import { viewWindow } from '../store/store.js';
6
+ import { validateProposal } from '../rules/validate.js';
7
+ import { patchEvent, toInput } from './patch.js';
8
+ import { Temporal } from '../temporal.js';
9
+ const SCOPES = new Set(['this', 'following', 'all']);
10
+ /**
11
+ * An occurrence's key as the series writes it (`ZonedDateTime.toString()`,
12
+ * `2026-10-21T08:00:00+02:00[Europe/Paris]`; a date for an all-day series),
13
+ * from what a person or an assistant may write: the wall time without the
14
+ * offset (`2026-10-21T08:00[Europe/Paris]`, or no zone: the series'), an
15
+ * instant (`…Z`). Anything else is left as given (it then names no occurrence).
16
+ */
17
+ function keyOf(sr, key) {
18
+ const base = sr.base.start;
19
+ if (sr.base.allDay || base instanceof Temporal.PlainDate)
20
+ return key.length > 10 && /^\d{4}-\d{2}-\d{2}/.test(key) ? key.slice(0, 10) : key;
21
+ const zone = base.timeZoneId;
22
+ try {
23
+ if (/\[.+\]$/.test(key))
24
+ return Temporal.ZonedDateTime.from(key, { offset: 'prefer' }).withTimeZone(zone).toString();
25
+ if (/(Z|[+-]\d{2}:?\d{2})$/i.test(key))
26
+ return Temporal.Instant.from(key).toZonedDateTimeISO(zone).toString();
27
+ return Temporal.PlainDateTime.from(key).toZonedDateTime(zone).toString();
28
+ }
29
+ catch {
30
+ return key;
31
+ }
32
+ }
33
+ const WKST = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU'];
34
+ /** A rule created here without WKST gets the locale's first day, written out (owner's decision). */
35
+ function withWeekStart(input, ctx) {
36
+ if (ctx.weekStart === undefined || input.rrule === undefined)
37
+ return input;
38
+ const add = (t) => {
39
+ if (typeof t !== 'string')
40
+ return t;
41
+ // The rule's own parts, as the parser reads them: an optional RRULE: prefix, spaces, a trailing ';'.
42
+ const body = t.trim().replace(/^RRULE:/i, '').replace(/;\s*$/, '').trim();
43
+ if (body.split(';').some((part) => /^\s*WKST\s*=/i.test(part)))
44
+ return t;
45
+ return `${body};WKST=${WKST[ctx.weekStart - 1]}`;
46
+ };
47
+ const rrule = typeof input.rrule === 'string' ? add(input.rrule) : Array.isArray(input.rrule) ? input.rrule.map(add) : input.rrule;
48
+ return { ...input, rrule };
49
+ }
50
+ /**
51
+ * Turns a command into the mutations that carry it out, against a snapshot.
52
+ * Pure: nothing is applied here, so a command can be checked, previewed, or
53
+ * refused without touching the store. All or nothing — a batch with one bad
54
+ * command yields no mutation at all.
55
+ */
56
+ export function applyCommand(snap, cmd, ctx) {
57
+ const problems = [];
58
+ const violations = [];
59
+ const mutations = [];
60
+ let current = snap;
61
+ /** Resolves `id` (+ `key`, `scope`) against the current state; reports and returns null when it names nothing editable. */
62
+ function target(id, reach, path, deleting = false) {
63
+ // A scope that is none of the three is refused, never read as another (an unknown one once cut a series).
64
+ if (reach.scope !== undefined && !SCOPES.has(reach.scope)) {
65
+ problems.push(problem('invalid-edit', 'error', `${path}.scope`, String(reach.scope)));
66
+ return null;
67
+ }
68
+ const ev = current.getEvent(id);
69
+ if (ev) {
70
+ // An override stands for its occurrence: deleting it, or reaching past it, goes through the series.
71
+ if (ev.ref && (deleting || (reach.scope !== undefined && reach.scope !== 'this')))
72
+ return { kind: 'occurrence', ref: ev.ref, scope: reach.scope ?? 'this' };
73
+ return { kind: 'event', event: ev };
74
+ }
75
+ const sr = current.getSeries(id);
76
+ // No key: the series as a whole, anchored on its first start (even when DTSTART itself is excluded or off-rule).
77
+ if (sr)
78
+ return { kind: 'occurrence', ref: { seriesId: id, key: reach.key !== undefined ? keyOf(sr, reach.key) : needRecurrence().firstKey(sr) }, scope: reach.scope ?? (reach.key === undefined ? 'all' : 'this') };
79
+ const k = parseInstanceKey(id);
80
+ const of = 'seriesId' in k ? current.getSeries(k.seriesId) : undefined;
81
+ if ('seriesId' in k && of)
82
+ return { kind: 'occurrence', ref: { seriesId: k.seriesId, key: keyOf(of, k.key) }, scope: reach.scope ?? 'this' };
83
+ problems.push(problem('unknown-event', 'error', `${path}.id`, id));
84
+ return null;
85
+ }
86
+ /** The event a target shows now: for checks and for patches that need the current moments. */
87
+ function shown(t) {
88
+ if (t.kind === 'event')
89
+ return t.event;
90
+ const sr = current.getSeries(t.ref.seriesId);
91
+ const own = sr.overrides.get(t.ref.key);
92
+ if (own !== undefined)
93
+ return current.getEvent(own);
94
+ try {
95
+ return materialize(sr, needRecurrence().startOfKey(sr, t.ref.key));
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ }
101
+ /**
102
+ * Checks the edit against the calendar's rules before anything is written —
103
+ * on the very event the edit will write (for a series, the occurrence it
104
+ * produces, not its override). When the whole series moves, its other
105
+ * occurrences move too: they are not in the way.
106
+ */
107
+ function allowed(t, patch, path) {
108
+ if (!ctx.rules || !('start' in patch || 'end' in patch || 'duration' in patch || 'resourceIds' in patch || 'resourceId' in patch || 'allDay' in patch))
109
+ return true;
110
+ let pair;
111
+ if (t.kind === 'event') {
112
+ const after = patchEvent(t.event, patch, ctx.normalize, path, []);
113
+ pair = after ? { before: t.event, after } : null;
114
+ }
115
+ else
116
+ pair = needRecurrence().editedOccurrence(current, t.ref, patch, t.scope, ctx.normalize);
117
+ if (!pair)
118
+ return true; // the edit itself will report why
119
+ const found = validateProposal(current, { event: pair.before, start: pair.after.start, end: pair.after.end, resourceIds: pair.after.resourceIds, ...(ctx.external && { external: true }) }, ctx.rules, t.kind === 'occurrence' && t.scope !== 'this' ? { movingSeries: t.ref.seriesId } : {});
120
+ violations.push(...found);
121
+ return found.length === 0;
122
+ }
123
+ /**
124
+ * A series a person makes or changes (a new one, a single event made to
125
+ * repeat, another rule) meets the rules on its occurrences — a year of them,
126
+ * 500 at most — as a moved event does; its own occurrences are not in the way.
127
+ */
128
+ function seriesAllowed(sr) {
129
+ if (!ctx.rules)
130
+ return true;
131
+ const zone = ctx.rules.displayZone;
132
+ const d0 = sr.base.allDay ? sr.base.start : sr.base.start.withTimeZone(zone).toPlainDate();
133
+ const { occurrences } = needRecurrence().expandSeries(sr, viewWindow(d0, d0.add({ days: 366 }), zone), { limit: 500 });
134
+ for (const occ of occurrences) {
135
+ const found = validateProposal(current, { event: occ, start: occ.start, end: occ.end, resourceIds: occ.resourceIds, ...(ctx.external && { external: true }) }, ctx.rules, { movingSeries: sr.id });
136
+ if (found.length > 0) {
137
+ violations.push(...found);
138
+ return false;
139
+ }
140
+ }
141
+ return true;
142
+ }
143
+ /** A rule that can never give an occurrence (an UNTIL before the start…): said, as a warning. */
144
+ function warnIfEmpty(sr, path) {
145
+ const zone = ctx.normalize.displayZone;
146
+ const d0 = sr.base.allDay ? sr.base.start : sr.base.start.withTimeZone(zone).toPlainDate();
147
+ if (needRecurrence().expandSeries(sr, viewWindow(d0, d0.add({ years: 10 }), zone), { limit: 1 }).occurrences.length === 0)
148
+ problems.push(problem('invalid-rrule', 'warning', `${path}.rrule`, 'no occurrence'));
149
+ }
150
+ function edit(id, patch, reach, path) {
151
+ const t = target(id, reach, path);
152
+ if (!t)
153
+ return false;
154
+ if (!allowed(t, patch, path))
155
+ return false;
156
+ if (t.kind === 'event') {
157
+ const next = patchEvent(t.event, patch, ctx.normalize, path, problems);
158
+ if (!next)
159
+ return false;
160
+ return next === t.event || push({ kind: 'event', before: t.event, after: next });
161
+ }
162
+ const r = needRecurrence().editOccurrence(current, t.ref, patch, t.scope, ctx.normalize, path, problems);
163
+ return r.ok && pushAll(r.mutations);
164
+ }
165
+ const run = (c, path) => {
166
+ switch (c.type) {
167
+ case 'event.create': {
168
+ const r = normalizeEvent(withWeekStart(c.event, ctx), ctx.normalize, path);
169
+ problems.push(...r.problems);
170
+ if (!r.ok)
171
+ return false;
172
+ const item = r.value;
173
+ const id = item.kind === 'event' ? item.event.id : item.series.id;
174
+ // A person's new event (the editor) meets the rules too; the application's own creations do not ask.
175
+ if (item.kind === 'series') {
176
+ if (!seriesAllowed(item.series))
177
+ return false;
178
+ }
179
+ else if (ctx.rules) {
180
+ const ev = item.event;
181
+ const found = validateProposal(current, { event: ev, start: ev.start, end: ev.end, resourceIds: ev.resourceIds, ...(ctx.external && { external: true }) }, ctx.rules);
182
+ if (found.length > 0) {
183
+ violations.push(...found);
184
+ return false;
185
+ }
186
+ }
187
+ // The store keeps events and series apart, but a command refuses an id
188
+ // used by either: `event.update('x')` must never be ambiguous.
189
+ if (current.getEvent(id) || current.getSeries(id)) {
190
+ problems.push(problem('duplicate-id', 'error', `${path}.id`, id));
191
+ return false;
192
+ }
193
+ return push(item.kind === 'event' ? { kind: 'event', after: item.event } : { kind: 'series', after: item.series });
194
+ }
195
+ case 'event.update':
196
+ return edit(c.id, c.patch, c, path);
197
+ case 'event.move': {
198
+ // A running event moved: its start, and its expected length kept — its drawn end is now's, not a length.
199
+ // (a series' occurrence never runs: only a single event is read here)
200
+ const running = current.getEvent(c.id);
201
+ const end = running && !running.allDay && running.ongoing ? undefined : c.end;
202
+ const patch = { start: c.start, ...(end !== undefined && { end }), ...(c.resourceIds !== undefined && { resourceIds: c.resourceIds }) };
203
+ return edit(c.id, patch, c, path);
204
+ }
205
+ case 'event.resize': {
206
+ const t = target(c.id, c, path);
207
+ if (!t)
208
+ return false;
209
+ const now = shown(t);
210
+ if (!now)
211
+ return false;
212
+ // The other edge stays where it is.
213
+ // A running event's other edge is its expected end (none: it still runs to now).
214
+ const other = !now.allDay && now.ongoing ? now.expectedEnd : now.end;
215
+ const patch = c.edge === 'start' ? { start: c.to, ...(other !== undefined && { end: other }) } : { end: c.to };
216
+ return edit(c.id, patch, c, path);
217
+ }
218
+ case 'event.delete': {
219
+ const t = target(c.id, c, path, true);
220
+ if (!t)
221
+ return false;
222
+ if (t.kind === 'event')
223
+ return push({ kind: 'event', before: t.event });
224
+ const r = needRecurrence().deleteOccurrence(current, t.ref, t.scope, path, problems);
225
+ return r.ok && pushAll(r.mutations);
226
+ }
227
+ case 'series.delete': {
228
+ const sr = current.getSeries(c.id);
229
+ if (!sr) {
230
+ problems.push(problem('unknown-event', 'error', `${path}.id`, c.id));
231
+ return false;
232
+ }
233
+ return pushAll(needRecurrence().deleteSeries(current, sr));
234
+ }
235
+ case 'series.split': {
236
+ const sr = current.getSeries(c.id);
237
+ if (!sr) {
238
+ problems.push(problem('unknown-event', 'error', `${path}.id`, c.id));
239
+ return false;
240
+ }
241
+ const r = needRecurrence().editOccurrence(current, { seriesId: c.id, key: keyOf(sr, c.at) }, c.patch ?? {}, 'following', ctx.normalize, path, problems, {}, true);
242
+ return r.ok && pushAll(r.mutations);
243
+ }
244
+ case 'event.repeat': {
245
+ const ev = current.getEvent(c.id);
246
+ if (!ev || ev.ref) {
247
+ problems.push(problem('unknown-event', 'error', `${path}.id`, c.id));
248
+ return false;
249
+ }
250
+ const r = normalizeEvent(withWeekStart({ ...toInput(ev), rrule: c.rrule }, ctx), ctx.normalize, path);
251
+ problems.push(...r.problems);
252
+ if (!r.ok || r.value.kind !== 'series')
253
+ return false;
254
+ const series = ev.sourceId !== undefined ? { ...r.value.series, sourceId: ev.sourceId } : r.value.series;
255
+ push({ kind: 'event', before: ev });
256
+ // Checked once the single event is gone: it is not in the way of its own occurrences.
257
+ if (!seriesAllowed(series))
258
+ return false;
259
+ warnIfEmpty(series, path);
260
+ return push({ kind: 'series', after: series });
261
+ }
262
+ case 'series.rule': {
263
+ const sr = current.getSeries(c.id);
264
+ if (!sr) {
265
+ problems.push(problem('unknown-event', 'error', `${path}.id`, c.id));
266
+ return false;
267
+ }
268
+ if (c.rrule === null || (Array.isArray(c.rrule) && c.rrule.length === 0)) {
269
+ // It stops repeating: the first occurrence is the event, a moved one an event of its own.
270
+ for (const oid of sr.overrides.values()) {
271
+ const o = current.getEvent(oid);
272
+ if (!o)
273
+ continue;
274
+ const { ref: _ref, ...own } = o;
275
+ push({ kind: 'event', before: o, after: Object.freeze(own) });
276
+ }
277
+ push({ kind: 'series', before: sr });
278
+ const { ref: _r, ...base } = sr.base;
279
+ return push({ kind: 'event', after: Object.freeze({ ...base, ...(sr.sourceId !== undefined && { sourceId: sr.sourceId }) }) });
280
+ }
281
+ // A rule given without WKST keeps the series' own (not the reader's locale).
282
+ const own = sr.set.rules[0]?.wkst;
283
+ const written = withWeekStart({ start: sr.base.start, rrule: c.rrule }, own !== undefined ? { ...ctx, weekStart: own } : ctx).rrule;
284
+ const texts = typeof written === 'string' ? [written] : Array.isArray(written) ? written : [];
285
+ const rules = [];
286
+ for (const [i, text] of texts.entries()) {
287
+ const r = typeof text === 'string' ? needRecurrence().parseRRule(text) : null;
288
+ const sub = texts.length > 1 ? `${path}.rrule[${i}]` : `${path}.rrule`;
289
+ if (!r || !r.ok) {
290
+ problems.push(problem('invalid-rrule', 'error', sub, r && !r.ok ? r.problem.detail : String(text)));
291
+ return false;
292
+ }
293
+ if (sr.base.allDay && (r.rule.freq === 'HOURLY' || r.rule.freq === 'MINUTELY' || r.rule.freq === 'SECONDLY')) {
294
+ problems.push(problem('invalid-rrule', 'error', sub, `FREQ=${r.rule.freq}`));
295
+ return false;
296
+ }
297
+ rules.push(r.rule);
298
+ }
299
+ if (rules.length === 0) {
300
+ problems.push(problem('invalid-rrule', 'error', `${path}.rrule`, String(c.rrule)));
301
+ return false;
302
+ }
303
+ const next = { ...sr, set: { ...sr.set, rules } };
304
+ if (!seriesAllowed(next))
305
+ return false;
306
+ warnIfEmpty(next, path);
307
+ return push({ kind: 'series', before: sr, after: next });
308
+ }
309
+ case 'batch':
310
+ return c.commands.every((sub, i) => run(sub, `${path}.commands[${i}]`));
311
+ }
312
+ };
313
+ // Each step sees the state the previous ones made: create then update works.
314
+ function push(m) {
315
+ mutations.push(m);
316
+ current = current.withMutations([m]).next;
317
+ return true;
318
+ }
319
+ function pushAll(ms) {
320
+ for (const m of ms)
321
+ push(m);
322
+ return true;
323
+ }
324
+ if (run(cmd, 'command'))
325
+ return { ok: true, mutations, problems };
326
+ return violations.length > 0 ? { ok: false, problems, violations } : { ok: false, problems };
327
+ }
328
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"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"}