@protobase/schema 0.68.2 → 0.68.3

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/index.d.ts CHANGED
@@ -49,4 +49,8 @@ import { AccessSource, ResolveOptions, ResolvedAccess, RowFilterOperation, acces
49
49
  import { restrictModel } from "./access/restrict.js";
50
50
  import "./access/index.js";
51
51
  import { AssistantAction, AssistantActionRequest, AssistantCardPart, AssistantDiff, AssistantEvent, AssistantMessage, AssistantMessageRequest, AssistantPart, AssistantState, AssistantStep, AssistantStepState, AssistantTablePart, AssistantTextPart, AssistantTone, AssistantWidgetPart } from "./assistant/protocol.js";
52
- export { type Access, type AccessAction, type AccessContext, type AccessFn, type AccessResult, type AccessSource, type AccessUser, type ActionInputKind, type ActionInputModel, type ActionModel, type ActionRun, type AnyField, type AppAddress, type ArgumentSpec, type ArgumentType, type ArgumentsSpec, type AssistantAction, type AssistantActionRequest, type AssistantCardPart, type AssistantDiff, type AssistantEvent, type AssistantMessage, type AssistantMessageRequest, type AssistantPart, type AssistantState, type AssistantStep, type AssistantStepState, type AssistantTablePart, type AssistantTextPart, type AssistantTone, type AssistantWidgetPart, type BadgeShape, type BadgeTone, type BottomBarItemModel, type BottomBarModel, type BottomBarNames, type BottomBarSource, type CalendarView, type Capability, type CapabilityAction, type CapabilityLimit, type CapabilityScope, type CardFavoriteModel, type CardPhotosModel, type ChartGranularity, type ChartInput, type ChartModel, type ChartRange, type CheckResult, type CheckedFilter, type CommentsSectionModel, type CompareOp, type ComponentRef, type ComputedReveal, type ConnectAddress, type Constraint, type CreateModel, type CreatedOptions, type CustomSectionModel, type DatePreset, type DeletedOptions, type DurationLiteral, type DurationUnit, type Encrypted, type EvaluateOptions, type EventActor, type EventContext, type EventHelpers, type EventMatch, type EventModel, type EventOperation, type EventSpec, type ExactCapability, type ExportModel, type Field, type FieldAccess, type FieldFormat, type FieldMeta, type FieldModel, type FieldPath, type FieldRefValue, type FieldRefs, type FieldRule, type FieldType, type FieldTypeDef, type FieldView, type FieldViewModel, type FieldViews, type FieldWidgetModel, type FieldsInput, type FileField, type FileFieldModel, type FileOptions, type FileProcessor, type FileProcessorInput, type FilterError, type FilterErrorCode, type FilterExpr, type FilterLayout, type FilterLimits, type FilterOf, type FilterParse, type FilterValue, type FilterWidgetModel, type FormAddress, type FormInput, type FormModel, type GalleryModel, type Grant, type GroupChartInput, type GroupChartModel, type GroupItemModel, type GroupModel, type HeldCapability, type HelpWhen, type HistorySectionModel, type ImageFormat, type ImageVariant, type ImageVariantOptions, type InferRecord, type Issue, type JsonValue, type KeyOf, type KeyRefs, type KeyType, type KeyValue, type LayoutItemModel, type ListColumn, type ListDisplayModel, type ListDragModel, type ListModel, type ListQuery, type Literal, type MapSectionModel, type MapView, type NamedListModel, type NavModel, type NavRecentModel, type NowValue, type OrderByCheck, type OrderByItem, type OrderByParse, type PageWidth, type ParentAccess, type ParentModel, type PeriodChartInput, type PeriodChartModel, type PositionAfterModel, type RecordChartModel, type RecordChartRange, type RecordKey, type RecordMode, type RecordOf, type RecordPageModel, type RecordWhen, type Ref, type Refs, type RelatedColumnModel, type RelatedModel, type RelatedPresentation, type RelationField, type ResolveOptions, type ResolvedAccess, type ResourceBuilder, type ResourceModel, type RevealCaller, type RoleEntry, type RoleLimit, type Roles, type RolesOptions, type Rollup, type RollupCount, type RollupFn, type RollupSource, type RollupValue, type RowFilterOperation, type Rule, type SaveFeedback, type SaveSearchModel, type SearchMatch, type SearchRef, type SearchRefs, type SearchResultModel, type SearchesOfModel, type SectionModel, type SectionPresentation, type ShowWhen, type SignInAddress, type SignInPromptModel, type SignInStep, type SignInViewModel, type SortSpec, type Span, type StatusTone, type TabItemModel, type TabModel, type TenantOptions, type TimelineView, type TitleFromModel, type UndeletedOptions, type UpdatedOptions, type UserMenuItemModel, type UserMenuModel, type UserMenuSource, type Validator, type ViewBuilder, type ViewModel, type ViewProps, accessWarnings, addressWords, anonymousRole, appPath, argumentsSchema, badgeTones, bottomBar, bottomBarErrors, checkFilter, checkOrderBy, checkRecord, connectParams, connectPath, connectRoute, createWhere, defineRoles, encrypted, enumLabel, evaluateFilter, f, fieldRef, fieldsUsedBy, fitsKeyType, formPath, formRoute, imageFormats, isBadgeTone, isRecordCondition, keyTypes, layout as l, maxBottomBarItems, maxJsonDepth, parseFilter, parseOrderBy, pickView, printFilter, printOrderBy, readAppPath, readConnectAddress, readFormAddress, readSignInAddress, resolveAccess, resource, restrictModel, rule, signInParams, signInPath, signInRoute, signInSteps, userMenu, view, where };
52
+ import { CellKind, FileCell, FileDate, FileJson, cellKind, isEmptyFileCell } from "./user-tables/cell-kind.js";
53
+ import { UserTableFieldType, UserTableNameIssue, userTableNameIssue } from "./user-tables/names.js";
54
+ import { ColumnType, ColumnTypeReader, DecimalType, columnTypeReader, inferColumnType, maxShortText, minWholeDigits, widerFieldTypes } from "./user-tables/column-type.js";
55
+ import { fieldNamesOf, tableNameOf } from "./user-tables/column-names.js";
56
+ export { type Access, type AccessAction, type AccessContext, type AccessFn, type AccessResult, type AccessSource, type AccessUser, type ActionInputKind, type ActionInputModel, type ActionModel, type ActionRun, type AnyField, type AppAddress, type ArgumentSpec, type ArgumentType, type ArgumentsSpec, type AssistantAction, type AssistantActionRequest, type AssistantCardPart, type AssistantDiff, type AssistantEvent, type AssistantMessage, type AssistantMessageRequest, type AssistantPart, type AssistantState, type AssistantStep, type AssistantStepState, type AssistantTablePart, type AssistantTextPart, type AssistantTone, type AssistantWidgetPart, type BadgeShape, type BadgeTone, type BottomBarItemModel, type BottomBarModel, type BottomBarNames, type BottomBarSource, type CalendarView, type Capability, type CapabilityAction, type CapabilityLimit, type CapabilityScope, type CardFavoriteModel, type CardPhotosModel, type CellKind, type ChartGranularity, type ChartInput, type ChartModel, type ChartRange, type CheckResult, type CheckedFilter, type ColumnType, type ColumnTypeReader, type CommentsSectionModel, type CompareOp, type ComponentRef, type ComputedReveal, type ConnectAddress, type Constraint, type CreateModel, type CreatedOptions, type CustomSectionModel, type DatePreset, type DecimalType, type DeletedOptions, type DurationLiteral, type DurationUnit, type Encrypted, type EvaluateOptions, type EventActor, type EventContext, type EventHelpers, type EventMatch, type EventModel, type EventOperation, type EventSpec, type ExactCapability, type ExportModel, type Field, type FieldAccess, type FieldFormat, type FieldMeta, type FieldModel, type FieldPath, type FieldRefValue, type FieldRefs, type FieldRule, type FieldType, type FieldTypeDef, type FieldView, type FieldViewModel, type FieldViews, type FieldWidgetModel, type FieldsInput, type FileCell, type FileDate, type FileField, type FileFieldModel, type FileJson, type FileOptions, type FileProcessor, type FileProcessorInput, type FilterError, type FilterErrorCode, type FilterExpr, type FilterLayout, type FilterLimits, type FilterOf, type FilterParse, type FilterValue, type FilterWidgetModel, type FormAddress, type FormInput, type FormModel, type GalleryModel, type Grant, type GroupChartInput, type GroupChartModel, type GroupItemModel, type GroupModel, type HeldCapability, type HelpWhen, type HistorySectionModel, type ImageFormat, type ImageVariant, type ImageVariantOptions, type InferRecord, type Issue, type JsonValue, type KeyOf, type KeyRefs, type KeyType, type KeyValue, type LayoutItemModel, type ListColumn, type ListDisplayModel, type ListDragModel, type ListModel, type ListQuery, type Literal, type MapSectionModel, type MapView, type NamedListModel, type NavModel, type NavRecentModel, type NowValue, type OrderByCheck, type OrderByItem, type OrderByParse, type PageWidth, type ParentAccess, type ParentModel, type PeriodChartInput, type PeriodChartModel, type PositionAfterModel, type RecordChartModel, type RecordChartRange, type RecordKey, type RecordMode, type RecordOf, type RecordPageModel, type RecordWhen, type Ref, type Refs, type RelatedColumnModel, type RelatedModel, type RelatedPresentation, type RelationField, type ResolveOptions, type ResolvedAccess, type ResourceBuilder, type ResourceModel, type RevealCaller, type RoleEntry, type RoleLimit, type Roles, type RolesOptions, type Rollup, type RollupCount, type RollupFn, type RollupSource, type RollupValue, type RowFilterOperation, type Rule, type SaveFeedback, type SaveSearchModel, type SearchMatch, type SearchRef, type SearchRefs, type SearchResultModel, type SearchesOfModel, type SectionModel, type SectionPresentation, type ShowWhen, type SignInAddress, type SignInPromptModel, type SignInStep, type SignInViewModel, type SortSpec, type Span, type StatusTone, type TabItemModel, type TabModel, type TenantOptions, type TimelineView, type TitleFromModel, type UndeletedOptions, type UpdatedOptions, type UserMenuItemModel, type UserMenuModel, type UserMenuSource, type UserTableFieldType, type UserTableNameIssue, type Validator, type ViewBuilder, type ViewModel, type ViewProps, accessWarnings, addressWords, anonymousRole, appPath, argumentsSchema, badgeTones, bottomBar, bottomBarErrors, cellKind, checkFilter, checkOrderBy, checkRecord, columnTypeReader, connectParams, connectPath, connectRoute, createWhere, defineRoles, encrypted, enumLabel, evaluateFilter, f, fieldNamesOf, fieldRef, fieldsUsedBy, fitsKeyType, formPath, formRoute, imageFormats, inferColumnType, isBadgeTone, isEmptyFileCell, isRecordCondition, keyTypes, layout as l, maxBottomBarItems, maxJsonDepth, maxShortText, minWholeDigits, parseFilter, parseOrderBy, pickView, printFilter, printOrderBy, readAppPath, readConnectAddress, readFormAddress, readSignInAddress, resolveAccess, resource, restrictModel, rule, signInParams, signInPath, signInRoute, signInSteps, tableNameOf, userMenu, userTableNameIssue, view, where, widerFieldTypes };
package/dist/index.js CHANGED
@@ -30,4 +30,8 @@ import { rule } from "./access/rule.js";
30
30
  import { defineRoles } from "./access/roles.js";
31
31
  import { pickView } from "./access/pick-view.js";
32
32
  import { restrictModel } from "./access/restrict.js";
33
- export { accessWarnings, addressWords, anonymousRole, appPath, argumentsSchema, badgeTones, bottomBar, bottomBarErrors, checkFilter, checkOrderBy, checkRecord, connectParams, connectPath, connectRoute, createWhere, defineRoles, encrypted, enumLabel, evaluateFilter, f, fieldRef, fieldsUsedBy, fitsKeyType, formPath, formRoute, imageFormats, isBadgeTone, isRecordCondition, keyTypes, layout as l, maxBottomBarItems, maxJsonDepth, parseFilter, parseOrderBy, pickView, printFilter, printOrderBy, readAppPath, readConnectAddress, readFormAddress, readSignInAddress, resolveAccess, resource, restrictModel, rule, signInParams, signInPath, signInRoute, signInSteps, userMenu, view, where };
33
+ import { cellKind, isEmptyFileCell } from "./user-tables/cell-kind.js";
34
+ import { columnTypeReader, inferColumnType, maxShortText, minWholeDigits, widerFieldTypes } from "./user-tables/column-type.js";
35
+ import { userTableNameIssue } from "./user-tables/names.js";
36
+ import { fieldNamesOf, tableNameOf } from "./user-tables/column-names.js";
37
+ export { accessWarnings, addressWords, anonymousRole, appPath, argumentsSchema, badgeTones, bottomBar, bottomBarErrors, cellKind, checkFilter, checkOrderBy, checkRecord, columnTypeReader, connectParams, connectPath, connectRoute, createWhere, defineRoles, encrypted, enumLabel, evaluateFilter, f, fieldNamesOf, fieldRef, fieldsUsedBy, fitsKeyType, formPath, formRoute, imageFormats, inferColumnType, isBadgeTone, isEmptyFileCell, isRecordCondition, keyTypes, layout as l, maxBottomBarItems, maxJsonDepth, maxShortText, minWholeDigits, parseFilter, parseOrderBy, pickView, printFilter, printOrderBy, readAppPath, readConnectAddress, readFormAddress, readSignInAddress, resolveAccess, resource, restrictModel, rule, signInParams, signInPath, signInRoute, signInSteps, tableNameOf, userMenu, userTableNameIssue, view, where, widerFieldTypes };
@@ -8,6 +8,8 @@ import { fieldRefsIn, isFieldRef, markFieldRefs, unmarkFieldRefs } from "./field
8
8
  import { bottomBarFor } from "./bottom-bar.js";
9
9
  import { decodeKey, encodeKey } from "./keys.js";
10
10
  import { parseCapability } from "./access/capability.js";
11
+ import { reservedWords } from "./user-tables/reserved-words.js";
12
+ import { isUserTableName, maxLabelLength, maxNameBytes, maxOrganizationNameBytes, organizationColumn, reservedFieldNames, userTableName } from "./user-tables/names.js";
11
13
  import { checkEventFilter } from "./events/event-models.js";
12
14
  import { webhookResources } from "./webhooks/webhook-resources.js";
13
15
  import { workflowResources } from "./workflows/workflow-resources.js";
@@ -45,4 +47,4 @@ import { builtInFieldTypes } from "./built-in-field-types.js";
45
47
  import { CallCandidate, CallClientMessage, CallDescription, CallGuestLink, CallGuestRefusal, CallGuestState, CallLeftReason, CallLobbyGuest, CallMode, CallRemoteTrack, CallResume, CallRosterMember, CallServerMessage, CallTrackRequest, CallTrackSource, CallVideoLayer } from "./calls/call-protocol.js";
46
48
  import { guestCallsPath } from "./calls/call-guests.js";
47
49
  import { CallRing, callsChannelEvent, declineWord, ringNotice, ringsPath } from "./calls/call-rings.js";
48
- export { type AddressCheck, type Availability, type CallCandidate, type CallClientMessage, type CallDescription, type CallGuestLink, type CallGuestRefusal, type CallGuestState, type CallLeftReason, type CallLobbyGuest, type CallMode, type CallRemoteTrack, type CallResume, type CallRing, type CallRosterMember, type CallServerMessage, type CallTrackRequest, type CallTrackSource, type CallVideoLayer, type FormulaNode, type Locale, type MobileReleaseAnswer, type PersonStatus, type PluginHost, type PluginRequirement, type PropShapes, type RefShape, type ReleaseBinding, type SearchTerm, type StatusInput, type WorkflowTypeEntry, type WorkflowTypeList, actionConditionError, actionInputErrors, addressErrors, addressPlaceholders, apiOriginMeta, appHrefError, applyAssistantEvent, authBasePath, availabilities, boardErrors, bottomBarFor, builtInFieldTypes, callsChannelEvent, capacitorOrigin, cardPhotoLimit, chartFields, checkEventFilter, checkedAccept, checkedProvider, confirmationMinutes, datesErrors, declineWord, decodeKey, defaultRecentLimit, deviceIdParam, devicesPath, displayFields, emailCodeMinutes, emptyAssistantState, encodeKey, fieldRefsIn, fillAddress, firstPartyCodeKey, guestCallsPath, heldStatus, historyIdParam, historyIdPattern, historyPath, hrefField, hrefPlaceholders, humanize, inRange, isFieldRef, isGroupChart, isLocale, labelFieldOf, layoutItems, leavesApp, linkActionError, listColumnNames, locales, markFieldRefs, matchedSearchField, matchesSearch, maxStatusText, mobileReleaseBasePath, mobileReleaseParams, mobileReleasePath, mobileReleaseQuery, mobileReleasesPath, navRecentErrors, parseCapability, parseFormula, parseSize, parseTable, pickLocale, pluginProblem, promptError, promptFields, pruneByShape, pushRecord, readEventStream, recordTitle, recordTitleField, redactSecrets, releaseManifestFile, releaseStatementContext, releaseStatementFile, renderPrompt, resourceField, ringNotice, ringsPath, searchTerms, serviceWorkerFile, shapes, shownInputs, statusPath, statusTextProblem, statusTones, tableDisplay, termMatches, unmarkFieldRefs, updateSetErrors, updateValues, viewOfList, webhookResources, workflowResources, workflowTypesPath };
50
+ export { type AddressCheck, type Availability, type CallCandidate, type CallClientMessage, type CallDescription, type CallGuestLink, type CallGuestRefusal, type CallGuestState, type CallLeftReason, type CallLobbyGuest, type CallMode, type CallRemoteTrack, type CallResume, type CallRing, type CallRosterMember, type CallServerMessage, type CallTrackRequest, type CallTrackSource, type CallVideoLayer, type FormulaNode, type Locale, type MobileReleaseAnswer, type PersonStatus, type PluginHost, type PluginRequirement, type PropShapes, type RefShape, type ReleaseBinding, type SearchTerm, type StatusInput, type WorkflowTypeEntry, type WorkflowTypeList, actionConditionError, actionInputErrors, addressErrors, addressPlaceholders, apiOriginMeta, appHrefError, applyAssistantEvent, authBasePath, availabilities, boardErrors, bottomBarFor, builtInFieldTypes, callsChannelEvent, capacitorOrigin, cardPhotoLimit, chartFields, checkEventFilter, checkedAccept, checkedProvider, confirmationMinutes, datesErrors, declineWord, decodeKey, defaultRecentLimit, deviceIdParam, devicesPath, displayFields, emailCodeMinutes, emptyAssistantState, encodeKey, fieldRefsIn, fillAddress, firstPartyCodeKey, guestCallsPath, heldStatus, historyIdParam, historyIdPattern, historyPath, hrefField, hrefPlaceholders, humanize, inRange, isFieldRef, isGroupChart, isLocale, isUserTableName, labelFieldOf, layoutItems, leavesApp, linkActionError, listColumnNames, locales, markFieldRefs, matchedSearchField, matchesSearch, maxLabelLength, maxNameBytes, maxOrganizationNameBytes, maxStatusText, mobileReleaseBasePath, mobileReleaseParams, mobileReleasePath, mobileReleaseQuery, mobileReleasesPath, navRecentErrors, organizationColumn, parseCapability, parseFormula, parseSize, parseTable, pickLocale, pluginProblem, promptError, promptFields, pruneByShape, pushRecord, readEventStream, recordTitle, recordTitleField, redactSecrets, releaseManifestFile, releaseStatementContext, releaseStatementFile, renderPrompt, reservedFieldNames, reservedWords, resourceField, ringNotice, ringsPath, searchTerms, serviceWorkerFile, shapes, shownInputs, statusPath, statusTextProblem, statusTones, tableDisplay, termMatches, unmarkFieldRefs, updateSetErrors, updateValues, userTableName, viewOfList, webhookResources, workflowResources, workflowTypesPath };
package/dist/internal.js CHANGED
@@ -17,6 +17,8 @@ import { fieldRefsIn, isFieldRef, markFieldRefs, unmarkFieldRefs } from "./field
17
17
  import { boardErrors, cardPhotoLimit, datesErrors, displayFields, tableDisplay } from "./view-displays.js";
18
18
  import { bottomBarFor } from "./bottom-bar.js";
19
19
  import { decodeKey, encodeKey } from "./keys.js";
20
+ import { reservedWords } from "./user-tables/reserved-words.js";
21
+ import { isUserTableName, maxLabelLength, maxNameBytes, maxOrganizationNameBytes, organizationColumn, reservedFieldNames, userTableName } from "./user-tables/names.js";
20
22
  import { webhookResources } from "./webhooks/webhook-resources.js";
21
23
  import { workflowResources } from "./workflows/workflow-resources.js";
22
24
  import { workflowTypesPath } from "./workflows/workflow-types-path.js";
@@ -44,4 +46,4 @@ import { listColumnNames } from "./list-columns.js";
44
46
  import { builtInFieldTypes } from "./built-in-field-types.js";
45
47
  import { guestCallsPath } from "./calls/call-guests.js";
46
48
  import { callsChannelEvent, declineWord, ringNotice, ringsPath } from "./calls/call-rings.js";
47
- export { actionConditionError, actionInputErrors, addressErrors, addressPlaceholders, apiOriginMeta, appHrefError, applyAssistantEvent, authBasePath, availabilities, boardErrors, bottomBarFor, builtInFieldTypes, callsChannelEvent, capacitorOrigin, cardPhotoLimit, chartFields, checkEventFilter, checkedAccept, checkedProvider, confirmationMinutes, datesErrors, declineWord, decodeKey, defaultRecentLimit, deviceIdParam, devicesPath, displayFields, emailCodeMinutes, emptyAssistantState, encodeKey, fieldRefsIn, fillAddress, firstPartyCodeKey, guestCallsPath, heldStatus, historyIdParam, historyIdPattern, historyPath, hrefField, hrefPlaceholders, humanize, inRange, isFieldRef, isGroupChart, isLocale, labelFieldOf, layoutItems, leavesApp, linkActionError, listColumnNames, locales, markFieldRefs, matchedSearchField, matchesSearch, maxStatusText, mobileReleaseBasePath, mobileReleaseParams, mobileReleasePath, mobileReleaseQuery, mobileReleasesPath, navRecentErrors, parseCapability, parseFormula, parseSize, parseTable, pickLocale, pluginProblem, promptError, promptFields, pruneByShape, pushRecord, readEventStream, recordTitle, recordTitleField, redactSecrets, releaseManifestFile, releaseStatementContext, releaseStatementFile, renderPrompt, resourceField, ringNotice, ringsPath, searchTerms, serviceWorkerFile, shapes, shownInputs, statusPath, statusTextProblem, statusTones, tableDisplay, termMatches, unmarkFieldRefs, updateSetErrors, updateValues, viewOfList, webhookResources, workflowResources, workflowTypesPath };
49
+ export { actionConditionError, actionInputErrors, addressErrors, addressPlaceholders, apiOriginMeta, appHrefError, applyAssistantEvent, authBasePath, availabilities, boardErrors, bottomBarFor, builtInFieldTypes, callsChannelEvent, capacitorOrigin, cardPhotoLimit, chartFields, checkEventFilter, checkedAccept, checkedProvider, confirmationMinutes, datesErrors, declineWord, decodeKey, defaultRecentLimit, deviceIdParam, devicesPath, displayFields, emailCodeMinutes, emptyAssistantState, encodeKey, fieldRefsIn, fillAddress, firstPartyCodeKey, guestCallsPath, heldStatus, historyIdParam, historyIdPattern, historyPath, hrefField, hrefPlaceholders, humanize, inRange, isFieldRef, isGroupChart, isLocale, isUserTableName, labelFieldOf, layoutItems, leavesApp, linkActionError, listColumnNames, locales, markFieldRefs, matchedSearchField, matchesSearch, maxLabelLength, maxNameBytes, maxOrganizationNameBytes, maxStatusText, mobileReleaseBasePath, mobileReleaseParams, mobileReleasePath, mobileReleaseQuery, mobileReleasesPath, navRecentErrors, organizationColumn, parseCapability, parseFormula, parseSize, parseTable, pickLocale, pluginProblem, promptError, promptFields, pruneByShape, pushRecord, readEventStream, recordTitle, recordTitleField, redactSecrets, releaseManifestFile, releaseStatementContext, releaseStatementFile, renderPrompt, reservedFieldNames, reservedWords, resourceField, ringNotice, ringsPath, searchTerms, serviceWorkerFile, shapes, shownInputs, statusPath, statusTextProblem, statusTones, tableDisplay, termMatches, unmarkFieldRefs, updateSetErrors, updateValues, userTableName, viewOfList, webhookResources, workflowResources, workflowTypesPath };
package/dist/model.d.ts CHANGED
@@ -1334,8 +1334,11 @@ export type ViewModel = {
1334
1334
  signIn?: SignInPromptModel;
1335
1335
  /** The list page's button that saves its filter as a search of the user's own. */
1336
1336
  saveSearch?: SaveSearchModel;
1337
- /** Whether the list page offers Import, which creates or updates records from an .xlsx or CSV file; it does when omitted. */
1338
- import?: boolean;
1337
+ /**
1338
+ * Whether the list page offers Import, which creates or updates records from an .xlsx, CSV or JSON file; it does when
1339
+ * omitted. `table` makes it a new table users add from the file, with its fields and records.
1340
+ */
1341
+ import?: boolean | 'table';
1339
1342
  /** The list page shows the user's saved searches of another resource, each with what it finds, instead of rows. */
1340
1343
  searchesOf?: SearchesOfModel;
1341
1344
  /** Whether the list page offers Export, and the most rows a file holds; offered without a limit when omitted. */
@@ -0,0 +1,29 @@
1
+ //#region src/user-tables/cell-kind.d.ts
2
+ /**
3
+ * A cell of a file as a table is made from it: text (every CSV cell), a number, a boolean, a date or time a workbook
4
+ * stores as one (`{ date: '2026-03-01' }` or `{ date: '2026-03-01T14:30:00' }`, without a zone), a JSON file's nested
5
+ * object or array (`{ json }`), or `null` for an empty cell.
6
+ */
7
+ export type FileCell = string | number | boolean | FileDate | FileJson | null;
8
+ /** A date or time a workbook stores as one. */
9
+ export type FileDate = {
10
+ /** `2026-03-01`, or `2026-03-01T14:30:00` with its time and no zone. */
11
+ date: string;
12
+ };
13
+ /** A JSON file's nested object or array. */
14
+ export type FileJson = {
15
+ /** The value as the file states it. */
16
+ json: unknown;
17
+ };
18
+ /** Whether the cell holds nothing: no value, or only spaces. */
19
+ export declare const isEmptyFileCell: (cell: FileCell) => boolean;
20
+ /**
21
+ * What one cell says it is. Only forms that read one way are anything but text: a whole number without leading zeros
22
+ * or a plus sign (so `007` and `+31` stay text), a decimal with a point, true or false, an ISO date, an ISO date and
23
+ * time with its zone (`zoned`) or without (`local`), or a nested JSON value. A comma decimal, a thousands separator or
24
+ * `03/04/2026` could be read two ways, so they are text.
25
+ */
26
+ export type CellKind = 'text' | 'whole' | 'decimal' | 'boolean' | 'date' | 'local' | 'zoned' | 'json';
27
+ /** What a cell that is not empty says it is. */
28
+ export declare const cellKind: (cell: Exclude<FileCell, null>) => CellKind;
29
+ //#endregion
@@ -0,0 +1,43 @@
1
+ //#region src/user-tables/cell-kind.ts
2
+ /** Whether the cell holds nothing: no value, or only spaces. */
3
+ const isEmptyFileCell = (cell) => cell === null || typeof cell === "string" && cell.trim() === "";
4
+ const wholePattern = /^-?(0|[1-9]\d*)$/;
5
+ const decimalPattern = /^-?(0|[1-9]\d*)\.\d+$/;
6
+ const datePattern = /^(\d{4})-(\d{2})-(\d{2})$/;
7
+ const timePattern = /^(\d{4}-\d{2}-\d{2})[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,6})?)?(Z|[+-]\d{2}:\d{2})?$/;
8
+ const isCalendarDate = (text) => {
9
+ const match = datePattern.exec(text);
10
+ if (!match) return false;
11
+ const [year, month, day] = [
12
+ Number(match[1]),
13
+ Number(match[2]),
14
+ Number(match[3])
15
+ ];
16
+ const at = new Date(Date.UTC(year, month - 1, day));
17
+ return at.getUTCFullYear() === year && at.getUTCMonth() === month - 1 && at.getUTCDate() === day;
18
+ };
19
+ const textKind = (text) => {
20
+ if (wholePattern.test(text)) return "whole";
21
+ if (decimalPattern.test(text)) return "decimal";
22
+ if (/^(true|false)$/i.test(text)) return "boolean";
23
+ if (isCalendarDate(text)) return "date";
24
+ const time = timePattern.exec(text);
25
+ if (!time?.[1] || !isCalendarDate(time[1])) return "text";
26
+ if (Number(time[2]) > 23 || Number(time[3]) > 59 || Number(time[4] ?? 0) > 59) return "text";
27
+ return time[5] ? "zoned" : "local";
28
+ };
29
+ /** What a cell that is not empty says it is. */
30
+ const cellKind = (cell) => {
31
+ if (typeof cell === "boolean") return "boolean";
32
+ if (typeof cell === "number") return Number.isInteger(cell) ? "whole" : "decimal";
33
+ if (typeof cell === "string") return textKind(cell.trim());
34
+ if ("json" in cell) return "json";
35
+ return cell.date.includes("T") ? "local" : "date";
36
+ };
37
+ /** A number cell, or the text of a whole or decimal one, as plain digits with a point: `1e21` as `1000000000000000000000`. */
38
+ const plainNumber = (cell) => typeof cell === "number" ? cell.toLocaleString("en-US", {
39
+ useGrouping: false,
40
+ maximumFractionDigits: 100
41
+ }) : cell.trim();
42
+ //#endregion
43
+ export { cellKind, isEmptyFileCell, plainNumber };
@@ -0,0 +1,15 @@
1
+ //#region src/user-tables/column-names.d.ts
2
+ /**
3
+ * The field names of a file's columns from their headers, in order: each in snake_case, `column_<letters>` (its
4
+ * letters in the file) for a header with no letters or digits, and a name that repeats an earlier one, is a word SQL
5
+ * reserves or a name every table's field has (`id`, `etag`, `organization_id`) with `_2`, `_3` and so on after it.
6
+ * Two headers never share a name.
7
+ */
8
+ export declare const fieldNamesOf: (headers: readonly string[]) => string[];
9
+ /**
10
+ * A table's name from a file's name, without its extension, in snake_case, and with `_2`, `_3` and so on after it when
11
+ * a name in `taken`, such as the app's resources, or a word SQL reserves has it; `undefined` when the name has no
12
+ * letters or digits. `maxBytes` is 42 in an app with organizations.
13
+ */
14
+ export declare const tableNameOf: (fileName: string, taken?: Iterable<string>, maxBytes?: number) => string | undefined;
15
+ //#endregion
@@ -0,0 +1,42 @@
1
+ import { reservedWords } from "./reserved-words.js";
2
+ import { reservedFieldNames } from "./names.js";
3
+ //#region src/user-tables/column-names.ts
4
+ const snakeOf = (text) => text.normalize("NFKD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
5
+ const fitted = (name, prefix, maxBytes) => (/^[a-z]/.test(name) ? name : `${prefix}_${name}`).slice(0, maxBytes).replace(/_+$/, "");
6
+ const unique = (name, taken, maxBytes) => {
7
+ let candidate = name;
8
+ for (let next = 2; taken.has(candidate) || reservedWords.has(candidate); next++) {
9
+ const suffix = `_${next}`;
10
+ candidate = `${name.slice(0, maxBytes - suffix.length).replace(/_+$/, "")}${suffix}`;
11
+ }
12
+ return candidate;
13
+ };
14
+ /** A spreadsheet's letters for column `index`, in lower case: 0 is `a`, 27 is `ab`. */
15
+ const columnLetters = (index) => index < 26 ? String.fromCharCode(97 + index) : columnLetters(Math.floor(index / 26) - 1) + columnLetters(index % 26);
16
+ /**
17
+ * The field names of a file's columns from their headers, in order: each in snake_case, `column_<letters>` (its
18
+ * letters in the file) for a header with no letters or digits, and a name that repeats an earlier one, is a word SQL
19
+ * reserves or a name every table's field has (`id`, `etag`, `organization_id`) with `_2`, `_3` and so on after it.
20
+ * Two headers never share a name.
21
+ */
22
+ const fieldNamesOf = (headers) => {
23
+ const taken = new Set(reservedFieldNames);
24
+ return headers.map((header, index) => {
25
+ const snake = snakeOf(header);
26
+ const name = unique(snake === "" ? `column_${columnLetters(index)}` : fitted(snake, "column", 63), taken, 63);
27
+ taken.add(name);
28
+ return name;
29
+ });
30
+ };
31
+ /**
32
+ * A table's name from a file's name, without its extension, in snake_case, and with `_2`, `_3` and so on after it when
33
+ * a name in `taken`, such as the app's resources, or a word SQL reserves has it; `undefined` when the name has no
34
+ * letters or digits. `maxBytes` is 42 in an app with organizations.
35
+ */
36
+ const tableNameOf = (fileName, taken = [], maxBytes = 63) => {
37
+ const snake = snakeOf(fileName.replace(/\.(csv|tsv|txt|xlsx|json)$/i, ""));
38
+ if (snake === "") return;
39
+ return unique(fitted(snake, "table", maxBytes), new Set(taken), maxBytes);
40
+ };
41
+ //#endregion
42
+ export { fieldNamesOf, tableNameOf };
@@ -0,0 +1,54 @@
1
+ import { FileCell } from "./cell-kind.js";
2
+ import { UserTableFieldType } from "./names.js";
3
+ //#region src/user-tables/column-type.d.ts
4
+ /** The type a column of a file becomes, with a decimal's precision and scale. */
5
+ export type ColumnType = {
6
+ /** The field type of a table users add. */
7
+ type: UserTableFieldType;
8
+ /** A decimal's digits in all. */
9
+ precision?: number;
10
+ /** A decimal's digits after the point. */
11
+ scale?: number;
12
+ };
13
+ /** A decimal number's type, which always has its precision and scale. */
14
+ export type DecimalType = ColumnType & {
15
+ /** Its digits in all, from 1 to 1000. */
16
+ precision: number;
17
+ /** Its digits after the point, at most the precision. */
18
+ scale: number;
19
+ };
20
+ /** Reads a column's cells one at a time; see `columnTypeReader`. */
21
+ export type ColumnTypeReader = {
22
+ /** Reads one more cell of the column. */
23
+ add: (cell: FileCell) => void;
24
+ /** The type every cell read so far is written as. */
25
+ type: () => ColumnType;
26
+ /** The decimal number that holds every number read so far, for a column of numbers or one changed to a decimal. */
27
+ decimal: () => DecimalType;
28
+ };
29
+ /** The most characters a `text` field holds; a column with a longer value is `long_text`. */
30
+ export declare const maxShortText = 500;
31
+ /** The digits a decimal keeps before its point at least: 15, as many as a spreadsheet keeps of a number. */
32
+ export declare const minWholeDigits = 15;
33
+ /**
34
+ * Reads a column's cells one at a time and keeps only what its type needs, so a file of any length is read in the
35
+ * memory of one row: `add` each cell, then `type()` is one type every non-empty cell is written as, else text, and
36
+ * nothing else.
37
+ *
38
+ * - Whole numbers are `integer`, or a decimal of scale 0 once one is past the integer range.
39
+ * - Whole numbers with decimals are a `decimal` whose scale is the most digits after the point, with room for at least
40
+ * `minWholeDigits` before it.
41
+ * - True or false is `boolean`, ISO dates `date`, ISO dates and times `timestamp`: a time without a zone is read in
42
+ * the browser's time zone, as Import reads one.
43
+ * - A column with a nested JSON value is `json`, which holds its other values as they are.
44
+ * - A column of mixed forms, or of no values, is text: `long_text` once a value is over `maxShortText` characters.
45
+ */
46
+ export declare const columnTypeReader: () => ColumnTypeReader;
47
+ /** The type of a column from all its cells at once; see `columnTypeReader`. */
48
+ export declare const inferColumnType: (cells: Iterable<FileCell>) => ColumnType;
49
+ /**
50
+ * The types a column of `type` may be changed to, itself first: only less specific ones, which take every value it
51
+ * holds as the file wrote it. A long text and a JSON column keep their type.
52
+ */
53
+ export declare const widerFieldTypes: (type: UserTableFieldType) => UserTableFieldType[];
54
+ //#endregion
@@ -0,0 +1,104 @@
1
+ import { cellKind, isEmptyFileCell, plainNumber } from "./cell-kind.js";
2
+ //#region src/user-tables/column-type.ts
3
+ /** The most characters a `text` field holds; a column with a longer value is `long_text`. */
4
+ const maxShortText = 500;
5
+ /** The digits a decimal keeps before its point at least: 15, as many as a spreadsheet keeps of a number. */
6
+ const minWholeDigits = 15;
7
+ const maxPrecision = 1e3;
8
+ const int4 = 2147483647n;
9
+ const kindTypes = {
10
+ boolean: "boolean",
11
+ date: "date",
12
+ local: "timestamp",
13
+ zoned: "timestamp",
14
+ json: "json"
15
+ };
16
+ /**
17
+ * Reads a column's cells one at a time and keeps only what its type needs, so a file of any length is read in the
18
+ * memory of one row: `add` each cell, then `type()` is one type every non-empty cell is written as, else text, and
19
+ * nothing else.
20
+ *
21
+ * - Whole numbers are `integer`, or a decimal of scale 0 once one is past the integer range.
22
+ * - Whole numbers with decimals are a `decimal` whose scale is the most digits after the point, with room for at least
23
+ * `minWholeDigits` before it.
24
+ * - True or false is `boolean`, ISO dates `date`, ISO dates and times `timestamp`: a time without a zone is read in
25
+ * the browser's time zone, as Import reads one.
26
+ * - A column with a nested JSON value is `json`, which holds its other values as they are.
27
+ * - A column of mixed forms, or of no values, is text: `long_text` once a value is over `maxShortText` characters.
28
+ */
29
+ const columnTypeReader = () => {
30
+ const kinds = /* @__PURE__ */ new Set();
31
+ let wholeDigits = 1;
32
+ let scale = 0;
33
+ let pastInteger = false;
34
+ let longest = 0;
35
+ const add = (cell) => {
36
+ if (cell === null || isEmptyFileCell(cell)) return;
37
+ if (typeof cell === "string") longest = Math.max(longest, cell.length);
38
+ const kind = cellKind(cell);
39
+ kinds.add(kind);
40
+ if (kind !== "whole" && kind !== "decimal") return;
41
+ const [whole = "", fraction = ""] = plainNumber(cell).replace("-", "").split(".");
42
+ wholeDigits = Math.max(wholeDigits, whole.length);
43
+ scale = Math.max(scale, fraction.length);
44
+ if (kind === "whole" && !pastInteger) {
45
+ const value = BigInt(plainNumber(cell));
46
+ pastInteger = (value < 0n ? -value - 1n : value) > int4;
47
+ }
48
+ };
49
+ const decimal = () => {
50
+ const precision = Math.min(maxPrecision, Math.max(wholeDigits, 15) + scale);
51
+ return {
52
+ type: "decimal",
53
+ precision,
54
+ scale: Math.min(scale, precision)
55
+ };
56
+ };
57
+ const type = () => {
58
+ if (kinds.has("json")) return { type: "json" };
59
+ const only = kinds.size === 1 ? [...kinds][0] : void 0;
60
+ if (only === "whole") return pastInteger ? decimal() : { type: "integer" };
61
+ if (kinds.size === 2 && kinds.has("whole") && kinds.has("decimal")) return decimal();
62
+ if (only === "decimal") return decimal();
63
+ if (only && only !== "text") return { type: kindTypes[only] };
64
+ return { type: longest > 500 ? "long_text" : "text" };
65
+ };
66
+ return {
67
+ add,
68
+ type,
69
+ decimal
70
+ };
71
+ };
72
+ /** The type of a column from all its cells at once; see `columnTypeReader`. */
73
+ const inferColumnType = (cells) => {
74
+ const reader = columnTypeReader();
75
+ for (const cell of cells) reader.add(cell);
76
+ return reader.type();
77
+ };
78
+ /**
79
+ * The types a column of `type` may be changed to, itself first: only less specific ones, which take every value it
80
+ * holds as the file wrote it. A long text and a JSON column keep their type.
81
+ */
82
+ const widerFieldTypes = (type) => {
83
+ switch (type) {
84
+ case "integer": return [
85
+ "integer",
86
+ "decimal",
87
+ "text",
88
+ "long_text"
89
+ ];
90
+ case "decimal":
91
+ case "boolean":
92
+ case "date":
93
+ case "timestamp": return [
94
+ type,
95
+ "text",
96
+ "long_text"
97
+ ];
98
+ case "text": return ["text", "long_text"];
99
+ case "long_text":
100
+ case "json": return [type];
101
+ }
102
+ };
103
+ //#endregion
104
+ export { columnTypeReader, inferColumnType, maxShortText, minWholeDigits, widerFieldTypes };
@@ -0,0 +1,26 @@
1
+ import { reservedWords } from "./reserved-words.js";
2
+ //#region src/user-tables/names.d.ts
3
+ /** The field types a table users add may have. */
4
+ export type UserTableFieldType = 'text' | 'long_text' | 'integer' | 'decimal' | 'boolean' | 'date' | 'timestamp' | 'json';
5
+ /** What a name of a user table or field must be: it reaches SQL as an identifier, always quoted too. */
6
+ export declare const userTableName: RegExp;
7
+ /** The most bytes Postgres keeps of an identifier. */
8
+ export declare const maxNameBytes = 63;
9
+ /**
10
+ * The most bytes the name of a table has in an app with organizations: its table is `t<id>_<name>`, and the id, a
11
+ * bigint, takes up to 19 digits of the 63 bytes Postgres keeps.
12
+ */
13
+ export declare const maxOrganizationNameBytes: number;
14
+ /** The most characters a label of a table or field users add has. */
15
+ export declare const maxLabelLength = 200;
16
+ /** The column that holds the organization of each record of a table users add with organizations, and of each definition. */
17
+ export declare const organizationColumn = "organization_id";
18
+ /** The names a field never takes: the key's, the API's for the record version, and the organization's. */
19
+ export declare const reservedFieldNames: readonly string[];
20
+ export declare const isUserTableName: (name: string) => boolean;
21
+ /** Why a table or field users add may not have a name: its form or length, a word SQL reserves, or a name every table's field has. */
22
+ export type UserTableNameIssue = 'form' | 'reserved_word' | 'reserved_field';
23
+ /** What is wrong with a name a table or field users add is given, or `undefined` when it may have it; `maxBytes` defaults to 63. */
24
+ export declare const userTableNameIssue: (name: unknown, kind: "table" | "field", maxBytes?: number) => UserTableNameIssue | undefined;
25
+ //#endregion
26
+ export { reservedWords };
@@ -0,0 +1,30 @@
1
+ import { reservedWords } from "./reserved-words.js";
2
+ //#region src/user-tables/names.ts
3
+ /** What a name of a user table or field must be: it reaches SQL as an identifier, always quoted too. */
4
+ const userTableName = /^[a-z][a-z0-9_]*$/;
5
+ /** The most bytes Postgres keeps of an identifier. */
6
+ const maxNameBytes = 63;
7
+ /**
8
+ * The most bytes the name of a table has in an app with organizations: its table is `t<id>_<name>`, and the id, a
9
+ * bigint, takes up to 19 digits of the 63 bytes Postgres keeps.
10
+ */
11
+ const maxOrganizationNameBytes = 42;
12
+ /** The most characters a label of a table or field users add has. */
13
+ const maxLabelLength = 200;
14
+ /** The column that holds the organization of each record of a table users add with organizations, and of each definition. */
15
+ const organizationColumn = "organization_id";
16
+ /** The names a field never takes: the key's, the API's for the record version, and the organization's. */
17
+ const reservedFieldNames = [
18
+ "id",
19
+ "etag",
20
+ organizationColumn
21
+ ];
22
+ const isUserTableName = (name) => userTableName.test(name) && new TextEncoder().encode(name).length <= 63;
23
+ /** What is wrong with a name a table or field users add is given, or `undefined` when it may have it; `maxBytes` defaults to 63. */
24
+ const userTableNameIssue = (name, kind, maxBytes = 63) => {
25
+ if (typeof name !== "string" || !isUserTableName(name) || new TextEncoder().encode(name).length > maxBytes) return "form";
26
+ if (reservedWords.has(name)) return "reserved_word";
27
+ if (kind === "field" && reservedFieldNames.includes(name)) return "reserved_field";
28
+ };
29
+ //#endregion
30
+ export { isUserTableName, maxLabelLength, maxNameBytes, maxOrganizationNameBytes, organizationColumn, reservedFieldNames, reservedWords, userTableName, userTableNameIssue };
@@ -0,0 +1,7 @@
1
+ //#region src/user-tables/reserved-words.d.ts
2
+ /**
3
+ * The key words Postgres 18 reserves, `select word from pg_get_keywords() where catcode = 'R'`: a table or field users
4
+ * add never takes one, so its name works unquoted in any SQL a developer writes against it.
5
+ */
6
+ export declare const reservedWords: ReadonlySet<string>;
7
+ //#endregion
@@ -0,0 +1,87 @@
1
+ //#region src/user-tables/reserved-words.ts
2
+ /**
3
+ * The key words Postgres 18 reserves, `select word from pg_get_keywords() where catcode = 'R'`: a table or field users
4
+ * add never takes one, so its name works unquoted in any SQL a developer writes against it.
5
+ */
6
+ const reservedWords = /* @__PURE__ */ new Set([
7
+ "all",
8
+ "analyse",
9
+ "analyze",
10
+ "and",
11
+ "any",
12
+ "array",
13
+ "as",
14
+ "asc",
15
+ "asymmetric",
16
+ "both",
17
+ "case",
18
+ "cast",
19
+ "check",
20
+ "collate",
21
+ "column",
22
+ "constraint",
23
+ "create",
24
+ "current_catalog",
25
+ "current_date",
26
+ "current_role",
27
+ "current_time",
28
+ "current_timestamp",
29
+ "current_user",
30
+ "default",
31
+ "deferrable",
32
+ "desc",
33
+ "distinct",
34
+ "do",
35
+ "else",
36
+ "end",
37
+ "except",
38
+ "false",
39
+ "fetch",
40
+ "for",
41
+ "foreign",
42
+ "from",
43
+ "grant",
44
+ "group",
45
+ "having",
46
+ "in",
47
+ "initially",
48
+ "intersect",
49
+ "into",
50
+ "lateral",
51
+ "leading",
52
+ "limit",
53
+ "localtime",
54
+ "localtimestamp",
55
+ "not",
56
+ "null",
57
+ "offset",
58
+ "on",
59
+ "only",
60
+ "or",
61
+ "order",
62
+ "placing",
63
+ "primary",
64
+ "references",
65
+ "returning",
66
+ "select",
67
+ "session_user",
68
+ "some",
69
+ "symmetric",
70
+ "system_user",
71
+ "table",
72
+ "then",
73
+ "to",
74
+ "trailing",
75
+ "true",
76
+ "union",
77
+ "unique",
78
+ "user",
79
+ "using",
80
+ "variadic",
81
+ "when",
82
+ "where",
83
+ "window",
84
+ "with"
85
+ ]);
86
+ //#endregion
87
+ export { reservedWords };
package/dist/view.d.ts CHANGED
@@ -151,11 +151,12 @@ export declare class ViewBuilder<R extends {
151
151
  */
152
152
  recordWidth(recordWidth: PageWidth): ViewBuilder<R>;
153
153
  /**
154
- * Whether the list page offers Import, which creates or updates records from an .xlsx or CSV file the user picks
155
- * (`true`, the default, to users who may create records); `.import(false)` turns it off. See
154
+ * Whether the list page offers Import, which creates or updates records from an .xlsx, CSV or JSON file the user
155
+ * picks (`true`, the default, to users who may create records); `.import(false)` turns it off. `.import('table')`
156
+ * makes it a new table users add from the file instead, as the Tables list of user tables does. See
156
157
  * [Importing records](docs/website/src/content/docs/reference/ui-config.mdx#importing-records).
157
158
  */
158
- import(enabled: boolean): ViewBuilder<R>;
159
+ import(enabled: boolean | 'table'): ViewBuilder<R>;
159
160
  /**
160
161
  * The named actions of the record page's action rail, which composed pages can put on buttons too: `a.update`,
161
162
  * `a.remove` and `a.link` need no code, `a.action` runs a handler the app registers.
package/dist/view.js CHANGED
@@ -223,8 +223,9 @@ var ViewBuilder = class ViewBuilder {
223
223
  return this.next({ recordWidth });
224
224
  }
225
225
  /**
226
- * Whether the list page offers Import, which creates or updates records from an .xlsx or CSV file the user picks
227
- * (`true`, the default, to users who may create records); `.import(false)` turns it off. See
226
+ * Whether the list page offers Import, which creates or updates records from an .xlsx, CSV or JSON file the user
227
+ * picks (`true`, the default, to users who may create records); `.import(false)` turns it off. `.import('table')`
228
+ * makes it a new table users add from the file instead, as the Tables list of user tables does. See
228
229
  * [Importing records](docs/website/src/content/docs/reference/ui-config.mdx#importing-records).
229
230
  */
230
231
  import(enabled) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protobase/schema",
3
- "version": "0.68.2",
3
+ "version": "0.68.3",
4
4
  "description": "Resource, field, view and access definitions for Protobase configs.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {