@protobase/server 0.22.9 → 0.22.10

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.
@@ -29,9 +29,9 @@ const sensitiveErrors = (view, model) => {
29
29
  ["a list display", (view.list?.displays ?? []).flatMap(displayFields)],
30
30
  ["a filter", view.filters.flatMap((widget) => widget.kind === "flags" ? widget.fields : [widget.field])],
31
31
  ["the chart", view.chart ? chartFields(view.chart) : []],
32
- ["the sidebar", view.layout.flatMap((item) => item.kind === "sidebar" ? item.fields : [])],
33
- ["a map", view.layout.flatMap((item) => item.kind === "map" ? [item.latitude, item.longitude] : [])],
34
- ["a gallery", view.layout.flatMap((item) => item.kind === "gallery" && item.image !== void 0 ? [item.image] : [])],
32
+ ["the sidebar", layoutItems(view.layout).flatMap((item) => item.kind === "sidebar" ? item.fields : [])],
33
+ ["a map", layoutItems(view.layout).flatMap((item) => item.kind === "map" ? [item.latitude, item.longitude] : [])],
34
+ ["a gallery", layoutItems(view.layout).flatMap((item) => item.kind === "gallery" && item.image !== void 0 ? [item.image] : [])],
35
35
  ["the recent records", view.nav?.recent ? [view.nav.recent.status] : []],
36
36
  ["an action", view.actions.flatMap((action) => actionFields(action.run))]
37
37
  ].flatMap(([place, names]) => [...new Set(names.filter(sensitive))].map((name) => `sensitive field "${name}" cannot be in ${place}`));
@@ -99,8 +99,8 @@ const unknownFieldErrors = (view, model) => {
99
99
  const unknown = (names, what) => names.filter((name) => !Object.hasOwn(model.fields, name)).map((name) => `${what} names field "${name}", which ${model.name} does not have`);
100
100
  return [
101
101
  ...(view.list?.displays ?? []).flatMap((display) => unknown(displayFields(display), `display "${display.name}"`)),
102
- ...view.layout.flatMap((item) => item.kind === "custom" ? unknown(fieldRefsIn(item.props), `custom section ${item.component}`) : []),
103
- ...view.layout.flatMap((item) => item.kind === "gallery" && item.image !== void 0 ? unknown([item.image], `gallery "${item.title}"`) : [])
102
+ ...layoutItems(view.layout).flatMap((item) => item.kind === "custom" ? unknown(fieldRefsIn(item.props), `custom section ${item.component}`) : []),
103
+ ...layoutItems(view.layout).flatMap((item) => item.kind === "gallery" && item.image !== void 0 ? unknown([item.image], `gallery "${item.title}"`) : [])
104
104
  ];
105
105
  };
106
106
  const widgetErrors = (view, model, fieldTypes) => Object.entries(view.fields).flatMap(([name, hints]) => {
@@ -127,7 +127,7 @@ const galleryErrors = (item, resource, model, models) => {
127
127
  const image = item.image === void 0 ? void 0 : model.fields[item.image];
128
128
  return [...image && image.type !== "file" ? [`"${item.image}" is not a file field`] : [], ...item.photos ? cardPhotosErrors(item.photos, resource, models).map((error) => `photos: ${error}`) : []];
129
129
  };
130
- const conditionErrors = (view, models) => view.layout.flatMap((item) => {
130
+ const conditionErrors = (view, models) => layoutItems(view.layout).flatMap((item) => {
131
131
  if (item.kind !== "section" && item.kind !== "sidebar" && item.kind !== "related") return [];
132
132
  if (!isRecordCondition(item.when)) return [];
133
133
  const place = item.kind === "sidebar" ? "sidebar" : `${item.kind} "${item.title}"`;
@@ -156,17 +156,17 @@ const checkViews = (registry, views, pages = [], fieldTypes = {}) => {
156
156
  const photos = [
157
157
  ...(view.list?.displays ?? []).flatMap((display) => display.kind === "cards" && display.photos ? cardPhotosErrors(display.photos, view.resource, models).map((error) => `display "${display.name}" photos: ${error}`) : []),
158
158
  ...sharedPhotosErrors(view),
159
- ...view.layout.flatMap((item) => item.kind === "gallery" ? galleryErrors(item, view.resource, model, models).map((error) => `gallery "${item.title}": ${error}`) : [])
159
+ ...layoutItems(view.layout).flatMap((item) => item.kind === "gallery" ? galleryErrors(item, view.resource, model, models).map((error) => `gallery "${item.title}": ${error}`) : [])
160
160
  ];
161
161
  const favorites = (view.list?.displays ?? []).flatMap((display) => display.kind === "cards" && display.favorite ? [...cardFavoriteErrors(display.favorite, view.resource, models), ...favoriteOwnerErrors(display.favorite, models)].map((error) => `display "${display.name}" favorite: ${error}`) : []);
162
162
  const listOf = view.listOf === void 0 ? [] : listOfErrors(model, view.listOf, models).map((error) => `listOf: ${error}`);
163
163
  const searches = [...view.saveSearch ? saveSearchErrors(view.saveSearch, view.resource, models, views).map((error) => `saveSearch: ${error}`) : [], ...view.searchesOf ? searchesOfErrors(view.searchesOf, view.resource, models).map((error) => `searchesOf: ${error}`) : []];
164
- const maps = [...view.layout.flatMap((item) => item.kind === "map" ? mapErrors(item, model).map((error) => `map "${item.title}": ${error}`) : []), ...(view.list?.displays ?? []).flatMap((display) => display.kind === "map" ? mapDisplayErrors(display, model).map((error) => `display "${display.name}": ${error}`) : [])];
164
+ const maps = [...layoutItems(view.layout).flatMap((item) => item.kind === "map" ? mapErrors(item, model).map((error) => `map "${item.title}": ${error}`) : []), ...(view.list?.displays ?? []).flatMap((display) => display.kind === "map" ? mapDisplayErrors(display, model).map((error) => `display "${display.name}": ${error}`) : [])];
165
165
  const boards = (view.list?.displays ?? []).flatMap((display) => display.kind === "board" ? boardErrors(display, model).map((error) => `display "${display.name}": ${error}`) : []);
166
166
  const calendars = (view.list?.displays ?? []).flatMap((display) => display.kind === "calendar" ? calendarErrors(display, model).map((error) => `display "${display.name}": ${error}`) : []);
167
167
  const chart = view.chart ? chartErrors(view.chart, model).map((error) => `chart: ${error}`) : [];
168
- const history = model.history ? [] : view.layout.flatMap((item) => item.kind === "history" ? [`history "${item.title}" needs .history() on resource "${view.resource}"`] : []);
169
- const comments = model.comments ? [] : view.layout.flatMap((item) => item.kind === "comments" ? [`comments "${item.title}" needs .comments() on resource "${view.resource}"`] : []);
168
+ const history = model.history ? [] : layoutItems(view.layout).flatMap((item) => item.kind === "history" ? [`history "${item.title}" needs .history() on resource "${view.resource}"`] : []);
169
+ const comments = model.comments ? [] : layoutItems(view.layout).flatMap((item) => item.kind === "comments" ? [`comments "${item.title}" needs .comments() on resource "${view.resource}"`] : []);
170
170
  return [
171
171
  ...sensitiveErrors(view, model),
172
172
  ...unknownFieldErrors(view, model),
@@ -176,13 +176,8 @@ const layoutShape = (resource, model, models) => {
176
176
  fields: shapes.list(shapes.field, { nonEmpty: true })
177
177
  }, { requires: ["fields", "when"] });
178
178
  const related = shapes.map((item) => pruneRelated(item, resource, models));
179
- return shapes.oneOf({
179
+ const main = {
180
180
  section,
181
- sidebar: shapes.object({
182
- kind: shapes.data,
183
- fields: shapes.list(shapes.field, { nonEmpty: true }),
184
- when
185
- }, { requires: ["fields", "when"] }),
186
181
  related,
187
182
  group: shapes.object({
188
183
  kind: shapes.data,
@@ -223,6 +218,19 @@ const layoutShape = (resource, model, models) => {
223
218
  title: shapes.data,
224
219
  when: shapes.data
225
220
  })
221
+ };
222
+ return shapes.oneOf({
223
+ ...main,
224
+ sidebar: shapes.object({
225
+ kind: shapes.data,
226
+ fields: shapes.list(shapes.field, { nonEmpty: true }),
227
+ when
228
+ }, { requires: ["fields", "when"] }),
229
+ tab: shapes.object({
230
+ kind: shapes.data,
231
+ title: shapes.data,
232
+ items: shapes.list(shapes.oneOf(main), { nonEmpty: true })
233
+ }, { requires: ["items"] })
226
234
  });
227
235
  };
228
236
  const linkShape = (model, models) => shapes.map((run) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protobase/server",
3
- "version": "0.22.9",
3
+ "version": "0.22.10",
4
4
  "description": "The Protobase REST API as a Hono app, with Better Auth sign-in.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -31,9 +31,9 @@
31
31
  "dependencies": {
32
32
  "@better-auth/passkey": "^1.7.7",
33
33
  "@better-auth/sso": "^1.7.7",
34
- "@protobase/layout": "0.22.9",
35
- "@protobase/query": "0.22.9",
36
- "@protobase/schema": "0.22.9",
34
+ "@protobase/layout": "0.22.10",
35
+ "@protobase/query": "0.22.10",
36
+ "@protobase/schema": "0.22.10",
37
37
  "@react-email/render": "^2.1.0",
38
38
  "@scalar/hono-api-reference": "^0.12.10",
39
39
  "@sentry/core": "^11.7.0",