mirror of
https://github.com/soconnor0919/beenpad.git
synced 2026-02-05 00:06:40 -05:00
first commit
This commit is contained in:
691
node_modules/vitest/LICENSE.md
generated
vendored
Normal file
691
node_modules/vitest/LICENSE.md
generated
vendored
Normal file
@@ -0,0 +1,691 @@
|
||||
# Vitest core license
|
||||
Vitest is released under the MIT license:
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021-Present VoidZero Inc. and Vitest contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
# Licenses of bundled dependencies
|
||||
The published Vitest artifact additionally contains code with the following licenses:
|
||||
BSD-3-Clause, ISC, MIT
|
||||
|
||||
# Bundled dependencies:
|
||||
## @antfu/install-pkg
|
||||
License: MIT
|
||||
By: Anthony Fu
|
||||
Repository: git+https://github.com/antfu/install-pkg.git
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2021 Anthony Fu <https://github.com/antfu>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## @jridgewell/resolve-uri
|
||||
License: MIT
|
||||
By: Justin Ridgewell
|
||||
Repository: https://github.com/jridgewell/resolve-uri
|
||||
|
||||
> Copyright 2019 Justin Ridgewell <jridgewell@google.com>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## @jridgewell/sourcemap-codec
|
||||
License: MIT
|
||||
By: Justin Ridgewell
|
||||
Repository: git+https://github.com/jridgewell/sourcemaps.git
|
||||
|
||||
> Copyright 2024 Justin Ridgewell <justin@ridgewell.name>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## @jridgewell/trace-mapping
|
||||
License: MIT
|
||||
By: Justin Ridgewell
|
||||
Repository: git+https://github.com/jridgewell/sourcemaps.git
|
||||
|
||||
> Copyright 2024 Justin Ridgewell <justin@ridgewell.name>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## @sinonjs/commons
|
||||
License: BSD-3-Clause
|
||||
Repository: git+https://github.com/sinonjs/commons.git
|
||||
|
||||
> BSD 3-Clause License
|
||||
>
|
||||
> Copyright (c) 2018, Sinon.JS
|
||||
> All rights reserved.
|
||||
>
|
||||
> Redistribution and use in source and binary forms, with or without
|
||||
> modification, are permitted provided that the following conditions are met:
|
||||
>
|
||||
> * Redistributions of source code must retain the above copyright notice, this
|
||||
> list of conditions and the following disclaimer.
|
||||
>
|
||||
> * Redistributions in binary form must reproduce the above copyright notice,
|
||||
> this list of conditions and the following disclaimer in the documentation
|
||||
> and/or other materials provided with the distribution.
|
||||
>
|
||||
> * Neither the name of the copyright holder nor the names of its
|
||||
> contributors may be used to endorse or promote products derived from
|
||||
> this software without specific prior written permission.
|
||||
>
|
||||
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## @sinonjs/fake-timers
|
||||
License: BSD-3-Clause
|
||||
By: Christian Johansen
|
||||
Repository: git+https://github.com/sinonjs/fake-timers.git
|
||||
|
||||
> Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no. All rights reserved.
|
||||
>
|
||||
> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
>
|
||||
> 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
>
|
||||
> 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
>
|
||||
> 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
>
|
||||
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## acorn-walk
|
||||
License: MIT
|
||||
By: Marijn Haverbeke, Ingvar Stepanyan, Adrian Heine
|
||||
Repository: https://github.com/acornjs/acorn.git
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (C) 2012-2020 by various contributors (see AUTHORS)
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
> THE SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## birpc
|
||||
License: MIT
|
||||
By: Anthony Fu
|
||||
Repository: git+https://github.com/antfu-collective/birpc.git
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2021 Anthony Fu <https://github.com/antfu>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## cac
|
||||
License: MIT
|
||||
By: egoist
|
||||
Repository: egoist/cac
|
||||
|
||||
> The MIT License (MIT)
|
||||
>
|
||||
> Copyright (c) EGOIST <0x142857@gmail.com> (https://github.com/egoist)
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
> THE SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## empathic
|
||||
License: MIT
|
||||
By: Luke Edwards
|
||||
Repository: lukeed/empathic
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## flatted
|
||||
License: ISC
|
||||
By: Andrea Giammarchi
|
||||
Repository: git+https://github.com/WebReflection/flatted.git
|
||||
|
||||
> ISC License
|
||||
>
|
||||
> Copyright (c) 2018-2020, Andrea Giammarchi, @WebReflection
|
||||
>
|
||||
> Permission to use, copy, modify, and/or distribute this software for any
|
||||
> purpose with or without fee is hereby granted, provided that the above
|
||||
> copyright notice and this permission notice appear in all copies.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
> AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
> LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
> OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
> PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## js-tokens
|
||||
License: MIT
|
||||
By: Simon Lydell
|
||||
Repository: lydell/js-tokens
|
||||
|
||||
> The MIT License (MIT)
|
||||
>
|
||||
> Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Simon Lydell
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
> THE SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## kleur
|
||||
License: MIT
|
||||
By: Luke Edwards
|
||||
Repository: lukeed/kleur
|
||||
|
||||
> The MIT License (MIT)
|
||||
>
|
||||
> Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
> THE SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## local-pkg
|
||||
License: MIT
|
||||
By: Anthony Fu
|
||||
Repository: git+https://github.com/antfu-collective/local-pkg.git
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2021 Anthony Fu <https://github.com/antfu>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## mime
|
||||
License: MIT
|
||||
By: Robert Kieffer
|
||||
Repository: https://github.com/broofa/mime
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2023 Robert Kieffer
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## mlly
|
||||
License: MIT
|
||||
Repository: unjs/mlly
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) Pooya Parsa <pooya@pi0.io>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## package-manager-detector
|
||||
License: MIT
|
||||
By: Anthony Fu
|
||||
Repository: git+https://github.com/antfu-collective/package-manager-detector.git
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2020-PRESENT Anthony Fu <https://github.com/antfu>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## prompts
|
||||
License: MIT
|
||||
By: Terkel Gjervig
|
||||
Repository: terkelg/prompts
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2018 Terkel Gjervig Nielsen
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## quansync
|
||||
License: MIT
|
||||
By: Anthony Fu, 三咲智子 Kevin Deng
|
||||
Repository: git+https://github.com/quansync-dev/quansync.git
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2025-PRESENT Anthony Fu <https://github.com/antfu> and Kevin Deng <https://github.com/sxzz>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## sisteransi
|
||||
License: MIT
|
||||
By: Terkel Gjervig
|
||||
Repository: https://github.com/terkelg/sisteransi
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2018 Terkel Gjervig Nielsen
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## strip-literal
|
||||
License: MIT
|
||||
By: Anthony Fu
|
||||
Repository: git+https://github.com/antfu/strip-literal.git
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) 2022 Anthony Fu <https://github.com/antfu>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## type-detect
|
||||
License: MIT
|
||||
By: Jake Luer, Keith Cirkel, David Losert, Aleksey Shvayka, Lucas Fernandes da Costa, Grant Snodgrass, Jeremy Tice, Edward Betts, dvlsg, Amila Welihinda, Jake Champion, Miroslav Bajtoš
|
||||
Repository: git+ssh://git@github.com/chaijs/type-detect.git
|
||||
|
||||
> Copyright (c) 2013 Jake Luer <jake@alogicalparadox.com> (http://alogicalparadox.com)
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in
|
||||
> all copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
> THE SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## ufo
|
||||
License: MIT
|
||||
Repository: unjs/ufo
|
||||
|
||||
> MIT License
|
||||
>
|
||||
> Copyright (c) Pooya Parsa <pooya@pi0.io>
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
> of this software and associated documentation files (the "Software"), to deal
|
||||
> in the Software without restriction, including without limitation the rights
|
||||
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
> copies of the Software, and to permit persons to whom the Software is
|
||||
> furnished to do so, subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
> SOFTWARE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
## ws
|
||||
License: MIT
|
||||
By: Einar Otto Stangvik
|
||||
Repository: git+https://github.com/websockets/ws.git
|
||||
|
||||
> Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
|
||||
> Copyright (c) 2013 Arnout Kazemier and contributors
|
||||
> Copyright (c) 2016 Luigi Pinca and contributors
|
||||
>
|
||||
> Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
> this software and associated documentation files (the "Software"), to deal in
|
||||
> the Software without restriction, including without limitation the rights to
|
||||
> use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
> the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
> subject to the following conditions:
|
||||
>
|
||||
> The above copyright notice and this permission notice shall be included in all
|
||||
> copies or substantial portions of the Software.
|
||||
>
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
> FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
> COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
> IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
7
node_modules/vitest/README.md
generated
vendored
Normal file
7
node_modules/vitest/README.md
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
# vitest
|
||||
|
||||
[](https://www.npmjs.com/package/vitest)
|
||||
|
||||
Next generation testing framework powered by Vite.
|
||||
|
||||
[GitHub](https://github.com/vitest-dev/vitest) | [Documentation](https://vitest.dev/)
|
||||
7
node_modules/vitest/browser/context.d.ts
generated
vendored
Normal file
7
node_modules/vitest/browser/context.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
// @ts-ignore -- @vitest/browser-playwright might not be installed
|
||||
export * from '@vitest/browser-playwright/context'
|
||||
// @ts-ignore -- @vitest/browser-webdriverio might not be installed
|
||||
export * from '@vitest/browser-webdriverio/context'
|
||||
// @ts-ignore -- @vitest/browser-preview might not be installed
|
||||
export * from '@vitest/browser-preview/context'
|
||||
export { BrowserCommands, FsOptions } from 'vitest/internal/browser'
|
||||
20
node_modules/vitest/browser/context.js
generated
vendored
Normal file
20
node_modules/vitest/browser/context.js
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
// Vitest resolves "vitest/browser" as a virtual module instead
|
||||
|
||||
// fake exports for static analysis
|
||||
export const page = null
|
||||
export const server = null
|
||||
export const userEvent = null
|
||||
export const cdp = null
|
||||
export const commands = null
|
||||
export const locators = null
|
||||
export const utils = null
|
||||
|
||||
const pool = globalThis.__vitest_worker__?.ctx?.pool
|
||||
|
||||
throw new Error(
|
||||
// eslint-disable-next-line prefer-template
|
||||
'vitest/browser can be imported only inside the Browser Mode. '
|
||||
+ (pool
|
||||
? `Your test is running in ${pool} pool. Make sure your regular tests are excluded from the "test.include" glob pattern.`
|
||||
: 'Instead, it was imported outside of Vitest.'),
|
||||
)
|
||||
3
node_modules/vitest/config.d.ts
generated
vendored
Normal file
3
node_modules/vitest/config.d.ts
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
// ensure `@vitest/expect` provides `chai` types
|
||||
import type {} from '@vitest/expect'
|
||||
export * from './dist/config.js'
|
||||
1
node_modules/vitest/coverage.d.ts
generated
vendored
Normal file
1
node_modules/vitest/coverage.d.ts
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export * from './dist/coverage.js'
|
||||
45
node_modules/vitest/dist/browser.d.ts
generated
vendored
Normal file
45
node_modules/vitest/dist/browser.d.ts
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
import { a as SerializedCoverageConfig, S as SerializedConfig } from './chunks/config.d.CzIjkicf.js';
|
||||
import { R as RuntimeCoverageModuleLoader } from './chunks/coverage.d.BZtK59WP.js';
|
||||
import { SerializedDiffOptions } from '@vitest/utils/diff';
|
||||
export { collectTests, startTests } from '@vitest/runner';
|
||||
import * as _vitest_spy from '@vitest/spy';
|
||||
export { _vitest_spy as SpyModule };
|
||||
export { LoupeOptions, ParsedStack, StringifyOptions } from '@vitest/utils';
|
||||
export { format, inspect, stringify } from '@vitest/utils/display';
|
||||
export { processError } from '@vitest/utils/error';
|
||||
export { getType } from '@vitest/utils/helpers';
|
||||
export { DecodedMap, getOriginalPosition } from '@vitest/utils/source-map';
|
||||
export { getSafeTimers, setSafeTimers } from '@vitest/utils/timers';
|
||||
import '@vitest/pretty-format';
|
||||
import '@vitest/snapshot';
|
||||
|
||||
declare function startCoverageInsideWorker(options: SerializedCoverageConfig | undefined, loader: RuntimeCoverageModuleLoader, runtimeOptions: {
|
||||
isolate: boolean;
|
||||
}): Promise<unknown>;
|
||||
declare function takeCoverageInsideWorker(options: SerializedCoverageConfig | undefined, loader: RuntimeCoverageModuleLoader): Promise<unknown>;
|
||||
declare function stopCoverageInsideWorker(options: SerializedCoverageConfig | undefined, loader: RuntimeCoverageModuleLoader, runtimeOptions: {
|
||||
isolate: boolean;
|
||||
}): Promise<unknown>;
|
||||
|
||||
interface PublicModuleRunner {
|
||||
import: (id: string) => Promise<any>;
|
||||
}
|
||||
|
||||
declare function setupCommonEnv(config: SerializedConfig): Promise<void>;
|
||||
declare function loadDiffConfig(config: SerializedConfig, moduleRunner: PublicModuleRunner): Promise<SerializedDiffOptions | undefined>;
|
||||
declare function loadSnapshotSerializers(config: SerializedConfig, moduleRunner: PublicModuleRunner): Promise<void>;
|
||||
|
||||
interface FsOptions {
|
||||
encoding?: BufferEncoding;
|
||||
flag?: string | number;
|
||||
}
|
||||
interface BrowserCommands {
|
||||
readFile: (path: string, options?: BufferEncoding | FsOptions) => Promise<string>;
|
||||
writeFile: (path: string, content: string, options?: BufferEncoding | (FsOptions & {
|
||||
mode?: number | string;
|
||||
})) => Promise<void>;
|
||||
removeFile: (path: string) => Promise<void>;
|
||||
}
|
||||
|
||||
export { loadDiffConfig, loadSnapshotSerializers, setupCommonEnv, startCoverageInsideWorker, stopCoverageInsideWorker, takeCoverageInsideWorker };
|
||||
export type { BrowserCommands, FsOptions };
|
||||
19
node_modules/vitest/dist/browser.js
generated
vendored
Normal file
19
node_modules/vitest/dist/browser.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
export { l as loadDiffConfig, b as loadSnapshotSerializers, c as setupCommonEnv, s as startCoverageInsideWorker, a as stopCoverageInsideWorker, t as takeCoverageInsideWorker } from './chunks/setup-common.Cm-kSBVi.js';
|
||||
export { collectTests, startTests } from '@vitest/runner';
|
||||
import * as spyModule from '@vitest/spy';
|
||||
export { spyModule as SpyModule };
|
||||
export { format, inspect, stringify } from '@vitest/utils/display';
|
||||
export { processError } from '@vitest/utils/error';
|
||||
export { getType } from '@vitest/utils/helpers';
|
||||
export { DecodedMap, getOriginalPosition } from '@vitest/utils/source-map';
|
||||
export { getSafeTimers, setSafeTimers } from '@vitest/utils/timers';
|
||||
import './chunks/coverage.D_JHT54q.js';
|
||||
import '@vitest/snapshot';
|
||||
import './chunks/utils.DvEY5TfP.js';
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
const __INTERNAL = { _extendedMethods: /* @__PURE__ */ new Set() };
|
||||
|
||||
export { __INTERNAL };
|
||||
6
node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
generated
vendored
Normal file
6
node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
||||
function getDefaultExportFromCjs(x) {
|
||||
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
||||
}
|
||||
|
||||
export { commonjsGlobal as c, getDefaultExportFromCjs as g };
|
||||
163
node_modules/vitest/dist/chunks/base.CTp-EStD.js
generated
vendored
Normal file
163
node_modules/vitest/dist/chunks/base.CTp-EStD.js
generated
vendored
Normal file
@@ -0,0 +1,163 @@
|
||||
import { runInThisContext } from 'node:vm';
|
||||
import * as spyModule from '@vitest/spy';
|
||||
import { r as resolveTestRunner, a as resolveSnapshotEnvironment, s as setupChaiConfig } from './index.bFLgAE-Z.js';
|
||||
import { l as loadEnvironment } from './init.B04saIIg.js';
|
||||
import { V as VitestEvaluatedModules } from './evaluatedModules.Dg1zASAC.js';
|
||||
import { s as startVitestModuleRunner, c as createNodeImportMeta } from './startModuleRunner.Iz2V0ESw.js';
|
||||
import { performance as performance$1 } from 'node:perf_hooks';
|
||||
import { startTests, collectTests } from '@vitest/runner';
|
||||
import { c as setupCommonEnv, s as startCoverageInsideWorker, a as stopCoverageInsideWorker } from './setup-common.Cm-kSBVi.js';
|
||||
import { g as globalExpect, v as vi } from './vi.2VT5v0um.js';
|
||||
import { c as closeInspector } from './inspector.CvyFGlXm.js';
|
||||
import { createRequire } from 'node:module';
|
||||
import timers from 'node:timers';
|
||||
import timersPromises from 'node:timers/promises';
|
||||
import util from 'node:util';
|
||||
import { KNOWN_ASSET_TYPES } from '@vitest/utils/constants';
|
||||
import { i as index } from './index.Z5E_ObnR.js';
|
||||
import { g as getWorkerState, r as resetModules, p as provideWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
// this should only be used in Node
|
||||
let globalSetup = false;
|
||||
async function setupGlobalEnv(config, environment) {
|
||||
await setupCommonEnv(config);
|
||||
Object.defineProperty(globalThis, "__vitest_index__", {
|
||||
value: index,
|
||||
enumerable: false
|
||||
});
|
||||
globalExpect.setState({ environment: environment.name });
|
||||
if (globalSetup) return;
|
||||
globalSetup = true;
|
||||
if ((environment.viteEnvironment || environment.name) === "client") {
|
||||
const _require = createRequire(import.meta.url);
|
||||
// always mock "required" `css` files, because we cannot process them
|
||||
_require.extensions[".css"] = resolveCss;
|
||||
_require.extensions[".scss"] = resolveCss;
|
||||
_require.extensions[".sass"] = resolveCss;
|
||||
_require.extensions[".less"] = resolveCss;
|
||||
// since we are using Vite, we can assume how these will be resolved
|
||||
KNOWN_ASSET_TYPES.forEach((type) => {
|
||||
_require.extensions[`.${type}`] = resolveAsset;
|
||||
});
|
||||
process.env.SSR = "";
|
||||
} else process.env.SSR = "1";
|
||||
// @ts-expect-error not typed global for patched timers
|
||||
globalThis.__vitest_required__ = {
|
||||
util,
|
||||
timers,
|
||||
timersPromises
|
||||
};
|
||||
if (!config.disableConsoleIntercept) await setupConsoleLogSpy();
|
||||
}
|
||||
function resolveCss(mod) {
|
||||
mod.exports = "";
|
||||
}
|
||||
function resolveAsset(mod, url) {
|
||||
mod.exports = url;
|
||||
}
|
||||
async function setupConsoleLogSpy() {
|
||||
const { createCustomConsole } = await import('./console.Cf-YriPC.js');
|
||||
globalThis.console = createCustomConsole();
|
||||
}
|
||||
|
||||
// browser shouldn't call this!
|
||||
async function run(method, files, config, moduleRunner, environment, traces) {
|
||||
const workerState = getWorkerState();
|
||||
const [testRunner] = await Promise.all([
|
||||
traces.$("vitest.runtime.runner", () => resolveTestRunner(config, moduleRunner, traces)),
|
||||
traces.$("vitest.runtime.global_env", () => setupGlobalEnv(config, environment)),
|
||||
traces.$("vitest.runtime.coverage.start", () => startCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.isolate })),
|
||||
traces.$("vitest.runtime.snapshot.environment", async () => {
|
||||
if (!workerState.config.snapshotOptions.snapshotEnvironment) workerState.config.snapshotOptions.snapshotEnvironment = await resolveSnapshotEnvironment(config, moduleRunner);
|
||||
})
|
||||
]);
|
||||
workerState.onCancel((reason) => {
|
||||
closeInspector(config);
|
||||
testRunner.cancel?.(reason);
|
||||
});
|
||||
workerState.durations.prepare = performance$1.now() - workerState.durations.prepare;
|
||||
await traces.$(`vitest.test.runner.${method}`, async () => {
|
||||
for (const file of files) {
|
||||
if (config.isolate) {
|
||||
moduleRunner.mocker.reset();
|
||||
resetModules(workerState.evaluatedModules, true);
|
||||
}
|
||||
workerState.filepath = file.filepath;
|
||||
if (method === "run") await traces.$(`vitest.test.runner.${method}.module`, { attributes: { "code.file.path": file.filepath } }, () => startTests([file], testRunner));
|
||||
else await traces.$(`vitest.test.runner.${method}.module`, { attributes: { "code.file.path": file.filepath } }, () => collectTests([file], testRunner));
|
||||
// reset after tests, because user might call `vi.setConfig` in setupFile
|
||||
vi.resetConfig();
|
||||
// mocks should not affect different files
|
||||
vi.restoreAllMocks();
|
||||
}
|
||||
});
|
||||
await traces.$("vitest.runtime.coverage.stop", () => stopCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.isolate }));
|
||||
}
|
||||
|
||||
let _moduleRunner;
|
||||
const evaluatedModules = new VitestEvaluatedModules();
|
||||
const moduleExecutionInfo = /* @__PURE__ */ new Map();
|
||||
function startModuleRunner(options) {
|
||||
if (_moduleRunner) return _moduleRunner;
|
||||
_moduleRunner = startVitestModuleRunner(options);
|
||||
return _moduleRunner;
|
||||
}
|
||||
let _currentEnvironment;
|
||||
let _environmentTime;
|
||||
async function setupEnvironment(context) {
|
||||
const startTime = performance.now();
|
||||
const { environment: { name: environmentName, options: environmentOptions }, rpc, config } = context;
|
||||
// we could load @vite/env, but it would take ~8ms, while this takes ~0,02ms
|
||||
if (context.config.serializedDefines) try {
|
||||
runInThisContext(`(() =>{\n${context.config.serializedDefines}})()`, {
|
||||
lineOffset: 1,
|
||||
filename: "virtual:load-defines.js"
|
||||
});
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to load custom "defines": ${error.message}`);
|
||||
}
|
||||
const otel = context.traces;
|
||||
const { environment, loader } = await loadEnvironment(environmentName, config.root, rpc, otel);
|
||||
_currentEnvironment = environment;
|
||||
const env = await otel.$("vitest.runtime.environment.setup", { attributes: {
|
||||
"vitest.environment": environment.name,
|
||||
"vitest.environment.vite_environment": environment.viteEnvironment || environment.name
|
||||
} }, () => environment.setup(globalThis, environmentOptions || config.environmentOptions || {}));
|
||||
_environmentTime = performance.now() - startTime;
|
||||
if (config.chaiConfig) setupChaiConfig(config.chaiConfig);
|
||||
return async () => {
|
||||
await otel.$("vitest.runtime.environment.teardown", () => env.teardown(globalThis));
|
||||
await loader?.close();
|
||||
};
|
||||
}
|
||||
/** @experimental */
|
||||
async function runBaseTests(method, state, traces) {
|
||||
const { ctx } = state;
|
||||
state.environment = _currentEnvironment;
|
||||
state.durations.environment = _environmentTime;
|
||||
// state has new context, but we want to reuse existing ones
|
||||
state.evaluatedModules = evaluatedModules;
|
||||
state.moduleExecutionInfo = moduleExecutionInfo;
|
||||
provideWorkerState(globalThis, state);
|
||||
if (ctx.invalidates) ctx.invalidates.forEach((filepath) => {
|
||||
(state.evaluatedModules.fileToModulesMap.get(filepath) || []).forEach((module) => {
|
||||
state.evaluatedModules.invalidateModule(module);
|
||||
});
|
||||
});
|
||||
ctx.files.forEach((i) => {
|
||||
const filepath = i.filepath;
|
||||
(state.evaluatedModules.fileToModulesMap.get(filepath) || []).forEach((module) => {
|
||||
state.evaluatedModules.invalidateModule(module);
|
||||
});
|
||||
});
|
||||
const moduleRunner = startModuleRunner({
|
||||
state,
|
||||
evaluatedModules: state.evaluatedModules,
|
||||
spyModule,
|
||||
createImportMeta: createNodeImportMeta,
|
||||
traces
|
||||
});
|
||||
await run(method, ctx.files, ctx.config, moduleRunner, _currentEnvironment, traces);
|
||||
}
|
||||
|
||||
export { runBaseTests as r, setupEnvironment as s };
|
||||
40
node_modules/vitest/dist/chunks/benchmark.B3N2zMcH.js
generated
vendored
Normal file
40
node_modules/vitest/dist/chunks/benchmark.B3N2zMcH.js
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
import { getCurrentSuite } from '@vitest/runner';
|
||||
import { createChainable } from '@vitest/runner/utils';
|
||||
import { noop } from '@vitest/utils/helpers';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
const benchFns = /* @__PURE__ */ new WeakMap();
|
||||
const benchOptsMap = /* @__PURE__ */ new WeakMap();
|
||||
function getBenchOptions(key) {
|
||||
return benchOptsMap.get(key);
|
||||
}
|
||||
function getBenchFn(key) {
|
||||
return benchFns.get(key);
|
||||
}
|
||||
const bench = createBenchmark(function(name, fn = noop, options = {}) {
|
||||
if (getWorkerState().config.mode !== "benchmark") throw new Error("`bench()` is only available in benchmark mode.");
|
||||
const task = getCurrentSuite().task(formatName(name), {
|
||||
...this,
|
||||
meta: { benchmark: true }
|
||||
});
|
||||
benchFns.set(task, fn);
|
||||
benchOptsMap.set(task, options);
|
||||
// vitest runner sets mode to `todo` if handler is not passed down
|
||||
// but we store handler separetly
|
||||
if (!this.todo && task.mode === "todo") task.mode = "run";
|
||||
});
|
||||
function createBenchmark(fn) {
|
||||
const benchmark = createChainable([
|
||||
"skip",
|
||||
"only",
|
||||
"todo"
|
||||
], fn);
|
||||
benchmark.skipIf = (condition) => condition ? benchmark.skip : benchmark;
|
||||
benchmark.runIf = (condition) => condition ? benchmark : benchmark.skip;
|
||||
return benchmark;
|
||||
}
|
||||
function formatName(name) {
|
||||
return typeof name === "string" ? name : typeof name === "function" ? name.name || "<anonymous>" : String(name);
|
||||
}
|
||||
|
||||
export { getBenchOptions as a, bench as b, getBenchFn as g };
|
||||
24
node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts
generated
vendored
Normal file
24
node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
import { Test } from '@vitest/runner';
|
||||
import { ChainableFunction } from '@vitest/runner/utils';
|
||||
import { TaskResult, Bench, Options } from 'tinybench';
|
||||
|
||||
interface Benchmark extends Test {
|
||||
meta: {
|
||||
benchmark: true;
|
||||
result?: TaskResult;
|
||||
};
|
||||
}
|
||||
interface BenchmarkResult extends TaskResult {
|
||||
name: string;
|
||||
rank: number;
|
||||
sampleCount: number;
|
||||
median: number;
|
||||
}
|
||||
type BenchFunction = (this: Bench) => Promise<void> | void;
|
||||
type ChainableBenchmarkAPI = ChainableFunction<"skip" | "only" | "todo", (name: string | Function, fn?: BenchFunction, options?: Options) => void>;
|
||||
type BenchmarkAPI = ChainableBenchmarkAPI & {
|
||||
skipIf: (condition: any) => ChainableBenchmarkAPI;
|
||||
runIf: (condition: any) => ChainableBenchmarkAPI;
|
||||
};
|
||||
|
||||
export type { BenchmarkResult as B, BenchFunction as a, Benchmark as b, BenchmarkAPI as c };
|
||||
57
node_modules/vitest/dist/chunks/browser.d.DBzUq_Na.d.ts
generated
vendored
Normal file
57
node_modules/vitest/dist/chunks/browser.d.DBzUq_Na.d.ts
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
import { FileSpecification } from '@vitest/runner';
|
||||
import { T as TestExecutionMethod } from './worker.d.B4A26qg6.js';
|
||||
|
||||
type SerializedTestSpecification = [project: {
|
||||
name: string | undefined;
|
||||
root: string;
|
||||
}, file: string, options: {
|
||||
pool: string;
|
||||
testLines?: number[] | undefined;
|
||||
}];
|
||||
|
||||
interface ModuleDefinitionLocation {
|
||||
line: number;
|
||||
column: number;
|
||||
}
|
||||
interface SourceModuleLocations {
|
||||
modules: ModuleDefinitionDiagnostic[];
|
||||
untracked: ModuleDefinitionDiagnostic[];
|
||||
}
|
||||
interface ModuleDefinitionDiagnostic {
|
||||
start: ModuleDefinitionLocation;
|
||||
end: ModuleDefinitionLocation;
|
||||
startIndex: number;
|
||||
endIndex: number;
|
||||
rawUrl: string;
|
||||
resolvedUrl: string;
|
||||
resolvedId: string;
|
||||
}
|
||||
interface ModuleDefinitionDurationsDiagnostic extends ModuleDefinitionDiagnostic {
|
||||
selfTime: number;
|
||||
totalTime: number;
|
||||
transformTime?: number;
|
||||
external?: boolean;
|
||||
importer?: string;
|
||||
}
|
||||
interface UntrackedModuleDefinitionDiagnostic {
|
||||
url: string;
|
||||
resolvedId: string;
|
||||
resolvedUrl: string;
|
||||
selfTime: number;
|
||||
totalTime: number;
|
||||
transformTime?: number;
|
||||
external?: boolean;
|
||||
importer?: string;
|
||||
}
|
||||
interface SourceModuleDiagnostic {
|
||||
modules: ModuleDefinitionDurationsDiagnostic[];
|
||||
untrackedModules: UntrackedModuleDefinitionDiagnostic[];
|
||||
}
|
||||
|
||||
interface BrowserTesterOptions {
|
||||
method: TestExecutionMethod;
|
||||
files: FileSpecification[];
|
||||
providedContext: string;
|
||||
}
|
||||
|
||||
export type { BrowserTesterOptions as B, ModuleDefinitionDurationsDiagnostic as M, SerializedTestSpecification as S, UntrackedModuleDefinitionDiagnostic as U, ModuleDefinitionDiagnostic as a, ModuleDefinitionLocation as b, SourceModuleDiagnostic as c, SourceModuleLocations as d };
|
||||
1409
node_modules/vitest/dist/chunks/cac.BNNpZQl7.js
generated
vendored
Normal file
1409
node_modules/vitest/dist/chunks/cac.BNNpZQl7.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
13570
node_modules/vitest/dist/chunks/cli-api.C7sYjHmQ.js
generated
vendored
Normal file
13570
node_modules/vitest/dist/chunks/cli-api.C7sYjHmQ.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
205
node_modules/vitest/dist/chunks/config.d.CzIjkicf.d.ts
generated
vendored
Normal file
205
node_modules/vitest/dist/chunks/config.d.CzIjkicf.d.ts
generated
vendored
Normal file
@@ -0,0 +1,205 @@
|
||||
import { PrettyFormatOptions } from '@vitest/pretty-format';
|
||||
import { SequenceHooks, SequenceSetupFiles } from '@vitest/runner';
|
||||
import { SnapshotUpdateState, SnapshotEnvironment } from '@vitest/snapshot';
|
||||
import { SerializedDiffOptions } from '@vitest/utils/diff';
|
||||
|
||||
/**
|
||||
* Names of clock methods that may be faked by install.
|
||||
*/
|
||||
type FakeMethod =
|
||||
| "setTimeout"
|
||||
| "clearTimeout"
|
||||
| "setImmediate"
|
||||
| "clearImmediate"
|
||||
| "setInterval"
|
||||
| "clearInterval"
|
||||
| "Date"
|
||||
| "nextTick"
|
||||
| "hrtime"
|
||||
| "requestAnimationFrame"
|
||||
| "cancelAnimationFrame"
|
||||
| "requestIdleCallback"
|
||||
| "cancelIdleCallback"
|
||||
| "performance"
|
||||
| "queueMicrotask";
|
||||
|
||||
interface FakeTimerInstallOpts {
|
||||
/**
|
||||
* Installs fake timers with the specified unix epoch (default: 0)
|
||||
*/
|
||||
now?: number | Date | undefined;
|
||||
|
||||
/**
|
||||
* An array with names of global methods and APIs to fake.
|
||||
* For instance, `vi.useFakeTimer({ toFake: ['setTimeout', 'performance'] })` will fake only `setTimeout()` and `performance.now()`
|
||||
* @default everything available globally except `nextTick`
|
||||
*/
|
||||
toFake?: FakeMethod[] | undefined;
|
||||
|
||||
/**
|
||||
* The maximum number of timers that will be run when calling runAll()
|
||||
* @default 10000
|
||||
*/
|
||||
loopLimit?: number | undefined;
|
||||
|
||||
/**
|
||||
* Tells @sinonjs/fake-timers to increment mocked time automatically based on the real system time shift (e.g. the mocked time will be incremented by
|
||||
* 20ms for every 20ms change in the real system time) (default: false)
|
||||
*/
|
||||
shouldAdvanceTime?: boolean | undefined;
|
||||
|
||||
/**
|
||||
* Relevant only when using with shouldAdvanceTime: true. increment mocked time by advanceTimeDelta ms every advanceTimeDelta ms change
|
||||
* in the real system time (default: 20)
|
||||
*/
|
||||
advanceTimeDelta?: number | undefined;
|
||||
|
||||
/**
|
||||
* Tells FakeTimers to clear 'native' (i.e. not fake) timers by delegating to their respective handlers.
|
||||
* @default true
|
||||
*/
|
||||
shouldClearNativeTimers?: boolean | undefined;
|
||||
|
||||
/**
|
||||
* Don't throw error when asked to fake timers that are not present.
|
||||
* @default false
|
||||
*/
|
||||
ignoreMissingTimers?: boolean | undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Config that tests have access to.
|
||||
*/
|
||||
interface SerializedConfig {
|
||||
name: string | undefined;
|
||||
globals: boolean;
|
||||
base: string | undefined;
|
||||
snapshotEnvironment?: string;
|
||||
disableConsoleIntercept: boolean | undefined;
|
||||
runner: string | undefined;
|
||||
isolate: boolean;
|
||||
maxWorkers: number;
|
||||
mode: "test" | "benchmark";
|
||||
bail: number | undefined;
|
||||
environmentOptions?: Record<string, any>;
|
||||
root: string;
|
||||
setupFiles: string[];
|
||||
passWithNoTests: boolean;
|
||||
testNamePattern: RegExp | undefined;
|
||||
allowOnly: boolean;
|
||||
testTimeout: number;
|
||||
hookTimeout: number;
|
||||
clearMocks: boolean;
|
||||
mockReset: boolean;
|
||||
restoreMocks: boolean;
|
||||
unstubGlobals: boolean;
|
||||
unstubEnvs: boolean;
|
||||
fakeTimers: FakeTimerInstallOpts;
|
||||
maxConcurrency: number;
|
||||
defines: Record<string, any>;
|
||||
expect: {
|
||||
requireAssertions?: boolean;
|
||||
poll?: {
|
||||
timeout?: number;
|
||||
interval?: number;
|
||||
};
|
||||
};
|
||||
printConsoleTrace: boolean | undefined;
|
||||
sequence: {
|
||||
shuffle?: boolean;
|
||||
concurrent?: boolean;
|
||||
seed: number;
|
||||
hooks: SequenceHooks;
|
||||
setupFiles: SequenceSetupFiles;
|
||||
};
|
||||
deps: {
|
||||
web: {
|
||||
transformAssets?: boolean;
|
||||
transformCss?: boolean;
|
||||
transformGlobPattern?: RegExp | RegExp[];
|
||||
};
|
||||
optimizer: Record<string, {
|
||||
enabled: boolean;
|
||||
}>;
|
||||
interopDefault: boolean | undefined;
|
||||
moduleDirectories: string[] | undefined;
|
||||
};
|
||||
snapshotOptions: {
|
||||
updateSnapshot: SnapshotUpdateState;
|
||||
expand: boolean | undefined;
|
||||
snapshotFormat: PrettyFormatOptions | undefined;
|
||||
/**
|
||||
* only exists for tests, not available in the main process
|
||||
*/
|
||||
snapshotEnvironment: SnapshotEnvironment;
|
||||
};
|
||||
pool: string;
|
||||
snapshotSerializers: string[];
|
||||
chaiConfig: {
|
||||
includeStack?: boolean;
|
||||
showDiff?: boolean;
|
||||
truncateThreshold?: number;
|
||||
} | undefined;
|
||||
diff: string | SerializedDiffOptions | undefined;
|
||||
retry: number;
|
||||
includeTaskLocation: boolean | undefined;
|
||||
inspect: boolean | string | undefined;
|
||||
inspectBrk: boolean | string | undefined;
|
||||
inspector: {
|
||||
enabled?: boolean;
|
||||
port?: number;
|
||||
host?: string;
|
||||
waitForDebugger?: boolean;
|
||||
};
|
||||
watch: boolean;
|
||||
env: Record<string, any>;
|
||||
browser: {
|
||||
name: string;
|
||||
headless: boolean;
|
||||
isolate: boolean;
|
||||
fileParallelism: boolean;
|
||||
ui: boolean;
|
||||
viewport: {
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
locators: {
|
||||
testIdAttribute: string;
|
||||
};
|
||||
screenshotFailures: boolean;
|
||||
providerOptions: {
|
||||
actionTimeout?: number;
|
||||
};
|
||||
trace: BrowserTraceViewMode;
|
||||
trackUnhandledErrors: boolean;
|
||||
};
|
||||
standalone: boolean;
|
||||
logHeapUsage: boolean | undefined;
|
||||
coverage: SerializedCoverageConfig;
|
||||
benchmark: {
|
||||
includeSamples: boolean;
|
||||
} | undefined;
|
||||
serializedDefines: string;
|
||||
experimental: {
|
||||
fsModuleCache: boolean;
|
||||
printImportBreakdown: boolean | undefined;
|
||||
};
|
||||
}
|
||||
interface SerializedCoverageConfig {
|
||||
provider: "istanbul" | "v8" | "custom" | undefined;
|
||||
reportsDirectory: string;
|
||||
htmlReporter: {
|
||||
subdir: string | undefined;
|
||||
} | undefined;
|
||||
enabled: boolean;
|
||||
customProviderModule: string | undefined;
|
||||
}
|
||||
type RuntimeConfig = Pick<SerializedConfig, "allowOnly" | "testTimeout" | "hookTimeout" | "clearMocks" | "mockReset" | "restoreMocks" | "fakeTimers" | "maxConcurrency" | "expect" | "printConsoleTrace"> & {
|
||||
sequence?: {
|
||||
hooks?: SequenceHooks;
|
||||
};
|
||||
};
|
||||
type RuntimeOptions = Partial<RuntimeConfig>;
|
||||
type BrowserTraceViewMode = "on" | "off" | "on-first-retry" | "on-all-retries" | "retain-on-failure";
|
||||
|
||||
export type { BrowserTraceViewMode as B, FakeTimerInstallOpts as F, RuntimeOptions as R, SerializedConfig as S, SerializedCoverageConfig as a, RuntimeConfig as b };
|
||||
146
node_modules/vitest/dist/chunks/console.Cf-YriPC.js
generated
vendored
Normal file
146
node_modules/vitest/dist/chunks/console.Cf-YriPC.js
generated
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
import { Console } from 'node:console';
|
||||
import { relative } from 'node:path';
|
||||
import { Writable } from 'node:stream';
|
||||
import { getSafeTimers } from '@vitest/utils/timers';
|
||||
import c from 'tinyrainbow';
|
||||
import { R as RealDate } from './date.Bq6ZW5rf.js';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
const UNKNOWN_TEST_ID = "__vitest__unknown_test__";
|
||||
function getTaskIdByStack(root) {
|
||||
const stack = (/* @__PURE__ */ new Error("STACK_TRACE_ERROR")).stack?.split("\n");
|
||||
if (!stack) return UNKNOWN_TEST_ID;
|
||||
const index = stack.findIndex((line) => line.includes("at Console.value"));
|
||||
const line = index === -1 ? null : stack[index + 2];
|
||||
if (!line) return UNKNOWN_TEST_ID;
|
||||
const filepath = line.match(/at\s(.*)\s?/)?.[1];
|
||||
if (filepath) return relative(root, filepath);
|
||||
return UNKNOWN_TEST_ID;
|
||||
}
|
||||
function createCustomConsole(defaultState) {
|
||||
const stdoutBuffer = /* @__PURE__ */ new Map();
|
||||
const stderrBuffer = /* @__PURE__ */ new Map();
|
||||
const timers = /* @__PURE__ */ new Map();
|
||||
const { queueMicrotask } = getSafeTimers();
|
||||
function queueCancelableMicrotask(callback) {
|
||||
let canceled = false;
|
||||
queueMicrotask(() => {
|
||||
if (!canceled) callback();
|
||||
});
|
||||
return () => {
|
||||
canceled = true;
|
||||
};
|
||||
}
|
||||
const state = () => defaultState || getWorkerState();
|
||||
// group sync console.log calls with micro task
|
||||
function schedule(taskId) {
|
||||
const timer = timers.get(taskId);
|
||||
const { stdoutTime, stderrTime } = timer;
|
||||
timer.cancel?.();
|
||||
timer.cancel = queueCancelableMicrotask(() => {
|
||||
if (stderrTime < stdoutTime) {
|
||||
sendStderr(taskId);
|
||||
sendStdout(taskId);
|
||||
} else {
|
||||
sendStdout(taskId);
|
||||
sendStderr(taskId);
|
||||
}
|
||||
});
|
||||
}
|
||||
function sendStdout(taskId) {
|
||||
sendBuffer("stdout", taskId);
|
||||
}
|
||||
function sendStderr(taskId) {
|
||||
sendBuffer("stderr", taskId);
|
||||
}
|
||||
function sendBuffer(type, taskId) {
|
||||
const buffers = type === "stdout" ? stdoutBuffer : stderrBuffer;
|
||||
const buffer = buffers.get(taskId);
|
||||
if (!buffer) return;
|
||||
if (state().config.printConsoleTrace) buffer.forEach(([buffer, origin]) => {
|
||||
sendLog(type, taskId, String(buffer), buffer.length, origin);
|
||||
});
|
||||
else sendLog(type, taskId, buffer.map((i) => String(i[0])).join(""), buffer.length);
|
||||
const timer = timers.get(taskId);
|
||||
buffers.delete(taskId);
|
||||
if (type === "stderr") timer.stderrTime = 0;
|
||||
else timer.stdoutTime = 0;
|
||||
}
|
||||
function sendLog(type, taskId, content, size, origin) {
|
||||
const timer = timers.get(taskId);
|
||||
const time = type === "stderr" ? timer.stderrTime : timer.stdoutTime;
|
||||
state().rpc.onUserConsoleLog({
|
||||
type,
|
||||
content: content || "<empty line>",
|
||||
taskId,
|
||||
time: time || RealDate.now(),
|
||||
size,
|
||||
origin
|
||||
});
|
||||
}
|
||||
return new Console({
|
||||
stdout: new Writable({ write(data, encoding, callback) {
|
||||
const s = state();
|
||||
const id = s?.current?.id || s?.current?.suite?.id || s.current?.file.id || getTaskIdByStack(s.config.root);
|
||||
let timer = timers.get(id);
|
||||
if (timer) timer.stdoutTime = timer.stdoutTime || RealDate.now();
|
||||
else {
|
||||
timer = {
|
||||
stdoutTime: RealDate.now(),
|
||||
stderrTime: RealDate.now()
|
||||
};
|
||||
timers.set(id, timer);
|
||||
}
|
||||
let buffer = stdoutBuffer.get(id);
|
||||
if (!buffer) {
|
||||
buffer = [];
|
||||
stdoutBuffer.set(id, buffer);
|
||||
}
|
||||
if (state().config.printConsoleTrace) {
|
||||
const limit = Error.stackTraceLimit;
|
||||
Error.stackTraceLimit = limit + 6;
|
||||
const trace = (/* @__PURE__ */ new Error("STACK_TRACE")).stack?.split("\n").slice(7).join("\n");
|
||||
Error.stackTraceLimit = limit;
|
||||
buffer.push([data, trace]);
|
||||
} else buffer.push([data, void 0]);
|
||||
schedule(id);
|
||||
callback();
|
||||
} }),
|
||||
stderr: new Writable({ write(data, encoding, callback) {
|
||||
const s = state();
|
||||
const id = s?.current?.id || s?.current?.suite?.id || s.current?.file.id || getTaskIdByStack(s.config.root);
|
||||
let timer = timers.get(id);
|
||||
if (timer) timer.stderrTime = timer.stderrTime || RealDate.now();
|
||||
else {
|
||||
timer = {
|
||||
stderrTime: RealDate.now(),
|
||||
stdoutTime: RealDate.now()
|
||||
};
|
||||
timers.set(id, timer);
|
||||
}
|
||||
let buffer = stderrBuffer.get(id);
|
||||
if (!buffer) {
|
||||
buffer = [];
|
||||
stderrBuffer.set(id, buffer);
|
||||
}
|
||||
if (state().config.printConsoleTrace) {
|
||||
const limit = Error.stackTraceLimit;
|
||||
Error.stackTraceLimit = limit + 6;
|
||||
const stack = (/* @__PURE__ */ new Error("STACK_TRACE")).stack?.split("\n");
|
||||
Error.stackTraceLimit = limit;
|
||||
if (stack?.some((line) => line.includes("at Console.trace"))) buffer.push([data, void 0]);
|
||||
else {
|
||||
const trace = stack?.slice(7).join("\n");
|
||||
Error.stackTraceLimit = limit;
|
||||
buffer.push([data, trace]);
|
||||
}
|
||||
} else buffer.push([data, void 0]);
|
||||
schedule(id);
|
||||
callback();
|
||||
} }),
|
||||
colorMode: c.isColorSupported,
|
||||
groupIndentation: 2
|
||||
});
|
||||
}
|
||||
|
||||
export { UNKNOWN_TEST_ID, createCustomConsole };
|
||||
36
node_modules/vitest/dist/chunks/constants.D_Q9UYh-.js
generated
vendored
Normal file
36
node_modules/vitest/dist/chunks/constants.D_Q9UYh-.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
// if changed, update also jsdocs and docs
|
||||
const defaultPort = 51204;
|
||||
const defaultBrowserPort = 63315;
|
||||
const defaultInspectPort = 9229;
|
||||
const API_PATH = "/__vitest_api__";
|
||||
const CONFIG_NAMES = ["vitest.config", "vite.config"];
|
||||
const CONFIG_EXTENSIONS = [
|
||||
".ts",
|
||||
".mts",
|
||||
".cts",
|
||||
".js",
|
||||
".mjs",
|
||||
".cjs"
|
||||
];
|
||||
const configFiles = CONFIG_NAMES.flatMap((name) => CONFIG_EXTENSIONS.map((ext) => name + ext));
|
||||
const globalApis = [
|
||||
"suite",
|
||||
"test",
|
||||
"describe",
|
||||
"it",
|
||||
"chai",
|
||||
"expect",
|
||||
"assert",
|
||||
"expectTypeOf",
|
||||
"assertType",
|
||||
"vitest",
|
||||
"vi",
|
||||
"beforeAll",
|
||||
"afterAll",
|
||||
"beforeEach",
|
||||
"afterEach",
|
||||
"onTestFinished",
|
||||
"onTestFailed"
|
||||
];
|
||||
|
||||
export { API_PATH as A, defaultPort as a, defaultInspectPort as b, configFiles as c, defaultBrowserPort as d, globalApis as g };
|
||||
3287
node_modules/vitest/dist/chunks/coverage.CtyeYmKM.js
generated
vendored
Normal file
3287
node_modules/vitest/dist/chunks/coverage.CtyeYmKM.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
25
node_modules/vitest/dist/chunks/coverage.D_JHT54q.js
generated
vendored
Normal file
25
node_modules/vitest/dist/chunks/coverage.D_JHT54q.js
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
const CoverageProviderMap = {
|
||||
v8: "@vitest/coverage-v8",
|
||||
istanbul: "@vitest/coverage-istanbul"
|
||||
};
|
||||
async function resolveCoverageProviderModule(options, loader) {
|
||||
if (!options?.enabled || !options.provider) return null;
|
||||
const provider = options.provider;
|
||||
if (provider === "v8" || provider === "istanbul") {
|
||||
let builtInModule = CoverageProviderMap[provider];
|
||||
if (provider === "v8" && loader.isBrowser) builtInModule += "/browser";
|
||||
const { default: coverageModule } = await loader.import(builtInModule);
|
||||
if (!coverageModule) throw new Error(`Failed to load ${CoverageProviderMap[provider]}. Default export is missing.`);
|
||||
return coverageModule;
|
||||
}
|
||||
let customProviderModule;
|
||||
try {
|
||||
customProviderModule = await loader.import(options.customProviderModule);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to load custom CoverageProviderModule from ${options.customProviderModule}`, { cause: error });
|
||||
}
|
||||
if (customProviderModule.default == null) throw new Error(`Custom CoverageProviderModule loaded from ${options.customProviderModule} was not the default export`);
|
||||
return customProviderModule.default;
|
||||
}
|
||||
|
||||
export { CoverageProviderMap as C, resolveCoverageProviderModule as r };
|
||||
37
node_modules/vitest/dist/chunks/coverage.d.BZtK59WP.d.ts
generated
vendored
Normal file
37
node_modules/vitest/dist/chunks/coverage.d.BZtK59WP.d.ts
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
interface RuntimeCoverageModuleLoader {
|
||||
import: (id: string) => Promise<{
|
||||
default: RuntimeCoverageProviderModule;
|
||||
}>;
|
||||
isBrowser?: boolean;
|
||||
moduleExecutionInfo?: Map<string, {
|
||||
startOffset: number;
|
||||
}>;
|
||||
}
|
||||
interface RuntimeCoverageProviderModule {
|
||||
/**
|
||||
* Factory for creating a new coverage provider
|
||||
*/
|
||||
getProvider: () => any;
|
||||
/**
|
||||
* Executed before tests are run in the worker thread.
|
||||
*/
|
||||
startCoverage?: (runtimeOptions: {
|
||||
isolate: boolean;
|
||||
}) => unknown | Promise<unknown>;
|
||||
/**
|
||||
* Executed on after each run in the worker thread. Possible to return a payload passed to the provider
|
||||
*/
|
||||
takeCoverage?: (runtimeOptions?: {
|
||||
moduleExecutionInfo?: Map<string, {
|
||||
startOffset: number;
|
||||
}>;
|
||||
}) => unknown | Promise<unknown>;
|
||||
/**
|
||||
* Executed after all tests have been run in the worker thread.
|
||||
*/
|
||||
stopCoverage?: (runtimeOptions: {
|
||||
isolate: boolean;
|
||||
}) => unknown | Promise<unknown>;
|
||||
}
|
||||
|
||||
export type { RuntimeCoverageModuleLoader as R, RuntimeCoverageProviderModule as a };
|
||||
673
node_modules/vitest/dist/chunks/creator.DAmOKTvJ.js
generated
vendored
Normal file
673
node_modules/vitest/dist/chunks/creator.DAmOKTvJ.js
generated
vendored
Normal file
@@ -0,0 +1,673 @@
|
||||
import { existsSync, writeFileSync, readFileSync } from 'node:fs';
|
||||
import { mkdir, writeFile } from 'node:fs/promises';
|
||||
import { resolve, dirname, relative } from 'node:path';
|
||||
import { detectPackageManager, installPackage } from './index.D3XRDfWc.js';
|
||||
import { p as prompt, a as any } from './index.D4KonVSU.js';
|
||||
import { x } from 'tinyexec';
|
||||
import c from 'tinyrainbow';
|
||||
import { c as configFiles } from './constants.D_Q9UYh-.js';
|
||||
import 'node:process';
|
||||
import 'node:module';
|
||||
import 'node:url';
|
||||
import './_commonjsHelpers.D26ty3Ew.js';
|
||||
import 'readline';
|
||||
import 'events';
|
||||
|
||||
const jsxExample = {
|
||||
name: "HelloWorld.jsx",
|
||||
js: `
|
||||
export default function HelloWorld({ name }) {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello {name}!</h1>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
`,
|
||||
ts: `
|
||||
export default function HelloWorld({ name }: { name: string }) {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello {name}!</h1>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from '@testing-library/jsx'
|
||||
import HelloWorld from './HelloWorld.<EXT>x'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = await render(<HelloWorld name="Vitest" />)
|
||||
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const vueExample = {
|
||||
name: "HelloWorld.vue",
|
||||
js: `
|
||||
<script setup>
|
||||
defineProps({
|
||||
name: String
|
||||
})
|
||||
<\/script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<h1>Hello {{ name }}!</h1>
|
||||
</div>
|
||||
</template>
|
||||
`,
|
||||
ts: `
|
||||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
name: string
|
||||
}>()
|
||||
<\/script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<h1>Hello {{ name }}!</h1>
|
||||
</div>
|
||||
</template>
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from 'vitest-browser-vue'
|
||||
import HelloWorld from './HelloWorld.vue'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = render(HelloWorld, {
|
||||
props: { name: 'Vitest' },
|
||||
})
|
||||
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const svelteExample = {
|
||||
name: "HelloWorld.svelte",
|
||||
js: `
|
||||
<script>
|
||||
export let name
|
||||
<\/script>
|
||||
|
||||
<h1>Hello {name}!</h1>
|
||||
`,
|
||||
ts: `
|
||||
<script lang="ts">
|
||||
export let name: string
|
||||
<\/script>
|
||||
|
||||
<h1>Hello {name}!</h1>
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from 'vitest-browser-svelte'
|
||||
import HelloWorld from './HelloWorld.svelte'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = render(HelloWorld, { name: 'Vitest' })
|
||||
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const markoExample = {
|
||||
name: "HelloWorld.marko",
|
||||
js: `
|
||||
class {
|
||||
onCreate() {
|
||||
this.state = { name: null }
|
||||
}
|
||||
}
|
||||
|
||||
<h1>Hello \${state.name}!</h1>
|
||||
`,
|
||||
ts: `
|
||||
export interface Input {
|
||||
name: string
|
||||
}
|
||||
|
||||
<h1>Hello \${input.name}!</h1>
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from '@marko/testing-library'
|
||||
import HelloWorld from './HelloWorld.svelte'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = await render(HelloWorld, { name: 'Vitest' })
|
||||
const element = getByText('Hello Vitest!')
|
||||
expect(element).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const litExample = {
|
||||
name: "HelloWorld.js",
|
||||
js: `
|
||||
import { html, LitElement } from 'lit'
|
||||
|
||||
export class HelloWorld extends LitElement {
|
||||
static properties = {
|
||||
name: { type: String },
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.name = 'World'
|
||||
}
|
||||
|
||||
render() {
|
||||
return html\`<h1>Hello \${this.name}!</h1>\`
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define('hello-world', HelloWorld)
|
||||
`,
|
||||
ts: `
|
||||
import { html, LitElement } from 'lit'
|
||||
import { customElement, property } from 'lit/decorators.js'
|
||||
|
||||
@customElement('hello-world')
|
||||
export class HelloWorld extends LitElement {
|
||||
@property({ type: String })
|
||||
name = 'World'
|
||||
|
||||
render() {
|
||||
return html\`<h1>Hello \${this.name}!</h1>\`
|
||||
}
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'hello-world': HelloWorld
|
||||
}
|
||||
}
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from 'vitest-browser-lit'
|
||||
import { html } from 'lit'
|
||||
import './HelloWorld.js'
|
||||
|
||||
test('renders name', async () => {
|
||||
const screen = render(html\`<hello-world name="Vitest"></hello-world>\`)
|
||||
const element = screen.getByText('Hello Vitest!')
|
||||
await expect.element(element).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const qwikExample = {
|
||||
name: "HelloWorld.jsx",
|
||||
js: `
|
||||
import { component$ } from '@builder.io/qwik'
|
||||
|
||||
export default component$(({ name }) => {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello {name}!</h1>
|
||||
</div>
|
||||
)
|
||||
})
|
||||
`,
|
||||
ts: `
|
||||
import { component$ } from '@builder.io/qwik'
|
||||
|
||||
export default component$(({ name }: { name: string }) => {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello {name}!</h1>
|
||||
</div>
|
||||
)
|
||||
})
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { render } from 'vitest-browser-qwik'
|
||||
import HelloWorld from './HelloWorld.tsx'
|
||||
|
||||
test('renders name', async () => {
|
||||
const { getByText } = render(<HelloWorld name="Vitest" />)
|
||||
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
const vanillaExample = {
|
||||
name: "HelloWorld.js",
|
||||
js: `
|
||||
export default function HelloWorld({ name }) {
|
||||
const parent = document.createElement('div')
|
||||
|
||||
const h1 = document.createElement('h1')
|
||||
h1.textContent = 'Hello ' + name + '!'
|
||||
parent.appendChild(h1)
|
||||
|
||||
return parent
|
||||
}
|
||||
`,
|
||||
ts: `
|
||||
export default function HelloWorld({ name }: { name: string }): HTMLDivElement {
|
||||
const parent = document.createElement('div')
|
||||
|
||||
const h1 = document.createElement('h1')
|
||||
h1.textContent = 'Hello ' + name + '!'
|
||||
parent.appendChild(h1)
|
||||
|
||||
return parent
|
||||
}
|
||||
`,
|
||||
test: `
|
||||
import { expect, test } from 'vitest'
|
||||
import { getByText } from '@testing-library/dom'
|
||||
import HelloWorld from './HelloWorld.js'
|
||||
|
||||
test('renders name', () => {
|
||||
const parent = HelloWorld({ name: 'Vitest' })
|
||||
document.body.appendChild(parent)
|
||||
|
||||
const element = getByText(parent, 'Hello Vitest!')
|
||||
expect(element).toBeInTheDocument()
|
||||
})
|
||||
`
|
||||
};
|
||||
function getExampleTest(framework) {
|
||||
switch (framework) {
|
||||
case "solid": return {
|
||||
...jsxExample,
|
||||
test: jsxExample.test.replace("@testing-library/jsx", `@testing-library/${framework}`)
|
||||
};
|
||||
case "preact":
|
||||
case "react": return {
|
||||
...jsxExample,
|
||||
test: jsxExample.test.replace("@testing-library/jsx", `vitest-browser-${framework}`)
|
||||
};
|
||||
case "vue": return vueExample;
|
||||
case "svelte": return svelteExample;
|
||||
case "lit": return litExample;
|
||||
case "marko": return markoExample;
|
||||
case "qwik": return qwikExample;
|
||||
default: return vanillaExample;
|
||||
}
|
||||
}
|
||||
async function generateExampleFiles(framework, lang) {
|
||||
const example = getExampleTest(framework);
|
||||
let fileName = example.name;
|
||||
const folder = resolve(process.cwd(), "vitest-example");
|
||||
const fileContent = example[lang];
|
||||
if (!existsSync(folder)) await mkdir(folder, { recursive: true });
|
||||
const isJSX = fileName.endsWith(".jsx");
|
||||
if (isJSX && lang === "ts") fileName = fileName.replace(".jsx", ".tsx");
|
||||
else if (fileName.endsWith(".js") && lang === "ts") fileName = fileName.replace(".js", ".ts");
|
||||
example.test = example.test.replace("<EXT>", lang);
|
||||
const filePath = resolve(folder, fileName);
|
||||
const testPath = resolve(folder, `HelloWorld.test.${isJSX ? `${lang}x` : lang}`);
|
||||
writeFileSync(filePath, fileContent.trimStart(), "utf-8");
|
||||
writeFileSync(testPath, example.test.trimStart(), "utf-8");
|
||||
return testPath;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
const log = console.log;
|
||||
function getProviderOptions() {
|
||||
return Object.entries({
|
||||
playwright: "Playwright relies on Chrome DevTools protocol. Read more: https://playwright.dev",
|
||||
webdriverio: "WebdriverIO uses WebDriver protocol. Read more: https://webdriver.io",
|
||||
preview: "Preview is useful to quickly run your tests in the browser, but not suitable for CI."
|
||||
}).map(([provider, description]) => {
|
||||
return {
|
||||
title: provider,
|
||||
description,
|
||||
value: provider
|
||||
};
|
||||
});
|
||||
}
|
||||
function getBrowserNames(provider) {
|
||||
switch (provider) {
|
||||
case "webdriverio": return [
|
||||
"chrome",
|
||||
"firefox",
|
||||
"edge",
|
||||
"safari"
|
||||
];
|
||||
case "playwright": return [
|
||||
"chromium",
|
||||
"firefox",
|
||||
"webkit"
|
||||
];
|
||||
case "preview": return [
|
||||
"chrome",
|
||||
"firefox",
|
||||
"safari"
|
||||
];
|
||||
}
|
||||
}
|
||||
function getFramework() {
|
||||
return [
|
||||
{
|
||||
title: "vanilla",
|
||||
value: "vanilla",
|
||||
description: "No framework, just plain JavaScript or TypeScript."
|
||||
},
|
||||
{
|
||||
title: "vue",
|
||||
value: "vue",
|
||||
description: "\"The Progressive JavaScript Framework\""
|
||||
},
|
||||
{
|
||||
title: "svelte",
|
||||
value: "svelte",
|
||||
description: "\"Svelte: cybernetically enhanced web apps\""
|
||||
},
|
||||
{
|
||||
title: "react",
|
||||
value: "react",
|
||||
description: "\"The library for web and native user interfaces\""
|
||||
},
|
||||
{
|
||||
title: "lit",
|
||||
value: "lit",
|
||||
description: "\"A simple library for building fast, lightweight web components.\""
|
||||
},
|
||||
{
|
||||
title: "preact",
|
||||
value: "preact",
|
||||
description: "\"Fast 3kB alternative to React with the same modern API\""
|
||||
},
|
||||
{
|
||||
title: "solid",
|
||||
value: "solid",
|
||||
description: "\"Simple and performant reactivity for building user interfaces\""
|
||||
},
|
||||
{
|
||||
title: "marko",
|
||||
value: "marko",
|
||||
description: "\"A declarative, HTML-based language that makes building web apps fun\""
|
||||
},
|
||||
{
|
||||
title: "qwik",
|
||||
value: "qwik",
|
||||
description: "\"Instantly interactive web apps at scale\""
|
||||
}
|
||||
];
|
||||
}
|
||||
function getFrameworkTestPackage(framework) {
|
||||
switch (framework) {
|
||||
case "vanilla": return null;
|
||||
case "vue": return "vitest-browser-vue";
|
||||
case "svelte": return "vitest-browser-svelte";
|
||||
case "react": return "vitest-browser-react";
|
||||
case "lit": return "vitest-browser-lit";
|
||||
case "preact": return "vitest-browser-preact";
|
||||
case "solid": return "@solidjs/testing-library";
|
||||
case "marko": return "@marko/testing-library";
|
||||
case "qwik": return "vitest-browser-qwik";
|
||||
}
|
||||
throw new Error(`Unsupported framework: ${framework}`);
|
||||
}
|
||||
function getFrameworkPluginPackage(framework) {
|
||||
switch (framework) {
|
||||
case "vue": return "@vitejs/plugin-vue";
|
||||
case "svelte": return "@sveltejs/vite-plugin-svelte";
|
||||
case "react": return "@vitejs/plugin-react";
|
||||
case "preact": return "@preact/preset-vite";
|
||||
case "solid": return "vite-plugin-solid";
|
||||
case "marko": return "@marko/vite";
|
||||
case "qwik": return "@builder.io/qwik/optimizer";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function getLanguageOptions() {
|
||||
return [{
|
||||
title: "TypeScript",
|
||||
description: "Use TypeScript.",
|
||||
value: "ts"
|
||||
}, {
|
||||
title: "JavaScript",
|
||||
description: "Use plain JavaScript.",
|
||||
value: "js"
|
||||
}];
|
||||
}
|
||||
async function installPackages(pkgManager, packages) {
|
||||
if (!packages.length) {
|
||||
log(c.green("✔"), c.bold("All packages are already installed."));
|
||||
return;
|
||||
}
|
||||
log(c.cyan("◼"), c.bold("Installing packages..."));
|
||||
log(c.cyan("◼"), packages.join(", "));
|
||||
log();
|
||||
await installPackage(packages, {
|
||||
dev: true,
|
||||
packageManager: pkgManager ?? void 0
|
||||
});
|
||||
}
|
||||
function readPkgJson(path) {
|
||||
if (!existsSync(path)) return null;
|
||||
const content = readFileSync(path, "utf-8");
|
||||
return JSON.parse(content);
|
||||
}
|
||||
function getPossibleDefaults(dependencies) {
|
||||
return {
|
||||
lang: "ts",
|
||||
provider: getPossibleProvider(dependencies),
|
||||
framework: getPossibleFramework(dependencies)
|
||||
};
|
||||
}
|
||||
function getPossibleFramework(dependencies) {
|
||||
if (dependencies.vue || dependencies["vue-tsc"] || dependencies["@vue/reactivity"]) return "vue";
|
||||
if (dependencies.react || dependencies["react-dom"]) return "react";
|
||||
if (dependencies.svelte || dependencies["@sveltejs/kit"]) return "svelte";
|
||||
if (dependencies.lit || dependencies["lit-html"]) return "lit";
|
||||
if (dependencies.preact) return "preact";
|
||||
if (dependencies["solid-js"] || dependencies["@solidjs/start"]) return "solid";
|
||||
if (dependencies.marko) return "marko";
|
||||
if (dependencies["@builder.io/qwik"] || dependencies["@qwik.dev/core"]) return "qwik";
|
||||
return "vanilla";
|
||||
}
|
||||
function getPossibleProvider(dependencies) {
|
||||
if (dependencies.webdriverio || dependencies["@wdio/cli"] || dependencies["@wdio/config"]) return "webdriverio";
|
||||
// playwright is the default recommendation
|
||||
return "playwright";
|
||||
}
|
||||
function getProviderDocsLink(provider) {
|
||||
switch (provider) {
|
||||
case "playwright": return "https://vitest.dev/config/browser/playwright";
|
||||
case "webdriverio": return "https://vitest.dev/config/browser/webdriverio";
|
||||
}
|
||||
}
|
||||
function sort(choices, value) {
|
||||
const index = choices.findIndex((i) => i.value === value);
|
||||
if (index === -1) return choices;
|
||||
return [choices.splice(index, 1)[0], ...choices];
|
||||
}
|
||||
function fail() {
|
||||
process.exitCode = 1;
|
||||
}
|
||||
function getFrameworkImportInfo(framework) {
|
||||
switch (framework) {
|
||||
case "svelte": return {
|
||||
importName: "svelte",
|
||||
isNamedExport: true
|
||||
};
|
||||
case "qwik": return {
|
||||
importName: "qwikVite",
|
||||
isNamedExport: true
|
||||
};
|
||||
default: return {
|
||||
importName: framework,
|
||||
isNamedExport: false
|
||||
};
|
||||
}
|
||||
}
|
||||
async function generateFrameworkConfigFile(options) {
|
||||
const { importName, isNamedExport } = getFrameworkImportInfo(options.framework);
|
||||
const frameworkImport = isNamedExport ? `import { ${importName} } from '${options.frameworkPlugin}'` : `import ${importName} from '${options.frameworkPlugin}'`;
|
||||
const configContent = [
|
||||
`import { defineConfig } from 'vitest/config'`,
|
||||
`import { ${options.provider} } from '@vitest/browser-${options.provider}'`,
|
||||
options.frameworkPlugin ? frameworkImport : null,
|
||||
``,
|
||||
"export default defineConfig({",
|
||||
options.frameworkPlugin ? ` plugins: [${importName}()],` : null,
|
||||
` test: {`,
|
||||
` browser: {`,
|
||||
` enabled: true,`,
|
||||
` provider: ${options.provider}(),`,
|
||||
options.provider !== "preview" && ` // ${getProviderDocsLink(options.provider)}`,
|
||||
` instances: [`,
|
||||
...options.browsers.map((browser) => ` { browser: '${browser}' },`),
|
||||
` ],`,
|
||||
` },`,
|
||||
` },`,
|
||||
`})`,
|
||||
""
|
||||
].filter((t) => typeof t === "string").join("\n");
|
||||
await writeFile(options.configPath, configContent);
|
||||
}
|
||||
async function updatePkgJsonScripts(pkgJsonPath, vitestScript) {
|
||||
if (!existsSync(pkgJsonPath)) {
|
||||
const pkg = { scripts: { "test:browser": vitestScript } };
|
||||
await writeFile(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
|
||||
} else {
|
||||
const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
|
||||
pkg.scripts = pkg.scripts || {};
|
||||
pkg.scripts["test:browser"] = vitestScript;
|
||||
await writeFile(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
|
||||
}
|
||||
log(c.green("✔"), "Added \"test:browser\" script to your package.json.");
|
||||
}
|
||||
function getRunScript(pkgManager) {
|
||||
switch (pkgManager) {
|
||||
case "yarn@berry":
|
||||
case "yarn": return "yarn test:browser";
|
||||
case "pnpm@6":
|
||||
case "pnpm": return "pnpm test:browser";
|
||||
case "bun": return "bun test:browser";
|
||||
default: return "npm run test:browser";
|
||||
}
|
||||
}
|
||||
function getPlaywrightRunArgs(pkgManager) {
|
||||
switch (pkgManager) {
|
||||
case "yarn@berry":
|
||||
case "yarn": return ["yarn", "exec"];
|
||||
case "pnpm@6":
|
||||
case "pnpm": return ["pnpx"];
|
||||
case "bun": return ["bunx"];
|
||||
default: return ["npx"];
|
||||
}
|
||||
}
|
||||
async function create() {
|
||||
log(c.cyan("◼"), "This utility will help you set up a browser testing environment.\n");
|
||||
const pkgJsonPath = resolve(process.cwd(), "package.json");
|
||||
const pkg = readPkgJson(pkgJsonPath) || {};
|
||||
const dependencies = {
|
||||
...pkg.dependencies,
|
||||
...pkg.devDependencies
|
||||
};
|
||||
const defaults = getPossibleDefaults(dependencies);
|
||||
const { lang } = await prompt({
|
||||
type: "select",
|
||||
name: "lang",
|
||||
message: "Choose a language for your tests",
|
||||
choices: sort(getLanguageOptions(), defaults?.lang)
|
||||
});
|
||||
if (!lang) return fail();
|
||||
const { provider } = await prompt({
|
||||
type: "select",
|
||||
name: "provider",
|
||||
message: "Choose a browser provider. Vitest will use its API to control the testing environment",
|
||||
choices: sort(getProviderOptions(), defaults?.provider)
|
||||
});
|
||||
if (!provider) return fail();
|
||||
const { browsers } = await prompt({
|
||||
type: "multiselect",
|
||||
name: "browsers",
|
||||
message: "Choose a browser",
|
||||
choices: getBrowserNames(provider).map((browser) => ({
|
||||
title: browser,
|
||||
value: browser
|
||||
}))
|
||||
});
|
||||
if (!provider) return fail();
|
||||
const { framework } = await prompt({
|
||||
type: "select",
|
||||
name: "framework",
|
||||
message: "Choose your framework",
|
||||
choices: sort(getFramework(), defaults?.framework)
|
||||
});
|
||||
if (!framework) return fail();
|
||||
let installPlaywright = false;
|
||||
if (provider === "playwright") ({installPlaywright} = await prompt({
|
||||
type: "confirm",
|
||||
name: "installPlaywright",
|
||||
message: `Install Playwright browsers (can be done manually via 'pnpm exec playwright install')?`
|
||||
}));
|
||||
if (installPlaywright == null) return fail();
|
||||
const dependenciesToInstall = [`@vitest/browser-${provider}`];
|
||||
const frameworkPackage = getFrameworkTestPackage(framework);
|
||||
if (frameworkPackage) dependenciesToInstall.push(frameworkPackage);
|
||||
const frameworkPlugin = getFrameworkPluginPackage(framework);
|
||||
if (frameworkPlugin) dependenciesToInstall.push(frameworkPlugin);
|
||||
const pkgManager = await detectPackageManager();
|
||||
log();
|
||||
await installPackages(pkgManager, dependenciesToInstall.filter((pkg) => !dependencies[pkg]));
|
||||
const rootConfig = any(configFiles, { cwd: process.cwd() });
|
||||
let scriptCommand = "vitest";
|
||||
log();
|
||||
if (rootConfig) {
|
||||
const configPath = resolve(dirname(rootConfig), `vitest.browser.config.${lang}`);
|
||||
scriptCommand = `vitest --config=${relative(process.cwd(), configPath)}`;
|
||||
await generateFrameworkConfigFile({
|
||||
configPath,
|
||||
framework,
|
||||
frameworkPlugin,
|
||||
provider,
|
||||
browsers
|
||||
});
|
||||
log(
|
||||
c.green("✔"),
|
||||
"Created a new config file for browser tests:",
|
||||
c.bold(relative(process.cwd(), configPath)),
|
||||
// TODO: Can we modify the config ourselves?
|
||||
"\nSince you already have a Vitest config file, it is recommended to copy the contents of the new file ",
|
||||
"into your existing config located at ",
|
||||
c.bold(relative(process.cwd(), rootConfig))
|
||||
);
|
||||
} else {
|
||||
const configPath = resolve(process.cwd(), `vitest.config.${lang}`);
|
||||
await generateFrameworkConfigFile({
|
||||
configPath,
|
||||
framework,
|
||||
frameworkPlugin,
|
||||
provider,
|
||||
browsers
|
||||
});
|
||||
log(c.green("✔"), "Created a config file for browser tests:", c.bold(relative(process.cwd(), configPath)));
|
||||
}
|
||||
log();
|
||||
await updatePkgJsonScripts(pkgJsonPath, scriptCommand);
|
||||
if (installPlaywright) {
|
||||
log();
|
||||
const [command, ...args] = getPlaywrightRunArgs(pkgManager);
|
||||
const allArgs = [
|
||||
...args,
|
||||
"playwright",
|
||||
"install",
|
||||
"--with-deps"
|
||||
];
|
||||
log(c.cyan("◼"), `Installing Playwright dependencies with \`${c.bold(command)} ${c.bold(allArgs.join(" "))}\`...`);
|
||||
log();
|
||||
await x(command, allArgs, { nodeOptions: { stdio: [
|
||||
"pipe",
|
||||
"inherit",
|
||||
"inherit"
|
||||
] } });
|
||||
}
|
||||
log();
|
||||
const exampleTestFile = await generateExampleFiles(framework, lang);
|
||||
log(c.green("✔"), "Created example test file in", c.bold(relative(process.cwd(), exampleTestFile)));
|
||||
log(c.dim(" You can safely delete this file once you have written your own tests."));
|
||||
log();
|
||||
log(c.cyan("◼"), "All done! Run your tests with", c.bold(getRunScript(pkgManager)));
|
||||
}
|
||||
|
||||
export { create };
|
||||
73
node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
generated
vendored
Normal file
73
node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
/* Ported from https://github.com/boblauer/MockDate/blob/master/src/mockdate.ts */
|
||||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Bob Lauer
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
const RealDate = Date;
|
||||
let now = null;
|
||||
class MockDate extends RealDate {
|
||||
constructor(y, m, d, h, M, s, ms) {
|
||||
super();
|
||||
let date;
|
||||
switch (arguments.length) {
|
||||
case 0:
|
||||
if (now !== null) date = new RealDate(now.valueOf());
|
||||
else date = new RealDate();
|
||||
break;
|
||||
case 1:
|
||||
date = new RealDate(y);
|
||||
break;
|
||||
default:
|
||||
d = typeof d === "undefined" ? 1 : d;
|
||||
h = h || 0;
|
||||
M = M || 0;
|
||||
s = s || 0;
|
||||
ms = ms || 0;
|
||||
date = new RealDate(y, m, d, h, M, s, ms);
|
||||
break;
|
||||
}
|
||||
Object.setPrototypeOf(date, MockDate.prototype);
|
||||
return date;
|
||||
}
|
||||
}
|
||||
MockDate.UTC = RealDate.UTC;
|
||||
MockDate.now = function() {
|
||||
return new MockDate().valueOf();
|
||||
};
|
||||
MockDate.parse = function(dateString) {
|
||||
return RealDate.parse(dateString);
|
||||
};
|
||||
MockDate.toString = function() {
|
||||
return RealDate.toString();
|
||||
};
|
||||
function mockDate(date) {
|
||||
const dateObj = new RealDate(date.valueOf());
|
||||
if (Number.isNaN(dateObj.getTime())) throw new TypeError(`mockdate: The time set is an invalid date: ${date}`);
|
||||
// @ts-expect-error global
|
||||
globalThis.Date = MockDate;
|
||||
now = dateObj.valueOf();
|
||||
}
|
||||
function resetDate() {
|
||||
globalThis.Date = RealDate;
|
||||
}
|
||||
|
||||
export { RealDate as R, mockDate as m, resetDate as r };
|
||||
74
node_modules/vitest/dist/chunks/defaults.BOqNVLsY.js
generated
vendored
Normal file
74
node_modules/vitest/dist/chunks/defaults.BOqNVLsY.js
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
import nodeos__default from 'node:os';
|
||||
import './env.D4Lgay0q.js';
|
||||
import { isCI } from 'std-env';
|
||||
|
||||
const defaultInclude = ["**/*.{test,spec}.?(c|m)[jt]s?(x)"];
|
||||
const defaultExclude = ["**/node_modules/**", "**/.git/**"];
|
||||
const benchmarkConfigDefaults = {
|
||||
include: ["**/*.{bench,benchmark}.?(c|m)[jt]s?(x)"],
|
||||
exclude: defaultExclude,
|
||||
includeSource: [],
|
||||
reporters: ["default"],
|
||||
includeSamples: false
|
||||
};
|
||||
// These are the generic defaults for coverage. Providers may also set some provider specific defaults.
|
||||
const coverageConfigDefaults = {
|
||||
provider: "v8",
|
||||
enabled: false,
|
||||
clean: true,
|
||||
cleanOnRerun: true,
|
||||
reportsDirectory: "./coverage",
|
||||
exclude: [],
|
||||
reportOnFailure: false,
|
||||
reporter: [
|
||||
["text", {}],
|
||||
["html", {}],
|
||||
["clover", {}],
|
||||
["json", {}]
|
||||
],
|
||||
allowExternal: false,
|
||||
excludeAfterRemap: false,
|
||||
processingConcurrency: Math.min(20, nodeos__default.availableParallelism?.() ?? nodeos__default.cpus().length)
|
||||
};
|
||||
const fakeTimersDefaults = {
|
||||
loopLimit: 1e4,
|
||||
shouldClearNativeTimers: true
|
||||
};
|
||||
const configDefaults = Object.freeze({
|
||||
allowOnly: !isCI,
|
||||
isolate: true,
|
||||
watch: !isCI && process.stdin.isTTY,
|
||||
globals: false,
|
||||
environment: "node",
|
||||
clearMocks: false,
|
||||
restoreMocks: false,
|
||||
mockReset: false,
|
||||
unstubGlobals: false,
|
||||
unstubEnvs: false,
|
||||
include: defaultInclude,
|
||||
exclude: defaultExclude,
|
||||
teardownTimeout: 1e4,
|
||||
forceRerunTriggers: ["**/package.json/**", "**/{vitest,vite}.config.*/**"],
|
||||
update: false,
|
||||
reporters: [],
|
||||
silent: false,
|
||||
hideSkippedTests: false,
|
||||
api: false,
|
||||
ui: false,
|
||||
uiBase: "/__vitest__/",
|
||||
open: !isCI,
|
||||
css: { include: [] },
|
||||
coverage: coverageConfigDefaults,
|
||||
fakeTimers: fakeTimersDefaults,
|
||||
maxConcurrency: 5,
|
||||
dangerouslyIgnoreUnhandledErrors: false,
|
||||
typecheck: {
|
||||
checker: "tsc",
|
||||
include: ["**/*.{test,spec}-d.?(c|m)[jt]s?(x)"],
|
||||
exclude: defaultExclude
|
||||
},
|
||||
slowTestThreshold: 300,
|
||||
disableConsoleIntercept: false
|
||||
});
|
||||
|
||||
export { coverageConfigDefaults as a, defaultInclude as b, configDefaults as c, defaultExclude as d, benchmarkConfigDefaults as e };
|
||||
8
node_modules/vitest/dist/chunks/env.D4Lgay0q.js
generated
vendored
Normal file
8
node_modules/vitest/dist/chunks/env.D4Lgay0q.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import { isCI } from 'std-env';
|
||||
|
||||
const isNode = typeof process < "u" && typeof process.stdout < "u" && !process.versions?.deno && !globalThis.window;
|
||||
const isDeno = typeof process < "u" && typeof process.stdout < "u" && process.versions?.deno !== void 0;
|
||||
const isWindows = (isNode || isDeno) && process.platform === "win32";
|
||||
const isTTY = (isNode || isDeno) && process.stdout?.isTTY && !isCI;
|
||||
|
||||
export { isWindows as a, isTTY as i };
|
||||
29
node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts
generated
vendored
Normal file
29
node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
import { Awaitable } from '@vitest/utils';
|
||||
|
||||
interface EnvironmentReturn {
|
||||
teardown: (global: any) => Awaitable<void>;
|
||||
}
|
||||
interface VmEnvironmentReturn {
|
||||
getVmContext: () => {
|
||||
[key: string]: any;
|
||||
};
|
||||
teardown: () => Awaitable<void>;
|
||||
}
|
||||
interface Environment {
|
||||
name: string;
|
||||
/**
|
||||
* @deprecated use `viteEnvironment` instead. Uses `name` by default
|
||||
*/
|
||||
transformMode?: "web" | "ssr";
|
||||
/**
|
||||
* Environment initiated by the Vite server. It is usually available
|
||||
* as `vite.server.environments.${name}`.
|
||||
*
|
||||
* By default, fallbacks to `name`.
|
||||
*/
|
||||
viteEnvironment?: "client" | "ssr" | ({} & string);
|
||||
setupVM?: (options: Record<string, any>) => Awaitable<VmEnvironmentReturn>;
|
||||
setup: (global: any, options: Record<string, any>) => Awaitable<EnvironmentReturn>;
|
||||
}
|
||||
|
||||
export type { Environment as E, VmEnvironmentReturn as V, EnvironmentReturn as a };
|
||||
17
node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js
generated
vendored
Normal file
17
node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
import { dirname, resolve } from 'pathe';
|
||||
import { EvaluatedModules } from 'vite/module-runner';
|
||||
|
||||
// TODO: this is not needed in Vite 7.2+
|
||||
class VitestEvaluatedModules extends EvaluatedModules {
|
||||
getModuleSourceMapById(id) {
|
||||
const map = super.getModuleSourceMapById(id);
|
||||
if (map != null && !("_patched" in map)) {
|
||||
map._patched = true;
|
||||
const dir = dirname(map.url);
|
||||
map.resolvedSources = (map.map.sources || []).map((s) => resolve(dir, s || ""));
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
||||
export { VitestEvaluatedModules as V };
|
||||
7
node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts
generated
vendored
Normal file
7
node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import { EvaluatedModules } from 'vite/module-runner';
|
||||
|
||||
declare class VitestEvaluatedModules extends EvaluatedModules {
|
||||
getModuleSourceMapById(id: string): any;
|
||||
}
|
||||
|
||||
export { VitestEvaluatedModules as V };
|
||||
71
node_modules/vitest/dist/chunks/git.Bm2pzPAa.js
generated
vendored
Normal file
71
node_modules/vitest/dist/chunks/git.Bm2pzPAa.js
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
import { resolve } from 'pathe';
|
||||
import { x } from 'tinyexec';
|
||||
|
||||
class VitestGit {
|
||||
root;
|
||||
constructor(cwd) {
|
||||
this.cwd = cwd;
|
||||
}
|
||||
async resolveFilesWithGitCommand(args) {
|
||||
let result;
|
||||
try {
|
||||
result = await x("git", args, { nodeOptions: { cwd: this.root } });
|
||||
} catch (e) {
|
||||
e.message = e.stderr;
|
||||
throw e;
|
||||
}
|
||||
return result.stdout.split("\n").filter((s) => s !== "").map((changedPath) => resolve(this.root, changedPath));
|
||||
}
|
||||
async findChangedFiles(options) {
|
||||
const root = await this.getRoot(this.cwd);
|
||||
if (!root) return null;
|
||||
this.root = root;
|
||||
const changedSince = options.changedSince;
|
||||
if (typeof changedSince === "string") {
|
||||
const [committed, staged, unstaged] = await Promise.all([
|
||||
this.getFilesSince(changedSince),
|
||||
this.getStagedFiles(),
|
||||
this.getUnstagedFiles()
|
||||
]);
|
||||
return [
|
||||
...committed,
|
||||
...staged,
|
||||
...unstaged
|
||||
];
|
||||
}
|
||||
const [staged, unstaged] = await Promise.all([this.getStagedFiles(), this.getUnstagedFiles()]);
|
||||
return [...staged, ...unstaged];
|
||||
}
|
||||
getFilesSince(hash) {
|
||||
return this.resolveFilesWithGitCommand([
|
||||
"diff",
|
||||
"--name-only",
|
||||
`${hash}...HEAD`
|
||||
]);
|
||||
}
|
||||
getStagedFiles() {
|
||||
return this.resolveFilesWithGitCommand([
|
||||
"diff",
|
||||
"--cached",
|
||||
"--name-only"
|
||||
]);
|
||||
}
|
||||
getUnstagedFiles() {
|
||||
return this.resolveFilesWithGitCommand([
|
||||
"ls-files",
|
||||
"--other",
|
||||
"--modified",
|
||||
"--exclude-standard"
|
||||
]);
|
||||
}
|
||||
async getRoot(cwd) {
|
||||
const args = ["rev-parse", "--show-cdup"];
|
||||
try {
|
||||
return resolve(cwd, (await x("git", args, { nodeOptions: { cwd } })).stdout.trim());
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export { VitestGit };
|
||||
99
node_modules/vitest/dist/chunks/global.d.B15mdLcR.d.ts
generated
vendored
Normal file
99
node_modules/vitest/dist/chunks/global.d.B15mdLcR.d.ts
generated
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
import { PromisifyAssertion, Tester, ExpectStatic } from '@vitest/expect';
|
||||
import { Plugin } from '@vitest/pretty-format';
|
||||
import { SnapshotState } from '@vitest/snapshot';
|
||||
import { B as BenchmarkResult } from './benchmark.d.DAaHLpsq.js';
|
||||
import { U as UserConsoleLog } from './rpc.d.RH3apGEf.js';
|
||||
|
||||
interface SnapshotMatcher<T> {
|
||||
<U extends { [P in keyof T] : any }>(snapshot: Partial<U>, hint?: string): void;
|
||||
(hint?: string): void;
|
||||
}
|
||||
interface InlineSnapshotMatcher<T> {
|
||||
<U extends { [P in keyof T] : any }>(properties: Partial<U>, snapshot?: string, hint?: string): void;
|
||||
(hint?: string): void;
|
||||
}
|
||||
declare module "@vitest/expect" {
|
||||
interface MatcherState {
|
||||
environment: string;
|
||||
snapshotState: SnapshotState;
|
||||
}
|
||||
interface ExpectPollOptions {
|
||||
interval?: number;
|
||||
timeout?: number;
|
||||
message?: string;
|
||||
}
|
||||
interface ExpectStatic {
|
||||
assert: Chai.AssertStatic;
|
||||
unreachable: (message?: string) => never;
|
||||
soft: <T>(actual: T, message?: string) => Assertion<T>;
|
||||
poll: <T>(actual: () => T, options?: ExpectPollOptions) => PromisifyAssertion<Awaited<T>>;
|
||||
addEqualityTesters: (testers: Array<Tester>) => void;
|
||||
assertions: (expected: number) => void;
|
||||
hasAssertions: () => void;
|
||||
addSnapshotSerializer: (plugin: Plugin) => void;
|
||||
}
|
||||
interface Assertion<T> {
|
||||
matchSnapshot: SnapshotMatcher<T>;
|
||||
toMatchSnapshot: SnapshotMatcher<T>;
|
||||
toMatchInlineSnapshot: InlineSnapshotMatcher<T>;
|
||||
/**
|
||||
* Checks that an error thrown by a function matches a previously recorded snapshot.
|
||||
*
|
||||
* @param hint - Optional custom error message.
|
||||
*
|
||||
* @example
|
||||
* expect(functionWithError).toThrowErrorMatchingSnapshot();
|
||||
*/
|
||||
toThrowErrorMatchingSnapshot: (hint?: string) => void;
|
||||
/**
|
||||
* Checks that an error thrown by a function matches an inline snapshot within the test file.
|
||||
* Useful for keeping snapshots close to the test code.
|
||||
*
|
||||
* @param snapshot - Optional inline snapshot string to match.
|
||||
* @param hint - Optional custom error message.
|
||||
*
|
||||
* @example
|
||||
* const throwError = () => { throw new Error('Error occurred') };
|
||||
* expect(throwError).toThrowErrorMatchingInlineSnapshot(`"Error occurred"`);
|
||||
*/
|
||||
toThrowErrorMatchingInlineSnapshot: (snapshot?: string, hint?: string) => void;
|
||||
/**
|
||||
* Compares the received value to a snapshot saved in a specified file.
|
||||
* Useful for cases where snapshot content is large or needs to be shared across tests.
|
||||
*
|
||||
* @param filepath - Path to the snapshot file.
|
||||
* @param hint - Optional custom error message.
|
||||
*
|
||||
* @example
|
||||
* await expect(largeData).toMatchFileSnapshot('path/to/snapshot.json');
|
||||
*/
|
||||
toMatchFileSnapshot: (filepath: string, hint?: string) => Promise<void>;
|
||||
}
|
||||
}
|
||||
declare module "@vitest/runner" {
|
||||
interface TestContext {
|
||||
/**
|
||||
* `expect` instance bound to the current test.
|
||||
*
|
||||
* This API is useful for running snapshot tests concurrently because global expect cannot track them.
|
||||
*/
|
||||
readonly expect: ExpectStatic;
|
||||
/** @internal */
|
||||
_local: boolean;
|
||||
}
|
||||
interface TaskMeta {
|
||||
typecheck?: boolean;
|
||||
benchmark?: boolean;
|
||||
failScreenshotPath?: string;
|
||||
}
|
||||
interface File {
|
||||
prepareDuration?: number;
|
||||
environmentLoad?: number;
|
||||
}
|
||||
interface TaskBase {
|
||||
logs?: UserConsoleLog[];
|
||||
}
|
||||
interface TaskResult {
|
||||
benchmark?: BenchmarkResult;
|
||||
}
|
||||
}
|
||||
30
node_modules/vitest/dist/chunks/globals.DOayXfHP.js
generated
vendored
Normal file
30
node_modules/vitest/dist/chunks/globals.DOayXfHP.js
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
import { g as globalApis } from './constants.D_Q9UYh-.js';
|
||||
import { i as index } from './index.Z5E_ObnR.js';
|
||||
import './vi.2VT5v0um.js';
|
||||
import '@vitest/expect';
|
||||
import '@vitest/runner';
|
||||
import './utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/timers';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/error';
|
||||
import '@vitest/utils/helpers';
|
||||
import '@vitest/spy';
|
||||
import '@vitest/utils/offset';
|
||||
import '@vitest/utils/source-map';
|
||||
import './_commonjsHelpers.D26ty3Ew.js';
|
||||
import './date.Bq6ZW5rf.js';
|
||||
import './benchmark.B3N2zMcH.js';
|
||||
import './evaluatedModules.Dg1zASAC.js';
|
||||
import 'pathe';
|
||||
import 'vite/module-runner';
|
||||
import 'expect-type';
|
||||
|
||||
function registerApiGlobally() {
|
||||
globalApis.forEach((api) => {
|
||||
// @ts-expect-error I know what I am doing :P
|
||||
globalThis[api] = index[api];
|
||||
});
|
||||
}
|
||||
|
||||
export { registerApiGlobally };
|
||||
220
node_modules/vitest/dist/chunks/index.0kCJoeWi.js
generated
vendored
Normal file
220
node_modules/vitest/dist/chunks/index.0kCJoeWi.js
generated
vendored
Normal file
@@ -0,0 +1,220 @@
|
||||
const TYPE_REQUEST = "q";
|
||||
const TYPE_RESPONSE = "s";
|
||||
const DEFAULT_TIMEOUT = 6e4;
|
||||
function defaultSerialize(i) {
|
||||
return i;
|
||||
}
|
||||
const defaultDeserialize = defaultSerialize;
|
||||
const { clearTimeout, setTimeout } = globalThis;
|
||||
const random = Math.random.bind(Math);
|
||||
function createBirpc($functions, options) {
|
||||
const {
|
||||
post,
|
||||
on,
|
||||
off = () => {
|
||||
},
|
||||
eventNames = [],
|
||||
serialize = defaultSerialize,
|
||||
deserialize = defaultDeserialize,
|
||||
resolver,
|
||||
bind = "rpc",
|
||||
timeout = DEFAULT_TIMEOUT
|
||||
} = options;
|
||||
let $closed = false;
|
||||
const _rpcPromiseMap = /* @__PURE__ */ new Map();
|
||||
let _promiseInit;
|
||||
async function _call(method, args, event, optional) {
|
||||
if ($closed)
|
||||
throw new Error(`[birpc] rpc is closed, cannot call "${method}"`);
|
||||
const req = { m: method, a: args, t: TYPE_REQUEST };
|
||||
if (optional)
|
||||
req.o = true;
|
||||
const send = async (_req) => post(serialize(_req));
|
||||
if (event) {
|
||||
await send(req);
|
||||
return;
|
||||
}
|
||||
if (_promiseInit) {
|
||||
try {
|
||||
await _promiseInit;
|
||||
} finally {
|
||||
_promiseInit = void 0;
|
||||
}
|
||||
}
|
||||
let { promise, resolve, reject } = createPromiseWithResolvers();
|
||||
const id = nanoid();
|
||||
req.i = id;
|
||||
let timeoutId;
|
||||
async function handler(newReq = req) {
|
||||
if (timeout >= 0) {
|
||||
timeoutId = setTimeout(() => {
|
||||
try {
|
||||
const handleResult = options.onTimeoutError?.(method, args);
|
||||
if (handleResult !== true)
|
||||
throw new Error(`[birpc] timeout on calling "${method}"`);
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
_rpcPromiseMap.delete(id);
|
||||
}, timeout);
|
||||
if (typeof timeoutId === "object")
|
||||
timeoutId = timeoutId.unref?.();
|
||||
}
|
||||
_rpcPromiseMap.set(id, { resolve, reject, timeoutId, method });
|
||||
await send(newReq);
|
||||
return promise;
|
||||
}
|
||||
try {
|
||||
if (options.onRequest)
|
||||
await options.onRequest(req, handler, resolve);
|
||||
else
|
||||
await handler();
|
||||
} catch (e) {
|
||||
if (options.onGeneralError?.(e) !== true)
|
||||
throw e;
|
||||
return;
|
||||
} finally {
|
||||
clearTimeout(timeoutId);
|
||||
_rpcPromiseMap.delete(id);
|
||||
}
|
||||
return promise;
|
||||
}
|
||||
const $call = (method, ...args) => _call(method, args, false);
|
||||
const $callOptional = (method, ...args) => _call(method, args, false, true);
|
||||
const $callEvent = (method, ...args) => _call(method, args, true);
|
||||
const $callRaw = (options2) => _call(options2.method, options2.args, options2.event, options2.optional);
|
||||
const builtinMethods = {
|
||||
$call,
|
||||
$callOptional,
|
||||
$callEvent,
|
||||
$callRaw,
|
||||
$rejectPendingCalls,
|
||||
get $closed() {
|
||||
return $closed;
|
||||
},
|
||||
$close,
|
||||
$functions
|
||||
};
|
||||
const rpc = new Proxy({}, {
|
||||
get(_, method) {
|
||||
if (Object.prototype.hasOwnProperty.call(builtinMethods, method))
|
||||
return builtinMethods[method];
|
||||
if (method === "then" && !eventNames.includes("then") && !("then" in $functions))
|
||||
return void 0;
|
||||
const sendEvent = (...args) => _call(method, args, true);
|
||||
if (eventNames.includes(method)) {
|
||||
sendEvent.asEvent = sendEvent;
|
||||
return sendEvent;
|
||||
}
|
||||
const sendCall = (...args) => _call(method, args, false);
|
||||
sendCall.asEvent = sendEvent;
|
||||
return sendCall;
|
||||
}
|
||||
});
|
||||
function $close(customError) {
|
||||
$closed = true;
|
||||
_rpcPromiseMap.forEach(({ reject, method }) => {
|
||||
const error = new Error(`[birpc] rpc is closed, cannot call "${method}"`);
|
||||
if (customError) {
|
||||
customError.cause ??= error;
|
||||
return reject(customError);
|
||||
}
|
||||
reject(error);
|
||||
});
|
||||
_rpcPromiseMap.clear();
|
||||
off(onMessage);
|
||||
}
|
||||
function $rejectPendingCalls(handler) {
|
||||
const entries = Array.from(_rpcPromiseMap.values());
|
||||
const handlerResults = entries.map(({ method, reject }) => {
|
||||
if (!handler) {
|
||||
return reject(new Error(`[birpc]: rejected pending call "${method}".`));
|
||||
}
|
||||
return handler({ method, reject });
|
||||
});
|
||||
_rpcPromiseMap.clear();
|
||||
return handlerResults;
|
||||
}
|
||||
async function onMessage(data, ...extra) {
|
||||
let msg;
|
||||
try {
|
||||
msg = deserialize(data);
|
||||
} catch (e) {
|
||||
if (options.onGeneralError?.(e) !== true)
|
||||
throw e;
|
||||
return;
|
||||
}
|
||||
if (msg.t === TYPE_REQUEST) {
|
||||
const { m: method, a: args, o: optional } = msg;
|
||||
let result, error;
|
||||
let fn = await (resolver ? resolver(method, $functions[method]) : $functions[method]);
|
||||
if (optional)
|
||||
fn ||= () => void 0;
|
||||
if (!fn) {
|
||||
error = new Error(`[birpc] function "${method}" not found`);
|
||||
} else {
|
||||
try {
|
||||
result = await fn.apply(bind === "rpc" ? rpc : $functions, args);
|
||||
} catch (e) {
|
||||
error = e;
|
||||
}
|
||||
}
|
||||
if (msg.i) {
|
||||
if (error && options.onError)
|
||||
options.onError(error, method, args);
|
||||
if (error && options.onFunctionError) {
|
||||
if (options.onFunctionError(error, method, args) === true)
|
||||
return;
|
||||
}
|
||||
if (!error) {
|
||||
try {
|
||||
await post(serialize({ t: TYPE_RESPONSE, i: msg.i, r: result }), ...extra);
|
||||
return;
|
||||
} catch (e) {
|
||||
error = e;
|
||||
if (options.onGeneralError?.(e, method, args) !== true)
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
try {
|
||||
await post(serialize({ t: TYPE_RESPONSE, i: msg.i, e: error }), ...extra);
|
||||
} catch (e) {
|
||||
if (options.onGeneralError?.(e, method, args) !== true)
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const { i: ack, r: result, e: error } = msg;
|
||||
const promise = _rpcPromiseMap.get(ack);
|
||||
if (promise) {
|
||||
clearTimeout(promise.timeoutId);
|
||||
if (error)
|
||||
promise.reject(error);
|
||||
else
|
||||
promise.resolve(result);
|
||||
}
|
||||
_rpcPromiseMap.delete(ack);
|
||||
}
|
||||
}
|
||||
_promiseInit = on(onMessage);
|
||||
return rpc;
|
||||
}
|
||||
function createPromiseWithResolvers() {
|
||||
let resolve;
|
||||
let reject;
|
||||
const promise = new Promise((res, rej) => {
|
||||
resolve = res;
|
||||
reject = rej;
|
||||
});
|
||||
return { promise, resolve, reject };
|
||||
}
|
||||
const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
|
||||
function nanoid(size = 21) {
|
||||
let id = "";
|
||||
let i = size;
|
||||
while (i--)
|
||||
id += urlAlphabet[random() * 64 | 0];
|
||||
return id;
|
||||
}
|
||||
|
||||
export { createBirpc as c };
|
||||
3815
node_modules/vitest/dist/chunks/index.456_DGfR.js
generated
vendored
Normal file
3815
node_modules/vitest/dist/chunks/index.456_DGfR.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
727
node_modules/vitest/dist/chunks/index.BspFP3mn.js
generated
vendored
Normal file
727
node_modules/vitest/dist/chunks/index.BspFP3mn.js
generated
vendored
Normal file
@@ -0,0 +1,727 @@
|
||||
import { URL } from 'node:url';
|
||||
import { Console } from 'node:console';
|
||||
|
||||
// SEE https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/interfaces.js
|
||||
const LIVING_KEYS = [
|
||||
"DOMException",
|
||||
"EventTarget",
|
||||
"NamedNodeMap",
|
||||
"Node",
|
||||
"Attr",
|
||||
"Element",
|
||||
"DocumentFragment",
|
||||
"DOMImplementation",
|
||||
"Document",
|
||||
"XMLDocument",
|
||||
"CharacterData",
|
||||
"Text",
|
||||
"CDATASection",
|
||||
"ProcessingInstruction",
|
||||
"Comment",
|
||||
"DocumentType",
|
||||
"NodeList",
|
||||
"RadioNodeList",
|
||||
"HTMLCollection",
|
||||
"HTMLOptionsCollection",
|
||||
"DOMStringMap",
|
||||
"DOMTokenList",
|
||||
"StyleSheetList",
|
||||
"HTMLElement",
|
||||
"HTMLHeadElement",
|
||||
"HTMLTitleElement",
|
||||
"HTMLBaseElement",
|
||||
"HTMLLinkElement",
|
||||
"HTMLMetaElement",
|
||||
"HTMLStyleElement",
|
||||
"HTMLBodyElement",
|
||||
"HTMLHeadingElement",
|
||||
"HTMLParagraphElement",
|
||||
"HTMLHRElement",
|
||||
"HTMLPreElement",
|
||||
"HTMLUListElement",
|
||||
"HTMLOListElement",
|
||||
"HTMLLIElement",
|
||||
"HTMLMenuElement",
|
||||
"HTMLDListElement",
|
||||
"HTMLDivElement",
|
||||
"HTMLAnchorElement",
|
||||
"HTMLAreaElement",
|
||||
"HTMLBRElement",
|
||||
"HTMLButtonElement",
|
||||
"HTMLCanvasElement",
|
||||
"HTMLDataElement",
|
||||
"HTMLDataListElement",
|
||||
"HTMLDetailsElement",
|
||||
"HTMLDialogElement",
|
||||
"HTMLDirectoryElement",
|
||||
"HTMLFieldSetElement",
|
||||
"HTMLFontElement",
|
||||
"HTMLFormElement",
|
||||
"HTMLHtmlElement",
|
||||
"HTMLImageElement",
|
||||
"HTMLInputElement",
|
||||
"HTMLLabelElement",
|
||||
"HTMLLegendElement",
|
||||
"HTMLMapElement",
|
||||
"HTMLMarqueeElement",
|
||||
"HTMLMediaElement",
|
||||
"HTMLMeterElement",
|
||||
"HTMLModElement",
|
||||
"HTMLOptGroupElement",
|
||||
"HTMLOptionElement",
|
||||
"HTMLOutputElement",
|
||||
"HTMLPictureElement",
|
||||
"HTMLProgressElement",
|
||||
"HTMLQuoteElement",
|
||||
"HTMLScriptElement",
|
||||
"HTMLSelectElement",
|
||||
"HTMLSlotElement",
|
||||
"HTMLSourceElement",
|
||||
"HTMLSpanElement",
|
||||
"HTMLTableCaptionElement",
|
||||
"HTMLTableCellElement",
|
||||
"HTMLTableColElement",
|
||||
"HTMLTableElement",
|
||||
"HTMLTimeElement",
|
||||
"HTMLTableRowElement",
|
||||
"HTMLTableSectionElement",
|
||||
"HTMLTemplateElement",
|
||||
"HTMLTextAreaElement",
|
||||
"HTMLUnknownElement",
|
||||
"HTMLFrameElement",
|
||||
"HTMLFrameSetElement",
|
||||
"HTMLIFrameElement",
|
||||
"HTMLEmbedElement",
|
||||
"HTMLObjectElement",
|
||||
"HTMLParamElement",
|
||||
"HTMLVideoElement",
|
||||
"HTMLAudioElement",
|
||||
"HTMLTrackElement",
|
||||
"HTMLFormControlsCollection",
|
||||
"SVGElement",
|
||||
"SVGGraphicsElement",
|
||||
"SVGSVGElement",
|
||||
"SVGTitleElement",
|
||||
"SVGAnimatedString",
|
||||
"SVGNumber",
|
||||
"SVGStringList",
|
||||
"Event",
|
||||
"CloseEvent",
|
||||
"CustomEvent",
|
||||
"MessageEvent",
|
||||
"ErrorEvent",
|
||||
"HashChangeEvent",
|
||||
"PopStateEvent",
|
||||
"StorageEvent",
|
||||
"ProgressEvent",
|
||||
"PageTransitionEvent",
|
||||
"SubmitEvent",
|
||||
"UIEvent",
|
||||
"FocusEvent",
|
||||
"InputEvent",
|
||||
"MouseEvent",
|
||||
"KeyboardEvent",
|
||||
"TouchEvent",
|
||||
"CompositionEvent",
|
||||
"WheelEvent",
|
||||
"BarProp",
|
||||
"External",
|
||||
"Location",
|
||||
"History",
|
||||
"Screen",
|
||||
"Crypto",
|
||||
"Performance",
|
||||
"Navigator",
|
||||
"PluginArray",
|
||||
"MimeTypeArray",
|
||||
"Plugin",
|
||||
"MimeType",
|
||||
"FileReader",
|
||||
"FormData",
|
||||
"Blob",
|
||||
"File",
|
||||
"FileList",
|
||||
"ValidityState",
|
||||
"DOMParser",
|
||||
"XMLSerializer",
|
||||
"XMLHttpRequestEventTarget",
|
||||
"XMLHttpRequestUpload",
|
||||
"XMLHttpRequest",
|
||||
"WebSocket",
|
||||
"NodeFilter",
|
||||
"NodeIterator",
|
||||
"TreeWalker",
|
||||
"AbstractRange",
|
||||
"Range",
|
||||
"StaticRange",
|
||||
"Selection",
|
||||
"Storage",
|
||||
"CustomElementRegistry",
|
||||
"ShadowRoot",
|
||||
"MutationObserver",
|
||||
"MutationRecord",
|
||||
"Uint8Array",
|
||||
"Uint16Array",
|
||||
"Uint32Array",
|
||||
"Uint8ClampedArray",
|
||||
"Int8Array",
|
||||
"Int16Array",
|
||||
"Int32Array",
|
||||
"Float32Array",
|
||||
"Float64Array",
|
||||
"ArrayBuffer",
|
||||
"DOMRectReadOnly",
|
||||
"DOMRect",
|
||||
"Image",
|
||||
"Audio",
|
||||
"Option",
|
||||
"CSS"
|
||||
];
|
||||
const OTHER_KEYS = [
|
||||
"addEventListener",
|
||||
"alert",
|
||||
"blur",
|
||||
"cancelAnimationFrame",
|
||||
"close",
|
||||
"confirm",
|
||||
"createPopup",
|
||||
"dispatchEvent",
|
||||
"document",
|
||||
"focus",
|
||||
"frames",
|
||||
"getComputedStyle",
|
||||
"history",
|
||||
"innerHeight",
|
||||
"innerWidth",
|
||||
"length",
|
||||
"location",
|
||||
"matchMedia",
|
||||
"moveBy",
|
||||
"moveTo",
|
||||
"name",
|
||||
"navigator",
|
||||
"open",
|
||||
"outerHeight",
|
||||
"outerWidth",
|
||||
"pageXOffset",
|
||||
"pageYOffset",
|
||||
"parent",
|
||||
"postMessage",
|
||||
"print",
|
||||
"prompt",
|
||||
"removeEventListener",
|
||||
"requestAnimationFrame",
|
||||
"resizeBy",
|
||||
"resizeTo",
|
||||
"screen",
|
||||
"screenLeft",
|
||||
"screenTop",
|
||||
"screenX",
|
||||
"screenY",
|
||||
"scroll",
|
||||
"scrollBy",
|
||||
"scrollLeft",
|
||||
"scrollTo",
|
||||
"scrollTop",
|
||||
"scrollX",
|
||||
"scrollY",
|
||||
"self",
|
||||
"stop",
|
||||
"top",
|
||||
"Window",
|
||||
"window"
|
||||
];
|
||||
const KEYS = LIVING_KEYS.concat(OTHER_KEYS);
|
||||
|
||||
const skipKeys = [
|
||||
"window",
|
||||
"self",
|
||||
"top",
|
||||
"parent"
|
||||
];
|
||||
function getWindowKeys(global, win, additionalKeys = []) {
|
||||
const keysArray = [...additionalKeys, ...KEYS];
|
||||
return new Set(keysArray.concat(Object.getOwnPropertyNames(win)).filter((k) => {
|
||||
if (skipKeys.includes(k)) return false;
|
||||
if (k in global) return keysArray.includes(k);
|
||||
return true;
|
||||
}));
|
||||
}
|
||||
function isClassLikeName(name) {
|
||||
return name[0] === name[0].toUpperCase();
|
||||
}
|
||||
function populateGlobal(global, win, options = {}) {
|
||||
const { bindFunctions = false } = options;
|
||||
const keys = getWindowKeys(global, win, options.additionalKeys);
|
||||
const originals = /* @__PURE__ */ new Map();
|
||||
const overridenKeys = new Set([...KEYS, ...options.additionalKeys || []]);
|
||||
const overrideObject = /* @__PURE__ */ new Map();
|
||||
for (const key of keys) {
|
||||
const boundFunction = bindFunctions && typeof win[key] === "function" && !isClassLikeName(key) && win[key].bind(win);
|
||||
if (overridenKeys.has(key) && key in global) originals.set(key, global[key]);
|
||||
Object.defineProperty(global, key, {
|
||||
get() {
|
||||
if (overrideObject.has(key)) return overrideObject.get(key);
|
||||
if (boundFunction) return boundFunction;
|
||||
return win[key];
|
||||
},
|
||||
set(v) {
|
||||
overrideObject.set(key, v);
|
||||
},
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
global.window = global;
|
||||
global.self = global;
|
||||
global.top = global;
|
||||
global.parent = global;
|
||||
if (global.global) global.global = global;
|
||||
// rewrite defaultView to reference the same global context
|
||||
if (global.document && global.document.defaultView) Object.defineProperty(global.document, "defaultView", {
|
||||
get: () => global,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
skipKeys.forEach((k) => keys.add(k));
|
||||
return {
|
||||
keys,
|
||||
skipKeys,
|
||||
originals
|
||||
};
|
||||
}
|
||||
|
||||
var edge = {
|
||||
name: "edge-runtime",
|
||||
viteEnvironment: "ssr",
|
||||
async setupVM() {
|
||||
const { EdgeVM } = await import('@edge-runtime/vm');
|
||||
const vm = new EdgeVM({ extend: (context) => {
|
||||
context.global = context;
|
||||
context.Buffer = Buffer;
|
||||
return context;
|
||||
} });
|
||||
return {
|
||||
getVmContext() {
|
||||
return vm.context;
|
||||
},
|
||||
teardown() {
|
||||
// nothing to teardown
|
||||
}
|
||||
};
|
||||
},
|
||||
async setup(global) {
|
||||
const { EdgeVM } = await import('@edge-runtime/vm');
|
||||
const { keys, originals } = populateGlobal(global, new EdgeVM({ extend: (context) => {
|
||||
context.global = context;
|
||||
context.Buffer = Buffer;
|
||||
KEYS.forEach((key) => {
|
||||
if (key in global) context[key] = global[key];
|
||||
});
|
||||
return context;
|
||||
} }).context, { bindFunctions: true });
|
||||
return { teardown(global) {
|
||||
keys.forEach((key) => delete global[key]);
|
||||
originals.forEach((v, k) => global[k] = v);
|
||||
} };
|
||||
}
|
||||
};
|
||||
|
||||
async function teardownWindow(win) {
|
||||
if (win.close && win.happyDOM.abort) {
|
||||
await win.happyDOM.abort();
|
||||
win.close();
|
||||
} else win.happyDOM.cancelAsync();
|
||||
}
|
||||
var happy = {
|
||||
name: "happy-dom",
|
||||
viteEnvironment: "client",
|
||||
async setupVM({ happyDOM = {} }) {
|
||||
const { Window } = await import('happy-dom');
|
||||
let win = new Window({
|
||||
...happyDOM,
|
||||
console: console && globalThis.console ? globalThis.console : void 0,
|
||||
url: happyDOM.url || "http://localhost:3000",
|
||||
settings: {
|
||||
...happyDOM.settings,
|
||||
disableErrorCapturing: true
|
||||
}
|
||||
});
|
||||
// TODO: browser doesn't expose Buffer, but a lot of dependencies use it
|
||||
win.Buffer = Buffer;
|
||||
// inject structuredClone if it exists
|
||||
if (typeof structuredClone !== "undefined" && !win.structuredClone) win.structuredClone = structuredClone;
|
||||
return {
|
||||
getVmContext() {
|
||||
return win;
|
||||
},
|
||||
async teardown() {
|
||||
await teardownWindow(win);
|
||||
win = void 0;
|
||||
}
|
||||
};
|
||||
},
|
||||
async setup(global, { happyDOM = {} }) {
|
||||
// happy-dom v3 introduced a breaking change to Window, but
|
||||
// provides GlobalWindow as a way to use previous behaviour
|
||||
const { Window, GlobalWindow } = await import('happy-dom');
|
||||
const win = new (GlobalWindow || Window)({
|
||||
...happyDOM,
|
||||
console: console && global.console ? global.console : void 0,
|
||||
url: happyDOM.url || "http://localhost:3000",
|
||||
settings: {
|
||||
...happyDOM.settings,
|
||||
disableErrorCapturing: true
|
||||
}
|
||||
});
|
||||
const { keys, originals } = populateGlobal(global, win, {
|
||||
bindFunctions: true,
|
||||
additionalKeys: [
|
||||
"Request",
|
||||
"Response",
|
||||
"MessagePort",
|
||||
"fetch",
|
||||
"Headers",
|
||||
"AbortController",
|
||||
"AbortSignal",
|
||||
"URL",
|
||||
"URLSearchParams",
|
||||
"FormData"
|
||||
]
|
||||
});
|
||||
return { async teardown(global) {
|
||||
await teardownWindow(win);
|
||||
keys.forEach((key) => delete global[key]);
|
||||
originals.forEach((v, k) => global[k] = v);
|
||||
} };
|
||||
}
|
||||
};
|
||||
|
||||
function catchWindowErrors(window) {
|
||||
let userErrorListenerCount = 0;
|
||||
function throwUnhandlerError(e) {
|
||||
if (userErrorListenerCount === 0 && e.error != null) {
|
||||
e.preventDefault();
|
||||
process.emit("uncaughtException", e.error);
|
||||
}
|
||||
}
|
||||
const addEventListener = window.addEventListener.bind(window);
|
||||
const removeEventListener = window.removeEventListener.bind(window);
|
||||
window.addEventListener("error", throwUnhandlerError);
|
||||
window.addEventListener = function(...args) {
|
||||
if (args[0] === "error") userErrorListenerCount++;
|
||||
return addEventListener.apply(this, args);
|
||||
};
|
||||
window.removeEventListener = function(...args) {
|
||||
if (args[0] === "error" && userErrorListenerCount) userErrorListenerCount--;
|
||||
return removeEventListener.apply(this, args);
|
||||
};
|
||||
return function clearErrorHandlers() {
|
||||
window.removeEventListener("error", throwUnhandlerError);
|
||||
};
|
||||
}
|
||||
let NodeFormData_;
|
||||
let NodeBlob_;
|
||||
let NodeRequest_;
|
||||
var jsdom = {
|
||||
name: "jsdom",
|
||||
viteEnvironment: "client",
|
||||
async setupVM({ jsdom = {} }) {
|
||||
// delay initialization because it takes ~1s
|
||||
NodeFormData_ = globalThis.FormData;
|
||||
NodeBlob_ = globalThis.Blob;
|
||||
NodeRequest_ = globalThis.Request;
|
||||
const { CookieJar, JSDOM, ResourceLoader, VirtualConsole } = await import('jsdom');
|
||||
const { html = "<!DOCTYPE html>", userAgent, url = "http://localhost:3000", contentType = "text/html", pretendToBeVisual = true, includeNodeLocations = false, runScripts = "dangerously", resources, console = false, cookieJar = false, ...restOptions } = jsdom;
|
||||
let virtualConsole;
|
||||
if (console && globalThis.console) {
|
||||
virtualConsole = new VirtualConsole();
|
||||
// jsdom <27
|
||||
if ("sendTo" in virtualConsole) virtualConsole.sendTo(globalThis.console);
|
||||
else virtualConsole.forwardTo(globalThis.console);
|
||||
}
|
||||
let dom = new JSDOM(html, {
|
||||
pretendToBeVisual,
|
||||
resources: resources ?? (userAgent ? new ResourceLoader({ userAgent }) : void 0),
|
||||
runScripts,
|
||||
url,
|
||||
virtualConsole,
|
||||
cookieJar: cookieJar ? new CookieJar() : void 0,
|
||||
includeNodeLocations,
|
||||
contentType,
|
||||
userAgent,
|
||||
...restOptions
|
||||
});
|
||||
const clearAddEventListenerPatch = patchAddEventListener(dom.window);
|
||||
const clearWindowErrors = catchWindowErrors(dom.window);
|
||||
const utils = createCompatUtils(dom.window);
|
||||
// TODO: browser doesn't expose Buffer, but a lot of dependencies use it
|
||||
dom.window.Buffer = Buffer;
|
||||
dom.window.jsdom = dom;
|
||||
dom.window.Request = createCompatRequest(utils);
|
||||
dom.window.URL = createJSDOMCompatURL(utils);
|
||||
for (const name of [
|
||||
"structuredClone",
|
||||
"BroadcastChannel",
|
||||
"MessageChannel",
|
||||
"MessagePort",
|
||||
"TextEncoder",
|
||||
"TextDecoder"
|
||||
]) {
|
||||
const value = globalThis[name];
|
||||
if (typeof value !== "undefined" && typeof dom.window[name] === "undefined") dom.window[name] = value;
|
||||
}
|
||||
for (const name of [
|
||||
"fetch",
|
||||
"Response",
|
||||
"Headers",
|
||||
"AbortController",
|
||||
"AbortSignal",
|
||||
"URLSearchParams"
|
||||
]) {
|
||||
const value = globalThis[name];
|
||||
if (typeof value !== "undefined") dom.window[name] = value;
|
||||
}
|
||||
return {
|
||||
getVmContext() {
|
||||
return dom.getInternalVMContext();
|
||||
},
|
||||
teardown() {
|
||||
clearAddEventListenerPatch();
|
||||
clearWindowErrors();
|
||||
dom.window.close();
|
||||
dom = void 0;
|
||||
}
|
||||
};
|
||||
},
|
||||
async setup(global, { jsdom = {} }) {
|
||||
// delay initialization because it takes ~1s
|
||||
NodeFormData_ = globalThis.FormData;
|
||||
NodeBlob_ = globalThis.Blob;
|
||||
NodeRequest_ = globalThis.Request;
|
||||
const { CookieJar, JSDOM, ResourceLoader, VirtualConsole } = await import('jsdom');
|
||||
const { html = "<!DOCTYPE html>", userAgent, url = "http://localhost:3000", contentType = "text/html", pretendToBeVisual = true, includeNodeLocations = false, runScripts = "dangerously", resources, console = false, cookieJar = false, ...restOptions } = jsdom;
|
||||
let virtualConsole;
|
||||
if (console && globalThis.console) {
|
||||
virtualConsole = new VirtualConsole();
|
||||
// jsdom <27
|
||||
if ("sendTo" in virtualConsole) virtualConsole.sendTo(globalThis.console);
|
||||
else virtualConsole.forwardTo(globalThis.console);
|
||||
}
|
||||
const dom = new JSDOM(html, {
|
||||
pretendToBeVisual,
|
||||
resources: resources ?? (userAgent ? new ResourceLoader({ userAgent }) : void 0),
|
||||
runScripts,
|
||||
url,
|
||||
virtualConsole,
|
||||
cookieJar: cookieJar ? new CookieJar() : void 0,
|
||||
includeNodeLocations,
|
||||
contentType,
|
||||
userAgent,
|
||||
...restOptions
|
||||
});
|
||||
const clearAddEventListenerPatch = patchAddEventListener(dom.window);
|
||||
const { keys, originals } = populateGlobal(global, dom.window, { bindFunctions: true });
|
||||
const clearWindowErrors = catchWindowErrors(global);
|
||||
const utils = createCompatUtils(dom.window);
|
||||
global.jsdom = dom;
|
||||
global.Request = createCompatRequest(utils);
|
||||
global.URL = createJSDOMCompatURL(utils);
|
||||
return { teardown(global) {
|
||||
clearAddEventListenerPatch();
|
||||
clearWindowErrors();
|
||||
dom.window.close();
|
||||
delete global.jsdom;
|
||||
keys.forEach((key) => delete global[key]);
|
||||
originals.forEach((v, k) => global[k] = v);
|
||||
} };
|
||||
}
|
||||
};
|
||||
function createCompatRequest(utils) {
|
||||
return class Request extends NodeRequest_ {
|
||||
constructor(...args) {
|
||||
const [input, init] = args;
|
||||
if (init?.body != null) {
|
||||
const compatInit = { ...init };
|
||||
if (init.body instanceof utils.window.Blob) compatInit.body = utils.makeCompatBlob(init.body);
|
||||
if (init.body instanceof utils.window.FormData) compatInit.body = utils.makeCompatFormData(init.body);
|
||||
super(input, compatInit);
|
||||
} else super(...args);
|
||||
}
|
||||
static [Symbol.hasInstance](instance) {
|
||||
return instance instanceof NodeRequest_;
|
||||
}
|
||||
};
|
||||
}
|
||||
function createJSDOMCompatURL(utils) {
|
||||
return class URL$1 extends URL {
|
||||
static createObjectURL(blob) {
|
||||
if (blob instanceof utils.window.Blob) {
|
||||
const compatBlob = utils.makeCompatBlob(blob);
|
||||
return URL.createObjectURL(compatBlob);
|
||||
}
|
||||
return URL.createObjectURL(blob);
|
||||
}
|
||||
static [Symbol.hasInstance](instance) {
|
||||
return instance instanceof URL;
|
||||
}
|
||||
};
|
||||
}
|
||||
function createCompatUtils(window) {
|
||||
// this returns a hidden Symbol(impl)
|
||||
// this is cursed, and jsdom should just implement fetch API itself
|
||||
const implSymbol = Object.getOwnPropertySymbols(Object.getOwnPropertyDescriptors(new window.Blob()))[0];
|
||||
const utils = {
|
||||
window,
|
||||
makeCompatFormData(formData) {
|
||||
const nodeFormData = new NodeFormData_();
|
||||
formData.forEach((value, key) => {
|
||||
if (value instanceof window.Blob) nodeFormData.append(key, utils.makeCompatBlob(value));
|
||||
else nodeFormData.append(key, value);
|
||||
});
|
||||
return nodeFormData;
|
||||
},
|
||||
makeCompatBlob(blob) {
|
||||
const buffer = blob[implSymbol]._buffer;
|
||||
return new NodeBlob_([buffer], { type: blob.type });
|
||||
}
|
||||
};
|
||||
return utils;
|
||||
}
|
||||
function patchAddEventListener(window) {
|
||||
const abortControllers = /* @__PURE__ */ new WeakMap();
|
||||
const JSDOMAbortSignal = window.AbortSignal;
|
||||
const JSDOMAbortController = window.AbortController;
|
||||
const originalAddEventListener = window.EventTarget.prototype.addEventListener;
|
||||
function getJsdomAbortController(signal) {
|
||||
if (!abortControllers.has(signal)) {
|
||||
const jsdomAbortController = new JSDOMAbortController();
|
||||
signal.addEventListener("abort", () => {
|
||||
jsdomAbortController.abort(signal.reason);
|
||||
});
|
||||
abortControllers.set(signal, jsdomAbortController);
|
||||
}
|
||||
return abortControllers.get(signal);
|
||||
}
|
||||
window.EventTarget.prototype.addEventListener = function addEventListener(type, callback, options) {
|
||||
if (typeof options === "object" && options.signal != null) {
|
||||
const { signal, ...otherOptions } = options;
|
||||
// - this happens because AbortSignal is provided by Node.js,
|
||||
// but jsdom APIs require jsdom's AbortSignal, while Node APIs
|
||||
// (like fetch and Request) require a Node.js AbortSignal
|
||||
// - disable narrow typing with "as any" because we need it later
|
||||
if (!(signal instanceof JSDOMAbortSignal)) {
|
||||
const jsdomCompatOptions = Object.create(null);
|
||||
Object.assign(jsdomCompatOptions, otherOptions);
|
||||
jsdomCompatOptions.signal = getJsdomAbortController(signal).signal;
|
||||
return originalAddEventListener.call(this, type, callback, jsdomCompatOptions);
|
||||
}
|
||||
}
|
||||
return originalAddEventListener.call(this, type, callback, options);
|
||||
};
|
||||
return () => {
|
||||
window.EventTarget.prototype.addEventListener = originalAddEventListener;
|
||||
};
|
||||
}
|
||||
|
||||
// some globals we do not want, either because deprecated or we set it ourselves
|
||||
const denyList = new Set([
|
||||
"GLOBAL",
|
||||
"root",
|
||||
"global",
|
||||
"Buffer",
|
||||
"ArrayBuffer",
|
||||
"Uint8Array"
|
||||
]);
|
||||
const nodeGlobals = /* @__PURE__ */ new Map();
|
||||
function populateNodeGlobals() {
|
||||
if (nodeGlobals.size !== 0) return;
|
||||
const names = Object.getOwnPropertyNames(globalThis);
|
||||
const length = names.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
const globalName = names[i];
|
||||
if (!denyList.has(globalName)) {
|
||||
const descriptor = Object.getOwnPropertyDescriptor(globalThis, globalName);
|
||||
if (!descriptor) throw new Error(`No property descriptor for ${globalName}, this is a bug in Vitest.`);
|
||||
nodeGlobals.set(globalName, descriptor);
|
||||
}
|
||||
}
|
||||
}
|
||||
var node = {
|
||||
name: "node",
|
||||
viteEnvironment: "ssr",
|
||||
async setupVM() {
|
||||
populateNodeGlobals();
|
||||
const vm = await import('node:vm');
|
||||
let context = vm.createContext();
|
||||
let global = vm.runInContext("this", context);
|
||||
const contextGlobals = new Set(Object.getOwnPropertyNames(global));
|
||||
for (const [nodeGlobalsKey, descriptor] of nodeGlobals) if (!contextGlobals.has(nodeGlobalsKey)) if (descriptor.configurable) Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: true,
|
||||
enumerable: descriptor.enumerable,
|
||||
get() {
|
||||
// @ts-expect-error: no index signature
|
||||
const val = globalThis[nodeGlobalsKey];
|
||||
// override lazy getter
|
||||
Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: true,
|
||||
enumerable: descriptor.enumerable,
|
||||
value: val,
|
||||
writable: descriptor.writable === true || nodeGlobalsKey === "performance"
|
||||
});
|
||||
return val;
|
||||
},
|
||||
set(val) {
|
||||
// override lazy getter
|
||||
Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: true,
|
||||
enumerable: descriptor.enumerable,
|
||||
value: val,
|
||||
writable: true
|
||||
});
|
||||
}
|
||||
});
|
||||
else if ("value" in descriptor) Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: false,
|
||||
enumerable: descriptor.enumerable,
|
||||
value: descriptor.value,
|
||||
writable: descriptor.writable
|
||||
});
|
||||
else Object.defineProperty(global, nodeGlobalsKey, {
|
||||
configurable: false,
|
||||
enumerable: descriptor.enumerable,
|
||||
get: descriptor.get,
|
||||
set: descriptor.set
|
||||
});
|
||||
global.global = global;
|
||||
global.Buffer = Buffer;
|
||||
global.ArrayBuffer = ArrayBuffer;
|
||||
// TextEncoder (global or via 'util') references a Uint8Array constructor
|
||||
// different than the global one used by users in tests. This makes sure the
|
||||
// same constructor is referenced by both.
|
||||
global.Uint8Array = Uint8Array;
|
||||
return {
|
||||
getVmContext() {
|
||||
return context;
|
||||
},
|
||||
teardown() {
|
||||
context = void 0;
|
||||
global = void 0;
|
||||
}
|
||||
};
|
||||
},
|
||||
async setup(global) {
|
||||
global.console.Console = Console;
|
||||
return { teardown(global) {
|
||||
delete global.console.Console;
|
||||
} };
|
||||
}
|
||||
};
|
||||
|
||||
const environments = {
|
||||
node,
|
||||
jsdom,
|
||||
"happy-dom": happy,
|
||||
"edge-runtime": edge
|
||||
};
|
||||
|
||||
export { environments as e, populateGlobal as p };
|
||||
213
node_modules/vitest/dist/chunks/index.D3XRDfWc.js
generated
vendored
Normal file
213
node_modules/vitest/dist/chunks/index.D3XRDfWc.js
generated
vendored
Normal file
@@ -0,0 +1,213 @@
|
||||
import process from 'node:process';
|
||||
import fs from 'node:fs/promises';
|
||||
import path, { resolve } from 'node:path';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { x } from 'tinyexec';
|
||||
|
||||
const AGENTS = [
|
||||
"npm",
|
||||
"yarn",
|
||||
"yarn@berry",
|
||||
"pnpm",
|
||||
"pnpm@6",
|
||||
"bun",
|
||||
"deno"
|
||||
];
|
||||
const LOCKS = {
|
||||
"bun.lock": "bun",
|
||||
"bun.lockb": "bun",
|
||||
"deno.lock": "deno",
|
||||
"pnpm-lock.yaml": "pnpm",
|
||||
"pnpm-workspace.yaml": "pnpm",
|
||||
"yarn.lock": "yarn",
|
||||
"package-lock.json": "npm",
|
||||
"npm-shrinkwrap.json": "npm"
|
||||
};
|
||||
const INSTALL_METADATA = {
|
||||
"node_modules/.deno/": "deno",
|
||||
"node_modules/.pnpm/": "pnpm",
|
||||
"node_modules/.yarn-state.yml": "yarn",
|
||||
// yarn v2+ (node-modules)
|
||||
"node_modules/.yarn_integrity": "yarn",
|
||||
// yarn v1
|
||||
"node_modules/.package-lock.json": "npm",
|
||||
".pnp.cjs": "yarn",
|
||||
// yarn v3+ (pnp)
|
||||
".pnp.js": "yarn",
|
||||
// yarn v2 (pnp)
|
||||
"bun.lock": "bun",
|
||||
"bun.lockb": "bun"
|
||||
};
|
||||
|
||||
async function pathExists(path2, type) {
|
||||
try {
|
||||
const stat = await fs.stat(path2);
|
||||
return type === "file" ? stat.isFile() : stat.isDirectory();
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function* lookup(cwd = process.cwd()) {
|
||||
let directory = path.resolve(cwd);
|
||||
const { root } = path.parse(directory);
|
||||
while (directory && directory !== root) {
|
||||
yield directory;
|
||||
directory = path.dirname(directory);
|
||||
}
|
||||
}
|
||||
async function parsePackageJson(filepath, onUnknown) {
|
||||
return !filepath || !pathExists(filepath, "file") ? null : await handlePackageManager(filepath, onUnknown);
|
||||
}
|
||||
async function detect(options = {}) {
|
||||
const {
|
||||
cwd,
|
||||
strategies = ["lockfile", "packageManager-field", "devEngines-field"],
|
||||
onUnknown
|
||||
} = options;
|
||||
let stopDir;
|
||||
if (typeof options.stopDir === "string") {
|
||||
const resolved = path.resolve(options.stopDir);
|
||||
stopDir = (dir) => dir === resolved;
|
||||
} else {
|
||||
stopDir = options.stopDir;
|
||||
}
|
||||
for (const directory of lookup(cwd)) {
|
||||
for (const strategy of strategies) {
|
||||
switch (strategy) {
|
||||
case "lockfile": {
|
||||
for (const lock of Object.keys(LOCKS)) {
|
||||
if (await pathExists(path.join(directory, lock), "file")) {
|
||||
const name = LOCKS[lock];
|
||||
const result = await parsePackageJson(path.join(directory, "package.json"), onUnknown);
|
||||
if (result)
|
||||
return result;
|
||||
else
|
||||
return { name, agent: name };
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "packageManager-field":
|
||||
case "devEngines-field": {
|
||||
const result = await parsePackageJson(path.join(directory, "package.json"), onUnknown);
|
||||
if (result)
|
||||
return result;
|
||||
break;
|
||||
}
|
||||
case "install-metadata": {
|
||||
for (const metadata of Object.keys(INSTALL_METADATA)) {
|
||||
const fileOrDir = metadata.endsWith("/") ? "dir" : "file";
|
||||
if (await pathExists(path.join(directory, metadata), fileOrDir)) {
|
||||
const name = INSTALL_METADATA[metadata];
|
||||
const agent = name === "yarn" ? isMetadataYarnClassic(metadata) ? "yarn" : "yarn@berry" : name;
|
||||
return { name, agent };
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (stopDir?.(directory))
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function getNameAndVer(pkg) {
|
||||
const handelVer = (version) => version?.match(/\d+(\.\d+){0,2}/)?.[0] ?? version;
|
||||
if (typeof pkg.packageManager === "string") {
|
||||
const [name, ver] = pkg.packageManager.replace(/^\^/, "").split("@");
|
||||
return { name, ver: handelVer(ver) };
|
||||
}
|
||||
if (typeof pkg.devEngines?.packageManager?.name === "string") {
|
||||
return {
|
||||
name: pkg.devEngines.packageManager.name,
|
||||
ver: handelVer(pkg.devEngines.packageManager.version)
|
||||
};
|
||||
}
|
||||
return void 0;
|
||||
}
|
||||
async function handlePackageManager(filepath, onUnknown) {
|
||||
try {
|
||||
const pkg = JSON.parse(await fs.readFile(filepath, "utf8"));
|
||||
let agent;
|
||||
const nameAndVer = getNameAndVer(pkg);
|
||||
if (nameAndVer) {
|
||||
const name = nameAndVer.name;
|
||||
const ver = nameAndVer.ver;
|
||||
let version = ver;
|
||||
if (name === "yarn" && ver && Number.parseInt(ver) > 1) {
|
||||
agent = "yarn@berry";
|
||||
version = "berry";
|
||||
return { name, agent, version };
|
||||
} else if (name === "pnpm" && ver && Number.parseInt(ver) < 7) {
|
||||
agent = "pnpm@6";
|
||||
return { name, agent, version };
|
||||
} else if (AGENTS.includes(name)) {
|
||||
agent = name;
|
||||
return { name, agent, version };
|
||||
} else {
|
||||
return onUnknown?.(pkg.packageManager) ?? null;
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function isMetadataYarnClassic(metadataPath) {
|
||||
return metadataPath.endsWith(".yarn_integrity");
|
||||
}
|
||||
|
||||
// src/detect.ts
|
||||
async function detectPackageManager(cwd = process.cwd()) {
|
||||
const result = await detect({
|
||||
cwd,
|
||||
onUnknown(packageManager) {
|
||||
console.warn("[@antfu/install-pkg] Unknown packageManager:", packageManager);
|
||||
return void 0;
|
||||
}
|
||||
});
|
||||
return result?.agent || null;
|
||||
}
|
||||
async function installPackage(names, options = {}) {
|
||||
const detectedAgent = options.packageManager || await detectPackageManager(options.cwd) || "npm";
|
||||
const [agent] = detectedAgent.split("@");
|
||||
if (!Array.isArray(names))
|
||||
names = [names];
|
||||
const args = (typeof options.additionalArgs === "function" ? options.additionalArgs(agent, detectedAgent) : options.additionalArgs) || [];
|
||||
if (options.preferOffline) {
|
||||
if (detectedAgent === "yarn@berry")
|
||||
args.unshift("--cached");
|
||||
else
|
||||
args.unshift("--prefer-offline");
|
||||
}
|
||||
if (agent === "pnpm") {
|
||||
args.unshift(
|
||||
/**
|
||||
* Prevent pnpm from removing installed devDeps while `NODE_ENV` is `production`
|
||||
* @see https://pnpm.io/cli/install#--prod--p
|
||||
*/
|
||||
"--prod=false"
|
||||
);
|
||||
if (existsSync(resolve(options.cwd ?? process.cwd(), "pnpm-workspace.yaml"))) {
|
||||
args.unshift("-w");
|
||||
}
|
||||
}
|
||||
return x(
|
||||
agent,
|
||||
[
|
||||
agent === "yarn" ? "add" : "install",
|
||||
options.dev ? "-D" : "",
|
||||
...args,
|
||||
...names
|
||||
].filter(Boolean),
|
||||
{
|
||||
nodeOptions: {
|
||||
stdio: options.silent ? "ignore" : "inherit",
|
||||
cwd: options.cwd
|
||||
},
|
||||
throwOnError: true
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export { detectPackageManager, installPackage };
|
||||
6343
node_modules/vitest/dist/chunks/index.D4KonVSU.js
generated
vendored
Normal file
6343
node_modules/vitest/dist/chunks/index.D4KonVSU.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
231
node_modules/vitest/dist/chunks/index.Drsj_6e7.js
generated
vendored
Normal file
231
node_modules/vitest/dist/chunks/index.Drsj_6e7.js
generated
vendored
Normal file
@@ -0,0 +1,231 @@
|
||||
import fs from 'node:fs';
|
||||
import { getTasks, getFullName, getTests } from '@vitest/runner/utils';
|
||||
import * as pathe from 'pathe';
|
||||
import c from 'tinyrainbow';
|
||||
import { g as getStateSymbol, t as truncateString, F as F_RIGHT, D as DefaultReporter, f as formatProjectName, s as separator } from './index.456_DGfR.js';
|
||||
import { stripVTControlCharacters } from 'node:util';
|
||||
import { notNullish } from '@vitest/utils/helpers';
|
||||
|
||||
function createBenchmarkJsonReport(files) {
|
||||
const report = { files: [] };
|
||||
for (const file of files) {
|
||||
const groups = [];
|
||||
for (const task of getTasks(file)) if (task?.type === "suite") {
|
||||
const benchmarks = [];
|
||||
for (const t of task.tasks) {
|
||||
const benchmark = t.meta.benchmark && t.result?.benchmark;
|
||||
if (benchmark) benchmarks.push({
|
||||
id: t.id,
|
||||
...benchmark,
|
||||
samples: []
|
||||
});
|
||||
}
|
||||
if (benchmarks.length) groups.push({
|
||||
fullName: getFullName(task, " > "),
|
||||
benchmarks
|
||||
});
|
||||
}
|
||||
report.files.push({
|
||||
filepath: file.filepath,
|
||||
groups
|
||||
});
|
||||
}
|
||||
return report;
|
||||
}
|
||||
function flattenFormattedBenchmarkReport(report) {
|
||||
const flat = {};
|
||||
for (const file of report.files) for (const group of file.groups) for (const t of group.benchmarks) flat[t.id] = t;
|
||||
return flat;
|
||||
}
|
||||
|
||||
const outputMap = /* @__PURE__ */ new WeakMap();
|
||||
function formatNumber(number) {
|
||||
const res = String(number.toFixed(number < 100 ? 4 : 2)).split(".");
|
||||
return res[0].replace(/(?=(?:\d{3})+$)\B/g, ",") + (res[1] ? `.${res[1]}` : "");
|
||||
}
|
||||
const tableHead = [
|
||||
"name",
|
||||
"hz",
|
||||
"min",
|
||||
"max",
|
||||
"mean",
|
||||
"p75",
|
||||
"p99",
|
||||
"p995",
|
||||
"p999",
|
||||
"rme",
|
||||
"samples"
|
||||
];
|
||||
function renderBenchmarkItems(result) {
|
||||
return [
|
||||
result.name,
|
||||
formatNumber(result.hz || 0),
|
||||
formatNumber(result.min || 0),
|
||||
formatNumber(result.max || 0),
|
||||
formatNumber(result.mean || 0),
|
||||
formatNumber(result.p75 || 0),
|
||||
formatNumber(result.p99 || 0),
|
||||
formatNumber(result.p995 || 0),
|
||||
formatNumber(result.p999 || 0),
|
||||
`±${(result.rme || 0).toFixed(2)}%`,
|
||||
(result.sampleCount || 0).toString()
|
||||
];
|
||||
}
|
||||
function computeColumnWidths(results) {
|
||||
const rows = [tableHead, ...results.map((v) => renderBenchmarkItems(v))];
|
||||
return Array.from(tableHead, (_, i) => Math.max(...rows.map((row) => stripVTControlCharacters(row[i]).length)));
|
||||
}
|
||||
function padRow(row, widths) {
|
||||
return row.map((v, i) => i ? v.padStart(widths[i], " ") : v.padEnd(widths[i], " "));
|
||||
}
|
||||
function renderTableHead(widths) {
|
||||
return " ".repeat(3) + padRow(tableHead, widths).map(c.bold).join(" ");
|
||||
}
|
||||
function renderBenchmark(result, widths) {
|
||||
const padded = padRow(renderBenchmarkItems(result), widths);
|
||||
return [
|
||||
padded[0],
|
||||
c.blue(padded[1]),
|
||||
c.cyan(padded[2]),
|
||||
c.cyan(padded[3]),
|
||||
c.cyan(padded[4]),
|
||||
c.cyan(padded[5]),
|
||||
c.cyan(padded[6]),
|
||||
c.cyan(padded[7]),
|
||||
c.cyan(padded[8]),
|
||||
c.dim(padded[9]),
|
||||
c.dim(padded[10])
|
||||
].join(" ");
|
||||
}
|
||||
function renderTable(options) {
|
||||
const output = [];
|
||||
const benchMap = {};
|
||||
for (const task of options.tasks) if (task.meta.benchmark && task.result?.benchmark) benchMap[task.id] = {
|
||||
current: task.result.benchmark,
|
||||
baseline: options.compare?.[task.id]
|
||||
};
|
||||
const benchCount = Object.entries(benchMap).length;
|
||||
const columnWidths = computeColumnWidths(Object.values(benchMap).flatMap((v) => [v.current, v.baseline]).filter(notNullish));
|
||||
let idx = 0;
|
||||
const padding = " ".repeat(1 );
|
||||
for (const task of options.tasks) {
|
||||
const duration = task.result?.duration;
|
||||
const bench = benchMap[task.id];
|
||||
let prefix = "";
|
||||
if (idx === 0 && task.meta?.benchmark) prefix += `${renderTableHead(columnWidths)}\n${padding}`;
|
||||
prefix += ` ${getStateSymbol(task)} `;
|
||||
let suffix = "";
|
||||
if (task.type === "suite") suffix += c.dim(` (${getTests(task).length})`);
|
||||
if (task.mode === "skip" || task.mode === "todo") suffix += c.dim(c.gray(" [skipped]"));
|
||||
if (duration != null) {
|
||||
const color = duration > options.slowTestThreshold ? c.yellow : c.green;
|
||||
suffix += color(` ${Math.round(duration)}${c.dim("ms")}`);
|
||||
}
|
||||
if (options.showHeap && task.result?.heap != null) suffix += c.magenta(` ${Math.floor(task.result.heap / 1024 / 1024)} MB heap used`);
|
||||
if (bench) {
|
||||
let body = renderBenchmark(bench.current, columnWidths);
|
||||
if (options.compare && bench.baseline) {
|
||||
if (bench.current.hz) {
|
||||
const diff = bench.current.hz / bench.baseline.hz;
|
||||
const diffFixed = diff.toFixed(2);
|
||||
if (diffFixed === "1.0.0") body += c.gray(` [${diffFixed}x]`);
|
||||
if (diff > 1) body += c.blue(` [${diffFixed}x] ⇑`);
|
||||
else body += c.red(` [${diffFixed}x] ⇓`);
|
||||
}
|
||||
output.push(padding + prefix + body + suffix);
|
||||
const bodyBaseline = renderBenchmark(bench.baseline, columnWidths);
|
||||
output.push(`${padding} ${bodyBaseline} ${c.dim("(baseline)")}`);
|
||||
} else {
|
||||
if (bench.current.rank === 1 && benchCount > 1) body += c.bold(c.green(" fastest"));
|
||||
if (bench.current.rank === benchCount && benchCount > 2) body += c.bold(c.gray(" slowest"));
|
||||
output.push(padding + prefix + body + suffix);
|
||||
}
|
||||
} else output.push(padding + prefix + task.name + suffix);
|
||||
if (task.result?.state !== "pass" && outputMap.get(task) != null) {
|
||||
let data = outputMap.get(task);
|
||||
if (typeof data === "string") {
|
||||
data = stripVTControlCharacters(data.trim().split("\n").filter(Boolean).pop());
|
||||
if (data === "") data = void 0;
|
||||
}
|
||||
if (data != null) {
|
||||
const out = ` ${" ".repeat(options.level)}${F_RIGHT} ${data}`;
|
||||
output.push(c.gray(truncateString(out, options.columns)));
|
||||
}
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
return output.filter(Boolean).join("\n");
|
||||
}
|
||||
|
||||
class BenchmarkReporter extends DefaultReporter {
|
||||
compare;
|
||||
async onInit(ctx) {
|
||||
super.onInit(ctx);
|
||||
if (this.ctx.config.benchmark?.compare) {
|
||||
const compareFile = pathe.resolve(this.ctx.config.root, this.ctx.config.benchmark?.compare);
|
||||
try {
|
||||
this.compare = flattenFormattedBenchmarkReport(JSON.parse(await fs.promises.readFile(compareFile, "utf-8")));
|
||||
} catch (e) {
|
||||
this.error(`Failed to read '${compareFile}'`, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
onTaskUpdate(packs) {
|
||||
for (const pack of packs) {
|
||||
const task = this.ctx.state.idMap.get(pack[0]);
|
||||
if (task?.type === "suite" && task.result?.state !== "run") task.tasks.filter((task) => task.result?.benchmark).sort((benchA, benchB) => benchA.result.benchmark.mean - benchB.result.benchmark.mean).forEach((bench, idx) => {
|
||||
bench.result.benchmark.rank = Number(idx) + 1;
|
||||
});
|
||||
}
|
||||
}
|
||||
onTestSuiteResult(testSuite) {
|
||||
super.onTestSuiteResult(testSuite);
|
||||
this.printSuiteTable(testSuite);
|
||||
}
|
||||
printTestModule(testModule) {
|
||||
this.printSuiteTable(testModule);
|
||||
}
|
||||
printSuiteTable(testTask) {
|
||||
const state = testTask.state();
|
||||
if (state === "pending" || state === "queued") return;
|
||||
const benches = testTask.task.tasks.filter((t) => t.meta.benchmark);
|
||||
const duration = testTask.task.result?.duration || 0;
|
||||
if (benches.length > 0 && benches.every((t) => t.result?.state !== "run" && t.result?.state !== "queued")) {
|
||||
let title = `\n ${getStateSymbol(testTask.task)} ${formatProjectName(testTask.project)}${getFullName(testTask.task, separator)}`;
|
||||
if (duration != null && duration > this.ctx.config.slowTestThreshold) title += c.yellow(` ${Math.round(duration)}${c.dim("ms")}`);
|
||||
this.log(title);
|
||||
this.log(renderTable({
|
||||
tasks: benches,
|
||||
level: 1,
|
||||
columns: this.ctx.logger.getColumns(),
|
||||
compare: this.compare,
|
||||
showHeap: this.ctx.config.logHeapUsage,
|
||||
slowTestThreshold: this.ctx.config.slowTestThreshold
|
||||
}));
|
||||
}
|
||||
}
|
||||
async onTestRunEnd(testModules, unhandledErrors, reason) {
|
||||
super.onTestRunEnd(testModules, unhandledErrors, reason);
|
||||
// write output for future comparison
|
||||
let outputFile = this.ctx.config.benchmark?.outputJson;
|
||||
if (outputFile) {
|
||||
outputFile = pathe.resolve(this.ctx.config.root, outputFile);
|
||||
const outputDirectory = pathe.dirname(outputFile);
|
||||
if (!fs.existsSync(outputDirectory)) await fs.promises.mkdir(outputDirectory, { recursive: true });
|
||||
const output = createBenchmarkJsonReport(testModules.map((t) => t.task.file));
|
||||
await fs.promises.writeFile(outputFile, JSON.stringify(output, null, 2));
|
||||
this.log(`Benchmark report written to ${outputFile}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class VerboseBenchmarkReporter extends BenchmarkReporter {
|
||||
verbose = true;
|
||||
}
|
||||
|
||||
const BenchmarkReportsMap = {
|
||||
default: BenchmarkReporter,
|
||||
verbose: VerboseBenchmarkReporter
|
||||
};
|
||||
|
||||
export { BenchmarkReporter as B, VerboseBenchmarkReporter as V, BenchmarkReportsMap as a };
|
||||
37
node_modules/vitest/dist/chunks/index.Z5E_ObnR.js
generated
vendored
Normal file
37
node_modules/vitest/dist/chunks/index.Z5E_ObnR.js
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
import { b as assert, c as createExpect, g as globalExpect, i as inject, s as should, v as vi, d as vitest } from './vi.2VT5v0um.js';
|
||||
import { b as bench } from './benchmark.B3N2zMcH.js';
|
||||
import { V as VitestEvaluatedModules } from './evaluatedModules.Dg1zASAC.js';
|
||||
import { expectTypeOf } from 'expect-type';
|
||||
import { afterAll, afterEach, beforeAll, beforeEach, describe, it, onTestFailed, onTestFinished, recordArtifact, suite, test } from '@vitest/runner';
|
||||
import { chai } from '@vitest/expect';
|
||||
|
||||
const assertType = function assertType() {};
|
||||
|
||||
var index = /*#__PURE__*/Object.freeze({
|
||||
__proto__: null,
|
||||
EvaluatedModules: VitestEvaluatedModules,
|
||||
afterAll: afterAll,
|
||||
afterEach: afterEach,
|
||||
assert: assert,
|
||||
assertType: assertType,
|
||||
beforeAll: beforeAll,
|
||||
beforeEach: beforeEach,
|
||||
bench: bench,
|
||||
chai: chai,
|
||||
createExpect: createExpect,
|
||||
describe: describe,
|
||||
expect: globalExpect,
|
||||
expectTypeOf: expectTypeOf,
|
||||
inject: inject,
|
||||
it: it,
|
||||
onTestFailed: onTestFailed,
|
||||
onTestFinished: onTestFinished,
|
||||
recordArtifact: recordArtifact,
|
||||
should: should,
|
||||
suite: suite,
|
||||
test: test,
|
||||
vi: vi,
|
||||
vitest: vitest
|
||||
});
|
||||
|
||||
export { assertType as a, index as i };
|
||||
109
node_modules/vitest/dist/chunks/index.bFLgAE-Z.js
generated
vendored
Normal file
109
node_modules/vitest/dist/chunks/index.bFLgAE-Z.js
generated
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
import { chai } from '@vitest/expect';
|
||||
import { l as loadDiffConfig, b as loadSnapshotSerializers, t as takeCoverageInsideWorker } from './setup-common.Cm-kSBVi.js';
|
||||
import { r as rpc } from './rpc.BytlcPfC.js';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
import { V as VitestTestRunner, N as NodeBenchmarkRunner } from './test.BT8LKgU9.js';
|
||||
|
||||
function setupChaiConfig(config) {
|
||||
Object.assign(chai.config, config);
|
||||
}
|
||||
|
||||
async function resolveSnapshotEnvironment(config, executor) {
|
||||
if (!config.snapshotEnvironment) {
|
||||
const { VitestNodeSnapshotEnvironment } = await import('./node.Ce0vMQM7.js');
|
||||
return new VitestNodeSnapshotEnvironment();
|
||||
}
|
||||
const mod = await executor.import(config.snapshotEnvironment);
|
||||
if (typeof mod.default !== "object" || !mod.default) throw new Error("Snapshot environment module must have a default export object with a shape of `SnapshotEnvironment`");
|
||||
return mod.default;
|
||||
}
|
||||
|
||||
async function getTestRunnerConstructor(config, moduleRunner) {
|
||||
if (!config.runner) return config.mode === "test" ? VitestTestRunner : NodeBenchmarkRunner;
|
||||
const mod = await moduleRunner.import(config.runner);
|
||||
if (!mod.default && typeof mod.default !== "function") throw new Error(`Runner must export a default function, but got ${typeof mod.default} imported from ${config.runner}`);
|
||||
return mod.default;
|
||||
}
|
||||
async function resolveTestRunner(config, moduleRunner, traces) {
|
||||
const testRunner = new (await (getTestRunnerConstructor(config, moduleRunner)))(config);
|
||||
// inject private executor to every runner
|
||||
Object.defineProperty(testRunner, "moduleRunner", {
|
||||
value: moduleRunner,
|
||||
enumerable: false,
|
||||
configurable: false
|
||||
});
|
||||
if (!testRunner.config) testRunner.config = config;
|
||||
if (!testRunner.importFile) throw new Error("Runner must implement \"importFile\" method.");
|
||||
if ("__setTraces" in testRunner) testRunner.__setTraces(traces);
|
||||
const [diffOptions] = await Promise.all([loadDiffConfig(config, moduleRunner), loadSnapshotSerializers(config, moduleRunner)]);
|
||||
testRunner.config.diffOptions = diffOptions;
|
||||
// patch some methods, so custom runners don't need to call RPC
|
||||
const originalOnTaskUpdate = testRunner.onTaskUpdate;
|
||||
testRunner.onTaskUpdate = async (task, events) => {
|
||||
const p = rpc().onTaskUpdate(task, events);
|
||||
await originalOnTaskUpdate?.call(testRunner, task, events);
|
||||
return p;
|
||||
};
|
||||
// patch some methods, so custom runners don't need to call RPC
|
||||
const originalOnTestAnnotate = testRunner.onTestAnnotate;
|
||||
testRunner.onTestAnnotate = async (test, annotation) => {
|
||||
const p = rpc().onTaskArtifactRecord(test.id, {
|
||||
type: "internal:annotation",
|
||||
location: annotation.location,
|
||||
annotation
|
||||
});
|
||||
const overriddenResult = await originalOnTestAnnotate?.call(testRunner, test, annotation);
|
||||
const vitestResult = await p;
|
||||
return overriddenResult || vitestResult.annotation;
|
||||
};
|
||||
const originalOnTestArtifactRecord = testRunner.onTestArtifactRecord;
|
||||
testRunner.onTestArtifactRecord = async (test, artifact) => {
|
||||
const p = rpc().onTaskArtifactRecord(test.id, artifact);
|
||||
const overriddenResult = await originalOnTestArtifactRecord?.call(testRunner, test, artifact);
|
||||
const vitestResult = await p;
|
||||
return overriddenResult || vitestResult;
|
||||
};
|
||||
const originalOnCollectStart = testRunner.onCollectStart;
|
||||
testRunner.onCollectStart = async (file) => {
|
||||
await rpc().onQueued(file);
|
||||
await originalOnCollectStart?.call(testRunner, file);
|
||||
};
|
||||
const originalOnCollected = testRunner.onCollected;
|
||||
testRunner.onCollected = async (files) => {
|
||||
const state = getWorkerState();
|
||||
files.forEach((file) => {
|
||||
file.prepareDuration = state.durations.prepare;
|
||||
file.environmentLoad = state.durations.environment;
|
||||
// should be collected only for a single test file in a batch
|
||||
state.durations.prepare = 0;
|
||||
state.durations.environment = 0;
|
||||
});
|
||||
rpc().onCollected(files);
|
||||
await originalOnCollected?.call(testRunner, files);
|
||||
};
|
||||
const originalOnAfterRun = testRunner.onAfterRunFiles;
|
||||
testRunner.onAfterRunFiles = async (files) => {
|
||||
const state = getWorkerState();
|
||||
const coverage = await takeCoverageInsideWorker(config.coverage, moduleRunner);
|
||||
if (coverage) rpc().onAfterSuiteRun({
|
||||
coverage,
|
||||
testFiles: files.map((file) => file.name).sort(),
|
||||
environment: state.environment.viteEnvironment || state.environment.name,
|
||||
projectName: state.ctx.projectName
|
||||
});
|
||||
await originalOnAfterRun?.call(testRunner, files);
|
||||
};
|
||||
const originalOnAfterRunTask = testRunner.onAfterRunTask;
|
||||
testRunner.onAfterRunTask = async (test) => {
|
||||
if (config.bail && test.result?.state === "fail") {
|
||||
if (1 + await rpc().getCountOfFailedTests() >= config.bail) {
|
||||
rpc().onCancel("test-failure");
|
||||
testRunner.cancel?.("test-failure");
|
||||
}
|
||||
}
|
||||
await originalOnAfterRunTask?.call(testRunner, test);
|
||||
};
|
||||
return testRunner;
|
||||
}
|
||||
|
||||
export { resolveSnapshotEnvironment as a, resolveTestRunner as r, setupChaiConfig as s };
|
||||
41
node_modules/vitest/dist/chunks/init-forks.CKEYp90N.js
generated
vendored
Normal file
41
node_modules/vitest/dist/chunks/init-forks.CKEYp90N.js
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
import { i as init } from './init.B04saIIg.js';
|
||||
|
||||
if (!process.send) throw new Error("Expected worker to be run in node:child_process");
|
||||
// Store globals in case tests overwrite them
|
||||
const processExit = process.exit.bind(process);
|
||||
const processSend = process.send.bind(process);
|
||||
const processOn = process.on.bind(process);
|
||||
const processOff = process.off.bind(process);
|
||||
const processRemoveAllListeners = process.removeAllListeners.bind(process);
|
||||
// Work-around for nodejs/node#55094
|
||||
if (process.execArgv.some((execArg) => execArg.startsWith("--prof") || execArg.startsWith("--cpu-prof") || execArg.startsWith("--heap-prof") || execArg.startsWith("--diagnostic-dir"))) processOn("SIGTERM", () => processExit());
|
||||
processOn("error", onError);
|
||||
function workerInit(options) {
|
||||
const { runTests } = options;
|
||||
init({
|
||||
post: (v) => processSend(v),
|
||||
on: (cb) => processOn("message", cb),
|
||||
off: (cb) => processOff("message", cb),
|
||||
teardown: () => {
|
||||
processRemoveAllListeners("message");
|
||||
processOff("error", onError);
|
||||
},
|
||||
runTests: (state, traces) => executeTests("run", state, traces),
|
||||
collectTests: (state, traces) => executeTests("collect", state, traces),
|
||||
setup: options.setup
|
||||
});
|
||||
async function executeTests(method, state, traces) {
|
||||
try {
|
||||
await runTests(method, state, traces);
|
||||
} finally {
|
||||
process.exit = processExit;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Prevent leaving worker in loops where it tries to send message to closed main
|
||||
// thread, errors, and tries to send the error.
|
||||
function onError(error) {
|
||||
if (error?.code === "ERR_IPC_CHANNEL_CLOSED" || error?.code === "EPIPE") processExit(1);
|
||||
}
|
||||
|
||||
export { workerInit as w };
|
||||
18
node_modules/vitest/dist/chunks/init-threads.D8Ok07M7.js
generated
vendored
Normal file
18
node_modules/vitest/dist/chunks/init-threads.D8Ok07M7.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
import { isMainThread, parentPort } from 'node:worker_threads';
|
||||
import { i as init } from './init.B04saIIg.js';
|
||||
|
||||
if (isMainThread || !parentPort) throw new Error("Expected worker to be run in node:worker_threads");
|
||||
function workerInit(options) {
|
||||
const { runTests } = options;
|
||||
init({
|
||||
post: (response) => parentPort.postMessage(response),
|
||||
on: (callback) => parentPort.on("message", callback),
|
||||
off: (callback) => parentPort.off("message", callback),
|
||||
teardown: () => parentPort.removeAllListeners("message"),
|
||||
runTests: async (state, traces) => runTests("run", state, traces),
|
||||
collectTests: async (state, traces) => runTests("collect", state, traces),
|
||||
setup: options.setup
|
||||
});
|
||||
}
|
||||
|
||||
export { workerInit as w };
|
||||
321
node_modules/vitest/dist/chunks/init.B04saIIg.js
generated
vendored
Normal file
321
node_modules/vitest/dist/chunks/init.B04saIIg.js
generated
vendored
Normal file
@@ -0,0 +1,321 @@
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { isBuiltin } from 'node:module';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
import { resolve } from 'pathe';
|
||||
import { ModuleRunner } from 'vite/module-runner';
|
||||
import { b as VitestTransport } from './startModuleRunner.Iz2V0ESw.js';
|
||||
import { e as environments } from './index.BspFP3mn.js';
|
||||
import { serializeError } from '@vitest/utils/error';
|
||||
import { T as Traces } from './traces.U4xDYhzZ.js';
|
||||
import { o as onCancel, a as rpcDone, c as createRuntimeRpc } from './rpc.BytlcPfC.js';
|
||||
import { createStackString, parseStacktrace } from '@vitest/utils/source-map';
|
||||
import { s as setupInspect } from './inspector.CvyFGlXm.js';
|
||||
import { V as VitestEvaluatedModules } from './evaluatedModules.Dg1zASAC.js';
|
||||
|
||||
function isBuiltinEnvironment(env) {
|
||||
return env in environments;
|
||||
}
|
||||
const isWindows = process.platform === "win32";
|
||||
const _loaders = /* @__PURE__ */ new Map();
|
||||
function createEnvironmentLoader(root, rpc) {
|
||||
const cachedLoader = _loaders.get(root);
|
||||
if (!cachedLoader || cachedLoader.isClosed()) {
|
||||
_loaders.delete(root);
|
||||
const moduleRunner = new ModuleRunner({
|
||||
hmr: false,
|
||||
sourcemapInterceptor: "prepareStackTrace",
|
||||
transport: new VitestTransport({
|
||||
async fetchModule(id, importer, options) {
|
||||
const result = await rpc.fetch(id, importer, "__vitest__", options);
|
||||
if ("cached" in result) return {
|
||||
code: readFileSync(result.tmp, "utf-8"),
|
||||
...result
|
||||
};
|
||||
if (isWindows && "externalize" in result)
|
||||
// TODO: vitest returns paths for external modules, but Vite returns file://
|
||||
// https://github.com/vitejs/vite/pull/20449
|
||||
result.externalize = isBuiltin(id) || /^(?:node:|data:|http:|https:|file:)/.test(id) ? result.externalize : pathToFileURL(result.externalize).toString();
|
||||
return result;
|
||||
},
|
||||
async resolveId(id, importer) {
|
||||
return rpc.resolve(id, importer, "__vitest__");
|
||||
}
|
||||
})
|
||||
});
|
||||
_loaders.set(root, moduleRunner);
|
||||
}
|
||||
return _loaders.get(root);
|
||||
}
|
||||
async function loadEnvironment(name, root, rpc, traces) {
|
||||
if (isBuiltinEnvironment(name)) return { environment: environments[name] };
|
||||
const loader = createEnvironmentLoader(root, rpc);
|
||||
const packageId = name[0] === "." || name[0] === "/" ? resolve(root, name) : (await traces.$("vitest.runtime.environment.resolve", () => rpc.resolve(`vitest-environment-${name}`, void 0, "__vitest__")))?.id ?? resolve(root, name);
|
||||
const pkg = await traces.$("vitest.runtime.environment.import", () => loader.import(packageId));
|
||||
if (!pkg || !pkg.default || typeof pkg.default !== "object") throw new TypeError(`Environment "${name}" is not a valid environment. Path "${packageId}" should export default object with a "setup" or/and "setupVM" method.`);
|
||||
const environment = pkg.default;
|
||||
if (environment.transformMode != null && environment.transformMode !== "web" && environment.transformMode !== "ssr") throw new TypeError(`Environment "${name}" is not a valid environment. Path "${packageId}" should export default object with a "transformMode" method equal to "ssr" or "web", received "${environment.transformMode}".`);
|
||||
if (environment.transformMode) {
|
||||
console.warn(`The Vitest environment ${environment.name} defines the "transformMode". This options was deprecated in Vitest 4 and will be removed in the next major version. Please, use "viteEnvironment" instead.`);
|
||||
// keep for backwards compat
|
||||
environment.viteEnvironment ??= environment.transformMode === "ssr" ? "ssr" : "client";
|
||||
}
|
||||
return {
|
||||
environment,
|
||||
loader
|
||||
};
|
||||
}
|
||||
|
||||
const resolvingModules = /* @__PURE__ */ new Set();
|
||||
const globalListeners = /* @__PURE__ */ new Set();
|
||||
async function execute(method, ctx, worker, traces) {
|
||||
const prepareStart = performance.now();
|
||||
const cleanups = [setupInspect(ctx)];
|
||||
// RPC is used to communicate between worker (be it a thread worker or child process or a custom implementation) and the main thread
|
||||
const rpc = ctx.rpc;
|
||||
try {
|
||||
// do not close the RPC channel so that we can get the error messages sent to the main thread
|
||||
cleanups.push(async () => {
|
||||
await Promise.all(rpc.$rejectPendingCalls(({ method, reject }) => {
|
||||
reject(/* @__PURE__ */ new Error(`[vitest-worker]: Closing rpc while "${method}" was pending`));
|
||||
}));
|
||||
});
|
||||
const state = {
|
||||
ctx,
|
||||
evaluatedModules: new VitestEvaluatedModules(),
|
||||
resolvingModules,
|
||||
moduleExecutionInfo: /* @__PURE__ */ new Map(),
|
||||
config: ctx.config,
|
||||
environment: null,
|
||||
durations: {
|
||||
environment: 0,
|
||||
prepare: prepareStart
|
||||
},
|
||||
rpc,
|
||||
onCancel,
|
||||
onCleanup: (listener) => globalListeners.add(listener),
|
||||
providedContext: ctx.providedContext,
|
||||
onFilterStackTrace(stack) {
|
||||
return createStackString(parseStacktrace(stack));
|
||||
},
|
||||
metaEnv: createImportMetaEnvProxy()
|
||||
};
|
||||
const methodName = method === "collect" ? "collectTests" : "runTests";
|
||||
if (!worker[methodName] || typeof worker[methodName] !== "function") throw new TypeError(`Test worker should expose "runTests" method. Received "${typeof worker.runTests}".`);
|
||||
await worker[methodName](state, traces);
|
||||
} finally {
|
||||
await rpcDone().catch(() => {});
|
||||
await Promise.all(cleanups.map((fn) => fn())).catch(() => {});
|
||||
}
|
||||
}
|
||||
function run(ctx, worker, traces) {
|
||||
return execute("run", ctx, worker, traces);
|
||||
}
|
||||
function collect(ctx, worker, traces) {
|
||||
return execute("collect", ctx, worker, traces);
|
||||
}
|
||||
async function teardown() {
|
||||
await Promise.all([...globalListeners].map((l) => l()));
|
||||
}
|
||||
const env = process.env;
|
||||
function createImportMetaEnvProxy() {
|
||||
// packages/vitest/src/node/plugins/index.ts:146
|
||||
const booleanKeys = [
|
||||
"DEV",
|
||||
"PROD",
|
||||
"SSR"
|
||||
];
|
||||
return new Proxy(env, {
|
||||
get(_, key) {
|
||||
if (typeof key !== "string") return;
|
||||
if (booleanKeys.includes(key)) return !!process.env[key];
|
||||
return process.env[key];
|
||||
},
|
||||
set(_, key, value) {
|
||||
if (typeof key !== "string") return true;
|
||||
if (booleanKeys.includes(key)) process.env[key] = value ? "1" : "";
|
||||
else process.env[key] = value;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const __vitest_worker_response__ = true;
|
||||
const memoryUsage = process.memoryUsage.bind(process);
|
||||
let reportMemory = false;
|
||||
let traces;
|
||||
/** @experimental */
|
||||
function init(worker) {
|
||||
worker.on(onMessage);
|
||||
let runPromise;
|
||||
let isRunning = false;
|
||||
let workerTeardown;
|
||||
let setupContext;
|
||||
function send(response) {
|
||||
worker.post(worker.serialize ? worker.serialize(response) : response);
|
||||
}
|
||||
async function onMessage(rawMessage) {
|
||||
const message = worker.deserialize ? worker.deserialize(rawMessage) : rawMessage;
|
||||
if (message?.__vitest_worker_request__ !== true) return;
|
||||
switch (message.type) {
|
||||
case "start": {
|
||||
process.env.VITEST_POOL_ID = String(message.poolId);
|
||||
process.env.VITEST_WORKER_ID = String(message.workerId);
|
||||
reportMemory = message.options.reportMemory;
|
||||
const tracesStart = performance.now();
|
||||
traces ??= await new Traces({
|
||||
enabled: message.traces.enabled,
|
||||
sdkPath: message.traces.sdkPath
|
||||
}).waitInit();
|
||||
const tracesEnd = performance.now();
|
||||
const { environment, config, pool } = message.context;
|
||||
const context = traces.getContextFromCarrier(message.traces.otelCarrier);
|
||||
// record telemetry as part of "start"
|
||||
traces.startSpan("vitest.runtime.traces", { startTime: tracesStart }, context).end(tracesEnd);
|
||||
try {
|
||||
setupContext = {
|
||||
environment,
|
||||
config,
|
||||
pool,
|
||||
rpc: createRuntimeRpc(worker),
|
||||
projectName: config.name || "",
|
||||
traces
|
||||
};
|
||||
workerTeardown = await traces.$("vitest.runtime.setup", { context }, () => worker.setup?.(setupContext));
|
||||
send({
|
||||
type: "started",
|
||||
__vitest_worker_response__
|
||||
});
|
||||
} catch (error) {
|
||||
send({
|
||||
type: "started",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(error)
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "run":
|
||||
// Prevent concurrent execution if worker is already running
|
||||
if (isRunning) {
|
||||
send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(/* @__PURE__ */ new Error("[vitest-worker]: Worker is already running tests"))
|
||||
});
|
||||
return;
|
||||
}
|
||||
try {
|
||||
process.env.VITEST_WORKER_ID = String(message.context.workerId);
|
||||
} catch (error) {
|
||||
return send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(error),
|
||||
usedMemory: reportMemory ? memoryUsage().heapUsed : void 0
|
||||
});
|
||||
}
|
||||
isRunning = true;
|
||||
try {
|
||||
const tracesContext = traces.getContextFromCarrier(message.otelCarrier);
|
||||
runPromise = traces.$("vitest.runtime.run", {
|
||||
context: tracesContext,
|
||||
attributes: {
|
||||
"vitest.worker.specifications": traces.isEnabled() ? getFilesWithLocations(message.context.files) : [],
|
||||
"vitest.worker.id": message.context.workerId
|
||||
}
|
||||
}, () => run({
|
||||
...setupContext,
|
||||
...message.context
|
||||
}, worker, traces).catch((error) => serializeError(error)));
|
||||
send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: await runPromise,
|
||||
usedMemory: reportMemory ? memoryUsage().heapUsed : void 0
|
||||
});
|
||||
} finally {
|
||||
runPromise = void 0;
|
||||
isRunning = false;
|
||||
}
|
||||
break;
|
||||
case "collect":
|
||||
// Prevent concurrent execution if worker is already running
|
||||
if (isRunning) {
|
||||
send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(/* @__PURE__ */ new Error("[vitest-worker]: Worker is already running tests"))
|
||||
});
|
||||
return;
|
||||
}
|
||||
try {
|
||||
process.env.VITEST_WORKER_ID = String(message.context.workerId);
|
||||
} catch (error) {
|
||||
return send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: serializeError(error),
|
||||
usedMemory: reportMemory ? memoryUsage().heapUsed : void 0
|
||||
});
|
||||
}
|
||||
isRunning = true;
|
||||
try {
|
||||
const tracesContext = traces.getContextFromCarrier(message.otelCarrier);
|
||||
runPromise = traces.$("vitest.runtime.collect", {
|
||||
context: tracesContext,
|
||||
attributes: {
|
||||
"vitest.worker.specifications": traces.isEnabled() ? getFilesWithLocations(message.context.files) : [],
|
||||
"vitest.worker.id": message.context.workerId
|
||||
}
|
||||
}, () => collect({
|
||||
...setupContext,
|
||||
...message.context
|
||||
}, worker, traces).catch((error) => serializeError(error)));
|
||||
send({
|
||||
type: "testfileFinished",
|
||||
__vitest_worker_response__,
|
||||
error: await runPromise,
|
||||
usedMemory: reportMemory ? memoryUsage().heapUsed : void 0
|
||||
});
|
||||
} finally {
|
||||
runPromise = void 0;
|
||||
isRunning = false;
|
||||
}
|
||||
break;
|
||||
case "stop":
|
||||
await runPromise;
|
||||
try {
|
||||
const context = traces.getContextFromCarrier(message.otelCarrier);
|
||||
const error = await traces.$("vitest.runtime.teardown", { context }, async () => {
|
||||
const error = await teardown().catch((error) => serializeError(error));
|
||||
await workerTeardown?.();
|
||||
return error;
|
||||
});
|
||||
await traces.finish();
|
||||
send({
|
||||
type: "stopped",
|
||||
error,
|
||||
__vitest_worker_response__
|
||||
});
|
||||
} catch (error) {
|
||||
send({
|
||||
type: "stopped",
|
||||
error: serializeError(error),
|
||||
__vitest_worker_response__
|
||||
});
|
||||
}
|
||||
worker.teardown?.();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
function getFilesWithLocations(files) {
|
||||
return files.flatMap((file) => {
|
||||
if (!file.testLocations) return file.filepath;
|
||||
return file.testLocations.map((location) => {
|
||||
return `${file}:${location}`;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export { init as i, loadEnvironment as l };
|
||||
53
node_modules/vitest/dist/chunks/inspector.CvyFGlXm.js
generated
vendored
Normal file
53
node_modules/vitest/dist/chunks/inspector.CvyFGlXm.js
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
import { createRequire } from 'node:module';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
|
||||
const __require = createRequire(import.meta.url);
|
||||
let inspector;
|
||||
let session;
|
||||
/**
|
||||
* Enables debugging inside `worker_threads` and `child_process`.
|
||||
* Should be called as early as possible when worker/process has been set up.
|
||||
*/
|
||||
function setupInspect(ctx) {
|
||||
const config = ctx.config;
|
||||
const isEnabled = config.inspector.enabled;
|
||||
if (isEnabled) {
|
||||
inspector = __require("node:inspector");
|
||||
if (!(inspector.url() !== void 0)) {
|
||||
inspector.open(config.inspector.port, config.inspector.host, config.inspector.waitForDebugger);
|
||||
if (config.inspectBrk) {
|
||||
const firstTestFile = typeof ctx.files[0] === "string" ? ctx.files[0] : ctx.files[0].filepath;
|
||||
// Stop at first test file
|
||||
if (firstTestFile) {
|
||||
session = new inspector.Session();
|
||||
session.connect();
|
||||
session.post("Debugger.enable");
|
||||
session.post("Debugger.setBreakpointByUrl", {
|
||||
lineNumber: 0,
|
||||
url: pathToFileURL(firstTestFile)
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const keepOpen = shouldKeepOpen(config);
|
||||
return function cleanup() {
|
||||
if (isEnabled && !keepOpen && inspector) {
|
||||
inspector.close();
|
||||
session?.disconnect();
|
||||
}
|
||||
};
|
||||
}
|
||||
function closeInspector(config) {
|
||||
const keepOpen = shouldKeepOpen(config);
|
||||
if (inspector && !keepOpen) {
|
||||
inspector.close();
|
||||
session?.disconnect();
|
||||
}
|
||||
}
|
||||
function shouldKeepOpen(config) {
|
||||
// In watch mode the inspector can persist re-runs if isolation is disabled and a single worker is used
|
||||
return config.watch && config.isolate === false && config.maxWorkers === 1;
|
||||
}
|
||||
|
||||
export { closeInspector as c, setupInspect as s };
|
||||
35
node_modules/vitest/dist/chunks/modules.DJPjQW6m.js
generated
vendored
Normal file
35
node_modules/vitest/dist/chunks/modules.DJPjQW6m.js
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
import { builtinModules } from 'node:module';
|
||||
|
||||
// copied from vite
|
||||
// https://github.com/vitejs/vite/blob/814120f2ad387ca3d1e16c7dd403b04ca4b97f75/packages/vite/src/node/utils.ts#L106
|
||||
// Supported by Node, Deno, Bun
|
||||
const NODE_BUILTIN_NAMESPACE = "node:";
|
||||
// Supported by Deno
|
||||
const NPM_BUILTIN_NAMESPACE = "npm:";
|
||||
// Supported by Bun
|
||||
const BUN_BUILTIN_NAMESPACE = "bun:";
|
||||
// Some runtimes like Bun injects namespaced modules here, which is not a node builtin
|
||||
const nodeBuiltins = builtinModules.filter((id) => !id.includes(":"));
|
||||
// TODO: Use `isBuiltin` from `node:module`, but Deno doesn't support it
|
||||
function isBuiltin(id) {
|
||||
if (process.versions.deno && id.startsWith(NPM_BUILTIN_NAMESPACE)) return true;
|
||||
if (process.versions.bun && id.startsWith(BUN_BUILTIN_NAMESPACE)) return true;
|
||||
return isNodeBuiltin(id);
|
||||
}
|
||||
function isNodeBuiltin(id) {
|
||||
if (id.startsWith(NODE_BUILTIN_NAMESPACE)) return true;
|
||||
return nodeBuiltins.includes(id);
|
||||
}
|
||||
const browserExternalId = "__vite-browser-external";
|
||||
const browserExternalLength = 24;
|
||||
function isBrowserExternal(id) {
|
||||
return id.startsWith(browserExternalId);
|
||||
}
|
||||
function toBuiltin(id) {
|
||||
if (id.startsWith(browserExternalId)) id = id.slice(browserExternalLength);
|
||||
if (id.startsWith(NPM_BUILTIN_NAMESPACE) || id.startsWith(BUN_BUILTIN_NAMESPACE) || id.startsWith(NODE_BUILTIN_NAMESPACE)) return id;
|
||||
if (process.versions.deno || process.versions.bun) return id;
|
||||
return `node:${id}`;
|
||||
}
|
||||
|
||||
export { isBrowserExternal as a, isBuiltin as i, toBuiltin as t };
|
||||
14
node_modules/vitest/dist/chunks/node.Ce0vMQM7.js
generated
vendored
Normal file
14
node_modules/vitest/dist/chunks/node.Ce0vMQM7.js
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
import { NodeSnapshotEnvironment } from '@vitest/snapshot/environment';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/timers';
|
||||
|
||||
class VitestNodeSnapshotEnvironment extends NodeSnapshotEnvironment {
|
||||
getHeader() {
|
||||
return `// Vitest Snapshot v${this.getVersion()}, https://vitest.dev/guide/snapshot.html`;
|
||||
}
|
||||
resolvePath(filepath) {
|
||||
return getWorkerState().rpc.resolveSnapshotPath(filepath);
|
||||
}
|
||||
}
|
||||
|
||||
export { VitestNodeSnapshotEnvironment };
|
||||
38
node_modules/vitest/dist/chunks/plugin.d.CY7CUjf-.d.ts
generated
vendored
Normal file
38
node_modules/vitest/dist/chunks/plugin.d.CY7CUjf-.d.ts
generated
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
import { DevEnvironment } from 'vite';
|
||||
import { V as Vitest, T as TestProject, b as TestProjectConfiguration } from './reporters.d.OXEK7y4s.js';
|
||||
|
||||
/**
|
||||
* Generate a unique cache identifier.
|
||||
*
|
||||
* Return `false` to disable caching of the file.
|
||||
* @experimental
|
||||
*/
|
||||
interface CacheKeyIdGenerator {
|
||||
(context: CacheKeyIdGeneratorContext): string | undefined | null | false;
|
||||
}
|
||||
/**
|
||||
* @experimental
|
||||
*/
|
||||
interface CacheKeyIdGeneratorContext {
|
||||
environment: DevEnvironment;
|
||||
id: string;
|
||||
sourceCode: string;
|
||||
}
|
||||
|
||||
interface VitestPluginContext {
|
||||
vitest: Vitest;
|
||||
project: TestProject;
|
||||
injectTestProjects: (config: TestProjectConfiguration | TestProjectConfiguration[]) => Promise<TestProject[]>;
|
||||
/**
|
||||
* Define a generator that will be applied before hashing the cache key.
|
||||
*
|
||||
* Use this to make sure Vitest generates correct hash. It is a good idea
|
||||
* to define this function if your plugin can be registered with different options.
|
||||
*
|
||||
* This is called only if `experimental.fsModuleCache` is defined.
|
||||
* @experimental
|
||||
*/
|
||||
experimental_defineCacheKeyGenerator: (callback: CacheKeyIdGenerator) => void;
|
||||
}
|
||||
|
||||
export type { CacheKeyIdGenerator as C, VitestPluginContext as V, CacheKeyIdGeneratorContext as a };
|
||||
3270
node_modules/vitest/dist/chunks/reporters.d.OXEK7y4s.d.ts
generated
vendored
Normal file
3270
node_modules/vitest/dist/chunks/reporters.d.OXEK7y4s.d.ts
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
76
node_modules/vitest/dist/chunks/rpc.BytlcPfC.js
generated
vendored
Normal file
76
node_modules/vitest/dist/chunks/rpc.BytlcPfC.js
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
import { getSafeTimers } from '@vitest/utils/timers';
|
||||
import { c as createBirpc } from './index.0kCJoeWi.js';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
const { get } = Reflect;
|
||||
function withSafeTimers(fn) {
|
||||
const { setTimeout, clearTimeout, nextTick, setImmediate, clearImmediate } = getSafeTimers();
|
||||
const currentSetTimeout = globalThis.setTimeout;
|
||||
const currentClearTimeout = globalThis.clearTimeout;
|
||||
const currentSetImmediate = globalThis.setImmediate;
|
||||
const currentClearImmediate = globalThis.clearImmediate;
|
||||
const currentNextTick = globalThis.process?.nextTick;
|
||||
try {
|
||||
globalThis.setTimeout = setTimeout;
|
||||
globalThis.clearTimeout = clearTimeout;
|
||||
if (setImmediate) globalThis.setImmediate = setImmediate;
|
||||
if (clearImmediate) globalThis.clearImmediate = clearImmediate;
|
||||
if (globalThis.process && nextTick) globalThis.process.nextTick = nextTick;
|
||||
return fn();
|
||||
} finally {
|
||||
globalThis.setTimeout = currentSetTimeout;
|
||||
globalThis.clearTimeout = currentClearTimeout;
|
||||
globalThis.setImmediate = currentSetImmediate;
|
||||
globalThis.clearImmediate = currentClearImmediate;
|
||||
if (globalThis.process && nextTick) nextTick(() => {
|
||||
globalThis.process.nextTick = currentNextTick;
|
||||
});
|
||||
}
|
||||
}
|
||||
const promises = /* @__PURE__ */ new Set();
|
||||
async function rpcDone() {
|
||||
if (!promises.size) return;
|
||||
const awaitable = Array.from(promises);
|
||||
return Promise.all(awaitable);
|
||||
}
|
||||
const onCancelCallbacks = [];
|
||||
function onCancel(callback) {
|
||||
onCancelCallbacks.push(callback);
|
||||
}
|
||||
function createRuntimeRpc(options) {
|
||||
return createSafeRpc(createBirpc({ async onCancel(reason) {
|
||||
await Promise.all(onCancelCallbacks.map((fn) => fn(reason)));
|
||||
} }, {
|
||||
eventNames: [
|
||||
"onUserConsoleLog",
|
||||
"onCollected",
|
||||
"onCancel"
|
||||
],
|
||||
timeout: -1,
|
||||
...options
|
||||
}));
|
||||
}
|
||||
function createSafeRpc(rpc) {
|
||||
return new Proxy(rpc, { get(target, p, handler) {
|
||||
// keep $rejectPendingCalls as sync function
|
||||
if (p === "$rejectPendingCalls") return rpc.$rejectPendingCalls;
|
||||
const sendCall = get(target, p, handler);
|
||||
const safeSendCall = (...args) => withSafeTimers(async () => {
|
||||
const result = sendCall(...args);
|
||||
promises.add(result);
|
||||
try {
|
||||
return await result;
|
||||
} finally {
|
||||
promises.delete(result);
|
||||
}
|
||||
});
|
||||
safeSendCall.asEvent = sendCall.asEvent;
|
||||
return safeSendCall;
|
||||
} });
|
||||
}
|
||||
function rpc() {
|
||||
const { rpc } = getWorkerState();
|
||||
return rpc;
|
||||
}
|
||||
|
||||
export { rpcDone as a, createRuntimeRpc as c, onCancel as o, rpc as r };
|
||||
64
node_modules/vitest/dist/chunks/rpc.d.RH3apGEf.d.ts
generated
vendored
Normal file
64
node_modules/vitest/dist/chunks/rpc.d.RH3apGEf.d.ts
generated
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
import { CancelReason, File, TestArtifact, TaskResultPack, TaskEventPack } from '@vitest/runner';
|
||||
import { SnapshotResult } from '@vitest/snapshot';
|
||||
import { FetchFunctionOptions, FetchResult } from 'vite/module-runner';
|
||||
import { O as OTELCarrier } from './traces.d.402V_yFI.js';
|
||||
|
||||
interface AfterSuiteRunMeta {
|
||||
coverage?: unknown;
|
||||
testFiles: string[];
|
||||
environment: string;
|
||||
projectName?: string;
|
||||
}
|
||||
interface UserConsoleLog {
|
||||
content: string;
|
||||
origin?: string;
|
||||
browser?: boolean;
|
||||
type: "stdout" | "stderr";
|
||||
taskId?: string;
|
||||
time: number;
|
||||
size: number;
|
||||
}
|
||||
interface ModuleGraphData {
|
||||
graph: Record<string, string[]>;
|
||||
externalized: string[];
|
||||
inlined: string[];
|
||||
}
|
||||
interface ProvidedContext {}
|
||||
interface ResolveFunctionResult {
|
||||
id: string;
|
||||
file: string;
|
||||
url: string;
|
||||
}
|
||||
interface FetchCachedFileSystemResult {
|
||||
cached: true;
|
||||
tmp: string;
|
||||
id: string;
|
||||
file: string | null;
|
||||
url: string;
|
||||
invalidate: boolean;
|
||||
}
|
||||
type LabelColor = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white";
|
||||
|
||||
interface RuntimeRPC {
|
||||
fetch: (id: string, importer: string | undefined, environment: string, options?: FetchFunctionOptions, otelCarrier?: OTELCarrier) => Promise<FetchResult | FetchCachedFileSystemResult>;
|
||||
resolve: (id: string, importer: string | undefined, environment: string) => Promise<ResolveFunctionResult | null>;
|
||||
transform: (id: string) => Promise<{
|
||||
code?: string;
|
||||
}>;
|
||||
onUserConsoleLog: (log: UserConsoleLog) => void;
|
||||
onUnhandledError: (err: unknown, type: string) => void;
|
||||
onQueued: (file: File) => void;
|
||||
onCollected: (files: File[]) => Promise<void>;
|
||||
onAfterSuiteRun: (meta: AfterSuiteRunMeta) => void;
|
||||
onTaskArtifactRecord: <Artifact extends TestArtifact>(testId: string, artifact: Artifact) => Promise<Artifact>;
|
||||
onTaskUpdate: (pack: TaskResultPack[], events: TaskEventPack[]) => Promise<void>;
|
||||
onCancel: (reason: CancelReason) => void;
|
||||
getCountOfFailedTests: () => number;
|
||||
snapshotSaved: (snapshot: SnapshotResult) => void;
|
||||
resolveSnapshotPath: (testPath: string) => string;
|
||||
}
|
||||
interface RunnerRPC {
|
||||
onCancel: (reason: CancelReason) => void;
|
||||
}
|
||||
|
||||
export type { AfterSuiteRunMeta as A, LabelColor as L, ModuleGraphData as M, ProvidedContext as P, RuntimeRPC as R, UserConsoleLog as U, RunnerRPC as a };
|
||||
60
node_modules/vitest/dist/chunks/setup-common.Cm-kSBVi.js
generated
vendored
Normal file
60
node_modules/vitest/dist/chunks/setup-common.Cm-kSBVi.js
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
import { r as resolveCoverageProviderModule } from './coverage.D_JHT54q.js';
|
||||
import { addSerializer } from '@vitest/snapshot';
|
||||
import { setSafeTimers } from '@vitest/utils/timers';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
async function startCoverageInsideWorker(options, loader, runtimeOptions) {
|
||||
const coverageModule = await resolveCoverageProviderModule(options, loader);
|
||||
if (coverageModule) return coverageModule.startCoverage?.(runtimeOptions);
|
||||
return null;
|
||||
}
|
||||
async function takeCoverageInsideWorker(options, loader) {
|
||||
const coverageModule = await resolveCoverageProviderModule(options, loader);
|
||||
if (coverageModule) return coverageModule.takeCoverage?.({ moduleExecutionInfo: loader.moduleExecutionInfo });
|
||||
return null;
|
||||
}
|
||||
async function stopCoverageInsideWorker(options, loader, runtimeOptions) {
|
||||
const coverageModule = await resolveCoverageProviderModule(options, loader);
|
||||
if (coverageModule) return coverageModule.stopCoverage?.(runtimeOptions);
|
||||
return null;
|
||||
}
|
||||
|
||||
let globalSetup = false;
|
||||
async function setupCommonEnv(config) {
|
||||
setupDefines(config);
|
||||
setupEnv(config.env);
|
||||
if (globalSetup) return;
|
||||
globalSetup = true;
|
||||
setSafeTimers();
|
||||
if (config.globals) (await import('./globals.DOayXfHP.js')).registerApiGlobally();
|
||||
}
|
||||
function setupDefines(config) {
|
||||
for (const key in config.defines) globalThis[key] = config.defines[key];
|
||||
}
|
||||
function setupEnv(env) {
|
||||
const state = getWorkerState();
|
||||
// same boolean-to-string assignment as VitestPlugin.configResolved
|
||||
const { PROD, DEV, ...restEnvs } = env;
|
||||
state.metaEnv.PROD = PROD;
|
||||
state.metaEnv.DEV = DEV;
|
||||
for (const key in restEnvs) state.metaEnv[key] = env[key];
|
||||
}
|
||||
async function loadDiffConfig(config, moduleRunner) {
|
||||
if (typeof config.diff === "object") return config.diff;
|
||||
if (typeof config.diff !== "string") return;
|
||||
const diffModule = await moduleRunner.import(config.diff);
|
||||
if (diffModule && typeof diffModule.default === "object" && diffModule.default != null) return diffModule.default;
|
||||
else throw new Error(`invalid diff config file ${config.diff}. Must have a default export with config object`);
|
||||
}
|
||||
async function loadSnapshotSerializers(config, moduleRunner) {
|
||||
const files = config.snapshotSerializers;
|
||||
(await Promise.all(files.map(async (file) => {
|
||||
const mo = await moduleRunner.import(file);
|
||||
if (!mo || typeof mo.default !== "object" || mo.default === null) throw new Error(`invalid snapshot serializer file ${file}. Must export a default object`);
|
||||
const config = mo.default;
|
||||
if (typeof config.test !== "function" || typeof config.serialize !== "function" && typeof config.print !== "function") throw new TypeError(`invalid snapshot serializer in ${file}. Must have a 'test' method along with either a 'serialize' or 'print' method.`);
|
||||
return config;
|
||||
}))).forEach((serializer) => addSerializer(serializer));
|
||||
}
|
||||
|
||||
export { stopCoverageInsideWorker as a, loadSnapshotSerializers as b, setupCommonEnv as c, loadDiffConfig as l, startCoverageInsideWorker as s, takeCoverageInsideWorker as t };
|
||||
861
node_modules/vitest/dist/chunks/startModuleRunner.Iz2V0ESw.js
generated
vendored
Normal file
861
node_modules/vitest/dist/chunks/startModuleRunner.Iz2V0ESw.js
generated
vendored
Normal file
@@ -0,0 +1,861 @@
|
||||
import fs from 'node:fs';
|
||||
import { isBareImport } from '@vitest/utils/helpers';
|
||||
import { i as isBuiltin, a as isBrowserExternal, t as toBuiltin } from './modules.DJPjQW6m.js';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
import { normalize as normalize$1, join as join$1 } from 'pathe';
|
||||
import { distDir } from '../path.js';
|
||||
import { serializeValue } from '@vitest/utils/serialize';
|
||||
import { VitestModuleEvaluator, unwrapId } from '../module-evaluator.js';
|
||||
import { resolve as resolve$1, isAbsolute as isAbsolute$1 } from 'node:path';
|
||||
import vm from 'node:vm';
|
||||
import { MockerRegistry, mockObject, RedirectedModule, AutomockedModule } from '@vitest/mocker';
|
||||
import nodeModule from 'node:module';
|
||||
import * as viteModuleRunner from 'vite/module-runner';
|
||||
import { T as Traces } from './traces.U4xDYhzZ.js';
|
||||
|
||||
class VitestTransport {
|
||||
constructor(options) {
|
||||
this.options = options;
|
||||
}
|
||||
async invoke(event) {
|
||||
if (event.type !== "custom") return { error: /* @__PURE__ */ new Error(`Vitest Module Runner doesn't support Vite HMR events.`) };
|
||||
if (event.event !== "vite:invoke") return { error: /* @__PURE__ */ new Error(`Vitest Module Runner doesn't support ${event.event} event.`) };
|
||||
const { name, data } = event.data;
|
||||
if (name === "getBuiltins")
|
||||
// we return an empty array here to avoid client-side builtin check,
|
||||
// as we need builtins to go through `fetchModule`
|
||||
return { result: [] };
|
||||
if (name !== "fetchModule") return { error: /* @__PURE__ */ new Error(`Unknown method: ${name}. Expected "fetchModule".`) };
|
||||
try {
|
||||
return { result: await this.options.fetchModule(...data) };
|
||||
} catch (error) {
|
||||
return { error };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
||||
function normalizeWindowsPath(input = "") {
|
||||
if (!input) return input;
|
||||
return input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
|
||||
}
|
||||
const _UNC_REGEX = /^[/\\]{2}/;
|
||||
const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/;
|
||||
const _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
|
||||
const _EXTNAME_RE = /.(\.[^./]+|\.)$/;
|
||||
const normalize = function(path) {
|
||||
if (path.length === 0) return ".";
|
||||
path = normalizeWindowsPath(path);
|
||||
const isUNCPath = path.match(_UNC_REGEX);
|
||||
const isPathAbsolute = isAbsolute(path);
|
||||
const trailingSeparator = path[path.length - 1] === "/";
|
||||
path = normalizeString(path, !isPathAbsolute);
|
||||
if (path.length === 0) {
|
||||
if (isPathAbsolute) return "/";
|
||||
return trailingSeparator ? "./" : ".";
|
||||
}
|
||||
if (trailingSeparator) path += "/";
|
||||
if (_DRIVE_LETTER_RE.test(path)) path += "/";
|
||||
if (isUNCPath) {
|
||||
if (!isPathAbsolute) return `//./${path}`;
|
||||
return `//${path}`;
|
||||
}
|
||||
return isPathAbsolute && !isAbsolute(path) ? `/${path}` : path;
|
||||
};
|
||||
const join = function(...segments) {
|
||||
let path = "";
|
||||
for (const seg of segments) {
|
||||
if (!seg) continue;
|
||||
if (path.length > 0) {
|
||||
const pathTrailing = path[path.length - 1] === "/";
|
||||
const segLeading = seg[0] === "/";
|
||||
if (pathTrailing && segLeading) path += seg.slice(1);
|
||||
else path += pathTrailing || segLeading ? seg : `/${seg}`;
|
||||
} else path += seg;
|
||||
}
|
||||
return normalize(path);
|
||||
};
|
||||
function cwd$1() {
|
||||
if (typeof process !== "undefined" && typeof process.cwd === "function") return process.cwd().replace(/\\/g, "/");
|
||||
return "/";
|
||||
}
|
||||
const resolve = function(...arguments_) {
|
||||
arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
|
||||
let resolvedPath = "";
|
||||
let resolvedAbsolute = false;
|
||||
for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
|
||||
const path = index >= 0 ? arguments_[index] : cwd$1();
|
||||
if (!path || path.length === 0) continue;
|
||||
resolvedPath = `${path}/${resolvedPath}`;
|
||||
resolvedAbsolute = isAbsolute(path);
|
||||
}
|
||||
resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute);
|
||||
if (resolvedAbsolute && !isAbsolute(resolvedPath)) return `/${resolvedPath}`;
|
||||
return resolvedPath.length > 0 ? resolvedPath : ".";
|
||||
};
|
||||
function normalizeString(path, allowAboveRoot) {
|
||||
let res = "";
|
||||
let lastSegmentLength = 0;
|
||||
let lastSlash = -1;
|
||||
let dots = 0;
|
||||
let char = null;
|
||||
for (let index = 0; index <= path.length; ++index) {
|
||||
if (index < path.length) char = path[index];
|
||||
else if (char === "/") break;
|
||||
else char = "/";
|
||||
if (char === "/") {
|
||||
if (lastSlash === index - 1 || dots === 1);
|
||||
else if (dots === 2) {
|
||||
if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
|
||||
if (res.length > 2) {
|
||||
const lastSlashIndex = res.lastIndexOf("/");
|
||||
if (lastSlashIndex === -1) {
|
||||
res = "";
|
||||
lastSegmentLength = 0;
|
||||
} else {
|
||||
res = res.slice(0, lastSlashIndex);
|
||||
lastSegmentLength = res.length - 1 - res.lastIndexOf("/");
|
||||
}
|
||||
lastSlash = index;
|
||||
dots = 0;
|
||||
continue;
|
||||
} else if (res.length > 0) {
|
||||
res = "";
|
||||
lastSegmentLength = 0;
|
||||
lastSlash = index;
|
||||
dots = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (allowAboveRoot) {
|
||||
res += res.length > 0 ? "/.." : "..";
|
||||
lastSegmentLength = 2;
|
||||
}
|
||||
} else {
|
||||
if (res.length > 0) res += `/${path.slice(lastSlash + 1, index)}`;
|
||||
else res = path.slice(lastSlash + 1, index);
|
||||
lastSegmentLength = index - lastSlash - 1;
|
||||
}
|
||||
lastSlash = index;
|
||||
dots = 0;
|
||||
} else if (char === "." && dots !== -1) ++dots;
|
||||
else dots = -1;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
const isAbsolute = function(p) {
|
||||
return _IS_ABSOLUTE_RE.test(p);
|
||||
};
|
||||
const extname = function(p) {
|
||||
if (p === "..") return "";
|
||||
const match = _EXTNAME_RE.exec(normalizeWindowsPath(p));
|
||||
return match && match[1] || "";
|
||||
};
|
||||
const dirname = function(p) {
|
||||
const segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
|
||||
if (segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0])) segments[0] += "/";
|
||||
return segments.join("/") || (isAbsolute(p) ? "/" : ".");
|
||||
};
|
||||
const basename = function(p, extension) {
|
||||
const segments = normalizeWindowsPath(p).split("/");
|
||||
let lastSegment = "";
|
||||
for (let i = segments.length - 1; i >= 0; i--) {
|
||||
const val = segments[i];
|
||||
if (val) {
|
||||
lastSegment = val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return extension && lastSegment.endsWith(extension) ? lastSegment.slice(0, -extension.length) : lastSegment;
|
||||
};
|
||||
|
||||
const { existsSync, readdirSync, statSync } = fs;
|
||||
function findMockRedirect(root, mockPath, external) {
|
||||
const path = external || mockPath;
|
||||
// it's a node_module alias
|
||||
// all mocks should be inside <root>/__mocks__
|
||||
if (external || isNodeBuiltin(mockPath) || !existsSync(mockPath)) {
|
||||
const mockFolder = join(root, "__mocks__", dirname(path));
|
||||
if (!existsSync(mockFolder)) return null;
|
||||
const baseOriginal = basename(path);
|
||||
function findFile(mockFolder, baseOriginal) {
|
||||
const files = readdirSync(mockFolder);
|
||||
for (const file of files) if (basename(file, extname(file)) === baseOriginal) {
|
||||
const path = resolve(mockFolder, file);
|
||||
// if the same name, return the file
|
||||
if (statSync(path).isFile()) return path;
|
||||
else {
|
||||
// find folder/index.{js,ts}
|
||||
const indexFile = findFile(path, "index");
|
||||
if (indexFile) return indexFile;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return findFile(mockFolder, baseOriginal);
|
||||
}
|
||||
const fullPath = resolve(dirname(path), "__mocks__", basename(path));
|
||||
return existsSync(fullPath) ? fullPath : null;
|
||||
}
|
||||
const builtins = new Set([
|
||||
...nodeModule.builtinModules,
|
||||
"assert/strict",
|
||||
"diagnostics_channel",
|
||||
"dns/promises",
|
||||
"fs/promises",
|
||||
"path/posix",
|
||||
"path/win32",
|
||||
"readline/promises",
|
||||
"stream/consumers",
|
||||
"stream/promises",
|
||||
"stream/web",
|
||||
"timers/promises",
|
||||
"util/types",
|
||||
"wasi"
|
||||
]);
|
||||
// https://nodejs.org/api/modules.html#built-in-modules-with-mandatory-node-prefix
|
||||
const prefixedBuiltins$1 = new Set([
|
||||
"node:sea",
|
||||
"node:sqlite",
|
||||
"node:test",
|
||||
"node:test/reporters"
|
||||
]);
|
||||
const NODE_BUILTIN_NAMESPACE = "node:";
|
||||
function isNodeBuiltin(id) {
|
||||
// Added in v18.6.0
|
||||
if (nodeModule.isBuiltin) return nodeModule.isBuiltin(id);
|
||||
if (prefixedBuiltins$1.has(id)) return true;
|
||||
return builtins.has(id.startsWith(NODE_BUILTIN_NAMESPACE) ? id.slice(5) : id);
|
||||
}
|
||||
|
||||
const spyModulePath = resolve$1(distDir, "spy.js");
|
||||
class VitestMocker {
|
||||
static pendingIds = [];
|
||||
spyModule;
|
||||
primitives;
|
||||
filterPublicKeys;
|
||||
registries = /* @__PURE__ */ new Map();
|
||||
mockContext = { callstack: null };
|
||||
_otel;
|
||||
constructor(moduleRunner, options) {
|
||||
this.moduleRunner = moduleRunner;
|
||||
this.options = options;
|
||||
const context = this.options.context;
|
||||
this._otel = options.traces;
|
||||
if (context) this.primitives = vm.runInContext("({ Object, Error, Function, RegExp, Symbol, Array, Map })", context);
|
||||
else this.primitives = {
|
||||
Object,
|
||||
Error,
|
||||
Function,
|
||||
RegExp,
|
||||
Symbol: globalThis.Symbol,
|
||||
Array,
|
||||
Map
|
||||
};
|
||||
if (options.spyModule) this.spyModule = options.spyModule;
|
||||
const Symbol = this.primitives.Symbol;
|
||||
this.filterPublicKeys = [
|
||||
"__esModule",
|
||||
Symbol.asyncIterator,
|
||||
Symbol.hasInstance,
|
||||
Symbol.isConcatSpreadable,
|
||||
Symbol.iterator,
|
||||
Symbol.match,
|
||||
Symbol.matchAll,
|
||||
Symbol.replace,
|
||||
Symbol.search,
|
||||
Symbol.split,
|
||||
Symbol.species,
|
||||
Symbol.toPrimitive,
|
||||
Symbol.toStringTag,
|
||||
Symbol.unscopables
|
||||
];
|
||||
}
|
||||
get root() {
|
||||
return this.options.root;
|
||||
}
|
||||
get evaluatedModules() {
|
||||
return this.moduleRunner.evaluatedModules;
|
||||
}
|
||||
get moduleDirectories() {
|
||||
return this.options.moduleDirectories || [];
|
||||
}
|
||||
async initializeSpyModule() {
|
||||
if (this.spyModule) return;
|
||||
this.spyModule = await this.moduleRunner.import(spyModulePath);
|
||||
}
|
||||
getMockerRegistry() {
|
||||
const suite = this.getSuiteFilepath();
|
||||
if (!this.registries.has(suite)) this.registries.set(suite, new MockerRegistry());
|
||||
return this.registries.get(suite);
|
||||
}
|
||||
reset() {
|
||||
this.registries.clear();
|
||||
}
|
||||
invalidateModuleById(id) {
|
||||
const mockId = this.getMockPath(id);
|
||||
const node = this.evaluatedModules.getModuleById(mockId);
|
||||
if (node) {
|
||||
this.evaluatedModules.invalidateModule(node);
|
||||
node.mockedExports = void 0;
|
||||
}
|
||||
}
|
||||
isModuleDirectory(path) {
|
||||
return this.moduleDirectories.some((dir) => path.includes(dir));
|
||||
}
|
||||
getSuiteFilepath() {
|
||||
return this.options.getCurrentTestFilepath() || "global";
|
||||
}
|
||||
createError(message, codeFrame) {
|
||||
const Error = this.primitives.Error;
|
||||
const error = new Error(message);
|
||||
Object.assign(error, { codeFrame });
|
||||
return error;
|
||||
}
|
||||
async resolveId(rawId, importer) {
|
||||
return this._otel.$("vitest.mocker.resolve_id", { attributes: {
|
||||
"vitest.module.raw_id": rawId,
|
||||
"vitest.module.importer": rawId
|
||||
} }, async (span) => {
|
||||
const result = await this.options.resolveId(rawId, importer);
|
||||
if (!result) {
|
||||
span.addEvent("could not resolve id, fallback to unresolved values");
|
||||
const id = normalizeModuleId(rawId);
|
||||
span.setAttributes({
|
||||
"vitest.module.id": id,
|
||||
"vitest.module.url": rawId,
|
||||
"vitest.module.external": id,
|
||||
"vitest.module.fallback": true
|
||||
});
|
||||
return {
|
||||
id,
|
||||
url: rawId,
|
||||
external: id
|
||||
};
|
||||
}
|
||||
// external is node_module or unresolved module
|
||||
// for example, some people mock "vscode" and don't have it installed
|
||||
const external = !isAbsolute$1(result.file) || this.isModuleDirectory(result.file) ? normalizeModuleId(rawId) : null;
|
||||
const id = normalizeModuleId(result.id);
|
||||
span.setAttributes({
|
||||
"vitest.module.id": id,
|
||||
"vitest.module.url": result.url,
|
||||
"vitest.module.external": external ?? false
|
||||
});
|
||||
return {
|
||||
...result,
|
||||
id,
|
||||
external
|
||||
};
|
||||
});
|
||||
}
|
||||
async resolveMocks() {
|
||||
if (!VitestMocker.pendingIds.length) return;
|
||||
await Promise.all(VitestMocker.pendingIds.map(async (mock) => {
|
||||
const { id, url, external } = await this.resolveId(mock.id, mock.importer);
|
||||
if (mock.action === "unmock") this.unmockPath(id);
|
||||
if (mock.action === "mock") this.mockPath(mock.id, id, url, external, mock.type, mock.factory);
|
||||
}));
|
||||
VitestMocker.pendingIds = [];
|
||||
}
|
||||
ensureModule(id, url) {
|
||||
const node = this.evaluatedModules.ensureModule(id, url);
|
||||
// TODO
|
||||
node.meta = {
|
||||
id,
|
||||
url,
|
||||
code: "",
|
||||
file: null,
|
||||
invalidate: false
|
||||
};
|
||||
return node;
|
||||
}
|
||||
async callFunctionMock(id, url, mock) {
|
||||
const node = this.ensureModule(id, url);
|
||||
if (node.exports) return node.exports;
|
||||
const exports$1 = await mock.resolve();
|
||||
const moduleExports = new Proxy(exports$1, { get: (target, prop) => {
|
||||
const val = target[prop];
|
||||
// 'then' can exist on non-Promise objects, need nested instanceof check for logic to work
|
||||
if (prop === "then") {
|
||||
if (target instanceof Promise) return target.then.bind(target);
|
||||
} else if (!(prop in target)) {
|
||||
if (this.filterPublicKeys.includes(prop)) return;
|
||||
throw this.createError(`[vitest] No "${String(prop)}" export is defined on the "${mock.raw}" mock. Did you forget to return it from "vi.mock"?
|
||||
If you need to partially mock a module, you can use "importOriginal" helper inside:
|
||||
`, `vi.mock(import("${mock.raw}"), async (importOriginal) => {
|
||||
const actual = await importOriginal()
|
||||
return {
|
||||
...actual,
|
||||
// your mocked methods
|
||||
}
|
||||
})`);
|
||||
}
|
||||
return val;
|
||||
} });
|
||||
node.exports = moduleExports;
|
||||
return moduleExports;
|
||||
}
|
||||
// public method to avoid circular dependency
|
||||
getMockContext() {
|
||||
return this.mockContext;
|
||||
}
|
||||
// path used to store mocked dependencies
|
||||
getMockPath(dep) {
|
||||
return `mock:${dep}`;
|
||||
}
|
||||
getDependencyMock(id) {
|
||||
return this.getMockerRegistry().getById(fixLeadingSlashes(id));
|
||||
}
|
||||
findMockRedirect(mockPath, external) {
|
||||
return findMockRedirect(this.root, mockPath, external);
|
||||
}
|
||||
mockObject(object, mockExports = {}, behavior = "automock") {
|
||||
const createMockInstance = this.spyModule?.createMockInstance;
|
||||
if (!createMockInstance) throw this.createError("[vitest] `spyModule` is not defined. This is a Vitest error. Please open a new issue with reproduction.");
|
||||
return mockObject({
|
||||
globalConstructors: this.primitives,
|
||||
createMockInstance,
|
||||
type: behavior
|
||||
}, object, mockExports);
|
||||
}
|
||||
unmockPath(id) {
|
||||
this.getMockerRegistry().deleteById(id);
|
||||
this.invalidateModuleById(id);
|
||||
}
|
||||
mockPath(originalId, id, url, external, mockType, factory) {
|
||||
const registry = this.getMockerRegistry();
|
||||
if (mockType === "manual") registry.register("manual", originalId, id, url, factory);
|
||||
else if (mockType === "autospy") registry.register("autospy", originalId, id, url);
|
||||
else {
|
||||
const redirect = this.findMockRedirect(id, external);
|
||||
if (redirect) registry.register("redirect", originalId, id, url, redirect);
|
||||
else registry.register("automock", originalId, id, url);
|
||||
}
|
||||
// every time the mock is registered, we remove the previous one from the cache
|
||||
this.invalidateModuleById(id);
|
||||
}
|
||||
async importActual(rawId, importer, callstack) {
|
||||
const { url } = await this.resolveId(rawId, importer);
|
||||
const node = await this.moduleRunner.fetchModule(url, importer);
|
||||
return await this.moduleRunner.cachedRequest(node.url, node, callstack || [importer], void 0, true);
|
||||
}
|
||||
async importMock(rawId, importer) {
|
||||
const { id, url, external } = await this.resolveId(rawId, importer);
|
||||
let mock = this.getDependencyMock(id);
|
||||
if (!mock) {
|
||||
const redirect = this.findMockRedirect(id, external);
|
||||
if (redirect) mock = new RedirectedModule(rawId, id, rawId, redirect);
|
||||
else mock = new AutomockedModule(rawId, id, rawId);
|
||||
}
|
||||
if (mock.type === "automock" || mock.type === "autospy") {
|
||||
const node = await this.moduleRunner.fetchModule(url, importer);
|
||||
const mod = await this.moduleRunner.cachedRequest(url, node, [importer], void 0, true);
|
||||
const Object = this.primitives.Object;
|
||||
return this.mockObject(mod, Object.create(Object.prototype), mock.type);
|
||||
}
|
||||
if (mock.type === "manual") return this.callFunctionMock(id, url, mock);
|
||||
const node = await this.moduleRunner.fetchModule(mock.redirect);
|
||||
return this.moduleRunner.cachedRequest(mock.redirect, node, [importer], void 0, true);
|
||||
}
|
||||
async requestWithMockedModule(url, evaluatedNode, callstack, mock) {
|
||||
return this._otel.$("vitest.mocker.evaluate", async (span) => {
|
||||
const mockId = this.getMockPath(evaluatedNode.id);
|
||||
span.setAttributes({
|
||||
"vitest.module.id": mockId,
|
||||
"vitest.mock.type": mock.type,
|
||||
"vitest.mock.id": mock.id,
|
||||
"vitest.mock.url": mock.url,
|
||||
"vitest.mock.raw": mock.raw
|
||||
});
|
||||
if (mock.type === "automock" || mock.type === "autospy") {
|
||||
const cache = this.evaluatedModules.getModuleById(mockId);
|
||||
if (cache && cache.mockedExports) return cache.mockedExports;
|
||||
const Object = this.primitives.Object;
|
||||
// we have to define a separate object that will copy all properties into itself
|
||||
// and can't just use the same `exports` define automatically by Vite before the evaluator
|
||||
const exports$1 = Object.create(null);
|
||||
Object.defineProperty(exports$1, Symbol.toStringTag, {
|
||||
value: "Module",
|
||||
configurable: true,
|
||||
writable: true
|
||||
});
|
||||
const node = this.ensureModule(mockId, this.getMockPath(evaluatedNode.url));
|
||||
node.meta = evaluatedNode.meta;
|
||||
node.file = evaluatedNode.file;
|
||||
node.mockedExports = exports$1;
|
||||
const mod = await this.moduleRunner.cachedRequest(url, node, callstack, void 0, true);
|
||||
this.mockObject(mod, exports$1, mock.type);
|
||||
return exports$1;
|
||||
}
|
||||
if (mock.type === "manual" && !callstack.includes(mockId) && !callstack.includes(url)) try {
|
||||
callstack.push(mockId);
|
||||
// this will not work if user does Promise.all(import(), import())
|
||||
// we can also use AsyncLocalStorage to store callstack, but this won't work in the browser
|
||||
// maybe we should improve mock API in the future?
|
||||
this.mockContext.callstack = callstack;
|
||||
return await this.callFunctionMock(mockId, this.getMockPath(url), mock);
|
||||
} finally {
|
||||
this.mockContext.callstack = null;
|
||||
const indexMock = callstack.indexOf(mockId);
|
||||
callstack.splice(indexMock, 1);
|
||||
}
|
||||
else if (mock.type === "redirect" && !callstack.includes(mock.redirect)) {
|
||||
span.setAttribute("vitest.mock.redirect", mock.redirect);
|
||||
return mock.redirect;
|
||||
}
|
||||
});
|
||||
}
|
||||
async mockedRequest(url, evaluatedNode, callstack) {
|
||||
const mock = this.getDependencyMock(evaluatedNode.id);
|
||||
if (!mock) return;
|
||||
return this.requestWithMockedModule(url, evaluatedNode, callstack, mock);
|
||||
}
|
||||
queueMock(id, importer, factoryOrOptions) {
|
||||
const mockType = getMockType(factoryOrOptions);
|
||||
VitestMocker.pendingIds.push({
|
||||
action: "mock",
|
||||
id,
|
||||
importer,
|
||||
factory: typeof factoryOrOptions === "function" ? factoryOrOptions : void 0,
|
||||
type: mockType
|
||||
});
|
||||
}
|
||||
queueUnmock(id, importer) {
|
||||
VitestMocker.pendingIds.push({
|
||||
action: "unmock",
|
||||
id,
|
||||
importer
|
||||
});
|
||||
}
|
||||
}
|
||||
function getMockType(factoryOrOptions) {
|
||||
if (!factoryOrOptions) return "automock";
|
||||
if (typeof factoryOrOptions === "function") return "manual";
|
||||
return factoryOrOptions.spy ? "autospy" : "automock";
|
||||
}
|
||||
// unique id that is not available as "$bare_import" like "test"
|
||||
// https://nodejs.org/api/modules.html#built-in-modules-with-mandatory-node-prefix
|
||||
const prefixedBuiltins = new Set([
|
||||
"node:sea",
|
||||
"node:sqlite",
|
||||
"node:test",
|
||||
"node:test/reporters"
|
||||
]);
|
||||
const isWindows$1 = process.platform === "win32";
|
||||
// transform file url to id
|
||||
// virtual:custom -> virtual:custom
|
||||
// \0custom -> \0custom
|
||||
// /root/id -> /id
|
||||
// /root/id.js -> /id.js
|
||||
// C:/root/id.js -> /id.js
|
||||
// C:\root\id.js -> /id.js
|
||||
// TODO: expose this in vite/module-runner
|
||||
function normalizeModuleId(file) {
|
||||
if (prefixedBuiltins.has(file)) return file;
|
||||
// if it's not in the root, keep it as a path, not a URL
|
||||
return slash(file).replace(/^\/@fs\//, isWindows$1 ? "" : "/").replace(/^node:/, "").replace(/^\/+/, "/").replace(/^file:\//, "/");
|
||||
}
|
||||
const windowsSlashRE = /\\/g;
|
||||
function slash(p) {
|
||||
return p.replace(windowsSlashRE, "/");
|
||||
}
|
||||
const multipleSlashRe = /^\/+/;
|
||||
// module-runner incorrectly replaces file:///path with `///path`
|
||||
function fixLeadingSlashes(id) {
|
||||
if (id.startsWith("//")) return id.replace(multipleSlashRe, "/");
|
||||
return id;
|
||||
}
|
||||
|
||||
const createNodeImportMeta = (modulePath) => {
|
||||
if (!viteModuleRunner.createDefaultImportMeta) throw new Error(`createNodeImportMeta is not supported in this version of Vite.`);
|
||||
const defaultMeta = viteModuleRunner.createDefaultImportMeta(modulePath);
|
||||
const href = defaultMeta.url;
|
||||
const importMetaResolver = createImportMetaResolver();
|
||||
return {
|
||||
...defaultMeta,
|
||||
main: false,
|
||||
resolve(id, parent) {
|
||||
return (importMetaResolver ?? defaultMeta.resolve)(id, parent ?? href);
|
||||
}
|
||||
};
|
||||
};
|
||||
function createImportMetaResolver() {
|
||||
if (!import.meta.resolve) return;
|
||||
return (specifier, importer) => import.meta.resolve(specifier, importer);
|
||||
}
|
||||
// @ts-expect-error overriding private method
|
||||
class VitestModuleRunner extends viteModuleRunner.ModuleRunner {
|
||||
mocker;
|
||||
moduleExecutionInfo;
|
||||
_otel;
|
||||
constructor(vitestOptions) {
|
||||
const options = vitestOptions;
|
||||
const transport = new VitestTransport(options.transport);
|
||||
const evaluatedModules = options.evaluatedModules;
|
||||
super({
|
||||
transport,
|
||||
hmr: false,
|
||||
evaluatedModules,
|
||||
sourcemapInterceptor: "prepareStackTrace",
|
||||
createImportMeta: vitestOptions.createImportMeta
|
||||
}, options.evaluator);
|
||||
this.vitestOptions = vitestOptions;
|
||||
this._otel = vitestOptions.traces || new Traces({ enabled: false });
|
||||
this.moduleExecutionInfo = options.getWorkerState().moduleExecutionInfo;
|
||||
this.mocker = options.mocker || new VitestMocker(this, {
|
||||
spyModule: options.spyModule,
|
||||
context: options.vm?.context,
|
||||
traces: this._otel,
|
||||
resolveId: options.transport.resolveId,
|
||||
get root() {
|
||||
return options.getWorkerState().config.root;
|
||||
},
|
||||
get moduleDirectories() {
|
||||
return options.getWorkerState().config.deps.moduleDirectories || [];
|
||||
},
|
||||
getCurrentTestFilepath() {
|
||||
return options.getWorkerState().filepath;
|
||||
}
|
||||
});
|
||||
if (options.vm) options.vm.context.__vitest_mocker__ = this.mocker;
|
||||
else Object.defineProperty(globalThis, "__vitest_mocker__", {
|
||||
configurable: true,
|
||||
writable: true,
|
||||
value: this.mocker
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Vite checks that the module has exports emulating the Node.js behaviour,
|
||||
* but Vitest is more relaxed.
|
||||
*
|
||||
* We should keep the Vite behavour when there is a `strict` flag.
|
||||
* @internal
|
||||
*/
|
||||
processImport(exports$1) {
|
||||
return exports$1;
|
||||
}
|
||||
async import(rawId) {
|
||||
const resolved = await this._otel.$("vitest.module.resolve_id", { attributes: { "vitest.module.raw_id": rawId } }, async (span) => {
|
||||
const result = await this.vitestOptions.transport.resolveId(rawId);
|
||||
if (result) span.setAttributes({
|
||||
"vitest.module.url": result.url,
|
||||
"vitest.module.file": result.file,
|
||||
"vitest.module.id": result.id
|
||||
});
|
||||
return result;
|
||||
});
|
||||
return super.import(resolved ? resolved.url : rawId);
|
||||
}
|
||||
async fetchModule(url, importer) {
|
||||
return await this.cachedModule(url, importer);
|
||||
}
|
||||
_cachedRequest(url, module, callstack = [], metadata) {
|
||||
// @ts-expect-error "cachedRequest" is private
|
||||
return super.cachedRequest(url, module, callstack, metadata);
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
async cachedRequest(url, mod, callstack = [], metadata, ignoreMock = false) {
|
||||
if (ignoreMock) return this._cachedRequest(url, mod, callstack, metadata);
|
||||
let mocked;
|
||||
if (mod.meta && "mockedModule" in mod.meta) mocked = await this.mocker.requestWithMockedModule(url, mod, callstack, mod.meta.mockedModule);
|
||||
else mocked = await this.mocker.mockedRequest(url, mod, callstack);
|
||||
if (typeof mocked === "string") {
|
||||
const node = await this.fetchModule(mocked);
|
||||
return this._cachedRequest(mocked, node, callstack, metadata);
|
||||
}
|
||||
if (mocked != null && typeof mocked === "object") return mocked;
|
||||
return this._cachedRequest(url, mod, callstack, metadata);
|
||||
}
|
||||
/** @internal */
|
||||
_invalidateSubTreeById(ids, invalidated = /* @__PURE__ */ new Set()) {
|
||||
for (const id of ids) {
|
||||
if (invalidated.has(id)) continue;
|
||||
const node = this.evaluatedModules.getModuleById(id);
|
||||
if (!node) continue;
|
||||
invalidated.add(id);
|
||||
const subIds = Array.from(this.evaluatedModules.idToModuleMap).filter(([, mod]) => mod.importers.has(id)).map(([key]) => key);
|
||||
if (subIds.length) this._invalidateSubTreeById(subIds, invalidated);
|
||||
this.evaluatedModules.invalidateModule(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const bareVitestRegexp = /^@?vitest(?:\/|$)/;
|
||||
const normalizedDistDir = normalize$1(distDir);
|
||||
const relativeIds = {};
|
||||
const externalizeMap = /* @__PURE__ */ new Map();
|
||||
// all Vitest imports always need to be externalized
|
||||
function getCachedVitestImport(id, state) {
|
||||
if (id.startsWith("/@fs/") || id.startsWith("\\@fs\\")) id = id.slice(process.platform === "win32" ? 5 : 4);
|
||||
if (externalizeMap.has(id)) return {
|
||||
externalize: externalizeMap.get(id),
|
||||
type: "module"
|
||||
};
|
||||
// always externalize Vitest because we import from there before running tests
|
||||
// so we already have it cached by Node.js
|
||||
const root = state().config.root;
|
||||
const relativeRoot = relativeIds[root] ?? (relativeIds[root] = normalizedDistDir.slice(root.length));
|
||||
if (id.includes(distDir) || id.includes(normalizedDistDir)) {
|
||||
const externalize = id.startsWith("file://") ? id : pathToFileURL(id).toString();
|
||||
externalizeMap.set(id, externalize);
|
||||
return {
|
||||
externalize,
|
||||
type: "module"
|
||||
};
|
||||
}
|
||||
if (relativeRoot && relativeRoot !== "/" && id.startsWith(relativeRoot)) {
|
||||
const externalize = pathToFileURL(join$1(root, id)).toString();
|
||||
externalizeMap.set(id, externalize);
|
||||
return {
|
||||
externalize,
|
||||
type: "module"
|
||||
};
|
||||
}
|
||||
if (bareVitestRegexp.test(id)) {
|
||||
externalizeMap.set(id, id);
|
||||
return {
|
||||
externalize: id,
|
||||
type: "module"
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Store globals in case tests overwrite them
|
||||
const processListeners = process.listeners.bind(process);
|
||||
const processOn = process.on.bind(process);
|
||||
const processOff = process.off.bind(process);
|
||||
const dispose = [];
|
||||
function listenForErrors(state) {
|
||||
dispose.forEach((fn) => fn());
|
||||
dispose.length = 0;
|
||||
function catchError(err, type, event) {
|
||||
const worker = state();
|
||||
// if there is another listener, assume that it's handled by user code
|
||||
// one is Vitest's own listener
|
||||
if (processListeners(event).length > 1) return;
|
||||
const error = serializeValue(err);
|
||||
if (typeof error === "object" && error != null) {
|
||||
error.VITEST_TEST_NAME = worker.current?.type === "test" ? worker.current.name : void 0;
|
||||
if (worker.filepath) error.VITEST_TEST_PATH = worker.filepath;
|
||||
}
|
||||
state().rpc.onUnhandledError(error, type);
|
||||
}
|
||||
const uncaughtException = (e) => catchError(e, "Uncaught Exception", "uncaughtException");
|
||||
const unhandledRejection = (e) => catchError(e, "Unhandled Rejection", "unhandledRejection");
|
||||
processOn("uncaughtException", uncaughtException);
|
||||
processOn("unhandledRejection", unhandledRejection);
|
||||
dispose.push(() => {
|
||||
processOff("uncaughtException", uncaughtException);
|
||||
processOff("unhandledRejection", unhandledRejection);
|
||||
});
|
||||
}
|
||||
|
||||
const { readFileSync } = fs;
|
||||
const VITEST_VM_CONTEXT_SYMBOL = "__vitest_vm_context__";
|
||||
const cwd = process.cwd();
|
||||
const isWindows = process.platform === "win32";
|
||||
function startVitestModuleRunner(options) {
|
||||
const traces = options.traces;
|
||||
const state = () => globalThis.__vitest_worker__ || options.state;
|
||||
const rpc = () => state().rpc;
|
||||
process.exit = (code = process.exitCode || 0) => {
|
||||
throw new Error(`process.exit unexpectedly called with "${code}"`);
|
||||
};
|
||||
listenForErrors(state);
|
||||
const environment = () => {
|
||||
const environment = state().environment;
|
||||
return environment.viteEnvironment || environment.name;
|
||||
};
|
||||
const vm = options.context && options.externalModulesExecutor ? {
|
||||
context: options.context,
|
||||
externalModulesExecutor: options.externalModulesExecutor
|
||||
} : void 0;
|
||||
const evaluator = options.evaluator || new VitestModuleEvaluator(vm, {
|
||||
traces,
|
||||
evaluatedModules: options.evaluatedModules,
|
||||
get moduleExecutionInfo() {
|
||||
return state().moduleExecutionInfo;
|
||||
},
|
||||
get interopDefault() {
|
||||
return state().config.deps.interopDefault;
|
||||
},
|
||||
getCurrentTestFilepath: () => state().filepath
|
||||
});
|
||||
const moduleRunner = new VitestModuleRunner({
|
||||
spyModule: options.spyModule,
|
||||
evaluatedModules: options.evaluatedModules,
|
||||
evaluator,
|
||||
traces,
|
||||
mocker: options.mocker,
|
||||
transport: {
|
||||
async fetchModule(id, importer, options) {
|
||||
const resolvingModules = state().resolvingModules;
|
||||
if (isWindows) {
|
||||
if (id[1] === ":") {
|
||||
// The drive letter is different for whatever reason, we need to normalize it to CWD
|
||||
if (id[0] !== cwd[0] && id[0].toUpperCase() === cwd[0].toUpperCase()) id = (cwd[0].toUpperCase() === cwd[0] ? id[0].toUpperCase() : id[0].toLowerCase()) + id.slice(1);
|
||||
// always mark absolute windows paths, otherwise Vite will externalize it
|
||||
id = `/@id/${id}`;
|
||||
}
|
||||
}
|
||||
const vitest = getCachedVitestImport(id, state);
|
||||
if (vitest) return vitest;
|
||||
const rawId = unwrapId(id);
|
||||
resolvingModules.add(rawId);
|
||||
try {
|
||||
if (VitestMocker.pendingIds.length) await moduleRunner.mocker.resolveMocks();
|
||||
const resolvedMock = moduleRunner.mocker.getDependencyMock(rawId);
|
||||
if (resolvedMock?.type === "manual" || resolvedMock?.type === "redirect") return {
|
||||
code: "",
|
||||
file: null,
|
||||
id,
|
||||
url: id,
|
||||
invalidate: false,
|
||||
mockedModule: resolvedMock
|
||||
};
|
||||
if (isBuiltin(rawId)) return {
|
||||
externalize: rawId,
|
||||
type: "builtin"
|
||||
};
|
||||
if (isBrowserExternal(rawId)) return {
|
||||
externalize: toBuiltin(rawId),
|
||||
type: "builtin"
|
||||
};
|
||||
// if module is invalidated, the worker will be recreated,
|
||||
// so cached is always true in a single worker
|
||||
if (options?.cached) return { cache: true };
|
||||
const otelCarrier = traces?.getContextCarrier();
|
||||
const result = await rpc().fetch(id, importer, environment(), options, otelCarrier);
|
||||
if ("cached" in result) return {
|
||||
code: readFileSync(result.tmp, "utf-8"),
|
||||
...result
|
||||
};
|
||||
return result;
|
||||
} catch (cause) {
|
||||
// rethrow vite error if it cannot load the module because it's not resolved
|
||||
if (typeof cause === "object" && cause != null && cause.code === "ERR_LOAD_URL" || typeof cause?.message === "string" && cause.message.includes("Failed to load url") || typeof cause?.message === "string" && cause.message.startsWith("Cannot find module '")) {
|
||||
const error = new Error(`Cannot find ${isBareImport(id) ? "package" : "module"} '${id}'${importer ? ` imported from '${importer}'` : ""}`, { cause });
|
||||
error.code = "ERR_MODULE_NOT_FOUND";
|
||||
throw error;
|
||||
}
|
||||
throw cause;
|
||||
} finally {
|
||||
resolvingModules.delete(rawId);
|
||||
}
|
||||
},
|
||||
resolveId(id, importer) {
|
||||
return rpc().resolve(id, importer, environment());
|
||||
}
|
||||
},
|
||||
getWorkerState: state,
|
||||
vm,
|
||||
createImportMeta: options.createImportMeta
|
||||
});
|
||||
return moduleRunner;
|
||||
}
|
||||
|
||||
export { VitestModuleRunner as V, VITEST_VM_CONTEXT_SYMBOL as a, VitestTransport as b, createNodeImportMeta as c, startVitestModuleRunner as s };
|
||||
10
node_modules/vitest/dist/chunks/suite.d.BJWk38HB.d.ts
generated
vendored
Normal file
10
node_modules/vitest/dist/chunks/suite.d.BJWk38HB.d.ts
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Test } from '@vitest/runner';
|
||||
import { c as BenchmarkAPI, a as BenchFunction } from './benchmark.d.DAaHLpsq.js';
|
||||
import { Options } from 'tinybench';
|
||||
import '@vitest/runner/utils';
|
||||
|
||||
declare function getBenchOptions(key: Test): Options;
|
||||
declare function getBenchFn(key: Test): BenchFunction;
|
||||
declare const bench: BenchmarkAPI;
|
||||
|
||||
export { getBenchOptions as a, bench as b, getBenchFn as g };
|
||||
254
node_modules/vitest/dist/chunks/test.BT8LKgU9.js
generated
vendored
Normal file
254
node_modules/vitest/dist/chunks/test.BT8LKgU9.js
generated
vendored
Normal file
@@ -0,0 +1,254 @@
|
||||
import { updateTask } from '@vitest/runner';
|
||||
import { createDefer } from '@vitest/utils/helpers';
|
||||
import { getSafeTimers } from '@vitest/utils/timers';
|
||||
import { a as getBenchOptions, g as getBenchFn } from './benchmark.B3N2zMcH.js';
|
||||
import { g as getWorkerState } from './utils.DvEY5TfP.js';
|
||||
import { setState, GLOBAL_EXPECT, getState } from '@vitest/expect';
|
||||
import { getTests, getNames, getTestName } from '@vitest/runner/utils';
|
||||
import { processError } from '@vitest/utils/error';
|
||||
import { normalize } from 'pathe';
|
||||
import { a as getSnapshotClient, i as inject, c as createExpect, v as vi } from './vi.2VT5v0um.js';
|
||||
import { r as rpc } from './rpc.BytlcPfC.js';
|
||||
|
||||
function createBenchmarkResult(name) {
|
||||
return {
|
||||
name,
|
||||
rank: 0,
|
||||
rme: 0,
|
||||
samples: []
|
||||
};
|
||||
}
|
||||
const benchmarkTasks = /* @__PURE__ */ new WeakMap();
|
||||
async function runBenchmarkSuite(suite, runner) {
|
||||
const { Task, Bench } = await runner.importTinybench();
|
||||
const start = performance.now();
|
||||
const benchmarkGroup = [];
|
||||
const benchmarkSuiteGroup = [];
|
||||
for (const task of suite.tasks) {
|
||||
if (task.mode !== "run" && task.mode !== "queued") continue;
|
||||
if (task.meta?.benchmark) benchmarkGroup.push(task);
|
||||
else if (task.type === "suite") benchmarkSuiteGroup.push(task);
|
||||
}
|
||||
// run sub suites sequentially
|
||||
for (const subSuite of benchmarkSuiteGroup) await runBenchmarkSuite(subSuite, runner);
|
||||
if (benchmarkGroup.length) {
|
||||
const defer = createDefer();
|
||||
suite.result = {
|
||||
state: "run",
|
||||
startTime: start,
|
||||
benchmark: createBenchmarkResult(suite.name)
|
||||
};
|
||||
updateTask$1("suite-prepare", suite);
|
||||
const addBenchTaskListener = (task, benchmark) => {
|
||||
task.addEventListener("complete", (e) => {
|
||||
const taskRes = e.task.result;
|
||||
const result = benchmark.result.benchmark;
|
||||
benchmark.result.state = "pass";
|
||||
Object.assign(result, taskRes);
|
||||
// compute extra stats and free raw samples as early as possible
|
||||
const samples = result.samples;
|
||||
result.sampleCount = samples.length;
|
||||
result.median = samples.length % 2 ? samples[Math.floor(samples.length / 2)] : (samples[samples.length / 2] + samples[samples.length / 2 - 1]) / 2;
|
||||
if (!runner.config.benchmark?.includeSamples) result.samples.length = 0;
|
||||
updateTask$1("test-finished", benchmark);
|
||||
}, { once: true });
|
||||
task.addEventListener("error", (e) => {
|
||||
const task = e.task;
|
||||
defer.reject(benchmark ? task.result.error : e);
|
||||
}, { once: true });
|
||||
};
|
||||
benchmarkGroup.forEach((benchmark) => {
|
||||
const benchmarkInstance = new Bench(getBenchOptions(benchmark));
|
||||
const benchmarkFn = getBenchFn(benchmark);
|
||||
benchmark.result = {
|
||||
state: "run",
|
||||
startTime: start,
|
||||
benchmark: createBenchmarkResult(benchmark.name)
|
||||
};
|
||||
const task = new Task(benchmarkInstance, benchmark.name, benchmarkFn);
|
||||
benchmarkTasks.set(benchmark, task);
|
||||
addBenchTaskListener(task, benchmark);
|
||||
});
|
||||
const { setTimeout } = getSafeTimers();
|
||||
const tasks = [];
|
||||
for (const benchmark of benchmarkGroup) {
|
||||
const task = benchmarkTasks.get(benchmark);
|
||||
updateTask$1("test-prepare", benchmark);
|
||||
await task.warmup();
|
||||
tasks.push([await new Promise((resolve) => setTimeout(async () => {
|
||||
resolve(await task.run());
|
||||
})), benchmark]);
|
||||
}
|
||||
suite.result.duration = performance.now() - start;
|
||||
suite.result.state = "pass";
|
||||
updateTask$1("suite-finished", suite);
|
||||
defer.resolve(null);
|
||||
await defer;
|
||||
}
|
||||
function updateTask$1(event, task) {
|
||||
updateTask(event, task, runner);
|
||||
}
|
||||
}
|
||||
class NodeBenchmarkRunner {
|
||||
moduleRunner;
|
||||
constructor(config) {
|
||||
this.config = config;
|
||||
}
|
||||
async importTinybench() {
|
||||
return await import('tinybench');
|
||||
}
|
||||
importFile(filepath, source) {
|
||||
if (source === "setup") {
|
||||
const moduleNode = getWorkerState().evaluatedModules.getModuleById(filepath);
|
||||
if (moduleNode) getWorkerState().evaluatedModules.invalidateModule(moduleNode);
|
||||
}
|
||||
return this.moduleRunner.import(filepath);
|
||||
}
|
||||
async runSuite(suite) {
|
||||
await runBenchmarkSuite(suite, this);
|
||||
}
|
||||
async runTask() {
|
||||
throw new Error("`test()` and `it()` is only available in test mode.");
|
||||
}
|
||||
}
|
||||
|
||||
// worker context is shared between all tests
|
||||
const workerContext = Object.create(null);
|
||||
class VitestTestRunner {
|
||||
snapshotClient = getSnapshotClient();
|
||||
workerState = getWorkerState();
|
||||
moduleRunner;
|
||||
cancelRun = false;
|
||||
assertionsErrors = /* @__PURE__ */ new WeakMap();
|
||||
pool = this.workerState.ctx.pool;
|
||||
_otel;
|
||||
viteEnvironment;
|
||||
constructor(config) {
|
||||
this.config = config;
|
||||
const environment = this.workerState.environment;
|
||||
this.viteEnvironment = environment.viteEnvironment || environment.name;
|
||||
}
|
||||
importFile(filepath, source) {
|
||||
if (source === "setup") {
|
||||
const moduleNode = this.workerState.evaluatedModules.getModuleById(filepath);
|
||||
if (moduleNode) this.workerState.evaluatedModules.invalidateModule(moduleNode);
|
||||
}
|
||||
return this._otel.$(`vitest.module.import_${source === "setup" ? "setup" : "spec"}`, { attributes: { "code.file.path": filepath } }, () => this.moduleRunner.import(filepath));
|
||||
}
|
||||
onCollectStart(file) {
|
||||
this.workerState.current = file;
|
||||
}
|
||||
onCleanupWorkerContext(listener) {
|
||||
this.workerState.onCleanup(listener);
|
||||
}
|
||||
onAfterRunFiles() {
|
||||
this.snapshotClient.clear();
|
||||
this.workerState.current = void 0;
|
||||
}
|
||||
getWorkerContext() {
|
||||
return workerContext;
|
||||
}
|
||||
async onAfterRunSuite(suite) {
|
||||
if (this.config.logHeapUsage && typeof process !== "undefined") suite.result.heap = process.memoryUsage().heapUsed;
|
||||
if (suite.mode !== "skip" && "filepath" in suite) {
|
||||
// mark snapshots in skipped tests as not obsolete
|
||||
for (const test of getTests(suite)) if (test.mode === "skip") {
|
||||
const name = getNames(test).slice(1).join(" > ");
|
||||
this.snapshotClient.skipTest(suite.file.filepath, name);
|
||||
}
|
||||
const result = await this.snapshotClient.finish(suite.file.filepath);
|
||||
if (this.workerState.config.snapshotOptions.updateSnapshot === "none" && result.unchecked) {
|
||||
let message = `Obsolete snapshots found when no snapshot update is expected.\n`;
|
||||
for (const key of result.uncheckedKeys) message += `· ${key}\n`;
|
||||
suite.result.errors ??= [];
|
||||
suite.result.errors.push(processError(new Error(message)));
|
||||
suite.result.state = "fail";
|
||||
}
|
||||
await rpc().snapshotSaved(result);
|
||||
}
|
||||
this.workerState.current = suite.suite || suite.file;
|
||||
}
|
||||
onAfterRunTask(test) {
|
||||
if (this.config.logHeapUsage && typeof process !== "undefined") test.result.heap = process.memoryUsage().heapUsed;
|
||||
this.workerState.current = test.suite || test.file;
|
||||
}
|
||||
cancel(_reason) {
|
||||
this.cancelRun = true;
|
||||
}
|
||||
injectValue(key) {
|
||||
// inject has a very limiting type controlled by ProvidedContext
|
||||
// some tests override it which causes the build to fail
|
||||
return inject(key);
|
||||
}
|
||||
async onBeforeRunTask(test) {
|
||||
if (this.cancelRun) test.mode = "skip";
|
||||
if (test.mode !== "run" && test.mode !== "queued") return;
|
||||
this.workerState.current = test;
|
||||
}
|
||||
async onBeforeRunSuite(suite) {
|
||||
if (this.cancelRun) suite.mode = "skip";
|
||||
// initialize snapshot state before running file suite
|
||||
if (suite.mode !== "skip" && "filepath" in suite) await this.snapshotClient.setup(suite.file.filepath, this.workerState.config.snapshotOptions);
|
||||
this.workerState.current = suite;
|
||||
}
|
||||
onBeforeTryTask(test) {
|
||||
clearModuleMocks(this.config);
|
||||
this.snapshotClient.clearTest(test.file.filepath, test.id);
|
||||
setState({
|
||||
assertionCalls: 0,
|
||||
isExpectingAssertions: false,
|
||||
isExpectingAssertionsError: null,
|
||||
expectedAssertionsNumber: null,
|
||||
expectedAssertionsNumberErrorGen: null,
|
||||
currentTestName: getTestName(test),
|
||||
snapshotState: this.snapshotClient.getSnapshotState(test.file.filepath)
|
||||
}, globalThis[GLOBAL_EXPECT]);
|
||||
}
|
||||
onAfterTryTask(test) {
|
||||
const { assertionCalls, expectedAssertionsNumber, expectedAssertionsNumberErrorGen, isExpectingAssertions, isExpectingAssertionsError } = test.context._local ? test.context.expect.getState() : getState(globalThis[GLOBAL_EXPECT]);
|
||||
if (expectedAssertionsNumber !== null && assertionCalls !== expectedAssertionsNumber) throw expectedAssertionsNumberErrorGen();
|
||||
if (isExpectingAssertions === true && assertionCalls === 0) throw isExpectingAssertionsError;
|
||||
if (this.config.expect.requireAssertions && assertionCalls === 0) throw this.assertionsErrors.get(test);
|
||||
}
|
||||
extendTaskContext(context) {
|
||||
// create error during the test initialization so we have a nice stack trace
|
||||
if (this.config.expect.requireAssertions) this.assertionsErrors.set(context.task, /* @__PURE__ */ new Error("expected any number of assertion, but got none"));
|
||||
let _expect;
|
||||
Object.defineProperty(context, "expect", { get() {
|
||||
if (!_expect) _expect = createExpect(context.task);
|
||||
return _expect;
|
||||
} });
|
||||
Object.defineProperty(context, "_local", { get() {
|
||||
return _expect != null;
|
||||
} });
|
||||
return context;
|
||||
}
|
||||
getImportDurations() {
|
||||
const importDurations = {};
|
||||
const entries = this.workerState.moduleExecutionInfo?.entries() || [];
|
||||
for (const [filepath, { duration, selfTime, external, importer }] of entries) importDurations[normalize(filepath)] = {
|
||||
selfTime,
|
||||
totalTime: duration,
|
||||
external,
|
||||
importer
|
||||
};
|
||||
return importDurations;
|
||||
}
|
||||
trace = (name, attributes, cb) => {
|
||||
const options = typeof attributes === "object" ? { attributes } : {};
|
||||
return this._otel.$(`vitest.test.runner.${name}`, options, cb || attributes);
|
||||
};
|
||||
__setTraces(traces) {
|
||||
this._otel = traces;
|
||||
}
|
||||
}
|
||||
function clearModuleMocks(config) {
|
||||
const { clearMocks, mockReset, restoreMocks, unstubEnvs, unstubGlobals } = config;
|
||||
if (restoreMocks) vi.restoreAllMocks();
|
||||
if (mockReset) vi.resetAllMocks();
|
||||
if (clearMocks) vi.clearAllMocks();
|
||||
if (unstubEnvs) vi.unstubAllEnvs();
|
||||
if (unstubGlobals) vi.unstubAllGlobals();
|
||||
}
|
||||
|
||||
export { NodeBenchmarkRunner as N, VitestTestRunner as V };
|
||||
172
node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js
generated
vendored
Normal file
172
node_modules/vitest/dist/chunks/traces.U4xDYhzZ.js
generated
vendored
Normal file
@@ -0,0 +1,172 @@
|
||||
class Traces {
|
||||
/**
|
||||
* otel stands for OpenTelemetry
|
||||
*/
|
||||
#otel = null;
|
||||
#sdk = null;
|
||||
#init = null;
|
||||
#noopSpan = createNoopSpan();
|
||||
#noopContext = createNoopContext();
|
||||
constructor(options) {
|
||||
if (options.enabled) {
|
||||
const apiInit = import('@opentelemetry/api').then((api) => {
|
||||
this.#otel = {
|
||||
tracer: api.trace.getTracer(options.tracerName || "vitest"),
|
||||
context: api.context,
|
||||
propagation: api.propagation,
|
||||
trace: api.trace,
|
||||
SpanKind: api.SpanKind,
|
||||
SpanStatusCode: api.SpanStatusCode
|
||||
};
|
||||
}).catch(() => {
|
||||
throw new Error(`"@opentelemetry/api" is not installed locally. Make sure you have setup OpenTelemetry instrumentation: https://vitest.dev/guide/open-telemetry`);
|
||||
});
|
||||
const sdkInit = (options.sdkPath ? import(options.sdkPath) : Promise.resolve()).catch((cause) => {
|
||||
throw new Error(`Failed to import custom OpenTelemetry SDK script (${options.sdkPath}): ${cause.message}`);
|
||||
});
|
||||
this.#init = Promise.all([sdkInit, apiInit]).then(([sdk]) => {
|
||||
if (sdk != null) {
|
||||
if (sdk.default != null && typeof sdk.default === "object" && typeof sdk.default.shutdown === "function") this.#sdk = sdk.default;
|
||||
else if (options.watchMode !== true && process.env.VITEST_MODE !== "watch") console.warn(`OpenTelemetry instrumentation module (${options.sdkPath}) does not have a default export with a "shutdown" method. Vitest won't be able to ensure that all traces are processed in time. Try running Vitest in watch mode instead.`);
|
||||
}
|
||||
}).finally(() => {
|
||||
this.#init = null;
|
||||
});
|
||||
}
|
||||
}
|
||||
isEnabled() {
|
||||
return !!this.#otel;
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
async waitInit() {
|
||||
if (this.#init) await this.#init;
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
startContextSpan(name, currentContext) {
|
||||
if (!this.#otel) return {
|
||||
span: this.#noopSpan,
|
||||
context: this.#noopContext
|
||||
};
|
||||
const activeContext = currentContext || this.#otel.context.active();
|
||||
const span = this.#otel.tracer.startSpan(name, {}, activeContext);
|
||||
return {
|
||||
span,
|
||||
context: this.#otel.trace.setSpan(activeContext, span)
|
||||
};
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
getContextFromCarrier(carrier) {
|
||||
if (!this.#otel) return this.#noopContext;
|
||||
const activeContext = this.#otel.context.active();
|
||||
if (!carrier) return activeContext;
|
||||
return this.#otel.propagation.extract(activeContext, carrier);
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
getContextCarrier(context) {
|
||||
if (!this.#otel) return;
|
||||
const carrier = {};
|
||||
this.#otel.propagation.inject(context || this.#otel.context.active(), carrier);
|
||||
return carrier;
|
||||
}
|
||||
#callActiveSpan(span, callback) {
|
||||
const otel = this.#otel;
|
||||
let result;
|
||||
try {
|
||||
result = callback(span);
|
||||
if (result instanceof Promise) return result.catch((error) => {
|
||||
span.recordException({
|
||||
name: error.name,
|
||||
message: error.message,
|
||||
stack: error.stack
|
||||
});
|
||||
span.setStatus({ code: otel.SpanStatusCode.ERROR });
|
||||
throw error;
|
||||
}).finally(() => span.end());
|
||||
return result;
|
||||
} catch (error) {
|
||||
if (error instanceof Error) {
|
||||
span.recordException({
|
||||
name: error.name,
|
||||
message: error.message,
|
||||
stack: error.stack
|
||||
});
|
||||
span.setStatus({ code: otel.SpanStatusCode.ERROR });
|
||||
}
|
||||
throw error;
|
||||
} finally {
|
||||
// end sync callbcak
|
||||
if (!(result instanceof Promise)) span.end();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
$(name, optionsOrFn, fn) {
|
||||
const callback = typeof optionsOrFn === "function" ? optionsOrFn : fn;
|
||||
if (!this.#otel) return callback(this.#noopSpan);
|
||||
const otel = this.#otel;
|
||||
const options = typeof optionsOrFn === "function" ? {} : optionsOrFn;
|
||||
const context = options.context;
|
||||
if (context) return otel.tracer.startActiveSpan(name, options, context, (span) => this.#callActiveSpan(span, callback));
|
||||
return otel.tracer.startActiveSpan(name, options, (span) => this.#callActiveSpan(span, callback));
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
startSpan(name, options, context) {
|
||||
if (!this.#otel) return this.#noopSpan;
|
||||
const { tracer } = this.#otel;
|
||||
return tracer.startSpan(name, options, context);
|
||||
}
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
async finish() {
|
||||
await this.#sdk?.shutdown();
|
||||
}
|
||||
}
|
||||
function noopSpan() {
|
||||
return this;
|
||||
}
|
||||
function createNoopSpan() {
|
||||
return {
|
||||
setAttribute: noopSpan,
|
||||
setStatus: noopSpan,
|
||||
addEvent: noopSpan,
|
||||
addLink: noopSpan,
|
||||
addLinks: noopSpan,
|
||||
setAttributes: noopSpan,
|
||||
updateName: noopSpan,
|
||||
end: () => {},
|
||||
isRecording: () => false,
|
||||
recordException: noopSpan,
|
||||
spanContext() {
|
||||
return {
|
||||
spanId: "",
|
||||
traceFlags: 0,
|
||||
traceId: ""
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
function noopContext() {
|
||||
return this;
|
||||
}
|
||||
function createNoopContext() {
|
||||
return {
|
||||
getValue: noopContext,
|
||||
setValue: noopContext,
|
||||
deleteValue: noopContext
|
||||
};
|
||||
}
|
||||
|
||||
export { Traces as T };
|
||||
18
node_modules/vitest/dist/chunks/traces.d.402V_yFI.d.ts
generated
vendored
Normal file
18
node_modules/vitest/dist/chunks/traces.d.402V_yFI.d.ts
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
interface OTELCarrier {
|
||||
traceparent?: string;
|
||||
tracestate?: string;
|
||||
}
|
||||
interface TracesOptions {
|
||||
enabled: boolean;
|
||||
watchMode?: boolean;
|
||||
sdkPath?: string;
|
||||
tracerName?: string;
|
||||
}
|
||||
declare class Traces {
|
||||
#private;
|
||||
constructor(options: TracesOptions);
|
||||
isEnabled(): boolean;
|
||||
}
|
||||
|
||||
export { Traces as T };
|
||||
export type { OTELCarrier as O };
|
||||
52
node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
generated
vendored
Normal file
52
node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
import { getSafeTimers } from '@vitest/utils/timers';
|
||||
|
||||
const NAME_WORKER_STATE = "__vitest_worker__";
|
||||
function getWorkerState() {
|
||||
// @ts-expect-error untyped global
|
||||
const workerState = globalThis[NAME_WORKER_STATE];
|
||||
if (!workerState) throw new Error("Vitest failed to access its internal state.\n\nOne of the following is possible:\n- \"vitest\" is imported directly without running \"vitest\" command\n- \"vitest\" is imported inside \"globalSetup\" (to fix this, use \"setupFiles\" instead, because \"globalSetup\" runs in a different context)\n- \"vitest\" is imported inside Vite / Vitest config file\n- Otherwise, it might be a Vitest bug. Please report it to https://github.com/vitest-dev/vitest/issues\n");
|
||||
return workerState;
|
||||
}
|
||||
function provideWorkerState(context, state) {
|
||||
Object.defineProperty(context, NAME_WORKER_STATE, {
|
||||
value: state,
|
||||
configurable: true,
|
||||
writable: true,
|
||||
enumerable: false
|
||||
});
|
||||
return state;
|
||||
}
|
||||
function isChildProcess() {
|
||||
return typeof process !== "undefined" && !!process.send;
|
||||
}
|
||||
function resetModules(modules, resetMocks = false) {
|
||||
const skipPaths = [
|
||||
/\/vitest\/dist\//,
|
||||
/vitest-virtual-\w+\/dist/,
|
||||
/@vitest\/dist/,
|
||||
...!resetMocks ? [/^mock:/] : []
|
||||
];
|
||||
modules.idToModuleMap.forEach((node, path) => {
|
||||
if (skipPaths.some((re) => re.test(path))) return;
|
||||
node.promise = void 0;
|
||||
node.exports = void 0;
|
||||
node.evaluated = false;
|
||||
node.importers.clear();
|
||||
});
|
||||
}
|
||||
function waitNextTick() {
|
||||
const { setTimeout } = getSafeTimers();
|
||||
return new Promise((resolve) => setTimeout(resolve, 0));
|
||||
}
|
||||
async function waitForImportsToResolve() {
|
||||
await waitNextTick();
|
||||
const state = getWorkerState();
|
||||
const promises = [];
|
||||
const resolvingCount = state.resolvingModules.size;
|
||||
for (const [_, mod] of state.evaluatedModules.idToModuleMap) if (mod.promise && !mod.evaluated) promises.push(mod.promise);
|
||||
if (!promises.length && !resolvingCount) return;
|
||||
await Promise.allSettled(promises);
|
||||
await waitForImportsToResolve();
|
||||
}
|
||||
|
||||
export { getWorkerState as g, isChildProcess as i, provideWorkerState as p, resetModules as r, waitForImportsToResolve as w };
|
||||
3919
node_modules/vitest/dist/chunks/vi.2VT5v0um.js
generated
vendored
Normal file
3919
node_modules/vitest/dist/chunks/vi.2VT5v0um.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
747
node_modules/vitest/dist/chunks/vm.BwmD1Rql.js
generated
vendored
Normal file
747
node_modules/vitest/dist/chunks/vm.BwmD1Rql.js
generated
vendored
Normal file
@@ -0,0 +1,747 @@
|
||||
import { fileURLToPath, pathToFileURL } from 'node:url';
|
||||
import vm, { isContext, runInContext } from 'node:vm';
|
||||
import { dirname, basename, extname, normalize, resolve } from 'pathe';
|
||||
import { l as loadEnvironment } from './init.B04saIIg.js';
|
||||
import { distDir } from '../path.js';
|
||||
import { createCustomConsole } from './console.Cf-YriPC.js';
|
||||
import fs from 'node:fs';
|
||||
import { createRequire, Module, isBuiltin } from 'node:module';
|
||||
import { toArray, isBareImport } from '@vitest/utils/helpers';
|
||||
import { findNearestPackageData } from '@vitest/utils/resolver';
|
||||
import { dirname as dirname$1 } from 'node:path';
|
||||
import { CSS_LANGS_RE, KNOWN_ASSET_RE } from '@vitest/utils/constants';
|
||||
import { getDefaultRequestStubs } from '../module-evaluator.js';
|
||||
import { s as startVitestModuleRunner, c as createNodeImportMeta, a as VITEST_VM_CONTEXT_SYMBOL } from './startModuleRunner.Iz2V0ESw.js';
|
||||
import { p as provideWorkerState } from './utils.DvEY5TfP.js';
|
||||
|
||||
function interopCommonJsModule(interopDefault, mod) {
|
||||
if (isPrimitive(mod) || Array.isArray(mod) || mod instanceof Promise) return {
|
||||
keys: [],
|
||||
moduleExports: {},
|
||||
defaultExport: mod
|
||||
};
|
||||
if (interopDefault !== false && "__esModule" in mod && !isPrimitive(mod.default)) {
|
||||
const defaultKets = Object.keys(mod.default);
|
||||
const moduleKeys = Object.keys(mod);
|
||||
const allKeys = new Set([...defaultKets, ...moduleKeys]);
|
||||
allKeys.delete("default");
|
||||
return {
|
||||
keys: Array.from(allKeys),
|
||||
moduleExports: new Proxy(mod, { get(mod, prop) {
|
||||
return mod[prop] ?? mod.default?.[prop];
|
||||
} }),
|
||||
defaultExport: mod
|
||||
};
|
||||
}
|
||||
return {
|
||||
keys: Object.keys(mod).filter((key) => key !== "default"),
|
||||
moduleExports: mod,
|
||||
defaultExport: mod
|
||||
};
|
||||
}
|
||||
function isPrimitive(obj) {
|
||||
return !(obj != null && (typeof obj === "object" || typeof obj === "function"));
|
||||
}
|
||||
const SyntheticModule = vm.SyntheticModule;
|
||||
const SourceTextModule = vm.SourceTextModule;
|
||||
|
||||
const _require = createRequire(import.meta.url);
|
||||
const requiresCache = /* @__PURE__ */ new WeakMap();
|
||||
class CommonjsExecutor {
|
||||
context;
|
||||
requireCache = /* @__PURE__ */ new Map();
|
||||
publicRequireCache = this.createProxyCache();
|
||||
moduleCache = /* @__PURE__ */ new Map();
|
||||
builtinCache = Object.create(null);
|
||||
extensions = Object.create(null);
|
||||
fs;
|
||||
Module;
|
||||
interopDefault;
|
||||
constructor(options) {
|
||||
this.context = options.context;
|
||||
this.fs = options.fileMap;
|
||||
this.interopDefault = options.interopDefault;
|
||||
const primitives = vm.runInContext("({ Object, Array, Error })", this.context);
|
||||
// eslint-disable-next-line ts/no-this-alias
|
||||
const executor = this;
|
||||
this.Module = class Module$1 {
|
||||
exports;
|
||||
isPreloading = false;
|
||||
id;
|
||||
filename;
|
||||
loaded;
|
||||
parent;
|
||||
children = [];
|
||||
path;
|
||||
paths = [];
|
||||
constructor(id = "", parent) {
|
||||
this.exports = primitives.Object.create(Object.prototype);
|
||||
// in our case the path should always be resolved already
|
||||
this.path = dirname(id);
|
||||
this.id = id;
|
||||
this.filename = id;
|
||||
this.loaded = false;
|
||||
this.parent = parent;
|
||||
}
|
||||
get require() {
|
||||
const require = requiresCache.get(this);
|
||||
if (require) return require;
|
||||
const _require = Module$1.createRequire(this.id);
|
||||
requiresCache.set(this, _require);
|
||||
return _require;
|
||||
}
|
||||
static getSourceMapsSupport = () => ({
|
||||
enabled: false,
|
||||
nodeModules: false,
|
||||
generatedCode: false
|
||||
});
|
||||
static setSourceMapsSupport = () => {
|
||||
// noop
|
||||
};
|
||||
static register = () => {
|
||||
throw new Error(`[vitest] "register" is not available when running in Vitest.`);
|
||||
};
|
||||
static registerHooks = () => {
|
||||
throw new Error(`[vitest] "registerHooks" is not available when running in Vitest.`);
|
||||
};
|
||||
_compile(code, filename) {
|
||||
const cjsModule = Module$1.wrap(code);
|
||||
const script = new vm.Script(cjsModule, {
|
||||
filename,
|
||||
importModuleDynamically: options.importModuleDynamically
|
||||
});
|
||||
// @ts-expect-error mark script with current identifier
|
||||
script.identifier = filename;
|
||||
const fn = script.runInContext(executor.context);
|
||||
const __dirname = dirname(filename);
|
||||
executor.requireCache.set(filename, this);
|
||||
try {
|
||||
fn(this.exports, this.require, this, filename, __dirname);
|
||||
return this.exports;
|
||||
} finally {
|
||||
this.loaded = true;
|
||||
}
|
||||
}
|
||||
// exposed for external use, Node.js does the opposite
|
||||
static _load = (request, parent, _isMain) => {
|
||||
return Module$1.createRequire(parent?.filename ?? request)(request);
|
||||
};
|
||||
static wrap = (script) => {
|
||||
return Module$1.wrapper[0] + script + Module$1.wrapper[1];
|
||||
};
|
||||
static wrapper = new primitives.Array("(function (exports, require, module, __filename, __dirname) { ", "\n});");
|
||||
static builtinModules = Module.builtinModules;
|
||||
static findSourceMap = Module.findSourceMap;
|
||||
static SourceMap = Module.SourceMap;
|
||||
static syncBuiltinESMExports = Module.syncBuiltinESMExports;
|
||||
static _cache = executor.publicRequireCache;
|
||||
static _extensions = executor.extensions;
|
||||
static createRequire = (filename) => {
|
||||
return executor.createRequire(filename);
|
||||
};
|
||||
static runMain = () => {
|
||||
throw new primitives.Error("[vitest] \"runMain\" is not implemented.");
|
||||
};
|
||||
// @ts-expect-error not typed
|
||||
static _resolveFilename = Module._resolveFilename;
|
||||
// @ts-expect-error not typed
|
||||
static _findPath = Module._findPath;
|
||||
// @ts-expect-error not typed
|
||||
static _initPaths = Module._initPaths;
|
||||
// @ts-expect-error not typed
|
||||
static _preloadModules = Module._preloadModules;
|
||||
// @ts-expect-error not typed
|
||||
static _resolveLookupPaths = Module._resolveLookupPaths;
|
||||
// @ts-expect-error not typed
|
||||
static globalPaths = Module.globalPaths;
|
||||
static isBuiltin = Module.isBuiltin;
|
||||
static constants = Module.constants;
|
||||
static enableCompileCache = Module.enableCompileCache;
|
||||
static getCompileCacheDir = Module.getCompileCacheDir;
|
||||
static flushCompileCache = Module.flushCompileCache;
|
||||
static stripTypeScriptTypes = Module.stripTypeScriptTypes;
|
||||
static findPackageJSON = Module.findPackageJSON;
|
||||
static Module = Module$1;
|
||||
};
|
||||
this.extensions[".js"] = this.requireJs;
|
||||
this.extensions[".json"] = this.requireJson;
|
||||
}
|
||||
requireJs = (m, filename) => {
|
||||
const content = this.fs.readFile(filename);
|
||||
m._compile(content, filename);
|
||||
};
|
||||
requireJson = (m, filename) => {
|
||||
const code = this.fs.readFile(filename);
|
||||
m.exports = JSON.parse(code);
|
||||
};
|
||||
createRequire = (filename) => {
|
||||
const _require = createRequire(filename);
|
||||
const require = ((id) => {
|
||||
const resolved = _require.resolve(id);
|
||||
if (extname(resolved) === ".node" || isBuiltin(resolved)) return this.requireCoreModule(resolved);
|
||||
const module = new this.Module(resolved);
|
||||
return this.loadCommonJSModule(module, resolved);
|
||||
});
|
||||
require.resolve = _require.resolve;
|
||||
Object.defineProperty(require, "extensions", {
|
||||
get: () => this.extensions,
|
||||
set: () => {},
|
||||
configurable: true
|
||||
});
|
||||
require.main = void 0;
|
||||
require.cache = this.publicRequireCache;
|
||||
return require;
|
||||
};
|
||||
createProxyCache() {
|
||||
return new Proxy(Object.create(null), {
|
||||
defineProperty: () => true,
|
||||
deleteProperty: () => true,
|
||||
set: () => true,
|
||||
get: (_, key) => this.requireCache.get(key),
|
||||
has: (_, key) => this.requireCache.has(key),
|
||||
ownKeys: () => Array.from(this.requireCache.keys()),
|
||||
getOwnPropertyDescriptor() {
|
||||
return {
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
// very naive implementation for Node.js require
|
||||
loadCommonJSModule(module, filename) {
|
||||
const cached = this.requireCache.get(filename);
|
||||
if (cached) return cached.exports;
|
||||
const extension = this.findLongestRegisteredExtension(filename);
|
||||
(this.extensions[extension] || this.extensions[".js"])(module, filename);
|
||||
return module.exports;
|
||||
}
|
||||
findLongestRegisteredExtension(filename) {
|
||||
const name = basename(filename);
|
||||
let currentExtension;
|
||||
let index;
|
||||
let startIndex = 0;
|
||||
// eslint-disable-next-line no-cond-assign
|
||||
while ((index = name.indexOf(".", startIndex)) !== -1) {
|
||||
startIndex = index + 1;
|
||||
if (index === 0) continue;
|
||||
currentExtension = name.slice(index);
|
||||
if (this.extensions[currentExtension]) return currentExtension;
|
||||
}
|
||||
return ".js";
|
||||
}
|
||||
getCoreSyntheticModule(identifier) {
|
||||
if (this.moduleCache.has(identifier)) return this.moduleCache.get(identifier);
|
||||
const exports$1 = this.require(identifier);
|
||||
const keys = Object.keys(exports$1);
|
||||
const module = new SyntheticModule([...keys, "default"], () => {
|
||||
for (const key of keys) module.setExport(key, exports$1[key]);
|
||||
module.setExport("default", exports$1);
|
||||
}, {
|
||||
context: this.context,
|
||||
identifier
|
||||
});
|
||||
this.moduleCache.set(identifier, module);
|
||||
return module;
|
||||
}
|
||||
getCjsSyntheticModule(path, identifier) {
|
||||
if (this.moduleCache.has(identifier)) return this.moduleCache.get(identifier);
|
||||
const exports$1 = this.require(path);
|
||||
// TODO: technically module should be parsed to find static exports, implement for strict mode in #2854
|
||||
const { keys, moduleExports, defaultExport } = interopCommonJsModule(this.interopDefault, exports$1);
|
||||
const module = new SyntheticModule([...keys, "default"], function() {
|
||||
for (const key of keys) this.setExport(key, moduleExports[key]);
|
||||
this.setExport("default", defaultExport);
|
||||
}, {
|
||||
context: this.context,
|
||||
identifier
|
||||
});
|
||||
this.moduleCache.set(identifier, module);
|
||||
return module;
|
||||
}
|
||||
// TODO: use this in strict mode, when available in #2854
|
||||
// private _getNamedCjsExports(path: string): Set<string> {
|
||||
// const cachedNamedExports = this.cjsNamedExportsMap.get(path)
|
||||
// if (cachedNamedExports) {
|
||||
// return cachedNamedExports
|
||||
// }
|
||||
// if (extname(path) === '.node') {
|
||||
// const moduleExports = this.require(path)
|
||||
// const namedExports = new Set(Object.keys(moduleExports))
|
||||
// this.cjsNamedExportsMap.set(path, namedExports)
|
||||
// return namedExports
|
||||
// }
|
||||
// const code = this.fs.readFile(path)
|
||||
// const { exports, reexports } = parseCjs(code, path)
|
||||
// const namedExports = new Set(exports)
|
||||
// this.cjsNamedExportsMap.set(path, namedExports)
|
||||
// for (const reexport of reexports) {
|
||||
// if (isNodeBuiltin(reexport)) {
|
||||
// const exports = this.require(reexport)
|
||||
// if (exports !== null && typeof exports === 'object') {
|
||||
// for (const e of Object.keys(exports)) {
|
||||
// namedExports.add(e)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// else {
|
||||
// const require = this.createRequire(path)
|
||||
// const resolved = require.resolve(reexport)
|
||||
// const exports = this._getNamedCjsExports(resolved)
|
||||
// for (const e of exports) {
|
||||
// namedExports.add(e)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return namedExports
|
||||
// }
|
||||
require(identifier) {
|
||||
if (extname(identifier) === ".node" || isBuiltin(identifier)) return this.requireCoreModule(identifier);
|
||||
const module = new this.Module(identifier);
|
||||
return this.loadCommonJSModule(module, identifier);
|
||||
}
|
||||
requireCoreModule(identifier) {
|
||||
const normalized = identifier.replace(/^node:/, "");
|
||||
if (this.builtinCache[normalized]) return this.builtinCache[normalized].exports;
|
||||
const moduleExports = _require(identifier);
|
||||
if (identifier === "node:module" || identifier === "module") {
|
||||
const module = new this.Module("/module.js");
|
||||
module.exports = this.Module;
|
||||
this.builtinCache[normalized] = module;
|
||||
return module.exports;
|
||||
}
|
||||
this.builtinCache[normalized] = _require.cache[normalized];
|
||||
// TODO: should we wrap module to rethrow context errors?
|
||||
return moduleExports;
|
||||
}
|
||||
}
|
||||
|
||||
const dataURIRegex = /^data:(?<mime>text\/javascript|application\/json|application\/wasm)(?:;(?<encoding>charset=utf-8|base64))?,(?<code>.*)$/;
|
||||
class EsmExecutor {
|
||||
moduleCache = /* @__PURE__ */ new Map();
|
||||
esmLinkMap = /* @__PURE__ */ new WeakMap();
|
||||
context;
|
||||
#httpIp = IPnumber("127.0.0.0");
|
||||
constructor(executor, options) {
|
||||
this.executor = executor;
|
||||
this.context = options.context;
|
||||
}
|
||||
async evaluateModule(m) {
|
||||
if (m.status === "unlinked") this.esmLinkMap.set(m, m.link((identifier, referencer) => this.executor.resolveModule(identifier, referencer.identifier)));
|
||||
await this.esmLinkMap.get(m);
|
||||
if (m.status === "linked") await m.evaluate();
|
||||
return m;
|
||||
}
|
||||
async createEsModule(fileURL, getCode) {
|
||||
const cached = this.moduleCache.get(fileURL);
|
||||
if (cached) return cached;
|
||||
const promise = this.loadEsModule(fileURL, getCode);
|
||||
this.moduleCache.set(fileURL, promise);
|
||||
return promise;
|
||||
}
|
||||
async loadEsModule(fileURL, getCode) {
|
||||
const code = await getCode();
|
||||
// TODO: should not be allowed in strict mode, implement in #2854
|
||||
if (fileURL.endsWith(".json")) {
|
||||
const m = new SyntheticModule(["default"], function() {
|
||||
const result = JSON.parse(code);
|
||||
this.setExport("default", result);
|
||||
});
|
||||
this.moduleCache.set(fileURL, m);
|
||||
return m;
|
||||
}
|
||||
const m = new SourceTextModule(code, {
|
||||
identifier: fileURL,
|
||||
context: this.context,
|
||||
importModuleDynamically: this.executor.importModuleDynamically,
|
||||
initializeImportMeta: (meta, mod) => {
|
||||
meta.url = mod.identifier;
|
||||
if (mod.identifier.startsWith("file:")) {
|
||||
const filename = fileURLToPath(mod.identifier);
|
||||
meta.filename = filename;
|
||||
meta.dirname = dirname$1(filename);
|
||||
}
|
||||
meta.resolve = (specifier, importer) => {
|
||||
return this.executor.resolve(specifier, importer != null ? importer.toString() : mod.identifier);
|
||||
};
|
||||
}
|
||||
});
|
||||
this.moduleCache.set(fileURL, m);
|
||||
return m;
|
||||
}
|
||||
async createWebAssemblyModule(fileUrl, getCode) {
|
||||
const cached = this.moduleCache.get(fileUrl);
|
||||
if (cached) return cached;
|
||||
const m = this.loadWebAssemblyModule(getCode(), fileUrl);
|
||||
this.moduleCache.set(fileUrl, m);
|
||||
return m;
|
||||
}
|
||||
async createNetworkModule(fileUrl) {
|
||||
// https://nodejs.org/api/esm.html#https-and-http-imports
|
||||
if (fileUrl.startsWith("http:")) {
|
||||
const url = new URL(fileUrl);
|
||||
if (url.hostname !== "localhost" && url.hostname !== "::1" && (IPnumber(url.hostname) & IPmask(8)) !== this.#httpIp) throw new Error(
|
||||
// we don't know the importer, so it's undefined (the same happens in --pool=threads)
|
||||
`import of '${fileUrl}' by undefined is not supported: http can only be used to load local resources (use https instead).`
|
||||
);
|
||||
}
|
||||
return this.createEsModule(fileUrl, () => fetch(fileUrl).then((r) => r.text()));
|
||||
}
|
||||
async loadWebAssemblyModule(source, identifier) {
|
||||
const cached = this.moduleCache.get(identifier);
|
||||
if (cached) return cached;
|
||||
const wasmModule = await WebAssembly.compile(source);
|
||||
const exports$1 = WebAssembly.Module.exports(wasmModule);
|
||||
const imports = WebAssembly.Module.imports(wasmModule);
|
||||
const moduleLookup = {};
|
||||
for (const { module } of imports) if (moduleLookup[module] === void 0) moduleLookup[module] = await this.executor.resolveModule(module, identifier);
|
||||
const evaluateModule = (module) => this.evaluateModule(module);
|
||||
return new SyntheticModule(exports$1.map(({ name }) => name), async function() {
|
||||
const importsObject = {};
|
||||
for (const { module, name } of imports) {
|
||||
if (!importsObject[module]) importsObject[module] = {};
|
||||
await evaluateModule(moduleLookup[module]);
|
||||
importsObject[module][name] = moduleLookup[module].namespace[name];
|
||||
}
|
||||
const wasmInstance = new WebAssembly.Instance(wasmModule, importsObject);
|
||||
for (const { name } of exports$1) this.setExport(name, wasmInstance.exports[name]);
|
||||
}, {
|
||||
context: this.context,
|
||||
identifier
|
||||
});
|
||||
}
|
||||
cacheModule(identifier, module) {
|
||||
this.moduleCache.set(identifier, module);
|
||||
}
|
||||
resolveCachedModule(identifier) {
|
||||
return this.moduleCache.get(identifier);
|
||||
}
|
||||
async createDataModule(identifier) {
|
||||
const cached = this.moduleCache.get(identifier);
|
||||
if (cached) return cached;
|
||||
const match = identifier.match(dataURIRegex);
|
||||
if (!match || !match.groups) throw new Error("Invalid data URI");
|
||||
const mime = match.groups.mime;
|
||||
const encoding = match.groups.encoding;
|
||||
if (mime === "application/wasm") {
|
||||
if (!encoding) throw new Error("Missing data URI encoding");
|
||||
if (encoding !== "base64") throw new Error(`Invalid data URI encoding: ${encoding}`);
|
||||
const module = this.loadWebAssemblyModule(Buffer.from(match.groups.code, "base64"), identifier);
|
||||
this.moduleCache.set(identifier, module);
|
||||
return module;
|
||||
}
|
||||
let code = match.groups.code;
|
||||
if (!encoding || encoding === "charset=utf-8") code = decodeURIComponent(code);
|
||||
else if (encoding === "base64") code = Buffer.from(code, "base64").toString();
|
||||
else throw new Error(`Invalid data URI encoding: ${encoding}`);
|
||||
if (mime === "application/json") {
|
||||
const module = new SyntheticModule(["default"], function() {
|
||||
const obj = JSON.parse(code);
|
||||
this.setExport("default", obj);
|
||||
}, {
|
||||
context: this.context,
|
||||
identifier
|
||||
});
|
||||
this.moduleCache.set(identifier, module);
|
||||
return module;
|
||||
}
|
||||
return this.createEsModule(identifier, () => code);
|
||||
}
|
||||
}
|
||||
function IPnumber(address) {
|
||||
const ip = address.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
|
||||
if (ip) return (+ip[1] << 24) + (+ip[2] << 16) + (+ip[3] << 8) + +ip[4];
|
||||
throw new Error(`Expected IP address, received ${address}`);
|
||||
}
|
||||
function IPmask(maskSize) {
|
||||
return -1 << 32 - maskSize;
|
||||
}
|
||||
|
||||
const CLIENT_ID = "/@vite/client";
|
||||
const CLIENT_FILE = pathToFileURL(CLIENT_ID).href;
|
||||
class ViteExecutor {
|
||||
esm;
|
||||
constructor(options) {
|
||||
this.options = options;
|
||||
this.esm = options.esmExecutor;
|
||||
}
|
||||
resolve = (identifier) => {
|
||||
if (identifier === CLIENT_ID) return identifier;
|
||||
};
|
||||
get workerState() {
|
||||
return this.options.context.__vitest_worker__;
|
||||
}
|
||||
async createViteModule(fileUrl) {
|
||||
if (fileUrl === CLIENT_FILE || fileUrl === CLIENT_ID) return this.createViteClientModule();
|
||||
const cached = this.esm.resolveCachedModule(fileUrl);
|
||||
if (cached) return cached;
|
||||
return this.esm.createEsModule(fileUrl, async () => {
|
||||
try {
|
||||
const result = await this.options.transform(fileUrl);
|
||||
if (result.code) return result.code;
|
||||
} catch (cause) {
|
||||
// rethrow vite error if it cannot load the module because it's not resolved
|
||||
if (typeof cause === "object" && cause.code === "ERR_LOAD_URL" || typeof cause?.message === "string" && cause.message.includes("Failed to load url")) {
|
||||
const error = new Error(`Cannot find module '${fileUrl}'`, { cause });
|
||||
error.code = "ERR_MODULE_NOT_FOUND";
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
throw new Error(`[vitest] Failed to transform ${fileUrl}. Does the file exist?`);
|
||||
});
|
||||
}
|
||||
createViteClientModule() {
|
||||
const identifier = CLIENT_ID;
|
||||
const cached = this.esm.resolveCachedModule(identifier);
|
||||
if (cached) return cached;
|
||||
const stub = this.options.viteClientModule;
|
||||
const moduleKeys = Object.keys(stub);
|
||||
const module = new SyntheticModule(moduleKeys, function() {
|
||||
moduleKeys.forEach((key) => {
|
||||
this.setExport(key, stub[key]);
|
||||
});
|
||||
}, {
|
||||
context: this.options.context,
|
||||
identifier
|
||||
});
|
||||
this.esm.cacheModule(identifier, module);
|
||||
return module;
|
||||
}
|
||||
canResolve = (fileUrl) => {
|
||||
if (fileUrl === CLIENT_FILE) return true;
|
||||
const config = this.workerState.config.deps?.web || {};
|
||||
const [modulePath] = fileUrl.split("?");
|
||||
if (config.transformCss && CSS_LANGS_RE.test(modulePath)) return true;
|
||||
if (config.transformAssets && KNOWN_ASSET_RE.test(modulePath)) return true;
|
||||
if (toArray(config.transformGlobPattern).some((pattern) => pattern.test(modulePath))) return true;
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
const { existsSync } = fs;
|
||||
// always defined when we use vm pool
|
||||
const nativeResolve = import.meta.resolve;
|
||||
// TODO: improve Node.js strict mode support in #2854
|
||||
class ExternalModulesExecutor {
|
||||
cjs;
|
||||
esm;
|
||||
vite;
|
||||
context;
|
||||
fs;
|
||||
resolvers = [];
|
||||
#networkSupported = null;
|
||||
constructor(options) {
|
||||
this.options = options;
|
||||
this.context = options.context;
|
||||
this.fs = options.fileMap;
|
||||
this.esm = new EsmExecutor(this, { context: this.context });
|
||||
this.cjs = new CommonjsExecutor({
|
||||
context: this.context,
|
||||
importModuleDynamically: this.importModuleDynamically,
|
||||
fileMap: options.fileMap,
|
||||
interopDefault: options.interopDefault
|
||||
});
|
||||
this.vite = new ViteExecutor({
|
||||
esmExecutor: this.esm,
|
||||
context: this.context,
|
||||
transform: options.transform,
|
||||
viteClientModule: options.viteClientModule
|
||||
});
|
||||
this.resolvers = [this.vite.resolve];
|
||||
}
|
||||
async import(identifier) {
|
||||
const module = await this.createModule(identifier);
|
||||
await this.esm.evaluateModule(module);
|
||||
return module.namespace;
|
||||
}
|
||||
require(identifier) {
|
||||
return this.cjs.require(identifier);
|
||||
}
|
||||
createRequire(identifier) {
|
||||
return this.cjs.createRequire(identifier);
|
||||
}
|
||||
// dynamic import can be used in both ESM and CJS, so we have it in the executor
|
||||
importModuleDynamically = async (specifier, referencer) => {
|
||||
const module = await this.resolveModule(specifier, referencer.identifier);
|
||||
return await this.esm.evaluateModule(module);
|
||||
};
|
||||
resolveModule = async (specifier, referencer) => {
|
||||
let identifier = this.resolve(specifier, referencer);
|
||||
if (identifier instanceof Promise) identifier = await identifier;
|
||||
return await this.createModule(identifier);
|
||||
};
|
||||
resolve(specifier, parent) {
|
||||
for (const resolver of this.resolvers) {
|
||||
const id = resolver(specifier, parent);
|
||||
if (id) return id;
|
||||
}
|
||||
// import.meta.resolve can be asynchronous in older +18 Node versions
|
||||
return nativeResolve(specifier, parent);
|
||||
}
|
||||
getModuleInformation(identifier) {
|
||||
if (identifier.startsWith("data:")) return {
|
||||
type: "data",
|
||||
url: identifier,
|
||||
path: identifier
|
||||
};
|
||||
const extension = extname(identifier);
|
||||
if (extension === ".node" || isBuiltin(identifier)) return {
|
||||
type: "builtin",
|
||||
url: identifier,
|
||||
path: identifier
|
||||
};
|
||||
if (this.isNetworkSupported && (identifier.startsWith("http:") || identifier.startsWith("https:"))) return {
|
||||
type: "network",
|
||||
url: identifier,
|
||||
path: identifier
|
||||
};
|
||||
const isFileUrl = identifier.startsWith("file://");
|
||||
const pathUrl = isFileUrl ? fileURLToPath(identifier.split("?")[0]) : identifier;
|
||||
const fileUrl = isFileUrl ? identifier : pathToFileURL(pathUrl).toString();
|
||||
let type;
|
||||
if (this.vite.canResolve(fileUrl)) type = "vite";
|
||||
else if (extension === ".mjs") type = "module";
|
||||
else if (extension === ".cjs") type = "commonjs";
|
||||
else if (extension === ".wasm")
|
||||
// still experimental on NodeJS --experimental-wasm-modules
|
||||
// cf. ESM_FILE_FORMAT(url) in https://nodejs.org/docs/latest-v20.x/api/esm.html#resolution-algorithm
|
||||
type = "wasm";
|
||||
else type = findNearestPackageData(normalize(pathUrl)).type === "module" ? "module" : "commonjs";
|
||||
return {
|
||||
type,
|
||||
path: pathUrl,
|
||||
url: fileUrl
|
||||
};
|
||||
}
|
||||
createModule(identifier) {
|
||||
const { type, url, path } = this.getModuleInformation(identifier);
|
||||
// create ERR_MODULE_NOT_FOUND on our own since latest NodeJS's import.meta.resolve doesn't throw on non-existing namespace or path
|
||||
// https://github.com/nodejs/node/pull/49038
|
||||
if ((type === "module" || type === "commonjs" || type === "wasm") && !existsSync(path)) {
|
||||
const error = /* @__PURE__ */ new Error(`Cannot find ${isBareImport(path) ? "package" : "module"} '${path}'`);
|
||||
error.code = "ERR_MODULE_NOT_FOUND";
|
||||
throw error;
|
||||
}
|
||||
switch (type) {
|
||||
case "data": return this.esm.createDataModule(identifier);
|
||||
case "builtin": return this.cjs.getCoreSyntheticModule(identifier);
|
||||
case "vite": return this.vite.createViteModule(url);
|
||||
case "wasm": return this.esm.createWebAssemblyModule(url, () => this.fs.readBuffer(path));
|
||||
case "module": return this.esm.createEsModule(url, () => this.fs.readFileAsync(path));
|
||||
case "commonjs": return this.cjs.getCjsSyntheticModule(path, identifier);
|
||||
case "network": return this.esm.createNetworkModule(url);
|
||||
default: return type;
|
||||
}
|
||||
}
|
||||
get isNetworkSupported() {
|
||||
if (this.#networkSupported == null) if (process.execArgv.includes("--experimental-network-imports")) this.#networkSupported = true;
|
||||
else if (process.env.NODE_OPTIONS?.includes("--experimental-network-imports")) this.#networkSupported = true;
|
||||
else this.#networkSupported = false;
|
||||
return this.#networkSupported;
|
||||
}
|
||||
}
|
||||
|
||||
const { promises, readFileSync } = fs;
|
||||
class FileMap {
|
||||
fsCache = /* @__PURE__ */ new Map();
|
||||
fsBufferCache = /* @__PURE__ */ new Map();
|
||||
async readFileAsync(path) {
|
||||
const cached = this.fsCache.get(path);
|
||||
if (cached != null) return cached;
|
||||
const source = await promises.readFile(path, "utf-8");
|
||||
this.fsCache.set(path, source);
|
||||
return source;
|
||||
}
|
||||
readFile(path) {
|
||||
const cached = this.fsCache.get(path);
|
||||
if (cached != null) return cached;
|
||||
const source = readFileSync(path, "utf-8");
|
||||
this.fsCache.set(path, source);
|
||||
return source;
|
||||
}
|
||||
readBuffer(path) {
|
||||
const cached = this.fsBufferCache.get(path);
|
||||
if (cached != null) return cached;
|
||||
const buffer = readFileSync(path);
|
||||
this.fsBufferCache.set(path, buffer);
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
|
||||
const entryFile = pathToFileURL(resolve(distDir, "workers/runVmTests.js")).href;
|
||||
const fileMap = new FileMap();
|
||||
const packageCache = /* @__PURE__ */ new Map();
|
||||
async function runVmTests(method, state, traces) {
|
||||
const { ctx, rpc } = state;
|
||||
const beforeEnvironmentTime = performance.now();
|
||||
const { environment } = await loadEnvironment(ctx.environment.name, ctx.config.root, rpc, traces);
|
||||
state.environment = environment;
|
||||
if (!environment.setupVM) {
|
||||
const envName = ctx.environment.name;
|
||||
const packageId = envName[0] === "." ? envName : `vitest-environment-${envName}`;
|
||||
throw new TypeError(`Environment "${ctx.environment.name}" is not a valid environment. Path "${packageId}" doesn't support vm environment because it doesn't provide "setupVM" method.`);
|
||||
}
|
||||
const vm = await traces.$("vitest.runtime.environment.setup", { attributes: {
|
||||
"vitest.environment": environment.name,
|
||||
"vitest.environment.vite_environment": environment.viteEnvironment || environment.name
|
||||
} }, () => environment.setupVM(ctx.environment.options || ctx.config.environmentOptions || {}));
|
||||
state.durations.environment = performance.now() - beforeEnvironmentTime;
|
||||
process.env.VITEST_VM_POOL = "1";
|
||||
if (!vm.getVmContext) throw new TypeError(`Environment ${environment.name} doesn't provide "getVmContext" method. It should return a context created by "vm.createContext" method.`);
|
||||
const context = vm.getVmContext();
|
||||
if (!isContext(context)) throw new TypeError(`Environment ${environment.name} doesn't provide a valid context. It should be created by "vm.createContext" method.`);
|
||||
provideWorkerState(context, state);
|
||||
// this is unfortunately needed for our own dependencies
|
||||
// we need to find a way to not rely on this by default
|
||||
// because browser doesn't provide these globals
|
||||
context.process = process;
|
||||
context.global = context;
|
||||
context.console = state.config.disableConsoleIntercept ? console : createCustomConsole(state);
|
||||
// TODO: don't hardcode setImmediate in fake timers defaults
|
||||
context.setImmediate = setImmediate;
|
||||
context.clearImmediate = clearImmediate;
|
||||
const stubs = getDefaultRequestStubs(context);
|
||||
const externalModulesExecutor = new ExternalModulesExecutor({
|
||||
context,
|
||||
fileMap,
|
||||
packageCache,
|
||||
transform: rpc.transform,
|
||||
viteClientModule: stubs["/@vite/client"]
|
||||
});
|
||||
const moduleRunner = startVitestModuleRunner({
|
||||
context,
|
||||
evaluatedModules: state.evaluatedModules,
|
||||
state,
|
||||
externalModulesExecutor,
|
||||
createImportMeta: createNodeImportMeta,
|
||||
traces
|
||||
});
|
||||
Object.defineProperty(context, VITEST_VM_CONTEXT_SYMBOL, {
|
||||
value: {
|
||||
context,
|
||||
externalModulesExecutor
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
writable: false
|
||||
});
|
||||
context.__vitest_mocker__ = moduleRunner.mocker;
|
||||
if (ctx.config.serializedDefines) try {
|
||||
runInContext(ctx.config.serializedDefines, context, { filename: "virtual:load-defines.js" });
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to load custom "defines": ${error.message}`);
|
||||
}
|
||||
await moduleRunner.mocker.initializeSpyModule();
|
||||
const { run } = await moduleRunner.import(entryFile);
|
||||
const fileSpecs = ctx.files.map((f) => typeof f === "string" ? {
|
||||
filepath: f,
|
||||
testLocations: void 0
|
||||
} : f);
|
||||
try {
|
||||
await run(method, fileSpecs, ctx.config, moduleRunner, traces);
|
||||
} finally {
|
||||
await traces.$("vitest.runtime.environment.teardown", () => vm.teardown?.());
|
||||
}
|
||||
}
|
||||
|
||||
export { runVmTests as r };
|
||||
238
node_modules/vitest/dist/chunks/worker.d.B4A26qg6.d.ts
generated
vendored
Normal file
238
node_modules/vitest/dist/chunks/worker.d.B4A26qg6.d.ts
generated
vendored
Normal file
@@ -0,0 +1,238 @@
|
||||
import { FileSpecification, Task, CancelReason } from '@vitest/runner';
|
||||
import { EvaluatedModules } from 'vite/module-runner';
|
||||
import { S as SerializedConfig } from './config.d.CzIjkicf.js';
|
||||
import { E as Environment } from './environment.d.CrsxCzP1.js';
|
||||
import { R as RuntimeRPC, a as RunnerRPC } from './rpc.d.RH3apGEf.js';
|
||||
|
||||
type ArgumentsType<T> = T extends (...args: infer A) => any ? A : never;
|
||||
type ReturnType<T> = T extends (...args: any) => infer R ? R : never;
|
||||
type PromisifyFn<T> = ReturnType<T> extends Promise<any> ? T : (...args: ArgumentsType<T>) => Promise<Awaited<ReturnType<T>>>;
|
||||
type Thenable<T> = T | PromiseLike<T>;
|
||||
type BirpcResolver = (name: string, resolved: (...args: unknown[]) => unknown) => Thenable<((...args: unknown[]) => unknown) | undefined>;
|
||||
interface ChannelOptions {
|
||||
/**
|
||||
* Function to post raw message
|
||||
*/
|
||||
post: (data: any, ...extras: any[]) => any | Promise<any>;
|
||||
/**
|
||||
* Listener to receive raw message
|
||||
*/
|
||||
on: (fn: (data: any, ...extras: any[]) => void) => any | Promise<any>;
|
||||
/**
|
||||
* Clear the listener when `$close` is called
|
||||
*/
|
||||
off?: (fn: (data: any, ...extras: any[]) => void) => any | Promise<any>;
|
||||
/**
|
||||
* Custom function to serialize data
|
||||
*
|
||||
* by default it passes the data as-is
|
||||
*/
|
||||
serialize?: (data: any) => any;
|
||||
/**
|
||||
* Custom function to deserialize data
|
||||
*
|
||||
* by default it passes the data as-is
|
||||
*/
|
||||
deserialize?: (data: any) => any;
|
||||
/**
|
||||
* Call the methods with the RPC context or the original functions object
|
||||
*/
|
||||
bind?: 'rpc' | 'functions';
|
||||
}
|
||||
interface EventOptions<Remote> {
|
||||
/**
|
||||
* Names of remote functions that do not need response.
|
||||
*/
|
||||
eventNames?: (keyof Remote)[];
|
||||
/**
|
||||
* Maximum timeout for waiting for response, in milliseconds.
|
||||
*
|
||||
* @default 60_000
|
||||
*/
|
||||
timeout?: number;
|
||||
/**
|
||||
* Custom resolver to resolve function to be called
|
||||
*
|
||||
* For advanced use cases only
|
||||
*/
|
||||
resolver?: BirpcResolver;
|
||||
/**
|
||||
* Hook triggered before an event is sent to the remote
|
||||
*
|
||||
* @param req - Request parameters
|
||||
* @param next - Function to continue the request
|
||||
* @param resolve - Function to resolve the response directly
|
||||
*/
|
||||
onRequest?: (req: Request, next: (req?: Request) => Promise<any>, resolve: (res: any) => void) => void | Promise<void>;
|
||||
/**
|
||||
* Custom error handler
|
||||
*
|
||||
* @deprecated use `onFunctionError` and `onGeneralError` instead
|
||||
*/
|
||||
onError?: (error: Error, functionName: string, args: any[]) => boolean | void;
|
||||
/**
|
||||
* Custom error handler for errors occurred in local functions being called
|
||||
*
|
||||
* @returns `true` to prevent the error from being thrown
|
||||
*/
|
||||
onFunctionError?: (error: Error, functionName: string, args: any[]) => boolean | void;
|
||||
/**
|
||||
* Custom error handler for errors occurred during serialization or messsaging
|
||||
*
|
||||
* @returns `true` to prevent the error from being thrown
|
||||
*/
|
||||
onGeneralError?: (error: Error, functionName?: string, args?: any[]) => boolean | void;
|
||||
/**
|
||||
* Custom error handler for timeouts
|
||||
*
|
||||
* @returns `true` to prevent the error from being thrown
|
||||
*/
|
||||
onTimeoutError?: (functionName: string, args: any[]) => boolean | void;
|
||||
}
|
||||
type BirpcOptions<Remote> = EventOptions<Remote> & ChannelOptions;
|
||||
type BirpcFn<T> = PromisifyFn<T> & {
|
||||
/**
|
||||
* Send event without asking for response
|
||||
*/
|
||||
asEvent: (...args: ArgumentsType<T>) => Promise<void>;
|
||||
};
|
||||
interface BirpcReturnBuiltin<RemoteFunctions, LocalFunctions = Record<string, never>> {
|
||||
/**
|
||||
* Raw functions object
|
||||
*/
|
||||
$functions: LocalFunctions;
|
||||
/**
|
||||
* Whether the RPC is closed
|
||||
*/
|
||||
readonly $closed: boolean;
|
||||
/**
|
||||
* Close the RPC connection
|
||||
*/
|
||||
$close: (error?: Error) => void;
|
||||
/**
|
||||
* Reject pending calls
|
||||
*/
|
||||
$rejectPendingCalls: (handler?: PendingCallHandler) => Promise<void>[];
|
||||
/**
|
||||
* Call the remote function and wait for the result.
|
||||
* An alternative to directly calling the function
|
||||
*/
|
||||
$call: <K extends keyof RemoteFunctions>(method: K, ...args: ArgumentsType<RemoteFunctions[K]>) => Promise<Awaited<ReturnType<RemoteFunctions[K]>>>;
|
||||
/**
|
||||
* Same as `$call`, but returns `undefined` if the function is not defined on the remote side.
|
||||
*/
|
||||
$callOptional: <K extends keyof RemoteFunctions>(method: K, ...args: ArgumentsType<RemoteFunctions[K]>) => Promise<Awaited<ReturnType<RemoteFunctions[K]> | undefined>>;
|
||||
/**
|
||||
* Send event without asking for response
|
||||
*/
|
||||
$callEvent: <K extends keyof RemoteFunctions>(method: K, ...args: ArgumentsType<RemoteFunctions[K]>) => Promise<void>;
|
||||
/**
|
||||
* Call the remote function with the raw options.
|
||||
*/
|
||||
$callRaw: (options: {
|
||||
method: string;
|
||||
args: unknown[];
|
||||
event?: boolean;
|
||||
optional?: boolean;
|
||||
}) => Promise<Awaited<ReturnType<any>>[]>;
|
||||
}
|
||||
type BirpcReturn<RemoteFunctions, LocalFunctions = Record<string, never>> = {
|
||||
[K in keyof RemoteFunctions]: BirpcFn<RemoteFunctions[K]>;
|
||||
} & BirpcReturnBuiltin<RemoteFunctions, LocalFunctions>;
|
||||
type PendingCallHandler = (options: Pick<PromiseEntry, 'method' | 'reject'>) => void | Promise<void>;
|
||||
interface PromiseEntry {
|
||||
resolve: (arg: any) => void;
|
||||
reject: (error: any) => void;
|
||||
method: string;
|
||||
timeoutId?: ReturnType<typeof setTimeout>;
|
||||
}
|
||||
declare const TYPE_REQUEST: "q";
|
||||
interface Request {
|
||||
/**
|
||||
* Type
|
||||
*/
|
||||
t: typeof TYPE_REQUEST;
|
||||
/**
|
||||
* ID
|
||||
*/
|
||||
i?: string;
|
||||
/**
|
||||
* Method
|
||||
*/
|
||||
m: string;
|
||||
/**
|
||||
* Arguments
|
||||
*/
|
||||
a: any[];
|
||||
/**
|
||||
* Optional
|
||||
*/
|
||||
o?: boolean;
|
||||
}
|
||||
declare const setTimeout: typeof globalThis.setTimeout;
|
||||
|
||||
type WorkerRPC = BirpcReturn<RuntimeRPC, RunnerRPC>;
|
||||
interface ContextTestEnvironment {
|
||||
name: string;
|
||||
options: Record<string, any> | null;
|
||||
}
|
||||
interface WorkerTestEnvironment {
|
||||
name: string;
|
||||
options: Record<string, any> | null;
|
||||
}
|
||||
type TestExecutionMethod = "run" | "collect";
|
||||
interface WorkerExecuteContext {
|
||||
files: FileSpecification[];
|
||||
providedContext: Record<string, any>;
|
||||
invalidates?: string[];
|
||||
/** Exposed to test runner as `VITEST_WORKER_ID`. Value is unique per each isolated worker. */
|
||||
workerId: number;
|
||||
}
|
||||
interface ContextRPC {
|
||||
pool: string;
|
||||
config: SerializedConfig;
|
||||
projectName: string;
|
||||
environment: WorkerTestEnvironment;
|
||||
rpc: WorkerRPC;
|
||||
files: FileSpecification[];
|
||||
providedContext: Record<string, any>;
|
||||
invalidates?: string[];
|
||||
/** Exposed to test runner as `VITEST_WORKER_ID`. Value is unique per each isolated worker. */
|
||||
workerId: number;
|
||||
}
|
||||
interface WorkerSetupContext {
|
||||
environment: WorkerTestEnvironment;
|
||||
pool: string;
|
||||
config: SerializedConfig;
|
||||
projectName: string;
|
||||
rpc: WorkerRPC;
|
||||
}
|
||||
interface WorkerGlobalState {
|
||||
ctx: ContextRPC;
|
||||
config: SerializedConfig;
|
||||
rpc: WorkerRPC;
|
||||
current?: Task;
|
||||
filepath?: string;
|
||||
metaEnv: {
|
||||
[key: string]: any;
|
||||
BASE_URL: string;
|
||||
MODE: string;
|
||||
DEV: boolean;
|
||||
PROD: boolean;
|
||||
SSR: boolean;
|
||||
};
|
||||
environment: Environment;
|
||||
evaluatedModules: EvaluatedModules;
|
||||
resolvingModules: Set<string>;
|
||||
moduleExecutionInfo: Map<string, any>;
|
||||
onCancel: (listener: (reason: CancelReason) => unknown) => void;
|
||||
onCleanup: (listener: () => unknown) => void;
|
||||
providedContext: Record<string, any>;
|
||||
durations: {
|
||||
environment: number;
|
||||
prepare: number;
|
||||
};
|
||||
onFilterStackTrace?: (trace: string) => string;
|
||||
}
|
||||
|
||||
export type { BirpcOptions as B, ContextRPC as C, TestExecutionMethod as T, WorkerGlobalState as W, WorkerSetupContext as a, BirpcReturn as b, ContextTestEnvironment as c, WorkerExecuteContext as d, WorkerTestEnvironment as e };
|
||||
28
node_modules/vitest/dist/cli.js
generated
vendored
Normal file
28
node_modules/vitest/dist/cli.js
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
import { c as createCLI } from './chunks/cac.BNNpZQl7.js';
|
||||
import '@vitest/utils/helpers';
|
||||
import 'events';
|
||||
import 'pathe';
|
||||
import 'tinyrainbow';
|
||||
import './chunks/constants.D_Q9UYh-.js';
|
||||
import './chunks/index.456_DGfR.js';
|
||||
import 'node:fs';
|
||||
import 'node:fs/promises';
|
||||
import 'node:perf_hooks';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/utils/source-map';
|
||||
import './chunks/env.D4Lgay0q.js';
|
||||
import 'std-env';
|
||||
import 'node:util';
|
||||
import 'node:console';
|
||||
import 'node:stream';
|
||||
import '@vitest/utils/display';
|
||||
import 'node:os';
|
||||
import 'tinyexec';
|
||||
import './path.js';
|
||||
import 'node:path';
|
||||
import 'node:url';
|
||||
import 'vite';
|
||||
import '@vitest/utils/offset';
|
||||
import 'node:module';
|
||||
|
||||
createCLI().parse();
|
||||
94
node_modules/vitest/dist/config.cjs
generated
vendored
Normal file
94
node_modules/vitest/dist/config.cjs
generated
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
'use strict';
|
||||
|
||||
var os = require('node:os');
|
||||
var stdEnv = require('std-env');
|
||||
var vite = require('vite');
|
||||
|
||||
const isNode = typeof process < "u" && typeof process.stdout < "u" && !process.versions?.deno && !globalThis.window;
|
||||
const isDeno = typeof process < "u" && typeof process.stdout < "u" && process.versions?.deno !== void 0;
|
||||
(isNode || isDeno) && process.platform === "win32";
|
||||
(isNode || isDeno) && process.stdout?.isTTY && !stdEnv.isCI;
|
||||
|
||||
// if changed, update also jsdocs and docs
|
||||
const defaultBrowserPort = 63315;
|
||||
|
||||
const defaultInclude = ["**/*.{test,spec}.?(c|m)[jt]s?(x)"];
|
||||
const defaultExclude = ["**/node_modules/**", "**/.git/**"];
|
||||
// These are the generic defaults for coverage. Providers may also set some provider specific defaults.
|
||||
const coverageConfigDefaults = {
|
||||
provider: "v8",
|
||||
enabled: false,
|
||||
clean: true,
|
||||
cleanOnRerun: true,
|
||||
reportsDirectory: "./coverage",
|
||||
exclude: [],
|
||||
reportOnFailure: false,
|
||||
reporter: [
|
||||
["text", {}],
|
||||
["html", {}],
|
||||
["clover", {}],
|
||||
["json", {}]
|
||||
],
|
||||
allowExternal: false,
|
||||
excludeAfterRemap: false,
|
||||
processingConcurrency: Math.min(20, os.availableParallelism?.() ?? os.cpus().length)
|
||||
};
|
||||
const fakeTimersDefaults = {
|
||||
loopLimit: 1e4,
|
||||
shouldClearNativeTimers: true
|
||||
};
|
||||
const configDefaults = Object.freeze({
|
||||
allowOnly: !stdEnv.isCI,
|
||||
isolate: true,
|
||||
watch: !stdEnv.isCI && process.stdin.isTTY,
|
||||
globals: false,
|
||||
environment: "node",
|
||||
clearMocks: false,
|
||||
restoreMocks: false,
|
||||
mockReset: false,
|
||||
unstubGlobals: false,
|
||||
unstubEnvs: false,
|
||||
include: defaultInclude,
|
||||
exclude: defaultExclude,
|
||||
teardownTimeout: 1e4,
|
||||
forceRerunTriggers: ["**/package.json/**", "**/{vitest,vite}.config.*/**"],
|
||||
update: false,
|
||||
reporters: [],
|
||||
silent: false,
|
||||
hideSkippedTests: false,
|
||||
api: false,
|
||||
ui: false,
|
||||
uiBase: "/__vitest__/",
|
||||
open: !stdEnv.isCI,
|
||||
css: { include: [] },
|
||||
coverage: coverageConfigDefaults,
|
||||
fakeTimers: fakeTimersDefaults,
|
||||
maxConcurrency: 5,
|
||||
dangerouslyIgnoreUnhandledErrors: false,
|
||||
typecheck: {
|
||||
checker: "tsc",
|
||||
include: ["**/*.{test,spec}-d.?(c|m)[jt]s?(x)"],
|
||||
exclude: defaultExclude
|
||||
},
|
||||
slowTestThreshold: 300,
|
||||
disableConsoleIntercept: false
|
||||
});
|
||||
|
||||
function defineConfig(config) {
|
||||
return config;
|
||||
}
|
||||
function defineProject(config) {
|
||||
return config;
|
||||
}
|
||||
|
||||
Object.defineProperty(exports, "mergeConfig", {
|
||||
enumerable: true,
|
||||
get: function () { return vite.mergeConfig; }
|
||||
});
|
||||
exports.configDefaults = configDefaults;
|
||||
exports.coverageConfigDefaults = coverageConfigDefaults;
|
||||
exports.defaultBrowserPort = defaultBrowserPort;
|
||||
exports.defaultExclude = defaultExclude;
|
||||
exports.defaultInclude = defaultInclude;
|
||||
exports.defineConfig = defineConfig;
|
||||
exports.defineProject = defineProject;
|
||||
104
node_modules/vitest/dist/config.d.ts
generated
vendored
Normal file
104
node_modules/vitest/dist/config.d.ts
generated
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
import { HookHandler, ConfigEnv, UserConfig } from 'vite';
|
||||
export { ConfigEnv, Plugin, UserConfig as ViteUserConfig, mergeConfig } from 'vite';
|
||||
import { I as InlineConfig, c as CoverageV8Options, R as ResolvedCoverageOptions, U as UserWorkspaceConfig, d as UserProjectConfigFn, e as UserProjectConfigExport } from './chunks/reporters.d.OXEK7y4s.js';
|
||||
export { b as TestProjectConfiguration, g as TestProjectInlineConfiguration, f as TestUserConfig, W as WatcherTriggerPattern } from './chunks/reporters.d.OXEK7y4s.js';
|
||||
import { V as VitestPluginContext } from './chunks/plugin.d.CY7CUjf-.js';
|
||||
import { F as FakeTimerInstallOpts } from './chunks/config.d.CzIjkicf.js';
|
||||
import '@vitest/runner';
|
||||
import '@vitest/utils';
|
||||
import './chunks/rpc.d.RH3apGEf.js';
|
||||
import '@vitest/snapshot';
|
||||
import 'vite/module-runner';
|
||||
import './chunks/traces.d.402V_yFI.js';
|
||||
import 'node:stream';
|
||||
import './chunks/browser.d.DBzUq_Na.js';
|
||||
import './chunks/worker.d.B4A26qg6.js';
|
||||
import './chunks/environment.d.CrsxCzP1.js';
|
||||
import '@vitest/mocker';
|
||||
import '@vitest/utils/source-map';
|
||||
import 'vitest/browser';
|
||||
import '@vitest/pretty-format';
|
||||
import '@vitest/utils/diff';
|
||||
import '@vitest/expect';
|
||||
import 'vitest/optional-types.js';
|
||||
import './chunks/benchmark.d.DAaHLpsq.js';
|
||||
import '@vitest/runner/utils';
|
||||
import 'tinybench';
|
||||
import './chunks/coverage.d.BZtK59WP.js';
|
||||
import '@vitest/snapshot/manager';
|
||||
import 'node:console';
|
||||
import 'node:fs';
|
||||
|
||||
type VitestInlineConfig = InlineConfig;
|
||||
declare module "vite" {
|
||||
interface UserConfig {
|
||||
/**
|
||||
* Options for Vitest
|
||||
*/
|
||||
test?: VitestInlineConfig;
|
||||
}
|
||||
interface Plugin<A = any> {
|
||||
configureVitest?: HookHandler<(context: VitestPluginContext) => void>;
|
||||
}
|
||||
}
|
||||
|
||||
declare const defaultBrowserPort = 63315;
|
||||
|
||||
declare const defaultInclude: string[];
|
||||
declare const defaultExclude: string[];
|
||||
declare const coverageConfigDefaults: ResolvedCoverageOptions;
|
||||
declare const configDefaults: Readonly<{
|
||||
allowOnly: boolean;
|
||||
isolate: boolean;
|
||||
watch: boolean;
|
||||
globals: boolean;
|
||||
environment: "node";
|
||||
clearMocks: boolean;
|
||||
restoreMocks: boolean;
|
||||
mockReset: boolean;
|
||||
unstubGlobals: boolean;
|
||||
unstubEnvs: boolean;
|
||||
include: string[];
|
||||
exclude: string[];
|
||||
teardownTimeout: number;
|
||||
forceRerunTriggers: string[];
|
||||
update: boolean;
|
||||
reporters: never[];
|
||||
silent: boolean;
|
||||
hideSkippedTests: boolean;
|
||||
api: boolean;
|
||||
ui: boolean;
|
||||
uiBase: string;
|
||||
open: boolean;
|
||||
css: {
|
||||
include: never[];
|
||||
};
|
||||
coverage: CoverageV8Options;
|
||||
fakeTimers: FakeTimerInstallOpts;
|
||||
maxConcurrency: number;
|
||||
dangerouslyIgnoreUnhandledErrors: boolean;
|
||||
typecheck: {
|
||||
checker: "tsc";
|
||||
include: string[];
|
||||
exclude: string[];
|
||||
};
|
||||
slowTestThreshold: number;
|
||||
disableConsoleIntercept: boolean;
|
||||
}>;
|
||||
|
||||
type ViteUserConfigFnObject = (env: ConfigEnv) => UserConfig;
|
||||
type ViteUserConfigFnPromise = (env: ConfigEnv) => Promise<UserConfig>;
|
||||
type ViteUserConfigFn = (env: ConfigEnv) => UserConfig | Promise<UserConfig>;
|
||||
type ViteUserConfigExport = UserConfig | Promise<UserConfig> | ViteUserConfigFnObject | ViteUserConfigFnPromise | ViteUserConfigFn;
|
||||
declare function defineConfig(config: UserConfig): UserConfig;
|
||||
declare function defineConfig(config: Promise<UserConfig>): Promise<UserConfig>;
|
||||
declare function defineConfig(config: ViteUserConfigFnObject): ViteUserConfigFnObject;
|
||||
declare function defineConfig(config: ViteUserConfigFnPromise): ViteUserConfigFnPromise;
|
||||
declare function defineConfig(config: ViteUserConfigExport): ViteUserConfigExport;
|
||||
declare function defineProject(config: UserWorkspaceConfig): UserWorkspaceConfig;
|
||||
declare function defineProject(config: Promise<UserWorkspaceConfig>): Promise<UserWorkspaceConfig>;
|
||||
declare function defineProject(config: UserProjectConfigFn): UserProjectConfigFn;
|
||||
declare function defineProject(config: UserProjectConfigExport): UserProjectConfigExport;
|
||||
|
||||
export { UserProjectConfigExport, UserProjectConfigFn, UserWorkspaceConfig, configDefaults, coverageConfigDefaults, defaultBrowserPort, defaultExclude, defaultInclude, defineConfig, defineProject };
|
||||
export type { ViteUserConfigExport, ViteUserConfigFn, ViteUserConfigFnObject, ViteUserConfigFnPromise };
|
||||
15
node_modules/vitest/dist/config.js
generated
vendored
Normal file
15
node_modules/vitest/dist/config.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
export { c as configDefaults, a as coverageConfigDefaults, d as defaultExclude, b as defaultInclude } from './chunks/defaults.BOqNVLsY.js';
|
||||
export { mergeConfig } from 'vite';
|
||||
export { d as defaultBrowserPort } from './chunks/constants.D_Q9UYh-.js';
|
||||
import 'node:os';
|
||||
import './chunks/env.D4Lgay0q.js';
|
||||
import 'std-env';
|
||||
|
||||
function defineConfig(config) {
|
||||
return config;
|
||||
}
|
||||
function defineProject(config) {
|
||||
return config;
|
||||
}
|
||||
|
||||
export { defineConfig, defineProject };
|
||||
118
node_modules/vitest/dist/coverage.d.ts
generated
vendored
Normal file
118
node_modules/vitest/dist/coverage.d.ts
generated
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
import { R as ResolvedCoverageOptions, V as Vitest, C as CoverageMap, a as ReportContext } from './chunks/reporters.d.OXEK7y4s.js';
|
||||
import { TransformResult } from 'vite';
|
||||
import { A as AfterSuiteRunMeta } from './chunks/rpc.d.RH3apGEf.js';
|
||||
import '@vitest/runner';
|
||||
import '@vitest/utils';
|
||||
import 'node:stream';
|
||||
import './chunks/browser.d.DBzUq_Na.js';
|
||||
import './chunks/worker.d.B4A26qg6.js';
|
||||
import 'vite/module-runner';
|
||||
import './chunks/config.d.CzIjkicf.js';
|
||||
import '@vitest/pretty-format';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/diff';
|
||||
import './chunks/environment.d.CrsxCzP1.js';
|
||||
import '@vitest/mocker';
|
||||
import '@vitest/utils/source-map';
|
||||
import 'vitest/browser';
|
||||
import '@vitest/expect';
|
||||
import 'vitest/optional-types.js';
|
||||
import './chunks/traces.d.402V_yFI.js';
|
||||
import './chunks/benchmark.d.DAaHLpsq.js';
|
||||
import '@vitest/runner/utils';
|
||||
import 'tinybench';
|
||||
import './chunks/coverage.d.BZtK59WP.js';
|
||||
import '@vitest/snapshot/manager';
|
||||
import 'node:console';
|
||||
import 'node:fs';
|
||||
|
||||
type Threshold = "lines" | "functions" | "statements" | "branches";
|
||||
interface ResolvedThreshold {
|
||||
coverageMap: CoverageMap;
|
||||
name: string;
|
||||
thresholds: Partial<Record<Threshold, number | undefined>>;
|
||||
}
|
||||
/**
|
||||
* Holds info about raw coverage results that are stored on file system:
|
||||
*
|
||||
* ```json
|
||||
* "project-a": {
|
||||
* "web": {
|
||||
* "tests/math.test.ts": "coverage-1.json",
|
||||
* "tests/utils.test.ts": "coverage-2.json",
|
||||
* // ^^^^^^^^^^^^^^^ Raw coverage on file system
|
||||
* },
|
||||
* "ssr": { ... },
|
||||
* "browser": { ... },
|
||||
* },
|
||||
* "project-b": ...
|
||||
* ```
|
||||
*/
|
||||
type CoverageFiles = Map<NonNullable<AfterSuiteRunMeta["projectName"]> | symbol, Record<AfterSuiteRunMeta["environment"], {
|
||||
[TestFilenames: string]: string;
|
||||
}>>;
|
||||
declare class BaseCoverageProvider<Options extends ResolvedCoverageOptions<"istanbul" | "v8">> {
|
||||
ctx: Vitest;
|
||||
readonly name: "v8" | "istanbul";
|
||||
version: string;
|
||||
options: Options;
|
||||
globCache: Map<string, boolean>;
|
||||
coverageFiles: CoverageFiles;
|
||||
pendingPromises: Promise<void>[];
|
||||
coverageFilesDirectory: string;
|
||||
roots: string[];
|
||||
_initialize(ctx: Vitest): void;
|
||||
/**
|
||||
* Check if file matches `coverage.include` but not `coverage.exclude`
|
||||
*/
|
||||
isIncluded(_filename: string, root?: string): boolean;
|
||||
private getUntestedFilesByRoot;
|
||||
getUntestedFiles(testedFiles: string[]): Promise<string[]>;
|
||||
createCoverageMap(): CoverageMap;
|
||||
generateReports(_: CoverageMap, __: boolean | undefined): Promise<void>;
|
||||
parseConfigModule(_: string): Promise<{
|
||||
generate: () => {
|
||||
code: string;
|
||||
};
|
||||
}>;
|
||||
resolveOptions(): Options;
|
||||
clean(clean?: boolean): Promise<void>;
|
||||
onAfterSuiteRun({ coverage, environment, projectName, testFiles }: AfterSuiteRunMeta): void;
|
||||
readCoverageFiles<CoverageType>({ onFileRead, onFinished, onDebug }: {
|
||||
/** Callback invoked with a single coverage result */
|
||||
onFileRead: (data: CoverageType) => void;
|
||||
/** Callback invoked once all results of a project for specific transform mode are read */
|
||||
onFinished: (project: Vitest["projects"][number], environment: string) => Promise<void>;
|
||||
onDebug: ((...logs: any[]) => void) & {
|
||||
enabled: boolean;
|
||||
};
|
||||
}): Promise<void>;
|
||||
cleanAfterRun(): Promise<void>;
|
||||
onTestFailure(): Promise<void>;
|
||||
reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext): Promise<void>;
|
||||
reportThresholds(coverageMap: CoverageMap, allTestsRun: boolean | undefined): Promise<void>;
|
||||
/**
|
||||
* Constructs collected coverage and users' threshold options into separate sets
|
||||
* where each threshold set holds their own coverage maps. Threshold set is either
|
||||
* for specific files defined by glob pattern or global for all other files.
|
||||
*/
|
||||
private resolveThresholds;
|
||||
/**
|
||||
* Check collected coverage against configured thresholds. Sets exit code to 1 when thresholds not reached.
|
||||
*/
|
||||
private checkThresholds;
|
||||
/**
|
||||
* Check if current coverage is above configured thresholds and bump the thresholds if needed
|
||||
*/
|
||||
updateThresholds({ thresholds: allThresholds, onUpdate, configurationFile }: {
|
||||
thresholds: ResolvedThreshold[];
|
||||
configurationFile: unknown;
|
||||
onUpdate: () => void;
|
||||
}): Promise<void>;
|
||||
mergeReports(coverageMaps: unknown[]): Promise<void>;
|
||||
hasTerminalReporter(reporters: ResolvedCoverageOptions["reporter"]): boolean;
|
||||
toSlices<T>(array: T[], size: number): T[][];
|
||||
createUncoveredFileTransformer(ctx: Vitest): (filename: string) => Promise<TransformResult | null | undefined>;
|
||||
}
|
||||
|
||||
export { BaseCoverageProvider };
|
||||
23
node_modules/vitest/dist/coverage.js
generated
vendored
Normal file
23
node_modules/vitest/dist/coverage.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
export { B as BaseCoverageProvider } from './chunks/coverage.CtyeYmKM.js';
|
||||
import 'node:fs';
|
||||
import 'node:path';
|
||||
import '@vitest/utils/helpers';
|
||||
import 'pathe';
|
||||
import 'picomatch';
|
||||
import 'tinyglobby';
|
||||
import 'tinyrainbow';
|
||||
import './chunks/defaults.BOqNVLsY.js';
|
||||
import 'node:os';
|
||||
import './chunks/env.D4Lgay0q.js';
|
||||
import 'std-env';
|
||||
import 'node:crypto';
|
||||
import 'node:url';
|
||||
import 'node:module';
|
||||
import 'node:process';
|
||||
import 'node:fs/promises';
|
||||
import 'node:assert';
|
||||
import 'node:v8';
|
||||
import 'node:util';
|
||||
import 'vite';
|
||||
import './chunks/constants.D_Q9UYh-.js';
|
||||
import './chunks/coverage.D_JHT54q.js';
|
||||
22
node_modules/vitest/dist/environments.d.ts
generated
vendored
Normal file
22
node_modules/vitest/dist/environments.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
import { E as Environment } from './chunks/environment.d.CrsxCzP1.js';
|
||||
export { a as EnvironmentReturn, V as VmEnvironmentReturn } from './chunks/environment.d.CrsxCzP1.js';
|
||||
import '@vitest/utils';
|
||||
|
||||
declare const environments: {
|
||||
"node": Environment;
|
||||
"jsdom": Environment;
|
||||
"happy-dom": Environment;
|
||||
"edge-runtime": Environment;
|
||||
};
|
||||
|
||||
interface PopulateOptions {
|
||||
bindFunctions?: boolean;
|
||||
additionalKeys?: string[];
|
||||
}
|
||||
declare function populateGlobal(global: any, win: any, options?: PopulateOptions): {
|
||||
keys: Set<string>;
|
||||
skipKeys: string[];
|
||||
originals: Map<string | symbol, any>;
|
||||
};
|
||||
|
||||
export { Environment, environments as builtinEnvironments, populateGlobal };
|
||||
3
node_modules/vitest/dist/environments.js
generated
vendored
Normal file
3
node_modules/vitest/dist/environments.js
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export { e as builtinEnvironments, p as populateGlobal } from './chunks/index.BspFP3mn.js';
|
||||
import 'node:url';
|
||||
import 'node:console';
|
||||
510
node_modules/vitest/dist/index.d.ts
generated
vendored
Normal file
510
node_modules/vitest/dist/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,510 @@
|
||||
import { M as ModuleDefinitionDurationsDiagnostic, U as UntrackedModuleDefinitionDiagnostic, S as SerializedTestSpecification, a as ModuleDefinitionDiagnostic, b as ModuleDefinitionLocation, c as SourceModuleDiagnostic, d as SourceModuleLocations } from './chunks/browser.d.DBzUq_Na.js';
|
||||
export { B as BrowserTesterOptions } from './chunks/browser.d.DBzUq_Na.js';
|
||||
import './chunks/global.d.B15mdLcR.js';
|
||||
import { File, TestAnnotation, TestArtifact, TaskResultPack, TaskEventPack, Test, TaskPopulated } from '@vitest/runner';
|
||||
export { CancelReason, ImportDuration, OnTestFailedHandler, OnTestFinishedHandler, RunMode, Task as RunnerTask, TaskBase as RunnerTaskBase, TaskEventPack as RunnerTaskEventPack, TaskResult as RunnerTaskResult, TaskResultPack as RunnerTaskResultPack, Test as RunnerTestCase, File as RunnerTestFile, Suite as RunnerTestSuite, SuiteAPI, SuiteCollector, SuiteFactory, TaskCustomOptions, TaskMeta, TaskState, TestAPI, TestAnnotation, TestAnnotationArtifact, TestArtifact, TestArtifactBase, TestArtifactLocation, TestArtifactRegistry, TestAttachment, TestContext, TestFunction, TestOptions, afterAll, afterEach, beforeAll, beforeEach, describe, it, onTestFailed, onTestFinished, recordArtifact, suite, test } from '@vitest/runner';
|
||||
import { Awaitable } from '@vitest/utils';
|
||||
export { ParsedStack, SerializedError, TestError } from '@vitest/utils';
|
||||
import { b as BirpcReturn } from './chunks/worker.d.B4A26qg6.js';
|
||||
export { C as ContextRPC, c as ContextTestEnvironment, T as TestExecutionMethod, W as WorkerGlobalState } from './chunks/worker.d.B4A26qg6.js';
|
||||
import { S as SerializedConfig, F as FakeTimerInstallOpts, R as RuntimeOptions } from './chunks/config.d.CzIjkicf.js';
|
||||
export { b as RuntimeConfig, a as SerializedCoverageConfig } from './chunks/config.d.CzIjkicf.js';
|
||||
import { U as UserConsoleLog, L as LabelColor, M as ModuleGraphData, P as ProvidedContext } from './chunks/rpc.d.RH3apGEf.js';
|
||||
export { A as AfterSuiteRunMeta, a as RunnerRPC, R as RuntimeRPC } from './chunks/rpc.d.RH3apGEf.js';
|
||||
import { ExpectStatic } from '@vitest/expect';
|
||||
export { Assertion, AsymmetricMatchersContaining, DeeplyAllowMatchers, ExpectPollOptions, ExpectStatic, JestAssertion, Matchers, chai } from '@vitest/expect';
|
||||
import { spyOn, fn, MaybeMockedDeep, MaybeMocked, MaybePartiallyMocked, MaybePartiallyMockedDeep, MockInstance } from '@vitest/spy';
|
||||
export { Mock, MockContext, MockInstance, MockResult, MockResultIncomplete, MockResultReturn, MockResultThrow, MockSettledResult, MockSettledResultFulfilled, MockSettledResultIncomplete, MockSettledResultRejected, Mocked, MockedClass, MockedFunction, MockedObject } from '@vitest/spy';
|
||||
export { b as bench } from './chunks/suite.d.BJWk38HB.js';
|
||||
export { V as EvaluatedModules } from './chunks/evaluatedModules.d.BxJ5omdx.js';
|
||||
export { a as BenchFunction, b as Benchmark, c as BenchmarkAPI, B as BenchmarkResult } from './chunks/benchmark.d.DAaHLpsq.js';
|
||||
export { ExpectTypeOf, expectTypeOf } from 'expect-type';
|
||||
export { SnapshotData, SnapshotMatchOptions, SnapshotResult, SnapshotSerializer, SnapshotStateOptions, SnapshotSummary, SnapshotUpdateState, UncheckedSnapshot } from '@vitest/snapshot';
|
||||
export { DiffOptions } from '@vitest/utils/diff';
|
||||
export { Bench as BenchFactory, Options as BenchOptions, Task as BenchTask, TaskResult as BenchTaskResult } from 'tinybench';
|
||||
import '@vitest/pretty-format';
|
||||
import 'vite/module-runner';
|
||||
import './chunks/environment.d.CrsxCzP1.js';
|
||||
import './chunks/traces.d.402V_yFI.js';
|
||||
import '@vitest/runner/utils';
|
||||
|
||||
interface SourceMap {
|
||||
file: string;
|
||||
mappings: string;
|
||||
names: string[];
|
||||
sources: string[];
|
||||
sourcesContent?: string[];
|
||||
version: number;
|
||||
toString: () => string;
|
||||
toUrl: () => string;
|
||||
}
|
||||
interface ExternalResult {
|
||||
source?: string;
|
||||
}
|
||||
interface TransformResultWithSource {
|
||||
code: string;
|
||||
map: SourceMap | {
|
||||
mappings: "";
|
||||
} | null;
|
||||
etag?: string;
|
||||
deps?: string[];
|
||||
dynamicDeps?: string[];
|
||||
source?: string;
|
||||
transformTime?: number;
|
||||
modules?: ModuleDefinitionDurationsDiagnostic[];
|
||||
untrackedModules?: UntrackedModuleDefinitionDiagnostic[];
|
||||
}
|
||||
interface WebSocketHandlers {
|
||||
onTaskUpdate: (packs: TaskResultPack[], events: TaskEventPack[]) => void;
|
||||
getFiles: () => File[];
|
||||
getTestFiles: () => Promise<SerializedTestSpecification[]>;
|
||||
getPaths: () => string[];
|
||||
getConfig: () => SerializedConfig;
|
||||
getResolvedProjectLabels: () => {
|
||||
name: string;
|
||||
color?: LabelColor;
|
||||
}[];
|
||||
getModuleGraph: (projectName: string, id: string, browser?: boolean) => Promise<ModuleGraphData>;
|
||||
getTransformResult: (projectName: string, id: string, testFileId: string, browser?: boolean) => Promise<TransformResultWithSource | undefined>;
|
||||
getExternalResult: (id: string, testFileId: string) => Promise<ExternalResult | undefined>;
|
||||
readTestFile: (id: string) => Promise<string | null>;
|
||||
saveTestFile: (id: string, content: string) => Promise<void>;
|
||||
rerun: (files: string[], resetTestNamePattern?: boolean) => Promise<void>;
|
||||
rerunTask: (id: string) => Promise<void>;
|
||||
updateSnapshot: (file?: File) => Promise<void>;
|
||||
getUnhandledErrors: () => unknown[];
|
||||
}
|
||||
interface WebSocketEvents {
|
||||
onCollected?: (files?: File[]) => Awaitable<void>;
|
||||
onFinished?: (files: File[], errors: unknown[], coverage?: unknown, executionTime?: number) => Awaitable<void>;
|
||||
onTestAnnotate?: (testId: string, annotation: TestAnnotation) => Awaitable<void>;
|
||||
onTestArtifactRecord?: (testId: string, artifact: TestArtifact) => Awaitable<void>;
|
||||
onTaskUpdate?: (packs: TaskResultPack[], events: TaskEventPack[]) => Awaitable<void>;
|
||||
onUserConsoleLog?: (log: UserConsoleLog) => Awaitable<void>;
|
||||
onPathsCollected?: (paths?: string[]) => Awaitable<void>;
|
||||
onSpecsCollected?: (specs?: SerializedTestSpecification[], startTime?: number) => Awaitable<void>;
|
||||
onFinishedReportCoverage: () => void;
|
||||
}
|
||||
type WebSocketRPC = BirpcReturn<WebSocketEvents, WebSocketHandlers>;
|
||||
|
||||
declare function createExpect(test?: Test | TaskPopulated): ExpectStatic;
|
||||
declare const globalExpect: ExpectStatic;
|
||||
declare const assert: Chai.Assert;
|
||||
declare const should: () => Chai.Should;
|
||||
|
||||
/**
|
||||
* Gives access to injected context provided from the main thread.
|
||||
* This usually returns a value provided by `globalSetup` or an external library.
|
||||
*/
|
||||
declare function inject<T extends keyof ProvidedContext & string>(key: T): ProvidedContext[T];
|
||||
|
||||
type Promisable<T> = T | Promise<T>;
|
||||
type MockFactoryWithHelper<M = unknown> = (importOriginal: <T extends M = M>() => Promise<T>) => Promisable<Partial<M>>;
|
||||
interface MockOptions {
|
||||
spy?: boolean;
|
||||
}
|
||||
|
||||
type WaitForCallback<T> = () => T | Promise<T>;
|
||||
interface WaitForOptions {
|
||||
/**
|
||||
* @description Time in ms between each check callback
|
||||
* @default 50ms
|
||||
*/
|
||||
interval?: number;
|
||||
/**
|
||||
* @description Time in ms after which the throw a timeout error
|
||||
* @default 1000ms
|
||||
*/
|
||||
timeout?: number;
|
||||
}
|
||||
declare function waitFor<T>(callback: WaitForCallback<T>, options?: number | WaitForOptions): Promise<T>;
|
||||
type WaitUntilCallback<T> = () => T | Promise<T>;
|
||||
interface WaitUntilOptions extends Pick<WaitForOptions, "interval" | "timeout"> {}
|
||||
type Truthy<T> = T extends false | "" | 0 | null | undefined ? never : T;
|
||||
declare function waitUntil<T>(callback: WaitUntilCallback<T>, options?: number | WaitUntilOptions): Promise<Truthy<T>>;
|
||||
|
||||
type ESModuleExports = Record<string, unknown>;
|
||||
interface VitestUtils {
|
||||
/**
|
||||
* Checks if fake timers are enabled.
|
||||
*/
|
||||
isFakeTimers: () => boolean;
|
||||
/**
|
||||
* This method wraps all further calls to timers until [`vi.useRealTimers()`](https://vitest.dev/api/vi#vi-userealtimers) is called.
|
||||
*/
|
||||
useFakeTimers: (config?: FakeTimerInstallOpts) => VitestUtils;
|
||||
/**
|
||||
* Restores mocked timers to their original implementations. All timers that were scheduled before will be discarded.
|
||||
*/
|
||||
useRealTimers: () => VitestUtils;
|
||||
/**
|
||||
* This method will call every timer that was initiated after [`vi.useFakeTimers`](https://vitest.dev/api/vi#vi-usefaketimers) call.
|
||||
* It will not fire any timer that was initiated during its call.
|
||||
*/
|
||||
runOnlyPendingTimers: () => VitestUtils;
|
||||
/**
|
||||
* This method will asynchronously call every timer that was initiated after [`vi.useFakeTimers`](https://vitest.dev/api/vi#vi-usefaketimers) call, even asynchronous ones.
|
||||
* It will not fire any timer that was initiated during its call.
|
||||
*/
|
||||
runOnlyPendingTimersAsync: () => Promise<VitestUtils>;
|
||||
/**
|
||||
* This method will invoke every initiated timer until the timer queue is empty. It means that every timer called during `runAllTimers` will be fired.
|
||||
* If you have an infinite interval, it will throw after 10,000 tries (can be configured with [`fakeTimers.loopLimit`](https://vitest.dev/config/#faketimers-looplimit)).
|
||||
*/
|
||||
runAllTimers: () => VitestUtils;
|
||||
/**
|
||||
* This method will asynchronously invoke every initiated timer until the timer queue is empty. It means that every timer called during `runAllTimersAsync` will be fired even asynchronous timers.
|
||||
* If you have an infinite interval, it will throw after 10 000 tries (can be configured with [`fakeTimers.loopLimit`](https://vitest.dev/config/#faketimers-looplimit)).
|
||||
*/
|
||||
runAllTimersAsync: () => Promise<VitestUtils>;
|
||||
/**
|
||||
* Calls every microtask that was queued by `process.nextTick`. This will also run all microtasks scheduled by themselves.
|
||||
*/
|
||||
runAllTicks: () => VitestUtils;
|
||||
/**
|
||||
* This method will invoke every initiated timer until the specified number of milliseconds is passed or the queue is empty - whatever comes first.
|
||||
*/
|
||||
advanceTimersByTime: (ms: number) => VitestUtils;
|
||||
/**
|
||||
* This method will invoke every initiated timer until the specified number of milliseconds is passed or the queue is empty - whatever comes first. This will include and await asynchronously set timers.
|
||||
*/
|
||||
advanceTimersByTimeAsync: (ms: number) => Promise<VitestUtils>;
|
||||
/**
|
||||
* Will call next available timer. Useful to make assertions between each timer call. You can chain call it to manage timers by yourself.
|
||||
*/
|
||||
advanceTimersToNextTimer: () => VitestUtils;
|
||||
/**
|
||||
* Will call next available timer and wait until it's resolved if it was set asynchronously. Useful to make assertions between each timer call.
|
||||
*/
|
||||
advanceTimersToNextTimerAsync: () => Promise<VitestUtils>;
|
||||
/**
|
||||
* Similar to [`vi.advanceTimersByTime`](https://vitest.dev/api/vi#vi-advancetimersbytime), but will advance timers by the milliseconds needed to execute callbacks currently scheduled with `requestAnimationFrame`.
|
||||
*/
|
||||
advanceTimersToNextFrame: () => VitestUtils;
|
||||
/**
|
||||
* Get the number of waiting timers.
|
||||
*/
|
||||
getTimerCount: () => number;
|
||||
/**
|
||||
* If fake timers are enabled, this method simulates a user changing the system clock (will affect date related API like `hrtime`, `performance.now` or `new Date()`) - however, it will not fire any timers.
|
||||
* If fake timers are not enabled, this method will only mock `Date.*` and `new Date()` calls.
|
||||
*/
|
||||
setSystemTime: (time: number | string | Date) => VitestUtils;
|
||||
/**
|
||||
* Returns mocked current date. If date is not mocked the method will return `null`.
|
||||
*/
|
||||
getMockedSystemTime: () => Date | null;
|
||||
/**
|
||||
* When using `vi.useFakeTimers`, `Date.now` calls are mocked. If you need to get real time in milliseconds, you can call this function.
|
||||
*/
|
||||
getRealSystemTime: () => number;
|
||||
/**
|
||||
* Removes all timers that are scheduled to run. These timers will never run in the future.
|
||||
*/
|
||||
clearAllTimers: () => VitestUtils;
|
||||
/**
|
||||
* Creates a spy on a method or getter/setter of an object similar to [`vi.fn()`](https://vitest.dev/api/vi#vi-fn). It returns a [mock function](https://vitest.dev/api/mock).
|
||||
* @example
|
||||
* ```ts
|
||||
* const cart = {
|
||||
* getApples: () => 42
|
||||
* }
|
||||
*
|
||||
* const spy = vi.spyOn(cart, 'getApples').mockReturnValue(10)
|
||||
*
|
||||
* expect(cart.getApples()).toBe(10)
|
||||
* expect(spy).toHaveBeenCalled()
|
||||
* expect(spy).toHaveReturnedWith(10)
|
||||
* ```
|
||||
*/
|
||||
spyOn: typeof spyOn;
|
||||
/**
|
||||
* Creates a spy on a function, though can be initiated without one. Every time a function is invoked, it stores its call arguments, returns, and instances. Also, you can manipulate its behavior with [methods](https://vitest.dev/api/mock).
|
||||
*
|
||||
* If no function is given, mock will return `undefined`, when invoked.
|
||||
* @example
|
||||
* ```ts
|
||||
* const getApples = vi.fn(() => 0)
|
||||
*
|
||||
* getApples()
|
||||
*
|
||||
* expect(getApples).toHaveBeenCalled()
|
||||
* expect(getApples).toHaveReturnedWith(0)
|
||||
*
|
||||
* getApples.mockReturnValueOnce(5)
|
||||
*
|
||||
* expect(getApples()).toBe(5)
|
||||
* expect(getApples).toHaveNthReturnedWith(2, 5)
|
||||
* ```
|
||||
*/
|
||||
fn: typeof fn;
|
||||
/**
|
||||
* Wait for the callback to execute successfully. If the callback throws an error or returns a rejected promise it will continue to wait until it succeeds or times out.
|
||||
*
|
||||
* This is very useful when you need to wait for some asynchronous action to complete, for example, when you start a server and need to wait for it to start.
|
||||
* @example
|
||||
* ```ts
|
||||
* const server = createServer()
|
||||
*
|
||||
* await vi.waitFor(
|
||||
* () => {
|
||||
* if (!server.isReady)
|
||||
* throw new Error('Server not started')
|
||||
*
|
||||
* console.log('Server started')
|
||||
* }, {
|
||||
* timeout: 500, // default is 1000
|
||||
* interval: 20, // default is 50
|
||||
* }
|
||||
* )
|
||||
* ```
|
||||
*/
|
||||
waitFor: typeof waitFor;
|
||||
/**
|
||||
* This is similar to [`vi.waitFor`](https://vitest.dev/api/vi#vi-waitfor), but if the callback throws any errors, execution is immediately interrupted and an error message is received.
|
||||
*
|
||||
* If the callback returns a falsy value, the next check will continue until a truthy value is returned. This is useful when you need to wait for something to exist before taking the next step.
|
||||
* @example
|
||||
* ```ts
|
||||
* const element = await vi.waitUntil(
|
||||
* () => document.querySelector('.element'),
|
||||
* {
|
||||
* timeout: 500, // default is 1000
|
||||
* interval: 20, // default is 50
|
||||
* }
|
||||
* )
|
||||
*
|
||||
* // do something with the element
|
||||
* expect(element.querySelector('.element-child')).toBeTruthy()
|
||||
* ```
|
||||
*/
|
||||
waitUntil: typeof waitUntil;
|
||||
/**
|
||||
* Run the factory before imports are evaluated. You can return a value from the factory
|
||||
* to reuse it inside your [`vi.mock`](https://vitest.dev/api/vi#vi-mock) factory and tests.
|
||||
*
|
||||
* If used with [`vi.mock`](https://vitest.dev/api/vi#vi-mock), both will be hoisted in the order they are defined in.
|
||||
*/
|
||||
hoisted: <T>(factory: () => T) => T;
|
||||
/**
|
||||
* Mocks every import call to the module even if it was already statically imported.
|
||||
*
|
||||
* The call to `vi.mock` is hoisted to the top of the file, so you don't have access to variables declared in the global file scope
|
||||
* unless they are defined with [`vi.hoisted`](https://vitest.dev/api/vi#vi-hoisted) before this call.
|
||||
*
|
||||
* Mocking algorithm is described in [documentation](https://vitest.dev/guide/mocking/modules).
|
||||
* @param path Path to the module. Can be aliased, if your Vitest config supports it
|
||||
* @param factory Mocked module factory. The result of this function will be an exports object
|
||||
*/
|
||||
mock(path: string, factory?: MockFactoryWithHelper | MockOptions): void;
|
||||
mock<T>(module: Promise<T>, factory?: MockFactoryWithHelper<T> | MockOptions): void;
|
||||
/**
|
||||
* Removes module from mocked registry. All calls to import will return the original module even if it was mocked before.
|
||||
*
|
||||
* This call is hoisted to the top of the file, so it will only unmock modules that were defined in `setupFiles`, for example.
|
||||
* @param path Path to the module. Can be aliased, if your Vitest config supports it
|
||||
*/
|
||||
unmock(path: string): void;
|
||||
unmock(module: Promise<unknown>): void;
|
||||
/**
|
||||
* Mocks every subsequent [dynamic import](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import) call.
|
||||
*
|
||||
* Unlike [`vi.mock`](https://vitest.dev/api/vi#vi-mock), this method will not mock statically imported modules because it is not hoisted to the top of the file.
|
||||
*
|
||||
* Mocking algorithm is described in [documentation](https://vitest.dev/guide/mocking/modules).
|
||||
* @param path Path to the module. Can be aliased, if your Vitest config supports it
|
||||
* @param factory Mocked module factory. The result of this function will be an exports object
|
||||
*/
|
||||
doMock(path: string, factory?: MockFactoryWithHelper | MockOptions): void;
|
||||
doMock<T>(module: Promise<T>, factory?: MockFactoryWithHelper<T> | MockOptions): void;
|
||||
/**
|
||||
* Removes module from mocked registry. All subsequent calls to import will return original module.
|
||||
*
|
||||
* Unlike [`vi.unmock`](https://vitest.dev/api/vi#vi-unmock), this method is not hoisted to the top of the file.
|
||||
* @param path Path to the module. Can be aliased, if your Vitest config supports it
|
||||
*/
|
||||
doUnmock(path: string): void;
|
||||
doUnmock(module: Promise<unknown>): void;
|
||||
/**
|
||||
* Imports module, bypassing all checks if it should be mocked.
|
||||
* Can be useful if you want to mock module partially.
|
||||
* @example
|
||||
* ```ts
|
||||
* vi.mock('./example.js', async () => {
|
||||
* const axios = await vi.importActual<typeof import('./example.js')>('./example.js')
|
||||
*
|
||||
* return { ...axios, get: vi.fn() }
|
||||
* })
|
||||
* ```
|
||||
* @param path Path to the module. Can be aliased, if your config supports it
|
||||
*/
|
||||
importActual: <T = ESModuleExports>(path: string) => Promise<T>;
|
||||
/**
|
||||
* Imports a module with all of its properties and nested properties mocked.
|
||||
*
|
||||
* Mocking algorithm is described in [documentation](https://vitest.dev/guide/mocking/modules).
|
||||
* @example
|
||||
* ```ts
|
||||
* const example = await vi.importMock<typeof import('./example.js')>('./example.js')
|
||||
* example.calc.mockReturnValue(10)
|
||||
* expect(example.calc()).toBe(10)
|
||||
* ```
|
||||
* @param path Path to the module. Can be aliased, if your config supports it
|
||||
* @returns Fully mocked module
|
||||
*/
|
||||
importMock: <T = ESModuleExports>(path: string) => Promise<MaybeMockedDeep<T>>;
|
||||
/**
|
||||
* Deeply mocks properties and methods of a given object
|
||||
* in the same way as `vi.mock()` mocks module exports.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* const original = {
|
||||
* simple: () => 'value',
|
||||
* nested: {
|
||||
* method: () => 'real'
|
||||
* },
|
||||
* prop: 'foo',
|
||||
* }
|
||||
*
|
||||
* const mocked = vi.mockObject(original)
|
||||
* expect(mocked.simple()).toBe(undefined)
|
||||
* expect(mocked.nested.method()).toBe(undefined)
|
||||
* expect(mocked.prop).toBe('foo')
|
||||
*
|
||||
* mocked.simple.mockReturnValue('mocked')
|
||||
* mocked.nested.method.mockReturnValue('mocked nested')
|
||||
*
|
||||
* expect(mocked.simple()).toBe('mocked')
|
||||
* expect(mocked.nested.method()).toBe('mocked nested')
|
||||
*
|
||||
* const spied = vi.mockObject(original, { spy: true })
|
||||
* expect(spied.simple()).toBe('value')
|
||||
* expect(spied.simple).toHaveBeenCalled()
|
||||
* expect(spied.simple.mock.results[0]).toEqual({ type: 'return', value: 'value' })
|
||||
* ```
|
||||
*
|
||||
* @param value - The object to be mocked
|
||||
* @returns A deeply mocked version of the input object
|
||||
*/
|
||||
mockObject: <T>(value: T, options?: MockOptions) => MaybeMockedDeep<T>;
|
||||
/**
|
||||
* Type helper for TypeScript. Just returns the object that was passed.
|
||||
*
|
||||
* When `partial` is `true` it will expect a `Partial<T>` as a return value. By default, this will only make TypeScript believe that
|
||||
* the first level values are mocked. You can pass down `{ deep: true }` as a second argument to tell TypeScript that the whole object is mocked, if it actually is.
|
||||
* @example
|
||||
* ```ts
|
||||
* import example from './example.js'
|
||||
* vi.mock('./example.js')
|
||||
*
|
||||
* test('1 + 1 equals 10' async () => {
|
||||
* vi.mocked(example.calc).mockReturnValue(10)
|
||||
* expect(example.calc(1, '+', 1)).toBe(10)
|
||||
* })
|
||||
* ```
|
||||
* @param item Anything that can be mocked
|
||||
* @param deep If the object is deeply mocked
|
||||
* @param options If the object is partially or deeply mocked
|
||||
*/
|
||||
mocked: (<T>(item: T, deep?: false) => MaybeMocked<T>) & (<T>(item: T, deep: true) => MaybeMockedDeep<T>) & (<T>(item: T, options: {
|
||||
partial?: false;
|
||||
deep?: false;
|
||||
}) => MaybeMocked<T>) & (<T>(item: T, options: {
|
||||
partial?: false;
|
||||
deep: true;
|
||||
}) => MaybeMockedDeep<T>) & (<T>(item: T, options: {
|
||||
partial: true;
|
||||
deep?: false;
|
||||
}) => MaybePartiallyMocked<T>) & (<T>(item: T, options: {
|
||||
partial: true;
|
||||
deep: true;
|
||||
}) => MaybePartiallyMockedDeep<T>) & (<T>(item: T) => MaybeMocked<T>);
|
||||
/**
|
||||
* Checks that a given parameter is a mock function. If you are using TypeScript, it will also narrow down its type.
|
||||
*/
|
||||
isMockFunction: (fn: any) => fn is MockInstance;
|
||||
/**
|
||||
* Calls [`.mockClear()`](https://vitest.dev/api/mock#mockclear) on every mocked function.
|
||||
*
|
||||
* This will only empty `.mock` state, it will not affect mock implementations.
|
||||
*
|
||||
* This is useful if you need to clean up mocks between different assertions within a test.
|
||||
*/
|
||||
clearAllMocks: () => VitestUtils;
|
||||
/**
|
||||
* Calls [`.mockReset()`](https://vitest.dev/api/mock#mockreset) on every mocked function.
|
||||
*
|
||||
* This will empty `.mock` state, reset "once" implementations, and reset each mock's base implementation to its original.
|
||||
*
|
||||
* This is useful when you want to reset all mocks to their original states.
|
||||
*/
|
||||
resetAllMocks: () => VitestUtils;
|
||||
/**
|
||||
* Calls [`.mockRestore()`](https://vitest.dev/api/mock#mockrestore) on every mocked function.
|
||||
*
|
||||
* This will empty `.mock` state, restore all original mock implementations, and restore original descriptors of spied-on objects.
|
||||
*
|
||||
* This is useful for inter-test cleanup and/or removing mocks created by [`vi.spyOn(...)`](https://vitest.dev/api/vi#vi-spyon).
|
||||
*/
|
||||
restoreAllMocks: () => VitestUtils;
|
||||
/**
|
||||
* Makes value available on global namespace.
|
||||
* Useful, if you want to have global variables available, like `IntersectionObserver`.
|
||||
* You can return it back to original value with `vi.unstubAllGlobals`, or by enabling `unstubGlobals` config option.
|
||||
*/
|
||||
stubGlobal: (name: string | symbol | number, value: unknown) => VitestUtils;
|
||||
/**
|
||||
* Changes the value of `import.meta.env` and `process.env`.
|
||||
* You can return it back to original value with `vi.unstubAllEnvs`, or by enabling `unstubEnvs` config option.
|
||||
*/
|
||||
stubEnv: <T extends string>(name: T, value: T extends "PROD" | "DEV" | "SSR" ? boolean : string | undefined) => VitestUtils;
|
||||
/**
|
||||
* Reset the value to original value that was available before first `vi.stubGlobal` was called.
|
||||
*/
|
||||
unstubAllGlobals: () => VitestUtils;
|
||||
/**
|
||||
* Reset environmental variables to the ones that were available before first `vi.stubEnv` was called.
|
||||
*/
|
||||
unstubAllEnvs: () => VitestUtils;
|
||||
/**
|
||||
* Resets modules registry by clearing the cache of all modules. This allows modules to be reevaluated when reimported.
|
||||
* Top-level imports cannot be re-evaluated. Might be useful to isolate modules where local state conflicts between tests.
|
||||
*
|
||||
* This method does not reset mocks registry. To clear mocks registry, use [`vi.unmock`](https://vitest.dev/api/vi#vi-unmock) or [`vi.doUnmock`](https://vitest.dev/api/vi#vi-dounmock).
|
||||
*/
|
||||
resetModules: () => VitestUtils;
|
||||
/**
|
||||
* Wait for all imports to load. Useful, if you have a synchronous call that starts
|
||||
* importing a module that you cannot await otherwise.
|
||||
* Will also wait for new imports, started during the wait.
|
||||
*/
|
||||
dynamicImportSettled: () => Promise<void>;
|
||||
/**
|
||||
* Updates runtime config. You can only change values that are used when executing tests.
|
||||
*/
|
||||
setConfig: (config: RuntimeOptions) => void;
|
||||
/**
|
||||
* If config was changed with `vi.setConfig`, this will reset it to the original state().
|
||||
*/
|
||||
resetConfig: () => void;
|
||||
}
|
||||
declare const vitest: VitestUtils;
|
||||
declare const vi: VitestUtils;
|
||||
|
||||
interface AssertType {
|
||||
<T>(value: T): void;
|
||||
}
|
||||
declare const assertType: AssertType;
|
||||
|
||||
interface BrowserUI {
|
||||
setCurrentFileId: (fileId: string) => void;
|
||||
setIframeViewport: (width: number, height: number) => Promise<void>;
|
||||
}
|
||||
|
||||
declare namespace Experimental {
|
||||
export { ModuleDefinitionDiagnostic, ModuleDefinitionDurationsDiagnostic, ModuleDefinitionLocation, SourceModuleDiagnostic, SourceModuleLocations, UntrackedModuleDefinitionDiagnostic };
|
||||
}
|
||||
|
||||
export { Experimental, LabelColor, ModuleGraphData, ProvidedContext, SerializedConfig, SerializedTestSpecification, UserConsoleLog, assert, assertType, createExpect, globalExpect as expect, inject, should, vi, vitest };
|
||||
export type { AssertType, BrowserUI, ExternalResult, TransformResultWithSource, VitestUtils, WebSocketEvents, WebSocketHandlers, WebSocketRPC };
|
||||
20
node_modules/vitest/dist/index.js
generated
vendored
Normal file
20
node_modules/vitest/dist/index.js
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
export { b as assert, c as createExpect, g as expect, i as inject, s as should, v as vi, d as vitest } from './chunks/vi.2VT5v0um.js';
|
||||
export { b as bench } from './chunks/benchmark.B3N2zMcH.js';
|
||||
export { V as EvaluatedModules } from './chunks/evaluatedModules.Dg1zASAC.js';
|
||||
export { a as assertType } from './chunks/index.Z5E_ObnR.js';
|
||||
export { expectTypeOf } from 'expect-type';
|
||||
export { afterAll, afterEach, beforeAll, beforeEach, describe, it, onTestFailed, onTestFinished, recordArtifact, suite, test } from '@vitest/runner';
|
||||
export { chai } from '@vitest/expect';
|
||||
import './chunks/utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/timers';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/error';
|
||||
import '@vitest/utils/helpers';
|
||||
import '@vitest/spy';
|
||||
import '@vitest/utils/offset';
|
||||
import '@vitest/utils/source-map';
|
||||
import './chunks/_commonjsHelpers.D26ty3Ew.js';
|
||||
import './chunks/date.Bq6ZW5rf.js';
|
||||
import 'pathe';
|
||||
import 'vite/module-runner';
|
||||
1
node_modules/vitest/dist/mocker.d.ts
generated
vendored
Normal file
1
node_modules/vitest/dist/mocker.d.ts
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export * from '@vitest/mocker';
|
||||
1
node_modules/vitest/dist/mocker.js
generated
vendored
Normal file
1
node_modules/vitest/dist/mocker.js
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export * from '@vitest/mocker';
|
||||
124
node_modules/vitest/dist/module-evaluator.d.ts
generated
vendored
Normal file
124
node_modules/vitest/dist/module-evaluator.d.ts
generated
vendored
Normal file
@@ -0,0 +1,124 @@
|
||||
import { ModuleEvaluator, ModuleRunnerImportMeta, ModuleRunnerContext, EvaluatedModuleNode } from 'vite/module-runner';
|
||||
import { V as VitestEvaluatedModules } from './chunks/evaluatedModules.d.BxJ5omdx.js';
|
||||
import vm from 'node:vm';
|
||||
import { R as RuntimeRPC } from './chunks/rpc.d.RH3apGEf.js';
|
||||
import '@vitest/runner';
|
||||
import '@vitest/snapshot';
|
||||
import './chunks/traces.d.402V_yFI.js';
|
||||
|
||||
type ModuleExecutionInfo = Map<string, ModuleExecutionInfoEntry>;
|
||||
interface ModuleExecutionInfoEntry {
|
||||
startOffset: number;
|
||||
/** The duration that was spent executing the module. */
|
||||
duration: number;
|
||||
/** The time that was spent executing the module itself and externalized imports. */
|
||||
selfTime: number;
|
||||
external?: boolean;
|
||||
importer?: string;
|
||||
}
|
||||
|
||||
declare class FileMap {
|
||||
private fsCache;
|
||||
private fsBufferCache;
|
||||
readFileAsync(path: string): Promise<string>;
|
||||
readFile(path: string): string;
|
||||
readBuffer(path: string): Buffer<ArrayBuffer>;
|
||||
}
|
||||
|
||||
interface ModuleEvaluateOptions {
|
||||
timeout?: vm.RunningScriptOptions["timeout"] | undefined;
|
||||
breakOnSigint?: vm.RunningScriptOptions["breakOnSigint"] | undefined;
|
||||
}
|
||||
type ModuleLinker = (specifier: string, referencingModule: VMModule, extra: {
|
||||
assert: object;
|
||||
}) => VMModule | Promise<VMModule>;
|
||||
type ModuleStatus = "unlinked" | "linking" | "linked" | "evaluating" | "evaluated" | "errored";
|
||||
declare class VMModule {
|
||||
dependencySpecifiers: readonly string[];
|
||||
error: any;
|
||||
identifier: string;
|
||||
context: vm.Context;
|
||||
namespace: object;
|
||||
status: ModuleStatus;
|
||||
evaluate(options?: ModuleEvaluateOptions): Promise<void>;
|
||||
link(linker: ModuleLinker): Promise<void>;
|
||||
}
|
||||
|
||||
interface ExternalModulesExecutorOptions {
|
||||
context: vm.Context;
|
||||
fileMap: FileMap;
|
||||
packageCache: Map<string, any>;
|
||||
transform: RuntimeRPC["transform"];
|
||||
interopDefault?: boolean;
|
||||
viteClientModule: Record<string, unknown>;
|
||||
}
|
||||
declare class ExternalModulesExecutor {
|
||||
#private;
|
||||
private options;
|
||||
private cjs;
|
||||
private esm;
|
||||
private vite;
|
||||
private context;
|
||||
private fs;
|
||||
private resolvers;
|
||||
constructor(options: ExternalModulesExecutorOptions);
|
||||
import(identifier: string): Promise<object>;
|
||||
require(identifier: string): any;
|
||||
createRequire(identifier: string): NodeJS.Require;
|
||||
importModuleDynamically: (specifier: string, referencer: VMModule) => Promise<VMModule>;
|
||||
resolveModule: (specifier: string, referencer: string) => Promise<VMModule>;
|
||||
resolve(specifier: string, parent: string): string;
|
||||
private getModuleInformation;
|
||||
private createModule;
|
||||
private get isNetworkSupported();
|
||||
}
|
||||
|
||||
declare module "vite/module-runner" {
|
||||
interface EvaluatedModuleNode {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
mockedExports?: Record<string, any>;
|
||||
}
|
||||
}
|
||||
|
||||
interface VitestVmOptions {
|
||||
context: vm.Context;
|
||||
externalModulesExecutor: ExternalModulesExecutor;
|
||||
}
|
||||
|
||||
interface VitestModuleEvaluatorOptions {
|
||||
evaluatedModules?: VitestEvaluatedModules;
|
||||
interopDefault?: boolean | undefined;
|
||||
moduleExecutionInfo?: ModuleExecutionInfo;
|
||||
getCurrentTestFilepath?: () => string | undefined;
|
||||
compiledFunctionArgumentsNames?: string[];
|
||||
compiledFunctionArgumentsValues?: unknown[];
|
||||
}
|
||||
declare class VitestModuleEvaluator implements ModuleEvaluator {
|
||||
private options;
|
||||
stubs: Record<string, any>;
|
||||
env: ModuleRunnerImportMeta["env"];
|
||||
private vm;
|
||||
private compiledFunctionArgumentsNames?;
|
||||
private compiledFunctionArgumentsValues;
|
||||
private primitives;
|
||||
private debug;
|
||||
private _otel;
|
||||
private _evaluatedModules?;
|
||||
constructor(vmOptions?: VitestVmOptions | undefined, options?: VitestModuleEvaluatorOptions);
|
||||
private convertIdToImportUrl;
|
||||
runExternalModule(id: string): Promise<any>;
|
||||
runInlinedModule(context: ModuleRunnerContext, code: string, module: Readonly<EvaluatedModuleNode>): Promise<any>;
|
||||
private _runInlinedModule;
|
||||
private createRequire;
|
||||
private shouldInterop;
|
||||
}
|
||||
declare function createImportMetaEnvProxy(): ModuleRunnerImportMeta["env"];
|
||||
declare function getDefaultRequestStubs(context?: vm.Context): Record<string, any>;
|
||||
declare function isPrimitive(v: any): boolean;
|
||||
declare function wrapId(id: string): string;
|
||||
declare function unwrapId(id: string): string;
|
||||
|
||||
export { VitestModuleEvaluator, createImportMetaEnvProxy, getDefaultRequestStubs, isPrimitive, unwrapId, wrapId };
|
||||
export type { VitestModuleEvaluatorOptions };
|
||||
355
node_modules/vitest/dist/module-evaluator.js
generated
vendored
Normal file
355
node_modules/vitest/dist/module-evaluator.js
generated
vendored
Normal file
@@ -0,0 +1,355 @@
|
||||
import { isBuiltin, createRequire } from 'node:module';
|
||||
import { pathToFileURL, fileURLToPath } from 'node:url';
|
||||
import vm from 'node:vm';
|
||||
import { isAbsolute } from 'pathe';
|
||||
import { ssrModuleExportsKey, ssrImportMetaKey, ssrImportKey, ssrDynamicImportKey, ssrExportAllKey } from 'vite/module-runner';
|
||||
import { T as Traces } from './chunks/traces.U4xDYhzZ.js';
|
||||
|
||||
const performanceNow = performance.now.bind(performance);
|
||||
class ModuleDebug {
|
||||
executionStack = [];
|
||||
startCalculateModuleExecutionInfo(filename, options) {
|
||||
const startTime = performanceNow();
|
||||
this.executionStack.push({
|
||||
filename,
|
||||
startTime,
|
||||
subImportTime: 0
|
||||
});
|
||||
return () => {
|
||||
const duration = performanceNow() - startTime;
|
||||
const currentExecution = this.executionStack.pop();
|
||||
if (currentExecution == null) throw new Error("Execution stack is empty, this should never happen");
|
||||
const selfTime = duration - currentExecution.subImportTime;
|
||||
if (this.executionStack.length > 0) this.executionStack.at(-1).subImportTime += duration;
|
||||
return {
|
||||
startOffset: options.startOffset,
|
||||
external: options.external,
|
||||
importer: options.importer,
|
||||
duration,
|
||||
selfTime
|
||||
};
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
const isWindows = process.platform === "win32";
|
||||
class VitestModuleEvaluator {
|
||||
stubs = {};
|
||||
env = createImportMetaEnvProxy();
|
||||
vm;
|
||||
compiledFunctionArgumentsNames;
|
||||
compiledFunctionArgumentsValues = [];
|
||||
primitives;
|
||||
debug = new ModuleDebug();
|
||||
_otel;
|
||||
_evaluatedModules;
|
||||
constructor(vmOptions, options = {}) {
|
||||
this.options = options;
|
||||
this._otel = options.traces || new Traces({ enabled: false });
|
||||
this.vm = vmOptions;
|
||||
this.stubs = getDefaultRequestStubs(vmOptions?.context);
|
||||
this._evaluatedModules = options.evaluatedModules;
|
||||
if (options.compiledFunctionArgumentsNames) this.compiledFunctionArgumentsNames = options.compiledFunctionArgumentsNames;
|
||||
if (options.compiledFunctionArgumentsValues) this.compiledFunctionArgumentsValues = options.compiledFunctionArgumentsValues;
|
||||
if (vmOptions) this.primitives = vm.runInContext("({ Object, Proxy, Reflect })", vmOptions.context);
|
||||
else this.primitives = {
|
||||
Object,
|
||||
Proxy,
|
||||
Reflect
|
||||
};
|
||||
}
|
||||
convertIdToImportUrl(id) {
|
||||
// TODO: vitest returns paths for external modules, but Vite returns file://
|
||||
// REMOVE WHEN VITE 6 SUPPORT IS OVER
|
||||
// unfortunetly, there is a bug in Vite where ID is resolved incorrectly, so we can't return files until the fix is merged
|
||||
// https://github.com/vitejs/vite/pull/20449
|
||||
if (!isWindows || isBuiltin(id) || /^(?:node:|data:|http:|https:|file:)/.test(id)) return id;
|
||||
const [filepath, query] = id.split("?");
|
||||
if (query) return `${pathToFileURL(filepath).toString()}?${query}`;
|
||||
return pathToFileURL(filepath).toString();
|
||||
}
|
||||
async runExternalModule(id) {
|
||||
if (id in this.stubs) return this.stubs[id];
|
||||
const file = this.convertIdToImportUrl(id);
|
||||
const importer = (this._evaluatedModules?.getModuleById(id)?.importers)?.values().next().value;
|
||||
const filename = id.startsWith("file://") ? fileURLToPath(id) : id;
|
||||
const finishModuleExecutionInfo = this.debug.startCalculateModuleExecutionInfo(filename, {
|
||||
startOffset: 0,
|
||||
external: true,
|
||||
importer
|
||||
});
|
||||
const namespace = await this._otel.$("vitest.module.external", { attributes: { "code.file.path": file } }, () => this.vm ? this.vm.externalModulesExecutor.import(file) : import(file)).finally(() => {
|
||||
this.options.moduleExecutionInfo?.set(filename, finishModuleExecutionInfo());
|
||||
});
|
||||
if (!this.shouldInterop(file, namespace)) return namespace;
|
||||
const { mod, defaultExport } = interopModule(namespace);
|
||||
const { Proxy, Reflect } = this.primitives;
|
||||
return new Proxy(mod, {
|
||||
get(mod, prop) {
|
||||
if (prop === "default") return defaultExport;
|
||||
return mod[prop] ?? defaultExport?.[prop];
|
||||
},
|
||||
has(mod, prop) {
|
||||
if (prop === "default") return defaultExport !== void 0;
|
||||
return prop in mod || defaultExport && prop in defaultExport;
|
||||
},
|
||||
getOwnPropertyDescriptor(mod, prop) {
|
||||
const descriptor = Reflect.getOwnPropertyDescriptor(mod, prop);
|
||||
if (descriptor) return descriptor;
|
||||
if (prop === "default" && defaultExport !== void 0) return {
|
||||
value: defaultExport,
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
async runInlinedModule(context, code, module) {
|
||||
return this._otel.$("vitest.module.inline", (span) => this._runInlinedModule(context, code, module, span));
|
||||
}
|
||||
async _runInlinedModule(context, code, module, span) {
|
||||
context.__vite_ssr_import_meta__.env = this.env;
|
||||
const { Reflect, Proxy, Object } = this.primitives;
|
||||
const exportsObject = context[ssrModuleExportsKey];
|
||||
const SYMBOL_NOT_DEFINED = Symbol("not defined");
|
||||
let moduleExports = SYMBOL_NOT_DEFINED;
|
||||
// this proxy is triggered only on exports.{name} and module.exports access
|
||||
// inside the module itself. imported module is always "exports"
|
||||
const cjsExports = new Proxy(exportsObject, {
|
||||
get: (target, p, receiver) => {
|
||||
if (Reflect.has(target, p)) return Reflect.get(target, p, receiver);
|
||||
return Reflect.get(Object.prototype, p, receiver);
|
||||
},
|
||||
getPrototypeOf: () => Object.prototype,
|
||||
set: (_, p, value) => {
|
||||
span.addEvent(`cjs export proxy is triggered for ${String(p)}`);
|
||||
// treat "module.exports =" the same as "exports.default =" to not have nested "default.default",
|
||||
// so "exports.default" becomes the actual module
|
||||
if (p === "default" && this.shouldInterop(module.file, { default: value }) && cjsExports !== value) {
|
||||
span.addEvent("`exports.default` is assigned, copying values");
|
||||
exportAll(cjsExports, value);
|
||||
exportsObject.default = value;
|
||||
return true;
|
||||
}
|
||||
if (!Reflect.has(exportsObject, "default")) exportsObject.default = {};
|
||||
// returns undefined, when accessing named exports, if default is not an object
|
||||
// but is still present inside hasOwnKeys, this is Node behaviour for CJS
|
||||
if (moduleExports !== SYMBOL_NOT_DEFINED && isPrimitive(moduleExports)) {
|
||||
span.addEvent(`\`exports.${String(p)}\` is assigned, but module.exports is a primitive. assigning "undefined" values instead to comply with ESM`);
|
||||
defineExport(exportsObject, p, () => void 0);
|
||||
return true;
|
||||
}
|
||||
if (!isPrimitive(exportsObject.default)) exportsObject.default[p] = value;
|
||||
if (p !== "default") defineExport(exportsObject, p, () => value);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
const moduleProxy = {
|
||||
set exports(value) {
|
||||
span.addEvent("`module.exports` is assigned directly, copying all properties to `exports`");
|
||||
exportAll(cjsExports, value);
|
||||
exportsObject.default = value;
|
||||
moduleExports = value;
|
||||
},
|
||||
get exports() {
|
||||
return cjsExports;
|
||||
}
|
||||
};
|
||||
const meta = context[ssrImportMetaKey];
|
||||
if (this.options.getCurrentTestFilepath?.() === module.file) {
|
||||
const globalNamespace = this.vm?.context || globalThis;
|
||||
Object.defineProperty(meta, "vitest", { get: () => globalNamespace.__vitest_index__ });
|
||||
}
|
||||
const filename = meta.filename;
|
||||
const dirname = meta.dirname;
|
||||
span.setAttributes({ "code.file.path": filename });
|
||||
const require = this.createRequire(filename);
|
||||
const argumentsList = [
|
||||
ssrModuleExportsKey,
|
||||
ssrImportMetaKey,
|
||||
ssrImportKey,
|
||||
ssrDynamicImportKey,
|
||||
ssrExportAllKey,
|
||||
"__vite_ssr_exportName__",
|
||||
"__filename",
|
||||
"__dirname",
|
||||
"module",
|
||||
"exports",
|
||||
"require"
|
||||
];
|
||||
if (this.compiledFunctionArgumentsNames) argumentsList.push(...this.compiledFunctionArgumentsNames);
|
||||
span.setAttribute("vitest.module.arguments", argumentsList);
|
||||
// add 'use strict' since ESM enables it by default
|
||||
const codeDefinition = `'use strict';async (${argumentsList.join(",")})=>{{`;
|
||||
const wrappedCode = `${codeDefinition}${code}\n}}`;
|
||||
const options = {
|
||||
filename: module.id,
|
||||
lineOffset: 0,
|
||||
columnOffset: -codeDefinition.length
|
||||
};
|
||||
// this will always be 1 element because it's cached after load
|
||||
const importer = module.importers.values().next().value;
|
||||
const finishModuleExecutionInfo = this.debug.startCalculateModuleExecutionInfo(options.filename, {
|
||||
startOffset: codeDefinition.length,
|
||||
importer
|
||||
});
|
||||
try {
|
||||
const initModule = this.vm ? vm.runInContext(wrappedCode, this.vm.context, options) : vm.runInThisContext(wrappedCode, options);
|
||||
const dynamicRequest = async (dep, options) => {
|
||||
dep = String(dep);
|
||||
// TODO: support more edge cases?
|
||||
// vite doesn't support dynamic modules by design, but we have to
|
||||
if (dep[0] === "#") return context[ssrDynamicImportKey](wrapId(dep), options);
|
||||
return context[ssrDynamicImportKey](dep, options);
|
||||
};
|
||||
await initModule(
|
||||
context[ssrModuleExportsKey],
|
||||
context[ssrImportMetaKey],
|
||||
context[ssrImportKey],
|
||||
dynamicRequest,
|
||||
context[ssrExportAllKey],
|
||||
// vite 7 support, remove when vite 7+ is supported
|
||||
context.__vite_ssr_exportName__ || ((name, getter) => Object.defineProperty(exportsObject, name, {
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
get: getter
|
||||
})),
|
||||
filename,
|
||||
dirname,
|
||||
moduleProxy,
|
||||
cjsExports,
|
||||
require,
|
||||
...this.compiledFunctionArgumentsValues
|
||||
);
|
||||
} finally {
|
||||
// moduleExecutionInfo needs to use Node filename instead of the normalized one
|
||||
// because we rely on this behaviour in coverage-v8, for example
|
||||
this.options.moduleExecutionInfo?.set(options.filename, finishModuleExecutionInfo());
|
||||
}
|
||||
}
|
||||
createRequire(filename) {
|
||||
// \x00 is a rollup convention for virtual files,
|
||||
// it is not allowed in actual file names
|
||||
if (filename[0] === "\0" || !isAbsolute(filename)) return () => ({});
|
||||
return this.vm ? this.vm.externalModulesExecutor.createRequire(filename) : createRequire(filename);
|
||||
}
|
||||
shouldInterop(path, mod) {
|
||||
if (this.options.interopDefault === false) return false;
|
||||
// never interop ESM modules
|
||||
// TODO: should also skip for `.js` with `type="module"`
|
||||
return !path.endsWith(".mjs") && "default" in mod;
|
||||
}
|
||||
}
|
||||
function createImportMetaEnvProxy() {
|
||||
// packages/vitest/src/node/plugins/index.ts:146
|
||||
const booleanKeys = [
|
||||
"DEV",
|
||||
"PROD",
|
||||
"SSR"
|
||||
];
|
||||
return new Proxy(process.env, {
|
||||
get(_, key) {
|
||||
if (typeof key !== "string") return;
|
||||
if (booleanKeys.includes(key)) return !!process.env[key];
|
||||
return process.env[key];
|
||||
},
|
||||
set(_, key, value) {
|
||||
if (typeof key !== "string") return true;
|
||||
if (booleanKeys.includes(key)) process.env[key] = value ? "1" : "";
|
||||
else process.env[key] = value;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
function updateStyle(id, css) {
|
||||
if (typeof document === "undefined") return;
|
||||
const element = document.querySelector(`[data-vite-dev-id="${id}"]`);
|
||||
if (element) {
|
||||
element.textContent = css;
|
||||
return;
|
||||
}
|
||||
const head = document.querySelector("head");
|
||||
const style = document.createElement("style");
|
||||
style.setAttribute("type", "text/css");
|
||||
style.setAttribute("data-vite-dev-id", id);
|
||||
style.textContent = css;
|
||||
head?.appendChild(style);
|
||||
}
|
||||
function removeStyle(id) {
|
||||
if (typeof document === "undefined") return;
|
||||
const sheet = document.querySelector(`[data-vite-dev-id="${id}"]`);
|
||||
if (sheet) document.head.removeChild(sheet);
|
||||
}
|
||||
const defaultClientStub = {
|
||||
injectQuery: (id) => id,
|
||||
createHotContext: () => {
|
||||
return {
|
||||
accept: () => {},
|
||||
prune: () => {},
|
||||
dispose: () => {},
|
||||
decline: () => {},
|
||||
invalidate: () => {},
|
||||
on: () => {},
|
||||
send: () => {}
|
||||
};
|
||||
},
|
||||
updateStyle: () => {},
|
||||
removeStyle: () => {}
|
||||
};
|
||||
function getDefaultRequestStubs(context) {
|
||||
if (!context) {
|
||||
const clientStub = {
|
||||
...defaultClientStub,
|
||||
updateStyle,
|
||||
removeStyle
|
||||
};
|
||||
return { "/@vite/client": clientStub };
|
||||
}
|
||||
const clientStub = vm.runInContext(`(defaultClient) => ({ ...defaultClient, updateStyle: ${updateStyle.toString()}, removeStyle: ${removeStyle.toString()} })`, context)(defaultClientStub);
|
||||
return { "/@vite/client": clientStub };
|
||||
}
|
||||
function exportAll(exports$1, sourceModule) {
|
||||
// #1120 when a module exports itself it causes
|
||||
// call stack error
|
||||
if (exports$1 === sourceModule) return;
|
||||
if (isPrimitive(sourceModule) || Array.isArray(sourceModule) || sourceModule instanceof Promise) return;
|
||||
for (const key in sourceModule) if (key !== "default" && !(key in exports$1)) try {
|
||||
defineExport(exports$1, key, () => sourceModule[key]);
|
||||
} catch {}
|
||||
}
|
||||
// keep consistency with Vite on how exports are defined
|
||||
function defineExport(exports$1, key, value) {
|
||||
Object.defineProperty(exports$1, key, {
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
get: value
|
||||
});
|
||||
}
|
||||
function isPrimitive(v) {
|
||||
return !(typeof v === "object" || typeof v === "function") || v == null;
|
||||
}
|
||||
function interopModule(mod) {
|
||||
if (isPrimitive(mod)) return {
|
||||
mod: { default: mod },
|
||||
defaultExport: mod
|
||||
};
|
||||
let defaultExport = "default" in mod ? mod.default : mod;
|
||||
if (!isPrimitive(defaultExport) && "__esModule" in defaultExport) {
|
||||
mod = defaultExport;
|
||||
if ("default" in defaultExport) defaultExport = defaultExport.default;
|
||||
}
|
||||
return {
|
||||
mod,
|
||||
defaultExport
|
||||
};
|
||||
}
|
||||
const VALID_ID_PREFIX = `/@id/`;
|
||||
const NULL_BYTE_PLACEHOLDER = `__x00__`;
|
||||
function wrapId(id) {
|
||||
return id.startsWith(VALID_ID_PREFIX) ? id : VALID_ID_PREFIX + id.replace("\0", NULL_BYTE_PLACEHOLDER);
|
||||
}
|
||||
function unwrapId(id) {
|
||||
return id.startsWith(VALID_ID_PREFIX) ? id.slice(VALID_ID_PREFIX.length).replace(NULL_BYTE_PLACEHOLDER, "\0") : id;
|
||||
}
|
||||
|
||||
export { VitestModuleEvaluator, createImportMetaEnvProxy, getDefaultRequestStubs, isPrimitive, unwrapId, wrapId };
|
||||
17
node_modules/vitest/dist/module-runner.js
generated
vendored
Normal file
17
node_modules/vitest/dist/module-runner.js
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
export { VitestModuleEvaluator } from './module-evaluator.js';
|
||||
export { a as VITEST_VM_CONTEXT_SYMBOL, V as VitestModuleRunner, s as startVitestModuleRunner } from './chunks/startModuleRunner.Iz2V0ESw.js';
|
||||
export { g as getWorkerState } from './chunks/utils.DvEY5TfP.js';
|
||||
import 'node:module';
|
||||
import 'node:url';
|
||||
import 'node:vm';
|
||||
import 'pathe';
|
||||
import 'vite/module-runner';
|
||||
import './chunks/traces.U4xDYhzZ.js';
|
||||
import 'node:fs';
|
||||
import '@vitest/utils/helpers';
|
||||
import './chunks/modules.DJPjQW6m.js';
|
||||
import './path.js';
|
||||
import 'node:path';
|
||||
import '@vitest/utils/serialize';
|
||||
import '@vitest/mocker';
|
||||
import '@vitest/utils/timers';
|
||||
242
node_modules/vitest/dist/node.d.ts
generated
vendored
Normal file
242
node_modules/vitest/dist/node.d.ts
generated
vendored
Normal file
@@ -0,0 +1,242 @@
|
||||
import * as vite from 'vite';
|
||||
import { InlineConfig, UserConfig as UserConfig$1, Plugin, ResolvedConfig as ResolvedConfig$1, LogLevel, LoggerOptions, Logger as Logger$1 } from 'vite';
|
||||
export { vite as Vite };
|
||||
export { esbuildVersion, isCSSRequest, isFileServingAllowed, parseAst, parseAstAsync, rollupVersion, version as viteVersion } from 'vite';
|
||||
import { IncomingMessage } from 'node:http';
|
||||
import { h as ResolvedConfig, f as UserConfig, i as VitestRunMode, j as VitestOptions, V as Vitest, A as ApiConfig, k as TestSpecification, T as TestProject, P as PoolWorker, l as PoolOptions, m as WorkerRequest, n as TestSequencer, L as Logger } from './chunks/reporters.d.OXEK7y4s.js';
|
||||
export { at as BaseCoverageOptions, Y as BenchmarkUserOptions, Z as BrowserBuiltinProvider, $ as BrowserCommand, a0 as BrowserCommandContext, a1 as BrowserConfigOptions, a2 as BrowserInstanceOption, a3 as BrowserModuleMocker, a4 as BrowserOrchestrator, a5 as BrowserProvider, a6 as BrowserProviderOption, a7 as BrowserScript, a8 as BrowserServerFactory, a9 as BrowserServerOptions, aa as BrowserServerState, ab as BrowserServerStateSession, ai as BuiltinEnvironment, ac as CDPSession, aj as CSSModuleScopeStrategy, au as CoverageIstanbulOptions, av as CoverageOptions, aw as CoverageProvider, ax as CoverageProviderModule, ay as CoverageReporter, c as CoverageV8Options, az as CustomProviderOptions, ak as DepsOptimizationOptions, al as EnvironmentOptions, H as HTMLOptions, I as InlineConfig, t as JUnitOptions, J as JsonOptions, M as ModuleDiagnostic, O as OnServerRestartHandler, o as OnTestsRerunHandler, ad as ParentProjectBrowser, am as Pool, q as PoolRunnerInitializer, r as PoolTask, ae as ProjectBrowser, an as ProjectConfig, a as ReportContext, aB as ReportedHookContext, aC as Reporter, ap as ResolveSnapshotPathHandler, aq as ResolveSnapshotPathHandlerContext, af as ResolvedBrowserOptions, R as ResolvedCoverageOptions, ao as ResolvedProjectConfig, S as SerializedTestProject, u as TaskOptions, v as TestCase, w as TestCollection, x as TestDiagnostic, y as TestModule, z as TestModuleState, B as TestResult, D as TestResultFailed, E as TestResultPassed, F as TestResultSkipped, aD as TestRunEndReason, aA as TestRunResult, X as TestSequencerConstructor, G as TestState, K as TestSuite, N as TestSuiteState, ag as ToMatchScreenshotComparators, ah as ToMatchScreenshotOptions, ar as TypecheckConfig, U as UserWorkspaceConfig, as as VitestEnvironment, p as VitestPackageInstaller, W as WatcherTriggerPattern, s as WorkerResponse, _ as _BrowserNames, Q as experimental_getRunnerTask } from './chunks/reporters.d.OXEK7y4s.js';
|
||||
export { C as CacheKeyIdGenerator, a as CacheKeyIdGeneratorContext, V as VitestPluginContext } from './chunks/plugin.d.CY7CUjf-.js';
|
||||
import { Awaitable } from '@vitest/utils';
|
||||
export { SerializedError } from '@vitest/utils';
|
||||
import { R as RuntimeRPC } from './chunks/rpc.d.RH3apGEf.js';
|
||||
import { Writable } from 'node:stream';
|
||||
import { C as ContextRPC } from './chunks/worker.d.B4A26qg6.js';
|
||||
export { T as TestExecutionType } from './chunks/worker.d.B4A26qg6.js';
|
||||
import { Debugger } from 'obug';
|
||||
import './chunks/global.d.B15mdLcR.js';
|
||||
export { Task as RunnerTask, TaskResult as RunnerTaskResult, TaskResultPack as RunnerTaskResultPack, Test as RunnerTestCase, File as RunnerTestFile, Suite as RunnerTestSuite, SequenceHooks, SequenceSetupFiles } from '@vitest/runner';
|
||||
export { b as RuntimeConfig } from './chunks/config.d.CzIjkicf.js';
|
||||
export { generateFileHash } from '@vitest/runner/utils';
|
||||
import './chunks/browser.d.DBzUq_Na.js';
|
||||
import '@vitest/mocker';
|
||||
import '@vitest/utils/source-map';
|
||||
import 'vitest/browser';
|
||||
import '@vitest/pretty-format';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/diff';
|
||||
import '@vitest/expect';
|
||||
import 'vitest/optional-types.js';
|
||||
import './chunks/traces.d.402V_yFI.js';
|
||||
import './chunks/benchmark.d.DAaHLpsq.js';
|
||||
import 'tinybench';
|
||||
import './chunks/coverage.d.BZtK59WP.js';
|
||||
import '@vitest/snapshot/manager';
|
||||
import 'node:console';
|
||||
import 'node:fs';
|
||||
import 'vite/module-runner';
|
||||
import './chunks/environment.d.CrsxCzP1.js';
|
||||
|
||||
type RawErrsMap = Map<string, TscErrorInfo[]>;
|
||||
interface TscErrorInfo {
|
||||
filePath: string;
|
||||
errCode: number;
|
||||
errMsg: string;
|
||||
line: number;
|
||||
column: number;
|
||||
}
|
||||
interface CollectLineNumbers {
|
||||
target: number;
|
||||
next: number;
|
||||
prev?: number;
|
||||
}
|
||||
type CollectLines = { [key in keyof CollectLineNumbers] : string };
|
||||
interface RootAndTarget {
|
||||
root: string;
|
||||
targetAbsPath: string;
|
||||
}
|
||||
type Context = RootAndTarget & {
|
||||
rawErrsMap: RawErrsMap;
|
||||
openedDirs: Set<string>;
|
||||
lastActivePath?: string;
|
||||
};
|
||||
|
||||
declare function isValidApiRequest(config: ResolvedConfig, req: IncomingMessage): boolean;
|
||||
|
||||
declare function escapeTestName(label: string, dynamic: boolean): string;
|
||||
|
||||
interface CliOptions extends UserConfig {
|
||||
/**
|
||||
* Override the watch mode
|
||||
*/
|
||||
run?: boolean;
|
||||
/**
|
||||
* Removes colors from the console output
|
||||
*/
|
||||
color?: boolean;
|
||||
/**
|
||||
* Output collected tests as JSON or to a file
|
||||
*/
|
||||
json?: string | boolean;
|
||||
/**
|
||||
* Output collected test files only
|
||||
*/
|
||||
filesOnly?: boolean;
|
||||
/**
|
||||
* Override vite config's configLoader from cli.
|
||||
* Use `bundle` to bundle the config with esbuild or `runner` (experimental) to process it on the fly (default: `bundle`).
|
||||
* This is only available with **vite version 6.1.0** and above.
|
||||
* @experimental
|
||||
*/
|
||||
configLoader?: InlineConfig extends {
|
||||
configLoader?: infer T;
|
||||
} ? T : never;
|
||||
}
|
||||
/**
|
||||
* Start Vitest programmatically
|
||||
*
|
||||
* Returns a Vitest instance if initialized successfully.
|
||||
*/
|
||||
declare function startVitest(mode: VitestRunMode, cliFilters?: string[], options?: CliOptions, viteOverrides?: UserConfig$1, vitestOptions?: VitestOptions): Promise<Vitest>;
|
||||
|
||||
interface CliParseOptions {
|
||||
allowUnknownOptions?: boolean;
|
||||
}
|
||||
declare function parseCLI(argv: string | string[], config?: CliParseOptions): {
|
||||
filter: string[];
|
||||
options: CliOptions;
|
||||
};
|
||||
|
||||
declare function resolveApiServerConfig<Options extends ApiConfig & Omit<UserConfig, "expect">>(options: Options, defaultPort: number): ApiConfig | undefined;
|
||||
|
||||
declare function createVitest(mode: VitestRunMode, options: CliOptions, viteOverrides?: UserConfig$1, vitestOptions?: VitestOptions): Promise<Vitest>;
|
||||
|
||||
declare class FilesNotFoundError extends Error {
|
||||
code: string;
|
||||
constructor(mode: "test" | "benchmark");
|
||||
}
|
||||
declare class GitNotFoundError extends Error {
|
||||
code: string;
|
||||
constructor();
|
||||
}
|
||||
|
||||
declare function VitestPlugin(options?: UserConfig, vitest?: Vitest): Promise<Plugin[]>;
|
||||
|
||||
declare function resolveConfig(options?: UserConfig, viteOverrides?: UserConfig$1): Promise<{
|
||||
vitestConfig: ResolvedConfig;
|
||||
viteConfig: ResolvedConfig$1;
|
||||
}>;
|
||||
|
||||
declare function resolveFsAllow(projectRoot: string, rootConfigFile: string | false | undefined): string[];
|
||||
|
||||
type RunWithFiles = (files: TestSpecification[], invalidates?: string[]) => Promise<void>;
|
||||
interface ProcessPool {
|
||||
name: string;
|
||||
runTests: RunWithFiles;
|
||||
collectTests: RunWithFiles;
|
||||
close?: () => Awaitable<void>;
|
||||
}
|
||||
declare function getFilePoolName(project: TestProject): ResolvedConfig["pool"];
|
||||
|
||||
interface MethodsOptions {
|
||||
cacheFs?: boolean;
|
||||
collect?: boolean;
|
||||
}
|
||||
declare function createMethodsRPC(project: TestProject, methodsOptions?: MethodsOptions): RuntimeRPC;
|
||||
|
||||
/** @experimental */
|
||||
declare class ForksPoolWorker implements PoolWorker {
|
||||
readonly name: string;
|
||||
readonly cacheFs: boolean;
|
||||
protected readonly entrypoint: string;
|
||||
protected execArgv: string[];
|
||||
protected env: Partial<NodeJS.ProcessEnv>;
|
||||
private _fork?;
|
||||
private stdout;
|
||||
private stderr;
|
||||
constructor(options: PoolOptions);
|
||||
on(event: string, callback: (arg: any) => void): void;
|
||||
off(event: string, callback: (arg: any) => void): void;
|
||||
send(message: WorkerRequest): void;
|
||||
start(): Promise<void>;
|
||||
stop(): Promise<void>;
|
||||
deserialize(data: unknown): unknown;
|
||||
private get fork();
|
||||
}
|
||||
|
||||
/** @experimental */
|
||||
declare class ThreadsPoolWorker implements PoolWorker {
|
||||
readonly name: string;
|
||||
protected readonly entrypoint: string;
|
||||
protected execArgv: string[];
|
||||
protected env: Partial<NodeJS.ProcessEnv>;
|
||||
private _thread?;
|
||||
private stdout;
|
||||
private stderr;
|
||||
constructor(options: PoolOptions);
|
||||
on(event: string, callback: (arg: any) => void): void;
|
||||
off(event: string, callback: (arg: any) => void): void;
|
||||
send(message: WorkerRequest): void;
|
||||
start(): Promise<void>;
|
||||
stop(): Promise<void>;
|
||||
deserialize(data: unknown): unknown;
|
||||
private get thread();
|
||||
}
|
||||
|
||||
/** @experimental */
|
||||
declare class TypecheckPoolWorker implements PoolWorker {
|
||||
readonly name: string;
|
||||
private readonly project;
|
||||
private _eventEmitter;
|
||||
constructor(options: PoolOptions);
|
||||
start(): Promise<void>;
|
||||
stop(): Promise<void>;
|
||||
canReuse(): boolean;
|
||||
send(message: WorkerRequest): void;
|
||||
on(event: string, callback: (arg: any) => any): void;
|
||||
off(event: string, callback: (arg: any) => any): void;
|
||||
deserialize(data: unknown): unknown;
|
||||
}
|
||||
|
||||
/** @experimental */
|
||||
declare class VmForksPoolWorker extends ForksPoolWorker {
|
||||
readonly name = "vmForks";
|
||||
readonly reportMemory: true;
|
||||
protected readonly entrypoint: string;
|
||||
constructor(options: PoolOptions);
|
||||
}
|
||||
|
||||
/** @experimental */
|
||||
declare class VmThreadsPoolWorker extends ThreadsPoolWorker {
|
||||
readonly name = "vmThreads";
|
||||
readonly reportMemory: true;
|
||||
protected readonly entrypoint: string;
|
||||
constructor(options: PoolOptions);
|
||||
}
|
||||
|
||||
declare class BaseSequencer implements TestSequencer {
|
||||
protected ctx: Vitest;
|
||||
constructor(ctx: Vitest);
|
||||
shard(files: TestSpecification[]): Promise<TestSpecification[]>;
|
||||
sort(files: TestSpecification[]): Promise<TestSpecification[]>;
|
||||
private calculateShardRange;
|
||||
}
|
||||
|
||||
declare function registerConsoleShortcuts(ctx: Vitest, stdin: NodeJS.ReadStream | undefined, stdout: NodeJS.WriteStream | Writable): () => void;
|
||||
|
||||
interface WorkerContext extends ContextRPC {}
|
||||
|
||||
declare function createViteLogger(console: Logger, level?: LogLevel, options?: LoggerOptions): Logger$1;
|
||||
|
||||
declare const rootDir: string;
|
||||
declare const distDir: string;
|
||||
|
||||
declare function createDebugger(namespace: `vitest:${string}`): Debugger | undefined;
|
||||
|
||||
declare const version: string;
|
||||
|
||||
declare const createViteServer: typeof vite.createServer;
|
||||
|
||||
declare const rolldownVersion: string | undefined;
|
||||
|
||||
export { ApiConfig, BaseSequencer, ForksPoolWorker, GitNotFoundError, PoolOptions, PoolWorker, ResolvedConfig, TestProject, TestSequencer, TestSpecification, UserConfig as TestUserConfig, FilesNotFoundError as TestsNotFoundError, ThreadsPoolWorker, TypecheckPoolWorker, Vitest, VitestOptions, VitestPlugin, VitestRunMode, VmForksPoolWorker, VmThreadsPoolWorker, WorkerRequest, createDebugger, createMethodsRPC, createViteLogger, createViteServer, createVitest, distDir, escapeTestName, getFilePoolName, isValidApiRequest, parseCLI, registerConsoleShortcuts, resolveApiServerConfig, resolveConfig, resolveFsAllow, rolldownVersion, rootDir, startVitest, version };
|
||||
export type { CliOptions, CliParseOptions, ProcessPool, CollectLineNumbers as TypeCheckCollectLineNumbers, CollectLines as TypeCheckCollectLines, Context as TypeCheckContext, TscErrorInfo as TypeCheckErrorInfo, RawErrsMap as TypeCheckRawErrorsMap, RootAndTarget as TypeCheckRootAndTarget, WorkerContext };
|
||||
98
node_modules/vitest/dist/node.js
generated
vendored
Normal file
98
node_modules/vitest/dist/node.js
generated
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
import * as vite from 'vite';
|
||||
import { resolveConfig as resolveConfig$1, mergeConfig } from 'vite';
|
||||
export { esbuildVersion, isCSSRequest, isFileServingAllowed, parseAst, parseAstAsync, rollupVersion, version as viteVersion } from 'vite';
|
||||
import { V as Vitest, a as VitestPlugin } from './chunks/cli-api.C7sYjHmQ.js';
|
||||
export { f as ForksPoolWorker, G as GitNotFoundError, F as TestsNotFoundError, T as ThreadsPoolWorker, h as TypecheckPoolWorker, b as VitestPackageInstaller, j as VmForksPoolWorker, k as VmThreadsPoolWorker, o as createDebugger, d as createMethodsRPC, n as createViteLogger, c as createVitest, e as escapeTestName, l as experimental_getRunnerTask, g as getFilePoolName, i as isValidApiRequest, m as registerConsoleShortcuts, r as resolveFsAllow, s as startVitest } from './chunks/cli-api.C7sYjHmQ.js';
|
||||
export { p as parseCLI } from './chunks/cac.BNNpZQl7.js';
|
||||
import { r as resolveConfig$2 } from './chunks/coverage.CtyeYmKM.js';
|
||||
export { b as BaseSequencer, a as resolveApiServerConfig } from './chunks/coverage.CtyeYmKM.js';
|
||||
import { slash, deepClone } from '@vitest/utils/helpers';
|
||||
import { a as any } from './chunks/index.D4KonVSU.js';
|
||||
import { resolve } from 'pathe';
|
||||
import { c as configFiles } from './chunks/constants.D_Q9UYh-.js';
|
||||
export { distDir, rootDir } from './path.js';
|
||||
export { generateFileHash } from '@vitest/runner/utils';
|
||||
import 'node:fs';
|
||||
import './chunks/coverage.D_JHT54q.js';
|
||||
import 'node:path';
|
||||
import 'node:os';
|
||||
import '@vitest/snapshot/manager';
|
||||
import 'node:perf_hooks';
|
||||
import './chunks/index.0kCJoeWi.js';
|
||||
import './chunks/index.456_DGfR.js';
|
||||
import 'node:fs/promises';
|
||||
import '@vitest/utils/source-map';
|
||||
import 'tinyrainbow';
|
||||
import './chunks/env.D4Lgay0q.js';
|
||||
import 'std-env';
|
||||
import 'node:util';
|
||||
import 'node:console';
|
||||
import 'node:stream';
|
||||
import '@vitest/utils/display';
|
||||
import 'tinyexec';
|
||||
import '@vitest/utils/offset';
|
||||
import 'node:module';
|
||||
import 'events';
|
||||
import 'https';
|
||||
import 'http';
|
||||
import 'net';
|
||||
import 'tls';
|
||||
import 'crypto';
|
||||
import 'stream';
|
||||
import 'url';
|
||||
import 'zlib';
|
||||
import 'buffer';
|
||||
import './chunks/_commonjsHelpers.D26ty3Ew.js';
|
||||
import 'node:crypto';
|
||||
import './chunks/traces.U4xDYhzZ.js';
|
||||
import 'obug';
|
||||
import '#module-evaluator';
|
||||
import 'vite/module-runner';
|
||||
import '@vitest/utils/highlight';
|
||||
import 'node:url';
|
||||
import 'node:tty';
|
||||
import 'node:events';
|
||||
import './chunks/modules.DJPjQW6m.js';
|
||||
import 'node:child_process';
|
||||
import 'node:worker_threads';
|
||||
import 'picomatch';
|
||||
import 'tinyglobby';
|
||||
import 'magic-string';
|
||||
import '@vitest/mocker/node';
|
||||
import './chunks/defaults.BOqNVLsY.js';
|
||||
import '@vitest/utils/constants';
|
||||
import '@vitest/utils/resolver';
|
||||
import 'es-module-lexer';
|
||||
import './chunks/index.Drsj_6e7.js';
|
||||
import 'node:assert';
|
||||
import '@vitest/utils/serialize';
|
||||
import 'node:readline';
|
||||
import 'node:process';
|
||||
import 'node:v8';
|
||||
import 'readline';
|
||||
|
||||
// this is only exported as a public function and not used inside vitest
|
||||
async function resolveConfig(options = {}, viteOverrides = {}) {
|
||||
const root = slash(resolve(options.root || process.cwd()));
|
||||
const configPath = options.config === false ? false : options.config ? resolve(root, options.config) : any(configFiles, { cwd: root });
|
||||
options.config = configPath;
|
||||
const vitest = new Vitest("test", deepClone(options));
|
||||
const config = await resolveConfig$1(mergeConfig({
|
||||
configFile: configPath,
|
||||
mode: options.mode || "test",
|
||||
plugins: [await VitestPlugin(options, vitest)]
|
||||
}, mergeConfig(viteOverrides, { root: options.root })), "serve");
|
||||
const vitestConfig = resolveConfig$2(vitest, Reflect.get(config, "_vitest"), config);
|
||||
await vitest.close();
|
||||
return {
|
||||
viteConfig: config,
|
||||
vitestConfig
|
||||
};
|
||||
}
|
||||
|
||||
const version = Vitest.version;
|
||||
const createViteServer = vite.createServer;
|
||||
// rolldownVersion is exported only by rolldown-vite
|
||||
const rolldownVersion = vite.rolldownVersion;
|
||||
|
||||
export { VitestPlugin, createViteServer, resolveConfig, rolldownVersion, version };
|
||||
7
node_modules/vitest/dist/path.js
generated
vendored
Normal file
7
node_modules/vitest/dist/path.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import { resolve } from 'node:path';
|
||||
import url from 'node:url';
|
||||
|
||||
const rootDir = resolve(url.fileURLToPath(import.meta.url), "../../");
|
||||
const distDir = resolve(url.fileURLToPath(import.meta.url), "../../dist");
|
||||
|
||||
export { distDir, rootDir };
|
||||
27
node_modules/vitest/dist/reporters.d.ts
generated
vendored
Normal file
27
node_modules/vitest/dist/reporters.d.ts
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
export { aR as BaseReporter, aS as BenchmarkBuiltinReporters, aE as BenchmarkReporter, aF as BenchmarkReportsMap, aT as BuiltinReporterOptions, aU as BuiltinReporters, aG as DefaultReporter, aH as DotReporter, aI as GithubActionsReporter, aJ as HangingProcessReporter, aL as JUnitReporter, aV as JsonAssertionResult, aK as JsonReporter, aW as JsonTestResult, aX as JsonTestResults, aB as ReportedHookContext, aC as Reporter, aM as ReportersMap, aN as TapFlatReporter, aO as TapReporter, aD as TestRunEndReason, aP as VerboseBenchmarkReporter, aQ as VerboseReporter } from './chunks/reporters.d.OXEK7y4s.js';
|
||||
import '@vitest/runner';
|
||||
import '@vitest/utils';
|
||||
import './chunks/rpc.d.RH3apGEf.js';
|
||||
import '@vitest/snapshot';
|
||||
import 'vite/module-runner';
|
||||
import './chunks/traces.d.402V_yFI.js';
|
||||
import 'node:stream';
|
||||
import 'vite';
|
||||
import './chunks/browser.d.DBzUq_Na.js';
|
||||
import './chunks/worker.d.B4A26qg6.js';
|
||||
import './chunks/config.d.CzIjkicf.js';
|
||||
import '@vitest/pretty-format';
|
||||
import '@vitest/utils/diff';
|
||||
import './chunks/environment.d.CrsxCzP1.js';
|
||||
import '@vitest/mocker';
|
||||
import '@vitest/utils/source-map';
|
||||
import 'vitest/browser';
|
||||
import '@vitest/expect';
|
||||
import 'vitest/optional-types.js';
|
||||
import './chunks/benchmark.d.DAaHLpsq.js';
|
||||
import '@vitest/runner/utils';
|
||||
import 'tinybench';
|
||||
import './chunks/coverage.d.BZtK59WP.js';
|
||||
import '@vitest/snapshot/manager';
|
||||
import 'node:console';
|
||||
import 'node:fs';
|
||||
24
node_modules/vitest/dist/reporters.js
generated
vendored
Normal file
24
node_modules/vitest/dist/reporters.js
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
export { D as DefaultReporter, a as DotReporter, G as GithubActionsReporter, H as HangingProcessReporter, b as JUnitReporter, J as JsonReporter, R as ReportersMap, T as TapFlatReporter, c as TapReporter, V as VerboseReporter } from './chunks/index.456_DGfR.js';
|
||||
export { B as BenchmarkReporter, a as BenchmarkReportsMap, V as VerboseBenchmarkReporter } from './chunks/index.Drsj_6e7.js';
|
||||
import 'node:fs';
|
||||
import 'node:fs/promises';
|
||||
import 'pathe';
|
||||
import 'node:perf_hooks';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/utils/helpers';
|
||||
import '@vitest/utils/source-map';
|
||||
import 'tinyrainbow';
|
||||
import './chunks/env.D4Lgay0q.js';
|
||||
import 'std-env';
|
||||
import 'node:util';
|
||||
import 'node:console';
|
||||
import 'node:stream';
|
||||
import '@vitest/utils/display';
|
||||
import 'node:os';
|
||||
import 'tinyexec';
|
||||
import './path.js';
|
||||
import 'node:path';
|
||||
import 'node:url';
|
||||
import 'vite';
|
||||
import '@vitest/utils/offset';
|
||||
import 'node:module';
|
||||
50
node_modules/vitest/dist/runners.d.ts
generated
vendored
Normal file
50
node_modules/vitest/dist/runners.d.ts
generated
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
import * as tinybench from 'tinybench';
|
||||
import { VitestRunner, VitestRunnerImportSource, Suite, File, Task, CancelReason, Test, TestContext, ImportDuration } from '@vitest/runner';
|
||||
export { VitestRunner } from '@vitest/runner';
|
||||
import { S as SerializedConfig } from './chunks/config.d.CzIjkicf.js';
|
||||
import { T as Traces } from './chunks/traces.d.402V_yFI.js';
|
||||
import '@vitest/pretty-format';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/diff';
|
||||
|
||||
declare class NodeBenchmarkRunner implements VitestRunner {
|
||||
config: SerializedConfig;
|
||||
private moduleRunner;
|
||||
constructor(config: SerializedConfig);
|
||||
importTinybench(): Promise<typeof tinybench>;
|
||||
importFile(filepath: string, source: VitestRunnerImportSource): unknown;
|
||||
runSuite(suite: Suite): Promise<void>;
|
||||
runTask(): Promise<void>;
|
||||
}
|
||||
|
||||
declare class VitestTestRunner implements VitestRunner {
|
||||
config: SerializedConfig;
|
||||
private snapshotClient;
|
||||
private workerState;
|
||||
private moduleRunner;
|
||||
private cancelRun;
|
||||
private assertionsErrors;
|
||||
pool: string;
|
||||
private _otel;
|
||||
viteEnvironment: string;
|
||||
constructor(config: SerializedConfig);
|
||||
importFile(filepath: string, source: VitestRunnerImportSource): unknown;
|
||||
onCollectStart(file: File): void;
|
||||
onCleanupWorkerContext(listener: () => unknown): void;
|
||||
onAfterRunFiles(): void;
|
||||
getWorkerContext(): Record<string, unknown>;
|
||||
onAfterRunSuite(suite: Suite): Promise<void>;
|
||||
onAfterRunTask(test: Task): void;
|
||||
cancel(_reason: CancelReason): void;
|
||||
injectValue(key: string): any;
|
||||
onBeforeRunTask(test: Task): Promise<void>;
|
||||
onBeforeRunSuite(suite: Suite): Promise<void>;
|
||||
onBeforeTryTask(test: Task): void;
|
||||
onAfterTryTask(test: Test): void;
|
||||
extendTaskContext(context: TestContext): TestContext;
|
||||
getImportDurations(): Record<string, ImportDuration>;
|
||||
trace: <T>(name: string, attributes: Record<string, any> | (() => T), cb?: () => T) => T;
|
||||
__setTraces(traces: Traces): void;
|
||||
}
|
||||
|
||||
export { NodeBenchmarkRunner, VitestTestRunner };
|
||||
19
node_modules/vitest/dist/runners.js
generated
vendored
Normal file
19
node_modules/vitest/dist/runners.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
export { N as NodeBenchmarkRunner, V as VitestTestRunner } from './chunks/test.BT8LKgU9.js';
|
||||
import '@vitest/runner';
|
||||
import '@vitest/utils/helpers';
|
||||
import '@vitest/utils/timers';
|
||||
import './chunks/benchmark.B3N2zMcH.js';
|
||||
import '@vitest/runner/utils';
|
||||
import './chunks/utils.DvEY5TfP.js';
|
||||
import '@vitest/expect';
|
||||
import '@vitest/utils/error';
|
||||
import 'pathe';
|
||||
import './chunks/vi.2VT5v0um.js';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/spy';
|
||||
import '@vitest/utils/offset';
|
||||
import '@vitest/utils/source-map';
|
||||
import './chunks/_commonjsHelpers.D26ty3Ew.js';
|
||||
import './chunks/date.Bq6ZW5rf.js';
|
||||
import './chunks/rpc.BytlcPfC.js';
|
||||
import './chunks/index.0kCJoeWi.js';
|
||||
9
node_modules/vitest/dist/snapshot.d.ts
generated
vendored
Normal file
9
node_modules/vitest/dist/snapshot.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import { NodeSnapshotEnvironment } from '@vitest/snapshot/environment';
|
||||
export { SnapshotEnvironment } from '@vitest/snapshot/environment';
|
||||
|
||||
declare class VitestNodeSnapshotEnvironment extends NodeSnapshotEnvironment {
|
||||
getHeader(): string;
|
||||
resolvePath(filepath: string): Promise<string>;
|
||||
}
|
||||
|
||||
export { VitestNodeSnapshotEnvironment as VitestSnapshotEnvironment };
|
||||
4
node_modules/vitest/dist/snapshot.js
generated
vendored
Normal file
4
node_modules/vitest/dist/snapshot.js
generated
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
export { VitestNodeSnapshotEnvironment as VitestSnapshotEnvironment } from './chunks/node.Ce0vMQM7.js';
|
||||
import '@vitest/snapshot/environment';
|
||||
import './chunks/utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/timers';
|
||||
1
node_modules/vitest/dist/spy.js
generated
vendored
Normal file
1
node_modules/vitest/dist/spy.js
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export * from '@vitest/spy';
|
||||
5
node_modules/vitest/dist/suite.d.ts
generated
vendored
Normal file
5
node_modules/vitest/dist/suite.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
export { g as getBenchFn, a as getBenchOptions } from './chunks/suite.d.BJWk38HB.js';
|
||||
export { VitestRunner, VitestRunnerConfig, createTaskCollector, getCurrentSuite, getCurrentTest, getFn, getHooks, setFn, setHooks } from '@vitest/runner';
|
||||
export { createChainable } from '@vitest/runner/utils';
|
||||
import './chunks/benchmark.d.DAaHLpsq.js';
|
||||
import 'tinybench';
|
||||
6
node_modules/vitest/dist/suite.js
generated
vendored
Normal file
6
node_modules/vitest/dist/suite.js
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
export { g as getBenchFn, a as getBenchOptions } from './chunks/benchmark.B3N2zMcH.js';
|
||||
export { createTaskCollector, getCurrentSuite, getCurrentTest, getFn, getHooks, setFn, setHooks } from '@vitest/runner';
|
||||
export { createChainable } from '@vitest/runner/utils';
|
||||
import '@vitest/utils/helpers';
|
||||
import './chunks/utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/timers';
|
||||
29
node_modules/vitest/dist/worker.d.ts
generated
vendored
Normal file
29
node_modules/vitest/dist/worker.d.ts
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
import { W as WorkerGlobalState, B as BirpcOptions, a as WorkerSetupContext } from './chunks/worker.d.B4A26qg6.js';
|
||||
import { T as Traces } from './chunks/traces.d.402V_yFI.js';
|
||||
import { Awaitable } from '@vitest/utils';
|
||||
import { R as RuntimeRPC } from './chunks/rpc.d.RH3apGEf.js';
|
||||
import '@vitest/runner';
|
||||
import 'vite/module-runner';
|
||||
import './chunks/config.d.CzIjkicf.js';
|
||||
import '@vitest/pretty-format';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/diff';
|
||||
import './chunks/environment.d.CrsxCzP1.js';
|
||||
|
||||
/** @experimental */
|
||||
declare function runBaseTests(method: "run" | "collect", state: WorkerGlobalState, traces: Traces): Promise<void>;
|
||||
|
||||
type WorkerRpcOptions = Pick<BirpcOptions<RuntimeRPC>, "on" | "off" | "post" | "serialize" | "deserialize">;
|
||||
interface VitestWorker extends WorkerRpcOptions {
|
||||
runTests: (state: WorkerGlobalState, traces: Traces) => Awaitable<unknown>;
|
||||
collectTests: (state: WorkerGlobalState, traces: Traces) => Awaitable<unknown>;
|
||||
setup?: (context: WorkerSetupContext) => Promise<() => Promise<unknown>>;
|
||||
}
|
||||
|
||||
interface Options extends VitestWorker {
|
||||
teardown?: () => void;
|
||||
}
|
||||
/** @experimental */
|
||||
declare function init(worker: Options): void;
|
||||
|
||||
export { init, runBaseTests };
|
||||
48
node_modules/vitest/dist/worker.js
generated
vendored
Normal file
48
node_modules/vitest/dist/worker.js
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
export { r as runBaseTests } from './chunks/base.CTp-EStD.js';
|
||||
export { i as init } from './chunks/init.B04saIIg.js';
|
||||
import 'node:vm';
|
||||
import '@vitest/spy';
|
||||
import './chunks/index.bFLgAE-Z.js';
|
||||
import '@vitest/expect';
|
||||
import './chunks/setup-common.Cm-kSBVi.js';
|
||||
import './chunks/coverage.D_JHT54q.js';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/timers';
|
||||
import './chunks/utils.DvEY5TfP.js';
|
||||
import './chunks/rpc.BytlcPfC.js';
|
||||
import './chunks/index.0kCJoeWi.js';
|
||||
import './chunks/test.BT8LKgU9.js';
|
||||
import '@vitest/runner';
|
||||
import '@vitest/utils/helpers';
|
||||
import './chunks/benchmark.B3N2zMcH.js';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/utils/error';
|
||||
import 'pathe';
|
||||
import './chunks/vi.2VT5v0um.js';
|
||||
import '@vitest/utils/offset';
|
||||
import '@vitest/utils/source-map';
|
||||
import './chunks/_commonjsHelpers.D26ty3Ew.js';
|
||||
import './chunks/date.Bq6ZW5rf.js';
|
||||
import './chunks/evaluatedModules.Dg1zASAC.js';
|
||||
import 'vite/module-runner';
|
||||
import './chunks/startModuleRunner.Iz2V0ESw.js';
|
||||
import 'node:fs';
|
||||
import './chunks/modules.DJPjQW6m.js';
|
||||
import 'node:module';
|
||||
import 'node:url';
|
||||
import './path.js';
|
||||
import 'node:path';
|
||||
import '@vitest/utils/serialize';
|
||||
import './module-evaluator.js';
|
||||
import './chunks/traces.U4xDYhzZ.js';
|
||||
import '@vitest/mocker';
|
||||
import 'node:perf_hooks';
|
||||
import './chunks/inspector.CvyFGlXm.js';
|
||||
import 'node:timers';
|
||||
import 'node:timers/promises';
|
||||
import 'node:util';
|
||||
import '@vitest/utils/constants';
|
||||
import './chunks/index.Z5E_ObnR.js';
|
||||
import 'expect-type';
|
||||
import './chunks/index.BspFP3mn.js';
|
||||
import 'node:console';
|
||||
54
node_modules/vitest/dist/workers/forks.js
generated
vendored
Normal file
54
node_modules/vitest/dist/workers/forks.js
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
import { r as runBaseTests, s as setupEnvironment } from '../chunks/base.CTp-EStD.js';
|
||||
import { w as workerInit } from '../chunks/init-forks.CKEYp90N.js';
|
||||
import 'node:vm';
|
||||
import '@vitest/spy';
|
||||
import '../chunks/index.bFLgAE-Z.js';
|
||||
import '@vitest/expect';
|
||||
import '../chunks/setup-common.Cm-kSBVi.js';
|
||||
import '../chunks/coverage.D_JHT54q.js';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/timers';
|
||||
import '../chunks/utils.DvEY5TfP.js';
|
||||
import '../chunks/rpc.BytlcPfC.js';
|
||||
import '../chunks/index.0kCJoeWi.js';
|
||||
import '../chunks/test.BT8LKgU9.js';
|
||||
import '@vitest/runner';
|
||||
import '@vitest/utils/helpers';
|
||||
import '../chunks/benchmark.B3N2zMcH.js';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/utils/error';
|
||||
import 'pathe';
|
||||
import '../chunks/vi.2VT5v0um.js';
|
||||
import '@vitest/utils/offset';
|
||||
import '@vitest/utils/source-map';
|
||||
import '../chunks/_commonjsHelpers.D26ty3Ew.js';
|
||||
import '../chunks/date.Bq6ZW5rf.js';
|
||||
import '../chunks/init.B04saIIg.js';
|
||||
import 'node:fs';
|
||||
import 'node:module';
|
||||
import 'node:url';
|
||||
import 'vite/module-runner';
|
||||
import '../chunks/startModuleRunner.Iz2V0ESw.js';
|
||||
import '../chunks/modules.DJPjQW6m.js';
|
||||
import '../path.js';
|
||||
import 'node:path';
|
||||
import '@vitest/utils/serialize';
|
||||
import '../module-evaluator.js';
|
||||
import '../chunks/traces.U4xDYhzZ.js';
|
||||
import '@vitest/mocker';
|
||||
import '../chunks/index.BspFP3mn.js';
|
||||
import 'node:console';
|
||||
import '../chunks/inspector.CvyFGlXm.js';
|
||||
import '../chunks/evaluatedModules.Dg1zASAC.js';
|
||||
import 'node:perf_hooks';
|
||||
import 'node:timers';
|
||||
import 'node:timers/promises';
|
||||
import 'node:util';
|
||||
import '@vitest/utils/constants';
|
||||
import '../chunks/index.Z5E_ObnR.js';
|
||||
import 'expect-type';
|
||||
|
||||
workerInit({
|
||||
runTests: runBaseTests,
|
||||
setup: setupEnvironment
|
||||
});
|
||||
95
node_modules/vitest/dist/workers/runVmTests.js
generated
vendored
Normal file
95
node_modules/vitest/dist/workers/runVmTests.js
generated
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
import { createRequire } from 'node:module';
|
||||
import { performance } from 'node:perf_hooks';
|
||||
import timers from 'node:timers';
|
||||
import timersPromises from 'node:timers/promises';
|
||||
import util from 'node:util';
|
||||
import { startTests, collectTests } from '@vitest/runner';
|
||||
import { KNOWN_ASSET_TYPES } from '@vitest/utils/constants';
|
||||
import { s as setupChaiConfig, r as resolveTestRunner, a as resolveSnapshotEnvironment } from '../chunks/index.bFLgAE-Z.js';
|
||||
import { c as setupCommonEnv, s as startCoverageInsideWorker, a as stopCoverageInsideWorker } from '../chunks/setup-common.Cm-kSBVi.js';
|
||||
import { i as index } from '../chunks/index.Z5E_ObnR.js';
|
||||
import { c as closeInspector } from '../chunks/inspector.CvyFGlXm.js';
|
||||
import { g as getWorkerState } from '../chunks/utils.DvEY5TfP.js';
|
||||
import { g as globalExpect } from '../chunks/vi.2VT5v0um.js';
|
||||
import '@vitest/expect';
|
||||
import '../chunks/rpc.BytlcPfC.js';
|
||||
import '@vitest/utils/timers';
|
||||
import '../chunks/index.0kCJoeWi.js';
|
||||
import '../chunks/test.BT8LKgU9.js';
|
||||
import '@vitest/utils/helpers';
|
||||
import '../chunks/benchmark.B3N2zMcH.js';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/utils/error';
|
||||
import 'pathe';
|
||||
import '../chunks/coverage.D_JHT54q.js';
|
||||
import '@vitest/snapshot';
|
||||
import '../chunks/evaluatedModules.Dg1zASAC.js';
|
||||
import 'vite/module-runner';
|
||||
import 'expect-type';
|
||||
import 'node:url';
|
||||
import '@vitest/spy';
|
||||
import '@vitest/utils/offset';
|
||||
import '@vitest/utils/source-map';
|
||||
import '../chunks/_commonjsHelpers.D26ty3Ew.js';
|
||||
import '../chunks/date.Bq6ZW5rf.js';
|
||||
|
||||
async function run(method, files, config, moduleRunner, traces) {
|
||||
const workerState = getWorkerState();
|
||||
await traces.$("vitest.runtime.global_env", () => setupCommonEnv(config));
|
||||
Object.defineProperty(globalThis, "__vitest_index__", {
|
||||
value: index,
|
||||
enumerable: false
|
||||
});
|
||||
const viteEnvironment = workerState.environment.viteEnvironment || workerState.environment.name;
|
||||
globalExpect.setState({ environment: workerState.environment.name });
|
||||
if (viteEnvironment === "client") {
|
||||
const _require = createRequire(import.meta.url);
|
||||
// always mock "required" `css` files, because we cannot process them
|
||||
_require.extensions[".css"] = resolveCss;
|
||||
_require.extensions[".scss"] = resolveCss;
|
||||
_require.extensions[".sass"] = resolveCss;
|
||||
_require.extensions[".less"] = resolveCss;
|
||||
// since we are using Vite, we can assume how these will be resolved
|
||||
KNOWN_ASSET_TYPES.forEach((type) => {
|
||||
_require.extensions[`.${type}`] = resolveAsset;
|
||||
});
|
||||
process.env.SSR = "";
|
||||
} else process.env.SSR = "1";
|
||||
// @ts-expect-error not typed global for patched timers
|
||||
globalThis.__vitest_required__ = {
|
||||
util,
|
||||
timers,
|
||||
timersPromises
|
||||
};
|
||||
await traces.$("vitest.runtime.coverage.start", () => startCoverageInsideWorker(config.coverage, moduleRunner, { isolate: false }));
|
||||
if (config.chaiConfig) setupChaiConfig(config.chaiConfig);
|
||||
const [testRunner, snapshotEnvironment] = await Promise.all([traces.$("vitest.runtime.runner", () => resolveTestRunner(config, moduleRunner, traces)), traces.$("vitest.runtime.snapshot.environment", () => resolveSnapshotEnvironment(config, moduleRunner))]);
|
||||
config.snapshotOptions.snapshotEnvironment = snapshotEnvironment;
|
||||
testRunner.getWorkerContext = void 0;
|
||||
workerState.onCancel((reason) => {
|
||||
closeInspector(config);
|
||||
testRunner.cancel?.(reason);
|
||||
});
|
||||
workerState.durations.prepare = performance.now() - workerState.durations.prepare;
|
||||
const { vi } = index;
|
||||
await traces.$(`vitest.test.runner.${method}`, async () => {
|
||||
for (const file of files) {
|
||||
workerState.filepath = file.filepath;
|
||||
if (method === "run") await traces.$(`vitest.test.runner.${method}.module`, { attributes: { "code.file.path": file.filepath } }, () => startTests([file], testRunner));
|
||||
else await traces.$(`vitest.test.runner.${method}.module`, { attributes: { "code.file.path": file.filepath } }, () => collectTests([file], testRunner));
|
||||
// reset after tests, because user might call `vi.setConfig` in setupFile
|
||||
vi.resetConfig();
|
||||
// mocks should not affect different files
|
||||
vi.restoreAllMocks();
|
||||
}
|
||||
});
|
||||
await traces.$("vitest.runtime.coverage.stop", () => stopCoverageInsideWorker(config.coverage, moduleRunner, { isolate: false }));
|
||||
}
|
||||
function resolveCss(mod) {
|
||||
mod.exports = "";
|
||||
}
|
||||
function resolveAsset(mod, url) {
|
||||
mod.exports = url;
|
||||
}
|
||||
|
||||
export { run };
|
||||
55
node_modules/vitest/dist/workers/threads.js
generated
vendored
Normal file
55
node_modules/vitest/dist/workers/threads.js
generated
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
import { s as setupEnvironment, r as runBaseTests } from '../chunks/base.CTp-EStD.js';
|
||||
import { w as workerInit } from '../chunks/init-threads.D8Ok07M7.js';
|
||||
import 'node:vm';
|
||||
import '@vitest/spy';
|
||||
import '../chunks/index.bFLgAE-Z.js';
|
||||
import '@vitest/expect';
|
||||
import '../chunks/setup-common.Cm-kSBVi.js';
|
||||
import '../chunks/coverage.D_JHT54q.js';
|
||||
import '@vitest/snapshot';
|
||||
import '@vitest/utils/timers';
|
||||
import '../chunks/utils.DvEY5TfP.js';
|
||||
import '../chunks/rpc.BytlcPfC.js';
|
||||
import '../chunks/index.0kCJoeWi.js';
|
||||
import '../chunks/test.BT8LKgU9.js';
|
||||
import '@vitest/runner';
|
||||
import '@vitest/utils/helpers';
|
||||
import '../chunks/benchmark.B3N2zMcH.js';
|
||||
import '@vitest/runner/utils';
|
||||
import '@vitest/utils/error';
|
||||
import 'pathe';
|
||||
import '../chunks/vi.2VT5v0um.js';
|
||||
import '@vitest/utils/offset';
|
||||
import '@vitest/utils/source-map';
|
||||
import '../chunks/_commonjsHelpers.D26ty3Ew.js';
|
||||
import '../chunks/date.Bq6ZW5rf.js';
|
||||
import '../chunks/init.B04saIIg.js';
|
||||
import 'node:fs';
|
||||
import 'node:module';
|
||||
import 'node:url';
|
||||
import 'vite/module-runner';
|
||||
import '../chunks/startModuleRunner.Iz2V0ESw.js';
|
||||
import '../chunks/modules.DJPjQW6m.js';
|
||||
import '../path.js';
|
||||
import 'node:path';
|
||||
import '@vitest/utils/serialize';
|
||||
import '../module-evaluator.js';
|
||||
import '../chunks/traces.U4xDYhzZ.js';
|
||||
import '@vitest/mocker';
|
||||
import '../chunks/index.BspFP3mn.js';
|
||||
import 'node:console';
|
||||
import '../chunks/inspector.CvyFGlXm.js';
|
||||
import '../chunks/evaluatedModules.Dg1zASAC.js';
|
||||
import 'node:perf_hooks';
|
||||
import 'node:timers';
|
||||
import 'node:timers/promises';
|
||||
import 'node:util';
|
||||
import '@vitest/utils/constants';
|
||||
import '../chunks/index.Z5E_ObnR.js';
|
||||
import 'expect-type';
|
||||
import 'node:worker_threads';
|
||||
|
||||
workerInit({
|
||||
runTests: runBaseTests,
|
||||
setup: setupEnvironment
|
||||
});
|
||||
36
node_modules/vitest/dist/workers/vmForks.js
generated
vendored
Normal file
36
node_modules/vitest/dist/workers/vmForks.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
import { w as workerInit } from '../chunks/init-forks.CKEYp90N.js';
|
||||
import { r as runVmTests } from '../chunks/vm.BwmD1Rql.js';
|
||||
import '../chunks/init.B04saIIg.js';
|
||||
import 'node:fs';
|
||||
import 'node:module';
|
||||
import 'node:url';
|
||||
import 'pathe';
|
||||
import 'vite/module-runner';
|
||||
import '../chunks/startModuleRunner.Iz2V0ESw.js';
|
||||
import '@vitest/utils/helpers';
|
||||
import '../chunks/modules.DJPjQW6m.js';
|
||||
import '../path.js';
|
||||
import 'node:path';
|
||||
import '@vitest/utils/serialize';
|
||||
import '../module-evaluator.js';
|
||||
import 'node:vm';
|
||||
import '../chunks/traces.U4xDYhzZ.js';
|
||||
import '@vitest/mocker';
|
||||
import '../chunks/index.BspFP3mn.js';
|
||||
import 'node:console';
|
||||
import '@vitest/utils/error';
|
||||
import '../chunks/rpc.BytlcPfC.js';
|
||||
import '@vitest/utils/timers';
|
||||
import '../chunks/index.0kCJoeWi.js';
|
||||
import '../chunks/utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/source-map';
|
||||
import '../chunks/inspector.CvyFGlXm.js';
|
||||
import '../chunks/evaluatedModules.Dg1zASAC.js';
|
||||
import '../chunks/console.Cf-YriPC.js';
|
||||
import 'node:stream';
|
||||
import 'tinyrainbow';
|
||||
import '../chunks/date.Bq6ZW5rf.js';
|
||||
import '@vitest/utils/resolver';
|
||||
import '@vitest/utils/constants';
|
||||
|
||||
workerInit({ runTests: runVmTests });
|
||||
37
node_modules/vitest/dist/workers/vmThreads.js
generated
vendored
Normal file
37
node_modules/vitest/dist/workers/vmThreads.js
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
import { w as workerInit } from '../chunks/init-threads.D8Ok07M7.js';
|
||||
import { r as runVmTests } from '../chunks/vm.BwmD1Rql.js';
|
||||
import 'node:worker_threads';
|
||||
import '../chunks/init.B04saIIg.js';
|
||||
import 'node:fs';
|
||||
import 'node:module';
|
||||
import 'node:url';
|
||||
import 'pathe';
|
||||
import 'vite/module-runner';
|
||||
import '../chunks/startModuleRunner.Iz2V0ESw.js';
|
||||
import '@vitest/utils/helpers';
|
||||
import '../chunks/modules.DJPjQW6m.js';
|
||||
import '../path.js';
|
||||
import 'node:path';
|
||||
import '@vitest/utils/serialize';
|
||||
import '../module-evaluator.js';
|
||||
import 'node:vm';
|
||||
import '../chunks/traces.U4xDYhzZ.js';
|
||||
import '@vitest/mocker';
|
||||
import '../chunks/index.BspFP3mn.js';
|
||||
import 'node:console';
|
||||
import '@vitest/utils/error';
|
||||
import '../chunks/rpc.BytlcPfC.js';
|
||||
import '@vitest/utils/timers';
|
||||
import '../chunks/index.0kCJoeWi.js';
|
||||
import '../chunks/utils.DvEY5TfP.js';
|
||||
import '@vitest/utils/source-map';
|
||||
import '../chunks/inspector.CvyFGlXm.js';
|
||||
import '../chunks/evaluatedModules.Dg1zASAC.js';
|
||||
import '../chunks/console.Cf-YriPC.js';
|
||||
import 'node:stream';
|
||||
import 'tinyrainbow';
|
||||
import '../chunks/date.Bq6ZW5rf.js';
|
||||
import '@vitest/utils/resolver';
|
||||
import '@vitest/utils/constants';
|
||||
|
||||
workerInit({ runTests: runVmTests });
|
||||
1
node_modules/vitest/environments.d.ts
generated
vendored
Normal file
1
node_modules/vitest/environments.d.ts
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export * from './dist/environments'
|
||||
20
node_modules/vitest/globals.d.ts
generated
vendored
Normal file
20
node_modules/vitest/globals.d.ts
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
declare global {
|
||||
let suite: typeof import('vitest')['suite']
|
||||
let test: typeof import('vitest')['test']
|
||||
let chai: typeof import("vitest")["chai"]
|
||||
let describe: typeof import('vitest')['describe']
|
||||
let it: typeof import('vitest')['it']
|
||||
let expectTypeOf: typeof import('vitest')['expectTypeOf']
|
||||
let assertType: typeof import('vitest')['assertType']
|
||||
let expect: typeof import('vitest')['expect']
|
||||
let assert: typeof import('vitest')['assert']
|
||||
let vitest: typeof import('vitest')['vitest']
|
||||
let vi: typeof import('vitest')['vitest']
|
||||
let beforeAll: typeof import('vitest')['beforeAll']
|
||||
let afterAll: typeof import('vitest')['afterAll']
|
||||
let beforeEach: typeof import('vitest')['beforeEach']
|
||||
let afterEach: typeof import('vitest')['afterEach']
|
||||
let onTestFailed: typeof import('vitest')['onTestFailed']
|
||||
let onTestFinished: typeof import('vitest')['onTestFinished']
|
||||
}
|
||||
export {}
|
||||
5
node_modules/vitest/import-meta.d.ts
generated
vendored
Normal file
5
node_modules/vitest/import-meta.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
/// <reference path="./importMeta.d.ts" />
|
||||
|
||||
// https://github.com/microsoft/TypeScript/issues/45096
|
||||
// TypeScript has a bug that makes <reference types="vite/types/importMeta" />
|
||||
// not possible in userland. This file provides a workaround for now.
|
||||
4
node_modules/vitest/importMeta.d.ts
generated
vendored
Normal file
4
node_modules/vitest/importMeta.d.ts
generated
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
interface ImportMeta {
|
||||
url: string
|
||||
readonly vitest?: typeof import('vitest')
|
||||
}
|
||||
5
node_modules/vitest/index.cjs
generated
vendored
Normal file
5
node_modules/vitest/index.cjs
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
throw new Error(
|
||||
'Vitest cannot be imported in a CommonJS module using require(). Please use "import" instead.'
|
||||
+ '\n\nIf you are using "import" in your source code, then it\'s possible it was bundled into require() automatically by your bundler. '
|
||||
+ 'In that case, do not bundle CommonJS output since it will never work with Vitest, or use dynamic import() which is available in all CommonJS modules.',
|
||||
)
|
||||
1
node_modules/vitest/index.d.cts
generated
vendored
Normal file
1
node_modules/vitest/index.d.cts
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export * from './dist/index.js'
|
||||
6
node_modules/vitest/jsdom.d.ts
generated
vendored
Normal file
6
node_modules/vitest/jsdom.d.ts
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
import type { JSDOM } from 'jsdom'
|
||||
|
||||
declare global {
|
||||
const jsdom: JSDOM
|
||||
}
|
||||
export {}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user