@graview/core 0.1.30 → 0.1.33
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/README.md +11 -1
- package/dist/app.d.ts +8 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js.map +1 -1
- package/dist/capabilities.js +1 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/catalog.d.ts +312 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +459 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli/document-schema.d.ts.map +1 -1
- package/dist/cli/document-schema.js +9 -0
- package/dist/cli/document-schema.js.map +1 -1
- package/dist/days.d.ts +7 -1
- package/dist/days.d.ts.map +1 -1
- package/dist/days.js +10 -4
- package/dist/days.js.map +1 -1
- package/dist/document/compile-checked.d.ts.map +1 -1
- package/dist/document/compile-checked.js +3 -2
- package/dist/document/compile-checked.js.map +1 -1
- package/dist/document/compiled.d.ts.map +1 -1
- package/dist/document/compiled.js +2 -0
- package/dist/document/compiled.js.map +1 -1
- package/dist/document/connection-findings.d.ts +6 -0
- package/dist/document/connection-findings.d.ts.map +1 -0
- package/dist/document/connection-findings.js +110 -0
- package/dist/document/connection-findings.js.map +1 -0
- package/dist/document/connection-spec.d.ts +38 -0
- package/dist/document/connection-spec.d.ts.map +1 -0
- package/dist/document/connection-spec.js +43 -0
- package/dist/document/connection-spec.js.map +1 -0
- package/dist/document/schema.d.ts +6 -5
- package/dist/document/schema.d.ts.map +1 -1
- package/dist/document/schema.js +7 -0
- package/dist/document/schema.js.map +1 -1
- package/dist/document/to-document.d.ts.map +1 -1
- package/dist/document/to-document.js +1 -0
- package/dist/document/to-document.js.map +1 -1
- package/dist/document.schema.json +149 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/installation.d.ts +1 -1
- package/dist/mutations/arg-shape.d.ts +2 -0
- package/dist/mutations/arg-shape.d.ts.map +1 -1
- package/dist/mutations/arg-shape.js +4 -0
- package/dist/mutations/arg-shape.js.map +1 -1
- package/dist/mutations/form.d.ts +2 -0
- package/dist/mutations/form.d.ts.map +1 -1
- package/dist/mutations/form.js +1 -1
- package/dist/mutations/form.js.map +1 -1
- package/dist/ops/lineage.d.ts +7 -0
- package/dist/ops/lineage.d.ts.map +1 -1
- package/dist/ops/lineage.js +5 -4
- package/dist/ops/lineage.js.map +1 -1
- package/dist/scaffold/project.d.ts.map +1 -1
- package/dist/scaffold/project.js +3 -0
- package/dist/scaffold/project.js.map +1 -1
- package/dist/scaffold/ui.d.ts.map +1 -1
- package/dist/scaffold/ui.js +3 -0
- package/dist/scaffold/ui.js.map +1 -1
- package/dist/subscription-shape.d.ts +135 -0
- package/dist/subscription-shape.d.ts.map +1 -0
- package/dist/subscription-shape.js +55 -0
- package/dist/subscription-shape.js.map +1 -0
- package/dist/subscriptions.d.ts +68 -0
- package/dist/subscriptions.d.ts.map +1 -0
- package/dist/subscriptions.js +425 -0
- package/dist/subscriptions.js.map +1 -0
- package/dist/sync/connection-filter.d.ts +12 -0
- package/dist/sync/connection-filter.d.ts.map +1 -0
- package/dist/sync/connection-filter.js +34 -0
- package/dist/sync/connection-filter.js.map +1 -0
- package/dist/sync/connection.d.ts +65 -0
- package/dist/sync/connection.d.ts.map +1 -0
- package/dist/sync/connection.js +148 -0
- package/dist/sync/connection.js.map +1 -0
- package/dist/sync/engine.d.ts +27 -6
- package/dist/sync/engine.d.ts.map +1 -1
- package/dist/sync/engine.js +49 -26
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/google-calendar.d.ts +27 -2
- package/dist/sync/google-calendar.d.ts.map +1 -1
- package/dist/sync/google-calendar.js +55 -14
- package/dist/sync/google-calendar.js.map +1 -1
- package/dist/sync/index.d.ts +4 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wall-time.d.ts +60 -0
- package/dist/wall-time.d.ts.map +1 -0
- package/dist/wall-time.js +111 -0
- package/dist/wall-time.js.map +1 -0
- package/dist/when-typed.d.ts +15 -0
- package/dist/when-typed.d.ts.map +1 -0
- package/dist/when-typed.js +158 -0
- package/dist/when-typed.js.map +1 -0
- package/dist/words.d.ts +6 -1
- package/dist/words.d.ts.map +1 -1
- package/dist/words.js +6 -1
- package/dist/words.js.map +1 -1
- package/package.json +9 -1
|
@@ -55,8 +55,7 @@ export function googleCalendar(options) {
|
|
|
55
55
|
const base = options.baseUrl ?? BASE;
|
|
56
56
|
const events = `${base}/calendars/${encodeURIComponent(options.calendarId)}/events`;
|
|
57
57
|
const call = async (url, init) => {
|
|
58
|
-
const
|
|
59
|
-
const response = await doFetch(url, {
|
|
58
|
+
const send = async (token) => doFetch(url, {
|
|
60
59
|
...init,
|
|
61
60
|
headers: {
|
|
62
61
|
authorization: `Bearer ${token}`,
|
|
@@ -64,6 +63,19 @@ export function googleCalendar(options) {
|
|
|
64
63
|
...(init?.headers ?? {}),
|
|
65
64
|
},
|
|
66
65
|
});
|
|
66
|
+
let response = await send(await options.token());
|
|
67
|
+
/*
|
|
68
|
+
* A 401 is an access token Google no longer takes — an hour old, or
|
|
69
|
+
* revoked. Asked again with `refresh`, the token source mints a new one
|
|
70
|
+
* and the request goes once more; refused again, it is the token, not
|
|
71
|
+
* the network, and saying "offline" would hide that.
|
|
72
|
+
*/
|
|
73
|
+
if (response.status === 401) {
|
|
74
|
+
response = await send(await options.token({ refresh: true }));
|
|
75
|
+
if (response.status === 401) {
|
|
76
|
+
throw new Error("google-calendar: Google refused the access token twice (HTTP 401), the second one asked for with token({ refresh: true })");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
67
79
|
/*
|
|
68
80
|
* A 410 means the sync token expired and Google wants a full resync. It
|
|
69
81
|
* is the one error here that is not an error: throwing would look like
|
|
@@ -74,11 +86,20 @@ export function googleCalendar(options) {
|
|
|
74
86
|
return { expired: true };
|
|
75
87
|
if (!response.ok)
|
|
76
88
|
throw new Error(`google-calendar: HTTP ${response.status}`);
|
|
89
|
+
// A deletion is answered 204, with no body to read.
|
|
90
|
+
if (response.status === 204)
|
|
91
|
+
return { expired: false, body: {} };
|
|
77
92
|
return { expired: false, body: (await response.json()) };
|
|
78
93
|
};
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
94
|
+
/**
|
|
95
|
+
* Every page of one listing, from `cursor` or (without one) from nothing.
|
|
96
|
+
* The sync token Google hands back is on the LAST page only; a pull that
|
|
97
|
+
* stopped at the first would miss the rest and keep no cursor.
|
|
98
|
+
*/
|
|
99
|
+
const list = async (cursor) => {
|
|
100
|
+
const items = [];
|
|
101
|
+
let pageToken;
|
|
102
|
+
for (;;) {
|
|
82
103
|
const url = new URL(events);
|
|
83
104
|
if (cursor)
|
|
84
105
|
url.searchParams.set("syncToken", cursor);
|
|
@@ -86,26 +107,43 @@ export function googleCalendar(options) {
|
|
|
86
107
|
// that stops appearing is indistinguishable from one we never had.
|
|
87
108
|
else
|
|
88
109
|
url.searchParams.set("showDeleted", "true");
|
|
89
|
-
|
|
110
|
+
if (options.pageSize)
|
|
111
|
+
url.searchParams.set("maxResults", String(options.pageSize));
|
|
112
|
+
if (pageToken)
|
|
113
|
+
url.searchParams.set("pageToken", pageToken);
|
|
114
|
+
const result = await call(url.toString());
|
|
115
|
+
if (result.expired)
|
|
116
|
+
return { expired: true };
|
|
117
|
+
items.push(...(result.body["items"] ?? []));
|
|
118
|
+
const next = result.body["nextPageToken"];
|
|
119
|
+
if (typeof next === "string" && next) {
|
|
120
|
+
pageToken = next;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
return { expired: false, items, syncToken: result.body["nextSyncToken"] };
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
return {
|
|
127
|
+
name: "google-calendar",
|
|
128
|
+
async pull(cursor) {
|
|
129
|
+
let result = await list(cursor);
|
|
90
130
|
if (result.expired) {
|
|
91
131
|
// Start again from nothing rather than silently missing a window.
|
|
92
|
-
result = await
|
|
132
|
+
result = await list(undefined);
|
|
93
133
|
if (result.expired)
|
|
94
134
|
throw new Error("google-calendar: sync token rejected twice");
|
|
95
135
|
}
|
|
96
|
-
const
|
|
97
|
-
const items = body["items"] ?? [];
|
|
98
|
-
const changes = items.map((item) => ({
|
|
136
|
+
const changes = result.items.map((item) => ({
|
|
99
137
|
resource: "events",
|
|
100
138
|
id: String(item["id"]),
|
|
101
139
|
// The etag is Google's own version of the record, and the reason an
|
|
102
140
|
// echo of our own write is recognizable at all.
|
|
103
141
|
version: String(item["etag"] ?? ""),
|
|
104
|
-
...(item["status"] === "cancelled"
|
|
142
|
+
...(item["status"] === "cancelled" || (options.keep && !options.keep(item))
|
|
105
143
|
? { deleted: true }
|
|
106
144
|
: { fields: flatten(item) }),
|
|
107
145
|
}));
|
|
108
|
-
return { changes, cursor: String(
|
|
146
|
+
return { changes, cursor: String(result.syncToken ?? cursor ?? "") };
|
|
109
147
|
},
|
|
110
148
|
async push(writes) {
|
|
111
149
|
const acks = [];
|
|
@@ -132,7 +170,7 @@ export function googleCalendar(options) {
|
|
|
132
170
|
await call(`${events}/${encodeURIComponent(write.id)}`, { method: "DELETE" });
|
|
133
171
|
return { localId: write.localId, id: write.id, version: "" };
|
|
134
172
|
}
|
|
135
|
-
const body = {};
|
|
173
|
+
const body = write.id ? {} : { ...options.madeHere };
|
|
136
174
|
for (const [path, value] of Object.entries(write.fields ?? {}))
|
|
137
175
|
put(body, path, value);
|
|
138
176
|
const result = await call(write.id ? `${events}/${encodeURIComponent(write.id)}` : events, {
|
|
@@ -157,7 +195,10 @@ export function googleCalendar(options) {
|
|
|
157
195
|
*/
|
|
158
196
|
function flatten(item) {
|
|
159
197
|
const out = {};
|
|
160
|
-
|
|
198
|
+
// An all-day event has a `date` and no `dateTime`: it arrives as its day, and
|
|
199
|
+
// no time is made up for it. A mapping that names only the timed paths sees
|
|
200
|
+
// no start, and `createInbound` decides whether such a record is one of its.
|
|
201
|
+
for (const path of ["summary", "location", "description", "start.dateTime", "end.dateTime", "start.date", "end.date"]) {
|
|
161
202
|
const value = at(item, path);
|
|
162
203
|
if (value !== undefined)
|
|
163
204
|
out[path] = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-calendar.js","sourceRoot":"","sources":["../../src/sync/google-calendar.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,qDAAqD;AACrD,MAAM,UAAU,qBAAqB,CAAC,OAqBrC;IACC,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE;gBACN,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS;gBAC1B,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,gBAAgB;gBAC/B,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,cAAc;gBAC3B,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE;YACD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,KAAK,CAAC,UAAU;gBAClB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE;gBAChF,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,UAAU;gBAClB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE;gBAChF,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"google-calendar.js","sourceRoot":"","sources":["../../src/sync/google-calendar.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
export { CONNECTION_TAG, GOOGLE_COLORS, MADE_BY_GRAVIEW, connection, connectionMapping, creatingAct, inConnectionFilter, isDayField } from "./connection.js";
|
|
2
|
+
export type { Connection, ConnectionDeclaration, ConnectionRun } from "./connection.js";
|
|
1
3
|
export { googleCalendar, googleCalendarMapping } from "./google-calendar.js";
|
|
2
|
-
export type { Fetcher, GoogleCalendarOptions } from "./google-calendar.js";
|
|
4
|
+
export type { Fetcher, GoogleCalendarOptions, GoogleTokenRequest } from "./google-calendar.js";
|
|
3
5
|
export { syncConflictInvariant, SYNC_CONFLICTS } from "./conflict.js";
|
|
4
6
|
export type { SyncConflictOptions } from "./conflict.js";
|
|
5
7
|
export { SyncEngine } from "./engine.js";
|
|
6
|
-
export type { SettledConflict, SyncOptions, SyncReport } from "./engine.js";
|
|
8
|
+
export type { SettledConflict, SyncOptions, SyncRefusal, SyncReport } from "./engine.js";
|
|
7
9
|
export { allowTools, doorClient, mcpClient, mcpDoor, mcpRemote, ownHost, sameOrigin } from "./mcp.js";
|
|
8
10
|
export type { DoorHeaders, DoorRequest, DoorResponse, McpClientOptions, McpDoorOptions, McpRemoteOptions, ToolCall } from "./mcp.js";
|
|
9
11
|
export { EMPTY_SYNC_STATE, systemAuthor } from "./types.js";
|
package/dist/sync/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7J,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtG,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,YAAY,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,SAAS,EACT,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC"}
|
package/dist/sync/index.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* main entry up front and draws without ever syncing, so the engine and its
|
|
8
8
|
* transports are reached only by a host that runs one.
|
|
9
9
|
*/
|
|
10
|
+
export { CONNECTION_TAG, GOOGLE_COLORS, MADE_BY_GRAVIEW, connection, connectionMapping, creatingAct, inConnectionFilter, isDayField } from "./connection.js";
|
|
10
11
|
export { googleCalendar, googleCalendarMapping } from "./google-calendar.js";
|
|
11
12
|
export { syncConflictInvariant, SYNC_CONFLICTS } from "./conflict.js";
|
|
12
13
|
export { SyncEngine } from "./engine.js";
|
package/dist/sync/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7J,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** A day and, where it has one, a time of day in minutes after midnight, on the reader's wall. */
|
|
2
|
+
export interface WallTime {
|
|
3
|
+
/** `YYYY-MM-DD`. */
|
|
4
|
+
readonly day: string;
|
|
5
|
+
readonly minutes?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const DAY_MS = 86400000;
|
|
8
|
+
export declare const pad: (n: number) => string;
|
|
9
|
+
export declare const dayOfUtc: (stamp: number) => string;
|
|
10
|
+
export declare const utcOf: (day: string) => number;
|
|
11
|
+
export declare const addDays: (day: string, days: number) => string;
|
|
12
|
+
export declare const weekdayOf: (day: string) => number;
|
|
13
|
+
/** A real day of the calendar, or undefined: "2026-02-31" is none. */
|
|
14
|
+
export declare function dayFrom(year: number, month: number, date: number): string | undefined;
|
|
15
|
+
/** The reader's wall time now: today, and the minutes since midnight. */
|
|
16
|
+
export declare function wallNow(at?: Date): WallTime & {
|
|
17
|
+
readonly minutes: number;
|
|
18
|
+
};
|
|
19
|
+
/** Whether a stored moment names an instant: it carries a `Z` or an offset after its time. */
|
|
20
|
+
export declare const namesInstant: (value: string) => boolean;
|
|
21
|
+
/**
|
|
22
|
+
* A stored day or moment as a wall time: an instant on the reader's clock, a
|
|
23
|
+
* wall time as it was written, a day as a day. Undefined for anything that
|
|
24
|
+
* is not a date.
|
|
25
|
+
*/
|
|
26
|
+
export declare function wallOfStored(value: unknown): WallTime | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* A wall time as the field keeps it: a day as `YYYY-MM-DD`; a moment as an
|
|
29
|
+
* instant in UTC (`2026-10-17T19:00:00Z`) where the field keeps instants, or
|
|
30
|
+
* as the wall time written (`2026-10-17T15:00`) where it takes no zone.
|
|
31
|
+
*/
|
|
32
|
+
export declare function storedOfWall(wall: WallTime, options: {
|
|
33
|
+
readonly time: boolean;
|
|
34
|
+
readonly instant: boolean;
|
|
35
|
+
}): string;
|
|
36
|
+
/** The reader's time zone, by name and as it is said short: "America/New_York", "EDT". */
|
|
37
|
+
export declare function zoneSaid(locale?: string, at?: Date): {
|
|
38
|
+
readonly zone: string;
|
|
39
|
+
readonly short: string;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Where an end goes when its start moves: as far as the start moved, so a
|
|
43
|
+
* meeting keeps its length. A start given for the first time puts an empty
|
|
44
|
+
* end an hour after it, where the two hold times; a day's end is left for
|
|
45
|
+
* the person to say. An end already given, with no start before, is kept.
|
|
46
|
+
*/
|
|
47
|
+
export declare function endAfterStartMoved(before: string | undefined, after: string, end: string | undefined, options: {
|
|
48
|
+
readonly time: boolean;
|
|
49
|
+
readonly instant: boolean;
|
|
50
|
+
}): string | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Which of a kind's (or an act's) date fields is a start and which its end:
|
|
53
|
+
* its `start` and `end` roles where it declares them, else the fields named
|
|
54
|
+
* for them. Undefined unless both are there.
|
|
55
|
+
*/
|
|
56
|
+
export declare function startAndEndOf(fields: readonly string[], roles?: Readonly<Record<string, string | undefined>>): {
|
|
57
|
+
readonly start: string;
|
|
58
|
+
readonly end: string;
|
|
59
|
+
} | undefined;
|
|
60
|
+
//# sourceMappingURL=wall-time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wall-time.d.ts","sourceRoot":"","sources":["../src/wall-time.ts"],"names":[],"mappings":"AAWA,kGAAkG;AAClG,MAAM,WAAW,QAAQ;IACvB,oBAAoB;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,MAAM,WAAa,CAAC;AAGjC,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,KAAG,MAAoC,CAAC;AACrE,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,MAAoD,CAAC;AAC9F,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,KAAG,MAA6E,CAAC;AAClH,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,EAAE,MAAM,MAAM,KAAG,MAA8C,CAAC;AACnG,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,KAAG,MAA0C,CAAC;AAEnF,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIrF;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,EAAE,GAAE,IAAiB,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAEtF;AAED,8FAA8F;AAC9F,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OAAgE,CAAC;AAE9G;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAUjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAOnH;AAED,0FAA0F;AAC1F,wBAAgB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,GAAE,IAAiB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CASlH;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,OAAO,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC7D,MAAM,GAAG,SAAS,CAapB;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAM,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAI/K"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A DAY AND A TIME ON THE READER'S WALL, AND AS A FIELD KEEPS THEM (Roadmap
|
|
3
|
+
* f-date-inputs): an instant read back on the reader's clock, a wall time
|
|
4
|
+
* kept as an instant in UTC or as written, the zone it is read in, and an
|
|
5
|
+
* end that moves with its start. Apart from the reading of what is typed
|
|
6
|
+
* (`when-typed.ts`), which only a date's editor needs, so that what a
|
|
7
|
+
* record's value and the calendar draw with carries none of it.
|
|
8
|
+
*/
|
|
9
|
+
import { DEFAULT_LOCALE } from "./days.js";
|
|
10
|
+
export const DAY_MS = 86_400_000;
|
|
11
|
+
const ISO_DAY_AT_START = /^(\d{4})-(\d{2})-(\d{2})/;
|
|
12
|
+
export const pad = (n) => String(n).padStart(2, "0");
|
|
13
|
+
export const dayOfUtc = (stamp) => new Date(stamp).toISOString().slice(0, 10);
|
|
14
|
+
export const utcOf = (day) => Date.UTC(+day.slice(0, 4), +day.slice(5, 7) - 1, +day.slice(8, 10));
|
|
15
|
+
export const addDays = (day, days) => dayOfUtc(utcOf(day) + days * DAY_MS);
|
|
16
|
+
export const weekdayOf = (day) => new Date(utcOf(day)).getUTCDay();
|
|
17
|
+
/** A real day of the calendar, or undefined: "2026-02-31" is none. */
|
|
18
|
+
export function dayFrom(year, month, date) {
|
|
19
|
+
if (!(month >= 1 && month <= 12 && date >= 1 && date <= 31))
|
|
20
|
+
return undefined;
|
|
21
|
+
const day = `${String(year).padStart(4, "0")}-${pad(month)}-${pad(date)}`;
|
|
22
|
+
return dayOfUtc(utcOf(day)) === day ? day : undefined;
|
|
23
|
+
}
|
|
24
|
+
/** The reader's wall time now: today, and the minutes since midnight. */
|
|
25
|
+
export function wallNow(at = new Date()) {
|
|
26
|
+
return { day: `${at.getFullYear()}-${pad(at.getMonth() + 1)}-${pad(at.getDate())}`, minutes: at.getHours() * 60 + at.getMinutes() };
|
|
27
|
+
}
|
|
28
|
+
/** Whether a stored moment names an instant: it carries a `Z` or an offset after its time. */
|
|
29
|
+
export const namesInstant = (value) => /T\d\d:\d\d(:[\d.]+)?(Z|[+-]\d\d:?\d\d)$/.test(value);
|
|
30
|
+
/**
|
|
31
|
+
* A stored day or moment as a wall time: an instant on the reader's clock, a
|
|
32
|
+
* wall time as it was written, a day as a day. Undefined for anything that
|
|
33
|
+
* is not a date.
|
|
34
|
+
*/
|
|
35
|
+
export function wallOfStored(value) {
|
|
36
|
+
if (typeof value !== "string")
|
|
37
|
+
return undefined;
|
|
38
|
+
if (namesInstant(value)) {
|
|
39
|
+
const at = new Date(value);
|
|
40
|
+
return Number.isNaN(at.getTime()) ? undefined : wallNow(at);
|
|
41
|
+
}
|
|
42
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2}))?/.exec(value);
|
|
43
|
+
if (!match || !dayFrom(Number(match[1]), Number(match[2]), Number(match[3])))
|
|
44
|
+
return undefined;
|
|
45
|
+
const day = value.slice(0, 10);
|
|
46
|
+
return match[4] === undefined ? { day } : { day, minutes: Number(match[4]) * 60 + Number(match[5]) };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A wall time as the field keeps it: a day as `YYYY-MM-DD`; a moment as an
|
|
50
|
+
* instant in UTC (`2026-10-17T19:00:00Z`) where the field keeps instants, or
|
|
51
|
+
* as the wall time written (`2026-10-17T15:00`) where it takes no zone.
|
|
52
|
+
*/
|
|
53
|
+
export function storedOfWall(wall, options) {
|
|
54
|
+
if (!options.time)
|
|
55
|
+
return wall.day;
|
|
56
|
+
const minutes = wall.minutes ?? 9 * 60;
|
|
57
|
+
if (!options.instant)
|
|
58
|
+
return `${wall.day}T${pad(Math.floor(minutes / 60))}:${pad(minutes % 60)}`;
|
|
59
|
+
const [, year, month, date] = ISO_DAY_AT_START.exec(wall.day);
|
|
60
|
+
const at = new Date(Number(year), Number(month) - 1, Number(date), Math.floor(minutes / 60), minutes % 60);
|
|
61
|
+
return at.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
62
|
+
}
|
|
63
|
+
/** The reader's time zone, by name and as it is said short: "America/New_York", "EDT". */
|
|
64
|
+
export function zoneSaid(locale, at = new Date()) {
|
|
65
|
+
const zone = Intl.DateTimeFormat().resolvedOptions().timeZone ?? "UTC";
|
|
66
|
+
let short = zone;
|
|
67
|
+
try {
|
|
68
|
+
short = new Intl.DateTimeFormat(locale ?? DEFAULT_LOCALE, { timeZoneName: "short" }).formatToParts(at).find((part) => part.type === "timeZoneName")?.value ?? zone;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
short = zone;
|
|
72
|
+
}
|
|
73
|
+
return { zone, short };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Where an end goes when its start moves: as far as the start moved, so a
|
|
77
|
+
* meeting keeps its length. A start given for the first time puts an empty
|
|
78
|
+
* end an hour after it, where the two hold times; a day's end is left for
|
|
79
|
+
* the person to say. An end already given, with no start before, is kept.
|
|
80
|
+
*/
|
|
81
|
+
export function endAfterStartMoved(before, after, end, options) {
|
|
82
|
+
const moved = wallOfStored(after);
|
|
83
|
+
if (!moved)
|
|
84
|
+
return end;
|
|
85
|
+
const was = before === undefined ? undefined : wallOfStored(before);
|
|
86
|
+
const ending = end === undefined ? undefined : wallOfStored(end);
|
|
87
|
+
const at = (wall) => utcOf(wall.day) + (wall.minutes ?? 0) * 60_000;
|
|
88
|
+
const shifted = (from, by) => {
|
|
89
|
+
const stamp = at(from) + by;
|
|
90
|
+
return { day: dayOfUtc(stamp), ...(options.time ? { minutes: Math.round((stamp % DAY_MS) / 60_000) } : {}) };
|
|
91
|
+
};
|
|
92
|
+
if (was && ending)
|
|
93
|
+
return storedOfWall(shifted(ending, at(moved) - at(was)), options);
|
|
94
|
+
if (ending && at(ending) >= at(moved))
|
|
95
|
+
return end;
|
|
96
|
+
return options.time ? storedOfWall(shifted(moved, 3_600_000), options) : end;
|
|
97
|
+
}
|
|
98
|
+
/** A field that says when something starts, and one that says when it ends. */
|
|
99
|
+
const STARTS = /^(start|starts|startsAt|startsOn|startAt|begins|from|opens|checkIn)$/i;
|
|
100
|
+
const ENDS = /^(end|ends|endsAt|endsOn|endAt|until|to|finish|finishes|closes|through|checkOut)$/i;
|
|
101
|
+
/**
|
|
102
|
+
* Which of a kind's (or an act's) date fields is a start and which its end:
|
|
103
|
+
* its `start` and `end` roles where it declares them, else the fields named
|
|
104
|
+
* for them. Undefined unless both are there.
|
|
105
|
+
*/
|
|
106
|
+
export function startAndEndOf(fields, roles = {}) {
|
|
107
|
+
const start = (roles["start"] && fields.includes(roles["start"]) ? roles["start"] : undefined) ?? fields.find((field) => STARTS.test(field));
|
|
108
|
+
const end = (roles["end"] && fields.includes(roles["end"]) ? roles["end"] : undefined) ?? fields.find((field) => field !== start && ENDS.test(field));
|
|
109
|
+
return start && end ? { start, end } : undefined;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=wall-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wall-time.js","sourceRoot":"","sources":["../src/wall-time.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type WallTime } from "./wall-time.js";
|
|
2
|
+
/**
|
|
3
|
+
* What a person typed, read as a day and — for a field with a time — a time
|
|
4
|
+
* of day on their wall. `today` is the reader's today; `base` is what the
|
|
5
|
+
* field held, so a time typed alone keeps its day and a day typed alone keeps
|
|
6
|
+
* its time (else 9 in the morning). A time typed for a field that holds only
|
|
7
|
+
* a day is let go. Undefined when the words name no day this can read.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readWhenTyped(text: string, options: {
|
|
10
|
+
readonly today: string;
|
|
11
|
+
readonly time: boolean;
|
|
12
|
+
readonly base?: WallTime;
|
|
13
|
+
readonly locale?: string;
|
|
14
|
+
}): WallTime | undefined;
|
|
15
|
+
//# sourceMappingURL=when-typed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when-typed.d.ts","sourceRoot":"","sources":["../src/when-typed.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA8C,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAwG3F;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9G,QAAQ,GAAG,SAAS,CAYtB"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A DAY OR A MOMENT, TYPED AS PEOPLE SAY IT (Roadmap f-date-inputs).
|
|
3
|
+
*
|
|
4
|
+
* "tomorrow 3pm", "Fri 10:30", "17 Oct", "in 2 weeks", "10/17": every
|
|
5
|
+
* surface that asks for a date — a record's value changed in place, a
|
|
6
|
+
* card's, an act's form on either face — reads what was typed here, so the
|
|
7
|
+
* same words mean the same day everywhere. What cannot be read is refused,
|
|
8
|
+
* never guessed: "sometime soon" is no day, and "31 Feb" is none either.
|
|
9
|
+
*
|
|
10
|
+
* WALL TIME AND INSTANTS. What is typed is a time on the reader's wall
|
|
11
|
+
* (`WallTime`: a day and, with a time, minutes after midnight). A field that
|
|
12
|
+
* keeps an instant — a document's `datetime` — stores it in UTC with its
|
|
13
|
+
* `Z`, so a meeting set in New York is the same moment read in London; a
|
|
14
|
+
* field whose own pattern takes a bare `YYYY-MM-DDTHH:MM` keeps the wall
|
|
15
|
+
* time as written. Reading back (`wallOfStored`) puts an instant on the
|
|
16
|
+
* reader's clock and a wall time where it was written.
|
|
17
|
+
*/
|
|
18
|
+
import { DEFAULT_LOCALE } from "./days.js";
|
|
19
|
+
import { addDays, dayFrom, utcOf, weekdayOf, DAY_MS } from "./wall-time.js";
|
|
20
|
+
const MONTHS = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"];
|
|
21
|
+
const WEEKDAYS = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
|
|
22
|
+
const MONTH_WORD = "(jan(?:uary)?|feb(?:ruary)?|mar(?:ch)?|apr(?:il)?|may|june?|july?|aug(?:ust)?|sept?(?:ember)?|oct(?:ober)?|nov(?:ember)?|dec(?:ember)?)";
|
|
23
|
+
const WEEKDAY_WORD = "(sun(?:day)?|mon(?:day)?|tue(?:s|sday)?|wed(?:nesday)?|thu(?:r|rs|rsday)?|fri(?:day)?|sat(?:urday)?)";
|
|
24
|
+
const monthOf = (word) => MONTHS.indexOf(word.slice(0, 3)) + 1;
|
|
25
|
+
const fullYear = (year) => (year === undefined ? undefined : year.length === 2 ? 2000 + Number(year) : Number(year));
|
|
26
|
+
/** Whether a locale writes the month before the day in digits: 10/17 in the US, 17/10 nearly everywhere else. */
|
|
27
|
+
function monthFirst(locale) {
|
|
28
|
+
try {
|
|
29
|
+
const parts = new Intl.DateTimeFormat(locale, { month: "numeric", day: "numeric" }).formatToParts(0).map((part) => part.type);
|
|
30
|
+
return parts.indexOf("month") < parts.indexOf("day");
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/*
|
|
37
|
+
* A time of day, taken out of the words: "3pm", "3:30 p.m.", "15:30", "noon",
|
|
38
|
+
* "at 3". What is left is the day. An hour past what a clock shows is no
|
|
39
|
+
* time ("25pm"), and the whole reading fails rather than dropping it.
|
|
40
|
+
*/
|
|
41
|
+
function timeIn(text) {
|
|
42
|
+
const take = (match, minutes) => ({ minutes, rest: `${text.slice(0, match.index)} ${text.slice(match.index + match[0].length)}` });
|
|
43
|
+
let match = /\b(noon|midday)\b/.exec(text);
|
|
44
|
+
if (match)
|
|
45
|
+
return take(match, 12 * 60);
|
|
46
|
+
match = /\bmidnight\b/.exec(text);
|
|
47
|
+
if (match)
|
|
48
|
+
return take(match, 0);
|
|
49
|
+
match = /\b(\d{1,2})(?::(\d{2}))?\s*([ap])\.?m?\.?(?=\s|$)/.exec(text);
|
|
50
|
+
if (match) {
|
|
51
|
+
const hour = Number(match[1]);
|
|
52
|
+
const minute = Number(match[2] ?? 0);
|
|
53
|
+
if (hour < 1 || hour > 12 || minute > 59)
|
|
54
|
+
return { rest: text, bad: true };
|
|
55
|
+
return take(match, ((hour % 12) + (match[3] === "p" ? 12 : 0)) * 60 + minute);
|
|
56
|
+
}
|
|
57
|
+
match = /\b(\d{1,2}):(\d{2})\b/.exec(text);
|
|
58
|
+
if (match) {
|
|
59
|
+
const hour = Number(match[1]);
|
|
60
|
+
const minute = Number(match[2]);
|
|
61
|
+
if (hour > 23 || minute > 59)
|
|
62
|
+
return { rest: text, bad: true };
|
|
63
|
+
return take(match, hour * 60 + minute);
|
|
64
|
+
}
|
|
65
|
+
// "at 3" is an hour of the working day: 1 to 7 are the afternoon's.
|
|
66
|
+
match = /\bat\s+(\d{1,2})\b/.exec(text);
|
|
67
|
+
if (match) {
|
|
68
|
+
const hour = Number(match[1]);
|
|
69
|
+
if (hour > 23)
|
|
70
|
+
return { rest: text, bad: true };
|
|
71
|
+
return take(match, (hour >= 1 && hour <= 7 ? hour + 12 : hour) * 60);
|
|
72
|
+
}
|
|
73
|
+
const part = /\b(morning|afternoon|evening|tonight)\b/.exec(text);
|
|
74
|
+
if (part) {
|
|
75
|
+
const minutes = { morning: 9, afternoon: 15, evening: 18, tonight: 20 }[part[1]] * 60;
|
|
76
|
+
// "tonight" is a day as well as a time: today's.
|
|
77
|
+
return { minutes, rest: part[1] === "tonight" ? `${text.slice(0, part.index)} today ${text.slice(part.index + part[0].length)}` : `${text.slice(0, part.index)} ${text.slice(part.index + part[0].length)}` };
|
|
78
|
+
}
|
|
79
|
+
return { rest: text };
|
|
80
|
+
}
|
|
81
|
+
/** The day the rest of the words name, from `today`; undefined when they name none, or name it in words not read here. */
|
|
82
|
+
function dayIn(text, today, locale) {
|
|
83
|
+
const words = text.replace(/\b(on|at|the|of|this)\b/g, " ").replace(/\s+/g, " ").trim();
|
|
84
|
+
if (words === "")
|
|
85
|
+
return null;
|
|
86
|
+
if (words === "today" || words === "now")
|
|
87
|
+
return today;
|
|
88
|
+
if (words === "tomorrow" || words === "tmrw" || words === "tmr")
|
|
89
|
+
return addDays(today, 1);
|
|
90
|
+
if (words === "yesterday")
|
|
91
|
+
return addDays(today, -1);
|
|
92
|
+
if (words === "next week")
|
|
93
|
+
return addDays(today, 7);
|
|
94
|
+
let match = /^in (\d{1,3}) (day|days|week|weeks)$/.exec(words);
|
|
95
|
+
if (match)
|
|
96
|
+
return addDays(today, Number(match[1]) * (match[2].startsWith("week") ? 7 : 1));
|
|
97
|
+
match = new RegExp(`^(next )?${WEEKDAY_WORD}$`).exec(words);
|
|
98
|
+
if (match) {
|
|
99
|
+
const wanted = WEEKDAYS.indexOf(match[2].slice(0, 3));
|
|
100
|
+
const ahead = (wanted - weekdayOf(today) + 7) % 7;
|
|
101
|
+
return addDays(today, match[1] && ahead === 0 ? 7 : ahead);
|
|
102
|
+
}
|
|
103
|
+
match = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(words);
|
|
104
|
+
if (match)
|
|
105
|
+
return dayFrom(Number(match[1]), Number(match[2]), Number(match[3]));
|
|
106
|
+
// A month said in words: "17 Oct", "Oct 17", "October 17th 2027", with or without its weekday.
|
|
107
|
+
const bare = words.replace(new RegExp(`^${WEEKDAY_WORD} `), "");
|
|
108
|
+
match = new RegExp(`^(\\d{1,2})(?:st|nd|rd|th)? ${MONTH_WORD}(?: (\\d{4}))?$`).exec(bare);
|
|
109
|
+
const said = match ? { date: match[1], month: match[2], year: match[3] } : undefined;
|
|
110
|
+
match = new RegExp(`^${MONTH_WORD} (\\d{1,2})(?:st|nd|rd|th)?(?: (\\d{4}))?$`).exec(bare);
|
|
111
|
+
const named = said ?? (match ? { date: match[2], month: match[1], year: match[3] } : undefined);
|
|
112
|
+
if (named)
|
|
113
|
+
return near(today, fullYear(named.year), monthOf(named.month), Number(named.date));
|
|
114
|
+
// Digits in the reader's order: 10/17 in the US, 17/10 in Britain.
|
|
115
|
+
match = /^(\d{1,2})[/.-](\d{1,2})(?:[/.-](\d{2}|\d{4}))?$/.exec(bare);
|
|
116
|
+
if (match) {
|
|
117
|
+
const [first, second] = [Number(match[1]), Number(match[2])];
|
|
118
|
+
const [month, date] = monthFirst(locale) ? [first, second] : [second, first];
|
|
119
|
+
return near(today, fullYear(match[3]), month, date);
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
/** A day of a month: in the year said, else this year — unless that is more than half a year gone, when it is next year's. */
|
|
124
|
+
function near(today, year, month, date) {
|
|
125
|
+
if (year !== undefined)
|
|
126
|
+
return dayFrom(year, month, date);
|
|
127
|
+
const thisYear = Number(today.slice(0, 4));
|
|
128
|
+
const day = dayFrom(thisYear, month, date);
|
|
129
|
+
if (day === undefined)
|
|
130
|
+
return dayFrom(thisYear + 1, month, date);
|
|
131
|
+
return utcOf(today) - utcOf(day) > 183 * DAY_MS ? dayFrom(thisYear + 1, month, date) : day;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* What a person typed, read as a day and — for a field with a time — a time
|
|
135
|
+
* of day on their wall. `today` is the reader's today; `base` is what the
|
|
136
|
+
* field held, so a time typed alone keeps its day and a day typed alone keeps
|
|
137
|
+
* its time (else 9 in the morning). A time typed for a field that holds only
|
|
138
|
+
* a day is let go. Undefined when the words name no day this can read.
|
|
139
|
+
*/
|
|
140
|
+
export function readWhenTyped(text, options) {
|
|
141
|
+
// A moment as a record keeps one, pasted or typed: "2026-10-17T15:00" is a day and a time.
|
|
142
|
+
const typed = text.toLowerCase().replace(/,/g, " ").replace(/(\d{4}-\d{2}-\d{2})t(?=\d)/, "$1 ").replace(/\s+/g, " ").trim();
|
|
143
|
+
if (typed === "")
|
|
144
|
+
return undefined;
|
|
145
|
+
const time = timeIn(typed);
|
|
146
|
+
if (time.bad)
|
|
147
|
+
return undefined;
|
|
148
|
+
const day = dayIn(time.rest, options.today, options.locale ?? DEFAULT_LOCALE);
|
|
149
|
+
if (day === undefined)
|
|
150
|
+
return undefined;
|
|
151
|
+
if (day === null && time.minutes === undefined)
|
|
152
|
+
return undefined;
|
|
153
|
+
const on = day ?? options.base?.day ?? options.today;
|
|
154
|
+
if (!options.time)
|
|
155
|
+
return { day: on };
|
|
156
|
+
return { day: on, minutes: time.minutes ?? options.base?.minutes ?? 9 * 60 };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=when-typed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when-typed.js","sourceRoot":"","sources":["../src/when-typed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAiB,MAAM,gBAAgB,CAAC;AAE3F,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACpG,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACnE,MAAM,UAAU,GAAG,yIAAyI,CAAC;AAC7J,MAAM,YAAY,GAAG,sGAAsG,CAAC;AAC5H,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/E,MAAM,QAAQ,GAAG,CAAC,IAAwB,EAAsB,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAE7J,iHAAiH;AACjH,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9H,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,IAAY;IAC1B,MAAM,IAAI,GAAG,CAAC,KAAsB,EAAE,OAAe,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5J,IAAI,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjC,KAAK,GAAG,mDAAmD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;IACzC,CAAC;IACD,oEAAoE;IACpE,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,GAAG,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,GAAG,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAc,CAAC,GAAG,EAAE,CAAC;QACnG,iDAAiD;QACjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IAChN,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,0HAA0H;AAC1H,SAAS,KAAK,CAAC,IAAY,EAAE,KAAa,EAAE,MAAc;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxF,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1F,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpD,IAAI,KAAK,GAAG,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,KAAK;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,KAAK,GAAG,IAAI,MAAM,CAAC,YAAY,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,KAAK;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,+FAA+F;IAC/F,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,KAAK,GAAG,IAAI,MAAM,CAAC,+BAA+B,UAAU,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,UAAU,4CAA4C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,mEAAmE;IACnE,KAAK,GAAG,kDAAkD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8HAA8H;AAC9H,SAAS,IAAI,CAAC,KAAa,EAAE,IAAwB,EAAE,KAAa,EAAE,IAAY;IAChF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC7F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,OAA+G;IAE/G,2FAA2F;IAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7H,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;IAC9E,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjE,MAAM,EAAE,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACtC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC/E,CAAC"}
|
package/dist/words.d.ts
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
* `failureWords`), the channel a change came through (`viaSaid`), a
|
|
9
9
|
* field's value and a relation in the declaration's words (`valueWords`,
|
|
10
10
|
* `edgeWords`), and an amount asked for as it is said (`amountBox`,
|
|
11
|
-
* `amountInBox`, `readAmount`)
|
|
11
|
+
* `amountInBox`, `readAmount`), and a date typed as
|
|
12
|
+
* people say it (`readWhenTyped`, `storedOfWall`, `wallOfStored`, `zoneSaid`,
|
|
13
|
+
* `endAfterStartMoved`, `startAndEndOf`).
|
|
12
14
|
*
|
|
13
15
|
* Apart from `@graview/core` because a bundler places a whole file in a
|
|
14
16
|
* page's first chunk when the first chunk can reach it and any chunk uses
|
|
@@ -30,4 +32,7 @@ export { fieldSays, mapsHref, parseDuration, sayDuration, sayPhone, telHref, typ
|
|
|
30
32
|
export { typedFieldOf } from "./schema/typed-field-of.js";
|
|
31
33
|
export { amountBox, amountInBox, readAmount } from "./amount-input.js";
|
|
32
34
|
export type { AmountBox } from "./amount-input.js";
|
|
35
|
+
export { readWhenTyped } from "./when-typed.js";
|
|
36
|
+
export { endAfterStartMoved, namesInstant, startAndEndOf, storedOfWall, wallNow, wallOfStored, zoneSaid } from "./wall-time.js";
|
|
37
|
+
export type { WallTime } from "./wall-time.js";
|
|
33
38
|
//# sourceMappingURL=words.d.ts.map
|
package/dist/words.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../src/words.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../src/words.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACxG,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACpI,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChI,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
|