@karibulab/wsdl2tsx 0.23.0 → 0.24.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.
Files changed (2) hide show
  1. package/dist/cli.js +270 -0
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -24357,6 +24357,163 @@ function generateXmlBodyCode(baseNamespacePrefix, namespacesTypeMapping, baseTyp
24357
24357
  const element = baseTypeObject[key];
24358
24358
  debugContext("generateXmlBodyCode", `Procesando propiedad "${key}", typeof element: ${typeof element}, element: ${typeof element === "object" && element !== null ? JSON.stringify(Object.keys(element)).substring(0, 100) : element}`);
24359
24359
  if (typeof element === "string") {
24360
+ const isXsdSimpleType = element.startsWith("xsd:") || element === "string" || element === "int" || element === "boolean" || element === "date" || element === "dateTime";
24361
+ if (!isXsdSimpleType && element.includes(":") && (schemaObject || allComplexTypes)) {
24362
+ const referencedElement = resolveReferencedType(element, schemaObject, allComplexTypes);
24363
+ debugContext("generateXmlBodyCode", `Intentando resolver referencia "${element}", resultado: ${referencedElement ? typeof referencedElement === "object" ? `objeto con ${Object.keys(referencedElement).length} propiedades: ${Object.keys(referencedElement).join(", ")}` : typeof referencedElement : "null"}`);
24364
+ if (referencedElement && typeof referencedElement === "object") {
24365
+ if ("type" in referencedElement && typeof referencedElement.type === "string" && !referencedElement.type.startsWith("xsd:")) {
24366
+ if (referencedElement.type !== element) {
24367
+ const nestedReferencedElement = resolveReferencedType(referencedElement.type, schemaObject, allComplexTypes);
24368
+ if (nestedReferencedElement && typeof nestedReferencedElement === "object") {
24369
+ let finalNestedElement = nestedReferencedElement;
24370
+ if ("type" in nestedReferencedElement && typeof nestedReferencedElement.type === "object" && nestedReferencedElement.type !== null) {
24371
+ finalNestedElement = nestedReferencedElement.type;
24372
+ debugContext("generateXmlBodyCode", `Usando complexType inline del tipo anidado "${referencedElement.type}"`);
24373
+ }
24374
+ const nestedKeys = getFilteredKeys(finalNestedElement);
24375
+ debugContext("generateXmlBodyCode", `Expandiendo tipo anidado "${referencedElement.type}" con ${nestedKeys.length} propiedades: ${nestedKeys.join(", ")}`);
24376
+ const keyLocalName3 = extractLocalName(key);
24377
+ const keyCamelCase3 = toCamelCase2(keyLocalName3);
24378
+ const propertyPath3 = propsInterfaceName ? `${propsInterfaceName}.${keyCamelCase3}` : keyCamelCase3;
24379
+ const nestedProperties = nestedKeys.map((nestedKey) => {
24380
+ const nestedElement = finalNestedElement[nestedKey];
24381
+ if (typeof nestedElement === "object" && nestedElement !== null) {
24382
+ const nestedKeyLocalName = extractLocalName(nestedKey);
24383
+ const nestedKeyCamelCase = toCamelCase2(nestedKeyLocalName);
24384
+ const nestedPropertyPath = `${propertyPath3}.${nestedKeyCamelCase}`;
24385
+ return generateXmlPropertyCode(
24386
+ namespacesTypeMapping,
24387
+ baseNamespacePrefix,
24388
+ nestedKey,
24389
+ nestedElement,
24390
+ key,
24391
+ nestedPropertyPath,
24392
+ true,
24393
+ prefixesMapping,
24394
+ schemaObject,
24395
+ allComplexTypes,
24396
+ tagUsageCollector
24397
+ );
24398
+ } else if (typeof nestedElement === "string") {
24399
+ const nestedKeyLocalName = extractLocalName(nestedKey);
24400
+ const nestedKeyCamelCase = toCamelCase2(nestedKeyLocalName);
24401
+ const nestedPropertyPath = `${propertyPath3}.${nestedKeyCamelCase}`;
24402
+ const nestedNamespacePrefix = getNamespacePrefix(
24403
+ namespacesTypeMapping,
24404
+ baseNamespacePrefix,
24405
+ nestedKey,
24406
+ key,
24407
+ { $qualified: true },
24408
+ prefixesMapping
24409
+ );
24410
+ return `<${nestedNamespacePrefix}.${nestedKeyLocalName}>{props.${nestedPropertyPath}}</${nestedNamespacePrefix}.${nestedKeyLocalName}>`;
24411
+ }
24412
+ return "";
24413
+ }).filter(Boolean).join("\n");
24414
+ const namespacePrefix2 = getNamespacePrefix(
24415
+ namespacesTypeMapping,
24416
+ baseNamespacePrefix,
24417
+ key,
24418
+ null,
24419
+ referencedElement,
24420
+ prefixesMapping
24421
+ );
24422
+ const isQualified = shouldHavePrefix(referencedElement);
24423
+ const wrapperOpenTag = isQualified ? `<${namespacePrefix2}.${keyLocalName3}>` : `<${keyLocalName3}>`;
24424
+ const wrapperCloseTag = isQualified ? `</${namespacePrefix2}.${keyLocalName3}>` : `</${keyLocalName3}>`;
24425
+ return `${wrapperOpenTag}
24426
+ ${nestedProperties}
24427
+ ${wrapperCloseTag}`;
24428
+ }
24429
+ } else {
24430
+ debugContext("generateXmlBodyCode", `\u26A0 Referencia circular detectada: "${element}" -> "${referencedElement.type}", buscando complexType directamente`);
24431
+ const typeLocalName = element.split(":").pop() || element;
24432
+ if (allComplexTypes) {
24433
+ const complexTypeKey = Object.keys(allComplexTypes).find((k) => {
24434
+ const kLocalName = k.split(":").pop() || k;
24435
+ return kLocalName === typeLocalName;
24436
+ });
24437
+ if (complexTypeKey) {
24438
+ const complexType = allComplexTypes[complexTypeKey];
24439
+ if (complexType && typeof complexType === "object") {
24440
+ let finalComplexType = complexType;
24441
+ if ("type" in complexType && typeof complexType.type === "object" && complexType.type !== null) {
24442
+ finalComplexType = complexType.type;
24443
+ }
24444
+ const complexKeys = getFilteredKeys(finalComplexType);
24445
+ debugContext("generateXmlBodyCode", `Usando complexType "${complexTypeKey}" con ${complexKeys.length} propiedades: ${complexKeys.join(", ")}`);
24446
+ const keyLocalName3 = extractLocalName(key);
24447
+ const keyCamelCase3 = toCamelCase2(keyLocalName3);
24448
+ const propertyPath3 = propsInterfaceName ? `${propsInterfaceName}.${keyCamelCase3}` : keyCamelCase3;
24449
+ const complexProperties = complexKeys.map((complexKey) => {
24450
+ const complexElement = finalComplexType[complexKey];
24451
+ if (typeof complexElement === "object" && complexElement !== null) {
24452
+ const complexKeyLocalName = extractLocalName(complexKey);
24453
+ const complexKeyCamelCase = toCamelCase2(complexKeyLocalName);
24454
+ const complexPropertyPath = propsInterfaceName ? `${propsInterfaceName}.${complexKeyCamelCase}` : complexKeyCamelCase;
24455
+ return generateXmlPropertyCode(
24456
+ namespacesTypeMapping,
24457
+ baseNamespacePrefix,
24458
+ complexKey,
24459
+ complexElement,
24460
+ null,
24461
+ // parentKey es null porque estamos en el nivel raíz
24462
+ complexPropertyPath,
24463
+ true,
24464
+ prefixesMapping,
24465
+ schemaObject,
24466
+ allComplexTypes,
24467
+ tagUsageCollector
24468
+ );
24469
+ } else if (typeof complexElement === "string") {
24470
+ const complexKeyLocalName = extractLocalName(complexKey);
24471
+ const complexKeyCamelCase = toCamelCase2(complexKeyLocalName);
24472
+ const complexPropertyPath = propsInterfaceName ? `${propsInterfaceName}.${complexKeyCamelCase}` : complexKeyCamelCase;
24473
+ const complexNamespacePrefix = getNamespacePrefix(
24474
+ namespacesTypeMapping,
24475
+ baseNamespacePrefix,
24476
+ complexKey,
24477
+ null,
24478
+ // parentKey es null porque estamos en el nivel raíz
24479
+ { $qualified: true },
24480
+ prefixesMapping
24481
+ );
24482
+ return `<${complexNamespacePrefix}.${complexKeyLocalName}>{props.${complexPropertyPath}}</${complexNamespacePrefix}.${complexKeyLocalName}>`;
24483
+ }
24484
+ return "";
24485
+ }).filter(Boolean).join("\n");
24486
+ return complexProperties;
24487
+ }
24488
+ }
24489
+ }
24490
+ }
24491
+ }
24492
+ debugContext("generateXmlBodyCode", `Resolviendo referencia "${element}" a tipo complejo con propiedades: ${Object.keys(referencedElement).filter((k) => !k.startsWith("$")).join(", ")}`);
24493
+ const keyLocalName2 = extractLocalName(key);
24494
+ const keyCamelCase2 = toCamelCase2(keyLocalName2);
24495
+ const propertyPath2 = propsInterfaceName ? `${propsInterfaceName}.${keyCamelCase2}` : keyCamelCase2;
24496
+ const elementAsObject = {
24497
+ type: element,
24498
+ $qualified: true
24499
+ };
24500
+ return generateXmlPropertyCode(
24501
+ namespacesTypeMapping,
24502
+ baseNamespacePrefix,
24503
+ key,
24504
+ elementAsObject,
24505
+ null,
24506
+ propertyPath2,
24507
+ true,
24508
+ prefixesMapping,
24509
+ schemaObject,
24510
+ allComplexTypes,
24511
+ tagUsageCollector
24512
+ );
24513
+ } else {
24514
+ debugContext("generateXmlBodyCode", `No se pudo resolver la referencia "${element}", tratando como tipo simple`);
24515
+ }
24516
+ }
24360
24517
  const keyLocalName = extractLocalName(key);
24361
24518
  const keyCamelCase = toCamelCase2(keyLocalName);
24362
24519
  const propertyPath = propsInterfaceName ? `${propsInterfaceName}.${keyCamelCase}` : keyCamelCase;
@@ -24814,6 +24971,43 @@ function preparePropsInterfaceData(typeName, typeObject, allTypesForInterfaces,
24814
24971
  const singleKey = keys[0];
24815
24972
  const element = typeObject[singleKey];
24816
24973
  debugContext("preparePropsInterfaceData", `Procesando propiedad \xFAnica "${singleKey}" (tipo: ${typeof element})`);
24974
+ if (typeof element === "string" && element.includes(":") && !element.startsWith("xsd:") && (schemaObject || allComplexTypes)) {
24975
+ const typeLocalName = typeName.split(":").pop() || typeName;
24976
+ const elementLocalName = element.split(":").pop() || element;
24977
+ if (elementLocalName === typeLocalName && allComplexTypes) {
24978
+ debugContext("preparePropsInterfaceData", `\u26A0 Propiedad \xFAnica "${singleKey}" es string que parece referencia circular "${element}", buscando complexType directamente`);
24979
+ const complexTypeKey = Object.keys(allComplexTypes).find((k) => {
24980
+ const kLocalName = k.split(":").pop() || k;
24981
+ return kLocalName === typeLocalName;
24982
+ });
24983
+ if (complexTypeKey) {
24984
+ const complexType = allComplexTypes[complexTypeKey];
24985
+ if (complexType && typeof complexType === "object") {
24986
+ let finalComplexType = complexType;
24987
+ if ("type" in complexType && typeof complexType.type === "object" && complexType.type !== null) {
24988
+ finalComplexType = complexType.type;
24989
+ }
24990
+ const complexKeys = getFilteredKeys(finalComplexType);
24991
+ debugContext("preparePropsInterfaceData", `Usando complexType "${complexTypeKey}" con ${complexKeys.length} propiedades: ${complexKeys.join(", ")}`);
24992
+ const cleanedComplexType = { ...finalComplexType };
24993
+ Object.keys(cleanedComplexType).forEach((key) => {
24994
+ if (key.startsWith("_")) {
24995
+ delete cleanedComplexType[key];
24996
+ }
24997
+ });
24998
+ if (visitedTypes.has(complexTypeKey)) {
24999
+ debugContext("preparePropsInterfaceData", `\u26A0 ComplexType "${complexTypeKey}" ya fue procesado, evitando recursi\xF3n infinita`);
25000
+ return {
25001
+ properties: [],
25002
+ interfaces: []
25003
+ };
25004
+ }
25005
+ visitedTypes.add(complexTypeKey);
25006
+ return preparePropsInterfaceData(complexTypeKey, cleanedComplexType, allTypesForInterfaces, schemaObject, allComplexTypes, visitedTypes);
25007
+ }
25008
+ }
25009
+ }
25010
+ }
24817
25011
  if (typeof element === "object" && element !== null && "type" in element) {
24818
25012
  const typeValue = element.type;
24819
25013
  debugContext("preparePropsInterfaceData", `Tipo de propiedad: ${typeof typeValue === "string" ? `referencia "${typeValue}"` : `objeto complejo`}`);
@@ -24968,6 +25162,44 @@ function preparePropsInterfaceData(typeName, typeObject, allTypesForInterfaces,
24968
25162
  const nestedLocalNames = nestedKeys.map((k) => extractLocalName(k));
24969
25163
  debugContext("preparePropsInterfaceData", `Tipo anidado resuelto tiene ${nestedKeys.length} propiedades: ${nestedKeys.join(", ")}`);
24970
25164
  debugContext("preparePropsInterfaceData", ` Propiedades del tipo anidado (nombres locales): ${nestedLocalNames.join(" -> ")}`);
25165
+ const typeLocalName2 = typeName.split(":").pop() || typeName;
25166
+ const nestedTypeLocalName = nestedTypeValue.split(":").pop() || nestedTypeValue;
25167
+ const isCircularNestedReference = nestedTypeLocalName === typeLocalName2;
25168
+ if (isCircularNestedReference) {
25169
+ debugContext("preparePropsInterfaceData", `\u26A0 Referencia circular detectada en tipo anidado: "${typeName}" (local: "${typeLocalName2}") -> "${nestedTypeValue}" (local: "${nestedTypeLocalName}"), buscando complexType directamente`);
25170
+ if (allComplexTypes) {
25171
+ const complexTypeKey = Object.keys(allComplexTypes).find((k) => {
25172
+ const kLocalName = k.split(":").pop() || k;
25173
+ return kLocalName === typeLocalName2;
25174
+ });
25175
+ if (complexTypeKey) {
25176
+ const complexType = allComplexTypes[complexTypeKey];
25177
+ if (complexType && typeof complexType === "object") {
25178
+ let finalComplexType = complexType;
25179
+ if ("type" in complexType && typeof complexType.type === "object" && complexType.type !== null) {
25180
+ finalComplexType = complexType.type;
25181
+ }
25182
+ const complexKeys = getFilteredKeys(finalComplexType);
25183
+ debugContext("preparePropsInterfaceData", `Usando complexType "${complexTypeKey}" con ${complexKeys.length} propiedades: ${complexKeys.join(", ")}`);
25184
+ const cleanedComplexType = { ...finalComplexType };
25185
+ Object.keys(cleanedComplexType).forEach((key) => {
25186
+ if (key.startsWith("_")) {
25187
+ delete cleanedComplexType[key];
25188
+ }
25189
+ });
25190
+ if (visitedTypes.has(complexTypeKey)) {
25191
+ debugContext("preparePropsInterfaceData", `\u26A0 ComplexType "${complexTypeKey}" ya fue procesado, evitando recursi\xF3n infinita`);
25192
+ return {
25193
+ properties: [],
25194
+ interfaces: []
25195
+ };
25196
+ }
25197
+ visitedTypes.add(complexTypeKey);
25198
+ return preparePropsInterfaceData(complexTypeKey, cleanedComplexType, allTypesForInterfaces, schemaObject, allComplexTypes, visitedTypes);
25199
+ }
25200
+ }
25201
+ }
25202
+ }
24971
25203
  if (hasOnlyTypeProperty || !hasTypeAndOtherProperties && refKeys.length === 0) {
24972
25204
  debugContext("preparePropsInterfaceData", `Expandiendo contenido del tipo anidado (wrapper sin otras propiedades)`);
24973
25205
  if (visitedTypes.has(nestedTypeValue)) {
@@ -25013,6 +25245,44 @@ function preparePropsInterfaceData(typeName, typeObject, allTypesForInterfaces,
25013
25245
  });
25014
25246
  debugContext("preparePropsInterfaceData", `Expandiendo tipo referenciado directamente (sin type anidado)`);
25015
25247
  const referencedTypeId = typeValue || typeName;
25248
+ const typeLocalName = typeName.split(":").pop() || typeName;
25249
+ const referencedTypeLocalName = typeValue ? typeValue.split(":").pop() || typeValue : null;
25250
+ const isCircularReference = referencedTypeLocalName === typeLocalName && "type" in cleanedReferencedElement && typeof cleanedReferencedElement.type === "string" && (cleanedReferencedElement.type === typeValue || cleanedReferencedElement.type.split(":").pop() === typeLocalName);
25251
+ if (isCircularReference) {
25252
+ debugContext("preparePropsInterfaceData", `\u26A0 Referencia circular detectada: "${typeName}" (local: "${typeLocalName}") -> "${typeValue}" (local: "${referencedTypeLocalName}"), buscando complexType directamente`);
25253
+ if (allComplexTypes) {
25254
+ const complexTypeKey = Object.keys(allComplexTypes).find((k) => {
25255
+ const kLocalName = k.split(":").pop() || k;
25256
+ return kLocalName === typeLocalName;
25257
+ });
25258
+ if (complexTypeKey) {
25259
+ const complexType = allComplexTypes[complexTypeKey];
25260
+ if (complexType && typeof complexType === "object") {
25261
+ let finalComplexType = complexType;
25262
+ if ("type" in complexType && typeof complexType.type === "object" && complexType.type !== null) {
25263
+ finalComplexType = complexType.type;
25264
+ }
25265
+ const complexKeys = getFilteredKeys(finalComplexType);
25266
+ debugContext("preparePropsInterfaceData", `Usando complexType "${complexTypeKey}" con ${complexKeys.length} propiedades: ${complexKeys.join(", ")}`);
25267
+ const cleanedComplexType = { ...finalComplexType };
25268
+ Object.keys(cleanedComplexType).forEach((key) => {
25269
+ if (key.startsWith("_")) {
25270
+ delete cleanedComplexType[key];
25271
+ }
25272
+ });
25273
+ if (visitedTypes.has(complexTypeKey)) {
25274
+ debugContext("preparePropsInterfaceData", `\u26A0 ComplexType "${complexTypeKey}" ya fue procesado, evitando recursi\xF3n infinita`);
25275
+ return {
25276
+ properties: [],
25277
+ interfaces: []
25278
+ };
25279
+ }
25280
+ visitedTypes.add(complexTypeKey);
25281
+ return preparePropsInterfaceData(complexTypeKey, cleanedComplexType, allTypesForInterfaces, schemaObject, allComplexTypes, visitedTypes);
25282
+ }
25283
+ }
25284
+ }
25285
+ }
25016
25286
  if (visitedTypes.has(referencedTypeId)) {
25017
25287
  debugContext("preparePropsInterfaceData", `\u26A0 Tipo referenciado "${referencedTypeId}" ya fue procesado, evitando recursi\xF3n infinita`);
25018
25288
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@karibulab/wsdl2tsx",
3
- "version": "0.23.0",
3
+ "version": "0.24.0",
4
4
  "description": "Generador de código TSX desde archivos WSDL",
5
5
  "main": "dist/index.js",
6
6
  "bin": "./dist/cli.js",
@@ -13,7 +13,7 @@
13
13
  "start": "node dist/cli.js"
14
14
  },
15
15
  "dependencies": {
16
- "@karibulab/wsdl2tsx-runtime": "0.23.0",
16
+ "@karibulab/wsdl2tsx-runtime": "0.24.0",
17
17
  "axios": "^1.7.9",
18
18
  "fast-xml-parser": "5.3.3",
19
19
  "handlebars": "4.7.8"