@jterrazz/intelligence 1.6.1 → 3.0.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.
- package/README.md +69 -165
- package/dist/index.cjs +649 -1625
- package/dist/index.d.ts +5 -12
- package/dist/index.js +5 -12
- package/dist/index.js.map +1 -1
- package/dist/middleware/__tests__/logging.middleware.test.js +390 -0
- package/dist/middleware/__tests__/logging.middleware.test.js.map +1 -0
- package/dist/middleware/logging.middleware.d.ts +21 -0
- package/dist/middleware/logging.middleware.js +296 -0
- package/dist/middleware/logging.middleware.js.map +1 -0
- package/dist/parsing/__tests__/create-schema-prompt.test.js +53 -0
- package/dist/parsing/__tests__/create-schema-prompt.test.js.map +1 -0
- package/dist/parsing/__tests__/parse-object.test.d.ts +1 -0
- package/dist/parsing/__tests__/parse-object.test.js +193 -0
- package/dist/parsing/__tests__/parse-object.test.js.map +1 -0
- package/dist/parsing/__tests__/parse-text.test.d.ts +1 -0
- package/dist/parsing/__tests__/parse-text.test.js +159 -0
- package/dist/parsing/__tests__/parse-text.test.js.map +1 -0
- package/dist/parsing/create-schema-prompt.d.ts +28 -0
- package/dist/parsing/create-schema-prompt.js +42 -0
- package/dist/parsing/create-schema-prompt.js.map +1 -0
- package/dist/parsing/parse-object.d.ts +33 -0
- package/dist/parsing/parse-object.js +360 -0
- package/dist/parsing/parse-object.js.map +1 -0
- package/dist/parsing/parse-text.d.ts +14 -0
- package/dist/parsing/parse-text.js +80 -0
- package/dist/parsing/parse-text.js.map +1 -0
- package/dist/providers/openrouter.provider.d.ts +36 -0
- package/dist/providers/openrouter.provider.js +58 -0
- package/dist/providers/openrouter.provider.js.map +1 -0
- package/package.json +15 -14
- package/dist/adapters/agents/autonomous-agent.adapter.d.ts +0 -30
- package/dist/adapters/agents/autonomous-agent.adapter.js +0 -400
- package/dist/adapters/agents/autonomous-agent.adapter.js.map +0 -1
- package/dist/adapters/agents/basic-agent.adapter.d.ts +0 -27
- package/dist/adapters/agents/basic-agent.adapter.js +0 -339
- package/dist/adapters/agents/basic-agent.adapter.js.map +0 -1
- package/dist/adapters/agents/retryable-agent.adapter.d.ts +0 -20
- package/dist/adapters/agents/retryable-agent.adapter.js +0 -263
- package/dist/adapters/agents/retryable-agent.adapter.js.map +0 -1
- package/dist/adapters/models/openrouter-model.adapter.d.ts +0 -38
- package/dist/adapters/models/openrouter-model.adapter.js +0 -89
- package/dist/adapters/models/openrouter-model.adapter.js.map +0 -1
- package/dist/adapters/prompts/__tests__/__snapshots__/presets.test.ts.snap +0 -120
- package/dist/adapters/prompts/__tests__/presets.test.js +0 -31
- package/dist/adapters/prompts/__tests__/presets.test.js.map +0 -1
- package/dist/adapters/prompts/library/categories/domain.d.ts +0 -11
- package/dist/adapters/prompts/library/categories/domain.js +0 -12
- package/dist/adapters/prompts/library/categories/domain.js.map +0 -1
- package/dist/adapters/prompts/library/categories/format.d.ts +0 -10
- package/dist/adapters/prompts/library/categories/format.js +0 -11
- package/dist/adapters/prompts/library/categories/format.js.map +0 -1
- package/dist/adapters/prompts/library/categories/foundations.d.ts +0 -12
- package/dist/adapters/prompts/library/categories/foundations.js +0 -13
- package/dist/adapters/prompts/library/categories/foundations.js.map +0 -1
- package/dist/adapters/prompts/library/categories/language.d.ts +0 -11
- package/dist/adapters/prompts/library/categories/language.js +0 -12
- package/dist/adapters/prompts/library/categories/language.js.map +0 -1
- package/dist/adapters/prompts/library/categories/persona.d.ts +0 -13
- package/dist/adapters/prompts/library/categories/persona.js +0 -14
- package/dist/adapters/prompts/library/categories/persona.js.map +0 -1
- package/dist/adapters/prompts/library/categories/response.d.ts +0 -9
- package/dist/adapters/prompts/library/categories/response.js +0 -10
- package/dist/adapters/prompts/library/categories/response.js.map +0 -1
- package/dist/adapters/prompts/library/categories/tone.d.ts +0 -9
- package/dist/adapters/prompts/library/categories/tone.js +0 -10
- package/dist/adapters/prompts/library/categories/tone.js.map +0 -1
- package/dist/adapters/prompts/library/categories/verbosity.d.ts +0 -8
- package/dist/adapters/prompts/library/categories/verbosity.js +0 -9
- package/dist/adapters/prompts/library/categories/verbosity.js.map +0 -1
- package/dist/adapters/prompts/library/index.d.ts +0 -68
- package/dist/adapters/prompts/library/index.js +0 -26
- package/dist/adapters/prompts/library/index.js.map +0 -1
- package/dist/adapters/prompts/library/presets.d.ts +0 -17
- package/dist/adapters/prompts/library/presets.js +0 -45
- package/dist/adapters/prompts/library/presets.js.map +0 -1
- package/dist/adapters/prompts/system-prompt.adapter.d.ts +0 -9
- package/dist/adapters/prompts/system-prompt.adapter.js +0 -57
- package/dist/adapters/prompts/system-prompt.adapter.js.map +0 -1
- package/dist/adapters/prompts/user-prompt.adapter.d.ts +0 -9
- package/dist/adapters/prompts/user-prompt.adapter.js +0 -57
- package/dist/adapters/prompts/user-prompt.adapter.js.map +0 -1
- package/dist/adapters/tools/safe-tool.adapter.d.ts +0 -27
- package/dist/adapters/tools/safe-tool.adapter.js +0 -283
- package/dist/adapters/tools/safe-tool.adapter.js.map +0 -1
- package/dist/adapters/utils/__tests__/ai-response-parser.test.js +0 -289
- package/dist/adapters/utils/__tests__/ai-response-parser.test.js.map +0 -1
- package/dist/adapters/utils/ai-response-parser-error.d.ts +0 -8
- package/dist/adapters/utils/ai-response-parser-error.js +0 -136
- package/dist/adapters/utils/ai-response-parser-error.js.map +0 -1
- package/dist/adapters/utils/ai-response-parser.d.ts +0 -60
- package/dist/adapters/utils/ai-response-parser.js +0 -347
- package/dist/adapters/utils/ai-response-parser.js.map +0 -1
- package/dist/ports/agent.port.d.ts +0 -17
- package/dist/ports/agent.port.js +0 -7
- package/dist/ports/agent.port.js.map +0 -1
- package/dist/ports/model.port.d.ts +0 -10
- package/dist/ports/model.port.js +0 -5
- package/dist/ports/model.port.js.map +0 -1
- package/dist/ports/prompt.port.d.ts +0 -9
- package/dist/ports/prompt.port.js +0 -5
- package/dist/ports/prompt.port.js.map +0 -1
- package/dist/ports/tool.port.d.ts +0 -11
- package/dist/ports/tool.port.js +0 -5
- package/dist/ports/tool.port.js.map +0 -1
- /package/dist/{adapters/prompts/__tests__/presets.test.d.ts → middleware/__tests__/logging.middleware.test.d.ts} +0 -0
- /package/dist/{adapters/utils/__tests__/ai-response-parser.test.d.ts → parsing/__tests__/create-schema-prompt.test.d.ts} +0 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
2
|
+
try {
|
|
3
|
+
var info = gen[key](arg);
|
|
4
|
+
var value = info.value;
|
|
5
|
+
} catch (error) {
|
|
6
|
+
reject(error);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (info.done) {
|
|
10
|
+
resolve(value);
|
|
11
|
+
} else {
|
|
12
|
+
Promise.resolve(value).then(_next, _throw);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function _async_to_generator(fn) {
|
|
16
|
+
return function() {
|
|
17
|
+
var self = this, args = arguments;
|
|
18
|
+
return new Promise(function(resolve, reject) {
|
|
19
|
+
var gen = fn.apply(self, args);
|
|
20
|
+
function _next(value) {
|
|
21
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
22
|
+
}
|
|
23
|
+
function _throw(err) {
|
|
24
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
25
|
+
}
|
|
26
|
+
_next(undefined);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function _define_property(obj, key, value) {
|
|
31
|
+
if (key in obj) {
|
|
32
|
+
Object.defineProperty(obj, key, {
|
|
33
|
+
value: value,
|
|
34
|
+
enumerable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
writable: true
|
|
37
|
+
});
|
|
38
|
+
} else {
|
|
39
|
+
obj[key] = value;
|
|
40
|
+
}
|
|
41
|
+
return obj;
|
|
42
|
+
}
|
|
43
|
+
function _instanceof(left, right) {
|
|
44
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
45
|
+
return !!right[Symbol.hasInstance](left);
|
|
46
|
+
} else {
|
|
47
|
+
return left instanceof right;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function _object_spread(target) {
|
|
51
|
+
for(var i = 1; i < arguments.length; i++){
|
|
52
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
53
|
+
var ownKeys = Object.keys(source);
|
|
54
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
55
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
56
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
ownKeys.forEach(function(key) {
|
|
60
|
+
_define_property(target, key, source[key]);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return target;
|
|
64
|
+
}
|
|
65
|
+
function ownKeys(object, enumerableOnly) {
|
|
66
|
+
var keys = Object.keys(object);
|
|
67
|
+
if (Object.getOwnPropertySymbols) {
|
|
68
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
69
|
+
if (enumerableOnly) {
|
|
70
|
+
symbols = symbols.filter(function(sym) {
|
|
71
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
keys.push.apply(keys, symbols);
|
|
75
|
+
}
|
|
76
|
+
return keys;
|
|
77
|
+
}
|
|
78
|
+
function _object_spread_props(target, source) {
|
|
79
|
+
source = source != null ? source : {};
|
|
80
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
81
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
82
|
+
} else {
|
|
83
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
84
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return target;
|
|
88
|
+
}
|
|
89
|
+
function _ts_generator(thisArg, body) {
|
|
90
|
+
var f, y, t, _ = {
|
|
91
|
+
label: 0,
|
|
92
|
+
sent: function() {
|
|
93
|
+
if (t[0] & 1) throw t[1];
|
|
94
|
+
return t[1];
|
|
95
|
+
},
|
|
96
|
+
trys: [],
|
|
97
|
+
ops: []
|
|
98
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
99
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
100
|
+
return this;
|
|
101
|
+
}), g;
|
|
102
|
+
function verb(n) {
|
|
103
|
+
return function(v) {
|
|
104
|
+
return step([
|
|
105
|
+
n,
|
|
106
|
+
v
|
|
107
|
+
]);
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function step(op) {
|
|
111
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
112
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
113
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
114
|
+
if (y = 0, t) op = [
|
|
115
|
+
op[0] & 2,
|
|
116
|
+
t.value
|
|
117
|
+
];
|
|
118
|
+
switch(op[0]){
|
|
119
|
+
case 0:
|
|
120
|
+
case 1:
|
|
121
|
+
t = op;
|
|
122
|
+
break;
|
|
123
|
+
case 4:
|
|
124
|
+
_.label++;
|
|
125
|
+
return {
|
|
126
|
+
value: op[1],
|
|
127
|
+
done: false
|
|
128
|
+
};
|
|
129
|
+
case 5:
|
|
130
|
+
_.label++;
|
|
131
|
+
y = op[1];
|
|
132
|
+
op = [
|
|
133
|
+
0
|
|
134
|
+
];
|
|
135
|
+
continue;
|
|
136
|
+
case 7:
|
|
137
|
+
op = _.ops.pop();
|
|
138
|
+
_.trys.pop();
|
|
139
|
+
continue;
|
|
140
|
+
default:
|
|
141
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
142
|
+
_ = 0;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
146
|
+
_.label = op[1];
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
150
|
+
_.label = t[1];
|
|
151
|
+
t = op;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
if (t && _.label < t[2]) {
|
|
155
|
+
_.label = t[2];
|
|
156
|
+
_.ops.push(op);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
if (t[2]) _.ops.pop();
|
|
160
|
+
_.trys.pop();
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
op = body.call(thisArg, _);
|
|
164
|
+
} catch (e) {
|
|
165
|
+
op = [
|
|
166
|
+
6,
|
|
167
|
+
e
|
|
168
|
+
];
|
|
169
|
+
y = 0;
|
|
170
|
+
} finally{
|
|
171
|
+
f = t = 0;
|
|
172
|
+
}
|
|
173
|
+
if (op[0] & 5) throw op[1];
|
|
174
|
+
return {
|
|
175
|
+
value: op[0] ? op[1] : void 0,
|
|
176
|
+
done: true
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Creates AI SDK middleware that logs model requests and responses.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```ts
|
|
185
|
+
* import { wrapLanguageModel } from 'ai';
|
|
186
|
+
*
|
|
187
|
+
* const model = wrapLanguageModel({
|
|
188
|
+
* model: openrouter('anthropic/claude-sonnet-4-20250514'),
|
|
189
|
+
* middleware: createLoggingMiddleware({ logger }),
|
|
190
|
+
* });
|
|
191
|
+
* ```
|
|
192
|
+
*/ export function createLoggingMiddleware(options) {
|
|
193
|
+
var logger = options.logger, _options_verbose = options.verbose, verbose = _options_verbose === void 0 ? false : _options_verbose;
|
|
194
|
+
return {
|
|
195
|
+
middlewareVersion: 'v2',
|
|
196
|
+
wrapGenerate: function(param) {
|
|
197
|
+
var doGenerate = param.doGenerate, params = param.params;
|
|
198
|
+
return _async_to_generator(function() {
|
|
199
|
+
var startTime, result, error;
|
|
200
|
+
return _ts_generator(this, function(_state) {
|
|
201
|
+
switch(_state.label){
|
|
202
|
+
case 0:
|
|
203
|
+
startTime = Date.now();
|
|
204
|
+
logger.debug('Model request started', _object_spread({}, verbose && {
|
|
205
|
+
params: params
|
|
206
|
+
}));
|
|
207
|
+
_state.label = 1;
|
|
208
|
+
case 1:
|
|
209
|
+
_state.trys.push([
|
|
210
|
+
1,
|
|
211
|
+
3,
|
|
212
|
+
,
|
|
213
|
+
4
|
|
214
|
+
]);
|
|
215
|
+
return [
|
|
216
|
+
4,
|
|
217
|
+
doGenerate()
|
|
218
|
+
];
|
|
219
|
+
case 2:
|
|
220
|
+
result = _state.sent();
|
|
221
|
+
logger.debug('Model request completed', _object_spread({
|
|
222
|
+
durationMs: Date.now() - startTime,
|
|
223
|
+
finishReason: result.finishReason,
|
|
224
|
+
usage: result.usage
|
|
225
|
+
}, verbose && {
|
|
226
|
+
content: result.content
|
|
227
|
+
}));
|
|
228
|
+
return [
|
|
229
|
+
2,
|
|
230
|
+
result
|
|
231
|
+
];
|
|
232
|
+
case 3:
|
|
233
|
+
error = _state.sent();
|
|
234
|
+
logger.error('Model request failed', {
|
|
235
|
+
durationMs: Date.now() - startTime,
|
|
236
|
+
error: _instanceof(error, Error) ? error.message : 'Unknown error'
|
|
237
|
+
});
|
|
238
|
+
throw error;
|
|
239
|
+
case 4:
|
|
240
|
+
return [
|
|
241
|
+
2
|
|
242
|
+
];
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
})();
|
|
246
|
+
},
|
|
247
|
+
wrapStream: function(param) {
|
|
248
|
+
var doStream = param.doStream, params = param.params;
|
|
249
|
+
return _async_to_generator(function() {
|
|
250
|
+
var startTime, result, error;
|
|
251
|
+
return _ts_generator(this, function(_state) {
|
|
252
|
+
switch(_state.label){
|
|
253
|
+
case 0:
|
|
254
|
+
startTime = Date.now();
|
|
255
|
+
logger.debug('Model stream started', _object_spread({}, verbose && {
|
|
256
|
+
params: params
|
|
257
|
+
}));
|
|
258
|
+
_state.label = 1;
|
|
259
|
+
case 1:
|
|
260
|
+
_state.trys.push([
|
|
261
|
+
1,
|
|
262
|
+
3,
|
|
263
|
+
,
|
|
264
|
+
4
|
|
265
|
+
]);
|
|
266
|
+
return [
|
|
267
|
+
4,
|
|
268
|
+
doStream()
|
|
269
|
+
];
|
|
270
|
+
case 2:
|
|
271
|
+
result = _state.sent();
|
|
272
|
+
return [
|
|
273
|
+
2,
|
|
274
|
+
_object_spread_props(_object_spread({}, result), {
|
|
275
|
+
stream: result.stream
|
|
276
|
+
})
|
|
277
|
+
];
|
|
278
|
+
case 3:
|
|
279
|
+
error = _state.sent();
|
|
280
|
+
logger.error('Model stream failed', {
|
|
281
|
+
durationMs: Date.now() - startTime,
|
|
282
|
+
error: _instanceof(error, Error) ? error.message : 'Unknown error'
|
|
283
|
+
});
|
|
284
|
+
throw error;
|
|
285
|
+
case 4:
|
|
286
|
+
return [
|
|
287
|
+
2
|
|
288
|
+
];
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
})();
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
//# sourceMappingURL=logging.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/logging.middleware.ts"],"sourcesContent":["import type { LoggerPort } from '@jterrazz/logger';\nimport type { LanguageModelMiddleware } from 'ai';\n\nexport interface LoggingMiddlewareOptions {\n logger: LoggerPort;\n /** Include request/response details in logs (default: false) */\n verbose?: boolean;\n}\n\n/**\n * Creates AI SDK middleware that logs model requests and responses.\n *\n * @example\n * ```ts\n * import { wrapLanguageModel } from 'ai';\n *\n * const model = wrapLanguageModel({\n * model: openrouter('anthropic/claude-sonnet-4-20250514'),\n * middleware: createLoggingMiddleware({ logger }),\n * });\n * ```\n */\nexport function createLoggingMiddleware(\n options: LoggingMiddlewareOptions,\n): LanguageModelMiddleware {\n const { logger, verbose = false } = options;\n\n return {\n middlewareVersion: 'v2',\n\n wrapGenerate: async ({ doGenerate, params }) => {\n const startTime = Date.now();\n\n logger.debug('Model request started', {\n ...(verbose && { params }),\n });\n\n try {\n const result = await doGenerate();\n\n logger.debug('Model request completed', {\n durationMs: Date.now() - startTime,\n finishReason: result.finishReason,\n usage: result.usage,\n ...(verbose && { content: result.content }),\n });\n\n return result;\n } catch (error) {\n logger.error('Model request failed', {\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n },\n\n wrapStream: async ({ doStream, params }) => {\n const startTime = Date.now();\n\n logger.debug('Model stream started', {\n ...(verbose && { params }),\n });\n\n try {\n const result = await doStream();\n\n return {\n ...result,\n stream: result.stream,\n };\n } catch (error) {\n logger.error('Model stream failed', {\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n },\n };\n}\n"],"names":["createLoggingMiddleware","options","logger","verbose","middlewareVersion","wrapGenerate","doGenerate","params","startTime","result","error","Date","now","debug","durationMs","finishReason","usage","content","Error","message","wrapStream","doStream","stream"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA;;;;;;;;;;;;CAYC,GACD,OAAO,SAASA,wBACZC,OAAiC;IAEjC,IAAQC,SAA4BD,QAA5BC,2BAA4BD,QAApBE,SAAAA,wCAAU;IAE1B,OAAO;QACHC,mBAAmB;QAEnBC,cAAc;gBAASC,mBAAAA,YAAYC,eAAAA;;oBACzBC,WAOIC,QAUDC;;;;4BAjBHF,YAAYG,KAAKC,GAAG;4BAE1BV,OAAOW,KAAK,CAAC,yBAAyB,mBAC9BV,WAAW;gCAAEI,QAAAA;4BAAO;;;;;;;;;4BAIT;;gCAAMD;;;4BAAfG,SAAS;4BAEfP,OAAOW,KAAK,CAAC,2BAA2B;gCACpCC,YAAYH,KAAKC,GAAG,KAAKJ;gCACzBO,cAAcN,OAAOM,YAAY;gCACjCC,OAAOP,OAAOO,KAAK;+BACfb,WAAW;gCAAEc,SAASR,OAAOQ,OAAO;4BAAC;4BAG7C;;gCAAOR;;;4BACFC;4BACLR,OAAOQ,KAAK,CAAC,wBAAwB;gCACjCI,YAAYH,KAAKC,GAAG,KAAKJ;gCACzBE,OAAOA,AAAK,YAALA,OAAiBQ,SAAQR,MAAMS,OAAO,GAAG;4BACpD;4BACA,MAAMT;;;;;;;YAEd;;QAEAU,YAAY;gBAASC,iBAAAA,UAAUd,eAAAA;;oBACrBC,WAOIC,QAMDC;;;;4BAbHF,YAAYG,KAAKC,GAAG;4BAE1BV,OAAOW,KAAK,CAAC,wBAAwB,mBAC7BV,WAAW;gCAAEI,QAAAA;4BAAO;;;;;;;;;4BAIT;;gCAAMc;;;4BAAfZ,SAAS;4BAEf;;gCAAO,wCACAA;oCACHa,QAAQb,OAAOa,MAAM;;;;4BAEpBZ;4BACLR,OAAOQ,KAAK,CAAC,uBAAuB;gCAChCI,YAAYH,KAAKC,GAAG,KAAKJ;gCACzBE,OAAOA,AAAK,YAALA,OAAiBQ,SAAQR,MAAMS,OAAO,GAAG;4BACpD;4BACA,MAAMT;;;;;;;YAEd;;IACJ;AACJ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
import { createSchemaPrompt } from '../create-schema-prompt.js';
|
|
4
|
+
describe('createSchemaPrompt', function() {
|
|
5
|
+
describe('object schemas', function() {
|
|
6
|
+
it('generates JSON output instructions for object schema', function() {
|
|
7
|
+
var schema = z.object({
|
|
8
|
+
tags: z.array(z.string()),
|
|
9
|
+
title: z.string()
|
|
10
|
+
});
|
|
11
|
+
var prompt = createSchemaPrompt(schema);
|
|
12
|
+
expect(prompt).toContain('<OUTPUT_FORMAT>');
|
|
13
|
+
expect(prompt).toContain('</OUTPUT_FORMAT>');
|
|
14
|
+
expect(prompt).toContain('valid JSON');
|
|
15
|
+
expect(prompt).toContain('```json');
|
|
16
|
+
expect(prompt).toContain('"type": "object"');
|
|
17
|
+
expect(prompt).toContain('"title"');
|
|
18
|
+
expect(prompt).toContain('"tags"');
|
|
19
|
+
expect(prompt).toContain('Do not include any text outside the JSON');
|
|
20
|
+
});
|
|
21
|
+
it('generates JSON output instructions for array schema', function() {
|
|
22
|
+
var schema = z.array(z.string());
|
|
23
|
+
var prompt = createSchemaPrompt(schema);
|
|
24
|
+
expect(prompt).toContain('valid JSON');
|
|
25
|
+
expect(prompt).toContain('"type": "array"');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('primitive schemas', function() {
|
|
29
|
+
it('generates primitive-specific instructions for string schema', function() {
|
|
30
|
+
var schema = z.string().min(5);
|
|
31
|
+
var prompt = createSchemaPrompt(schema);
|
|
32
|
+
expect(prompt).toContain('<OUTPUT_FORMAT>');
|
|
33
|
+
expect(prompt).toContain('string value');
|
|
34
|
+
expect(prompt).toContain('"type": "string"');
|
|
35
|
+
expect(prompt).toContain('without any JSON wrapping');
|
|
36
|
+
});
|
|
37
|
+
it('generates primitive-specific instructions for number schema', function() {
|
|
38
|
+
var schema = z.number().min(0).max(100);
|
|
39
|
+
var prompt = createSchemaPrompt(schema);
|
|
40
|
+
expect(prompt).toContain('number value');
|
|
41
|
+
expect(prompt).toContain('"type": "number"');
|
|
42
|
+
expect(prompt).toContain('without any JSON wrapping');
|
|
43
|
+
});
|
|
44
|
+
it('generates primitive-specific instructions for boolean schema', function() {
|
|
45
|
+
var schema = z["boolean"]();
|
|
46
|
+
var prompt = createSchemaPrompt(schema);
|
|
47
|
+
expect(prompt).toContain('boolean value');
|
|
48
|
+
expect(prompt).toContain('"type": "boolean"');
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=create-schema-prompt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/parsing/__tests__/create-schema-prompt.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { z } from 'zod/v4';\n\nimport { createSchemaPrompt } from '../create-schema-prompt.js';\n\ndescribe('createSchemaPrompt', () => {\n describe('object schemas', () => {\n it('generates JSON output instructions for object schema', () => {\n const schema = z.object({\n tags: z.array(z.string()),\n title: z.string(),\n });\n\n const prompt = createSchemaPrompt(schema);\n\n expect(prompt).toContain('<OUTPUT_FORMAT>');\n expect(prompt).toContain('</OUTPUT_FORMAT>');\n expect(prompt).toContain('valid JSON');\n expect(prompt).toContain('```json');\n expect(prompt).toContain('\"type\": \"object\"');\n expect(prompt).toContain('\"title\"');\n expect(prompt).toContain('\"tags\"');\n expect(prompt).toContain('Do not include any text outside the JSON');\n });\n\n it('generates JSON output instructions for array schema', () => {\n const schema = z.array(z.string());\n\n const prompt = createSchemaPrompt(schema);\n\n expect(prompt).toContain('valid JSON');\n expect(prompt).toContain('\"type\": \"array\"');\n });\n });\n\n describe('primitive schemas', () => {\n it('generates primitive-specific instructions for string schema', () => {\n const schema = z.string().min(5);\n\n const prompt = createSchemaPrompt(schema);\n\n expect(prompt).toContain('<OUTPUT_FORMAT>');\n expect(prompt).toContain('string value');\n expect(prompt).toContain('\"type\": \"string\"');\n expect(prompt).toContain('without any JSON wrapping');\n });\n\n it('generates primitive-specific instructions for number schema', () => {\n const schema = z.number().min(0).max(100);\n\n const prompt = createSchemaPrompt(schema);\n\n expect(prompt).toContain('number value');\n expect(prompt).toContain('\"type\": \"number\"');\n expect(prompt).toContain('without any JSON wrapping');\n });\n\n it('generates primitive-specific instructions for boolean schema', () => {\n const schema = z.boolean();\n\n const prompt = createSchemaPrompt(schema);\n\n expect(prompt).toContain('boolean value');\n expect(prompt).toContain('\"type\": \"boolean\"');\n });\n });\n});\n"],"names":["describe","expect","it","z","createSchemaPrompt","schema","object","tags","array","string","title","prompt","toContain","min","number","max","boolean"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AAC9C,SAASC,CAAC,QAAQ,SAAS;AAE3B,SAASC,kBAAkB,QAAQ,6BAA6B;AAEhEJ,SAAS,sBAAsB;IAC3BA,SAAS,kBAAkB;QACvBE,GAAG,wDAAwD;YACvD,IAAMG,SAASF,EAAEG,MAAM,CAAC;gBACpBC,MAAMJ,EAAEK,KAAK,CAACL,EAAEM,MAAM;gBACtBC,OAAOP,EAAEM,MAAM;YACnB;YAEA,IAAME,SAASP,mBAAmBC;YAElCJ,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;QAC7B;QAEAV,GAAG,uDAAuD;YACtD,IAAMG,SAASF,EAAEK,KAAK,CAACL,EAAEM,MAAM;YAE/B,IAAME,SAASP,mBAAmBC;YAElCJ,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;QAC7B;IACJ;IAEAZ,SAAS,qBAAqB;QAC1BE,GAAG,+DAA+D;YAC9D,IAAMG,SAASF,EAAEM,MAAM,GAAGI,GAAG,CAAC;YAE9B,IAAMF,SAASP,mBAAmBC;YAElCJ,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;QAC7B;QAEAV,GAAG,+DAA+D;YAC9D,IAAMG,SAASF,EAAEW,MAAM,GAAGD,GAAG,CAAC,GAAGE,GAAG,CAAC;YAErC,IAAMJ,SAASP,mBAAmBC;YAElCJ,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;QAC7B;QAEAV,GAAG,gEAAgE;YAC/D,IAAMG,SAASF,CAAEa,CAAAA,UAAO;YAExB,IAAML,SAASP,mBAAmBC;YAElCJ,OAAOU,QAAQC,SAAS,CAAC;YACzBX,OAAOU,QAAQC,SAAS,CAAC;QAC7B;IACJ;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
import { parseObject, ParseObjectError } from '../parse-object.js';
|
|
4
|
+
var articleSchema = z.object({
|
|
5
|
+
content: z.string(),
|
|
6
|
+
tags: z.array(z.string()),
|
|
7
|
+
title: z.string()
|
|
8
|
+
});
|
|
9
|
+
var validArticle = {
|
|
10
|
+
content: 'Test content',
|
|
11
|
+
tags: [
|
|
12
|
+
'test',
|
|
13
|
+
'ai'
|
|
14
|
+
],
|
|
15
|
+
title: 'Test Article'
|
|
16
|
+
};
|
|
17
|
+
var validArticleJson = JSON.stringify(validArticle);
|
|
18
|
+
describe('parseObject', function() {
|
|
19
|
+
describe('object parsing', function() {
|
|
20
|
+
it('parses valid JSON object', function() {
|
|
21
|
+
var text = validArticleJson;
|
|
22
|
+
var result = parseObject(text, articleSchema);
|
|
23
|
+
expect(result).toEqual(validArticle);
|
|
24
|
+
});
|
|
25
|
+
it('extracts JSON object from surrounding prose', function() {
|
|
26
|
+
var text = "Here's the article: ".concat(validArticleJson, " - end of article");
|
|
27
|
+
var result = parseObject(text, articleSchema);
|
|
28
|
+
expect(result).toEqual(validArticle);
|
|
29
|
+
});
|
|
30
|
+
it('parses JSON from markdown code block', function() {
|
|
31
|
+
var text = "```json\n".concat(validArticleJson, "\n```");
|
|
32
|
+
var result = parseObject(text, articleSchema);
|
|
33
|
+
expect(result).toEqual(validArticle);
|
|
34
|
+
});
|
|
35
|
+
it('handles newlines in JSON values', function() {
|
|
36
|
+
var text = '{\n "content": "Test\\ncontent\\nwith\\nnewlines",\n "tags": ["test", "ai"],\n "title": "Test\\nArticle"\n }';
|
|
37
|
+
var result = parseObject(text, articleSchema);
|
|
38
|
+
expect(result).toEqual({
|
|
39
|
+
content: 'Test\ncontent\nwith\nnewlines',
|
|
40
|
+
tags: [
|
|
41
|
+
'test',
|
|
42
|
+
'ai'
|
|
43
|
+
],
|
|
44
|
+
title: 'Test\nArticle'
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it('handles escaped characters in JSON', function() {
|
|
48
|
+
var text = '{"content": "Test\\ncontent\\twith\\r\\nescapes", "tags": ["test\\u0020ai", "escaped\\"quotes\\""], "title": "Test\\\\Article"}';
|
|
49
|
+
var result = parseObject(text, articleSchema);
|
|
50
|
+
expect(result).toEqual({
|
|
51
|
+
content: 'Test\ncontent\twith\r\nescapes',
|
|
52
|
+
tags: [
|
|
53
|
+
'test ai',
|
|
54
|
+
'escaped"quotes"'
|
|
55
|
+
],
|
|
56
|
+
title: 'Test\\Article'
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('array parsing', function() {
|
|
61
|
+
it('parses JSON array', function() {
|
|
62
|
+
var text = '["test", "ai", "content"]';
|
|
63
|
+
var schema = z.array(z.string());
|
|
64
|
+
var result = parseObject(text, schema);
|
|
65
|
+
expect(result).toEqual([
|
|
66
|
+
'test',
|
|
67
|
+
'ai',
|
|
68
|
+
'content'
|
|
69
|
+
]);
|
|
70
|
+
});
|
|
71
|
+
it('parses array of objects from markdown code block', function() {
|
|
72
|
+
var text = "```json\n[".concat(validArticleJson, "]\n```");
|
|
73
|
+
var schema = z.array(articleSchema);
|
|
74
|
+
var result = parseObject(text, schema);
|
|
75
|
+
expect(result).toEqual([
|
|
76
|
+
validArticle
|
|
77
|
+
]);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('primitive parsing', function() {
|
|
81
|
+
it('parses string value', function() {
|
|
82
|
+
var text = '"test string"';
|
|
83
|
+
var result = parseObject(text, z.string());
|
|
84
|
+
expect(result).toBe('test string');
|
|
85
|
+
});
|
|
86
|
+
it('parses number value', function() {
|
|
87
|
+
var text = '42';
|
|
88
|
+
var result = parseObject(text, z.number());
|
|
89
|
+
expect(result).toBe(42);
|
|
90
|
+
});
|
|
91
|
+
it('parses boolean value', function() {
|
|
92
|
+
var text = 'true';
|
|
93
|
+
var result = parseObject(text, z["boolean"]());
|
|
94
|
+
expect(result).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it('parses null value', function() {
|
|
97
|
+
var text = 'null';
|
|
98
|
+
var result = parseObject(text, z["null"]());
|
|
99
|
+
expect(result).toBeNull();
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('error handling', function() {
|
|
103
|
+
it('throws ParseObjectError for invalid JSON', function() {
|
|
104
|
+
var text = '{invalid json}';
|
|
105
|
+
expect(function() {
|
|
106
|
+
return parseObject(text, articleSchema);
|
|
107
|
+
}).toThrow(ParseObjectError);
|
|
108
|
+
});
|
|
109
|
+
it('throws ParseObjectError when schema validation fails', function() {
|
|
110
|
+
var text = JSON.stringify({
|
|
111
|
+
content: 'Test',
|
|
112
|
+
tags: [
|
|
113
|
+
'test'
|
|
114
|
+
],
|
|
115
|
+
title: 123
|
|
116
|
+
});
|
|
117
|
+
expect(function() {
|
|
118
|
+
return parseObject(text, articleSchema);
|
|
119
|
+
}).toThrow(ParseObjectError);
|
|
120
|
+
});
|
|
121
|
+
it('throws ParseObjectError when no object found', function() {
|
|
122
|
+
var text = 'No JSON object here';
|
|
123
|
+
expect(function() {
|
|
124
|
+
return parseObject(text, articleSchema);
|
|
125
|
+
}).toThrow(ParseObjectError);
|
|
126
|
+
});
|
|
127
|
+
it('throws ParseObjectError when no array found', function() {
|
|
128
|
+
var text = 'No array here';
|
|
129
|
+
var schema = z.array(z.string());
|
|
130
|
+
expect(function() {
|
|
131
|
+
return parseObject(text, schema);
|
|
132
|
+
}).toThrow(ParseObjectError);
|
|
133
|
+
});
|
|
134
|
+
it('throws ParseObjectError for unsupported schema type', function() {
|
|
135
|
+
var text = 'test';
|
|
136
|
+
var schema = z.union([
|
|
137
|
+
z.string(),
|
|
138
|
+
z.number()
|
|
139
|
+
]);
|
|
140
|
+
expect(function() {
|
|
141
|
+
return parseObject(text, schema);
|
|
142
|
+
}).toThrow(ParseObjectError);
|
|
143
|
+
});
|
|
144
|
+
it('includes original text in error', function() {
|
|
145
|
+
var text = '{invalid json}';
|
|
146
|
+
try {
|
|
147
|
+
parseObject(text, articleSchema);
|
|
148
|
+
throw new Error('Should have thrown');
|
|
149
|
+
} catch (error) {
|
|
150
|
+
expect(error).toBeInstanceOf(ParseObjectError);
|
|
151
|
+
expect(error.text).toBe(text);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('complex scenarios', function() {
|
|
156
|
+
it('parses complex nested JSON with escaped quotes', function() {
|
|
157
|
+
var _result_perspectives_;
|
|
158
|
+
var schema = z.object({
|
|
159
|
+
category: z.string(),
|
|
160
|
+
countries: z.array(z.string()),
|
|
161
|
+
perspectives: z.array(z.object({
|
|
162
|
+
digest: z.string(),
|
|
163
|
+
tags: z.object({
|
|
164
|
+
type: z.string(),
|
|
165
|
+
stance: z.string()
|
|
166
|
+
})
|
|
167
|
+
})),
|
|
168
|
+
synopsis: z.string()
|
|
169
|
+
});
|
|
170
|
+
var text = '```json\n{\n "category": "sports",\n "countries": ["us"],\n "perspectives": [{\n "digest": "The team\'s \\"Big 3\\" experiment failed.",\n "tags": { "type": "analysis", "stance": "neutral" }\n }],\n "synopsis": "A major trade occurred."\n}\n```';
|
|
171
|
+
var result = parseObject(text, schema);
|
|
172
|
+
expect(result.category).toBe('sports');
|
|
173
|
+
expect(result.countries).toEqual([
|
|
174
|
+
'us'
|
|
175
|
+
]);
|
|
176
|
+
expect((_result_perspectives_ = result.perspectives[0]) === null || _result_perspectives_ === void 0 ? void 0 : _result_perspectives_.digest).toContain('"Big 3" experiment');
|
|
177
|
+
expect(result.synopsis).toBe('A major trade occurred.');
|
|
178
|
+
});
|
|
179
|
+
it('handles text with multiple whitespace variations', function() {
|
|
180
|
+
var text = "Here's the\n\n article: \n\n".concat(validArticleJson, "\n\n");
|
|
181
|
+
var result = parseObject(text, articleSchema);
|
|
182
|
+
expect(result).toEqual(validArticle);
|
|
183
|
+
});
|
|
184
|
+
it('selects largest valid JSON when multiple structures present', function() {
|
|
185
|
+
var smallJson = '{"title": "Small"}';
|
|
186
|
+
var text = "First: ".concat(smallJson, ", Second: ").concat(validArticleJson);
|
|
187
|
+
var result = parseObject(text, articleSchema);
|
|
188
|
+
expect(result).toEqual(validArticle);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
//# sourceMappingURL=parse-object.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/parsing/__tests__/parse-object.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { z } from 'zod/v4';\n\nimport { parseObject, ParseObjectError } from '../parse-object.js';\n\nconst articleSchema = z.object({\n content: z.string(),\n tags: z.array(z.string()),\n title: z.string(),\n});\n\nconst validArticle = {\n content: 'Test content',\n tags: ['test', 'ai'],\n title: 'Test Article',\n};\n\nconst validArticleJson = JSON.stringify(validArticle);\n\ndescribe('parseObject', () => {\n describe('object parsing', () => {\n it('parses valid JSON object', () => {\n const text = validArticleJson;\n const result = parseObject(text, articleSchema);\n expect(result).toEqual(validArticle);\n });\n\n it('extracts JSON object from surrounding prose', () => {\n const text = `Here's the article: ${validArticleJson} - end of article`;\n const result = parseObject(text, articleSchema);\n expect(result).toEqual(validArticle);\n });\n\n it('parses JSON from markdown code block', () => {\n const text = `\\`\\`\\`json\\n${validArticleJson}\\n\\`\\`\\``;\n const result = parseObject(text, articleSchema);\n expect(result).toEqual(validArticle);\n });\n\n it('handles newlines in JSON values', () => {\n const text = `{\n \"content\": \"Test\\\\ncontent\\\\nwith\\\\nnewlines\",\n \"tags\": [\"test\", \"ai\"],\n \"title\": \"Test\\\\nArticle\"\n }`;\n const result = parseObject(text, articleSchema);\n expect(result).toEqual({\n content: 'Test\\ncontent\\nwith\\nnewlines',\n tags: ['test', 'ai'],\n title: 'Test\\nArticle',\n });\n });\n\n it('handles escaped characters in JSON', () => {\n const text =\n '{\"content\": \"Test\\\\ncontent\\\\twith\\\\r\\\\nescapes\", \"tags\": [\"test\\\\u0020ai\", \"escaped\\\\\"quotes\\\\\"\"], \"title\": \"Test\\\\\\\\Article\"}';\n const result = parseObject(text, articleSchema);\n expect(result).toEqual({\n content: 'Test\\ncontent\\twith\\r\\nescapes',\n tags: ['test ai', 'escaped\"quotes\"'],\n title: 'Test\\\\Article',\n });\n });\n });\n\n describe('array parsing', () => {\n it('parses JSON array', () => {\n const text = '[\"test\", \"ai\", \"content\"]';\n const schema = z.array(z.string());\n const result = parseObject(text, schema);\n expect(result).toEqual(['test', 'ai', 'content']);\n });\n\n it('parses array of objects from markdown code block', () => {\n const text = `\\`\\`\\`json\\n[${validArticleJson}]\\n\\`\\`\\``;\n const schema = z.array(articleSchema);\n const result = parseObject(text, schema);\n expect(result).toEqual([validArticle]);\n });\n });\n\n describe('primitive parsing', () => {\n it('parses string value', () => {\n const text = '\"test string\"';\n const result = parseObject(text, z.string());\n expect(result).toBe('test string');\n });\n\n it('parses number value', () => {\n const text = '42';\n const result = parseObject(text, z.number());\n expect(result).toBe(42);\n });\n\n it('parses boolean value', () => {\n const text = 'true';\n const result = parseObject(text, z.boolean());\n expect(result).toBe(true);\n });\n\n it('parses null value', () => {\n const text = 'null';\n const result = parseObject(text, z.null());\n expect(result).toBeNull();\n });\n });\n\n describe('error handling', () => {\n it('throws ParseObjectError for invalid JSON', () => {\n const text = '{invalid json}';\n expect(() => parseObject(text, articleSchema)).toThrow(ParseObjectError);\n });\n\n it('throws ParseObjectError when schema validation fails', () => {\n const text = JSON.stringify({\n content: 'Test',\n tags: ['test'],\n title: 123,\n });\n expect(() => parseObject(text, articleSchema)).toThrow(ParseObjectError);\n });\n\n it('throws ParseObjectError when no object found', () => {\n const text = 'No JSON object here';\n expect(() => parseObject(text, articleSchema)).toThrow(ParseObjectError);\n });\n\n it('throws ParseObjectError when no array found', () => {\n const text = 'No array here';\n const schema = z.array(z.string());\n expect(() => parseObject(text, schema)).toThrow(ParseObjectError);\n });\n\n it('throws ParseObjectError for unsupported schema type', () => {\n const text = 'test';\n const schema = z.union([z.string(), z.number()]);\n expect(() => parseObject(text, schema)).toThrow(ParseObjectError);\n });\n\n it('includes original text in error', () => {\n const text = '{invalid json}';\n try {\n parseObject(text, articleSchema);\n throw new Error('Should have thrown');\n } catch (error) {\n expect(error).toBeInstanceOf(ParseObjectError);\n expect((error as ParseObjectError).text).toBe(text);\n }\n });\n });\n\n describe('complex scenarios', () => {\n it('parses complex nested JSON with escaped quotes', () => {\n const schema = z.object({\n category: z.string(),\n countries: z.array(z.string()),\n perspectives: z.array(\n z.object({\n digest: z.string(),\n tags: z.object({\n type: z.string(),\n stance: z.string(),\n }),\n }),\n ),\n synopsis: z.string(),\n });\n\n const text = `\\`\\`\\`json\n{\n \"category\": \"sports\",\n \"countries\": [\"us\"],\n \"perspectives\": [{\n \"digest\": \"The team's \\\\\"Big 3\\\\\" experiment failed.\",\n \"tags\": { \"type\": \"analysis\", \"stance\": \"neutral\" }\n }],\n \"synopsis\": \"A major trade occurred.\"\n}\n\\`\\`\\``;\n\n const result = parseObject(text, schema);\n expect(result.category).toBe('sports');\n expect(result.countries).toEqual(['us']);\n expect(result.perspectives[0]?.digest).toContain('\"Big 3\" experiment');\n expect(result.synopsis).toBe('A major trade occurred.');\n });\n\n it('handles text with multiple whitespace variations', () => {\n const text = `Here's the\\n\\n article: \\n\\n${validArticleJson}\\n\\n`;\n const result = parseObject(text, articleSchema);\n expect(result).toEqual(validArticle);\n });\n\n it('selects largest valid JSON when multiple structures present', () => {\n const smallJson = '{\"title\": \"Small\"}';\n const text = `First: ${smallJson}, Second: ${validArticleJson}`;\n const result = parseObject(text, articleSchema);\n expect(result).toEqual(validArticle);\n });\n });\n});\n"],"names":["describe","expect","it","z","parseObject","ParseObjectError","articleSchema","object","content","string","tags","array","title","validArticle","validArticleJson","JSON","stringify","text","result","toEqual","schema","toBe","number","boolean","null","toBeNull","toThrow","union","Error","error","toBeInstanceOf","category","countries","perspectives","digest","type","stance","synopsis","toContain","smallJson"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|