@streamline-pulse/formkrafter-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +116 -0
- package/dist/brick/brick.d.ts +63 -0
- package/dist/brick/types.d.ts +25 -0
- package/dist/brick/utils.d.ts +20 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +1006 -0
- package/dist/index.js.map +25 -0
- package/dist/ops/history.d.ts +12 -0
- package/dist/ops/ops.d.ts +19 -0
- package/dist/ops/pointer.d.ts +4 -0
- package/dist/rules/effect.d.ts +12 -0
- package/dist/rules/rule.d.ts +9 -0
- package/dist/services/data_source_service.d.ts +16 -0
- package/dist/services/file_upload_service.d.ts +18 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/js_runner_service.d.ts +16 -0
- package/dist/services/sandbox_interpreter.d.ts +1 -0
- package/dist/services/unsafe_js_runner_service.d.ts +9 -0
- package/dist/utils/brick-mold.d.ts +10 -0
- package/dist/utils/brick-spec.d.ts +38 -0
- package/dist/utils/brick-styles.d.ts +1 -0
- package/dist/utils/brick-type.d.ts +1 -0
- package/dist/utils/common-brick-props.d.ts +14 -0
- package/dist/utils/drop-type.d.ts +10 -0
- package/dist/utils/fast-json-patch.d.ts +3 -0
- package/dist/utils/localized-text.d.ts +4 -0
- package/dist/validators/default-messages.d.ts +2 -0
- package/dist/validators/json-schema-type.d.ts +3 -0
- package/dist/validators/validation.d.ts +8 -0
- package/dist/validators/validator.d.ts +9 -0
- package/package.json +48 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../lib/utils/localized-text.ts", "../lib/validators/default-messages.ts", "../lib/utils/brick-spec.ts", "../lib/brick/brick.ts", "../lib/brick/utils.ts", "../lib/services/js_runner_service.ts", "../lib/services/sandbox_interpreter.ts", "../lib/services/data_source_service.ts", "../lib/services/file_upload_service.ts", "../lib/services/index.ts", "../lib/validators/validator.ts", "../lib/services/unsafe_js_runner_service.ts", "../lib/ops/pointer.ts", "../lib/utils/fast-json-patch.ts", "../lib/ops/ops.ts", "../lib/ops/history.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export type LocalizedText = string | Record<string, string>;\n\nexport function isLocalizedObject(\n value: unknown\n): value is Record<string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every((entry) => typeof entry === \"string\")\n );\n}\n\nexport function resolveLocalizedText(value: unknown, locale?: string): unknown {\n if (!isLocalizedObject(value)) return value;\n\n if (locale && value[locale] !== undefined) return value[locale];\n\n return Object.values(value)[0];\n}\n\nexport function resolveLocalizedRecord<T extends Record<string, unknown>>(\n record: T | undefined,\n locale?: string\n): T | undefined {\n if (!record) return record;\n\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n resolved[key] = resolveLocalizedText(value, locale);\n }\n\n return resolved as T;\n}\n",
|
|
6
|
+
"const DEFAULT_MESSAGES: Record<string, Record<string, string>> = {\n en: {\n required: \"This field is required\",\n minLength: \"Must be at least {value} characters\",\n maxLength: \"Must be at most {value} characters\",\n min: \"Must be at least {value}\",\n max: \"Must be at most {value}\",\n pattern: \"Invalid format\",\n minItems: \"Select at least {value} item(s)\",\n maxItems: \"Select at most {value} item(s)\",\n email: \"Invalid email address\",\n url: \"Invalid URL\",\n type: \"Invalid value\",\n custom: \"Invalid value\",\n },\n fr: {\n required: \"Ce champ est obligatoire\",\n minLength: \"Minimum {value} caractères\",\n maxLength: \"Maximum {value} caractères\",\n min: \"Minimum {value}\",\n max: \"Maximum {value}\",\n pattern: \"Format invalide\",\n minItems: \"Sélectionnez au moins {value} élément(s)\",\n maxItems: \"Sélectionnez au plus {value} élément(s)\",\n email: \"Adresse email invalide\",\n url: \"URL invalide\",\n type: \"Valeur invalide\",\n custom: \"Valeur invalide\",\n },\n};\n\nexport function registerValidationMessages(\n locale: string,\n messages: Record<string, string>\n): void {\n DEFAULT_MESSAGES[locale] = { ...DEFAULT_MESSAGES[locale], ...messages };\n}\n\nexport function defaultValidationMessage(\n validator: string,\n locale?: string,\n value?: unknown\n): string {\n const pack = DEFAULT_MESSAGES[locale ?? \"en\"] ?? DEFAULT_MESSAGES.en;\n const template =\n pack[validator] ?? DEFAULT_MESSAGES.en[validator] ?? \"Invalid value\";\n\n return template.replace(\"{value}\", String(value ?? \"\"));\n}\n",
|
|
7
|
+
"import type { JSONSchemaType } from \"../validators/json-schema-type\";\nimport { resolveLocalizedText } from \"./localized-text\";\nimport { defaultValidationMessage } from \"../validators/default-messages\";\nimport type { Validator } from \"../validators/validator\";\nimport type { Validation } from \"../validators/validation\";\nimport type { Rule } from \"../rules/rule\";\nimport type { BrickType } from \"./brick-type\";\nimport type { BrickBaseConfigs } from \"./common-brick-props\";\nimport type { BrickStyles } from \"../utils/brick-styles\";\n\nexport interface BrickSpec {\n type: BrickType;\n dataType?: JSONSchemaType;\n id: string;\n name: string;\n category?: string;\n editable?: boolean;\n unWrapData?: boolean;\n isPrivate?: boolean;\n\n validators?: Validator[];\n validations?: Validation[];\n\n rules?: Rule[];\n\n configsForm?: BrickSpec;\n\n configs?: BrickBaseConfigs & Record<string, unknown>;\n styles?: BrickStyles<string>;\n\n children?: BrickSpec[];\n}\n\nexport function* iterateBricks(\n spec?: BrickSpec,\n path = \"0\"\n): Generator<{ brick: BrickSpec; path: string }> {\n if (!spec) return;\n\n yield { brick: spec, path };\n\n for (const [index, child] of (spec.children ?? []).entries()) {\n yield* iterateBricks(child, `${path}.${index}`);\n }\n}\n\nexport function* iterateSchemaBricks(spec?: BrickSpec): Generator<BrickSpec> {\n if (!spec) return;\n\n yield spec;\n\n if (spec.type === \"collection\") return;\n\n for (const child of spec.children ?? []) {\n yield* iterateSchemaBricks(child);\n }\n}\n\nexport function buildValidationSchema(brickSpecs?: BrickSpec, locale?: string) {\n if (!brickSpecs) return;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n const requiredErrorMessage: Record<string, string | undefined> = {};\n const messageOf = (raw: unknown): string | undefined => {\n const resolved = resolveLocalizedText(raw, locale);\n return typeof resolved === \"string\" ? resolved : undefined;\n };\n\n for (const brick of iterateSchemaBricks(brickSpecs)) {\n const key = brick.configs?.key;\n const dataType = brick.dataType;\n\n if (!key || !dataType || dataType === \"void\") continue;\n\n const isRequired = brick.validations?.find(\n (validation) => validation.validator === \"required\"\n );\n\n const property: Record<string, unknown> = {\n type: dataType,\n nullable: !isRequired,\n };\n const messages: Record<string, string> = {\n type: defaultValidationMessage(\"type\", locale),\n };\n\n for (const validation of brick.validations ?? []) {\n const { validator, value } = validation;\n const message =\n messageOf(validation.message) ??\n defaultValidationMessage(validator, locale, value);\n\n if (validator === \"minLength\" && value != null) {\n property.minLength = Number(value);\n messages.minLength = message;\n } else if (validator === \"maxLength\" && value != null) {\n property.maxLength = Number(value);\n messages.maxLength = message;\n } else if (validator === \"min\" && value != null) {\n property.minimum = Number(value);\n messages.minimum = message;\n } else if (validator === \"max\" && value != null) {\n property.maximum = Number(value);\n messages.maximum = message;\n } else if (validator === \"pattern\" && typeof value === \"string\" && value) {\n property.pattern = value;\n messages.pattern = message;\n } else if (validator === \"minItems\" && value != null) {\n property.minItems = Number(value);\n messages.minItems = message;\n } else if (validator === \"maxItems\" && value != null) {\n property.maxItems = Number(value);\n messages.maxItems = message;\n } else if (validator === \"email\") {\n property.format = \"email\";\n messages.format = message;\n } else if (validator === \"url\") {\n property.format = \"uri\";\n messages.format = message;\n }\n }\n\n property.errorMessage = messages;\n\n properties[key] = property;\n\n if (isRequired) {\n required.push(key);\n requiredErrorMessage[key] =\n messageOf(isRequired.message) ??\n defaultValidationMessage(\"required\", locale);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n ...(Object.keys(requiredErrorMessage).length\n ? {\n errorMessage: {\n required: requiredErrorMessage,\n },\n }\n : {}),\n additionalProperties: false,\n };\n}\n",
|
|
8
|
+
"import type { Validator } from \"../validators/validator\";\nimport type { Validation } from \"../validators/validation\";\nimport type { JSONSchemaType } from \"../validators/json-schema-type\";\nimport { type Utils } from \"./utils\";\nimport type { Rule } from \"../rules/rule\";\nimport type { BrickSpec } from \"../utils/brick-spec\";\nimport type { BrickType } from \"../utils/brick-type\";\nimport type { BrickBaseConfigs, CommonBrickProps } from \"../utils/common-brick-props\";\nimport type { BrickMoldDropType } from \"../utils/drop-type\";\n\nexport interface BrickProps<DataType, Configs extends BrickBaseConfigs, Styles>\n extends CommonBrickProps<Configs, Styles> {\n onConfigsChange?: (\n configs: BrickBaseConfigs & Record<string, unknown>,\n uid?: string\n ) => void;\n onStylesChange?: (\n styles: Record<string, unknown>,\n uid?: string\n ) => void;\n data?: DataType;\n dataMap?: Record<string, unknown>;\n onDataChange?: (value?: DataType) => void;\n onMove?: (from: string, to: string) => void;\n onDuplicate?: (path: string) => void;\n onDelete?: (path: string) => void;\n onAddBrick?: (brickMold: BrickMoldDropType, path: string) => void;\n path: string;\n error?: string;\n disabled?: boolean;\n locale?: string;\n children?: unknown;\n brickSpec?: BrickSpec;\n editable?: boolean;\n validations?: Validation[];\n onValidationsChange?: (validations: Validation[], uid?: string) => void;\n rules?: Rule[];\n onRulesChange?: (rules: Rule[], uid?: string) => void;\n utils: Utils;\n}\n\nexport abstract class Brick<\n DataType,\n Configs extends BrickBaseConfigs,\n Styles extends Record<string, unknown>> {\n readonly type: BrickType;\n readonly dataType: JSONSchemaType;\n readonly id: string;\n readonly name: string;\n readonly configsForm?: BrickSpec;\n readonly category?: string;\n readonly styles?: Styles;\n\n readonly unWrapData: boolean;\n readonly isPrivate: boolean;\n\n readonly validators: Validator[];\n readonly defaultConfigs?: Record<string, unknown>;\n\n constructor(params: {\n type: BrickType;\n dataType: JSONSchemaType;\n id: string;\n name: string;\n configsForm?: BrickSpec;\n category?: string;\n styles?: Styles;\n unWrapData?: boolean;\n isPrivate?: boolean;\n validators?: Validator[];\n defaultConfigs?: Record<string, unknown>;\n }) {\n this.type = params.type;\n this.dataType = params.dataType;\n this.id = params.id;\n this.name = params.name;\n this.configsForm = params.configsForm;\n this.category = params.category;\n this.styles = params.styles;\n this.unWrapData = params.unWrapData ?? false;\n this.isPrivate = params.isPrivate ?? false;\n this.validators = params.validators ?? [];\n this.defaultConfigs = params.defaultConfigs;\n }\n\n abstract render(props: BrickProps<DataType, Configs, Styles>): unknown;\n\n\n abstract renderBuilder(props: BrickProps<DataType, Configs, Styles>): unknown;\n\n abstract getComponent(props: BrickProps<DataType, Configs, Styles>): unknown;\n abstract getComponentWithActions(props: BrickProps<DataType, Configs, Styles>): unknown;\n\n getBrickEmptySpec(): BrickSpec {\n return {\n type: this.type,\n dataType: this.dataType,\n id: this.id,\n name: this.name,\n ...(this.category !== undefined ? { category: this.category } : {}),\n ...(this.configsForm !== undefined ? { configsForm: this.configsForm } : {}),\n ...(this.styles !== undefined ? { styles: this.styles } : {}),\n ...(this.defaultConfigs !== undefined\n ? { configs: { ...this.defaultConfigs } }\n : {}),\n validators: this.validators,\n };\n }\n}",
|
|
9
|
+
"import jsonLogic from \"json-logic-js\";\nimport { services } from \"../services\";\nimport type { Rule } from \"../rules/rule\";\n\nexport type CommonUtils = object;\n\nexport type InputUtils = CommonUtils;\n\nexport type PanelUtils = CommonUtils;\n\nexport type CollectionUtils = CommonUtils;\n\nexport type ActionUtils = {\n validateForm: () => {\n isValid: boolean;\n };\n} & CommonUtils;\n\nexport type Utils = InputUtils & PanelUtils & CollectionUtils & ActionUtils;\n\nexport const evalBrickCode = (code: string, data?: Record<string, unknown>) => {\n try {\n return services.jsRunnerService.eval(code, { dataMap: data ?? {} });\n } catch (error) {\n return error instanceof Error ? error : new Error(String(error));\n }\n};\n\nconst evalRule = (rule: Rule, dataMap?: Record<string, unknown>): boolean => {\n if (rule.type === \"jsonLogic\") {\n if (rule.logic == null) return false;\n\n return jsonLogic.apply(rule.logic, dataMap) === true;\n }\n\n if (rule.type === \"javaScript\") {\n if (!rule.code) return false;\n\n return evalBrickCode(rule.code, dataMap) === true;\n }\n\n return false;\n};\n\ntype Properties = {\n value?: string;\n required?: boolean;\n hidden?: boolean;\n disabled?: boolean;\n};\n\nconst getActiveRules = (rules?: Rule[], dataMap?: Record<string, unknown>) =>\n rules?.filter((rule) => evalRule(rule, dataMap));\n\nconst getActiveEffect = (rules?: Rule[], dataMap?: Record<string, unknown>) =>\n getActiveRules(rules, dataMap)\n ?.map((rule) => rule.effects)\n .flat()\n .filter((effect) => effect != undefined);\n\nexport const getAffectedProperties = (\n rules?: Rule[],\n dataMap?: Record<string, unknown>\n): Properties => {\n return getActiveEffect(rules, dataMap)\n ?.map((effect) => {\n let value;\n if (effect.property) {\n if (effect.property.type === \"boolean\") value = effect.boolean;\n else if (effect.property.type === \"logic\" && effect.logic != null)\n value = jsonLogic.apply(effect.logic, dataMap);\n else if (effect.property.type === \"code\" && effect.code)\n value = evalBrickCode(effect.code, dataMap);\n else if (effect.property.type === \"string\") value = effect.string;\n\n return {\n [effect.property.target]: value,\n };\n }\n return {};\n })\n .flat()\n .reduce((acc, item) => ({ ...acc, ...item }), {}) ?? { hidden: false };\n};\n",
|
|
10
|
+
"import { type Options, parse } from \"acorn\";\nimport { runSandboxed } from \"./sandbox_interpreter\";\n\nexport interface JsRunnerService {\n eval(js: string, scope?: Record<string, unknown>): unknown;\n validateJs(js: string, options?: Options): { valide: boolean; error?: Error };\n}\n\nexport class SandboxJsRunnerService implements JsRunnerService {\n validateJs(\n js: string,\n options: Options = { ecmaVersion: \"latest\", allowReturnOutsideFunction: true }\n ): { valide: boolean; error?: Error } {\n try {\n parse(js, options);\n return { valide: true };\n } catch (error) {\n return {\n valide: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n eval(js: string, scope: Record<string, unknown> = {}): unknown {\n return runSandboxed(js, scope);\n }\n}\n\nexport const JsRunnerServiceImplementation = SandboxJsRunnerService;\n",
|
|
11
|
+
"import { parse } from \"acorn\";\n\ninterface AstNode {\n type: string;\n [key: string]: unknown;\n}\n\nconst FORBIDDEN_PROPS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nconst MAX_STEPS = 100_000;\n\nclass ReturnSignal {\n constructor(readonly value: unknown) {}\n}\n\ntype Scope = Map<string, unknown>;\n\ninterface Ctx {\n steps: number;\n scopes: Scope[];\n}\n\nconst lookup = (ctx: Ctx, name: string): unknown => {\n for (let i = ctx.scopes.length - 1; i >= 0; i--) {\n if (ctx.scopes[i].has(name)) return ctx.scopes[i].get(name);\n }\n\n throw new Error(`Unknown identifier \"${name}\"`);\n};\n\nconst declareVar = (ctx: Ctx, name: string, value: unknown): void => {\n ctx.scopes[ctx.scopes.length - 1].set(name, value);\n};\n\nconst assign = (ctx: Ctx, name: string, value: unknown): void => {\n for (let i = ctx.scopes.length - 1; i >= 0; i--) {\n if (ctx.scopes[i].has(name)) {\n ctx.scopes[i].set(name, value);\n return;\n }\n }\n\n throw new Error(`Cannot assign to unknown identifier \"${name}\"`);\n};\n\nconst guardProp = (prop: unknown): string | number => {\n if (typeof prop === \"number\") return prop;\n\n const name = String(prop);\n if (FORBIDDEN_PROPS.has(name)) {\n throw new Error(`Access to \"${name}\" is not allowed`);\n }\n\n return name;\n};\n\nconst memberTarget = (\n ctx: Ctx,\n node: AstNode\n): { object: unknown; prop: string | number; optional: boolean } => {\n const object = evalNode(ctx, node.object as AstNode);\n const prop = node.computed\n ? guardProp(evalNode(ctx, node.property as AstNode))\n : guardProp((node.property as AstNode).name);\n\n return { object, prop, optional: node.optional === true };\n};\n\nconst readMember = (ctx: Ctx, node: AstNode): unknown => {\n const { object, prop, optional } = memberTarget(ctx, node);\n\n if (object === null || object === undefined) {\n if (optional) return undefined;\n throw new Error(`Cannot read \"${String(prop)}\" of ${String(object)}`);\n }\n\n return (object as Record<string | number, unknown>)[prop];\n};\n\nconst evalNode = (ctx: Ctx, node: AstNode): unknown => {\n if (++ctx.steps > MAX_STEPS) {\n throw new Error(\"Sandbox execution budget exceeded\");\n }\n\n switch (node.type) {\n case \"Program\":\n case \"BlockStatement\": {\n for (const statement of node.body as AstNode[]) {\n const result = evalNode(ctx, statement);\n if (result instanceof ReturnSignal) return result;\n }\n return undefined;\n }\n case \"ReturnStatement\":\n return new ReturnSignal(\n node.argument ? evalNode(ctx, node.argument as AstNode) : undefined\n );\n case \"IfStatement\": {\n if (evalNode(ctx, node.test as AstNode)) {\n return evalNode(ctx, node.consequent as AstNode);\n }\n if (node.alternate) return evalNode(ctx, node.alternate as AstNode);\n return undefined;\n }\n case \"VariableDeclaration\": {\n for (const declaration of node.declarations as AstNode[]) {\n const id = declaration.id as AstNode;\n if (id.type !== \"Identifier\") {\n throw new Error(\"Only simple variable names are supported\");\n }\n declareVar(\n ctx,\n id.name as string,\n declaration.init ? evalNode(ctx, declaration.init as AstNode) : undefined\n );\n }\n return undefined;\n }\n case \"ExpressionStatement\":\n evalNode(ctx, node.expression as AstNode);\n return undefined;\n case \"Literal\":\n return node.value;\n case \"TemplateLiteral\": {\n const quasis = node.quasis as AstNode[];\n const expressions = node.expressions as AstNode[];\n let text = \"\";\n quasis.forEach((quasi, index) => {\n text += (quasi.value as { cooked?: string }).cooked ?? \"\";\n if (index < expressions.length) {\n text += String(evalNode(ctx, expressions[index]));\n }\n });\n return text;\n }\n case \"Identifier\":\n return lookup(ctx, node.name as string);\n case \"ThisExpression\":\n return undefined;\n case \"ChainExpression\":\n return evalNode(ctx, node.expression as AstNode);\n case \"MemberExpression\":\n return readMember(ctx, node);\n case \"CallExpression\": {\n const callee = node.callee as AstNode;\n const args: unknown[] = [];\n for (const argument of node.arguments as AstNode[]) {\n if (argument.type === \"SpreadElement\") {\n const spread = evalNode(ctx, argument.argument as AstNode);\n if (Array.isArray(spread)) args.push(...spread);\n } else {\n args.push(evalNode(ctx, argument));\n }\n }\n\n if (callee.type === \"MemberExpression\") {\n const { object, prop, optional } = memberTarget(ctx, callee);\n if (object === null || object === undefined) {\n if (optional || node.optional === true) return undefined;\n throw new Error(`Cannot call \"${String(prop)}\" of ${String(object)}`);\n }\n\n const fn = (object as Record<string | number, unknown>)[prop];\n if (typeof fn !== \"function\") {\n if (node.optional === true && fn == null) return undefined;\n throw new Error(`\"${String(prop)}\" is not a function`);\n }\n if (fn === Function || fn === eval) {\n throw new Error(\"This function is not allowed\");\n }\n\n return (fn as (...values: unknown[]) => unknown).apply(object, args);\n }\n\n const fn = evalNode(ctx, callee);\n if (typeof fn !== \"function\") {\n if (node.optional === true && fn == null) return undefined;\n throw new Error(\"Value is not a function\");\n }\n if (fn === Function || fn === eval) {\n throw new Error(\"This function is not allowed\");\n }\n\n return (fn as (...values: unknown[]) => unknown)(...args);\n }\n case \"ArrowFunctionExpression\": {\n const params = node.params as AstNode[];\n const body = node.body as AstNode;\n const capturedScopes = [...ctx.scopes];\n\n return (...args: unknown[]): unknown => {\n const callScope: Scope = new Map();\n params.forEach((param, index) => {\n if (param.type !== \"Identifier\") {\n throw new Error(\"Only simple parameters are supported\");\n }\n callScope.set(param.name as string, args[index]);\n });\n\n const callCtx: Ctx = {\n steps: ctx.steps,\n scopes: [...capturedScopes, callScope],\n };\n const result = evalNode(callCtx, body);\n ctx.steps = callCtx.steps;\n\n if (result instanceof ReturnSignal) return result.value;\n return node.expression === true ? result : undefined;\n };\n }\n case \"BinaryExpression\": {\n const left = evalNode(ctx, node.left as AstNode) as never;\n const right = evalNode(ctx, node.right as AstNode) as never;\n switch (node.operator) {\n case \"===\": return left === right;\n case \"!==\": return left !== right;\n case \"==\": return left == right;\n case \"!=\": return left != right;\n case \"<\": return left < right;\n case \"<=\": return left <= right;\n case \">\": return left > right;\n case \">=\": return left >= right;\n case \"+\": return (left as number) + (right as number);\n case \"-\": return (left as number) - (right as number);\n case \"*\": return (left as number) * (right as number);\n case \"/\": return (left as number) / (right as number);\n case \"%\": return (left as number) % (right as number);\n case \"**\": return (left as number) ** (right as number);\n default:\n throw new Error(`Unsupported operator \"${String(node.operator)}\"`);\n }\n }\n case \"LogicalExpression\": {\n const left = evalNode(ctx, node.left as AstNode);\n switch (node.operator) {\n case \"&&\": return left && evalNode(ctx, node.right as AstNode);\n case \"||\": return left || evalNode(ctx, node.right as AstNode);\n case \"??\": return left ?? evalNode(ctx, node.right as AstNode);\n default:\n throw new Error(`Unsupported operator \"${String(node.operator)}\"`);\n }\n }\n case \"UnaryExpression\": {\n const argument = evalNode(ctx, node.argument as AstNode);\n switch (node.operator) {\n case \"!\": return !argument;\n case \"-\": return -(argument as number);\n case \"+\": return +(argument as number);\n case \"typeof\": return typeof argument;\n default:\n throw new Error(`Unsupported operator \"${String(node.operator)}\"`);\n }\n }\n case \"ConditionalExpression\":\n return evalNode(ctx, node.test as AstNode)\n ? evalNode(ctx, node.consequent as AstNode)\n : evalNode(ctx, node.alternate as AstNode);\n case \"AssignmentExpression\": {\n const target = node.left as AstNode;\n if (target.type !== \"Identifier\" || node.operator !== \"=\") {\n throw new Error(\"Only simple assignments are supported\");\n }\n const value = evalNode(ctx, node.right as AstNode);\n assign(ctx, target.name as string, value);\n return value;\n }\n case \"ArrayExpression\": {\n const values: unknown[] = [];\n for (const element of node.elements as Array<AstNode | null>) {\n if (!element) continue;\n if (element.type === \"SpreadElement\") {\n const spread = evalNode(ctx, element.argument as AstNode);\n if (Array.isArray(spread)) values.push(...spread);\n } else {\n values.push(evalNode(ctx, element));\n }\n }\n return values;\n }\n case \"ObjectExpression\": {\n const result: Record<string, unknown> = {};\n for (const property of node.properties as AstNode[]) {\n if (property.type === \"SpreadElement\") {\n const spread = evalNode(ctx, property.argument as AstNode);\n if (spread && typeof spread === \"object\") {\n for (const [key, value] of Object.entries(spread)) {\n result[String(guardProp(key))] = value;\n }\n }\n continue;\n }\n\n const keyNode = property.key as AstNode;\n const key = property.computed\n ? guardProp(evalNode(ctx, keyNode))\n : guardProp(\n keyNode.type === \"Identifier\" ? keyNode.name : keyNode.value\n );\n result[String(key)] = evalNode(ctx, property.value as AstNode);\n }\n return result;\n }\n default:\n throw new Error(`Unsupported syntax: ${node.type}`);\n }\n};\n\nconst SAFE_BUILTINS: Record<string, unknown> = {\n undefined,\n NaN,\n Infinity,\n Math,\n JSON,\n Number,\n String,\n Boolean,\n Array,\n Object,\n Date,\n parseInt,\n parseFloat,\n isNaN,\n isFinite,\n};\n\nexport function runSandboxed(\n code: string,\n globals: Record<string, unknown> = {}\n): unknown {\n const ast = parse(code, {\n ecmaVersion: \"latest\",\n allowReturnOutsideFunction: true,\n }) as unknown as AstNode;\n\n const ctx: Ctx = {\n steps: 0,\n scopes: [\n new Map(Object.entries({ ...SAFE_BUILTINS, ...globals })),\n new Map(),\n ],\n };\n\n const result = evalNode(ctx, ast);\n return result instanceof ReturnSignal ? result.value : undefined;\n}\n",
|
|
12
|
+
"export interface DataSourceRequestOptions {\n headers?: Record<string, string>;\n}\n\nexport interface DataSourceServiceDefaults {\n credentials?: \"omit\" | \"same-origin\" | \"include\";\n headers?: Record<string, string>;\n}\n\nexport interface DataSourceService {\n fetchOptions(\n url: string,\n options?: DataSourceRequestOptions\n ): Promise<unknown[]>;\n}\n\nexport class FetchDataSourceService implements DataSourceService {\n private cache = new Map<string, Promise<unknown[]>>();\n\n constructor(private readonly defaults: DataSourceServiceDefaults = {}) {}\n\n fetchOptions(\n url: string,\n options?: DataSourceRequestOptions\n ): Promise<unknown[]> {\n const headers = { ...this.defaults.headers, ...options?.headers };\n const init: Record<string, unknown> = {};\n if (Object.keys(headers).length) init.headers = headers;\n if (this.defaults.credentials) init.credentials = this.defaults.credentials;\n\n const key = `${url}|${JSON.stringify(init)}`;\n let pending = this.cache.get(key);\n\n if (!pending) {\n pending = fetch(url, Object.keys(init).length ? (init as never) : undefined)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`Data source request failed (${response.status}): ${url}`);\n }\n return response.json();\n })\n .then((json: unknown) => (Array.isArray(json) ? json : []))\n .catch((error: unknown) => {\n this.cache.delete(key);\n throw error;\n });\n\n this.cache.set(key, pending);\n }\n\n return pending;\n }\n}\n",
|
|
13
|
+
"export interface FileLike {\n name: string;\n type: string;\n size: number;\n arrayBuffer(): Promise<ArrayBuffer>;\n}\n\nexport interface UploadedFile {\n name: string;\n type: string;\n size: number;\n url: string;\n}\n\nexport interface FileUploadService {\n upload(file: FileLike): Promise<UploadedFile>;\n}\n\nexport class Base64FileUploadService implements FileUploadService {\n async upload(file: FileLike): Promise<UploadedFile> {\n const encode = (globalThis as { btoa?: (raw: string) => string }).btoa;\n if (!encode) throw new Error(\"No base64 encoder available\");\n\n const bytes = new Uint8Array(await file.arrayBuffer());\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n\n return {\n name: file.name,\n type: file.type,\n size: file.size,\n url: `data:${file.type};base64,${encode(binary)}`,\n };\n }\n}\n",
|
|
14
|
+
"import {\n SandboxJsRunnerService,\n type JsRunnerService,\n} from \"./js_runner_service\";\nimport {\n FetchDataSourceService,\n type DataSourceService,\n} from \"./data_source_service\";\nimport {\n Base64FileUploadService,\n type FileUploadService,\n} from \"./file_upload_service\";\n\nexport interface Services {\n jsRunnerService: JsRunnerService;\n dataSourceService: DataSourceService;\n fileUploadService: FileUploadService;\n}\n\nconst GLOBAL_KEY = Symbol.for(\"formkrafter.core.services\");\nconst globalStore = globalThis as unknown as Record<symbol, Services | undefined>;\n\nconst services: Services = (globalStore[GLOBAL_KEY] ??= {\n jsRunnerService: new SandboxJsRunnerService(),\n dataSourceService: new FetchDataSourceService(),\n fileUploadService: new Base64FileUploadService(),\n});\n\nexport { services };\n",
|
|
15
|
+
"import { Ajv, type ErrorObject, type ValidateFunction } from \"ajv\";\nimport ajvErrors from \"ajv-errors\";\nimport addFormats from \"ajv-formats\";\nimport type { BrickSpec } from \"../utils/brick-spec\";\nimport { buildValidationSchema, iterateSchemaBricks } from \"../utils/brick-spec\";\nimport { resolveLocalizedText } from \"../utils/localized-text\";\nimport { defaultValidationMessage } from \"./default-messages\";\nimport { evalBrickCode } from \"../brick/utils\";\n\nconst ajv = new Ajv({ allErrors: true });\naddFormats(ajv, [\"email\", \"uri\"]);\najvErrors(ajv);\n\nconst validatorCache = new WeakMap<BrickSpec, Map<string, ValidateFunction>>();\n\nexport type Validator =\n | \"required\"\n | \"minLength\"\n | \"maxLength\"\n | \"min\"\n | \"max\"\n | \"pattern\"\n | \"minItems\"\n | \"maxItems\"\n | \"email\"\n | \"url\"\n | \"custom\";\n\nexport type ValidationResult = {\n valid: boolean;\n errors: Record<string, string>;\n};\n\nconst compiledValidator = (\n brickSpec: BrickSpec,\n locale?: string\n): ValidateFunction | undefined => {\n let byLocale = validatorCache.get(brickSpec);\n if (!byLocale) {\n byLocale = new Map();\n validatorCache.set(brickSpec, byLocale);\n }\n\n const cacheKey = locale ?? \"\";\n let validate = byLocale.get(cacheKey);\n\n if (!validate) {\n const schema = buildValidationSchema(brickSpec, locale);\n if (!schema) return undefined;\n\n try {\n validate = ajv.compile(schema);\n } catch {\n return undefined;\n }\n byLocale.set(cacheKey, validate);\n }\n\n return validate;\n};\n\nconst customErrors = (\n brickSpec: BrickSpec,\n data: unknown,\n locale?: string\n): Record<string, string> => {\n const errors: Record<string, string> = {};\n const dataMap = (data ?? {}) as Record<string, unknown>;\n\n for (const brick of iterateSchemaBricks(brickSpec)) {\n const key = brick.configs?.key;\n if (!key) continue;\n\n for (const validation of brick.validations ?? []) {\n if (validation.validator !== \"custom\" || !validation.customValidator) {\n continue;\n }\n\n const result = evalBrickCode(\n `const value = dataMap?.[${JSON.stringify(key)}];\\n${validation.customValidator}`,\n dataMap\n );\n\n if (result === true || result === undefined || result === null) continue;\n if (key in errors) continue;\n\n if (typeof result === \"string\") errors[key] = result;\n else if (result instanceof Error) errors[key] = result.message;\n else {\n const resolved = resolveLocalizedText(validation.message, locale);\n errors[key] =\n typeof resolved === \"string\"\n ? resolved\n : defaultValidationMessage(\"custom\", locale);\n }\n }\n }\n\n return errors;\n};\n\nconst keyOfError = (error: ErrorObject): string | undefined => {\n if (error.keyword === \"required\") {\n return (error.params as { missingProperty?: string }).missingProperty;\n }\n\n if (error.keyword === \"errorMessage\") {\n const inner = (error.params as { errors?: ErrorObject[] }).errors?.[0];\n return inner ? keyOfError(inner) : undefined;\n }\n\n return error.instancePath.split(\"/\").filter(Boolean)[0];\n};\n\nexport const validateBrickSpecDataDetailed = (\n brickSpec: BrickSpec,\n data: unknown,\n locale?: string\n): ValidationResult => {\n const errors: Record<string, string> = {};\n const validate = compiledValidator(brickSpec, locale);\n\n if (validate && !validate(data)) {\n for (const error of validate.errors ?? []) {\n const key = keyOfError(error);\n if (key && !(key in errors) && error.message) {\n errors[key] = error.message;\n }\n }\n }\n\n for (const [key, message] of Object.entries(customErrors(brickSpec, data, locale))) {\n if (!(key in errors)) errors[key] = message;\n }\n\n return { valid: Object.keys(errors).length === 0, errors };\n};\n\nexport const validateBrickSpecData = (\n brickSpec: BrickSpec,\n data: unknown,\n locale?: string\n): boolean => validateBrickSpecDataDetailed(brickSpec, data, locale).valid;\n\nconst stripEmpty = (data: unknown): Record<string, unknown> => {\n if (typeof data !== \"object\" || data === null) return {};\n\n return Object.fromEntries(\n Object.entries(data as Record<string, unknown>).filter(\n ([, value]) => value !== \"\" && value !== null && value !== undefined\n )\n );\n};\n\nconst rowSpecCache = new WeakMap<BrickSpec, BrickSpec>();\n\nconst rowSpecOf = (collection: BrickSpec): BrickSpec => {\n let rowSpec = rowSpecCache.get(collection);\n\n if (!rowSpec) {\n rowSpec = {\n type: \"panel\",\n id: \"collection-row\",\n name: \"Row\",\n configs: { key: `${collection.configs?.key ?? \"collection\"}_row` },\n children: collection.children ?? [],\n };\n rowSpecCache.set(collection, rowSpec);\n }\n\n return rowSpec;\n};\n\nexport const validateFormData = (\n brickSpec: BrickSpec,\n data: unknown,\n locale?: string\n): ValidationResult => {\n const present = stripEmpty(data);\n const errors = {\n ...validateBrickSpecDataDetailed(brickSpec, present, locale).errors,\n };\n\n for (const brick of iterateSchemaBricks(brickSpec)) {\n if (brick.type !== \"collection\") continue;\n\n const key = brick.configs?.key;\n if (!key) continue;\n\n const rows = present[key];\n if (!Array.isArray(rows)) continue;\n\n const rowSpec = rowSpecOf(brick);\n rows.forEach((row, index) => {\n const rowResult = validateFormData(rowSpec, row, locale);\n for (const [field, message] of Object.entries(rowResult.errors)) {\n const prefixed = `${key}[${index}].${field}`;\n if (!(prefixed in errors)) errors[prefixed] = message;\n }\n });\n }\n\n return { valid: Object.keys(errors).length === 0, errors };\n};\n",
|
|
16
|
+
"import { type Options, parse } from \"acorn\";\nimport type { JsRunnerService } from \"./js_runner_service\";\n\nexport class UnsafeEvalJsRunnerService implements JsRunnerService {\n validateJs(\n js: string,\n options: Options = { ecmaVersion: \"latest\", allowReturnOutsideFunction: true }\n ): { valide: boolean; error?: Error } {\n try {\n parse(js, options);\n return { valide: true };\n } catch (error) {\n return {\n valide: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n eval(js: string, scope: Record<string, unknown> = {}): unknown {\n const prelude = Object.entries(scope)\n .map(([name, value]) => `const ${name} = ${JSON.stringify(value)};`)\n .join(\"\\n\");\n const fn = `(() => {${prelude}\\n${js}})();`;\n\n const validation = this.validateJs(fn, { ecmaVersion: \"latest\" });\n if (!validation.valide) throw validation.error;\n\n return eval(fn);\n }\n}\n",
|
|
17
|
+
"import type { BrickSpec } from \"../utils/brick-spec\";\n\nexport function pointerFromPath(path: string): string {\n return path\n .split(\".\")\n .slice(1)\n .map((segment) => `/children/${segment}`)\n .join(\"\");\n}\n\nexport function pointerOfUid(spec: BrickSpec, uid: string): string | undefined {\n if (spec.configs?.uid === uid) return \"\";\n\n for (const [index, child] of (spec.children ?? []).entries()) {\n const childPointer = pointerOfUid(child, uid);\n if (childPointer !== undefined) return `/children/${index}${childPointer}`;\n }\n\n return undefined;\n}\n\nexport function getBrickAt(spec: BrickSpec, path: string): BrickSpec | undefined {\n let current: BrickSpec | undefined = spec;\n\n for (const segment of path.split(\".\").slice(1)) {\n current = current?.children?.[Number(segment)];\n }\n\n return current;\n}\n",
|
|
18
|
+
"import * as fastJsonPatchModule from \"fast-json-patch\";\n\ntype FastJsonPatchApi = {\n applyPatch: typeof fastJsonPatchModule.applyPatch;\n};\n\nconst fastJsonPatch: FastJsonPatchApi =\n (fastJsonPatchModule as unknown as { default?: FastJsonPatchApi }).default ??\n fastJsonPatchModule;\n\nexport const applyPatch = fastJsonPatch.applyPatch;\nexport type { Operation } from \"fast-json-patch\";\n",
|
|
19
|
+
"import { applyPatch, type Operation } from \"../utils/fast-json-patch\";\nimport type { BrickSpec } from \"../utils/brick-spec\";\nimport type { BrickBaseConfigs } from \"../utils/common-brick-props\";\nimport type { BrickStyles } from \"../utils/brick-styles\";\nimport type { Validation } from \"../validators/validation\";\nimport type { Rule } from \"../rules/rule\";\nimport { getBrickAt, pointerFromPath, pointerOfUid } from \"./pointer\";\n\nexport type SpecUpdate = {\n spec: BrickSpec;\n patches: Operation[];\n inverse: Operation[];\n};\n\nconst apply = (\n spec: BrickSpec,\n patches: Operation[],\n inverse: Operation[]\n): SpecUpdate => ({\n spec: applyPatch(spec, patches, true, false).newDocument,\n patches,\n inverse,\n});\n\nconst requireBrickAt = (spec: BrickSpec, path: string): BrickSpec => {\n const brick = getBrickAt(spec, path);\n if (!brick) throw new Error(`No brick at path \"${path}\"`);\n return brick;\n};\n\nconst requireBrickByUid = (\n spec: BrickSpec,\n uid: string\n): { pointer: string; brick: BrickSpec } => {\n const pointer = pointerOfUid(spec, uid);\n if (pointer === undefined) throw new Error(`No brick with uid \"${uid}\"`);\n\n let brick = spec;\n for (const segment of pointer.split(\"/children/\").slice(1)) {\n brick = brick.children![Number(segment)];\n }\n\n return { pointer, brick };\n};\n\nconst toJsonValue = <T>(value: T): T => JSON.parse(JSON.stringify(value));\n\nexport function addBrick(\n spec: BrickSpec,\n brick: BrickSpec,\n parentPath: string,\n index?: number\n): SpecUpdate {\n const parent = requireBrickAt(spec, parentPath);\n const parentPointer = pointerFromPath(parentPath);\n const value = toJsonValue(brick);\n\n if (!parent.children) {\n const pointer = `${parentPointer}/children`;\n return apply(\n spec,\n [{ op: \"add\", path: pointer, value: [value] }],\n [{ op: \"remove\", path: pointer }]\n );\n }\n\n const position = Math.min(index ?? parent.children.length, parent.children.length);\n const pointer = `${parentPointer}/children/${position}`;\n\n return apply(\n spec,\n [{ op: \"add\", path: pointer, value }],\n [{ op: \"remove\", path: pointer }]\n );\n}\n\nexport function removeBrick(spec: BrickSpec, path: string): SpecUpdate {\n if (path === \"0\") throw new Error(\"Cannot remove the root brick\");\n\n const brick = requireBrickAt(spec, path);\n const pointer = pointerFromPath(path);\n\n return apply(\n spec,\n [{ op: \"remove\", path: pointer }],\n [{ op: \"add\", path: pointer, value: brick }]\n );\n}\n\nexport function moveBrick(spec: BrickSpec, from: string, to: string): SpecUpdate {\n if (from === \"0\" || to === \"0\") throw new Error(\"Cannot move the root brick\");\n\n const brick = requireBrickAt(spec, from);\n\n const fromSegments = from.split(\".\").map(Number);\n const toSegments = to.split(\".\").map(Number);\n const parentLength = fromSegments.length - 1;\n const fromIndex = fromSegments[parentLength];\n\n const sharesFromParent =\n toSegments.length > parentLength &&\n fromSegments.slice(0, parentLength).every((segment, i) => segment === toSegments[i]);\n\n const adjusted = [...toSegments];\n if (sharesFromParent) {\n if (adjusted[parentLength] === fromIndex && adjusted.length > fromSegments.length) {\n throw new Error(`Cannot move a brick into its own subtree (\"${from}\" → \"${to}\")`);\n }\n if (adjusted[parentLength] > fromIndex) adjusted[parentLength] -= 1;\n }\n\n const fromPointer = pointerFromPath(from);\n const toPointer = pointerFromPath(adjusted.join(\".\"));\n\n return apply(\n spec,\n [\n { op: \"remove\", path: fromPointer },\n { op: \"add\", path: toPointer, value: brick },\n ],\n [\n { op: \"remove\", path: toPointer },\n { op: \"add\", path: fromPointer, value: brick },\n ]\n );\n}\n\nconst withFreshUids = (brick: BrickSpec): BrickSpec => ({\n ...brick,\n ...(brick.configs\n ? { configs: { ...brick.configs, uid: crypto.randomUUID() } }\n : {}),\n ...(brick.children ? { children: brick.children.map(withFreshUids) } : {}),\n});\n\nexport function duplicateBrick(spec: BrickSpec, path: string): SpecUpdate {\n if (path === \"0\") throw new Error(\"Cannot duplicate the root brick\");\n\n const brick = requireBrickAt(spec, path);\n const segments = path.split(\".\");\n const nextIndex = Number(segments[segments.length - 1]) + 1;\n const pointer = pointerFromPath(\n [...segments.slice(0, -1), String(nextIndex)].join(\".\")\n );\n\n const copy = withFreshUids(toJsonValue(brick));\n\n return apply(\n spec,\n [{ op: \"add\", path: pointer, value: copy }],\n [{ op: \"remove\", path: pointer }]\n );\n}\n\nconst setBrickSection = (\n spec: BrickSpec,\n brickPointer: string,\n section: \"configs\" | \"styles\" | \"validations\" | \"rules\",\n value: unknown,\n previous: unknown\n): SpecUpdate => {\n const pointer = `${brickPointer}/${section}`;\n\n if (previous === undefined) {\n return apply(\n spec,\n [{ op: \"add\", path: pointer, value }],\n [{ op: \"remove\", path: pointer }]\n );\n }\n\n return apply(\n spec,\n [{ op: \"replace\", path: pointer, value }],\n [{ op: \"replace\", path: pointer, value: previous }]\n );\n};\n\nexport function updateBrickConfigs(\n spec: BrickSpec,\n uid: string,\n configs: BrickBaseConfigs & Record<string, unknown>\n): SpecUpdate {\n const { pointer, brick } = requireBrickByUid(spec, uid);\n const merged = { ...brick.configs, ...configs };\n\n return setBrickSection(spec, pointer, \"configs\", merged, brick.configs);\n}\n\nexport function updateBrickStyles(\n spec: BrickSpec,\n uid: string,\n styles: BrickStyles<string>\n): SpecUpdate {\n const { pointer, brick } = requireBrickByUid(spec, uid);\n const merged = { ...brick.styles, ...styles };\n\n return setBrickSection(spec, pointer, \"styles\", merged, brick.styles);\n}\n\nexport function updateBrickValidations(\n spec: BrickSpec,\n uid: string,\n validations: Validation[]\n): SpecUpdate {\n const { pointer, brick } = requireBrickByUid(spec, uid);\n\n return setBrickSection(spec, pointer, \"validations\", validations, brick.validations);\n}\n\nexport function updateBrickRules(\n spec: BrickSpec,\n uid: string,\n rules: Rule[]\n): SpecUpdate {\n const { pointer, brick } = requireBrickByUid(spec, uid);\n\n return setBrickSection(spec, pointer, \"rules\", rules, brick.rules);\n}\n",
|
|
20
|
+
"import { applyPatch, type Operation } from \"../utils/fast-json-patch\";\nimport type { BrickSpec } from \"../utils/brick-spec\";\nimport type { SpecUpdate } from \"./ops\";\n\ntype HistoryEntry = {\n patches: Operation[];\n inverse: Operation[];\n};\n\nexport class SpecHistory {\n private past: HistoryEntry[] = [];\n private future: HistoryEntry[] = [];\n\n record(update: SpecUpdate): void {\n this.past.push({ patches: update.patches, inverse: update.inverse });\n this.future = [];\n }\n\n get canUndo(): boolean {\n return this.past.length > 0;\n }\n\n get canRedo(): boolean {\n return this.future.length > 0;\n }\n\n undo(spec: BrickSpec): BrickSpec | undefined {\n const entry = this.past.pop();\n if (!entry) return undefined;\n\n this.future.push(entry);\n\n return applyPatch(spec, entry.inverse, true, false).newDocument;\n }\n\n redo(spec: BrickSpec): BrickSpec | undefined {\n const entry = this.future.pop();\n if (!entry) return undefined;\n\n this.past.push(entry);\n\n return applyPatch(spec, entry.patches, true, false).newDocument;\n }\n\n clear(): void {\n this.past = [];\n this.future = [];\n }\n}\n"
|
|
21
|
+
],
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "C472894AC5683A1F64756E2164756E21",
|
|
24
|
+
"names": []
|
|
25
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BrickSpec } from "../utils/brick-spec";
|
|
2
|
+
import type { SpecUpdate } from "./ops";
|
|
3
|
+
export declare class SpecHistory {
|
|
4
|
+
private past;
|
|
5
|
+
private future;
|
|
6
|
+
record(update: SpecUpdate): void;
|
|
7
|
+
get canUndo(): boolean;
|
|
8
|
+
get canRedo(): boolean;
|
|
9
|
+
undo(spec: BrickSpec): BrickSpec | undefined;
|
|
10
|
+
redo(spec: BrickSpec): BrickSpec | undefined;
|
|
11
|
+
clear(): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Operation } from "../utils/fast-json-patch";
|
|
2
|
+
import type { BrickSpec } from "../utils/brick-spec";
|
|
3
|
+
import type { BrickBaseConfigs } from "../utils/common-brick-props";
|
|
4
|
+
import type { BrickStyles } from "../utils/brick-styles";
|
|
5
|
+
import type { Validation } from "../validators/validation";
|
|
6
|
+
import type { Rule } from "../rules/rule";
|
|
7
|
+
export type SpecUpdate = {
|
|
8
|
+
spec: BrickSpec;
|
|
9
|
+
patches: Operation[];
|
|
10
|
+
inverse: Operation[];
|
|
11
|
+
};
|
|
12
|
+
export declare function addBrick(spec: BrickSpec, brick: BrickSpec, parentPath: string, index?: number): SpecUpdate;
|
|
13
|
+
export declare function removeBrick(spec: BrickSpec, path: string): SpecUpdate;
|
|
14
|
+
export declare function moveBrick(spec: BrickSpec, from: string, to: string): SpecUpdate;
|
|
15
|
+
export declare function duplicateBrick(spec: BrickSpec, path: string): SpecUpdate;
|
|
16
|
+
export declare function updateBrickConfigs(spec: BrickSpec, uid: string, configs: BrickBaseConfigs & Record<string, unknown>): SpecUpdate;
|
|
17
|
+
export declare function updateBrickStyles(spec: BrickSpec, uid: string, styles: BrickStyles<string>): SpecUpdate;
|
|
18
|
+
export declare function updateBrickValidations(spec: BrickSpec, uid: string, validations: Validation[]): SpecUpdate;
|
|
19
|
+
export declare function updateBrickRules(spec: BrickSpec, uid: string, rules: Rule[]): SpecUpdate;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BrickSpec } from "../utils/brick-spec";
|
|
2
|
+
export declare function pointerFromPath(path: string): string;
|
|
3
|
+
export declare function pointerOfUid(spec: BrickSpec, uid: string): string | undefined;
|
|
4
|
+
export declare function getBrickAt(spec: BrickSpec, path: string): BrickSpec | undefined;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RulesLogic } from "json-logic-js";
|
|
2
|
+
export type Effect = {
|
|
3
|
+
name?: string;
|
|
4
|
+
property?: {
|
|
5
|
+
target: string;
|
|
6
|
+
type: "logic" | "code" | "boolean" | "string";
|
|
7
|
+
};
|
|
8
|
+
logic?: RulesLogic;
|
|
9
|
+
code?: string;
|
|
10
|
+
boolean?: boolean;
|
|
11
|
+
string?: string;
|
|
12
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface DataSourceRequestOptions {
|
|
2
|
+
headers?: Record<string, string>;
|
|
3
|
+
}
|
|
4
|
+
export interface DataSourceServiceDefaults {
|
|
5
|
+
credentials?: "omit" | "same-origin" | "include";
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export interface DataSourceService {
|
|
9
|
+
fetchOptions(url: string, options?: DataSourceRequestOptions): Promise<unknown[]>;
|
|
10
|
+
}
|
|
11
|
+
export declare class FetchDataSourceService implements DataSourceService {
|
|
12
|
+
private readonly defaults;
|
|
13
|
+
private cache;
|
|
14
|
+
constructor(defaults?: DataSourceServiceDefaults);
|
|
15
|
+
fetchOptions(url: string, options?: DataSourceRequestOptions): Promise<unknown[]>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface FileLike {
|
|
2
|
+
name: string;
|
|
3
|
+
type: string;
|
|
4
|
+
size: number;
|
|
5
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
6
|
+
}
|
|
7
|
+
export interface UploadedFile {
|
|
8
|
+
name: string;
|
|
9
|
+
type: string;
|
|
10
|
+
size: number;
|
|
11
|
+
url: string;
|
|
12
|
+
}
|
|
13
|
+
export interface FileUploadService {
|
|
14
|
+
upload(file: FileLike): Promise<UploadedFile>;
|
|
15
|
+
}
|
|
16
|
+
export declare class Base64FileUploadService implements FileUploadService {
|
|
17
|
+
upload(file: FileLike): Promise<UploadedFile>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type JsRunnerService } from "./js_runner_service";
|
|
2
|
+
import { type DataSourceService } from "./data_source_service";
|
|
3
|
+
import { type FileUploadService } from "./file_upload_service";
|
|
4
|
+
export interface Services {
|
|
5
|
+
jsRunnerService: JsRunnerService;
|
|
6
|
+
dataSourceService: DataSourceService;
|
|
7
|
+
fileUploadService: FileUploadService;
|
|
8
|
+
}
|
|
9
|
+
declare const services: Services;
|
|
10
|
+
export { services };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Options } from "acorn";
|
|
2
|
+
export interface JsRunnerService {
|
|
3
|
+
eval(js: string, scope?: Record<string, unknown>): unknown;
|
|
4
|
+
validateJs(js: string, options?: Options): {
|
|
5
|
+
valide: boolean;
|
|
6
|
+
error?: Error;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare class SandboxJsRunnerService implements JsRunnerService {
|
|
10
|
+
validateJs(js: string, options?: Options): {
|
|
11
|
+
valide: boolean;
|
|
12
|
+
error?: Error;
|
|
13
|
+
};
|
|
14
|
+
eval(js: string, scope?: Record<string, unknown>): unknown;
|
|
15
|
+
}
|
|
16
|
+
export declare const JsRunnerServiceImplementation: typeof SandboxJsRunnerService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runSandboxed(code: string, globals?: Record<string, unknown>): unknown;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Options } from "acorn";
|
|
2
|
+
import type { JsRunnerService } from "./js_runner_service";
|
|
3
|
+
export declare class UnsafeEvalJsRunnerService implements JsRunnerService {
|
|
4
|
+
validateJs(js: string, options?: Options): {
|
|
5
|
+
valide: boolean;
|
|
6
|
+
error?: Error;
|
|
7
|
+
};
|
|
8
|
+
eval(js: string, scope?: Record<string, unknown>): unknown;
|
|
9
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { JSONSchemaType } from "../validators/json-schema-type";
|
|
2
|
+
import type { Validator } from "../validators/validator";
|
|
3
|
+
import type { Validation } from "../validators/validation";
|
|
4
|
+
import type { Rule } from "../rules/rule";
|
|
5
|
+
import type { BrickType } from "./brick-type";
|
|
6
|
+
import type { BrickBaseConfigs } from "./common-brick-props";
|
|
7
|
+
import type { BrickStyles } from "../utils/brick-styles";
|
|
8
|
+
export interface BrickSpec {
|
|
9
|
+
type: BrickType;
|
|
10
|
+
dataType?: JSONSchemaType;
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
category?: string;
|
|
14
|
+
editable?: boolean;
|
|
15
|
+
unWrapData?: boolean;
|
|
16
|
+
isPrivate?: boolean;
|
|
17
|
+
validators?: Validator[];
|
|
18
|
+
validations?: Validation[];
|
|
19
|
+
rules?: Rule[];
|
|
20
|
+
configsForm?: BrickSpec;
|
|
21
|
+
configs?: BrickBaseConfigs & Record<string, unknown>;
|
|
22
|
+
styles?: BrickStyles<string>;
|
|
23
|
+
children?: BrickSpec[];
|
|
24
|
+
}
|
|
25
|
+
export declare function iterateBricks(spec?: BrickSpec, path?: string): Generator<{
|
|
26
|
+
brick: BrickSpec;
|
|
27
|
+
path: string;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function iterateSchemaBricks(spec?: BrickSpec): Generator<BrickSpec>;
|
|
30
|
+
export declare function buildValidationSchema(brickSpecs?: BrickSpec, locale?: string): {
|
|
31
|
+
additionalProperties: boolean;
|
|
32
|
+
errorMessage?: {
|
|
33
|
+
required: Record<string, string | undefined>;
|
|
34
|
+
} | undefined;
|
|
35
|
+
type: string;
|
|
36
|
+
properties: Record<string, unknown>;
|
|
37
|
+
required: string[];
|
|
38
|
+
} | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type BrickStyles<K extends string> = Record<K, unknown>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type BrickType = 'panel' | 'input' | 'collection' | 'output' | 'action';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BrickSpec } from "./brick-spec";
|
|
2
|
+
export interface BrickBaseConfigs {
|
|
3
|
+
uid?: string;
|
|
4
|
+
key?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CommonBrickProps<Configs extends BrickBaseConfigs, Styles> {
|
|
7
|
+
configsForm?: BrickSpec;
|
|
8
|
+
configs?: Configs;
|
|
9
|
+
styles: Styles;
|
|
10
|
+
}
|
|
11
|
+
export type WithBrickBaseConfigs<T = object> = T & {
|
|
12
|
+
uid?: string;
|
|
13
|
+
key: string;
|
|
14
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BrickMold } from './brick-mold';
|
|
2
|
+
export type BrickMoldDropType = {
|
|
3
|
+
type: 'BrickMold';
|
|
4
|
+
brickMold: BrickMold;
|
|
5
|
+
};
|
|
6
|
+
export type BrickSpecDropType = {
|
|
7
|
+
type: 'BrickSpec';
|
|
8
|
+
path: string;
|
|
9
|
+
};
|
|
10
|
+
export type DropType = BrickMoldDropType | BrickSpecDropType;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type LocalizedText = string | Record<string, string>;
|
|
2
|
+
export declare function isLocalizedObject(value: unknown): value is Record<string, string>;
|
|
3
|
+
export declare function resolveLocalizedText(value: unknown, locale?: string): unknown;
|
|
4
|
+
export declare function resolveLocalizedRecord<T extends Record<string, unknown>>(record: T | undefined, locale?: string): T | undefined;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BrickSpec } from "../utils/brick-spec";
|
|
2
|
+
export type Validator = "required" | "minLength" | "maxLength" | "min" | "max" | "pattern" | "minItems" | "maxItems" | "email" | "url" | "custom";
|
|
3
|
+
export type ValidationResult = {
|
|
4
|
+
valid: boolean;
|
|
5
|
+
errors: Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
export declare const validateBrickSpecDataDetailed: (brickSpec: BrickSpec, data: unknown, locale?: string) => ValidationResult;
|
|
8
|
+
export declare const validateBrickSpecData: (brickSpec: BrickSpec, data: unknown, locale?: string) => boolean;
|
|
9
|
+
export declare const validateFormData: (brickSpec: BrickSpec, data: unknown, locale?: string) => ValidationResult;
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@streamline-pulse/formkrafter-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-agnostic core for FormKrafter: form specs, RFC 6902 ops with undo/redo, Ajv validation, sandboxed rules engine and injectable services",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"module": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"keywords": [
|
|
11
|
+
"form",
|
|
12
|
+
"form-builder",
|
|
13
|
+
"json-schema",
|
|
14
|
+
"validation",
|
|
15
|
+
"json-patch",
|
|
16
|
+
"formkrafter"
|
|
17
|
+
],
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"LICENSE"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "rm -rf dist && bun build lib/index.ts --outdir dist --format esm --packages external --sourcemap=linked && tsc -p . --emitDeclarationOnly",
|
|
24
|
+
"prepublishOnly": "cp ../../LICENSE . && bun run build",
|
|
25
|
+
"test": "bun test"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"acorn": "^8.17.0",
|
|
29
|
+
"ajv": "^8.20.0",
|
|
30
|
+
"ajv-errors": "^3.0.0",
|
|
31
|
+
"json-logic-js": "^2.0.5",
|
|
32
|
+
"fast-json-patch": "^3.1.1",
|
|
33
|
+
"ajv-formats": "^3.0.1"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"typescript": "^6.0.3",
|
|
37
|
+
"@types/json-logic-js": "^2.0.8"
|
|
38
|
+
},
|
|
39
|
+
"exports": {
|
|
40
|
+
".": {
|
|
41
|
+
"types": "./dist/index.d.ts",
|
|
42
|
+
"import": "./dist/index.js"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
}
|
|
48
|
+
}
|