diff --git a/.github/workflows/bench-pr.yml b/.github/workflows/bench-pr.yml index 481c628e..187234eb 100644 --- a/.github/workflows/bench-pr.yml +++ b/.github/workflows/bench-pr.yml @@ -41,3 +41,5 @@ jobs: path: | bench/bench.json bench/download.json + bench/stack.json + schemas/libraries/**/download_compiled/** diff --git a/bench/bench.json b/bench/bench.json index 25ea120f..ac530b34 100644 --- a/bench/bench.json +++ b/bench/bench.json @@ -1 +1 @@ -{"initialization":[{"id":"5ddd5087-863a-4e4c-895c-12b7e9272722","libraryName":"typia","version":"11.0.3","note":"createIs","snippet":"typia.createIs()","mean":0.000056475238884682594,"optimizeType":"precompiled","type":"initialization"},{"id":"2a52935a-8a6f-4bce-ae0f-476483de34fc","libraryName":"typia","version":"11.0.3","note":"createValidate","snippet":"typia.createValidate()","mean":0.00011767597263886081,"optimizeType":"precompiled","type":"initialization"},{"id":"789fb2de-19ba-45fc-a04f-8f3c62cda96d","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"object(...)","mean":0.0010741857889578531,"optimizeType":"none","type":"initialization"},{"id":"0b304a80-ae47-4982-adb5-0fff34e1007d","libraryName":"io-ts","version":"2.2.22","snippet":"t.type(...)","mean":0.00302696161821013,"optimizeType":"none","type":"initialization"},{"id":"adf8ebd7-75f9-4cee-96ab-b9660342996a","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.schema(...)","mean":0.008564769763099967,"optimizeType":"jit","type":"initialization"},{"id":"c3ecde74-f4db-4ebf-8b7a-925ddbfff8c3","libraryName":"typebox","version":"1.1.5","snippet":"Type.Object(...)","mean":0.010818850235848203,"optimizeType":"jit","type":"initialization"},{"id":"89a7ec39-35d6-4d02-929b-18c520a27fb9","libraryName":"valibot","version":"1.2.0","snippet":"v.object(...)","mean":0.0458496093255714,"optimizeType":"none","type":"initialization"},{"id":"810a55e1-7535-4115-9826-5f4afba4b12b","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile","snippet":"S.compile(S.schema(...))","mean":0.0877131263047146,"optimizeType":"jit","type":"initialization"},{"id":"45e6ea49-b82c-4e4c-9e48-cbed45153f78","libraryName":"yup","version":"1.7.1","snippet":"object(...)","mean":0.10330303160830331,"optimizeType":"none","type":"initialization"},{"id":"9e403fd8-a1f2-4eee-b686-0b56d444a7d9","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"Schema.struct(...)","mean":0.17132477694020803,"optimizeType":"none","type":"initialization"},{"id":"2948a3fe-e90f-46d5-a459-6a035eac7919","libraryName":"joi","version":"18.0.2","snippet":"object(...)","mean":0.2055598127440983,"optimizeType":"none","type":"initialization"},{"id":"d988483d-96e1-4889-a4ba-9286c751a22c","libraryName":"zod/mini","version":"4.3.6","snippet":"z.object(...)","mean":0.20584712412515752,"optimizeType":"jit","type":"initialization"},{"id":"983299cb-8bc3-4111-9482-2e22cdb09c97","libraryName":"effect___beta","version":"4.0.0-beta.5","note":"decodeUnknownOption","snippet":"Schema.decodeUnknownOption(\n Schema.struct(...)\n)","mean":0.22714064353008487,"optimizeType":"none","type":"initialization"},{"id":"9bd1a1c3-e02b-4766-8b87-8d85b99887b0","libraryName":"effect","version":"3.19.19","snippet":"Schema.struct(...)","mean":0.43637475698081607,"optimizeType":"none","type":"initialization"},{"id":"4a212866-0052-48f8-97c9-3966b86969f5","libraryName":"arktype","version":"2.1.29","snippet":"type(...)","mean":0.5346481304115488,"optimizeType":"jit","type":"initialization"},{"id":"72082c8b-a2c9-4c74-b1cb-546e2c2033bb","libraryName":"effect","version":"3.19.19","note":"decodeUnknownEither","snippet":"Schema.decodeUnknownEither(\n Schema.struct(...)\n)","mean":0.5575959071310258,"optimizeType":"none","type":"initialization"},{"id":"bd9a1868-a048-408d-892a-cb456378ee3b","libraryName":"zod","version":"4.3.6","snippet":"z.object(...)","mean":0.6921335607094325,"optimizeType":"jit","type":"initialization"},{"id":"917685a2-9826-4659-acc3-386597321550","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"Schema.Compile(Type.Object(...))","mean":0.8274960314309272,"optimizeType":"jit","type":"initialization"},{"id":"8949e8d6-da1c-42de-8d11-ec0080b9c9c7","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"Compile(Type.Object(...))","mean":0.8386609706621853,"optimizeType":"jit","type":"initialization"},{"id":"fdafc9ad-f27f-44d3-98d6-d6961a4ced4b","libraryName":"ajv","version":"8.18.0","snippet":"ajv.compile({...})","mean":3.9553305454545375,"optimizeType":"jit","type":"initialization"}],"parsing":{"valid":[{"id":"532bb64a-6dd2-4667-a40f-c321580a9f51","libraryName":"typia","version":"11.0.3","note":"createValidate","snippet":"// const validate = typia.createValidate();\nvalidate(data);","mean":0.0010949291461107929,"optimizeType":"precompiled","type":"parsing","errorType":"allErrors"},{"id":"468ecaed-ee4f-46dd-8554-a3546bc17ec5","libraryName":"typia","version":"11.0.3","note":"validate","snippet":"typia.validate(data)","mean":0.001209050161041795,"optimizeType":"precompiled","type":"parsing","errorType":"allErrors"},{"id":"4d937307-bfc6-49b8-9ec7-9d1791daaaed","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile + safe","snippet":"// const compile = S.compile(S.schema(...));\nS.safe(() => compile(data));","mean":0.002496217582317351,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"0c771658-2a14-4882-998f-866abe0ead3a","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.parseOrThrow(data, schema)","throws":true,"mean":0.0025297544498295277,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"5aeba17e-0769-4d80-b015-6457831ffefd","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile","snippet":"// const compile = S.compile(S.schema(...));\ncompile(data);","throws":true,"mean":0.0025530563713959684,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"eedbacb4-2465-4859-8de2-aed59ea97f72","libraryName":"sury","version":"11.0.0-alpha.4","note":"safe","snippet":"S.safe(() => S.parseOrThrow(data, schema))","mean":0.0025625129791262977,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"2b50516f-a47f-44f8-ae70-7bd26eadaf34","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"// const compiledSchema = Schema.Compile(schema);\ncompiledSchema.Parse(data);","throws":true,"mean":0.0030804545911038367,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"5ebfaf4a-e93d-4a9b-ab02-428f24a52919","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"// const compiled = Compile(schema);\ncompiled.Parse(data);","throws":true,"mean":0.003119782982250834,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"008faa20-5b2a-48b3-beff-55b86b287721","libraryName":"io-ts","version":"2.2.22","snippet":"schema.decode(data)","mean":0.005960696040914558,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"3433c917-0e0a-4732-915b-aa32ab1772dd","libraryName":"arktype","version":"2.1.29","snippet":"schema(data)","mean":0.006771091565269639,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"5b9b08f4-f217-410a-a775-61b5147b683e","libraryName":"zod","version":"4.3.6","snippet":"schema.safeParse(data)","mean":0.00877913914860546,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"fa2ef76d-d526-4616-bcc0-a287d3180fe5","libraryName":"valibot","version":"1.2.0","note":"abortPipeEarly only","snippet":"v.safeParse(schema, data, { abortPipeEarly: true })","mean":0.011794575042755816,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"c2645371-a25b-4f0d-8644-2677ee63b3f4","libraryName":"valibot","version":"1.2.0","snippet":"v.safeParse(schema, data, { abortEarly: true })","mean":0.011839245296870464,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"d6ba5d7e-b6aa-49c6-a44c-d3019f44419d","libraryName":"valibot","version":"1.2.0","snippet":"v.safeParse(schema, data)","mean":0.012130171009220213,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"689292bf-7be4-499e-8061-d12ff5d885d4","libraryName":"zod/mini","version":"4.3.6","note":"jitless","snippet":"schema.safeParse(data, { jitless: true })","mean":0.012439325894687572,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"ec5c2dea-bb0a-4783-9c0e-bfd440de5752","libraryName":"zod/mini","version":"4.3.6","snippet":"schema.safeParse(data)","mean":0.012704256282236337,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"dd4176f0-c2e7-4d1d-8a54-ba8160ab33b7","libraryName":"zod","version":"4.3.6","note":"jitless","snippet":"schema.safeParse(data, { jitless: true })","mean":0.013230908548447757,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"1ec1d724-f7a8-420c-adbe-e3347b9f6d38","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const decode = Schema.decodeUnknownOption(schema);\ndecode(data, { errors: \"first\" })","mean":0.01626375750971926,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"02646f99-3c3b-4c9c-8e91-8b4401e4416b","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const decode = Schema.decodeUnknownOption(schema);\ndecode(data, { errors: \"all\" })","mean":0.01631994162382776,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"adf0e85f-2824-48c5-b273-11eb72d8e1b9","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"validate(data, schema, { abortEarly: true })","mean":0.01726665275571757,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"88f98b90-1147-47e6-ab95-fd83c30504b4","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"validate(data, schema)","mean":0.017708908232832134,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"4d9734f0-e1e5-4f07-87c1-44e399f69aa2","libraryName":"effect","version":"3.19.19","snippet":"// const decodeFirst = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"first\" }\n// );\ndecodeFirst(data)","mean":0.017969347001853982,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"fe3c873b-20b7-421e-b193-ec1a2572275b","libraryName":"effect","version":"3.19.19","snippet":"// const decodeAll = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"all\" }\n// );\ndecodeAll(data)","mean":0.018072281996603427,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"af16c280-45a9-492c-9ddd-d10c633d9d09","libraryName":"joi","version":"18.0.2","snippet":"schema.validate(data, { abortEarly: false })","mean":0.03819479195630791,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"6e77fa4f-1277-4e8f-a7a7-1d2070ba8e16","libraryName":"joi","version":"18.0.2","snippet":"schema.validate(data, { abortEarly: true })","mean":0.03821045546597941,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"51ed2ef7-d816-47e2-929d-9394f4673215","libraryName":"typebox","version":"1.1.5","note":"schema","snippet":"Schema.Parse(schema, data)","throws":true,"mean":0.06973392322707174,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"4931e6e0-daf6-4482-9fb9-4cee3ee7a4b8","libraryName":"typebox","version":"1.1.5","snippet":"Value.Parse(schema, data)","throws":true,"mean":0.0849550319429708,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"cd6de880-8768-4ccf-8208-a956393425db","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data, { abortEarly: true })","throws":true,"mean":0.13812650276243013,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"8cce78d7-30ce-4916-bda6-f90102964dca","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data, { abortEarly: false })","throws":true,"mean":0.13871883936746585,"optimizeType":"none","type":"parsing","errorType":"allErrors"}],"invalid":[{"id":"c9b6ad92-14f2-4d64-8daa-849b3723ef8c","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"validate(data, schema, { abortEarly: true })","mean":0.0006710623564356152,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"c1f08b19-9427-4633-887d-5937b2c63c9c","libraryName":"valibot","version":"1.2.0","snippet":"v.safeParse(schema, data, { abortEarly: true })","mean":0.0007401637108234875,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"00558d5d-63e2-465c-abbf-f94fbebfc122","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const decode = Schema.decodeUnknownOption(schema);\ndecode(data, { errors: \"first\" })","mean":0.0010690611267248021,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"9d290a27-50e5-4c46-9247-98a78cdf4cee","libraryName":"joi","version":"18.0.2","snippet":"schema.validate(data, { abortEarly: true })","mean":0.003890965292641172,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"b7560492-950d-4f45-944c-412cdd52d630","libraryName":"io-ts","version":"2.2.22","snippet":"schema.decode(data)","mean":0.005913396504010935,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"bde03dc0-6e29-4228-9f91-a255a50589d0","libraryName":"typia","version":"11.0.3","note":"createValidate","snippet":"// const validate = typia.createValidate();\nvalidate(data);","mean":0.006433344889701688,"optimizeType":"precompiled","type":"parsing","errorType":"allErrors"},{"id":"d794cf6a-d942-47c2-a315-ae442cd90910","libraryName":"typia","version":"11.0.3","note":"validate","snippet":"typia.validate(data)","mean":0.006755954106946628,"optimizeType":"precompiled","type":"parsing","errorType":"allErrors"},{"id":"99df5897-8ae5-4c53-a1bd-723d30f01e32","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile","snippet":"// const compile = S.compile(S.schema(...));\ncompile(data);","throws":true,"mean":0.007990764097646527,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"717ca5db-7bb3-414b-88c0-52831ff79afd","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile + safe","snippet":"// const compile = S.compile(S.schema(...));\nS.safe(() => compile(data));","mean":0.008113393093878764,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"105923be-c311-4a6e-a6e0-d73498a8bfbb","libraryName":"sury","version":"11.0.0-alpha.4","note":"safe","snippet":"S.safe(() => S.parseOrThrow(data, schema))","mean":0.008504094990264258,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"66613fce-c47a-48a5-92bf-3d7349354b76","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.parseOrThrow(data, schema)","throws":true,"mean":0.008668574358530126,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"faf23307-a8e1-4cd2-8e37-b0ef35fe92aa","libraryName":"effect","version":"3.19.19","snippet":"// const decodeFirst = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"first\" }\n// );\ndecodeFirst(data)","mean":0.009285078792939862,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"1d2e6f22-7091-4661-8aa9-3d778bf0b028","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const decode = Schema.decodeUnknownOption(schema);\ndecode(data, { errors: \"all\" })","mean":0.01983820572131371,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"dc286176-ce62-417b-884c-526eec933815","libraryName":"valibot","version":"1.2.0","snippet":"v.safeParse(schema, data)","mean":0.0285127084366909,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"a48e902a-14f6-4702-bd8b-4758eaf65578","libraryName":"valibot","version":"1.2.0","note":"abortPipeEarly only","snippet":"v.safeParse(schema, data, { abortPipeEarly: true })","mean":0.029018395722709776,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"3de706fd-9e12-4405-83cb-ba4c7b202836","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"validate(data, schema)","mean":0.030248596128253154,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"cec34c51-5147-42a8-9c98-da78c71ccec6","libraryName":"effect","version":"3.19.19","snippet":"// const decodeAll = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"all\" }\n// );\ndecodeAll(data)","mean":0.03125114044189119,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"bae6f3bd-30f9-4079-a1db-5191dc38c658","libraryName":"joi","version":"18.0.2","snippet":"schema.validate(data, { abortEarly: false })","mean":0.060095642809921884,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"119a6ad0-779a-40ec-b211-1ee65a95014a","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"// const compiledSchema = Schema.Compile(schema);\ncompiledSchema.Parse(data);","throws":true,"mean":0.07161093018260742,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"04dcae4c-e73b-432c-9a84-83ad5c11fde2","libraryName":"zod/mini","version":"4.3.6","snippet":"schema.safeParse(data)","mean":0.07263951913997105,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"0b788278-5032-4690-bbbd-d925929b5b21","libraryName":"zod/mini","version":"4.3.6","note":"jitless","snippet":"schema.safeParse(data, { jitless: true })","mean":0.07265879468176194,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"341d61d5-1eb8-493e-922a-e840273483a0","libraryName":"typebox","version":"1.1.5","note":"schema","snippet":"Schema.Parse(schema, data)","throws":true,"mean":0.07461710871514333,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"09756f76-72d2-4873-afd0-adda7ddc35b2","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"// const compiled = Compile(schema);\ncompiled.Parse(data);","throws":true,"mean":0.07860441612950514,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"45671aba-e9d9-4247-9eec-8e43cc3fbdb4","libraryName":"typebox","version":"1.1.5","snippet":"Value.Parse(schema, data)","throws":true,"mean":0.0837754945128241,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"e7a3efef-334b-4ea7-bf1e-2531126effca","libraryName":"zod","version":"4.3.6","snippet":"schema.safeParse(data)","mean":0.08806410896928234,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"9953efd6-9f10-4d0b-abbd-a88d773663ed","libraryName":"zod","version":"4.3.6","note":"jitless","snippet":"schema.safeParse(data, { jitless: true })","mean":0.08993176420863984,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"f76fba51-cc3f-4a59-a4b2-b9e90d574032","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data, { abortEarly: true })","throws":true,"mean":0.09445590743364991,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"08a69afd-87b3-4ad3-9a75-f523edcb2756","libraryName":"arktype","version":"2.1.29","snippet":"schema(data)","mean":0.0983153971686984,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"64d9b631-6dd2-45f4-9808-8b191770a4c9","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data, { abortEarly: false })","throws":true,"mean":0.5392392819406941,"optimizeType":"none","type":"parsing","errorType":"allErrors"}]},"validation":{"valid":[{"id":"3f1c9d26-804c-4014-bf61-cdc2cd073226","libraryName":"typia","version":"11.0.3","note":"createIs","snippet":"// const is = typia.createIs();\nis(data);","mean":0.0011355539501314502,"optimizeType":"precompiled","type":"validation"},{"id":"e5761113-11a7-47a3-94b1-45c12c279c83","libraryName":"typia","version":"11.0.3","note":"is","snippet":"typia.is(data)","mean":0.0011534173524711316,"optimizeType":"precompiled","type":"validation"},{"id":"bc3d4202-672f-41e9-9082-d33893928e80","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"// const compiledSchema = Schema.Compile(schema);\ncompiledSchema.Check(data);","mean":0.0030994158943957943,"optimizeType":"jit","type":"validation"},{"id":"065c4b78-7c00-4845-a8ef-d3ae4db3c533","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"// const compiled = Compile(schema);\ncompiled.Check(data);","mean":0.0031371647164023147,"optimizeType":"jit","type":"validation"},{"id":"2f366f6e-c670-44c6-9598-b6238e864aa4","libraryName":"io-ts","version":"2.2.22","snippet":"schema.is(data)","mean":0.003214839039664325,"optimizeType":"none","type":"validation"},{"id":"61337b27-5db4-43ca-b61f-8921bb5231bc","libraryName":"ajv","version":"8.18.0","note":"compile","snippet":"// const validate = ajv.compile(schema);\nvalidate(data);","mean":0.003463249761901554,"optimizeType":"jit","type":"validation"},{"id":"1b4c1618-8f24-4226-b5f2-f429f7316c7e","libraryName":"ajv","version":"8.18.0","note":"validate","snippet":"ajv.validate(schema, data)","mean":0.0034777040031722887,"optimizeType":"jit","type":"validation"},{"id":"5fbce08f-8402-42b2-9d15-4b21c90d92ae","libraryName":"arktype","version":"2.1.29","snippet":"schema.allows(data)","mean":0.006739723194608076,"optimizeType":"jit","type":"validation"},{"id":"65ad8f70-0aed-48b4-98d1-9c661f428e75","libraryName":"valibot","version":"1.2.0","snippet":"v.is(schema, data)","mean":0.011757437150949714,"optimizeType":"none","type":"validation"},{"id":"2cb9c0ae-6bb1-4dd0-af99-b808e3b9abff","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const is = Schema.is(schema);\nis(data);","mean":0.01624495789336967,"optimizeType":"none","type":"validation"},{"id":"263be408-b430-443a-8d03-2bbfa9f7fa73","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"is(data, schema)","mean":0.01724674666275394,"optimizeType":"none","type":"validation"},{"id":"75a2e642-f795-461f-a40c-ac1e6ddd0f6d","libraryName":"effect","version":"3.19.19","snippet":"// const is = Schema.is(schema);\nis(data);","mean":0.017762999911184588,"optimizeType":"none","type":"validation"},{"id":"7290cc24-90f5-453e-ae8c-dd2c4751780e","libraryName":"typebox","version":"1.1.5","note":"schema","snippet":"Schema.Check(schema, data)","mean":0.06856945200219565,"optimizeType":"jit","type":"validation"},{"id":"a9ccaa2e-9ad4-4c88-86f1-60f4c0cb7404","libraryName":"typebox","version":"1.1.5","snippet":"Value.Check(schema, data)","mean":0.06922768572615105,"optimizeType":"jit","type":"validation"},{"id":"2c7b12a6-64f1-4470-b325-9725360dc13d","libraryName":"yup","version":"1.7.1","snippet":"schema.isValidSync(data)","mean":0.14254669042188897,"optimizeType":"none","type":"validation"}],"invalid":[{"id":"80d1d5b6-2b73-4367-ad3f-9de39444e252","libraryName":"typia","version":"11.0.3","note":"createIs","snippet":"// const is = typia.createIs();\nis(data);","mean":0.000048715908509940445,"optimizeType":"precompiled","type":"validation"},{"id":"ad1cf56e-7356-4e18-a44c-add59f2b86d1","libraryName":"typia","version":"11.0.3","note":"is","snippet":"typia.is(data)","mean":0.00006222326353558298,"optimizeType":"precompiled","type":"validation"},{"id":"e4ec7f3b-85dc-450a-a8aa-5f9d7a4db7ea","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"// const compiled = Compile(schema);\ncompiled.Check(data);","mean":0.00006530532845042208,"optimizeType":"jit","type":"validation"},{"id":"d2a14ef4-9488-4f52-92ea-bfb23bbdb1da","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"// const compiledSchema = Schema.Compile(schema);\ncompiledSchema.Check(data);","mean":0.0000665642609032818,"optimizeType":"jit","type":"validation"},{"id":"1e39103a-baa8-4a67-b9aa-deb94b2674b4","libraryName":"ajv","version":"8.18.0","note":"compile","snippet":"// const validate = ajv.compile(schema);\nvalidate(data);","mean":0.00007978960702105213,"optimizeType":"jit","type":"validation"},{"id":"c619a11a-3216-401e-b507-d29a62be5cc6","libraryName":"io-ts","version":"2.2.22","snippet":"schema.is(data)","mean":0.00012236129015291675,"optimizeType":"none","type":"validation"},{"id":"24bd8931-f525-401a-842b-c870d72be2de","libraryName":"ajv","version":"8.18.0","note":"validate","snippet":"ajv.validate(schema, data)","mean":0.00012556023884084978,"optimizeType":"jit","type":"validation"},{"id":"b70abfca-da49-483a-90a1-e65df5fdaae7","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"is(data, schema)","mean":0.0006641302910416754,"optimizeType":"none","type":"validation"},{"id":"7cbb8fff-3767-4c55-a492-9fa71c8a48cd","libraryName":"valibot","version":"1.2.0","snippet":"v.is(schema, data)","mean":0.0006981681384050137,"optimizeType":"none","type":"validation"},{"id":"0c1d59df-3642-4a2e-a903-207e9d69791e","libraryName":"effect","version":"3.19.19","snippet":"// const is = Schema.is(schema);\nis(data);","mean":0.0007469059279674226,"optimizeType":"none","type":"validation"},{"id":"342358da-f982-4ea9-8899-ae90fb965348","libraryName":"arktype","version":"2.1.29","snippet":"schema.allows(data)","mean":0.0007597396874899991,"optimizeType":"jit","type":"validation"},{"id":"744b7508-2815-42cd-8590-beea6e096878","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const is = Schema.is(schema);\nis(data);","mean":0.0010478008895823412,"optimizeType":"none","type":"validation"},{"id":"d58ef92d-06bb-411c-a3b5-4189cf0ae51b","libraryName":"typebox","version":"1.1.5","snippet":"Value.Check(schema, data)","mean":0.0036026682854620007,"optimizeType":"jit","type":"validation"},{"id":"211d0b3c-93a1-4f8f-8eac-e2410387484d","libraryName":"typebox","version":"1.1.5","note":"schema","snippet":"Schema.Check(schema, data)","mean":0.004370843445266424,"optimizeType":"jit","type":"validation"},{"id":"e066ecd7-2f25-4c8e-9c08-aa0b00fe55e9","libraryName":"yup","version":"1.7.1","snippet":"schema.isValidSync(data)","mean":0.09440764032852242,"optimizeType":"none","type":"validation"}]},"standard":{"valid":[{"id":"08f104b2-ceb5-4f16-a627-605433b092f7","libraryName":"typia","version":"11.0.3","snippet":"// const validate = typia.createValidate();\nupfetch(url, { schema: validate })","mean":0.0011061118577312453,"optimizeType":"precompiled","errorType":"allErrors","type":"standard"},{"id":"516ffb2d-dd42-479c-a692-25f2d246cc8c","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"upfetch(url, { schema })","mean":0.0025298207091132194,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"c5e802dc-1683-4491-a2d0-48e1fdd81c86","libraryName":"arktype","version":"2.1.29","snippet":"upfetch(url, { schema })","mean":0.0068028243105374845,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"479a045e-2de0-4034-b58e-47935502eeca","libraryName":"zod","version":"4.3.6","snippet":"upfetch(url, { schema })","mean":0.008463813467513034,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"98a03ed5-17b2-4f80-975b-af783d9297a7","libraryName":"valibot","version":"1.2.0","snippet":"upfetch(url, { schema })","mean":0.011873484208413165,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"10114052-a51f-42d5-8fd9-b8f6bc196683","libraryName":"zod/mini","version":"4.3.6","snippet":"upfetch(url, { schema })","mean":0.012566618804663907,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"ee7db53a-7d54-4079-ad4d-b5cae7f85acb","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const standardSchema = Schema.toStandardSchemaV1(\n// schema, \n// { parseOptions: { errors: \"first\" } }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.01698228610002512,"optimizeType":"none","errorType":"abortEarly","type":"standard"},{"id":"616a1377-9402-46ec-a199-105ab4396e33","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const standardSchema = Schema.toStandardSchemaV1(\n// schema, \n// { parseOptions: { errors: \"all\" } }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.01703751855385309,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"ba92e488-11ad-4f08-b667-aa298f4fc65c","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"upfetch(url, { schema })","mean":0.017177586041621496,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"0674ea14-acbc-4a21-9486-e44a5447e8a2","libraryName":"effect","version":"3.19.19","snippet":"// const standardSchema = Schema.standardSchemaV1(\n// schema, \n// { errors: \"first\" }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.018514634821896827,"optimizeType":"none","errorType":"abortEarly","type":"standard"},{"id":"12f0de89-a713-405b-ad4d-e77624db97d0","libraryName":"effect","version":"3.19.19","snippet":"// const standardSchema = Schema.standardSchemaV1(\n// schema, \n// { errors: \"all\" }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.0185731859329198,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"c8d177ba-26a5-4ecf-98df-83a86dceda67","libraryName":"joi","version":"18.0.2","snippet":"upfetch(url, { schema })","mean":0.03870631746400967,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"02c96343-e8be-4a52-9b30-fa3d103697a6","libraryName":"yup","version":"1.7.1","snippet":"upfetch(url, { schema })","mean":0.1406900664040526,"optimizeType":"none","errorType":"allErrors","type":"standard"}],"invalid":[{"id":"eacd91e9-9a6d-4627-81cb-f9e0a04c290c","libraryName":"joi","version":"18.0.2","snippet":"upfetch(url, { schema })","mean":0.004382149076027681,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"4c996faf-8dac-49bc-b4a3-31f2f0b2149d","libraryName":"effect","version":"3.19.19","snippet":"// const standardSchema = Schema.standardSchemaV1(\n// schema, \n// { errors: \"first\" }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.00485824491342854,"optimizeType":"none","errorType":"abortEarly","type":"standard"},{"id":"6c99a6db-f8b1-4de2-a67d-b66fc234e1ce","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"upfetch(url, { schema })","mean":0.008232384557762918,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"622c2aa5-bf80-4e5d-a13f-3546db2ff53b","libraryName":"typia","version":"11.0.3","snippet":"// const validate = typia.createValidate();\nupfetch(url, { schema: validate })","mean":0.010715594865090421,"optimizeType":"precompiled","errorType":"allErrors","type":"standard"},{"id":"a2cd5792-a774-4ec5-b7d3-3ae1bc8923d1","libraryName":"valibot","version":"1.2.0","snippet":"upfetch(url, { schema })","mean":0.027996244316905505,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"3c182e58-acce-4912-bc9a-8d958baff586","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const standardSchema = Schema.toStandardSchemaV1(\n// schema, \n// { parseOptions: { errors: \"all\" } }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.030107089056148797,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"c155b4e7-d610-47cc-bbaa-e6ce012fe49b","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const standardSchema = Schema.toStandardSchemaV1(\n// schema, \n// { parseOptions: { errors: \"first\" } }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.0301925919809059,"optimizeType":"none","errorType":"abortEarly","type":"standard"},{"id":"70352670-6e57-4949-9ac5-d8acf611882f","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"upfetch(url, { schema })","mean":0.03060293230711937,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"4494fdec-c2a3-4d91-8c31-1b6e6d26280e","libraryName":"effect","version":"3.19.19","snippet":"// const standardSchema = Schema.standardSchemaV1(\n// schema, \n// { errors: \"all\" }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.07201496457117887,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"967609f3-9b8e-4327-bde3-2a2ea472235f","libraryName":"zod/mini","version":"4.3.6","snippet":"upfetch(url, { schema })","mean":0.07233419283905569,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"8e7863d1-3110-4b92-8b00-6271f60e4781","libraryName":"zod","version":"4.3.6","snippet":"upfetch(url, { schema })","mean":0.07518935827069494,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"090c64f1-aa21-429b-ab75-f691af52e564","libraryName":"arktype","version":"2.1.29","snippet":"upfetch(url, { schema })","mean":0.09734917482721266,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"92aef683-5abc-4034-a239-1afdc4525c19","libraryName":"yup","version":"1.7.1","snippet":"upfetch(url, { schema })","mean":0.5603024302521312,"optimizeType":"none","errorType":"allErrors","type":"standard"}]},"string":{"date-time":{"valid":[{"id":"0dda62ff-f5ba-48e9-be09-938ff5216743","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"date-time\">","mean":0.00012558264932591842,"optimizeType":"precompiled","type":"string"},{"id":"3afad7a9-f179-4083-b91f-e2ba4da5ec45","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.datetime()","mean":0.00024132692457612867,"optimizeType":"jit","type":"string"},{"id":"a626d415-d6db-4d91-995d-e5bd41c3cd6d","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.date.iso\")","mean":0.0002665024265047385,"optimizeType":"jit","type":"string"},{"id":"7ec2244f-fd65-4be6-8caa-84cbd332b793","libraryName":"zod","version":"4.3.6","snippet":"z.iso.datetime()","mean":0.00036828790086277795,"optimizeType":"jit","type":"string"},{"id":"63164afb-d237-4db6-a747-47a9daa4936d","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.datetime(S.string)","mean":0.0003907284309181042,"optimizeType":"jit","type":"string"},{"id":"bfcaf870-4c25-4337-b31f-ebeaf31c369d","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoDateTime())","mean":0.0014147720166713183,"optimizeType":"none","type":"string"},{"id":"d843fb15-f72a-48c7-855d-89a43d5c5719","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"date-time\" })","mean":0.0016594865357759676,"optimizeType":"jit","type":"string"},{"id":"da135970-927e-41ca-8d5a-2b37e97bb55e","libraryName":"yup","version":"1.7.1","snippet":"yup.string().datetime()","mean":0.001955517836261198,"optimizeType":"none","type":"string"},{"id":"a49e9c18-110c-4f5d-a7fe-a0bc1557414f","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().isoDate()","mean":0.004128091519670594,"optimizeType":"none","type":"string"}],"invalid":[{"id":"d6a9d109-e2ad-46e0-a441-5e5259e6f0f8","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"date-time\">","mean":0.00007213564538221281,"optimizeType":"precompiled","type":"string"},{"id":"ba7b4b17-2f43-4d77-b0e6-62e6f73d4553","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.date.iso\")","mean":0.00010215186774001368,"optimizeType":"jit","type":"string"},{"id":"6f30fafe-4999-4ce8-b48e-1a686f6607b0","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoDateTime())","mean":0.00016111383368600844,"optimizeType":"none","type":"string"},{"id":"9a705901-2994-484e-89d3-3707af1cf141","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"date-time\" })","mean":0.0006788274380555165,"optimizeType":"jit","type":"string"},{"id":"fcca748d-1ce3-4cdc-9d86-df3b2d2d9470","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().isoDate()","mean":0.002066290873208779,"optimizeType":"none","type":"string"},{"id":"22b0ab89-516e-458d-8d88-c1cf2045ea26","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.datetime(S.string)","mean":0.0066177928170564225,"optimizeType":"jit","type":"string"},{"id":"d67e64d0-77a3-442c-8d7d-cd1264e04b52","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.datetime()","mean":0.012310501329536667,"optimizeType":"jit","type":"string"},{"id":"afb7d195-71e8-496c-ac67-3e9fb948482a","libraryName":"zod","version":"4.3.6","snippet":"z.iso.datetime()","mean":0.017998437897081762,"optimizeType":"jit","type":"string"},{"id":"017b1255-a9e6-4efe-8ac8-c8064aa9e583","libraryName":"yup","version":"1.7.1","snippet":"yup.string().datetime()","mean":0.02182943844137767,"optimizeType":"none","type":"string"}]},"date":{"valid":[{"id":"39d45aa6-940e-4754-bee7-1c6db072dec3","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"date\">","mean":0.00008965184835264136,"optimizeType":"precompiled","type":"string"},{"id":"6956e938-cc04-493f-a807-c608c84a2ee3","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.isoDate())","mean":0.00017229798830058833,"optimizeType":"none","type":"string"},{"id":"5916516c-73fc-47fa-a6e2-93f949a50c20","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.date()","mean":0.00022432501012820447,"optimizeType":"jit","type":"string"},{"id":"37487674-cf6d-4bc3-b83c-d6ca6b82473d","libraryName":"zod","version":"4.3.6","snippet":"z.iso.date()","mean":0.0003505516220545425,"optimizeType":"jit","type":"string"},{"id":"7c58c5f0-e66e-45f9-bfd6-199ad82dc11b","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoDate())","mean":0.0011664268277893507,"optimizeType":"none","type":"string"},{"id":"45925ced-7ec0-4157-a222-49c476fa8a8f","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"date\" })","mean":0.001193287053329048,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"32f86608-cfbf-4e4e-a634-5d9cb552974a","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"date\">","mean":0.00007078849446282625,"optimizeType":"precompiled","type":"string"},{"id":"d693f9e9-b37f-4195-978f-aab9605e53c1","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoDate())","mean":0.00015185997979654515,"optimizeType":"none","type":"string"},{"id":"f75a2a7a-4b2d-4278-9f81-1de947c5ecd0","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.isoDate())","mean":0.00027479395843663963,"optimizeType":"none","type":"string"},{"id":"c35f7bf2-3455-401a-91e3-eaef004933d3","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"date\" })","mean":0.0006070033743293689,"optimizeType":"jit","type":"string"},{"id":"e062f738-2a00-4cce-af15-7744e8718d89","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.date()","mean":0.011640698740499118,"optimizeType":"jit","type":"string"},{"id":"c28e8ca1-e7a0-4578-97ba-7f6a72f5b4e7","libraryName":"zod","version":"4.3.6","snippet":"z.iso.date()","mean":0.01784291369434729,"optimizeType":"jit","type":"string"}]},"time":{"valid":[{"id":"943530b8-fd19-4edd-9e53-b298def905a8","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"time\">","mean":0.00008527516177645149,"optimizeType":"precompiled","type":"string"},{"id":"dc73409f-25d5-425f-9b91-505ee1245803","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoTime())","mean":0.00034985684522899596,"optimizeType":"none","type":"string"},{"id":"71e1be49-3108-420b-a6fe-efe8be54c051","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"time\" })","mean":0.001280870136544988,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"434d00b9-3fb4-4d3e-bc62-71bc51be15af","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"time\">","mean":0.00006855186891268233,"optimizeType":"precompiled","type":"string"},{"id":"fdd9ad40-a1e8-44e6-92c5-5e57ae2ebef2","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoTime())","mean":0.0001568078974707745,"optimizeType":"none","type":"string"},{"id":"4081d876-e25f-4b00-a112-e013134c7164","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"time\" })","mean":0.000616737555472512,"optimizeType":"jit","type":"string"}]},"duration":{"valid":[{"id":"5f307dd7-693c-4633-9433-54999d6bdefc","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"duration\">","mean":0.00016427076780612141,"optimizeType":"precompiled","type":"string"},{"id":"509df26a-8999-4ebb-99aa-0922957936f1","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), duration())","mean":0.0001822323606377469,"optimizeType":"none","type":"string"},{"id":"9d019a69-9439-4164-b615-3188e09a3bde","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.duration()","mean":0.00035214946873052976,"optimizeType":"jit","type":"string"},{"id":"2fbad2bd-46e8-4da8-addb-b2c02d27d2aa","libraryName":"zod","version":"4.3.6","snippet":"z.iso.duration()","mean":0.0004984721620857983,"optimizeType":"jit","type":"string"},{"id":"53607e24-789f-4b45-ba61-8e3ba3df1fa5","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().isoDuration()","mean":0.0005975994674189026,"optimizeType":"none","type":"string"},{"id":"58e4f876-60aa-41dc-96d1-db41a018cb2f","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"duration\" })","mean":0.0011019318808416125,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"6f363777-4f24-4b94-94a3-d0c82137f15c","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"duration\">","mean":0.00007234104452697028,"optimizeType":"precompiled","type":"string"},{"id":"6dfb1629-39c5-4fa5-b9f8-4590b3864e15","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), duration())","mean":0.0001600179300073164,"optimizeType":"none","type":"string"},{"id":"6bbbd2f3-5864-4e2b-8ee6-96224adb3d39","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"duration\" })","mean":0.0005984919272442395,"optimizeType":"jit","type":"string"},{"id":"f38722f1-ac7d-4a6b-a4e2-76bd3f726f4d","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().isoDuration()","mean":0.002033095132565784,"optimizeType":"none","type":"string"},{"id":"25f2db14-8c4e-4bae-9b99-bc682ff86302","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.duration()","mean":0.011607209392496626,"optimizeType":"jit","type":"string"},{"id":"5e7ec518-5962-49c4-a63e-394bc6f4e431","libraryName":"zod","version":"4.3.6","snippet":"z.iso.duration()","mean":0.01704965563571697,"optimizeType":"jit","type":"string"}]},"email":{"valid":[{"id":"a38dd472-be6b-417c-91b5-b5639f560c6d","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"email\">","mean":0.00012928197857418224,"optimizeType":"precompiled","type":"string"},{"id":"af619c66-dbe8-44ec-ab32-f63e206087d8","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.email\")","mean":0.000132766266190711,"optimizeType":"jit","type":"string"},{"id":"93ed656d-6297-402a-8068-d4c43e2fab4f","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.email(S.string)","mean":0.00019631695978132157,"optimizeType":"jit","type":"string"},{"id":"87a97155-c5cc-4c99-8005-9b62ea4b197c","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.email())","mean":0.0001966949134310538,"optimizeType":"none","type":"string"},{"id":"07d36acb-df42-46a7-90b3-b2023a9033d1","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), email())","mean":0.00021705023692034767,"optimizeType":"none","type":"string"},{"id":"cb7cb738-83f7-4d36-be2a-cb1af7c4d19e","libraryName":"zod/mini","version":"4.3.6","snippet":"z.email()","mean":0.0003455134231952462,"optimizeType":"jit","type":"string"},{"id":"62eb4e8f-733a-4c94-b52e-c36ea987d7cb","libraryName":"zod","version":"4.3.6","snippet":"z.email()","mean":0.0004455929803071552,"optimizeType":"jit","type":"string"},{"id":"424b9cbe-90f3-4fa0-81fa-30d70fa03b50","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"email\" })","mean":0.0010930774029377873,"optimizeType":"jit","type":"string"},{"id":"37b12e72-1128-4e52-85b8-60ca06a8de0a","libraryName":"yup","version":"1.7.1","snippet":"yup.string().email()","mean":0.001139255793685976,"optimizeType":"none","type":"string"},{"id":"21654b33-86e1-4f26-8fc0-34523bf62a1e","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().email()","mean":0.002288171450080718,"optimizeType":"none","type":"string"}],"invalid":[{"id":"2fe8afef-ae3f-452d-a8dd-6abf6feb9743","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"email\">","mean":0.00009542553940214592,"optimizeType":"precompiled","type":"string"},{"id":"47271f8f-a65b-4685-9673-4d6a90bcfd3a","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.email\")","mean":0.00010686084068462473,"optimizeType":"jit","type":"string"},{"id":"a62640a0-f248-4f06-be52-7bcb51712763","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), email())","mean":0.00020956716480737984,"optimizeType":"none","type":"string"},{"id":"eb8ee165-2d29-4f1b-9417-2e0c1841f5fc","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.email())","mean":0.00029193504854660456,"optimizeType":"none","type":"string"},{"id":"98841458-f898-42f2-9b65-1669b6008229","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"email\" })","mean":0.0006435286502033355,"optimizeType":"jit","type":"string"},{"id":"24a26da2-02c3-4754-97aa-242a9776defc","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().email()","mean":0.0021579429181816747,"optimizeType":"none","type":"string"},{"id":"bb8f2b33-e98d-4525-be8c-fb6a9408c9a5","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.email(S.string)","mean":0.007275079072574295,"optimizeType":"jit","type":"string"},{"id":"a511e60c-e8aa-4573-bb63-3fe301fd833b","libraryName":"zod/mini","version":"4.3.6","snippet":"z.email()","mean":0.011545910842735574,"optimizeType":"jit","type":"string"},{"id":"b0656a53-6046-4b64-af60-72635fb4902d","libraryName":"zod","version":"4.3.6","snippet":"z.email()","mean":0.017301532223733707,"optimizeType":"jit","type":"string"},{"id":"9cf6f3c6-0012-42f4-97fe-501368b3aca0","libraryName":"yup","version":"1.7.1","snippet":"yup.string().email()","mean":0.02161506590294417,"optimizeType":"none","type":"string"}]},"url":{"valid":[{"id":"d2493716-752a-43d5-bbed-e88117a4482e","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"url\">","mean":0.00019943007931592715,"optimizeType":"precompiled","type":"string"},{"id":"5a352706-72a5-47d0-95a7-30473ba85164","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.url\")","mean":0.0003101693651397477,"optimizeType":"jit","type":"string"},{"id":"cb6a0ba5-571e-494f-b5e7-f2c4c47125a2","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.url(S.string)","mean":0.0004730180144138505,"optimizeType":"jit","type":"string"},{"id":"7d763acf-053a-4a42-a3dd-8cef201c0b7d","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), url())","mean":0.0005439360597934846,"optimizeType":"none","type":"string"},{"id":"3f26dc69-8258-4c62-8e71-c0789cb14bcf","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.url())","mean":0.0005593735220653427,"optimizeType":"none","type":"string"},{"id":"267053ed-0d62-475b-bf20-a783c2d6586a","libraryName":"zod/mini","version":"4.3.6","snippet":"z.url()","mean":0.0006544564505175824,"optimizeType":"jit","type":"string"},{"id":"f3e450a2-74c4-4174-ac01-8ee0ec184026","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().uri()","mean":0.0006766425367043947,"optimizeType":"none","type":"string"},{"id":"14d4a443-cda8-443c-9fbd-c184c54d5584","libraryName":"zod","version":"4.3.6","snippet":"z.url()","mean":0.0008298219011547097,"optimizeType":"jit","type":"string"},{"id":"fccd8753-0f42-4c02-bab7-19502872ed21","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"url\" })","mean":0.0011571485048503785,"optimizeType":"jit","type":"string"},{"id":"00ddd6f6-c280-4d57-9ac1-dd933e8e4b8d","libraryName":"yup","version":"1.7.1","snippet":"yup.string().url()","mean":0.0015105241865105668,"optimizeType":"none","type":"string"}],"invalid":[{"id":"dc37add6-1828-4eee-a75a-44113d1c9319","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"url\">","mean":0.00007021955018828306,"optimizeType":"precompiled","type":"string"},{"id":"1f216ba9-2c5c-46ec-80c0-d83cec2fcf85","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.url\")","mean":0.0001588390688795894,"optimizeType":"jit","type":"string"},{"id":"6d4dbd5a-b9c2-426d-9f3a-3b20e0a80606","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"url\" })","mean":0.0005779881408352781,"optimizeType":"jit","type":"string"},{"id":"39352cd9-2da9-4af6-9bd4-c6d9f1cc8640","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().uri()","mean":0.0021188112902902475,"optimizeType":"none","type":"string"},{"id":"e88583d3-1235-4044-9a3c-55092c569cee","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), url())","mean":0.008318002620162796,"optimizeType":"none","type":"string"},{"id":"71817b06-4b53-4b64-9712-ec081a49ba15","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.url())","mean":0.008591065489686647,"optimizeType":"none","type":"string"},{"id":"9eb06192-b7ae-40b1-894c-82091f7c6773","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.url(S.string)","mean":0.014045277307291305,"optimizeType":"jit","type":"string"},{"id":"76647a4b-bb72-4cbd-a9ce-4d7a2d046dd7","libraryName":"zod/mini","version":"4.3.6","snippet":"z.url()","mean":0.019440950114711284,"optimizeType":"jit","type":"string"},{"id":"bf8dfd04-f711-43f8-80df-6317c9f3c8eb","libraryName":"yup","version":"1.7.1","snippet":"yup.string().url()","mean":0.021626515073530053,"optimizeType":"none","type":"string"},{"id":"08374aa3-3e4c-46a2-98e5-9366d0ab9bcf","libraryName":"zod","version":"4.3.6","snippet":"z.url()","mean":0.026554150535051443,"optimizeType":"jit","type":"string"}]},"uuid":{"valid":[{"id":"dd7bea41-88dc-4b5d-ae32-f93c35dc070a","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.uuid\")","mean":0.00016588263423102413,"optimizeType":"jit","type":"string"},{"id":"ab85246b-80de-4758-9729-67cf7e7b376f","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"uuid\">","mean":0.00016872108989468811,"optimizeType":"precompiled","type":"string"},{"id":"74dcbc29-d2e8-43ad-a522-edb054e19712","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.uuid(S.string)","mean":0.00022158593634102284,"optimizeType":"jit","type":"string"},{"id":"01a54bdb-9822-4020-a33a-f1169c783237","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.uuid())","mean":0.0002532609035137028,"optimizeType":"none","type":"string"},{"id":"62c3bb98-fcca-452e-a62a-17a78155ea90","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), uuid())","mean":0.0002563120796787237,"optimizeType":"none","type":"string"},{"id":"935e6f51-0f23-40de-8e64-f0eaea61c955","libraryName":"zod/mini","version":"4.3.6","snippet":"z.uuid()","mean":0.00029487941909876725,"optimizeType":"jit","type":"string"},{"id":"158e8ab6-ca7d-4b14-8f35-dd0058129227","libraryName":"zod","version":"4.3.6","snippet":"z.uuid()","mean":0.0004329231479227337,"optimizeType":"jit","type":"string"},{"id":"3337a71e-9355-4845-a9dc-bc5ed34ffb6c","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().uuid()","mean":0.0006671451400173748,"optimizeType":"none","type":"string"},{"id":"ba0d4785-4f1c-4638-82db-73d945ab87b4","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"uuid\" })","mean":0.0011191047268766386,"optimizeType":"jit","type":"string"},{"id":"a9df3d74-c27e-4092-8d4d-ef7a650c554a","libraryName":"yup","version":"1.7.1","snippet":"yup.string().uuid()","mean":0.001152257222923203,"optimizeType":"none","type":"string"}],"invalid":[{"id":"986539b3-7339-4c42-8a21-f68286013f4a","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"uuid\">","mean":0.00007014387708350733,"optimizeType":"precompiled","type":"string"},{"id":"a9d2c245-0023-4857-944a-4fe70b43bdd0","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.uuid\")","mean":0.00008208421642766826,"optimizeType":"jit","type":"string"},{"id":"da9fb174-998f-4629-ab95-a1d863890b38","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), uuid())","mean":0.00015252286172715755,"optimizeType":"none","type":"string"},{"id":"8ae68b50-e935-4cd4-98c3-2316600cab42","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.uuid())","mean":0.0002722230116092071,"optimizeType":"none","type":"string"},{"id":"7d8baf26-be68-4f51-b37a-f171e60287c3","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"uuid\" })","mean":0.0005787849235802749,"optimizeType":"jit","type":"string"},{"id":"3397e953-a7f9-48a6-b947-ab118fec9701","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().uuid()","mean":0.0020335167022909138,"optimizeType":"none","type":"string"},{"id":"d7e13c29-8dd8-4911-90e4-d1aa50c0e9a8","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.uuid(S.string)","mean":0.007250026353757983,"optimizeType":"jit","type":"string"},{"id":"8988b58d-4edb-4b76-8c28-aa120b6a33bd","libraryName":"zod/mini","version":"4.3.6","snippet":"z.uuid()","mean":0.01151389045733531,"optimizeType":"jit","type":"string"},{"id":"c94b5930-97cd-4e8a-a9c7-6e3cb992e4e5","libraryName":"zod","version":"4.3.6","snippet":"z.uuid()","mean":0.0168195035404899,"optimizeType":"jit","type":"string"},{"id":"16eac0c1-52ae-4f00-a548-01062f1d34ec","libraryName":"yup","version":"1.7.1","snippet":"yup.string().uuid()","mean":0.02158891217806117,"optimizeType":"none","type":"string"}]},"ipv4":{"valid":[{"id":"d0d1ee21-980e-4d0e-a5b6-53bb89e67aba","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"ipv4\">","mean":0.00008667849775808487,"optimizeType":"precompiled","type":"string"},{"id":"7a40114d-beb2-419d-b5d5-6c85d8a4404d","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.ip.v4\")","mean":0.00011062042143548434,"optimizeType":"jit","type":"string"},{"id":"f64dc496-b304-4544-b01d-df5fbe5c0e30","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.ipv4())","mean":0.00017038262292076535,"optimizeType":"none","type":"string"},{"id":"5efa2b31-c656-4d70-9a8d-bb846a663ddf","libraryName":"zod/mini","version":"4.3.6","snippet":"z.ipv4()","mean":0.00022485239586850288,"optimizeType":"jit","type":"string"},{"id":"137710ad-fe76-45b8-b337-5c13f8d98eeb","libraryName":"zod","version":"4.3.6","snippet":"z.ipv4()","mean":0.00034185073774916887,"optimizeType":"jit","type":"string"},{"id":"69a2ed06-4489-47b6-992b-b8b7c03e4516","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().ip({ version: \"ipv4\" })","mean":0.000516183210935673,"optimizeType":"none","type":"string"},{"id":"a9e7531f-683c-48d3-90a1-63857ff7a020","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"ipv4\" })","mean":0.0009834683342980525,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"efa3ca38-38c5-4fe9-99f7-2ad3824df81c","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"ipv4\">","mean":0.00006948387387496937,"optimizeType":"precompiled","type":"string"},{"id":"b7a100c0-fa90-4188-b9f8-c7212467f085","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.ip.v4\")","mean":0.00009660686399470811,"optimizeType":"jit","type":"string"},{"id":"c9a70c67-174f-43c8-bc2f-f4d003ff5fc6","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.ipv4())","mean":0.0002689599650464952,"optimizeType":"none","type":"string"},{"id":"2c85d838-72e2-49a6-81a0-5e99f772f123","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"ipv4\" })","mean":0.0005797847376339564,"optimizeType":"jit","type":"string"},{"id":"728aab30-3ddc-4178-bfd7-2d84e4a42541","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().ip({ version: \"ipv4\" })","mean":0.00272408423954267,"optimizeType":"none","type":"string"},{"id":"846389a6-288f-46bc-ba37-e4b03d446d7d","libraryName":"zod/mini","version":"4.3.6","snippet":"z.ipv4()","mean":0.011441202976998332,"optimizeType":"jit","type":"string"},{"id":"b5f56219-b8fe-40d4-a2c9-f6d71e7f9fc6","libraryName":"zod","version":"4.3.6","snippet":"z.ipv4()","mean":0.017083830160824556,"optimizeType":"jit","type":"string"}]},"ipv6":{"valid":[{"id":"9873c39f-396c-452a-901d-e4a6fb15cc7c","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.ip.v6\")","mean":0.0001923929072817882,"optimizeType":"jit","type":"string"},{"id":"efd97af8-dff7-4d7b-b01e-49c9f9772704","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.ipv6())","mean":0.00020194122460379837,"optimizeType":"none","type":"string"},{"id":"6dab7cd2-186e-4e0c-86f3-86119839de85","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"ipv6\">","mean":0.00033849845069390414,"optimizeType":"precompiled","type":"string"},{"id":"0f80f28c-110d-4b0d-bda4-05de8185fcf2","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().ip({ version: \"ipv6\" })","mean":0.0005496417101980637,"optimizeType":"none","type":"string"},{"id":"03e35aff-8b38-49a4-9ab2-134420c49868","libraryName":"zod/mini","version":"4.3.6","snippet":"z.ipv6()","mean":0.000783224357637278,"optimizeType":"jit","type":"string"},{"id":"d5455497-b85b-4a1f-81fa-51017b0f4773","libraryName":"zod","version":"4.3.6","snippet":"z.ipv6()","mean":0.0010245537547359722,"optimizeType":"jit","type":"string"},{"id":"868b0aa0-3e00-49a7-bba7-b13f3a0bc479","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"ipv6\" })","mean":0.0012800703154558137,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"a33e6c76-7853-40cc-8390-3f18bdd34ba4","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.ip.v6\")","mean":0.0001305351559872896,"optimizeType":"jit","type":"string"},{"id":"b46f5aab-5522-4d09-8c0b-922052686e2c","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"ipv6\">","mean":0.00022571959511901704,"optimizeType":"precompiled","type":"string"},{"id":"9c2d43e5-b543-4e4e-a4e3-8ea6d070c484","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.ipv6())","mean":0.00031530253710968355,"optimizeType":"none","type":"string"},{"id":"ec461715-c65f-4bc2-bbfc-3dbc6afcd358","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"ipv6\" })","mean":0.0007898330483339536,"optimizeType":"jit","type":"string"},{"id":"bd45d88e-d10f-4929-bf80-ae2258f9484d","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().ip({ version: \"ipv6\" })","mean":0.00279799233072033,"optimizeType":"none","type":"string"},{"id":"6fb73adf-20e9-4862-b9bd-9f880a8c7c6b","libraryName":"zod/mini","version":"4.3.6","snippet":"z.ipv6()","mean":0.019648132564438606,"optimizeType":"jit","type":"string"},{"id":"4c79e549-f1b3-45ba-8872-c0c817d341bd","libraryName":"zod","version":"4.3.6","snippet":"z.ipv6()","mean":0.026512351573473043,"optimizeType":"jit","type":"string"}]}}} \ No newline at end of file +{"initialization":[{"id":"4feee5f4-45b9-4686-bfc0-9d37a654f2e0","libraryName":"typia","version":"11.0.3","note":"createIs","snippet":"typia.createIs()","mean":0.00005732319740757436,"optimizeType":"precompiled","type":"initialization"},{"id":"f447144d-2335-4d76-9300-9b32effd119b","libraryName":"typia","version":"11.0.3","note":"createValidate","snippet":"typia.createValidate()","mean":0.00011865033322319731,"optimizeType":"precompiled","type":"initialization"},{"id":"dac4776d-bba8-4b36-bf83-862278f24fd4","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"object(...)","mean":0.0010243044281664563,"optimizeType":"none","type":"initialization"},{"id":"dc17abe6-0a6e-4ba6-b5c0-805d662ee545","libraryName":"io-ts","version":"2.2.22","snippet":"t.type(...)","mean":0.0030962180973760885,"optimizeType":"none","type":"initialization"},{"id":"d280c17c-749c-4d74-a658-21c7a8831827","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.schema(...)","mean":0.008537683030530666,"optimizeType":"jit","type":"initialization"},{"id":"8db81d84-30da-4af9-b37a-b8bf1cd42cd8","libraryName":"typebox","version":"1.1.5","snippet":"Type.Object(...)","mean":0.010770655059506248,"optimizeType":"jit","type":"initialization"},{"id":"edf2b5ce-8796-4e55-bc15-e6e4aad68f3a","libraryName":"valibot","version":"1.2.0","snippet":"v.object(...)","mean":0.04434462374173283,"optimizeType":"none","type":"initialization"},{"id":"d182d453-f034-4ece-b353-6ef43af07cef","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile","snippet":"S.compile(S.schema(...))","mean":0.09043292738289041,"optimizeType":"jit","type":"initialization"},{"id":"b2d8fe14-178e-468a-a48d-e7cd03fbbf68","libraryName":"yup","version":"1.7.1","snippet":"object(...)","mean":0.10493535942090047,"optimizeType":"none","type":"initialization"},{"id":"22e2703d-c904-4314-975e-530f4cb7d4e0","libraryName":"effect___beta","version":"4.0.0-beta.5","note":"decodeUnknownOption","snippet":"Schema.decodeUnknownOption(\n Schema.struct(...)\n)","mean":0.19041727058824645,"optimizeType":"none","type":"initialization"},{"id":"76b58dc1-6e7b-44bb-8748-e4c975c9f0b7","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"Schema.struct(...)","mean":0.19704877297193416,"optimizeType":"none","type":"initialization"},{"id":"6044cb7d-bd35-49a7-b1e4-4233746f8135","libraryName":"joi","version":"18.0.2","snippet":"object(...)","mean":0.20854194974978613,"optimizeType":"none","type":"initialization"},{"id":"07a70904-1f7e-40be-b88f-74da87e2741f","libraryName":"zod/mini","version":"4.3.6","snippet":"z.object(...)","mean":0.21378496836255,"optimizeType":"jit","type":"initialization"},{"id":"a60433a0-4115-4fd2-8b5a-69a2683616b1","libraryName":"effect","version":"3.19.19","snippet":"Schema.struct(...)","mean":0.4402607345950792,"optimizeType":"none","type":"initialization"},{"id":"522c044a-6d22-4040-b1e1-04fc7ade8bca","libraryName":"arktype","version":"2.1.29","snippet":"type(...)","mean":0.5321668223404198,"optimizeType":"jit","type":"initialization"},{"id":"ac0147ea-1d9e-4a54-a88d-238e4a783b5c","libraryName":"effect","version":"3.19.19","note":"decodeUnknownEither","snippet":"Schema.decodeUnknownEither(\n Schema.struct(...)\n)","mean":0.5572744586340889,"optimizeType":"none","type":"initialization"},{"id":"1bca39a0-e944-4cb9-aa2f-447cd0535e4d","libraryName":"zod","version":"4.3.6","snippet":"z.object(...)","mean":0.7007270111888038,"optimizeType":"jit","type":"initialization"},{"id":"a4c2d7ab-e40f-446c-ae38-d24d0a1f67ff","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"Schema.Compile(Type.Object(...))","mean":0.8338818425000049,"optimizeType":"jit","type":"initialization"},{"id":"b7ec7e6c-a66f-4b6e-aa9b-6bf883b2b3b1","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"Compile(Type.Object(...))","mean":0.8530277757886061,"optimizeType":"jit","type":"initialization"},{"id":"fc355acf-c0b6-4ce5-8e7e-ece9e8894cb3","libraryName":"ajv","version":"8.18.0","snippet":"ajv.compile({...})","mean":4.058798360323882,"optimizeType":"jit","type":"initialization"}],"parsing":{"valid":[{"id":"ed1d1acb-d20e-4a30-bcab-72f591f2bb13","libraryName":"typia","version":"11.0.3","note":"createValidate","snippet":"// const validate = typia.createValidate();\nvalidate(data);","mean":0.001109973531586189,"optimizeType":"precompiled","type":"parsing","errorType":"allErrors"},{"id":"3cef79d4-c25c-42a7-adcc-05d7be732a2b","libraryName":"typia","version":"11.0.3","note":"validate","snippet":"typia.validate(data)","mean":0.0013349161379300918,"optimizeType":"precompiled","type":"parsing","errorType":"allErrors"},{"id":"66a9c8e4-47fe-4e3f-80bd-5219392a8e35","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile","snippet":"// const compile = S.compile(S.schema(...));\ncompile(data);","throws":true,"mean":0.002493524786865859,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"625df938-0157-466c-bc24-11af8aaf6f7d","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile + safe","snippet":"// const compile = S.compile(S.schema(...));\nS.safe(() => compile(data));","mean":0.0025016219427087634,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"ca00abf3-a98d-47eb-bd86-e5dc66aa8839","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.parseOrThrow(data, schema)","throws":true,"mean":0.0025453533304668936,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"b57b072f-674c-4bd9-8064-5874dbe29391","libraryName":"sury","version":"11.0.0-alpha.4","note":"safe","snippet":"S.safe(() => S.parseOrThrow(data, schema))","mean":0.0025650070999310008,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"52fcea42-7e27-4c4c-93f9-a501ad7107b8","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"// const compiledSchema = Schema.Compile(schema);\ncompiledSchema.Parse(data);","throws":true,"mean":0.003084683567615117,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"f09e5922-34e2-4f45-9f3c-31832ce207fd","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"// const compiled = Compile(schema);\ncompiled.Parse(data);","throws":true,"mean":0.003118142754695272,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"61072e63-2b31-47c9-b02b-45c2fa4721c9","libraryName":"io-ts","version":"2.2.22","snippet":"schema.decode(data)","mean":0.0058630963361656135,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"ce7b6519-2421-4e0e-8d8b-10f1d8f70e41","libraryName":"arktype","version":"2.1.29","snippet":"schema(data)","mean":0.006784798919866625,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"3f301463-64e0-4a36-9ec1-1026a348b2cc","libraryName":"zod","version":"4.3.6","snippet":"schema.safeParse(data)","mean":0.00893729222189198,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"e5a205c3-eece-4962-9013-01409f1ca4cc","libraryName":"valibot","version":"1.2.0","note":"abortPipeEarly only","snippet":"v.safeParse(schema, data, { abortPipeEarly: true })","mean":0.011993251136346503,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"d7ba484c-612a-4feb-8550-14bd69db1bc1","libraryName":"valibot","version":"1.2.0","snippet":"v.safeParse(schema, data)","mean":0.012023255239081498,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"d4705607-e2f0-46a8-a6db-79d7e9c6ca3f","libraryName":"valibot","version":"1.2.0","snippet":"v.safeParse(schema, data, { abortEarly: true })","mean":0.0120876705387452,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"114e1b3d-8bbe-4650-9a27-0bcdaeebb118","libraryName":"zod/mini","version":"4.3.6","note":"jitless","snippet":"schema.safeParse(data, { jitless: true })","mean":0.012407079379647641,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"858dab93-11b5-441a-a725-eca20b87ffd2","libraryName":"zod/mini","version":"4.3.6","snippet":"schema.safeParse(data)","mean":0.012436230055592534,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"e9f2a044-c4d2-4146-8437-a5297434a778","libraryName":"zod","version":"4.3.6","note":"jitless","snippet":"schema.safeParse(data, { jitless: true })","mean":0.013338924622175192,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"545e72a6-43db-4b04-99d0-84e5dbe92c97","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const decode = Schema.decodeUnknownOption(schema);\ndecode(data, { errors: \"all\" })","mean":0.015847737785456683,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"87afd32a-f4ec-4441-8e0b-c1e1ff963de1","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const decode = Schema.decodeUnknownOption(schema);\ndecode(data, { errors: \"first\" })","mean":0.01590071048321493,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"8f887806-abda-46d3-8b39-7b99fa714403","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"validate(data, schema, { abortEarly: true })","mean":0.017391632376220108,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"f692816f-11ec-4e00-acf2-3859a7c1b779","libraryName":"effect","version":"3.19.19","snippet":"// const decodeFirst = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"first\" }\n// );\ndecodeFirst(data)","mean":0.017561018122750155,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"37bab387-542e-4640-ab52-cc692d40be7e","libraryName":"effect","version":"3.19.19","snippet":"// const decodeAll = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"all\" }\n// );\ndecodeAll(data)","mean":0.017616686127017236,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"f3de5944-41e1-4db0-b50d-2838318e39d8","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"validate(data, schema)","mean":0.018313277332168195,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"2fc43f64-5f45-4dd7-8c3e-5cd2c012e2ae","libraryName":"joi","version":"18.0.2","snippet":"schema.validate(data, { abortEarly: false })","mean":0.0379428206859901,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"8850772d-84f1-4129-8707-ca82c81d62b6","libraryName":"joi","version":"18.0.2","snippet":"schema.validate(data, { abortEarly: true })","mean":0.0380309010077983,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"a6d8b6a2-4d05-4a99-a6be-42ca865ddf63","libraryName":"typebox","version":"1.1.5","note":"schema","snippet":"Schema.Parse(schema, data)","throws":true,"mean":0.06978572932802168,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"f6e9a0c0-add9-45f7-9398-2db68406d06c","libraryName":"typebox","version":"1.1.5","snippet":"Value.Parse(schema, data)","throws":true,"mean":0.07737418545450508,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"a34e3f5a-d6f8-4987-b0c9-ead20b65730a","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data, { abortEarly: false })","throws":true,"mean":0.13944346500279708,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"3e07d9b8-059c-43a0-b7a0-6bc8bb83bce0","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data, { abortEarly: true })","throws":true,"mean":0.13997691728481843,"optimizeType":"none","type":"parsing","errorType":"abortEarly"}],"invalid":[{"id":"0effc8de-ecc3-4de0-a08f-7821ab7653a7","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"validate(data, schema, { abortEarly: true })","mean":0.0006488511983627808,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"4ae34bd4-dbdb-463f-a86d-bdb1de208811","libraryName":"valibot","version":"1.2.0","snippet":"v.safeParse(schema, data, { abortEarly: true })","mean":0.000721916999050115,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"38d0f2d3-27c2-4170-8f2d-1906d4b28e9e","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const decode = Schema.decodeUnknownOption(schema);\ndecode(data, { errors: \"first\" })","mean":0.0010926736415621428,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"a7c7463e-1daf-4592-a0e2-c65da55a8cd4","libraryName":"joi","version":"18.0.2","snippet":"schema.validate(data, { abortEarly: true })","mean":0.003916786719778002,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"d086952f-1062-4b70-b28a-c107721dac2f","libraryName":"io-ts","version":"2.2.22","snippet":"schema.decode(data)","mean":0.0058651008322507,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"aa393de4-ec9a-4cca-a515-4572b5d4485b","libraryName":"typia","version":"11.0.3","note":"createValidate","snippet":"// const validate = typia.createValidate();\nvalidate(data);","mean":0.006379967156005103,"optimizeType":"precompiled","type":"parsing","errorType":"allErrors"},{"id":"b04aaf8e-4209-4f41-81a1-58edfbcdb421","libraryName":"typia","version":"11.0.3","note":"validate","snippet":"typia.validate(data)","mean":0.006901497097934473,"optimizeType":"precompiled","type":"parsing","errorType":"allErrors"},{"id":"73bb6c15-b31e-4f85-94d6-fcc03fb300fa","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile","snippet":"// const compile = S.compile(S.schema(...));\ncompile(data);","throws":true,"mean":0.007666476567589785,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"e13978a4-1ede-43f7-8152-a322b1a13076","libraryName":"sury","version":"11.0.0-alpha.4","note":"compile + safe","snippet":"// const compile = S.compile(S.schema(...));\nS.safe(() => compile(data));","mean":0.008025078075592534,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"7629a93d-f2a0-4e4d-85ff-ce1ae69c0bf1","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.parseOrThrow(data, schema)","throws":true,"mean":0.008099359942326499,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"2a7cd3cf-454a-471f-ae96-51f527ac4840","libraryName":"sury","version":"11.0.0-alpha.4","note":"safe","snippet":"S.safe(() => S.parseOrThrow(data, schema))","mean":0.008256718901203691,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"fa2551ae-bb6c-4eb7-b57e-5177efa2f511","libraryName":"effect","version":"3.19.19","snippet":"// const decodeFirst = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"first\" }\n// );\ndecodeFirst(data)","mean":0.009151793912271876,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"0ad07dbc-f32a-4367-9dce-ffd4d4da4454","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const decode = Schema.decodeUnknownOption(schema);\ndecode(data, { errors: \"all\" })","mean":0.019690079134414923,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"79327403-ca1d-4506-9452-355a3cf4faff","libraryName":"valibot","version":"1.2.0","snippet":"v.safeParse(schema, data)","mean":0.028999945190372623,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"8c7eac0f-ab44-46c9-8827-aff24568d99f","libraryName":"valibot","version":"1.2.0","note":"abortPipeEarly only","snippet":"v.safeParse(schema, data, { abortPipeEarly: true })","mean":0.029167984920520477,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"bd270b3e-84d3-476b-bb07-b52fd45e3a46","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"validate(data, schema)","mean":0.03006740434168291,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"4ba162fe-ef7c-4133-bb75-2720812dd73c","libraryName":"effect","version":"3.19.19","snippet":"// const decodeAll = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"all\" }\n// );\ndecodeAll(data)","mean":0.030655730020542487,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"f69dc764-8431-474d-bfd3-63ce04831f5a","libraryName":"joi","version":"18.0.2","snippet":"schema.validate(data, { abortEarly: false })","mean":0.060752007107703,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"24351b88-218a-42e7-8ce5-43ad0ca3f3bc","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"// const compiledSchema = Schema.Compile(schema);\ncompiledSchema.Parse(data);","throws":true,"mean":0.07066445583664174,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"7cf31817-9807-42e3-a76f-481abe0ad786","libraryName":"zod/mini","version":"4.3.6","note":"jitless","snippet":"schema.safeParse(data, { jitless: true })","mean":0.07184655657733041,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"3968092d-2596-423c-ac6a-c9e3f7e1e37c","libraryName":"zod/mini","version":"4.3.6","snippet":"schema.safeParse(data)","mean":0.07233330546111522,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"cf4502f2-7a1f-43dd-9e35-a8440164c309","libraryName":"typebox","version":"1.1.5","note":"schema","snippet":"Schema.Parse(schema, data)","throws":true,"mean":0.0745649035938144,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"6b4bf355-124b-4753-8e2e-a69b6b2dbcbe","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"// const compiled = Compile(schema);\ncompiled.Parse(data);","throws":true,"mean":0.07911454367092108,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"3e440234-1023-460c-82de-b89d87b2c6bd","libraryName":"typebox","version":"1.1.5","snippet":"Value.Parse(schema, data)","throws":true,"mean":0.08498040746086837,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"0421ba56-4356-4813-a4a1-e5be8ef0589b","libraryName":"zod","version":"4.3.6","snippet":"schema.safeParse(data)","mean":0.08898994732182275,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"696aab82-e12f-4f44-afd4-35b2446e0436","libraryName":"zod","version":"4.3.6","note":"jitless","snippet":"schema.safeParse(data, { jitless: true })","mean":0.09247868226372545,"optimizeType":"none","type":"parsing","errorType":"allErrors"},{"id":"d3efe354-d2ac-4280-8b3d-6c9353a313c3","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data, { abortEarly: true })","throws":true,"mean":0.0956820234404838,"optimizeType":"none","type":"parsing","errorType":"abortEarly"},{"id":"cd752b75-6364-4e5a-a189-cd24d9ebaa13","libraryName":"arktype","version":"2.1.29","snippet":"schema(data)","mean":0.09952453702228728,"optimizeType":"jit","type":"parsing","errorType":"allErrors"},{"id":"4a31838c-6413-409e-9944-ae366fd447ad","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data, { abortEarly: false })","throws":true,"mean":0.533591643733339,"optimizeType":"none","type":"parsing","errorType":"allErrors"}]},"validation":{"valid":[{"id":"b90e5d29-d2dc-441f-83de-aab556729baa","libraryName":"typia","version":"11.0.3","note":"createIs","snippet":"// const is = typia.createIs();\nis(data);","mean":0.0010880357071339057,"optimizeType":"precompiled","type":"validation"},{"id":"24cb1de3-174c-416b-b0c4-f2dd8489d717","libraryName":"typia","version":"11.0.3","note":"is","snippet":"typia.is(data)","mean":0.0011477167988845106,"optimizeType":"precompiled","type":"validation"},{"id":"7d3efc35-e575-4897-9c9b-5caf4a330552","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"// const compiledSchema = Schema.Compile(schema);\ncompiledSchema.Check(data);","mean":0.0030646765390062226,"optimizeType":"jit","type":"validation"},{"id":"dc89a9f2-9b9d-4b43-bd82-86630b445d92","libraryName":"io-ts","version":"2.2.22","snippet":"schema.is(data)","mean":0.003198277849739014,"optimizeType":"none","type":"validation"},{"id":"b5673777-cba9-454a-a8d7-63bf247b60ce","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"// const compiled = Compile(schema);\ncompiled.Check(data);","mean":0.0032346808960069724,"optimizeType":"jit","type":"validation"},{"id":"e1c74998-6b63-44a2-9b23-e367cf9cb6cc","libraryName":"ajv","version":"8.18.0","note":"compile","snippet":"// const validate = ajv.compile(schema);\nvalidate(data);","mean":0.0034759245274496955,"optimizeType":"jit","type":"validation"},{"id":"f42fb20d-c944-44bf-9257-1c387c023f5e","libraryName":"ajv","version":"8.18.0","note":"validate","snippet":"ajv.validate(schema, data)","mean":0.0034912073985632155,"optimizeType":"jit","type":"validation"},{"id":"cf256c2f-0f89-4148-885b-f73b84277b43","libraryName":"arktype","version":"2.1.29","snippet":"schema.allows(data)","mean":0.006799750865263369,"optimizeType":"jit","type":"validation"},{"id":"7f16f140-8284-473b-aad1-6a77b23cadd3","libraryName":"valibot","version":"1.2.0","snippet":"v.is(schema, data)","mean":0.012063108784287903,"optimizeType":"none","type":"validation"},{"id":"56729712-5925-48b5-8150-cd883201c9ce","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const is = Schema.is(schema);\nis(data);","mean":0.01578395589999254,"optimizeType":"none","type":"validation"},{"id":"4fe6b609-b2cb-4f04-a152-1bbb9d0828b1","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"is(data, schema)","mean":0.017291706252597336,"optimizeType":"none","type":"validation"},{"id":"4a0535d9-e8f7-46b0-81e9-1cb500b67b81","libraryName":"effect","version":"3.19.19","snippet":"// const is = Schema.is(schema);\nis(data);","mean":0.01757450505263515,"optimizeType":"none","type":"validation"},{"id":"87c622f6-dc6e-4f92-87bc-8fb47c3fa680","libraryName":"typebox","version":"1.1.5","note":"schema","snippet":"Schema.Check(schema, data)","mean":0.06929414232260307,"optimizeType":"jit","type":"validation"},{"id":"30165700-bb14-4dcb-b700-63618d923435","libraryName":"typebox","version":"1.1.5","snippet":"Value.Check(schema, data)","mean":0.0699174640984418,"optimizeType":"jit","type":"validation"},{"id":"b28f41ba-0a79-46c0-b878-af6283a9e5b4","libraryName":"yup","version":"1.7.1","snippet":"schema.isValidSync(data)","mean":0.14379860043134518,"optimizeType":"none","type":"validation"}],"invalid":[{"id":"bb17390b-1d09-4548-969c-7f972e1232f6","libraryName":"typia","version":"11.0.3","note":"createIs","snippet":"// const is = typia.createIs();\nis(data);","mean":0.0000485297576711256,"optimizeType":"precompiled","type":"validation"},{"id":"ea52049f-19a7-44c5-b4c8-c1b296c21eb8","libraryName":"typia","version":"11.0.3","note":"is","snippet":"typia.is(data)","mean":0.00006307010550904175,"optimizeType":"precompiled","type":"validation"},{"id":"04645b06-fa3e-44ad-bce2-88a0163b30c8","libraryName":"typebox","version":"1.1.5","note":"schema compile","snippet":"// const compiledSchema = Schema.Compile(schema);\ncompiledSchema.Check(data);","mean":0.00006411925161348397,"optimizeType":"jit","type":"validation"},{"id":"a9a09f29-7103-4c7f-b49a-43a6dfceb055","libraryName":"typebox","version":"1.1.5","note":"compile","snippet":"// const compiled = Compile(schema);\ncompiled.Check(data);","mean":0.00006482865811769798,"optimizeType":"jit","type":"validation"},{"id":"9b5cb7f0-e4ad-418e-bf7b-3ca11904d699","libraryName":"ajv","version":"8.18.0","note":"compile","snippet":"// const validate = ajv.compile(schema);\nvalidate(data);","mean":0.00008719430509559852,"optimizeType":"jit","type":"validation"},{"id":"e6031dd1-b1c8-4225-8994-9f59beac84c2","libraryName":"io-ts","version":"2.2.22","snippet":"schema.is(data)","mean":0.00012282136615202738,"optimizeType":"none","type":"validation"},{"id":"83f5dbec-7450-4a6a-9490-faa5c3955142","libraryName":"ajv","version":"8.18.0","note":"validate","snippet":"ajv.validate(schema, data)","mean":0.00012686485709189992,"optimizeType":"jit","type":"validation"},{"id":"b04c8ba9-9299-40c0-9988-b21219adab24","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"is(data, schema)","mean":0.0006577870467264642,"optimizeType":"none","type":"validation"},{"id":"97e34c80-7d00-46bf-9f0c-6cab42568357","libraryName":"valibot","version":"1.2.0","snippet":"v.is(schema, data)","mean":0.000703326350947827,"optimizeType":"none","type":"validation"},{"id":"e62f02a9-ba5e-46bc-859b-29c2db0d6868","libraryName":"effect","version":"3.19.19","snippet":"// const is = Schema.is(schema);\nis(data);","mean":0.0007088287859606498,"optimizeType":"none","type":"validation"},{"id":"473a30ba-92a8-4309-adc7-ba35be586a0b","libraryName":"arktype","version":"2.1.29","snippet":"schema.allows(data)","mean":0.0007811979945102355,"optimizeType":"jit","type":"validation"},{"id":"da29155b-95d5-455f-bf19-7246d2c48647","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const is = Schema.is(schema);\nis(data);","mean":0.001059249620523877,"optimizeType":"none","type":"validation"},{"id":"7f23293e-2682-422f-a337-3eb663037520","libraryName":"typebox","version":"1.1.5","snippet":"Value.Check(schema, data)","mean":0.0036068178991769525,"optimizeType":"jit","type":"validation"},{"id":"e1385f4c-80ef-4bab-a41e-8d73f7866569","libraryName":"typebox","version":"1.1.5","note":"schema","snippet":"Schema.Check(schema, data)","mean":0.003922417611643752,"optimizeType":"jit","type":"validation"},{"id":"9280cced-15fb-4cbf-96c7-0f47ff82fc1e","libraryName":"yup","version":"1.7.1","snippet":"schema.isValidSync(data)","mean":0.09559319491444081,"optimizeType":"none","type":"validation"}]},"standard":{"valid":[{"id":"b9a05bdf-ae0f-4a00-be70-ef83a12bb518","libraryName":"typia","version":"11.0.3","snippet":"// const validate = typia.createValidate();\nupfetch(url, { schema: validate })","mean":0.0011335776381458166,"optimizeType":"precompiled","errorType":"allErrors","type":"standard"},{"id":"4e52b2ca-a8db-4bfa-879f-ac064c7e500d","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"upfetch(url, { schema })","mean":0.0025350927260611705,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"b7004d4e-e036-4b98-aa9f-c66c78e613ae","libraryName":"arktype","version":"2.1.29","snippet":"upfetch(url, { schema })","mean":0.006845283558997853,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"5885d77e-61c8-4315-9406-c4f585827d96","libraryName":"zod","version":"4.3.6","snippet":"upfetch(url, { schema })","mean":0.008738041094694062,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"b8e174bb-fd63-4425-9df5-4e2f9a7f8d48","libraryName":"valibot","version":"1.2.0","snippet":"upfetch(url, { schema })","mean":0.012036329529860088,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"fc9ab9ae-18cf-41b9-8803-7eefedd2e415","libraryName":"zod/mini","version":"4.3.6","snippet":"upfetch(url, { schema })","mean":0.012439173238632594,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"3adfb410-fe23-48dd-9f3f-0e521010abaf","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const standardSchema = Schema.toStandardSchemaV1(\n// schema, \n// { parseOptions: { errors: \"first\" } }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.016571028054420397,"optimizeType":"none","errorType":"abortEarly","type":"standard"},{"id":"f5c2effd-d091-4e77-aca7-6ae39a4be5c3","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const standardSchema = Schema.toStandardSchemaV1(\n// schema, \n// { parseOptions: { errors: \"all\" } }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.016840397123715156,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"abda4e83-6abe-4cf1-852b-1223f0050849","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"upfetch(url, { schema })","mean":0.017344858275225482,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"ef8889e0-069c-4e76-9575-16525ddc9cae","libraryName":"effect","version":"3.19.19","snippet":"// const standardSchema = Schema.standardSchemaV1(\n// schema, \n// { errors: \"first\" }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.018268277785898228,"optimizeType":"none","errorType":"abortEarly","type":"standard"},{"id":"88bbf503-6e1f-43f6-8c92-f69ee4698b52","libraryName":"effect","version":"3.19.19","snippet":"// const standardSchema = Schema.standardSchemaV1(\n// schema, \n// { errors: \"all\" }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.01839697260702794,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"de7f91ec-5672-427f-a36c-ea920b3c1638","libraryName":"joi","version":"18.0.2","snippet":"upfetch(url, { schema })","mean":0.03868636643583972,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"b4ed9ab5-ccd6-4918-8170-5020cf77f35d","libraryName":"yup","version":"1.7.1","snippet":"upfetch(url, { schema })","mean":0.14189865224177542,"optimizeType":"none","errorType":"allErrors","type":"standard"}],"invalid":[{"id":"4812315a-e37c-48fe-a06e-f0f6c51bd5fb","libraryName":"joi","version":"18.0.2","snippet":"upfetch(url, { schema })","mean":0.0044112745695723665,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"71158d7b-68c8-47b7-8247-7ca92aee6269","libraryName":"effect","version":"3.19.19","snippet":"// const standardSchema = Schema.standardSchemaV1(\n// schema, \n// { errors: \"first\" }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.004807671338120939,"optimizeType":"none","errorType":"abortEarly","type":"standard"},{"id":"1a01247f-0e07-4894-a15b-7c0de9821751","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"upfetch(url, { schema })","mean":0.008025051007145997,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"44f08826-c9d2-41fd-a41f-5c51b74cffaf","libraryName":"typia","version":"11.0.3","snippet":"// const validate = typia.createValidate();\nupfetch(url, { schema: validate })","mean":0.01075496114259516,"optimizeType":"precompiled","errorType":"allErrors","type":"standard"},{"id":"52bd1169-245d-4087-9a3e-816057fa1b85","libraryName":"valibot","version":"1.2.0","snippet":"upfetch(url, { schema })","mean":0.028567727781729862,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"2e00a2bf-3968-4921-9e01-98d29af05981","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const standardSchema = Schema.toStandardSchemaV1(\n// schema, \n// { parseOptions: { errors: \"first\" } }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.030176333323277044,"optimizeType":"none","errorType":"abortEarly","type":"standard"},{"id":"c34df8b1-20a6-40dc-8570-0544266d19ac","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"// const standardSchema = Schema.toStandardSchemaV1(\n// schema, \n// { parseOptions: { errors: \"all\" } }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.030331838666629612,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"1dbb30d2-093f-4859-b2e8-18888594dd4e","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"upfetch(url, { schema })","mean":0.03077353785081231,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"0e869b82-68af-4606-ad65-46abfa1e37fd","libraryName":"zod/mini","version":"4.3.6","snippet":"upfetch(url, { schema })","mean":0.07141261825192478,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"86537799-dbbb-468c-9e79-8b1f7efca607","libraryName":"effect","version":"3.19.19","snippet":"// const standardSchema = Schema.standardSchemaV1(\n// schema, \n// { errors: \"all\" }\n// );\nupfetch(url, { schema: standardSchema });","mean":0.07344531081081294,"optimizeType":"none","errorType":"allErrors","type":"standard"},{"id":"bd0df883-963b-4026-9352-9062527081cc","libraryName":"zod","version":"4.3.6","snippet":"upfetch(url, { schema })","mean":0.07579532067607285,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"0166d8f7-3884-4788-b5f9-d9a6c02975a9","libraryName":"arktype","version":"2.1.29","snippet":"upfetch(url, { schema })","mean":0.09787410530434217,"optimizeType":"jit","errorType":"allErrors","type":"standard"},{"id":"6ab41f80-4d13-4e30-9bfd-52ae79b673b2","libraryName":"yup","version":"1.7.1","snippet":"upfetch(url, { schema })","mean":0.5521317080573951,"optimizeType":"none","errorType":"allErrors","type":"standard"}]},"string":{"date-time":{"valid":[{"id":"22d8a7c4-75a2-4424-a3fd-ed1fe6e8a997","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"date-time\">","mean":0.00012438956110287887,"optimizeType":"precompiled","type":"string"},{"id":"3abd5158-d24b-4cd6-81a6-8f579c04a0b4","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.datetime()","mean":0.0002334226733715048,"optimizeType":"jit","type":"string"},{"id":"94c622d6-e75a-4252-96a6-377061d30148","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.date.iso\")","mean":0.0002626604352237243,"optimizeType":"jit","type":"string"},{"id":"774d4937-ae62-4341-b9b4-81b2e017c884","libraryName":"zod","version":"4.3.6","snippet":"z.iso.datetime()","mean":0.0003808079258311504,"optimizeType":"jit","type":"string"},{"id":"97125c46-9ac8-4a16-9547-2092e3156395","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.datetime(S.string)","mean":0.00038408955545481035,"optimizeType":"jit","type":"string"},{"id":"a6aa40f4-4702-43b2-bc94-23935198cb30","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoDateTime())","mean":0.0014200568149849982,"optimizeType":"none","type":"string"},{"id":"d1ab3f1d-2369-4e33-a0b9-ce20d6756928","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"date-time\" })","mean":0.0016384827312168687,"optimizeType":"jit","type":"string"},{"id":"e0cfbb3a-ff7a-4a01-8f70-e7cd365b6da3","libraryName":"yup","version":"1.7.1","snippet":"yup.string().datetime()","mean":0.001984766175512717,"optimizeType":"none","type":"string"},{"id":"db6d37a0-2aee-48c9-830e-e13af4bf7517","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().isoDate()","mean":0.004200299383817404,"optimizeType":"none","type":"string"}],"invalid":[{"id":"291895b2-68d6-4c7d-8b7e-9d96af02beae","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"date-time\">","mean":0.00007382840661618411,"optimizeType":"precompiled","type":"string"},{"id":"98a43f0f-e7fb-4644-ac83-dd81ff74221d","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.date.iso\")","mean":0.00009920674863704045,"optimizeType":"jit","type":"string"},{"id":"decbcb3e-f6d0-44cd-8efb-454886870ad3","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoDateTime())","mean":0.0001657544462399572,"optimizeType":"none","type":"string"},{"id":"b3b361ab-6929-4517-ae28-1d7c1d23d1f9","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"date-time\" })","mean":0.0006469289076959485,"optimizeType":"jit","type":"string"},{"id":"9794bfbc-e785-4ad1-bc3b-22a3fde8b386","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().isoDate()","mean":0.0021832415776096865,"optimizeType":"none","type":"string"},{"id":"0bdad37c-6b25-4462-95b9-ec7ab517a824","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.datetime(S.string)","mean":0.006520642592593591,"optimizeType":"jit","type":"string"},{"id":"ef59b8b1-adbd-4b71-b228-0d685bda35a7","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.datetime()","mean":0.012367197872872944,"optimizeType":"jit","type":"string"},{"id":"7a5823fd-4bce-40f4-9d02-f4f2a09b1c16","libraryName":"zod","version":"4.3.6","snippet":"z.iso.datetime()","mean":0.017329060876494076,"optimizeType":"jit","type":"string"},{"id":"3a07ea63-8c01-4654-add6-e848de0baae9","libraryName":"yup","version":"1.7.1","snippet":"yup.string().datetime()","mean":0.0215528747790904,"optimizeType":"none","type":"string"}]},"date":{"valid":[{"id":"87181da9-13a1-4bc7-ae50-5342d6dbb00f","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"date\">","mean":0.00009591946065701405,"optimizeType":"precompiled","type":"string"},{"id":"830e5f53-752b-4893-8364-f4cf747a37e7","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.isoDate())","mean":0.00017504778821745992,"optimizeType":"none","type":"string"},{"id":"7e8fb181-d250-4a21-b605-621211d51201","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.date()","mean":0.00021924715598113686,"optimizeType":"jit","type":"string"},{"id":"01055e82-2e43-479b-99fc-5342e42dcafa","libraryName":"zod","version":"4.3.6","snippet":"z.iso.date()","mean":0.00036311542274291,"optimizeType":"jit","type":"string"},{"id":"73e71819-b80b-42cd-984c-7d953f435212","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"date\" })","mean":0.001158138149641854,"optimizeType":"jit","type":"string"},{"id":"034436f3-b48f-4965-8982-6aa2ad358e62","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoDate())","mean":0.0011764130360626887,"optimizeType":"none","type":"string"}],"invalid":[{"id":"dbd4ba3a-e413-43c6-b03c-480b98ffb8f2","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"date\">","mean":0.00007353924101384286,"optimizeType":"precompiled","type":"string"},{"id":"3a1f90b9-9b1d-43b6-a380-74972acf9d65","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoDate())","mean":0.00016651257794208807,"optimizeType":"none","type":"string"},{"id":"d8c40900-e858-4b83-8b8a-29cfe15c5c51","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.isoDate())","mean":0.00032149680480284486,"optimizeType":"none","type":"string"},{"id":"1caa5ffa-a473-4cae-b8ed-3322389ae2ba","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"date\" })","mean":0.0006067485016388976,"optimizeType":"jit","type":"string"},{"id":"65e62f01-8119-4d79-bccb-d1f991f060ee","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.date()","mean":0.011888582024589627,"optimizeType":"jit","type":"string"},{"id":"82d3cd0b-4290-4aef-95fb-d57669c0ac24","libraryName":"zod","version":"4.3.6","snippet":"z.iso.date()","mean":0.017227645750752887,"optimizeType":"jit","type":"string"}]},"time":{"valid":[{"id":"2214ce6d-3043-47ec-a833-e6a865ec9181","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"time\">","mean":0.00008651063907470415,"optimizeType":"precompiled","type":"string"},{"id":"5c7861b4-84d2-4bb5-a0b0-2c1ae0a0d72f","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoTime())","mean":0.00037031398134792023,"optimizeType":"none","type":"string"},{"id":"c24fc071-a0e9-43d4-9e87-b43cc801b751","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"time\" })","mean":0.0012583451525430664,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"b799bce4-c3c9-4622-a051-c9faad755b03","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"time\">","mean":0.00007032709349151891,"optimizeType":"precompiled","type":"string"},{"id":"4261c320-01e1-4f18-bf47-f5eaa9709853","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), isoTime())","mean":0.00015882095385123078,"optimizeType":"none","type":"string"},{"id":"0671ddb9-fa7b-49e5-b67a-ab78ecc0ec85","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"time\" })","mean":0.0006002833859592889,"optimizeType":"jit","type":"string"}]},"duration":{"valid":[{"id":"7be7f1f8-690a-4824-aa93-070d0c2fae9a","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"duration\">","mean":0.00016209926066737602,"optimizeType":"precompiled","type":"string"},{"id":"cec2449b-f12a-4706-8952-7256c9c7c4b2","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), duration())","mean":0.00018411820203397905,"optimizeType":"none","type":"string"},{"id":"0e791e43-d7e6-4fa8-a2dc-7cfd80ed1c73","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.duration()","mean":0.00035734370951901443,"optimizeType":"jit","type":"string"},{"id":"0ac2071d-1893-41d6-ae5e-c4ec5ed0d16d","libraryName":"zod","version":"4.3.6","snippet":"z.iso.duration()","mean":0.0005290762388178243,"optimizeType":"jit","type":"string"},{"id":"3cf0dba1-ac2f-4831-968c-1830a54c3faa","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().isoDuration()","mean":0.0006170758416752678,"optimizeType":"none","type":"string"},{"id":"5a597019-b047-4ba9-b2d9-b230cebe763b","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"duration\" })","mean":0.001068863730571048,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"b4d9d851-ec03-4ed1-a4ab-360033fcb735","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"duration\">","mean":0.00007515791903744658,"optimizeType":"precompiled","type":"string"},{"id":"5f85f960-230a-46e0-96fe-9635af58615e","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), duration())","mean":0.00015742497386429859,"optimizeType":"none","type":"string"},{"id":"93a97db6-d1a4-4ada-a3c7-e9c94125cb2a","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"duration\" })","mean":0.0006040057489217752,"optimizeType":"jit","type":"string"},{"id":"ce1ccbbd-8e0b-497b-bebf-f20d158b88be","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().isoDuration()","mean":0.0020636980774603308,"optimizeType":"none","type":"string"},{"id":"8d7e957e-b944-476f-8deb-b88c5db80765","libraryName":"zod/mini","version":"4.3.6","snippet":"z.iso.duration()","mean":0.011879786307422415,"optimizeType":"jit","type":"string"},{"id":"b4523a7d-4633-426d-88bb-6e359d447515","libraryName":"zod","version":"4.3.6","snippet":"z.iso.duration()","mean":0.016852729802165175,"optimizeType":"jit","type":"string"}]},"email":{"valid":[{"id":"e96b2582-22dc-4d60-a76b-6f0ecae062ec","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"email\">","mean":0.00012905856341540202,"optimizeType":"precompiled","type":"string"},{"id":"5a580d19-41be-419c-ac3a-3f5e8fe4a975","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.email\")","mean":0.00013143334476775485,"optimizeType":"jit","type":"string"},{"id":"2cead68d-c45c-45d9-98c1-42d908366753","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.email(S.string)","mean":0.00018779268461288778,"optimizeType":"jit","type":"string"},{"id":"455fa2b9-fd8b-428e-864c-a16050cb4e63","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.email())","mean":0.00020527120820996813,"optimizeType":"none","type":"string"},{"id":"78c6bbea-5765-4689-bf17-379f57f99f93","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), email())","mean":0.00021054423618382896,"optimizeType":"none","type":"string"},{"id":"cc582bc5-578b-4fc8-8ea9-7e420b0cdaff","libraryName":"zod/mini","version":"4.3.6","snippet":"z.email()","mean":0.0003143988531990782,"optimizeType":"jit","type":"string"},{"id":"d33ade05-400b-4deb-9afd-1589f87491f6","libraryName":"zod","version":"4.3.6","snippet":"z.email()","mean":0.000474102972292939,"optimizeType":"jit","type":"string"},{"id":"c6c6b8e3-284a-4038-ae3c-3ae7f27fa6c8","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"email\" })","mean":0.0010664780188218094,"optimizeType":"jit","type":"string"},{"id":"8cc21374-13e4-48ca-ad47-4c92d0a25b2d","libraryName":"yup","version":"1.7.1","snippet":"yup.string().email()","mean":0.0011381198450337604,"optimizeType":"none","type":"string"},{"id":"e4b3d67c-7a61-43c8-be01-e89c425e5926","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().email()","mean":0.0024344240740063507,"optimizeType":"none","type":"string"}],"invalid":[{"id":"27d46c75-2c7f-412f-a041-24dbb913a11d","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"email\">","mean":0.00009775422049111746,"optimizeType":"precompiled","type":"string"},{"id":"acece2d7-22e9-44c0-82e9-1eb635b508e1","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.email\")","mean":0.00010610507734065018,"optimizeType":"jit","type":"string"},{"id":"5b0fa2d9-8d9b-4b08-ac7a-d09e00c252c5","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), email())","mean":0.00018277345577465926,"optimizeType":"none","type":"string"},{"id":"2f7902a3-df51-4d0b-b9ab-f2bd4a04f639","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.email())","mean":0.0002890850129170756,"optimizeType":"none","type":"string"},{"id":"a37c28b6-1ba3-4e58-8cc6-758760875171","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"email\" })","mean":0.0006571432354720376,"optimizeType":"jit","type":"string"},{"id":"25ebbfd0-014b-48ca-a53a-7665f872a881","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().email()","mean":0.002209934228062817,"optimizeType":"none","type":"string"},{"id":"163c6a1f-4821-4594-82ca-573986be146a","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.email(S.string)","mean":0.007282069914961024,"optimizeType":"jit","type":"string"},{"id":"5ea63e83-ea30-4adc-9926-0ed189b4addc","libraryName":"zod/mini","version":"4.3.6","snippet":"z.email()","mean":0.011955592721435105,"optimizeType":"jit","type":"string"},{"id":"c37dc5c3-7277-4156-b403-55b32b957d0c","libraryName":"zod","version":"4.3.6","snippet":"z.email()","mean":0.01736312097479661,"optimizeType":"jit","type":"string"},{"id":"8feb6ecd-3c17-4cd8-97b3-df96881f7afb","libraryName":"yup","version":"1.7.1","snippet":"yup.string().email()","mean":0.021484573024535623,"optimizeType":"none","type":"string"}]},"url":{"valid":[{"id":"7c61ab88-0103-44fb-9bd5-5ac88caf62c5","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"url\">","mean":0.00021012885793848056,"optimizeType":"precompiled","type":"string"},{"id":"c0d4c274-cbc1-4544-b306-c99ad4155a37","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.url\")","mean":0.00030640505151585207,"optimizeType":"jit","type":"string"},{"id":"dd349958-851c-495c-8906-b8ac8243287d","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.url(S.string)","mean":0.00047620077049301263,"optimizeType":"jit","type":"string"},{"id":"30a540f4-0fe0-454d-a96d-aa67b624fb8f","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), url())","mean":0.0005465960273384727,"optimizeType":"none","type":"string"},{"id":"e7c45246-cd44-4937-a0e1-e25fe3e2a0c0","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.url())","mean":0.0005523297805642681,"optimizeType":"none","type":"string"},{"id":"b609ed74-15bb-46f5-810b-4c6c9ff689db","libraryName":"zod/mini","version":"4.3.6","snippet":"z.url()","mean":0.0006447405526207031,"optimizeType":"jit","type":"string"},{"id":"f8da286e-e43e-4f1e-aef5-96bd2d2ecfe5","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().uri()","mean":0.0006897584238465702,"optimizeType":"none","type":"string"},{"id":"c01ea2c6-2a77-415a-aa06-6d5836801bc5","libraryName":"zod","version":"4.3.6","snippet":"z.url()","mean":0.0008535395931351042,"optimizeType":"jit","type":"string"},{"id":"0e6334a3-9526-46c1-81d3-e97615b9ecdd","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"url\" })","mean":0.0011302140702435693,"optimizeType":"jit","type":"string"},{"id":"a2ed9be9-def3-4cba-9b66-44ac393fb037","libraryName":"yup","version":"1.7.1","snippet":"yup.string().url()","mean":0.001472648789703203,"optimizeType":"none","type":"string"}],"invalid":[{"id":"8e77569c-7140-47ad-8615-9a2f4b5e9332","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"url\">","mean":0.00007515706420218331,"optimizeType":"precompiled","type":"string"},{"id":"c57a77d3-c054-46b8-9068-9e0b8e2b9699","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.url\")","mean":0.00015058071073129197,"optimizeType":"jit","type":"string"},{"id":"ce8df56d-1e55-4efc-9881-422486cf5a22","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"url\" })","mean":0.0005865411596209868,"optimizeType":"jit","type":"string"},{"id":"a96966c2-ad75-45a8-99a9-4b1f12ff3870","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().uri()","mean":0.002190963406590629,"optimizeType":"none","type":"string"},{"id":"a3e3965d-ea96-45cd-a4d4-06d3b89e2aa0","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), url())","mean":0.008310846715137779,"optimizeType":"none","type":"string"},{"id":"cebb62b4-324f-48dc-a2c5-e4caf321aed6","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.url())","mean":0.008424804428026237,"optimizeType":"none","type":"string"},{"id":"3f21c0d4-e999-47ac-a97d-b5681202b522","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.url(S.string)","mean":0.01416821012737142,"optimizeType":"jit","type":"string"},{"id":"d4280334-99bb-4f87-8ff7-fa2feeecf034","libraryName":"zod/mini","version":"4.3.6","snippet":"z.url()","mean":0.019799829686964338,"optimizeType":"jit","type":"string"},{"id":"a4360f2c-9c10-46fc-987f-239b49995956","libraryName":"yup","version":"1.7.1","snippet":"yup.string().url()","mean":0.021518624462040455,"optimizeType":"none","type":"string"},{"id":"4be50e77-650a-4654-bc18-5ffe3a9fa19a","libraryName":"zod","version":"4.3.6","snippet":"z.url()","mean":0.02715567508485463,"optimizeType":"jit","type":"string"}]},"uuid":{"valid":[{"id":"c35148a7-a1ad-4ffe-8fab-1d71b4fe6665","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.uuid\")","mean":0.00015573192061622926,"optimizeType":"jit","type":"string"},{"id":"64da725c-0786-4cd0-820d-08cb8dca0e9a","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"uuid\">","mean":0.00017198421958801148,"optimizeType":"precompiled","type":"string"},{"id":"16cfacae-e81c-47d0-903c-831cfbf95c67","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.uuid(S.string)","mean":0.0002178337419160674,"optimizeType":"jit","type":"string"},{"id":"1e569786-8827-4e42-9348-e9cb9217731e","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), uuid())","mean":0.00026141703644143543,"optimizeType":"none","type":"string"},{"id":"d9f48975-9094-421c-8a25-4a9daa35650e","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.uuid())","mean":0.0002733974345477311,"optimizeType":"none","type":"string"},{"id":"a4eba9ea-9638-4437-9ee1-0283f9778ea2","libraryName":"zod/mini","version":"4.3.6","snippet":"z.uuid()","mean":0.00029247071373982855,"optimizeType":"jit","type":"string"},{"id":"2863e550-bcd8-4500-9cd6-1e1ba3a1aa2f","libraryName":"zod","version":"4.3.6","snippet":"z.uuid()","mean":0.00045292482988145766,"optimizeType":"jit","type":"string"},{"id":"064bba66-b2f7-4589-b2c1-304da5365b97","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().uuid()","mean":0.0006807805566477137,"optimizeType":"none","type":"string"},{"id":"a6b97293-2288-4cff-8301-b555807c08c6","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"uuid\" })","mean":0.0011008629250553134,"optimizeType":"jit","type":"string"},{"id":"9c7e66cd-913d-4ad1-8ce9-5baa66d02b25","libraryName":"yup","version":"1.7.1","snippet":"yup.string().uuid()","mean":0.001158619280335581,"optimizeType":"none","type":"string"}],"invalid":[{"id":"a87ba7dd-3cf7-42da-b292-82f6938cc3d5","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"uuid\">","mean":0.00007328795458296089,"optimizeType":"precompiled","type":"string"},{"id":"9dd09ffe-3e48-4642-8867-30d32172430e","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.uuid\")","mean":0.00008611578878714384,"optimizeType":"jit","type":"string"},{"id":"25f83099-be1c-4c8e-9f09-5c4e7a47a95a","libraryName":"@railway-ts/pipelines","version":"0.1.27","snippet":"chain(string(), uuid())","mean":0.00015425053447881533,"optimizeType":"none","type":"string"},{"id":"1c9a38b4-252f-42a7-b9c0-531ae6c3d52c","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.uuid())","mean":0.00026925943626098474,"optimizeType":"none","type":"string"},{"id":"50e8a0db-3ef0-44d6-a581-0d5eeaa725e1","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"uuid\" })","mean":0.0005772796047743097,"optimizeType":"jit","type":"string"},{"id":"e01b9de0-3c40-4839-bc52-334f12fe6854","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().uuid()","mean":0.002096958176237515,"optimizeType":"none","type":"string"},{"id":"78ef77bd-6e72-4752-9710-ad972e8b68f8","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.uuid(S.string)","mean":0.007265585079488037,"optimizeType":"jit","type":"string"},{"id":"b4742fd3-db0f-4499-9aff-7f5ad81eb460","libraryName":"zod/mini","version":"4.3.6","snippet":"z.uuid()","mean":0.011918866628526183,"optimizeType":"jit","type":"string"},{"id":"5f0dbd7f-c9ae-4f67-868e-dc456354d7b0","libraryName":"zod","version":"4.3.6","snippet":"z.uuid()","mean":0.01667196535570704,"optimizeType":"jit","type":"string"},{"id":"55885d97-0615-4dfe-aac6-068cb25d8eb2","libraryName":"yup","version":"1.7.1","snippet":"yup.string().uuid()","mean":0.02136331271094529,"optimizeType":"none","type":"string"}]},"ipv4":{"valid":[{"id":"b8b92e83-a1a7-4d44-bd99-94337d23e712","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"ipv4\">","mean":0.00008868519947764485,"optimizeType":"precompiled","type":"string"},{"id":"66546fbb-e8a5-45f2-bc5b-feed6ad34979","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.ip.v4\")","mean":0.00011347726800797981,"optimizeType":"jit","type":"string"},{"id":"c345bcbf-bbc4-42fa-a67d-41db21656685","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.ipv4())","mean":0.00017814316991079148,"optimizeType":"none","type":"string"},{"id":"86e2bc2e-05c2-44fe-a48f-18828cfb489d","libraryName":"zod/mini","version":"4.3.6","snippet":"z.ipv4()","mean":0.0002207140960577323,"optimizeType":"jit","type":"string"},{"id":"f08214e0-c687-4f11-b847-f5bb12a52587","libraryName":"zod","version":"4.3.6","snippet":"z.ipv4()","mean":0.00036086563098269956,"optimizeType":"jit","type":"string"},{"id":"cc050c67-4e5c-40e7-a195-fc0cb1909cf4","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().ip({ version: \"ipv4\" })","mean":0.0005140371001120911,"optimizeType":"none","type":"string"},{"id":"b016d059-3191-4c22-a074-f93a1e30ff78","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"ipv4\" })","mean":0.0009576775381043667,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"b297b197-541e-4c7f-a510-9155e691ac3d","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"ipv4\">","mean":0.00007004619784902961,"optimizeType":"precompiled","type":"string"},{"id":"0ec35a6b-585d-4d67-b8c3-a3cffc39e367","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.ip.v4\")","mean":0.0000911048487359716,"optimizeType":"jit","type":"string"},{"id":"b32d31bd-0ac8-47eb-8974-076956c46287","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.ipv4())","mean":0.0002626083792553479,"optimizeType":"none","type":"string"},{"id":"1540ff9d-c651-4d4e-8c4a-152b80ee5034","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"ipv4\" })","mean":0.0005786334808823901,"optimizeType":"jit","type":"string"},{"id":"c8b4e371-0c93-4172-99be-93a0ff3bb76c","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().ip({ version: \"ipv4\" })","mean":0.0026724361889950247,"optimizeType":"none","type":"string"},{"id":"8090067d-0997-4c8a-9a14-353846f14dfa","libraryName":"zod/mini","version":"4.3.6","snippet":"z.ipv4()","mean":0.011844430319328466,"optimizeType":"jit","type":"string"},{"id":"f036a124-ad25-4cad-9376-1947663cbb6a","libraryName":"zod","version":"4.3.6","snippet":"z.ipv4()","mean":0.016727081560278998,"optimizeType":"jit","type":"string"}]},"ipv6":{"valid":[{"id":"a1eea989-8f62-4df7-ace7-f0ec40311668","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.ip.v6\")","mean":0.00017578081574076384,"optimizeType":"jit","type":"string"},{"id":"de2eaf6e-5a50-4250-9d18-2ca5b3998a1f","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.ipv6())","mean":0.00019388998507755621,"optimizeType":"none","type":"string"},{"id":"d056f304-5536-49f1-b07c-41d313c07908","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"ipv6\">","mean":0.0003432379056692413,"optimizeType":"precompiled","type":"string"},{"id":"c328fe76-ce9b-49f2-bf82-9a7889c49fdc","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().ip({ version: \"ipv6\" })","mean":0.0005421583687544674,"optimizeType":"none","type":"string"},{"id":"bc6da0cb-94c9-4250-9c03-50c891a1cef7","libraryName":"zod/mini","version":"4.3.6","snippet":"z.ipv6()","mean":0.0008089293230407254,"optimizeType":"jit","type":"string"},{"id":"d9df88c5-e0b5-4836-a35f-f4c229182709","libraryName":"zod","version":"4.3.6","snippet":"z.ipv6()","mean":0.001042286055258421,"optimizeType":"jit","type":"string"},{"id":"9b2d4777-cae7-488e-bcb7-1bbf349b6531","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"ipv6\" })","mean":0.001266078343613219,"optimizeType":"jit","type":"string"}],"invalid":[{"id":"d1be6bb9-d8fb-45b4-a6a0-56a1aa1c803b","libraryName":"arktype","version":"2.1.29","snippet":"type(\"string.ip.v6\")","mean":0.0001359207530439707,"optimizeType":"jit","type":"string"},{"id":"2dc6aeed-d3f9-4e46-9dc9-f629aaa4225a","libraryName":"typia","version":"11.0.3","snippet":"string & tags.Format<\"ipv6\">","mean":0.00022948784816203643,"optimizeType":"precompiled","type":"string"},{"id":"a2bed27b-988b-4bc4-957a-a93f514103de","libraryName":"valibot","version":"1.2.0","snippet":"v.pipe(v.string(), v.ipv6())","mean":0.00030747967866869464,"optimizeType":"none","type":"string"},{"id":"53c092e5-b375-4708-834a-bc3c5695a6ed","libraryName":"typebox","version":"1.1.5","snippet":"Type.String({ format: \"ipv6\" })","mean":0.0008200102345549367,"optimizeType":"jit","type":"string"},{"id":"0522f491-91d1-4f0a-bda9-abc1b31c45f3","libraryName":"joi","version":"18.0.2","snippet":"Joi.string().ip({ version: \"ipv6\" })","mean":0.0028266551235818973,"optimizeType":"none","type":"string"},{"id":"7606e61c-bab6-4e5a-85e7-2f473222133a","libraryName":"zod/mini","version":"4.3.6","snippet":"z.ipv6()","mean":0.02007530658662949,"optimizeType":"jit","type":"string"},{"id":"4a20a7ea-624c-48db-ad17-a289631eee62","libraryName":"zod","version":"4.3.6","snippet":"z.ipv6()","mean":0.027353869221521634,"optimizeType":"jit","type":"string"}]}}} \ No newline at end of file diff --git a/bench/package.json b/bench/package.json index 256863c0..64f516c7 100644 --- a/bench/package.json +++ b/bench/package.json @@ -7,11 +7,13 @@ "exports": { ".": "./src/index.ts", "./bench.json": "./bench.json", - "./download.json": "./download.json" + "./download.json": "./download.json", + "./stack.json": "./stack.json" }, "scripts": { "bench": "node ./src/scripts/bench/orchestrate.ts", "download": "node ./src/scripts/download.ts", + "stack": "node ./src/scripts/stack.ts", "typecheck": "tsgo" }, "dependencies": { diff --git a/bench/src/results/types.ts b/bench/src/results/types.ts index 630922aa..6dabdec2 100644 --- a/bench/src/results/types.ts +++ b/bench/src/results/types.ts @@ -101,3 +101,16 @@ export const downloadResultsSchema = v.object({ unminified: v.array(downloadResultSchema), }); export type DownloadResults = v.InferOutput; + +const resultTypeSchema = v.picklist(["success", "not an error", "no stack", "not found"]); + +export const stackResultSchema = v.object({ + type: resultTypeSchema, + libraryName: v.string(), + version: v.string(), + snippet: v.string(), + frame: v.optional(v.number()), + output: v.string(), + lineCount: v.number(), +}); +export type StackResult = v.InferOutput; diff --git a/bench/src/scripts/bench/orchestrate.ts b/bench/src/scripts/bench/orchestrate.ts index 734a7247..8223859d 100644 --- a/bench/src/scripts/bench/orchestrate.ts +++ b/bench/src/scripts/bench/orchestrate.ts @@ -5,6 +5,7 @@ import { promisify } from "node:util"; import { libraries } from "@schema-benchmarks/schemas/libraries"; import { unsafeEntries } from "@schema-benchmarks/utils"; +import { forwardStd } from "@schema-benchmarks/utils/node"; import * as v from "valibot"; import type { BenchResults } from "../../results/types.ts"; @@ -19,20 +20,12 @@ const execFile = promisify(child_process.execFile); const allResults: Array = []; -function forward(promise: child_process.PromiseWithChild) { - promise.child.stdout?.pipe(process.stdout); - promise.child.stderr?.pipe(process.stderr); - return promise; -} - for (const lib of Object.keys(libraries)) { - const libResult = await forward( + const libResult = await forwardStd( execFile( process.execPath, [path.resolve(process.cwd(), "./src/scripts/bench/library.ts"), `--lib=${lib}`], - { - signal: sigintAc.signal, - }, + { signal: sigintAc.signal }, ), ); const results = libResult.stdout.split("\n").slice(-3).filter(Boolean).pop(); diff --git a/bench/src/scripts/stack.ts b/bench/src/scripts/stack.ts new file mode 100644 index 00000000..d8adaa41 --- /dev/null +++ b/bench/src/scripts/stack.ts @@ -0,0 +1,117 @@ +import * as child_process from "node:child_process"; +import * as fs from "node:fs/promises"; +import * as path from "node:path"; +import * as process from "node:process"; +import * as url from "node:url"; +import { promisify } from "node:util"; + +import { assertNotReached, errorData } from "@schema-benchmarks/schemas"; +import { libraries } from "@schema-benchmarks/schemas/libraries"; +import { forwardStd } from "@schema-benchmarks/utils/node"; + +import type { StackResult } from "../results/types.ts"; + +const execFile = promisify(child_process.execFile); + +// this is probably quite fragile, worth keeping an eye on when we update node + +const libDist = import.meta + .resolve("@schema-benchmarks/schemas/libraries") + .replace("/index.js", ""); + +const search = ` at Object.throw (${libDist}/`; + +const cwdRegex = new RegExp( + RegExp.escape( + url.pathToFileURL(path.resolve(process.cwd(), "..")).href.replace(/^file:\/\//, ""), + ), + "g", +); + +async function getLoggedOutput(lib: string) { + const { stderr } = await forwardStd( + execFile( + process.execPath, + [path.resolve(process.cwd(), "./src/scripts/stack/log.ts"), `--lib=${lib}`], + { env: { ...process.env, FORCE_COLOR: "1" } }, + ), + ); + const output = stderr.replace(cwdRegex, ""); + const lineCount = output.split("\n").length; + return { output, lineCount }; +} + +const results: Array = []; + +function getScriptLineNumber(stack?: string) { + if (!stack) return; + const lines = stack.split("\n"); + let i = 0; + while (i < lines.length) { + if (lines[i]?.startsWith(search)) return i === 0 ? undefined : i + 1; + i++; + } +} + +for (const [lib, getConfig] of Object.entries(libraries)) { + const { + library: { name: libraryName, version }, + createContext, + stack, + } = await getConfig(); + if (stack) { + const { snippet } = stack; + try { + const context = await createContext(); + await stack.throw(context, errorData); + assertNotReached(); + } catch (e) { + const output = await getLoggedOutput(lib); + if (Error.isError(e)) { + if (e.name === "ShouldHaveThrownError") throw e; + const hasFrames = e.stack?.includes(" at "); + if (!hasFrames) { + results.push({ + type: "no stack", + libraryName, + version, + snippet, + ...output, + }); + continue; + } + const frames = e.stack?.slice(e.stack.indexOf(" at ")); + const frame = getScriptLineNumber(frames); + results.push({ + type: "success", + libraryName, + version, + snippet, + frame, + ...output, + }); + } else { + results.push({ + type: "not an error", + libraryName, + version, + snippet, + ...output, + }); + } + } + } + global.gc?.(); +} + +await fs.writeFile( + path.join(process.cwd(), "stack.json"), + JSON.stringify( + results.toSorted((a, b) => { + if (typeof a.frame === "number" && typeof b.frame === "number") return a.frame - b.frame; + if (typeof a.frame === "number") return -1; + if (typeof b.frame === "number") return 1; + return 0; + }), + ), +); diff --git a/bench/src/scripts/stack/log.ts b/bench/src/scripts/stack/log.ts new file mode 100644 index 00000000..e5566ee9 --- /dev/null +++ b/bench/src/scripts/stack/log.ts @@ -0,0 +1,32 @@ +import { parseArgs } from "node:util"; + +import { assertNotReached, errorData } from "@schema-benchmarks/schemas"; +import { libraries } from "@schema-benchmarks/schemas/libraries"; + +const { + values: { lib }, +} = parseArgs({ + options: { + lib: { + type: "string", + short: "l", + }, + }, +}); + +if (!lib || !libraries[lib]) { + throw new Error(`Library not found: ${lib}`); +} + +const config = await libraries[lib](); + +try { + await config.stack?.throw(await config.createContext(), errorData); + assertNotReached(); +} catch (e) { + if (Error.isError(e) && e.name === "ShouldHaveThrownError") { + throw e; + } + // log the coloured output + console.error(e); +} diff --git a/bench/stack.d.json.ts b/bench/stack.d.json.ts new file mode 100644 index 00000000..6e9a1060 --- /dev/null +++ b/bench/stack.d.json.ts @@ -0,0 +1,5 @@ +import type { StackResult } from "./src/results/types.ts"; + +declare const results: Array; + +export default results; diff --git a/bench/stack.json b/bench/stack.json new file mode 100644 index 00000000..7cc5180d --- /dev/null +++ b/bench/stack.json @@ -0,0 +1 @@ +[{"type":"success","libraryName":"typebox","version":"1.1.5","snippet":"Value.Parse(schema, data)","frame":2,"output":"ParseError: Parse\n at Module.Parse (file:///node_modules/\u001b[4m.pnpm\u001b[24m/typebox@1.1.5/node_modules/\u001b[4mtypebox\u001b[24m/build/value/parse/parse.mjs:46:11)\n at Object.throw (file:///schemas/dist/benchmarks-CuxSwlWr.js:219:6)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28 {\n [cause]: {\n source: \u001b[32m'Parse'\u001b[39m,\n errors: [\n \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m,\n \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m,\n \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m,\n \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m\n ],\n value: {\n id: \u001b[33m252\u001b[39m,\n created: \u001b[35m2026-03-02T16:30:33.589Z\u001b[39m,\n title: \u001b[32m''\u001b[39m,\n brand: \u001b[32m'Sunny Backyard'\u001b[39m,\n description: \u001b[32m'Red apple from Lake Constance'\u001b[39m,\n price: \u001b[33m0\u001b[39m,\n discount: \u001b[1mnull\u001b[22m,\n quantity: \u001b[33m1000\u001b[39m,\n tags: \u001b[36m[Array]\u001b[39m,\n images: \u001b[36m[Array]\u001b[39m,\n ratings: \u001b[36m[Array]\u001b[39m\n }\n }\n}\n","lineCount":28},{"type":"success","libraryName":"valibot","version":"1.2.0","snippet":"v.parse(schema, data)","frame":2,"output":"ValiError: Invalid length: Expected >=1 but received 0\n at Module.parse (file:///node_modules/\u001b[4m.pnpm\u001b[24m/valibot@1.2.0_typescript@6.0.0-dev.20260302/node_modules/\u001b[4mvalibot\u001b[24m/dist/index.mjs:6748:28)\n at Object.throw (file:///schemas/dist/benchmarks-CQZYHRf4.js:93:6)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28 {\n issues: [\n {\n kind: \u001b[32m'validation'\u001b[39m,\n type: \u001b[32m'min_length'\u001b[39m,\n input: \u001b[32m''\u001b[39m,\n expected: \u001b[32m'>=1'\u001b[39m,\n received: \u001b[32m'0'\u001b[39m,\n message: \u001b[32m'Invalid length: Expected >=1 but received 0'\u001b[39m,\n requirement: \u001b[33m1\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'validation'\u001b[39m,\n type: \u001b[32m'min_value'\u001b[39m,\n input: \u001b[33m0\u001b[39m,\n expected: \u001b[32m'>=1'\u001b[39m,\n received: \u001b[32m'0'\u001b[39m,\n message: \u001b[32m'Invalid value: Expected >=1 but received 0'\u001b[39m,\n requirement: \u001b[33m1\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'validation'\u001b[39m,\n type: \u001b[32m'max_value'\u001b[39m,\n input: \u001b[33m1000\u001b[39m,\n expected: \u001b[32m'<=10'\u001b[39m,\n received: \u001b[32m'1000'\u001b[39m,\n message: \u001b[32m'Invalid value: Expected <=10 but received 1000'\u001b[39m,\n requirement: \u001b[33m10\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'string'\u001b[39m,\n input: \u001b[1mnull\u001b[22m,\n expected: \u001b[32m'string'\u001b[39m,\n received: \u001b[32m'null'\u001b[39m,\n message: \u001b[32m'Invalid type: Expected string but received null'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'string'\u001b[39m,\n input: \u001b[90mundefined\u001b[39m,\n expected: \u001b[32m'string'\u001b[39m,\n received: \u001b[32m'undefined'\u001b[39m,\n message: \u001b[32m'Invalid type: Expected string but received undefined'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'object'\u001b[39m,\n input: \u001b[90mundefined\u001b[39m,\n expected: \u001b[32m'\"id\"'\u001b[39m,\n received: \u001b[32m'undefined'\u001b[39m,\n message: \u001b[32m'Invalid key: Expected \"id\" but received undefined'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'date'\u001b[39m,\n input: \u001b[1mnull\u001b[22m,\n expected: \u001b[32m'Date'\u001b[39m,\n received: \u001b[32m'null'\u001b[39m,\n message: \u001b[32m'Invalid type: Expected Date but received null'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'picklist'\u001b[39m,\n input: \u001b[32m'mp4'\u001b[39m,\n expected: \u001b[32m'(\"jpg\" | \"png\")'\u001b[39m,\n received: \u001b[32m'\"mp4\"'\u001b[39m,\n message: \u001b[32m'Invalid type: Expected (\"jpg\" | \"png\") but received \"mp4\"'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'object'\u001b[39m,\n input: \u001b[90mundefined\u001b[39m,\n expected: \u001b[32m'\"url\"'\u001b[39m,\n received: \u001b[32m'undefined'\u001b[39m,\n message: \u001b[32m'Invalid key: Expected \"url\" but received undefined'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'number'\u001b[39m,\n input: \u001b[32m'352'\u001b[39m,\n expected: \u001b[32m'number'\u001b[39m,\n received: \u001b[32m'\"352\"'\u001b[39m,\n message: \u001b[32m'Invalid type: Expected number but received \"352\"'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'date'\u001b[39m,\n input: \u001b[90mundefined\u001b[39m,\n expected: \u001b[32m'Date'\u001b[39m,\n received: \u001b[32m'undefined'\u001b[39m,\n message: \u001b[32m'Invalid type: Expected Date but received undefined'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'validation'\u001b[39m,\n type: \u001b[32m'url'\u001b[39m,\n input: \u001b[32m'INVALID_URL'\u001b[39m,\n expected: \u001b[1mnull\u001b[22m,\n received: \u001b[32m'\"INVALID_URL\"'\u001b[39m,\n message: \u001b[32m'Invalid URL: Received \"INVALID_URL\"'\u001b[39m,\n requirement: \u001b[36m[Function: requirement]\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'object'\u001b[39m,\n input: \u001b[90mundefined\u001b[39m,\n expected: \u001b[32m'\"title\"'\u001b[39m,\n received: \u001b[32m'undefined'\u001b[39m,\n message: \u001b[32m'Invalid key: Expected \"title\" but received undefined'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'object'\u001b[39m,\n input: \u001b[90mundefined\u001b[39m,\n expected: \u001b[32m'\"type\"'\u001b[39m,\n received: \u001b[32m'undefined'\u001b[39m,\n message: \u001b[32m'Invalid key: Expected \"type\" but received undefined'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n },\n {\n kind: \u001b[32m'schema'\u001b[39m,\n type: \u001b[32m'object'\u001b[39m,\n input: \u001b[90mundefined\u001b[39m,\n expected: \u001b[32m'\"size\"'\u001b[39m,\n received: \u001b[32m'undefined'\u001b[39m,\n message: \u001b[32m'Invalid key: Expected \"size\" but received undefined'\u001b[39m,\n requirement: \u001b[90mundefined\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n issues: \u001b[90mundefined\u001b[39m,\n lang: \u001b[90mundefined\u001b[39m,\n abortEarly: \u001b[90mundefined\u001b[39m,\n abortPipeEarly: \u001b[90mundefined\u001b[39m\n }\n ]\n}\n","lineCount":218},{"type":"success","libraryName":"effect","version":"3.19.19","snippet":"// const decodeAll = Schema.decodeUnknownEither(\n// schema, \n// { errors: \"all\" }\n// );\nEffect.runSync(decodeAll(data));","frame":5,"output":"(FiberFailure) ParseError: { readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly brand: minLength(1) & maxLength(30); readonly description: minLength(1) & maxLength(500); readonly price: greaterThanOrEqualTo(1) & lessThanOrEqualTo(10000); readonly discount: greaterThanOrEqualTo(1) & lessThanOrEqualTo(100) | null; readonly quantity: greaterThanOrEqualTo(1) & lessThanOrEqualTo(10); readonly tags: ReadonlyArray; readonly images: ReadonlyArray<{ readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }>; readonly ratings: ReadonlyArray<{ readonly id: number; readonly stars: greaterThanOrEqualTo(0) & lessThanOrEqualTo(5); readonly title: minLength(1) & maxLength(100); readonly text: minLength(1) & maxLength(1000); readonly images: ReadonlyArray<{ readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }> }> }\n├─ [\"title\"]\n│ └─ minLength(1) & maxLength(100)\n│ └─ From side refinement failure\n│ └─ minLength(1)\n│ └─ Predicate refinement failure\n│ └─ Expected a string at least 1 character(s) long, actual \"\"\n├─ [\"price\"]\n│ └─ greaterThanOrEqualTo(1) & lessThanOrEqualTo(10000)\n│ └─ From side refinement failure\n│ └─ greaterThanOrEqualTo(1)\n│ └─ Predicate refinement failure\n│ └─ Expected a number greater than or equal to 1, actual 0\n├─ [\"quantity\"]\n│ └─ greaterThanOrEqualTo(1) & lessThanOrEqualTo(10)\n│ └─ Predicate refinement failure\n│ └─ Expected a number less than or equal to 10, actual 1000\n├─ [\"tags\"]\n│ └─ ReadonlyArray\n│ ├─ [1]\n│ │ └─ minLength(1) & maxLength(30)\n│ │ └─ From side refinement failure\n│ │ └─ minLength(1)\n│ │ └─ From side refinement failure\n│ │ └─ Expected string, actual null\n│ └─ [3]\n│ └─ minLength(1) & maxLength(30)\n│ └─ From side refinement failure\n│ └─ minLength(1)\n│ └─ From side refinement failure\n│ └─ Expected string, actual undefined\n├─ [\"images\"]\n│ └─ ReadonlyArray<{ readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }>\n│ ├─ [0]\n│ │ └─ { readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }\n│ │ ├─ [\"id\"]\n│ │ │ └─ is missing\n│ │ ├─ [\"created\"]\n│ │ │ └─ Expected Date, actual null\n│ │ └─ [\"type\"]\n│ │ └─ \"jpg\" | \"png\"\n│ │ ├─ Expected \"jpg\", actual \"mp4\"\n│ │ └─ Expected \"png\", actual \"mp4\"\n│ └─ [1]\n│ └─ { readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }\n│ └─ [\"url\"]\n│ └─ is missing\n└─ [\"ratings\"]\n └─ ReadonlyArray<{ readonly id: number; readonly stars: greaterThanOrEqualTo(0) & lessThanOrEqualTo(5); readonly title: minLength(1) & maxLength(100); readonly text: minLength(1) & maxLength(1000); readonly images: ReadonlyArray<{ readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }> }>\n └─ [1]\n └─ { readonly id: number; readonly stars: greaterThanOrEqualTo(0) & lessThanOrEqualTo(5); readonly title: minLength(1) & maxLength(100); readonly text: minLength(1) & maxLength(1000); readonly images: ReadonlyArray<{ readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }> }\n └─ [\"images\"]\n └─ ReadonlyArray<{ readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }>\n ├─ [0]\n │ └─ { readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }\n │ ├─ [\"id\"]\n │ │ └─ Expected number, actual \"352\"\n │ ├─ [\"created\"]\n │ │ └─ Expected Date, actual undefined\n │ └─ [\"url\"]\n │ └─ { string | filter }\n │ └─ Predicate refinement failure\n │ └─ Expected { string | filter }, actual \"INVALID_URL\"\n └─ [1]\n └─ { readonly id: number; readonly created: Date; readonly title: minLength(1) & maxLength(100); readonly type: \"jpg\" | \"png\"; readonly size: number; readonly url: { string | filter } }\n ├─ [\"title\"]\n │ └─ is missing\n ├─ [\"type\"]\n │ └─ is missing\n └─ [\"size\"]\n └─ is missing\n at parseError (file:///node_modules/.pnpm/effect@3.19.19/node_modules/effect/dist/esm/ParseResult.js:241:36)\n at file:///node_modules/.pnpm/effect@3.19.19/node_modules/effect/dist/esm/Either.js:197:78\n at Module. (file:///node_modules/.pnpm/effect@3.19.19/node_modules/effect/dist/esm/Function.js:98:18)\n at file:///node_modules/.pnpm/effect@3.19.19/node_modules/effect/dist/esm/Schema.js:353:42\n at Object.throw (file:///schemas/dist/benchmarks-CvtHWE-F.js:127:14)\n at file:///bench/src/scripts/stack/log.ts:24:28\n","lineCount":78},{"type":"success","libraryName":"sury","version":"11.0.0-alpha.4","snippet":"S.parseOrThrow(data, schema)","frame":5,"output":"SuryError: Failed parsing at [\"title\"]: String must be 1 or more characters long\n at $$throw (/node_modules/\u001b[4m.pnpm\u001b[24m/sury@11.0.0-alpha.4/node_modules/\u001b[4msury\u001b[24m/src/Sury.res.js:776:9)\n at Array. (/node_modules/\u001b[4m.pnpm\u001b[24m/sury@11.0.0-alpha.4/node_modules/\u001b[4msury\u001b[24m/src/Sury.res.js:792:25)\n at eval (eval at internalCompile (/node_modules/\u001b[4m.pnpm\u001b[24m/sury@11.0.0-alpha.4/node_modules/\u001b[4msury\u001b[24m/src/Sury.res.js:1418:10), :3:414)\n at Module.parseOrThrow (/node_modules/\u001b[4m.pnpm\u001b[24m/sury@11.0.0-alpha.4/node_modules/\u001b[4msury\u001b[24m/src/Sury.res.js:1524:32)\n at Object.throw (file:///schemas/dist/benchmarks-C052wDpV.js:123:6)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28 {\n flag: \u001b[33m1\u001b[39m,\n code: {\n TAG: \u001b[32m'OperationFailed'\u001b[39m,\n _0: \u001b[32m'String must be 1 or more characters long'\u001b[39m\n },\n path: \u001b[32m'[\"title\"]'\u001b[39m\n}\n","lineCount":15},{"type":"success","libraryName":"typia","version":"11.0.3","snippet":"// const assert = typia.createAssert();\nassert(data);","frame":5,"output":"TypeGuardError: Error on typia.createAssert(): invalid type on $input.title, expect to be string & MinLength<1>\n at Module._assertGuard (/node_modules/\u001b[4m.pnpm\u001b[24m/typia@11.0.3_@types+node@24.11.0_typescript@6.0.0-dev.20260302/node_modules/\u001b[4mtypia\u001b[24m/lib/internal/_assertGuard.js:10:19)\n at i (file:///schemas/dist/benchmarks-2zi5NqJe.js:316:71)\n at file:///schemas/dist/benchmarks-2zi5NqJe.js:592:14\n at assert (file:///schemas/dist/benchmarks-2zi5NqJe.js:597:10)\n at Object.throw (file:///schemas/dist/benchmarks-2zi5NqJe.js:1272:4)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28 {\n method: \u001b[32m'typia.createAssert'\u001b[39m,\n path: \u001b[32m'$input.title'\u001b[39m,\n expected: \u001b[32m'string & MinLength<1>'\u001b[39m,\n value: \u001b[32m''\u001b[39m\n}\n","lineCount":13},{"type":"success","libraryName":"effect___beta","version":"4.0.0-beta.5","snippet":"Schema.decodeUnknownSync(schema)(data, { errors: \"first\" })","frame":7,"output":"Error: Expected a value with a length of at least 1, got \"\"\n at [\"title\"]\n at file:///node_modules/\u001b[4m.pnpm\u001b[24m/effect@4.0.0-beta.5/node_modules/\u001b[4meffect\u001b[24m/dist/SchemaParser.js:250:99\n at file:///node_modules/\u001b[4m.pnpm\u001b[24m/effect@4.0.0-beta.5/node_modules/\u001b[4meffect\u001b[24m/dist/internal/effect.js:1068:19\n at file:///node_modules/\u001b[4m.pnpm\u001b[24m/effect@4.0.0-beta.5/node_modules/\u001b[4meffect\u001b[24m/dist/Function.js:94:18\n at file:///node_modules/\u001b[4m.pnpm\u001b[24m/effect@4.0.0-beta.5/node_modules/\u001b[4meffect\u001b[24m/dist/internal/effect.js:1019:85\n at Module. (file:///node_modules/\u001b[4m.pnpm\u001b[24m/effect@4.0.0-beta.5/node_modules/\u001b[4meffect\u001b[24m/dist/Function.js:94:18)\n at file:///node_modules/\u001b[4m.pnpm\u001b[24m/effect@4.0.0-beta.5/node_modules/\u001b[4meffect\u001b[24m/dist/SchemaParser.js:250:52\n at Object.throw (file:///schemas/dist/benchmarks-D0Goq9pB.js:120:26)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28 {\n [cause]: Composite {\n \u001b[32m'~effect/SchemaIssue/Issue'\u001b[39m: \u001b[32m'~effect/SchemaIssue/Issue'\u001b[39m,\n _tag: \u001b[32m'Composite'\u001b[39m,\n ast: Objects {\n \u001b[32m'~effect/Schema'\u001b[39m: \u001b[32m'~effect/Schema'\u001b[39m,\n annotations: \u001b[90mundefined\u001b[39m,\n checks: \u001b[90mundefined\u001b[39m,\n encoding: \u001b[90mundefined\u001b[39m,\n context: \u001b[90mundefined\u001b[39m,\n _tag: \u001b[32m'Objects'\u001b[39m,\n propertySignatures: \u001b[36m[Array]\u001b[39m,\n indexSignatures: []\n },\n actual: { _id: \u001b[32m'Option'\u001b[39m, _tag: \u001b[32m'Some'\u001b[39m, value: \u001b[36m[Object]\u001b[39m },\n issues: [ \u001b[36m[Pointer]\u001b[39m ]\n }\n}\n","lineCount":28},{"type":"success","libraryName":"arktype","version":"2.1.29","snippet":"schema.assert(data)","frame":8,"output":"TraversalError: \n • images[0].created must be a Date (was null)\n • images[0].id must be a number (was missing)\n • images[0].type must be \"jpg\" or \"png\" (was \"mp4\")\n • images[1].url must be a string (was missing)\n • price must be at least 1 (was 0)\n • quantity must be at most 10 (was 1000)\n • ratings[1].images[0].created must be a Date (was undefined)\n • ratings[1].images[0].id must be a number (was a string)\n • ratings[1].images[0].url must be a URL string (was \"INVALID_URL\")\n • ratings[1].images[1].size must be a number (was missing)\n • ratings[1].images[1].title must be a string (was missing)\n • ratings[1].images[1].type must be \"jpg\" or \"png\" (was missing)\n • tags[1] must be a string (was null)\n • tags[3] must be a string (was undefined)\n • title must be non-empty\n at ArkErrors.toTraversalError (file:///node_modules/\u001b[4m.pnpm\u001b[24m/@ark+schema@0.56.0/node_modules/\u001b[4m@ark/schema\u001b[24m/out/shared/errors.js:146:16)\n at ArkErrors.throw (file:///node_modules/\u001b[4m.pnpm\u001b[24m/@ark+schema@0.56.0/node_modules/\u001b[4m@ark/schema\u001b[24m/out/shared/errors.js:139:20)\n at file:///node_modules/\u001b[4m.pnpm\u001b[24m/@ark+schema@0.56.0/node_modules/\u001b[4m@ark/schema\u001b[24m/out/node.js:166:85\n at Traversal.finalize (file:///node_modules/\u001b[4m.pnpm\u001b[24m/@ark+schema@0.56.0/node_modules/\u001b[4m@ark/schema\u001b[24m/out/shared/traversal.js:112:29)\n at IntersectionNode.rootApply (file:///node_modules/\u001b[4m.pnpm\u001b[24m/@ark+schema@0.56.0/node_modules/\u001b[4m@ark/schema\u001b[24m/out/node.js:118:32)\n at BaseNode.attach (file:///node_modules/\u001b[4m.pnpm\u001b[24m/@ark+schema@0.56.0/node_modules/\u001b[4m@ark/schema\u001b[24m/out/node.js:33:25)\n at IntersectionNode.assert (file:///node_modules/\u001b[4m.pnpm\u001b[24m/@ark+schema@0.56.0/node_modules/\u001b[4m@ark/schema\u001b[24m/out/node.js:166:42)\n at Object.throw (file:///schemas/dist/benchmarks-DOEH0FpJ.js:76:6)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28\n","lineCount":26},{"type":"success","libraryName":"ajv","version":"8.18.0","snippet":"// const validate = ajv.compile(schema);\nvalidate(data);\nthrow new ValidationError(validate.errors || []);","output":"ValidationError: validation failed\n at Object.throw (file:///schemas/dist/benchmarks-BqONtd8d.js:201:16)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28 {\n errors: [\n {\n instancePath: \u001b[32m'/title'\u001b[39m,\n schemaPath: \u001b[32m'#/properties/title/minLength'\u001b[39m,\n keyword: \u001b[32m'minLength'\u001b[39m,\n params: \u001b[36m[Object]\u001b[39m,\n message: \u001b[32m'must NOT have fewer than 1 characters'\u001b[39m\n }\n ],\n validation: \u001b[33mtrue\u001b[39m,\n ajv: \u001b[33mtrue\u001b[39m\n}\n","lineCount":16},{"type":"no stack","libraryName":"joi","version":"18.0.2","snippet":"throw schema.validate(data).error","output":"[Error [ValidationError]: \"title\" is not allowed to be empty] {\n _original: {\n id: \u001b[33m252\u001b[39m,\n created: \u001b[35m2026-03-02T16:30:33.139Z\u001b[39m,\n title: \u001b[32m''\u001b[39m,\n brand: \u001b[32m'Sunny Backyard'\u001b[39m,\n description: \u001b[32m'Red apple from Lake Constance'\u001b[39m,\n price: \u001b[33m0\u001b[39m,\n discount: \u001b[1mnull\u001b[22m,\n quantity: \u001b[33m1000\u001b[39m,\n tags: [ \u001b[32m'fruit'\u001b[39m, \u001b[1mnull\u001b[22m, \u001b[32m'round'\u001b[39m, \u001b[90mundefined\u001b[39m, \u001b[32m'juicy'\u001b[39m, \u001b[32m'healthy'\u001b[39m ],\n images: [ \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m ],\n ratings: [ \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m ]\n },\n details: [\n {\n message: \u001b[32m'\"title\" is not allowed to be empty'\u001b[39m,\n path: \u001b[36m[Array]\u001b[39m,\n type: \u001b[32m'string.empty'\u001b[39m,\n context: \u001b[36m[Object]\u001b[39m\n }\n ]\n}\n","lineCount":24},{"type":"success","libraryName":"yup","version":"1.7.1","snippet":"schema.validateSync(data)","output":"ValidationError: ratings[1].images[0].url must be a valid URL\n at createError (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:352:21)\n at handleResult (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:371:104)\n at validate (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:394:5)\n at StringSchema.runTests (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:855:7)\n at /node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:810:12\n at nextOnce (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:841:7)\n at finishTestRun (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:860:11)\n at handleResult (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:371:124)\n at validate (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:394:5)\n at StringSchema.runTests (/node_modules/\u001b[4m.pnpm\u001b[24m/yup@1.7.1/node_modules/\u001b[4myup\u001b[24m/index.js:855:7) {\n value: {\n ratings: [ \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m ],\n images: [ \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m, \u001b[36m[Object]\u001b[39m ],\n tags: [ \u001b[32m'fruit'\u001b[39m, \u001b[1mnull\u001b[22m, \u001b[32m'round'\u001b[39m, \u001b[90mundefined\u001b[39m, \u001b[32m'juicy'\u001b[39m, \u001b[32m'healthy'\u001b[39m ],\n quantity: \u001b[33m1000\u001b[39m,\n discount: \u001b[1mnull\u001b[22m,\n price: \u001b[33m0\u001b[39m,\n description: \u001b[32m'Red apple from Lake Constance'\u001b[39m,\n brand: \u001b[32m'Sunny Backyard'\u001b[39m,\n title: \u001b[32m''\u001b[39m,\n created: \u001b[35m2026-03-02T16:30:34.137Z\u001b[39m,\n id: \u001b[33m252\u001b[39m\n },\n path: \u001b[32m'ratings[1].images[0].url'\u001b[39m,\n type: \u001b[32m'url'\u001b[39m,\n params: {\n value: \u001b[32m'INVALID_URL'\u001b[39m,\n originalValue: \u001b[32m'INVALID_URL'\u001b[39m,\n label: \u001b[90mundefined\u001b[39m,\n path: \u001b[32m'ratings[1].images[0].url'\u001b[39m,\n spec: {\n strip: \u001b[33mfalse\u001b[39m,\n strict: \u001b[33mfalse\u001b[39m,\n abortEarly: \u001b[33mtrue\u001b[39m,\n recursive: \u001b[33mtrue\u001b[39m,\n disableStackTrace: \u001b[33mfalse\u001b[39m,\n nullable: \u001b[33mfalse\u001b[39m,\n optional: \u001b[33mfalse\u001b[39m,\n coerce: \u001b[33mtrue\u001b[39m\n },\n disableStackTrace: \u001b[33mfalse\u001b[39m,\n regex: \u001b[31m/^((https?|ftp):)?\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i\u001b[39m\n },\n errors: [ \u001b[32m'ratings[1].images[0].url must be a valid URL'\u001b[39m ],\n inner: [],\n \u001b[32mSymbol(Symbol.toStringTag)\u001b[39m: \u001b[32m'Error'\u001b[39m\n}\n","lineCount":49},{"type":"success","libraryName":"zod","version":"4.3.6","snippet":"schema.parse(data)","output":"ZodError: [\n {\n \"origin\": \"string\",\n \"code\": \"too_small\",\n \"minimum\": 1,\n \"inclusive\": true,\n \"path\": [\n \"title\"\n ],\n \"message\": \"Too small: expected string to have >=1 characters\"\n },\n {\n \"origin\": \"number\",\n \"code\": \"too_small\",\n \"minimum\": 1,\n \"inclusive\": true,\n \"path\": [\n \"price\"\n ],\n \"message\": \"Too small: expected number to be >=1\"\n },\n {\n \"origin\": \"number\",\n \"code\": \"too_big\",\n \"maximum\": 10,\n \"inclusive\": true,\n \"path\": [\n \"quantity\"\n ],\n \"message\": \"Too big: expected number to be <=10\"\n },\n {\n \"expected\": \"string\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"tags\",\n 1\n ],\n \"message\": \"Invalid input: expected string, received null\"\n },\n {\n \"expected\": \"string\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"tags\",\n 3\n ],\n \"message\": \"Invalid input: expected string, received undefined\"\n },\n {\n \"expected\": \"number\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"images\",\n 0,\n \"id\"\n ],\n \"message\": \"Invalid input: expected number, received undefined\"\n },\n {\n \"expected\": \"date\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"images\",\n 0,\n \"created\"\n ],\n \"message\": \"Invalid input: expected date, received null\"\n },\n {\n \"code\": \"invalid_value\",\n \"values\": [\n \"jpg\",\n \"png\"\n ],\n \"path\": [\n \"images\",\n 0,\n \"type\"\n ],\n \"message\": \"Invalid option: expected one of \\\"jpg\\\"|\\\"png\\\"\"\n },\n {\n \"expected\": \"string\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"images\",\n 1,\n \"url\"\n ],\n \"message\": \"Invalid input: expected string, received undefined\"\n },\n {\n \"expected\": \"number\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 0,\n \"id\"\n ],\n \"message\": \"Invalid input: expected number, received string\"\n },\n {\n \"expected\": \"date\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 0,\n \"created\"\n ],\n \"message\": \"Invalid input: expected date, received undefined\"\n },\n {\n \"code\": \"invalid_format\",\n \"format\": \"url\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 0,\n \"url\"\n ],\n \"message\": \"Invalid URL\"\n },\n {\n \"expected\": \"string\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 1,\n \"title\"\n ],\n \"message\": \"Invalid input: expected string, received undefined\"\n },\n {\n \"code\": \"invalid_value\",\n \"values\": [\n \"jpg\",\n \"png\"\n ],\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 1,\n \"type\"\n ],\n \"message\": \"Invalid option: expected one of \\\"jpg\\\"|\\\"png\\\"\"\n },\n {\n \"expected\": \"number\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 1,\n \"size\"\n ],\n \"message\": \"Invalid input: expected number, received undefined\"\n }\n]\n at Object.throw (file:///schemas/dist/benchmarks-DnwtXqL6.js:81:6)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28\n","lineCount":171},{"type":"success","libraryName":"zod/mini","version":"4.3.6","snippet":"schema.parse(data)","output":"$ZodError: [\n {\n \"origin\": \"string\",\n \"code\": \"too_small\",\n \"minimum\": 1,\n \"inclusive\": true,\n \"path\": [\n \"title\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"origin\": \"number\",\n \"code\": \"too_small\",\n \"minimum\": 1,\n \"inclusive\": true,\n \"path\": [\n \"price\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"origin\": \"number\",\n \"code\": \"too_big\",\n \"maximum\": 10,\n \"inclusive\": true,\n \"path\": [\n \"quantity\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"string\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"tags\",\n 1\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"string\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"tags\",\n 3\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"number\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"images\",\n 0,\n \"id\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"date\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"images\",\n 0,\n \"created\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"code\": \"invalid_value\",\n \"values\": [\n \"jpg\",\n \"png\"\n ],\n \"path\": [\n \"images\",\n 0,\n \"type\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"string\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"images\",\n 1,\n \"url\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"number\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 0,\n \"id\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"date\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 0,\n \"created\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"code\": \"invalid_format\",\n \"format\": \"url\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 0,\n \"url\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"string\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 1,\n \"title\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"code\": \"invalid_value\",\n \"values\": [\n \"jpg\",\n \"png\"\n ],\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 1,\n \"type\"\n ],\n \"message\": \"Invalid input\"\n },\n {\n \"expected\": \"number\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"ratings\",\n 1,\n \"images\",\n 1,\n \"size\"\n ],\n \"message\": \"Invalid input\"\n }\n]\n at Object.throw (file:///schemas/dist/benchmarks-D8x1MRf9.js:81:6)\n at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28\n","lineCount":171}] \ No newline at end of file diff --git a/package.json b/package.json index cdaeeba3..891b3004 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "website:storybook": "pnpm run --filter website storybook", "bench:bench": "pnpm run --filter '*/bench' bench", "bench:download": "pnpm run --filter '*/bench' download", - "bench:all": "pnpm bench:download && pnpm bench:bench", + "bench:stack": "pnpm run --filter '*/bench' stack", + "bench:all": "pnpm bench:download && pnpm bench:bench && pnpm bench:stack", "postinstall": "lefthook install" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34abfb97..c785d110 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -284,6 +284,9 @@ importers: '@tanstack/react-start': specifier: ^1.166.1 version: 1.166.1(crossws@0.4.1(srvx@0.11.8))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vite@8.0.0-beta.16(@types/node@24.11.0)(esbuild@0.25.12)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + ansi-sequence-parser: + specifier: ^1.1.3 + version: 1.1.3 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -3398,6 +3401,9 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-sequence-parser@1.1.3: + resolution: {integrity: sha512-+fksAx9eG3Ab6LDnLs3ZqZa8KVJ/jYnX+D4Qe1azX+LFGFAXqynCQLOdLpNYN/l9e7l6hMWwZbrnctqr6eSQSw==} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -10246,7 +10252,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.11.0 + '@types/node': 25.3.3 optional: true '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': @@ -10718,6 +10724,8 @@ snapshots: ansi-regex@6.2.2: {} + ansi-sequence-parser@1.1.3: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 diff --git a/schemas/libraries/ajv/benchmarks.ts b/schemas/libraries/ajv/benchmarks.ts index e420cb59..e3192402 100644 --- a/schemas/libraries/ajv/benchmarks.ts +++ b/schemas/libraries/ajv/benchmarks.ts @@ -1,5 +1,6 @@ import { getVersion } from "@schema-benchmarks/utils/node" with { type: "macro" }; import type Ajv from "ajv"; +import { ValidationError } from "ajv"; import type { FormatName } from "ajv-formats"; import addFormats from "ajv-formats"; import ts from "dedent"; @@ -66,4 +67,15 @@ export default defineBenchmarks({ ipv4: createStringBenchmark("ipv4"), ipv6: createStringBenchmark("ipv6"), }, + stack: { + throw: ({ validate }, data) => { + validate(data); + throw new ValidationError(validate.errors || []); + }, + snippet: ts` + // const validate = ajv.compile(schema); + validate(data); + throw new ValidationError(validate.errors || []); + `, + }, }); diff --git a/schemas/libraries/arktype/benchmarks.ts b/schemas/libraries/arktype/benchmarks.ts index 3b4e7fe5..fccdd85f 100644 --- a/schemas/libraries/arktype/benchmarks.ts +++ b/schemas/libraries/arktype/benchmarks.ts @@ -3,7 +3,7 @@ import { type } from "arktype"; import ts from "dedent"; import type { StringBenchmarkConfig } from "#src"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getArkTypeSchema } from "."; @@ -61,4 +61,11 @@ export default defineBenchmarks({ ipv4: createStringBenchmark("ip.v4"), ipv6: createStringBenchmark("ip.v6"), }, + stack: { + throw: ({ schema }, data) => { + schema.assert(data); + assertNotReached(); + }, + snippet: ts`schema.assert(data)`, + }, }); diff --git a/schemas/libraries/effect/benchmarks.ts b/schemas/libraries/effect/benchmarks.ts index 0250a343..0ac14f2a 100644 --- a/schemas/libraries/effect/benchmarks.ts +++ b/schemas/libraries/effect/benchmarks.ts @@ -1,9 +1,9 @@ import { getVersion } from "@schema-benchmarks/utils/node" with { type: "macro" }; import ts from "dedent"; -import { Either } from "effect"; +import { Effect, Either } from "effect"; import * as Schema from "effect/Schema"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getEffectSchema } from "."; @@ -99,4 +99,17 @@ export default defineBenchmarks({ `, }, }, + stack: { + throw: ({ decodeAll }, data) => { + Effect.runSync(decodeAll(data)); + assertNotReached(); + }, + snippet: ts` + // const decodeAll = Schema.decodeUnknownEither( + // schema, + // { errors: "all" } + // ); + Effect.runSync(decodeAll(data)); + `, + }, }); diff --git a/schemas/libraries/effect___beta/benchmarks.ts b/schemas/libraries/effect___beta/benchmarks.ts index 843d4ee4..6cc417c8 100644 --- a/schemas/libraries/effect___beta/benchmarks.ts +++ b/schemas/libraries/effect___beta/benchmarks.ts @@ -3,7 +3,7 @@ import ts from "dedent"; import { isSome } from "effect___beta/Option"; import * as Schema from "effect___beta/Schema"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getEffectSchema } from "."; @@ -94,4 +94,13 @@ export default defineBenchmarks({ `, }, }, + stack: { + throw: ({ schema }, data) => { + Schema.decodeUnknownSync(schema)(data, { errors: "first" }); + assertNotReached(); + }, + snippet: ts` + Schema.decodeUnknownSync(schema)(data, { errors: "first" }) + `, + }, }); diff --git a/schemas/libraries/joi/benchmarks.ts b/schemas/libraries/joi/benchmarks.ts index 562bd5bf..2d845e64 100644 --- a/schemas/libraries/joi/benchmarks.ts +++ b/schemas/libraries/joi/benchmarks.ts @@ -67,4 +67,10 @@ export default defineBenchmarks({ ipv4: createStringBenchmark("ip", ts`ip({ version: "ipv4" })`, { version: "ipv4" }), ipv6: createStringBenchmark("ip", ts`ip({ version: "ipv6" })`, { version: "ipv6" }), }, + stack: { + throw: ({ schema }, data) => { + throw schema.validate(data).error; + }, + snippet: ts`throw schema.validate(data).error`, + }, }); diff --git a/schemas/libraries/sury/benchmarks.ts b/schemas/libraries/sury/benchmarks.ts index 1b298f36..54beb709 100644 --- a/schemas/libraries/sury/benchmarks.ts +++ b/schemas/libraries/sury/benchmarks.ts @@ -3,7 +3,7 @@ import ts from "dedent"; import * as S from "sury"; import type { StringBenchmarkConfig } from "#src"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getSurySchema } from "."; @@ -111,4 +111,11 @@ export default defineBenchmarks({ url: createStringBenchmark(S.url, ts`S.url(S.string)`), uuid: createStringBenchmark(S.uuid, ts`S.uuid(S.string)`), }, + stack: { + throw: ({ schema }, data) => { + S.parseOrThrow(data, schema); + assertNotReached(); + }, + snippet: ts`S.parseOrThrow(data, schema)`, + }, }); diff --git a/schemas/libraries/typebox/benchmarks.ts b/schemas/libraries/typebox/benchmarks.ts index 1cea7be2..16782c8d 100644 --- a/schemas/libraries/typebox/benchmarks.ts +++ b/schemas/libraries/typebox/benchmarks.ts @@ -6,7 +6,7 @@ import * as Schema from "typebox/schema"; import * as Value from "typebox/value"; import type { StringBenchmarkConfig } from "#src"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getTypeboxSchema } from "."; @@ -164,4 +164,11 @@ export default defineBenchmarks({ ipv4: createStringBenchmark("ipv4"), ipv6: createStringBenchmark("ipv6"), }, + stack: { + throw: ({ schema }, data) => { + Value.Parse(schema, data); + assertNotReached(); + }, + snippet: ts`Value.Parse(schema, data)`, + }, }); diff --git a/schemas/libraries/typia/benchmarks.ts b/schemas/libraries/typia/benchmarks.ts index b69ab3ae..f63f92f4 100644 --- a/schemas/libraries/typia/benchmarks.ts +++ b/schemas/libraries/typia/benchmarks.ts @@ -5,7 +5,7 @@ import type { StandardSchemaV1 } from "@standard-schema/spec"; import ts from "dedent"; import typia, { type tags } from "typia"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import type { TypiaSchema } from "."; @@ -19,6 +19,7 @@ export default defineBenchmarks({ createContext: () => ({ validate: typia.createValidate(), is: typia.createIs(), + assert: typia.createAssert(), }), initialization: [ { @@ -143,4 +144,14 @@ export default defineBenchmarks({ snippet: ts`string & tags.Format<"ipv6">`, }, }, + stack: { + throw: ({ assert }, data) => { + assert(data); + assertNotReached(); + }, + snippet: ts` + // const assert = typia.createAssert(); + assert(data); + `, + }, }); diff --git a/schemas/libraries/valibot/benchmarks.ts b/schemas/libraries/valibot/benchmarks.ts index 9d12ef68..0b1805c8 100644 --- a/schemas/libraries/valibot/benchmarks.ts +++ b/schemas/libraries/valibot/benchmarks.ts @@ -3,7 +3,7 @@ import ts from "dedent"; import * as v from "valibot"; import type { StringBenchmarkConfig } from "#src"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getValibotSchema } from "."; @@ -81,4 +81,11 @@ export default defineBenchmarks({ ipv4: createStringBenchmark(v.ipv4, ts`v.ipv4()`), ipv6: createStringBenchmark(v.ipv6, ts`v.ipv6()`), }, + stack: { + throw: ({ schema }, data) => { + v.parse(schema, data); + assertNotReached(); + }, + snippet: ts`v.parse(schema, data)`, + }, }); diff --git a/schemas/libraries/yup/benchmarks.ts b/schemas/libraries/yup/benchmarks.ts index e6958c1d..01255d82 100644 --- a/schemas/libraries/yup/benchmarks.ts +++ b/schemas/libraries/yup/benchmarks.ts @@ -3,7 +3,7 @@ import ts from "dedent"; import * as yup from "yup"; import type { StringBenchmarkConfig } from "#src"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getYupSchema } from "."; @@ -77,4 +77,11 @@ export default defineBenchmarks({ url: createStringBenchmark("url"), uuid: createStringBenchmark("uuid"), }, + stack: { + throw: ({ schema }, data) => { + schema.validateSync(data); + assertNotReached(); + }, + snippet: ts`schema.validateSync(data)`, + }, }); diff --git a/schemas/libraries/zod/benchmarks.ts b/schemas/libraries/zod/benchmarks.ts index 1a9ac7a0..026c05b5 100644 --- a/schemas/libraries/zod/benchmarks.ts +++ b/schemas/libraries/zod/benchmarks.ts @@ -3,7 +3,7 @@ import ts from "dedent"; import * as z from "zod"; import type { StringBenchmarkConfig } from "#src"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getZodSchema } from "."; @@ -71,4 +71,11 @@ export default defineBenchmarks({ ipv4: createStringBenchmark(z.ipv4, ts`z.ipv4()`), ipv6: createStringBenchmark(z.ipv6, ts`z.ipv6()`), }, + stack: { + throw: ({ schema }, data) => { + schema.parse(data); + assertNotReached(); + }, + snippet: ts`schema.parse(data)`, + }, }); diff --git a/schemas/libraries/zod/mini/benchmarks.ts b/schemas/libraries/zod/mini/benchmarks.ts index 7e8fbe54..2010b3dc 100644 --- a/schemas/libraries/zod/mini/benchmarks.ts +++ b/schemas/libraries/zod/mini/benchmarks.ts @@ -3,7 +3,7 @@ import ts from "dedent"; import * as z from "zod/mini"; import type { StringBenchmarkConfig } from "#src"; -import { defineBenchmarks } from "#src"; +import { assertNotReached, defineBenchmarks } from "#src"; import { getZodMiniSchema } from "."; @@ -74,4 +74,11 @@ export default defineBenchmarks({ ipv4: createStringBenchmark(z.ipv4, ts`z.ipv4()`), ipv6: createStringBenchmark(z.ipv6, ts`z.ipv6()`), }, + stack: { + throw: ({ schema }, data) => { + schema.parse(data); + assertNotReached(); + }, + snippet: ts`schema.parse(data)`, + }, }); diff --git a/schemas/src/types.ts b/schemas/src/types.ts index 386f15bc..0f820469 100644 --- a/schemas/src/types.ts +++ b/schemas/src/types.ts @@ -63,6 +63,11 @@ export interface StringBenchmarkConfig extends BaseBenchmarkConfig { create: (context: Context) => MaybePromise<(testString: string) => MaybePromise>; } +export interface StackBenchmarkConfig { + throw: (context: Context, data: unknown) => MaybePromise; + snippet: string; +} + export interface LibraryInfo { name: string; git: string; @@ -78,11 +83,23 @@ export interface BenchmarksConfig { parsing?: Partial>>>; standard?: Partial>>>; string?: Partial>>; + stack?: StackBenchmarkConfig; } -/* @__PURE__ */ +/* @__NO_SIDE_EFFECTS__ */ export function defineBenchmarks( config: BenchmarksConfig, ) { return config; } + +export class ShouldHaveThrownError extends Error { + constructor() { + super("Expected an error to be thrown, but none was thrown"); + this.name = "ShouldHaveThrownError"; + } +} + +export function assertNotReached(): never { + throw new ShouldHaveThrownError(); +} diff --git a/schemas/test/libraries.node.test.ts b/schemas/test/libraries.node.test.ts index de4ad360..796cb190 100644 --- a/schemas/test/libraries.node.test.ts +++ b/schemas/test/libraries.node.test.ts @@ -1,6 +1,12 @@ -import { errorData, successData, validStrings, invalidStrings } from "@schema-benchmarks/schemas"; +import { + errorData, + successData, + validStrings, + invalidStrings, + ShouldHaveThrownError, +} from "@schema-benchmarks/schemas"; import { libraries } from "@schema-benchmarks/schemas/libraries"; -import { ensureArray, unsafeEntries } from "@schema-benchmarks/utils"; +import { ensureArray, promiseTry, unsafeEntries } from "@schema-benchmarks/utils"; import { assert, describe, expect, it } from "vitest"; describe.each(Object.entries(libraries))("%s", async (_name, getConfig) => { @@ -80,4 +86,11 @@ describe.each(Object.entries(libraries))("%s", async (_name, getConfig) => { }); }); }); + describe.runIf(config.stack)("stack", () => { + it("should throw", async () => { + const promise = promiseTry(() => config.stack?.throw(context, errorData)); + await expect(promise).rejects.toThrow(); + await expect(promise).rejects.not.toThrowError(ShouldHaveThrownError); + }); + }); }); diff --git a/utils/src/index.node.test.ts b/utils/src/index.node.test.ts index 44dedee6..730f218c 100644 --- a/utils/src/index.node.test.ts +++ b/utils/src/index.node.test.ts @@ -9,6 +9,7 @@ import { setAbortableInterval, setAbortableTimeout, shallowFilter, + pluralize, } from "./index.ts"; describe("formatBytes", () => { @@ -146,3 +147,16 @@ describe("shallowFilter", () => { expect(filter({ a: 3, b: 2 })).toBe(false); }); }); + +describe("pluralize", () => { + it("should pluralize the word based on the count", () => { + expect(pluralize`I have 0 ${[0, "apple"]}.`).toBe("I have 0 apples."); + expect(pluralize`I have 1 ${[1, "apple"]}.`).toBe("I have 1 apple."); + expect(pluralize`I have 2 ${[2, "apple"]}.`).toBe("I have 2 apples."); + }); + it("should support custom plural form", () => { + expect(pluralize`I have 0 ${[0, "goose", "geese"]}.`).toBe("I have 0 geese."); + expect(pluralize`I have 1 ${[1, "goose", "geese"]}.`).toBe("I have 1 goose."); + expect(pluralize`I have 2 ${[2, "goose", "geese"]}.`).toBe("I have 2 geese."); + }); +}); diff --git a/utils/src/index.ts b/utils/src/index.ts index 9086bf4d..46c3972e 100644 --- a/utils/src/index.ts +++ b/utils/src/index.ts @@ -1,6 +1,6 @@ export type * from "./types.ts"; -import type { PickPartial } from "./types.ts"; +import type { MaybePromise, PickPartial } from "./types.ts"; // Polyfill because Netlify is using Node v22 import "@formatjs/intl-durationformat/polyfill.js"; @@ -306,3 +306,59 @@ export const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: "base", }); + +// we use US here, because we only support English (other languages have different types of plural we don't support) +const pluralRules = new Intl.PluralRules("en-US"); + +type PluralizeTuple = [count: number, singular: string, plural?: string]; +function isPluralizeTuple(value: unknown): value is PluralizeTuple { + return Array.isArray(value) && value.length >= 2 && value.length <= 3; +} + +/** + * A tagged template literal that pluralizes the word based on the count. + * If unspecified, the plural form is the singular form + `s`. + * @example + * pluralize`I have ${count} ${[count, "apple"]}.` + * pluralize`I have ${count} ${[count, "goose", "geese"]}.` + */ +export function pluralize(strings: TemplateStringsArray, ...values: Array) { + let result = ""; + for (let i = 0; i < strings.length; i++) { + result += strings[i]; + if (i < values.length) { + const value = values[i]; + if (isPluralizeTuple(value)) { + const [count, singular, plural = `${singular}s`] = value; + result += pluralRules.select(count) === "one" ? singular : plural; + } else { + result += value; + } + } + } + return result; +} + +export function promiseTry(fn: () => MaybePromise): Promise { + return new Promise((resolve) => resolve(fn())); +} + +export const exclude = Symbol("exclude"); + +/** + * Filter and map an array. + * @param array The array to filter and map. + * @param mapper The function to call for each element. Return `exclude` to exclude the element. + * @returns A new array with the mapped values. + */ +export function filterMap( + array: ReadonlyArray, + mapper: (value: T) => U | typeof exclude, +): Array { + const filtered: Array = []; + for (const value of array) { + const mapped = mapper(value); + if (mapped !== exclude) filtered.push(mapped); + } + return filtered; +} diff --git a/utils/src/node.ts b/utils/src/node.ts index 4734caae..62a1b213 100644 --- a/utils/src/node.ts +++ b/utils/src/node.ts @@ -1,9 +1,9 @@ -import { exec as ogExec } from "node:child_process"; +import * as child_process from "node:child_process"; import { promisify } from "node:util"; import * as v from "valibot"; -const exec = promisify(ogExec); +const exec = promisify(child_process.exec); const pnpmListSchema = v.pipe( v.string(), @@ -32,3 +32,9 @@ export async function getVersion(libraryName: string) { versionCache.set(libraryName, dep.version); return dep.version; } + +export function forwardStd(promise: child_process.PromiseWithChild) { + promise.child.stdout?.pipe(process.stdout); + promise.child.stderr?.pipe(process.stderr); + return promise; +} diff --git a/website/.storybook/preview.tsx b/website/.storybook/preview.tsx index d409c370..4828859c 100644 --- a/website/.storybook/preview.tsx +++ b/website/.storybook/preview.tsx @@ -7,6 +7,7 @@ import { RouterContextProvider, type RouterHistory, } from "@tanstack/react-router"; +import { parseAnsiSequences } from "ansi-sequence-parser"; import { http, HttpResponse } from "msw"; import { initialize, type MswParameters, mswLoader } from "msw-storybook-addon"; import Prism from "prismjs"; @@ -15,7 +16,7 @@ import { useArgs } from "storybook/preview-api"; import * as v from "valibot"; import { StyleContext, ThemeContext } from "#/shared/components/prefs/context"; -import { highlightCode, highlightFn } from "#/shared/lib/highlight"; +import { highlightAnsi, highlightAnsiFn, highlightCode, highlightFn } from "#/shared/lib/highlight"; import { type Style, styleSchema, type Theme, themeSchema } from "#/shared/lib/prefs/constants"; import { getRouter } from "../src/router"; @@ -28,17 +29,26 @@ const serverFnInput = v.object({ }); // probably very fragile, but TSS doesn't have anything like this yet -export function mockGetServerFn( +export function mockServerFn( serverFn: { (input: { data: Input }): Promise; url: string; }, handler: (input: NoInfer) => NoInfer, ) { - return http.get(new URL(serverFn.url, window.location.href).href, async ({ request }) => { + return http.all(new URL(serverFn.url, window.location.href).href, async ({ request }) => { + if (request.method !== "POST" && request.method !== "GET") { + return HttpResponse.json( + { error: "Method not allowed" }, + { status: 405, headers: { Allow: "POST, GET" } }, + ); + } try { - const payload = new URL(request.url).searchParams.get("payload"); - const { data } = v.parse(serverFnInput, fromJSON(JSON.parse(payload ?? "{}"))); + const payload = + request.method === "POST" + ? await request.json() + : JSON.parse(new URL(request.url).searchParams.get("payload") ?? "{}"); + const { data } = v.parse(serverFnInput, fromJSON(payload)); const result = handler(data); return HttpResponse.json( await Promise.resolve( @@ -137,7 +147,8 @@ document.addEventListener("click", (event) => { }); initialize({ onUnhandledRequest: "bypass" }, [ - mockGetServerFn(highlightFn, (data) => highlightCode(Prism, data)), + mockServerFn(highlightFn, (data) => highlightCode(Prism, data)), + mockServerFn(highlightAnsiFn, (data) => highlightAnsi(parseAnsiSequences, data)), ]); export default definePreview({ diff --git a/website/package.json b/website/package.json index 22d3db32..af65880f 100644 --- a/website/package.json +++ b/website/package.json @@ -26,6 +26,7 @@ "@tanstack/react-router-devtools": "^1.163.3", "@tanstack/react-router-ssr-query": "^1.163.3", "@tanstack/react-start": "^1.166.1", + "ansi-sequence-parser": "^1.1.3", "clsx": "^2.1.1", "d3": "^7.9.0", "dedent": "catalog:", diff --git a/website/src/routeTree.gen.ts b/website/src/routeTree.gen.ts index 0ee379f4..f4021b16 100644 --- a/website/src/routeTree.gen.ts +++ b/website/src/routeTree.gen.ts @@ -16,6 +16,7 @@ import { Route as BlogIndexRouteImport } from './routes/blog/index' import { Route as HomeIndexRouteImport } from './routes/_home/index' import { Route as BlogSlugRouteImport } from './routes/blog/$slug' import { Route as BenchmarksRuntimeRouteRouteImport } from './routes/_benchmarks/_runtime/route' +import { Route as BenchmarksStackIndexRouteImport } from './routes/_benchmarks/stack/index' import { Route as BenchmarksDownloadIndexRouteImport } from './routes/_benchmarks/download/index' import { Route as RepoRawSplatRouteImport } from './routes/repo/raw.$' import { Route as ApiTweetIdRouteImport } from './routes/api/tweet.$id' @@ -58,6 +59,11 @@ const BenchmarksRuntimeRouteRoute = BenchmarksRuntimeRouteRouteImport.update({ id: '/_runtime', getParentRoute: () => BenchmarksRouteRoute, } as any) +const BenchmarksStackIndexRoute = BenchmarksStackIndexRouteImport.update({ + id: '/stack/', + path: '/stack/', + getParentRoute: () => BenchmarksRouteRoute, +} as any) const BenchmarksDownloadIndexRoute = BenchmarksDownloadIndexRouteImport.update({ id: '/download/', path: '/download/', @@ -113,6 +119,7 @@ export interface FileRoutesByFullPath { '/api/tweet/$id': typeof ApiTweetIdRoute '/repo/raw/$': typeof RepoRawSplatRoute '/download/': typeof BenchmarksDownloadIndexRoute + '/stack/': typeof BenchmarksStackIndexRoute '/initialization/': typeof BenchmarksRuntimeInitializationIndexRoute '/parsing/': typeof BenchmarksRuntimeParsingIndexRoute '/standard/': typeof BenchmarksRuntimeStandardIndexRoute @@ -127,6 +134,7 @@ export interface FileRoutesByTo { '/api/tweet/$id': typeof ApiTweetIdRoute '/repo/raw/$': typeof RepoRawSplatRoute '/download': typeof BenchmarksDownloadIndexRoute + '/stack': typeof BenchmarksStackIndexRoute '/initialization': typeof BenchmarksRuntimeInitializationIndexRoute '/parsing': typeof BenchmarksRuntimeParsingIndexRoute '/standard': typeof BenchmarksRuntimeStandardIndexRoute @@ -145,6 +153,7 @@ export interface FileRoutesById { '/api/tweet/$id': typeof ApiTweetIdRoute '/repo/raw/$': typeof RepoRawSplatRoute '/_benchmarks/download/': typeof BenchmarksDownloadIndexRoute + '/_benchmarks/stack/': typeof BenchmarksStackIndexRoute '/_benchmarks/_runtime/initialization/': typeof BenchmarksRuntimeInitializationIndexRoute '/_benchmarks/_runtime/parsing/': typeof BenchmarksRuntimeParsingIndexRoute '/_benchmarks/_runtime/standard/': typeof BenchmarksRuntimeStandardIndexRoute @@ -162,6 +171,7 @@ export interface FileRouteTypes { | '/api/tweet/$id' | '/repo/raw/$' | '/download/' + | '/stack/' | '/initialization/' | '/parsing/' | '/standard/' @@ -176,6 +186,7 @@ export interface FileRouteTypes { | '/api/tweet/$id' | '/repo/raw/$' | '/download' + | '/stack' | '/initialization' | '/parsing' | '/standard' @@ -193,6 +204,7 @@ export interface FileRouteTypes { | '/api/tweet/$id' | '/repo/raw/$' | '/_benchmarks/download/' + | '/_benchmarks/stack/' | '/_benchmarks/_runtime/initialization/' | '/_benchmarks/_runtime/parsing/' | '/_benchmarks/_runtime/standard/' @@ -260,6 +272,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof BenchmarksRuntimeRouteRouteImport parentRoute: typeof BenchmarksRouteRoute } + '/_benchmarks/stack/': { + id: '/_benchmarks/stack/' + path: '/stack' + fullPath: '/stack/' + preLoaderRoute: typeof BenchmarksStackIndexRouteImport + parentRoute: typeof BenchmarksRouteRoute + } '/_benchmarks/download/': { id: '/_benchmarks/download/' path: '/download' @@ -346,11 +365,13 @@ const BenchmarksRuntimeRouteRouteWithChildren = interface BenchmarksRouteRouteChildren { BenchmarksRuntimeRouteRoute: typeof BenchmarksRuntimeRouteRouteWithChildren BenchmarksDownloadIndexRoute: typeof BenchmarksDownloadIndexRoute + BenchmarksStackIndexRoute: typeof BenchmarksStackIndexRoute } const BenchmarksRouteRouteChildren: BenchmarksRouteRouteChildren = { BenchmarksRuntimeRouteRoute: BenchmarksRuntimeRouteRouteWithChildren, BenchmarksDownloadIndexRoute: BenchmarksDownloadIndexRoute, + BenchmarksStackIndexRoute: BenchmarksStackIndexRoute, } const BenchmarksRouteRouteWithChildren = BenchmarksRouteRoute._addFileChildren( diff --git a/website/src/routes/_benchmarks/-hooks.ts b/website/src/routes/_benchmarks/-hooks.ts index 3564f1e3..b167d87e 100644 --- a/website/src/routes/_benchmarks/-hooks.ts +++ b/website/src/routes/_benchmarks/-hooks.ts @@ -15,7 +15,7 @@ export function useDownloadsByPkgName(data: Array<{ libraryName: string }>) { return useSuspenseQueries({ queries: useMemo(() => pkgNames.map((pkgName) => getAllWeeklyDownloads(pkgName)), [pkgNames]), combine: useCallback( - (results: Array>) => + (results: Array>): Record => Object.fromEntries(results.map((result, idx) => [pkgNames[idx], result.data])), [pkgNames], ), diff --git a/website/src/routes/_benchmarks/_runtime/-hooks.ts b/website/src/routes/_benchmarks/_runtime/-hooks.ts index 48d944d3..04db91d9 100644 --- a/website/src/routes/_benchmarks/_runtime/-hooks.ts +++ b/website/src/routes/_benchmarks/_runtime/-hooks.ts @@ -28,8 +28,8 @@ export function useSortedResults( switch (sortBy) { case "downloads": return ( - downloadsByPkgName[getPackageName(a.libraryName)] - - downloadsByPkgName[getPackageName(b.libraryName)] + (downloadsByPkgName?.[getPackageName(a.libraryName)] ?? 0) - + (downloadsByPkgName?.[getPackageName(b.libraryName)] ?? 0) ); case "libraryName": return collator.compare(getLibraryLabel(a), getLibraryLabel(b)); diff --git a/website/src/routes/_benchmarks/stack/-components/card/index.css b/website/src/routes/_benchmarks/stack/-components/card/index.css new file mode 100644 index 00000000..9ddff0a3 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-components/card/index.css @@ -0,0 +1,48 @@ +.stack-card { + display: flex; + flex-direction: column; + padding: 1rem; + gap: 0.5rem; + border-radius: var(--shape-medium); + border: 1px solid var(--divider); + .stack-card__version { + color: color(from var(--page-foreground) srgb r g b / var(--secondary-text)); + margin: 0; + } + .stack-card__header-row { + display: flex; + justify-content: space-between; + align-items: center; + } + .stack-card__library-name { + display: flex; + align-items: baseline; + gap: 0.5rem; + margin: 0; + } + .stack-card__downloads { + display: flex; + align-items: center; + gap: 0.5rem; + color: color(from var(--page-foreground) srgb r g b / var(--secondary-text)); + } + details { + width: 100%; + max-width: 100%; + summary span { + display: flex; + align-items: center; + gap: 0.5rem; + .md-symbol { + color: color(from var(--details-color) srgb r g b / var(--secondary-text)); + transition: color 250ms; + } + } + pre[class*="language-"] { + border-radius: 0; + margin: 0; + overflow: auto; + max-height: 16rem; + } + } +} diff --git a/website/src/routes/_benchmarks/stack/-components/card/index.stories.tsx b/website/src/routes/_benchmarks/stack/-components/card/index.stories.tsx new file mode 100644 index 00000000..45982db7 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-components/card/index.stories.tsx @@ -0,0 +1,49 @@ +import stackResults from "@schema-benchmarks/bench/stack.json"; +import { exclude, filterMap } from "@schema-benchmarks/utils"; + +import { Bar } from "#/shared/components/table/bar.js"; + +import "./index.css"; +import preview from "#storybook/preview"; + +import { StackCard } from "./index.js"; + +const meta = preview + .type<{ + args: { + resultIdx: number; + frameScale: ReturnType; + lineCountScale: ReturnType; + }; + }>() + .meta({ + title: "Features/Benchmark/Stack/Card", + render: ({ resultIdx, frameScale, lineCountScale }) => ( + + ), + args: { + resultIdx: 0, + frameScale: Bar.getScale( + filterMap(stackResults, (r) => (typeof r.frame === "number" ? r.frame : exclude)), + { lowerBetter: true }, + ), + lineCountScale: Bar.getScale( + stackResults.map((r) => r.lineCount), + { lowerBetter: true }, + ), + } as const, + argTypes: { + resultIdx: { + control: { + type: "range", + min: 0, + max: stackResults.length - 1, + }, + }, + }, + parameters: { + layout: "padded", + }, + }); + +export const Default = meta.story(); diff --git a/website/src/routes/_benchmarks/stack/-components/card/index.tsx b/website/src/routes/_benchmarks/stack/-components/card/index.tsx new file mode 100644 index 00000000..af3d1702 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-components/card/index.tsx @@ -0,0 +1,82 @@ +import type { StackResult } from "@schema-benchmarks/bench"; +import { getTransitionName } from "@schema-benchmarks/utils"; +import bem from "react-bem-helper"; +import { ErrorBoundary } from "react-error-boundary"; + +import { DownloadCount } from "#/routes/_benchmarks/-components/count"; +import { CodeBlock } from "#/shared/components/code"; +import { AnsiBlock } from "#/shared/components/code/ansi"; +import { MdSymbol } from "#/shared/components/symbol"; +import { Bar } from "#/shared/components/table/bar"; + +import { highlightFrame } from "../../-constants"; + +interface StackCardProps { + result: StackResult; + frameScale: ReturnType; + lineCountScale: ReturnType; +} + +const cls = bem("stack-card"); + +export function StackCard({ result, frameScale, lineCountScale }: StackCardProps) { + return ( +
+
{result.version}
+
+

+ {result.libraryName} +

+ +
+ download + +
+
+
+ + + {typeof result.frame === "number" && ( + <> + + + + + + + + + )} + + + + + + + + +
Frame #{result.frame}
+ +
Line count{result.lineCount}
+ +
+ {result.snippet} +
+ + + terminal + Output + + + {highlightFrame(result.output)} +
+
+ ); +} diff --git a/website/src/routes/_benchmarks/stack/-components/results.tsx b/website/src/routes/_benchmarks/stack/-components/results.tsx new file mode 100644 index 00000000..be71c3ab --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-components/results.tsx @@ -0,0 +1,50 @@ +import type { StackResult } from "@schema-benchmarks/bench"; +import { exclude, filterMap } from "@schema-benchmarks/utils"; +import { useMemo } from "react"; + +import { Bar } from "#/shared/components/table/bar"; +import { useBreakpoints } from "#/shared/hooks/use-breakpoints"; +import { SortDirection } from "#/shared/lib/sort"; + +import { SortableKey } from "../-constants"; +import { StackCard } from "./card"; +import { StackTable } from "./table"; + +export interface StackResultsProps { + results: Array; + sortBy: SortableKey; + sortDir: SortDirection; +} + +export function StackResults({ results, ...props }: StackResultsProps) { + const shouldUseTable = useBreakpoints(["laptop", "desktop"], true); + const frameScale = useMemo( + () => + Bar.getScale( + filterMap(results, (r) => (typeof r.frame === "number" ? r.frame : exclude)), + { lowerBetter: true }, + ), + [results], + ); + const lineCountScale = useMemo( + () => + Bar.getScale( + results.map((r) => r.lineCount), + { lowerBetter: true }, + ), + [results], + ); + return ( +
+ {shouldUseTable ? ( + + ) : ( +
+ {results.map((result) => ( + + ))} +
+ )} +
+ ); +} diff --git a/website/src/routes/_benchmarks/stack/-components/table/index.tsx b/website/src/routes/_benchmarks/stack/-components/table/index.tsx new file mode 100644 index 00000000..1dd7b8e7 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-components/table/index.tsx @@ -0,0 +1,94 @@ +import type { StackResult } from "@schema-benchmarks/bench"; +import { getTransitionName } from "@schema-benchmarks/utils"; + +import { DownloadCount } from "#/routes/_benchmarks/-components/count"; +import { Snippet } from "#/routes/_benchmarks/_runtime/-components/table/snippet"; +import { Bar } from "#/shared/components/table/bar"; +import { SortableHeaderLink } from "#/shared/components/table/sort"; +import { SortDirection } from "#/shared/lib/sort"; + +import { SortableKey } from "../../-constants"; +import { Output } from "./output"; + +export interface StackTableProps { + results: Array; + frameScale: ReturnType; + lineCountScale: ReturnType; + sortBy: SortableKey; + sortDir: SortDirection; +} + +export function StackTable({ results, frameScale, lineCountScale, ...sortState }: StackTableProps) { + return ( +
+ + + + + Library + + + + + + Downloads (/wk) + + + Frame # + + + + Line count + + + + + + {results.map((result) => ( + + + + + + + + + + + + ))} + +
Version
+ {result.libraryName} + + + {result.output && } + {result.version} + + + {result.frame} + {typeof result.frame === "number" && } + {result.lineCount} + +
+
+ ); +} diff --git a/website/src/routes/_benchmarks/stack/-components/table/output.tsx b/website/src/routes/_benchmarks/stack/-components/table/output.tsx new file mode 100644 index 00000000..b91a4f43 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-components/table/output.tsx @@ -0,0 +1,31 @@ +import { Suspense } from "react"; + +import { ToggleButton } from "#/shared/components/button/toggle"; +import { AnsiBlock } from "#/shared/components/code/ansi"; +import { Spinner } from "#/shared/components/spinner"; +import { MdSymbol } from "#/shared/components/symbol"; + +import { highlightFrame } from "../../-constants"; + +export interface OutputProps { + output: string; +} + +export function Output({ output }: OutputProps) { + return ( + }> +
+ {highlightFrame(output)} +
+ + ), + }} + > + terminal +
+ ); +} diff --git a/website/src/routes/_benchmarks/stack/-constants.ts b/website/src/routes/_benchmarks/stack/-constants.ts new file mode 100644 index 00000000..9a705355 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-constants.ts @@ -0,0 +1,5 @@ +export const sortableKeys = ["libraryName", "downloads", "frame", "lineCount"] as const; +export type SortableKey = (typeof sortableKeys)[number]; + +export const highlightFrame = (output: string) => + output.replace(/(\s+at Object\.throw \(.+\)\n)/, "\x1b[7m$1\x1b[0m"); diff --git a/website/src/routes/_benchmarks/stack/-content.d.mdx.ts b/website/src/routes/_benchmarks/stack/-content.d.mdx.ts new file mode 100644 index 00000000..ecb1c582 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-content.d.mdx.ts @@ -0,0 +1,7 @@ +import type { MDXContent } from "mdx/types"; + +export declare const exampleStack: string; + +declare const Content: MDXContent; + +export default Content; diff --git a/website/src/routes/_benchmarks/stack/-content.mdx b/website/src/routes/_benchmarks/stack/-content.mdx new file mode 100644 index 00000000..6671afb4 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-content.mdx @@ -0,0 +1,24 @@ +import { AnsiBlock } from "#/shared/components/code/ansi"; +import stackResults from "@schema-benchmarks/bench/stack.json"; + +Comparison of the errors thrown by libraries, including stack trace length. + +```ts +import { personSchema } from "./schemas"; +import * as v from "valibot"; + +try { + v.parse(personSchema, data); +} catch (e) { + console.error(e); +} +``` + +Where `error.stack` is available, we measure how many frames it takes to reach the line of user code (as opposed to library code). + +export const exampleStack = `ValiError: Invalid length: Expected >=1 but received 0 + at Module.parse (file:///node_modules/\u001b[4m.pnpm\u001b[24m/valibot@1.2.0_typescript@6.0.0-beta/node_modules/\u001b[4mvalibot\u001b[24m/dist/index.mjs:6748:28) +\x1b[7m at Object.throw (file:///schemas/dist/benchmarks-D-_Y96Ph.js:93:6)\x1b[0m + at \u001b[90mfile:///bench/\u001b[39msrc/scripts/stack/log.ts:24:28`; + +{exampleStack} diff --git a/website/src/routes/_benchmarks/stack/-query.ts b/website/src/routes/_benchmarks/stack/-query.ts new file mode 100644 index 00000000..e815838c --- /dev/null +++ b/website/src/routes/_benchmarks/stack/-query.ts @@ -0,0 +1,15 @@ +import stackResults from "@schema-benchmarks/bench/stack.json" with { type: "json" }; +import { anyAbortSignal } from "@schema-benchmarks/utils"; +import { queryOptions } from "@tanstack/react-query"; +import { createServerFn } from "@tanstack/react-start"; + +export const getStackResultsFn = createServerFn().handler(() => stackResults); + +export const getStackResults = (signalOpt?: AbortSignal) => + queryOptions({ + queryKey: ["stack"], + queryFn: ({ signal }) => + getStackResultsFn({ + signal: anyAbortSignal(signal, signalOpt), + }), + }); diff --git a/website/src/routes/_benchmarks/stack/index.css b/website/src/routes/_benchmarks/stack/index.css new file mode 100644 index 00000000..46bb1299 --- /dev/null +++ b/website/src/routes/_benchmarks/stack/index.css @@ -0,0 +1,14 @@ +@import "./-components/card/index.css"; + +.stack-cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1rem; +} + +.output pre { + max-width: 32em; + max-height: 16em; + border: 1px solid var(--divider); + border-radius: var(--shape-medium); +} diff --git a/website/src/routes/_benchmarks/stack/index.tsx b/website/src/routes/_benchmarks/stack/index.tsx new file mode 100644 index 00000000..8115a87c --- /dev/null +++ b/website/src/routes/_benchmarks/stack/index.tsx @@ -0,0 +1,107 @@ +import { StackResult } from "@schema-benchmarks/bench"; +import { collator } from "@schema-benchmarks/utils"; +import { useSuspenseQuery } from "@tanstack/react-query"; +import { createFileRoute } from "@tanstack/react-router"; +import { useMemo } from "react"; +import * as v from "valibot"; + +import { CodeBlock } from "#/shared/components/code"; +import { AnsiBlock } from "#/shared/components/code/ansi"; +import { generateMetadata } from "#/shared/data/meta"; +import { applySort, sortParams } from "#/shared/lib/sort"; + +import { useDownloadsByPkgName } from "../-hooks"; +import { getPackageName } from "../-query"; +import { StackResults } from "./-components/results"; +import { highlightFrame, sortableKeys } from "./-constants"; +import Content, { exampleStack } from "./-content.mdx"; +import { getStackResults } from "./-query"; + +import styles from "./index.css?url"; + +const searchSchema = v.object({ + ...sortParams(v.optional(v.picklist(sortableKeys), "frame")), +}); + +export const Route = createFileRoute("/_benchmarks/stack/")({ + component: RouteComponent, + validateSearch: searchSchema, + loader: async ({ context: { queryClient }, abortController }) => { + const results = await queryClient.ensureQueryData(getStackResults(abortController.signal)); + await Promise.all([ + AnsiBlock.prefetch( + { input: exampleStack, lineNumbers: true }, + { queryClient, signal: abortController.signal }, + ), + ...results.flatMap(({ output, snippet }) => [ + output && + AnsiBlock.prefetch( + { input: highlightFrame(output), lineNumbers: true }, + { queryClient, signal: abortController.signal }, + ), + CodeBlock.prefetch({ code: snippet }, { queryClient, signal: abortController.signal }), + ]), + ]); + }, + head: () => + generateMetadata({ + title: "Stack", + description: "Comparison of errors thrown by libraries.", + openGraph: { + url: "/stack/", + }, + links: [ + { + rel: "stylesheet", + href: styles, + }, + ], + }), + staticData: { crumb: "Stack" }, +}); + +function frameSort(a: StackResult, b: StackResult) { + if (typeof a.frame === "number" && typeof b.frame === "number") return a.frame - b.frame; + if (typeof a.frame === "number") return -1; + if (typeof b.frame === "number") return 1; + return 0; +} + +function RouteComponent() { + const { sortBy, sortDir } = Route.useSearch(); + const { data } = useSuspenseQuery(getStackResults()); + const downloadsByPkgName = useDownloadsByPkgName(data); + const sortedData = useMemo( + () => + data.toSorted( + applySort( + (a, b) => { + switch (sortBy) { + case "downloads": + return ( + (downloadsByPkgName[getPackageName(a.libraryName)] ?? 0) - + (downloadsByPkgName[getPackageName(b.libraryName)] ?? 0) + ); + case "libraryName": + return collator.compare(a[sortBy], b[sortBy]); + case "lineCount": + return a[sortBy] - b[sortBy]; + default: + return frameSort(a, b); + } + }, + { + sortDir, + fallbacks: [(a, b) => collator.compare(a.libraryName, b.libraryName), frameSort], + }, + ), + ), + [data, downloadsByPkgName, sortBy, sortDir], + ); + return ( + <> + + + + ); +} diff --git a/website/src/shared/components/code/ansi.stories.tsx b/website/src/shared/components/code/ansi.stories.tsx new file mode 100644 index 00000000..5d9458f9 --- /dev/null +++ b/website/src/shared/components/code/ansi.stories.tsx @@ -0,0 +1,51 @@ +import { decorations } from "ansi-sequence-parser"; +import ansi from "dedent"; + +import preview from "#storybook/preview"; + +import { AnsiBlock } from "./ansi"; + +const colors = { + black: [30, 40], + red: [31, 41], + green: [32, 42], + yellow: [33, 43], + blue: [34, 44], + magenta: [35, 45], + cyan: [36, 46], + white: [37, 47], + brightBlack: [90, 100], + brightRed: [91, 101], + brightGreen: [92, 102], + brightYellow: [93, 103], + brightBlue: [94, 104], + brightMagenta: [95, 105], + brightCyan: [96, 106], + brightWhite: [97, 107], +}; + +const meta = preview.meta({ + title: "Components/Code/Ansi", + component: AnsiBlock, + args: { + children: ansi(` + ${Object.entries(decorations) + .map(([n, name]) => `\x1b[${n}m${name}\x1b[0m`) + .join("\n")} + ${Object.entries(colors) + .map(([name, [fg, bg]]) => `\x1b[${fg}m${name}\x1b[0m \x1b[${bg}m${name}\x1b[0m`) + .join("\n")} + + + \x1b[7mReversed\x1b[0m + ${Object.entries(colors) + .map( + ([name, [fg, bg]]) => `\x1b[7m\x1b[${fg}m${name}\x1b[0m \x1b[7m\x1b[${bg}m${name}\x1b[0m`, + ) + .join("\n")} + `), + lineNumbers: true, + }, +}); + +export const Default = meta.story(); diff --git a/website/src/shared/components/code/ansi.tsx b/website/src/shared/components/code/ansi.tsx new file mode 100644 index 00000000..41a83e3b --- /dev/null +++ b/website/src/shared/components/code/ansi.tsx @@ -0,0 +1,23 @@ +import { useSuspenseQuery } from "@tanstack/react-query"; + +import type { PrefetchContext } from "#/shared/lib/fetch"; +import { getHighlightedAnsi } from "#/shared/lib/highlight"; + +export interface AnsiProps { + children: string; + lineNumbers?: boolean; +} + +export function AnsiBlock({ children, lineNumbers = false }: AnsiProps) { + const { data } = useSuspenseQuery(getHighlightedAnsi({ input: children, lineNumbers })); + return ( +
+      
+    
+ ); +} + +AnsiBlock.prefetch = ( + { input, lineNumbers }: { input: string; lineNumbers?: boolean }, + { queryClient, signal }: PrefetchContext, +) => queryClient.prefetchQuery(getHighlightedAnsi({ input, lineNumbers }, signal)); diff --git a/website/src/shared/components/details/index.css b/website/src/shared/components/details/index.css new file mode 100644 index 00000000..e05bb9e3 --- /dev/null +++ b/website/src/shared/components/details/index.css @@ -0,0 +1,101 @@ +details { + overflow: hidden; + border-radius: var(--shape-medium); + border: 1px solid var(--divider); + --reveal-duration: 250ms; + + @media (prefers-reduced-motion: no-preference) { + interpolate-size: allow-keywords; + } + + &::details-content { + opacity: 0; + block-size: 0; + overflow-y: clip; + transition: + content-visibility var(--reveal-duration) allow-discrete, + opacity var(--reveal-duration) var(--standard-curve), + block-size var(--reveal-duration) var(--standard-curve); + } + + &[open] { + &::details-content { + opacity: 1; + block-size: auto; + } + summary::after { + transform: rotate(180deg); + } + } + summary { + padding: 1rem; + display: flex; + justify-content: space-between; + align-items: center; + gap: 1rem; + font-family: var(--font-family-button); + --details-color: var(--button); + color: var(--details-color); + transition: + color 250ms, + background-color 250ms, + font-variation-settings 250ms; + &::after { + content: "keyboard_arrow_down"; + font-family: "Material Symbols Sharp"; + user-select: none; + height: 1em; + width: 1em; + color: color(from var(--details-color) srgb r g b / var(--secondary-text)); + font-size: calc(var(--icon-size, 24) * 1px); + font-variation-settings: + "FILL" var(--icon-fill, 0), + "wght" var(--icon-weight, 400), + "GRAD" clamp(-25, var(--icon-grade, var(--default-icon-grade)), 200), + "opsz" clamp(20, var(--icon-optical-size, var(--icon-size, 24)), 48); + transition: + color 250ms, + transform 250ms var(--standard-curve), + font-variation-settings 250ms; + } + &:hover { + background-color: color(from var(--details-color) srgb r g b / var(--hover-opacity)); + } + &:focus-visible { + background-color: color(from var(--details-color) srgb r g b / var(--focus-opacity)); + } + &:active { + background-color: color(from var(--details-color) srgb r g b / var(--pressed-opacity)); + } + &:disabled, + &[aria-disabled="true"] { + opacity: var(--disabled-opacity); + pointer-events: none; + } + details[open] & { + background-color: var(--button-selected-background); + --details-color: var(--button-selected); + &:hover { + background-color: color-mix( + in srgb, + var(--button-selected-background), + var(--button-selected) var(--hover-opacity) + ); + } + &:focus-visible { + background-color: color-mix( + in srgb, + var(--button-selected-background), + var(--button-selected) var(--focus-opacity) + ); + } + &:active { + background-color: color-mix( + in srgb, + var(--button-selected-background), + var(--button-selected) var(--pressed-opacity) + ); + } + } + } +} diff --git a/website/src/shared/components/details/index.stories.tsx b/website/src/shared/components/details/index.stories.tsx new file mode 100644 index 00000000..62450f61 --- /dev/null +++ b/website/src/shared/components/details/index.stories.tsx @@ -0,0 +1,13 @@ +import preview from "#storybook/preview"; + +const meta = preview.meta({ + title: "Components/Details", + render: () => ( +
+ Hello World +

This is a details element

+
+ ), +}); + +export const Default = meta.story(); diff --git a/website/src/shared/components/sidebar/groups.ts b/website/src/shared/components/sidebar/groups.ts index 516d36b5..ee348b84 100644 --- a/website/src/shared/components/sidebar/groups.ts +++ b/website/src/shared/components/sidebar/groups.ts @@ -44,6 +44,11 @@ export const sidebarGroups: Array = [ name: "String", icon: "format_quote", }, + { + ...linkOptions({ to: "/stack" }), + name: "Stack", + icon: "error", + }, ], }, { diff --git a/website/src/shared/components/symbol/index.css b/website/src/shared/components/symbol/index.css index a5a14426..28530fda 100644 --- a/website/src/shared/components/symbol/index.css +++ b/website/src/shared/components/symbol/index.css @@ -1,5 +1,4 @@ .md-symbol.material-symbols-sharp { - --default-icon-grade: 0; user-select: none; font-size: calc(var(--icon-size, 24) * 1px); font-variation-settings: @@ -15,13 +14,28 @@ transform: scaleX(-1); } } +} + +%light-theme { + --default-icon-grade: 0; +} +%dark-theme { + --default-icon-grade: -25; +} - [data-theme="dark"] & { - --default-icon-grade: -25; +[data-theme="light"] { + @extend %light-theme; +} +[data-theme="dark"] { + @extend %dark-theme; +} +@media (prefers-color-scheme: light) { + [data-theme="system"] { + @extend %light-theme; } - @media (prefers-color-scheme: dark) { - [data-theme="system"] & { - --default-icon-grade: -25; - } +} +@media (prefers-color-scheme: dark) { + [data-theme="system"] { + @extend %dark-theme; } } diff --git a/website/src/shared/components/table/index.css b/website/src/shared/components/table/index.css index 51b22350..5e83b31c 100644 --- a/website/src/shared/components/table/index.css +++ b/website/src/shared/components/table/index.css @@ -113,6 +113,9 @@ table.minimal { color 250ms, font-variation-settings 250ms; } + &.numeric .sort-cell__label { + justify-content: flex-end; + } &[aria-sort="descending"] .sort-cell__icon { transform: rotate(180deg); } diff --git a/website/src/shared/components/tooltip/index.tsx b/website/src/shared/components/tooltip/index.tsx index 63e27306..0d3c2eee 100644 --- a/website/src/shared/components/tooltip/index.tsx +++ b/website/src/shared/components/tooltip/index.tsx @@ -200,7 +200,9 @@ export function withTooltip( extra: "typo-caption", })} > - {tooltip.subhead} + )}
{tooltip.supporting}
diff --git a/website/src/shared/lib/highlight.ts b/website/src/shared/lib/highlight.ts index 612e8536..10036fae 100644 --- a/website/src/shared/lib/highlight.ts +++ b/website/src/shared/lib/highlight.ts @@ -1,6 +1,7 @@ import { anyAbortSignal } from "@schema-benchmarks/utils"; import { queryOptions } from "@tanstack/react-query"; import { createServerFn } from "@tanstack/react-start"; +import { parseAnsiSequences } from "ansi-sequence-parser"; import Prism from "prismjs"; import loadLanguages from "prismjs/components/"; import * as v from "valibot"; @@ -35,7 +36,7 @@ export const highlightCode = ( const NEW_LINE_EXP = /\n(?!$)/g; -export const highlightFn = createServerFn() +export const highlightFn = createServerFn({ method: "POST" }) .inputValidator(highlightInput) .handler(({ data, data: { language } }) => { if (!Prism.languages[language]) loadLanguages(language); @@ -54,3 +55,73 @@ export const getHighlightedCode = ( signal: anyAbortSignal(signal, signalOpt), }), }); + +function escapeForHtml(value: string) { + return value.replace("<", "<").replace(">", ">"); +} + +export const highlightAnsi = ( + parseAnsi: (typeof import("ansi-sequence-parser"))["parseAnsiSequences"], + { input, lineNumbers }: { input: string; lineNumbers?: boolean }, +): string => { + const tokens = parseAnsi(input); + let lineNumbersWrapper = ""; + if (lineNumbers) { + const match = input.match(NEW_LINE_EXP); + const linesNum = match ? match.length + 1 : 1; + const lines = new Array(linesNum + 1).join(""); + lineNumbersWrapper = ``; + } + return ( + tokens + .map((token) => { + // happy path, nothing to do + if (!token.background && !token.foreground && !token.decorations.size) + return escapeForHtml(token.value); + let style = []; + let classNames = []; + if (token.background) { + switch (token.background.type) { + case "named": + classNames.push(`bg-${token.background.name}`); + break; + case "rgb": + style.push(`background-color: rgb(${token.background.rgb.join(", ")})`); + break; + } + } + if (token.foreground) { + switch (token.foreground.type) { + case "named": + classNames.push(`fg-${token.foreground.name}`); + break; + case "rgb": + style.push(`color: rgb(${token.foreground.rgb.join(", ")})`); + break; + } + } + if (token.decorations.size) classNames.push(...token.decorations); + const className = classNames.length ? ` class="${classNames.join(" ")}"` : ""; + const styleAttr = style.length ? ` style="${style.join("; ")}"` : ""; + return `${escapeForHtml(token.value)}`; + }) + .join("") + lineNumbersWrapper + ); +}; + +export const highlightAnsiFn = createServerFn({ method: "POST" }) + .inputValidator(v.object({ input: v.string(), lineNumbers: v.optional(v.boolean()) })) + .handler(({ data }) => highlightAnsi(parseAnsiSequences, data)); + +export const getHighlightedAnsi = ( + { input, lineNumbers }: { input: string; lineNumbers?: boolean }, + signalOpt?: AbortSignal, +) => + queryOptions({ + queryKey: ["highlight", "ansi", input, lineNumbers], + queryFn: ({ signal }) => + highlightAnsiFn({ + data: { input, lineNumbers }, + signal: anyAbortSignal(signal, signalOpt), + }), + }); diff --git a/website/src/shared/styles/index.css b/website/src/shared/styles/index.css index 8c551069..6959b3b3 100644 --- a/website/src/shared/styles/index.css +++ b/website/src/shared/styles/index.css @@ -16,6 +16,7 @@ @import "../components/button/index.css"; @import "../components/chip/index.css"; @import "../components/consolewriter/index.css"; +@import "../components/details/index.css"; @import "../components/dialog/index.css"; @import "../components/empty-state/index.css"; @import "../components/footer/index.css"; @@ -249,3 +250,131 @@ main { a > code.language-text.language-text { color: inherit; } + +.language-ansi { + --ansi-bg: var(--code-background); + --ansi-fg: var(--foreground); + .bold { + font-weight: bold; + } + .dim { + opacity: 0.5; + } + .italic { + font-style: italic; + } + .underline { + text-decoration: underline; + } + .hidden { + visibility: hidden; + } + .strikethrough { + text-decoration: line-through; + } + &, + > *:not(.reverse) { + background-color: var(--ansi-bg); + color: var(--ansi-fg); + } + .reverse { + background-color: var(--ansi-fg); + color: var(--ansi-bg); + } + .bg-black { + --ansi-bg: var(--ansi-black); + } + .fg-black { + --ansi-fg: var(--ansi-black); + } + .bg-red { + --ansi-bg: var(--ansi-red); + } + .fg-red { + --ansi-fg: var(--ansi-red); + } + .bg-green { + --ansi-bg: var(--ansi-green); + } + .fg-green { + --ansi-fg: var(--ansi-green); + } + .bg-yellow { + --ansi-bg: var(--ansi-yellow); + } + .fg-yellow { + --ansi-fg: var(--ansi-yellow); + } + .bg-blue { + --ansi-bg: var(--ansi-blue); + } + .fg-blue { + --ansi-fg: var(--ansi-blue); + } + .bg-magenta { + --ansi-bg: var(--ansi-magenta); + } + .fg-magenta { + --ansi-fg: var(--ansi-magenta); + } + .bg-cyan { + --ansi-bg: var(--ansi-cyan); + } + .fg-cyan { + --ansi-fg: var(--ansi-cyan); + } + .bg-white { + --ansi-bg: var(--ansi-white); + } + .fg-white { + --ansi-fg: var(--ansi-white); + } + .bg-brightBlack { + --ansi-bg: var(--ansi-bright-black); + } + .fg-brightBlack { + --ansi-fg: var(--ansi-bright-black); + } + .bg-brightRed { + --ansi-bg: var(--ansi-bright-red); + } + .fg-brightRed { + --ansi-fg: var(--ansi-bright-red); + } + .bg-brightGreen { + --ansi-bg: var(--ansi-bright-green); + } + .fg-brightGreen { + --ansi-fg: var(--ansi-bright-green); + } + .bg-brightYellow { + --ansi-bg: var(--ansi-bright-yellow); + } + .fg-brightYellow { + --ansi-fg: var(--ansi-bright-yellow); + } + .bg-brightBlue { + --ansi-bg: var(--ansi-bright-blue); + } + .fg-brightBlue { + --ansi-fg: var(--ansi-bright-blue); + } + .bg-brightMagenta { + --ansi-bg: var(--ansi-bright-magenta); + } + .fg-brightMagenta { + --ansi-fg: var(--ansi-bright-magenta); + } + .bg-brightCyan { + --ansi-bg: var(--ansi-bright-cyan); + } + .fg-brightCyan { + --ansi-fg: var(--ansi-bright-cyan); + } + .bg-brightWhite { + --ansi-bg: var(--ansi-bright-white); + } + .fg-brightWhite { + --ansi-fg: var(--ansi-bright-white); + } +} diff --git a/website/src/shared/styles/themes/dracula.css b/website/src/shared/styles/themes/dracula.css index 44626c79..e70a2318 100644 --- a/website/src/shared/styles/themes/dracula.css +++ b/website/src/shared/styles/themes/dracula.css @@ -89,6 +89,23 @@ http://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascr --red-40: rgba(from var(--red-ternary) r g b / 0.4); --yellow-40: rgba(from var(--yellow-ternary) r g b / 0.4); + --ansi-black: #21222c; + --ansi-red: #ff5555; + --ansi-green: #50fa7b; + --ansi-yellow: #f1fa8c; + --ansi-blue: #bd93f9; + --ansi-magenta: #ff79c6; + --ansi-cyan: #8be9fd; + --ansi-white: #f8f8f2; + --ansi-bright-black: #6272a4; + --ansi-bright-red: #ff6e6e; + --ansi-bright-green: #69ff94; + --ansi-bright-yellow: #ffffa5; + --ansi-bright-blue: #d6acff; + --ansi-bright-magenta: #ff92df; + --ansi-bright-cyan: #a4ffff; + --ansi-bright-white: #ffffff; + /* Selection */ pre[class*="language-"]::-moz-selection, diff --git a/website/src/shared/styles/themes/github-light.css b/website/src/shared/styles/themes/github-light.css index 19575333..a4963638 100644 --- a/website/src/shared/styles/themes/github-light.css +++ b/website/src/shared/styles/themes/github-light.css @@ -125,6 +125,23 @@ --background: var(--white); --comment: var(--grey); + --ansi-black: #24292e; + --ansi-red: #d73a49; + --ansi-green: #28a745; + --ansi-yellow: #dbab09; + --ansi-blue: #0366d6; + --ansi-magenta: #5a32a3; + --ansi-cyan: #1b7c83; + --ansi-white: #d1d5da; + --ansi-bright-black: #959da5; + --ansi-bright-red: #cb2431; + --ansi-bright-green: #22863a; + --ansi-bright-yellow: #b08800; + --ansi-bright-blue: #005cc5; + --ansi-bright-magenta: #5a32a3; + --ansi-bright-cyan: #3192aa; + --ansi-bright-white: #d1d5da; + pre[class*="language-"], code[class*="language-"] { color: var(--foreground); diff --git a/website/vite.config.ts b/website/vite.config.ts index 91b5deae..e5220c06 100644 --- a/website/vite.config.ts +++ b/website/vite.config.ts @@ -49,6 +49,7 @@ const config = defineConfig({ viteReact(), materialSymbols({ knownSymbols: [ + "keyboard_arrow_down", ...sidebarGroups.flatMap((group) => group.links.map((link) => link.icon)), ...[ errorTypeProps,