@chelone/core 0.5.0 → 0.7.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 (253) hide show
  1. package/dist/assistant/assistant-session.d.ts +28 -0
  2. package/dist/assistant/assistant-session.js +208 -0
  3. package/dist/assistant/echo-transport.d.ts +7 -0
  4. package/dist/assistant/echo-transport.js +28 -0
  5. package/dist/assistant/http-transport.d.ts +10 -0
  6. package/dist/assistant/http-transport.js +98 -0
  7. package/dist/assistant/types.d.ts +54 -0
  8. package/dist/auth/access-control.d.ts +13 -5
  9. package/dist/auth/access-control.js +25 -21
  10. package/dist/auth/auth-options.d.ts +21 -17
  11. package/dist/auth/auth-options.js +80 -48
  12. package/dist/auth/permission-matrix.d.ts +12 -0
  13. package/dist/auth/permission-matrix.js +67 -0
  14. package/dist/auth/types.d.ts +14 -4
  15. package/dist/block-editor/block-document.d.ts +60 -0
  16. package/dist/block-editor/block-document.js +143 -0
  17. package/dist/block-editor/data-blocks.d.ts +63 -0
  18. package/dist/block-editor/data-blocks.js +117 -0
  19. package/dist/chart/chart-data.d.ts +25 -0
  20. package/dist/chart/chart-data.js +61 -0
  21. package/dist/command-menu/hotkey.js +58 -47
  22. package/dist/command-menu/recents.js +8 -11
  23. package/dist/command-menu/registry.d.ts +9 -5
  24. package/dist/command-menu/registry.js +36 -46
  25. package/dist/controller/calendar-dates.js +82 -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 +42 -0
  35. package/dist/controller/in-place-editor.js +42 -0
  36. package/dist/controller/infinite-list-controller.js +220 -190
  37. package/dist/controller/inspector.d.ts +49 -0
  38. package/dist/controller/inspector.js +64 -0
  39. package/dist/controller/job-monitor.d.ts +41 -0
  40. package/dist/controller/job-monitor.js +49 -0
  41. package/dist/controller/kanban-board.d.ts +2 -3
  42. package/dist/controller/kanban-board.js +43 -24
  43. package/dist/controller/list-controller.d.ts +5 -5
  44. package/dist/controller/list-controller.js +444 -400
  45. package/dist/controller/list-params.js +96 -87
  46. package/dist/controller/pivot-grid.d.ts +36 -0
  47. package/dist/controller/pivot-grid.js +99 -0
  48. package/dist/controller/prev-next.d.ts +2 -2
  49. package/dist/controller/prev-next.js +74 -54
  50. package/dist/controller/record-controllers.d.ts +14 -6
  51. package/dist/controller/record-controllers.js +288 -257
  52. package/dist/controller/record-diff.d.ts +21 -0
  53. package/dist/controller/record-diff.js +50 -0
  54. package/dist/controller/record-timeline.d.ts +35 -0
  55. package/dist/controller/record-timeline.js +48 -0
  56. package/dist/controller/record-tree.js +57 -47
  57. package/dist/controller/record-workflow.d.ts +38 -16
  58. package/dist/controller/record-workflow.js +85 -64
  59. package/dist/controller/reference-many-controller.js +198 -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 +2 -1
  65. package/dist/csv/export.js +43 -40
  66. package/dist/csv/import-controller.js +185 -169
  67. package/dist/csv/match-headers.js +29 -22
  68. package/dist/csv/parse-with.js +60 -54
  69. package/dist/csv/run-import.js +69 -72
  70. package/dist/csv/validate-rows.d.ts +1 -1
  71. package/dist/csv/validate-rows.js +65 -52
  72. package/dist/data/cache-ops.d.ts +5 -4
  73. package/dist/data/cache-ops.js +208 -190
  74. package/dist/data/combine-data-providers.js +25 -23
  75. package/dist/data/data-provider-log.d.ts +45 -0
  76. package/dist/data/data-provider-log.js +93 -0
  77. package/dist/data/errors.js +14 -10
  78. package/dist/data/fake-provider.d.ts +6 -3
  79. package/dist/data/fake-provider.js +129 -114
  80. package/dist/data/fetch-utils.js +61 -44
  81. package/dist/data/filter-branch.d.ts +5 -0
  82. package/dist/data/filter-branch.js +10 -0
  83. package/dist/data/get-many-aggregate.js +84 -76
  84. package/dist/data/http-error.js +17 -12
  85. package/dist/data/keys.js +50 -36
  86. package/dist/data/mutation-options.d.ts +14 -9
  87. package/dist/data/mutation-options.js +93 -109
  88. package/dist/data/query-options.js +73 -68
  89. package/dist/data/remove-empty.d.ts +3 -0
  90. package/dist/data/remove-empty.js +11 -0
  91. package/dist/data/undoable.d.ts +2 -2
  92. package/dist/data/undoable.js +190 -174
  93. package/dist/data/with-lifecycle-callbacks.d.ts +45 -17
  94. package/dist/data/with-lifecycle-callbacks.js +66 -52
  95. package/dist/environment/application-update-store.js +58 -55
  96. package/dist/environment/offline-store.js +21 -21
  97. package/dist/form/array-binding.d.ts +30 -11
  98. package/dist/form/array-binding.js +184 -166
  99. package/dist/form/choice-ids.d.ts +7 -0
  100. package/dist/form/choice-ids.js +11 -0
  101. package/dist/form/choices-controller.d.ts +3 -2
  102. package/dist/form/choices-controller.js +302 -275
  103. package/dist/form/date-format.d.ts +38 -0
  104. package/dist/form/date-format.js +89 -0
  105. package/dist/form/dirty-values.d.ts +2 -2
  106. package/dist/form/dirty-values.js +22 -11
  107. package/dist/form/duration.d.ts +22 -0
  108. package/dist/form/duration.js +49 -0
  109. package/dist/form/edit-create-form.d.ts +12 -5
  110. package/dist/form/edit-create-form.js +243 -188
  111. package/dist/form/event-value.d.ts +6 -0
  112. package/dist/form/event-value.js +17 -0
  113. package/dist/form/field-error.d.ts +14 -0
  114. package/dist/form/field-error.js +28 -0
  115. package/dist/form/field-name.d.ts +20 -0
  116. package/dist/form/field-name.js +6 -0
  117. package/dist/form/filter-form-values.js +63 -49
  118. package/dist/form/form-controller.d.ts +9 -1
  119. package/dist/form/form-controller.js +165 -160
  120. package/dist/form/form-groups.d.ts +4 -3
  121. package/dist/form/form-groups.js +79 -79
  122. package/dist/form/form-handle.d.ts +175 -0
  123. package/dist/form/form-handle.js +68 -0
  124. package/dist/form/input-binding.d.ts +56 -31
  125. package/dist/form/input-binding.js +169 -118
  126. package/dist/form/input-values.d.ts +130 -0
  127. package/dist/form/input-values.js +177 -0
  128. package/dist/form/json-text.js +51 -37
  129. package/dist/form/save-pipeline.d.ts +6 -8
  130. package/dist/form/save-pipeline.js +91 -82
  131. package/dist/form/set-form-values.d.ts +6 -0
  132. package/dist/form/set-form-values.js +10 -0
  133. package/dist/form/source.js +97 -65
  134. package/dist/form/text-of.d.ts +2 -0
  135. package/dist/form/text-of.js +7 -0
  136. package/dist/form/validators.d.ts +58 -19
  137. package/dist/form/validators.js +97 -71
  138. package/dist/geo/bbox.d.ts +5 -4
  139. package/dist/geo/bbox.js +69 -48
  140. package/dist/geo/bounds.d.ts +14 -3
  141. package/dist/geo/bounds.js +98 -68
  142. package/dist/geo/constraints.js +88 -93
  143. package/dist/geo/coordinates.js +31 -23
  144. package/dist/geo/editor.d.ts +13 -13
  145. package/dist/geo/editor.js +176 -153
  146. package/dist/geo/geocoding.d.ts +4 -4
  147. package/dist/geo/geocoding.js +38 -41
  148. package/dist/geo/geojson.d.ts +12 -74
  149. package/dist/geo/geojson.js +52 -40
  150. package/dist/geo/geometry-math.d.ts +4 -4
  151. package/dist/geo/geometry-math.js +100 -93
  152. package/dist/geo/index.d.ts +7 -6
  153. package/dist/geo/map-layers.d.ts +42 -7
  154. package/dist/geo/map-layers.js +88 -62
  155. package/dist/geo/map-style.js +31 -32
  156. package/dist/geo/messages.js +48 -45
  157. package/dist/geo/nominatim.js +88 -80
  158. package/dist/geo/osm-presets.d.ts +4 -3
  159. package/dist/geo/osm-presets.js +108 -86
  160. package/dist/geo/osm-tags.js +14 -12
  161. package/dist/geo/overpass.d.ts +14 -2
  162. package/dist/geo/overpass.js +83 -90
  163. package/dist/geo/shape-value.d.ts +9 -5
  164. package/dist/geo/shape-value.js +169 -146
  165. package/dist/geo/snap-to-roads.d.ts +3 -3
  166. package/dist/geo/snap-to-roads.js +55 -50
  167. package/dist/geo/throttle.js +36 -39
  168. package/dist/guards.d.ts +37 -0
  169. package/dist/guards.js +62 -0
  170. package/dist/i18n/default-messages.js +34 -29
  171. package/dist/i18n/english-messages.js +187 -189
  172. package/dist/i18n/i18n.d.ts +8 -2
  173. package/dist/i18n/i18n.js +47 -48
  174. package/dist/i18n/inflection.d.ts +34 -0
  175. package/dist/i18n/inflection.js +82 -0
  176. package/dist/i18n/messages.d.ts +10 -2
  177. package/dist/i18n/messages.js +17 -4
  178. package/dist/i18n/missing-keys.d.ts +19 -0
  179. package/dist/i18n/missing-keys.js +68 -0
  180. package/dist/i18n/translatable.d.ts +16 -1
  181. package/dist/i18n/translatable.js +40 -47
  182. package/dist/index.d.ts +96 -22
  183. package/dist/index.js +52 -257
  184. package/dist/json/deep-equal.d.ts +8 -0
  185. package/dist/json/deep-equal.js +24 -0
  186. package/dist/json/strip-json-comments.js +38 -42
  187. package/dist/noop.d.ts +2 -0
  188. package/dist/noop.js +4 -0
  189. package/dist/notification/error-message.d.ts +2 -0
  190. package/dist/notification/error-message.js +10 -0
  191. package/dist/notification/notification-store.d.ts +3 -2
  192. package/dist/notification/notification-store.js +41 -45
  193. package/dist/onboarding-tour/placement.d.ts +34 -0
  194. package/dist/onboarding-tour/placement.js +67 -0
  195. package/dist/onboarding-tour/tour-controller.d.ts +25 -0
  196. package/dist/onboarding-tour/tour-controller.js +50 -0
  197. package/dist/realtime/add-events-for-mutations.js +75 -81
  198. package/dist/realtime/announce-lock.d.ts +7 -0
  199. package/dist/realtime/announce-lock.js +18 -0
  200. package/dist/realtime/broadcast-channel-transport.d.ts +14 -0
  201. package/dist/realtime/broadcast-channel-transport.js +69 -0
  202. package/dist/realtime/copy-members.js +22 -14
  203. package/dist/realtime/in-memory-lock-provider.js +41 -60
  204. package/dist/realtime/live.js +95 -101
  205. package/dist/realtime/lock-options.js +16 -16
  206. package/dist/realtime/lock-session.js +91 -78
  207. package/dist/realtime/memory-transport.js +26 -67
  208. package/dist/realtime/presence.js +120 -122
  209. package/dist/realtime/realtime-data-provider.d.ts +10 -0
  210. package/dist/realtime/realtime-data-provider.js +45 -42
  211. package/dist/realtime/reconnect-backoff.d.ts +15 -0
  212. package/dist/realtime/reconnect-backoff.js +17 -0
  213. package/dist/realtime/sse-transport.d.ts +31 -0
  214. package/dist/realtime/sse-transport.js +235 -0
  215. package/dist/realtime/status-store.js +23 -28
  216. package/dist/realtime/topic-hub.d.ts +24 -0
  217. package/dist/realtime/topic-hub.js +66 -0
  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 +232 -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 +16 -1
  236. package/dist/rich-text/rich-text-extras.d.ts +132 -0
  237. package/dist/rich-text/rich-text-extras.js +179 -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 +62 -0
  241. package/dist/rich-text/rich-text.js +142 -0
  242. package/dist/router/location.d.ts +22 -4
  243. package/dist/router/location.js +41 -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/package.json +13 -11
@@ -1,193 +1,191 @@
1
1
  import { mapMessages } from "../geo/messages.js";
2
2
  import { defaultMessages } from "./default-messages.js";
3
3
  import { defineMessages } from "./messages.js";
4
- const englishMessages = defineMessages({
5
- ...defaultMessages,
6
- ...mapMessages,
7
- // Pages
8
- "ra.page.list": "{name}",
9
- "ra.page.create": "Create {name}",
10
- "ra.page.edit": "{name} {recordRepresentation}",
11
- "ra.page.show": "{name} {recordRepresentation}",
12
- "ra.page.dashboard": "Dashboard",
13
- "ra.page.error": "Something went wrong",
14
- "ra.page.not_found": "Not Found",
15
- "ra.page.loading": "Loading",
16
- "ra.page.empty": "No {name} yet.",
17
- "ra.page.access_denied": "Access denied",
18
- "ra.page.authentication_error": "Authentication error",
19
- // Actions
20
- "ra.action.add": "Add",
21
- "ra.action.add_filter": "Add filter",
22
- "ra.action.bulk_actions": {
23
- one: "1 item selected",
24
- other: "{count} items selected"
25
- },
26
- "ra.action.cancel": "Cancel",
27
- "ra.action.clear_input_value": "Clear value",
28
- "ra.action.clear_search": "Clear search",
29
- "ra.action.close": "Close",
30
- "ra.action.close_menu": "Close menu",
31
- "ra.action.confirm": "Confirm",
32
- "ra.action.create": "Create",
33
- "ra.action.delete": "Delete",
34
- "ra.action.edit": "Edit",
35
- "ra.action.export": "Export",
36
- "ra.action.list": "List",
37
- "ra.action.open_menu": "Open menu",
38
- "ra.action.refresh": "Refresh",
39
- "ra.action.remove": "Remove",
40
- "ra.action.remove_filter": "Remove this filter",
41
- "ra.action.save": "Save",
42
- "ra.action.search": "Search",
43
- "ra.action.select_all": "Select all",
44
- "ra.action.select_row": "Select this row",
45
- "ra.action.show": "Show",
46
- "ra.action.sort": "Sort",
47
- "ra.action.toggle_theme": "Toggle light/dark mode",
48
- "ra.action.undo": "Undo",
49
- "ra.action.unselect": "Unselect",
50
- "ra.action.update": "Update",
51
- // Booleans
52
- "ra.boolean.true": "Yes",
53
- "ra.boolean.false": "No",
54
- "ra.boolean.null": " ",
55
- // Auth
56
- "ra.auth.logout": "Logout",
57
- "ra.auth.sign_in": "Sign in",
58
- "ra.auth.sign_in_error": "Authentication failed, please retry",
59
- "ra.auth.user_menu": "Profile",
60
- "ra.auth.username": "Username",
61
- "ra.auth.password": "Password",
62
- "ra.auth.auth_check_error": "Please login to continue",
63
- // Messages
64
- "ra.message.access_denied": "You don't have the right permissions to access this page",
65
- "ra.message.auth_error": "An error occurred while validating the authentication token.",
66
- "ra.message.authentication_error": "The authentication server returned an error and your credentials could not be checked.",
67
- "ra.message.error": "A client error occurred and your request couldn't be completed.",
68
- "ra.message.invalid_form": "The form is not valid. Please check for errors",
69
- "ra.message.loading": "Please wait",
70
- "ra.message.not_found": "Either you typed a wrong URL, or you followed a bad link.",
71
- // Navigation / pagination
72
- "ra.navigation.next": "Go to next page",
73
- "ra.navigation.previous": "Go to previous page",
74
- "ra.navigation.first": "Go to first page",
75
- "ra.navigation.last": "Go to last page",
76
- // No `{name}`: the list and input call sites pass no params for these.
77
- "ra.navigation.no_results": "No results found",
78
- "ra.navigation.no_filtered_results": "No results found with the current filters.",
79
- "ra.navigation.page_range_info": "{offsetBegin}-{offsetEnd} of {total}",
80
- "ra.navigation.partial_page_range_info": "{offsetBegin}-{offsetEnd} of more than {offsetEnd}",
81
- "ra.navigation.page_rows_per_page": "Rows per page:",
82
- "ra.navigation.current_page": "Page {page}",
83
- "ra.navigation.skip_nav": "Skip to content",
84
- // Inputs
85
- "ra.input.file.upload_several": "Drop some files to upload, or click to select one.",
86
- "ra.input.file.upload_single": "Drop a file to upload, or click to select it.",
87
- "ra.input.image.upload_several": "Drop some pictures to upload, or click to select one.",
88
- "ra.input.image.upload_single": "Drop a picture to upload, or click to select it.",
89
- "ra.input.password.toggle_visible": "Hide password",
90
- "ra.input.password.toggle_hidden": "Show password",
91
- // Theme
92
- "ra.theme.light": "Light",
93
- "ra.theme.dark": "Dark",
94
- "ra.theme.system": "System",
95
- // Validation (ra namespace — some ported inputs read these)
96
- "ra.validation.required": "Required",
97
- "ra.validation.minLength": "Must be {min} characters at least",
98
- "ra.validation.maxLength": "Must be {max} characters or less",
99
- "ra.validation.minValue": "Must be at least {min}",
100
- "ra.validation.maxValue": "Must be {max} or less",
101
- "ra.validation.number": "Must be a number",
102
- "ra.validation.email": "Must be a valid email",
103
- // Actions the components translate beyond the base set
104
- "ra.action.back": "Back",
105
- "ra.action.bulk_edit_apply": {
106
- one: "Apply to 1 record",
107
- other: "Apply to {count} records"
108
- },
109
- "ra.action.change_locale": "Change locale",
110
- "ra.action.clear_array_input": "Clear the array",
111
- "ra.action.clone": "Clone",
112
- "ra.action.collapse": "Collapse",
113
- "ra.action.expand": "Expand",
114
- "ra.action.move_column_down": "Move down",
115
- "ra.action.move_column_up": "Move up",
116
- "ra.action.move_down": "Move down",
117
- "ra.action.move_up": "Move up",
118
- "ra.action.reload": "Reload",
119
- "ra.action.remove_all_filters": "Remove all filters",
120
- "ra.action.reset": "Reset",
121
- "ra.action.reset_columns": "Reset",
122
- "ra.action.search_columns": "Search columns",
123
- "ra.action.select_columns": "Columns",
124
- // Auth
125
- "ra.auth.or": "or",
126
- // Calendar
127
- "ra.calendar.agenda": "Agenda",
128
- "ra.calendar.month": "Month",
129
- "ra.calendar.week": "Week",
130
- "ra.calendar.next": "Next",
131
- "ra.calendar.previous": "Previous",
132
- "ra.calendar.today": "Today",
133
- "ra.calendar.view": "View",
134
- "ra.calendar.no_events": "No events",
135
- // CSV import
136
- "ra.csv_import.back": "Back",
137
- "ra.csv_import.close": "Close",
138
- "ra.csv_import.complete": "Import complete",
139
- "ra.csv_import.counts": "{created} created · {failed} failed · {total} total",
140
- "ra.csv_import.download_errors": "Download error report",
141
- "ra.csv_import.drop": "Drop a CSV file here, or click to choose one",
142
- "ra.csv_import.import": "Import",
143
- "ra.csv_import.issues": "Issues",
144
- "ra.csv_import.next": "Next",
145
- "ra.csv_import.not_utf8": "This file is not UTF-8, so some letters may be wrong. Save it as CSV UTF-8 and try again.",
146
- "ra.csv_import.preview_summary": "{valid} valid · {errors} errors · {total} total",
147
- "ra.csv_import.required_unmapped": "Required fields are not mapped",
148
- "ra.csv_import.rows_parsed": "{count} rows parsed",
149
- "ra.csv_import.step.commit": "Importing",
150
- "ra.csv_import.step.map": "Map columns",
151
- "ra.csv_import.step.preview": "Preview",
152
- "ra.csv_import.step.upload": "Upload",
153
- "ra.csv_import.unmapped": "Not mapped",
154
- "ra.csv_import.wrong_file": "Choose a .csv file",
155
- // Confirmation dialogs and other messages
156
- "ra.message.bulk_delete_content": {
157
- one: "Are you sure you want to delete this item?",
158
- other: "Are you sure you want to delete these {count} items?"
159
- },
160
- "ra.message.bulk_delete_title": {
161
- one: "Delete 1 item",
162
- other: "Delete {count} items"
163
- },
164
- "ra.message.bulk_edit_description": {
165
- one: "Only the fields you change are applied to the selected record.",
166
- other: "Only the fields you change are applied to the {count} selected records."
167
- },
168
- "ra.message.bulk_edit_nested_source": "Bulk edit takes flat sources only, but {source} is nested.",
169
- "ra.message.bulk_update_content": {
170
- one: "Are you sure you want to update this item?",
171
- other: "Are you sure you want to update these {count} items?"
172
- },
173
- "ra.message.bulk_update_title": {
174
- one: "Update 1 item",
175
- other: "Update {count} items"
176
- },
177
- "ra.message.clear_array_input": "Are you sure you want to clear the whole array?",
178
- "ra.message.delete_content": "Are you sure you want to delete this item?",
179
- "ra.message.delete_title": "Delete {name} {recordRepresentation}",
180
- // More navigation
181
- "ra.navigation.clear_filters": "Clear filters",
182
- // Notifications
183
- "ra.notification.application_update_available": "A new version of the application is available",
184
- "ra.notification.http_error": "Error",
185
- "ra.notification.offline": "You are offline",
186
- // Saved queries
187
- "ra.saved_queries.new_label": "Save current query",
188
- "ra.saved_queries.query_name": "Query name",
189
- "ra.saved_queries.remove_label_with_name": 'Remove saved query "{name}"'
4
+ // src/i18n/english-messages.ts
5
+ /**
6
+ * The English catalog an `<Admin>` with no `i18n` prop reads from, and the base
7
+ * an app extends: spread it, then add or override entries.
8
+ *
9
+ * The ported shadcn components translate `ra.*` keys (the react-admin namespace
10
+ * they were ported from): page titles, list pagination, the bulk-action bar,
11
+ * menu a11y labels, boolean fields. Chelone's i18n never throws on a missing key
12
+ * (it returns the key or a `_` fallback), so a partial catalog shows raw
13
+ * `ra.page.list`-style keys.
14
+ *
15
+ * Interpolation is single-brace `{name}` (not react-admin's `%{name}`). Plural
16
+ * strings are `{ one, other }` objects keyed by Intl.PluralRules categories
17
+ * (react-admin's `a |||| b` form).
18
+ *
19
+ * `defaultMessages` (the `chelone.*` keys the core controllers emit) and
20
+ * `mapMessages` (the maps add-on's labels) sit underneath.
21
+ */
22
+ var englishMessages = defineMessages({
23
+ ...defaultMessages,
24
+ ...mapMessages,
25
+ "ra.page.list": "{name}",
26
+ "ra.page.create": "Create {name}",
27
+ "ra.page.edit": "{name} {recordRepresentation}",
28
+ "ra.page.show": "{name} {recordRepresentation}",
29
+ "ra.page.dashboard": "Dashboard",
30
+ "ra.page.error": "Something went wrong",
31
+ "ra.page.not_found": "Not Found",
32
+ "ra.page.loading": "Loading",
33
+ "ra.page.empty": "No {name} yet.",
34
+ "ra.page.access_denied": "Access denied",
35
+ "ra.page.authentication_error": "Authentication error",
36
+ "ra.action.add": "Add",
37
+ "ra.action.add_filter": "Add filter",
38
+ "ra.action.bulk_actions": {
39
+ one: "1 item selected",
40
+ other: "{count} items selected"
41
+ },
42
+ "ra.action.cancel": "Cancel",
43
+ "ra.action.clear_input_value": "Clear value",
44
+ "ra.action.clear_search": "Clear search",
45
+ "ra.action.close": "Close",
46
+ "ra.action.close_menu": "Close menu",
47
+ "ra.action.confirm": "Confirm",
48
+ "ra.action.create": "Create",
49
+ "ra.action.delete": "Delete",
50
+ "ra.action.edit": "Edit",
51
+ "ra.action.export": "Export",
52
+ "ra.action.list": "List",
53
+ "ra.action.open_menu": "Open menu",
54
+ "ra.action.refresh": "Refresh",
55
+ "ra.action.remove": "Remove",
56
+ "ra.action.remove_filter": "Remove this filter",
57
+ "ra.action.save": "Save",
58
+ "ra.action.search": "Search",
59
+ "ra.action.select_all": "Select all",
60
+ "ra.action.select_row": "Select this row",
61
+ "ra.action.show": "Show",
62
+ "ra.action.sort": "Sort",
63
+ "ra.action.toggle_theme": "Toggle light/dark mode",
64
+ "ra.action.undo": "Undo",
65
+ "ra.action.unselect": "Unselect",
66
+ "ra.action.update": "Update",
67
+ "ra.boolean.true": "Yes",
68
+ "ra.boolean.false": "No",
69
+ "ra.boolean.null": " ",
70
+ "ra.auth.logout": "Logout",
71
+ "ra.auth.sign_in": "Sign in",
72
+ "ra.auth.sign_in_error": "Authentication failed, please retry",
73
+ "ra.auth.user_menu": "Profile",
74
+ "ra.auth.username": "Username",
75
+ "ra.auth.password": "Password",
76
+ "ra.auth.auth_check_error": "Please login to continue",
77
+ "ra.message.access_denied": "You don't have the right permissions to access this page",
78
+ "ra.message.auth_error": "An error occurred while validating the authentication token.",
79
+ "ra.message.authentication_error": "The authentication server returned an error and your credentials could not be checked.",
80
+ "ra.message.error": "A client error occurred and your request couldn't be completed.",
81
+ "ra.message.invalid_form": "The form is not valid. Please check for errors",
82
+ "ra.message.loading": "Please wait",
83
+ "ra.message.not_found": "Either you typed a wrong URL, or you followed a bad link.",
84
+ "ra.navigation.next": "Go to next page",
85
+ "ra.navigation.previous": "Go to previous page",
86
+ "ra.navigation.first": "Go to first page",
87
+ "ra.navigation.last": "Go to last page",
88
+ "ra.navigation.no_results": "No results found",
89
+ "ra.navigation.no_filtered_results": "No results found with the current filters.",
90
+ "ra.navigation.page_range_info": "{offsetBegin}-{offsetEnd} of {total}",
91
+ "ra.navigation.partial_page_range_info": "{offsetBegin}-{offsetEnd} of more than {offsetEnd}",
92
+ "ra.navigation.page_rows_per_page": "Rows per page:",
93
+ "ra.navigation.current_page": "Page {page}",
94
+ "ra.navigation.skip_nav": "Skip to content",
95
+ "ra.input.file.upload_several": "Drop some files to upload, or click to select one.",
96
+ "ra.input.file.upload_single": "Drop a file to upload, or click to select it.",
97
+ "ra.input.image.upload_several": "Drop some pictures to upload, or click to select one.",
98
+ "ra.input.image.upload_single": "Drop a picture to upload, or click to select it.",
99
+ "ra.input.password.toggle_visible": "Hide password",
100
+ "ra.input.password.toggle_hidden": "Show password",
101
+ "ra.theme.light": "Light",
102
+ "ra.theme.dark": "Dark",
103
+ "ra.theme.system": "System",
104
+ "ra.validation.required": "Required",
105
+ "ra.validation.minLength": "Must be {min} characters at least",
106
+ "ra.validation.maxLength": "Must be {max} characters or less",
107
+ "ra.validation.minValue": "Must be at least {min}",
108
+ "ra.validation.maxValue": "Must be {max} or less",
109
+ "ra.validation.number": "Must be a number",
110
+ "ra.validation.email": "Must be a valid email",
111
+ "ra.action.back": "Back",
112
+ "ra.action.bulk_edit_apply": {
113
+ one: "Apply to 1 record",
114
+ other: "Apply to {count} records"
115
+ },
116
+ "ra.action.change_locale": "Change locale",
117
+ "ra.action.clear_array_input": "Clear the array",
118
+ "ra.action.clone": "Clone",
119
+ "ra.action.collapse": "Collapse",
120
+ "ra.action.expand": "Expand",
121
+ "ra.action.move_column_down": "Move down",
122
+ "ra.action.move_column_up": "Move up",
123
+ "ra.action.move_down": "Move down",
124
+ "ra.action.move_up": "Move up",
125
+ "ra.action.reload": "Reload",
126
+ "ra.action.remove_all_filters": "Remove all filters",
127
+ "ra.action.reset": "Reset",
128
+ "ra.action.reset_columns": "Reset",
129
+ "ra.action.search_columns": "Search columns",
130
+ "ra.action.select_columns": "Columns",
131
+ "ra.auth.or": "or",
132
+ "ra.calendar.agenda": "Agenda",
133
+ "ra.calendar.month": "Month",
134
+ "ra.calendar.week": "Week",
135
+ "ra.calendar.next": "Next",
136
+ "ra.calendar.previous": "Previous",
137
+ "ra.calendar.today": "Today",
138
+ "ra.calendar.view": "View",
139
+ "ra.calendar.no_events": "No events",
140
+ "ra.csv_import.back": "Back",
141
+ "ra.csv_import.close": "Close",
142
+ "ra.csv_import.complete": "Import complete",
143
+ "ra.csv_import.counts": "{created} created · {failed} failed · {total} total",
144
+ "ra.csv_import.download_errors": "Download error report",
145
+ "ra.csv_import.drop": "Drop a CSV file here, or click to choose one",
146
+ "ra.csv_import.import": "Import",
147
+ "ra.csv_import.issues": "Issues",
148
+ "ra.csv_import.next": "Next",
149
+ "ra.csv_import.not_utf8": "This file is not UTF-8, so some letters may be wrong. Save it as CSV UTF-8 and try again.",
150
+ "ra.csv_import.preview_summary": "{valid} valid · {errors} errors · {total} total",
151
+ "ra.csv_import.required_unmapped": "Required fields are not mapped",
152
+ "ra.csv_import.rows_parsed": "{count} rows parsed",
153
+ "ra.csv_import.step.commit": "Importing",
154
+ "ra.csv_import.step.map": "Map columns",
155
+ "ra.csv_import.step.preview": "Preview",
156
+ "ra.csv_import.step.upload": "Upload",
157
+ "ra.csv_import.unmapped": "Not mapped",
158
+ "ra.csv_import.wrong_file": "Choose a .csv file",
159
+ "ra.message.bulk_delete_content": {
160
+ one: "Are you sure you want to delete this item?",
161
+ other: "Are you sure you want to delete these {count} items?"
162
+ },
163
+ "ra.message.bulk_delete_title": {
164
+ one: "Delete 1 item",
165
+ other: "Delete {count} items"
166
+ },
167
+ "ra.message.bulk_edit_description": {
168
+ one: "Only the fields you change are applied to the selected record.",
169
+ other: "Only the fields you change are applied to the {count} selected records."
170
+ },
171
+ "ra.message.bulk_edit_nested_source": "Bulk edit takes flat sources only, but {source} is nested.",
172
+ "ra.message.bulk_update_content": {
173
+ one: "Are you sure you want to update this item?",
174
+ other: "Are you sure you want to update these {count} items?"
175
+ },
176
+ "ra.message.bulk_update_title": {
177
+ one: "Update 1 item",
178
+ other: "Update {count} items"
179
+ },
180
+ "ra.message.clear_array_input": "Are you sure you want to clear the whole array?",
181
+ "ra.message.delete_content": "Are you sure you want to delete this item?",
182
+ "ra.message.delete_title": "Delete {name} {recordRepresentation}",
183
+ "ra.navigation.clear_filters": "Clear filters",
184
+ "ra.notification.application_update_available": "A new version of the application is available",
185
+ "ra.notification.http_error": "Error",
186
+ "ra.notification.offline": "You are offline",
187
+ "ra.saved_queries.new_label": "Save current query",
188
+ "ra.saved_queries.query_name": "Query name",
189
+ "ra.saved_queries.remove_label_with_name": "Remove saved query \"{name}\""
190
190
  });
191
- export {
192
- englishMessages
193
- };
191
+ export { englishMessages };
@@ -1,4 +1,4 @@
1
- import type { MessageCatalog, MessageKey, TranslateParams } from "./messages.js";
1
+ import type { MessageCatalog, MessageKey, TranslateParams, TranslateParamValues } from "./messages.js";
2
2
  /**
3
3
  * Distributive key lookup: locale catalogs may be heterogeneous (a fallback
4
4
  * locale can carry keys a partial catalog lacks), so `TCatalog` is often a
@@ -13,7 +13,7 @@ type CatalogValue<TCatalog extends MessageCatalog, K extends string> = TCatalog
13
13
  * assignable to this; key-level literal typing lives on the concrete instance.
14
14
  */
15
15
  export interface AnyCheloneI18n {
16
- translate(key: string, params?: Record<string, unknown>): string;
16
+ translate(key: string, params?: TranslateParamValues): string;
17
17
  getLocale(): string;
18
18
  setLocale(locale: string): void;
19
19
  getLocales(): string[];
@@ -38,5 +38,11 @@ export declare function createI18n<const TCatalog extends MessageCatalog>(option
38
38
  locale: string;
39
39
  messages: Record<string, TCatalog>;
40
40
  fallbackLocale?: string;
41
+ /**
42
+ * Called when the current locale's catalog holds no own entry for a key,
43
+ * even when `fallbackLocale` supplies the text. `fallback` is the string `_`
44
+ * param. A throwing callback goes to `console.error`; `translate` is unchanged.
45
+ */
46
+ onMissingKey?: (key: string, locale: string, fallback: string | undefined) => void;
41
47
  }): CheloneI18n<TCatalog>;
42
48
  export {};
package/dist/i18n/i18n.js CHANGED
@@ -1,56 +1,55 @@
1
+ // src/i18n/i18n.ts
1
2
  function interpolate(template, params) {
2
- if (!params) return template;
3
- return template.replace(
4
- /\{(\w+)\}/g,
5
- (match, name) => name in params ? String(params[name]) : match
6
- );
3
+ if (!params) return template;
4
+ return template.replace(/\{(\w+)\}/g, (match, name) => name in params ? String(params[name]) : match);
7
5
  }
8
6
  function resolve(value, locale, params) {
9
- if (typeof value === "string") return interpolate(value, params);
10
- const raw = params?.count ?? params?.smart_count;
11
- const count = typeof raw === "number" ? raw : Number(raw ?? Number.NaN);
12
- if (Number.isNaN(count)) return interpolate(value.other, params);
13
- const category = new Intl.PluralRules(locale).select(count);
14
- return interpolate(value[category] ?? value.other, {
15
- ...params,
16
- count: params?.count ?? raw,
17
- smart_count: params?.smart_count ?? raw
18
- });
7
+ if (typeof value === "string") return interpolate(value, params);
8
+ const raw = params?.count ?? params?.smart_count;
9
+ if (raw === void 0 || raw === null) return interpolate(value.other, params);
10
+ const count = Number(raw);
11
+ if (Number.isNaN(count)) return interpolate(value.other, params);
12
+ return interpolate(value[new Intl.PluralRules(locale).select(count)] ?? value.other, {
13
+ ...params,
14
+ count: params?.count ?? raw,
15
+ smart_count: params?.smart_count ?? raw
16
+ });
19
17
  }
18
+ /** Own-property lookup: `"constructor"` or `"toString"` is a missing key, not a function. */
20
19
  function lookup(catalog, key) {
21
- return catalog && Object.hasOwn(catalog, key) ? catalog[key] : void 0;
20
+ return catalog && Object.hasOwn(catalog, key) ? catalog[key] : void 0;
22
21
  }
23
22
  function createI18n(options) {
24
- let locale = options.locale;
25
- const subscribers = /* @__PURE__ */ new Set();
26
- return {
27
- translate(key, ...args) {
28
- const params = args[0];
29
- const value = lookup(options.messages[locale], key) ?? (options.fallbackLocale ? lookup(options.messages[options.fallbackLocale], key) : void 0);
30
- if (value === void 0) {
31
- if (typeof params?._ === "string") return interpolate(params._, params);
32
- return key;
33
- }
34
- return resolve(value, locale, params);
35
- },
36
- getLocale: () => locale,
37
- setLocale(next) {
38
- if (!Object.hasOwn(options.messages, next)) {
39
- throw new Error(
40
- `createI18n: unknown locale "${next}" — available: ${Object.keys(options.messages).join(", ")}`
41
- );
42
- }
43
- if (next === locale) return;
44
- locale = next;
45
- for (const cb of subscribers) cb();
46
- },
47
- getLocales: () => Object.keys(options.messages),
48
- subscribe(callback) {
49
- subscribers.add(callback);
50
- return () => void subscribers.delete(callback);
51
- }
52
- };
23
+ let locale = options.locale;
24
+ const subscribers = /* @__PURE__ */ new Set();
25
+ return {
26
+ translate(key, ...args) {
27
+ const params = args[0];
28
+ const own = lookup(options.messages[locale], key);
29
+ if (own === void 0 && options.onMissingKey) try {
30
+ options.onMissingKey(key, locale, typeof params?._ === "string" ? params._ : void 0);
31
+ } catch (error) {
32
+ console.error(error);
33
+ }
34
+ const value = own ?? (options.fallbackLocale ? lookup(options.messages[options.fallbackLocale], key) : void 0);
35
+ if (value === void 0) {
36
+ if (typeof params?._ === "string") return interpolate(params._, params);
37
+ return key;
38
+ }
39
+ return resolve(value, locale, params);
40
+ },
41
+ getLocale: () => locale,
42
+ setLocale(next) {
43
+ if (!Object.hasOwn(options.messages, next)) throw new Error(`createI18n: unknown locale "${next}" — available: ${Object.keys(options.messages).join(", ")}`);
44
+ if (next === locale) return;
45
+ locale = next;
46
+ for (const cb of subscribers) cb();
47
+ },
48
+ getLocales: () => Object.keys(options.messages),
49
+ subscribe(callback) {
50
+ subscribers.add(callback);
51
+ return () => void subscribers.delete(callback);
52
+ }
53
+ };
53
54
  }
54
- export {
55
- createI18n
56
- };
55
+ export { createI18n };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Clean-room reimplementation of the SUBSET of the `inflection` package the
3
+ * ra-core label helpers rely on. Chelone carries no `inflection` dependency, so
4
+ * these three small helpers cover exactly what `useGetResourceLabel` /
5
+ * `useTranslateLabel` need:
6
+ *
7
+ * - `humanize(text)` — ra-core `humanize`: strip a trailing `_id`, replace
8
+ * underscores with spaces, lowercase, and capitalize the first letter. Does
9
+ * NOT split camelCase (parity: `humanize('authorName') === 'Authorname'`).
10
+ * - `humanizeField(source)` — ra-core `transform(['underscore','humanize'])`:
11
+ * camelCase-aware, so `firstName` → `First name`. Used for field labels.
12
+ * - `pluralize(word, count)` — ra-core `inflect(word, count)`: singular for
13
+ * `count === 1`, plural otherwise. Covers the regular English rules plus a
14
+ * small irregular set. Full parity with `inflection`'s complete irregular
15
+ * table is a documented non-goal (the fallback only fires when a translation
16
+ * key AND an `options.label` are both absent).
17
+ */
18
+ /**
19
+ * ra-core `humanize`: strip a trailing `_id`, underscores → spaces, lowercase,
20
+ * capitalize the first letter. Deliberately does NOT split camelCase.
21
+ */
22
+ export declare function humanize(text: string): string;
23
+ /**
24
+ * ra-core `transform(source, ['underscore','humanize'])`: camelCase-aware
25
+ * humanization for field labels. `firstName` → `First name`, `full_name` →
26
+ * `Full name`, `author name` → `Author name`.
27
+ */
28
+ export declare function humanizeField(source: string): string;
29
+ /**
30
+ * ra-core `inflect(word, count)`: singularize when `count === 1`, pluralize
31
+ * otherwise. Case-preserving only for the first letter (the caller humanizes
32
+ * afterward, so casing beyond that does not matter here).
33
+ */
34
+ export declare function pluralize(word: string, count?: number): string;