{"version":3,"file":"object.cjs","names":["BaseSchema","OptionalSchema","validatePrimitive"],"sources":["../../src/schemas/object.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { BaseSchema, OptionalSchema, validatePrimitive } from \"../core/base\";\nimport type { CombinedStandardProps, SchemaDefinition, SchemaPrimitive } from \"../core/types\";\n\nfunction isPromiseLike<T>(value: T | Promise<T>): value is Promise<T> {\n  return typeof value === \"object\" && value !== null && \"then\" in value;\n}\n\nexport class ObjectSchemaType<T extends Record<string, unknown>> extends BaseSchema<unknown, T> {\n  readonly definition: SchemaDefinition;\n  private _strict = false;\n  private _passthrough = false;\n\n  constructor(definition: SchemaDefinition) {\n    super();\n    this.definition = definition;\n    this._rebuildJsonSchema();\n  }\n\n  private _rebuildJsonSchema(): void {\n    const properties: Record<string, any> = {};\n    const required: string[] = [];\n\n    for (const key in this.definition) {\n      const schemaItem = this.definition[key];\n      const isOptional = schemaItem instanceof OptionalSchema;\n\n      const hasDefault = schemaItem instanceof BaseSchema && \"_isDefault\" in schemaItem;\n      if (!isOptional && !hasDefault) {\n        required.push(key);\n      }\n\n      if (typeof schemaItem === \"string\") {\n        properties[key] = { type: schemaItem };\n      } else if (schemaItem instanceof BaseSchema) {\n        properties[key] = schemaItem.jsonSchema;\n      } else if (typeof schemaItem === \"object\" && schemaItem !== null) {\n        properties[key] = new ObjectSchemaType(schemaItem as SchemaDefinition).jsonSchema;\n      }\n    }\n\n    this.jsonSchema = {\n      type: \"object\",\n      properties,\n      required: required.length > 0 ? required : undefined,\n      additionalProperties: this._strict ? false : this._passthrough ? true : undefined,\n    };\n  }\n\n  /**\n   * Disallow unknown keys; produce issues if present.\n   * @returns {ObjectSchemaType<T>} New strict object schema.\n   */\n  strict(): ObjectSchemaType<T> {\n    const schema = new ObjectSchemaType<T>(this.definition);\n    schema._strict = true;\n    schema._rebuildJsonSchema();\n    return schema;\n  }\n\n  /**\n   * Pass through unknown keys without validating them.\n   * @returns {ObjectSchemaType<T & Record<string, unknown>>} Passthrough schema.\n   */\n  passthrough(): ObjectSchemaType<T & Record<string, unknown>> {\n    const schema = new ObjectSchemaType<T & Record<string, unknown>>(this.definition);\n    schema._passthrough = true;\n    schema._rebuildJsonSchema();\n    return schema;\n  }\n\n  /**\n   * Extend with additional fields.\n   * @param {SchemaDefinition} extension Extra fields to add.\n   * @returns {ObjectSchemaType<any>} New extended object schema.\n   */\n  extend(extension: SchemaDefinition): ObjectSchemaType<any> {\n    return new ObjectSchemaType<any>({ ...this.definition, ...extension });\n  }\n\n  /**\n   * Merge with another object schema.\n   * @param {ObjectSchemaType<any>} other Schema to merge in.\n   * @returns {ObjectSchemaType<any>} Merged object schema.\n   */\n  merge(other: ObjectSchemaType<any>): ObjectSchemaType<any> {\n    return new ObjectSchemaType<any>({ ...this.definition, ...other.definition });\n  }\n\n  /**\n   * Pick selected fields.\n   * @param {readonly (keyof T & string)[]} keys Field names to keep.\n   * @returns {ObjectSchemaType<any>} Picked object schema.\n   */\n  pick(keys: readonly (keyof T & string)[]): ObjectSchemaType<any> {\n    const next: SchemaDefinition = {};\n    for (const k of keys) {\n      if (k in this.definition) {\n        next[k] = this.definition[k]!;\n      }\n    }\n    return new ObjectSchemaType<any>(next);\n  }\n\n  /**\n   * Omit selected fields.\n   * @param {readonly (keyof T & string)[]} keys Field names to remove.\n   * @returns {ObjectSchemaType<any>} Object schema without those fields.\n   */\n  omit(keys: readonly (keyof T & string)[]): ObjectSchemaType<any> {\n    const next: SchemaDefinition = { ...this.definition };\n    for (const k of keys) {\n      delete next[k];\n    }\n    return new ObjectSchemaType<any>(next);\n  }\n\n  /**\n   * Make every field optional.\n   * @returns {ObjectSchemaType<Partial<T>>} Partial object schema.\n   */\n  partial(): ObjectSchemaType<Partial<T>> {\n    const next: SchemaDefinition = {};\n    for (const key in this.definition) {\n      const item = this.definition[key];\n      if (item instanceof BaseSchema) {\n        next[key] = item instanceof OptionalSchema ? item : item.optional();\n      } else {\n        next[key] = item!;\n      }\n    }\n    return new ObjectSchemaType<Partial<T>>(next);\n  }\n\n  get [\"~standard\"](): CombinedStandardProps<unknown, T> {\n    return {\n      version: 1,\n      vendor: \"h-schema\",\n      jsonSchema: {\n        input: () => this.jsonSchema,\n        output: () => this.jsonSchema,\n      },\n      validate: (value: unknown): StandardSchemaV1.Result<T> => {\n        if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n          return {\n            issues: [\n              {\n                message:\n                  \"Expected object, received \" +\n                  (value === null ? \"null\" : Array.isArray(value) ? \"array\" : typeof value),\n              },\n            ],\n          };\n        }\n\n        const obj = value as Record<string, unknown>;\n        const result: Record<string, unknown> = {};\n        const issues: StandardSchemaV1.Issue[] = [];\n\n        const pending: Promise<void>[] = [];\n\n        const appendResult = (key: string, validated: StandardSchemaV1.Result<unknown>): void => {\n          if (\"issues\" in validated) {\n            issues.push(\n              ...(validated.issues ?? []).map((issue) => ({\n                ...issue,\n                path: issue.path ? [key, ...issue.path] : [key],\n              })),\n            );\n          } else {\n            result[key] = validated.value;\n          }\n        };\n\n        for (const key in this.definition) {\n          const schemaItem = this.definition[key];\n          const isOptional = schemaItem instanceof OptionalSchema;\n          const hasDefault = schemaItem instanceof BaseSchema && \"_isDefault\" in schemaItem;\n\n          if (!(key in obj) && !isOptional && !hasDefault) {\n            issues.push({ message: `Missing required property: ${key}`, path: [key] });\n            continue;\n          }\n\n          if (!(key in obj) && !hasDefault) {\n            continue;\n          }\n\n          const input = key in obj ? obj[key] : undefined;\n          if (typeof schemaItem === \"string\") {\n            const sp = schemaItem as SchemaPrimitive;\n            if (!validatePrimitive(sp, input)) {\n              issues.push({\n                message: `Invalid type for property ${key}: expected ${sp}`,\n                path: [key],\n              });\n            } else {\n              result[key] = input;\n            }\n          } else if (schemaItem instanceof BaseSchema) {\n            const validated = schemaItem[\"~standard\"].validate(input) as\n              | StandardSchemaV1.Result<unknown>\n              | Promise<StandardSchemaV1.Result<unknown>>;\n            if (isPromiseLike(validated)) {\n              pending.push(validated.then((resolved) => appendResult(key, resolved)));\n            } else {\n              appendResult(key, validated);\n            }\n          } else if (typeof schemaItem === \"object\" && schemaItem !== null) {\n            const nested = new ObjectSchemaType(schemaItem as SchemaDefinition);\n            const validated = nested[\"~standard\"].validate(input);\n            if (isPromiseLike(validated)) {\n              pending.push(validated.then((resolved) => appendResult(key, resolved)));\n            } else {\n              appendResult(key, validated);\n            }\n          }\n        }\n\n        const finish = () => {\n          if (this._strict) {\n            for (const key of Object.keys(obj)) {\n              if (!(key in this.definition)) {\n                issues.push({ message: `Unknown key: ${key}`, path: [key] });\n              }\n            }\n          } else if (this._passthrough) {\n            for (const key of Object.keys(obj)) {\n              if (!(key in this.definition)) {\n                result[key] = obj[key];\n              }\n            }\n          }\n\n          if (issues.length > 0) {\n            return { issues };\n          }\n\n          return { value: result as T };\n        };\n\n        return pending.length > 0 ? Promise.all(pending).then(finish) : finish();\n      },\n      types: {\n        input: {} as unknown,\n        output: {} as T,\n      },\n    };\n  }\n}\n"],"mappings":"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"}