@wrenautomation/aerie 0.4.3 → 0.4.5

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.
@@ -16,6 +16,6 @@ interface Query {
16
16
  getAll(k: string): string[];
17
17
  }
18
18
  export declare function viewOfAddress(q: Query): AddressView;
19
- /** the view as address pairs, in `VIEW_KEYS` order; defaults (list layout, subtree on) leave no key */
19
+ /** the view as address pairs, in `VIEW_KEYS` order; defaults (list layout, subtree on) leave no key; the first sort only */
20
20
  export declare function addressOfView(v: AddressView): [string, string][];
21
21
  export {};
@@ -44,11 +44,12 @@ export function viewOfAddress(q) {
44
44
  }
45
45
  if (q.get("open") === "1")
46
46
  f.openChecks = true;
47
- const sort = (q.get("sort") ?? "")
48
- .split(",")
49
- .map((s) => s.split(":"))
50
- .filter(([field]) => SORT_FIELDS.includes(field))
51
- .map(([field, dir]) => ({ field: field, dir: dir === "desc" ? "desc" : "asc" }));
47
+ // one field, `-` = desc: wren's router keeps `sort` only as `^-?[\w.]+$`
48
+ const raw = q.get("sort") ?? "";
49
+ const field = raw.replace(/^-/, "");
50
+ const sort = SORT_FIELDS.includes(field)
51
+ ? [{ field: field, dir: raw.startsWith("-") ? "desc" : "asc" }]
52
+ : [];
52
53
  const group = q.get("group");
53
54
  const layout = q.get("layout");
54
55
  const text = q.get("q")?.trim();
@@ -60,7 +61,7 @@ export function viewOfAddress(q) {
60
61
  ...(text ? { text } : {}),
61
62
  };
62
63
  }
63
- /** the view as address pairs, in `VIEW_KEYS` order; defaults (list layout, subtree on) leave no key */
64
+ /** the view as address pairs, in `VIEW_KEYS` order; defaults (list layout, subtree on) leave no key; the first sort only */
64
65
  export function addressOfView(v) {
65
66
  const f = v.filter;
66
67
  const out = [];
@@ -90,8 +91,9 @@ export function addressOfView(v) {
90
91
  out.push(["open", "1"]);
91
92
  if (v.text)
92
93
  out.push(["q", v.text]);
93
- if (v.sort.length)
94
- out.push(["sort", v.sort.map((s) => `${s.field}:${s.dir}`).join(",")]);
94
+ const first = v.sort[0];
95
+ if (first)
96
+ out.push(["sort", `${first.dir === "desc" ? "-" : ""}${first.field}`]);
95
97
  if (v.group)
96
98
  out.push(["group", v.group]);
97
99
  if (v.layout !== "list")
@@ -1 +1 @@
1
- {"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/core/address.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/core/address.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { Edit } from "./edit.js";
1
2
  import { type SortField, type TaskRecord, type TaskView } from "./filter.js";
2
3
  /** how a portal draws the value */
3
4
  export type FieldKind = "id" | "text" | "status" | "priority" | "area" | "people" | "labels" | "date" | "number" | "progress";
@@ -13,9 +14,23 @@ export interface Field {
13
14
  group?: boolean;
14
15
  /** known values in group order; others follow, by name */
15
16
  order?: readonly string[];
17
+ /**
18
+ * The write that moves `t` from group `from` to group `to` (null: the empty group), the inverse of `values`
19
+ * (D17). None: a Board cannot move cards on this field.
20
+ */
21
+ move?(t: TaskView, from: string | null, to: string | null): MoveEdit | null;
16
22
  }
23
+ /** a move's write: task fields, and `area` (a placement) */
24
+ export type MoveEdit = Edit & {
25
+ area?: string;
26
+ };
17
27
  export declare const FIELDS: readonly Field[];
18
28
  export declare const fieldOf: (key: string) => Field | undefined;
29
+ /**
30
+ * The write that moves `t` from group `from` to `to` on field `key`; null: nothing to write (the same group, a
31
+ * `from` the task is not in, a field with no move).
32
+ */
33
+ export declare function moveEdit(key: string, t: TaskView, from: string | null, to: string | null): MoveEdit | null;
19
34
  export declare const GROUP_KEYS: string[];
20
35
  export interface Group<T extends TaskView = TaskRecord> {
21
36
  /** null: the task has no value for this field */
@@ -6,6 +6,8 @@ import { lineage } from "./area.js";
6
6
  import { holdersOf, MARK } from "./filter.js";
7
7
  import { PRIORITIES, STATUSES } from "./task.js";
8
8
  const one = (v) => (v ? [v] : []);
9
+ /** one value: `to` sets it, null clears it */
10
+ const setTo = (k) => (_t, _from, to) => ({ [k]: to });
9
11
  const checks = (t) => {
10
12
  const all = [...t.ac, ...t.dod];
11
13
  return all.length ? [`${all.filter((c) => c.done).length}/${all.length}`] : [];
@@ -21,6 +23,7 @@ export const FIELDS = [
21
23
  sort: "status",
22
24
  group: true,
23
25
  order: STATUSES,
26
+ move: (_t, _from, to) => (to ? { status: to } : null),
24
27
  },
25
28
  {
26
29
  key: "priority",
@@ -30,26 +33,56 @@ export const FIELDS = [
30
33
  sort: "priority",
31
34
  group: true,
32
35
  order: PRIORITIES,
36
+ move: setTo("priority"),
37
+ },
38
+ {
39
+ key: "area",
40
+ label: "Area",
41
+ kind: "area",
42
+ values: (t) => [t.area],
43
+ sort: "area",
44
+ group: true,
45
+ move: (_t, _from, to) => (to ? { area: to } : null),
33
46
  },
34
- { key: "area", label: "Area", kind: "area", values: (t) => [t.area], sort: "area", group: true },
35
47
  {
36
48
  key: "assignee",
37
49
  label: "Assignee",
38
50
  kind: "people",
39
51
  values: (t) => t.assignees.filter((a) => !a.startsWith(MARK)),
40
52
  group: true,
53
+ // the empty group has no people: `to` null drops them all; `@peers:` marks stay
54
+ move: (t, from, to) => {
55
+ const kept = t.assignees.filter((a) => (to ? a !== from : a.startsWith(MARK)));
56
+ return { assignees: to && !kept.includes(to) ? [...kept, to] : kept };
57
+ },
41
58
  },
42
59
  { key: "holder", label: "Held by", kind: "people", values: (t) => holdersOf(t), group: true },
43
- { key: "labels", label: "Labels", kind: "labels", values: (t) => t.labels, group: true },
60
+ {
61
+ key: "labels",
62
+ label: "Labels",
63
+ kind: "labels",
64
+ values: (t) => t.labels,
65
+ group: true,
66
+ // the empty group has no labels: `to` null drops them all
67
+ move: (_t, from, to) => to ? { ...(from ? { removeLabels: [from] } : {}), addLabels: [to] } : { labels: [] },
68
+ },
44
69
  {
45
70
  key: "milestone",
46
71
  label: "Milestone",
47
72
  kind: "text",
48
73
  values: (t) => one(t.milestone),
49
74
  group: true,
75
+ move: setTo("milestone"),
50
76
  },
51
77
  { key: "parent", label: "Parent", kind: "id", values: (t) => one(t.parentId), group: true },
52
- { key: "type", label: "Type", kind: "text", values: (t) => one(t.type), group: true },
78
+ {
79
+ key: "type",
80
+ label: "Type",
81
+ kind: "text",
82
+ values: (t) => one(t.type),
83
+ group: true,
84
+ move: setTo("type"),
85
+ },
53
86
  { key: "checks", label: "Checks", kind: "progress", values: checks },
54
87
  {
55
88
  key: "createdAt",
@@ -74,6 +107,19 @@ export const FIELDS = [
74
107
  },
75
108
  ];
76
109
  export const fieldOf = (key) => FIELDS.find((f) => f.key === key);
110
+ /**
111
+ * The write that moves `t` from group `from` to `to` on field `key`; null: nothing to write (the same group, a
112
+ * `from` the task is not in, a field with no move).
113
+ */
114
+ export function moveEdit(key, t, from, to) {
115
+ const f = fieldOf(key);
116
+ if (!f?.move || from === to)
117
+ return null;
118
+ const now = f.values(t);
119
+ if (from === null ? now.length > 0 : !now.includes(from))
120
+ return null;
121
+ return f.move(t, from, to);
122
+ }
77
123
  export const GROUP_KEYS = FIELDS.filter((f) => f.group).map((f) => f.key);
78
124
  /**
79
125
  * Tasks into groups, in the field's order (known values first, then by name, empty last). `all`: also the
@@ -1 +1 @@
1
- {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/core/fields.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/core/fields.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,5 @@ export * from "./area.js";
4
4
  export * from "./edit.js";
5
5
  export * from "./fields.js";
6
6
  export * from "./filter.js";
7
+ export * from "./rows.js";
7
8
  export * from "./task.js";
@@ -4,5 +4,6 @@ export * from "./area.js";
4
4
  export * from "./edit.js";
5
5
  export * from "./fields.js";
6
6
  export * from "./filter.js";
7
+ export * from "./rows.js";
7
8
  export * from "./task.js";
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Live rows (D16): a host loads every row once and filters in memory (`matches`); a push reads only the rows
3
+ * written since the newest one it holds, then merges them by id. `updatedAt` is the writer's clock (CLI, Lambda),
4
+ * so the read reaches back `SKEW_MS` past it; the merge is idempotent.
5
+ */
6
+ import type { TaskView } from "./filter.js";
7
+ export declare const SKEW_MS = 60000;
8
+ /** `updatedAfter` for the next read; undefined: read all */
9
+ export declare function changedSince(rows: readonly Pick<TaskView, "updatedAt" | "createdAt">[], skewMs?: number): string | undefined;
10
+ /** `delta` over `before` by id; `changed`: ids new or at a newer version (a row's wash) */
11
+ export declare function mergeRows<T extends {
12
+ id: string;
13
+ version: number;
14
+ }>(before: readonly T[], delta: readonly T[]): {
15
+ rows: T[];
16
+ changed: string[];
17
+ };
@@ -0,0 +1,34 @@
1
+ export const SKEW_MS = 60_000;
2
+ /** `updatedAfter` for the next read; undefined: read all */
3
+ export function changedSince(rows, skewMs = SKEW_MS) {
4
+ let newest = "";
5
+ for (const r of rows) {
6
+ const at = r.updatedAt ?? r.createdAt;
7
+ if (at > newest)
8
+ newest = at;
9
+ }
10
+ if (!newest)
11
+ return undefined;
12
+ const t = Date.parse(newest);
13
+ return Number.isNaN(t) ? undefined : new Date(t - skewMs).toISOString().replace(/\.\d{3}Z$/, "Z");
14
+ }
15
+ /** `delta` over `before` by id; `changed`: ids new or at a newer version (a row's wash) */
16
+ export function mergeRows(before, delta) {
17
+ const at = new Map(before.map((r, i) => [r.id, i]));
18
+ const rows = [...before];
19
+ const changed = [];
20
+ for (const r of delta) {
21
+ const i = at.get(r.id);
22
+ if (i === undefined) {
23
+ at.set(r.id, rows.length);
24
+ rows.push(r);
25
+ changed.push(r.id);
26
+ }
27
+ else if (r.version > rows[i].version) {
28
+ rows[i] = r;
29
+ changed.push(r.id);
30
+ }
31
+ }
32
+ return { rows, changed };
33
+ }
34
+ //# sourceMappingURL=rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rows.js","sourceRoot":"","sources":["../../src/core/rows.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC;AAE9B,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAC1B,IAA0D,EAC1D,MAAM,GAAG,OAAO;IAEhB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC;QACtC,IAAI,EAAE,GAAG,MAAM;YAAE,MAAM,GAAG,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACpG,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,SAAS,CACvB,MAAoB,EACpB,KAAmB;IAEnB,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,CAAC,CAAC,OAAO,GAAI,IAAI,CAAC,CAAC,CAAO,CAAC,OAAO,EAAE,CAAC;YAC9C,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
@@ -8891,7 +8891,7 @@ var init_task = __esm({
8891
8891
  });
8892
8892
 
8893
8893
  // src/core/fields.ts
8894
- var one, checks, FIELDS, GROUP_KEYS;
8894
+ var one, setTo, checks, FIELDS, GROUP_KEYS;
8895
8895
  var init_fields = __esm({
8896
8896
  "src/core/fields.ts"() {
8897
8897
  "use strict";
@@ -8899,6 +8899,7 @@ var init_fields = __esm({
8899
8899
  init_filter();
8900
8900
  init_task();
8901
8901
  one = (v) => v ? [v] : [];
8902
+ setTo = (k) => (_t, _from, to) => ({ [k]: to });
8902
8903
  checks = (t) => {
8903
8904
  const all = [...t.ac, ...t.dod];
8904
8905
  return all.length ? [`${all.filter((c) => c.done).length}/${all.length}`] : [];
@@ -8913,7 +8914,8 @@ var init_fields = __esm({
8913
8914
  values: (t) => [t.status],
8914
8915
  sort: "status",
8915
8916
  group: true,
8916
- order: STATUSES
8917
+ order: STATUSES,
8918
+ move: (_t, _from, to) => to ? { status: to } : null
8917
8919
  },
8918
8920
  {
8919
8921
  key: "priority",
@@ -8922,27 +8924,57 @@ var init_fields = __esm({
8922
8924
  values: (t) => one(t.priority),
8923
8925
  sort: "priority",
8924
8926
  group: true,
8925
- order: PRIORITIES
8927
+ order: PRIORITIES,
8928
+ move: setTo("priority")
8929
+ },
8930
+ {
8931
+ key: "area",
8932
+ label: "Area",
8933
+ kind: "area",
8934
+ values: (t) => [t.area],
8935
+ sort: "area",
8936
+ group: true,
8937
+ move: (_t, _from, to) => to ? { area: to } : null
8926
8938
  },
8927
- { key: "area", label: "Area", kind: "area", values: (t) => [t.area], sort: "area", group: true },
8928
8939
  {
8929
8940
  key: "assignee",
8930
8941
  label: "Assignee",
8931
8942
  kind: "people",
8932
8943
  values: (t) => t.assignees.filter((a) => !a.startsWith(MARK)),
8933
- group: true
8944
+ group: true,
8945
+ // the empty group has no people: `to` null drops them all; `@peers:` marks stay
8946
+ move: (t, from, to) => {
8947
+ const kept = t.assignees.filter((a) => to ? a !== from : a.startsWith(MARK));
8948
+ return { assignees: to && !kept.includes(to) ? [...kept, to] : kept };
8949
+ }
8934
8950
  },
8935
8951
  { key: "holder", label: "Held by", kind: "people", values: (t) => holdersOf(t), group: true },
8936
- { key: "labels", label: "Labels", kind: "labels", values: (t) => t.labels, group: true },
8952
+ {
8953
+ key: "labels",
8954
+ label: "Labels",
8955
+ kind: "labels",
8956
+ values: (t) => t.labels,
8957
+ group: true,
8958
+ // the empty group has no labels: `to` null drops them all
8959
+ move: (_t, from, to) => to ? { ...from ? { removeLabels: [from] } : {}, addLabels: [to] } : { labels: [] }
8960
+ },
8937
8961
  {
8938
8962
  key: "milestone",
8939
8963
  label: "Milestone",
8940
8964
  kind: "text",
8941
8965
  values: (t) => one(t.milestone),
8942
- group: true
8966
+ group: true,
8967
+ move: setTo("milestone")
8943
8968
  },
8944
8969
  { key: "parent", label: "Parent", kind: "id", values: (t) => one(t.parentId), group: true },
8945
- { key: "type", label: "Type", kind: "text", values: (t) => one(t.type), group: true },
8970
+ {
8971
+ key: "type",
8972
+ label: "Type",
8973
+ kind: "text",
8974
+ values: (t) => one(t.type),
8975
+ group: true,
8976
+ move: setTo("type")
8977
+ },
8946
8978
  { key: "checks", label: "Checks", kind: "progress", values: checks },
8947
8979
  {
8948
8980
  key: "createdAt",
@@ -9056,6 +9088,13 @@ var init_edit = __esm({
9056
9088
  }
9057
9089
  });
9058
9090
 
9091
+ // src/core/rows.ts
9092
+ var init_rows = __esm({
9093
+ "src/core/rows.ts"() {
9094
+ "use strict";
9095
+ }
9096
+ });
9097
+
9059
9098
  // src/core/index.ts
9060
9099
  var init_core2 = __esm({
9061
9100
  "src/core/index.ts"() {
@@ -9065,6 +9104,7 @@ var init_core2 = __esm({
9065
9104
  init_edit();
9066
9105
  init_fields();
9067
9106
  init_filter();
9107
+ init_rows();
9068
9108
  init_task();
9069
9109
  }
9070
9110
  });