@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.
- package/dist/assistant/assistant-session.d.ts +6 -0
- package/dist/assistant/assistant-session.js +204 -181
- package/dist/assistant/echo-transport.js +26 -29
- package/dist/assistant/http-transport.d.ts +10 -0
- package/dist/assistant/http-transport.js +98 -0
- package/dist/assistant/types.d.ts +1 -7
- package/dist/auth/access-control.d.ts +13 -5
- package/dist/auth/access-control.js +25 -21
- package/dist/auth/auth-options.d.ts +23 -17
- package/dist/auth/auth-options.js +82 -48
- package/dist/auth/permission-matrix.d.ts +12 -0
- package/dist/auth/permission-matrix.js +67 -0
- package/dist/auth/types.d.ts +14 -4
- package/dist/block-editor/block-document.d.ts +64 -0
- package/dist/block-editor/block-document.js +147 -0
- package/dist/block-editor/data-blocks.d.ts +63 -0
- package/dist/block-editor/data-blocks.js +117 -0
- package/dist/chart/chart-data.js +46 -44
- package/dist/command-menu/hotkey.js +58 -47
- package/dist/command-menu/recents.d.ts +4 -0
- package/dist/command-menu/recents.js +12 -11
- package/dist/command-menu/registry.d.ts +9 -5
- package/dist/command-menu/registry.js +36 -46
- package/dist/controller/calendar-dates.d.ts +12 -0
- package/dist/controller/calendar-dates.js +94 -113
- package/dist/controller/calendar-events.js +93 -88
- package/dist/controller/client-list-controller.d.ts +2 -2
- package/dist/controller/client-list-controller.js +251 -254
- package/dist/controller/data-table-columns.d.ts +2 -0
- package/dist/controller/data-table-columns.js +50 -56
- package/dist/controller/deep-equal.d.ts +1 -0
- package/dist/controller/deep-equal.js +14 -0
- package/dist/controller/filter-toggle.js +36 -44
- package/dist/controller/in-place-editor.d.ts +43 -0
- package/dist/controller/in-place-editor.js +43 -0
- package/dist/controller/infinite-list-controller.js +219 -189
- package/dist/controller/inspector.d.ts +55 -0
- package/dist/controller/inspector.js +70 -0
- package/dist/controller/job-monitor.d.ts +10 -4
- package/dist/controller/job-monitor.js +46 -47
- package/dist/controller/kanban-board.js +45 -24
- package/dist/controller/list-controller.d.ts +8 -5
- package/dist/controller/list-controller.js +447 -400
- package/dist/controller/list-params.js +96 -87
- package/dist/controller/pivot-grid.d.ts +4 -4
- package/dist/controller/pivot-grid.js +89 -95
- package/dist/controller/prev-next.d.ts +2 -2
- package/dist/controller/prev-next.js +74 -54
- package/dist/controller/record-controllers.d.ts +14 -6
- package/dist/controller/record-controllers.js +288 -257
- package/dist/controller/record-diff.d.ts +21 -0
- package/dist/controller/record-diff.js +50 -0
- package/dist/controller/record-timeline.d.ts +5 -5
- package/dist/controller/record-timeline.js +42 -30
- package/dist/controller/record-tree.js +57 -47
- package/dist/controller/record-workflow.d.ts +38 -16
- package/dist/controller/record-workflow.js +85 -64
- package/dist/controller/reference-many-controller.d.ts +2 -0
- package/dist/controller/reference-many-controller.js +199 -192
- package/dist/controller/reference-one-controller.d.ts +1 -1
- package/dist/controller/reference-one-controller.js +63 -56
- package/dist/controller/saved-queries.js +104 -91
- package/dist/controller/translate-fallback.js +10 -6
- package/dist/csv/export.d.ts +4 -3
- package/dist/csv/export.js +43 -40
- package/dist/csv/import-controller.d.ts +4 -0
- package/dist/csv/import-controller.js +189 -169
- package/dist/csv/match-headers.js +29 -22
- package/dist/csv/parse-with.js +60 -54
- package/dist/csv/run-import.js +69 -72
- package/dist/csv/validate-rows.d.ts +1 -1
- package/dist/csv/validate-rows.js +65 -52
- package/dist/data/cache-ops.d.ts +5 -4
- package/dist/data/cache-ops.js +208 -188
- package/dist/data/combine-data-providers.js +25 -23
- package/dist/data/data-provider-log.d.ts +45 -0
- package/dist/data/data-provider-log.js +93 -0
- package/dist/data/errors.js +14 -10
- package/dist/data/fake-provider.d.ts +6 -3
- package/dist/data/fake-provider.js +135 -114
- package/dist/data/fetch-utils.js +61 -44
- package/dist/data/filter-branch.d.ts +5 -0
- package/dist/data/filter-branch.js +10 -0
- package/dist/data/get-many-aggregate.js +84 -76
- package/dist/data/http-error.js +17 -12
- package/dist/data/keys.js +50 -36
- package/dist/data/mutation-options.d.ts +14 -9
- package/dist/data/mutation-options.js +93 -109
- package/dist/data/query-options.js +73 -68
- package/dist/data/remove-empty.d.ts +3 -0
- package/dist/data/remove-empty.js +11 -0
- package/dist/data/undoable.d.ts +2 -2
- package/dist/data/undoable.js +190 -174
- package/dist/data/with-lifecycle-callbacks.d.ts +45 -17
- package/dist/data/with-lifecycle-callbacks.js +66 -52
- package/dist/environment/application-update-store.js +58 -55
- package/dist/environment/offline-store.js +21 -21
- package/dist/form/array-binding.d.ts +30 -11
- package/dist/form/array-binding.js +184 -166
- package/dist/form/choice-ids.d.ts +7 -0
- package/dist/form/choice-ids.js +11 -0
- package/dist/form/choices-controller.d.ts +22 -2
- package/dist/form/choices-controller.js +315 -275
- package/dist/form/date-format.d.ts +38 -0
- package/dist/form/date-format.js +89 -0
- package/dist/form/dirty-values.d.ts +2 -2
- package/dist/form/dirty-values.js +22 -11
- package/dist/form/duration.d.ts +22 -0
- package/dist/form/duration.js +49 -0
- package/dist/form/edit-create-form.d.ts +12 -5
- package/dist/form/edit-create-form.js +243 -188
- package/dist/form/event-value.d.ts +6 -0
- package/dist/form/event-value.js +17 -0
- package/dist/form/field-error.d.ts +14 -0
- package/dist/form/field-error.js +28 -0
- package/dist/form/field-name.d.ts +20 -0
- package/dist/form/field-name.js +6 -0
- package/dist/form/filter-form-values.js +63 -49
- package/dist/form/form-controller.d.ts +9 -1
- package/dist/form/form-controller.js +165 -160
- package/dist/form/form-groups.d.ts +4 -3
- package/dist/form/form-groups.js +79 -79
- package/dist/form/form-handle.d.ts +175 -0
- package/dist/form/form-handle.js +68 -0
- package/dist/form/input-binding.d.ts +56 -31
- package/dist/form/input-binding.js +171 -118
- package/dist/form/input-values.d.ts +140 -0
- package/dist/form/input-values.js +206 -0
- package/dist/form/json-text.d.ts +11 -0
- package/dist/form/json-text.js +62 -37
- package/dist/form/save-pipeline.d.ts +6 -8
- package/dist/form/save-pipeline.js +91 -82
- package/dist/form/set-form-values.d.ts +6 -0
- package/dist/form/set-form-values.js +10 -0
- package/dist/form/source.js +97 -65
- package/dist/form/text-of.d.ts +2 -0
- package/dist/form/text-of.js +7 -0
- package/dist/form/validators.d.ts +58 -19
- package/dist/form/validators.js +97 -71
- package/dist/geo/bbox.d.ts +5 -4
- package/dist/geo/bbox.js +69 -48
- package/dist/geo/bounds.d.ts +14 -3
- package/dist/geo/bounds.js +98 -68
- package/dist/geo/constraints.js +88 -93
- package/dist/geo/coordinates.d.ts +10 -0
- package/dist/geo/coordinates.js +44 -23
- package/dist/geo/editor.d.ts +13 -13
- package/dist/geo/editor.js +176 -153
- package/dist/geo/geocoding.d.ts +4 -4
- package/dist/geo/geocoding.js +38 -41
- package/dist/geo/geojson.d.ts +12 -74
- package/dist/geo/geojson.js +52 -40
- package/dist/geo/geometry-math.d.ts +4 -4
- package/dist/geo/geometry-math.js +100 -93
- package/dist/geo/index.d.ts +9 -8
- package/dist/geo/map-layers.d.ts +42 -7
- package/dist/geo/map-layers.js +88 -62
- package/dist/geo/map-style.d.ts +12 -0
- package/dist/geo/map-style.js +43 -32
- package/dist/geo/messages.js +48 -45
- package/dist/geo/nominatim.js +88 -80
- package/dist/geo/osm-presets.d.ts +4 -3
- package/dist/geo/osm-presets.js +108 -86
- package/dist/geo/osm-tags.js +14 -12
- package/dist/geo/overpass.d.ts +14 -2
- package/dist/geo/overpass.js +83 -90
- package/dist/geo/shape-value.d.ts +9 -5
- package/dist/geo/shape-value.js +169 -146
- package/dist/geo/snap-to-roads.d.ts +3 -3
- package/dist/geo/snap-to-roads.js +55 -50
- package/dist/geo/throttle.js +36 -39
- package/dist/guards.d.ts +44 -0
- package/dist/guards.js +77 -0
- package/dist/i18n/default-messages.js +34 -29
- package/dist/i18n/english-messages.d.ts +172 -0
- package/dist/i18n/english-messages.js +359 -189
- package/dist/i18n/i18n.d.ts +2 -2
- package/dist/i18n/i18n.js +47 -60
- package/dist/i18n/inflection.d.ts +34 -0
- package/dist/i18n/inflection.js +82 -0
- package/dist/i18n/messages.d.ts +10 -2
- package/dist/i18n/messages.js +17 -4
- package/dist/i18n/missing-keys.d.ts +4 -0
- package/dist/i18n/missing-keys.js +70 -62
- package/dist/i18n/translatable.d.ts +16 -1
- package/dist/i18n/translatable.js +40 -47
- package/dist/index.d.ts +87 -39
- package/dist/index.js +54 -301
- package/dist/json/deep-equal.d.ts +8 -0
- package/dist/json/deep-equal.js +24 -0
- package/dist/json/strip-json-comments.js +38 -42
- package/dist/noop.d.ts +2 -0
- package/dist/noop.js +4 -0
- package/dist/notification/error-message.d.ts +2 -0
- package/dist/notification/error-message.js +10 -0
- package/dist/notification/notification-store.d.ts +3 -2
- package/dist/notification/notification-store.js +41 -45
- package/dist/onboarding-tour/placement.d.ts +2 -0
- package/dist/onboarding-tour/placement.js +65 -78
- package/dist/onboarding-tour/tour-controller.js +46 -54
- package/dist/realtime/add-events-for-mutations.js +75 -81
- package/dist/realtime/announce-lock.js +16 -13
- package/dist/realtime/broadcast-channel-transport.js +65 -59
- package/dist/realtime/copy-members.js +22 -14
- package/dist/realtime/in-memory-lock-provider.js +40 -48
- package/dist/realtime/live.js +95 -101
- package/dist/realtime/lock-options.js +16 -16
- package/dist/realtime/lock-session.js +91 -78
- package/dist/realtime/memory-transport.js +25 -25
- package/dist/realtime/presence.js +120 -122
- package/dist/realtime/realtime-data-provider.d.ts +10 -0
- package/dist/realtime/realtime-data-provider.js +45 -42
- package/dist/realtime/reconnect-backoff.js +17 -0
- package/dist/realtime/sse-transport.d.ts +31 -0
- package/dist/realtime/sse-transport.js +235 -0
- package/dist/realtime/status-store.js +23 -28
- package/dist/realtime/topic-hub.js +62 -71
- package/dist/realtime/topics.js +10 -12
- package/dist/realtime/types.js +10 -12
- package/dist/realtime/unread-count.js +21 -21
- package/dist/realtime/websocket-transport.d.ts +32 -0
- package/dist/realtime/websocket-transport.js +306 -0
- package/dist/resource/describe-resource.d.ts +2 -0
- package/dist/resource/describe-resource.js +247 -219
- package/dist/resource/get-at-path.js +29 -14
- package/dist/resource/identifier.d.ts +18 -0
- package/dist/resource/identifier.js +27 -0
- package/dist/resource/record.d.ts +4 -0
- package/dist/resource/record.js +10 -0
- package/dist/resource/register.d.ts +7 -0
- package/dist/resource/registry-store.d.ts +45 -15
- package/dist/resource/registry-store.js +67 -60
- package/dist/resource/registry.d.ts +10 -0
- package/dist/resource/registry.js +8 -4
- package/dist/resource/source-path.d.ts +23 -2
- package/dist/rich-text/rich-text-extras.d.ts +134 -0
- package/dist/rich-text/rich-text-extras.js +181 -0
- package/dist/rich-text/rich-text-image.d.ts +124 -0
- package/dist/rich-text/rich-text-image.js +163 -0
- package/dist/rich-text/rich-text.d.ts +6 -0
- package/dist/rich-text/rich-text.js +125 -88
- package/dist/router/location.d.ts +24 -4
- package/dist/router/location.js +43 -18
- package/dist/router/match.js +47 -39
- package/dist/router/paths.js +40 -34
- package/dist/router/record-from-location.d.ts +1 -1
- package/dist/router/record-from-location.js +25 -17
- package/dist/store/adapters.js +51 -55
- package/dist/store/micro-store.js +57 -59
- package/dist/store/shallow-equal.d.ts +12 -0
- package/dist/store/shallow-equal.js +20 -0
- package/dist/store/store.js +54 -57
- package/dist/ui-defaults.d.ts +15 -0
- package/dist/ui-defaults.js +17 -0
- package/package.json +13 -11
|
@@ -1,52 +1,57 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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 };
|
package/dist/geo/throttle.js
CHANGED
|
@@ -1,45 +1,42 @@
|
|
|
1
|
+
// src/geo/throttle.ts
|
|
1
2
|
function abortError() {
|
|
2
|
-
|
|
3
|
+
return new DOMException("Aborted", "AbortError");
|
|
3
4
|
}
|
|
4
5
|
function timerSleep(ms, signal) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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 };
|
package/dist/guards.d.ts
ADDED
|
@@ -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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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";
|