json2pptx-schema 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../versions/v1/defaults.ts","../runtime/errors.ts","../runtime/migrate.ts","../runtime/normalize.ts","../runtime/validate.ts","../versions/v1/schema.json","../runtime/parse.ts","../versions/v1/types.ts"],"sourcesContent":["import type {\n V1Document,\n V1Outline,\n V1SchemaVersion,\n V1Shadow,\n V1Theme\n} from './types'\n\nexport const DEFAULT_SCHEMA_VERSION: V1SchemaVersion = '1.0.0'\nexport const DEFAULT_TITLE = '未命名演示文稿'\nexport const DEFAULT_WIDTH = 1000\nexport const DEFAULT_HEIGHT = 562.5\n\nexport const DEFAULT_THEME_SHADOW: V1Shadow = {\n h: 3,\n v: 3,\n blur: 2,\n color: '#808080'\n}\n\nexport const DEFAULT_THEME_OUTLINE: V1Outline = {\n width: 2,\n color: '#525252',\n style: 'solid'\n}\n\nexport const DEFAULT_THEME: V1Theme = {\n themeColors: [],\n fontColor: '#333',\n fontName: '',\n backgroundColor: '#fff',\n shadow: DEFAULT_THEME_SHADOW,\n outline: DEFAULT_THEME_OUTLINE\n}\n\nexport const DEFAULT_SLIDE_TYPE = 'content'\nexport const DEFAULT_SLIDE_REMARK = ''\n\nexport const DEFAULT_TEXT_COLOR = '#333'\nexport const DEFAULT_ELEMENT_ROTATE = 0\nexport const DEFAULT_IMAGE_FIXED_RATIO = true\nexport const DEFAULT_SHAPE_FIXED_RATIO = false\nexport const DEFAULT_LINE_STYLE = 'solid'\nexport const DEFAULT_LINE_WIDTH = 2\n\nexport const LEGACY_SLIDE_TYPE_MAP: Record<string, string> = {\n agenda: 'contents',\n section: 'transition',\n ending: 'end'\n}\n\nexport const V1_DEFAULTS: Pick<\n V1Document,\n 'schemaVersion' | 'title' | 'width' | 'height'\n> & {\n theme: V1Theme\n} = {\n schemaVersion: DEFAULT_SCHEMA_VERSION,\n title: DEFAULT_TITLE,\n width: DEFAULT_WIDTH,\n height: DEFAULT_HEIGHT,\n theme: DEFAULT_THEME\n}\n","export type SchemaValidationIssue = {\n code: string\n path: string\n message: string\n keyword?: string\n params?: Record<string, unknown>\n}\n\nexport class SchemaValidationError extends Error {\n readonly issues: SchemaValidationIssue[]\n\n constructor(issues: SchemaValidationIssue[], message = 'Schema validation failed') {\n super(message)\n this.name = 'SchemaValidationError'\n this.issues = issues\n }\n}\n\nexport class UnsupportedSchemaVersionError extends Error {\n readonly code = 'UNSUPPORTED_SCHEMA_VERSION'\n readonly supportedVersion: string\n readonly receivedVersion?: string\n\n constructor(receivedVersion: unknown, supportedVersion: string) {\n const received =\n receivedVersion === undefined || receivedVersion === null\n ? undefined\n : String(receivedVersion)\n\n super(\n received\n ? `Unsupported schema version: ${received}. Supported version: ${supportedVersion}.`\n : `Unsupported schema version. Supported version: ${supportedVersion}.`\n )\n\n this.name = 'UnsupportedSchemaVersionError'\n this.supportedVersion = supportedVersion\n this.receivedVersion = received\n }\n}\n","import {\n DEFAULT_SCHEMA_VERSION,\n LEGACY_SLIDE_TYPE_MAP\n} from '../versions/v1/defaults'\nimport type { V1SchemaVersion } from '../versions/v1/types'\nimport { UnsupportedSchemaVersionError } from './errors'\n\ntype UnknownRecord = Record<string, unknown>\n\nconst V1_VERSION_EQUIVALENTS = new Set(['1', '1.0', '1.0.0'])\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value)\n }\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nfunction normalizeVersion(value: unknown): V1SchemaVersion | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n if (value === 1) return DEFAULT_SCHEMA_VERSION\n return null\n }\n\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n if (!trimmed) return null\n if (V1_VERSION_EQUIVALENTS.has(trimmed)) return DEFAULT_SCHEMA_VERSION\n return null\n}\n\nfunction migrateSlideType(type: unknown): unknown {\n if (typeof type !== 'string') return type\n const normalized = type.trim().toLowerCase()\n return LEGACY_SLIDE_TYPE_MAP[normalized] ?? type\n}\n\nexport function migrateDocument(\n input: unknown,\n toVersion: V1SchemaVersion = DEFAULT_SCHEMA_VERSION\n): unknown {\n if (!isRecord(input)) return input\n\n const migrated = cloneValue(input) as UnknownRecord\n const incomingVersion = migrated.schemaVersion ?? migrated.version\n\n if (incomingVersion === undefined) {\n migrated.schemaVersion = toVersion\n } else {\n const normalizedVersion = normalizeVersion(incomingVersion)\n if (!normalizedVersion || normalizedVersion !== toVersion) {\n throw new UnsupportedSchemaVersionError(incomingVersion, toVersion)\n }\n migrated.schemaVersion = toVersion\n }\n\n delete migrated.version\n\n if (isRecord(migrated.theme)) {\n const theme = migrated.theme\n if (typeof theme.fontname === 'string' && theme.fontName === undefined) {\n theme.fontName = theme.fontname\n delete theme.fontname\n }\n }\n\n if (Array.isArray(migrated.slides)) {\n migrated.slides = migrated.slides.map((slide) => {\n if (!isRecord(slide)) return slide\n const nextSlide = cloneValue(slide)\n nextSlide.type = migrateSlideType(nextSlide.type)\n return nextSlide\n })\n }\n\n return migrated\n}\n","import {\n DEFAULT_ELEMENT_ROTATE,\n DEFAULT_HEIGHT,\n DEFAULT_IMAGE_FIXED_RATIO,\n DEFAULT_LINE_STYLE,\n DEFAULT_LINE_WIDTH,\n DEFAULT_SCHEMA_VERSION,\n DEFAULT_SHAPE_FIXED_RATIO,\n DEFAULT_SLIDE_REMARK,\n DEFAULT_SLIDE_TYPE,\n DEFAULT_TEXT_COLOR,\n DEFAULT_THEME,\n DEFAULT_THEME_OUTLINE,\n DEFAULT_THEME_SHADOW,\n DEFAULT_TITLE,\n DEFAULT_WIDTH,\n LEGACY_SLIDE_TYPE_MAP\n} from '../versions/v1/defaults'\nimport type {\n V1Document,\n V1DocumentInput,\n V1Element,\n V1ImageElement,\n V1LineElement,\n V1Outline,\n V1Shadow,\n V1ShapeElement,\n V1Slide,\n V1SlideBackground,\n V1TextElement,\n V1Theme\n} from '../versions/v1/types'\n\ntype UnknownRecord = Record<string, unknown>\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value)\n }\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nfunction asString(value: unknown, fallback: string): string {\n return typeof value === 'string' ? value : fallback\n}\n\nfunction asNumber(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback\n}\n\nfunction asBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === 'boolean' ? value : fallback\n}\n\nfunction asPair(value: unknown, fallback: [number, number]): [number, number] {\n if (!Array.isArray(value) || value.length < 2) return fallback\n return [asNumber(value[0], fallback[0]), asNumber(value[1], fallback[1])]\n}\n\nfunction asLinePoints(value: unknown): [string, string] {\n if (!Array.isArray(value)) return ['', '']\n const first = typeof value[0] === 'string' ? value[0] : ''\n const second = typeof value[1] === 'string' ? value[1] : ''\n return [first, second]\n}\n\nfunction normalizeShadow(value: unknown): V1Shadow {\n const source = isRecord(value) ? value : {}\n return {\n ...source,\n h: asNumber(source.h, DEFAULT_THEME_SHADOW.h),\n v: asNumber(source.v, DEFAULT_THEME_SHADOW.v),\n blur: asNumber(source.blur, DEFAULT_THEME_SHADOW.blur),\n color: asString(source.color, DEFAULT_THEME_SHADOW.color)\n }\n}\n\nfunction normalizeOutline(value: unknown): V1Outline {\n const source = isRecord(value) ? value : {}\n return {\n ...source,\n width: asNumber(source.width, DEFAULT_THEME_OUTLINE.width),\n color: asString(source.color, DEFAULT_THEME_OUTLINE.color),\n style: asString(source.style, DEFAULT_THEME_OUTLINE.style)\n }\n}\n\nfunction normalizeTheme(value: unknown): V1Theme {\n const source = isRecord(value) ? value : {}\n const themeColors = Array.isArray(source.themeColors)\n ? source.themeColors.filter((item): item is string => typeof item === 'string')\n : DEFAULT_THEME.themeColors.slice()\n\n return {\n ...source,\n themeColors,\n fontColor: asString(source.fontColor, DEFAULT_THEME.fontColor),\n fontName: asString(source.fontName, DEFAULT_THEME.fontName),\n backgroundColor: asString(source.backgroundColor, DEFAULT_THEME.backgroundColor),\n shadow: normalizeShadow(source.shadow),\n outline: normalizeOutline(source.outline)\n }\n}\n\nfunction normalizeBackground(\n value: unknown,\n fallbackColor: string\n): V1SlideBackground | undefined {\n if (!isRecord(value)) return undefined\n\n const type =\n typeof value.type === 'string' && value.type.trim().length > 0\n ? value.type\n : 'solid'\n\n const normalized: V1SlideBackground = {\n ...value,\n type\n }\n\n if (type === 'solid' && typeof normalized.color !== 'string') {\n normalized.color = fallbackColor\n }\n\n return normalized\n}\n\nfunction normalizeElement(\n value: unknown,\n slideIndex: number,\n elementIndex: number,\n theme: V1Theme\n): V1Element {\n const fallbackId = `slide-${slideIndex + 1}-element-${elementIndex + 1}`\n\n if (!isRecord(value)) {\n return {\n type: 'unknown',\n id: fallbackId,\n left: 0,\n top: 0,\n rotate: DEFAULT_ELEMENT_ROTATE\n }\n }\n\n const type =\n typeof value.type === 'string' && value.type.trim().length > 0\n ? value.type\n : 'unknown'\n\n const base = {\n ...value,\n type,\n id: asString(value.id, fallbackId),\n left: asNumber(value.left, 0),\n top: asNumber(value.top, 0),\n rotate: asNumber(value.rotate, DEFAULT_ELEMENT_ROTATE)\n }\n\n if (type === 'text') {\n const textElement: V1TextElement = {\n ...base,\n type: 'text',\n width: asNumber(value.width, 0),\n height: asNumber(value.height, 0),\n content: asString(value.content, ''),\n defaultColor: asString(value.defaultColor, theme.fontColor || DEFAULT_TEXT_COLOR),\n defaultFontName: asString(value.defaultFontName, theme.fontName),\n vertical: asBoolean(value.vertical, false)\n }\n return textElement\n }\n\n if (type === 'shape') {\n const width = asNumber(value.width, 0)\n const height = asNumber(value.height, 0)\n const shapeElement: V1ShapeElement = {\n ...base,\n type: 'shape',\n width,\n height,\n path: asString(value.path, ''),\n viewBox: asPair(value.viewBox, [width, height]),\n fill: asString(value.fill, ''),\n fixedRatio: asBoolean(value.fixedRatio, DEFAULT_SHAPE_FIXED_RATIO)\n }\n return shapeElement\n }\n\n if (type === 'line') {\n const lineElement: V1LineElement = {\n ...base,\n type: 'line',\n width: asNumber(value.width, DEFAULT_LINE_WIDTH),\n start: asPair(value.start, [0, 0]),\n end: asPair(value.end, [0, 0]),\n points: asLinePoints(value.points),\n color: asString(value.color, '#000000'),\n style: asString(value.style, DEFAULT_LINE_STYLE)\n }\n return lineElement\n }\n\n if (type === 'image') {\n const imageElement: V1ImageElement = {\n ...base,\n type: 'image',\n width: asNumber(value.width, 0),\n height: asNumber(value.height, 0),\n src: asString(value.src, ''),\n fixedRatio: asBoolean(value.fixedRatio, DEFAULT_IMAGE_FIXED_RATIO)\n }\n return imageElement\n }\n\n return base\n}\n\nfunction normalizeSlide(value: unknown, index: number, theme: V1Theme): V1Slide {\n if (!isRecord(value)) {\n return {\n id: `slide-${index + 1}`,\n type: DEFAULT_SLIDE_TYPE,\n remark: DEFAULT_SLIDE_REMARK,\n elements: []\n }\n }\n\n const rawType = typeof value.type === 'string' ? value.type.trim() : ''\n const normalizedType =\n rawType && LEGACY_SLIDE_TYPE_MAP[rawType.toLowerCase()]\n ? LEGACY_SLIDE_TYPE_MAP[rawType.toLowerCase()]\n : rawType || DEFAULT_SLIDE_TYPE\n\n const sourceElements = Array.isArray(value.elements) ? value.elements : []\n const elements = sourceElements.map((element, elementIndex) =>\n normalizeElement(element, index, elementIndex, theme)\n )\n\n const background = normalizeBackground(value.background, theme.backgroundColor)\n\n return {\n ...value,\n id: asString(value.id, `slide-${index + 1}`),\n type: normalizedType,\n remark: asString(value.remark, DEFAULT_SLIDE_REMARK),\n background,\n elements\n }\n}\n\nexport function normalizeDocument(input: V1DocumentInput): V1Document {\n const source = cloneValue(input)\n\n if (!isRecord(source)) {\n return {\n schemaVersion: DEFAULT_SCHEMA_VERSION,\n title: DEFAULT_TITLE,\n width: DEFAULT_WIDTH,\n height: DEFAULT_HEIGHT,\n theme: normalizeTheme(undefined),\n slides: []\n }\n }\n\n const theme = normalizeTheme(source.theme)\n const sourceSlides = Array.isArray(source.slides) ? source.slides : []\n const slides = sourceSlides.map((slide, index) => normalizeSlide(slide, index, theme))\n\n const normalized = {\n ...source,\n schemaVersion: DEFAULT_SCHEMA_VERSION,\n title: asString(source.title, DEFAULT_TITLE),\n width: asNumber(source.width, DEFAULT_WIDTH),\n height: asNumber(source.height, DEFAULT_HEIGHT),\n theme,\n slides\n } as V1Document\n\n delete (normalized as UnknownRecord).version\n\n return normalized\n}\n","import Ajv, { type ErrorObject } from 'ajv'\nimport schemaV1 from '../versions/v1/schema.json'\nimport type { V1DocumentInput } from '../versions/v1/types'\nimport { SchemaValidationError, type SchemaValidationIssue } from './errors'\n\nconst ajv = new Ajv({\n allErrors: true,\n strict: false,\n allowUnionTypes: true\n})\n\nconst validateV1 = ajv.compile(schemaV1)\n\nfunction mapError(error: ErrorObject): SchemaValidationIssue {\n return {\n code: 'SCHEMA_VALIDATION_ERROR',\n path: error.instancePath || '/',\n message: error.message ?? 'Invalid value',\n keyword: error.keyword,\n params:\n error.params && typeof error.params === 'object'\n ? (error.params as Record<string, unknown>)\n : undefined\n }\n}\n\nexport function validateDocument(input: unknown): V1DocumentInput {\n const valid = validateV1(input)\n if (!valid) {\n const issues = (validateV1.errors ?? []).map(mapError)\n throw new SchemaValidationError(issues)\n }\n\n return input as V1DocumentInput\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://json2pptx.dev/schema/v1\",\n \"title\": \"json2pptx document schema v1\",\n \"type\": \"object\",\n \"required\": [\"slides\"],\n \"properties\": {\n \"schemaVersion\": {\n \"const\": \"1.0.0\"\n },\n \"version\": {\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"width\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"height\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"theme\": {\n \"$ref\": \"#/definitions/theme\"\n },\n \"slides\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/slide\"\n }\n }\n },\n \"additionalProperties\": true,\n \"definitions\": {\n \"shadow\": {\n \"type\": \"object\",\n \"required\": [\"h\", \"v\", \"blur\", \"color\"],\n \"properties\": {\n \"h\": { \"type\": \"number\" },\n \"v\": { \"type\": \"number\" },\n \"blur\": { \"type\": \"number\" },\n \"color\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true\n },\n \"outline\": {\n \"type\": \"object\",\n \"required\": [\"width\", \"color\", \"style\"],\n \"properties\": {\n \"width\": { \"type\": \"number\" },\n \"color\": { \"type\": \"string\" },\n \"style\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true\n },\n \"gradientStop\": {\n \"type\": \"object\",\n \"required\": [\"pos\", \"color\"],\n \"properties\": {\n \"pos\": { \"type\": \"number\" },\n \"color\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true\n },\n \"gradient\": {\n \"type\": \"object\",\n \"required\": [\"type\", \"rotate\", \"colors\"],\n \"properties\": {\n \"type\": { \"type\": \"string\" },\n \"rotate\": { \"type\": \"number\" },\n \"colors\": {\n \"type\": \"array\",\n \"minItems\": 2,\n \"items\": {\n \"$ref\": \"#/definitions/gradientStop\"\n }\n }\n },\n \"additionalProperties\": true\n },\n \"theme\": {\n \"type\": \"object\",\n \"properties\": {\n \"themeColors\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"fontColor\": { \"type\": \"string\" },\n \"fontName\": { \"type\": \"string\" },\n \"backgroundColor\": { \"type\": \"string\" },\n \"shadow\": { \"$ref\": \"#/definitions/shadow\" },\n \"outline\": { \"$ref\": \"#/definitions/outline\" }\n },\n \"additionalProperties\": true\n },\n \"pair\": {\n \"type\": \"array\",\n \"minItems\": 2,\n \"maxItems\": 2,\n \"items\": { \"type\": \"number\" }\n },\n \"linePoints\": {\n \"type\": \"array\",\n \"minItems\": 2,\n \"maxItems\": 2,\n \"items\": { \"type\": \"string\" }\n },\n \"shapeText\": {\n \"type\": \"object\",\n \"required\": [\"content\"],\n \"properties\": {\n \"content\": { \"type\": \"string\" },\n \"defaultColor\": { \"type\": \"string\" },\n \"defaultFontName\": { \"type\": \"string\" },\n \"align\": { \"type\": \"string\" },\n \"lineHeight\": { \"type\": \"number\" },\n \"type\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true\n },\n \"clip\": {\n \"type\": \"object\",\n \"required\": [\"shape\", \"range\"],\n \"properties\": {\n \"shape\": { \"type\": \"string\" },\n \"range\": {\n \"type\": \"array\",\n \"minItems\": 2,\n \"maxItems\": 2,\n \"items\": {\n \"$ref\": \"#/definitions/pair\"\n }\n }\n },\n \"additionalProperties\": true\n },\n \"filters\": {\n \"type\": \"object\",\n \"properties\": {\n \"opacity\": {\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" }\n ]\n },\n \"grayscale\": {\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" }\n ]\n },\n \"blur\": {\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" }\n ]\n },\n \"sepia\": {\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" }\n ]\n },\n \"saturate\": {\n \"oneOf\": [\n { \"type\": \"string\" },\n { \"type\": \"number\" }\n ]\n }\n },\n \"additionalProperties\": true\n },\n \"tableCellStyle\": {\n \"type\": \"object\",\n \"properties\": {\n \"fontname\": { \"type\": \"string\" },\n \"color\": { \"type\": \"string\" },\n \"align\": { \"type\": \"string\" },\n \"fontsize\": { \"type\": \"string\" },\n \"backcolor\": { \"type\": \"string\" }\n },\n \"additionalProperties\": true\n },\n \"tableCell\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"colspan\": { \"type\": \"number\" },\n \"rowspan\": { \"type\": \"number\" },\n \"text\": { \"type\": \"string\" },\n \"style\": { \"$ref\": \"#/definitions/tableCellStyle\" }\n },\n \"additionalProperties\": true\n },\n \"element\": {\n \"type\": \"object\",\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": { \"type\": \"string\" },\n \"id\": { \"type\": \"string\" },\n \"groupId\": { \"type\": \"string\" },\n \"left\": { \"type\": \"number\" },\n \"top\": { \"type\": \"number\" },\n \"width\": { \"type\": \"number\" },\n \"height\": { \"type\": \"number\" },\n \"rotate\": { \"type\": \"number\" },\n \"lock\": { \"type\": \"boolean\" },\n \"opacity\": { \"type\": \"number\" },\n \"flipH\": { \"type\": \"boolean\" },\n \"flipV\": { \"type\": \"boolean\" },\n \"shadow\": { \"$ref\": \"#/definitions/shadow\" },\n \"outline\": { \"$ref\": \"#/definitions/outline\" }\n },\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": { \"const\": \"text\" }\n }\n },\n \"then\": {\n \"required\": [\"content\", \"left\", \"top\", \"width\", \"height\"],\n \"properties\": {\n \"content\": { \"type\": \"string\" },\n \"defaultColor\": { \"type\": \"string\" },\n \"defaultFontName\": { \"type\": \"string\" },\n \"fill\": { \"type\": \"string\" },\n \"lineHeight\": { \"type\": \"number\" },\n \"paragraphSpace\": { \"type\": \"number\" },\n \"textType\": { \"type\": \"string\" },\n \"vertical\": { \"type\": \"boolean\" },\n \"wordSpace\": { \"type\": \"number\" }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": { \"const\": \"shape\" }\n }\n },\n \"then\": {\n \"required\": [\n \"path\",\n \"viewBox\",\n \"fill\",\n \"left\",\n \"top\",\n \"width\",\n \"height\"\n ],\n \"properties\": {\n \"path\": { \"type\": \"string\" },\n \"viewBox\": { \"$ref\": \"#/definitions/pair\" },\n \"fill\": { \"type\": \"string\" },\n \"fixedRatio\": { \"type\": \"boolean\" },\n \"keypoints\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"number\" }\n },\n \"pathFormula\": { \"type\": \"string\" },\n \"gradient\": { \"$ref\": \"#/definitions/gradient\" },\n \"special\": { \"type\": \"boolean\" },\n \"text\": { \"$ref\": \"#/definitions/shapeText\" }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": { \"const\": \"line\" }\n }\n },\n \"then\": {\n \"required\": [\n \"start\",\n \"end\",\n \"points\",\n \"color\",\n \"width\",\n \"left\",\n \"top\"\n ],\n \"properties\": {\n \"start\": { \"$ref\": \"#/definitions/pair\" },\n \"end\": { \"$ref\": \"#/definitions/pair\" },\n \"points\": { \"$ref\": \"#/definitions/linePoints\" },\n \"broken\": { \"$ref\": \"#/definitions/pair\" },\n \"color\": { \"type\": \"string\" },\n \"style\": { \"type\": \"string\" },\n \"width\": { \"type\": \"number\" }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": { \"const\": \"image\" }\n }\n },\n \"then\": {\n \"required\": [\"src\", \"left\", \"top\", \"width\", \"height\"],\n \"properties\": {\n \"src\": { \"type\": \"string\" },\n \"fixedRatio\": { \"type\": \"boolean\" },\n \"clip\": { \"$ref\": \"#/definitions/clip\" },\n \"filters\": { \"$ref\": \"#/definitions/filters\" },\n \"imageType\": { \"type\": \"string\" },\n \"radius\": { \"type\": \"number\" },\n \"colorMask\": { \"type\": \"string\" }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": { \"const\": \"table\" }\n }\n },\n \"then\": {\n \"required\": [\"left\", \"top\", \"width\", \"height\"],\n \"properties\": {\n \"colWidths\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"number\" }\n },\n \"data\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/tableCell\"\n }\n }\n },\n \"cellMinHeight\": { \"type\": \"number\" }\n }\n }\n }\n ],\n \"additionalProperties\": true\n },\n \"slideBackground\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": { \"type\": \"string\" },\n \"color\": { \"type\": \"string\" },\n \"src\": { \"type\": \"string\" },\n \"gradient\": { \"$ref\": \"#/definitions/gradient\" }\n },\n \"additionalProperties\": true\n },\n \"slide\": {\n \"type\": \"object\",\n \"required\": [\"elements\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"type\": { \"type\": \"string\" },\n \"remark\": { \"type\": \"string\" },\n \"background\": { \"$ref\": \"#/definitions/slideBackground\" },\n \"elements\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/element\"\n }\n }\n },\n \"additionalProperties\": true\n }\n }\n}\n","import type { V1Document } from '../versions/v1/types'\nimport { migrateDocument } from './migrate'\nimport { normalizeDocument } from './normalize'\nimport { validateDocument } from './validate'\n\nexport function parseDocument(input: unknown): V1Document {\n const migrated = migrateDocument(input)\n const validated = validateDocument(migrated)\n return normalizeDocument(validated)\n}\n","export const V1_SCHEMA_VERSION = '1.0.0' as const\n\nexport type V1SchemaVersion = typeof V1_SCHEMA_VERSION\n\nexport type V1Outline = {\n width: number\n color: string\n style: string\n [key: string]: unknown\n}\n\nexport type V1Shadow = {\n h: number\n v: number\n blur: number\n color: string\n [key: string]: unknown\n}\n\nexport type V1GradientStop = {\n pos: number\n color: string\n [key: string]: unknown\n}\n\nexport type V1Gradient = {\n type: string\n rotate: number\n colors: V1GradientStop[]\n [key: string]: unknown\n}\n\nexport type V1ThemeInput = {\n themeColors?: string[]\n fontColor?: string\n fontName?: string\n backgroundColor?: string\n shadow?: Partial<V1Shadow>\n outline?: Partial<V1Outline>\n [key: string]: unknown\n}\n\nexport type V1Theme = {\n themeColors: string[]\n fontColor: string\n fontName: string\n backgroundColor: string\n shadow: V1Shadow\n outline: V1Outline\n [key: string]: unknown\n}\n\nexport type V1SlideBackgroundInput = {\n type?: string\n color?: string\n src?: string\n gradient?: V1Gradient\n [key: string]: unknown\n}\n\nexport type V1SlideBackground = {\n type: string\n color?: string\n src?: string\n gradient?: V1Gradient\n [key: string]: unknown\n}\n\nexport type V1ElementBaseInput<T extends string = string> = {\n type: T\n id?: string\n groupId?: string\n left?: number\n top?: number\n width?: number\n height?: number\n rotate?: number\n lock?: boolean\n opacity?: number\n flipH?: boolean\n flipV?: boolean\n outline?: Partial<V1Outline>\n shadow?: Partial<V1Shadow>\n [key: string]: unknown\n}\n\nexport type V1ElementBase<T extends string = string> = V1ElementBaseInput<T> & {\n id: string\n left: number\n top: number\n rotate: number\n}\n\nexport type V1ShapeText = {\n content: string\n defaultColor?: string\n defaultFontName?: string\n align?: string\n lineHeight?: number\n type?: string\n [key: string]: unknown\n}\n\nexport type V1TextElementInput = V1ElementBaseInput<'text'> & {\n content?: string\n defaultColor?: string\n defaultFontName?: string\n fill?: string\n lineHeight?: number\n paragraphSpace?: number\n textType?: string\n vertical?: boolean\n wordSpace?: number\n}\n\nexport type V1TextElement = V1ElementBase<'text'> & {\n width: number\n height: number\n content: string\n defaultColor: string\n defaultFontName: string\n fill?: string\n lineHeight?: number\n paragraphSpace?: number\n textType?: string\n vertical: boolean\n wordSpace?: number\n}\n\nexport type V1ShapeElementInput = V1ElementBaseInput<'shape'> & {\n path?: string\n viewBox?: [number, number]\n fill?: string\n fixedRatio?: boolean\n keypoints?: number[]\n pathFormula?: string\n gradient?: V1Gradient\n special?: boolean\n text?: V1ShapeText\n}\n\nexport type V1ShapeElement = V1ElementBase<'shape'> & {\n width: number\n height: number\n path: string\n viewBox: [number, number]\n fill: string\n fixedRatio: boolean\n keypoints?: number[]\n pathFormula?: string\n gradient?: V1Gradient\n special?: boolean\n text?: V1ShapeText\n}\n\nexport type V1LineElementInput = V1ElementBaseInput<'line'> & {\n start?: [number, number]\n end?: [number, number]\n points?: string[]\n broken?: [number, number]\n color?: string\n style?: string\n width?: number\n}\n\nexport type V1LineElement = V1ElementBase<'line'> & {\n start: [number, number]\n end: [number, number]\n points: [string, string]\n broken?: [number, number]\n color: string\n style: string\n width: number\n}\n\nexport type V1ImageClip = {\n shape: string\n range: [[number, number], [number, number]]\n [key: string]: unknown\n}\n\nexport type V1ImageFilters = {\n opacity?: string | number\n grayscale?: string | number\n blur?: string | number\n sepia?: string | number\n saturate?: string | number\n [key: string]: unknown\n}\n\nexport type V1ImageElementInput = V1ElementBaseInput<'image'> & {\n src?: string\n fixedRatio?: boolean\n clip?: V1ImageClip\n filters?: V1ImageFilters\n imageType?: string\n radius?: number\n colorMask?: string\n}\n\nexport type V1ImageElement = V1ElementBase<'image'> & {\n width: number\n height: number\n src: string\n fixedRatio: boolean\n clip?: V1ImageClip\n filters?: V1ImageFilters\n imageType?: string\n radius?: number\n colorMask?: string\n}\n\nexport type V1UnknownElementInput = V1ElementBaseInput<string>\n\nexport type V1UnknownElement = V1ElementBase<string>\n\nexport type V1ElementInput =\n | V1TextElementInput\n | V1ShapeElementInput\n | V1LineElementInput\n | V1ImageElementInput\n | V1UnknownElementInput\n\nexport type V1Element =\n | V1TextElement\n | V1ShapeElement\n | V1LineElement\n | V1ImageElement\n | V1UnknownElement\n\nexport type V1SlideInput = {\n id?: string\n type?: string\n remark?: string\n background?: V1SlideBackgroundInput\n elements?: V1ElementInput[]\n [key: string]: unknown\n}\n\nexport type V1Slide = {\n id: string\n type: string\n remark: string\n background?: V1SlideBackground\n elements: V1Element[]\n [key: string]: unknown\n}\n\nexport type V1DocumentInput = {\n schemaVersion?: string\n version?: string | number\n title?: string\n width?: number\n height?: number\n theme?: V1ThemeInput\n slides: V1SlideInput[]\n [key: string]: unknown\n}\n\nexport type V1Document = {\n schemaVersion: V1SchemaVersion\n title: string\n width: number\n height: number\n theme: V1Theme\n slides: V1Slide[]\n [key: string]: unknown\n}\n"],"mappings":"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","names":["isRecord","cloneValue"]}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "json2pptx-schema",
3
+ "version": "0.1.0",
4
+ "description": "Schema parsing pipeline for json2pptx documents (migrate -> validate -> normalize).",
5
+ "license": "MIT",
6
+ "homepage": "https://json2pptx.henryge.com/",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/gezhiheng/json2ppt-editor/"
10
+ },
11
+ "main": "dist/index.cjs",
12
+ "module": "dist/index.mjs",
13
+ "types": "dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.mjs",
18
+ "require": "./dist/index.cjs",
19
+ "default": "./dist/index.mjs"
20
+ }
21
+ },
22
+ "typesVersions": {
23
+ "*": {
24
+ "*": [
25
+ "dist/index.d.ts"
26
+ ]
27
+ }
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "README.md"
32
+ ],
33
+ "sideEffects": false,
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "scripts": {
38
+ "build": "tsup",
39
+ "dev:watch": "tsup --watch",
40
+ "typecheck": "tsc -p tsconfig.json --noEmit",
41
+ "prepublishOnly": "pnpm run build"
42
+ },
43
+ "dependencies": {
44
+ "ajv": "^8.17.1"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^22.10.2",
48
+ "tsup": "^8.5.1",
49
+ "typescript": "^5.6.3"
50
+ }
51
+ }