@prosopo/datasets-fs 3.0.138 → 3.0.140

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +3 -3
  2. package/.turbo/turbo-build$colon$tsc.log +11 -14
  3. package/.turbo/turbo-build.log +4 -4
  4. package/CHANGELOG.md +25 -0
  5. package/README.md +2 -2
  6. package/dist/tests/data/flat/data.json +120 -120
  7. package/dist/tests/data/flat_resized/captchas_v1.json +1900 -1900
  8. package/dist/tests/data/flat_resized/captchas_v2.json +1900 -1900
  9. package/dist/tests/data/flat_resized/data.json +120 -120
  10. package/dist/tests/data/flat_resized/relocated_data.json +120 -120
  11. package/dist/tests/mocked.unit.test.js +41 -32
  12. package/dist/tests/mocked.unit.test.js.map +1 -1
  13. package/dist/tests/utils.d.ts +4 -2
  14. package/dist/tests/utils.d.ts.map +1 -1
  15. package/dist/tests/utils.js +14 -17
  16. package/dist/tests/utils.js.map +1 -1
  17. package/package.json +6 -7
  18. package/src/tests/data/flat/data.json +120 -120
  19. package/src/tests/data/flat_resized/captchas_v1.json +1900 -1900
  20. package/src/tests/data/flat_resized/captchas_v2.json +1900 -1900
  21. package/src/tests/data/flat_resized/data.json +120 -120
  22. package/src/tests/data/flat_resized/images/0x01680c6900f9f5d1b637e9ee6a47e39bd5febfa8c05e97411bf296e08f1084123c2ddb3c811c36e5daa860390b9f90c6136a0b852a6984867e12e82357dae101.jpg +0 -0
  23. package/src/tests/data/flat_resized/images/0x04412e617469fdd30059f9f2d77b3ee8d4d47ae9b31dd835bf5c72e1f03e617fb4cd45c43b3941415ad7a0a52579721aff179fdad282692f4f8ba7a4ceac3f2b.jpg +0 -0
  24. package/src/tests/data/flat_resized/images/0x0458b3119fe75beee322385ae298e5b69935c25c7b1e5953aca86898de74beab2d724af5f9b0a88f66e6588af8a7c53124b77b4eda7274aebeaf12751c880788.jpg +0 -0
  25. package/src/tests/data/flat_resized/images/0x09880e7ecc1d66c0d0fc634717bd92f657fbe74e465d7267f053331e0ca4ed6e3f35dfe96c35d65074d614d54af274a6791a8ca1bd24e92ff4a6ddb5e3a6a30c.jpg +0 -0
  26. package/src/tests/data/flat_resized/images/0x0d7468ab4b4a4870206f9416f02fab49bd6a677cbfad72d02fefdb5a5a766b15c45d5e9bce4375eef9e0714c2085f16efd6c092bc6a6433b2bd619b59ca29823.jpg +0 -0
  27. package/src/tests/data/flat_resized/images/0x180b41b967281d56136fd1dc00866dc00e21a73045a057a0ec2e7303a95ff9f5bffae41a5a8f3fa498c435abeb90769d16db07292e42f5ec8f5557239253d867.jpg +0 -0
  28. package/src/tests/data/flat_resized/images/0x2de20d716e37f702edb17834ac8205b5b11ad43620f0dd079ed680c710f9ac0b65ecf6bb85d85aa9a82a3adf6f0795fe842e7e6a289034ed1c29027af9366da3.jpg +0 -0
  29. package/src/tests/data/flat_resized/images/0x2e000a3726d8739111832f1dbf028f8dfe74fe028c4149b1d4047c361ed3338c9ad4fff03d734daddc0748148e207c5a46b31546ad6a9853ddfa0eabde6cbd98.jpg +0 -0
  30. package/src/tests/data/flat_resized/images/0x32e77cca2c8f235bb30482e9b33bf9f00e18ba4d6356330b5c02d736688efd4e894950fc3fdd3def828284b3df9f21c62cbca81a71345068c4540ee334153b66.jpg +0 -0
  31. package/src/tests/data/flat_resized/images/0x34c24373be3774a7ce601560f74d70839365f2a72fbe9acf6400e8e72fd859df66d80111d777ec686ad742170be3865102571062710b28a6dee0b9eec5d7b16c.jpg +0 -0
  32. package/src/tests/data/flat_resized/images/0x371825e60f5132764056973240b261b6e750b8fcc2440d7651a0798c611d551939c48b51bb1c58d2bbe6cac5c76122a329b38234d1047b4e502fac8de12bcb87.jpg +0 -0
  33. package/src/tests/data/flat_resized/images/0x389e0af93f52e4b02b954d1bf86dc7731f9c39dd4ab17d30f80a3bed28c7c5638beb4de36d87346c7552f281315540beba0ca471b92790a53c0c1247acad75fc.jpg +0 -0
  34. package/src/tests/data/flat_resized/images/0x396231a7e0ac7343c672d8a1d69ca5e89a773b9e771f2261866d44197e77018667b42ac01c1343e0f89cf7ae13994b12e607a4620e41989888e438589b2906fb.jpg +0 -0
  35. package/src/tests/data/flat_resized/images/0x39c573f966efa7bd57c57835cb55dd17c781b9ef18c2e502e9c9dc663678d442e5f0e72b5ad53f4294747d8f0f4bf6567d70fa072b120e85db8fe33d3ca288b9.jpg +0 -0
  36. package/src/tests/data/flat_resized/images/0x3aa3d1167d1a59a3fd98fc625673f1eb44e40077a761deb5284db866d0971309a0f266b0c1d73ac309e0f8b630232d19d84ff2761999880477c3eaf2c9c88ac7.jpg +0 -0
  37. package/src/tests/data/flat_resized/images/0x42bdd353f77090d619e06fce1ac874811437082d3617d3e361249e4eb01c1e458f7c2f0c916e7437b8269d862acb3deac930af7895903843bded8aea2796cee4.jpg +0 -0
  38. package/src/tests/data/flat_resized/images/0x4565f4b3d28bddbecf602ec346705fc87fc119789b6302e2114b60440d85c28a5a5b28b2a9623fd1a7107e1469af738b26dcb86ab78f97b4b37c92b149097b2e.jpg +0 -0
  39. package/src/tests/data/flat_resized/images/0x470b8e46d24caad83799983764b9ad3b01899fd203571dd51d53e9043312fb8a4073a79cde621492c44e5e8767bc301edae65c7234056eaa3948332c929af4d3.jpg +0 -0
  40. package/src/tests/data/flat_resized/images/0x4b0a605692c1a6b725e118f9597f056eeef7c01879504046aede300e30d5e02ae421295a35c6d8676e9b3e0d219ab226e0dedd608946bf852d699a35e07227b3.jpg +0 -0
  41. package/src/tests/data/flat_resized/images/0x5125f70be96446963faa123a96e3b5e453e0ea3d66cc73fb075afa032ad81ead2b439b8be8837c2f7bc194aed87a62766efecbe510bfa41e2933c5f4687df123.jpg +0 -0
  42. package/src/tests/data/flat_resized/images/0x5671b364222cd5ce64a572a09bf8e726acd3ad74e5ad18f7a52751c6f9f35b506bc90d3ff2668f4b32bed6b1233827fb0443fae6f28887b0362768587171f43c.jpg +0 -0
  43. package/src/tests/data/flat_resized/images/0x5785b0476631bbf564cc032362f1ab3401f8e161056b1d7b5774a49699fb1bc60bbaf31b7e0a11456acf59df7886e2ab150d6c21f88287e66d7e15ed521e10be.jpg +0 -0
  44. package/src/tests/data/flat_resized/images/0x5ad8988769dd7d7307cf6fbb4c5c3f984e3889d9f19c472b21993144cb1be82a676f990fea505b6d2e39a0eca6755e9a7a814031afc463db1ca0eab6d9f43f55.jpg +0 -0
  45. package/src/tests/data/flat_resized/images/0x5c36f99be856c4e4cd4f66e7743763e5f8cc6598ab198fe6062fa985b5bd49e57abb5d09ace58eb032974cb76243638d6a1250faac1982d370b3c1fd54e02e06.jpg +0 -0
  46. package/src/tests/data/flat_resized/images/0x5e1ec6b5e8ef81f4235281fb9ef14168b459c7b6dc649056fc550fd3ce81d9c42d591464d1c38af59316cffb8a32d12551bc789ff76c8cdd4aa270df5d250ffb.jpg +0 -0
  47. package/src/tests/data/flat_resized/images/0x5fcba56aab516fbe641c9a025d047c0e0f1ebe5c200232cfdc865651eeca8a729a642638a8783216cf287ccc751139705c3ff23e5ca6d864c91129db3257fa5f.jpg +0 -0
  48. package/src/tests/data/flat_resized/images/0x6104fdac0b38ff92ca033296b1249a3e6aff461604a15964f12bdeb6c561b9891a700f191aabd7621f171a807206376e681fcd945be1a345c9dabb387b99d3e5.jpg +0 -0
  49. package/src/tests/data/flat_resized/images/0x6495581992b5bff4c4507ba941650ee8e9754b11c7b85856972d124c03bdf371dba86d797ffa44bf9cc8ac0bde2fb310cc2799a786484bb89b51b60aff05b647.jpg +0 -0
  50. package/src/tests/data/flat_resized/images/0x649d4b4b28245565c8f4f729674ccdde4d6985b691cb775a9367340c46d587cc733128fd82081d04e2a2321dc7c94470d1b02bad7effa6b1239086c2167d49c6.jpg +0 -0
  51. package/src/tests/data/flat_resized/images/0x681d594021ec03f34798bfd7cfdf351b2f5fce87490b7b353b265d415532c5e0b7751c04f44a5c1d92f112628068cfe185af1452046534f5adfbd75e39785927.jpg +0 -0
  52. package/src/tests/data/flat_resized/images/0x72a8e4393cf2abe8a1ded5d7b94f75bc2d87343b9893f03e67ee11a6e08c5ed112d69b71cecaf38350d8761560870c982bd0d56a4cd9c6572b20f316f4b59e4e.jpg +0 -0
  53. package/src/tests/data/flat_resized/images/0x72ce2eb8dbc60ab9f81a82e2c20867a433733e05364e4e5f0ee699a2556547ea21cd10e45e39d0f20587c6ef8fdbed1934819a06b6f64d82bb7b821b0784ac37.jpg +0 -0
  54. package/src/tests/data/flat_resized/images/0x794962f855ab553b9b269af817d22a9f3aace428b5637f27ea6fe7763ce9cbfe976f7725fa24a922401689c2df3f911f61f0d45d6a3e8e6bdd05a3aaae89200a.jpg +0 -0
  55. package/src/tests/data/flat_resized/images/0x8471a7824a8e152b12d04464fdeb73b2011337671cdc448be5dd77abe978d554de6e5f2741437fd97e25f1275ae837be8382c2c3d9a6311545c2d6e8666a6604.jpg +0 -0
  56. package/src/tests/data/flat_resized/images/0x858ae20f81f795c960a5cadd84f3dd8e1e6798fc719545f3a10001def3cc89b5c23cd00149a6eb6a2062e10b5b882030c7c0b14ec7c1ea7e1f66114b9081466e.jpg +0 -0
  57. package/src/tests/data/flat_resized/images/0x8a2fd874ef10dc79a07e8fb0a42d7d08bb9e68b4836857b7afe018e660dd1077787fff678908442f7cd31001c3d5c0c94195cac8e4eb5ce649370d40447d9ccf.jpg +0 -0
  58. package/src/tests/data/flat_resized/images/0x919e0adb11eec9a9e8aefbf91e6547c9952032539ea3cc1fb524ca7e803486082f0b673fcf2f633be2f46d3863b4af3e78bc52b0ca9fcc32d5180bf33c8da0c8.jpg +0 -0
  59. package/src/tests/data/flat_resized/images/0x9d19edc89ca1bbfebfa9f8dd54dc260e3b13e9ec150060f10e6ed3532229125b97ea7914b6079e7880eaeae6b8617428faaa4ce89f587c3394cb80472692bd70.jpg +0 -0
  60. package/src/tests/data/flat_resized/images/0x9d837a0223af31f41888daada1e773bf3c6637155ea970fc845b69a59403516b28a246f503d12aff880a895073834a930a25e3ed744a97aac39d379f3310fd17.jpg +0 -0
  61. package/src/tests/data/flat_resized/images/0xa0ccf619a2a37ef41d1db3aba88e8d85a1b0e6ae379b5dafd61e66864e33cc2f763b794cdbeb5fecfe4df980be7b64c7ee6720841530f09d4b823d7f8403192d.jpg +0 -0
  62. package/src/tests/data/flat_resized/images/0xa22be612fcc2f85ba62fe0fd5d41e4f642419fecc6c4bc3a4018292dcad0d74e1d615c8135754bbbc630c69191d3fb5a45ec923fc419fa6e5b01548102ff0e86.jpg +0 -0
  63. package/src/tests/data/flat_resized/images/0xa405b623dbacae064fcbbac84a9a810134600834e9874979d8c827a7a5571814ca1d044864b6fab738af32d791cb4fd2cb27688fd4c8d75d590135c4672e96c1.jpg +0 -0
  64. package/src/tests/data/flat_resized/images/0xa8ccce7c6e2c11463003b922c5f5a0510cd403e10f54876bbde2b742779302639bb29069005588fcff326b104c2d10f1584cad75f4cc01f4c5129f964c57f80c.jpg +0 -0
  65. package/src/tests/data/flat_resized/images/0xb1906d609690d30717b2f90e596d6a0c70e72df8d964bc81c9a657256fc4e28754908b162544810ca719f58624f392d34acc9bf5028d31512161c625957ede03.jpg +0 -0
  66. package/src/tests/data/flat_resized/images/0xb25179ff5cee6d5c86869d9dcc4622b2b4f11c78a84a55f6cfee484216cb29b1fc0e15b67edeb5e13d8715d491c1749337d8b6db904e5ca64d42a1a863064324.jpg +0 -0
  67. package/src/tests/data/flat_resized/images/0xbdb9bd3967d77c904168fa104ae1608cc49cdd203af867d8268872f8a939cb6930ab60fdad5dea105692aabe09c9b083cb98a6c33955b725096801924c85f73b.jpg +0 -0
  68. package/src/tests/data/flat_resized/images/0xcb0921ffcdcd10f17cdc682bf131ca5c30527bf54601c5d852871e2f1e1bcdff090e8f8d0cca43804ad4fe47b4e8deb9b7e1ce5958b940245caabcb4034f0e0a.jpg +0 -0
  69. package/src/tests/data/flat_resized/images/0xdccf04070efcb4476099bf280476ff43f44738561764f78eb4b7ca253249163ca347735efb767655db862797ddf4f4b7a7c93e96e5d21c0e7a60ec8bb5296f1b.jpg +0 -0
  70. package/src/tests/data/flat_resized/images/0xe07aebd1f97c948b2abbccb8dcd020add589ba84e3f6f8676c8defacdbcf70fb4e06757b0f323e988051e1528718140fd10f2182fe5e27b15b7680653525a141.jpg +0 -0
  71. package/src/tests/data/flat_resized/images/0xe09ee718f6b6677fe12a1381ca47b0bd209198070331b75ff77defdc88d066b97e0f6de1bef85ddbc857e2c5f3951fec9a450f2ae3a16f5effa62bd0f07e211c.jpg +0 -0
  72. package/src/tests/data/flat_resized/images/0xe283a7fa1c6b8de22c3cfeedf50a7a75cc4dae628e25222e2f65b9e6f2768a3db17c882c6841841ad9d9d55a02721f94fa4ad06d5797641a4992ce30ff2ac483.jpg +0 -0
  73. package/src/tests/data/flat_resized/images/0xed72d39933893c3a176e8360d38f79faef02e59b583e114f0b5a9f3043e6fb24fb6399e8550b51a5e1d9ef8cde7a02a7373739b0b488aacac74a86a8e03a34a3.jpg +0 -0
  74. package/src/tests/data/flat_resized/images/0xf086e3ee0c5f7997e724d93e02313697deacf9952c561e79365b1daf915f0291a293df2456d1894d64f6c8f191d4ef590b1374b2743f3ce695468a677d6b91a5.jpg +0 -0
  75. package/src/tests/data/flat_resized/images/0xf466148cbfd860870b834045825ae7f7b0994645b0a08ab246c0fe5d2051c2c0d9b48156d1a5bbf7621075ee98116b0514c38d7ff2886bd4882e10e1aa18b7f1.jpg +0 -0
  76. package/src/tests/data/flat_resized/images/0xf49755cdc166b3c028ed7ce9bff377f191bd3b06a10f166308b662e557e723cabc0b6f613000db5971b4205936c51c6681734100caa9475bcb75e420725f11da.jpg +0 -0
  77. package/src/tests/data/flat_resized/images/0xf74a7822da8bcca082c1c9bf9653555f6924e6a7bef0b523f7d681b34e2d3f06d0ede639a0703462b75df77c241f8ebb4673c55d619faacad749f208c8d44190.jpg +0 -0
  78. package/src/tests/data/flat_resized/images/0xf9478fa2283203a1ac62fcb044532520b9286e66f42489b5519381b4ecbfca939c9de07a4a0e4fb7315c3eb4656ab6dee6951e6f7b2a45d32b649af06ef93120.jpg +0 -0
  79. package/src/tests/data/flat_resized/images/0xfa5a7d2a32748801a8714e51595ccb6de07d7631bddea3bee543f8296cbac0acd684c29339cfbd3f578ff167bfeb2eca70cdf6a773e52797674c31a14ec293ea.jpg +0 -0
  80. package/src/tests/data/flat_resized/images/0xfb9b2be2b9fcf6294b29dc18df21714a6d23d6a78d4c574747630d21727f72a7b2b4ae5666ebae4409cb7a85308f11d8dc186aa26709b0c53e41530f4a57ba6d.jpg +0 -0
  81. package/src/tests/data/flat_resized/images/0xffeb64c20d8367f56d4ed039c11e115c85b054a53120e34e4e3b081be92741b740bc16ce334e0558eda2476c97ed6209c34c4125c93d758cbee535520364cd60.jpg +0 -0
  82. package/src/tests/data/flat_resized/relocated_data.json +120 -120
  83. package/src/tests/mocked.unit.test.ts +263 -226
  84. package/src/tests/utils.ts +18 -25
  85. package/tsconfig.cjs.json +0 -3
  86. package/tsconfig.json +0 -3
  87. package/tsconfig.tsbuildinfo +1 -1
  88. package/src/tests/data/flat_resized/images/0x00db19a7c62a7ed3998c596215d455077cfa6ea6a9a0d9e5e9189cbde565cf1cc11e18046e01434a67937e9574c35ac3a1ed293dc2bb606e8d419aed61edf70e.png +0 -0
  89. package/src/tests/data/flat_resized/images/0x02606f6d654cc3780b67077783d8b1d0d482b224ccd0908f9e38e55a16cf6e5eb62b42559e48d881107d00fe2fe3d0d275879d700dcde504c855576548101503.png +0 -0
  90. package/src/tests/data/flat_resized/images/0x0398b3b46e8e5ffe4206919c2f0f30b94c8867097533128b12df6ff241e2e97764acf8d8fd2955875594b11c2a41f0d3e0071843f09f67a2dbad678072db4455.png +0 -0
  91. package/src/tests/data/flat_resized/images/0x0659321c2c380fab15f2405128e2439faac7cb8555e217bcafa5bc8a354d6cfce7015203e5e61101a31dfbc637a8d5c65d85b6ee48867499895957c4db5af16a.png +0 -0
  92. package/src/tests/data/flat_resized/images/0x077d377cd794017fffc8c70c12fc056d7f03f1e24c54b56bc6c13af8a75f033b0883b64502b9afa5329819ac429318ca42f4e2cb5b446ca7a3b5a169ca5354a2.png +0 -0
  93. package/src/tests/data/flat_resized/images/0x0e3aafb28186acb2b51acd0123c55650b5019c0854e1e478ef1e61aba0033cc3b9d651e314602929a077a67fde2bfbe68c99ec89823abb381a8994aa7098e63a.png +0 -0
  94. package/src/tests/data/flat_resized/images/0x1a1b08462b094f2def0d8e2659dd1bfe3dbf25fc5b06222b45471d6a84c19f6f69ed996190e05de668bd4afe6df30c6f2b942a3047503e70d95034b155695c45.png +0 -0
  95. package/src/tests/data/flat_resized/images/0x1e553d6c4afd65c3441aa00970ca9e5919c1c9efc19ee800e45d61eb26e442e7a7dd9a80b34882a18887856b14e9df9e6dd979427bbdbb9e8090df394b0844b7.png +0 -0
  96. package/src/tests/data/flat_resized/images/0x22938433d07d39fcfbb9538233f57b537d673b0c6022d2cb1b730e42a43b317a50313def95c6e651b0ca1154510ea462a4feee3a0e71bc8f42837bd0e1737c41.png +0 -0
  97. package/src/tests/data/flat_resized/images/0x25e0a29caac87e8258350c623bba6aebf0a427f0419bde1889d3b365de8f83ad5dfd4c5e8bf7952da3e8864a689b9f0ddc730d6184e85a7b420d349c3d7b8ecd.png +0 -0
  98. package/src/tests/data/flat_resized/images/0x2670edc73900aac804f21106694f1f1d46ce843abb622f5b638e7974f3dcec96ad031000205786f2745a72f8397e63a410058b16cca850418cda76c82629375c.png +0 -0
  99. package/src/tests/data/flat_resized/images/0x367af181b8fb20198197e3d7c0b52a36c2ff3ac4dc790056a7d055b0baee38c03a9038c79fc59510764de08bbb7c14307c2d21ebcb4313599782687cb40a0646.png +0 -0
  100. package/src/tests/data/flat_resized/images/0x3d02bf1afaea86d6cc0aea9e84c6745f845faa308ceac297166fd0850a944f808b10728c2f38f67ea87962ca4a1b4f4074bbaa630caf0d91998184a32e11a77d.png +0 -0
  101. package/src/tests/data/flat_resized/images/0x3e8e0f6276b6ab68722cc3e827c0a4a9d7d1575ace6527a3c76e103c0f3a4259530d3a6e626af0b19e35a5d13505013c67553fe498b0fe0e7a4060d4003324a8.png +0 -0
  102. package/src/tests/data/flat_resized/images/0x4190ae0531224be458e3a14e13af0751311ea350636a365f9144438555c56cea075a70d2c6d0c64fb8311ff674cd2b357b0c07de388a5014129e159b9f29d31b.png +0 -0
  103. package/src/tests/data/flat_resized/images/0x42c68ccc53bc41eb731952ea2adce62be61a7b81c167f6f0b2ba4ee1d2d449d45c44eddc48f9c169902cf35ba1c8739a09848faf8c632775ca257026e4a79f8f.png +0 -0
  104. package/src/tests/data/flat_resized/images/0x441aee1e0f3c90af8f5d96eece0d476a722fe93883aff615c3c966fac27e814c451eb6fb92ad18c20ae5c798fc23b55a180db9c4d416e8cb3ea0b85cec7565f7.png +0 -0
  105. package/src/tests/data/flat_resized/images/0x46640f912f03eb60cd4afbb8d6fc14b2f0c14ab93dee203681ab997cd7e43cb58d1782b31d549a158180c7a2f9b2c500c848a2047e740d8c4ac14a320d607320.png +0 -0
  106. package/src/tests/data/flat_resized/images/0x475b502023789ec81e8653253906a75d0e4e17857117b367999268a5b0b7a8638256eca95d8cc7280a275de8c884a442abb3dd3f7b9f28f2de79df39628ba8a6.png +0 -0
  107. package/src/tests/data/flat_resized/images/0x4ce6c8a8dd7b35afebf35ee25514694c947bcb082acd370fa5cee4b650548bcf0e21a864e1a99320dea5369f1b3a6b5240bcbca420972a8f1ec06a713b900b82.png +0 -0
  108. package/src/tests/data/flat_resized/images/0x4fb674a19e4db835814fffc3872df8a661694e0deec3af347cd19e199c5539e5988c72052e79f21e0035d328d522aec983ac2379209eebd56859bdd5f400a70c.png +0 -0
  109. package/src/tests/data/flat_resized/images/0x5068adcbae2342e7208e394f57b5921df657b1e53b2696cfcb885a9298597fd7645ee1f1a0ff423be46645ca3a30d929ca59a23139ecab0e6ffecd76f3bc6558.png +0 -0
  110. package/src/tests/data/flat_resized/images/0x511c1fb6c24e2db829767c0503ed3fb5d83d2fc512bd4f53879f2a639095a05b9a104f968dae26e8fa2385c9978c55fa0a646fa07694b6403e4497ad7ad10a59.png +0 -0
  111. package/src/tests/data/flat_resized/images/0x55709825a4883482be0d647137464f012f61009149ebe8d27b2ad8445064741592795a3d02da53fc9b42e049d0e8d764ba195541267baa2788cd6985197647f8.png +0 -0
  112. package/src/tests/data/flat_resized/images/0x5cafe30f3eed6c7e6f64e34a081e50317892ac7f235c5fe865e224d8363d65b1b2d9f1f6c8b5736c0f3a932740b9b31eefd7f0ec13a16e4dfca541012adc0b2d.png +0 -0
  113. package/src/tests/data/flat_resized/images/0x69926ed2721a19f01cf8829611399412e74e5780c64f00c1610aba0a832d9e440399f13471e8cc019fcc2ec372571d1b1a583a967f21fa1cd68607cadf2f7f8c.png +0 -0
  114. package/src/tests/data/flat_resized/images/0x72b1fdf0560059de27bc796fd0ac98e083277157b2ac2ee1f5812ab4e34a781aa15b7372961dc69c4f562df5143ce356b184acd9409803ce1d443ca39d257952.png +0 -0
  115. package/src/tests/data/flat_resized/images/0x760fa7f860a1e0925b827f6aa83e52d7e76a70f55e263da07c6997b6c641987f78dc208ce97cec2eb3d68a2e653acc7d308ce4e242891573b4d50281822f5485.png +0 -0
  116. package/src/tests/data/flat_resized/images/0x77fe0772ef80332ac3cb48d5c84be6fefec0ad90607ec45c509edda2a6b63e389895693821a9ee99a2d824cf71fa9bea4458ca3de8353ae60f489fa6e3961878.png +0 -0
  117. package/src/tests/data/flat_resized/images/0x7da2f1e8dd907863f6ffd9dd3a3d24d3ac28797a3429210c24be3c83e1cc6028e040250e7c765f99a85a3edd7d0a3978b46a8bfff134120b309c494d7484e24d.png +0 -0
  118. package/src/tests/data/flat_resized/images/0x7f45ee498813ebe3d314d9071d126341ab14887d8754d5571d4858f93a07c7a8d19687a76f3f2f42dc110f573626c32f52475bc6e0d8b714c2773a13cf08f8bd.png +0 -0
  119. package/src/tests/data/flat_resized/images/0x8343903b4ce3b63ffc4a66e805a18dc1cc136a91c8f67f15f261aec61c9ad58ad1856c84fe0ac97d1edc4b21f6b5b1842cc7b211328e460ed75bfad3dbb9ff16.png +0 -0
  120. package/src/tests/data/flat_resized/images/0x884c86c6b69bd29db658b3612f484bdf78e1420434082a68636f69e3d90e3cd76cf9718e099ff0ab16d7f27d8c5a3c09dcbd136d9ee01cd1d4ec72de672bea66.png +0 -0
  121. package/src/tests/data/flat_resized/images/0x88f06b2a1ce4f7e9b491a84919b59939a76baea88a48e88e95ebe48383cc15631d8524b7a9ec73cc4cba7568dcc1c7bddef4ff45c6992300e10111baf4a61971.png +0 -0
  122. package/src/tests/data/flat_resized/images/0x8ca8bc45e79bd59205fbd77b24e09e4c6ee437f27d02fc30b825037cfae6f2583f7b9d0b6a004c5a2ef9774ca1d3b45ffb94fdfabcffcdddfcd5838f2a489d3b.png +0 -0
  123. package/src/tests/data/flat_resized/images/0x8cf36665bbccaec073e346777f974edbbd7ec534e78426d6ae13dc39740271024527e945fef06d8dd78b1345c87e1b3f90f28385531910d3a0795f45a7030438.png +0 -0
  124. package/src/tests/data/flat_resized/images/0x9134327ca5ec7a5c6e1f6d8e8aa395c445d439dc32c1bbc84721b18d04fcee8394a559c362bcf6bb1e92e2d8edcf6d5dd73f1cf302a38dd646bbed2d27a6ce8f.png +0 -0
  125. package/src/tests/data/flat_resized/images/0x9401d4dde02ebdcdd64827653b90b3337485c8fb59796ee6dbefd3866404b47ca4663175b7acfad49eac177baeb8df7304bced6713f85d50767144dcb436c66c.png +0 -0
  126. package/src/tests/data/flat_resized/images/0x977448bb1fa3594a3d91b2a37acd6967ca42252f0062ed5253040f200230395e7924a4dcc392bf26ec6d2c7c1d3204db2c5fcedb4c9d21a2a90ee018df2e6ae6.png +0 -0
  127. package/src/tests/data/flat_resized/images/0x99da74b964a5dd03c619aa375ccf5dd69eb34fba3bf0e48f8e34ce2c9a1f4bf5fffcd1be4fcebebfdea61ab27bb8d36060950d6c19b7c8a89c7316a724db7a4c.png +0 -0
  128. package/src/tests/data/flat_resized/images/0x9b7dfbc8196a9d5b140f56b7eec0467c9d8a3e38ff7c017c33700040f6c98e2b79a0960f7a919d7f1ed7b435a49dce508b113ebda88331629ee8492ca29439af.png +0 -0
  129. package/src/tests/data/flat_resized/images/0xa6d77ccef52e07120c9295502b9dc972107f704abf6f4fd57dd2b8664db9fdc2c104e30e69e2c61cf1d88f8cdaeea204a2c332d49fd7ad1f61bbda7ea22bb77e.png +0 -0
  130. package/src/tests/data/flat_resized/images/0xa791e01f34c89768df8a82869d31e5ce813adb84a3cdc7be5ebe55503375fc89d49974a3a8987292b92423ded092e488130957f4725e93d21c14d0a91a2f81ed.png +0 -0
  131. package/src/tests/data/flat_resized/images/0xb31d7cab98df328d0f4a32b2969ec8e294cb4c2d1ab8bf46471a113b63c0d39c3ccb5cca55a8b46a2161c836a9fb1643e0d673e933cf21c8e4f4e46f0e1f0e96.png +0 -0
  132. package/src/tests/data/flat_resized/images/0xbc50b9d2fc9272318a3a51e555ab744a1205112d38e308caac67975ff367fabc636a6567072bdd3bda1368ccc78863c6ea115f91cb7e4a57349baca6d6d01e24.png +0 -0
  133. package/src/tests/data/flat_resized/images/0xc322ec6d7a03c9baade16ee7a71414edfe6839d7cbe5805f3632d158616d9b51f455d1daa39167359a189878905ec8d77f3e44022ec4481197f85a98d38ed345.png +0 -0
  134. package/src/tests/data/flat_resized/images/0xc5293e66e847653ca0361f1fd1460c573a66be57b769a8a41b8fb8b42da4417ff1a91c4ef037ca5b2a1f0b5797dc62db2090d88047a80a09e93eacc080e60bb2.png +0 -0
  135. package/src/tests/data/flat_resized/images/0xc8d934f2e7ac8429086669bb0788296844946834b5a3d2f3a44db276e06d7856c3782692d8bb9ba4122098d4027ca3642f32cdc7978f44493634b21b82c735c7.png +0 -0
  136. package/src/tests/data/flat_resized/images/0xc9473fa10f0aa11856eef9683cf99fa7f2bac77e5b0ab0f08a99c002289b0ca684bfbe7504dd3124dea9fb1f4be68caf09a4c3fa0bfa890a371ace855e649c16.png +0 -0
  137. package/src/tests/data/flat_resized/images/0xd3dd338481d82174ef911f76605f1c9ecf20660a65e23ab2130211c6533d018b021303d37423a641188cbe56a447beee86916cea9be935b1cbca88eb1c1c31fb.png +0 -0
  138. package/src/tests/data/flat_resized/images/0xd8df8225474e38f1034448afeee0bdcb2888f7ea09ef5f280317cf2c8a3be2f804b0e36fe5769c1f20de3de5b87e174b7bac19807cc5f181938344d53326df7f.png +0 -0
  139. package/src/tests/data/flat_resized/images/0xde8990cc77d25bdc35d4c258113dc8243af7dfb5ce3a1b00ac2e656ce84ea06c1d2a0d9740787eb1dbcc70226f18a3eaf0e16f627d828ad56d22ebc3ffa8ec49.png +0 -0
  140. package/src/tests/data/flat_resized/images/0xdf36bf20893c56da991a71f1244aaf032cf938334ce4645a856e96a2170508e5ba6b74948f43314eda7782e1169051e4ee1b276b9b8a048e08068f4d3af3e55a.png +0 -0
  141. package/src/tests/data/flat_resized/images/0xe8198b8b0e5c51c576f50853c448467a55e33005cc185225a57849c63e84267c340d2d142d391955053ebe14b0322550480341468cf5e9fcaedbf73873e9b245.png +0 -0
  142. package/src/tests/data/flat_resized/images/0xe94dcbd223afb4dfc9fb7f04095114ce611e6acb5b34384aef88728ab85dd30dcd8581bab1b66e0c6c370e75d03d7f8ac222eacb25d211f91a805ef63099fe3c.png +0 -0
  143. package/src/tests/data/flat_resized/images/0xeeeb9ef59478b2dada8acea00d7d3de0f163de5f8beea5128808fd43e616f89312476541912e0e1b29881bd58f28713bd3ebae0fbd29e0b3fb60ff310386b808.png +0 -0
  144. package/src/tests/data/flat_resized/images/0xef422469bc366be01145782e49c5b31a6c58f7d3945291c374a4e23196686121639c2fef9e7f967b37a958fda67cce10e92fc927f6c32b0f0f0ceeaea31ae0ad.png +0 -0
  145. package/src/tests/data/flat_resized/images/0xf17c8e32e5ab57f059d1c9478d2891d9354673608e8c0826d2e488807ae869a63721bf7be34855ba555f36fc9d722e4f1f78033a4996fe3562328f93c0bd88e4.png +0 -0
  146. package/src/tests/data/flat_resized/images/0xf5fe66c66f4b33e003096b4bb2c5d0ca52638b5ae4dab7b5e5925bb56c1393feb68f2552320883ba54debf91c400be7d9e6727c020bab1d07738d269f0793bcf.png +0 -0
  147. package/src/tests/data/flat_resized/images/0xf9ce625ee02e278eff475f7920b6fa7617c7078ed61e9ec50375fd47acb0c1aaeda231a779d0b76fb22a5a4e618779a70bff135bf02ebc8b68739d1fad67134c.png +0 -0
  148. /package/src/tests/data/flat/images/{0xd9a3fba1abef24113643624d098e580808ec3952b9eda9dc5f8f1b63afa5401849c4457eb3fb1ddb17a7aa8d24e5cb54a2daafff84426177ecafccbb865770ef.jpeg → 0x05091030b0194cf5a1b059e5674588fa62f8fcc95d2c37b8a00363822da00c9e.jpeg} +0 -0
  149. /package/src/tests/data/flat/images/{0x65341641633dd9baa7bb44fab08b9edd6610db285dcdc887c46221af8623711ce2b546a79743ce7240d783f2e9008751ab82cf2f8341e321b6b887b00a13ef85.png → 0x082fb46c767ea3b1e9bfe53fa64e7a3e84847bd0d605bffadb426cdc08abef4f.png} +0 -0
  150. /package/src/tests/data/flat/images/{0x1e72b814d54da74f13a5bdc56629dd0e9c6a33ac193870b3560194cff405c0c0dee3165ef4cd41cd6251df3024ac743ef8f1548a85861bc3ba680734f9ea3269.png → 0x0a35888b9b2b8647188d332ca7df5b8bbe589c1c7705939ca2fb0ee2ca3477da.png} +0 -0
  151. /package/src/tests/data/flat/images/{0xc2594429d72436068dfa5902593658843b3908eddfed9b83f5f0ecebce181278a07f35b443832d5f65ee31f9e4624155d3c729ebbc49c2f950e01348860c12c1.png → 0x0b0050d61e94d8ec34894f026f367e2c6ba3635f1c9bac048080ce2bf67266e7.png} +0 -0
  152. /package/src/tests/data/flat/images/{0xefe4b1ba734f887e3ce2776110eab7a0d6ae7c6d74e08194be9374c1ff1a4cddd8993dc43e5cf4b6d256dc1156f3b26ceaec9182b98b8b11cfa3c8c3bb1dc8ca.png → 0x10e3ae57c9add1e684fe57389333d7d6223f1fdf5822b6ea406bcffc0b351e08.png} +0 -0
  153. /package/src/tests/data/flat/images/{0x75b79fc445b2bd17231b4f0dc170b646b14d2f732c0236b1bbef10876923ea02ecadd6aabb08ded4f70ba6a96d8789a3131e70a0d79b2644a266f1cfb5821a88.png → 0x131e0d0227ac2e907a12a25ddc6ef0604a44b77b4c588bfc4fb63794a513df83.png} +0 -0
  154. /package/src/tests/data/flat/images/{0x1038adbe1bc5ffb5e1f180ce9fa5f727a02a43d950ba630d0a3003c95aa67609cbce9121428095180fb0442aa52b8eb4c9af3ab4497db072919e6fe65e70682b.png → 0x1640d68939038ebab7cb0e94302b8b3d4128be793f4170aba447e78fcf40c971.png} +0 -0
  155. /package/src/tests/data/flat/images/{0xe6e6e36125ae28553d26600090be932511ae21fb6f0029485111dec2cd9c55ed1d568536e6125debb62481075c700e12cc6a3994d1846318a420cd616f82593d.png → 0x174c3bf273178340e86f2924e9e039a7304c63976b6f7002425889d9e5d791b1.png} +0 -0
  156. /package/src/tests/data/flat/images/{0xf154d51d2999f623fc0f375a94d4d1e77d54ce4888d7af8e766b2ea5a02eed902bc56149bf348ee1a50bc2c9ab78d2c780f55b431db6ce4b23fe3b71a32ca641.png → 0x18ad206ff2308f7ab68309953afdd731291f041c419cad4d2325d1a5db79b8fe.png} +0 -0
  157. /package/src/tests/data/flat/images/{0x33a99c18c2794a36a0d524a76733a59d10743c04246263c8afe3ace1a96f73e40f964add43ec3d6d8efa9beeaa56eda6ece598fe1e3b520047b83886d6983a83.png → 0x1e52c506264d67ba391d284f5e4c658719c5fd103d127a106b19b1d0e9dc1d4f.png} +0 -0
  158. /package/src/tests/data/flat/images/{0x1f7c611483d586630dd7cc35b2114212b2a771e709dc3e05eaa400bf34c08f59e484e4cc63658c63cee63988ea1989896f1dcd2d9c5bbdfdab4b3710017bb5fd.png → 0x3631b988baf3a904a33fb2aa90ee5037c4948298d4fa7583f6b7fc0d3bcc7dbd.png} +0 -0
  159. /package/src/tests/data/flat/images/{0x2abca0559027978fdd6f4459745f13a4e2d10ac4f16e68dd1b4e236f19462b892d749cac2baf2d1a714b592593176e6309d192ce5363d7f4707c4e0aa6b18abb.png → 0x3823a951c0f734e2853c171ccb45ffef6cbabe2db8e44373481f798e9e54bed5.png} +0 -0
  160. /package/src/tests/data/flat/images/{0x686b4a49ecf931afd1b9c74e5a24c907b47f81d2a95579338e3949e8948da6ad3b79e8918d65b779e8bd306e7b7502463eabfc6fe94611c04a46030403d18102.png → 0x39af118a0e9275fef6233cc8cdb99c285358b1b9af696d6248e0952c08bfa155.png} +0 -0
  161. /package/src/tests/data/flat/images/{0x90b87fdaff3e58d32f85d941cad8ac08bf84e0b4fc5c95249e1cc9099dc4aae8271eb701ffcd7617ba886db35357f40b6eda18356c5cbf3894dd3b78d1a24b97.png → 0x3b8135d0b0807c82d287f78efd17a83236654d1fee99b9b05880e7fff0cebd49.png} +0 -0
  162. /package/src/tests/data/flat/images/{0x86df2da9d3e28bc5313bc1619e2127b538ef2bb08053c36e53a2ede6ba565d67aed2c65202fb180d578f7265d5b4d1c54a09f7e52b0afd12437699a9884642b7.png → 0x46a682c6f2dac118110e1d633caa577690e5428232f41c9ae4f7742f66349744.png} +0 -0
  163. /package/src/tests/data/flat/images/{0x860e81897a1b0204fb5edf3e2355e97990b25badfba7f5bb5632b16dd6da13592fc918a8784f7f4efd0550334479b604cb0a239dc58d83739eadc84fb879996f.png → 0x4ff56bb64db6bf8d2da9e0e41e899c0f29e4f857b55a0f3e6b0dd2b74ab2de0a.png} +0 -0
  164. /package/src/tests/data/flat/images/{0xebdd539eceb3ba21f5ab2f541641dcb11b7c1c2429dfddd2d880d874bbdf643949b7e976c82c0a531e2bebc1f4dadcd602dcb4d706d54527bcfe30a410c0d115.png → 0x594b242ce43c66d60925a55781bdee393877bca20d7c1454a406060151918e3f.png} +0 -0
  165. /package/src/tests/data/flat/images/{0x7e9747cdd5678279cf005a57a65064080348ba230d63a3a134db327b83c05ace94338cda19002fcba60a18d6ad621477059417ae2e4518eb37655231823fc314.png → 0x5a46e6ea9c761583e2880a30471427c34ee765c763b8cccb7aa12dc3061bdd4b.png} +0 -0
  166. /package/src/tests/data/flat/images/{0x329e1e9223cc4747ff9c6306dc3affdbcceff0e629f19503ad548ca1a82da61d3781986cbd267b98f756f9bb2c8e7a879be5085028069eb3f380d5a32be81ed4.png → 0x5e5912ce314ced9343d9b3438cf686b6fe9e7e02389291e3e062f4262c20a528.png} +0 -0
  167. /package/src/tests/data/flat/images/{0xfeda2fa5da1b8b068baf09870cd4fd3a1ba01e14fc79e759c11e2c1a8ef7d75fc5cf49a86d06c94b371f30aec5c4afd1a4f583881fd62afc40cb012cd3d50b85.png → 0x5e66da18ea4507243b171dbda04feb58e569b667ebf00095f8a8df133cef6837.png} +0 -0
  168. /package/src/tests/data/flat/images/{0x615c5079cd4b29a062acbb916780720c0eeb91cd82d9c5f78c9a73ddda29d8842ff85a0d99e863405861d83fd275b78bcead4f61ca8edc3cb94e7093e0a134c7.png → 0x6268f9fe9033f65b6f44820c016a4691f5677f982d5531350c2d272bec1d6d60.png} +0 -0
  169. /package/src/tests/data/flat/images/{0x50c5e0685168371ad05ca4946ca1434b34769ad26dd9bb825ee504ab77260b3002ddf7a8d24474e94cdc18d5798bae7bac868336fb7c33193f9c86f77e949fba.png → 0x6393925c19adc0506341888868be75ce0c7824a6be39549ad236560440f21ba0.png} +0 -0
  170. /package/src/tests/data/flat/images/{0x494bc81803193093ac9b6c0c4a5f91dc24e85641718cc0f4c9f8778f488fb14c80b10ad03d4982adbb74f2b6157bf02d30e0a6874e53780c5657d90029331601.png → 0x643d46be074110da9f90353c6e7b77a2e2ecc844c517efc14899bcefc2f3cbb1.png} +0 -0
  171. /package/src/tests/data/flat/images/{0x4390534b3a60fbf35f456da7a0bd7c86652dbf33e2ba739b1610d5bbe008353113ceeedb68b0672fd74ad015812f02181c4e29ea9cd937a90f21e2514e79dbea.jpeg → 0x6ded34173b4d4f29142fdd267a757cbd67d7bf658b555a9715a7799a726d92df.jpeg} +0 -0
  172. /package/src/tests/data/flat/images/{0x20b2c989b9e8689d903490cc5cadafdf3a86a5d5e1445f42a8f77465ae659688a9cf2e3272f6c0d1945da26f1bcfcb6d21954c18c2bde806214e629d3b9d89a8.png → 0x7150126436c0e3e3d9c2b676c7df918aaf499897e040f2a4a2ecfa729356c656.png} +0 -0
  173. /package/src/tests/data/flat/images/{0x9e682c515b2e8aade0ddfde284ee2cbc61153807602b78476738a2a4842ffe2cc34ff481ad521146a55615877bf9e62655164499dfce41aa75416c192d06ecf6.png → 0x74d88f9681fcf9cd0e196c5ebd7a778a5535618d23ccd261c7bd621db7b3437a.png} +0 -0
  174. /package/src/tests/data/flat/images/{0x68b2d1f5c248de0eef95f94d9d2dac3c97c8a67f5a2516b50128ae384c7674c7c88fd4e646e9ce3a2e5514cc4b0b36f2078abc57fd1cec605642f8c5ad04e160.png → 0x75df5bfc506beaa5f10cf70814d7ca2982d548dd9862b08bc8239bdacb8efb8e.png} +0 -0
  175. /package/src/tests/data/flat/images/{0x4f6de6838022ac6d4c2cea1ab2f4471041c43d6bf765f249e96ddea235e96472041a8125daaadd728a7dc218535d92524f0c3335807807783034c27e3b743718.png → 0x76e8a46bb023a50ae572a0f2f0652bdbe91de396591f9b8113c591ee9167dcc6.png} +0 -0
  176. /package/src/tests/data/flat/images/{0xc5c2d1a2a27b758bba3551b96153c8e8fbf8122fd2b78584b23930ce885ff980ffb35cd23829ed3b3a4c3ec9472f3949bf9faeace92addcb9fa23bf87b105e0d.png → 0x7c90aa44660f9168c25b66260ecc97c6e7e59aa48b629c6849a091c10e82d718.png} +0 -0
  177. /package/src/tests/data/flat/images/{0xea764f65041a907eba37761807cd24ca38fa16517ca4bf25a114609bcc343e48da350efbca1f676337f8e251f8b3a35be8a28a4488db9280ec79de251ffb25c1.png → 0x7ed3f3a320b39157eaeee4b88faf436d95a80b3d9eff6582970dcd8c996976f4.png} +0 -0
  178. /package/src/tests/data/flat/images/{0xc8c98569e856f28f25783cc70ebfe249645107ed272b0ab0f83869c7686b255041d0b413755bf58cf1e0c3eaa0b89e5b55100eaeb715ed7a83c6ae289223535a.png → 0x822c948e5635f97ba2a87680afee04b034a35af7aa095c19753b591a39a3846b.png} +0 -0
  179. /package/src/tests/data/flat/images/{0x53e69925b5e8dfb60c07e5dfc44742474f5004428e6f3cd8c8a3892ff86d2211cff97d6b0d4c50930786761117b17f579ca7c2d4379d7836c2435c657950b902.png → 0x854f011e0f856ee1c4ffa705e259da6f4edbd18366de86e68be4163777455499.png} +0 -0
  180. /package/src/tests/data/flat/images/{0xb1842196f070d2a608eac92ff489cd825f0d379ec0d02a4a736a58aea8035224e584b59dac99f7d27326791299989bbe3cdfbb9972c16d285afb6094639e7fee.png → 0x8c67000eeb4314aaebe9673d1d0da285cad28401be302edf029a504f1fdba4b5.png} +0 -0
  181. /package/src/tests/data/flat/images/{0x2a707f216df918ace936313a986faadf45141438f0d22953d1ccae7417a1a29b40bf5940a7355f035473dd5c75ef30127d8a057c1901d4f2d2950561b78b253d.png → 0x8f23eed845635dbca6eb323efaea55e5ddcd7c8fbb845b2dae7d762ccda9f437.png} +0 -0
  182. /package/src/tests/data/flat/images/{0xebf84491d7b258e71d21e16b75f29163a2d5a20e6c5176d989c0ff3ff12ac3e9203193133ce222602c95cf574983fab2bb27b9e2f7b572c870f91a3bf17e5eb7.jpeg → 0x96e336b3a736566736ef4a2cb2f71f31492de08010f5d4d071c7a4d16a911e55.jpeg} +0 -0
  183. /package/src/tests/data/flat/images/{0x42b08dc541114729b85ef41bb07755c8cc9fc635055bda4e8e6d80b6ee43c3d5f702bd76ba2e6abf45f4d9bba2a070c2d3dd76205f7189539b55a95f2e928ece.jpeg → 0x9b3fb6bf7cfc0ca8e6715bdc23a41fa4a6eaa1cc2e08363051ab4cb18e8326bb.jpeg} +0 -0
  184. /package/src/tests/data/flat/images/{0x54ca27391394ad7b5c98c5d9a3875e4527d33dd0a1ba72401e39991e4093837a52d7f936c619722fd7ce602cda7cbe89c01b0c3b526a3dd61bcfb60b364951d7.png → 0xa020771c955e2ee507d55b962f1f233d2f9f1768f390a9280c28d25d8f2d567a.png} +0 -0
  185. /package/src/tests/data/flat/images/{0x8384c8c5bce81541dd0fb19f2f573964cf318dab654f2792af5656073c1bc22bbe6e73e81e9f6cd9244bd1f7262160854c648683f6cfe3b14f751ba716f511fb.png → 0xa4b7edf9324173eaede105dfa66175be48340eefad9d139595c97ff999a188b8.png} +0 -0
  186. /package/src/tests/data/flat/images/{0x6e63ab048e72fd41aa59b1434a5b95f1eb2099438ef0a171db1226cde3cda867b99e021d8628c70bedec891ce5bf0e88c302770808f069813a73d77b1771b433.png → 0xa523158bea4556c82b25dee7915f25389f6e11d79666a0f9987ff45755ba87be.png} +0 -0
  187. /package/src/tests/data/flat/images/{0x647083b9336b47b04310e52dc5e370f64ba2bf2f78bd66196af880acd4ea1f8a132a1f8ed25be2a796d43dc40fd151548387ab4de6823758cf774cb619819be0.png → 0xa6e0837a126dafc677bb0e18614220fb633fc034e1fd9c6ebf5db1c2f03bf6e8.png} +0 -0
  188. /package/src/tests/data/flat/images/{0xd76617a835930389357f28b5d7243bd25aeb45aaaf2257e249a8827bc12222a021b0cf46bb69d408fa7770f79aa0a1cbb28b0ca4438e7fc44b4f73d3b6260a38.jpeg → 0xabaebe0601780f717be6fd6166ea1f5d5c3d14d69b72e82b2680bf8790d81d70.jpeg} +0 -0
  189. /package/src/tests/data/flat/images/{0xf91877c76deba75bc5760238f61e77806a8486d1a6b09bab13e13c08de8b2cfd74a0f22057064cca459ee64be44be4301de887a72fc1c4c31acc9a02f14a345c.png → 0xaecf0481063fcb4b4bfba3dc3eee86e5686ddb763885f309551a5316f3579adb.png} +0 -0
  190. /package/src/tests/data/flat/images/{0xb313323422cb06c93b37309d097869de24ff74146c2693bb5a0df5e7d26c5d8fa502bd98f0f4905ccfd00b66299f25d0ecf18b25b9b715a1bada9c3442b2ebc0.jpeg → 0xbe18f40b90e0cdd9dda77b7ca3bd14a29cc85b57241b104a34db3442064fb3c0.jpeg} +0 -0
  191. /package/src/tests/data/flat/images/{0x2e72dcae73dcd9347896d7c32d9674b885a0beac8ae9acc24eb23e3244a169f2d4b17a2958d24dc87be1e3ae1bfe73fe1b0748a4653a191630fb86f3b58bb4a9.png → 0xbe46849030260c39eef1cf2c5fd3855bef597d46049216851bdaf47efab43664.png} +0 -0
  192. /package/src/tests/data/flat/images/{0xbc0568a00d104800cc8732cda70e154cc71fe2a890d84a593071685f63b1af89ebb74736752750c0ad385ce0e2fd4acd808d2eeb18f4c5ad0d0f1eee1d57351a.png → 0xbfeed6b56cead71f853859b934d769767832af9344003c0685759caa79665aec.png} +0 -0
  193. /package/src/tests/data/flat/images/{0x46f2eb852f938dfd0b879a93c8098931186ecacae49a2821e4c43fade1660030bdf03938caa278a9acc78dd1751c467c857a7689c659508933010034be01be7d.png → 0xc1500e538df7e2fa287fe006c1b41c0b4ba4048ef58cb93926c3ff6f8e0e4f39.png} +0 -0
  194. /package/src/tests/data/flat/images/{0x93db31c0522148040443c135d25abc6e3deb37578e4a14d6dd8c7000e0ea6d69c78840e069784ee6e9f2d3524c78c33264a3f8e93eef343942ae7e15d1ba720c.png → 0xc2d03a53ff057f5a2c6f46ca830c5f8a233fb9a3ee561578b83c89cf09c1f8b1.png} +0 -0
  195. /package/src/tests/data/flat/images/{0xc6c918e59541d4013e41f40937290f10d6485b8c630e0ec3d0c903c85dc30dde523270df43a74bd75e966ee02bdafce588fae7a2f73c00545a27e84e1ce1b396.png → 0xcc8601fced686065c4673cc1375a1bf7b6e06ffeab3d4db9495fb55702df41c4.png} +0 -0
  196. /package/src/tests/data/flat/images/{0xc12ed6e8c7b674a8e6bdd0042b9a0debc8c16973195072f833b205ca7635b9d0f2da04a225347f7234f9d23ac4e579c00817a24657e06447158ed4420da47749.png → 0xce9358701f9095fd68bbdf75c961032a18b1d5bad288d99988a3e9848359a2d0.png} +0 -0
  197. /package/src/tests/data/flat/images/{0xfa48acf1439c2537d1d3268796dfec0777e605c87b5092be55cbaeb1318782c6761de8d01951c99cd28a61ebc353ab6ab18de1dc6977dfc406ac1d8649a5bcfa.png → 0xd49a0f5a57584806e9f96e950039b72e762253d46d3767d442fc19e5c7c62d1f.png} +0 -0
  198. /package/src/tests/data/flat/images/{0x3992f2d799a25f4ce8e5177fa8df1d76f5afc33cc1738677d5f660ee11c963303926f6d9cd634755f0bb57a9bd0d15073a8fbe3543f569e26a34100b705ef161.png → 0xd5cf2919b366879fe33306ba7bd3486a0a92b2d0ef67965c2b0c3338c1c62817.png} +0 -0
  199. /package/src/tests/data/flat/images/{0x5442346936e3ce8d1b4e78f4c60e64e79b4e92b59877055557a01639643eb933f26b3e8d588361688a2f6a0c66558f06f2615028271af1eedfa66fd90b63a91b.jpeg → 0xdec3aa6053d6699b9a6ecd5de081940f0f197ed848a42ccd828e89f941235926.jpeg} +0 -0
  200. /package/src/tests/data/flat/images/{0xfec746312e0fcb2631eb0486a3ed88e35ba95737aadef55aa95cdcdec9fc1a3276eb2de555bbc4f467b8c900b53581a3375390064afd9c9634a45978ebb5bd3e.png → 0xe269a4d7a2257412f3cd89a3a35c086ae23205db4559a2c91aef41a7e05b5e57.png} +0 -0
  201. /package/src/tests/data/flat/images/{0xab7bd3f47ed451578ada004482674ded11a4fac2297552b0e214eb1fe24cdd3355763a7d983b8b8d34197266aa5c2cb1c32382699d8ba7b98a42358c67009649.png → 0xe2831f9d30fdfe311369a2f02bff50622b8d0fe2bd3d6b8a01baef9e6e3f6af9.png} +0 -0
  202. /package/src/tests/data/flat/images/{0xacaa0f9c8d9bb6660c5047db2e09e2b35e567fa193db03ba32eb62ea4d27d736d61246f1949f64de111d222abc3f84ac400af013da1115140743ce7dce571dea.png → 0xe61857c06704ff95175ad8659abbbed617dc832b3390669754ef07fcaa98a597.png} +0 -0
  203. /package/src/tests/data/flat/images/{0x48bb86605fcd86ad2f471746d200bdf4124dad0db82066e4624ec57921ad743b750de21504f3979e33c7261dc8f54a6c84eab6308e5752b74096b12b6dde629d.png → 0xef8fb6ba0c9849f6b462326129bd82e0d22aaf41f195492573aa0e75c7303568.png} +0 -0
  204. /package/src/tests/data/flat/images/{0x5ebabefb53c4d07cd1ec002547f452ec6053840dcc28b2e507364c5307a28cbc3d9698a24f09ed01985aa290da3acd4d86aea2f9f53753f0bcca994953e474eb.png → 0xefe80829c296bbe390dde416b6fea2d2b53410c6cffd65000efbe22cb77dde54.png} +0 -0
  205. /package/src/tests/data/flat/images/{0x69fe4e2faf45b992867f5fcc7be8aea91b332b4769affa4c081264d3a72ea180d9fbe4aac4048cab7413f8e8167565c694e0f9d9d602b24871103c932ecb326a.jpeg → 0xfa36fecae98675524d19650a9331bc53d55a2ea885eb2748fb9841afbf837f84.jpeg} +0 -0
  206. /package/src/tests/data/flat/images/{0x76521ba228624fe9522c8e2d83a1968346e9fab7228446b9f2971064e1992decaba658c11b4bad4767ddeb16e46689270a923b4cf42744d6e1130c86993cc285.png → 0xfb3d323f655c0f322bbcd5acc8a62978b33e2f17e2593a3b9e9f690485ae70ec.png} +0 -0
  207. /package/src/tests/data/flat/images/{0xe88a72fb70a000b24a73bc781ecc8b0ef0e66779346067f467722438266e0177a2bbc94be1ff3e0282c7484a13869e22ae8bc184590a4b59106ebc234806b243.jpeg → 0xfe059081c9d82baef2228ca0ae2d24fefff834e8e168f7b5dc8b45ec4ebcb81d.jpeg} +0 -0
@@ -1,4 +1,5 @@
1
1
  import fs from "node:fs";
2
+ import os from "node:os";
2
3
  import path from "node:path";
3
4
  // Copyright 2021-2026 Prosopo (UK) Ltd.
4
5
  //
@@ -15,9 +16,8 @@ import path from "node:path";
15
16
  // limitations under the License.
16
17
  import { CaptchasContainerSchema, DataSchema } from "@prosopo/types";
17
18
  import { hexHash } from "@prosopo/util-crypto";
18
- import { getRootDir, getTestResultsDir } from "@prosopo/workspace";
19
19
  import sharp from "sharp";
20
- import { afterAll, beforeAll, describe, test } from "vitest";
20
+ import { afterAll, beforeAll, describe, expect, test } from "vitest";
21
21
  import { Flatten } from "../commands/flatten.js";
22
22
  import { GenerateV1 } from "../commands/generateV1.js";
23
23
  import { GenerateV2 } from "../commands/generateV2.js";
@@ -25,35 +25,59 @@ import { Labels } from "../commands/labels.js";
25
25
  import { Relocate } from "../commands/relocate.js";
26
26
  import { Resize } from "../commands/resize.js";
27
27
  import {
28
+ REPO_DIR,
29
+ REPO_PLACEHOLDER,
28
30
  captchasEqFs,
29
31
  fsEq,
30
32
  fsWalk,
31
- restoreRepoDir,
33
+ readJson,
32
34
  substituteRepoDir,
33
35
  } from "./utils.js";
34
36
 
37
+ const IMAGE_PROCESSING_TIMEOUT_MS = 120_000;
38
+
35
39
  describe("dataset commands", () => {
36
- const pkgDir = path.relative(getRootDir(), __dirname);
37
- const pkgInternalPath = pkgDir.replace(`${__dirname}/`, "");
38
- const testResultsDir = `${getTestResultsDir()}/${pkgInternalPath}`;
40
+ const fixturesDir = `${__dirname}/data`;
41
+ // Where the fixtures' `${repo}` placeholder resolves to, i.e. how a
42
+ // command's output paths must read to match the checked-in fixture.
43
+ const fixturePathInRepo = (fixture: string): string =>
44
+ path.relative(REPO_DIR, `${fixturesDir}/${fixture}`);
45
+ let tmpDir: string;
46
+ let testResultsDir: string;
47
+ let resolvedFixturesDir: string;
48
+
49
+ const resolvedFixture = (fixture: string): string =>
50
+ substituteRepoDir(
51
+ `${fixturesDir}/${fixture}`,
52
+ `${resolvedFixturesDir}/${fixture}`,
53
+ );
54
+
55
+ // The command wrote absolute paths under `outputDir`; the fixture holds the
56
+ // same files under `${repo}/<fixture dir>`.
57
+ const expectDataJsonMatchesFixture = (
58
+ outputDir: string,
59
+ fixture: string,
60
+ ): void => {
61
+ const actual = readJson(`${outputDir}/data.json`, [
62
+ fs.realpathSync(outputDir),
63
+ `${REPO_PLACEHOLDER}/${fixturePathInRepo(path.dirname(fixture))}`,
64
+ ]);
65
+ expect(actual).toEqual(readJson(`${fixturesDir}/${fixture}`));
66
+ };
39
67
 
40
68
  beforeAll(() => {
41
- // substitute the repo path in the data for tests
42
- substituteRepoDir();
43
- fs.mkdirSync(`${testResultsDir}`, { recursive: true });
69
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "datasets-fs-test-"));
70
+ testResultsDir = `${tmpDir}/results`;
71
+ resolvedFixturesDir = `${tmpDir}/fixtures`;
72
+ fs.mkdirSync(testResultsDir, { recursive: true });
44
73
  });
45
74
 
46
75
  afterAll(() => {
47
- // restore repo path back to placeholder
48
- restoreRepoDir();
49
- // remove test results
50
- if (fs.existsSync(`${testResultsDir}`)) {
51
- fs.rmdirSync(`${testResultsDir}`, { recursive: true });
52
- }
76
+ fs.rmSync(tmpDir, { recursive: true, force: true });
53
77
  });
54
78
 
55
79
  test("labels", async () => {
56
- const input = `${__dirname}/data/flat_resized/data.json`;
80
+ const input = resolvedFixture("flat_resized/data.json");
57
81
  const output = `${testResultsDir}/labels.json`;
58
82
  const labels = new Labels();
59
83
  labels.logger.setLogLevel("error");
@@ -61,101 +85,106 @@ describe("dataset commands", () => {
61
85
  input,
62
86
  output,
63
87
  });
64
- // make sure the results are the same as the expected results
65
- fsEq(output, `${__dirname}/data/flat_resized/labels.json`);
88
+ expect(readJson(output)).toEqual(
89
+ readJson(`${fixturesDir}/flat_resized/labels.json`),
90
+ );
66
91
 
67
92
  // make sure there's one class per hierarchical directory
68
93
  const content = fs.readFileSync(output).toString();
69
94
  const labelsJson = JSON.parse(content.toString());
70
95
  const foundLabels = labelsJson.labels as string[];
71
- const categories = fs.readdirSync(`${__dirname}/data/hierarchical`);
96
+ const categories = fs.readdirSync(`${fixturesDir}/hierarchical`);
72
97
  if (JSON.stringify(foundLabels) !== JSON.stringify(categories)) {
73
98
  throw new Error(`expected ${categories} but found ${foundLabels}`);
74
99
  }
75
100
  });
76
101
 
77
- test("generate v2", async () => {
78
- const input = `${__dirname}/data/flat_resized/data.json`;
79
- const output = `${testResultsDir}/captchas_v2.json`;
80
- const minIncorrect = 1;
81
- const minCorrect = 1;
82
- const minLabelled = 2;
83
- const maxLabelled = 7;
84
- const generate = new GenerateV2();
85
- generate.logger.setLogLevel("error");
86
- await generate.exec({
87
- labelled: input,
88
- unlabelled: input,
89
- overwrite: true,
90
- output,
91
- count: 100,
92
- seed: 0,
93
- minIncorrect,
94
- minCorrect,
95
- minLabelled,
96
- maxLabelled,
97
- allowDuplicates: true,
98
- });
99
- // make sure the results are the same as the expected results
100
- if (
101
- !captchasEqFs(output, `${__dirname}/data/flat_resized/captchas_v2.json`)
102
- ) {
103
- throw new Error("captchas not equal");
104
- }
105
-
106
- // test that the solutions array and unlabelled array per captcha never conflict
107
- const content = fs.readFileSync(output).toString();
108
- const captchasJson = JSON.parse(content.toString());
109
- const captchas = CaptchasContainerSchema.parse(captchasJson);
110
- for (const captcha of captchas.captchas) {
111
- const solutions = captcha.solution;
112
- const unlabelled = captcha.unlabelled;
113
- // both should not be undefined
114
- if (solutions === undefined || unlabelled === undefined) {
115
- console.log(captcha);
116
- throw new Error("solutions or unlabelled array is undefined");
102
+ test(
103
+ "generate v2",
104
+ async () => {
105
+ const input = resolvedFixture("flat_resized/data.json");
106
+ const output = `${testResultsDir}/captchas_v2.json`;
107
+ const minIncorrect = 1;
108
+ const minCorrect = 1;
109
+ const minLabelled = 2;
110
+ const maxLabelled = 7;
111
+ const generate = new GenerateV2();
112
+ generate.logger.setLogLevel("error");
113
+ await generate.exec({
114
+ labelled: input,
115
+ unlabelled: input,
116
+ overwrite: true,
117
+ output,
118
+ count: 100,
119
+ seed: 0,
120
+ minIncorrect,
121
+ minCorrect,
122
+ minLabelled,
123
+ maxLabelled,
124
+ allowDuplicates: true,
125
+ });
126
+ // make sure the results are the same as the expected results
127
+ if (
128
+ !captchasEqFs(output, resolvedFixture("flat_resized/captchas_v2.json"))
129
+ ) {
130
+ throw new Error("captchas not equal");
117
131
  }
118
- for (const solution of solutions) {
119
- // solution should not be in unlabelled
120
- if (unlabelled.includes(solution)) {
121
- throw new Error(`solution ${solution} is also in unlabelled array`);
132
+
133
+ // test that the solutions array and unlabelled array per captcha never conflict
134
+ const content = fs.readFileSync(output).toString();
135
+ const captchasJson = JSON.parse(content.toString());
136
+ const captchas = CaptchasContainerSchema.parse(captchasJson);
137
+ for (const captcha of captchas.captchas) {
138
+ const solutions = captcha.solution;
139
+ const unlabelled = captcha.unlabelled;
140
+ // both should not be undefined
141
+ if (solutions === undefined || unlabelled === undefined) {
142
+ console.log(captcha);
143
+ throw new Error("solutions or unlabelled array is undefined");
144
+ }
145
+ for (const solution of solutions) {
146
+ // solution should not be in unlabelled
147
+ if (unlabelled.includes(solution)) {
148
+ throw new Error(`solution ${solution} is also in unlabelled array`);
149
+ }
150
+ }
151
+ // check the correct, incorrect, labelled and unlabelled distribution
152
+ const nCorrect = solutions.length;
153
+ const nUnlabelled = unlabelled.length;
154
+ const nIncorrect = 9 - nCorrect - nUnlabelled;
155
+ const nLabelled = nCorrect + nIncorrect;
156
+ if (nCorrect < minCorrect) {
157
+ throw new Error(
158
+ `expected at least ${minCorrect} correct but found ${nCorrect}`,
159
+ );
160
+ }
161
+ if (nIncorrect < minIncorrect) {
162
+ throw new Error(
163
+ `expected at least ${minIncorrect} incorrect but found ${nIncorrect}`,
164
+ );
165
+ }
166
+ if (nLabelled < minLabelled) {
167
+ throw new Error(
168
+ `expected at least ${minLabelled} labelled but found ${nLabelled}`,
169
+ );
170
+ }
171
+ if (nLabelled > maxLabelled) {
172
+ throw new Error(
173
+ `expected at most ${maxLabelled} labelled but found ${nLabelled}`,
174
+ );
175
+ }
176
+ if (nUnlabelled !== 9 - nLabelled) {
177
+ throw new Error(
178
+ `expected ${9 - nLabelled} unlabelled but found ${nUnlabelled}`,
179
+ );
122
180
  }
123
181
  }
124
- // check the correct, incorrect, labelled and unlabelled distribution
125
- const nCorrect = solutions.length;
126
- const nUnlabelled = unlabelled.length;
127
- const nIncorrect = 9 - nCorrect - nUnlabelled;
128
- const nLabelled = nCorrect + nIncorrect;
129
- if (nCorrect < minCorrect) {
130
- throw new Error(
131
- `expected at least ${minCorrect} correct but found ${nCorrect}`,
132
- );
133
- }
134
- if (nIncorrect < minIncorrect) {
135
- throw new Error(
136
- `expected at least ${minIncorrect} incorrect but found ${nIncorrect}`,
137
- );
138
- }
139
- if (nLabelled < minLabelled) {
140
- throw new Error(
141
- `expected at least ${minLabelled} labelled but found ${nLabelled}`,
142
- );
143
- }
144
- if (nLabelled > maxLabelled) {
145
- throw new Error(
146
- `expected at most ${maxLabelled} labelled but found ${nLabelled}`,
147
- );
148
- }
149
- if (nUnlabelled !== 9 - nLabelled) {
150
- throw new Error(
151
- `expected ${9 - nLabelled} unlabelled but found ${nUnlabelled}`,
152
- );
153
- }
154
- }
155
- });
182
+ },
183
+ IMAGE_PROCESSING_TIMEOUT_MS,
184
+ );
156
185
 
157
186
  test("generate v1", async () => {
158
- const input = `${__dirname}/data/flat_resized/data.json`;
187
+ const input = resolvedFixture("flat_resized/data.json");
159
188
  const output = `${testResultsDir}/captchas_v1.json`;
160
189
  const generate = new GenerateV1();
161
190
  generate.logger.setLogLevel("error");
@@ -173,49 +202,54 @@ describe("dataset commands", () => {
173
202
  });
174
203
  // make sure the results are the same as the expected results
175
204
  if (
176
- !captchasEqFs(output, `${__dirname}/data/flat_resized/captchas_v1.json`)
205
+ !captchasEqFs(output, resolvedFixture("flat_resized/captchas_v1.json"))
177
206
  ) {
178
207
  throw new Error("captchas not equal");
179
208
  }
180
209
  });
181
210
 
182
- test("resizes data", async () => {
183
- const input = `${__dirname}/data/flat/data.json`;
184
- const output = `${testResultsDir}/flat_resized`;
185
- const resize = new Resize();
186
- resize.logger.setLogLevel("error");
187
- await resize.exec({
188
- input,
189
- output,
190
- overwrite: true,
191
- square: true,
192
- size: 128,
193
- });
211
+ test(
212
+ "resizes data",
213
+ async () => {
214
+ const input = resolvedFixture("flat/data.json");
215
+ const output = `${testResultsDir}/flat_resized`;
216
+ const resize = new Resize();
217
+ resize.logger.setLogLevel("error");
218
+ await resize.exec({
219
+ input,
220
+ output,
221
+ overwrite: true,
222
+ square: true,
223
+ size: 128,
224
+ });
194
225
 
195
- // make sure the results are the same as the expected results
196
- const expected = `${__dirname}/data/flat_resized`;
197
- fsEq(output, expected);
226
+ expect(
227
+ fsEq(`${output}/images`, `${fixturesDir}/flat_resized/images`),
228
+ ).toBe(true);
229
+ expectDataJsonMatchesFixture(output, "flat_resized/data.json");
198
230
 
199
- // check data in resized dir is all 128x128
200
- for (const pth of fsWalk(output)) {
201
- // if pth is not img, ignore
202
- if (
203
- !pth.endsWith(".jpg") &&
204
- !pth.endsWith(".jpeg") &&
205
- !pth.endsWith(".png")
206
- ) {
207
- continue;
208
- }
209
- const image = sharp(pth);
210
- const metadata = await image.metadata();
211
- if (metadata.width !== 128 || metadata.height !== 128) {
212
- throw new Error(`image ${pth} is not 128x128`);
231
+ // check data in resized dir is all 128x128
232
+ for (const pth of fsWalk(output)) {
233
+ // if pth is not img, ignore
234
+ if (
235
+ !pth.endsWith(".jpg") &&
236
+ !pth.endsWith(".jpeg") &&
237
+ !pth.endsWith(".png")
238
+ ) {
239
+ continue;
240
+ }
241
+ const image = sharp(pth);
242
+ const metadata = await image.metadata();
243
+ if (metadata.width !== 128 || metadata.height !== 128) {
244
+ throw new Error(`image ${pth} is not 128x128`);
245
+ }
213
246
  }
214
- }
215
- });
247
+ },
248
+ IMAGE_PROCESSING_TIMEOUT_MS,
249
+ );
216
250
 
217
251
  test("relocates data", async () => {
218
- const input = `${__dirname}/data/flat_resized/data.json`;
252
+ const input = `${fixturesDir}/flat_resized/data.json`;
219
253
  const output = `${testResultsDir}/relocated_data.json`;
220
254
  const relocate = new Relocate();
221
255
  relocate.logger.setLogLevel("error");
@@ -224,118 +258,121 @@ describe("dataset commands", () => {
224
258
  output,
225
259
  overwrite: true,
226
260
  to: "newwebsite.com",
227
- from: "${repo}",
261
+ from: REPO_PLACEHOLDER,
228
262
  });
229
263
 
230
- // make sure the results are the same as the expected results
231
- const expected = `${__dirname}/data/flat_resized/relocated_data.json`;
232
- fsEq(output, expected);
264
+ expect(readJson(output)).toEqual(
265
+ readJson(`${fixturesDir}/flat_resized/relocated_data.json`),
266
+ );
233
267
  });
234
268
 
235
- test("flattens hierarchical data", async () => {
236
- const input = `${__dirname}/data/hierarchical`;
237
- const output = `${testResultsDir}/flat`;
238
- const flatten = new Flatten();
239
- flatten.logger.setLogLevel("error");
240
- await flatten.exec({
241
- input,
242
- output,
243
- overwrite: true,
244
- });
269
+ test(
270
+ "flattens hierarchical data",
271
+ async () => {
272
+ const input = `${fixturesDir}/hierarchical`;
273
+ const output = `${testResultsDir}/flat`;
274
+ const flatten = new Flatten();
275
+ flatten.logger.setLogLevel("error");
276
+ await flatten.exec({
277
+ input,
278
+ output,
279
+ overwrite: true,
280
+ });
245
281
 
246
- // make sure the results are the same as the expected results
247
- const expected = `${__dirname}/data/flat`;
248
- fsEq(output, expected);
282
+ expect(fsEq(`${output}/images`, `${fixturesDir}/flat/images`)).toBe(true);
283
+ expectDataJsonMatchesFixture(output, "flat/data.json");
249
284
 
250
- // read data json
251
- const content = fs.readFileSync(`${output}/data.json`).toString();
252
- const dataJson = JSON.parse(content.toString());
253
- const data = DataSchema.parse(dataJson);
285
+ // read data json
286
+ const content = fs.readFileSync(`${output}/data.json`).toString();
287
+ const dataJson = JSON.parse(content.toString());
288
+ const data = DataSchema.parse(dataJson);
254
289
 
255
- // check each image from the hierarchical data is in the flat data
256
- let hierCount = 0;
257
- for (const pth of fsWalk(input)) {
258
- // if pth is not img, ignore
259
- if (
260
- !pth.endsWith(".jpg") &&
261
- !pth.endsWith(".jpeg") &&
262
- !pth.endsWith(".png")
263
- ) {
264
- continue;
265
- }
266
- hierCount++;
267
- // get the category
268
- const category = pth.split("/").slice(-2)[0];
269
- const content = fs.readFileSync(pth);
270
- // check the image is in the flat data
271
- let name = "";
272
- for (const pth2 of fsWalk(output)) {
273
- // if pth2 is not file, ignore
274
- if (!fs.statSync(pth2).isFile()) {
290
+ // check each image from the hierarchical data is in the flat data
291
+ let hierCount = 0;
292
+ for (const pth of fsWalk(input)) {
293
+ // if pth is not img, ignore
294
+ if (
295
+ !pth.endsWith(".jpg") &&
296
+ !pth.endsWith(".jpeg") &&
297
+ !pth.endsWith(".png")
298
+ ) {
275
299
  continue;
276
300
  }
277
- const content2 = fs.readFileSync(pth2);
278
- if (content.equals(content2)) {
279
- const str = pth2.split("/").slice(-1)[0];
280
- if (str === undefined) {
281
- throw new Error(`unable to parse ${pth2}`);
301
+ hierCount++;
302
+ // get the category
303
+ const category = pth.split("/").slice(-2)[0];
304
+ const content = fs.readFileSync(pth);
305
+ // check the image is in the flat data
306
+ let name = "";
307
+ for (const pth2 of fsWalk(output)) {
308
+ // if pth2 is not file, ignore
309
+ if (!fs.statSync(pth2).isFile()) {
310
+ continue;
311
+ }
312
+ const content2 = fs.readFileSync(pth2);
313
+ if (content.equals(content2)) {
314
+ const str = pth2.split("/").slice(-1)[0];
315
+ if (str === undefined) {
316
+ throw new Error(`unable to parse ${pth2}`);
317
+ }
318
+ name = str;
319
+ break;
282
320
  }
283
- name = str;
284
- break;
285
321
  }
286
- }
287
322
 
288
- if (!name) {
289
- throw new Error(`unable to find image ${pth} in output`);
290
- }
291
- // check the image is in the data json
292
- const item = data.items.find((item) => {
293
- const name2 = item.data.split("/").slice(-1)[0];
294
- if (name2 !== name) {
295
- return false;
323
+ if (!name) {
324
+ throw new Error(`unable to find image ${pth} in output`);
325
+ }
326
+ // check the image is in the data json
327
+ const item = data.items.find((item) => {
328
+ const name2 = item.data.split("/").slice(-1)[0];
329
+ if (name2 !== name) {
330
+ return false;
331
+ }
332
+ return true;
333
+ });
334
+ if (item === undefined) {
335
+ throw new Error(`unable to find image ${pth} in data.json`);
336
+ }
337
+ // correct name, so check category
338
+ if (item.label !== category) {
339
+ throw new Error(`expected ${category} but found ${item.label}`);
340
+ }
341
+ // type should be image
342
+ if (item.type !== "image") {
343
+ throw new Error(`expected image type but found ${item.type}`);
344
+ }
345
+ // file name should be the hash
346
+ if (item.hash !== name.split(".")[0]) {
347
+ throw new Error(
348
+ `expected ${name.split(".")[0]} hash but found ${item.hash}`,
349
+ );
350
+ }
351
+ // hash should be the hash of the image content
352
+ const hash = hexHash(content);
353
+ if (item.hash !== hash) {
354
+ throw new Error(`expected ${hash} hash but found ${item.hash}`);
296
355
  }
297
- return true;
298
- });
299
- if (item === undefined) {
300
- throw new Error(`unable to find image ${pth} in data.json`);
301
- }
302
- // correct name, so check category
303
- if (item.label !== category) {
304
- throw new Error(`expected ${category} but found ${item.label}`);
305
- }
306
- // type should be image
307
- if (item.type !== "image") {
308
- throw new Error(`expected image type but found ${item.type}`);
309
- }
310
- // file name should be the hash
311
- if (item.hash !== name.split(".")[0]) {
312
- throw new Error(
313
- `expected ${name.split(".")[0]} hash but found ${item.hash}`,
314
- );
315
- }
316
- // hash should be the hash of the image content
317
- const hash = hexHash(content);
318
- if (item.hash !== hash) {
319
- throw new Error(`expected ${hash} hash but found ${item.hash}`);
320
356
  }
321
- }
322
357
 
323
- // count the number of images in the flat data
324
- let flatCount = 0;
325
- for (const pth of fsWalk(output)) {
326
- if (
327
- !pth.endsWith(".jpg") &&
328
- !pth.endsWith(".jpeg") &&
329
- !pth.endsWith(".png")
330
- ) {
331
- continue;
358
+ // count the number of images in the flat data
359
+ let flatCount = 0;
360
+ for (const pth of fsWalk(output)) {
361
+ if (
362
+ !pth.endsWith(".jpg") &&
363
+ !pth.endsWith(".jpeg") &&
364
+ !pth.endsWith(".png")
365
+ ) {
366
+ continue;
367
+ }
368
+ flatCount++;
332
369
  }
333
- flatCount++;
334
- }
335
370
 
336
- // check same number of images in flat data
337
- if (hierCount !== flatCount) {
338
- throw new Error(`expected ${hierCount} images but found ${flatCount}`);
339
- }
340
- });
371
+ // check same number of images in flat data
372
+ if (hierCount !== flatCount) {
373
+ throw new Error(`expected ${hierCount} images but found ${flatCount}`);
374
+ }
375
+ },
376
+ IMAGE_PROCESSING_TIMEOUT_MS,
377
+ );
341
378
  });
@@ -1,4 +1,5 @@
1
1
  import fs from "node:fs";
2
+ import path from "node:path";
2
3
  // Copyright 2021-2026 Prosopo (UK) Ltd.
3
4
  //
4
5
  // Licensed under the Apache License, Version 2.0 (the "License");
@@ -79,8 +80,7 @@ export const fsEq = (pth1: string, pth2: string) => {
79
80
 
80
81
  export const readDataJson = (pth: string) => {
81
82
  let content = fs.readFileSync(pth).toString();
82
- // TODO use getPaths() here to find the repo dir
83
- content = content.replaceAll("${repo}", `${__dirname}/../../../..`);
83
+ content = content.replaceAll(REPO_PLACEHOLDER, REPO_DIR);
84
84
  const dataJson = JSON.parse(content.toString());
85
85
  const data = DataSchema.parse(dataJson);
86
86
  return data;
@@ -123,30 +123,23 @@ export const captchasEq = (
123
123
  return true;
124
124
  };
125
125
 
126
- export const substituteRepoDir = () => {
127
- // read all json files in the test data dir
128
- for (const pth of fsWalk(`${__dirname}/data`)) {
129
- if (!pth.endsWith(".json")) {
130
- continue;
131
- }
132
- // make a backup of each file
133
- fs.copyFileSync(pth, `${pth}.bak`);
134
- // replace ${repo} with the path to the repo
135
- let content = fs.readFileSync(pth).toString();
136
- // TODO use getPaths() here to find the repo dir
137
- content = content.replaceAll("${repo}", `${__dirname}/../../../..`);
138
- // rewrite the file
139
- fs.writeFileSync(pth, content);
140
- }
126
+ export const REPO_PLACEHOLDER = "${repo}";
127
+ // TODO use getPaths() here to find the repo dir
128
+ export const REPO_DIR = path.resolve(__dirname, "../../../..");
129
+
130
+ // Fixture JSON refers to images as `${repo}/...`. Writes a copy of the fixture
131
+ // with the placeholder resolved, leaving the checked-in file untouched.
132
+ export const substituteRepoDir = (fixture: string, dest: string): string => {
133
+ const content = fs.readFileSync(fixture).toString();
134
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
135
+ fs.writeFileSync(dest, content.replaceAll(REPO_PLACEHOLDER, REPO_DIR));
136
+ return dest;
141
137
  };
142
138
 
143
- export const restoreRepoDir = () => {
144
- // read all json files in the test data dir
145
- for (const pth of fsWalk(`${__dirname}/data`)) {
146
- if (!pth.endsWith(".json")) {
147
- continue;
148
- }
149
- // restore the backup of each file
150
- fs.renameSync(`${pth}.bak`, pth);
139
+ export const readJson = (pth: string, replace?: [string, string]): unknown => {
140
+ let content = fs.readFileSync(pth).toString();
141
+ if (replace) {
142
+ content = content.replaceAll(replace[0], replace[1]);
151
143
  }
144
+ return JSON.parse(content);
152
145
  };
package/tsconfig.cjs.json CHANGED
@@ -28,9 +28,6 @@
28
28
  },
29
29
  {
30
30
  "path": "../util-crypto/tsconfig.cjs.json"
31
- },
32
- {
33
- "path": "../../dev/workspace/tsconfig.cjs.json"
34
31
  }
35
32
  ]
36
33
  }
package/tsconfig.json CHANGED
@@ -29,9 +29,6 @@
29
29
  },
30
30
  {
31
31
  "path": "../util-crypto"
32
- },
33
- {
34
- "path": "../../dev/workspace"
35
32
  }
36
33
  ]
37
34
  }