@ghentcdh/crouton-core 0.0.1-alpha.36
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.cjs +1280 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2894 -0
- package/dist/index.d.ts +2894 -0
- package/dist/index.js +1175 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/request.model.ts","../src/lib/zod.types.ts","../src/lib/filter.ts","../src/lib/response.model.ts","../src/lib/create-schema.ts","../src/lib/schema.utils.ts","../src/lib/layout/base.builder.ts","../src/lib/layout/control.builder.ts","../src/lib/layout/layout.builder.ts","../src/lib/from-json.builder.ts","../src/lib/value-label.ts","../src/lib/layout/category.builder.ts","../src/lib/layout/group.builder.ts","../src/lib/table/table.builder.ts","../src/lib/table/table.utils.ts","../src/lib/data-source/DataSourceSchema.ts","../src/lib/data-source/Operations.schema.ts","../src/lib/resource/ResourceJson.schema.ts","../src/lib/resource/CalculatedColumn.schema.ts","../src/lib/resource/FieldInput.schema.ts","../src/lib/schema/label.helper.ts","../src/lib/resource/Column.ts","../src/lib/resource/Sidebar.schema.ts","../src/lib/resource/TableAction.schema.ts","../src/lib/resource/include.schema.ts","../src/lib/resource/fieldVariants.ts","../src/lib/config/CroutonConfig.schema.ts","../src/lib/config/readConfig.ts"],"sourcesContent":["export * from './lib/filter';\nexport * from './lib/request.model';\nexport * from './lib/response.model';\nexport * from './lib/zod.types';\nexport * from './lib/create-schema';\nexport * from './lib/schema.utils';\nexport * from './lib/from-json.builder';\nexport * from './lib/value-label';\nexport * from './lib/layout/layout.builder';\nexport * from './lib/layout/control.builder';\nexport * from './lib/layout/category.builder';\nexport * from './lib/layout/group.builder';\nexport * from './lib/layout/base.builder';\nexport * from './lib/table/table.builder';\nexport * from './lib/table/table.utils';\n\nexport * from './lib/data-source';\nexport * from './lib/resource';\nexport * from './lib/config';\nexport * from './lib/schema/label.helper';\n","import { z } from 'zod';\n\nimport { PositiveRequestNumber, StringOrArray } from './zod.types';\n\nexport const SortDirEnum = z.enum(['asc', 'desc']);\nexport type SortDir = z.infer<typeof SortDirEnum>;\n\nexport const RequestSchema = z.object({\n page: PositiveRequestNumber().optional().default(1),\n pageSize: PositiveRequestNumber().optional().default(20),\n sort: z.string().optional().default('id'),\n sortDir: SortDirEnum.optional().default('asc'),\n // Filter is of the format key:value:operator (e.g. name:john:eq) operator is optional\n filter: StringOrArray().optional().default([]),\n});\n\nexport type ListRequest = z.infer<typeof RequestSchema>;\n\n/** @deprecated Use `ListRequest` instead — `Request` shadows the global DOM `Request` type. */\nexport type Request = ListRequest;\n\nexport const RequestSchemaWithOffset = RequestSchema.transform((schema) => {\n const { page, pageSize, sort } = schema;\n return {\n ...schema,\n sort: sort || 'id',\n offset: (page - 1) * pageSize,\n };\n});\n","import { z } from 'zod';\n\nexport const PositiveRequestNumber = () =>\n z.coerce.number().int().positive().nonnegative();\nexport const StringOrArray = () =>\n z\n .string()\n .or(z.array(z.string()))\n .transform((val) => {\n if (Array.isArray(val)) return val;\n return [val];\n });\n","import { SortDirEnum } from './request.model';\n\nexport const Operator = [\n 'contains',\n 'not_contains',\n 'equals',\n 'not_equals',\n 'gt',\n 'lt',\n 'isnull',\n 'isnotnull',\n] as const;\n\nexport type OperatorType = (typeof Operator)[number];\n\n/** Human-readable label shown in the filter operator dropdown. */\nexport const OperatorLabel: Record<OperatorType, string> = {\n contains: 'contains',\n not_contains: 'not contains',\n equals: 'equals',\n not_equals: 'not equals',\n gt: '>',\n lt: '<',\n isnull: 'is empty',\n isnotnull: 'is not empty',\n};\n\nexport const OperatorOptions = Operator.map((k) => ({\n value: k,\n label: OperatorLabel[k],\n}));\n\n/** Operators that don't require a user-supplied value. */\nexport const OperatorNoValue = new Set<OperatorType>(['isnull', 'isnotnull']);\n\n/** Field types used to restrict which operators are shown in the filter UI. */\nexport type FieldType = 'string' | 'number' | 'date' | 'boolean' | 'enum';\n\n/** Operators available for each field type. */\nexport const OperatorsByType: Record<FieldType, OperatorType[]> = {\n string: ['contains', 'not_contains', 'equals', 'not_equals', 'isnull', 'isnotnull'],\n number: ['equals', 'not_equals', 'gt', 'lt', 'isnull', 'isnotnull'],\n date: ['equals', 'not_equals', 'gt', 'lt', 'isnull', 'isnotnull'],\n boolean: ['equals', 'not_equals', 'isnull', 'isnotnull'],\n enum: ['equals', 'not_equals', 'isnull', 'isnotnull'],\n};\n\nexport type Filter = {\n key: string;\n value: any;\n operator: OperatorType;\n label?: string;\n};\n\nconst getFilterValues = (filter: string): Filter => {\n const parts = filter.split(':');\n const key = parts[0] ?? '';\n const lastPart = parts[parts.length - 1] as OperatorType;\n const hasOp = parts.length >= 3 && Operator.includes(lastPart);\n const operator: OperatorType = hasOp ? lastPart : 'contains';\n const value = hasOp ? parts.slice(1, -1).join(':') : parts.slice(1).join(':');\n return { key, value, operator };\n};\n\nconst buildFilterKey = (keys: string[], filterObj: any): any => {\n if (keys.length === 1) return { key: keys[0], filterObj };\n const buildKey = keys.pop() as string;\n return buildFilterKey(keys, { [buildKey]: filterObj });\n};\n\nexport const buildSort = (key: string, sortDir?: string) =>\n buildSortKey(key.split('.'), SortDirEnum.safeParse(sortDir).data ?? 'asc');\n\nexport const buildSortKey = (keys: string[], sortDir: any): any => {\n if (keys.length === 1) return { [keys[0]]: sortDir };\n const buildKey = keys.pop() as string;\n return buildSortKey(keys, { [buildKey]: sortDir });\n};\n\nexport const buildFilter = (filters: string[]) => {\n const filter: Record<string, any> = {};\n filters?.forEach((f) => {\n const { key, value, operator } = getFilterValues(f);\n if (!key) return;\n const op = operator || 'contains';\n const filterObj: Record<string, string> = { [operator || 'contains']: value.toLowerCase() };\n if (op === 'contains') filterObj['mode'] = 'insensitive';\n const build = buildFilterKey(key.split('.'), filterObj);\n filter[build.key] = build.filterObj;\n });\n return filter;\n};\n\nexport const extractFilters = (filters: string[]) => {\n const result: Filter[] = [];\n filters.forEach((f) => {\n const { key, value, operator } = getFilterValues(f);\n if (!key) return;\n result.push({ label: key, key, value, operator });\n });\n return result;\n};\n\nexport const filterToString = (filter: Filter): string =>\n `${filter.key}:${filter.value}:${filter.operator}`;\n\nexport const stringToFilter = (s: string): Filter => getFilterValues(s);\n","import { z } from 'zod';\n\nimport { RequestSchema } from './request.model';\nimport { PositiveRequestNumber } from './zod.types';\n\nexport const ResponseRequestSchema = RequestSchema.extend({\n count: PositiveRequestNumber(),\n totalPages: PositiveRequestNumber(),\n});\n\nexport const ResponseSchema = z.object({\n data: z.array(z.unknown()),\n request: ResponseRequestSchema,\n});\n\nexport type ResponseData<TYPE> = z.infer<typeof ResponseSchema> & {\n data: TYPE[];\n};\n","import type { JsonSchema, Layout } from '@jsonforms/core';\nimport type { ZodObject } from 'zod';\nimport { toJSONSchema } from 'zod';\n\nexport enum ModalSize {\n xs = 'xs',\n sm = 'sm',\n lg = 'lg',\n xl = 'xl',\n}\n\nexport type ModalSizeType = keyof typeof ModalSize;\n\n/** @deprecated Use `ModalSize` instead. */\nexport { ModalSize as Size };\n/** @deprecated Use `ModalSizeType` instead. */\nexport type SizeType = ModalSizeType;\n\nexport type JsonFormsLayout = {\n uiSchema: Layout;\n schema: JsonSchema;\n modalSize?: ModalSizeType;\n};\n\nexport type FormSchemaModel = {\n form: JsonFormsLayout;\n table?: JsonFormsLayout;\n filter?: JsonFormsLayout;\n uri: string;\n searchUri: string;\n};\n\n/** Collapses a nullable `anyOf` to its non-null branch. Returns true if the property was nullable. */\nconst simplifyNullableAnyOf = (property: Record<string, unknown>): boolean => {\n const anyOf = property['anyOf'];\n if (!Array.isArray(anyOf) || anyOf.length !== 2) return false;\n const nonNull = anyOf.find((s: Record<string, unknown>) => s['type'] !== 'null');\n const hasNull = anyOf.some((s: Record<string, unknown>) => s['type'] === 'null');\n if (nonNull && hasNull) {\n delete property['anyOf'];\n Object.assign(property, nonNull);\n return true;\n }\n return false;\n};\n\nconst transformToJsonSchema = (schema: ZodObject<any>): JsonSchema => {\n const jsonSchema = toJSONSchema(schema, { unrepresentable: 'any', target: 'draft-07' });\n jsonSchema.additionalProperties = true;\n const properties = (jsonSchema as any).properties;\n if (properties) {\n const nullableKeys = new Set<string>();\n for (const key of Object.keys(properties)) {\n if (simplifyNullableAnyOf(properties[key])) nullableKeys.add(key);\n }\n // Nullable fields are treated as optional, so drop them from `required`.\n const required = (jsonSchema as any).required;\n if (Array.isArray(required)) {\n (jsonSchema as any).required = required.filter((key: string) => !nullableKeys.has(key));\n }\n }\n return jsonSchema as any;\n};\n\nexport const createSchema = (props: {\n uiSchema: any;\n tableSchema?: JsonSchema;\n filterSchema?: JsonSchema;\n schema: ZodObject<any>;\n dtoSchema: ZodObject<any>;\n responseSchema?: ZodObject<any>;\n uri: string;\n searchUri?: string;\n modalSize?: ModalSizeType;\n}) => {\n if (!props.schema) throw new Error('no schema provided');\n const schema = props.schema;\n const dtoSchema = props.dtoSchema;\n const formSchema = transformToJsonSchema(dtoSchema);\n const optionalSchema = transformToJsonSchema(schema.partial());\n return {\n dtoSchema,\n responseSchema: props.responseSchema ?? dtoSchema,\n schema: {\n form: { uiSchema: props.uiSchema, schema: formSchema, modalSize: props.modalSize ?? 'sm' },\n table: props.tableSchema ? { uiSchema: props.tableSchema, schema: optionalSchema } : undefined,\n filter: props.filterSchema ? { uiSchema: props.filterSchema, schema: optionalSchema } : undefined,\n uri: props.uri,\n searchUri: props.searchUri ?? `${props.uri}?filter=`,\n } as FormSchemaModel,\n };\n};\n","import type { JsonSchema } from '@jsonforms/core';\n\ntype Field = { scope: string };\n\n/**\n * Recursively drop nullable fields from `required`. A nullable field\n * (anyOf with a `{ type: \"null\" }` branch) should be treated as optional.\n */\nexport const dropNullableFromRequired = (schema: JsonSchema): JsonSchema => {\n if (!schema?.properties) return schema;\n\n const required = schema.required as string[] | undefined;\n if (!Array.isArray(required) || required.length === 0) return schema;\n\n const filteredRequired = required.filter((key) => {\n const prop = schema.properties![key];\n if (!prop || typeof prop !== 'object') return true;\n const anyOf = (prop as Record<string, unknown>)['anyOf'];\n return !(\n Array.isArray(anyOf) &&\n anyOf.some((s: Record<string, unknown>) => s?.['type'] === 'null')\n );\n });\n\n if (filteredRequired.length === required.length) return schema;\n\n return { ...schema, required: filteredRequired } as JsonSchema;\n};\n\nexport const enforceRequiredStringMinLength = (schema: JsonSchema): JsonSchema => {\n if (!schema?.properties) return schema;\n const patchedProperties = { ...schema.properties };\n let changed = false;\n for (const key of Object.keys(patchedProperties)) {\n const prop = patchedProperties[key];\n if (!prop || typeof prop !== 'object') continue;\n if (prop.type === 'string' && prop.minLength === undefined) {\n patchedProperties[key] = { ...prop, minLength: 1 };\n changed = true;\n } else if (prop.type === 'object') {\n const patched = enforceRequiredStringMinLength(prop as JsonSchema);\n if (patched !== prop) { patchedProperties[key] = patched; changed = true; }\n }\n }\n return changed ? ({ ...schema, properties: patchedProperties } as JsonSchema) : schema;\n};\n\nexport const findProperty = <F extends Field>(column: F, schema: JsonSchema) => {\n if (!column.scope) return { id: null, property: null };\n const id = column.scope?.substring('#/properties/'.length);\n const property = schema?.properties?.[id] ?? {};\n return { id, property } as { id: string; property: any };\n};\n","import type { ElementBuilder } from './layout.builder';\n\nexport abstract class Builder<TYPE> {\n constructor(protected readonly type: string) {}\n abstract build(): TYPE;\n}\n\nexport abstract class BuilderWithElements<TYPE, CONTROL_TYPE> extends Builder<TYPE> {\n protected elements: Array<ElementBuilder<CONTROL_TYPE>> = [];\n\n addControl(control: ElementBuilder<CONTROL_TYPE>) {\n this.elements.push(control);\n return this;\n }\n\n addControls(...controls: Array<ElementBuilder<CONTROL_TYPE>>) {\n this.elements.push(...controls);\n return this;\n }\n\n protected buildElements() {\n return this.elements.map((e) => e.build());\n }\n}\n","import { Builder } from './base.builder';\nimport type { LayoutBuilder } from './layout.builder';\n\nexport const ControlType = {\n number: 'number',\n string: 'string',\n integer: 'Integer',\n autocomplete: 'autocomplete',\n textArea: 'textarea',\n markdown: 'markdown',\n array: 'array',\n custom: 'custom',\n select: 'select',\n mutliSelect: 'mutliSelect',\n boolean: 'boolean',\n link: 'link',\n relation: 'relation',\n date: 'date',\n dateTime: 'dateTime',\n dateRange: 'date-range',\n} as const;\n\nexport interface DateRangeOptions extends ControlOption {\n format: 'date-range';\n /** Label shown above the start date input. Defaults to \"From\". */\n fromLabel?: string;\n /** Label shown above the end date input. Defaults to \"To\". */\n toLabel?: string;\n /** JSON object key for the start date. Defaults to \"from\". */\n fromField?: string;\n /** JSON object key for the end date. Defaults to \"to\". */\n toField?: string;\n}\n\nexport interface TextAreaOptions extends ControlOption {\n format: 'textarea';\n}\nexport interface MarkdownOptions extends ControlOption {\n format: 'markdown';\n minHeight: string;\n}\n\nexport interface DetailOptions extends ControlOption {\n format: 'array';\n layout: 'row' | 'column';\n}\nexport interface SelectOptions extends ControlOption {\n format: 'select' | 'multiselect';\n options: Array<any>;\n values?: Array<any>;\n resource?: string;\n labelKey?: string;\n valueKey?: string;\n}\n\nexport interface AutocompleteOptions extends Omit<SelectOptions, 'format'> {\n format: 'autocomplete';\n freeText?: boolean;\n enableCreate?: boolean;\n}\nexport interface AutocompleteRemoteOptions extends Omit<\n AutocompleteOptions,\n 'format' | 'options'\n> {\n format: 'autocomplete';\n uri: string;\n dataField?: string;\n skipAuth?: boolean;\n}\nexport interface AutocompleteResourceOptions extends Omit<\n AutocompleteOptions,\n 'format' | 'options'\n> {\n format: 'autocomplete';\n resource: string;\n skipAuth?: boolean;\n}\n\nexport type AutocompleteAllOptions =\n | AutocompleteOptions\n | AutocompleteRemoteOptions\n | AutocompleteResourceOptions;\n\nexport type ArrayActionType = 'edit';\nexport type ArrayAction = {\n type: ArrayActionType;\n idField: string;\n};\n\nexport interface ControlOption {\n format?: string;\n readonly?: boolean;\n label?: string;\n styles?: Partial<any>;\n elements?: any;\n elementLabelProp?: string;\n customLabel?: string;\n actions?: ArrayAction[];\n placeholder?: string;\n hideLabel?: boolean;\n hideActions?: boolean;\n layout?: 'row' | 'column';\n labelKey?: string;\n valueKey?: string;\n options?: Array<any>;\n dataField?: string;\n uri?: string;\n skipAuth?: boolean;\n freeText?: boolean;\n enableCreate?: boolean;\n /** date-range: label above the start date input. */\n fromLabel?: string;\n /** date-range: label above the end date input. */\n toLabel?: string;\n /** date-range: JSON object key for the start date. Defaults to \"from\". */\n fromField?: string;\n /** date-range: JSON object key for the end date. Defaults to \"to\". */\n toField?: string;\n customRender?: any;\n}\n\nexport type ControlTypes = {\n type: 'Control' | 'Object' | 'TextCell';\n scope: string;\n options?: TextAreaOptions | AutocompleteOptions | DetailOptions;\n};\n\nexport class ControlBuilder<\n TYPE,\n KEY = keyof TYPE,\n> extends Builder<ControlTypes> {\n private options: ControlOption = {\n format: 'Control',\n styles: {},\n };\n\n private _detail?: LayoutBuilder<any>;\n\n private constructor(\n private readonly scope: string,\n type = 'Control',\n ) {\n super(type);\n }\n\n static asObject<TYPE>(property: keyof TYPE): ControlBuilder<TYPE> {\n return new ControlBuilder<TYPE>(\n `#/properties/${property as string}`,\n 'Object',\n );\n }\n\n static properties<TYPE>(property: keyof TYPE): ControlBuilder<TYPE> {\n return new ControlBuilder<TYPE>(`#/properties/${property as string}`);\n }\n\n static asCustom<TYPE>(\n property: keyof TYPE,\n type: string,\n ): ControlBuilder<TYPE> {\n const builder = new ControlBuilder<TYPE>(\n `#/properties/${property as string}`,\n );\n\n builder.addOptions({\n format: ControlType.custom,\n type,\n } as unknown as Partial<ControlOption>);\n\n return builder;\n }\n\n setCustomRender(customRender: string) {\n this.addOptions({ customRender });\n\n return this;\n }\n\n detail<TYPE>(layoutBuilder: LayoutBuilder<TYPE>, label?: string) {\n this._detail = layoutBuilder;\n this.addOptions({\n format: ControlType.array,\n elementLabelProp: label,\n });\n return this;\n }\n\n addAction(action: ArrayAction) {\n const actions = this.options?.actions ?? [];\n actions.push(action);\n return this.addOptions({ actions });\n }\n\n detailFixed<TYPE>(\n layoutBuilder: LayoutBuilder<TYPE>,\n options: {\n label?: string;\n layout?: 'row' | 'column';\n } = {},\n ) {\n this._detail = layoutBuilder;\n return this.addOptions({\n hideActions: true,\n format: ControlType.array,\n layout: options.layout ?? 'column',\n elementLabelProp: options.label,\n });\n }\n\n labelKey(labelKey: string) {\n return this.addOptions({ labelKey });\n }\n\n readonly(): ControlBuilder<TYPE> {\n return this.addOptions({\n format: ControlType.string,\n readonly: true,\n });\n }\n\n link(): ControlBuilder<TYPE> {\n return this.addOptions({\n format: ControlType.link,\n });\n }\n\n markdown(options?: Omit<MarkdownOptions, 'format'>): ControlBuilder<TYPE> {\n return this.addOptions({\n format: ControlType.markdown,\n ...(options ?? {}),\n });\n }\n\n textArea(options?: Omit<TextAreaOptions, 'format'>) {\n return this.addOptions({\n format: ControlType.textArea,\n ...(options ?? {}),\n });\n }\n\n autocomplete(\n options:\n | Omit<AutocompleteOptions, 'format'>\n | Omit<AutocompleteRemoteOptions, 'format'>,\n ) {\n return this.addOptions({\n format: ControlType.autocomplete,\n dataField: 'data',\n ...(options ?? {}),\n });\n }\n\n control(format: string, options?: Partial<ControlOption>) {\n return this.addOptions({\n format,\n ...options,\n });\n }\n\n select(options: Omit<SelectOptions, 'format'>) {\n return this.addOptions({\n format: ControlType.select,\n ...options,\n });\n }\n\n mutliSelect(options: Omit<SelectOptions, 'format'>) {\n return this.addOptions({\n format: ControlType.mutliSelect,\n ...options,\n });\n }\n\n width(width: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full') {\n return this.addOptions({\n styles: {\n ...this.options?.styles,\n width,\n control: {\n wrapper: `input-${width}`,\n },\n },\n });\n }\n\n customLabel(label: string) {\n return this.addOptions({ label });\n }\n\n placeHolder(placeholder: string) {\n return this.addOptions({ placeholder });\n }\n\n hideLabel() {\n return this.addOptions({ hideLabel: true });\n }\n\n private addOptions(options: Partial<ControlOption>) {\n this.options = {\n ...this.options,\n ...options,\n };\n return this;\n }\n\n override build(): ControlTypes {\n return {\n type: this.type,\n scope: this.scope,\n options: {\n ...this.options,\n detail: this._detail ? this._detail?.build() : undefined,\n },\n } as ControlTypes;\n }\n}\n","import { BuilderWithElements } from './base.builder';\nimport type { CategoryBuilder } from './category.builder';\nimport type { ControlBuilder, ControlTypes } from './control.builder';\nimport type { GroupBuilder } from './group.builder';\nimport type { TextCellBuilder } from '../table/table.builder';\n\nexport type ElementBuilder<TYPE> =\n | ControlBuilder<TYPE>\n | LayoutBuilder<TYPE>\n | CategoryBuilder<TYPE>\n | GroupBuilder<TYPE>\n | TextCellBuilder<TYPE>;\n\nexport const LayoutTypes = {\n HorizontalLayout: 'HorizontalLayout',\n VerticalLayout: 'VerticalLayout',\n CollapseLayout: 'CollapseLayout',\n GridLayout: 'GridLayout',\n} as const;\n\ntype _LayoutTypes = (typeof LayoutTypes)[keyof typeof LayoutTypes];\n\nexport type LayoutType = {\n type: 'LayoutTypes';\n elements: Array<ControlTypes | LayoutType>;\n};\n\nexport class LayoutBuilder<TYPE> extends BuilderWithElements<LayoutType, TYPE> {\n private options: any;\n\n protected constructor(type: _LayoutTypes, options = {}) {\n super(type);\n this.options = options;\n }\n\n static horizontal<TYPE>(): LayoutBuilder<TYPE> {\n return new LayoutBuilder<TYPE>(LayoutTypes.HorizontalLayout);\n }\n static collapse<TYPE>(): LayoutBuilder<TYPE> {\n return new LayoutBuilder<TYPE>(LayoutTypes.CollapseLayout);\n }\n\n static vertical<TYPE>(): LayoutBuilder<TYPE> {\n return new LayoutBuilder<TYPE>(LayoutTypes.VerticalLayout);\n }\n\n static grid<TYPE>(): LayoutBuilder<TYPE> {\n return new LayoutBuilder<TYPE>(LayoutTypes.GridLayout);\n }\n\n titleKey(titleKey: string) {\n return this.addOptions({ titleKey });\n }\n\n title(title: string) {\n return this.addOptions({ title });\n }\n\n private addOptions(options: Partial<any>) {\n this.options = {\n ...this.options,\n ...options,\n };\n return this;\n }\n\n override build(): LayoutType {\n return {\n type: this.type,\n elements: this.buildElements(),\n options: this.options,\n } as LayoutType;\n }\n}\n","import type { JsonSchema } from '@jsonforms/core';\n\nimport { ControlBuilder } from './layout/control.builder';\nimport type { LayoutType } from './layout/layout.builder';\nimport { LayoutBuilder } from './layout/layout.builder';\n\nexport const uiFromJsonSchema = (jsonSchema: JsonSchema): LayoutType => {\n const properties = jsonSchema.properties ?? {};\n const layout = LayoutBuilder.grid<Record<string, unknown>>();\n for (const key of Object.keys(properties)) {\n layout.addControl(ControlBuilder.properties<Record<string, unknown>>(key));\n }\n return layout.build();\n};\n","/**\n * Helpers for the `{ value, label }` envelope used by enum/select columns.\n *\n * The DB stores a bare scalar; the API can wrap it into `{ value, label }` on\n * read (so the UI shows a human-readable label) and unwrap it back to the\n * scalar on write. These helpers are pure and shared by the read/write paths.\n */\n\nexport interface ValueLabelOption {\n value: unknown;\n label: string;\n}\n\nexport interface ValueLabel {\n value: unknown;\n label: string;\n}\n\nconst wrapOne = (value: unknown, values: ValueLabelOption[]): ValueLabel => {\n const match = values.find((o) => o.value === value);\n return { value, label: match ? match.label : String(value) };\n};\n\n/**\n * Wrap a stored scalar into `{ value, label }` using the option list.\n * - `null` / `undefined` pass through unchanged (never wrapped).\n * - An array (multi-value enum) is mapped element-wise.\n * - A value missing from `values` falls back to `label = String(value)`.\n */\nexport const toValueLabel = (\n value: unknown,\n values: ValueLabelOption[],\n): unknown => {\n if (value === null || value === undefined) return value;\n if (Array.isArray(value)) return value.map((v) => wrapOne(v, values));\n return wrapOne(value, values);\n};\n\n/**\n * Unwrap a `{ value, label }` (or array of them) back to the bare scalar for\n * persistence / filtering. Plain scalars pass through unchanged (idempotent).\n */\nexport const fromValueLabel = (input: unknown): unknown => {\n if (Array.isArray(input)) return input.map(fromValueLabel);\n if (input && typeof input === 'object' && 'value' in (input as object)) {\n return (input as { value: unknown }).value;\n }\n return input;\n};\n","import { BuilderWithElements } from './base.builder';\nimport type { ElementBuilder } from './layout.builder';\n\ntype Rule = {\n effect: 'SHOW';\n condition: any;\n};\nexport type CategoryType<TYPE> = {\n type: 'Category';\n label: string;\n elements?: ElementBuilder<TYPE>[];\n rule?: Rule;\n};\n\nexport class CategoryBuilder<TYPE> extends BuilderWithElements<\n CategoryType<TYPE>,\n TYPE\n> {\n private rule: Rule = {\n effect: 'SHOW',\n condition: {},\n };\n\n private constructor(private readonly label: string) {\n super(label);\n }\n\n static label(label: string) {\n return new CategoryBuilder(label);\n }\n\n override build(): CategoryType<TYPE> {\n return {\n type: 'Category',\n label: this.label,\n rule: this.rule,\n elements: this.buildElements(),\n } as unknown as CategoryType<TYPE>;\n }\n}\n","import { BuilderWithElements } from './base.builder';\nimport type { ElementBuilder } from './layout.builder';\n\nexport type GroupType<TYPE> = {\n type: 'Group';\n label: string;\n elements?: ElementBuilder<TYPE>[];\n};\n\nexport class GroupBuilder<TYPE> extends BuilderWithElements<\n GroupType<TYPE>,\n TYPE\n> {\n private constructor(private readonly label: string) {\n super(label);\n }\n\n static label(label: string) {\n return new GroupBuilder(label);\n }\n\n override build(): GroupType<TYPE> {\n return {\n type: 'Group',\n label: this.label,\n elements: this.buildElements(),\n } as unknown as GroupType<TYPE>;\n }\n}\n","import { Builder } from '../layout/base.builder';\nimport { LayoutBuilder } from '../layout/layout.builder';\n\nexport interface TextCellOption {\n format: 'TextCell';\n sortId?: string;\n sortable?: boolean;\n}\n\nexport interface KeyValueOption extends Omit<TextCellOption, 'format'> {\n format: 'keyValue';\n key: string;\n}\n\nexport type TextCellType = {\n type: 'TextCell';\n scope: string;\n options?: KeyValueOption;\n};\nexport class TextCellBuilder<TYPE> extends Builder<TextCellType> {\n private options: KeyValueOption | TextCellOption | undefined;\n\n protected constructor(\n private readonly scope: string,\n type = 'TextCell',\n ) {\n super(type);\n }\n\n static properties<TYPE>(property: keyof TYPE): TextCellBuilder<TYPE> {\n return new TextCellBuilder<TYPE>(`#/properties/${property as string}`);\n }\n\n key(key: string): TextCellBuilder<TYPE> {\n this.options = {\n format: 'keyValue',\n key: key,\n };\n return this;\n }\n\n setSortId(sortId: string): TextCellBuilder<TYPE> {\n this.options = {\n ...(this.options ?? { format: this.type as TextCellOption['format'] }),\n sortId: sortId,\n };\n return this;\n }\n\n override build(): TextCellType {\n return {\n type: this.type,\n scope: this.scope,\n options: this.options,\n } as TextCellType;\n }\n}\n\nexport class BooleanCellBuilder extends TextCellBuilder<boolean> {\n protected constructor(scope: string) {\n super(scope, 'BooleanCell');\n }\n static override properties<TYPE>(property: keyof TYPE): BooleanCellBuilder {\n return new BooleanCellBuilder(`#/properties/${property as string}`);\n }\n}\nexport class TableBuilder<TYPE> {\n private builder: LayoutBuilder<TYPE>;\n\n private constructor() {\n this.builder = LayoutBuilder.horizontal();\n }\n\n static init<TYPE>() {\n return new TableBuilder<TYPE>();\n }\n\n addControl(control: TextCellBuilder<TYPE>) {\n this.builder.addControls(control);\n return this;\n }\n\n addControls(...controls: Array<TextCellBuilder<TYPE>>) {\n this.builder.addControls(...controls);\n return this;\n }\n\n build() {\n return this.builder.build();\n }\n}\n","import type { JsonSchema } from '@jsonforms/core';\n\nimport type { TextCellType } from './table.builder';\nimport { findProperty } from '../schema.utils';\n\nexport type ColumnDef = TextCellType & { id: string; label: string };\n\nexport const findColumnDef = (\n column: TextCellType,\n schema: JsonSchema,\n): TextCellType & { id: string } => {\n const { id, property } = findProperty(column, schema);\n return { ...column, id, ...property };\n};\n","import z from 'zod';\n/**\n * Shape of a `data-source.json`. The `type`/`name`/`default` keys are also read by crouton-api at runtime;\n * the rest are codegen-only.\n */\nexport const DataSourceShape = z.object({\n /** Datasource name (folder + `name` in data-source.json). */\n name: z.string(),\n /** Env var holding the connection URL. */\n urlEnv: z.string(),\n /** Import path for this datasource's generated Zod types (for resource `schema.ts`). */\n generatedTypesImport: z.string().optional(),\n /** Datasource type tag. Default `postgres`. */\n type: z.string().default('postgres'),\n /** Mark this as the default datasource. Default `false`. */\n default: z.boolean().default(false),\n /** Prisma schema path, relative to project root. Default `prisma/<name>/schema.prisma`. */\n prismaSchema: z.string().optional(),\n /** Prisma config path, relative to project root. Default `prisma/<name>/prisma.config.ts`. */\n prismaConfig: z.string().optional(),\n /** zod-prisma-types output dir, relative to project root. Default `generated/<name>/src`. */\n zodOutput: z.string().optional(),\n /** Prisma client output dir, relative to project root. Default `generated/<name>/client`. */\n clientOutput: z.string().optional(),\n});\n\nexport const transformDataSource = <D extends z.infer<typeof DataSourceShape>>(\n data: D,\n) => {\n const name = data.name ?? 'name';\n\n return {\n ...data,\n generatedTypesImport:\n data.generatedTypesImport ?? `@your-scope/generated/${name}`,\n prismaSchema: data.prismaSchema ?? `prisma/${name}/schema.prisma`,\n prismaConfig: data.prismaConfig ?? `prisma/${name}/prisma.config.ts`,\n zodOutput: data.zodOutput ?? `generated/${name}/src`,\n clientOutput: data.clientOutput ?? `generated/${name}/client`,\n };\n};\n\nexport const DataSourceSchema = DataSourceShape.transform(transformDataSource);\n\nexport type DataSource = z.infer<typeof DataSourceSchema>;\n","import { z } from 'zod';\n// ── Operations ────────────────────────────────────────────────────────\n\nconst BoolOrUpsertSchema = z.union([\n z.boolean(),\n z.object({ upsertOn: z.union([z.string(), z.array(z.string())]) }),\n]);\n\nexport const JsonOperationsSchema = z.object({\n findAll: z.boolean().default(true), // default: true — only explicit `false` disables it\n findOne: z.boolean().default(true), // default: true\n create: z.boolean().default(true), // default: true\n update: z.boolean().default(true), // default: true\n patch: z.boolean().default(true), // default: true\n upsert: BoolOrUpsertSchema.default(false), // default: disabled; `true` throws at load time — must be `{ upsertOn }`\n delete: z.boolean().default(true), // default: true\n});\n\nexport type JsonResourceOperations = z.infer<typeof JsonOperationsSchema>;\nexport type JsonResourceOperationsInput = z.input<typeof JsonOperationsSchema>;\n","import { z } from 'zod';\n\nimport { CalculatedColumnSchema } from './CalculatedColumn.schema';\nimport { type JsonColumn, JsonColumnSchema } from './Column';\nimport { SidebarSchema } from './Sidebar.schema';\nimport { JsonActionSchema } from './TableAction.schema';\nimport { JsonIncludeEntrySchema } from './include.schema';\nimport { JsonOperationsSchema } from '../data-source/Operations.schema';\nimport { labelFromId } from '../schema/label.helper';\n\n// ── Shared primitives ────────────────────────────────────────────────\n\nconst JsonColumnsMapSchema = z.record(\n z.string(),\n JsonColumnSchema.omit({ id: true }).catchall(z.unknown()),\n); // map form — key becomes `id`\nexport type JsonColumnsMap = z.infer<typeof JsonColumnsMapSchema>;\nconst ColumnsSchema = JsonColumnsMapSchema;\n\n// ── Display / sidebar ────────────────────────────────────────────────\n\nconst JsonDisplaySchema = z.object({\n mode: z.enum(['page', 'modal']).default('modal'), // default: 'modal'\n customComponent: z.string().nullable().optional().default(null), // default: null\n});\n\nexport type JsonDisplay = z.infer<typeof JsonDisplaySchema>;\n\n/** Normalise `columns` from either array or object-map form. */\nconst normalizeColumns = (\n columns: JsonColumnsMap | undefined,\n): JsonColumn[] | undefined => {\n if (!columns) return undefined;\n const raw: JsonColumn[] = Array.isArray(columns)\n ? columns\n : Object.entries(columns).map(([id, col]) => ({ id, ...col }));\n return raw.map((col) => ({\n ...col,\n label: col.label ?? labelFromId(col.id),\n }));\n};\n\n// ── Top-level resource.json ──────────────────────────────────────────\n\nexport const ResourceJsonShape = z.object({\n name: z.string(), // required — unique id, used as the frontend form id\n route: z.string(), // required — URL segment for generated endpoints\n model: z.string(), // required — Prisma model name\n tag: z.string(), // required — OpenAPI tag\n title: z.string().optional(), // no computed default — used as UI display title\n table: z.string().optional(), // default: same as `model`\n database: z.string().optional(), // default: project's default data source\n sidebar: SidebarSchema.default(SidebarSchema.parse({})), // default: shown, alphabetically ordered, ungrouped\n display: JsonDisplaySchema.default(JsonDisplaySchema.parse({})), // default: { mode: 'modal', customComponent: null }\n operations: JsonOperationsSchema, // required key — but every sub-field defaults to enabled\n columns: ColumnsSchema.default(ColumnsSchema.parse({})), // id-keyed map; omit for a columnless resource\n calculatedColumns: z.array(CalculatedColumnSchema).default([]),\n actions: z.array(JsonActionSchema).default([]),\n /** Global table-level actions (no record id). Shown as toolbar buttons. */\n tableActions: z.array(JsonActionSchema).default([]),\n /** Modal width when opening a form for this resource. */\n modalSize: z.enum(['xs', 'sm', 'lg', 'xl']).default('sm'), // default: 'sm' for create/edit modal\n /**\n * Relations to include when querying this resource.\n * Each entry is either a plain relation name (`\"author\"` → `include: { author: true }`)\n * or an object for nested includes:\n * `{ \"relation\": \"text_author\", \"include\": [\"author\"] }` →\n * `include: { text_author: { include: { author: true } } }`\n */\n include: z.array(JsonIncludeEntrySchema).default([]),\n});\n\nexport const ResourceJsonSchema = ResourceJsonShape.transform((obj) => {\n const title = obj.title ?? labelFromId(obj.name);\n\n return { title, ...obj, columns: normalizeColumns(obj.columns) };\n});\n\nexport type ResourceJson = z.infer<typeof ResourceJsonSchema>;\nexport type ResourceJsonInput = z.input<typeof ResourceJsonShape>;\n\nexport type ResourceConfig = ResourceJson;\n","import { z } from 'zod';\n\nimport { FieldInputSchema } from './FieldInput.schema';\nimport { normalizeLabel } from '../schema/label.helper'; // ── Calculated columns ──────────────────────────────────────────────\n\n/**\n * A column whose value is computed by a raw SQL subquery at query time.\n * The `sqlExpression` may reference the parent table via the alias `main`.\n *\n * Example:\n * ```json\n * {\n * \"id\": \"inception\",\n * \"alias\": \"inception\",\n * \"label\": \"Available in inception\",\n * \"sqlExpression\": \"SELECT COUNT(id) FROM text_content WHERE text_content.text_id = main.id\",\n * \"position\": 8\n * }\n * ```\n */\nexport const CalculatedColumnSchema = z\n .object({\n /** Column identifier used in the response payload and UI schema. */\n id: z.string(), // required\n /** SQL alias — must match `id`. */\n alias: z.string(), // required — must match `id`\n /** Human-readable label shown in the table header. */\n label: z.string().optional() /**\n * Raw SQL subquery. Use `main` as the alias for the parent table row,\n * e.g. `SELECT COUNT(*) FROM child WHERE child.parent_id = main.id`.\n */,\n sqlExpression: z.string(), // required\n /** JSON schema / cast type for the computed value. Defaults to `\"number\"`. `\"string\"` skips CAST. */\n type: z.enum(['number', 'boolean', 'string']).optional(), // default: 'number'\n /**\n * Insertion position relative to the other visible columns.\n * Uses the same semantics as `fieldInput.position` on regular columns:\n * `position: N` places this column before the element currently at index N.\n * Can also be set via `fieldInput.position` (takes precedence).\n */\n position: z.number().optional(),\n hiddenInTable: z.boolean().optional(), // default: false\n hiddenInView: z.boolean().optional(), // default: false\n /**\n * Field input options for rendering in form / view schemas.\n * Supports `colspan`, `format`, and any other options passed to the Control renderer.\n * `position` here takes precedence over the top-level `position`.\n */\n fieldInput: FieldInputSchema.optional(),\n })\n .transform(normalizeLabel);\n\nexport type CalculatedColumn = z.infer<typeof CalculatedColumnSchema>;\n","import { z } from 'zod';\n\nexport const RelationType = z.enum([\n 'oneToOne',\n 'manyToOne',\n 'oneToMany',\n 'manyToMany',\n]);\nexport type RelationType = z.infer<typeof RelationType>;\n\nexport const DetailControlSchema = z.object({\n property: z.string(), // required\n type: z.string().optional(), // default: 'text'\n options: z.record(z.string(), z.unknown()).optional(),\n hideLabel: z.boolean().optional(), // default: false\n width: z.string().optional(),\n});\n\nexport type DetailControl = z.infer<typeof DetailControlSchema>;\n\nexport const DetailConfigSchema = z.object({\n layout: z.enum(['collapse', 'row']), // required\n titleKey: z.string().optional(),\n controls: z.array(DetailControlSchema), // required\n});\n\nexport type DetailConfig = z.infer<typeof DetailConfigSchema>;\n\n/**\n * Options for relation field inputs (`fieldInput.format === \"relation\"`).\n * These are injected into the frontend control and — for `sort`/`sortDir` —\n * also used by the backend to apply `orderBy` on included relation records.\n */\nexport const RelationFieldInputOptionsSchema = z\n .object({\n colspan: z.number().optional().default(12),\n /** Field to sort related records by, e.g. `\"title\"` or `\"author.name\"`. */\n sort: z.string().optional(),\n /** Sort direction. Defaults to `\"asc\"` when omitted. */\n sortDir: z.enum(['asc', 'desc']).optional(), // default: 'asc'\n /** CSS flex direction for the relation control button layout. */\n direction: z.string().optional(),\n /** Key used as the display label in the relation control. */\n displayKey: z.string().optional(),\n /** Path to the related resource (resolved to a URI at load time). */\n resource: z.string().optional(),\n })\n .catchall(z.unknown()); // arbitrary extra keys allowed (e.g. colspan, emitObject, values)\n\nexport type RelationFieldInputOptions = z.infer<\n typeof RelationFieldInputOptionsSchema\n>;\nexport const FieldInputSchema = z.object({\n type: z.string().optional(),\n customRender: z.string().optional(),\n\n /**\n * Render format hint for the frontend (e.g. `\"relation\"` for sub-resource\n * relations). When `format` is `\"relation\"`, `resource` must also be set.\n */\n format: z.string().optional(), // 'relation' triggers relation handling; requires `resource`\n /**\n * Relative path to the child resource definition, e.g. `\"./author.resource\"`.\n * Only used when `format` is `\"relation\"`. Resolved at load time to inject\n * sub-resource URIs into `options`.\n */\n resource: z.string().optional(), // required when format === 'relation'\n /**\n * Cardinality of the relation. Used by the frontend to determine the correct\n * renderer and behaviour (e.g. single-select vs multi-select).\n * - `manyToOne` / `oneToOne` — single FK reference (autocomplete / relation control)\n * - `oneToMany` / `manyToMany` — collection (sub-resource table / multi-select)\n */\n relationType: RelationType.optional(), // auto-derived from the Zod model/sibling FK column if omitted\n /** Override the display order in form views. Lower values come first. */\n position: z.number().optional(), // default: source order\n options: z.union([RelationFieldInputOptionsSchema, z.unknown()]).optional(),\n /** Nested array detail layout (renders via `detailFixed`). */\n detail: DetailConfigSchema.optional(),\n});\n\nexport type FieldInput = z.infer<typeof FieldInputSchema>;\n\n/**\n * A per-context override of a column's field config. Structurally identical to\n * {@link FieldInputSchema} — every key is optional — so a variant can override\n * just what it needs (typically a single `options` key) and inherit the rest\n * from the level below it via {@link mergeFieldVariant}.\n */\nexport const FieldVariantSchema = FieldInputSchema;\nexport type FieldVariant = z.infer<typeof FieldVariantSchema>;\n\n/** Drop keys whose value is explicitly `null` (used to \"delete\" an inherited key). */\nconst stripNull = (obj: Record<string, unknown>): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) if (v !== null) out[k] = v;\n return out;\n};\n\n/**\n * Layer a variant over a base field config (deep-merge, one level into `options`).\n *\n * - `override` wins key-by-key; `base` supplies everything the override omits.\n * - `options` is merged one level deep so a variant can tweak `options.display`\n * without repeating `format`, `resource`, `relationType`, etc.\n * - a `null` value in the override deletes that inherited key (top-level or in\n * `options`).\n *\n * Returns `base` unchanged when there is no override, and `override` when there\n * is no base — so `mergeFieldVariant(x, undefined) === x`.\n */\nexport const mergeFieldVariant = (\n base: FieldInput | undefined,\n override: FieldVariant | undefined,\n): FieldInput | undefined => {\n if (!base) return override;\n if (!override) return base;\n\n const merged = stripNull({ ...base, ...override }) as FieldInput;\n\n if (base.options || override.options) {\n const mergedOptions = stripNull({\n ...(base.options as Record<string, unknown> | undefined),\n ...(override.options as Record<string, unknown> | undefined),\n });\n merged.options = mergedOptions;\n }\n\n return merged;\n};\n","/**\n * Name derivations. The most error-prone one is `clientAccessor`: the value\n * crouton puts in `resource.json.model` must equal the PrismaClient property,\n * which Prisma derives by lower-casing the first character of the model name\n * (the rest is preserved). Getting this wrong silently breaks every query.\n */\n\n/**\n * Derive a human-readable label from an id.\n * `\"field_label\"` → `\"Field label\"`, `\"fieldLabel\"` → `\"Field label\"`.\n *\n * Kept local (mirrors `labelFromId` in `@ghentcdh/crouton-core`) so the engine\n * has no runtime dependency on core — only type-only imports, which keeps the\n * bundle lean and avoids pulling core's peer deps (zod, jsonforms) into it.\n */\nexport const labelFromId = (id: string): string => {\n const words = id\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → camel Case\n .replace(/[_-]+/g, ' ') // snake_case / kebab-case → spaces\n .trim();\n return words.charAt(0).toUpperCase() + words.slice(1).toLowerCase();\n};\n\ntype LabelObj = {\n id: string;\n label?: string;\n};\nexport const normalizeLabel = <L extends LabelObj>(obj: L): L => {\n return { label: labelFromId(obj.id), ...obj };\n};\n","import { z } from 'zod';\n\nimport { FieldInputSchema, FieldVariantSchema } from './FieldInput.schema';\n\n// Used by showWhen / hideWhen / disabledWhen\nexport const WhenConditionSchema = z.object({\n field: z.string(), // required\n eq: z.unknown().optional(),\n neq: z.unknown().optional(),\n exists: z.boolean().optional(),\n notExists: z.boolean().optional(),\n});\n\n// ── Columns ───────────────────────────────────────────────────────────\n\nexport const JsonColumnSchema = z.object({\n id: z.string(), // required in array form; implied by the map key in map form\n column: z.string().optional(), // default: same as `id`\n label: z.string().optional(), // default: title-cased version of `id`\n hiddenInTable: z.boolean().default(false), // default: false\n hiddenInForm: z.boolean().default(false), // default: false\n hiddenInView: z.boolean().default(false), // default: false\n sortable: z.boolean().default(false), // default: false\n defaultSort: z.boolean().default(false), // default: false\n searchable: z.boolean().default(false), // default: false\n filterable: z.boolean().default(false), // default: false\n createable: z.boolean().default(true), // default: true (only `false` excludes it)\n updateable: z.boolean().default(true), // default: true (only `false` excludes it)\n hideLabel: z.boolean().default(false), // default: false\n showWhen: WhenConditionSchema.optional(),\n hideWhen: WhenConditionSchema.optional(),\n disabledWhen: WhenConditionSchema.optional(),\n displayKey: z.string().optional(), // e.g. \"author.name\" for nested display\n sortId: z.string().optional(), // overrides the sort\n\n /**\n * Name of a shared enum in the project enum registry (`crouton.enums.json`).\n * At load time the loader injects that enum's `{ value, label }[]` into\n * `fieldInput.options.values`, so columns don't duplicate the option list.\n */\n enum: z.string().optional(), // name of a shared enum in crouton.enums.json\n idField: z.boolean().default(false), // default: false — exactly one column should set this\n showInLookup: z.boolean().default(false), // default: false\n columnType: z.string().default('string'), // default: 'string'\n fieldInput: FieldInputSchema.optional(),\n /**\n * Optional per-context override for the read-only VIEW ui. Same shape as\n * `fieldInput`; every key optional. Falls back to `fieldInput` (deep-merged\n * one level into `options`). Resolved at read time by the transformer.\n */\n fieldView: FieldVariantSchema.optional(),\n /**\n * Optional per-context override for the TABLE ui. Same shape as `fieldInput`;\n * every key optional. Falls back to `fieldView`, then `fieldInput`.\n * Resolved at read time by the transformer.\n */\n fieldTable: FieldVariantSchema.optional(),\n /**\n * Path to another `resource.json` whose columns are expanded as nested sub-columns\n * under this column's object key.\n *\n * Example: `\"extend\": \"../internalAuthor/resource.json\"` on a column `author`\n * auto-generates virtual sub-columns like `author_name` (column: \"author\", displayKey: \"name\").\n *\n * Visibility (`hiddenInTable/Form/View`) on this column is inherited by all sub-columns as a\n * default; the referenced resource's own column visibility further restricts it.\n */\n extend: z.string().optional(), // path to another resource.json expanded as virtual sub-columns\n /**\n * Per-sub-column overrides when using `extend`.\n * Key: the virtual column id (`\"{extendId}_{refColId}\"`) or just the referenced column id.\n * Value: any `JsonColumn` fields to merge over the generated virtual column.\n */\n columns: z.record(z.string(), z.record(z.string(), z.unknown())).optional(), // per-sub-column overrides, only used with `extend`\n});\n\nexport type JsonColumn = z.infer<typeof JsonColumnSchema>;\nexport type JsonColumnInput = z.input<typeof JsonColumnSchema>;\n","import z from 'zod';\n\n/**\n * Configuration for a single sidebar group, defined centrally in `crouton.json`.\n * Keyed by the group slug (e.g. `\"metadata\"`).\n */\nexport const SidebarGroupSchema = z.object({\n /** Human-readable heading shown in the sidebar. Defaults to a title-cased version of the slug. */\n label: z.string().optional(),\n /** Controls the order of this group among top-level sidebar items. */\n position: z.number().optional(),\n});\n\nexport type SidebarGroupConfig = z.infer<typeof SidebarGroupSchema>;\n\nexport const SidebarSchema = z.object({\n hide: z.boolean().default(false), // default: false\n position: z.number().optional(), // default: sorted alphabetically after positioned entries\n label: z.string().optional(), // default: resource `title`\n\n /**\n * Slug of the group this resource belongs to.\n * Must match a key in `sidebarGroups` in `crouton.json`.\n * Resources with the same `group` are nested under a shared collapsible section.\n */\n group: z.string().optional(), // must match a key in `sidebarGroups` (crouton.json)\n});\n\nexport type Sidebar = z.infer<typeof SidebarSchema>;\n","import { z } from 'zod';\n// ── Table-level (global) actions ────────────────────────────────────\n\n// Used by row-action / table-action `condition`\nconst ActionConditionSchema = z.object({\n /** Row field to evaluate. */\n field: z.string(), //\n /**\n * Comparison operator. Defaults to `\"eq\"`.\n * - `eq` / `neq` — strict equality\n * - `gt` / `gte` / `lt` / `lte` — numeric or date comparison\n * - `exists` — field is not null / undefined / empty string\n * - `notExists` — field is null / undefined / empty string\n */\n op: z\n .enum(['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'exists', 'notExists'])\n .default('eq'), // default: 'eq'\n /** Comparison value. Not required for `exists` / `notExists`. */\n value: z.unknown().optional(), // not required for exists/notExists\n});\n\nconst ActionSchema = z.object({\n type: z.string(),\n /** Unique identifier for the action. */\n id: z.string(), // required\n /** Human-readable button label. */\n label: z.string(),\n /** MDI icon name, e.g. `\"mdi:open-in-new\"`. */\n icon: z.string().optional(),\n /** Tooltip text. Falls back to `label` when omitted. */\n tooltip: z.string().optional(), // default: falls back to `label`\n condition: ActionConditionSchema.optional(),\n});\n\ntype Action = z.infer<typeof ActionSchema>;\n\nexport const JsonProcedureActionSchema = ActionSchema.extend({\n type: z.literal('procedure').default('procedure'), // default: 'procedure'\n /**\n * Filename (without extension) inside the resource's `actions/` directory\n * that exports the table-action procedure, e.g. `\"syncZotero\"`.\n */\n procedure: z.string(), // required\n /** HTTP method for the frontend. Defaults to `\"post\"`. */\n method: z.string().optional().default('post'), // default: 'post'\n /** Static query / body params passed to the endpoint. */\n data: z.record(z.string(), z.unknown()).optional(),\n});\n\n/** Action that opens a URL in a new browser tab — no backend call. */\nexport const JsonLinkActionSchema = ActionSchema.extend({\n /** Optional condition evaluated per row. Button is hidden when the condition is false. */\n type: z.literal('link').default('link'), // required\n /** URL to open. May contain `{env.VAR}` placeholders. */\n href: z.string(), // required\n});\n\nconst transformAction = <A extends Action>(action: A) => {\n const label = action.label;\n\n return {\n tooltip: label,\n ...action,\n };\n};\n\nexport const JsonActionSchema = z\n .union([JsonProcedureActionSchema, JsonLinkActionSchema])\n .transform(transformAction);\n\nexport type JsonActionCondition = z.infer<typeof ActionConditionSchema>;\nexport type JsonAction = z.infer<typeof JsonActionSchema>;\nexport type JsonLinkAction = z.infer<typeof JsonLinkActionSchema>;\nexport type JsonProcedureAction = z.infer<typeof JsonProcedureActionSchema>;\n","import { z } from 'zod';\n\n// ── Include ───────────────────────────────────────────────────────────\n\n/**\n * A single entry in an `include` list.\n * - Plain string: `\"author\"` → `{ author: true }`\n * - Object with nested includes: `{ relation: \"text_author\", include: [\"author\"] }`\n * → `{ text_author: { include: { author: true } } }`\n * - Object with orderBy: `{ relation: \"sections\", orderBy: { title: \"asc\" } }`\n * → `{ sections: { orderBy: { title: \"asc\" } } }`\n */\nexport const JsonIncludeEntrySchema: z.ZodType<any> = z.lazy(() =>\n z.union([\n z.string(), // plain relation name → `{ [name]: true }`\n z.object({\n relation: z.string(), // required\n include: z.array(JsonIncludeEntrySchema).optional(), // nested includes;\n /** Prisma-format orderBy clause applied to the included records. */\n orderBy: z.record(z.string(), z.unknown()).optional(),\n }),\n ]),\n);\n\nexport type JsonIncludeEntry = z.infer<typeof JsonIncludeEntrySchema>;\n","import type { JsonColumn } from './Column';\nimport { type FieldInput, mergeFieldVariant } from './FieldInput.schema';\n\n/**\n * Resolve the field config that drives each rendering context, applying the\n * `fieldInput → fieldView → fieldTable` fallback chain. These are the single\n * source of truth for the fallback; every consumer (transformer, view builders)\n * goes through them so the three-way behaviour can't drift.\n *\n * form ← fieldInput (base, unchanged)\n * view ← fieldView, then fieldInput\n * table ← fieldTable, then fieldView, then fieldInput\n *\n * Merging is deep one level into `options` (see {@link mergeFieldVariant}).\n */\nexport const resolveFormField = (c: JsonColumn): FieldInput | undefined =>\n c.fieldInput;\n\nexport const resolveViewField = (c: JsonColumn): FieldInput | undefined =>\n mergeFieldVariant(c.fieldInput, c.fieldView);\n\nexport const resolveTableField = (c: JsonColumn): FieldInput | undefined =>\n mergeFieldVariant(resolveViewField(c), c.fieldTable);\n","import { z } from 'zod';\n\nimport { JsonOperationsSchema } from '../data-source/Operations.schema';\nimport { SidebarGroupSchema } from '../resource';\n\nexport const RulesetSchema = z.object({\n hideIdInTable: z.boolean().default(true),\n hideIdInForm: z.boolean().default(true),\n hideIdInView: z.boolean().default(true),\n hideTimestamps: z.boolean().default(true),\n hideForeignKeys: z.boolean().default(true),\n includeRelations: z.boolean().default(false),\n hideRelationsInTable: z.boolean().default(true),\n showRelationsInForm: z.boolean().default(true),\n enumValueLabel: z.boolean().default(true),\n sharedEnums: z.boolean().default(true),\n defaultOperations: JsonOperationsSchema.default(\n JsonOperationsSchema.parse({}),\n ),\n});\n\nexport type Ruleset = z.infer<typeof RulesetSchema>;\n\nexport const CroutonConfigSchema = z.object({\n /**\n * Application title served to the frontend via `GET /_app/layout`.\n * Displayed in the admin sidebar header.\n */\n title: z.string(),\n /** Where resource directories live, relative to the project root. */\n resourcesDir: z.string(),\n /** Where datasource folders live (each with a `data-source.json`). */\n dataSourcesDir: z.string(),\n /**\n * Template for a model's Zod export name. `{Model}` → Prisma model name.\n * Defaults to `{Model}WithRelationsSchema` (the relations-aware schema\n * emitted by zod-prisma-types when `createRelationValuesTypes` is on).\n */\n schemaExportName: z.string().default('{Model}WithRelationsSchema'),\n /** Path to the shared enum registry, relative to project root. Default `crouton.enums.json`. */\n enumsFile: z.string().default('crouton.enums.json'),\n /** Optional overrides of the default visibility ruleset. */\n rules: RulesetSchema.default(RulesetSchema.parse({})),\n /**\n * Sidebar group definitions, keyed by group slug (e.g. `\"metadata\"`).\n * Resources reference a group via `sidebar.group` in their `resource.json`.\n */\n sidebarGroups: z.record(z.string(), SidebarGroupSchema).default({}),\n /**\n * Whether form fields are saved automatically as the user edits them.\n * @default true\n */\n autoSave: z.boolean().default(true),\n});\n\nexport type CroutonConfig = z.infer<typeof CroutonConfigSchema>;\n","export const CONFIG_FILES = ['crouton.json', 'crouton.mjs', 'crouton.js'];\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","ModalSize","import_zod","z","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","z","import_zod","import_zod","import_zod"]}
|