@upnextapp/core 0.20.0 → 0.21.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.
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pluginManifestSchema = exports.validatePluginManifest = exports.shouldAutoClose = exports.isNewer = exports.versionSatisfies = exports.buildSignedPayload = exports.formatNextTrigger = exports.IDLE_TIME_BUCKET_SECONDS = exports.coarsenIdleTime = exports.isTimeOfDayOutsideActiveHours = exports.STALE_ACTIVE_THRESHOLD_MS = exports.todaySlotTime = exports.isOccurrenceOverdue = exports.isStaleActive = exports.shouldTriggerOnDay = exports.matchesRecurrenceInterval = exports.isWithinActiveHours = exports.firstSlotForDay = exports.calculateNextTriggerFromNow = exports.calculateNextTrigger = exports.authorityOverride = void 0;
3
+ exports.pluginManifestSchema = exports.validatePluginManifest = exports.shouldAutoClose = exports.isNewer = exports.versionSatisfies = exports.buildSignedPayload = exports.isPastOnce = exports.isEnded = exports.badgeFor = exports.formatNextTrigger = exports.IDLE_TIME_BUCKET_SECONDS = exports.coarsenIdleTime = exports.isTimeOfDayOutsideActiveHours = exports.STALE_ACTIVE_THRESHOLD_MS = exports.todaySlotTime = exports.isOccurrenceOverdue = exports.isStaleActive = exports.shouldTriggerOnDay = exports.matchesRecurrenceInterval = exports.isWithinActiveHours = exports.firstSlotForDay = exports.calculateNextTriggerFromNow = exports.calculateNextTrigger = exports.authorityOverride = void 0;
4
4
  var writeAuthority_js_1 = require("./writeAuthority.js");
5
5
  Object.defineProperty(exports, "authorityOverride", { enumerable: true, get: function () { return writeAuthority_js_1.authorityOverride; } });
6
6
  var scheduling_js_1 = require("./scheduling.js");
@@ -21,6 +21,10 @@ Object.defineProperty(exports, "coarsenIdleTime", { enumerable: true, get: funct
21
21
  Object.defineProperty(exports, "IDLE_TIME_BUCKET_SECONDS", { enumerable: true, get: function () { return coarsenIdleTime_js_1.IDLE_TIME_BUCKET_SECONDS; } });
22
22
  var formatNextTrigger_js_1 = require("./formatNextTrigger.js");
23
23
  Object.defineProperty(exports, "formatNextTrigger", { enumerable: true, get: function () { return formatNextTrigger_js_1.formatNextTrigger; } });
24
+ var reminderBadges_js_1 = require("./reminderBadges.js");
25
+ Object.defineProperty(exports, "badgeFor", { enumerable: true, get: function () { return reminderBadges_js_1.badgeFor; } });
26
+ Object.defineProperty(exports, "isEnded", { enumerable: true, get: function () { return reminderBadges_js_1.isEnded; } });
27
+ Object.defineProperty(exports, "isPastOnce", { enumerable: true, get: function () { return reminderBadges_js_1.isPastOnce; } });
24
28
  var integrityPayload_js_1 = require("./integrityPayload.js");
25
29
  Object.defineProperty(exports, "buildSignedPayload", { enumerable: true, get: function () { return integrityPayload_js_1.buildSignedPayload; } });
26
30
  var semver_js_1 = require("./semver.js");
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isEnded = isEnded;
4
+ exports.isPastOnce = isPastOnce;
5
+ exports.badgeFor = badgeFor;
6
+ const formatNextTrigger_js_1 = require("./formatNextTrigger.js");
7
+ function isEnded(def, now = Date.now()) {
8
+ return def.endTime != null && now >= new Date(def.endTime).getTime();
9
+ }
10
+ function isPastOnce(def, now = Date.now()) {
11
+ return def.recurrenceType === 'once' && new Date(def.startDateTime).getTime() < now;
12
+ }
13
+ function badgeFor(def, reminder, dockedDefIds, now = Date.now()) {
14
+ if (isEnded(def, now))
15
+ return { label: 'Ended', tone: 'done' };
16
+ if (!reminder) {
17
+ return isPastOnce(def, now) ? { label: 'Done', tone: 'done' } : null;
18
+ }
19
+ if (reminder.status === 'active') {
20
+ return dockedDefIds.has(def.id) ? { label: 'Docked', tone: 'docked' } : { label: 'Active', tone: 'active' };
21
+ }
22
+ if (reminder.status === 'delayed') {
23
+ const until = (0, formatNextTrigger_js_1.formatNextTrigger)(reminder.delayUntil && reminder.delayUntil > 0 ? reminder.delayUntil : reminder.nextTriggerTime, now);
24
+ return until === 'N/A' ? { label: 'Snoozed', tone: 'snoozed' } : { label: `Snoozed until ${until}`, tone: 'snoozed' };
25
+ }
26
+ if (reminder.status === 'completed')
27
+ return { label: 'Done', tone: 'done' };
28
+ return null;
29
+ }
package/dist/index.d.ts CHANGED
@@ -5,6 +5,8 @@ export { calculateNextTrigger, calculateNextTriggerFromNow, firstSlotForDay, isW
5
5
  export { isTimeOfDayOutsideActiveHours } from './activeHours.js';
6
6
  export { coarsenIdleTime, IDLE_TIME_BUCKET_SECONDS } from './coarsenIdleTime.js';
7
7
  export { formatNextTrigger } from './formatNextTrigger.js';
8
+ export { badgeFor, isEnded, isPastOnce } from './reminderBadges.js';
9
+ export type { ReminderBadge, ReminderBadgeTone } from './reminderBadges.js';
8
10
  export { buildSignedPayload } from './integrityPayload.js';
9
11
  export { versionSatisfies, isNewer } from './semver.js';
10
12
  export { shouldAutoClose } from './shouldAutoClose.js';
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ export { calculateNextTrigger, calculateNextTriggerFromNow, firstSlotForDay, isW
3
3
  export { isTimeOfDayOutsideActiveHours } from './activeHours.js';
4
4
  export { coarsenIdleTime, IDLE_TIME_BUCKET_SECONDS } from './coarsenIdleTime.js';
5
5
  export { formatNextTrigger } from './formatNextTrigger.js';
6
+ export { badgeFor, isEnded, isPastOnce } from './reminderBadges.js';
6
7
  export { buildSignedPayload } from './integrityPayload.js';
7
8
  export { versionSatisfies, isNewer } from './semver.js';
8
9
  export { shouldAutoClose } from './shouldAutoClose.js';
@@ -0,0 +1,9 @@
1
+ import type { ResponsibilityDef, ScheduledReminder } from './types.js';
2
+ export type ReminderBadgeTone = 'active' | 'docked' | 'snoozed' | 'done';
3
+ export interface ReminderBadge {
4
+ label: string;
5
+ tone: ReminderBadgeTone;
6
+ }
7
+ export declare function isEnded(def: ResponsibilityDef, now?: number): boolean;
8
+ export declare function isPastOnce(def: ResponsibilityDef, now?: number): boolean;
9
+ export declare function badgeFor(def: ResponsibilityDef, reminder: ScheduledReminder | undefined, dockedDefIds: ReadonlySet<string>, now?: number): ReminderBadge | null;
@@ -0,0 +1,24 @@
1
+ import { formatNextTrigger } from './formatNextTrigger.js';
2
+ export function isEnded(def, now = Date.now()) {
3
+ return def.endTime != null && now >= new Date(def.endTime).getTime();
4
+ }
5
+ export function isPastOnce(def, now = Date.now()) {
6
+ return def.recurrenceType === 'once' && new Date(def.startDateTime).getTime() < now;
7
+ }
8
+ export function badgeFor(def, reminder, dockedDefIds, now = Date.now()) {
9
+ if (isEnded(def, now))
10
+ return { label: 'Ended', tone: 'done' };
11
+ if (!reminder) {
12
+ return isPastOnce(def, now) ? { label: 'Done', tone: 'done' } : null;
13
+ }
14
+ if (reminder.status === 'active') {
15
+ return dockedDefIds.has(def.id) ? { label: 'Docked', tone: 'docked' } : { label: 'Active', tone: 'active' };
16
+ }
17
+ if (reminder.status === 'delayed') {
18
+ const until = formatNextTrigger(reminder.delayUntil && reminder.delayUntil > 0 ? reminder.delayUntil : reminder.nextTriggerTime, now);
19
+ return until === 'N/A' ? { label: 'Snoozed', tone: 'snoozed' } : { label: `Snoozed until ${until}`, tone: 'snoozed' };
20
+ }
21
+ if (reminder.status === 'completed')
22
+ return { label: 'Done', tone: 'done' };
23
+ return null;
24
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@upnextapp/core",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "type": "module",
5
5
  "description": "Platform-agnostic core for UpNext: domain types, scheduling math, integrity payloads",
6
6
  "license": "MIT",