UNPKG

@flatfile/plugin-constraints

Version:

A plugin for extending blueprint with external constraints

1 lines 8.06 kB
{"version":3,"sources":["../src/get.constraints.ts","../src/external.constraint.ts","../src/external.sheet.constraint.ts"],"names":["getConstraints","schema","validator","acc","f","c","getSheetConstraints","api","FlatfileClient","externalConstraint","cb","listener","bulkRecordHook","records","event","constraints","property","constraint","record","e","externalSheetConstraint","fields","partialObject","partialProperties","key","keys"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Flatfile } from '@flatfile/api'\n\nexport function getConstraints(\n schema: Flatfile.SheetConfig,\n validator: string\n) {\n return schema.fields.reduce(\n (acc, f) => {\n f.constraints?.forEach((c) => {\n if (c.type === 'external' && c.validator === validator) {\n acc.push([f, c])\n }\n })\n return acc\n },\n [] as Array<[Flatfile.Property, Flatfile.Constraint.External]>\n )\n}\n\nexport function getSheetConstraints(\n schema: Flatfile.SheetConfig,\n validator: string\n) {\n return (schema.constraints?.filter(\n (c) => c.type === 'external' && c.validator === validator\n ) || []) as Array<Flatfile.SheetConstraint.External>\n}\n","import type { Flatfile } from '@flatfile/api'\nimport { FlatfileClient } from '@flatfile/api'\nimport type { FlatfileEvent, FlatfileListener } from '@flatfile/listener'\nimport { FlatfileRecord, bulkRecordHook } from '@flatfile/plugin-record-hook'\nimport { getConstraints } from './get.constraints'\n\nconst api = new FlatfileClient()\n\nexport const externalConstraint = (\n validator: string,\n cb: (\n value: any,\n key: string,\n support: {\n config: any\n record: FlatfileRecord\n property: Flatfile.Property\n event: FlatfileEvent\n }\n ) => any | Promise<any>\n) => {\n return (listener: FlatfileListener) => {\n // setup the cache\n // todo: cache this schema longer than one event\n listener.on('commit:created', async (e) => {\n await e.cache.init('sheet-schema', async () => {\n const res = await api.sheets.get(e.context.sheetId)\n return res.data.config\n })\n })\n\n listener.use(\n bulkRecordHook('**', async (records, event) => {\n const schema: Flatfile.SheetConfig = event.cache.get('sheet-schema')\n\n const constraints = getConstraints(schema, validator)\n\n for (const [property, constraint] of constraints) {\n for (const record of records) {\n try {\n await cb(record.get(property.key), property.key, {\n config: constraint.config,\n record,\n property,\n event,\n })\n } catch (e) {\n record.addError(property.key, String(e))\n }\n }\n }\n })\n )\n }\n}\n","import type { Flatfile } from '@flatfile/api'\nimport { FlatfileClient } from '@flatfile/api'\nimport type { TRecordValue } from '@flatfile/hooks'\nimport type { FlatfileEvent, FlatfileListener } from '@flatfile/listener'\nimport { FlatfileRecord, bulkRecordHook } from '@flatfile/plugin-record-hook'\nimport { getSheetConstraints } from './get.constraints'\n\nconst api = new FlatfileClient()\n\n/**\n * External sheet constraints can be registered on a combination of fields. Unlike the single\n * field validator, the sheet constraint will return a partial object containing the fields\n * references in the sheet constraint along with the configuration of the constraint.\n *\n * @param validator\n * @param cb\n */\nexport const externalSheetConstraint = (\n validator: string,\n cb: (\n values: Record<string, TRecordValue>,\n keys: string[],\n support: {\n config: any\n record: FlatfileRecord\n properties: Flatfile.Property[]\n event: FlatfileEvent\n }\n ) => any | Promise<any>\n) => {\n return (listener: FlatfileListener) => {\n // setup the cache\n // todo: cache this schema longer than one event\n listener.on('commit:created', async (e) => {\n await e.cache.init('sheet-schema', async () => {\n const res = await api.sheets.get(e.context.sheetId)\n return res.data.config\n })\n })\n\n listener.use(\n bulkRecordHook('**', async (records, event) => {\n const schema: Flatfile.SheetConfig = event.cache.get('sheet-schema')\n\n const constraints = getSheetConstraints(schema, validator)\n\n for (const constraint of constraints) {\n const fields = constraint.fields || []\n for (const record of records) {\n try {\n await cb(partialObject(record, fields), constraint.fields, {\n config: constraint.config,\n record,\n properties: partialProperties(schema, fields),\n event,\n })\n } catch (e) {\n fields.forEach((key) => {\n record.addError(key, String(e))\n })\n }\n }\n }\n })\n )\n }\n}\n\nfunction partialProperties(\n schema: Flatfile.SheetConfig,\n keys: string[] = []\n): Flatfile.Property[] {\n return schema.fields.filter((f) => keys.includes(f.key))\n}\n\nfunction partialObject(record: FlatfileRecord, keys: string[]) {\n return keys.reduce(\n (acc, key) => {\n acc[key] = record.get(key)\n return acc\n },\n {} as Record<string, TRecordValue>\n )\n}\n"]}