@api-client/core 0.18.15 → 0.18.16
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/build/src/modeling/importers/SchemaFilteringStrategy.d.ts.map +1 -1
- package/build/src/modeling/importers/SchemaFilteringStrategy.js +3 -9
- package/build/src/modeling/importers/SchemaFilteringStrategy.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/data/models/example-generator-api.json +17 -17
- package/package.json +1 -1
- package/src/modeling/importers/SchemaFilteringStrategy.ts +3 -11
- package/tests/unit/modeling/importers/schema_filtering.spec.ts +47 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaFilteringStrategy.d.ts","sourceRoot":"","sources":["../../../../src/modeling/importers/SchemaFilteringStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAElC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;IAE3E;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE3B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED;;GAEG;AACH,qBAAa,uBAAuB;IACtB,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE,sBAA2B;IAExD;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAiCpE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;
|
|
1
|
+
{"version":3,"file":"SchemaFilteringStrategy.d.ts","sourceRoot":"","sources":["../../../../src/modeling/importers/SchemaFilteringStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAElC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;IAE3E;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE3B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED;;GAEG;AACH,qBAAa,uBAAuB;IACtB,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE,sBAA2B;IAExD;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAiCpE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA4BhC;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;CAenE;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB;IAC/B;;OAEG;;IAUH;;OAEG;;IAiBH;;OAEG;;CAIK,CAAA"}
|
|
@@ -62,15 +62,9 @@ export class SchemaFilteringStrategy {
|
|
|
62
62
|
if (this.isEmptyObjectSchema(schema)) {
|
|
63
63
|
return true;
|
|
64
64
|
}
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
typeof schema.allOf[0] === 'object' &&
|
|
69
|
-
'$ref' in schema.allOf[0] &&
|
|
70
|
-
!schema.properties &&
|
|
71
|
-
!schema.additionalProperties) {
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
65
|
+
// Note: We removed the check for single allOf with $ref as this represents
|
|
66
|
+
// valid schema inheritance/extension patterns (e.g., BlogPosting extending SocialMediaPosting)
|
|
67
|
+
// Such schemas should be included as they define meaningful type hierarchies
|
|
74
68
|
// Check for schemas that only have description and type but no structure
|
|
75
69
|
if (schema.type === 'object' &&
|
|
76
70
|
schema.description &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaFilteringStrategy.js","sourceRoot":"","sources":["../../../../src/modeling/importers/SchemaFilteringStrategy.ts"],"names":[],"mappings":"AAqCA;;GAEG;AACH,MAAM,OAAO,uBAAuB;IACd;IAApB,YAAoB,UAAkC,EAAE;QAApC,YAAO,GAAP,OAAO,CAA6B;IAAG,CAAC;IAE5D;;OAEG;IACH,mBAAmB,CAAC,MAAmB,EAAE,QAAiB;QACxD,gCAAgC;QAChC,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,2BAA2B;QAC3B,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBACnD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC3E,OAAO,IAAI,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACzE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,wBAAwB,IAAI,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnF,OAAO,IAAI,CAAA;QACb,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,MAAmB;QAC7C,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,QAAQ;YACxB,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YACnE,CAAC,MAAM,CAAC,oBAAoB;YAC5B,CAAC,MAAM,CAAC,iBAAiB;YACzB,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,MAAM,CAAC,EAAE;YACV,CAAC,MAAM,CAAC,IAAI;YACZ,CAAC,MAAM,CAAC,IAAI;YACZ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM;YACxB,CAAC,MAAM,CAAC,aAAa;YACrB,CAAC,MAAM,CAAC,aAAa,CACtB,CAAA;IACH,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,MAAmB;QAClD,mFAAmF;QACnF,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"SchemaFilteringStrategy.js","sourceRoot":"","sources":["../../../../src/modeling/importers/SchemaFilteringStrategy.ts"],"names":[],"mappings":"AAqCA;;GAEG;AACH,MAAM,OAAO,uBAAuB;IACd;IAApB,YAAoB,UAAkC,EAAE;QAApC,YAAO,GAAP,OAAO,CAA6B;IAAG,CAAC;IAE5D;;OAEG;IACH,mBAAmB,CAAC,MAAmB,EAAE,QAAiB;QACxD,gCAAgC;QAChC,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,2BAA2B;QAC3B,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBACnD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC3E,OAAO,IAAI,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACzE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,wBAAwB,IAAI,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnF,OAAO,IAAI,CAAA;QACb,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,MAAmB;QAC7C,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,QAAQ;YACxB,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YACnE,CAAC,MAAM,CAAC,oBAAoB;YAC5B,CAAC,MAAM,CAAC,iBAAiB;YACzB,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,MAAM,CAAC,EAAE;YACV,CAAC,MAAM,CAAC,IAAI;YACZ,CAAC,MAAM,CAAC,IAAI;YACZ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM;YACxB,CAAC,MAAM,CAAC,aAAa;YACrB,CAAC,MAAM,CAAC,aAAa,CACtB,CAAA;IACH,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,MAAmB;QAClD,mFAAmF;QACnF,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,2EAA2E;QAC3E,+FAA+F;QAC/F,6EAA6E;QAE7E,yEAAyE;QACzE,IACE,MAAM,CAAC,IAAI,KAAK,QAAQ;YACxB,MAAM,CAAC,WAAW;YAClB,CAAC,MAAM,CAAC,UAAU;YAClB,CAAC,MAAM,CAAC,oBAAoB;YAC5B,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,MAAM,CAAC,KAAK;YACb,CAAC,MAAM,CAAC,KAAK;YACb,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;gBAC3G,CAAC,EACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,MAAmB,EAAE,QAAiB;QACvD,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClE,OAAO,cAAc,QAAQ,4BAA4B,CAAA;QAC3D,CAAC;QAED,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO,yDAAyD,CAAA;QAClE,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,OAAO,qEAAqE,CAAA;QAC9E,CAAC;QAED,OAAO,kCAAkC,CAAA;IAC3C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC;;OAEG;IACH,YAAY,EAAE,IAAI,uBAAuB,CAAC;QACxC,mBAAmB,EAAE,IAAI;QACzB,wBAAwB,EAAE,IAAI;QAC9B,eAAe,EAAE;YACf,gBAAgB,EAAE,+BAA+B;YACjD,SAAS,EAAE,yDAAyD;SACrE;KACF,CAAC;IAEF;;OAEG;IACH,iBAAiB,EAAE,IAAI,uBAAuB,CAAC;QAC7C,mBAAmB,EAAE,IAAI;QACzB,wBAAwB,EAAE,IAAI;QAC9B,qBAAqB,EAAE,CAAC,MAAmB,EAAE,EAAE;YAC7C,0FAA0F;YAC1F,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,QAAQ;gBACxB,CAAC,MAAM,CAAC,UAAU;gBAClB,CAAC,MAAM,CAAC,oBAAoB;gBAC5B,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CACjB,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,YAAY,IAAI,SAAS,IAAI,SAAS,CAAC,UAAU,CAClG,CACF,CAAA;QACH,CAAC;KACF,CAAC;IAEF;;OAEG;IACH,YAAY,EAAE,IAAI,uBAAuB,CAAC;QACxC,mBAAmB,EAAE,IAAI;KAC1B,CAAC;CACM,CAAA","sourcesContent":["import type { JSONSchema7 } from 'json-schema'\n\n/**\n * Configuration options for schema filtering during import.\n */\nexport interface SchemaFilteringOptions {\n /**\n * Whether to exclude schemas that are empty objects with no properties.\n * Default: false\n */\n excludeEmptyObjects?: boolean\n\n /**\n * Whether to exclude schemas that only serve as conceptual markers.\n * These are typically schemas with only type: \"object\" and description\n * but no properties, constraints, or meaningful structure.\n * Default: false\n */\n excludeConceptualMarkers?: boolean\n\n /**\n * Custom predicate function to determine if a schema should be excluded.\n * Return true to exclude the schema from import.\n */\n customExclusionFilter?: (schema: JSONSchema7, schemaId?: string) => boolean\n\n /**\n * List of schema IDs to explicitly exclude.\n */\n excludeSchemaIds?: string[]\n\n /**\n * Patterns to match against schema titles or IDs for exclusion.\n */\n excludePatterns?: RegExp[]\n}\n\n/**\n * Strategy class for determining which schemas should be filtered out during import.\n */\nexport class SchemaFilteringStrategy {\n constructor(private options: SchemaFilteringOptions = {}) {}\n\n /**\n * Determines whether a schema should be excluded from import.\n */\n shouldExcludeSchema(schema: JSONSchema7, schemaId?: string): boolean {\n // Check explicit exclusion list\n if (schemaId && this.options.excludeSchemaIds?.includes(schemaId)) {\n return true\n }\n\n // Check pattern exclusions\n if (schemaId && this.options.excludePatterns) {\n for (const pattern of this.options.excludePatterns) {\n if (pattern.test(schemaId) || (schema.title && pattern.test(schema.title))) {\n return true\n }\n }\n }\n\n // Check for empty objects\n if (this.options.excludeEmptyObjects && this.isEmptyObjectSchema(schema)) {\n return true\n }\n\n // Check for conceptual markers\n if (this.options.excludeConceptualMarkers && this.isConceptualMarkerSchema(schema)) {\n return true\n }\n\n // Apply custom filter\n if (this.options.customExclusionFilter?.(schema, schemaId)) {\n return true\n }\n\n return false\n }\n\n /**\n * Checks if a schema represents an empty object with no meaningful structure.\n */\n private isEmptyObjectSchema(schema: JSONSchema7): boolean {\n return (\n schema.type === 'object' &&\n (!schema.properties || Object.keys(schema.properties).length === 0) &&\n !schema.additionalProperties &&\n !schema.patternProperties &&\n !schema.allOf &&\n !schema.oneOf &&\n !schema.anyOf &&\n !schema.if &&\n !schema.then &&\n !schema.else &&\n !schema.required?.length &&\n !schema.minProperties &&\n !schema.maxProperties\n )\n }\n\n /**\n * Checks if a schema is likely a conceptual marker with no structural value.\n */\n private isConceptualMarkerSchema(schema: JSONSchema7): boolean {\n // Check for schemas that are just empty objects or only have allOf with references\n if (this.isEmptyObjectSchema(schema)) {\n return true\n }\n\n // Note: We removed the check for single allOf with $ref as this represents\n // valid schema inheritance/extension patterns (e.g., BlogPosting extending SocialMediaPosting)\n // Such schemas should be included as they define meaningful type hierarchies\n\n // Check for schemas that only have description and type but no structure\n if (\n schema.type === 'object' &&\n schema.description &&\n !schema.properties &&\n !schema.additionalProperties &&\n !schema.allOf &&\n !schema.oneOf &&\n !schema.anyOf &&\n Object.keys(schema).filter((key) => !['$schema', '$id', 'title', 'description', 'type'].includes(key)).length ===\n 0\n ) {\n return true\n }\n\n return false\n }\n\n /**\n * Gets a human-readable reason why a schema was excluded.\n */\n getExclusionReason(schema: JSONSchema7, schemaId?: string): string {\n if (schemaId && this.options.excludeSchemaIds?.includes(schemaId)) {\n return `Schema ID '${schemaId}' is in the exclusion list`\n }\n\n if (this.isEmptyObjectSchema(schema)) {\n return 'Schema is an empty object with no structural definition'\n }\n\n if (this.isConceptualMarkerSchema(schema)) {\n return 'Schema appears to be a conceptual marker with no concrete structure'\n }\n\n return 'Schema excluded by custom filter'\n }\n}\n\n/**\n * Predefined filtering strategies for common use cases.\n */\nexport const FILTERING_STRATEGIES = {\n /**\n * Strategy for API modeling - excludes schemas that don't contribute to API structure.\n */\n API_MODELING: new SchemaFilteringStrategy({\n excludeEmptyObjects: true,\n excludeConceptualMarkers: true,\n excludePatterns: [\n /.*Enumeration$/, // Exclude *Enumeration schemas\n /.*Type$/, // Exclude conceptual *Type schemas that are just markers\n ],\n }),\n\n /**\n * Strategy for database modeling - very strict, only includes schemas with concrete properties.\n */\n DATABASE_MODELING: new SchemaFilteringStrategy({\n excludeEmptyObjects: true,\n excludeConceptualMarkers: true,\n customExclusionFilter: (schema: JSONSchema7) => {\n // For database modeling, exclude anything that doesn't have properties or clear structure\n return (\n schema.type === 'object' &&\n !schema.properties &&\n !schema.additionalProperties &&\n !schema.allOf?.some(\n (subSchema) => typeof subSchema === 'object' && 'properties' in subSchema && subSchema.properties\n )\n )\n },\n }),\n\n /**\n * Conservative strategy - only excludes obviously empty schemas.\n */\n CONSERVATIVE: new SchemaFilteringStrategy({\n excludeEmptyObjects: true,\n }),\n} as const\n"]}
|