diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..7041a9f6 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2915 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@awmottaz/prettier-plugin-void-html': + specifier: ^1.6.1 + version: 1.6.1(prettier@3.3.3) + '@biomejs/biome': + specifier: 1.8.3 + version: 1.8.3 + '@prettier/plugin-php': + specifier: ^0.22.2 + version: 0.22.2(prettier@3.3.3) + '@prettier/plugin-xml': + specifier: ^3.4.1 + version: 3.4.1(prettier@3.3.3) + '@swc/cli': + specifier: ^0.4.0 + version: 0.4.0(@swc/core@1.7.10)(chokidar@3.6.0) + '@swc/core': + specifier: ^1.7.10 + version: 1.7.10 + '@zackad/prettier-plugin-twig': + specifier: ^0.8.0 + version: 0.8.0 + browserslist: + specifier: ^4.23.3 + version: 4.23.3 + fdir: + specifier: ^6.2.0 + version: 6.2.0(picomatch@4.0.2) + picomatch: + specifier: ^4.0.2 + version: 4.0.2 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + prettier-plugin-pkg: + specifier: ^0.18.1 + version: 0.18.1(prettier@3.3.3) + prettier-plugin-sh: + specifier: ^0.14.0 + version: 0.14.0(prettier@3.3.3) + sass: + specifier: ^1.77.8 + version: 1.77.8 + stylelint: + specifier: ^16.8.1 + version: 16.8.1(typescript@5.5.4) + stylelint-config-clean-order: + specifier: ^6.1.0 + version: 6.1.0(stylelint@16.8.1(typescript@5.5.4)) + stylelint-config-sass-guidelines: + specifier: ^12.0.0 + version: 12.0.0(postcss@8.4.41)(stylelint@16.8.1(typescript@5.5.4)) + stylelint-config-standard-scss: + specifier: ^13.1.0 + version: 13.1.0(postcss@8.4.41)(stylelint@16.8.1(typescript@5.5.4)) + stylelint-declaration-block-no-ignored-properties: + specifier: ^2.8.0 + version: 2.8.0(stylelint@16.8.1(typescript@5.5.4)) + stylelint-plugin-logical-css: + specifier: ^1.2.1 + version: 1.2.1(stylelint@16.8.1(typescript@5.5.4)) + typescript: + specifier: ^5.5.4 + version: 5.5.4 + vite: + specifier: ^5.4.0 + version: 5.4.0(@types/node@22.2.0)(sass@1.77.8) + +packages: + + '@awmottaz/prettier-plugin-void-html@1.6.1': + resolution: {integrity: sha512-fgU6NHZelQhrwO3ECTml8ca/SGpuWq+i7k1phUzj+l+jy5NmHcIkItzfmAC74+LBWt4EJQDPOfC8QgqwmhtYfA==} + engines: {node: '>=18.0.0'} + peerDependencies: + prettier: 3.0.0 - 3.3.x + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@1.8.3': + resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.8.3': + resolution: {integrity: sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.8.3': + resolution: {integrity: sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.8.3': + resolution: {integrity: sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.8.3': + resolution: {integrity: sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.8.3': + resolution: {integrity: sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.8.3': + resolution: {integrity: sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.8.3': + resolution: {integrity: sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.8.3': + resolution: {integrity: sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@csstools/css-parser-algorithms@2.7.1': + resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-tokenizer': ^2.4.1 + + '@csstools/css-tokenizer@2.4.1': + resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==} + engines: {node: ^14 || ^16 || >=18} + + '@csstools/media-query-list-parser@2.1.13': + resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.7.1 + '@csstools/css-tokenizer': ^2.4.1 + + '@csstools/selector-specificity@3.1.1': + resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.13 + + '@dual-bundle/import-meta-resolve@4.1.0': + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@mole-inc/bin-wrapper@8.0.1': + resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@prettier/plugin-php@0.22.2': + resolution: {integrity: sha512-md0+7tNbsP0oy+wIP3KZZc6fzx1k1jtWaMjOy/gM8yU9f2BDYEi+iHOc/UNPihYvPI28zFTbjvlhH4QXQjQwNg==} + peerDependencies: + prettier: ^3.0.0 + + '@prettier/plugin-xml@3.4.1': + resolution: {integrity: sha512-Uf/6/+9ez6z/IvZErgobZ2G9n1ybxF5BhCd7eMcKqfoWuOzzNUxBipNo3QAP8kRC1VD18TIo84no7LhqtyDcTg==} + peerDependencies: + prettier: ^3.0.0 + + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@stylistic/stylelint-plugin@2.1.3': + resolution: {integrity: sha512-/KUcqX36AbbUk7KvNuM0dWv2XSlPa1M12CPcC//eA4MNEFsZFl+2Kf8UZCLjlIWIrDNitd591vaVkXfOwUtsFQ==} + engines: {node: ^18.12 || >=20.9} + peerDependencies: + stylelint: ^16.0.2 + + '@swc/cli@0.4.0': + resolution: {integrity: sha512-4JdVrPtF/4rCMXp6Q1h5I6YkYZrCCcqod7Wk97ZQq7K8vNGzJUryBv4eHCvqx5sJOJBrbYm9fcswe1B0TygNoA==} + engines: {node: '>= 16.14.0'} + hasBin: true + peerDependencies: + '@swc/core': ^1.2.66 + chokidar: ^3.5.1 + peerDependenciesMeta: + chokidar: + optional: true + + '@swc/core-darwin-arm64@1.7.10': + resolution: {integrity: sha512-TYp4x/9w/C/yMU1olK5hTKq/Hi7BjG71UJ4V1U1WxI1JA3uokjQ/GoktDfmH5V5pX4dgGSOJwUe2RjoN8Z/XnA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.7.10': + resolution: {integrity: sha512-P3LJjAWh5yLc6p5IUwV5LgRfA3R1oDCZDMabYyb2BVQuJTD4MfegW9DhBcUUF5dhBLwq3191KpLVzE+dLTbiXw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.7.10': + resolution: {integrity: sha512-yGOFjE7w/akRTmqGY3FvWYrqbxO7OB2N2FHj2LO5HtzXflfoABb5RyRvdEquX+17J6mEpu4EwjYNraTD/WHIEQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.7.10': + resolution: {integrity: sha512-SPWsgWHfdWKKjLrYlvhxcdBJ7Ruy6crJbPoE9NfD95eJEjMnS2yZTqj2ChFsY737WeyhWYlHzgYhYOVCp83YwQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.7.10': + resolution: {integrity: sha512-PUi50bkNqnBL3Z/Zq6jSfwgN9A/taA6u2Zou0tjDJi7oVdpjdr7SxNgCGzMJ/nNg5D/IQn1opM1jktMvpsPAuQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.7.10': + resolution: {integrity: sha512-Sc+pY55gknCAmBQBR6DhlA7jZSxHaLSDb5Sevzi6DOFMXR79NpA6zWTNKwp1GK2AnRIkbAfvYLgOxS5uWTFVpg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.7.10': + resolution: {integrity: sha512-g5NKx2LXaGd0K26hmEts1Cvb7ptIvq3MHSgr6/D1tRPcDZw1Sp0dYsmyOv0ho4F5GOJyiCooG3oE9FXdb7jIpQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.7.10': + resolution: {integrity: sha512-plRIsOcfy9t9Q/ivm5DA7I0HaIvfAWPbI+bvVRrr3C/1K2CSqnqZJjEWOAmx2LiyipijNnEaFYuLBp0IkGuJpg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.7.10': + resolution: {integrity: sha512-GntrVNT23viHtbfzmlK8lfBiKeajH24GzbDT7qXhnoO20suUPcyYZxyvCb4gWM2zu8ZBTPHNlqfrNsriQCZ+lQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.7.10': + resolution: {integrity: sha512-uXIF8GuSappe1imm6Lf7pHGepfCBjDQlS+qTqvEGE0wZAsL1IVATK9P/cH/OCLfJXeQDTLeSYmrpwjtXNt46tQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.7.10': + resolution: {integrity: sha512-l0xrFwBQ9atizhmV94yC2nwcecTk/oftofwMNPiFMGe56dqdmi2ArHaTV3PCtMlgaUH6rGCehoRMt5OrCI1ktg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/node@22.2.0': + resolution: {integrity: sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@xml-tools/parser@1.0.11': + resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} + + '@zackad/prettier-plugin-twig@0.8.0': + resolution: {integrity: sha512-P9uo6zyefMeAQnmhWvWJEKuIaygJ/CLXBnjfTpvEVPEqsFLRI0scHPgGKY44E/vKi4aQCR6AuyT7BLVHDkN0Hw==} + engines: {node: '>=18'} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + bin-check@4.1.0: + resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==} + engines: {node: '>=4'} + + bin-version-check@5.1.0: + resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} + engines: {node: '>=12'} + + bin-version@6.0.0: + resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==} + engines: {node: '>=12'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chevrotain@7.1.1: + resolution: {integrity: sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-functions-list@3.2.2: + resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} + engines: {node: '>=12 || >=16'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + electron-to-chromium@1.5.6: + resolution: {integrity: sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + + ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + + ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fdir@6.2.0: + resolution: {integrity: sha512-9XaWcDl0riOX5j2kYfy0kKdg7skw3IY6kA4LFT8Tk2yF9UdrADUy8D6AJuBLtf7ISm/MksumwAHE3WVbMRyCLw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@9.0.0: + resolution: {integrity: sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==} + engines: {node: '>=18'} + + file-type@17.1.6: + resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + filename-reserved-regex@3.0.0: + resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + filenamify@5.1.1: + resolution: {integrity: sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==} + engines: {node: '>=12.20'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-versions@5.1.0: + resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} + engines: {node: '>=12'} + + flat-cache@5.0.0: + resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} + engines: {node: '>=18'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + known-css-properties@0.34.0: + resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linguist-languages@7.27.0: + resolution: {integrity: sha512-Wzx/22c5Jsv2ag+uKy+ITanGA5hzvBZngrNGDXLTC7ZjGM6FLCYGgomauTkxNJeP9of353OM0pWqngYA180xgw==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mvdan-sh@0.10.1: + resolution: {integrity: sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nice-napi@1.0.2: + resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} + os: ['!win32'] + + node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + hasBin: true + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + os-filter-obj@2.0.0: + resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} + engines: {node: '>=4'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + peek-readable@5.1.4: + resolution: {integrity: sha512-E7mY2VmKqw9jYuXrSWGHFuPCW2SLQenzXLF3amGaY6lXXg4/b3gj5HVM7h8ZjCO/nZS9ICs0Cz285+32FvNd/A==} + engines: {node: '>=14.16'} + + php-parser@3.1.5: + resolution: {integrity: sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + piscina@4.6.1: + resolution: {integrity: sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==} + + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.0: + resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-sorting@8.0.2: + resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} + peerDependencies: + postcss: ^8.4.20 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prettier-plugin-pkg@0.18.1: + resolution: {integrity: sha512-FuUxvsYZR/8rsLH8s/jbPQmgYvv0yxW8LoIHCy6+Q7p4FBjjdP3DNKx8fMTOsc0SlEB1skB4o1LcahRceIh87A==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + prettier: ^3.0.3 + + prettier-plugin-sh@0.14.0: + resolution: {integrity: sha512-hfXulj5+zEl/ulrO5kMuuTPKmXvOg0bnLHY1hKFNN/N+/903iZbNp8NyZBTsgI8dtkSgFfAEIQq0IQTyP1ZVFQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + prettier: ^3.0.3 + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + regexp-to-ast@0.5.0: + resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + sass@1.77.8: + resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + + semver-truncate@3.0.0: + resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} + engines: {node: '>=12'} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + sh-syntax@0.4.2: + resolution: {integrity: sha512-/l2UZ5fhGZLVZa16XQM9/Vq/hezGGbdHeVEA01uWjOL1+7Ek/gt6FquW0iKKws4a9AYPYvlz6RyVvjh3JxOteg==} + engines: {node: '>=16.0.0'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + + sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-outer@2.0.0: + resolution: {integrity: sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + strtok3@7.1.1: + resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} + engines: {node: '>=16'} + + style-search@0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + + stylelint-config-clean-order@6.1.0: + resolution: {integrity: sha512-Xe1U0stw57Evdcx+7q7XYAniyE7XAKv/bwfH9LcsFCcKTPZflzTiJLXGkQUsPMlA4cfMyxEebqm5bRN2doTD3w==} + peerDependencies: + stylelint: '>=14' + + stylelint-config-recommended-scss@14.1.0: + resolution: {integrity: sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==} + engines: {node: '>=18.12.0'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.6.1 + peerDependenciesMeta: + postcss: + optional: true + + stylelint-config-recommended@14.0.1: + resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-config-sass-guidelines@12.0.0: + resolution: {integrity: sha512-lGJml+QEVlU/nqI+awiQieyxXHkmuwhz4XsfUNkQVcNaPXBpLgefOHjZ7ZSmUm4y4YG8JhrvYNjYzUcTfe8cdg==} + engines: {node: '>=18.12.0'} + peerDependencies: + postcss: ^8.4.21 + stylelint: ^16.1.0 + + stylelint-config-standard-scss@13.1.0: + resolution: {integrity: sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA==} + engines: {node: '>=18.12.0'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.3.1 + peerDependenciesMeta: + postcss: + optional: true + + stylelint-config-standard@36.0.1: + resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-declaration-block-no-ignored-properties@2.8.0: + resolution: {integrity: sha512-Ws8Cav7Y+SPN0JsV407LrnNXWOrqGjxShf+37GBtnU/C58Syve9c0+I/xpLcFOosST3ternykn3Lp77f3ITnFw==} + engines: {node: '>=6'} + peerDependencies: + stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + stylelint-order@6.0.4: + resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 + + stylelint-plugin-logical-css@1.2.1: + resolution: {integrity: sha512-56r1xGVZ/ExZT5SFJ7AhyZVUjOvRTCbLLl68PFTN1R55KU0SQEe22YyE53570cxeTf9plpvqckHAQBiUU714YQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.0 + + stylelint-scss@6.5.0: + resolution: {integrity: sha512-yOnYlr71wrTPT3rYyUurgTj6Rw7JUtzsZQsiPEjvs+k/yqoYHdweqpw6XN/ARpxjAuvJpddoMUvV8aAIpvUwTg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.2 + + stylelint@16.8.1: + resolution: {integrity: sha512-O8aDyfdODSDNz/B3gW2HQ+8kv8pfhSu7ZR7xskQ93+vI6FhKKGUJMQ03Ydu+w3OvXXE0/u4hWU4hCPNOyld+OA==} + engines: {node: '>=18.12.0'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@3.0.0: + resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + + trim-repeated@2.0.0: + resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==} + engines: {node: '>=12'} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.13.0: + resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@5.4.0: + resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + +snapshots: + + '@awmottaz/prettier-plugin-void-html@1.6.1(prettier@3.3.3)': + dependencies: + prettier: 3.3.3 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@biomejs/biome@1.8.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.8.3 + '@biomejs/cli-darwin-x64': 1.8.3 + '@biomejs/cli-linux-arm64': 1.8.3 + '@biomejs/cli-linux-arm64-musl': 1.8.3 + '@biomejs/cli-linux-x64': 1.8.3 + '@biomejs/cli-linux-x64-musl': 1.8.3 + '@biomejs/cli-win32-arm64': 1.8.3 + '@biomejs/cli-win32-x64': 1.8.3 + + '@biomejs/cli-darwin-arm64@1.8.3': + optional: true + + '@biomejs/cli-darwin-x64@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64@1.8.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-x64@1.8.3': + optional: true + + '@biomejs/cli-win32-arm64@1.8.3': + optional: true + + '@biomejs/cli-win32-x64@1.8.3': + optional: true + + '@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/css-tokenizer@2.4.1': {} + + '@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + + '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.2)': + dependencies: + postcss-selector-parser: 6.1.2 + + '@dual-bundle/import-meta-resolve@4.1.0': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@mole-inc/bin-wrapper@8.0.1': + dependencies: + bin-check: 4.1.0 + bin-version-check: 5.1.0 + content-disposition: 0.5.4 + ext-name: 5.0.0 + file-type: 17.1.6 + filenamify: 5.1.1 + got: 11.8.6 + os-filter-obj: 2.0.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@prettier/plugin-php@0.22.2(prettier@3.3.3)': + dependencies: + linguist-languages: 7.27.0 + php-parser: 3.1.5 + prettier: 3.3.3 + + '@prettier/plugin-xml@3.4.1(prettier@3.3.3)': + dependencies: + '@xml-tools/parser': 1.0.11 + prettier: 3.3.3 + + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true + + '@rollup/rollup-android-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.20.0': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@stylistic/stylelint-plugin@2.1.3(stylelint@16.8.1(typescript@5.5.4))': + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + is-plain-object: 5.0.0 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + style-search: 0.1.0 + stylelint: 16.8.1(typescript@5.5.4) + + '@swc/cli@0.4.0(@swc/core@1.7.10)(chokidar@3.6.0)': + dependencies: + '@mole-inc/bin-wrapper': 8.0.1 + '@swc/core': 1.7.10 + '@swc/counter': 0.1.3 + commander: 8.3.0 + fast-glob: 3.3.2 + minimatch: 9.0.5 + piscina: 4.6.1 + semver: 7.6.3 + slash: 3.0.0 + source-map: 0.7.4 + optionalDependencies: + chokidar: 3.6.0 + + '@swc/core-darwin-arm64@1.7.10': + optional: true + + '@swc/core-darwin-x64@1.7.10': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.7.10': + optional: true + + '@swc/core-linux-arm64-gnu@1.7.10': + optional: true + + '@swc/core-linux-arm64-musl@1.7.10': + optional: true + + '@swc/core-linux-x64-gnu@1.7.10': + optional: true + + '@swc/core-linux-x64-musl@1.7.10': + optional: true + + '@swc/core-win32-arm64-msvc@1.7.10': + optional: true + + '@swc/core-win32-ia32-msvc@1.7.10': + optional: true + + '@swc/core-win32-x64-msvc@1.7.10': + optional: true + + '@swc/core@1.7.10': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.12 + optionalDependencies: + '@swc/core-darwin-arm64': 1.7.10 + '@swc/core-darwin-x64': 1.7.10 + '@swc/core-linux-arm-gnueabihf': 1.7.10 + '@swc/core-linux-arm64-gnu': 1.7.10 + '@swc/core-linux-arm64-musl': 1.7.10 + '@swc/core-linux-x64-gnu': 1.7.10 + '@swc/core-linux-x64-musl': 1.7.10 + '@swc/core-win32-arm64-msvc': 1.7.10 + '@swc/core-win32-ia32-msvc': 1.7.10 + '@swc/core-win32-x64-msvc': 1.7.10 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.12': + dependencies: + '@swc/counter': 0.1.3 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tokenizer/token@0.3.0': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.2.0 + '@types/responselike': 1.0.3 + + '@types/estree@1.0.5': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.2.0 + + '@types/node@22.2.0': + dependencies: + undici-types: 6.13.0 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.2.0 + + '@xml-tools/parser@1.0.11': + dependencies: + chevrotain: 7.1.1 + + '@zackad/prettier-plugin-twig@0.8.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + he: 1.2.0 + lodash: 4.17.21 + prettier: 3.3.3 + resolve: 1.22.8 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arch@2.2.0: {} + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + astral-regex@2.0.0: {} + + balanced-match@1.0.2: {} + + balanced-match@2.0.0: {} + + bin-check@4.1.0: + dependencies: + execa: 0.7.0 + executable: 4.1.1 + + bin-version-check@5.1.0: + dependencies: + bin-version: 6.0.0 + semver: 7.6.3 + semver-truncate: 3.0.0 + + bin-version@6.0.0: + dependencies: + execa: 5.1.1 + find-versions: 5.1.0 + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.6 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001651: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chevrotain@7.1.1: + dependencies: + regexp-to-ast: 0.5.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colord@2.9.3: {} + + commander@8.3.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + cosmiconfig@9.0.0(typescript@5.5.4): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.5.4 + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-functions-list@3.2.2: {} + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + cssesc@3.0.0: {} + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + defer-to-connect@2.0.1: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + electron-to-chromium@1.5.6: {} + + emoji-regex@8.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@5.0.0: {} + + execa@0.7.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + executable@4.1.1: + dependencies: + pify: 2.3.0 + + ext-list@2.2.2: + dependencies: + mime-db: 1.53.0 + + ext-name@5.0.0: + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-uri@3.0.1: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fdir@6.2.0(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@9.0.0: + dependencies: + flat-cache: 5.0.0 + + file-type@17.1.6: + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.1.1 + token-types: 5.0.1 + + filename-reserved-regex@3.0.0: {} + + filenamify@5.1.1: + dependencies: + filename-reserved-regex: 3.0.0 + strip-outer: 2.0.0 + trim-repeated: 2.0.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-versions@5.1.0: + dependencies: + semver-regex: 4.0.5 + + flat-cache@5.0.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-stream@3.0.0: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + + get-stream@6.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globjoin@0.1.4: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + html-tags@3.3.1: {} + + http-cache-semantics@4.1.1: {} + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + human-signals@2.1.0: {} + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immutable@4.3.7: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-object@5.0.0: {} + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + isexe@2.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + known-css-properties@0.34.0: {} + + lines-and-columns@1.2.4: {} + + linguist-languages@7.27.0: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + + lowercase-keys@2.0.0: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + mathml-tag-names@2.1.3: {} + + mdn-data@2.0.30: {} + + meow@13.2.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.53.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + ms@2.1.2: {} + + mvdan-sh@0.10.1: {} + + nanoid@3.3.7: {} + + nice-napi@1.0.2: + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.8.1 + optional: true + + node-addon-api@3.2.1: + optional: true + + node-gyp-build@4.8.1: + optional: true + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + npm-run-path@2.0.2: + dependencies: + path-key: 2.0.1 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + os-filter-obj@2.0.0: + dependencies: + arch: 2.2.0 + + p-cancelable@2.1.1: {} + + p-finally@1.0.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + peek-readable@5.1.4: {} + + php-parser@3.1.5: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@2.3.0: {} + + piscina@4.6.1: + optionalDependencies: + nice-napi: 1.0.2 + + postcss-media-query-parser@0.2.3: {} + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@7.0.0(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + + postcss-scss@4.0.9(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-sorting@8.0.2(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prettier-plugin-pkg@0.18.1(prettier@3.3.3): + dependencies: + prettier: 3.3.3 + + prettier-plugin-sh@0.14.0(prettier@3.3.3): + dependencies: + mvdan-sh: 0.10.1 + prettier: 3.3.3 + sh-syntax: 0.4.2 + + prettier@3.3.3: {} + + pseudomap@1.0.2: {} + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-web-to-node-stream@3.0.2: + dependencies: + readable-stream: 3.6.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + regexp-to-ast@0.5.0: {} + + require-from-string@2.0.2: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + reusify@1.0.4: {} + + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + sass@1.77.8: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.7 + source-map-js: 1.2.0 + + semver-regex@4.0.5: {} + + semver-truncate@3.0.0: + dependencies: + semver: 7.6.3 + + semver@7.6.3: {} + + sh-syntax@0.4.2: + dependencies: + tslib: 2.6.3 + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + sort-keys-length@1.0.1: + dependencies: + sort-keys: 1.1.2 + + sort-keys@1.1.2: + dependencies: + is-plain-obj: 1.1.0 + + source-map-js@1.2.0: {} + + source-map@0.7.4: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-eof@1.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-outer@2.0.0: {} + + strtok3@7.1.1: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.1.4 + + style-search@0.1.0: {} + + stylelint-config-clean-order@6.1.0(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + stylelint: 16.8.1(typescript@5.5.4) + stylelint-order: 6.0.4(stylelint@16.8.1(typescript@5.5.4)) + + stylelint-config-recommended-scss@14.1.0(postcss@8.4.41)(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + postcss-scss: 4.0.9(postcss@8.4.41) + stylelint: 16.8.1(typescript@5.5.4) + stylelint-config-recommended: 14.0.1(stylelint@16.8.1(typescript@5.5.4)) + stylelint-scss: 6.5.0(stylelint@16.8.1(typescript@5.5.4)) + optionalDependencies: + postcss: 8.4.41 + + stylelint-config-recommended@14.0.1(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + stylelint: 16.8.1(typescript@5.5.4) + + stylelint-config-sass-guidelines@12.0.0(postcss@8.4.41)(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + '@stylistic/stylelint-plugin': 2.1.3(stylelint@16.8.1(typescript@5.5.4)) + postcss: 8.4.41 + postcss-scss: 4.0.9(postcss@8.4.41) + stylelint: 16.8.1(typescript@5.5.4) + stylelint-scss: 6.5.0(stylelint@16.8.1(typescript@5.5.4)) + + stylelint-config-standard-scss@13.1.0(postcss@8.4.41)(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + stylelint: 16.8.1(typescript@5.5.4) + stylelint-config-recommended-scss: 14.1.0(postcss@8.4.41)(stylelint@16.8.1(typescript@5.5.4)) + stylelint-config-standard: 36.0.1(stylelint@16.8.1(typescript@5.5.4)) + optionalDependencies: + postcss: 8.4.41 + + stylelint-config-standard@36.0.1(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + stylelint: 16.8.1(typescript@5.5.4) + stylelint-config-recommended: 14.0.1(stylelint@16.8.1(typescript@5.5.4)) + + stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + stylelint: 16.8.1(typescript@5.5.4) + + stylelint-order@6.0.4(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + postcss: 8.4.41 + postcss-sorting: 8.0.2(postcss@8.4.41) + stylelint: 16.8.1(typescript@5.5.4) + + stylelint-plugin-logical-css@1.2.1(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + stylelint: 16.8.1(typescript@5.5.4) + + stylelint-scss@6.5.0(stylelint@16.8.1(typescript@5.5.4)): + dependencies: + css-tree: 2.3.1 + is-plain-object: 5.0.0 + known-css-properties: 0.34.0 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + stylelint: 16.8.1(typescript@5.5.4) + + stylelint@16.8.1(typescript@5.5.4): + dependencies: + '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) + '@csstools/css-tokenizer': 2.4.1 + '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) + '@dual-bundle/import-meta-resolve': 4.1.0 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.5.4) + css-functions-list: 3.2.2 + css-tree: 2.3.1 + debug: 4.3.6 + fast-glob: 3.3.2 + fastest-levenshtein: 1.0.16 + file-entry-cache: 9.0.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.34.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.0(postcss@8.4.41) + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 7.1.0 + supports-hyperlinks: 3.0.0 + svg-tags: 1.0.0 + table: 6.8.2 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.0.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + table@6.8.2: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + token-types@5.0.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + trim-repeated@2.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + tslib@2.6.3: {} + + typescript@5.5.4: {} + + undici-types@6.13.0: {} + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + util-deprecate@1.0.2: {} + + vite@5.4.0(@types/node@22.2.0)(sass@1.77.8): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.20.0 + optionalDependencies: + '@types/node': 22.2.0 + fsevents: 2.3.3 + sass: 1.77.8 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + yallist@2.1.2: {} diff --git a/stylelint.d.ts b/stylelint.d.ts index 36d554f9..0fdd7558 100644 --- a/stylelint.d.ts +++ b/stylelint.d.ts @@ -1,6 +1,5 @@ /** - * Définition d'un groupe de Propriétés _CSS_ du plugin `stylelint-config-clean-order` pour - * _Stylelint_. + * Définition d'un groupe de Propriétés _CSS_ du plugin `stylelint-config-clean-order` pour _Stylelint_. */ type StylelintConfigCleanOrderPropertyGroup = { emptyLineBefore: "never" | "threshold"; diff --git a/web/vendor/htmlburger/carbon-fields/.gitattributes b/web/vendor/htmlburger/carbon-fields/.gitattributes new file mode 100644 index 00000000..2b90fad9 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/.gitattributes @@ -0,0 +1,9 @@ +/tests export-ignore +.gitattributes export-ignore +.gitignore export-ignore +.scrutinizer.yml export-ignore +.travis.yml export-ignore +DEVELOPMENT.md export-ignore +phpcs.xml export-ignore +phpunit.xml export-ignore +Vagrantfile export-ignore diff --git a/web/vendor/htmlburger/carbon-fields/.gitignore b/web/vendor/htmlburger/carbon-fields/.gitignore new file mode 100644 index 00000000..0bcebfef --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/.gitignore @@ -0,0 +1,34 @@ +# Editors +project.xml +project.properties +/nbproject/private/ +.buildpath +.project +.settings* +sftp-config.json +.idea + +# OS X metadata +.DS_Store + +# Windows thumbnail cache +Thumbs.db + +# Node +node_modules + +# Unit tests +/tmp + +# Composer +/vendor +composer.lock + +# Vagrant +.vagrant + +# Bundled assets +/assets/dist/ +carbon-fields.zip + +package-lock.json \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/.scrutinizer.yml b/web/vendor/htmlburger/carbon-fields/.scrutinizer.yml new file mode 100644 index 00000000..c6861d5e --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/.scrutinizer.yml @@ -0,0 +1,74 @@ +filter: + excluded_paths: + - core/Pimple/* + - assets/* + - languages/* + - tests/* + - templates/* + - tmp/* + - vendor/* + +checks: + php: + verify_argument_usable_as_reference: false + verify_property_names: false + no_global_keyword: false + psr2_class_declaration: false + avoid_superglobals: false + one_class_per_file: false + code_rating: true + coding_standard: + name: WordPress + +tools: + sensiolabs_security_checker: true + external_code_coverage: true + php_mess_detector: + config: + code_size_rules: { cyclomatic_complexity: true, npath_complexity: true, excessive_method_length: true, excessive_class_length: true, excessive_parameter_list: true, excessive_public_count: true, too_many_fields: true, too_many_methods: true, excessive_class_complexity: true } + design_rules: { number_of_class_children: true, depth_of_inheritance: true, coupling_between_objects: true } + unused_code_rules: { unused_local_variable: true, unused_private_method: true, unused_formal_parameter: true } + naming_rules: { short_variable: true, long_variable: true, short_method: true, boolean_method_name: true } + controversial_rules: { camel_case_class_name: true, camel_case_property_name: true, camel_case_method_name: true, camel_case_parameter_name: true, camel_case_variable_name: true } + php_cs_fixer: + config: + level: all + fixers: { unused_use: true, phpdoc_params: true, braces: true, php_closing_tag: true } + php_analyzer: + config: + suspicious_code: { enabled: true, overriding_parameter: true, overriding_closure_use: true, parameter_closure_use_conflict: true, parameter_multiple_times: true, non_existent_class_in_instanceof_check: true, non_existent_class_in_catch_clause: true, assignment_of_null_return: true, non_commented_switch_fallthrough: true, non_commented_empty_catch_block: true, overriding_private_members: true, use_statement_alias_conflict: true, precedence_in_condition_assignment: true } + verify_php_doc_comments: { enabled: true, parameters: true, return: true, suggest_more_specific_types: true, ask_for_return_if_not_inferrable: true, ask_for_param_type_annotation: true } + loops_must_use_braces: { enabled: true } + simplify_boolean_return: { enabled: true } + phpunit_checks: { enabled: true } + reflection_fixes: { enabled: true } + use_statement_fixes: { enabled: true, order_alphabetically: true, remove_unused: true, preserve_multiple: false, preserve_blanklines: false } + parameter_reference_check: { enabled: false } + checkstyle: { enabled: false, no_trailing_whitespace: true, naming: { enabled: true, local_variable: '^[a-z][a-zA-Z0-9]*$', abstract_class_name: ^Abstract|Factory$, utility_class_name: 'Utils?$', constant_name: '^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$', property_name: '^[a-z][a-zA-Z0-9]*$', method_name: '^(?:[a-z]|__)[a-zA-Z0-9]*$', parameter_name: '^[a-z][a-zA-Z0-9]*$', interface_name: '^[A-Z][a-zA-Z0-9]*Interface$', type_name: '^[A-Z][a-zA-Z0-9]*$', exception_name: '^[A-Z][a-zA-Z0-9]*Exception$', isser_method_name: '^(?:is|has|should|may|supports)' } } + unreachable_code: { enabled: false } + check_access_control: { enabled: false } + typo_checks: { enabled: false } + check_variables: { enabled: false } + check_calls: { enabled: true, too_many_arguments: true, missing_argument: true, argument_type_checks: lenient } + dead_assignments: { enabled: false } + check_usage_context: { enabled: true, foreach: { value_as_reference: true, traversable: true } } + reflection_checks: { enabled: false } + precedence_checks: { enabled: true, assignment_in_condition: true, comparison_of_bit_result: true } + basic_semantic_checks: { enabled: false } + unused_code: { enabled: false } + deprecation_checks: { enabled: false } + useless_function_calls: { enabled: false } + metrics_lack_of_cohesion_methods: { enabled: false } + metrics_coupling: { enabled: true, stable_code: { namespace_prefixes: { }, classes: { } } } + doctrine_parameter_binding: { enabled: false } + doctrine_entity_manager_injection: { enabled: false } + symfony_request_injection: { enabled: false } + doc_comment_fixes: { enabled: false } + php_code_sniffer: + config: + standard: WordPress + sniffs: { wordpress: { arrays: { array_declaration_sniff: true }, classes: { valid_class_name_sniff: true }, files: { file_name_sniff: true }, formatting: { multiple_statement_alignment_sniff: true }, functions: { function_call_signature_sniff: true, function_declaration_argument_spacing_sniff: true }, naming_conventions: { valid_function_name_sniff: true }, objects: { object_instantiation_sniff: true }, php: { discouraged_functions_sniff: true }, strings: { double_quote_usage_sniff: true }, white_space: { control_structure_spacing_sniff: true, operator_spacing_sniff: true, php_indent_sniff: true }, xss: { escape_output_sniff: true } } } + php_loc: true + php_pdepend: true + php_sim: true + php_changetracking: true diff --git a/web/vendor/htmlburger/carbon-fields/.travis.yml b/web/vendor/htmlburger/carbon-fields/.travis.yml new file mode 100644 index 00000000..e51ca78f --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/.travis.yml @@ -0,0 +1,61 @@ +language: php + +sudo: false + +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - 7.1 + - 7.2 + - 7.3 + +env: +# - WP_VERSION=latest WP_MULTISITE=0 + - WP_VERSION=5.0 WP_MULTISITE=0 + - WP_VERSION=4.9 WP_MULTISITE=0 + - WP_VERSION=4.8 WP_MULTISITE=0 + - WP_VERSION=4.7 WP_MULTISITE=0 + - WP_VERSION=4.6 WP_MULTISITE=0 + - WP_VERSION=4.5 WP_MULTISITE=0 + +matrix: + include: + - php: 5.3 + dist: precise + env: WP_VERSION=5.0 WP_MULTISITE=0 + - php: 5.3 + dist: precise + env: WP_VERSION=4.9 WP_MULTISITE=0 + - php: 5.3 + dist: precise + env: WP_VERSION=4.8 WP_MULTISITE=0 + - php: 5.3 + dist: precise + env: WP_VERSION=4.7 WP_MULTISITE=0 + - php: 5.3 + dist: precise + env: WP_VERSION=4.6 WP_MULTISITE=0 + - php: 5.3 + dist: precise + env: WP_VERSION=4.5 WP_MULTISITE=0 + - php: 5.3 + dist: precise + env: WP_VERSION=5.0 WP_MULTISITE=1 + - php: 5.3 + dist: precise + env: WP_VERSION=4.9 WP_MULTISITE=1 + +before_install: + - composer self-update + +before_script: + - mysql -e "create database IF NOT EXISTS carbon_fields_tests;" -uroot + - bash tests/bin/install.sh carbon_fields_tests root '' localhost $WP_VERSION + +script: ./vendor/bin/phpunit --coverage-clover=./tmp/clover.xml + +after_script: + - wget https://scrutinizer-ci.com/ocular.phar + - php ocular.phar code-coverage:upload --format=php-clover ./tmp/clover.xml diff --git a/web/vendor/htmlburger/carbon-fields/DEVELOPMENT.md b/web/vendor/htmlburger/carbon-fields/DEVELOPMENT.md new file mode 100644 index 00000000..a10cd1b1 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/DEVELOPMENT.md @@ -0,0 +1,22 @@ +# Release Guide + +## `htmlburger/carbon-fields` + +1. Bump version numbers in `config.php` and `package.json` according to SemVer +1. Commit to `development` with commit message "Bump vX.X.X" +1. Merge all changes for the new version into `master` +1. Checkout `master` +1. Run `npm install && npm run build` +1. `git push origin master` +1. Create a new release in [Github](https://github.com/htmlburger/carbon-fields/releases/new) from the `master` branch +1. Enter the new version you set in `config.php` for `Tag version` and `Title` +1. Add a changelog for `Description` +1. Click `Publish release` + +## `htmlburger/carbon-fields-plugin` + +1. Update the version in `carbon-fields-plugin.php`, `readme.txt` and `composer.json` for `htmlburger/carbon-fields` to match the newly released version +1. Commit to `master` +1. Create a new release in [Github](https://github.com/htmlburger/carbon-fields-plugin/releases/new) from the `master` branch +1. Enter the new version for `Tag version` and `Title` (you can skip the changelog) +1. Click `Publish release` diff --git a/web/vendor/htmlburger/carbon-fields/Vagrantfile b/web/vendor/htmlburger/carbon-fields/Vagrantfile new file mode 100644 index 00000000..843fe689 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/Vagrantfile @@ -0,0 +1,81 @@ +Vagrant.configure(2) do |config| + config.vm.box = "ubuntu/trusty64" + config.vm.box_check_update = false + + config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Fix the DNS resolution speed. This actually slows down the unit tests speed + # (I assume due to base WP test suite) + # See http://serverfault.com/a/496612/80479 + config.vm.provider "virtualbox" do |v| + v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] + v.customize ["modifyvm", :id, "--natdnsproxy1", "on"] + end + + config.vm.synced_folder ".", "/home/vagrant/carbon-fields" + config.vm.synced_folder "../../../", "/var/www/" + + # Install some software on the machine and setup unit tests environment + config.vm.provision "shell", inline: <<-SHELL + DBHOST=localhost + DBNAME=wp + DBUSER=wp + DBPASSWD=secret + + echo -e "\n--- Update apt ---\n" + sudo apt-get -qq update + + echo -e "\n--- Install some base packages ---\n" + sudo apt-get -y install vim curl build-essential python-software-properties nginx git subversion zip > /dev/null 2>&1 + + echo -e "\n--- Install PHP7 ---\n" + sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php + sudo apt-get -qq update + sudo apt-get install php7.0 php7.0-fpm php7.0-mysql -y + + echo -e "\n--- Install composer ---\n" + sudo curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer + + echo -e "\n--- Install phpUnit ---\n" + su - vagrant -c 'sudo composer global require "phpunit/phpunit=5.0.*"' + echo 'PATH=$PATH:~/.composer/vendor/bin/' >> ~vagrant/.bash_profile && chown vagrant:vagrant ~vagrant/.bash_profile + + echo -e "\n--- Install MySQL ---\n" + echo "mysql-server mysql-server/root_password password $DBPASSWD" | debconf-set-selections + echo "mysql-server mysql-server/root_password_again password $DBPASSWD" | debconf-set-selections + sudo apt-get -y install mysql-server-5.5 + + echo 'server { + listen 80; + server_name localhost; + + root /var/www/; + index index.php index.html; + + # Important for VirtualBox + sendfile off; + + location / { + try_files $uri $uri/ =404; + } + + location ~* \.php { + include fastcgi_params; + + fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; + + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_cache off; + fastcgi_index index.php; + } + }' > /etc/nginx/sites-available/default + service nginx restart; + + echo -e "\n--- Setup MySQL ---\n" + mysql -uroot -p$DBPASSWD -e "CREATE DATABASE $DBNAME" + mysql -uroot -p$DBPASSWD -e "grant all privileges on $DBNAME.* to '$DBUSER'@'localhost' identified by '$DBPASSWD'" + + su - vagrant -c "cd /home/vagrant/carbon-fields && ./tests/bin/install.sh $DBNAME $DBUSER $DBPASSWD" + + SHELL +end diff --git a/web/vendor/htmlburger/carbon-fields/phpcs.xml b/web/vendor/htmlburger/carbon-fields/phpcs.xml new file mode 100644 index 00000000..a25521c6 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/phpcs.xml @@ -0,0 +1,9 @@ + + + Coding standards for Carbon Fields + + tests/* + vendor/* + + + diff --git a/web/vendor/htmlburger/carbon-fields/phpunit.xml b/web/vendor/htmlburger/carbon-fields/phpunit.xml new file mode 100644 index 00000000..093edfad --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/phpunit.xml @@ -0,0 +1,18 @@ + + + + + ./tests/unit-tests/ + + + \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/README.md b/web/vendor/htmlburger/carbon-fields/tests/README.md new file mode 100644 index 00000000..f45c1c42 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/README.md @@ -0,0 +1,21 @@ +# Carbon Fields Unit Tests + +## Initial Setup + +Install WordPress and the WP Unit Test lib using the `install.sh` script. Change to the plugin root directory and type: + + $ tests/bin/install.sh [db-host] [wp-version] + +Sample usage: + + $ tests/bin/install.sh carbon_fields_tests root root localhost 4.7 + +**Important**: Make sure that the `` database has been created. Note that all data will be removed during testing. + +## Running Tests + +Simply change to the plugin root directory and type: + + $ ./vendor/bin/phpunit + +Refer to the [phpunit command line test runner reference](https://phpunit.de/manual/current/en/phpunit-book.html#textui) for more information and command line options. \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/bin/install.sh b/web/vendor/htmlburger/carbon-fields/tests/bin/install.sh new file mode 100644 index 00000000..8a9a52f7 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/bin/install.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +# See https://github.com/wp-cli/wp-cli/blob/master/templates/install-wp-tests.sh + +# MySQL settings +if [ $# -lt 3 ]; then + echo "usage: $0 [db-host] [wp-version]" + exit 1 +fi + +# General variables +DB_NAME=$1 +DB_USER=$2 +DB_PASS=$3 +DB_HOST=${4-localhost} +WP_VERSION=${5-latest} +BASEDIR="${PWD}" + +# Handle Windows drive paths +if [ "$(expr substr $(uname -s) 1 5)" == "MINGW" ]; then + BASEDIR=$(echo $BASEDIR | sed -r 's/\/([a-zA-Z])\//\1:\//g') +fi + +# Setup directory vars +WP_TESTS_DIR="${BASEDIR}/tmp/wordpress-tests-lib" +WP_CORE_DIR="${BASEDIR}/tmp/wordpress/" + +set -ex + +# Used to download a file to a certain location +download() { + if [ `which curl` ]; then + curl -s "$1" > "$2"; + elif [ `which wget` ]; then + wget -nv -O "$2" "$1" + fi +} + +# Determine WP version to download +wp_version() { + # Determine which version to download + if [ $WP_VERSION == 'latest' ]; then + local url='trunk' + else + local url="branches/$WP_VERSION" + fi + + echo "$url" +} + +# Install dependencies & autoloader (using Composer) +install_autoloader() { + composer install +} + +# Install a certain version (or the latest one) of WordPress +install_wp() { + mkdir -p $WP_CORE_DIR + + # Determine which version to download + local url=$(wp_version) + + # Checkout the WordPress core + cd $WP_CORE_DIR + svn co --quiet http://develop.svn.wordpress.org/${url}/src/ . + + # Copy the database settings (wp-content/db.php) + cp $BASEDIR/tests/misc/db.php $WP_CORE_DIR/wp-content/db.php +} + +# Install the WordPress test suite +install_test_suite() { + # Portable in-place argument for both GNU sed and Mac OSX sed + if [[ $(uname -s) == 'Darwin' ]]; then + local ioption='-i .bak' + else + local ioption='-i' + fi + + # Determine which version to download + local testsurl=$(wp_version) + + # Prepare target directory and checkout WP test suite + mkdir -p $WP_TESTS_DIR + cd $WP_TESTS_DIR + svn co --quiet http://develop.svn.wordpress.org/${testsurl}/tests/phpunit/includes/ + + # Add the missing data/themedir1 directory + svn co --quiet http://develop.svn.wordpress.org/${testsurl}/tests/phpunit/data/themedir1/ ./data/themedir1 + + # Download base configuration file + download http://develop.svn.wordpress.org/${testsurl}/wp-tests-config-sample.php wp-tests-config.php + + # Make sure colons are escaped (they might exist in Windows environments) + WP_CORE_DIR=$(echo $WP_CORE_DIR | sed -r 's/:/\\:/g') + + # Replace variables in the config file + sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR':" wp-tests-config.php 2> /dev/null + sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" wp-tests-config.php 2> /dev/null + sed $ioption "s/yourusernamehere/$DB_USER/" wp-tests-config.php 2> /dev/null + sed $ioption "s/yourpasswordhere/$DB_PASS/" wp-tests-config.php 2> /dev/null + sed $ioption "s|localhost|${DB_HOST}|" wp-tests-config.php 2> /dev/null + sed $ioption "s/Test Blog/Carbon Fields Unit Tests/" wp-tests-config.php 2> /dev/null +} + +install_autoloader +install_wp +install_test_suite \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/bootstrap.php b/web/vendor/htmlburger/carbon-fields/tests/bootstrap.php new file mode 100644 index 00000000..3fa8e735 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/bootstrap.php @@ -0,0 +1,84 @@ +tests_dir = __DIR__; + $this->plugin_dir = dirname( $this->tests_dir ); + $this->wp_tests_dir = getenv( 'WP_TESTS_DIR' ) ? getenv( 'WP_TESTS_DIR' ) : $this->plugin_dir . '/tmp/wordpress-tests-lib'; + + // load test function so tests_add_filter() is available + require_once( $this->wp_tests_dir . '/includes/functions.php' ); + + // load plugin + tests_add_filter( 'muplugins_loaded', array( $this, 'load_plugin' ) ); + + // load the WP testing environment + require_once( $this->wp_tests_dir . '/includes/bootstrap.php' ); + + // make sure query vars are prepared + global $wp; + if ( ! is_array( $wp->query_vars ) ) { + $wp->query_vars = array(); + } + + \Carbon_Fields\Carbon_Fields::instance()->booted = true; + } + + /** + * Load the plugin + */ + public function load_plugin() { + require_once( $this->plugin_dir . '/vendor/autoload.php' ); + } + + /** + * Get the single tests boostrap instance + * + * @return Carbon_Fields_Tests_Bootstrap + */ + public static function instance() { + if ( is_null( static::$instance ) ) { + static::$instance = new self(); + } + + return static::$instance; + } + +} + +Carbon_Fields_Tests_Bootstrap::instance(); diff --git a/web/vendor/htmlburger/carbon-fields/tests/misc/db.php b/web/vendor/htmlburger/carbon-fields/tests/misc/db.php new file mode 100644 index 00000000..5963f0a6 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/misc/db.php @@ -0,0 +1,5 @@ +factory( function( $ioc ) { + return M::mock( 'Carbon_Fields\\Container\\Fulfillable\\Fulfillable_Collection' )->shouldIgnoreMissing(); + } ); + + $ioc['container_conditions'] = function() { + return new PimpleContainer(); + }; + + \Carbon_Fields\Carbon_Fields::instance()->install( $ioc ); + + $this->containerId = 'PageSettings'; + $this->containerTitle = 'Page Settings'; + $this->containerType = 'post_meta'; + $this->containerTypeUpperCase = 'Post_Meta'; + $this->containerTypeSpaced = 'Post Meta'; + $this->containerTypeInvalid = '__no_such_container_type__'; + $this->containerTypeClass = 'Carbon_Fields\Container\Post_Meta_Container'; + $this->containerTypeDatastoreClass = 'Carbon_Fields\Datastore\Post_Meta_Datastore'; + $this->containerTypeBrokenClass = 'Carbon_Fields\Container\Broken_Container'; + + $this->containerConditionFulfillableCollection = $ioc['container_condition_fulfillable_collection']; + $this->containerConditionTranslatorJson = $ioc['container_condition_translator_json']; + } + + public function tearDown(): void { + \Carbon_Fields\Carbon_Fields::instance()->install( new PimpleContainer() ); + } + + /** + * @covers ::make + * @covers ::factory + */ + public function testMakePostMetaContainer() { + $container = Container::factory( $this->containerType, $this->containerTitle ); + $this->assertEquals( $this->containerTitle, $container->title ); + } + + /** + * @covers ::make + * @covers ::factory + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Unknown container "". + */ + public function testExceptionIsThrownWhenContainerTypeIsEmpty() { + $container = Container::factory( '', $this->containerTitle ); + } + + /** + * @covers ::make + * @covers ::factory + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Unknown container "__no_such_container_type__". + */ + public function testExceptionIsThrownWhenContainerTypeIsInvalid() { + $container = Container::factory( $this->containerTypeInvalid, $this->containerTitle ); + } + + /** + * @covers ::make + * @covers ::factory + */ + public function testBrokenContainerIsReturnedWhenDebugIsDisabledAndContainerIsInvalid() { + $old_val = Incorrect_Syntax_Exception::$throw_errors; + + Incorrect_Syntax_Exception::$throw_errors = false; + $container = Container::factory( $this->containerTypeInvalid, $this->containerTitle ); + $this->assertInstanceOf( $this->containerTypeBrokenClass, $container ); + + Incorrect_Syntax_Exception::$throw_errors = $old_val; + } + + /** + * @covers ::make + * @covers ::factory + */ + public function testContainerTypeCaseIsIgnored() { + $container = Container::factory( $this->containerTypeUpperCase, $this->containerTitle ); + $this->assertInstanceOf( $this->containerTypeClass, $container ); + } + + /** + * @covers ::make + * @covers ::factory + */ + public function testSpacesInContainerTypeAreSupported() { + $container = Container::factory( $this->containerTypeSpaced, $this->containerTitle ); + $this->assertTrue(true); // no exception should be thrown + } + + /** + * @covers ::make + * @covers ::factory + */ + public function testSameContainerNamesDoNotGenerateIdenticalIds() { + $container1 = Container::factory( $this->containerType, $this->containerTitle ); + $container2 = Container::factory( $this->containerType, $this->containerTitle ); + $this->assertNotEquals( $container1->get_id(), $container2->get_id() ); + } + + /** + * @covers ::make + * @covers ::factory + */ + public function testSameContainerNameAddsNumericalSuffix() { + $container1 = Container::factory( $this->containerType, $this->containerTitle ); + $container2 = Container::factory( $this->containerType, $this->containerTitle ); + $this->assertEquals( $container1->get_id() . '1', $container2->get_id() ); + } + /** + * @covers ::__construct + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Empty container title is not supported + */ + public function testExceptionIsThrownWhenContainerTitleIsEmpty() { + $container = new $this->containerTypeClass( $this->containerId, '', $this->containerType, $this->containerConditionFulfillableCollection, $this->containerConditionTranslatorJson ); + } + + /** + * @covers ::__construct + */ + public function testNonAsciiContainerTitlesAreHandledProperly() { + // This text includes a capital cyrillic letter ... it actually assures that + // container titles in non-english are converted to lowercase + $container = new $this->containerTypeClass( $this->containerId, 'bulgarian: България', $this->containerType, $this->containerConditionFulfillableCollection, $this->containerConditionTranslatorJson ); + $this->assertEquals( 'bulgarian: България', $container->title ); + } + + /** + * @covers ::set_datastore + * @covers ::get_datastore + * @covers ::has_default_datastore + */ + public function testSetDatastore_Default_ReturnDefault() { + $datastore = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $container = new $this->containerTypeClass( $this->containerId, $this->containerTitle, $this->containerType, $this->containerConditionFulfillableCollection, $this->containerConditionTranslatorJson ); + + $this->assertEquals( true, $container->has_default_datastore() ); + $this->assertInstanceOf( $this->containerTypeDatastoreClass, $container->get_datastore() ); + + $container->set_datastore( $datastore, true ); + $this->assertEquals( true, $container->has_default_datastore() ); + $this->assertEquals( $datastore, $container->get_datastore() ); + } + + /** + * @covers ::set_datastore + * @covers ::get_datastore + * @covers ::has_default_datastore + */ + public function testSetDatastore_DefaultDefault2_ReturnDefault2() { + $datastore1 = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $datastore2 = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $container = new $this->containerTypeClass( $this->containerId, $this->containerTitle, $this->containerType, $this->containerConditionFulfillableCollection, $this->containerConditionTranslatorJson ); + + $container->set_datastore( $datastore1, true ); + $container->set_datastore( $datastore2, true ); + $this->assertEquals( $datastore2, $container->get_datastore() ); + } + + /** + * @covers ::set_datastore + * @covers ::get_datastore + * @covers ::has_default_datastore + */ + public function testSetDatastore_Override_ReturnOverride() { + $datastore = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $container = new $this->containerTypeClass( $this->containerId, $this->containerTitle, $this->containerType, $this->containerConditionFulfillableCollection, $this->containerConditionTranslatorJson ); + + $container->set_datastore( $datastore, false ); + $this->assertEquals( false, $container->has_default_datastore() ); + $this->assertEquals( $datastore, $container->get_datastore() ); + } + + /** + * @covers ::set_datastore + * @covers ::get_datastore + * @covers ::has_default_datastore + */ + public function testSetDatastore_OverrideOverride2_ReturnOverride2() { + $datastore1 = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $datastore2 = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $container = new $this->containerTypeClass( $this->containerId, $this->containerTitle, $this->containerType, $this->containerConditionFulfillableCollection, $this->containerConditionTranslatorJson ); + + $container->set_datastore( $datastore1, false ); + $container->set_datastore( $datastore2, false ); + $this->assertEquals( false, $container->has_default_datastore() ); + $this->assertEquals( $datastore2, $container->get_datastore() ); + } + + /** + * @covers ::set_datastore + * @covers ::get_datastore + * @covers ::has_default_datastore + */ + public function testSetDatastore_DefaultOverride_ReturnOverride() { + $default_datastore = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $override_datastore = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $container = new $this->containerTypeClass( $this->containerId, $this->containerTitle, $this->containerType, $this->containerConditionFulfillableCollection, $this->containerConditionTranslatorJson ); + + $container->set_datastore( $default_datastore, true ); + $this->assertEquals( true, $container->has_default_datastore() ); + $this->assertEquals( $default_datastore, $container->get_datastore() ); + + $container->set_datastore( $override_datastore, false ); + $this->assertEquals( false, $container->has_default_datastore() ); + $this->assertEquals( $override_datastore, $container->get_datastore() ); + } + + /** + * @covers ::set_datastore + * @covers ::get_datastore + * @covers ::has_default_datastore + */ + public function testSetDatastore_DefaultOverrideDefault2_ReturnOverride() { + $default_datastore = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $override_datastore = M::mock( $this->containerTypeDatastoreClass )->shouldIgnoreMissing(); + $container = new $this->containerTypeClass( $this->containerId, $this->containerTitle, $this->containerType, $this->containerConditionFulfillableCollection, $this->containerConditionTranslatorJson ); + + $container->set_datastore( $default_datastore, true ); + $container->set_datastore( $override_datastore, false ); + $container->set_datastore( $default_datastore, true ); + $this->assertEquals( false, $container->has_default_datastore() ); + $this->assertEquals( $override_datastore, $container->get_datastore() ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/Fulfillable/FulfillableCollectionTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/Fulfillable/FulfillableCollectionTest.php new file mode 100644 index 00000000..573e42e7 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/Fulfillable/FulfillableCollectionTest.php @@ -0,0 +1,343 @@ +register( new \Carbon_Fields\Provider\Container_Condition_Provider() ); + \Carbon_Fields\Carbon_Fields::instance()->install( $ioc ); + + $this->subject = $ioc['container_condition_fulfillable_collection']; + $this->condition_factory = $ioc['container_condition_factory']; + } + + public function tearDown(): void { + M::close(); + $this->condition_factory = null; + $this->subject = null; + } + + /** + * @covers ::where + * @covers ::or_where + * @covers ::is_fulfilled + */ + public function testWhereWithBasicArgumentsIsFulfilled() { + $this->subject->where( 'post_type', '=', 'post' ); + $environment = array( 'post_type' => 'post' ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::where + * @covers ::is_fulfilled + */ + public function testWhereWithBasicArgumentsIsNotFulfilled() { + $this->subject->where( 'post_type', '=', 'post' ); + $environment = array( 'post_type' => 'page' ); + $this->assertFalse( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::where + * @covers ::is_fulfilled + */ + public function testWhereWithSkippedComparerIsFulfilled() { + $this->subject->where( 'post_type', 'post' ); + $environment = array( 'post_type' => 'post' ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::where + * @covers ::is_fulfilled + */ + public function testWhereWithSkippedComparerIsNotFulfilled() { + $this->subject->where( 'post_type', 'post' ); + $environment = array( 'post_type' => 'page' ); + $this->assertFalse( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::where + * @covers ::is_fulfilled + */ + public function testWhereWithArrayArgumentsIsFulfilled() { + $this->subject->where( array( + array( + 'type' => 'post_type', + 'value' => 'post', + ), + ) ); + $environment = array( 'post_type' => 'post' ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::where + * @covers ::is_fulfilled + */ + public function testWhereWithArrayArgumentsIsNotFulfilled() { + $this->subject->where( array( + array( + 'type' => 'post_type', + 'value' => 'post', + ), + ) ); + $environment = array( 'post_type' => 'page' ); + $this->assertFalse( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::where + * @covers ::is_fulfilled + */ + public function testWhereWithCallableIsFulfilled() { + $this->subject->where( function( $c ) { + $c->where( 'post_type', 'post' ); + } ); + $environment = array( 'post_type' => 'post' ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::where + * @covers ::is_fulfilled + */ + public function testWhereWithCallableIsNotFulfilled() { + $this->subject->where( function( $c ) { + $c->where( 'post_type', 'post' ); + } ); + $environment = array( 'post_type' => 'page' ); + $this->assertFalse( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::where + * @covers ::is_fulfilled + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testWhereWithUnsupportedConditionTypeThrowsException() { + $this->subject->where( 'unsupported_condition_type', 'post' ); + } + + /** + * @covers ::add_fulfillable + * @covers ::get_fulfillables + */ + public function testAddFulfillableAddsFulfillable() { + $fulfillable = M::mock( 'Carbon_Fields\\Container\\Fulfillable\\Fulfillable' ); + $fulfillable_comparison = 'AND'; + + $this->assertSame( 0, count( $this->subject->get_fulfillables() ) ); + $this->subject->add_fulfillable( $fulfillable, $fulfillable_comparison ); + $this->assertSame( 1, count( $this->subject->get_fulfillables() ) ); + + $fulfillables = $this->subject->get_fulfillables(); + $this->assertSame( $fulfillable, $fulfillables[0]['fulfillable'] ); + $this->assertSame( $fulfillable_comparison, $fulfillables[0]['fulfillable_comparison'] ); + } + + /** + * @covers ::add_fulfillable + * @covers ::get_fulfillables + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testAddFulfillableThrowsExceptionOnInvalidComparison() { + $fulfillable = M::mock( 'Carbon_Fields\\Container\\Fulfillable\\Fulfillable' ); + $fulfillable_comparison = 'UNSUPPORTED_COMPARISON_TYPE'; + $this->subject->add_fulfillable( $fulfillable, $fulfillable_comparison ); + } + + /** + * @covers ::filter + */ + public function testFilterRemovesUnlistedConditionTypes() { + $this->subject->where( 'post_id', 1 ); + $this->subject->where( 'post_type', 'post' ); + + $filtered = $this->subject->filter( array( 'post_type' ) ); + $this->assertTrue( count( $filtered->get_fulfillables() ) === 1, 'Filtered collection should contain 1 fulfillable only' ); + $this->assertTrue( count( $this->subject->get_fulfillables() ) === 2, 'Subject collection should remain unmodified' ); + } + + /** + * @covers ::filter + */ + public function testFilterRemovesUnlistedConditionTypesRecursively() { + $this->subject->where( 'post_type', 'post' ); + $this->subject->where( function( $c ) { + $c->where( 'post_id', 1 ); + $c->where( function( $c ) { + $c->where( 'post_id', 1 ); + } ); + } ); + + $filtered = $this->subject->filter( array( 'post_type' ) ); + $this->assertTrue( count( $filtered->get_fulfillables() ) === 1, 'Filtered collection should contain 1 fulfillable only' ); + $this->assertTrue( count( $this->subject->get_fulfillables() ) === 2, 'Subject collection should remain unmodified' ); + } + + /** + * @covers ::evaluate + */ + public function testEvaluateReplacesFulfilledConditionsWithBooleanTrue() { + $this->subject->where( 'post_id', 1 ); + $this->subject->where( 'post_template', 'default' ); + + $evaluated = $this->subject->evaluate( array( 'post_id' ), array( 'post_id' => 1 ) ); + $ef = $evaluated->get_fulfillables(); + + $expected = array( + array( + 'type' => 'boolean', + 'value' => true, + ), + array( + 'type' => 'post_template', + 'value' => 'default', + ), + ); + $received = array(); + foreach ( $ef as $tuple ) { + $received[] = array( + 'type' => $this->condition_factory->get_type( get_class( $tuple['fulfillable'] ) ), + 'value' => $tuple['fulfillable']->get_value(), + ); + } + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::evaluate + */ + public function testEvaluateReplacesFailingConditionsWithBooleanFalse() { + $this->subject->where( 'post_id', 1 ); + $this->subject->where( 'post_template', 'default' ); + + $evaluated = $this->subject->evaluate( array( 'post_id' ), array( 'post_id' => 2 ) ); + $ef = $evaluated->get_fulfillables(); + + $expected = array( + array( + 'type' => 'boolean', + 'value' => false, + ), + array( + 'type' => 'post_template', + 'value' => 'default', + ), + ); + $received = array(); + foreach ( $ef as $tuple ) { + $received[] = array( + 'type' => $this->condition_factory->get_type( get_class( $tuple['fulfillable'] ) ), + 'value' => $tuple['fulfillable']->get_value(), + ); + } + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::evaluate + */ + public function testEvaluateReplacesComparisonOperatorForBoolean() { + $this->subject->where( 'post_id', '>', 1 ); + $this->subject->where( 'post_template', 'default' ); + + $evaluated = $this->subject->evaluate( array( 'post_id' ), array( 'post_id' => 1 ) ); + $ef = $evaluated->get_fulfillables(); + + $expected = array( + array( + 'type' => 'boolean', + 'comparison_operator' => '=', + 'value' => false, + ), + array( + 'type' => 'post_template', + 'comparison_operator' => '=', + 'value' => 'default', + ), + ); + $received = array(); + foreach ( $ef as $tuple ) { + $received[] = array( + 'type' => $this->condition_factory->get_type( get_class( $tuple['fulfillable'] ) ), + 'comparison_operator' => $tuple['fulfillable']->get_comparison_operator(), + 'value' => $tuple['fulfillable']->get_value(), + ); + } + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::is_fulfilled + */ + public function testIsFulfilledWhenEmpty() { + $environment = array( ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::is_fulfilled + */ + public function testIsFulfilledWithSingleConditionWhenAllConditionsAreFulfilled() { + $this->subject->where( 'post_type', 'post' ); + $environment = array( 'post_type' => 'post' ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::is_fulfilled + */ + public function testIsFulfilledWithMultipleConditionsWhenAllConditionsAreFulfilled() { + $this->subject->where( 'post_type', 'post' ); + $this->subject->where( 'post_id', 1 ); + $environment = array( 'post_type' => 'post', 'post_id' => 1 ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::is_fulfilled + */ + public function testIsFulfilledWithNestedConditionsWhenAllConditionsAreFulfilled() { + $this->subject->where( 'post_type', 'post' ); + $this->subject->where( function( $c ) { + $c->where( 'post_id', 1 ); + } ); + $environment = array( 'post_type' => 'post', 'post_id' => 1 ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::is_fulfilled + */ + public function testIsFulfilledWhenOneConditionIsFulfilled() { + $this->subject->where( 'post_id', 1 ); + $this->subject->or_where( 'post_type', 'post' ); + $environment = array( 'post_id' => 1, 'post_type' => 'page' ); + $this->assertTrue( $this->subject->is_fulfilled( $environment ) ); + } + + /** + * @covers ::is_fulfilled + */ + public function testIsNotFulfilledWhenNoConditionsAreFulfilled() { + $this->subject->where( 'post_id', 1 ); + $this->subject->or_where( 'post_type', 'post' ); + $environment = array( 'post_id' => 0, 'post_type' => 'page' ); + $this->assertFalse( $this->subject->is_fulfilled( $environment ) ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/Fulfillable/Translator/ArrayTranslatorTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/Fulfillable/Translator/ArrayTranslatorTest.php new file mode 100644 index 00000000..b36e7004 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/Fulfillable/Translator/ArrayTranslatorTest.php @@ -0,0 +1,265 @@ +factory( function( $ioc ) { + return new Fulfillable_Collection( $ioc['container_condition_factory'], $ioc['container_condition_translator_array'] ); + } ); + + $ioc['container_conditions'] = function() { + return new PimpleContainer(); + }; + + $cc_ioc = $ioc['container_conditions']; + + $cc_ioc['post_id'] = $cc_ioc->factory( function( $cc_ioc ) use ( $ioc ) { + $condition = new \Carbon_Fields\Container\Condition\Post_ID_Condition(); + $condition->set_comparers( $ioc['container_condition_comparer_collections']['generic'] ); + return $condition; + } ); + $cc_ioc['post_type'] = $cc_ioc->factory( function( $cc_ioc ) use ( $ioc ) { + $condition = new \Carbon_Fields\Container\Condition\Post_Type_Condition(); + $condition->set_comparers( $ioc['container_condition_comparer_collections']['nonscalar'] ); + return $condition; + } ); + + /* Comparers */ + $ioc['container_condition_comparers'] = function( $ioc ) { + return new PimpleContainer(); + }; + + $ioc['container_condition_comparers']['equality'] = function() { + return new \Carbon_Fields\Container\Condition\Comparer\Equality_Comparer(); + }; + + $ioc['container_condition_comparers']['contain'] = function() { + return new \Carbon_Fields\Container\Condition\Comparer\Contain_Comparer(); + }; + + $ioc['container_condition_comparers']['scalar'] = function() { + return new \Carbon_Fields\Container\Condition\Comparer\Scalar_Comparer(); + }; + + $ioc['container_condition_comparers']['custom'] = function() { + return new \Carbon_Fields\Container\Condition\Comparer\Custom_Comparer(); + }; + + $ioc['container_condition_comparer_collections'] = function( $ioc ) { + return new PimpleContainer(); + }; + + $ioc['container_condition_comparer_collections']['generic'] = function( $cccc_ioc ) use ( $ioc ) { + return array( + $ioc['container_condition_comparers']['equality'], + $ioc['container_condition_comparers']['contain'], + $ioc['container_condition_comparers']['scalar'], + $ioc['container_condition_comparers']['custom'], + ); + }; + $ioc['container_condition_comparer_collections']['nonscalar'] = function( $cccc_ioc ) use ( $ioc ) { + return array( + $ioc['container_condition_comparers']['equality'], + $ioc['container_condition_comparers']['contain'], + $ioc['container_condition_comparers']['custom'], + ); + }; + + /* Translators */ + $ioc['container_condition_translator_array'] = function( $ioc ) { + return new \Carbon_Fields\Container\Fulfillable\Translator\Array_Translator( $ioc['container_condition_factory'] ); + }; + + \Carbon_Fields\Carbon_Fields::instance()->install( $ioc ); + + $this->subject = $ioc['container_condition_translator_array']; + } + + public function tearDown(): void { + M::close(); + $this->subject = null; + } + + /** + * @covers ::fulfillable_to_foreign + */ + public function testFulfillableToForeignWithCondition() { + $factory = \Carbon_Fields\Carbon_Fields::resolve( 'container_condition_factory' ); + $condition = $factory->make( 'post_type' ); + $condition->set_comparison_operator( '!=' ); + $condition->set_value( 'post' ); + + $expected = array( + 'type' => 'post_type', + 'compare' => '!=', + 'value' => 'post', + ); + $received = $this->subject->fulfillable_to_foreign( $condition ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::foreign_to_fulfillable + */ + public function testForeignToFulfillableWithCondition() { + $factory = \Carbon_Fields\Carbon_Fields::resolve( 'container_condition_factory' ); + $condition = $factory->make( 'post_type' ); + $condition->set_comparison_operator( '!=' ); + $condition->set_value( 'post' ); + + $expected = $condition; + $received = $this->subject->foreign_to_fulfillable( array( + 'type' => 'post_type', + 'compare' => '!=', + 'value' => 'post', + ) ); + $this->assertEquals( $expected, $received ); + } + + /** + * @covers ::fulfillable_to_foreign + */ + public function testFulfillableToForeignWithCollection() { + $fulfillable = \Carbon_Fields\Carbon_Fields::resolve( 'container_condition_fulfillable_collection' ); + $fulfillable->where( 'post_type', '!=', 'post' ); + $fulfillable->where( 'post_id', '!=', 1 ); + + $expected = array( + 'relation' => 'AND', + array( + 'type' => 'post_type', + 'compare' => '!=', + 'value' => 'post', + ), + array( + 'type' => 'post_id', + 'compare' => '!=', + 'value' => 1, + ), + ); + $received = $this->subject->fulfillable_to_foreign( $fulfillable ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::foreign_to_fulfillable + */ + public function testForeignToFulfillableWithCollection() { + $fulfillable = \Carbon_Fields\Carbon_Fields::resolve( 'container_condition_fulfillable_collection' ); + $fulfillable->where( 'post_type', '!=', 'post' ); + $fulfillable->where( 'post_id', '!=', 1 ); + + $expected = $fulfillable; + $received = $this->subject->foreign_to_fulfillable( array( + 'relation' => 'AND', + array( + 'type' => 'post_type', + 'compare' => '!=', + 'value' => 'post', + ), + array( + 'type' => 'post_id', + 'compare' => '!=', + 'value' => 1, + ), + ) ); + $this->assertEquals( $expected, $received ); + } + + /** + * @covers ::fulfillable_to_foreign + */ + public function testFulfillableToForeignWithNestedCollection() { + $fulfillable = \Carbon_Fields\Carbon_Fields::resolve( 'container_condition_fulfillable_collection' ); + $fulfillable->where( 'post_type', '!=', 'post' ); + $fulfillable->where( function( $c ) { + $c->where( 'post_id', '!=', 1 ); + $c->or_where( 'post_id', '!=', 2 ); + } ); + + $expected = array( + 'relation' => 'AND', + array( + 'type' => 'post_type', + 'compare' => '!=', + 'value' => 'post', + ), + array( + 'relation' => 'OR', + array( + 'relation' => 'AND', + array( + 'type' => 'post_id', + 'compare' => '!=', + 'value' => 1, + ), + ), + array( + 'relation' => 'OR', + array( + 'type' => 'post_id', + 'compare' => '!=', + 'value' => 2, + ), + ), + ), + ); + $received = $this->subject->fulfillable_to_foreign( $fulfillable ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::foreign_to_fulfillable + */ + public function testForeignToFulfillableWithNestedCollection() { + $fulfillable = \Carbon_Fields\Carbon_Fields::resolve( 'container_condition_fulfillable_collection' ); + $fulfillable->where( 'post_type', '!=', 'post' ); + $fulfillable->where( function( $c ) { + $c->or_where( 'post_id', '!=', 1 ); + $c->or_where( 'post_id', '!=', 2 ); + } ); + + $expected = $fulfillable; + $received = $this->subject->foreign_to_fulfillable( array( + 'relation' => 'AND', + array( + 'type' => 'post_type', + 'compare' => '!=', + 'value' => 'post', + ), + array( + 'relation' => 'OR', + array( + 'type' => 'post_id', + 'compare' => '!=', + 'value' => 1, + ), + array( + 'type' => 'post_id', + 'compare' => '!=', + 'value' => 2, + ), + ), + ) ); + $this->assertEquals( $expected, $received ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/RepositoryTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/RepositoryTest.php new file mode 100644 index 00000000..53d9c9a1 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Container/RepositoryTest.php @@ -0,0 +1,149 @@ +containerId = 'carbon_fields_container_page_settings'; + $this->containerTitle = 'Page Settings'; + $this->containerType = 'post_meta'; + $this->containerClass = 'Carbon_Fields\Container\Post_Meta_Container'; + $this->containerDuplicateTitleId = 'carbon_fields_container_page_settings1'; + $this->repository = new Repository(); + } + + public function tearDown(): void { + M::close(); + $this->repository = null; + } + + public function getContainerMock( $callable = null ) { + if ( is_callable( $callable ) ) { + $mock = M::mock( $this->containerClass, $callable ); + } else { + $mock = M::mock( $this->containerClass ); + } + $mock->shouldIgnoreMissing(); + $mock->id = $this->containerId; + $mock->title = $this->containerTitle; + $mock->type = $this->containerType; + return $mock; + } + + /** + * @covers ::register_container + * @covers ::initialize_containers + */ + public function testInitializeContainersCallsInitOnce() { + $container = $this->getContainerMock( function( $mock ) { + $mock->shouldReceive( 'init' )->once(); + } ); + + $this->repository->register_container( $container ); + $this->repository->initialize_containers(); + $this->assertTrue( true ); // rely on Mockery expectations to fail the test + } + + /** + * @covers ::register_container + * @covers ::initialize_containers + */ + public function testInitializeContainersReturnsContainers() { + $container = $this->getContainerMock(); + $expected = array( $container ); + + $this->repository->register_container( $container ); + $received = $this->repository->initialize_containers(); + + $this->assertEquals( $expected, $received ); + } + + /** + * @covers ::register_container + * @covers ::initialize_containers + */ + public function testInitializeContainersReturnsOnlyNewContainers() { + $container1 = $this->getContainerMock(); + $container2 = $this->getContainerMock(); + + $expected1 = array( $container1 ); + $expected2 = array( $container2 ); + + $this->repository->register_container( $container1 ); + $received1 = $this->repository->initialize_containers(); + + $this->assertEquals( $expected1, $received1 ); + + $this->repository->register_container( $container2 ); + $received2 = $this->repository->initialize_containers(); + + $this->assertEquals( $expected2, $received2 ); + } + + /** + * @covers ::get_active_containers + */ + public function testGetActiveContainers() { + $container1 = $this->getContainerMock( function( $mock ) { + $mock->shouldReceive( 'is_active' )->andReturn( true ); + } ); + $container2 = $this->getContainerMock( function( $mock ) { + $mock->shouldReceive( 'is_active' )->andReturn( false ); + } ); + $expected = array( $container1 ); + + $this->repository->register_container( $container1 ); + $this->repository->register_container( $container2 ); + + $received = $this->repository->get_active_containers(); + + $this->assertEquals( $expected, $received ); + } + + /** + * @covers ::get_unique_container_id + */ + public function testGetUniqueContainerId_InvalidCharacters_Stripped() { + $expected = $this->containerId; + $received = $this->repository->get_unique_container_id( $this->containerTitle ); + $this->assertEquals( $expected, $received ); + } + + /** + * @covers ::get_unique_container_id + * @covers ::register_container + */ + public function testGetUniqueContainerId_IdenticalTitles_ReturnsDifferentIds() { + $container = $this->getContainerMock(); + $this->repository->register_container( $container ); + $received = $this->repository->get_unique_container_id( $container->title ); + + $this->assertNotEquals( $container->get_id(), $received ); + } + + /** + * @covers ::get_unique_container_id + * @covers ::register_container + */ + public function testGetUniqueContainerId_IdenticalTitles_AddsNumericalSuffix() { + $container = $this->getContainerMock(); + $container->shouldReceive( 'get_id' )->andReturn( $this->containerId ); + $this->repository->register_container( $container ); + $received = $this->repository->get_unique_container_id( $container->title ); + + $this->assertEquals( $this->containerDuplicateTitleId, $received ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/ColorFieldTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/ColorFieldTest.php new file mode 100644 index 00000000..1c23cc86 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/ColorFieldTest.php @@ -0,0 +1,50 @@ +subject = M::mock( 'Carbon_Fields\Field\Color_Field' )->makePartial(); + } + + public function tearDown(): void { + M::close(); + unset( $this->subject ); + } + + /** + * @covers ::get_palette + * @covers ::set_palette + */ + public function testSetPaletteUpdatesPalette() { + $expected1 = array( '#FF0000' ); + $expected2 = array( '#00FF00' ); + + $this->subject->set_palette( $expected1 ); + $this->assertSame( $expected1, $this->subject->get_palette() ); + + $this->subject->set_palette( $expected2 ); + $this->assertSame( $expected2, $this->subject->get_palette() ); + } + + /** + * @covers ::get_alpha_enabled + * @covers ::set_alpha_enabled + */ + public function testSetAlphaEnabledUpdatesAlphaEnabled() { + $expected1 = false; + $expected2 = true; + + $this->assertSame( $expected1, $this->subject->get_alpha_enabled() ); + $this->subject->set_alpha_enabled( $expected2 ); + $this->assertSame( $expected2, $this->subject->get_alpha_enabled() ); + } +} diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldConditionalLogicTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldConditionalLogicTest.php new file mode 100644 index 00000000..034f32d6 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldConditionalLogicTest.php @@ -0,0 +1,189 @@ +field = Field::make( 'text', 'color' ); + } + + public function tearDown(): void { + unset( $this->field ); + } + + /** + * @covers ::set_conditional_logic + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage should be an array + */ + public function testErrorIsThrownWhenCondLogicIsNotArray() { + $this->field->set_conditional_logic( 'this should actually be array' ); + } + + /** + * @covers ::set_conditional_logic + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testErrorIsThrownWhenFlatArrayIsProvided() { + $this->field->set_conditional_logic( array( + 'field' => 'is_product', + 'value' => 'yes', + ) ); + } + + /** + * Private helper method for brevity + */ + public function verify_cond_logic( $user_defined_cond_logic, $expected_parsed_cond_logic ) { + $actual_parsed_cond_logic = $this->field + ->set_conditional_logic( $user_defined_cond_logic ) + ->get_conditional_logic(); + + $this->assertEquals( + $expected_parsed_cond_logic, + $actual_parsed_cond_logic + ); + } + + /** + * @covers ::set_conditional_logic + * @covers ::get_conditional_logic + */ + public function testBasicCondLogic() { + $user_defined_cond_logic = array( + array( + 'field' => 'is_product', + 'value' => 'yes', + ) + ); + + $expected_parsed_cond_logic = array( + 'relation' => 'AND', + 'rules' => array( + array( + 'field' => 'is_product', + 'value' => 'yes', + 'compare' => '=', + ) + ) + ); + $this->verify_cond_logic( + $user_defined_cond_logic, + $expected_parsed_cond_logic + ); + } + + /** + * @covers ::set_conditional_logic + * @covers ::get_conditional_logic + */ + public function testValueDefaultsToEmptyString() { + $user_defined_cond_logic = array( + array( + 'field' => 'is_product', + 'compare' => '!=', + ) + ); + + $expected_parsed_cond_logic = array( + 'relation' => 'AND', + 'rules' => array( + array( + 'field' => 'is_product', + 'value' => '', + 'compare' => '!=', + ) + ) + ); + + $this->verify_cond_logic( + $user_defined_cond_logic, + $expected_parsed_cond_logic + ); + } + + /** + * @covers ::set_conditional_logic + * @covers ::get_conditional_logic + */ + public function testRelationOperatorIsProvidedInLowercase() { + $user_defined_cond_logic = array( + 'relation' => 'or', + array( + 'field' => 'is_product', + 'value' => 'yes', + ) + ); + + $expected_parsed_cond_logic = array( + 'relation' => 'OR', + 'rules' => array( + array( + 'field' => 'is_product', + 'value' => 'yes', + 'compare' => '=', + ) + ) + ); + $this->verify_cond_logic( + $user_defined_cond_logic, + $expected_parsed_cond_logic + ); + + } + + /** + * @covers ::set_conditional_logic + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Invalid relation + */ + public function testBadRelationOperatorThrowsError() { + $this->field->set_conditional_logic( array( + 'relation' => 'maybe', + array( + 'field' => 'is_product', + 'value' => 'yes', + ) + ) ); + } + + /** + * @covers ::set_conditional_logic + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage compare operator + */ + public function testBadCompareOperatorThrowsError() { + $this->field->set_conditional_logic( array( + array( + 'field' => 'is_product', + 'value' => 'yes', + 'compare' => '!==' // There is no `!==` operator + ) + ) ); + } + + /** + * @covers ::set_conditional_logic + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage An array is expected + */ + public function testInCompareOperatorRequiresArrayAsValue() { + $this->field->set_conditional_logic( array( + array( + 'field' => 'is_product', + 'value' => 'yes', + 'compare' => 'IN' + ) + ) ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldGetSetIdTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldGetSetIdTest.php new file mode 100644 index 00000000..a27a732a --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldGetSetIdTest.php @@ -0,0 +1,26 @@ +field = $this->getMockForAbstractClass( 'Carbon_Fields\Field\Field', array(), '', false ); + } + + public function tearDown(): void { + unset( $this->field ); + } + + /** + * @covers ::get_id + * @covers ::set_id + */ + public function testGetSetId() { + $expected = mt_rand(); + $this->field->set_id( $expected ); + $this->assertSame( $expected, $this->field->get_id() ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldInitializationTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldInitializationTest.php new file mode 100644 index 00000000..6d0cffcc --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldInitializationTest.php @@ -0,0 +1,215 @@ +fieldName = '_color'; + } + + public function tearDown(): void { + // This is required just to overwrite code in WP_UnitTestCase + // that accesses the database + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * @covers ::get_name + * @covers ::set_name + */ + public function testMakeTextFields() { + $field = Field::make( 'text', $this->fieldName ); + $this->assertSame( $this->fieldName, $field->get_name() ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testExceptionIsThrownWhenFieldTypeIsEmpty() { + $field = Field::make( '', $this->fieldName ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testExceptionIsThrownWhenFieldTypeIsInvalid() { + $field = Field::make( '__no_such_field_type__', $this->fieldName ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + */ + public function testBrokenFieldIsReturnedWhenDebugIsDisabledAndFieldIsInvalid() { + $old_val = Incorrect_Syntax_Exception::$throw_errors; + + Incorrect_Syntax_Exception::$throw_errors = false; + $field = Field::make( '__no_such_field_type__', $this->fieldName ); + $this->assertInstanceOf( 'Carbon_Fields\Field\Broken_Field', $field ); + + Incorrect_Syntax_Exception::$throw_errors = $old_val; + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testDashIsNotAllowedInFieldType() { + $field = Field::make( 'gravity-form', $this->fieldName ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + */ + public function testFieldTypeCaseIsIgnored() { + $field = Field::make( 'Text', $this->fieldName ); + $this->assertInstanceOf( 'Carbon_Fields\Field\Text_Field', $field ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + */ + public function testSpacesInFieldTypeAreSupported() { + $field = Field::make( 'Gravity Form', $this->fieldName ); + $this->assertTrue( true ); // no exception ... + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * @covers ::get_name + * @covers ::set_name + */ + public function testFieldNameIsPrependedWithUnderscoreAutomatically() { + $field = Field::make( 'text', 'something' ); + $this->assertSame( '_something', $field->get_name() ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * @covers ::get_name + * @covers ::set_name + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testFieldNameThrowsExceptionOnUpperCaseValues() { + $field = Field::make( 'text', 'UPPER_CASE_FIELD_NAME' ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * @covers ::set_name + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testFieldNameThrowsExceptionOnNonEnglishWordCharacters() { + $field = Field::make( 'text', '## Even a weirder | name! :)' ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * @covers ::get_name + * @covers ::set_name + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testFieldNameThrowsExceptionOnUnicodeValues() { + $field = Field::make( 'text', 'bulgarian; България' ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + */ + public function testLabelIsSetupProperlyWhenPassedExplicitly() { + $field = Field::make( 'text', 'color', "Field Color" ); + $this->assertSame( "Field Color", $field->get_label() ); + + // Make sure that non-UTF8 labels are properlly supported + $field = Field::make( 'text', 'color', "Цвят" ); + $this->assertSame( "Цвят", $field->get_label() ); + + // Derive the label in proper case + $field = Field::make( 'text', 'color_of_something' ); + $this->assertSame( "Color Of Something", $field->get_label() ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + */ + public function testLabelIsDerivedProperly() { + $field = Field::make( 'text', 'field_color' ); + $this->assertSame( "Field Color", $field->get_label() ); + + $field = Field::make( 'text', '_field_color' ); + $this->assertSame( "Field Color", $field->get_label() ); + + $field = Field::make( 'text', 'crb_field_color' ); + $this->assertSame( "Field Color", $field->get_label() ); + + $field = Field::make('text', '_crb_field_color' ); + $this->assertSame( "Field Color", $field->get_label() ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * @covers ::set_name + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage can only contain lowercase alphanumeric characters + */ + public function testFieldNameCantBeEmpty() { + Field::make( 'text', '' ); + } + + /** + * @covers ::make + * @covers ::factory + * @covers ::__construct + * @covers ::set_name + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage can only contain lowercase alphanumeric characters + */ + public function testFieldNameCantContainHiddenlySupportedBrackets() { + Field::make( 'text', 'test_field_with_[brackets]' ); + } + +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldLoadSaveTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldLoadSaveTest.php new file mode 100644 index 00000000..281127e3 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/FieldLoadSaveTest.php @@ -0,0 +1,148 @@ +subject = M::mock( 'Carbon_Fields\Field\Field' )->makePartial(); + $this->subject->set_base_name( 'carbon_field' ); + $this->subject->set_name( 'carbon_field' ); + $this->subject->set_label( 'Carbon Field' ); + + $this->datastore = M::mock( 'Carbon_Fields\Datastore\Datastore_Interface' ); + } + + public function tearDown(): void { + M::close(); + unset( $this->subject ); + unset( $this->datastore ); + } + + /** + * @covers ::set_datastore + * @covers ::get_datastore + */ + public function testGetDatastoreReturnsPreviouslySetDatastore() { + $this->subject->set_datastore( $this->datastore ); + $this->assertSame( $this->datastore, $this->subject->get_datastore() ); + } + + /** + * @covers ::set_default_value + * @covers ::get_default_value + */ + public function testGetDefaultValueReturnsPreviouslySetDefaultValue() { + $expected = 'test default value'; + $this->subject->set_default_value( $expected ); + $this->assertSame( $expected, $this->subject->get_default_value() ); + } + + /** + * @covers ::set_value + * @covers ::get_value + */ + public function testGetValueReturnsPreviouslySetValue() { + $expected = 'test value'; + $this->subject->set_value( $expected ); + $this->assertSame( $expected, $this->subject->get_value() ); + } + + /** + * @covers ::load + * @covers ::get_value + */ + public function testLoadAppliesDefaultValueWhenDatastoreReturnsNull() { + $expected = 'test default value'; + $this->datastore->shouldReceive( 'load' )->andReturn( null )->once(); + + $this->subject->set_datastore( $this->datastore ); + $this->subject->set_default_value( $expected ); + $this->assertSame( $expected, $this->subject->get_value() ); + $this->subject->load(); + $this->assertSame( $expected, $this->subject->get_value() ); + } + + /** + * @covers ::load + * @covers ::get_value + */ + public function testLoadAppliesTheSameValueWhenDatastoreReturnsValue() { + $expected = 'test value from datastore'; + $this->datastore->shouldReceive( 'load' )->andReturn( array( + array( + Value_Set::VALUE_PROPERTY => $expected, + ), + ) )->once(); + + $this->subject->set_datastore( $this->datastore ); + $this->subject->load(); + $this->assertSame( $expected, $this->subject->get_value() ); + } + + /** + * @covers ::save + */ + public function testSavePassesFieldToDatastore() { + $this->datastore->shouldReceive( 'save' )->once(); + $this->subject->shouldReceive( 'delete' )->once(); + $this->subject->set_datastore( $this->datastore ); + $this->subject->save(); + $this->assertTrue( true ); // rely on Mockery expectations to fail the test + } + + /** + * @covers ::delete + */ + public function testDeletePassesFieldToDatastore() { + $this->datastore->shouldReceive( 'delete' )->once(); + $this->subject->set_datastore( $this->datastore ); + $this->subject->delete(); + $this->assertTrue( true ); // rely on Mockery expectations to fail the test + } + + /** + * @covers ::set_value_from_input + */ + public function testSetValueFromInputTakesValue() { + $expected = 'test value from input'; + $input = array( '_carbon_field' => $expected ); + $this->subject->set_value_from_input( $input ); + $this->assertSame( $expected, $this->subject->get_value() ); + } + + /** + * @covers ::set_value_from_input + */ + public function testSetValueFromInputSetsEmptyValueWhenMissingFromInput() { + $expected = 'test value from input'; + $input = array( ); + $this->subject->set_value_from_input( $input ); + $this->assertSame( '', $this->subject->get_value() ); + } + + /** + * @covers ::get_formatted_value + */ + public function testGetFormattedValueReturnsValue() { + $expected = 'test value from input'; + $this->subject->set_value( $expected ); + $this->assertSame( $expected, $this->subject->get_formatted_value() ); + } + + /** + * @covers ::get_formatted_value + */ + public function testGetFormattedValueReturnsDefaultValue() { + $expected = 'test value from input'; + $this->subject->set_default_value( $expected ); + $this->assertSame( $expected, $this->subject->get_formatted_value() ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/MapFieldTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/MapFieldTest.php new file mode 100644 index 00000000..cbb2a311 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/MapFieldTest.php @@ -0,0 +1,48 @@ +subject = M::mock( 'Carbon_Fields\Field\Map_Field' )->makePartial(); + } + + public function tearDown(): void { + M::close(); + unset( $this->subject ); + } + + /** + * @covers ::set_position + */ + public function testSetPositionUpdatesDefaultValue() { + $clean = array( + Value_Set::VALUE_PROPERTY => '', + 'lat' => 0, + 'lng' => 0, + 'zoom' => 0, + 'address' => '', + ); + $expected = array( + Value_Set::VALUE_PROPERTY => '40.346544,-101.645507', + 'lat' => 40.346544, + 'lng' => -101.645507, + 'zoom' => 10, + 'address' => '', + ); + + $this->subject->set_position( $clean['lat'], $clean['lng'], $clean['zoom'] ); + $this->assertSame( $clean, $this->subject->get_default_value() ); + + $this->subject->set_position( $expected['lat'], $expected['lng'], $expected['zoom'] ); + $this->assertSame( $expected, $this->subject->get_default_value() ); + } +} diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/MiscTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/MiscTest.php new file mode 100644 index 00000000..44933309 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/MiscTest.php @@ -0,0 +1,160 @@ +factory( function( $ioc ) { + return M::mock( 'Carbon_Fields\\Container\\Fulfillable\\Fulfillable_Collection' )->shouldIgnoreMissing(); + } ); + + $ioc['container_conditions'] = function() { + return new PimpleContainer(); + }; + + \Carbon_Fields\Carbon_Fields::instance()->install( $ioc ); + + $this->text_field = Carbon_Fields\Field::make( 'text', 'text_field' ); + $this->set_field = Carbon_Fields\Field::make( 'set', 'set_field' ); + $this->complex_field = Carbon_Fields\Field::make( 'complex', 'complex_field' ); + $this->container = Carbon_Fields\Container::make( 'theme_options', 'Theme Options' ); + } + + public function tearDown(): void { + M::close(); + unset( $this->text_field ); + unset( $this->set_field ); + unset( $this->complex_field ); + unset( $this->container ); + } + + /** + * @covers ::is_simple_root_field + */ + public function testIsSimpleRootFieldForUnassignedFields() { + $this->assertSame( true, $this->text_field->is_simple_root_field() ); + $this->assertSame( false, $this->set_field->is_simple_root_field() ); + $this->assertSame( false, $this->complex_field->is_simple_root_field() ); + } + + /** + * @covers ::is_simple_root_field + */ + public function testIsSimpleRootFieldForRootFields() { + $this->container->add_fields( array( + $this->text_field, + $this->set_field, + $this->complex_field, + ) ); + $this->assertSame( true, $this->text_field->is_simple_root_field() ); + $this->assertSame( false, $this->set_field->is_simple_root_field() ); + $this->assertSame( false, $this->complex_field->is_simple_root_field() ); + } + + /** + * @covers ::is_simple_root_field + */ + public function testIsSimpleRootFieldForNestedFields() { + $parent_field = Carbon_Fields\Field::make( 'complex', 'parent_field' ); + $parent_field->add_fields( array( + $this->text_field, + $this->set_field, + $this->complex_field, + ) ); + $this->container->add_fields( array( + $parent_field, + ) ); + $this->assertSame( false, $this->text_field->is_simple_root_field() ); + $this->assertSame( false, $this->set_field->is_simple_root_field() ); + $this->assertSame( false, $this->complex_field->is_simple_root_field() ); + } + + /** + * @covers ::get_value_set + */ + public function testGetValueSetReturnsDefaultValueSet() { + $default_value_set = new Value_Set(); + $this->assertSame( $default_value_set->get_type(), $this->text_field->get_value_set()->get_type() ); + } + + /** + * @covers ::get_value_set + * @covers ::set_value_set + */ + public function testSetValueSetOverridesValueSet() { + $expected = new Value_Set( Value_Set::TYPE_MULTIPLE_VALUES ); + $this->text_field->set_value_set( $expected ); + $this->assertSame( $expected, $this->text_field->get_value_set() ); + } + + /** + * @covers ::get_name_prefix + * @covers ::set_name_prefix + */ + public function testSetNamePrefixChangesFieldNameWithEmptyPrefix() { + $prefix = ''; + $expected = $prefix . 'text_field'; + $this->text_field->set_name_prefix( $prefix ); + $this->assertSame( $expected, $this->text_field->get_name() ); + } + + /** + * @covers ::get_name_prefix + * @covers ::set_name_prefix + */ + public function testSetNamePrefixChangesFieldName() { + $prefix = '_zzz_'; + $expected = $prefix . 'text_field'; + $this->text_field->set_name_prefix( $prefix ); + $this->assertSame( $expected, $this->text_field->get_name() ); + } + + /** + * @covers ::get_name_prefix + * @covers ::set_name_prefix + */ + public function testSetNamePrefixChangesFieldNameAfterSeveralChanges() { + $prefixes = array( 'test1_', 2, 'test3_' ); + foreach ( $prefixes as $prefix ) { + $this->text_field->set_name_prefix( $prefix ); + } + $expected = $prefixes[ count( $prefixes ) - 1 ] . 'text_field'; + $this->assertSame( $expected, $this->text_field->get_name() ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/PredefinedOptionsFieldTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/PredefinedOptionsFieldTest.php new file mode 100644 index 00000000..ae9acbc7 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Field/PredefinedOptionsFieldTest.php @@ -0,0 +1,294 @@ +subject = M::mock( 'Carbon_Fields\Field\Predefined_Options_Field' )->makePartial(); + } + + public function tearDown(): void { + M::close(); + unset( $this->subject ); + } + + /** + * @covers ::set_options + * @covers ::get_options + */ + public function testSetAndGetOptions() { + $expected = array(1, 2, 3); + $this->subject->set_options( $expected ); + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::set_options + * @covers ::get_options + */ + public function testSetOptionsResetsPreviousOnes() { + $this->subject->set_options( array(1, 2, 3) ); + + $expected = array(4, 5, 6); + $this->subject->set_options( $expected ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::set_options + * @covers ::get_options + */ + public function testSetEmptyArrayWillDeleteExistingOptions() { + $this->subject->set_options( array(1, 2, 3) ); + + $expected = array(); + $this->subject->set_options( $expected ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::set_options + * @covers ::get_options + */ + public function testSetOptionsCallable() { + $expected = array(1, 2, 3); + $callback = function() use ( $expected ) { + return $expected; + }; + + $this->subject->set_options( $callback ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::set_options + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Only arrays and callbacks are allowed in the set_options() method. + */ + public function testSetOptionsString() { + $this->subject->set_options( 'foo' ); + } + + /** + * @covers ::set_options + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Only arrays and callbacks are allowed in the set_options() method. + */ + public function testSetOptionsInteger() { + $this->subject->set_options( 123 ); + } + + /** + * @covers ::set_options + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Only arrays and callbacks are allowed in the set_options() method. + */ + public function testSetOptionsBool() { + $this->subject->set_options( false ); + } + + /** + * @covers ::set_options + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Only arrays and callbacks are allowed in the set_options() method. + */ + public function testSetOptionsObject() { + $this->subject->set_options( M::mock( 'stdClass' ) ); + } + + /** + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArray() { + $expected = array('foo', 'bar'); + + $this->subject->add_options( $expected ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArrayPreservesOtherOptions() { + $options_1 = array( 'foo', 'bar' ); + $options_2 = array( 'foobar', 'barfoo' ); + $expected = array( 'foo', 'bar', 'foobar', 'barfoo' ); + + $this->subject->add_options( $options_1 ); + $this->subject->add_options( $options_2 ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArrayWithAssociativeArray() { + $options_1 = array( 'foo' => 'bar', 'bar' => 'foo' ); + $options_2 = array( 'foobar' => 'barfoo', 'bar' => 'barbar' ); + $expected = array( 'foo' => 'bar', 'bar' => 'foo', 'foobar' => 'barfoo', 'bar' => 'barbar' ); + + $this->subject->add_options( $options_1 ); + $this->subject->add_options( $options_2 ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArraysWithNumericAssociativeArrays() { + $options_1 = array( 3 => 'Option 1' ); + $options_2 = array( 9 => 'Option 2' ); + $expected = array( 3 => 'Option 1', 9 => 'Option 2' ); + + $this->subject->add_options( $options_1 ); + $this->subject->add_options( $options_2 ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArraysWithMixedAssociativeArrays() { + $options_1 = array( 0 => 'Option 1' ); + $options_2 = array( 'foo' => 'Option 2' ); + $options_3 = array( 1 => 'Option 3' ); + $expected = array( 0 => 'Option 1', 'foo' => 'Option 2', 1 => 'Option 3' ); + + $this->subject->add_options( $options_1 ); + $this->subject->add_options( $options_2 ); + $this->subject->add_options( $options_3 ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * Possibly a duplicate of other tests but kept for its readability + * + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArraysReindex() { + $options_1 = array( 0 => 'Option 1' ); + $options_2 = array( 0 => 'Option 2' ); + $expected = array( 0 => 'Option 1', 1 => 'Option 2' ); + + $this->subject->add_options( $options_1 ); + $this->subject->add_options( $options_2 ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArraysAppend() { + $options_1 = array( 0 => 'Option 1', 1 => 'Option 2' ); + $options_2 = array( 9 => 'Option 3' ); + $expected = array( 0 => 'Option 1', 1 => 'Option 2', 9 => 'Option 3' ); + + $this->subject->add_options( $options_1 ); + $this->subject->add_options( $options_2 ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArraysOverwrite() { + $options_1 = array( 0 => 'Option 1' ); + $options_2 = array( 9 => 'Option 2' ); + $options_3 = array( 0 => 'Option 3' ); + $expected = array( 0 => 'Option 3', 9 => 'Option 2' ); + + $this->subject->add_options( $options_1 ); + $this->subject->add_options( $options_2 ); + $this->subject->add_options( $options_3 ); + + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::set_options + * @covers ::add_options + * @covers ::get_options + */ + public function testAddOptionsArrayAfterCallable() { + $base = array( 1, 2, 3 ); + $added = array( 4, 5, 6 ); + $expected = array( 1, 2, 3, 4, 5, 6 ); + + $this->subject->set_options( function() use ( $base ) { + return $base; + } ); + $this->subject->add_options( $added ); + $this->assertSame( $expected, $this->subject->get_options() ); + } + + /** + * @covers ::add_options + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Only arrays and callbacks are allowed in the add_options() method. + */ + public function testAddOptionsString() { + $this->subject->add_options( 'foo' ); + } + + /** + * @covers ::add_options + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Only arrays and callbacks are allowed in the add_options() method. + */ + public function testAddOptionsInteger() { + $this->subject->add_options( 123 ); + } + + /** + * @covers ::add_options + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Only arrays and callbacks are allowed in the add_options() method. + */ + public function testAddOptionsBool() { + $this->subject->add_options( false ); + } + + /** + * @covers ::add_options + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + * @expectedExceptionMessage Only arrays and callbacks are allowed in the add_options() method. + */ + public function testAddOptionsObject() { + $this->subject->add_options( M::mock( 'stdClass' ) ); + } + +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Helper/ColorTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Helper/ColorTest.php new file mode 100644 index 00000000..5fe78d69 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Helper/ColorTest.php @@ -0,0 +1,75 @@ +rgba_solid = array( + 'red' => 17, + 'green' => 34, + 'blue' => 51, + 'alpha' => 1, + ); + + $this->rgba_transparent = array( + 'red' => 17, + 'green' => 34, + 'blue' => 51, + 'alpha' => 0, + ); + } + + public function tearDown(): void { + M::close(); + } + + /** + * @covers ::hex_to_rgba + */ + public function testHexToRgba_ParsesHex() { + $expected = $this->rgba_solid; + $hex = '#112233FF'; + + $this->assertEquals( $expected, Color::hex_to_rgba( $hex ) ); + } + + /** + * @covers ::hex_to_rgba + */ + public function testHexToRgba_WithoutAlpha_DefaultsToMaxAlpha() { + $expected = $this->rgba_solid; + $without_alpha = '#112233'; + + $this->assertEquals( $expected, Color::hex_to_rgba( $without_alpha ) ); + } + + /** + * @covers ::hex_to_rgba + */ + public function testHexToRgba_WithAlpha_ReadsAlphaValue() { + $expected = $this->rgba_transparent; + $transparent = '#11223300'; + + $this->assertEquals( $expected, Color::hex_to_rgba( $transparent ) ); + } + + /** + * @covers ::hex_to_rgba + */ + public function testHexToRgba_IgnoresLeadingNumberSign() { + $expected = $this->rgba_solid; + $with_number_sign = '#112233FF'; + $without_number_sign = '112233FF'; + + $this->assertEquals( $expected, Color::hex_to_rgba( $with_number_sign ) ); + $this->assertEquals( $expected, Color::hex_to_rgba( $without_number_sign ) ); + } +} diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Key_Toolset/KeyToolsetTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Key_Toolset/KeyToolsetTest.php new file mode 100644 index 00000000..53be3336 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Key_Toolset/KeyToolsetTest.php @@ -0,0 +1,500 @@ +connected_to_db ) { + $this->connected_to_db = $wpdb->db_connect(); + } + $this->subject = new Key_Toolset(); + } + + public function tearDown(): void { + global $wpdb; + + M::close(); + unset( $this->subject ); + if ( $this->connected_to_db && is_callable( array( $wpdb, 'close' ) ) ) { + $wpdb->close(); + } + } + + /** + * @covers ::get_sanitized_hierarchy_index + */ + public function testGetSanitizedHierarchyIndexCutsOffExtraValues() { + $full_hierarchy = array( 'field', 'field', 'field', 'field', 'field', 'field' ); + $full_hierarchy_index = array( 1, 2, 3, 4, 5, 6 ); + $expected = array( 1, 2, 3, 4, 5 ); + $this->assertSame( $expected, $this->subject->get_sanitized_hierarchy_index( $full_hierarchy, $full_hierarchy_index ) ); + } + + /** + * @covers ::get_sanitized_hierarchy_index + */ + public function testGetSanitizedHierarchyIndexIgnoresTheLastField() { + $full_hierarchy = array( 'field', 'field' ); + $full_hierarchy_index = array( 1, 2 ); + $expected = array( 1 ); + $this->assertSame( $expected, $this->subject->get_sanitized_hierarchy_index( $full_hierarchy, $full_hierarchy_index ) ); + } + + /** + * @covers ::get_sanitized_hierarchy_index + */ + public function testGetSanitizedHierarchyIndexEnsuresIntegerValues() { + $full_hierarchy = array( 'field', 'field' ); + $full_hierarchy_index = array( '1' ); + $expected = array( 1 ); + $this->assertSame( $expected, $this->subject->get_sanitized_hierarchy_index( $full_hierarchy, $full_hierarchy_index ) ); + } + + /** + * @covers ::get_storage_key + */ + public function testGetStorageKeyReturnsSimpleRootKeyForSimpleRootField() { + $expected = '_field'; + $received = $this->subject->get_storage_key( + true, + array( 'field' ), + array( 0 ), + 0, + Value_Set::VALUE_PROPERTY + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key + */ + public function testGetStorageKeyReturnsSimpleRootKeyForSimpleRootFieldDiscardingExtraInfo() { + $expected = '_field'; + $received = $this->subject->get_storage_key( + true, + array( 'field', 'foo', 'bar' ), + array( 9, 99, 1, 2, 3 ), // added junk + 999, + Value_Set::VALUE_PROPERTY + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key + */ + public function testGetStorageKeyReturnsComplexKeyForSimpleRootFieldWithCustomProperty() { + $expected = '_field|foo:bar|9:99|999|some_property_name'; + $received = $this->subject->get_storage_key( + true, + array( 'field', 'foo', 'bar' ), + array( 9, 99 ), + 999, + 'some_property_name' + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key + */ + public function testGetStorageKeyReturnsComplexKeyForRootField() { + $expected = '_field|||999|' . Value_Set::VALUE_PROPERTY; + $received = $this->subject->get_storage_key( + false, + array( 'field' ), + array( 1, 2, 3 ), // added junk + 999, + Value_Set::VALUE_PROPERTY + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key + */ + public function testGetStorageKeyReturnsComplexKeyForFieldWithDefaultProperty() { + $expected = '_field|foo:bar|9:99|999|' . Value_Set::VALUE_PROPERTY; + $received = $this->subject->get_storage_key( + false, + array( 'field', 'foo', 'bar' ), + array( 9, 99 ), + 999, + Value_Set::VALUE_PROPERTY + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key + */ + public function testGetStorageKeyReturnsComplexKeyForFieldWithCustomProperty() { + $expected = '_field|foo:bar|9:99|999|some_property_name'; + $received = $this->subject->get_storage_key( + false, + array( 'field', 'foo', 'bar' ), + array( 9, 99 ), + 999, + 'some_property_name' + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_with_index_wildcards + */ + public function testGetStorageKeyWithIndexWildcardsReturnsSimpleRootKeyForSimpleRootField() { + $expected = '_field'; + $received = $this->subject->get_storage_key_with_index_wildcards( + true, + array( 'field', 'foo', 'bar' ) + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_with_index_wildcards + */ + public function testGetStorageKeyWithIndexWildcardsReturnsComplexKeyForRootField() { + $expected = '_field|||%|' . Value_Set::VALUE_PROPERTY; + $received = $this->subject->get_storage_key_with_index_wildcards( + false, + array( 'field' ), + Value_Set::VALUE_PROPERTY, + '%' + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_with_index_wildcards + */ + public function testGetStorageKeyWithIndexWildcardsReturnsComplexKeyForNestedField() { + $expected = '_field|foo:bar|%|%|' . Value_Set::VALUE_PROPERTY; + $received = $this->subject->get_storage_key_with_index_wildcards( + false, + array( 'field', 'foo', 'bar' ), + Value_Set::VALUE_PROPERTY, + '%' + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_getter_patterns + */ + public function testGetStorageKeyGetterPatternsForSimpleRootField() { + $expected = array( + '_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + '_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $received = $this->subject->get_storage_key_getter_patterns( + true, + array( 'field' ) + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_getter_patterns + */ + public function testGetStorageKeyGetterPatternsForRootField() { + $expected = array( + '_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $received = $this->subject->get_storage_key_getter_patterns( + false, + array( 'field' ) + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_getter_patterns + */ + public function testGetStorageKeyGetterPatternsForNestedField() { + $expected = array( + '_field|foo:bar|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + '_field|foo:bar:' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $received = $this->subject->get_storage_key_getter_patterns( + false, + array( 'field', 'foo', 'bar' ) + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_deleter_patterns + */ + public function testGetStorageKeyDeleterPatternsForSimpleRootField() { + $expected = array( + '_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + '_field|||' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $received = $this->subject->get_storage_key_deleter_patterns( + false, + true, + array( 'field' ), + array( 0 ) + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_deleter_patterns + */ + public function testGetStorageKeyDeleterPatternsForNestedField() { + $expected = array( + '_field|foo:bar|1:2|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $received = $this->subject->get_storage_key_deleter_patterns( + false, + false, + array( 'field', 'foo', 'bar' ), + array( 1, 2 ) + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_deleter_patterns + */ + public function testGetStorageKeyDeleterPatternsForComplexRootField() { + $expected = array( + '_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $received = $this->subject->get_storage_key_deleter_patterns( + true, + false, + array( 'field' ), + array( 0 ) + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_key_deleter_patterns + */ + public function testGetStorageKeyDeleterPatternsForComplexNestedField() { + $expected = array( + '_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $received = $this->subject->get_storage_key_deleter_patterns( + true, + false, + array( 'field', 'foo', 'bar' ), + array( 1, 2 ) + ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::storage_key_patterns_to_sql + */ + public function testStorageKeyPatternsToSql() { + $table_column = '`option_name`'; + $patterns = array( + '_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + '_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $expected = ' ( `option_name` = "_field" OR `option_name` LIKE "\_field|%" ) '; + $received = $this->subject->storage_key_patterns_to_sql( $table_column, $patterns ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::storage_key_patterns_to_sql + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testStorageKeyPatternsToSqlThrowsExceptionOnInvalidComparison() { + $table_column = '`option_name`'; + $patterns = array( + '_field' => 'non_existant_comparison_type', + ); + $this->subject->storage_key_patterns_to_sql( $table_column, $patterns ); + } + + /** + * @covers ::storage_key_matches_any_pattern + */ + public function testStorageKeyMatchesAnyPatternEqualComparisonTrue() { + $storage_key = '_field'; + $patterns = array( + '_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + ); + $this->assertSame( true, $this->subject->storage_key_matches_any_pattern( $storage_key, $patterns ) ); + } + + /** + * @covers ::storage_key_matches_any_pattern + */ + public function testStorageKeyMatchesAnyPatternEqualComparisonFalse() { + $storage_key = '_field'; + $patterns = array( + '_different_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + ); + $this->assertSame( false, $this->subject->storage_key_matches_any_pattern( $storage_key, $patterns ) ); + } + + /** + * @covers ::storage_key_matches_any_pattern + */ + public function testStorageKeyMatchesAnyPatternStartsWithComparisonTrue() { + $storage_key = '_field|child_field'; + $patterns = array( + '_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $this->assertSame( true, $this->subject->storage_key_matches_any_pattern( $storage_key, $patterns ) ); + } + + /** + * @covers ::storage_key_matches_any_pattern + */ + public function testStorageKeyMatchesAnyPatternStartsWithComparisonFalse() { + $storage_key = '_field|child_field'; + $patterns = array( + '_different_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $this->assertSame( false, $this->subject->storage_key_matches_any_pattern( $storage_key, $patterns ) ); + } + + /** + * @covers ::storage_key_matches_any_pattern + */ + public function testStorageKeyMatchesAnyPatternMixedComparisonTrue() { + $storage_key = '_field|child_field'; + $patterns = array( + '_field|child_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + '_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $this->assertSame( true, $this->subject->storage_key_matches_any_pattern( $storage_key, $patterns ) ); + } + + /** + * @covers ::storage_key_matches_any_pattern + */ + public function testStorageKeyMatchesAnyPatternMixedComparisonTrueForSecond() { + $storage_key = '_field|child_field'; + $patterns = array( + '_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + '_field|child_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + ); + $this->assertSame( true, $this->subject->storage_key_matches_any_pattern( $storage_key, $patterns ) ); + } + + /** + * @covers ::storage_key_matches_any_pattern + */ + public function testStorageKeyMatchesAnyPatternMixedComparisonFalse() { + $storage_key = '_field|child_field'; + $patterns = array( + '_different_field|child_field' => Key_Toolset::PATTERN_COMPARISON_EQUAL, + '_different_field|' => Key_Toolset::PATTERN_COMPARISON_STARTS_WITH, + ); + $this->assertSame( false, $this->subject->storage_key_matches_any_pattern( $storage_key, $patterns ) ); + } + + /** + * @covers ::storage_key_matches_any_pattern + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testStorageKeyMatchesAnyPatternThrowsExceptionOnInvalidComparison() { + $storage_key = '_field'; + $patterns = array( + '_field' => 'non_existant_comparison_type', + ); + $this->subject->storage_key_matches_any_pattern( $storage_key, $patterns ); + } + + /** + * @covers ::is_segments_array_full + */ + public function testIsSegmentsArrayFull() { + $partial_segments = array( 'segment' ); + $this->assertSame( false, $this->subject->is_segments_array_full( $partial_segments ) ); + + $full_segments = array( 'segment', 'segment', 'segment', 'segment', 'segment' ); + $this->assertSame( true, $this->subject->is_segments_array_full( $full_segments ) ); + } + + /** + * @covers ::storage_key_to_segments_array + */ + public function testStorageKeyToSegmentsArray() { + $storage_key = '_field|foo:bar|0|1|' . Value_Set::VALUE_PROPERTY; + $expected = array( 'field', 'foo:bar', '0', '1', Value_Set::VALUE_PROPERTY ); + $this->assertSame( $expected, $this->subject->storage_key_to_segments_array( $storage_key ) ); + } + + /** + * @covers ::segment_to_segment_values_array + */ + public function testSegmentToSegmentValuesArray() { + $storage_key = 'foo:bar:baz'; + $expected = array( 'foo', 'bar', 'baz' ); + $this->assertSame( $expected, $this->subject->segment_to_segment_values_array( $storage_key ) ); + } + + /** + * @covers ::parse_storage_key + */ + public function testParseStorageKeySimpleRootKey() { + $storage_key = '_field'; + $expected = array( + 'root' => 'field', + 'hierarchy' => array(), + 'hierarchy_index' => array(), + 'value_index' => 0, + 'property' => Value_Set::VALUE_PROPERTY, + 'full_hierarchy' => array( 'field' ), + ); + $this->assertSame( $expected, $this->subject->parse_storage_key( $storage_key ) ); + } + + /** + * @covers ::parse_storage_key + */ + public function testParseStorageKeyComplexRootKey() { + $storage_key = '_field||1|2|some_property_name'; + $expected = array( + 'root' => 'field', + 'hierarchy' => array(), + 'hierarchy_index' => array( 1 ), + 'value_index' => 2, + 'property' => 'some_property_name', + 'full_hierarchy' => array( 'field' ), + ); + $this->assertSame( $expected, $this->subject->parse_storage_key( $storage_key ) ); + } + + /** + * @covers ::parse_storage_key + */ + public function testParseStorageKeyNestedKey() { + $storage_key = '_field|foo:bar|1:2|3|some_property_name'; + $expected = array( + 'root' => 'field', + 'hierarchy' => array( 'foo', 'bar' ), + 'hierarchy_index' => array( 1, 2 ), + 'value_index' => 3, + 'property' => 'some_property_name', + 'full_hierarchy' => array( 'field', 'foo', 'bar' ), + ); + $this->assertSame( $expected, $this->subject->parse_storage_key( $storage_key ) ); + } +} diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Service/LegacyStorageServicev15Test.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Service/LegacyStorageServicev15Test.php new file mode 100644 index 00000000..0bcddb46 --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Service/LegacyStorageServicev15Test.php @@ -0,0 +1,210 @@ +factory( function( $ioc ) { + return M::mock( 'Carbon_Fields\\Container\\Fulfillable\\Fulfillable_Collection' )->shouldIgnoreMissing(); + } ); + + $ioc['container_conditions'] = function() { + return new PimpleContainer(); + }; + + \Carbon_Fields\Carbon_Fields::instance()->install( $ioc ); + + $this->datastore = M::mock( 'Carbon_Fields\\Datastore\\Key_Value_Datastore' )->makePartial(); + $this->container = M::mock( 'Carbon_Fields\\Container\\Container', array( 'container_id', 'container_title', 'container_type', $ioc['container_condition_fulfillable_collection'], $ioc['container_condition_translator_json'] ) )->makePartial(); + $this->container->set_datastore( $this->datastore ); + $this->container->add_fields( array( + Field::make( 'text', 'crb_legacy_text' ), + Field::make( 'association', 'crb_legacy_association', 'Legacy Association' ), + Field::make( 'set', 'crb_legacy_set', 'Legacy Set' ) + ->add_options( array( 'one'=>'One', 'two'=>'Two', 'three'=>'Three' ) ), + Field::make( 'map', 'crb_legacy_map', 'Legacy Map' ), + + Field::make( 'complex', 'crb_home_sections', __( 'Sections', 'crb' ) ) + ->add_fields( 'features', __('Features', 'crb'), array( + Field::make( 'complex', 'columns', __( 'Columns', 'crb' ) ) + ->add_fields('col1of4', __('Column 1 of 4', 'crb'), $this->crb_get_column_fields()) + ->add_fields('col3of4', __('Column 3 of 4', 'crb'), array( + Field::make('complex', 'rows', __('Rows', 'crb')) + ->add_fields('row', __('Row', 'crb'), array( + Field::make('complex', 'cols', __('Columns', 'crb')) + ->add_fields('col1of3', __('Column 1 of 3', 'crb'), array( + Field::make('map', 'map', __('Map', 'crb')), + Field::make('set', 'set', __('Set', 'crb')) + ->add_options( array( 'one'=>'One', 'two'=>'Two', 'three'=>'Three' ) ), + Field::make('association', 'association', __('Association', 'crb')), + Field::make('file', 'image', __('Image', 'crb')), + Field::make('text', 'link', __('Link', 'crb')), + )) + ->add_fields('col2of3', __('Column 2 of 3', 'crb'), $this->crb_get_column_fields()) + )) + )) + ) ), + ) ); + $ioc['container_repository']->register_container( $this->container ); + + $this->legacy_storage_array = array( + '_crb_legacy_text' => 'lorem ipsum', + '_crb_legacy_map' => '19.0759837,72.87765590000004', + '_crb_legacy_map-address' => 'Mumbai', + '_crb_legacy_map-zoom' => '6', + '_crb_legacy_map-lng' => '72.87765590000004', + '_crb_legacy_map-lat' => '19.0759837', + '_crb_legacy_set' => 'a:1:{i:0;s:3:"one";}', + '_crb_legacy_association' => 'a:1:{i:0;s:12:"post:post:47";}', + + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_map_0-lat' => '40.7127837', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_map_0-lng' => '-74.0059413', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_map_0-zoom' => '5', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_map_0-address' => 'New York', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_map_0' => '40.7127837,-74.0059413', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_set_0' => 'a:2:{i:0;s:3:"one";i:1;s:5:"three";}', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_association_0' => 'a:1:{i:0;s:12:"post:post:47";}', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_image_0' => '', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col1of3-_link_0' => 'lorem ipsum', + + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col2of3-_image_1' => '65', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col2of3-_link_1' => 'http://example.com/some-internal-path/some-file.php?some_query_arg=someval', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col2of3-_light_1' => '', + '_crb_home_sections_features-_columns_0_col3of4-_rows_0_row-_cols_0_col2of3-_content_1' => '

Regular Sofas

[button link="#"]More Details[/button]', + ); + + $this->subject = M::mock( 'Carbon_Fields\\Service\\Legacy_Storage_Service_v_1_5', array( $ioc['container_repository'], $ioc['key_toolset'] ) )->shouldDeferMissing(); + } + + public function tearDown(): void { + M::close(); + unset( $this->subject ); + } + + protected function crb_get_column_fields() { + return array( + Field::make('file', 'image', __('Image', 'crb')), + Field::make('text', 'link', __('Link', 'crb')) + ->set_width(50) + ->set_required(true), + Field::make('checkbox', 'light', __('Lighter Section', 'crb')) + ->set_width(50), + Field::make('rich_text', 'content', __('Content', 'crb')), + ); + } + + /** + * @covers ::get_storage_array_for_datastore + */ + public function testGetStorageArrayForDatastoreReturnsResultsForAllFields() { + $this->subject->shouldReceive( 'get_legacy_storage_array' )->andReturn( $this->legacy_storage_array ); + $expected = array( + '_crb_legacy_text' => 'lorem ipsum', + '_crb_legacy_text|||0|value' => 'lorem ipsum', + '_crb_legacy_map|||0|value' => '19.0759837,72.87765590000004', + '_crb_legacy_map|||0|lat' => '19.0759837', + '_crb_legacy_map|||0|lng' => '72.87765590000004', + '_crb_legacy_map|||0|zoom' => '6', + '_crb_legacy_map|||0|address' => 'Mumbai', + '_crb_legacy_set|||0|value' => 'one', + '_crb_legacy_association|||0|value' => 'post:post:47', + + '_crb_home_sections|||0|value' => 'features', + '_crb_home_sections|columns|0|0|value' => 'col3of4', + '_crb_home_sections|columns:rows|0:0|0|value' => 'row', + + '_crb_home_sections|columns:rows:cols|0:0:0|0|value' => 'col1of3', + '_crb_home_sections|columns:rows:cols:map|0:0:0:0|0|value' => '40.7127837,-74.0059413', + '_crb_home_sections|columns:rows:cols:map|0:0:0:0|0|lat' => '40.7127837', + '_crb_home_sections|columns:rows:cols:map|0:0:0:0|0|lng' => '-74.0059413', + '_crb_home_sections|columns:rows:cols:map|0:0:0:0|0|zoom' => '5', + '_crb_home_sections|columns:rows:cols:map|0:0:0:0|0|address' => 'New York', + '_crb_home_sections|columns:rows:cols:set|0:0:0:0|0|value' => 'one', + '_crb_home_sections|columns:rows:cols:set|0:0:0:0|1|value' => 'three', + '_crb_home_sections|columns:rows:cols:association|0:0:0:0|0|value' => 'post:post:47', + '_crb_home_sections|columns:rows:cols:image|0:0:0:0|0|value' => '', + '_crb_home_sections|columns:rows:cols:link|0:0:0:0|0|value' => 'lorem ipsum', + + '_crb_home_sections|columns:rows:cols|0:0:0|1|value' => 'col2of3', + '_crb_home_sections|columns:rows:cols:image|0:0:0:1|0|value' => '65', + '_crb_home_sections|columns:rows:cols:link|0:0:0:1|0|value' => 'http://example.com/some-internal-path/some-file.php?some_query_arg=someval', + '_crb_home_sections|columns:rows:cols:light|0:0:0:1|0|value' => '', + '_crb_home_sections|columns:rows:cols:content|0:0:0:1|0|value' => '

Regular Sofas

[button link="#"]More Details[/button]', + ); + $received = $this->subject->get_storage_array_for_datastore( $this->datastore ); + $this->assertSame( $expected, $received ); + } + + /** + * @covers ::get_storage_array + */ + public function testGetStorageArrayReturnsSingleFieldValue() { + $this->subject->shouldReceive( 'get_legacy_storage_array' )->andReturn( array( + '_crb_legacy_text' => 'lorem ipsum', + + // added junk which should be discarded + '_crb_legacy_junk_key' => 'lorem ipsum', + '_crb_legacy_junk_key-_child_0' => 'lorem ipsum', + ) ); + $expected = array( + (object) array( + 'key' => '_crb_legacy_text', + 'value' => 'lorem ipsum', + ), + (object) array( + 'key' => '_crb_legacy_text|||0|value', + 'value' => 'lorem ipsum', + ), + ); + + $container_fields = $this->container->get_fields(); + $legacy_text_field = $container_fields[0]; + $patterns = \Carbon_Fields\Carbon_Fields::resolve( 'key_toolset' )->get_storage_key_getter_patterns( + $legacy_text_field->is_simple_root_field(), + array_merge( $legacy_text_field->get_hierarchy(), array( $legacy_text_field->get_base_name() ) ) + ); + $received = $this->subject->get_storage_array( $this->datastore, $patterns ); + $this->assertEquals( $expected, $received ); + } +} \ No newline at end of file diff --git a/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Value_Set/ValueSetTest.php b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Value_Set/ValueSetTest.php new file mode 100644 index 00000000..1c2a344a --- /dev/null +++ b/web/vendor/htmlburger/carbon-fields/tests/unit-tests/Value_Set/ValueSetTest.php @@ -0,0 +1,390 @@ +assertSame( $expected, $subject->get_type() ); + } + + /** + * @covers ::__construct + * + * @expectedException Carbon_Fields\Exception\Incorrect_Syntax_Exception + */ + public function testInvalidTypeRaisesException() { + $subject = new Value_Set( 'invalid type' ); + } + + /** + * @covers ::keepalive + */ + public function testKeepaliveIsFalseForSingleValueTypes() { + $subject = new Value_Set( Value_Set::TYPE_SINGLE_VALUE ); + $this->assertSame( false, $subject->keepalive() ); + } + + /** + * @covers ::keepalive + */ + public function testKeepaliveIsTrueForMultiValueTypes() { + $subject = new Value_Set( Value_Set::TYPE_MULTIPLE_VALUES ); + $this->assertSame( true, $subject->keepalive() ); + + $subject = new Value_Set( Value_Set::TYPE_MULTIPLE_PROPERTIES ); + $this->assertSame( true, $subject->keepalive() ); + + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET ); + $this->assertSame( true, $subject->keepalive() ); + } + + /** + * @covers ::is_empty + */ + public function testIsEmptyReturnsTrueForFreshInstances() { + $subject = new Value_Set(); + $this->assertSame( true, $subject->is_empty() ); + } + + /** + * @covers ::is_empty + * @covers ::set + */ + public function testIsEmptyReturnsTrueForNull() { + $subject = new Value_Set(); + $subject->set( null ); + $this->assertSame( true, $subject->is_empty() ); + } + + /** + * @covers ::is_empty + * @covers ::set + */ + public function testIsEmptyReturnsTrueForEmptyArray() { + $subject = new Value_Set(); + $subject->set( array() ); + $this->assertSame( true, $subject->is_empty() ); + } + + /** + * @covers ::is_empty + * @covers ::set + */ + public function testIsEmptyReturnsFalseForEmptyString() { + $subject = new Value_Set(); + $subject->set( '' ); + $this->assertSame( false, $subject->is_empty() ); + } + + /** + * @covers ::is_empty + * @covers ::set + */ + public function testIsEmptyReturnsFalseForPopulatedArray() { + $subject = new Value_Set(); + $subject->set( array( + Value_Set::VALUE_PROPERTY => 'test', + ) ); + $this->assertSame( false, $subject->is_empty() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsNullForFreshInstances() { + $subject = new Value_Set(); + $expected = null; + $this->assertSame( $expected, $subject->get() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsNullWhenValueIsSetToNull() { + $subject = new Value_Set(); + $expected = null; + $subject->set( $expected ); + $this->assertSame( $expected, $subject->get() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsStringForSingleValueType() { + $subject = new Value_Set(); + $value = 'expected value'; + $expected = $value; + $subject->set( array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ) ); + $this->assertSame( $expected, $subject->get() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsFlatArrayForMultipleValuesType() { + $subject = new Value_Set( Value_Set::TYPE_MULTIPLE_VALUES ); + $value = 'expected value'; + $expected = array( + $value, + ); + $subject->set( array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ) ); + $this->assertSame( $expected, $subject->get() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsAssociativeArrayForMultiplePropertiesType() { + $subject = new Value_Set( Value_Set::TYPE_MULTIPLE_PROPERTIES ); + $value = 'expected value'; + $expected = array( + Value_Set::VALUE_PROPERTY => $value, + ); + $subject->set( array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ) ); + $this->assertSame( $expected, $subject->get() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsArrayOfAssociativeArraysForValueSetType() { + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET ); + $value = 'expected value'; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ); + $subject->set( array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ) ); + $this->assertSame( $expected, $subject->get() ); + } + + /** + * @covers ::set + * @covers ::get_set + */ + public function testGetReturnsRawValueSetForSingleValueType() { + $subject = new Value_Set(); + $value = 'expected value'; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ); + $subject->set( array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ) ); + $this->assertSame( $expected, $subject->get_set() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsValueSetWithMissingPropertiesAddedIn() { + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET, array( 'foo' => '', 'bar' => '' ) ); + $value = ''; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value, + 'foo' => '', + 'bar' => '', + ), + ); + $subject->set( array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ) ); + $this->assertSame( $expected, $subject->get_set() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsValueSetWithMissingPropertiesAddedInWithDefaultValues() { + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET, array( 'foo' => 'bar', 'bar' => 'foo' ) ); + $value = ''; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value, + 'foo' => 'bar', + 'bar' => 'foo', + ), + ); + $subject->set( array( + array( + Value_Set::VALUE_PROPERTY => $value, + ), + ) ); + $this->assertSame( $expected, $subject->get_set() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetReturnsValueSetWithOnlyMissingPropertiesAddedInWithDefaultValues() { + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET, array( 'foo' => 'bar', 'bar' => 'foo' ) ); + $value = ''; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value, + 'foo' => '', + 'bar' => 'foo', + ), + array( + Value_Set::VALUE_PROPERTY => $value, + 'foo' => 'bar', + 'bar' => '', + ), + ); + $subject->set( array( + array( + Value_Set::VALUE_PROPERTY => $value, + 'foo' => '', + ), + array( + Value_Set::VALUE_PROPERTY => $value, + 'bar' => '', + ), + ) ); + $this->assertSame( $expected, $subject->get_set() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetSetReturnsFullSetWhenSetIsPassedAString() { + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET, array( 'foo' => '', 'bar' => '' ) ); + $value = 'expected value'; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value, + 'foo' => '', + 'bar' => '', + ), + ); + $subject->set( $value ); + $this->assertSame( $expected, $subject->get_set() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetSetReturnsFullSetWhenSetIsPassedAFlatArray() { + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET, array( 'foo' => '', 'bar' => '' ) ); + $value1 = 'value1'; + $value2 = 'value2'; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value1, + 'foo' => '', + 'bar' => '', + ), + array( + Value_Set::VALUE_PROPERTY => $value2, + 'foo' => '', + 'bar' => '', + ), + ); + $subject->set( array( + $value1, + $value2, + ) ); + $this->assertSame( $expected, $subject->get_set() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetSetReturnsFullSetWhenSetIsPassedAnAssociativeArray() { + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET, array( 'foo' => '', 'bar' => '' ) ); + $value = 'expected value'; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value, + 'foo' => 'bar', + 'bar' => 'foo', + ), + ); + $subject->set( array( + Value_Set::VALUE_PROPERTY => $value, + 'foo' => 'bar', + 'bar' => 'foo', + ) ); + $this->assertSame( $expected, $subject->get_set() ); + } + + /** + * @covers ::set + * @covers ::get + */ + public function testGetSetReturnsFullSetWhenSetIsPassedARawValueSet() { + $subject = new Value_Set( Value_Set::TYPE_VALUE_SET, array( 'foo' => '', 'bar' => '' ) ); + $value1 = 'value1'; + $value2 = 'value2'; + $expected = array( + array( + Value_Set::VALUE_PROPERTY => $value1, + 'foo' => 'bar', + 'bar' => 'foo', + ), + array( + Value_Set::VALUE_PROPERTY => $value2, + 'foo' => 'bar', + 'bar' => 'foo', + ), + ); + $subject->set( $expected ); + $this->assertSame( $expected, $subject->get_set() ); + } +} \ No newline at end of file