@chelone/core 0.6.0 → 0.9.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 (255) hide show
  1. package/dist/assistant/assistant-session.d.ts +6 -0
  2. package/dist/assistant/assistant-session.js +204 -181
  3. package/dist/assistant/echo-transport.js +26 -29
  4. package/dist/assistant/http-transport.d.ts +10 -0
  5. package/dist/assistant/http-transport.js +98 -0
  6. package/dist/assistant/types.d.ts +1 -7
  7. package/dist/auth/access-control.d.ts +13 -5
  8. package/dist/auth/access-control.js +25 -21
  9. package/dist/auth/auth-options.d.ts +23 -17
  10. package/dist/auth/auth-options.js +82 -48
  11. package/dist/auth/permission-matrix.d.ts +12 -0
  12. package/dist/auth/permission-matrix.js +67 -0
  13. package/dist/auth/types.d.ts +14 -4
  14. package/dist/block-editor/block-document.d.ts +64 -0
  15. package/dist/block-editor/block-document.js +147 -0
  16. package/dist/block-editor/data-blocks.d.ts +63 -0
  17. package/dist/block-editor/data-blocks.js +117 -0
  18. package/dist/chart/chart-data.js +46 -44
  19. package/dist/command-menu/hotkey.js +58 -47
  20. package/dist/command-menu/recents.d.ts +4 -0
  21. package/dist/command-menu/recents.js +12 -11
  22. package/dist/command-menu/registry.d.ts +9 -5
  23. package/dist/command-menu/registry.js +36 -46
  24. package/dist/controller/calendar-dates.d.ts +12 -0
  25. package/dist/controller/calendar-dates.js +94 -113
  26. package/dist/controller/calendar-events.js +93 -88
  27. package/dist/controller/client-list-controller.d.ts +2 -2
  28. package/dist/controller/client-list-controller.js +251 -254
  29. package/dist/controller/data-table-columns.d.ts +2 -0
  30. package/dist/controller/data-table-columns.js +50 -56
  31. package/dist/controller/deep-equal.d.ts +1 -0
  32. package/dist/controller/deep-equal.js +14 -0
  33. package/dist/controller/filter-toggle.js +36 -44
  34. package/dist/controller/in-place-editor.d.ts +43 -0
  35. package/dist/controller/in-place-editor.js +43 -0
  36. package/dist/controller/infinite-list-controller.js +219 -189
  37. package/dist/controller/inspector.d.ts +55 -0
  38. package/dist/controller/inspector.js +70 -0
  39. package/dist/controller/job-monitor.d.ts +10 -4
  40. package/dist/controller/job-monitor.js +46 -47
  41. package/dist/controller/kanban-board.js +45 -24
  42. package/dist/controller/list-controller.d.ts +8 -5
  43. package/dist/controller/list-controller.js +447 -400
  44. package/dist/controller/list-params.js +96 -87
  45. package/dist/controller/pivot-grid.d.ts +4 -4
  46. package/dist/controller/pivot-grid.js +89 -95
  47. package/dist/controller/prev-next.d.ts +2 -2
  48. package/dist/controller/prev-next.js +74 -54
  49. package/dist/controller/record-controllers.d.ts +14 -6
  50. package/dist/controller/record-controllers.js +288 -257
  51. package/dist/controller/record-diff.d.ts +21 -0
  52. package/dist/controller/record-diff.js +50 -0
  53. package/dist/controller/record-timeline.d.ts +5 -5
  54. package/dist/controller/record-timeline.js +42 -30
  55. package/dist/controller/record-tree.js +57 -47
  56. package/dist/controller/record-workflow.d.ts +38 -16
  57. package/dist/controller/record-workflow.js +85 -64
  58. package/dist/controller/reference-many-controller.d.ts +2 -0
  59. package/dist/controller/reference-many-controller.js +199 -192
  60. package/dist/controller/reference-one-controller.d.ts +1 -1
  61. package/dist/controller/reference-one-controller.js +63 -56
  62. package/dist/controller/saved-queries.js +104 -91
  63. package/dist/controller/translate-fallback.js +10 -6
  64. package/dist/csv/export.d.ts +4 -3
  65. package/dist/csv/export.js +43 -40
  66. package/dist/csv/import-controller.d.ts +4 -0
  67. package/dist/csv/import-controller.js +189 -169
  68. package/dist/csv/match-headers.js +29 -22
  69. package/dist/csv/parse-with.js +60 -54
  70. package/dist/csv/run-import.js +69 -72
  71. package/dist/csv/validate-rows.d.ts +1 -1
  72. package/dist/csv/validate-rows.js +65 -52
  73. package/dist/data/cache-ops.d.ts +5 -4
  74. package/dist/data/cache-ops.js +208 -188
  75. package/dist/data/combine-data-providers.js +25 -23
  76. package/dist/data/data-provider-log.d.ts +45 -0
  77. package/dist/data/data-provider-log.js +93 -0
  78. package/dist/data/errors.js +14 -10
  79. package/dist/data/fake-provider.d.ts +6 -3
  80. package/dist/data/fake-provider.js +135 -114
  81. package/dist/data/fetch-utils.js +61 -44
  82. package/dist/data/filter-branch.d.ts +5 -0
  83. package/dist/data/filter-branch.js +10 -0
  84. package/dist/data/get-many-aggregate.js +84 -76
  85. package/dist/data/http-error.js +17 -12
  86. package/dist/data/keys.js +50 -36
  87. package/dist/data/mutation-options.d.ts +14 -9
  88. package/dist/data/mutation-options.js +93 -109
  89. package/dist/data/query-options.js +73 -68
  90. package/dist/data/remove-empty.d.ts +3 -0
  91. package/dist/data/remove-empty.js +11 -0
  92. package/dist/data/undoable.d.ts +2 -2
  93. package/dist/data/undoable.js +190 -174
  94. package/dist/data/with-lifecycle-callbacks.d.ts +45 -17
  95. package/dist/data/with-lifecycle-callbacks.js +66 -52
  96. package/dist/environment/application-update-store.js +58 -55
  97. package/dist/environment/offline-store.js +21 -21
  98. package/dist/form/array-binding.d.ts +30 -11
  99. package/dist/form/array-binding.js +184 -166
  100. package/dist/form/choice-ids.d.ts +7 -0
  101. package/dist/form/choice-ids.js +11 -0
  102. package/dist/form/choices-controller.d.ts +22 -2
  103. package/dist/form/choices-controller.js +315 -275
  104. package/dist/form/date-format.d.ts +38 -0
  105. package/dist/form/date-format.js +89 -0
  106. package/dist/form/dirty-values.d.ts +2 -2
  107. package/dist/form/dirty-values.js +22 -11
  108. package/dist/form/duration.d.ts +22 -0
  109. package/dist/form/duration.js +49 -0
  110. package/dist/form/edit-create-form.d.ts +12 -5
  111. package/dist/form/edit-create-form.js +243 -188
  112. package/dist/form/event-value.d.ts +6 -0
  113. package/dist/form/event-value.js +17 -0
  114. package/dist/form/field-error.d.ts +14 -0
  115. package/dist/form/field-error.js +28 -0
  116. package/dist/form/field-name.d.ts +20 -0
  117. package/dist/form/field-name.js +6 -0
  118. package/dist/form/filter-form-values.js +63 -49
  119. package/dist/form/form-controller.d.ts +9 -1
  120. package/dist/form/form-controller.js +165 -160
  121. package/dist/form/form-groups.d.ts +4 -3
  122. package/dist/form/form-groups.js +79 -79
  123. package/dist/form/form-handle.d.ts +175 -0
  124. package/dist/form/form-handle.js +68 -0
  125. package/dist/form/input-binding.d.ts +56 -31
  126. package/dist/form/input-binding.js +171 -118
  127. package/dist/form/input-values.d.ts +140 -0
  128. package/dist/form/input-values.js +206 -0
  129. package/dist/form/json-text.d.ts +11 -0
  130. package/dist/form/json-text.js +62 -37
  131. package/dist/form/save-pipeline.d.ts +6 -8
  132. package/dist/form/save-pipeline.js +91 -82
  133. package/dist/form/set-form-values.d.ts +6 -0
  134. package/dist/form/set-form-values.js +10 -0
  135. package/dist/form/source.js +97 -65
  136. package/dist/form/text-of.d.ts +2 -0
  137. package/dist/form/text-of.js +7 -0
  138. package/dist/form/validators.d.ts +58 -19
  139. package/dist/form/validators.js +97 -71
  140. package/dist/geo/bbox.d.ts +5 -4
  141. package/dist/geo/bbox.js +69 -48
  142. package/dist/geo/bounds.d.ts +14 -3
  143. package/dist/geo/bounds.js +98 -68
  144. package/dist/geo/constraints.js +88 -93
  145. package/dist/geo/coordinates.d.ts +10 -0
  146. package/dist/geo/coordinates.js +44 -23
  147. package/dist/geo/editor.d.ts +13 -13
  148. package/dist/geo/editor.js +176 -153
  149. package/dist/geo/geocoding.d.ts +4 -4
  150. package/dist/geo/geocoding.js +38 -41
  151. package/dist/geo/geojson.d.ts +12 -74
  152. package/dist/geo/geojson.js +52 -40
  153. package/dist/geo/geometry-math.d.ts +4 -4
  154. package/dist/geo/geometry-math.js +100 -93
  155. package/dist/geo/index.d.ts +9 -8
  156. package/dist/geo/map-layers.d.ts +42 -7
  157. package/dist/geo/map-layers.js +88 -62
  158. package/dist/geo/map-style.d.ts +12 -0
  159. package/dist/geo/map-style.js +43 -32
  160. package/dist/geo/messages.js +48 -45
  161. package/dist/geo/nominatim.js +88 -80
  162. package/dist/geo/osm-presets.d.ts +4 -3
  163. package/dist/geo/osm-presets.js +108 -86
  164. package/dist/geo/osm-tags.js +14 -12
  165. package/dist/geo/overpass.d.ts +14 -2
  166. package/dist/geo/overpass.js +83 -90
  167. package/dist/geo/shape-value.d.ts +9 -5
  168. package/dist/geo/shape-value.js +169 -146
  169. package/dist/geo/snap-to-roads.d.ts +3 -3
  170. package/dist/geo/snap-to-roads.js +55 -50
  171. package/dist/geo/throttle.js +36 -39
  172. package/dist/guards.d.ts +44 -0
  173. package/dist/guards.js +77 -0
  174. package/dist/i18n/default-messages.js +34 -29
  175. package/dist/i18n/english-messages.d.ts +172 -0
  176. package/dist/i18n/english-messages.js +359 -189
  177. package/dist/i18n/i18n.d.ts +2 -2
  178. package/dist/i18n/i18n.js +47 -60
  179. package/dist/i18n/inflection.d.ts +34 -0
  180. package/dist/i18n/inflection.js +82 -0
  181. package/dist/i18n/messages.d.ts +10 -2
  182. package/dist/i18n/messages.js +17 -4
  183. package/dist/i18n/missing-keys.d.ts +4 -0
  184. package/dist/i18n/missing-keys.js +70 -62
  185. package/dist/i18n/translatable.d.ts +16 -1
  186. package/dist/i18n/translatable.js +40 -47
  187. package/dist/index.d.ts +87 -39
  188. package/dist/index.js +54 -301
  189. package/dist/json/deep-equal.d.ts +8 -0
  190. package/dist/json/deep-equal.js +24 -0
  191. package/dist/json/strip-json-comments.js +38 -42
  192. package/dist/noop.d.ts +2 -0
  193. package/dist/noop.js +4 -0
  194. package/dist/notification/error-message.d.ts +2 -0
  195. package/dist/notification/error-message.js +10 -0
  196. package/dist/notification/notification-store.d.ts +3 -2
  197. package/dist/notification/notification-store.js +41 -45
  198. package/dist/onboarding-tour/placement.d.ts +2 -0
  199. package/dist/onboarding-tour/placement.js +65 -78
  200. package/dist/onboarding-tour/tour-controller.js +46 -54
  201. package/dist/realtime/add-events-for-mutations.js +75 -81
  202. package/dist/realtime/announce-lock.js +16 -13
  203. package/dist/realtime/broadcast-channel-transport.js +65 -59
  204. package/dist/realtime/copy-members.js +22 -14
  205. package/dist/realtime/in-memory-lock-provider.js +40 -48
  206. package/dist/realtime/live.js +95 -101
  207. package/dist/realtime/lock-options.js +16 -16
  208. package/dist/realtime/lock-session.js +91 -78
  209. package/dist/realtime/memory-transport.js +25 -25
  210. package/dist/realtime/presence.js +120 -122
  211. package/dist/realtime/realtime-data-provider.d.ts +10 -0
  212. package/dist/realtime/realtime-data-provider.js +45 -42
  213. package/dist/realtime/reconnect-backoff.js +17 -0
  214. package/dist/realtime/sse-transport.d.ts +31 -0
  215. package/dist/realtime/sse-transport.js +235 -0
  216. package/dist/realtime/status-store.js +23 -28
  217. package/dist/realtime/topic-hub.js +62 -71
  218. package/dist/realtime/topics.js +10 -12
  219. package/dist/realtime/types.js +10 -12
  220. package/dist/realtime/unread-count.js +21 -21
  221. package/dist/realtime/websocket-transport.d.ts +32 -0
  222. package/dist/realtime/websocket-transport.js +306 -0
  223. package/dist/resource/describe-resource.d.ts +2 -0
  224. package/dist/resource/describe-resource.js +247 -219
  225. package/dist/resource/get-at-path.js +29 -14
  226. package/dist/resource/identifier.d.ts +18 -0
  227. package/dist/resource/identifier.js +27 -0
  228. package/dist/resource/record.d.ts +4 -0
  229. package/dist/resource/record.js +10 -0
  230. package/dist/resource/register.d.ts +7 -0
  231. package/dist/resource/registry-store.d.ts +45 -15
  232. package/dist/resource/registry-store.js +67 -60
  233. package/dist/resource/registry.d.ts +10 -0
  234. package/dist/resource/registry.js +8 -4
  235. package/dist/resource/source-path.d.ts +23 -2
  236. package/dist/rich-text/rich-text-extras.d.ts +134 -0
  237. package/dist/rich-text/rich-text-extras.js +181 -0
  238. package/dist/rich-text/rich-text-image.d.ts +124 -0
  239. package/dist/rich-text/rich-text-image.js +163 -0
  240. package/dist/rich-text/rich-text.d.ts +6 -0
  241. package/dist/rich-text/rich-text.js +125 -88
  242. package/dist/router/location.d.ts +24 -4
  243. package/dist/router/location.js +43 -18
  244. package/dist/router/match.js +47 -39
  245. package/dist/router/paths.js +40 -34
  246. package/dist/router/record-from-location.d.ts +1 -1
  247. package/dist/router/record-from-location.js +25 -17
  248. package/dist/store/adapters.js +51 -55
  249. package/dist/store/micro-store.js +57 -59
  250. package/dist/store/shallow-equal.d.ts +12 -0
  251. package/dist/store/shallow-equal.js +20 -0
  252. package/dist/store/store.js +54 -57
  253. package/dist/ui-defaults.d.ts +15 -0
  254. package/dist/ui-defaults.js +17 -0
  255. package/package.json +13 -11
@@ -1,52 +1,57 @@
1
- const OSRM_MAX_POSITIONS = 100;
1
+ import { isRecord } from "../guards.js";
2
+ import { isGeoGeometry } from "./geojson.js";
3
+ // src/geo/snap-to-roads.ts
4
+ /** The match service rejects a request with more coordinates than this; a longer line is matched in chunks. */
5
+ var OSRM_MAX_POSITIONS = 100;
6
+ /**
7
+ * The line OSRM matched to one chunk, or `null` when the answer is not a
8
+ * single LineString of finite coordinates it can hand back.
9
+ */
10
+ function matchedLine(body) {
11
+ if (!isRecord(body) || body.code !== "Ok") return null;
12
+ if (!Array.isArray(body.matchings) || body.matchings.length !== 1) return null;
13
+ const matching = body.matchings[0];
14
+ if (!isRecord(matching)) return null;
15
+ const geometry = matching.geometry;
16
+ if (!isGeoGeometry(geometry) || geometry.type !== "LineString") return null;
17
+ return geometry.coordinates.length === 0 ? null : geometry.coordinates;
18
+ }
2
19
  function createOsrmProvider(options) {
3
- const { endpoint, profile = "driving" } = options;
4
- if (typeof endpoint !== "string" || endpoint.trim() === "") {
5
- throw new TypeError(
6
- 'createOsrmProvider: the "endpoint" option is required'
7
- );
8
- }
9
- const base = endpoint.trim().replace(/\/+$/, "");
10
- const doFetch = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
11
- async function matchChunk(positions, signal) {
12
- const path = positions.map(([lng, lat]) => `${lng},${lat}`).join(";");
13
- try {
14
- const response = await doFetch(
15
- `${base}/match/v1/${profile}/${path}?geometries=geojson&overview=full`,
16
- { signal }
17
- );
18
- if (!response.ok) return null;
19
- const body = await response.json();
20
- if (body?.code !== "Ok") return null;
21
- if (body.matchings?.length !== 1) return null;
22
- const geometry = body.matchings[0]?.geometry;
23
- if (geometry?.type !== "LineString" || !Array.isArray(geometry.coordinates) || geometry.coordinates.length === 0) {
24
- return null;
25
- }
26
- return geometry.coordinates;
27
- } catch (error) {
28
- if (signal?.aborted) throw error;
29
- return null;
30
- }
31
- }
32
- return {
33
- name: "osrm",
34
- async snapToRoad(line, requestOptions = {}) {
35
- const { signal } = requestOptions;
36
- const positions = line.coordinates;
37
- if (positions.length < 2) return null;
38
- const joined = [];
39
- for (let start = 0; start < positions.length - 1; ) {
40
- const end = Math.min(start + OSRM_MAX_POSITIONS, positions.length);
41
- const piece = await matchChunk(positions.slice(start, end), signal);
42
- if (!piece) return null;
43
- joined.push(...start === 0 ? piece : piece.slice(1));
44
- start = end - 1;
45
- }
46
- return { type: "LineString", coordinates: joined };
47
- }
48
- };
20
+ const { endpoint, profile = "driving" } = options;
21
+ if (typeof endpoint !== "string" || endpoint.trim() === "") throw new TypeError("createOsrmProvider: the \"endpoint\" option is required");
22
+ const base = endpoint.trim().replace(/\/+$/, "");
23
+ const doFetch = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
24
+ /** One match request; `null` when the server cannot match the chunk. */
25
+ async function matchChunk(positions, signal) {
26
+ const path = positions.map(([lng, lat]) => `${lng},${lat}`).join(";");
27
+ try {
28
+ const response = await doFetch(`${base}/match/v1/${profile}/${path}?geometries=geojson&overview=full`, { signal });
29
+ if (!response.ok) return null;
30
+ return matchedLine(await response.json());
31
+ } catch (error) {
32
+ if (signal?.aborted) throw error;
33
+ return null;
34
+ }
35
+ }
36
+ return {
37
+ name: "osrm",
38
+ async snapToRoad(line, requestOptions = {}) {
39
+ const { signal } = requestOptions;
40
+ const positions = line.coordinates;
41
+ if (positions.length < 2) return null;
42
+ const joined = [];
43
+ for (let start = 0; start < positions.length - 1;) {
44
+ const end = Math.min(start + OSRM_MAX_POSITIONS, positions.length);
45
+ const piece = await matchChunk(positions.slice(start, end), signal);
46
+ if (!piece) return null;
47
+ joined.push(...start === 0 ? piece : piece.slice(1));
48
+ start = end - 1;
49
+ }
50
+ return {
51
+ type: "LineString",
52
+ coordinates: joined
53
+ };
54
+ }
55
+ };
49
56
  }
50
- export {
51
- createOsrmProvider
52
- };
57
+ export { createOsrmProvider };
@@ -1,45 +1,42 @@
1
+ // src/geo/throttle.ts
1
2
  function abortError() {
2
- return new DOMException("Aborted", "AbortError");
3
+ return new DOMException("Aborted", "AbortError");
3
4
  }
4
5
  function timerSleep(ms, signal) {
5
- return new Promise((resolve, reject) => {
6
- if (signal?.aborted) return reject(abortError());
7
- const onAbort = () => {
8
- clearTimeout(timer);
9
- reject(abortError());
10
- };
11
- const timer = setTimeout(() => {
12
- signal?.removeEventListener("abort", onAbort);
13
- resolve();
14
- }, ms);
15
- signal?.addEventListener("abort", onAbort, { once: true });
16
- });
6
+ return new Promise((resolve, reject) => {
7
+ if (signal?.aborted) return reject(abortError());
8
+ const onAbort = () => {
9
+ clearTimeout(timer);
10
+ reject(abortError());
11
+ };
12
+ const timer = setTimeout(() => {
13
+ signal?.removeEventListener("abort", onAbort);
14
+ resolve();
15
+ }, ms);
16
+ signal?.addEventListener("abort", onAbort, { once: true });
17
+ });
17
18
  }
18
19
  function createThrottle(options) {
19
- const { minIntervalMs, now = Date.now, sleep = timerSleep } = options;
20
- let nextAllowedAt = Number.NEGATIVE_INFINITY;
21
- let tail = Promise.resolve();
22
- const takeTurn = async (signal) => {
23
- if (signal?.aborted) throw abortError();
24
- const delay = nextAllowedAt - now();
25
- if (delay > 0) await sleep(delay, signal);
26
- if (signal?.aborted) throw abortError();
27
- nextAllowedAt = now() + minIntervalMs;
28
- };
29
- return {
30
- wait(signal) {
31
- if (signal?.aborted) return Promise.reject(abortError());
32
- const turn = tail.then(() => takeTurn(signal));
33
- tail = turn.catch(() => void 0);
34
- if (!signal) return turn;
35
- return new Promise((resolve, reject) => {
36
- const onAbort = () => reject(abortError());
37
- signal.addEventListener("abort", onAbort, { once: true });
38
- turn.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
39
- });
40
- }
41
- };
20
+ const { minIntervalMs, now = Date.now, sleep = timerSleep } = options;
21
+ let nextAllowedAt = Number.NEGATIVE_INFINITY;
22
+ let tail = Promise.resolve();
23
+ const takeTurn = async (signal) => {
24
+ if (signal?.aborted) throw abortError();
25
+ const delay = nextAllowedAt - now();
26
+ if (delay > 0) await sleep(delay, signal);
27
+ if (signal?.aborted) throw abortError();
28
+ nextAllowedAt = now() + minIntervalMs;
29
+ };
30
+ return { wait(signal) {
31
+ if (signal?.aborted) return Promise.reject(abortError());
32
+ const turn = tail.then(() => takeTurn(signal));
33
+ tail = turn.catch(() => void 0);
34
+ if (!signal) return turn;
35
+ return new Promise((resolve, reject) => {
36
+ const onAbort = () => reject(abortError());
37
+ signal.addEventListener("abort", onAbort, { once: true });
38
+ turn.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
39
+ });
40
+ } };
42
41
  }
43
- export {
44
- createThrottle
45
- };
42
+ export { createThrottle };
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Core's object guards, in one place. Two questions, each answered once:
3
+ * `isRecord` — is it an object at all, so a Date, a Map and a class instance
4
+ * pass; `isPlainObject` — could a caller have written it as an object literal,
5
+ * which needs `Object.prototype` or `null` as its prototype. `isJsonObject`
6
+ * answers a third question, about what a value holds all the way down.
7
+ */
8
+ /** What JSON can hold: the members of a parsed document. */
9
+ export type JsonValue = string | number | boolean | null | JsonValue[] | JsonObject;
10
+ /** An object whose every member is a JSON value. */
11
+ export type JsonObject = {
12
+ [key: string]: JsonValue;
13
+ };
14
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
15
+ /**
16
+ * Could `value` have been written as an object literal? Only
17
+ * `Object.prototype` or `null` as its prototype passes, so a Date, a Map and a
18
+ * class instance do not.
19
+ */
20
+ export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
21
+ /**
22
+ * An object that holds `key`, so `value[key]` reads without a cast. The
23
+ * member's type is `unknown`: the guard proves it is there, not what it is.
24
+ */
25
+ export declare function hasProperty<TKey extends string>(value: unknown, key: TKey): value is Record<TKey, unknown>;
26
+ /**
27
+ * Could `await value` wait on it? A promise, or any object with a `then`
28
+ * function. A bare function is refused even when it has no `then`.
29
+ */
30
+ export declare function isThenable(value: unknown): value is PromiseLike<unknown>;
31
+ /**
32
+ * True when `value` is an object JSON could have produced: plain objects and
33
+ * arrays down to strings, finite numbers, booleans and null. `NaN` and
34
+ * `Infinity` are refused, because `JSON.stringify` turns them into `null`, and
35
+ * so is a value that contains itself.
36
+ */
37
+ export declare function isJsonObject(value: unknown): value is JsonObject;
38
+ /**
39
+ * Could `new Headers(value)` take it? A `Headers`, a list of `[name, value]`
40
+ * pairs, or a record whose every value is a string. A pair list holding a
41
+ * non-string, and a record holding a number or a null, are refused: `Headers`
42
+ * would read them as names and values it was never given.
43
+ */
44
+ export declare function isHeadersInit(value: unknown): value is HeadersInit;
package/dist/guards.js ADDED
@@ -0,0 +1,77 @@
1
+ // src/guards.ts
2
+ function isRecord(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4
+ }
5
+ /**
6
+ * Could `value` have been written as an object literal? Only
7
+ * `Object.prototype` or `null` as its prototype passes, so a Date, a Map and a
8
+ * class instance do not.
9
+ */
10
+ function isPlainObject(value) {
11
+ if (!isRecord(value)) return false;
12
+ const proto = Object.getPrototypeOf(value);
13
+ return proto === Object.prototype || proto === null;
14
+ }
15
+ /**
16
+ * An object that holds `key`, so `value[key]` reads without a cast. The
17
+ * member's type is `unknown`: the guard proves it is there, not what it is.
18
+ */
19
+ function hasProperty(value, key) {
20
+ return isRecord(value) && key in value;
21
+ }
22
+ /**
23
+ * Could `await value` wait on it? A promise, or any object with a `then`
24
+ * function. A bare function is refused even when it has no `then`.
25
+ */
26
+ function isThenable(value) {
27
+ return hasProperty(value, "then") && typeof value.then === "function";
28
+ }
29
+ /**
30
+ * True when `value` is an object JSON could have produced: plain objects and
31
+ * arrays down to strings, finite numbers, booleans and null. `NaN` and
32
+ * `Infinity` are refused, because `JSON.stringify` turns them into `null`, and
33
+ * so is a value that contains itself.
34
+ */
35
+ function isJsonObject(value) {
36
+ return isPlainObject(value) && isJsonValue(value, /* @__PURE__ */ new WeakSet());
37
+ }
38
+ /**
39
+ * Could `new Headers(value)` take it? A `Headers`, a list of `[name, value]`
40
+ * pairs, or a record whose every value is a string. A pair list holding a
41
+ * non-string, and a record holding a number or a null, are refused: `Headers`
42
+ * would read them as names and values it was never given.
43
+ */
44
+ function isHeadersInit(value) {
45
+ if (value instanceof Headers) return true;
46
+ if (Array.isArray(value)) return value.every(isHeaderPair);
47
+ return isPlainObject(value) && Object.values(value).every((entry) => typeof entry === "string");
48
+ }
49
+ /** One `[name, value]` header pair. A longer or shorter array is not one. */
50
+ function isHeaderPair(value) {
51
+ return Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "string";
52
+ }
53
+ /**
54
+ * The deep half of `isJsonObject`. `path` holds the containers `value` sits
55
+ * inside, so a value that contains itself is refused instead of walked
56
+ * forever; a shared sub-object, which no container holds twice on one path,
57
+ * still passes.
58
+ */
59
+ function isJsonValue(value, path) {
60
+ if (value === null) return true;
61
+ if (typeof value === "string" || typeof value === "boolean") return true;
62
+ if (typeof value === "number") return Number.isFinite(value);
63
+ if (Array.isArray(value)) {
64
+ if (path.has(value)) return false;
65
+ path.add(value);
66
+ const held = value.every((item) => isJsonValue(item, path));
67
+ path.delete(value);
68
+ return held;
69
+ }
70
+ if (!isPlainObject(value)) return false;
71
+ if (path.has(value)) return false;
72
+ path.add(value);
73
+ const held = Object.values(value).every((item) => isJsonValue(item, path));
74
+ path.delete(value);
75
+ return held;
76
+ }
77
+ export { hasProperty, isHeadersInit, isJsonObject, isPlainObject, isRecord, isThenable };
@@ -1,31 +1,36 @@
1
1
  import { defineMessages } from "./messages.js";
2
- const defaultMessages = defineMessages({
3
- "chelone.auth.auth_check_error": "Please login to continue",
4
- "chelone.auth.logout": "Logout",
5
- "chelone.message.access_denied": "You don't have access to this page",
6
- "chelone.message.authentication_error": "The authentication server returned an error",
7
- "chelone.message.invalid_form": "The form is not valid. Please check for errors",
8
- "chelone.message.loading": "The page is loading, just a moment please",
9
- "chelone.message.not_found": "Either you typed a wrong URL, or you followed a bad link.",
10
- "chelone.message.select_all_limit_reached": "There are too many elements to select them all. Only the first {max} elements were selected",
11
- "chelone.message.unsaved_changes": "Some of your changes weren't saved. Are you sure you want to ignore them?",
12
- "chelone.notification.created": "Element created",
13
- "chelone.notification.deleted": "Element deleted",
14
- "chelone.notification.http_error": "Server communication error",
15
- "chelone.notification.item_doesnt_exist": "Element does not exist",
16
- "chelone.notification.logged_out": "Your session has ended, please reconnect",
17
- "chelone.notification.not_authorized": "You are not authorized to access this resource",
18
- "chelone.notification.updated": "Element updated",
19
- "chelone.validation.email": "Must be a valid email",
20
- "chelone.validation.maxLength": "Must be {max} characters or less",
21
- "chelone.validation.maxValue": "Must be {max} or less",
22
- "chelone.validation.minLength": "Must be {min} characters at least",
23
- "chelone.validation.minValue": "Must be at least {min}",
24
- "chelone.validation.number": "Must be a number",
25
- "chelone.validation.oneOf": "Must be one of: {options}",
26
- "chelone.validation.regex": "Must match a specific format (regexp): {pattern}",
27
- "chelone.validation.required": "Required"
2
+ // src/i18n/default-messages.ts
3
+ /**
4
+ * English defaults for every i18n key the core controllers emit. Apps merge
5
+ * these under their own catalogs (`{ ...defaultMessages, ...appMessages }`);
6
+ * resource-scoped keys (`resources.{name}.notifications.{event}`) override
7
+ * them through the translate-fallback pattern.
8
+ */
9
+ var defaultMessages = defineMessages({
10
+ "chelone.auth.auth_check_error": "Please login to continue",
11
+ "chelone.auth.logout": "Logout",
12
+ "chelone.message.access_denied": "You don't have access to this page",
13
+ "chelone.message.authentication_error": "The authentication server returned an error",
14
+ "chelone.message.invalid_form": "The form is not valid. Please check for errors",
15
+ "chelone.message.loading": "The page is loading, just a moment please",
16
+ "chelone.message.not_found": "Either you typed a wrong URL, or you followed a bad link.",
17
+ "chelone.message.select_all_limit_reached": "There are too many elements to select them all. Only the first {max} elements were selected",
18
+ "chelone.message.unsaved_changes": "Some of your changes weren't saved. Are you sure you want to ignore them?",
19
+ "chelone.notification.created": "Element created",
20
+ "chelone.notification.deleted": "Element deleted",
21
+ "chelone.notification.http_error": "Server communication error",
22
+ "chelone.notification.item_doesnt_exist": "Element does not exist",
23
+ "chelone.notification.logged_out": "Your session has ended, please reconnect",
24
+ "chelone.notification.not_authorized": "You are not authorized to access this resource",
25
+ "chelone.notification.updated": "Element updated",
26
+ "chelone.validation.email": "Must be a valid email",
27
+ "chelone.validation.maxLength": "Must be {max} characters or less",
28
+ "chelone.validation.maxValue": "Must be {max} or less",
29
+ "chelone.validation.minLength": "Must be {min} characters at least",
30
+ "chelone.validation.minValue": "Must be at least {min}",
31
+ "chelone.validation.number": "Must be a number",
32
+ "chelone.validation.oneOf": "Must be one of: {options}",
33
+ "chelone.validation.regex": "Must match a specific format (regexp): {pattern}",
34
+ "chelone.validation.required": "Required"
28
35
  });
29
- export {
30
- defaultMessages
31
- };
36
+ export { defaultMessages };
@@ -181,6 +181,178 @@ export declare const englishMessages: {
181
181
  readonly "ra.saved_queries.new_label": "Save current query";
182
182
  readonly "ra.saved_queries.query_name": "Query name";
183
183
  readonly "ra.saved_queries.remove_label_with_name": "Remove saved query \"{name}\"";
184
+ readonly "chelone.assistant.close": "Close";
185
+ readonly "chelone.assistant.confirm": "Run {name}?";
186
+ readonly "chelone.assistant.error": "Something went wrong.";
187
+ readonly "chelone.assistant.placeholder": "Ask…";
188
+ readonly "chelone.assistant.retry": "Retry";
189
+ readonly "chelone.assistant.send": "Send";
190
+ readonly "chelone.assistant.stop": "Stop";
191
+ readonly "chelone.assistant.thinking": "Thinking…";
192
+ readonly "chelone.assistant.trigger": "Ask";
193
+ readonly "chelone.assistant.welcome": "Hi! Ask me anything.";
194
+ readonly "chelone.approval.already_approved": "You already approved";
195
+ readonly "chelone.approval.approve": "Approve";
196
+ readonly "chelone.approval.complete": "Fully approved ({count} of {required})";
197
+ readonly "chelone.approval.count": "{count} of {required}";
198
+ readonly "chelone.approval.fully_approved": "Fully approved ({count} of {required})";
199
+ readonly "chelone.approval.reject": "Reject";
200
+ readonly "chelone.approval_queue.confirm_reject": "Confirm reject";
201
+ readonly "chelone.approval_queue.empty": "No items waiting for approval";
202
+ readonly "chelone.approval_queue.reason": "Reason";
203
+ readonly "chelone.approval_queue.rejected": "Rejected";
204
+ readonly "chelone.block_editor.add_block": "Add block";
205
+ readonly "chelone.block_editor.chart.aggregate": "Aggregate";
206
+ readonly "chelone.block_editor.chart.avg": "Average";
207
+ readonly "chelone.block_editor.chart.bar": "Bar";
208
+ readonly "chelone.block_editor.chart.category": "Category field";
209
+ readonly "chelone.block_editor.chart.count": "Count";
210
+ readonly "chelone.block_editor.chart.description": "Aggregate a resource into a chart";
211
+ readonly "chelone.block_editor.chart.label": "Chart";
212
+ readonly "chelone.block_editor.chart.line": "Line";
213
+ readonly "chelone.block_editor.chart.pie": "Pie";
214
+ readonly "chelone.block_editor.chart.sum": "Sum";
215
+ readonly "chelone.block_editor.chart.type": "Chart type";
216
+ readonly "chelone.block_editor.chart.value": "Value field";
217
+ readonly "chelone.block_editor.data.choose_resource": "Choose a resource";
218
+ readonly "chelone.block_editor.data.fields": "Fields";
219
+ readonly "chelone.block_editor.data.fields_hint": "title, status";
220
+ readonly "chelone.block_editor.data.resource": "Resource";
221
+ readonly "chelone.block_editor.drag": "Drag to move";
222
+ readonly "chelone.block_editor.embed.empty": "Add a YouTube or Vimeo link";
223
+ readonly "chelone.block_editor.embed.title": "Embedded video";
224
+ readonly "chelone.block_editor.image.alt": "Alt text";
225
+ readonly "chelone.block_editor.image.empty": "Add an image";
226
+ readonly "chelone.block_editor.image.too_large": "Choose an image file up to 5 MB";
227
+ readonly "chelone.block_editor.image.upload": "Upload image";
228
+ readonly "chelone.block_editor.image.url": "Image URL";
229
+ readonly "chelone.block_editor.image.width": "Width (%)";
230
+ readonly "chelone.block_editor.no_blocks": "No blocks found";
231
+ readonly "chelone.block_editor.placeholder": "Type / for blocks";
232
+ readonly "chelone.block_editor.recordList.description": "Embed a live list from a resource";
233
+ readonly "chelone.block_editor.recordList.label": "Record list";
234
+ readonly "chelone.block_editor.recordList.no_records": "No records";
235
+ readonly "chelone.block_editor.recordList.per_page": "Rows";
236
+ readonly "chelone.block_editor.referenceRecord.card": "Card";
237
+ readonly "chelone.block_editor.referenceRecord.description": "Embed a live record";
238
+ readonly "chelone.block_editor.referenceRecord.id": "Record id";
239
+ readonly "chelone.block_editor.referenceRecord.inline": "Inline";
240
+ readonly "chelone.block_editor.referenceRecord.label": "Reference record";
241
+ readonly "chelone.block_editor.referenceRecord.layout": "Layout";
242
+ readonly "chelone.block_editor.search": "Search blocks";
243
+ readonly "chelone.block_editor.toolbar.configure": "Configure";
244
+ readonly "chelone.block_editor.toolbar.delete": "Delete";
245
+ readonly "chelone.block_editor.toolbar.duplicate": "Duplicate";
246
+ readonly "chelone.block_editor.toolbar.label": "Block actions";
247
+ readonly "chelone.block_editor.toolbar.move_down": "Move down";
248
+ readonly "chelone.block_editor.toolbar.move_up": "Move up";
249
+ readonly "chelone.block_editor.unknown": "Unknown block: {type}. It is kept on save.";
250
+ readonly "chelone.chart.empty": "No data";
251
+ readonly "chelone.command_menu.account": "Account";
252
+ readonly "chelone.command_menu.action.logout": "Log out";
253
+ readonly "chelone.command_menu.action.refresh": "Refresh data";
254
+ readonly "chelone.command_menu.action.theme_dark": "Switch to dark theme";
255
+ readonly "chelone.command_menu.action.theme_light": "Switch to light theme";
256
+ readonly "chelone.command_menu.action.theme_system": "Use system theme";
257
+ readonly "chelone.command_menu.actions": "Actions";
258
+ readonly "chelone.command_menu.close": "Close";
259
+ readonly "chelone.command_menu.description": "Jump to a page or record, or run an action.";
260
+ readonly "chelone.command_menu.empty": "No results found.";
261
+ readonly "chelone.command_menu.footer.close": "Close";
262
+ readonly "chelone.command_menu.footer.navigate": "Navigate";
263
+ readonly "chelone.command_menu.footer.select": "Select";
264
+ readonly "chelone.command_menu.navigate": "Navigate";
265
+ readonly "chelone.command_menu.placeholder": "Search or run a command...";
266
+ readonly "chelone.command_menu.recent": "Recent";
267
+ readonly "chelone.command_menu.refresh": "Refresh";
268
+ readonly "chelone.command_menu.resources": "Resources";
269
+ readonly "chelone.command_menu.select": "Select";
270
+ readonly "chelone.command_menu.theme": "Theme";
271
+ readonly "chelone.command_menu.title": "Command menu";
272
+ readonly "chelone.comments.anonymous": "anonymous";
273
+ readonly "chelone.comments.empty": "No comments yet. Be the first.";
274
+ readonly "chelone.comments.load_failed": "Could not load the comments";
275
+ readonly "chelone.comments.mark_resolved": "Mark resolved";
276
+ readonly "chelone.comments.placeholder": "Write a comment…";
277
+ readonly "chelone.comments.post": "Post";
278
+ readonly "chelone.comments.resolved": "Resolved {time}";
279
+ readonly "chelone.comments.showing": "Showing the first {shown} of {total} comments";
280
+ readonly "chelone.comments.showing_first": "Showing the first {shown} of {total} comments";
281
+ readonly "chelone.devtools.clear": "Clear";
282
+ readonly "chelone.devtools.details": "Details";
283
+ readonly "chelone.devtools.empty": "No calls yet";
284
+ readonly "chelone.devtools.hide": "Hide";
285
+ readonly "chelone.devtools.params": "Params";
286
+ readonly "chelone.devtools.result": "Result";
287
+ readonly "chelone.devtools.show": "Show";
288
+ readonly "chelone.devtools.title": "Data provider";
289
+ readonly "chelone.diff_viewer.after": "After";
290
+ readonly "chelone.diff_viewer.before": "Before";
291
+ readonly "chelone.diff_viewer.empty": "(empty)";
292
+ readonly "chelone.diff_viewer.field": "Field";
293
+ readonly "chelone.guesser.no_schema.message": "Register a Zod schema for {resource} with defineResources so this page can be generated.";
294
+ readonly "chelone.guesser.no_schema.title": "No schema registered";
295
+ readonly "chelone.i18n_key_editor.copied": "Copied";
296
+ readonly "chelone.i18n_key_editor.copy_failed": "Could not copy the translations";
297
+ readonly "chelone.i18n_key_editor.empty": "No missing keys yet";
298
+ readonly "chelone.i18n_key_editor.export": "Export";
299
+ readonly "chelone.i18n_key_editor.hide": "Hide";
300
+ readonly "chelone.i18n_key_editor.show": "Show";
301
+ readonly "chelone.i18n_key_editor.title": "Missing keys ({count})";
302
+ readonly "chelone.inspector.configure_mode": "Configure mode";
303
+ readonly "chelone.inspector.customize": "Customize";
304
+ readonly "chelone.inspector.drag_field": "Drag to reorder";
305
+ readonly "chelone.inspector.empty": "Pick an outlined element to configure it";
306
+ readonly "chelone.inspector.inputs_title": "Form";
307
+ readonly "chelone.inspector.title": "Inspector";
308
+ readonly "chelone.job_monitor.attempts": "Attempts: {attempts}";
309
+ readonly "chelone.job_monitor.empty": "No {status} jobs";
310
+ readonly "chelone.job_monitor.hide_payload": "Hide payload";
311
+ readonly "chelone.job_monitor.no_type": "(no type)";
312
+ readonly "chelone.job_monitor.retry": "Retry";
313
+ readonly "chelone.job_monitor.show_payload": "Show payload";
314
+ readonly "chelone.job_monitor.title": "Jobs";
315
+ readonly "chelone.kanban_board.empty": "No items";
316
+ readonly "chelone.kanban_board.move": "Move {title}";
317
+ readonly "chelone.lock.locked_by": "Locked by {identity}";
318
+ readonly "chelone.navigation.load_more": "Load more";
319
+ readonly "chelone.navigation.no_more_rows": "No more rows";
320
+ readonly "chelone.onboarding_tour.back": "Back";
321
+ readonly "chelone.onboarding_tour.finish": "Finish";
322
+ readonly "chelone.onboarding_tour.next": "Next";
323
+ readonly "chelone.onboarding_tour.skip": "Skip";
324
+ readonly "chelone.permission_matrix.all": "All";
325
+ readonly "chelone.permission_matrix.cell": "{role} {action} {resource}";
326
+ readonly "chelone.permission_matrix.inherited": "Granted by a wildcard";
327
+ readonly "chelone.permission_matrix.no_roles": "No roles defined";
328
+ readonly "chelone.permission_matrix.resource": "Resource";
329
+ readonly "chelone.pivot_grid.no_value": "(none)";
330
+ readonly "chelone.pivot_grid.total": "Total";
331
+ readonly "chelone.record_timeline.empty": "No activity yet";
332
+ readonly "chelone.rich_text.block_type": "Block type";
333
+ readonly "chelone.rich_text.color": "Text color";
334
+ readonly "chelone.rich_text.image": "Image";
335
+ readonly "chelone.rich_text.image.close": "Close";
336
+ readonly "chelone.rich_text.image.error": "The image could not be loaded";
337
+ readonly "chelone.rich_text.image.resize_left": "Resize image from the left edge";
338
+ readonly "chelone.rich_text.image.resize_right": "Resize image from the right edge";
339
+ readonly "chelone.rich_text.image.uploading": "Uploading image";
340
+ readonly "chelone.rich_text.image.view": "View image";
341
+ readonly "chelone.rich_text.image_apply": "Apply";
342
+ readonly "chelone.rich_text.image_upload": "Upload";
343
+ readonly "chelone.rich_text.image_url": "Image URL";
344
+ readonly "chelone.rich_text.invalid_image_url": "Enter a link to an image";
345
+ readonly "chelone.rich_text.invalid_url": "Enter a web, mail or phone link";
346
+ readonly "chelone.rich_text.link_apply": "Apply";
347
+ readonly "chelone.rich_text.link_remove": "Remove";
348
+ readonly "chelone.rich_text.link_url": "URL";
349
+ readonly "chelone.rich_text.paragraph": "Paragraph";
350
+ readonly "chelone.rich_text.toolbar": "Formatting";
351
+ readonly "chelone.action.format": "Format";
352
+ readonly "chelone.status_transition.change": "Change status";
353
+ readonly "chelone.status_transition.confirm_content": "Move to {status}?";
354
+ readonly "chelone.status_transition.confirm_title": "Change status?";
355
+ readonly "chelone.validation.invalid_json": "Invalid JSON: {message}";
184
356
  readonly "chelone.map.load_failed": "The map could not be loaded";
185
357
  readonly "chelone.map.no_coordinates": "No coordinates";
186
358
  readonly "chelone.map.no_geometry": "No geometry";