@formspec/build 0.1.0-alpha.26 → 0.1.0-alpha.27

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/index.d.ts CHANGED
@@ -28,16 +28,18 @@ import { type JsonSchema2020 } from "./json-schema/ir-generator.js";
28
28
  import type { UISchema } from "./ui-schema/types.js";
29
29
  export type { JsonSchema2020 } from "./json-schema/ir-generator.js";
30
30
  export type { GenerateJsonSchemaOptions } from "./json-schema/generator.js";
31
- export type { AnyField, ArrayField, BooleanField, Conditional, DynamicEnumField, DynamicSchemaField, ExtensionApplicableType, ExtensionDefinition, ExtensionPayloadValue, ExtensionTypeKind, EnumOption, EnumOptionValue, FormElement, FormSpec, Group, NumberField, ObjectField, StaticEnumField, TextField, CustomAnnotationRegistration, CustomConstraintRegistration, CustomTypeRegistration, ConstraintTagRegistration, BuiltinConstraintBroadeningRegistration, BuiltinConstraintName, ConstraintSemanticRole, VocabularyKeywordRegistration, } from "@formspec/core";
31
+ export type { BuiltinConstraintBroadeningRegistration, ConstraintTagRegistration, CustomAnnotationRegistration, CustomConstraintRegistration, CustomTypeRegistration, ExtensionDefinition, AnyField, ArrayField, BooleanField, Conditional, DynamicEnumField, DynamicSchemaField, EnumOption, EnumOptionValue, FormElement, FormSpec, Group, NumberField, ObjectField, StaticEnumField, TextField, } from "@formspec/core";
32
32
  export type { JSONSchema7, JSONSchemaType, ExtendedJSONSchema7, FormSpecSchemaExtensions, } from "./json-schema/types.js";
33
33
  export { createExtensionRegistry } from "./extensions/index.js";
34
34
  export type { ExtensionRegistry } from "./extensions/index.js";
35
35
  export type { UISchema, UISchemaElement, UISchemaElementBase, UISchemaElementType, ControlElement, VerticalLayout, HorizontalLayout, GroupLayout, Categorization, Category, LabelElement, Rule, RuleEffect, RuleConditionSchema, SchemaBasedCondition, } from "./ui-schema/types.js";
36
- export type { StaticSchemaGenerationOptions, GenerateFromClassOptions, GenerateFromClassResult, GenerateSchemasOptions, } from "./generators/class-schema.js";
36
+ export type { GenerateFromClassOptions, GenerateFromClassResult, GenerateSchemasOptions, GenerateSchemasFromProgramOptions, StaticSchemaGenerationOptions, } from "./generators/class-schema.js";
37
37
  export type { BuildMixedAuthoringSchemasOptions, MixedAuthoringSchemas, } from "./generators/mixed-authoring.js";
38
+ export { jsonSchema7Schema } from "./json-schema/schema.js";
39
+ export { uiSchema as uiSchemaSchema } from "./ui-schema/schema.js";
38
40
  export { generateJsonSchema } from "./json-schema/generator.js";
39
41
  export { generateUiSchema } from "./ui-schema/generator.js";
40
- export { generateSchemasFromClass, generateSchemas } from "./generators/class-schema.js";
42
+ export { generateSchemasFromClass, generateSchemas, generateSchemasFromProgram, } from "./generators/class-schema.js";
41
43
  export { buildMixedAuthoringSchemas } from "./generators/mixed-authoring.js";
42
44
  /**
43
45
  * Result of building form schemas.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1141,6 +1141,71 @@ function createExtensionRegistry(extensions) {
1141
1141
  };
1142
1142
  }
1143
1143
 
1144
+ // src/json-schema/schema.ts
1145
+ import { z as z3 } from "zod";
1146
+ var jsonSchemaTypeSchema = z3.enum([
1147
+ "string",
1148
+ "number",
1149
+ "integer",
1150
+ "boolean",
1151
+ "object",
1152
+ "array",
1153
+ "null"
1154
+ ]);
1155
+ var jsonSchema7Schema = z3.lazy(
1156
+ () => z3.object({
1157
+ $schema: z3.string().optional(),
1158
+ $id: z3.string().optional(),
1159
+ $ref: z3.string().optional(),
1160
+ // Metadata
1161
+ title: z3.string().optional(),
1162
+ description: z3.string().optional(),
1163
+ deprecated: z3.boolean().optional(),
1164
+ // Type
1165
+ type: z3.union([jsonSchemaTypeSchema, z3.array(jsonSchemaTypeSchema)]).optional(),
1166
+ // String validation
1167
+ minLength: z3.number().optional(),
1168
+ maxLength: z3.number().optional(),
1169
+ pattern: z3.string().optional(),
1170
+ // Number validation
1171
+ minimum: z3.number().optional(),
1172
+ maximum: z3.number().optional(),
1173
+ exclusiveMinimum: z3.number().optional(),
1174
+ exclusiveMaximum: z3.number().optional(),
1175
+ // Enum
1176
+ enum: z3.array(z3.union([z3.string(), z3.number(), z3.boolean(), z3.null()])).readonly().optional(),
1177
+ const: z3.union([z3.string(), z3.number(), z3.boolean(), z3.null()]).optional(),
1178
+ // Object
1179
+ properties: z3.record(z3.string(), jsonSchema7Schema).optional(),
1180
+ required: z3.array(z3.string()).optional(),
1181
+ additionalProperties: z3.union([z3.boolean(), jsonSchema7Schema]).optional(),
1182
+ // Array
1183
+ items: z3.union([jsonSchema7Schema, z3.array(jsonSchema7Schema)]).optional(),
1184
+ minItems: z3.number().optional(),
1185
+ maxItems: z3.number().optional(),
1186
+ // Composition
1187
+ allOf: z3.array(jsonSchema7Schema).optional(),
1188
+ anyOf: z3.array(jsonSchema7Schema).optional(),
1189
+ oneOf: z3.array(jsonSchema7Schema).optional(),
1190
+ not: jsonSchema7Schema.optional(),
1191
+ // Conditional
1192
+ if: jsonSchema7Schema.optional(),
1193
+ then: jsonSchema7Schema.optional(),
1194
+ else: jsonSchema7Schema.optional(),
1195
+ // Format
1196
+ format: z3.string().optional(),
1197
+ // Default
1198
+ default: z3.unknown().optional(),
1199
+ // FormSpec extensions
1200
+ "x-formspec-source": z3.string().optional(),
1201
+ "x-formspec-params": z3.array(z3.string()).readonly().optional(),
1202
+ "x-formspec-schemaSource": z3.string().optional()
1203
+ }).passthrough()
1204
+ );
1205
+
1206
+ // src/generators/class-schema.ts
1207
+ import "typescript";
1208
+
1144
1209
  // src/analyzer/program.ts
1145
1210
  import * as ts4 from "typescript";
1146
1211
  import * as path from "path";
@@ -3122,6 +3187,18 @@ function detectFormSpecReference(typeNode) {
3122
3187
  }
3123
3188
 
3124
3189
  // src/analyzer/program.ts
3190
+ function createProgramContextFromProgram(program, filePath) {
3191
+ const absolutePath = path.resolve(filePath);
3192
+ const sourceFile = program.getSourceFile(absolutePath) ?? program.getSourceFile(filePath);
3193
+ if (!sourceFile) {
3194
+ throw new Error(`Could not find source file in provided program: ${absolutePath}`);
3195
+ }
3196
+ return {
3197
+ program,
3198
+ checker: program.getTypeChecker(),
3199
+ sourceFile
3200
+ };
3201
+ }
3125
3202
  function createProgramContext(filePath) {
3126
3203
  const absolutePath = path.resolve(filePath);
3127
3204
  const fileDir = path.dirname(absolutePath);
@@ -3192,24 +3269,33 @@ function findTypeAliasByName(sourceFile, aliasName) {
3192
3269
  }
3193
3270
  function analyzeNamedTypeToIR(filePath, typeName, extensionRegistry) {
3194
3271
  const ctx = createProgramContext(filePath);
3272
+ return analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry);
3273
+ }
3274
+ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry) {
3275
+ const analysisFilePath = path.resolve(filePath);
3195
3276
  const classDecl = findClassByName(ctx.sourceFile, typeName);
3196
3277
  if (classDecl !== null) {
3197
- return analyzeClassToIR(classDecl, ctx.checker, filePath, extensionRegistry);
3278
+ return analyzeClassToIR(classDecl, ctx.checker, analysisFilePath, extensionRegistry);
3198
3279
  }
3199
3280
  const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);
3200
3281
  if (interfaceDecl !== null) {
3201
- return analyzeInterfaceToIR(interfaceDecl, ctx.checker, filePath, extensionRegistry);
3282
+ return analyzeInterfaceToIR(interfaceDecl, ctx.checker, analysisFilePath, extensionRegistry);
3202
3283
  }
3203
3284
  const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);
3204
3285
  if (typeAlias !== null) {
3205
- const result = analyzeTypeAliasToIR(typeAlias, ctx.checker, filePath, extensionRegistry);
3286
+ const result = analyzeTypeAliasToIR(
3287
+ typeAlias,
3288
+ ctx.checker,
3289
+ analysisFilePath,
3290
+ extensionRegistry
3291
+ );
3206
3292
  if (result.ok) {
3207
3293
  return result.analysis;
3208
3294
  }
3209
3295
  throw new Error(result.error);
3210
3296
  }
3211
3297
  throw new Error(
3212
- `Type "${typeName}" not found as a class, interface, or type alias in ${filePath}`
3298
+ `Type "${typeName}" not found as a class, interface, or type alias in ${analysisFilePath}`
3213
3299
  );
3214
3300
  }
3215
3301
 
@@ -3345,12 +3431,28 @@ function generateSchemasFromClass(options) {
3345
3431
  );
3346
3432
  }
3347
3433
  function generateSchemas(options) {
3348
- const analysis = analyzeNamedTypeToIR(
3434
+ const ctx = createProgramContext(options.filePath);
3435
+ return generateSchemasFromProgram({
3436
+ ...options,
3437
+ program: ctx.program
3438
+ });
3439
+ }
3440
+ function generateSchemasFromProgram(options) {
3441
+ const ctx = createProgramContextFromProgram(options.program, options.filePath);
3442
+ const analysis = analyzeNamedTypeToIRFromProgramContext(
3443
+ ctx,
3349
3444
  options.filePath,
3350
3445
  options.typeName,
3351
3446
  options.extensionRegistry
3352
3447
  );
3353
- return generateClassSchemas(analysis, { file: options.filePath }, options);
3448
+ return generateClassSchemas(
3449
+ analysis,
3450
+ { file: options.filePath },
3451
+ {
3452
+ extensionRegistry: options.extensionRegistry,
3453
+ vendorPrefix: options.vendorPrefix
3454
+ }
3455
+ );
3354
3456
  }
3355
3457
 
3356
3458
  // src/generators/mixed-authoring.ts
@@ -3556,7 +3658,10 @@ export {
3556
3658
  generateJsonSchema,
3557
3659
  generateSchemas,
3558
3660
  generateSchemasFromClass,
3661
+ generateSchemasFromProgram,
3559
3662
  generateUiSchema,
3663
+ jsonSchema7Schema,
3664
+ uiSchema as uiSchemaSchema,
3560
3665
  writeSchemas
3561
3666
  };
3562
3667
  //# sourceMappingURL=index.js.map