@json-to-office/shared 0.1.1 → 0.7.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/dist/chunk-HS3W472G.js +182 -0
- package/dist/chunk-HS3W472G.js.map +1 -0
- package/dist/index.d.ts +16 -1
- package/dist/index.js +19 -1
- package/dist/plugin/index.d.ts +137 -0
- package/dist/plugin/index.js +25 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/types-BWFZ7OaO.d.ts +17 -0
- package/dist/validation/unified/index.d.ts +3 -17
- package/package.json +6 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isValidSemver,
|
|
3
|
+
latestVersion
|
|
4
|
+
} from "./chunk-244MHDOZ.js";
|
|
5
|
+
import {
|
|
6
|
+
formatErrorSummary,
|
|
7
|
+
transformValueErrors
|
|
8
|
+
} from "./chunk-ZKD5BAMU.js";
|
|
9
|
+
|
|
10
|
+
// src/plugin/createComponent.ts
|
|
11
|
+
function createVersion(version) {
|
|
12
|
+
return version;
|
|
13
|
+
}
|
|
14
|
+
function createComponent(component) {
|
|
15
|
+
if (!component.name) {
|
|
16
|
+
throw new Error("Component name is required");
|
|
17
|
+
}
|
|
18
|
+
if (!component.versions || typeof component.versions !== "object") {
|
|
19
|
+
throw new Error(`Component "${component.name}" requires a versions map`);
|
|
20
|
+
}
|
|
21
|
+
const versionKeys = Object.keys(component.versions);
|
|
22
|
+
if (versionKeys.length === 0) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
`Component "${component.name}" must have at least one version`
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
for (const key of versionKeys) {
|
|
28
|
+
if (!isValidSemver(key)) {
|
|
29
|
+
throw new Error(
|
|
30
|
+
`Component "${component.name}": invalid semver key "${key}". Expected format: major.minor.patch`
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
const entry = component.versions[key];
|
|
34
|
+
if (!entry.propsSchema) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
`Component "${component.name}" version "${key}" requires a propsSchema`
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
if (!entry.render || typeof entry.render !== "function") {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`Component "${component.name}" version "${key}" requires a render function`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return component;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/plugin/version-resolver.ts
|
|
49
|
+
function resolveComponentVersion(componentName, versions, requestedVersion) {
|
|
50
|
+
const versionKeys = Object.keys(versions);
|
|
51
|
+
if (requestedVersion) {
|
|
52
|
+
const entry = versions[requestedVersion];
|
|
53
|
+
if (!entry) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
`Component "${componentName}" does not have version "${requestedVersion}". Available versions: ${versionKeys.join(", ")}`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
return entry;
|
|
59
|
+
}
|
|
60
|
+
const latest = latestVersion(versionKeys);
|
|
61
|
+
return versions[latest];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// src/plugin/errors.ts
|
|
65
|
+
var DuplicateComponentError = class _DuplicateComponentError extends Error {
|
|
66
|
+
componentName;
|
|
67
|
+
code = "DUPLICATE_COMPONENT";
|
|
68
|
+
constructor(componentName) {
|
|
69
|
+
super(
|
|
70
|
+
`Cannot register component "${componentName}": a component with this name is already registered. Component names must be unique within a document generator.`
|
|
71
|
+
);
|
|
72
|
+
this.name = "DuplicateComponentError";
|
|
73
|
+
this.componentName = componentName;
|
|
74
|
+
if (Error.captureStackTrace) {
|
|
75
|
+
Error.captureStackTrace(this, _DuplicateComponentError);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var ComponentValidationError = class extends Error {
|
|
80
|
+
errors;
|
|
81
|
+
props;
|
|
82
|
+
constructor(errors, props) {
|
|
83
|
+
const propsStr = props !== void 0 ? `
|
|
84
|
+
Props: ${JSON.stringify(props, null, 2)}` : "";
|
|
85
|
+
const message = `Document validation failed:
|
|
86
|
+
${errors.map((e) => ` ${e.path}: ${e.message}`).join("\n")}${propsStr}`;
|
|
87
|
+
super(message);
|
|
88
|
+
this.name = "ComponentValidationError";
|
|
89
|
+
this.errors = errors;
|
|
90
|
+
this.props = props;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// src/plugin/validation.ts
|
|
95
|
+
import { Value } from "@sinclair/typebox/value";
|
|
96
|
+
function validateAgainstSchema(schema, data, options) {
|
|
97
|
+
try {
|
|
98
|
+
let processedData = Value.Clone(data);
|
|
99
|
+
if (options?.applyDefaults) {
|
|
100
|
+
processedData = Value.Default(schema, processedData);
|
|
101
|
+
}
|
|
102
|
+
if (options?.clean) {
|
|
103
|
+
processedData = Value.Clean(schema, processedData);
|
|
104
|
+
}
|
|
105
|
+
if (!Value.Check(schema, processedData)) {
|
|
106
|
+
const errors = [...Value.Errors(schema, processedData)];
|
|
107
|
+
const transformedErrors = transformValueErrors(errors, {
|
|
108
|
+
jsonString: options?.jsonString,
|
|
109
|
+
maxErrors: options?.maxErrors || 100
|
|
110
|
+
});
|
|
111
|
+
return { valid: false, errors: transformedErrors };
|
|
112
|
+
}
|
|
113
|
+
return { valid: true, data: processedData };
|
|
114
|
+
} catch (error) {
|
|
115
|
+
return {
|
|
116
|
+
valid: false,
|
|
117
|
+
errors: [
|
|
118
|
+
{
|
|
119
|
+
path: "root",
|
|
120
|
+
message: error instanceof Error ? error.message : "Unknown validation error",
|
|
121
|
+
code: "validation_exception"
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function validateCustomComponentProps(componentSchema, config, options) {
|
|
128
|
+
const name = options?.componentName ?? "custom";
|
|
129
|
+
try {
|
|
130
|
+
const result = validateAgainstSchema(componentSchema, config, {
|
|
131
|
+
...options,
|
|
132
|
+
clean: options?.clean ?? true,
|
|
133
|
+
applyDefaults: options?.applyDefaults ?? true
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
...result,
|
|
137
|
+
success: result.valid,
|
|
138
|
+
data: result.data,
|
|
139
|
+
componentName: name,
|
|
140
|
+
isCustomComponent: true
|
|
141
|
+
};
|
|
142
|
+
} catch (error) {
|
|
143
|
+
return {
|
|
144
|
+
valid: false,
|
|
145
|
+
success: false,
|
|
146
|
+
errors: [
|
|
147
|
+
{
|
|
148
|
+
path: "props",
|
|
149
|
+
message: error instanceof Error ? error.message : "Unknown validation error",
|
|
150
|
+
code: "validation_exception"
|
|
151
|
+
}
|
|
152
|
+
],
|
|
153
|
+
componentName: name,
|
|
154
|
+
isCustomComponent: true
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function isValidationSuccess(result) {
|
|
159
|
+
return result.valid === true && result.data !== void 0;
|
|
160
|
+
}
|
|
161
|
+
function getValidationSummary(result) {
|
|
162
|
+
if (result.valid) {
|
|
163
|
+
return "Validation successful";
|
|
164
|
+
}
|
|
165
|
+
if (!result.errors || result.errors.length === 0) {
|
|
166
|
+
return "Validation failed with unknown error";
|
|
167
|
+
}
|
|
168
|
+
return formatErrorSummary(result.errors);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export {
|
|
172
|
+
createVersion,
|
|
173
|
+
createComponent,
|
|
174
|
+
resolveComponentVersion,
|
|
175
|
+
DuplicateComponentError,
|
|
176
|
+
ComponentValidationError,
|
|
177
|
+
validateAgainstSchema,
|
|
178
|
+
validateCustomComponentProps,
|
|
179
|
+
isValidationSuccess,
|
|
180
|
+
getValidationSummary
|
|
181
|
+
};
|
|
182
|
+
//# sourceMappingURL=chunk-HS3W472G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugin/createComponent.ts","../src/plugin/version-resolver.ts","../src/plugin/errors.ts","../src/plugin/validation.ts"],"sourcesContent":["import { type TSchema, type Static } from '@sinclair/typebox';\nimport { isValidSemver } from '../utils/semver';\nimport type { AddWarningFunction } from '../types/warnings';\n\n/**\n * Render function context - parameters passed to render.\n * TTheme defaults to unknown so format-specific packages can narrow it.\n */\nexport interface RenderContext<T, TTheme = unknown> {\n /** The validated props for this component */\n props: T;\n /** The resolved theme configuration */\n theme: TTheme;\n /** Function to add warnings during processing */\n addWarning: AddWarningFunction;\n /** For container components: processed nested children */\n children?: unknown[];\n}\n\n/**\n * Render function that transforms custom component props into standard components.\n */\nexport type RenderFunction<\n TProps,\n TComponentDefinition = unknown,\n TTheme = unknown,\n> = (context: RenderContext<TProps, TTheme>) => Promise<TComponentDefinition[]>;\n\n/**\n * A single version entry within a versioned component.\n * Each version is self-contained with its own schema, render, and metadata.\n */\nexport interface ComponentVersion<\n TComponentDefinition = unknown,\n TPropsSchema extends TSchema = TSchema,\n TTheme = unknown,\n> {\n /** TypeBox schema for props validation */\n propsSchema: TPropsSchema;\n /** Async render function to transform props into standard components */\n render: RenderFunction<Static<TPropsSchema>, TComponentDefinition, TTheme>;\n /** Whether this version supports nested children */\n hasChildren?: boolean;\n /** Optional description for this version */\n description?: string;\n}\n\n/**\n * Map of semver version strings to their version definitions.\n */\nexport type ComponentVersionMap<\n TComponentDefinition = unknown,\n TTheme = unknown,\n> = Record<string, ComponentVersion<TComponentDefinition, any, TTheme>>;\n\n/**\n * Custom component definition with multiple semver-keyed versions.\n */\nexport interface CustomComponent<\n TComponentDefinition = unknown,\n TVersions extends ComponentVersionMap<\n TComponentDefinition,\n any\n > = ComponentVersionMap<TComponentDefinition, any>,\n TName extends string = string,\n> {\n /** Unique name for the component type */\n name: TName;\n /** Map of semver version strings to version definitions */\n versions: TVersions;\n}\n\n/**\n * Create a single version entry with full type inference for props.\n */\nexport function createVersion<\n TPropsSchema extends TSchema,\n TComponentDefinition = unknown,\n TTheme = unknown,\n>(\n version: ComponentVersion<TComponentDefinition, TPropsSchema, TTheme>\n): ComponentVersion<TComponentDefinition, TPropsSchema, TTheme> {\n return version;\n}\n\n/**\n * Create a custom component with multiple semver-keyed versions.\n */\nexport function createComponent<\n TComponentDefinition = unknown,\n TVersions extends ComponentVersionMap<\n TComponentDefinition,\n any\n > = ComponentVersionMap<TComponentDefinition, any>,\n TName extends string = string,\n>(\n component: CustomComponent<TComponentDefinition, TVersions, TName>\n): CustomComponent<TComponentDefinition, TVersions, TName> {\n if (!component.name) {\n throw new Error('Component name is required');\n }\n\n if (!component.versions || typeof component.versions !== 'object') {\n throw new Error(`Component \"${component.name}\" requires a versions map`);\n }\n\n const versionKeys = Object.keys(component.versions);\n if (versionKeys.length === 0) {\n throw new Error(\n `Component \"${component.name}\" must have at least one version`\n );\n }\n\n for (const key of versionKeys) {\n if (!isValidSemver(key)) {\n throw new Error(\n `Component \"${component.name}\": invalid semver key \"${key}\". Expected format: major.minor.patch`\n );\n }\n const entry = component.versions[key];\n if (!entry.propsSchema) {\n throw new Error(\n `Component \"${component.name}\" version \"${key}\" requires a propsSchema`\n );\n }\n if (!entry.render || typeof entry.render !== 'function') {\n throw new Error(\n `Component \"${component.name}\" version \"${key}\" requires a render function`\n );\n }\n }\n\n return component;\n}\n","import { latestVersion } from '../utils/semver';\nimport type { ComponentVersion, ComponentVersionMap } from './createComponent';\n\n/**\n * Resolve the correct version entry for a component.\n *\n * - If `requestedVersion` is provided and found, return it.\n * - If `requestedVersion` is provided but missing, throw with available versions.\n * - If `requestedVersion` is absent, return the latest semver version.\n */\nexport function resolveComponentVersion(\n componentName: string,\n versions: ComponentVersionMap,\n requestedVersion?: string\n): ComponentVersion {\n const versionKeys = Object.keys(versions);\n\n if (requestedVersion) {\n const entry = versions[requestedVersion];\n if (!entry) {\n throw new Error(\n `Component \"${componentName}\" does not have version \"${requestedVersion}\". ` +\n `Available versions: ${versionKeys.join(', ')}`\n );\n }\n return entry;\n }\n\n const latest = latestVersion(versionKeys);\n return versions[latest];\n}\n","import type { ValidationError } from '../validation/unified';\n\n/**\n * Error thrown when attempting to register a component with a duplicate name\n */\nexport class DuplicateComponentError extends Error {\n public readonly componentName: string;\n public readonly code = 'DUPLICATE_COMPONENT';\n\n constructor(componentName: string) {\n super(\n `Cannot register component \"${componentName}\": a component with this name is already registered. ` +\n 'Component names must be unique within a document generator.'\n );\n this.name = 'DuplicateComponentError';\n this.componentName = componentName;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, DuplicateComponentError);\n }\n }\n}\n\n/**\n * Custom validation error class\n */\nexport class ComponentValidationError extends Error {\n public errors: ValidationError[];\n public props: unknown;\n\n constructor(errors: ValidationError[], props?: unknown) {\n const propsStr =\n props !== undefined ? `\\nProps: ${JSON.stringify(props, null, 2)}` : '';\n const message = `Document validation failed:\\n${errors\n .map((e) => ` ${e.path}: ${e.message}`)\n .join('\\n')}${propsStr}`;\n super(message);\n this.name = 'ComponentValidationError';\n this.errors = errors;\n this.props = props;\n }\n}\n","import { Value } from '@sinclair/typebox/value';\nimport type { Static, TSchema } from '@sinclair/typebox';\nimport type { ValidationResult as BaseValidationResult } from '../validation/unified';\nimport {\n transformValueErrors,\n formatErrorSummary,\n} from '../validation/unified';\n\n/**\n * Validation options for plugin components\n */\nexport interface PluginValidationOptions {\n /** Apply Value.Clean to remove unknown properties */\n clean?: boolean;\n /** Apply Value.Default to add default values */\n applyDefaults?: boolean;\n /** Maximum number of errors to collect */\n maxErrors?: number;\n /** Original JSON string for position calculation */\n jsonString?: string;\n /** Calculate line/column for JSON errors */\n calculatePosition?: boolean;\n}\n\n/**\n * Generic validation result extending the base non-generic one\n */\nexport interface PluginValidationResult<T = unknown>\n extends BaseValidationResult {\n data?: T;\n}\n\n/**\n * Component-specific validation result\n */\nexport interface ComponentValidationResult<T = unknown>\n extends PluginValidationResult<T> {\n componentName?: string;\n isCustomComponent?: boolean;\n success?: boolean;\n}\n\n/**\n * Base validation: schema check + optional clean/defaults\n */\nexport function validateAgainstSchema<T extends TSchema>(\n schema: T,\n data: unknown,\n options?: PluginValidationOptions\n): PluginValidationResult<Static<T>> {\n try {\n let processedData: unknown = Value.Clone(data);\n\n if (options?.applyDefaults) {\n processedData = Value.Default(schema, processedData);\n }\n\n if (options?.clean) {\n processedData = Value.Clean(schema, processedData);\n }\n\n if (!Value.Check(schema, processedData)) {\n const errors = [...Value.Errors(schema, processedData)];\n const transformedErrors = transformValueErrors(errors, {\n jsonString: options?.jsonString,\n maxErrors: options?.maxErrors || 100,\n });\n\n return { valid: false, errors: transformedErrors };\n }\n\n return { valid: true, data: processedData as Static<T> };\n } catch (error) {\n return {\n valid: false,\n errors: [\n {\n path: 'root',\n message:\n error instanceof Error ? error.message : 'Unknown validation error',\n code: 'validation_exception',\n },\n ],\n };\n }\n}\n\n/**\n * Validate custom component props against a TypeBox schema.\n * Hardcodes clean + applyDefaults for consistent plugin behavior.\n */\nexport function validateCustomComponentProps<T>(\n componentSchema: TSchema,\n config: unknown,\n options?: PluginValidationOptions & { componentName?: string }\n): ComponentValidationResult<T> {\n const name = options?.componentName ?? 'custom';\n try {\n const result = validateAgainstSchema(componentSchema, config, {\n ...options,\n clean: options?.clean ?? true,\n applyDefaults: options?.applyDefaults ?? true,\n });\n\n return {\n ...result,\n success: result.valid,\n data: result.data as T,\n componentName: name,\n isCustomComponent: true,\n };\n } catch (error) {\n return {\n valid: false,\n success: false,\n errors: [\n {\n path: 'props',\n message:\n error instanceof Error ? error.message : 'Unknown validation error',\n code: 'validation_exception',\n },\n ],\n componentName: name,\n isCustomComponent: true,\n };\n }\n}\n\n/**\n * Utility to check if validation result is successful with type guard\n */\nexport function isValidationSuccess<T>(\n result: PluginValidationResult<T>\n): result is PluginValidationResult<T> & { valid: true; data: T } {\n return result.valid === true && result.data !== undefined;\n}\n\n/**\n * Get validation error summary\n */\nexport function getValidationSummary(result: PluginValidationResult): string {\n if (result.valid) {\n return 'Validation successful';\n }\n\n if (!result.errors || result.errors.length === 0) {\n return 'Validation failed with unknown error';\n }\n\n return formatErrorSummary(result.errors);\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
export { C as ComponentDefinition, a as ComponentSchemaConfig, c as convertToJsonSchema, b as createComponentSchema, d as createComponentSchemaObject, e as exportSchemaToFile, f as fixSchemaReferences } from './schema-utils-CbCi6dEk.js';
|
|
2
2
|
export { AddWarningFunction, GenerationWarning } from './types/warnings.js';
|
|
3
|
-
export { DEFAULT_ERROR_CONFIG, ERROR_EMOJIS, ErrorFormatterConfig,
|
|
3
|
+
export { DEFAULT_ERROR_CONFIG, ERROR_EMOJIS, ErrorFormatterConfig, calculatePosition, clearComponentNamesCache, createErrorConfig, createJsonParseError, extractStandardComponentNames, formatErrorMessage, formatErrorSummary, getLiteralValue, getObjectSchemaPropertyNames, getSchemaMetadata, groupErrorsByPath, isLiteralSchema, isObjectSchema, isUnionSchema, transformValueError, transformValueErrors } from './validation/unified/index.js';
|
|
4
|
+
export { T as TransformedError, V as ValidationError, a as ValidationResult } from './types-BWFZ7OaO.js';
|
|
5
|
+
export { ComponentValidationError, ComponentValidationResult, ComponentVersion, ComponentVersionMap, CustomComponent, DuplicateComponentError, PluginValidationOptions, PluginValidationResult, RenderContext, RenderFunction, createComponent, createVersion, getValidationSummary, isValidationSuccess, resolveComponentVersion, validateCustomComponentProps } from './plugin/index.js';
|
|
4
6
|
export { ParsedSemver, compareSemver, isValidSemver, latestVersion, parseSemver } from './utils/semver.js';
|
|
5
7
|
import '@sinclair/typebox';
|
|
6
8
|
import '@sinclair/typebox/value';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Service configuration types for external integrations (e.g. Highcharts export server)
|
|
12
|
+
*/
|
|
13
|
+
interface HighchartsServiceConfig {
|
|
14
|
+
serverUrl?: string;
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
interface ServicesConfig {
|
|
18
|
+
highcharts?: HighchartsServiceConfig;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type { HighchartsServiceConfig, ServicesConfig };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ComponentValidationError,
|
|
3
|
+
DuplicateComponentError,
|
|
4
|
+
createComponent,
|
|
5
|
+
createVersion,
|
|
6
|
+
getValidationSummary,
|
|
7
|
+
isValidationSuccess,
|
|
8
|
+
resolveComponentVersion,
|
|
9
|
+
validateCustomComponentProps
|
|
10
|
+
} from "./chunk-HS3W472G.js";
|
|
1
11
|
import {
|
|
2
12
|
convertToJsonSchema,
|
|
3
13
|
createComponentSchema,
|
|
@@ -32,16 +42,20 @@ import {
|
|
|
32
42
|
transformValueErrors
|
|
33
43
|
} from "./chunk-ZKD5BAMU.js";
|
|
34
44
|
export {
|
|
45
|
+
ComponentValidationError,
|
|
35
46
|
DEFAULT_ERROR_CONFIG,
|
|
47
|
+
DuplicateComponentError,
|
|
36
48
|
ERROR_EMOJIS,
|
|
37
49
|
calculatePosition,
|
|
38
50
|
clearComponentNamesCache,
|
|
39
51
|
compareSemver,
|
|
40
52
|
convertToJsonSchema,
|
|
53
|
+
createComponent,
|
|
41
54
|
createComponentSchema,
|
|
42
55
|
createComponentSchemaObject,
|
|
43
56
|
createErrorConfig,
|
|
44
57
|
createJsonParseError,
|
|
58
|
+
createVersion,
|
|
45
59
|
exportSchemaToFile,
|
|
46
60
|
extractStandardComponentNames,
|
|
47
61
|
fixSchemaReferences,
|
|
@@ -50,14 +64,18 @@ export {
|
|
|
50
64
|
getLiteralValue,
|
|
51
65
|
getObjectSchemaPropertyNames,
|
|
52
66
|
getSchemaMetadata,
|
|
67
|
+
getValidationSummary,
|
|
53
68
|
groupErrorsByPath,
|
|
54
69
|
isLiteralSchema,
|
|
55
70
|
isObjectSchema,
|
|
56
71
|
isUnionSchema,
|
|
57
72
|
isValidSemver,
|
|
73
|
+
isValidationSuccess,
|
|
58
74
|
latestVersion,
|
|
59
75
|
parseSemver,
|
|
76
|
+
resolveComponentVersion,
|
|
60
77
|
transformValueError,
|
|
61
|
-
transformValueErrors
|
|
78
|
+
transformValueErrors,
|
|
79
|
+
validateCustomComponentProps
|
|
62
80
|
};
|
|
63
81
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { TSchema, Static } from '@sinclair/typebox';
|
|
2
|
+
import { AddWarningFunction } from '../types/warnings.js';
|
|
3
|
+
import { V as ValidationError, a as ValidationResult } from '../types-BWFZ7OaO.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Render function context - parameters passed to render.
|
|
7
|
+
* TTheme defaults to unknown so format-specific packages can narrow it.
|
|
8
|
+
*/
|
|
9
|
+
interface RenderContext<T, TTheme = unknown> {
|
|
10
|
+
/** The validated props for this component */
|
|
11
|
+
props: T;
|
|
12
|
+
/** The resolved theme configuration */
|
|
13
|
+
theme: TTheme;
|
|
14
|
+
/** Function to add warnings during processing */
|
|
15
|
+
addWarning: AddWarningFunction;
|
|
16
|
+
/** For container components: processed nested children */
|
|
17
|
+
children?: unknown[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Render function that transforms custom component props into standard components.
|
|
21
|
+
*/
|
|
22
|
+
type RenderFunction<TProps, TComponentDefinition = unknown, TTheme = unknown> = (context: RenderContext<TProps, TTheme>) => Promise<TComponentDefinition[]>;
|
|
23
|
+
/**
|
|
24
|
+
* A single version entry within a versioned component.
|
|
25
|
+
* Each version is self-contained with its own schema, render, and metadata.
|
|
26
|
+
*/
|
|
27
|
+
interface ComponentVersion<TComponentDefinition = unknown, TPropsSchema extends TSchema = TSchema, TTheme = unknown> {
|
|
28
|
+
/** TypeBox schema for props validation */
|
|
29
|
+
propsSchema: TPropsSchema;
|
|
30
|
+
/** Async render function to transform props into standard components */
|
|
31
|
+
render: RenderFunction<Static<TPropsSchema>, TComponentDefinition, TTheme>;
|
|
32
|
+
/** Whether this version supports nested children */
|
|
33
|
+
hasChildren?: boolean;
|
|
34
|
+
/** Optional description for this version */
|
|
35
|
+
description?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Map of semver version strings to their version definitions.
|
|
39
|
+
*/
|
|
40
|
+
type ComponentVersionMap<TComponentDefinition = unknown, TTheme = unknown> = Record<string, ComponentVersion<TComponentDefinition, any, TTheme>>;
|
|
41
|
+
/**
|
|
42
|
+
* Custom component definition with multiple semver-keyed versions.
|
|
43
|
+
*/
|
|
44
|
+
interface CustomComponent<TComponentDefinition = unknown, TVersions extends ComponentVersionMap<TComponentDefinition, any> = ComponentVersionMap<TComponentDefinition, any>, TName extends string = string> {
|
|
45
|
+
/** Unique name for the component type */
|
|
46
|
+
name: TName;
|
|
47
|
+
/** Map of semver version strings to version definitions */
|
|
48
|
+
versions: TVersions;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create a single version entry with full type inference for props.
|
|
52
|
+
*/
|
|
53
|
+
declare function createVersion<TPropsSchema extends TSchema, TComponentDefinition = unknown, TTheme = unknown>(version: ComponentVersion<TComponentDefinition, TPropsSchema, TTheme>): ComponentVersion<TComponentDefinition, TPropsSchema, TTheme>;
|
|
54
|
+
/**
|
|
55
|
+
* Create a custom component with multiple semver-keyed versions.
|
|
56
|
+
*/
|
|
57
|
+
declare function createComponent<TComponentDefinition = unknown, TVersions extends ComponentVersionMap<TComponentDefinition, any> = ComponentVersionMap<TComponentDefinition, any>, TName extends string = string>(component: CustomComponent<TComponentDefinition, TVersions, TName>): CustomComponent<TComponentDefinition, TVersions, TName>;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the correct version entry for a component.
|
|
61
|
+
*
|
|
62
|
+
* - If `requestedVersion` is provided and found, return it.
|
|
63
|
+
* - If `requestedVersion` is provided but missing, throw with available versions.
|
|
64
|
+
* - If `requestedVersion` is absent, return the latest semver version.
|
|
65
|
+
*/
|
|
66
|
+
declare function resolveComponentVersion(componentName: string, versions: ComponentVersionMap, requestedVersion?: string): ComponentVersion;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Error thrown when attempting to register a component with a duplicate name
|
|
70
|
+
*/
|
|
71
|
+
declare class DuplicateComponentError extends Error {
|
|
72
|
+
readonly componentName: string;
|
|
73
|
+
readonly code = "DUPLICATE_COMPONENT";
|
|
74
|
+
constructor(componentName: string);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Custom validation error class
|
|
78
|
+
*/
|
|
79
|
+
declare class ComponentValidationError extends Error {
|
|
80
|
+
errors: ValidationError[];
|
|
81
|
+
props: unknown;
|
|
82
|
+
constructor(errors: ValidationError[], props?: unknown);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Validation options for plugin components
|
|
87
|
+
*/
|
|
88
|
+
interface PluginValidationOptions {
|
|
89
|
+
/** Apply Value.Clean to remove unknown properties */
|
|
90
|
+
clean?: boolean;
|
|
91
|
+
/** Apply Value.Default to add default values */
|
|
92
|
+
applyDefaults?: boolean;
|
|
93
|
+
/** Maximum number of errors to collect */
|
|
94
|
+
maxErrors?: number;
|
|
95
|
+
/** Original JSON string for position calculation */
|
|
96
|
+
jsonString?: string;
|
|
97
|
+
/** Calculate line/column for JSON errors */
|
|
98
|
+
calculatePosition?: boolean;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Generic validation result extending the base non-generic one
|
|
102
|
+
*/
|
|
103
|
+
interface PluginValidationResult<T = unknown> extends ValidationResult {
|
|
104
|
+
data?: T;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Component-specific validation result
|
|
108
|
+
*/
|
|
109
|
+
interface ComponentValidationResult<T = unknown> extends PluginValidationResult<T> {
|
|
110
|
+
componentName?: string;
|
|
111
|
+
isCustomComponent?: boolean;
|
|
112
|
+
success?: boolean;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Base validation: schema check + optional clean/defaults
|
|
116
|
+
*/
|
|
117
|
+
declare function validateAgainstSchema<T extends TSchema>(schema: T, data: unknown, options?: PluginValidationOptions): PluginValidationResult<Static<T>>;
|
|
118
|
+
/**
|
|
119
|
+
* Validate custom component props against a TypeBox schema.
|
|
120
|
+
* Hardcodes clean + applyDefaults for consistent plugin behavior.
|
|
121
|
+
*/
|
|
122
|
+
declare function validateCustomComponentProps<T>(componentSchema: TSchema, config: unknown, options?: PluginValidationOptions & {
|
|
123
|
+
componentName?: string;
|
|
124
|
+
}): ComponentValidationResult<T>;
|
|
125
|
+
/**
|
|
126
|
+
* Utility to check if validation result is successful with type guard
|
|
127
|
+
*/
|
|
128
|
+
declare function isValidationSuccess<T>(result: PluginValidationResult<T>): result is PluginValidationResult<T> & {
|
|
129
|
+
valid: true;
|
|
130
|
+
data: T;
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Get validation error summary
|
|
134
|
+
*/
|
|
135
|
+
declare function getValidationSummary(result: PluginValidationResult): string;
|
|
136
|
+
|
|
137
|
+
export { ComponentValidationError, type ComponentValidationResult, type ComponentVersion, type ComponentVersionMap, type CustomComponent, DuplicateComponentError, type PluginValidationOptions, type PluginValidationResult, type RenderContext, type RenderFunction, createComponent, createVersion, getValidationSummary, isValidationSuccess, resolveComponentVersion, validateAgainstSchema, validateCustomComponentProps };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ComponentValidationError,
|
|
3
|
+
DuplicateComponentError,
|
|
4
|
+
createComponent,
|
|
5
|
+
createVersion,
|
|
6
|
+
getValidationSummary,
|
|
7
|
+
isValidationSuccess,
|
|
8
|
+
resolveComponentVersion,
|
|
9
|
+
validateAgainstSchema,
|
|
10
|
+
validateCustomComponentProps
|
|
11
|
+
} from "../chunk-HS3W472G.js";
|
|
12
|
+
import "../chunk-244MHDOZ.js";
|
|
13
|
+
import "../chunk-ZKD5BAMU.js";
|
|
14
|
+
export {
|
|
15
|
+
ComponentValidationError,
|
|
16
|
+
DuplicateComponentError,
|
|
17
|
+
createComponent,
|
|
18
|
+
createVersion,
|
|
19
|
+
getValidationSummary,
|
|
20
|
+
isValidationSuccess,
|
|
21
|
+
resolveComponentVersion,
|
|
22
|
+
validateAgainstSchema,
|
|
23
|
+
validateCustomComponentProps
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface ValidationError {
|
|
2
|
+
path: string;
|
|
3
|
+
message: string;
|
|
4
|
+
code?: string;
|
|
5
|
+
value?: unknown;
|
|
6
|
+
suggestion?: string;
|
|
7
|
+
line?: number;
|
|
8
|
+
column?: number;
|
|
9
|
+
}
|
|
10
|
+
interface ValidationResult {
|
|
11
|
+
valid: boolean;
|
|
12
|
+
errors?: ValidationError[];
|
|
13
|
+
}
|
|
14
|
+
/** Backward-compat alias used by pptx shared */
|
|
15
|
+
type TransformedError = ValidationError;
|
|
16
|
+
|
|
17
|
+
export type { TransformedError as T, ValidationError as V, ValidationResult as a };
|
|
@@ -1,22 +1,8 @@
|
|
|
1
1
|
import { ValueError } from '@sinclair/typebox/value';
|
|
2
|
+
import { V as ValidationError } from '../../types-BWFZ7OaO.js';
|
|
3
|
+
export { T as TransformedError, a as ValidationResult } from '../../types-BWFZ7OaO.js';
|
|
2
4
|
import { TSchema, TLiteral, TObject, TUnion } from '@sinclair/typebox';
|
|
3
5
|
|
|
4
|
-
interface ValidationError {
|
|
5
|
-
path: string;
|
|
6
|
-
message: string;
|
|
7
|
-
code?: string;
|
|
8
|
-
value?: unknown;
|
|
9
|
-
suggestion?: string;
|
|
10
|
-
line?: number;
|
|
11
|
-
column?: number;
|
|
12
|
-
}
|
|
13
|
-
interface ValidationResult {
|
|
14
|
-
valid: boolean;
|
|
15
|
-
errors?: ValidationError[];
|
|
16
|
-
}
|
|
17
|
-
/** Backward-compat alias used by pptx shared */
|
|
18
|
-
type TransformedError = ValidationError;
|
|
19
|
-
|
|
20
6
|
interface ErrorFormatterConfig {
|
|
21
7
|
includeEmojis?: boolean;
|
|
22
8
|
verbosity?: 'minimal' | 'normal' | 'detailed';
|
|
@@ -63,4 +49,4 @@ declare function getSchemaMetadata(schema: TSchema): {
|
|
|
63
49
|
literal?: unknown;
|
|
64
50
|
};
|
|
65
51
|
|
|
66
|
-
export { DEFAULT_ERROR_CONFIG, ERROR_EMOJIS, type ErrorFormatterConfig,
|
|
52
|
+
export { DEFAULT_ERROR_CONFIG, ERROR_EMOJIS, type ErrorFormatterConfig, ValidationError, calculatePosition, clearComponentNamesCache, createErrorConfig, createJsonParseError, extractStandardComponentNames, formatErrorMessage, formatErrorSummary, getLiteralValue, getObjectSchemaPropertyNames, getSchemaMetadata, groupErrorsByPath, isLiteralSchema, isObjectSchema, isUnionSchema, transformValueError, transformValueErrors };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@json-to-office/shared",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Format-agnostic shared types, schemas and validation utilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -31,6 +31,11 @@
|
|
|
31
31
|
"import": "./dist/cache/index.js",
|
|
32
32
|
"default": "./dist/cache/index.js"
|
|
33
33
|
},
|
|
34
|
+
"./plugin": {
|
|
35
|
+
"types": "./dist/plugin/index.d.ts",
|
|
36
|
+
"import": "./dist/plugin/index.js",
|
|
37
|
+
"default": "./dist/plugin/index.js"
|
|
38
|
+
},
|
|
34
39
|
"./*": {
|
|
35
40
|
"types": "./dist/*.d.ts",
|
|
36
41
|
"import": "./dist/*.js",
|