@ai-sdk-tool/parser 3.3.2 → 3.3.3
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/{chunk-OUGMLYAW.js → chunk-2KK5BDZF.js} +373 -8
- package/dist/chunk-2KK5BDZF.js.map +1 -0
- package/dist/{chunk-ZDBNJWLY.js → chunk-CXWS24JX.js} +2 -2
- package/dist/{chunk-5WKXBBCU.js → chunk-NAQSTPDQ.js} +696 -97
- package/dist/chunk-NAQSTPDQ.js.map +1 -0
- package/dist/community.cjs +1075 -113
- package/dist/community.cjs.map +1 -1
- package/dist/community.js +3 -3
- package/dist/index.cjs +1075 -113
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -8
- package/dist/index.d.ts +14 -8
- package/dist/index.js +3 -3
- package/dist/rxml.cjs +377 -12
- package/dist/rxml.cjs.map +1 -1
- package/dist/rxml.js +2 -2
- package/dist/schema-coerce.cjs +372 -7
- package/dist/schema-coerce.cjs.map +1 -1
- package/dist/schema-coerce.js +1 -1
- package/package.json +8 -8
- package/dist/chunk-5WKXBBCU.js.map +0 -1
- package/dist/chunk-OUGMLYAW.js.map +0 -1
- /package/dist/{chunk-ZDBNJWLY.js.map → chunk-CXWS24JX.js.map} +0 -0
package/dist/index.d.cts
CHANGED
|
@@ -100,11 +100,12 @@ declare function createDynamicIfThenElseSchema(tools: (LanguageModelV3FunctionTo
|
|
|
100
100
|
*/
|
|
101
101
|
declare function getPotentialStartIndex(text: string, searchedText: string): number | null;
|
|
102
102
|
|
|
103
|
-
type OnErrorFn = (message: string, metadata?: Record<string, unknown>) => void;
|
|
103
|
+
type OnErrorFn$1 = (message: string, metadata?: Record<string, unknown>) => void;
|
|
104
104
|
declare function extractOnErrorOption(providerOptions?: unknown): {
|
|
105
|
-
onError?: OnErrorFn;
|
|
105
|
+
onError?: OnErrorFn$1;
|
|
106
106
|
} | undefined;
|
|
107
107
|
|
|
108
|
+
type OnErrorFn = (message: string, metadata?: Record<string, unknown>) => void;
|
|
108
109
|
interface ToolCallMiddlewareProviderOptions {
|
|
109
110
|
toolCallMiddleware?: {
|
|
110
111
|
debugSummary?: {
|
|
@@ -125,14 +126,18 @@ declare const originalToolsSchema: {
|
|
|
125
126
|
encode: typeof encodeOriginalTools;
|
|
126
127
|
decode: typeof decodeOriginalTools;
|
|
127
128
|
};
|
|
128
|
-
|
|
129
|
+
interface EncodedOriginalTool {
|
|
129
130
|
name: string;
|
|
130
131
|
inputSchema: string;
|
|
131
|
-
}
|
|
132
|
-
|
|
132
|
+
}
|
|
133
|
+
interface DecodeOriginalToolsOptions {
|
|
134
|
+
onError?: OnErrorFn;
|
|
135
|
+
}
|
|
136
|
+
declare function encodeOriginalTools(tools: LanguageModelV3FunctionTool[] | undefined): Array<{
|
|
133
137
|
name: string;
|
|
134
138
|
inputSchema: string;
|
|
135
|
-
}
|
|
139
|
+
}>;
|
|
140
|
+
declare function decodeOriginalTools(originalTools: EncodedOriginalTool[] | undefined, options?: DecodeOriginalToolsOptions): LanguageModelV3FunctionTool[];
|
|
136
141
|
declare function extractToolNamesFromOriginalTools(originalTools: Array<{
|
|
137
142
|
name: string;
|
|
138
143
|
inputSchema: string;
|
|
@@ -182,8 +187,9 @@ declare function wrapStream({ protocol, doStream, doGenerate, params, }: {
|
|
|
182
187
|
headers?: _ai_sdk_provider.SharedV3Headers;
|
|
183
188
|
};
|
|
184
189
|
}>;
|
|
185
|
-
declare function toolChoiceStream({ doGenerate, options, }: {
|
|
190
|
+
declare function toolChoiceStream({ doGenerate, tools, options, }: {
|
|
186
191
|
doGenerate: () => ReturnType<LanguageModelV3["doGenerate"]>;
|
|
192
|
+
tools?: LanguageModelV3FunctionTool[];
|
|
187
193
|
options?: {
|
|
188
194
|
onError?: (message: string, metadata?: Record<string, unknown>) => void;
|
|
189
195
|
};
|
|
@@ -267,4 +273,4 @@ declare function transformParams({ params, protocol, toolSystemPromptTemplate, t
|
|
|
267
273
|
toolChoice: undefined;
|
|
268
274
|
};
|
|
269
275
|
|
|
270
|
-
export { type DebugLevel, type OnErrorFn, type ParserOptions, type TCMCoreProtocol, type TCMProtocol, type ToolCallMiddlewareProviderOptions, type XmlProtocolOptions, type YamlProtocolOptions, createDynamicIfThenElseSchema, createToolMiddleware, decodeOriginalTools, encodeOriginalTools, escapeRegExp, extractOnErrorOption, extractToolNamesFromOriginalTools, getDebugLevel, getPotentialStartIndex, hasInputProperty, hermesToolMiddleware, isProtocolFactory, isTCMProtocolFactory, isToolChoiceActive, isToolResultPart, jsonProtocol, logParseFailure, logParsedChunk, logParsedSummary, logRawChunk, originalToolsSchema, toolChoiceStream, transformParams, wrapGenerate, wrapStream, xmlProtocol, xmlToolMiddleware, yamlProtocol, yamlToolMiddleware };
|
|
276
|
+
export { type DebugLevel, type OnErrorFn$1 as OnErrorFn, type ParserOptions, type TCMCoreProtocol, type TCMProtocol, type ToolCallMiddlewareProviderOptions, type XmlProtocolOptions, type YamlProtocolOptions, createDynamicIfThenElseSchema, createToolMiddleware, decodeOriginalTools, encodeOriginalTools, escapeRegExp, extractOnErrorOption, extractToolNamesFromOriginalTools, getDebugLevel, getPotentialStartIndex, hasInputProperty, hermesToolMiddleware, isProtocolFactory, isTCMProtocolFactory, isToolChoiceActive, isToolResultPart, jsonProtocol, logParseFailure, logParsedChunk, logParsedSummary, logRawChunk, originalToolsSchema, toolChoiceStream, transformParams, wrapGenerate, wrapStream, xmlProtocol, xmlToolMiddleware, yamlProtocol, yamlToolMiddleware };
|
package/dist/index.d.ts
CHANGED
|
@@ -100,11 +100,12 @@ declare function createDynamicIfThenElseSchema(tools: (LanguageModelV3FunctionTo
|
|
|
100
100
|
*/
|
|
101
101
|
declare function getPotentialStartIndex(text: string, searchedText: string): number | null;
|
|
102
102
|
|
|
103
|
-
type OnErrorFn = (message: string, metadata?: Record<string, unknown>) => void;
|
|
103
|
+
type OnErrorFn$1 = (message: string, metadata?: Record<string, unknown>) => void;
|
|
104
104
|
declare function extractOnErrorOption(providerOptions?: unknown): {
|
|
105
|
-
onError?: OnErrorFn;
|
|
105
|
+
onError?: OnErrorFn$1;
|
|
106
106
|
} | undefined;
|
|
107
107
|
|
|
108
|
+
type OnErrorFn = (message: string, metadata?: Record<string, unknown>) => void;
|
|
108
109
|
interface ToolCallMiddlewareProviderOptions {
|
|
109
110
|
toolCallMiddleware?: {
|
|
110
111
|
debugSummary?: {
|
|
@@ -125,14 +126,18 @@ declare const originalToolsSchema: {
|
|
|
125
126
|
encode: typeof encodeOriginalTools;
|
|
126
127
|
decode: typeof decodeOriginalTools;
|
|
127
128
|
};
|
|
128
|
-
|
|
129
|
+
interface EncodedOriginalTool {
|
|
129
130
|
name: string;
|
|
130
131
|
inputSchema: string;
|
|
131
|
-
}
|
|
132
|
-
|
|
132
|
+
}
|
|
133
|
+
interface DecodeOriginalToolsOptions {
|
|
134
|
+
onError?: OnErrorFn;
|
|
135
|
+
}
|
|
136
|
+
declare function encodeOriginalTools(tools: LanguageModelV3FunctionTool[] | undefined): Array<{
|
|
133
137
|
name: string;
|
|
134
138
|
inputSchema: string;
|
|
135
|
-
}
|
|
139
|
+
}>;
|
|
140
|
+
declare function decodeOriginalTools(originalTools: EncodedOriginalTool[] | undefined, options?: DecodeOriginalToolsOptions): LanguageModelV3FunctionTool[];
|
|
136
141
|
declare function extractToolNamesFromOriginalTools(originalTools: Array<{
|
|
137
142
|
name: string;
|
|
138
143
|
inputSchema: string;
|
|
@@ -182,8 +187,9 @@ declare function wrapStream({ protocol, doStream, doGenerate, params, }: {
|
|
|
182
187
|
headers?: _ai_sdk_provider.SharedV3Headers;
|
|
183
188
|
};
|
|
184
189
|
}>;
|
|
185
|
-
declare function toolChoiceStream({ doGenerate, options, }: {
|
|
190
|
+
declare function toolChoiceStream({ doGenerate, tools, options, }: {
|
|
186
191
|
doGenerate: () => ReturnType<LanguageModelV3["doGenerate"]>;
|
|
192
|
+
tools?: LanguageModelV3FunctionTool[];
|
|
187
193
|
options?: {
|
|
188
194
|
onError?: (message: string, metadata?: Record<string, unknown>) => void;
|
|
189
195
|
};
|
|
@@ -267,4 +273,4 @@ declare function transformParams({ params, protocol, toolSystemPromptTemplate, t
|
|
|
267
273
|
toolChoice: undefined;
|
|
268
274
|
};
|
|
269
275
|
|
|
270
|
-
export { type DebugLevel, type OnErrorFn, type ParserOptions, type TCMCoreProtocol, type TCMProtocol, type ToolCallMiddlewareProviderOptions, type XmlProtocolOptions, type YamlProtocolOptions, createDynamicIfThenElseSchema, createToolMiddleware, decodeOriginalTools, encodeOriginalTools, escapeRegExp, extractOnErrorOption, extractToolNamesFromOriginalTools, getDebugLevel, getPotentialStartIndex, hasInputProperty, hermesToolMiddleware, isProtocolFactory, isTCMProtocolFactory, isToolChoiceActive, isToolResultPart, jsonProtocol, logParseFailure, logParsedChunk, logParsedSummary, logRawChunk, originalToolsSchema, toolChoiceStream, transformParams, wrapGenerate, wrapStream, xmlProtocol, xmlToolMiddleware, yamlProtocol, yamlToolMiddleware };
|
|
276
|
+
export { type DebugLevel, type OnErrorFn$1 as OnErrorFn, type ParserOptions, type TCMCoreProtocol, type TCMProtocol, type ToolCallMiddlewareProviderOptions, type XmlProtocolOptions, type YamlProtocolOptions, createDynamicIfThenElseSchema, createToolMiddleware, decodeOriginalTools, encodeOriginalTools, escapeRegExp, extractOnErrorOption, extractToolNamesFromOriginalTools, getDebugLevel, getPotentialStartIndex, hasInputProperty, hermesToolMiddleware, isProtocolFactory, isTCMProtocolFactory, isToolChoiceActive, isToolResultPart, jsonProtocol, logParseFailure, logParsedChunk, logParsedSummary, logRawChunk, originalToolsSchema, toolChoiceStream, transformParams, wrapGenerate, wrapStream, xmlProtocol, xmlToolMiddleware, yamlProtocol, yamlToolMiddleware };
|
package/dist/index.js
CHANGED
|
@@ -27,16 +27,16 @@ import {
|
|
|
27
27
|
xmlToolMiddleware,
|
|
28
28
|
yamlProtocol,
|
|
29
29
|
yamlToolMiddleware
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-NAQSTPDQ.js";
|
|
31
31
|
import {
|
|
32
32
|
escapeRegExp
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-CXWS24JX.js";
|
|
34
34
|
import {
|
|
35
35
|
parse,
|
|
36
36
|
stringify,
|
|
37
37
|
transform
|
|
38
38
|
} from "./chunk-IX4FJELL.js";
|
|
39
|
-
import "./chunk-
|
|
39
|
+
import "./chunk-2KK5BDZF.js";
|
|
40
40
|
export {
|
|
41
41
|
createDynamicIfThenElseSchema,
|
|
42
42
|
createToolMiddleware,
|
package/dist/rxml.cjs
CHANGED
|
@@ -363,6 +363,13 @@ var EMPTY_OBJECT_REGEX = /^\{\s*\}$/s;
|
|
|
363
363
|
var NEWLINE_SPLIT_REGEX = /\n+/;
|
|
364
364
|
var COMMA_SPLIT_REGEX = /,\s*/;
|
|
365
365
|
var DIGIT_KEY_REGEX = /^\d+$/;
|
|
366
|
+
var WHITESPACE_REGEX = /\s+/g;
|
|
367
|
+
var HAS_WHITESPACE_REGEX = /\s/;
|
|
368
|
+
var SINGLE_QUOTE = "'";
|
|
369
|
+
var DOUBLE_QUOTE = '"';
|
|
370
|
+
var SNAKE_SEGMENT_REGEX = /_([a-zA-Z0-9])/g;
|
|
371
|
+
var CAMEL_BOUNDARY_REGEX = /([a-z0-9])([A-Z])/g;
|
|
372
|
+
var LEADING_UNDERSCORES_REGEX = /^_+/;
|
|
366
373
|
function unwrapJsonSchema(schema) {
|
|
367
374
|
if (!schema || typeof schema !== "object") {
|
|
368
375
|
return schema;
|
|
@@ -611,9 +618,158 @@ function coerceStringToArray(s, unwrapped) {
|
|
|
611
618
|
}
|
|
612
619
|
return null;
|
|
613
620
|
}
|
|
621
|
+
function getStrictObjectSchemaInfo(unwrapped) {
|
|
622
|
+
if (getSchemaType(unwrapped) !== "object") {
|
|
623
|
+
return null;
|
|
624
|
+
}
|
|
625
|
+
if (unwrapped.additionalProperties !== false) {
|
|
626
|
+
return null;
|
|
627
|
+
}
|
|
628
|
+
const properties = unwrapped.properties;
|
|
629
|
+
if (!properties || typeof properties !== "object" || Array.isArray(properties)) {
|
|
630
|
+
return null;
|
|
631
|
+
}
|
|
632
|
+
const propertyMap = properties;
|
|
633
|
+
const required = Array.isArray(unwrapped.required) ? unwrapped.required.filter(
|
|
634
|
+
(value) => typeof value === "string" && value.length > 0
|
|
635
|
+
) : [];
|
|
636
|
+
const patternProps = unwrapped.patternProperties;
|
|
637
|
+
const patternProperties = patternProps && typeof patternProps === "object" && !Array.isArray(patternProps) ? patternProps : void 0;
|
|
638
|
+
return {
|
|
639
|
+
properties: propertyMap,
|
|
640
|
+
required,
|
|
641
|
+
patternProperties
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
function isSingularPluralPair(left, right) {
|
|
645
|
+
return left.length > 1 && right.length > 1 && (left === `${right}s` || right === `${left}s`);
|
|
646
|
+
}
|
|
647
|
+
function snakeToCamel(value) {
|
|
648
|
+
const trimmed = value.replace(LEADING_UNDERSCORES_REGEX, "");
|
|
649
|
+
if (trimmed.length === 0) {
|
|
650
|
+
return value;
|
|
651
|
+
}
|
|
652
|
+
const camelized = trimmed.replace(
|
|
653
|
+
SNAKE_SEGMENT_REGEX,
|
|
654
|
+
(_, c) => c.toUpperCase()
|
|
655
|
+
);
|
|
656
|
+
return camelized.charAt(0).toLowerCase() + camelized.slice(1);
|
|
657
|
+
}
|
|
658
|
+
function camelToSnake(value) {
|
|
659
|
+
return value.replace(CAMEL_BOUNDARY_REGEX, "$1_$2").toLowerCase();
|
|
660
|
+
}
|
|
661
|
+
function isCaseStylePair(targetKey, sourceKey) {
|
|
662
|
+
if (targetKey === sourceKey) {
|
|
663
|
+
return false;
|
|
664
|
+
}
|
|
665
|
+
const sourceLooksSnake = sourceKey.includes("_");
|
|
666
|
+
const targetLooksSnake = targetKey.includes("_");
|
|
667
|
+
if (sourceLooksSnake && snakeToCamel(sourceKey) === targetKey) {
|
|
668
|
+
return true;
|
|
669
|
+
}
|
|
670
|
+
if (!sourceLooksSnake && targetLooksSnake && camelToSnake(sourceKey) === targetKey) {
|
|
671
|
+
return true;
|
|
672
|
+
}
|
|
673
|
+
return false;
|
|
674
|
+
}
|
|
675
|
+
function isUnexpectedKey(key, schemaInfo) {
|
|
676
|
+
if (Object.hasOwn(schemaInfo.properties, key)) {
|
|
677
|
+
return false;
|
|
678
|
+
}
|
|
679
|
+
const patternSchemas = getPatternSchemasForKey(
|
|
680
|
+
schemaInfo.patternProperties,
|
|
681
|
+
key
|
|
682
|
+
);
|
|
683
|
+
if (patternSchemas.length > 0) {
|
|
684
|
+
return patternSchemas.every((schema) => schema === false);
|
|
685
|
+
}
|
|
686
|
+
return true;
|
|
687
|
+
}
|
|
688
|
+
function computeMissingAndUnexpectedKeys(input, schemaInfo) {
|
|
689
|
+
const missingRequired = schemaInfo.required.filter(
|
|
690
|
+
(key) => !Object.hasOwn(input, key)
|
|
691
|
+
);
|
|
692
|
+
const unexpectedKeys = Object.keys(input).filter(
|
|
693
|
+
(key) => isUnexpectedKey(key, schemaInfo)
|
|
694
|
+
);
|
|
695
|
+
return { missingRequired, unexpectedKeys };
|
|
696
|
+
}
|
|
697
|
+
function applySingularPluralRequiredKeyRename(input, schemaInfo) {
|
|
698
|
+
const { missingRequired, unexpectedKeys } = computeMissingAndUnexpectedKeys(
|
|
699
|
+
input,
|
|
700
|
+
schemaInfo
|
|
701
|
+
);
|
|
702
|
+
if (missingRequired.length !== 1 || unexpectedKeys.length !== 1) {
|
|
703
|
+
return null;
|
|
704
|
+
}
|
|
705
|
+
const targetKey = missingRequired[0];
|
|
706
|
+
const sourceKey = unexpectedKeys[0];
|
|
707
|
+
if (!Object.hasOwn(schemaInfo.properties, targetKey)) {
|
|
708
|
+
return null;
|
|
709
|
+
}
|
|
710
|
+
if (!isSingularPluralPair(targetKey, sourceKey)) {
|
|
711
|
+
return null;
|
|
712
|
+
}
|
|
713
|
+
if (getSchemaType(schemaInfo.properties[targetKey]) !== "array") {
|
|
714
|
+
return null;
|
|
715
|
+
}
|
|
716
|
+
if (!Array.isArray(input[sourceKey])) {
|
|
717
|
+
return null;
|
|
718
|
+
}
|
|
719
|
+
if (!Object.hasOwn(input, sourceKey) || Object.hasOwn(input, targetKey)) {
|
|
720
|
+
return null;
|
|
721
|
+
}
|
|
722
|
+
const output = { ...input };
|
|
723
|
+
output[targetKey] = output[sourceKey];
|
|
724
|
+
delete output[sourceKey];
|
|
725
|
+
return output;
|
|
726
|
+
}
|
|
727
|
+
function applyCaseStyleRequiredKeyRename(input, schemaInfo) {
|
|
728
|
+
const { missingRequired, unexpectedKeys } = computeMissingAndUnexpectedKeys(
|
|
729
|
+
input,
|
|
730
|
+
schemaInfo
|
|
731
|
+
);
|
|
732
|
+
if (missingRequired.length !== 1 || unexpectedKeys.length !== 1) {
|
|
733
|
+
return null;
|
|
734
|
+
}
|
|
735
|
+
const targetKey = missingRequired[0];
|
|
736
|
+
const sourceKey = unexpectedKeys[0];
|
|
737
|
+
if (!Object.hasOwn(schemaInfo.properties, targetKey)) {
|
|
738
|
+
return null;
|
|
739
|
+
}
|
|
740
|
+
if (!isCaseStylePair(targetKey, sourceKey)) {
|
|
741
|
+
return null;
|
|
742
|
+
}
|
|
743
|
+
if (!Object.hasOwn(input, sourceKey) || Object.hasOwn(input, targetKey)) {
|
|
744
|
+
return null;
|
|
745
|
+
}
|
|
746
|
+
const output = { ...input };
|
|
747
|
+
output[targetKey] = output[sourceKey];
|
|
748
|
+
delete output[sourceKey];
|
|
749
|
+
return output;
|
|
750
|
+
}
|
|
751
|
+
function applyStrictRequiredKeyRename(input, unwrapped) {
|
|
752
|
+
const schemaInfo = getStrictObjectSchemaInfo(unwrapped);
|
|
753
|
+
if (!schemaInfo) {
|
|
754
|
+
return input;
|
|
755
|
+
}
|
|
756
|
+
const singularPlural = applySingularPluralRequiredKeyRename(
|
|
757
|
+
input,
|
|
758
|
+
schemaInfo
|
|
759
|
+
);
|
|
760
|
+
if (singularPlural) {
|
|
761
|
+
return singularPlural;
|
|
762
|
+
}
|
|
763
|
+
const caseStyle = applyCaseStyleRequiredKeyRename(input, schemaInfo);
|
|
764
|
+
if (caseStyle) {
|
|
765
|
+
return caseStyle;
|
|
766
|
+
}
|
|
767
|
+
return input;
|
|
768
|
+
}
|
|
614
769
|
function coerceObjectToObject(value, unwrapped) {
|
|
770
|
+
const normalizedInput = applyStrictRequiredKeyRename(value, unwrapped);
|
|
615
771
|
const out = {};
|
|
616
|
-
for (const [k, v] of Object.entries(
|
|
772
|
+
for (const [k, v] of Object.entries(normalizedInput)) {
|
|
617
773
|
out[k] = coerceValueForKey(v, k, unwrapped);
|
|
618
774
|
}
|
|
619
775
|
return out;
|
|
@@ -624,6 +780,109 @@ function coerceArrayToArray(value, prefixItems, itemsSchema) {
|
|
|
624
780
|
}
|
|
625
781
|
return value.map((v) => coerceBySchema(v, itemsSchema));
|
|
626
782
|
}
|
|
783
|
+
function isPrimitiveSchemaType(schemaType) {
|
|
784
|
+
return schemaType === "string" || schemaType === "number" || schemaType === "integer" || schemaType === "boolean";
|
|
785
|
+
}
|
|
786
|
+
function isPrimitiveMatchForSchemaType(value, schemaType) {
|
|
787
|
+
if (schemaType === "string") {
|
|
788
|
+
return typeof value === "string";
|
|
789
|
+
}
|
|
790
|
+
if (schemaType === "number") {
|
|
791
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
792
|
+
}
|
|
793
|
+
if (schemaType === "integer") {
|
|
794
|
+
return typeof value === "number" && Number.isFinite(value) && Number.isInteger(value);
|
|
795
|
+
}
|
|
796
|
+
return typeof value === "boolean";
|
|
797
|
+
}
|
|
798
|
+
function coercePrimitiveWrappedObject(value, itemsSchema) {
|
|
799
|
+
const schemaType = getSchemaType(itemsSchema);
|
|
800
|
+
if (!isPrimitiveSchemaType(schemaType)) {
|
|
801
|
+
return null;
|
|
802
|
+
}
|
|
803
|
+
const keys = Object.keys(value);
|
|
804
|
+
if (keys.length !== 1) {
|
|
805
|
+
return null;
|
|
806
|
+
}
|
|
807
|
+
const singleValue = value[keys[0]];
|
|
808
|
+
if (singleValue && typeof singleValue === "object") {
|
|
809
|
+
return null;
|
|
810
|
+
}
|
|
811
|
+
const coerced = coerceBySchema(singleValue, itemsSchema);
|
|
812
|
+
return isPrimitiveMatchForSchemaType(coerced, schemaType) ? coerced : null;
|
|
813
|
+
}
|
|
814
|
+
function coerceParallelArraysObjectToArray(maybe, prefixItems, itemsSchema) {
|
|
815
|
+
if (prefixItems && prefixItems.length > 0) {
|
|
816
|
+
return null;
|
|
817
|
+
}
|
|
818
|
+
const unwrappedItems = unwrapJsonSchema(itemsSchema);
|
|
819
|
+
if (!unwrappedItems || typeof unwrappedItems !== "object" || Array.isArray(unwrappedItems)) {
|
|
820
|
+
return null;
|
|
821
|
+
}
|
|
822
|
+
const itemSchema = unwrappedItems;
|
|
823
|
+
if (getSchemaType(itemSchema) !== "object") {
|
|
824
|
+
return null;
|
|
825
|
+
}
|
|
826
|
+
if (itemSchema.additionalProperties !== false) {
|
|
827
|
+
return null;
|
|
828
|
+
}
|
|
829
|
+
const properties = itemSchema.properties;
|
|
830
|
+
if (!properties || typeof properties !== "object" || Array.isArray(properties)) {
|
|
831
|
+
return null;
|
|
832
|
+
}
|
|
833
|
+
const propertyMap = properties;
|
|
834
|
+
const entries = Object.entries(maybe);
|
|
835
|
+
if (entries.length < 2) {
|
|
836
|
+
return null;
|
|
837
|
+
}
|
|
838
|
+
if (!entries.every(([, value]) => Array.isArray(value))) {
|
|
839
|
+
return null;
|
|
840
|
+
}
|
|
841
|
+
if (!entries.every(([key]) => Object.hasOwn(propertyMap, key))) {
|
|
842
|
+
return null;
|
|
843
|
+
}
|
|
844
|
+
if (!entries.every(([key]) => {
|
|
845
|
+
const schemaType = getSchemaType(propertyMap[key]);
|
|
846
|
+
return schemaType !== "array" && schemaType !== "object";
|
|
847
|
+
})) {
|
|
848
|
+
return null;
|
|
849
|
+
}
|
|
850
|
+
const lengths = [
|
|
851
|
+
...new Set(entries.map(([, value]) => value.length))
|
|
852
|
+
];
|
|
853
|
+
if (lengths.length !== 1) {
|
|
854
|
+
return null;
|
|
855
|
+
}
|
|
856
|
+
const length = lengths[0];
|
|
857
|
+
if (length < 2) {
|
|
858
|
+
return null;
|
|
859
|
+
}
|
|
860
|
+
const zipped = [];
|
|
861
|
+
for (let index = 0; index < length; index += 1) {
|
|
862
|
+
const item = {};
|
|
863
|
+
for (const [key, value] of entries) {
|
|
864
|
+
item[key] = value[index];
|
|
865
|
+
}
|
|
866
|
+
zipped.push(item);
|
|
867
|
+
}
|
|
868
|
+
return coerceArrayToArray(zipped, prefixItems, itemsSchema);
|
|
869
|
+
}
|
|
870
|
+
function coerceSingleKeyObjectToArray(singleValue, itemsSchema) {
|
|
871
|
+
if (Array.isArray(singleValue)) {
|
|
872
|
+
return singleValue.map((v) => coerceBySchema(v, itemsSchema));
|
|
873
|
+
}
|
|
874
|
+
if (singleValue && typeof singleValue === "object") {
|
|
875
|
+
const primitiveWrapped = coercePrimitiveWrappedObject(
|
|
876
|
+
singleValue,
|
|
877
|
+
itemsSchema
|
|
878
|
+
);
|
|
879
|
+
if (primitiveWrapped !== null) {
|
|
880
|
+
return [primitiveWrapped];
|
|
881
|
+
}
|
|
882
|
+
return [coerceBySchema(singleValue, itemsSchema)];
|
|
883
|
+
}
|
|
884
|
+
return null;
|
|
885
|
+
}
|
|
627
886
|
function coerceObjectToArray(maybe, prefixItems, itemsSchema) {
|
|
628
887
|
if (Object.hasOwn(maybe, "item")) {
|
|
629
888
|
const items = maybe.item;
|
|
@@ -635,15 +894,23 @@ function coerceObjectToArray(maybe, prefixItems, itemsSchema) {
|
|
|
635
894
|
const arr = keys.sort((a, b) => Number(a) - Number(b)).map((k) => maybe[k]);
|
|
636
895
|
return coerceArrayToArray(arr, prefixItems, itemsSchema);
|
|
637
896
|
}
|
|
897
|
+
const parallelArrays = coerceParallelArraysObjectToArray(
|
|
898
|
+
maybe,
|
|
899
|
+
prefixItems,
|
|
900
|
+
itemsSchema
|
|
901
|
+
);
|
|
902
|
+
if (parallelArrays !== null) {
|
|
903
|
+
return parallelArrays;
|
|
904
|
+
}
|
|
638
905
|
if (keys.length === 1) {
|
|
639
906
|
const singleKey = keys[0];
|
|
640
907
|
if (!(schemaIsUnconstrained(itemsSchema) || schemaHasProperty(itemsSchema, singleKey))) {
|
|
641
|
-
const
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
if (
|
|
646
|
-
return
|
|
908
|
+
const result = coerceSingleKeyObjectToArray(
|
|
909
|
+
maybe[singleKey],
|
|
910
|
+
itemsSchema
|
|
911
|
+
);
|
|
912
|
+
if (result !== null) {
|
|
913
|
+
return result;
|
|
647
914
|
}
|
|
648
915
|
}
|
|
649
916
|
}
|
|
@@ -673,6 +940,86 @@ function coerceStringToPrimitive(s, schemaType) {
|
|
|
673
940
|
}
|
|
674
941
|
return null;
|
|
675
942
|
}
|
|
943
|
+
function coercePrimitiveToString(value, schemaType) {
|
|
944
|
+
if (schemaType !== "string") {
|
|
945
|
+
return null;
|
|
946
|
+
}
|
|
947
|
+
if (typeof value === "boolean") {
|
|
948
|
+
return value ? "true" : "false";
|
|
949
|
+
}
|
|
950
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
951
|
+
return String(value);
|
|
952
|
+
}
|
|
953
|
+
return null;
|
|
954
|
+
}
|
|
955
|
+
function coerceStringByEnumWhitespace(rawValue, unwrapped) {
|
|
956
|
+
const enumValues = unwrapped.enum;
|
|
957
|
+
if (!Array.isArray(enumValues) || enumValues.length === 0) {
|
|
958
|
+
return null;
|
|
959
|
+
}
|
|
960
|
+
if (!enumValues.every((item) => typeof item === "string")) {
|
|
961
|
+
return null;
|
|
962
|
+
}
|
|
963
|
+
const normalizedEnumValues = enumValues;
|
|
964
|
+
if (normalizedEnumValues.includes(rawValue)) {
|
|
965
|
+
return null;
|
|
966
|
+
}
|
|
967
|
+
const unquoted = unwrapMatchingQuotes(rawValue);
|
|
968
|
+
if (unquoted !== null) {
|
|
969
|
+
const exactMatches = normalizedEnumValues.filter(
|
|
970
|
+
(item) => item === unquoted
|
|
971
|
+
);
|
|
972
|
+
if (exactMatches.length === 1) {
|
|
973
|
+
return exactMatches[0];
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
const candidates = [rawValue, unquoted].filter(
|
|
977
|
+
(item) => item !== null
|
|
978
|
+
);
|
|
979
|
+
for (const candidate of candidates) {
|
|
980
|
+
if (!HAS_WHITESPACE_REGEX.test(candidate)) {
|
|
981
|
+
continue;
|
|
982
|
+
}
|
|
983
|
+
const normalizedInput = candidate.replace(WHITESPACE_REGEX, "");
|
|
984
|
+
const matches = normalizedEnumValues.filter(
|
|
985
|
+
(item) => item.replace(WHITESPACE_REGEX, "") === normalizedInput
|
|
986
|
+
);
|
|
987
|
+
if (matches.length === 1) {
|
|
988
|
+
return matches[0];
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
return null;
|
|
992
|
+
}
|
|
993
|
+
function unwrapMatchingQuotes(value) {
|
|
994
|
+
if (value.length < 2) {
|
|
995
|
+
return null;
|
|
996
|
+
}
|
|
997
|
+
const first = value[0];
|
|
998
|
+
const last = value.at(-1);
|
|
999
|
+
const isQuote = (first === SINGLE_QUOTE || first === DOUBLE_QUOTE) && first === last;
|
|
1000
|
+
if (!isQuote) {
|
|
1001
|
+
return null;
|
|
1002
|
+
}
|
|
1003
|
+
return value.slice(1, -1);
|
|
1004
|
+
}
|
|
1005
|
+
function coerceObjectToPrimitive(value, schemaType, fullSchema) {
|
|
1006
|
+
if (!isPrimitiveSchemaType(schemaType)) {
|
|
1007
|
+
return null;
|
|
1008
|
+
}
|
|
1009
|
+
const keys = Object.keys(value);
|
|
1010
|
+
if (keys.length !== 1) {
|
|
1011
|
+
return null;
|
|
1012
|
+
}
|
|
1013
|
+
const singleValue = value[keys[0]];
|
|
1014
|
+
if (singleValue && typeof singleValue === "object") {
|
|
1015
|
+
return null;
|
|
1016
|
+
}
|
|
1017
|
+
const coerced = coerceBySchema(
|
|
1018
|
+
singleValue,
|
|
1019
|
+
fullSchema != null ? fullSchema : { type: schemaType }
|
|
1020
|
+
);
|
|
1021
|
+
return isPrimitiveMatchForSchemaType(coerced, schemaType) ? coerced : null;
|
|
1022
|
+
}
|
|
676
1023
|
function coerceStringValue(value, schemaType, u) {
|
|
677
1024
|
const s = value.trim();
|
|
678
1025
|
if (schemaType === "object") {
|
|
@@ -691,6 +1038,10 @@ function coerceStringValue(value, schemaType, u) {
|
|
|
691
1038
|
if (primitiveResult !== null) {
|
|
692
1039
|
return primitiveResult;
|
|
693
1040
|
}
|
|
1041
|
+
const enumWhitespaceCanonical = coerceStringByEnumWhitespace(s, u);
|
|
1042
|
+
if (enumWhitespaceCanonical !== null) {
|
|
1043
|
+
return enumWhitespaceCanonical;
|
|
1044
|
+
}
|
|
694
1045
|
return value;
|
|
695
1046
|
}
|
|
696
1047
|
function coerceArrayValue(value, prefixItems, itemsSchema) {
|
|
@@ -729,9 +1080,23 @@ function coerceBySchema(value, schema) {
|
|
|
729
1080
|
if (typeof value === "string") {
|
|
730
1081
|
return coerceStringValue(value, schemaType, u);
|
|
731
1082
|
}
|
|
1083
|
+
const primitiveString = coercePrimitiveToString(value, schemaType);
|
|
1084
|
+
if (primitiveString !== null) {
|
|
1085
|
+
return primitiveString;
|
|
1086
|
+
}
|
|
732
1087
|
if (schemaType === "object" && value && typeof value === "object" && !Array.isArray(value)) {
|
|
733
1088
|
return coerceObjectToObject(value, u);
|
|
734
1089
|
}
|
|
1090
|
+
if (value && typeof value === "object" && !Array.isArray(value) && isPrimitiveSchemaType(schemaType)) {
|
|
1091
|
+
const primitiveResult = coerceObjectToPrimitive(
|
|
1092
|
+
value,
|
|
1093
|
+
schemaType,
|
|
1094
|
+
u
|
|
1095
|
+
);
|
|
1096
|
+
if (primitiveResult !== null) {
|
|
1097
|
+
return primitiveResult;
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
735
1100
|
if (schemaType === "array") {
|
|
736
1101
|
const prefixItems = Array.isArray(u.prefixItems) ? u.prefixItems : void 0;
|
|
737
1102
|
const itemsSchema = u.items;
|
|
@@ -1746,7 +2111,7 @@ var XMLTokenizer = class {
|
|
|
1746
2111
|
};
|
|
1747
2112
|
|
|
1748
2113
|
// src/rxml/core/parser.ts
|
|
1749
|
-
var
|
|
2114
|
+
var WHITESPACE_REGEX2 = /\s/;
|
|
1750
2115
|
var NUMERIC_STRING_REGEX = /^-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
|
|
1751
2116
|
var DIGIT_KEY_REGEX2 = /^\d+$/;
|
|
1752
2117
|
function getTopLevelStringProps(s) {
|
|
@@ -1916,7 +2281,7 @@ function parse(xmlInner, schema, options = {}) {
|
|
|
1916
2281
|
const closeHead = s.indexOf(`</${rootName}`, range.end);
|
|
1917
2282
|
if (closeHead === range.end) {
|
|
1918
2283
|
let p = closeHead + 2 + rootName.length;
|
|
1919
|
-
while (p < s.length &&
|
|
2284
|
+
while (p < s.length && WHITESPACE_REGEX2.test(s[p])) {
|
|
1920
2285
|
p += 1;
|
|
1921
2286
|
}
|
|
1922
2287
|
if (s[p] === ">") {
|
|
@@ -2259,7 +2624,7 @@ function escapeRegExp(literal) {
|
|
|
2259
2624
|
var MALFORMED_CLOSE_RE_G = /<\/\s+([A-Za-z0-9_:-]+)\s*>/g;
|
|
2260
2625
|
var MALFORMED_CLOSE_RE = /<\/\s+([A-Za-z0-9_:-]+)\s*>/;
|
|
2261
2626
|
var STATUS_TO_STEP_BOUNDARY_RE = /<\/status>\s*<step>/g;
|
|
2262
|
-
var
|
|
2627
|
+
var WHITESPACE_REGEX3 = /\s/;
|
|
2263
2628
|
var NAME_CHAR_RE = /[A-Za-z0-9_:-]/;
|
|
2264
2629
|
var NAME_START_CHAR_RE = /[A-Za-z_:]/;
|
|
2265
2630
|
var STEP_TAG_RE = /<step>([\s\S]*?)<\/step>/i;
|
|
@@ -2400,7 +2765,7 @@ function balanceTags(xml) {
|
|
|
2400
2765
|
}
|
|
2401
2766
|
function skipWs(s, p, len) {
|
|
2402
2767
|
let idx = p;
|
|
2403
|
-
while (idx < len &&
|
|
2768
|
+
while (idx < len && WHITESPACE_REGEX3.test(s[idx])) {
|
|
2404
2769
|
idx += 1;
|
|
2405
2770
|
}
|
|
2406
2771
|
return idx;
|
|
@@ -2453,7 +2818,7 @@ function handleOpeningTagSegment(src, lt, out, stack) {
|
|
|
2453
2818
|
return len;
|
|
2454
2819
|
}
|
|
2455
2820
|
let r = q - 1;
|
|
2456
|
-
while (r >= nameStart &&
|
|
2821
|
+
while (r >= nameStart && WHITESPACE_REGEX3.test(src[r])) {
|
|
2457
2822
|
r -= 1;
|
|
2458
2823
|
}
|
|
2459
2824
|
const selfClosing = src[r] === "/";
|