@msbci/form-server 1.3.0 → 1.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/middleware/error.middleware.ts","../src/services/form.service.ts","../src/services/scope.service.ts","../src/middleware/auth.middleware.ts","../src/middleware/validation.middleware.ts","../src/create-router.ts"],"names":["ApiError","_ApiError","statusCode","message","errors","successResponse","data","paginatedResponse","total","page","pageSize","toJson","value","fromJson","localizedToDb","FormService","prisma","tenantId","id","ft","metadata","rest","params","where","items","form","ctx","dbForm","formId","conditions","pageId","options","templateOverrides","validationRules","dataSourceDependencies","style","defaultValue","sub","formDef","serializeForm","json","deserializeForm","created","dbPage","variable","getPageVariables","roster","getPageRosters","dbRoster","v","rosterId","resolveTemplates","p","r","templateIds","collectTemplateIds","dbTemplates","templateMap","t","resolveFormTemplates","parseMaybeJson","DEFAULT_TENANT","localizedFromDb","tenantFromCtx","explicit","ScopeService","err","isUniqueViolation","updated","formCount","templateCount","rows","found","scopeId","scope","ids","row","noAuth","createFormTypeSchema","z","updateFormTypeSchema","createFormDefinitionSchema","updateFormDefinitionSchema","createFormPageSchema","updateFormPageSchema","createFormRosterSchema","updateFormRosterSchema","createFormVariableSchema","updateFormVariableSchema","localizedSchema","createScopeSchema","updateScopeSchema","VARIABLE_TYPES","createVariableTemplateSchema","updateVariableTemplateSchema","createSubmissionSchema","updateSubmissionSchema","paginationSchema","initialisedClients","initializeDefaults","createFormRouter","auth","service","scopeService","routes","withAuth","req","ok","status","paginated","types","matchRoute","method","path","pattern","handler","routeMethod","routePath","matchPath","matched","error","i","actual","patternParts","actualParts","pp","ap"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Standardized API error response.\n */\n\nexport class ApiError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n public errors?: string[],\n ) {\n super(message)\n this.name = 'ApiError'\n }\n\n static notFound(message = 'Resource not found') {\n return new ApiError(404, message)\n }\n\n static badRequest(message: string, errors?: string[]) {\n return new ApiError(400, message, errors)\n }\n\n static unauthorized(message = 'Unauthorized') {\n return new ApiError(401, message)\n }\n\n static conflict(message: string) {\n return new ApiError(409, message)\n }\n}\n\nexport interface ApiResponse<T = unknown> {\n status: number\n message: string\n data: T\n errors?: string[]\n}\n\nexport function successResponse<T>(data: T, message = 'Success'): ApiResponse<T> {\n return { status: 200, message, data }\n}\n\nexport function paginatedResponse<T>(\n data: T[],\n total: number,\n page: number,\n pageSize: number,\n): ApiResponse<{ items: T[]; total: number; page: number; pageSize: number; totalPages: number }> {\n return {\n status: 200,\n message: 'Success',\n data: {\n items: data,\n total,\n page,\n pageSize,\n totalPages: Math.ceil(total / pageSize),\n },\n }\n}\n","/**\n * Form service — all CRUD operations via Prisma.\n * Framework-agnostic: called by route handlers.\n */\n\nimport type { PrismaClient } from '../../generated/prisma'\nimport { ApiError } from '../middleware/error.middleware'\nimport type { IRequestContext } from '../middleware/auth.middleware'\nimport {\n serializeForm,\n deserializeForm,\n getPageVariables,\n getPageRosters,\n resolveFormTemplates,\n collectTemplateIds,\n} from '@msbci/form-core'\nimport type {\n IFormDefinition,\n IVariableTemplate,\n LocalizedString,\n VariableType,\n} from '@msbci/form-core'\n\n/** JSON serialization helpers (Prisma stores JSON as string in SQLite) */\nfunction toJson(value: unknown): string | null {\n if (value === undefined || value === null) return null\n return JSON.stringify(value)\n}\n\nfunction fromJson<T>(value: string | null): T | undefined {\n if (!value) return undefined\n try { return JSON.parse(value) as T } catch { return undefined }\n}\n\n/**\n * Flattens a `LocalizedString` value to a plain `string` suitable for\n * Prisma's `String` columns. Record-shaped values are JSON-stringified —\n * read-side code can detect the JSON shape and parse back. Plain strings\n * are returned untouched (backward compatible).\n */\nfunction localizedToDb(value: LocalizedString | undefined): string | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'string') return value\n return JSON.stringify(value)\n}\n\nexport class FormService {\n constructor(private prisma: PrismaClient) {}\n\n // ─── FormType ────────────────────────────\n\n async getFormTypes(tenantId?: string) {\n return this.prisma.formType.findMany({ orderBy: { name: 'asc' } })\n }\n\n async getFormType(id: string) {\n const ft = await this.prisma.formType.findUnique({ where: { id } })\n if (!ft) throw ApiError.notFound('FormType not found')\n return ft\n }\n\n async createFormType(data: { code: string; name: string; description?: string; metadata?: Record<string, unknown> }) {\n return this.prisma.formType.create({\n data: { ...data, metadata: toJson(data.metadata) },\n })\n }\n\n async updateFormType(id: string, data: Partial<{ code: string; name: string; description: string; metadata: Record<string, unknown> }>) {\n const { metadata, ...rest } = data\n return this.prisma.formType.update({\n where: { id },\n data: { ...rest, ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}) },\n })\n }\n\n async deleteFormType(id: string) {\n return this.prisma.formType.delete({ where: { id } })\n }\n\n // ─── FormDefinition ─────────────────────\n\n async getFormDefinitions(params: { page: number; pageSize: number; search?: string; tenantId?: string }) {\n const where: Record<string, unknown> = {}\n if (params.tenantId) where['tenantId'] = params.tenantId\n if (params.search) {\n where['OR'] = [\n { name: { contains: params.search } },\n { code: { contains: params.search } },\n ]\n }\n\n const [items, total] = await Promise.all([\n this.prisma.formDefinition.findMany({\n where: where as any,\n include: { formType: true, _count: { select: { pages: true, submissions: true } } },\n skip: (params.page - 1) * params.pageSize,\n take: params.pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.formDefinition.count({ where: where as any }),\n ])\n\n return { items, total }\n }\n\n async getFormDefinition(id: string) {\n const form = await this.prisma.formDefinition.findUnique({\n where: { id },\n include: {\n formType: true,\n pages: {\n orderBy: { order: 'asc' },\n include: {\n variables: { where: { pageId: { not: null } }, orderBy: { order: 'asc' } },\n rosters: {\n orderBy: { order: 'asc' },\n include: { variables: { orderBy: { order: 'asc' } } },\n },\n },\n },\n },\n })\n if (!form) throw ApiError.notFound('FormDefinition not found')\n return form\n }\n\n async createFormDefinition(data: {\n code: string; name: string; description?: string; version?: string;\n isPublished?: boolean; tenantId?: string; formTypeId?: string; scopeId?: string;\n metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n return this.prisma.formDefinition.create({\n data: {\n ...data,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n }\n\n async updateFormDefinition(id: string, data: Partial<{\n code: string; name: string; description: string; version: string;\n isPublished: boolean; formTypeId: string; scopeId: string; metadata: Record<string, unknown>\n }>, ctx?: IRequestContext) {\n const { metadata, ...rest } = data\n return this.prisma.formDefinition.update({\n where: { id },\n data: {\n ...rest,\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n }\n\n /**\n * Load a form by id and return it as a fully-resolved `IFormDefinition`\n * (templates applied — Option B). Used by `GET /forms/:id/resolved` and\n * `exportForm`. The original DB-include shape is still available via\n * {@link getFormDefinition}.\n */\n async getResolvedFormDefinition(id: string): Promise<IFormDefinition> {\n const dbForm = await this.getFormDefinition(id)\n return this.dbToFormDefinition(dbForm)\n }\n\n async deleteFormDefinition(id: string) {\n return this.prisma.formDefinition.delete({ where: { id } })\n }\n\n // ─── FormPage ───────────────────────────\n\n async createFormPage(formId: string, data: {\n code: string; name: string; order: number; isRepeatable?: boolean;\n repeatMinInstances?: number; repeatMaxInstances?: number;\n repeatControlVarCode?: string; repeatInstanceLabel?: string;\n conditions?: unknown[]; metadata?: Record<string, unknown>\n }) {\n return this.prisma.formPage.create({\n data: {\n ...data,\n formId,\n conditions: toJson(data.conditions),\n metadata: toJson(data.metadata),\n },\n })\n }\n\n async updateFormPage(id: string, data: Partial<{\n code: string; name: string; order: number; isRepeatable: boolean;\n repeatMinInstances: number; repeatMaxInstances: number;\n repeatControlVarCode: string; repeatInstanceLabel: string;\n conditions: unknown[]; metadata: Record<string, unknown>\n }>) {\n const { conditions, metadata, ...rest } = data\n return this.prisma.formPage.update({\n where: { id },\n data: {\n ...rest,\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n },\n })\n }\n\n async deleteFormPage(id: string) {\n return this.prisma.formPage.delete({ where: { id } })\n }\n\n // ─── FormRoster ─────────────────────────\n\n async createFormRoster(pageId: string, data: {\n code: string; name: string; rosterType: string; order: number;\n pilotVariableCode?: string; options?: unknown[]; conditions?: unknown[];\n metadata?: Record<string, unknown>\n }) {\n return this.prisma.formRoster.create({\n data: {\n ...data,\n pageId,\n options: toJson(data.options),\n conditions: toJson(data.conditions),\n metadata: toJson(data.metadata),\n },\n })\n }\n\n async updateFormRoster(id: string, data: Partial<{\n code: string; name: string; rosterType: string; order: number;\n pilotVariableCode: string; options: unknown[]; conditions: unknown[];\n metadata: Record<string, unknown>\n }>) {\n const { options, conditions, metadata, ...rest } = data\n return this.prisma.formRoster.update({\n where: { id },\n data: {\n ...rest,\n ...(options !== undefined ? { options: toJson(options) } : {}),\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n },\n })\n }\n\n async deleteFormRoster(id: string) {\n return this.prisma.formRoster.delete({ where: { id } })\n }\n\n // ─── FormVariable ───────────────────────\n\n async createFormVariable(data: {\n code: string; name: string; type: string; order: number;\n pageId?: string; rosterId?: string;\n isRequired?: boolean; isReadonly?: boolean; isHidden?: boolean;\n defaultValue?: unknown; placeholder?: string; description?: string;\n options?: unknown[]; validationRules?: unknown[]; conditions?: unknown[];\n expression?: string; dataSourceId?: string; dataSourceDependencies?: Record<string, string>;\n style?: unknown; metadata?: Record<string, unknown>;\n templateId?: string; templateOverrides?: Record<string, unknown>\n }) {\n if (!data.pageId && !data.rosterId) {\n throw ApiError.badRequest('Variable must belong to a page or a roster')\n }\n const { templateOverrides, ...rest } = data\n return this.prisma.formVariable.create({\n data: {\n ...rest,\n defaultValue: data.defaultValue !== undefined ? String(data.defaultValue) : null,\n options: toJson(data.options),\n validationRules: toJson(data.validationRules),\n conditions: toJson(data.conditions),\n dataSourceDependencies: toJson(data.dataSourceDependencies),\n style: toJson(data.style),\n metadata: toJson(data.metadata),\n templateOverrides: toJson(templateOverrides),\n },\n })\n }\n\n async updateFormVariable(id: string, data: Partial<{\n code: string; name: string; type: string; order: number;\n isRequired: boolean; isReadonly: boolean; isHidden: boolean;\n defaultValue: unknown; placeholder: string; description: string;\n options: unknown[]; validationRules: unknown[]; conditions: unknown[];\n expression: string; dataSourceId: string; dataSourceDependencies: Record<string, string>;\n style: unknown; metadata: Record<string, unknown>;\n templateId: string | null; templateOverrides: Record<string, unknown> | null\n }>) {\n const {\n options, validationRules, conditions, dataSourceDependencies,\n style, metadata, defaultValue, templateOverrides, ...rest\n } = data\n return this.prisma.formVariable.update({\n where: { id },\n data: {\n ...rest,\n ...(defaultValue !== undefined ? { defaultValue: String(defaultValue) } : {}),\n ...(options !== undefined ? { options: toJson(options) } : {}),\n ...(validationRules !== undefined ? { validationRules: toJson(validationRules) } : {}),\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(dataSourceDependencies !== undefined ? { dataSourceDependencies: toJson(dataSourceDependencies) } : {}),\n ...(style !== undefined ? { style: toJson(style) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n ...(templateOverrides !== undefined ? { templateOverrides: toJson(templateOverrides) } : {}),\n },\n })\n }\n\n async deleteFormVariable(id: string) {\n return this.prisma.formVariable.delete({ where: { id } })\n }\n\n // ─── Submission ─────────────────────────\n\n async getSubmissions(params: { formId: string; page: number; pageSize: number; status?: string; tenantId?: string }) {\n const where: Record<string, unknown> = { formId: params.formId }\n if (params.status) where['status'] = params.status\n if (params.tenantId) where['tenantId'] = params.tenantId\n\n const [items, total] = await Promise.all([\n this.prisma.formSubmission.findMany({\n where: where as any,\n skip: (params.page - 1) * params.pageSize,\n take: params.pageSize,\n orderBy: { createdAt: 'desc' },\n }),\n this.prisma.formSubmission.count({ where: where as any }),\n ])\n\n return { items, total }\n }\n\n async getSubmission(id: string) {\n const sub = await this.prisma.formSubmission.findUnique({ where: { id } })\n if (!sub) throw ApiError.notFound('Submission not found')\n return sub\n }\n\n async createSubmission(data: {\n formId: string; tenantId?: string; status?: string;\n data: Record<string, unknown>; submittedBy?: string; metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n return this.prisma.formSubmission.create({\n data: {\n formId: data.formId,\n tenantId: data.tenantId,\n status: data.status ?? 'draft',\n data: JSON.stringify(data.data),\n submittedBy: data.submittedBy,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n }\n\n async updateSubmission(id: string, data: Partial<{ status: string; data: Record<string, unknown>; metadata: Record<string, unknown> }>, ctx?: IRequestContext) {\n return this.prisma.formSubmission.update({\n where: { id },\n data: {\n ...(data.status ? { status: data.status } : {}),\n ...(data.data ? { data: JSON.stringify(data.data) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n }\n\n // ─── Export / Import ────────────────────\n\n async exportForm(formId: string): Promise<string> {\n const dbForm = await this.getFormDefinition(formId)\n const formDef = await this.dbToFormDefinition(dbForm)\n return serializeForm(formDef)\n }\n\n async importForm(json: string, tenantId?: string): Promise<string> {\n const formDef = deserializeForm(json)\n const created = await this.createFormDefinition({\n code: formDef.code,\n name: localizedToDb(formDef.name) ?? '',\n description: localizedToDb(formDef.description),\n version: formDef.version,\n isPublished: formDef.isPublished,\n tenantId,\n formTypeId: formDef.formTypeId,\n scopeId: formDef.scopeId,\n })\n\n for (const page of formDef.pages) {\n const dbPage = await this.createFormPage(created.id, {\n code: page.code,\n name: localizedToDb(page.name) ?? '',\n order: page.order,\n isRepeatable: page.isRepeatable,\n repeatMinInstances: page.repeatConfig?.min,\n repeatMaxInstances: page.repeatConfig?.max,\n repeatControlVarCode: page.repeatConfig?.controlVariableCode,\n repeatInstanceLabel: localizedToDb(page.repeatConfig?.instanceLabel),\n })\n\n for (const variable of getPageVariables(page)) {\n await this.createFormVariable(this.extractVariableData(variable, dbPage.id, undefined))\n }\n\n for (const roster of getPageRosters(page)) {\n const dbRoster = await this.createFormRoster(dbPage.id, {\n code: roster.code,\n name: localizedToDb(roster.name) ?? '',\n rosterType: roster.rosterType,\n order: roster.order,\n pilotVariableCode: roster.pilotVariableCode,\n options: roster.options,\n })\n\n for (const variable of roster.variables) {\n await this.createFormVariable(this.extractVariableData(variable, undefined, dbRoster.id))\n }\n }\n }\n\n return created.id\n }\n\n /** Extract variable data for createFormVariable (omit `id` to let Prisma generate it) */\n private extractVariableData(v: any, pageId?: string, rosterId?: string) {\n return {\n code: v.code, name: v.name, type: v.type, order: v.order,\n pageId, rosterId,\n isRequired: v.isRequired, isReadonly: v.isReadonly, isHidden: v.isHidden,\n defaultValue: v.defaultValue, placeholder: v.placeholder, description: v.description,\n options: v.options, validationRules: v.validationRules, conditions: v.conditions,\n expression: v.expression, dataSourceId: v.dataSourceId,\n dataSourceDependencies: v.dataSourceDependencies, style: v.style, metadata: v.metadata,\n templateId: v.templateId, templateOverrides: v.templateOverrides,\n }\n }\n\n /**\n * Convert a Prisma DB result to a fully-resolved `IFormDefinition`.\n *\n * Templates referenced by `IFormVariable.templateId` are loaded in a\n * single batch and applied via `resolveFormTemplates` (Option B —\n * in-memory only, no mutation in DB). Pass `resolveTemplates = false`\n * to obtain the raw shape (useful for editor tooling that wants to\n * preserve `templateOverrides`).\n */\n private async dbToFormDefinition(\n dbForm: any,\n resolveTemplates = true,\n ): Promise<IFormDefinition> {\n const form: IFormDefinition = {\n id: dbForm.id,\n code: dbForm.code,\n name: dbForm.name,\n description: dbForm.description ?? undefined,\n version: dbForm.version,\n isPublished: dbForm.isPublished,\n formTypeId: dbForm.formTypeId ?? undefined,\n scopeId: dbForm.scopeId ?? undefined,\n metadata: fromJson(dbForm.metadata),\n pages: (dbForm.pages ?? []).map((p: any) => ({\n id: p.id,\n code: p.code,\n name: p.name,\n order: p.order,\n isRepeatable: p.isRepeatable,\n repeatConfig: p.isRepeatable ? {\n min: p.repeatMinInstances ?? undefined,\n max: p.repeatMaxInstances ?? undefined,\n controlVariableCode: p.repeatControlVarCode ?? undefined,\n instanceLabel: p.repeatInstanceLabel ?? undefined,\n } : undefined,\n conditions: fromJson(p.conditions) ?? [],\n variables: (p.variables ?? []).map((v: any) => this.dbToVariable(v)),\n rosters: (p.rosters ?? []).map((r: any) => ({\n id: r.id,\n code: r.code,\n name: r.name,\n rosterType: r.rosterType,\n order: r.order,\n pilotVariableCode: r.pilotVariableCode ?? undefined,\n options: fromJson(r.options),\n conditions: fromJson(r.conditions) ?? [],\n variables: (r.variables ?? []).map((v: any) => this.dbToVariable(v)),\n })),\n })),\n }\n\n if (!resolveTemplates) return form\n\n const templateIds = collectTemplateIds(form)\n if (templateIds.size === 0) return form\n\n const dbTemplates = await this.prisma.variableTemplate.findMany({\n where: { id: { in: [...templateIds] } },\n })\n const templateMap = new Map<string, IVariableTemplate>(\n dbTemplates.map((t) => [t.id, this.dbToTemplate(t)]),\n )\n return resolveFormTemplates(form, templateMap)\n }\n\n private dbToVariable(v: any) {\n return {\n id: v.id,\n code: v.code,\n name: v.name,\n type: v.type,\n order: v.order,\n isRequired: v.isRequired,\n isReadonly: v.isReadonly,\n isHidden: v.isHidden,\n defaultValue: v.defaultValue ?? undefined,\n placeholder: v.placeholder ?? undefined,\n description: v.description ?? undefined,\n options: fromJson(v.options),\n validationRules: fromJson(v.validationRules),\n conditions: fromJson(v.conditions),\n expression: v.expression ?? undefined,\n dataSourceId: v.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(v.dataSourceDependencies),\n style: fromJson(v.style),\n metadata: fromJson(v.metadata),\n templateId: v.templateId ?? undefined,\n templateOverrides: fromJson(v.templateOverrides),\n }\n }\n\n /**\n * Convert a Prisma VariableTemplate row to the domain type. Duplicated\n * locally (kept in sync with `ScopeService.dbToTemplate`) to avoid an\n * import cycle between the two services.\n */\n private dbToTemplate(t: any): IVariableTemplate {\n return {\n id: t.id,\n code: t.code,\n name: parseMaybeJson(t.name) ?? '',\n scopeId: t.scopeId,\n tenantId: t.tenantId ?? 'default',\n variableType: t.variableType as VariableType,\n description: parseMaybeJson(t.description),\n placeholder: parseMaybeJson(t.placeholder),\n isRequired: t.isRequired ?? undefined,\n isReadonly: t.isReadonly ?? undefined,\n isHidden: t.isHidden ?? undefined,\n options: fromJson(t.options),\n validationRules: fromJson(t.validationRules),\n conditions: fromJson(t.conditions),\n expression: t.expression ?? undefined,\n dataSourceId: t.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(t.dataSourceDependencies),\n style: fromJson(t.style),\n metadata: fromJson(t.metadata),\n createdAt: t.createdAt instanceof Date ? t.createdAt.toISOString() : t.createdAt,\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt.toISOString() : t.updatedAt,\n createdBy: t.createdBy ?? undefined,\n updatedBy: t.updatedBy ?? undefined,\n }\n }\n}\n\n/** Best-effort decoder for LocalizedString columns (object or plain). */\nfunction parseMaybeJson(value: string | null | undefined): LocalizedString | undefined {\n if (value === null || value === undefined) return undefined\n if (value.startsWith('{')) {\n try {\n return JSON.parse(value) as LocalizedString\n } catch {\n return value\n }\n }\n return value\n}\n","/**\n * Scope + VariableTemplate service — Prisma CRUD operations.\n *\n * Both resources are scoped by tenant. `tenantId` falls back to\n * `'default'` when the caller does not supply one (single-tenant\n * deployments stay transparent).\n *\n * Identity rules:\n * - `Scope.code` is unique within a tenant.\n * - `VariableTemplate.code` is unique within a scope.\n * - `code` and `name` of a template are IMMUTABLE after creation\n * (enforced here defensively in addition to the Zod schemas).\n */\n\nimport type { PrismaClient } from '../../generated/prisma'\nimport { ApiError } from '../middleware/error.middleware'\nimport type { IRequestContext } from '../middleware/auth.middleware'\nimport type {\n IScope,\n IVariableTemplate,\n LocalizedString,\n VariableType,\n} from '@msbci/form-core'\n\nconst DEFAULT_TENANT = 'default'\n\n/** JSON serialization helpers (Prisma stores JSON as TEXT in SQLite). */\nfunction toJson(value: unknown): string | null {\n if (value === undefined || value === null) return null\n return JSON.stringify(value)\n}\n\nfunction fromJson<T>(value: string | null | undefined): T | undefined {\n if (value === null || value === undefined) return undefined\n try {\n return JSON.parse(value) as T\n } catch {\n return undefined\n }\n}\n\n/** Flatten a LocalizedString to a plain DB column. */\nfunction localizedToDb(value: LocalizedString | undefined): string | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'string') return value\n return JSON.stringify(value)\n}\n\n/** Inverse: parse a DB string back into a LocalizedString (object or plain). */\nfunction localizedFromDb(value: string | null | undefined): LocalizedString | undefined {\n if (value === null || value === undefined) return undefined\n if (value.startsWith('{')) {\n try {\n return JSON.parse(value) as LocalizedString\n } catch {\n return value\n }\n }\n return value\n}\n\nfunction tenantFromCtx(ctx?: IRequestContext, explicit?: string): string {\n return explicit ?? ctx?.tenantId ?? DEFAULT_TENANT\n}\n\nexport interface ScopeInput {\n code: string\n name: LocalizedString\n description?: LocalizedString\n tenantId?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface ScopeUpdateInput {\n name?: LocalizedString\n description?: LocalizedString\n metadata?: Record<string, unknown>\n}\n\nexport interface VariableTemplateInput {\n code: string\n name: LocalizedString\n variableType: VariableType\n tenantId?: string\n description?: LocalizedString\n placeholder?: LocalizedString\n isRequired?: boolean\n isReadonly?: boolean\n isHidden?: boolean\n options?: unknown[]\n validationRules?: unknown[]\n conditions?: unknown[]\n expression?: string\n dataSourceId?: string\n dataSourceDependencies?: Record<string, string>\n style?: unknown\n metadata?: Record<string, unknown>\n}\n\n/** Update payload — `code` and `name` are intentionally excluded. */\nexport interface VariableTemplateUpdateInput {\n variableType?: VariableType\n description?: LocalizedString\n placeholder?: LocalizedString\n isRequired?: boolean\n isReadonly?: boolean\n isHidden?: boolean\n options?: unknown[]\n validationRules?: unknown[]\n conditions?: unknown[]\n expression?: string\n dataSourceId?: string\n dataSourceDependencies?: Record<string, string>\n style?: unknown\n metadata?: Record<string, unknown>\n}\n\nexport interface PaginationInput {\n page?: number\n pageSize?: number\n}\n\nexport class ScopeService {\n constructor(private prisma: PrismaClient) {}\n\n // ─── Scope CRUD ─────────────────────────\n\n async createScope(data: ScopeInput, ctx?: IRequestContext): Promise<IScope> {\n const tenantId = tenantFromCtx(ctx, data.tenantId)\n try {\n const created = await this.prisma.scope.create({\n data: {\n code: data.code,\n name: localizedToDb(data.name) ?? '',\n description: localizedToDb(data.description),\n tenantId,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToScope(created)\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw ApiError.badRequest(`Scope code \"${data.code}\" already exists for tenant \"${tenantId}\"`)\n }\n throw err\n }\n }\n\n async updateScope(id: string, data: ScopeUpdateInput, ctx?: IRequestContext): Promise<IScope> {\n const existing = await this.prisma.scope.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Scope not found')\n\n const updated = await this.prisma.scope.update({\n where: { id },\n data: {\n ...(data.name !== undefined ? { name: localizedToDb(data.name) ?? '' } : {}),\n ...(data.description !== undefined ? { description: localizedToDb(data.description) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToScope(updated)\n }\n\n /**\n * Hard-delete a scope. Refuses with 409 when at least one form OR one\n * template still references it (no silent cascade — admins explicitly\n * clean up first).\n */\n async deleteScope(id: string): Promise<void> {\n const existing = await this.prisma.scope.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Scope not found')\n\n const [formCount, templateCount] = await Promise.all([\n this.prisma.formDefinition.count({ where: { scopeId: id } }),\n this.prisma.variableTemplate.count({ where: { scopeId: id } }),\n ])\n\n if (formCount > 0 || templateCount > 0) {\n throw ApiError.conflict(\n `Scope is in use (forms: ${formCount}, templates: ${templateCount}). Remove dependents first.`,\n )\n }\n\n await this.prisma.scope.delete({ where: { id } })\n }\n\n async listScopes(params: { tenantId?: string } & PaginationInput, ctx?: IRequestContext) {\n const tenantId = tenantFromCtx(ctx, params.tenantId)\n const page = params.page ?? 1\n const pageSize = params.pageSize ?? 50\n\n const [rows, total] = await Promise.all([\n this.prisma.scope.findMany({\n where: { tenantId },\n skip: (page - 1) * pageSize,\n take: pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.scope.count({ where: { tenantId } }),\n ])\n\n return { items: rows.map((r) => this.dbToScope(r)), total }\n }\n\n async getScopeById(id: string): Promise<IScope> {\n const found = await this.prisma.scope.findUnique({ where: { id } })\n if (!found) throw ApiError.notFound('Scope not found')\n return this.dbToScope(found)\n }\n\n // ─── VariableTemplate CRUD ─────────────\n\n async createTemplate(\n scopeId: string,\n data: VariableTemplateInput,\n ctx?: IRequestContext,\n ): Promise<IVariableTemplate> {\n const scope = await this.prisma.scope.findUnique({ where: { id: scopeId } })\n if (!scope) throw ApiError.notFound('Scope not found')\n\n const tenantId = tenantFromCtx(ctx, data.tenantId) || scope.tenantId\n\n try {\n const created = await this.prisma.variableTemplate.create({\n data: {\n code: data.code,\n name: localizedToDb(data.name) ?? '',\n scopeId,\n tenantId,\n variableType: data.variableType,\n description: localizedToDb(data.description),\n placeholder: localizedToDb(data.placeholder),\n isRequired: data.isRequired ?? false,\n isReadonly: data.isReadonly ?? false,\n isHidden: data.isHidden ?? false,\n options: toJson(data.options),\n validationRules: toJson(data.validationRules),\n conditions: toJson(data.conditions),\n expression: data.expression,\n dataSourceId: data.dataSourceId,\n dataSourceDependencies: toJson(data.dataSourceDependencies),\n style: toJson(data.style),\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToTemplate(created)\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw ApiError.badRequest(`Template code \"${data.code}\" already exists in this scope`)\n }\n throw err\n }\n }\n\n async updateTemplate(\n id: string,\n data: VariableTemplateUpdateInput & { code?: never; name?: never },\n ctx?: IRequestContext,\n ): Promise<IVariableTemplate> {\n // Defensive guard — Zod already strips these, but enforce here too\n // so direct service callers (tests, scripts) cannot bypass the rule.\n if ('code' in data || 'name' in data) {\n throw ApiError.badRequest('Template code and name are immutable')\n }\n\n const existing = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Template not found')\n\n const updated = await this.prisma.variableTemplate.update({\n where: { id },\n data: {\n ...(data.variableType !== undefined ? { variableType: data.variableType } : {}),\n ...(data.description !== undefined ? { description: localizedToDb(data.description) } : {}),\n ...(data.placeholder !== undefined ? { placeholder: localizedToDb(data.placeholder) } : {}),\n ...(data.isRequired !== undefined ? { isRequired: data.isRequired } : {}),\n ...(data.isReadonly !== undefined ? { isReadonly: data.isReadonly } : {}),\n ...(data.isHidden !== undefined ? { isHidden: data.isHidden } : {}),\n ...(data.options !== undefined ? { options: toJson(data.options) } : {}),\n ...(data.validationRules !== undefined ? { validationRules: toJson(data.validationRules) } : {}),\n ...(data.conditions !== undefined ? { conditions: toJson(data.conditions) } : {}),\n ...(data.expression !== undefined ? { expression: data.expression } : {}),\n ...(data.dataSourceId !== undefined ? { dataSourceId: data.dataSourceId } : {}),\n ...(data.dataSourceDependencies !== undefined\n ? { dataSourceDependencies: toJson(data.dataSourceDependencies) }\n : {}),\n ...(data.style !== undefined ? { style: toJson(data.style) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToTemplate(updated)\n }\n\n async deleteTemplate(id: string): Promise<void> {\n const existing = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Template not found')\n await this.prisma.variableTemplate.delete({ where: { id } })\n }\n\n async listTemplates(scopeId: string, params?: PaginationInput) {\n const page = params?.page ?? 1\n const pageSize = params?.pageSize ?? 100\n\n const [rows, total] = await Promise.all([\n this.prisma.variableTemplate.findMany({\n where: { scopeId },\n skip: (page - 1) * pageSize,\n take: pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.variableTemplate.count({ where: { scopeId } }),\n ])\n\n return { items: rows.map((r) => this.dbToTemplate(r)), total }\n }\n\n async getTemplateById(id: string): Promise<IVariableTemplate> {\n const found = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!found) throw ApiError.notFound('Template not found')\n return this.dbToTemplate(found)\n }\n\n async getTemplatesByIds(ids: string[]): Promise<IVariableTemplate[]> {\n if (ids.length === 0) return []\n const rows = await this.prisma.variableTemplate.findMany({ where: { id: { in: ids } } })\n return rows.map((r) => this.dbToTemplate(r))\n }\n\n // ─── DB ↔ domain mappers ───────────────\n\n private dbToScope(row: any): IScope {\n return {\n id: row.id,\n code: row.code,\n name: localizedFromDb(row.name) ?? '',\n description: localizedFromDb(row.description),\n tenantId: row.tenantId ?? DEFAULT_TENANT,\n metadata: fromJson(row.metadata),\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\n createdBy: row.createdBy ?? undefined,\n updatedBy: row.updatedBy ?? undefined,\n }\n }\n\n private dbToTemplate(row: any): IVariableTemplate {\n return {\n id: row.id,\n code: row.code,\n name: localizedFromDb(row.name) ?? '',\n scopeId: row.scopeId,\n tenantId: row.tenantId ?? DEFAULT_TENANT,\n variableType: row.variableType as VariableType,\n description: localizedFromDb(row.description),\n placeholder: localizedFromDb(row.placeholder),\n isRequired: row.isRequired ?? undefined,\n isReadonly: row.isReadonly ?? undefined,\n isHidden: row.isHidden ?? undefined,\n options: fromJson(row.options),\n validationRules: fromJson(row.validationRules),\n conditions: fromJson(row.conditions),\n expression: row.expression ?? undefined,\n dataSourceId: row.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(row.dataSourceDependencies),\n style: fromJson(row.style),\n metadata: fromJson(row.metadata),\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\n createdBy: row.createdBy ?? undefined,\n updatedBy: row.updatedBy ?? undefined,\n }\n }\n}\n\n/** Recognise Prisma P2002 (unique constraint) without bringing in the runtime. */\nfunction isUniqueViolation(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'code' in err &&\n (err as { code?: string }).code === 'P2002'\n )\n}\n","/**\n * Auth middleware — injectable hook for the host application.\n *\n * The package provides NO auth logic. The host app configures\n * an auth handler that is called before every route.\n */\n\n/** Request context passed to route handlers */\nexport interface IRequestContext {\n /** Authenticated user ID (set by auth middleware) */\n userId?: string\n /** Tenant ID (for multi-tenant setups) */\n tenantId?: string\n /** Additional context from the host app */\n extra?: Record<string, unknown>\n}\n\n/** Auth middleware function signature */\nexport type AuthMiddleware = (\n req: { headers: Record<string, string | string[] | undefined>; query: Record<string, string | undefined> },\n) => Promise<IRequestContext | null>\n\n/** Default auth — no authentication, returns empty context */\nexport const noAuth: AuthMiddleware = async () => ({})\n","/**\n * Zod validation schemas for all API inputs.\n */\n\nimport { z } from 'zod'\n\n// ─── FormType ─────────────────────────────────────\n\nexport const createFormTypeSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n description: z.string().max(1000).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormTypeSchema = createFormTypeSchema.partial()\n\n// ─── FormDefinition ───────────────────────────────\n\nexport const createFormDefinitionSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n description: z.string().max(1000).optional(),\n version: z.string().default('1.0.0'),\n isPublished: z.boolean().default(false),\n tenantId: z.string().optional(),\n formTypeId: z.string().optional(),\n scopeId: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormDefinitionSchema = createFormDefinitionSchema.partial()\n\n// ─── FormPage ─────────────────────────────────────\n\nexport const createFormPageSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n order: z.number().int().min(0),\n isRepeatable: z.boolean().default(false),\n repeatMinInstances: z.number().int().min(0).optional(),\n repeatMaxInstances: z.number().int().min(1).optional(),\n repeatControlVarCode: z.string().optional(),\n repeatInstanceLabel: z.string().optional(),\n conditions: z.array(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormPageSchema = createFormPageSchema.partial()\n\n// ─── FormRoster ───────────────────────────────────\n\nexport const createFormRosterSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n rosterType: z.enum(['check', 'list', 'collection', 'collection_extend']),\n order: z.number().int().min(0),\n pilotVariableCode: z.string().optional(),\n options: z.array(z.object({ label: z.string(), value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n conditions: z.array(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormRosterSchema = createFormRosterSchema.partial()\n\n// ─── FormVariable ─────────────────────────────────\n\nexport const createFormVariableSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n type: z.string().min(1),\n order: z.number().int().min(0),\n isRequired: z.boolean().default(false),\n isReadonly: z.boolean().default(false),\n isHidden: z.boolean().default(false),\n defaultValue: z.unknown().optional(),\n placeholder: z.string().optional(),\n description: z.string().max(1000).optional(),\n options: z.array(z.object({ label: z.string(), value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: z.string() })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n templateId: z.string().optional(),\n templateOverrides: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormVariableSchema = createFormVariableSchema.partial()\n\n// ─── Scope ────────────────────────────────────────\n\nconst localizedSchema = z.union([z.string(), z.record(z.string())])\n\nexport const createScopeSchema = z.object({\n code: z.string().min(1).max(80),\n name: localizedSchema,\n description: localizedSchema.optional(),\n tenantId: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n/**\n * Update payload for a scope. `code` is immutable to keep template\n * references stable; `name` and `description` remain editable.\n */\nexport const updateScopeSchema = z.object({\n name: localizedSchema.optional(),\n description: localizedSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n// ─── VariableTemplate ────────────────────────────\n\nconst VARIABLE_TYPES = [\n 'text', 'textarea', 'number', 'date', 'datetime', 'time',\n 'select', 'multiselect', 'checkbox', 'radio', 'file', 'image',\n 'email', 'gps', 'rating', 'calculated', 'hidden', 'label',\n 'panel', 'richtext', 'listradio', 'photo',\n] as const\n\nexport const createVariableTemplateSchema = z.object({\n code: z.string().min(1).max(80),\n name: localizedSchema,\n variableType: z.enum(VARIABLE_TYPES),\n tenantId: z.string().optional(),\n description: localizedSchema.optional(),\n placeholder: localizedSchema.optional(),\n isRequired: z.boolean().optional(),\n isReadonly: z.boolean().optional(),\n isHidden: z.boolean().optional(),\n options: z.array(z.object({ label: localizedSchema, value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: localizedSchema })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n/**\n * Update payload — `code` and `name` are intentionally absent (immutable).\n * Zod `.strict()` would reject unknown keys; we use `.strip()` (the default)\n * so callers that forward extra fields are tolerated. The service still\n * guards against `code`/`name` defensively.\n */\nexport const updateVariableTemplateSchema = z.object({\n variableType: z.enum(VARIABLE_TYPES).optional(),\n description: localizedSchema.optional(),\n placeholder: localizedSchema.optional(),\n isRequired: z.boolean().optional(),\n isReadonly: z.boolean().optional(),\n isHidden: z.boolean().optional(),\n options: z.array(z.object({ label: localizedSchema, value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: localizedSchema })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n}).strict()\n\n// ─── FormSubmission ───────────────────────────────\n\nexport const createSubmissionSchema = z.object({\n formId: z.string().min(1),\n tenantId: z.string().optional(),\n status: z.enum(['draft', 'submitted', 'approved', 'rejected', 'completed']).default('draft'),\n data: z.record(z.unknown()),\n submittedBy: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateSubmissionSchema = z.object({\n status: z.enum(['draft', 'submitted', 'approved', 'rejected', 'completed']).optional(),\n data: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n// ─── Pagination ───────────────────────────────────\n\nexport const paginationSchema = z.object({\n page: z.coerce.number().int().min(1).default(1),\n pageSize: z.coerce.number().int().min(1).max(100).default(20),\n search: z.string().optional(),\n tenantId: z.string().optional(),\n})\n","/**\n * createFormRouter — framework-agnostic route definitions.\n *\n * Returns a set of route handlers that can be mounted on:\n * - Express: app.use('/api/forms', createFormRouter(prisma).expressRouter())\n * - Fastify: app.register(createFormRouter(prisma).fastifyPlugin)\n * - Next.js: export const GET/POST = createFormRouter(prisma).nextHandler\n *\n * For simplicity, we return plain handler functions.\n * The host app mounts them using its own framework.\n */\n\nimport type { PrismaClient } from '../generated/prisma'\nimport { FormService } from './services/form.service'\nimport { ScopeService } from './services/scope.service'\nimport type { AuthMiddleware, IRequestContext } from './middleware/auth.middleware'\nimport { noAuth } from './middleware/auth.middleware'\nimport { ApiError, successResponse, paginatedResponse } from './middleware/error.middleware'\nimport {\n createFormTypeSchema, updateFormTypeSchema,\n createFormDefinitionSchema, updateFormDefinitionSchema,\n createFormPageSchema, updateFormPageSchema,\n createFormRosterSchema, updateFormRosterSchema,\n createFormVariableSchema, updateFormVariableSchema,\n createSubmissionSchema, updateSubmissionSchema,\n createScopeSchema, updateScopeSchema,\n createVariableTemplateSchema, updateVariableTemplateSchema,\n paginationSchema,\n} from './middleware/validation.middleware'\n\nexport interface FormRouterOptions {\n prisma: PrismaClient\n auth?: AuthMiddleware\n}\n\n/** A framework-agnostic request object */\nexport interface RouteRequest {\n method: string\n path: string\n params: Record<string, string>\n query: Record<string, string | undefined>\n body: unknown\n headers: Record<string, string | string[] | undefined>\n}\n\n/** A framework-agnostic response */\nexport interface RouteResponse {\n status: number\n body: unknown\n}\n\ntype RouteHandler = (req: RouteRequest) => Promise<RouteResponse>\n\nexport interface FormRouter {\n /** Handle a request — match path and method, return response */\n handle: (req: RouteRequest) => Promise<RouteResponse>\n /** All registered route handlers for advanced usage */\n routes: Map<string, RouteHandler>\n}\n\n/**\n * Tracks Prisma clients that have already had their default scope provisioned.\n * Kept module-scope so re-instantiating `createFormRouter` with the same\n * client is a cheap no-op. `WeakSet` lets the entries disappear if the\n * client is garbage-collected (tests that spin up disposable clients).\n */\nconst initialisedClients = new WeakSet<PrismaClient>()\n\n/**\n * Ensure the implicit `tenantId='default'` ships with at least one scope\n * (`code='default'`) so a fresh deployment is usable out of the box.\n *\n * The whole call is fire-and-forget: failures are logged but do not block\n * `createFormRouter`. The upsert is idempotent (relies on the\n * `@@unique([code, tenantId])` constraint), so concurrent boots are safe.\n */\nasync function initializeDefaults(prisma: PrismaClient): Promise<void> {\n await prisma.scope.upsert({\n where: { code_tenantId: { code: 'default', tenantId: 'default' } },\n update: {},\n create: {\n code: 'default',\n name: JSON.stringify({ fr: 'Scope par défaut', en: 'Default Scope' }),\n tenantId: 'default',\n },\n })\n}\n\nexport function createFormRouter(options: FormRouterOptions): FormRouter {\n const { prisma, auth = noAuth } = options\n\n if (!initialisedClients.has(prisma)) {\n initialisedClients.add(prisma)\n // Opportunistic: never block router construction. Errors (DB not\n // reachable yet at boot, etc.) surface in the logs but the router\n // remains fully functional for routes that don't need the default.\n initializeDefaults(prisma).catch((err) => {\n console.error('[form-server] initializeDefaults failed:', err)\n })\n }\n\n const service = new FormService(prisma)\n const scopeService = new ScopeService(prisma)\n const routes = new Map<string, RouteHandler>()\n\n async function withAuth(req: RouteRequest): Promise<IRequestContext> {\n const ctx = await auth({ headers: req.headers as any, query: req.query as any })\n if (!ctx) throw ApiError.unauthorized()\n return ctx\n }\n\n function ok(data: unknown, status = 200): RouteResponse {\n return { status, body: successResponse(data) }\n }\n\n function paginated(items: unknown[], total: number, page: number, pageSize: number): RouteResponse {\n return { status: 200, body: paginatedResponse(items, total, page, pageSize) }\n }\n\n // ─── FormType routes ────────────────────\n\n routes.set('GET /form-types', async (req) => {\n await withAuth(req)\n const types = await service.getFormTypes()\n return ok(types)\n })\n\n routes.set('GET /form-types/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getFormType(req.params['id']!))\n })\n\n routes.set('POST /form-types', async (req) => {\n await withAuth(req)\n const data = createFormTypeSchema.parse(req.body)\n return ok(await service.createFormType(data), 201)\n })\n\n routes.set('PUT /form-types/:id', async (req) => {\n await withAuth(req)\n const data = updateFormTypeSchema.parse(req.body)\n return ok(await service.updateFormType(req.params['id']!, data))\n })\n\n routes.set('DELETE /form-types/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormType(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormDefinition routes ──────────────\n\n routes.set('GET /forms', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await service.getFormDefinitions(params)\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /forms/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getFormDefinition(req.params['id']!))\n })\n\n routes.set('GET /forms/:id/resolved', async (req) => {\n await withAuth(req)\n return ok(await service.getResolvedFormDefinition(req.params['id']!))\n })\n\n routes.set('POST /forms', async (req) => {\n const ctx = await withAuth(req)\n const data = createFormDefinitionSchema.parse(req.body)\n return ok(await service.createFormDefinition(data, ctx), 201)\n })\n\n routes.set('PUT /forms/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateFormDefinitionSchema.parse(req.body)\n return ok(await service.updateFormDefinition(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /forms/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormDefinition(req.params['id']!)\n return ok(null, 204)\n })\n\n routes.set('GET /forms/:id/export', async (req) => {\n await withAuth(req)\n const json = await service.exportForm(req.params['id']!)\n return { status: 200, body: json }\n })\n\n routes.set('POST /forms/import', async (req) => {\n await withAuth(req)\n const { json, tenantId } = req.body as { json: string; tenantId?: string }\n const formId = await service.importForm(json, tenantId)\n return ok({ formId }, 201)\n })\n\n // ─── FormPage routes ────────────────────\n\n routes.set('POST /forms/:formId/pages', async (req) => {\n await withAuth(req)\n const data = createFormPageSchema.parse(req.body)\n return ok(await service.createFormPage(req.params['formId']!, data), 201)\n })\n\n routes.set('PUT /pages/:id', async (req) => {\n await withAuth(req)\n const data = updateFormPageSchema.parse(req.body)\n return ok(await service.updateFormPage(req.params['id']!, data))\n })\n\n routes.set('DELETE /pages/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormPage(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormRoster routes ──────────────────\n\n routes.set('POST /pages/:pageId/rosters', async (req) => {\n await withAuth(req)\n const data = createFormRosterSchema.parse(req.body)\n return ok(await service.createFormRoster(req.params['pageId']!, data), 201)\n })\n\n routes.set('PUT /rosters/:id', async (req) => {\n await withAuth(req)\n const data = updateFormRosterSchema.parse(req.body)\n return ok(await service.updateFormRoster(req.params['id']!, data))\n })\n\n routes.set('DELETE /rosters/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormRoster(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormVariable routes ────────────────\n\n routes.set('POST /pages/:pageId/variables', async (req) => {\n await withAuth(req)\n const data = createFormVariableSchema.parse(req.body)\n return ok(await service.createFormVariable({ ...data, pageId: req.params['pageId']! }), 201)\n })\n\n routes.set('POST /rosters/:rosterId/variables', async (req) => {\n await withAuth(req)\n const data = createFormVariableSchema.parse(req.body)\n return ok(await service.createFormVariable({ ...data, rosterId: req.params['rosterId']! }), 201)\n })\n\n routes.set('PUT /variables/:id', async (req) => {\n await withAuth(req)\n const data = updateFormVariableSchema.parse(req.body)\n return ok(await service.updateFormVariable(req.params['id']!, data))\n })\n\n routes.set('DELETE /variables/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormVariable(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── Submission routes ──────────────────\n\n routes.set('GET /forms/:formId/submissions', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await service.getSubmissions({\n formId: req.params['formId']!,\n ...params,\n })\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /submissions/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getSubmission(req.params['id']!))\n })\n\n routes.set('POST /submissions', async (req) => {\n const ctx = await withAuth(req)\n const data = createSubmissionSchema.parse(req.body)\n return ok(await service.createSubmission(data, ctx), 201)\n })\n\n routes.set('PUT /submissions/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateSubmissionSchema.parse(req.body)\n return ok(await service.updateSubmission(req.params['id']!, data, ctx))\n })\n\n // ─── Scope routes ───────────────────────\n\n routes.set('GET /scopes', async (req) => {\n const ctx = await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await scopeService.listScopes(\n { tenantId: params.tenantId, page: params.page, pageSize: params.pageSize },\n ctx,\n )\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /scopes/:id', async (req) => {\n await withAuth(req)\n return ok(await scopeService.getScopeById(req.params['id']!))\n })\n\n routes.set('POST /scopes', async (req) => {\n const ctx = await withAuth(req)\n const data = createScopeSchema.parse(req.body)\n return ok(await scopeService.createScope(data, ctx), 201)\n })\n\n routes.set('PUT /scopes/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateScopeSchema.parse(req.body)\n return ok(await scopeService.updateScope(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /scopes/:id', async (req) => {\n await withAuth(req)\n await scopeService.deleteScope(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── VariableTemplate routes ────────────\n\n routes.set('GET /scopes/:scopeId/templates', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await scopeService.listTemplates(req.params['scopeId']!, {\n page: params.page,\n pageSize: params.pageSize,\n })\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('POST /scopes/:scopeId/templates', async (req) => {\n const ctx = await withAuth(req)\n const data = createVariableTemplateSchema.parse(req.body)\n return ok(await scopeService.createTemplate(req.params['scopeId']!, data, ctx), 201)\n })\n\n routes.set('GET /templates/:id', async (req) => {\n await withAuth(req)\n return ok(await scopeService.getTemplateById(req.params['id']!))\n })\n\n routes.set('PUT /templates/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateVariableTemplateSchema.parse(req.body)\n return ok(await scopeService.updateTemplate(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /templates/:id', async (req) => {\n await withAuth(req)\n await scopeService.deleteTemplate(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── Router handler ─────────────────────\n\n function matchRoute(method: string, path: string): { handler: RouteHandler; params: Record<string, string> } | null {\n for (const [pattern, handler] of routes) {\n const [routeMethod, routePath] = pattern.split(' ')\n if (routeMethod !== method) continue\n\n const params = matchPath(routePath!, path)\n if (params) return { handler, params }\n }\n return null\n }\n\n return {\n routes,\n handle: async (req: RouteRequest): Promise<RouteResponse> => {\n try {\n const matched = matchRoute(req.method, req.path)\n if (!matched) return { status: 404, body: { status: 404, message: 'Route not found', data: null } }\n\n req.params = matched.params\n return await matched.handler(req)\n } catch (error) {\n if (error instanceof ApiError) {\n return { status: error.statusCode, body: { status: error.statusCode, message: error.message, data: null, errors: error.errors } }\n }\n if (error instanceof Error && error.name === 'ZodError') {\n const zodError = error as any\n return { status: 400, body: { status: 400, message: 'Validation error', data: null, errors: zodError.issues?.map((i: any) => i.message) } }\n }\n return { status: 500, body: { status: 500, message: 'Internal server error', data: null } }\n }\n },\n }\n}\n\n/** Simple path matcher: /forms/:id matches /forms/abc123 */\nfunction matchPath(pattern: string, actual: string): Record<string, string> | null {\n const patternParts = pattern.split('/').filter(Boolean)\n const actualParts = actual.split('/').filter(Boolean)\n\n if (patternParts.length !== actualParts.length) return null\n\n const params: Record<string, string> = {}\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i]!\n const ap = actualParts[i]!\n if (pp.startsWith(':')) {\n params[pp.slice(1)] = ap\n } else if (pp !== ap) {\n return null\n }\n }\n\n return params\n}\n"]}
1
+ {"version":3,"sources":["../src/middleware/error.middleware.ts","../src/services/form.service.ts","../src/services/scope.service.ts","../src/middleware/auth.middleware.ts","../src/middleware/validation.middleware.ts","../src/create-router.ts"],"names":["ApiError","_ApiError","statusCode","message","errors","successResponse","data","paginatedResponse","total","page","pageSize","toJson","value","fromJson","localizedToDb","FormService","prisma","tenantId","id","ft","metadata","rest","params","where","items","form","ctx","scopeIds","scopeId","order","dbForm","formId","conditions","pageId","options","templateOverrides","validationRules","dataSourceDependencies","style","defaultValue","sub","formDef","serializeForm","json","deserializeForm","created","dbPage","variable","getPageVariables","roster","getPageRosters","dbRoster","v","rosterId","resolveTemplates","a","b","s","p","r","templateIds","collectTemplateIds","dbTemplates","templateMap","t","resolveFormTemplates","parseMaybeJson","DEFAULT_TENANT","localizedFromDb","tenantFromCtx","explicit","ScopeService","err","isUniqueViolation","updated","formCount","templateCount","rows","found","scope","ids","row","noAuth","createFormTypeSchema","z","updateFormTypeSchema","createFormDefinitionSchema","updateFormDefinitionSchema","createFormPageSchema","updateFormPageSchema","createFormRosterSchema","updateFormRosterSchema","createFormVariableSchema","updateFormVariableSchema","localizedSchema","createScopeSchema","updateScopeSchema","VARIABLE_TYPES","createVariableTemplateSchema","updateVariableTemplateSchema","createSubmissionSchema","updateSubmissionSchema","paginationSchema","initialisedClients","initializeDefaults","createFormRouter","auth","service","scopeService","routes","withAuth","req","ok","status","paginated","types","matchRoute","method","path","pattern","handler","routeMethod","routePath","matchPath","matched","error","i","actual","patternParts","actualParts","pp","ap"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Standardized API error response.\n */\n\nexport class ApiError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n public errors?: string[],\n ) {\n super(message)\n this.name = 'ApiError'\n }\n\n static notFound(message = 'Resource not found') {\n return new ApiError(404, message)\n }\n\n static badRequest(message: string, errors?: string[]) {\n return new ApiError(400, message, errors)\n }\n\n static unauthorized(message = 'Unauthorized') {\n return new ApiError(401, message)\n }\n\n static conflict(message: string) {\n return new ApiError(409, message)\n }\n}\n\nexport interface ApiResponse<T = unknown> {\n status: number\n message: string\n data: T\n errors?: string[]\n}\n\nexport function successResponse<T>(data: T, message = 'Success'): ApiResponse<T> {\n return { status: 200, message, data }\n}\n\nexport function paginatedResponse<T>(\n data: T[],\n total: number,\n page: number,\n pageSize: number,\n): ApiResponse<{ items: T[]; total: number; page: number; pageSize: number; totalPages: number }> {\n return {\n status: 200,\n message: 'Success',\n data: {\n items: data,\n total,\n page,\n pageSize,\n totalPages: Math.ceil(total / pageSize),\n },\n }\n}\n","/**\n * Form service — all CRUD operations via Prisma.\n * Framework-agnostic: called by route handlers.\n */\n\nimport type { PrismaClient } from '../../generated/prisma'\nimport { ApiError } from '../middleware/error.middleware'\nimport type { IRequestContext } from '../middleware/auth.middleware'\nimport {\n serializeForm,\n deserializeForm,\n getPageVariables,\n getPageRosters,\n resolveFormTemplates,\n collectTemplateIds,\n} from '@msbci/form-core'\nimport type {\n IFormDefinition,\n IVariableTemplate,\n LocalizedString,\n VariableType,\n} from '@msbci/form-core'\n\n/** JSON serialization helpers (Prisma stores JSON as string in SQLite) */\nfunction toJson(value: unknown): string | null {\n if (value === undefined || value === null) return null\n return JSON.stringify(value)\n}\n\nfunction fromJson<T>(value: string | null): T | undefined {\n if (!value) return undefined\n try { return JSON.parse(value) as T } catch { return undefined }\n}\n\n/**\n * Flattens a `LocalizedString` value to a plain `string` suitable for\n * Prisma's `String` columns. Record-shaped values are JSON-stringified —\n * read-side code can detect the JSON shape and parse back. Plain strings\n * are returned untouched (backward compatible).\n */\nfunction localizedToDb(value: LocalizedString | undefined): string | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'string') return value\n return JSON.stringify(value)\n}\n\nexport class FormService {\n constructor(private prisma: PrismaClient) {}\n\n // ─── FormType ────────────────────────────\n\n async getFormTypes(tenantId?: string) {\n return this.prisma.formType.findMany({ orderBy: { name: 'asc' } })\n }\n\n async getFormType(id: string) {\n const ft = await this.prisma.formType.findUnique({ where: { id } })\n if (!ft) throw ApiError.notFound('FormType not found')\n return ft\n }\n\n async createFormType(data: { code: string; name: string; description?: string; metadata?: Record<string, unknown> }) {\n return this.prisma.formType.create({\n data: { ...data, metadata: toJson(data.metadata) },\n })\n }\n\n async updateFormType(id: string, data: Partial<{ code: string; name: string; description: string; metadata: Record<string, unknown> }>) {\n const { metadata, ...rest } = data\n return this.prisma.formType.update({\n where: { id },\n data: { ...rest, ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}) },\n })\n }\n\n async deleteFormType(id: string) {\n return this.prisma.formType.delete({ where: { id } })\n }\n\n // ─── FormDefinition ─────────────────────\n\n async getFormDefinitions(params: { page: number; pageSize: number; search?: string; tenantId?: string; scopeId?: string }) {\n const where: Record<string, unknown> = {}\n if (params.tenantId) where['tenantId'] = params.tenantId\n if (params.scopeId) where['scopes'] = { some: { scopeId: params.scopeId } }\n if (params.search) {\n where['OR'] = [\n { name: { contains: params.search } },\n { code: { contains: params.search } },\n ]\n }\n\n const [items, total] = await Promise.all([\n this.prisma.formDefinition.findMany({\n where: where as any,\n include: { formType: true, _count: { select: { pages: true, submissions: true } } },\n skip: (params.page - 1) * params.pageSize,\n take: params.pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.formDefinition.count({ where: where as any }),\n ])\n\n return { items, total }\n }\n\n async getFormDefinition(id: string) {\n const form = await this.prisma.formDefinition.findUnique({\n where: { id },\n include: {\n formType: true,\n scopes: { orderBy: { order: 'asc' } },\n pages: {\n orderBy: { order: 'asc' },\n include: {\n variables: { where: { pageId: { not: null } }, orderBy: { order: 'asc' } },\n rosters: {\n orderBy: { order: 'asc' },\n include: { variables: { orderBy: { order: 'asc' } } },\n },\n },\n },\n },\n })\n if (!form) throw ApiError.notFound('FormDefinition not found')\n return form\n }\n\n async createFormDefinition(data: {\n code: string; name: string; description?: string; version?: string;\n isPublished?: boolean; tenantId?: string; formTypeId?: string;\n scopeIds?: string[];\n metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n const { scopeIds, ...rest } = data\n return this.prisma.formDefinition.create({\n data: {\n ...rest,\n metadata: toJson(rest.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n ...(scopeIds && scopeIds.length > 0\n ? {\n scopes: {\n create: scopeIds.map((scopeId, order) => ({ scopeId, order })),\n },\n }\n : {}),\n },\n })\n }\n\n async updateFormDefinition(id: string, data: Partial<{\n code: string; name: string; description: string; version: string;\n isPublished: boolean; formTypeId: string;\n scopeIds: string[];\n metadata: Record<string, unknown>\n }>, ctx?: IRequestContext) {\n const { metadata, scopeIds, ...rest } = data\n\n // Update scalar / FK fields first.\n await this.prisma.formDefinition.update({\n where: { id },\n data: {\n ...rest,\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n\n // Replace the scope links when an explicit scopeIds array is provided.\n if (scopeIds !== undefined) {\n await this.prisma.formDefinitionScope.deleteMany({ where: { formId: id } })\n if (scopeIds.length > 0) {\n await this.prisma.formDefinitionScope.createMany({\n data: scopeIds.map((scopeId, order) => ({ formId: id, scopeId, order })),\n })\n }\n }\n\n return this.prisma.formDefinition.findUnique({\n where: { id },\n include: { scopes: { orderBy: { order: 'asc' } } },\n })\n }\n\n /**\n * Load a form by id and return it as a fully-resolved `IFormDefinition`\n * (templates applied — Option B). Used by `GET /forms/:id/resolved` and\n * `exportForm`. The original DB-include shape is still available via\n * {@link getFormDefinition}.\n */\n async getResolvedFormDefinition(id: string): Promise<IFormDefinition> {\n const dbForm = await this.getFormDefinition(id)\n return this.dbToFormDefinition(dbForm)\n }\n\n async deleteFormDefinition(id: string) {\n return this.prisma.formDefinition.delete({ where: { id } })\n }\n\n // ─── FormPage ───────────────────────────\n\n async createFormPage(formId: string, data: {\n code: string; name: string; order: number; isRepeatable?: boolean;\n repeatMinInstances?: number; repeatMaxInstances?: number;\n repeatControlVarCode?: string; repeatInstanceLabel?: string;\n conditions?: unknown[]; metadata?: Record<string, unknown>\n }) {\n return this.prisma.formPage.create({\n data: {\n ...data,\n formId,\n conditions: toJson(data.conditions),\n metadata: toJson(data.metadata),\n },\n })\n }\n\n async updateFormPage(id: string, data: Partial<{\n code: string; name: string; order: number; isRepeatable: boolean;\n repeatMinInstances: number; repeatMaxInstances: number;\n repeatControlVarCode: string; repeatInstanceLabel: string;\n conditions: unknown[]; metadata: Record<string, unknown>\n }>) {\n const { conditions, metadata, ...rest } = data\n return this.prisma.formPage.update({\n where: { id },\n data: {\n ...rest,\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n },\n })\n }\n\n async deleteFormPage(id: string) {\n return this.prisma.formPage.delete({ where: { id } })\n }\n\n // ─── FormRoster ─────────────────────────\n\n async createFormRoster(pageId: string, data: {\n code: string; name: string; rosterType: string; order: number;\n pilotVariableCode?: string; options?: unknown[]; conditions?: unknown[];\n metadata?: Record<string, unknown>\n }) {\n return this.prisma.formRoster.create({\n data: {\n ...data,\n pageId,\n options: toJson(data.options),\n conditions: toJson(data.conditions),\n metadata: toJson(data.metadata),\n },\n })\n }\n\n async updateFormRoster(id: string, data: Partial<{\n code: string; name: string; rosterType: string; order: number;\n pilotVariableCode: string; options: unknown[]; conditions: unknown[];\n metadata: Record<string, unknown>\n }>) {\n const { options, conditions, metadata, ...rest } = data\n return this.prisma.formRoster.update({\n where: { id },\n data: {\n ...rest,\n ...(options !== undefined ? { options: toJson(options) } : {}),\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n },\n })\n }\n\n async deleteFormRoster(id: string) {\n return this.prisma.formRoster.delete({ where: { id } })\n }\n\n // ─── FormVariable ───────────────────────\n\n async createFormVariable(data: {\n code: string; name: string; type: string; order: number;\n pageId?: string; rosterId?: string;\n isRequired?: boolean; isReadonly?: boolean; isHidden?: boolean;\n defaultValue?: unknown; placeholder?: string; description?: string;\n options?: unknown[]; validationRules?: unknown[]; conditions?: unknown[];\n expression?: string; dataSourceId?: string; dataSourceDependencies?: Record<string, string>;\n style?: unknown; metadata?: Record<string, unknown>;\n templateId?: string; templateOverrides?: Record<string, unknown>\n }) {\n if (!data.pageId && !data.rosterId) {\n throw ApiError.badRequest('Variable must belong to a page or a roster')\n }\n const { templateOverrides, ...rest } = data\n return this.prisma.formVariable.create({\n data: {\n ...rest,\n defaultValue: data.defaultValue !== undefined ? String(data.defaultValue) : null,\n options: toJson(data.options),\n validationRules: toJson(data.validationRules),\n conditions: toJson(data.conditions),\n dataSourceDependencies: toJson(data.dataSourceDependencies),\n style: toJson(data.style),\n metadata: toJson(data.metadata),\n templateOverrides: toJson(templateOverrides),\n },\n })\n }\n\n async updateFormVariable(id: string, data: Partial<{\n code: string; name: string; type: string; order: number;\n isRequired: boolean; isReadonly: boolean; isHidden: boolean;\n defaultValue: unknown; placeholder: string; description: string;\n options: unknown[]; validationRules: unknown[]; conditions: unknown[];\n expression: string; dataSourceId: string; dataSourceDependencies: Record<string, string>;\n style: unknown; metadata: Record<string, unknown>;\n templateId: string | null; templateOverrides: Record<string, unknown> | null\n }>) {\n const {\n options, validationRules, conditions, dataSourceDependencies,\n style, metadata, defaultValue, templateOverrides, ...rest\n } = data\n return this.prisma.formVariable.update({\n where: { id },\n data: {\n ...rest,\n ...(defaultValue !== undefined ? { defaultValue: String(defaultValue) } : {}),\n ...(options !== undefined ? { options: toJson(options) } : {}),\n ...(validationRules !== undefined ? { validationRules: toJson(validationRules) } : {}),\n ...(conditions !== undefined ? { conditions: toJson(conditions) } : {}),\n ...(dataSourceDependencies !== undefined ? { dataSourceDependencies: toJson(dataSourceDependencies) } : {}),\n ...(style !== undefined ? { style: toJson(style) } : {}),\n ...(metadata !== undefined ? { metadata: toJson(metadata) } : {}),\n ...(templateOverrides !== undefined ? { templateOverrides: toJson(templateOverrides) } : {}),\n },\n })\n }\n\n async deleteFormVariable(id: string) {\n return this.prisma.formVariable.delete({ where: { id } })\n }\n\n // ─── Submission ─────────────────────────\n\n async getSubmissions(params: { formId: string; page: number; pageSize: number; status?: string; tenantId?: string }) {\n const where: Record<string, unknown> = { formId: params.formId }\n if (params.status) where['status'] = params.status\n if (params.tenantId) where['tenantId'] = params.tenantId\n\n const [items, total] = await Promise.all([\n this.prisma.formSubmission.findMany({\n where: where as any,\n skip: (params.page - 1) * params.pageSize,\n take: params.pageSize,\n orderBy: { createdAt: 'desc' },\n }),\n this.prisma.formSubmission.count({ where: where as any }),\n ])\n\n return { items, total }\n }\n\n async getSubmission(id: string) {\n const sub = await this.prisma.formSubmission.findUnique({ where: { id } })\n if (!sub) throw ApiError.notFound('Submission not found')\n return sub\n }\n\n async createSubmission(data: {\n formId: string; tenantId?: string; status?: string;\n data: Record<string, unknown>; submittedBy?: string; metadata?: Record<string, unknown>\n }, ctx?: IRequestContext) {\n return this.prisma.formSubmission.create({\n data: {\n formId: data.formId,\n tenantId: data.tenantId,\n status: data.status ?? 'draft',\n data: JSON.stringify(data.data),\n submittedBy: data.submittedBy,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n }\n\n async updateSubmission(id: string, data: Partial<{ status: string; data: Record<string, unknown>; metadata: Record<string, unknown> }>, ctx?: IRequestContext) {\n return this.prisma.formSubmission.update({\n where: { id },\n data: {\n ...(data.status ? { status: data.status } : {}),\n ...(data.data ? { data: JSON.stringify(data.data) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n }\n\n // ─── Export / Import ────────────────────\n\n async exportForm(formId: string): Promise<string> {\n const dbForm = await this.getFormDefinition(formId)\n const formDef = await this.dbToFormDefinition(dbForm)\n return serializeForm(formDef)\n }\n\n async importForm(json: string, tenantId?: string): Promise<string> {\n const formDef = deserializeForm(json)\n const created = await this.createFormDefinition({\n code: formDef.code,\n name: localizedToDb(formDef.name) ?? '',\n description: localizedToDb(formDef.description),\n version: formDef.version,\n isPublished: formDef.isPublished,\n tenantId,\n formTypeId: formDef.formTypeId,\n scopeIds: formDef.scopeIds,\n })\n\n for (const page of formDef.pages) {\n const dbPage = await this.createFormPage(created.id, {\n code: page.code,\n name: localizedToDb(page.name) ?? '',\n order: page.order,\n isRepeatable: page.isRepeatable,\n repeatMinInstances: page.repeatConfig?.min,\n repeatMaxInstances: page.repeatConfig?.max,\n repeatControlVarCode: page.repeatConfig?.controlVariableCode,\n repeatInstanceLabel: localizedToDb(page.repeatConfig?.instanceLabel),\n })\n\n for (const variable of getPageVariables(page)) {\n await this.createFormVariable(this.extractVariableData(variable, dbPage.id, undefined))\n }\n\n for (const roster of getPageRosters(page)) {\n const dbRoster = await this.createFormRoster(dbPage.id, {\n code: roster.code,\n name: localizedToDb(roster.name) ?? '',\n rosterType: roster.rosterType,\n order: roster.order,\n pilotVariableCode: roster.pilotVariableCode,\n options: roster.options,\n })\n\n for (const variable of roster.variables) {\n await this.createFormVariable(this.extractVariableData(variable, undefined, dbRoster.id))\n }\n }\n }\n\n return created.id\n }\n\n /** Extract variable data for createFormVariable (omit `id` to let Prisma generate it) */\n private extractVariableData(v: any, pageId?: string, rosterId?: string) {\n return {\n code: v.code, name: v.name, type: v.type, order: v.order,\n pageId, rosterId,\n isRequired: v.isRequired, isReadonly: v.isReadonly, isHidden: v.isHidden,\n defaultValue: v.defaultValue, placeholder: v.placeholder, description: v.description,\n options: v.options, validationRules: v.validationRules, conditions: v.conditions,\n expression: v.expression, dataSourceId: v.dataSourceId,\n dataSourceDependencies: v.dataSourceDependencies, style: v.style, metadata: v.metadata,\n templateId: v.templateId, templateOverrides: v.templateOverrides,\n }\n }\n\n /**\n * Convert a Prisma DB result to a fully-resolved `IFormDefinition`.\n *\n * Templates referenced by `IFormVariable.templateId` are loaded in a\n * single batch and applied via `resolveFormTemplates` (Option B —\n * in-memory only, no mutation in DB). Pass `resolveTemplates = false`\n * to obtain the raw shape (useful for editor tooling that wants to\n * preserve `templateOverrides`).\n */\n private async dbToFormDefinition(\n dbForm: any,\n resolveTemplates = true,\n ): Promise<IFormDefinition> {\n const scopeIds = Array.isArray(dbForm.scopes)\n ? dbForm.scopes\n .slice()\n .sort((a: any, b: any) => a.order - b.order)\n .map((s: any) => s.scopeId as string)\n : undefined\n\n const form: IFormDefinition = {\n id: dbForm.id,\n code: dbForm.code,\n name: dbForm.name,\n description: dbForm.description ?? undefined,\n version: dbForm.version,\n isPublished: dbForm.isPublished,\n formTypeId: dbForm.formTypeId ?? undefined,\n scopeIds: scopeIds && scopeIds.length > 0 ? scopeIds : undefined,\n metadata: fromJson(dbForm.metadata),\n pages: (dbForm.pages ?? []).map((p: any) => ({\n id: p.id,\n code: p.code,\n name: p.name,\n order: p.order,\n isRepeatable: p.isRepeatable,\n repeatConfig: p.isRepeatable ? {\n min: p.repeatMinInstances ?? undefined,\n max: p.repeatMaxInstances ?? undefined,\n controlVariableCode: p.repeatControlVarCode ?? undefined,\n instanceLabel: p.repeatInstanceLabel ?? undefined,\n } : undefined,\n conditions: fromJson(p.conditions) ?? [],\n variables: (p.variables ?? []).map((v: any) => this.dbToVariable(v)),\n rosters: (p.rosters ?? []).map((r: any) => ({\n id: r.id,\n code: r.code,\n name: r.name,\n rosterType: r.rosterType,\n order: r.order,\n pilotVariableCode: r.pilotVariableCode ?? undefined,\n options: fromJson(r.options),\n conditions: fromJson(r.conditions) ?? [],\n variables: (r.variables ?? []).map((v: any) => this.dbToVariable(v)),\n })),\n })),\n }\n\n if (!resolveTemplates) return form\n\n const templateIds = collectTemplateIds(form)\n if (templateIds.size === 0) return form\n\n const dbTemplates = await this.prisma.variableTemplate.findMany({\n where: { id: { in: [...templateIds] } },\n })\n const templateMap = new Map<string, IVariableTemplate>(\n dbTemplates.map((t) => [t.id, this.dbToTemplate(t)]),\n )\n return resolveFormTemplates(form, templateMap)\n }\n\n private dbToVariable(v: any) {\n return {\n id: v.id,\n code: v.code,\n name: v.name,\n type: v.type,\n order: v.order,\n isRequired: v.isRequired,\n isReadonly: v.isReadonly,\n isHidden: v.isHidden,\n defaultValue: v.defaultValue ?? undefined,\n placeholder: v.placeholder ?? undefined,\n description: v.description ?? undefined,\n options: fromJson(v.options),\n validationRules: fromJson(v.validationRules),\n conditions: fromJson(v.conditions),\n expression: v.expression ?? undefined,\n dataSourceId: v.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(v.dataSourceDependencies),\n style: fromJson(v.style),\n metadata: fromJson(v.metadata),\n templateId: v.templateId ?? undefined,\n templateOverrides: fromJson(v.templateOverrides),\n }\n }\n\n /**\n * Convert a Prisma VariableTemplate row to the domain type. Duplicated\n * locally (kept in sync with `ScopeService.dbToTemplate`) to avoid an\n * import cycle between the two services.\n */\n private dbToTemplate(t: any): IVariableTemplate {\n return {\n id: t.id,\n code: t.code,\n name: parseMaybeJson(t.name) ?? '',\n scopeId: t.scopeId,\n tenantId: t.tenantId ?? 'default',\n variableType: t.variableType as VariableType,\n description: parseMaybeJson(t.description),\n placeholder: parseMaybeJson(t.placeholder),\n isRequired: t.isRequired ?? undefined,\n isReadonly: t.isReadonly ?? undefined,\n isHidden: t.isHidden ?? undefined,\n options: fromJson(t.options),\n validationRules: fromJson(t.validationRules),\n conditions: fromJson(t.conditions),\n expression: t.expression ?? undefined,\n dataSourceId: t.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(t.dataSourceDependencies),\n style: fromJson(t.style),\n metadata: fromJson(t.metadata),\n createdAt: t.createdAt instanceof Date ? t.createdAt.toISOString() : t.createdAt,\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt.toISOString() : t.updatedAt,\n createdBy: t.createdBy ?? undefined,\n updatedBy: t.updatedBy ?? undefined,\n }\n }\n}\n\n/** Best-effort decoder for LocalizedString columns (object or plain). */\nfunction parseMaybeJson(value: string | null | undefined): LocalizedString | undefined {\n if (value === null || value === undefined) return undefined\n if (value.startsWith('{')) {\n try {\n return JSON.parse(value) as LocalizedString\n } catch {\n return value\n }\n }\n return value\n}\n","/**\n * Scope + VariableTemplate service — Prisma CRUD operations.\n *\n * Both resources are scoped by tenant. `tenantId` falls back to\n * `'default'` when the caller does not supply one (single-tenant\n * deployments stay transparent).\n *\n * Identity rules:\n * - `Scope.code` is unique within a tenant.\n * - `VariableTemplate.code` is unique within a scope.\n * - `code` and `name` of a template are IMMUTABLE after creation\n * (enforced here defensively in addition to the Zod schemas).\n */\n\nimport type { PrismaClient } from '../../generated/prisma'\nimport { ApiError } from '../middleware/error.middleware'\nimport type { IRequestContext } from '../middleware/auth.middleware'\nimport type {\n IScope,\n IVariableTemplate,\n LocalizedString,\n VariableType,\n} from '@msbci/form-core'\n\nconst DEFAULT_TENANT = 'default'\n\n/** JSON serialization helpers (Prisma stores JSON as TEXT in SQLite). */\nfunction toJson(value: unknown): string | null {\n if (value === undefined || value === null) return null\n return JSON.stringify(value)\n}\n\nfunction fromJson<T>(value: string | null | undefined): T | undefined {\n if (value === null || value === undefined) return undefined\n try {\n return JSON.parse(value) as T\n } catch {\n return undefined\n }\n}\n\n/** Flatten a LocalizedString to a plain DB column. */\nfunction localizedToDb(value: LocalizedString | undefined): string | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'string') return value\n return JSON.stringify(value)\n}\n\n/** Inverse: parse a DB string back into a LocalizedString (object or plain). */\nfunction localizedFromDb(value: string | null | undefined): LocalizedString | undefined {\n if (value === null || value === undefined) return undefined\n if (value.startsWith('{')) {\n try {\n return JSON.parse(value) as LocalizedString\n } catch {\n return value\n }\n }\n return value\n}\n\nfunction tenantFromCtx(ctx?: IRequestContext, explicit?: string): string {\n return explicit ?? ctx?.tenantId ?? DEFAULT_TENANT\n}\n\nexport interface ScopeInput {\n code: string\n name: LocalizedString\n description?: LocalizedString\n tenantId?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface ScopeUpdateInput {\n name?: LocalizedString\n description?: LocalizedString\n metadata?: Record<string, unknown>\n}\n\nexport interface VariableTemplateInput {\n code: string\n name: LocalizedString\n variableType: VariableType\n tenantId?: string\n description?: LocalizedString\n placeholder?: LocalizedString\n isRequired?: boolean\n isReadonly?: boolean\n isHidden?: boolean\n options?: unknown[]\n validationRules?: unknown[]\n conditions?: unknown[]\n expression?: string\n dataSourceId?: string\n dataSourceDependencies?: Record<string, string>\n style?: unknown\n metadata?: Record<string, unknown>\n}\n\n/** Update payload — `code` and `name` are intentionally excluded. */\nexport interface VariableTemplateUpdateInput {\n variableType?: VariableType\n description?: LocalizedString\n placeholder?: LocalizedString\n isRequired?: boolean\n isReadonly?: boolean\n isHidden?: boolean\n options?: unknown[]\n validationRules?: unknown[]\n conditions?: unknown[]\n expression?: string\n dataSourceId?: string\n dataSourceDependencies?: Record<string, string>\n style?: unknown\n metadata?: Record<string, unknown>\n}\n\nexport interface PaginationInput {\n page?: number\n pageSize?: number\n}\n\nexport class ScopeService {\n constructor(private prisma: PrismaClient) {}\n\n // ─── Scope CRUD ─────────────────────────\n\n async createScope(data: ScopeInput, ctx?: IRequestContext): Promise<IScope> {\n const tenantId = tenantFromCtx(ctx, data.tenantId)\n try {\n const created = await this.prisma.scope.create({\n data: {\n code: data.code,\n name: localizedToDb(data.name) ?? '',\n description: localizedToDb(data.description),\n tenantId,\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToScope(created)\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw ApiError.badRequest(`Scope code \"${data.code}\" already exists for tenant \"${tenantId}\"`)\n }\n throw err\n }\n }\n\n async updateScope(id: string, data: ScopeUpdateInput, ctx?: IRequestContext): Promise<IScope> {\n const existing = await this.prisma.scope.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Scope not found')\n\n const updated = await this.prisma.scope.update({\n where: { id },\n data: {\n ...(data.name !== undefined ? { name: localizedToDb(data.name) ?? '' } : {}),\n ...(data.description !== undefined ? { description: localizedToDb(data.description) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToScope(updated)\n }\n\n /**\n * Hard-delete a scope. Refuses with 409 when at least one form OR one\n * template still references it (no silent cascade — admins explicitly\n * clean up first).\n */\n async deleteScope(id: string): Promise<void> {\n const existing = await this.prisma.scope.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Scope not found')\n\n const [formCount, templateCount] = await Promise.all([\n // Form ↔ scope is now a pivot table — count rows that pin this scope.\n this.prisma.formDefinitionScope.count({ where: { scopeId: id } }),\n this.prisma.variableTemplate.count({ where: { scopeId: id } }),\n ])\n\n if (formCount > 0 || templateCount > 0) {\n throw ApiError.conflict(\n `Scope is in use (forms: ${formCount}, templates: ${templateCount}). Remove dependents first.`,\n )\n }\n\n await this.prisma.scope.delete({ where: { id } })\n }\n\n async listScopes(params: { tenantId?: string } & PaginationInput, ctx?: IRequestContext) {\n const tenantId = tenantFromCtx(ctx, params.tenantId)\n const page = params.page ?? 1\n const pageSize = params.pageSize ?? 50\n\n const [rows, total] = await Promise.all([\n this.prisma.scope.findMany({\n where: { tenantId },\n skip: (page - 1) * pageSize,\n take: pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.scope.count({ where: { tenantId } }),\n ])\n\n return { items: rows.map((r) => this.dbToScope(r)), total }\n }\n\n async getScopeById(id: string): Promise<IScope> {\n const found = await this.prisma.scope.findUnique({ where: { id } })\n if (!found) throw ApiError.notFound('Scope not found')\n return this.dbToScope(found)\n }\n\n // ─── VariableTemplate CRUD ─────────────\n\n async createTemplate(\n scopeId: string,\n data: VariableTemplateInput,\n ctx?: IRequestContext,\n ): Promise<IVariableTemplate> {\n const scope = await this.prisma.scope.findUnique({ where: { id: scopeId } })\n if (!scope) throw ApiError.notFound('Scope not found')\n\n const tenantId = tenantFromCtx(ctx, data.tenantId) || scope.tenantId\n\n try {\n const created = await this.prisma.variableTemplate.create({\n data: {\n code: data.code,\n name: localizedToDb(data.name) ?? '',\n scopeId,\n tenantId,\n variableType: data.variableType,\n description: localizedToDb(data.description),\n placeholder: localizedToDb(data.placeholder),\n isRequired: data.isRequired ?? false,\n isReadonly: data.isReadonly ?? false,\n isHidden: data.isHidden ?? false,\n options: toJson(data.options),\n validationRules: toJson(data.validationRules),\n conditions: toJson(data.conditions),\n expression: data.expression,\n dataSourceId: data.dataSourceId,\n dataSourceDependencies: toJson(data.dataSourceDependencies),\n style: toJson(data.style),\n metadata: toJson(data.metadata),\n createdBy: ctx?.userId,\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToTemplate(created)\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw ApiError.badRequest(`Template code \"${data.code}\" already exists in this scope`)\n }\n throw err\n }\n }\n\n async updateTemplate(\n id: string,\n data: VariableTemplateUpdateInput & { code?: never; name?: never },\n ctx?: IRequestContext,\n ): Promise<IVariableTemplate> {\n // Defensive guard — Zod already strips these, but enforce here too\n // so direct service callers (tests, scripts) cannot bypass the rule.\n if ('code' in data || 'name' in data) {\n throw ApiError.badRequest('Template code and name are immutable')\n }\n\n const existing = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Template not found')\n\n const updated = await this.prisma.variableTemplate.update({\n where: { id },\n data: {\n ...(data.variableType !== undefined ? { variableType: data.variableType } : {}),\n ...(data.description !== undefined ? { description: localizedToDb(data.description) } : {}),\n ...(data.placeholder !== undefined ? { placeholder: localizedToDb(data.placeholder) } : {}),\n ...(data.isRequired !== undefined ? { isRequired: data.isRequired } : {}),\n ...(data.isReadonly !== undefined ? { isReadonly: data.isReadonly } : {}),\n ...(data.isHidden !== undefined ? { isHidden: data.isHidden } : {}),\n ...(data.options !== undefined ? { options: toJson(data.options) } : {}),\n ...(data.validationRules !== undefined ? { validationRules: toJson(data.validationRules) } : {}),\n ...(data.conditions !== undefined ? { conditions: toJson(data.conditions) } : {}),\n ...(data.expression !== undefined ? { expression: data.expression } : {}),\n ...(data.dataSourceId !== undefined ? { dataSourceId: data.dataSourceId } : {}),\n ...(data.dataSourceDependencies !== undefined\n ? { dataSourceDependencies: toJson(data.dataSourceDependencies) }\n : {}),\n ...(data.style !== undefined ? { style: toJson(data.style) } : {}),\n ...(data.metadata !== undefined ? { metadata: toJson(data.metadata) } : {}),\n updatedBy: ctx?.userId,\n },\n })\n return this.dbToTemplate(updated)\n }\n\n async deleteTemplate(id: string): Promise<void> {\n const existing = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!existing) throw ApiError.notFound('Template not found')\n await this.prisma.variableTemplate.delete({ where: { id } })\n }\n\n async listTemplates(scopeId: string, params?: PaginationInput) {\n const page = params?.page ?? 1\n const pageSize = params?.pageSize ?? 100\n\n const [rows, total] = await Promise.all([\n this.prisma.variableTemplate.findMany({\n where: { scopeId },\n skip: (page - 1) * pageSize,\n take: pageSize,\n orderBy: { updatedAt: 'desc' },\n }),\n this.prisma.variableTemplate.count({ where: { scopeId } }),\n ])\n\n return { items: rows.map((r) => this.dbToTemplate(r)), total }\n }\n\n async getTemplateById(id: string): Promise<IVariableTemplate> {\n const found = await this.prisma.variableTemplate.findUnique({ where: { id } })\n if (!found) throw ApiError.notFound('Template not found')\n return this.dbToTemplate(found)\n }\n\n async getTemplatesByIds(ids: string[]): Promise<IVariableTemplate[]> {\n if (ids.length === 0) return []\n const rows = await this.prisma.variableTemplate.findMany({ where: { id: { in: ids } } })\n return rows.map((r) => this.dbToTemplate(r))\n }\n\n // ─── DB ↔ domain mappers ───────────────\n\n private dbToScope(row: any): IScope {\n return {\n id: row.id,\n code: row.code,\n name: localizedFromDb(row.name) ?? '',\n description: localizedFromDb(row.description),\n tenantId: row.tenantId ?? DEFAULT_TENANT,\n metadata: fromJson(row.metadata),\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\n createdBy: row.createdBy ?? undefined,\n updatedBy: row.updatedBy ?? undefined,\n }\n }\n\n private dbToTemplate(row: any): IVariableTemplate {\n return {\n id: row.id,\n code: row.code,\n name: localizedFromDb(row.name) ?? '',\n scopeId: row.scopeId,\n tenantId: row.tenantId ?? DEFAULT_TENANT,\n variableType: row.variableType as VariableType,\n description: localizedFromDb(row.description),\n placeholder: localizedFromDb(row.placeholder),\n isRequired: row.isRequired ?? undefined,\n isReadonly: row.isReadonly ?? undefined,\n isHidden: row.isHidden ?? undefined,\n options: fromJson(row.options),\n validationRules: fromJson(row.validationRules),\n conditions: fromJson(row.conditions),\n expression: row.expression ?? undefined,\n dataSourceId: row.dataSourceId ?? undefined,\n dataSourceDependencies: fromJson(row.dataSourceDependencies),\n style: fromJson(row.style),\n metadata: fromJson(row.metadata),\n createdAt: row.createdAt instanceof Date ? row.createdAt.toISOString() : row.createdAt,\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt.toISOString() : row.updatedAt,\n createdBy: row.createdBy ?? undefined,\n updatedBy: row.updatedBy ?? undefined,\n }\n }\n}\n\n/** Recognise Prisma P2002 (unique constraint) without bringing in the runtime. */\nfunction isUniqueViolation(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'code' in err &&\n (err as { code?: string }).code === 'P2002'\n )\n}\n","/**\n * Auth middleware — injectable hook for the host application.\n *\n * The package provides NO auth logic. The host app configures\n * an auth handler that is called before every route.\n */\n\n/** Request context passed to route handlers */\nexport interface IRequestContext {\n /** Authenticated user ID (set by auth middleware) */\n userId?: string\n /** Tenant ID (for multi-tenant setups) */\n tenantId?: string\n /** Additional context from the host app */\n extra?: Record<string, unknown>\n}\n\n/** Auth middleware function signature */\nexport type AuthMiddleware = (\n req: { headers: Record<string, string | string[] | undefined>; query: Record<string, string | undefined> },\n) => Promise<IRequestContext | null>\n\n/** Default auth — no authentication, returns empty context */\nexport const noAuth: AuthMiddleware = async () => ({})\n","/**\n * Zod validation schemas for all API inputs.\n */\n\nimport { z } from 'zod'\n\n// ─── FormType ─────────────────────────────────────\n\nexport const createFormTypeSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n description: z.string().max(1000).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormTypeSchema = createFormTypeSchema.partial()\n\n// ─── FormDefinition ───────────────────────────────\n\nexport const createFormDefinitionSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n description: z.string().max(1000).optional(),\n version: z.string().default('1.0.0'),\n isPublished: z.boolean().default(false),\n tenantId: z.string().optional(),\n formTypeId: z.string().optional(),\n scopeIds: z.array(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormDefinitionSchema = createFormDefinitionSchema.partial()\n\n// ─── FormPage ─────────────────────────────────────\n\nexport const createFormPageSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n order: z.number().int().min(0),\n isRepeatable: z.boolean().default(false),\n repeatMinInstances: z.number().int().min(0).optional(),\n repeatMaxInstances: z.number().int().min(1).optional(),\n repeatControlVarCode: z.string().optional(),\n repeatInstanceLabel: z.string().optional(),\n conditions: z.array(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormPageSchema = createFormPageSchema.partial()\n\n// ─── FormRoster ───────────────────────────────────\n\nexport const createFormRosterSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n rosterType: z.enum(['check', 'list', 'collection', 'collection_extend']),\n order: z.number().int().min(0),\n pilotVariableCode: z.string().optional(),\n options: z.array(z.object({ label: z.string(), value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n conditions: z.array(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormRosterSchema = createFormRosterSchema.partial()\n\n// ─── FormVariable ─────────────────────────────────\n\nexport const createFormVariableSchema = z.object({\n code: z.string().min(1).max(50),\n name: z.string().min(1).max(200),\n type: z.string().min(1),\n order: z.number().int().min(0),\n isRequired: z.boolean().default(false),\n isReadonly: z.boolean().default(false),\n isHidden: z.boolean().default(false),\n defaultValue: z.unknown().optional(),\n placeholder: z.string().optional(),\n description: z.string().max(1000).optional(),\n options: z.array(z.object({ label: z.string(), value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: z.string() })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n templateId: z.string().optional(),\n templateOverrides: z.record(z.unknown()).optional(),\n})\n\nexport const updateFormVariableSchema = createFormVariableSchema.partial()\n\n// ─── Scope ────────────────────────────────────────\n\nconst localizedSchema = z.union([z.string(), z.record(z.string())])\n\nexport const createScopeSchema = z.object({\n code: z.string().min(1).max(80),\n name: localizedSchema,\n description: localizedSchema.optional(),\n tenantId: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n/**\n * Update payload for a scope. `code` is immutable to keep template\n * references stable; `name` and `description` remain editable.\n */\nexport const updateScopeSchema = z.object({\n name: localizedSchema.optional(),\n description: localizedSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n// ─── VariableTemplate ────────────────────────────\n\nconst VARIABLE_TYPES = [\n 'text', 'textarea', 'number', 'date', 'datetime', 'time',\n 'select', 'multiselect', 'checkbox', 'radio', 'file', 'image',\n 'email', 'gps', 'rating', 'calculated', 'hidden', 'label',\n 'panel', 'richtext', 'listradio', 'photo',\n] as const\n\nexport const createVariableTemplateSchema = z.object({\n code: z.string().min(1).max(80),\n name: localizedSchema,\n variableType: z.enum(VARIABLE_TYPES),\n tenantId: z.string().optional(),\n description: localizedSchema.optional(),\n placeholder: localizedSchema.optional(),\n isRequired: z.boolean().optional(),\n isReadonly: z.boolean().optional(),\n isHidden: z.boolean().optional(),\n options: z.array(z.object({ label: localizedSchema, value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: localizedSchema })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n/**\n * Update payload — `code` and `name` are intentionally absent (immutable).\n * Zod `.strict()` would reject unknown keys; we use `.strip()` (the default)\n * so callers that forward extra fields are tolerated. The service still\n * guards against `code`/`name` defensively.\n */\nexport const updateVariableTemplateSchema = z.object({\n variableType: z.enum(VARIABLE_TYPES).optional(),\n description: localizedSchema.optional(),\n placeholder: localizedSchema.optional(),\n isRequired: z.boolean().optional(),\n isReadonly: z.boolean().optional(),\n isHidden: z.boolean().optional(),\n options: z.array(z.object({ label: localizedSchema, value: z.unknown(), metadata: z.record(z.unknown()).optional() })).optional(),\n validationRules: z.array(z.object({ type: z.string(), value: z.unknown().optional(), message: localizedSchema })).optional(),\n conditions: z.array(z.unknown()).optional(),\n expression: z.string().optional(),\n dataSourceId: z.string().optional(),\n dataSourceDependencies: z.record(z.string()).optional(),\n style: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n}).strict()\n\n// ─── FormSubmission ───────────────────────────────\n\nexport const createSubmissionSchema = z.object({\n formId: z.string().min(1),\n tenantId: z.string().optional(),\n status: z.enum(['draft', 'submitted', 'approved', 'rejected', 'completed']).default('draft'),\n data: z.record(z.unknown()),\n submittedBy: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport const updateSubmissionSchema = z.object({\n status: z.enum(['draft', 'submitted', 'approved', 'rejected', 'completed']).optional(),\n data: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\n// ─── Pagination ───────────────────────────────────\n\nexport const paginationSchema = z.object({\n page: z.coerce.number().int().min(1).default(1),\n pageSize: z.coerce.number().int().min(1).max(100).default(20),\n search: z.string().optional(),\n tenantId: z.string().optional(),\n})\n","/**\n * createFormRouter — framework-agnostic route definitions.\n *\n * Returns a set of route handlers that can be mounted on:\n * - Express: app.use('/api/forms', createFormRouter(prisma).expressRouter())\n * - Fastify: app.register(createFormRouter(prisma).fastifyPlugin)\n * - Next.js: export const GET/POST = createFormRouter(prisma).nextHandler\n *\n * For simplicity, we return plain handler functions.\n * The host app mounts them using its own framework.\n */\n\nimport type { PrismaClient } from '../generated/prisma'\nimport { FormService } from './services/form.service'\nimport { ScopeService } from './services/scope.service'\nimport type { AuthMiddleware, IRequestContext } from './middleware/auth.middleware'\nimport { noAuth } from './middleware/auth.middleware'\nimport { ApiError, successResponse, paginatedResponse } from './middleware/error.middleware'\nimport {\n createFormTypeSchema, updateFormTypeSchema,\n createFormDefinitionSchema, updateFormDefinitionSchema,\n createFormPageSchema, updateFormPageSchema,\n createFormRosterSchema, updateFormRosterSchema,\n createFormVariableSchema, updateFormVariableSchema,\n createSubmissionSchema, updateSubmissionSchema,\n createScopeSchema, updateScopeSchema,\n createVariableTemplateSchema, updateVariableTemplateSchema,\n paginationSchema,\n} from './middleware/validation.middleware'\n\nexport interface FormRouterOptions {\n prisma: PrismaClient\n auth?: AuthMiddleware\n}\n\n/** A framework-agnostic request object */\nexport interface RouteRequest {\n method: string\n path: string\n params: Record<string, string>\n query: Record<string, string | undefined>\n body: unknown\n headers: Record<string, string | string[] | undefined>\n}\n\n/** A framework-agnostic response */\nexport interface RouteResponse {\n status: number\n body: unknown\n}\n\ntype RouteHandler = (req: RouteRequest) => Promise<RouteResponse>\n\nexport interface FormRouter {\n /** Handle a request — match path and method, return response */\n handle: (req: RouteRequest) => Promise<RouteResponse>\n /** All registered route handlers for advanced usage */\n routes: Map<string, RouteHandler>\n}\n\n/**\n * Tracks Prisma clients that have already had their default scope provisioned.\n * Kept module-scope so re-instantiating `createFormRouter` with the same\n * client is a cheap no-op. `WeakSet` lets the entries disappear if the\n * client is garbage-collected (tests that spin up disposable clients).\n */\nconst initialisedClients = new WeakSet<PrismaClient>()\n\n/**\n * Ensure the implicit `tenantId='default'` ships with at least one scope\n * (`code='default'`) so a fresh deployment is usable out of the box.\n *\n * The whole call is fire-and-forget: failures are logged but do not block\n * `createFormRouter`. The upsert is idempotent (relies on the\n * `@@unique([code, tenantId])` constraint), so concurrent boots are safe.\n */\nasync function initializeDefaults(prisma: PrismaClient): Promise<void> {\n await prisma.scope.upsert({\n where: { code_tenantId: { code: 'default', tenantId: 'default' } },\n update: {},\n create: {\n code: 'default',\n name: JSON.stringify({ fr: 'Scope par défaut', en: 'Default Scope' }),\n tenantId: 'default',\n },\n })\n}\n\nexport function createFormRouter(options: FormRouterOptions): FormRouter {\n const { prisma, auth = noAuth } = options\n\n if (!initialisedClients.has(prisma)) {\n initialisedClients.add(prisma)\n // Opportunistic: never block router construction. Errors (DB not\n // reachable yet at boot, etc.) surface in the logs but the router\n // remains fully functional for routes that don't need the default.\n initializeDefaults(prisma).catch((err) => {\n console.error('[form-server] initializeDefaults failed:', err)\n })\n }\n\n const service = new FormService(prisma)\n const scopeService = new ScopeService(prisma)\n const routes = new Map<string, RouteHandler>()\n\n async function withAuth(req: RouteRequest): Promise<IRequestContext> {\n const ctx = await auth({ headers: req.headers as any, query: req.query as any })\n if (!ctx) throw ApiError.unauthorized()\n return ctx\n }\n\n function ok(data: unknown, status = 200): RouteResponse {\n return { status, body: successResponse(data) }\n }\n\n function paginated(items: unknown[], total: number, page: number, pageSize: number): RouteResponse {\n return { status: 200, body: paginatedResponse(items, total, page, pageSize) }\n }\n\n // ─── FormType routes ────────────────────\n\n routes.set('GET /form-types', async (req) => {\n await withAuth(req)\n const types = await service.getFormTypes()\n return ok(types)\n })\n\n routes.set('GET /form-types/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getFormType(req.params['id']!))\n })\n\n routes.set('POST /form-types', async (req) => {\n await withAuth(req)\n const data = createFormTypeSchema.parse(req.body)\n return ok(await service.createFormType(data), 201)\n })\n\n routes.set('PUT /form-types/:id', async (req) => {\n await withAuth(req)\n const data = updateFormTypeSchema.parse(req.body)\n return ok(await service.updateFormType(req.params['id']!, data))\n })\n\n routes.set('DELETE /form-types/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormType(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormDefinition routes ──────────────\n\n routes.set('GET /forms', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await service.getFormDefinitions(params)\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /forms/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getFormDefinition(req.params['id']!))\n })\n\n routes.set('GET /forms/:id/resolved', async (req) => {\n await withAuth(req)\n return ok(await service.getResolvedFormDefinition(req.params['id']!))\n })\n\n routes.set('POST /forms', async (req) => {\n const ctx = await withAuth(req)\n const data = createFormDefinitionSchema.parse(req.body)\n return ok(await service.createFormDefinition(data, ctx), 201)\n })\n\n routes.set('PUT /forms/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateFormDefinitionSchema.parse(req.body)\n return ok(await service.updateFormDefinition(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /forms/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormDefinition(req.params['id']!)\n return ok(null, 204)\n })\n\n routes.set('GET /forms/:id/export', async (req) => {\n await withAuth(req)\n const json = await service.exportForm(req.params['id']!)\n return { status: 200, body: json }\n })\n\n routes.set('POST /forms/import', async (req) => {\n await withAuth(req)\n const { json, tenantId } = req.body as { json: string; tenantId?: string }\n const formId = await service.importForm(json, tenantId)\n return ok({ formId }, 201)\n })\n\n // ─── FormPage routes ────────────────────\n\n routes.set('POST /forms/:formId/pages', async (req) => {\n await withAuth(req)\n const data = createFormPageSchema.parse(req.body)\n return ok(await service.createFormPage(req.params['formId']!, data), 201)\n })\n\n routes.set('PUT /pages/:id', async (req) => {\n await withAuth(req)\n const data = updateFormPageSchema.parse(req.body)\n return ok(await service.updateFormPage(req.params['id']!, data))\n })\n\n routes.set('DELETE /pages/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormPage(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormRoster routes ──────────────────\n\n routes.set('POST /pages/:pageId/rosters', async (req) => {\n await withAuth(req)\n const data = createFormRosterSchema.parse(req.body)\n return ok(await service.createFormRoster(req.params['pageId']!, data), 201)\n })\n\n routes.set('PUT /rosters/:id', async (req) => {\n await withAuth(req)\n const data = updateFormRosterSchema.parse(req.body)\n return ok(await service.updateFormRoster(req.params['id']!, data))\n })\n\n routes.set('DELETE /rosters/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormRoster(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── FormVariable routes ────────────────\n\n routes.set('POST /pages/:pageId/variables', async (req) => {\n await withAuth(req)\n const data = createFormVariableSchema.parse(req.body)\n return ok(await service.createFormVariable({ ...data, pageId: req.params['pageId']! }), 201)\n })\n\n routes.set('POST /rosters/:rosterId/variables', async (req) => {\n await withAuth(req)\n const data = createFormVariableSchema.parse(req.body)\n return ok(await service.createFormVariable({ ...data, rosterId: req.params['rosterId']! }), 201)\n })\n\n routes.set('PUT /variables/:id', async (req) => {\n await withAuth(req)\n const data = updateFormVariableSchema.parse(req.body)\n return ok(await service.updateFormVariable(req.params['id']!, data))\n })\n\n routes.set('DELETE /variables/:id', async (req) => {\n await withAuth(req)\n await service.deleteFormVariable(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── Submission routes ──────────────────\n\n routes.set('GET /forms/:formId/submissions', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await service.getSubmissions({\n formId: req.params['formId']!,\n ...params,\n })\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /submissions/:id', async (req) => {\n await withAuth(req)\n return ok(await service.getSubmission(req.params['id']!))\n })\n\n routes.set('POST /submissions', async (req) => {\n const ctx = await withAuth(req)\n const data = createSubmissionSchema.parse(req.body)\n return ok(await service.createSubmission(data, ctx), 201)\n })\n\n routes.set('PUT /submissions/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateSubmissionSchema.parse(req.body)\n return ok(await service.updateSubmission(req.params['id']!, data, ctx))\n })\n\n // ─── Scope routes ───────────────────────\n\n routes.set('GET /scopes', async (req) => {\n const ctx = await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await scopeService.listScopes(\n { tenantId: params.tenantId, page: params.page, pageSize: params.pageSize },\n ctx,\n )\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('GET /scopes/:id', async (req) => {\n await withAuth(req)\n return ok(await scopeService.getScopeById(req.params['id']!))\n })\n\n routes.set('POST /scopes', async (req) => {\n const ctx = await withAuth(req)\n const data = createScopeSchema.parse(req.body)\n return ok(await scopeService.createScope(data, ctx), 201)\n })\n\n routes.set('PUT /scopes/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateScopeSchema.parse(req.body)\n return ok(await scopeService.updateScope(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /scopes/:id', async (req) => {\n await withAuth(req)\n await scopeService.deleteScope(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── VariableTemplate routes ────────────\n\n routes.set('GET /scopes/:scopeId/templates', async (req) => {\n await withAuth(req)\n const params = paginationSchema.parse(req.query)\n const { items, total } = await scopeService.listTemplates(req.params['scopeId']!, {\n page: params.page,\n pageSize: params.pageSize,\n })\n return paginated(items, total, params.page, params.pageSize)\n })\n\n routes.set('POST /scopes/:scopeId/templates', async (req) => {\n const ctx = await withAuth(req)\n const data = createVariableTemplateSchema.parse(req.body)\n return ok(await scopeService.createTemplate(req.params['scopeId']!, data, ctx), 201)\n })\n\n routes.set('GET /templates/:id', async (req) => {\n await withAuth(req)\n return ok(await scopeService.getTemplateById(req.params['id']!))\n })\n\n routes.set('PUT /templates/:id', async (req) => {\n const ctx = await withAuth(req)\n const data = updateVariableTemplateSchema.parse(req.body)\n return ok(await scopeService.updateTemplate(req.params['id']!, data, ctx))\n })\n\n routes.set('DELETE /templates/:id', async (req) => {\n await withAuth(req)\n await scopeService.deleteTemplate(req.params['id']!)\n return ok(null, 204)\n })\n\n // ─── Router handler ─────────────────────\n\n function matchRoute(method: string, path: string): { handler: RouteHandler; params: Record<string, string> } | null {\n for (const [pattern, handler] of routes) {\n const [routeMethod, routePath] = pattern.split(' ')\n if (routeMethod !== method) continue\n\n const params = matchPath(routePath!, path)\n if (params) return { handler, params }\n }\n return null\n }\n\n return {\n routes,\n handle: async (req: RouteRequest): Promise<RouteResponse> => {\n try {\n const matched = matchRoute(req.method, req.path)\n if (!matched) return { status: 404, body: { status: 404, message: 'Route not found', data: null } }\n\n req.params = matched.params\n return await matched.handler(req)\n } catch (error) {\n if (error instanceof ApiError) {\n return { status: error.statusCode, body: { status: error.statusCode, message: error.message, data: null, errors: error.errors } }\n }\n if (error instanceof Error && error.name === 'ZodError') {\n const zodError = error as any\n return { status: 400, body: { status: 400, message: 'Validation error', data: null, errors: zodError.issues?.map((i: any) => i.message) } }\n }\n return { status: 500, body: { status: 500, message: 'Internal server error', data: null } }\n }\n },\n }\n}\n\n/** Simple path matcher: /forms/:id matches /forms/abc123 */\nfunction matchPath(pattern: string, actual: string): Record<string, string> | null {\n const patternParts = pattern.split('/').filter(Boolean)\n const actualParts = actual.split('/').filter(Boolean)\n\n if (patternParts.length !== actualParts.length) return null\n\n const params: Record<string, string> = {}\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i]!\n const ap = actualParts[i]!\n if (pp.startsWith(':')) {\n params[pp.slice(1)] = ap\n } else if (pp !== ap) {\n return null\n }\n }\n\n return params\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@msbci/form-server",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Form server — REST API with Prisma, multi-tenant, multi-database",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -21,20 +21,6 @@
21
21
  "publishConfig": {
22
22
  "access": "public"
23
23
  },
24
- "dependencies": {
25
- "@prisma/client": "^6.2.0",
26
- "zod": "^3.24.0",
27
- "@msbci/form-core": "1.3.0"
28
- },
29
- "devDependencies": {
30
- "prisma": "^6.2.0",
31
- "tsup": "^8.3.0",
32
- "vitest": "^2.1.0",
33
- "@vitest/coverage-v8": "^2.1.0",
34
- "typescript": "^5.7.0"
35
- },
36
- "sideEffects": false,
37
- "license": "SEE LICENSE IN LICENSE.md",
38
24
  "scripts": {
39
25
  "prisma:generate": "prisma generate --schema=src/prisma/schema.prisma",
40
26
  "prisma:sync": "prisma db push --schema=src/prisma/schema.prisma --skip-generate --accept-data-loss",
@@ -52,5 +38,19 @@
52
38
  "db:generate": "prisma generate --schema=src/prisma/schema.prisma",
53
39
  "db:migrate": "prisma migrate dev --schema=src/prisma/schema.prisma",
54
40
  "db:push": "prisma db push --schema=src/prisma/schema.prisma"
55
- }
56
- }
41
+ },
42
+ "dependencies": {
43
+ "@msbci/form-core": "workspace:*",
44
+ "@prisma/client": "^6.2.0",
45
+ "zod": "^3.24.0"
46
+ },
47
+ "devDependencies": {
48
+ "prisma": "^6.2.0",
49
+ "tsup": "^8.3.0",
50
+ "vitest": "^2.1.0",
51
+ "@vitest/coverage-v8": "^2.1.0",
52
+ "typescript": "^5.7.0"
53
+ },
54
+ "sideEffects": false,
55
+ "license": "SEE LICENSE IN LICENSE.md"
56
+ }